From b4509b77938c61081f2c715926d806c717cebea8 Mon Sep 17 00:00:00 2001 From: ice <2395438495@qq.com> Date: Wed, 6 Nov 2024 21:56:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?15-ns=5Fice-=E6=99=BA=E8=83=BD=E5=8A=A9?= =?UTF-8?q?=E6=89=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ice <2395438495@qq.com> --- .../PCB\350\256\276\350\256\241.png" | Bin 0 -> 20960 bytes .../image-20241106145756013.png" | Bin 0 -> 82163 bytes .../image-20241106145918570.png" | Bin 0 -> 82163 bytes .../image-20241106161837183.png" | Bin 0 -> 19299 bytes .../README.assets/intellegent_assistant.jpg" | Bin 0 -> 292328 bytes .../README.md" | 428 + .../.vscode/.attachinit" | 16 + .../.vscode/.launchinit" | 17 + .../.vscode/c_cpp_properties.json" | 21 + .../.vscode/launch.json" | 52 + .../.vscode/problems.json" | 1 + .../.vscode/settings.json" | 12 + .../intelligent_assistant/README.md" | 223 + .../analyzerJson/assembleFile.asm" | 21222 +++++++ .../analyzerJson/cfg/funcptr.txt" | 81 + .../analyzerJson/funcstack.json" | 6879 +++ .../analyzerJson/memoryDetails.json" | 46340 ++++++++++++++++ .../intelligent_assistant/board.json" | 1 + .../intelligent_assistant/build/.gn" | 21 + .../intelligent_assistant/build/BUILD.gn" | 352 + .../intelligent_assistant/build/build.py" | 586 + .../intelligent_assistant/build/build_gn.py" | 819 + .../intelligent_assistant/build/config.ini" | 16 + .../build/config/BUILDCONFIG.gn" | 25 + .../build/config/hcc/userconfig.json" | 127 + .../build/config/hcc_fpu/userconfig.json" | 129 + .../build/createxml/mk_dfx_xml.json" | 10 + .../build/createxml/mk_prim_xml_step1.py" | 171 + .../build/createxml/mk_prim_xml_step2.py" | 184 + .../build/createxml/mss_prim_db.xml" | 12 + .../createxml/mss_prim_db/dfx_db/log.xml" | 8 + .../mss_prim_db/dfx_db/xml_cfg/mcu_xml.cfg" | 1 + .../mss_prim_db/modules/mcu_xml/dfx_log.i" | 2389 + .../intelligent_assistant/build/ide_entry.py" | 204 + .../build/packet_create.py" | 460 + .../build/toolchain/BUILD.gn" | 28 + .../build/toolchain/config.gni" | 131 + .../chip/3061m/anavref.h" | 92 + .../chip/3061m/baseaddr.h" | 202 + .../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 + .../chip/3061m/chipinit/chipinit.c" | 69 + .../chip/3061m/chipinit/chipinit.h" | 31 + .../chip/3061m/chipinit/crginit/crginit.c" | 65 + .../chip/3061m/chipinit/crginit/crginit.h" | 33 + .../3061m/chipinit/flashinit/flashinit.c" | 111 + .../3061m/chipinit/flashinit/flashinit.h" | 32 + .../3061m/chipinit/systickinit/systickinit.c" | 48 + .../3061m/chipinit/systickinit/systickinit.h" | 29 + .../chip/3061m/codecopy.json" | 50 + .../chip/3061m/flash.lds" | 202 + .../chip/3061m/fotp/fotp.h" | 499 + .../chip/3061m/fotp/fotp_info_read.c" | 106 + .../chip/3061m/fotp/fotp_info_read.h" | 31 + .../intelligent_assistant/chip/3061m/info.h" | 30 + .../chip/3061m/interrupt_ip.h" | 183 + .../chip/3061m/ioconfig.h" | 126 + .../chip/3061m/iomap/iomap.h" | 320 + .../chip/3061m/ip_crg/ip_crg_common.c" | 127 + .../chip/3061m/ip_crg/ip_crg_common.h" | 82 + .../chip/3061m/locktype.h" | 43 + .../chip/3061m/startup.S" | 720 + .../chip/3061m/sysctrl.h" | 563 + .../chip/3061m/systick.h" | 110 + .../chip/target/userconfig.json" | 132 + .../drivers/acmp/common/inc/acmp.h" | 101 + .../drivers/acmp/inc/acmp_ex.h" | 51 + .../drivers/acmp/inc/acmp_ip.h" | 673 + .../drivers/acmp/src/acmp.c" | 313 + .../drivers/acmp/src/acmp_ex.c" | 45 + .../drivers/adc/common/inc/adc.h" | 128 + .../drivers/adc/inc/adc_ex.h" | 65 + .../drivers/adc/inc/adc_ip.h" | 3052 + .../drivers/adc/src/adc.c" | 620 + .../drivers/adc/src/adc_ex.c" | 338 + .../drivers/apt/common/inc/apt.h" | 357 + .../drivers/apt/inc/apt_ip.h" | 3470 ++ .../drivers/apt/src/apt.c" | 1432 + .../drivers/base/common/inc/baseinc.h" | 39 + .../drivers/base/inc/assert.h" | 96 + .../drivers/base/inc/base_math.h" | 116 + .../drivers/base/inc/clock.h" | 105 + .../drivers/base/inc/generalfunc.h" | 109 + .../drivers/base/inc/interrupt.h" | 318 + .../drivers/base/inc/lock.h" | 83 + .../drivers/base/inc/reset.h" | 60 + .../drivers/base/inc/typedefs.h" | 137 + .../drivers/base/src/assert.c" | 38 + .../drivers/base/src/base_math.c" | 392 + .../drivers/base/src/clock.c" | 103 + .../drivers/base/src/generalfunc.c" | 223 + .../drivers/base/src/interrupt.c" | 555 + .../drivers/base/src/lock.c" | 82 + .../drivers/base/src/reset.c" | 41 + .../drivers/can/common/inc/can.h" | 110 + .../drivers/can/inc/can_ip.h" | 1738 + .../drivers/can/src/can.c" | 663 + .../drivers/capm/common/inc/capm.h" | 186 + .../drivers/capm/inc/capm_ip.h" | 1854 + .../drivers/capm/src/capm.c" | 439 + .../drivers/cfd/common/inc/cfd.h" | 111 + .../drivers/cfd/inc/cfd_ip.h" | 284 + .../drivers/cfd/src/cfd.c" | 181 + .../drivers/cmm/common/inc/cmm.h" | 121 + .../drivers/cmm/inc/cmm_ip.h" | 612 + .../drivers/cmm/src/cmm.c" | 235 + .../drivers/crc/common/inc/crc.h" | 100 + .../drivers/crc/inc/crc_ip.h" | 613 + .../drivers/crc/src/crc.c" | 441 + .../drivers/crg/common/inc/crg.h" | 123 + .../drivers/crg/inc/crg_ip.h" | 1730 + .../drivers/crg/src/crg.c" | 1130 + .../drivers/dac/common/inc/dac.h" | 81 + .../drivers/dac/inc/dac_ip.h" | 180 + .../drivers/dac/src/dac.c" | 77 + .../drivers/debug/inc/debug.h" | 90 + .../drivers/debug/log/inc/cmd.h" | 89 + .../drivers/debug/log/inc/cmd_common.h" | 109 + .../drivers/debug/log/inc/command.h" | 91 + .../drivers/debug/log/inc/common.h" | 90 + .../drivers/debug/log/inc/config.h" | 114 + .../drivers/debug/log/inc/console.h" | 73 + .../drivers/debug/log/inc/dfx_debug.h" | 74 + .../drivers/debug/log/inc/dfx_log.h" | 142 + .../drivers/debug/log/inc/errno.h" | 65 + .../drivers/debug/log/inc/event.h" | 143 + .../drivers/debug/log/inc/ext_log.h" | 275 + .../drivers/debug/log/inc/file_id_defs.h" | 63 + .../drivers/debug/log/inc/log.h" | 146 + .../drivers/debug/log/inc/module.h" | 96 + .../drivers/debug/log/inc/type.h" | 73 + .../drivers/debug/log/src/app_command.c" | 525 + .../drivers/debug/log/src/cmd.c" | 56 + .../drivers/debug/log/src/cmd_common.c" | 67 + .../drivers/debug/log/src/config.c" | 143 + .../drivers/debug/log/src/console.c" | 442 + .../drivers/debug/log/src/dfx_debug.c" | 43 + .../drivers/debug/log/src/dfx_log.c" | 468 + .../drivers/debug/log/src/dfx_log_proc.c" | 195 + .../drivers/debug/log/src/event.c" | 91 + .../drivers/debug/log/src/ext_command.c" | 123 + .../drivers/debug/src/debug.c" | 416 + .../drivers/dma/common/inc/dma.h" | 134 + .../drivers/dma/inc/dma_ex.h" | 50 + .../drivers/dma/inc/dma_ip.h" | 919 + .../drivers/dma/src/dma.c" | 722 + .../drivers/dma/src/dma_ex.c" | 42 + .../drivers/flash/common/inc/flash.h" | 124 + .../drivers/flash/inc/flash_ip.h" | 1156 + .../drivers/flash/src/flash.c" | 749 + .../drivers/gpio/common/inc/gpio.h" | 95 + .../drivers/gpio/inc/gpio_ip.h" | 678 + .../drivers/gpio/src/gpio.c" | 330 + .../drivers/gpt/common/inc/gpt.h" | 134 + .../drivers/gpt/inc/gpt_ex.h" | 68 + .../drivers/gpt/inc/gpt_ip.h" | 950 + .../drivers/gpt/src/gpt.c" | 446 + .../drivers/gpt/src/gpt_ex.c" | 243 + .../drivers/i2c/common/inc/i2c.h" | 169 + .../drivers/i2c/inc/i2c_ex.h" | 57 + .../drivers/i2c/inc/i2c_ip.h" | 1960 + .../drivers/i2c/src/i2c.c" | 2037 + .../drivers/i2c/src/i2c_ex.c" | 166 + .../drivers/iocmg/common/iocmg.h" | 92 + .../drivers/iocmg/inc/iocmg_ip.h" | 348 + .../drivers/iocmg/src/iocmg.c" | 283 + .../drivers/iwdg/common/inc/iwdg.h" | 97 + .../drivers/iwdg/inc/iwdg_ex.h" | 50 + .../drivers/iwdg/inc/iwdg_ip.h" | 439 + .../drivers/iwdg/src/iwdg.c" | 220 + .../drivers/iwdg/src/iwdg_ex.c" | 129 + .../drivers/pga/common/inc/pga.h" | 81 + .../drivers/pga/inc/pga_ip.h" | 333 + .../drivers/pga/src/pga.c" | 101 + .../drivers/pmc/common/inc/pmc.h" | 96 + .../drivers/pmc/inc/pmc_ip.h" | 632 + .../drivers/pmc/src/pmc.c" | 199 + .../drivers/qdm/common/inc/qdm.h" | 156 + .../drivers/qdm/inc/qdm_ip.h" | 1663 + .../drivers/qdm/src/qdm.c" | 550 + .../drivers/spi/common/inc/spi.h" | 188 + .../drivers/spi/inc/spi_ex.h" | 49 + .../drivers/spi/inc/spi_ip.h" | 1237 + .../drivers/spi/src/spi.c" | 1171 + .../drivers/spi/src/spi_ex.c" | 54 + .../drivers/timer/common/inc/timer.h" | 112 + .../drivers/timer/inc/timer_ex.h" | 48 + .../drivers/timer/inc/timer_ip.h" | 666 + .../drivers/timer/src/timer.c" | 290 + .../drivers/timer/src/timer_ex.c" | 57 + .../drivers/tsensor/common/inc/tsensor.h" | 53 + .../drivers/tsensor/inc/tsensor_ip.h" | 80 + .../drivers/tsensor/src/tsensor.c" | 152 + .../drivers/uart/common/inc/uart.h" | 134 + .../drivers/uart/inc/uart_ex.h" | 65 + .../drivers/uart/inc/uart_ip.h" | 1118 + .../drivers/uart/src/uart.c" | 894 + .../drivers/uart/src/uart_ex.c" | 142 + .../drivers/wwdg/common/inc/wwdg.h" | 99 + .../drivers/wwdg/inc/wwdg_ex.h" | 49 + .../drivers/wwdg/inc/wwdg_ip.h" | 516 + .../drivers/wwdg/src/wwdg.c" | 256 + .../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 + .../modulation/mcs_r1_svpwm.c" | 234 + .../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 + .../utilities/mcs_mtr_param.c" | 47 + .../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 + .../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 .../intelligent_assistant/open_inte.hiproj" | 75 + .../intelligent_assistant/out/.ninja_deps" | Bin 0 -> 120432 bytes .../intelligent_assistant/out/.ninja_log" | 281 + .../intelligent_assistant/out/args.gn" | 2 + .../intelligent_assistant/out/bin/target.bin" | Bin 0 -> 64164 bytes .../intelligent_assistant/out/bin/target.elf" | Bin 0 -> 654900 bytes .../intelligent_assistant/out/bin/target.hex" | 4015 ++ .../out/bin/target.list" | 30468 ++++++++++ .../intelligent_assistant/out/bin/target.map" | 8281 +++ .../intelligent_assistant/out/build.log" | 478 + .../intelligent_assistant/out/build.ninja" | 20 + .../intelligent_assistant/out/build.ninja.d" | 1 + .../intelligent_assistant/out/log.xml" | 8 + .../out/obj/build/target.elf.ninja" | 431 + .../chip/3061m/chipinit/anatrim/anatrim.o" | Bin 0 -> 73428 bytes .../3061m/chipinit/anavrefinit/anavrefinit.o" | Bin 0 -> 6768 bytes .../out/obj/chip/3061m/chipinit/chipinit.o" | Bin 0 -> 58344 bytes .../chip/3061m/chipinit/crginit/crginit.o" | Bin 0 -> 34328 bytes .../3061m/chipinit/flashinit/flashinit.o" | Bin 0 -> 20940 bytes .../3061m/chipinit/systickinit/systickinit.o" | Bin 0 -> 6044 bytes .../out/obj/chip/3061m/fotp/fotp_info_read.o" | Bin 0 -> 21584 bytes .../obj/chip/3061m/ip_crg/ip_crg_common.o" | Bin 0 -> 6288 bytes .../out/obj/chip/3061m/startup.o" | Bin 0 -> 24296 bytes .../out/obj/drivers/acmp/src/acmp.o" | Bin 0 -> 40908 bytes .../out/obj/drivers/acmp/src/acmp_ex.o" | Bin 0 -> 14452 bytes .../out/obj/drivers/adc/src/adc.o" | Bin 0 -> 181664 bytes .../out/obj/drivers/adc/src/adc_ex.o" | Bin 0 -> 142484 bytes .../out/obj/drivers/apt/src/apt.o" | Bin 0 -> 202312 bytes .../out/obj/drivers/base/src/assert.o" | Bin 0 -> 3976 bytes .../out/obj/drivers/base/src/base_math.o" | Bin 0 -> 23684 bytes .../out/obj/drivers/base/src/clock.o" | Bin 0 -> 11860 bytes .../out/obj/drivers/base/src/generalfunc.o" | Bin 0 -> 24716 bytes .../out/obj/drivers/base/src/interrupt.o" | Bin 0 -> 48928 bytes .../out/obj/drivers/base/src/lock.o" | Bin 0 -> 9520 bytes .../out/obj/drivers/base/src/reset.o" | Bin 0 -> 37288 bytes .../out/obj/drivers/can/src/can.o" | Bin 0 -> 60408 bytes .../out/obj/drivers/capm/src/capm.o" | Bin 0 -> 126480 bytes .../out/obj/drivers/cfd/src/cfd.o" | Bin 0 -> 61108 bytes .../out/obj/drivers/cmm/src/cmm.o" | Bin 0 -> 53728 bytes .../out/obj/drivers/crc/src/crc.o" | Bin 0 -> 70936 bytes .../out/obj/drivers/crg/src/crg.o" | Bin 0 -> 151000 bytes .../out/obj/drivers/dac/src/dac.o" | Bin 0 -> 11596 bytes .../obj/drivers/debug/log/src/app_command.o" | Bin 0 -> 40996 bytes .../out/obj/drivers/debug/log/src/cmd.o" | Bin 0 -> 7152 bytes .../obj/drivers/debug/log/src/cmd_common.o" | Bin 0 -> 5544 bytes .../out/obj/drivers/debug/log/src/config.o" | Bin 0 -> 13784 bytes .../out/obj/drivers/debug/log/src/console.o" | Bin 0 -> 67944 bytes .../obj/drivers/debug/log/src/dfx_debug.o" | Bin 0 -> 6176 bytes .../out/obj/drivers/debug/log/src/dfx_log.o" | Bin 0 -> 40052 bytes .../obj/drivers/debug/log/src/dfx_log_proc.o" | Bin 0 -> 21032 bytes .../out/obj/drivers/debug/log/src/event.o" | Bin 0 -> 10096 bytes .../obj/drivers/debug/log/src/ext_command.o" | Bin 0 -> 12236 bytes .../out/obj/drivers/debug/src/debug.o" | Bin 0 -> 65428 bytes .../out/obj/drivers/dma/src/dma.o" | Bin 0 -> 95088 bytes .../out/obj/drivers/dma/src/dma_ex.o" | Bin 0 -> 25092 bytes .../out/obj/drivers/flash/src/flash.o" | Bin 0 -> 83808 bytes .../out/obj/drivers/gpio/src/gpio.o" | Bin 0 -> 67052 bytes .../out/obj/drivers/gpt/src/gpt.o" | Bin 0 -> 60648 bytes .../out/obj/drivers/gpt/src/gpt_ex.o" | Bin 0 -> 33592 bytes .../out/obj/drivers/i2c/src/i2c.o" | Bin 0 -> 196140 bytes .../out/obj/drivers/i2c/src/i2c_ex.o" | Bin 0 -> 58692 bytes .../out/obj/drivers/iocmg/src/iocmg.o" | Bin 0 -> 56488 bytes .../out/obj/drivers/iwdg/src/iwdg.o" | Bin 0 -> 38956 bytes .../out/obj/drivers/iwdg/src/iwdg_ex.o" | Bin 0 -> 24296 bytes .../out/obj/drivers/pga/src/pga.o" | Bin 0 -> 17672 bytes .../out/obj/drivers/pmc/src/pmc.o" | Bin 0 -> 38100 bytes .../out/obj/drivers/qdm/src/qdm.o" | Bin 0 -> 84852 bytes .../out/obj/drivers/spi/src/spi.o" | Bin 0 -> 142420 bytes .../out/obj/drivers/spi/src/spi_ex.o" | Bin 0 -> 32552 bytes .../out/obj/drivers/timer/src/timer.o" | Bin 0 -> 41580 bytes .../out/obj/drivers/timer/src/timer_ex.o" | Bin 0 -> 12012 bytes .../out/obj/drivers/tsensor/src/tsensor.o" | Bin 0 -> 97680 bytes .../out/obj/drivers/uart/src/uart.o" | Bin 0 -> 128224 bytes .../out/obj/drivers/uart/src/uart_ex.o" | Bin 0 -> 52908 bytes .../out/obj/drivers/wwdg/src/wwdg.o" | Bin 0 -> 47776 bytes .../out/obj/drivers/wwdg/src/wwdg_ex.o" | Bin 0 -> 12800 bytes .../adc_calibra/mcs_adcCalibr.o" | Bin 0 -> 84036 bytes .../control_library/brake/mcs_brake.o" | Bin 0 -> 11380 bytes .../control_library/filter/mcs_filter.o" | Bin 0 -> 10556 bytes .../control_library/filter/mcs_lpfRk4.o" | Bin 0 -> 8328 bytes .../control_library/filter/mcs_pll.o" | Bin 0 -> 16104 bytes .../foc_loop_ctrl/mcs_curr_ctrl.o" | Bin 0 -> 15996 bytes .../foc_loop_ctrl/mcs_curr_ff.o" | Bin 0 -> 6668 bytes .../foc_loop_ctrl/mcs_fw_ctrl.o" | Bin 0 -> 13564 bytes .../foc_loop_ctrl/mcs_if_ctrl.o" | Bin 0 -> 12636 bytes .../foc_loop_ctrl/mcs_pos_ctrl.o" | Bin 0 -> 20064 bytes .../foc_loop_ctrl/mcs_spd_ctrl.o" | Bin 0 -> 11752 bytes .../foc_loop_ctrl/mcs_startup.o" | Bin 0 -> 9272 bytes .../control_library/math/mcs_math.o" | Bin 0 -> 42128 bytes .../modulation/mcs_r1_svpwm.o" | Bin 0 -> 20704 bytes .../control_library/modulation/mcs_svpwm.o" | Bin 0 -> 18868 bytes .../control_library/observer/mcs_fosmo.o" | Bin 0 -> 23476 bytes .../control_library/pfc/pfc_curr_ctrl.o" | Bin 0 -> 7420 bytes .../control_library/pfc/pfc_volt_ctrl.o" | Bin 0 -> 7056 bytes .../pid_controller/mcs_pid_ctrl.o" | Bin 0 -> 18924 bytes .../control_library/power/mcs_power_mgmt.o" | Bin 0 -> 8344 bytes .../protection/mcs_openphs_det.o" | Bin 0 -> 9768 bytes .../protection/mcs_stall_det.o" | Bin 0 -> 9944 bytes .../protection/mcs_unbalance_det.o" | Bin 0 -> 19484 bytes .../control_library/ramp/mcs_ramp_mgmt.o" | Bin 0 -> 10788 bytes .../utilities/mcs_mtr_param.o" | Bin 0 -> 6068 bytes .../control_library/vf/mcs_vf_ctrl.o" | Bin 0 -> 16780 bytes .../libboundscheck_v1.1.16/src/fscanf_s.o" | Bin 0 -> 5268 bytes .../libboundscheck_v1.1.16/src/fwscanf_s.o" | Bin 0 -> 5344 bytes .../libboundscheck_v1.1.16/src/gets_s.o" | Bin 0 -> 7264 bytes .../libboundscheck_v1.1.16/src/memcpy_s.o" | Bin 0 -> 59176 bytes .../libboundscheck_v1.1.16/src/memmove_s.o" | Bin 0 -> 6548 bytes .../libboundscheck_v1.1.16/src/memset_s.o" | Bin 0 -> 62816 bytes .../libboundscheck_v1.1.16/src/scanf_s.o" | Bin 0 -> 5196 bytes .../libboundscheck_v1.1.16/src/securecutil.o" | Bin 0 -> 5232 bytes .../src/secureinput_a.o" | Bin 0 -> 132300 bytes .../src/secureinput_w.o" | Bin 0 -> 135260 bytes .../src/secureprintoutput_a.o" | Bin 0 -> 108508 bytes .../src/secureprintoutput_w.o" | Bin 0 -> 109056 bytes .../libboundscheck_v1.1.16/src/snprintf_s.o" | Bin 0 -> 6620 bytes .../libboundscheck_v1.1.16/src/sprintf_s.o" | Bin 0 -> 5412 bytes .../libboundscheck_v1.1.16/src/sscanf_s.o" | Bin 0 -> 5268 bytes .../libboundscheck_v1.1.16/src/strcat_s.o" | Bin 0 -> 9588 bytes .../libboundscheck_v1.1.16/src/strcpy_s.o" | Bin 0 -> 23036 bytes .../libboundscheck_v1.1.16/src/strncat_s.o" | Bin 0 -> 9848 bytes .../libboundscheck_v1.1.16/src/strncpy_s.o" | Bin 0 -> 12440 bytes .../libboundscheck_v1.1.16/src/strtok_s.o" | Bin 0 -> 11156 bytes .../libboundscheck_v1.1.16/src/swprintf_s.o" | Bin 0 -> 5476 bytes .../libboundscheck_v1.1.16/src/swscanf_s.o" | Bin 0 -> 5344 bytes .../libboundscheck_v1.1.16/src/vfscanf_s.o" | Bin 0 -> 6620 bytes .../libboundscheck_v1.1.16/src/vfwscanf_s.o" | Bin 0 -> 6704 bytes .../libboundscheck_v1.1.16/src/vscanf_s.o" | Bin 0 -> 6336 bytes .../libboundscheck_v1.1.16/src/vsnprintf_s.o" | Bin 0 -> 8904 bytes .../libboundscheck_v1.1.16/src/vsprintf_s.o" | Bin 0 -> 6320 bytes .../libboundscheck_v1.1.16/src/vsscanf_s.o" | Bin 0 -> 6832 bytes .../libboundscheck_v1.1.16/src/vswprintf_s.o" | Bin 0 -> 6388 bytes .../libboundscheck_v1.1.16/src/vswscanf_s.o" | Bin 0 -> 8012 bytes .../libboundscheck_v1.1.16/src/vwscanf_s.o" | Bin 0 -> 6416 bytes .../libboundscheck_v1.1.16/src/wcscat_s.o" | Bin 0 -> 9632 bytes .../libboundscheck_v1.1.16/src/wcscpy_s.o" | Bin 0 -> 8520 bytes .../libboundscheck_v1.1.16/src/wcsncat_s.o" | Bin 0 -> 9900 bytes .../libboundscheck_v1.1.16/src/wcsncpy_s.o" | Bin 0 -> 9800 bytes .../libboundscheck_v1.1.16/src/wcstok_s.o" | Bin 0 -> 11220 bytes .../libboundscheck_v1.1.16/src/wmemcpy_s.o" | Bin 0 -> 6000 bytes .../libboundscheck_v1.1.16/src/wmemmove_s.o" | Bin 0 -> 6012 bytes .../libboundscheck_v1.1.16/src/wscanf_s.o" | Bin 0 -> 5268 bytes .../out/obj/user/BSP/core/src/vl53l0x_api.o" | Bin 0 -> 255316 bytes .../BSP/core/src/vl53l0x_api_calibration.o" | Bin 0 -> 145628 bytes .../obj/user/BSP/core/src/vl53l0x_api_core.o" | Bin 0 -> 179616 bytes .../user/BSP/core/src/vl53l0x_api_ranging.o" | Bin 0 -> 72152 bytes .../user/BSP/core/src/vl53l0x_api_strings.o" | Bin 0 -> 111552 bytes .../out/obj/user/BSP/mine/src/vl53l0x.o" | Bin 0 -> 89328 bytes .../out/obj/user/BSP/mine/src/vl53l0x_iic.o" | Bin 0 -> 87592 bytes .../BSP/platform/src/vl53l0x_i2c_platform.o" | Bin 0 -> 88636 bytes .../user/BSP/platform/src/vl53l0x_platform.o" | Bin 0 -> 95212 bytes .../out/obj/user/generatecode/system_init.o" | Bin 0 -> 149256 bytes .../out/obj/user/main.o" | Bin 0 -> 96424 bytes .../out/obj/user/mycar/src/mycar_control.o" | Bin 0 -> 96956 bytes .../obj/user/vl53l0x/core/src/vl53l0x_api.o" | Bin 0 -> 255332 bytes .../core/src/vl53l0x_api_calibration.o" | Bin 0 -> 145644 bytes .../user/vl53l0x/core/src/vl53l0x_api_core.o" | Bin 0 -> 179632 bytes .../vl53l0x/core/src/vl53l0x_api_ranging.o" | Bin 0 -> 72156 bytes .../vl53l0x/core/src/vl53l0x_api_strings.o" | Bin 0 -> 111568 bytes .../out/obj/user/vl53l0x/mine/src/vl53l0x.o" | Bin 0 -> 89584 bytes .../obj/user/vl53l0x/mine/src/vl53l0x_iic.o" | Bin 0 -> 87600 bytes .../platform/src/vl53l0x_i2c_platform.o" | Bin 0 -> 88644 bytes .../vl53l0x/platform/src/vl53l0x_platform.o" | Bin 0 -> 95228 bytes .../out/toolchain.ninja" | 38 + .../user/BSP/core/inc/vl53l0x_api.h" | 1926 + .../BSP/core/inc/vl53l0x_api_calibration.h" | 85 + .../user/BSP/core/inc/vl53l0x_api_core.h" | 113 + .../user/BSP/core/inc/vl53l0x_api_ranging.h" | 47 + .../user/BSP/core/inc/vl53l0x_api_strings.h" | 278 + .../user/BSP/core/inc/vl53l0x_def.h" | 663 + .../user/BSP/core/inc/vl53l0x_device.h" | 262 + .../vl53l0x_interrupt_threshold_settings.h" | 194 + .../user/BSP/core/inc/vl53l0x_tuning.h" | 146 + .../user/BSP/core/src/vl53l0x_api.c" | 3142 ++ .../BSP/core/src/vl53l0x_api_calibration.c" | 1288 + .../user/BSP/core/src/vl53l0x_api_core.c" | 2128 + .../user/BSP/core/src/vl53l0x_api_ranging.c" | 42 + .../user/BSP/core/src/vl53l0x_api_strings.c" | 466 + .../user/BSP/mine/inc/vl53l0x.h" | 16 + .../user/BSP/mine/inc/vl53l0x_iic.h" | 66 + .../user/BSP/mine/src/vl53l0x.c" | 159 + .../user/BSP/mine/src/vl53l0x_iic.c" | 139 + .../BSP/platform/inc/vl53l0x_i2c_platform.h" | 409 + .../user/BSP/platform/inc/vl53l0x_platform.h" | 245 + .../BSP/platform/inc/vl53l0x_platform_log.h" | 118 + .../user/BSP/platform/inc/vl53l0x_types.h" | 111 + .../BSP/platform/src/vl53l0x_i2c_platform.c" | 307 + .../user/BSP/platform/src/vl53l0x_platform.c" | 275 + .../user/generatecode/feature.h" | 119 + .../user/generatecode/main.h" | 97 + .../user/generatecode/system_init.c" | 417 + .../intelligent_assistant/user/main.c" | 351 + .../user/mycar/inc/mycar_control.h" | 38 + .../user/mycar/src/mycar_control.c" | 276 + .../user/vl53l0x/core/inc/vl53l0x_api.h" | 1926 + .../core/inc/vl53l0x_api_calibration.h" | 85 + .../user/vl53l0x/core/inc/vl53l0x_api_core.h" | 113 + .../vl53l0x/core/inc/vl53l0x_api_ranging.h" | 47 + .../vl53l0x/core/inc/vl53l0x_api_strings.h" | 278 + .../user/vl53l0x/core/inc/vl53l0x_def.h" | 663 + .../user/vl53l0x/core/inc/vl53l0x_device.h" | 262 + .../vl53l0x_interrupt_threshold_settings.h" | 194 + .../user/vl53l0x/core/inc/vl53l0x_tuning.h" | 146 + .../user/vl53l0x/core/src/vl53l0x_api.c" | 3142 ++ .../core/src/vl53l0x_api_calibration.c" | 1288 + .../user/vl53l0x/core/src/vl53l0x_api_core.c" | 2128 + .../vl53l0x/core/src/vl53l0x_api_ranging.c" | 42 + .../vl53l0x/core/src/vl53l0x_api_strings.c" | 466 + .../user/vl53l0x/mine/inc/vl53l0x.h" | 16 + .../user/vl53l0x/mine/inc/vl53l0x_iic.h" | 66 + .../user/vl53l0x/mine/src/vl53l0x.c" | 159 + .../user/vl53l0x/mine/src/vl53l0x_iic.c" | 139 + .../platform/inc/vl53l0x_i2c_platform.h" | 409 + .../vl53l0x/platform/inc/vl53l0x_platform.h" | 245 + .../platform/inc/vl53l0x_platform_log.h" | 118 + .../vl53l0x/platform/inc/vl53l0x_types.h" | 111 + .../platform/src/vl53l0x_i2c_platform.c" | 307 + .../vl53l0x/platform/src/vl53l0x_platform.c" | 275 + .../other/PCB\350\256\276\350\256\241.png" | Bin 0 -> 20960 bytes ...351\237\263\345\212\251\346\211\213.xmind" | Bin 0 -> 179420 bytes 535 files changed, 225133 insertions(+) create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/PCB\350\256\276\350\256\241.png" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/image-20241106145756013.png" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/image-20241106145918570.png" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/image-20241106161837183.png" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/intellegent_assistant.jpg" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.md" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.attachinit" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.launchinit" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/c_cpp_properties.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/launch.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/problems.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/settings.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/README.md" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/assembleFile.asm" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/cfg/funcptr.txt" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/funcstack.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/memoryDetails.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/board.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/.gn" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/BUILD.gn" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/build.py" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/build_gn.py" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config.ini" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/BUILDCONFIG.gn" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/hcc/userconfig.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/hcc_fpu/userconfig.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_dfx_xml.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_prim_xml_step1.py" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_prim_xml_step2.py" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db.xml" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/log.xml" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/xml_cfg/mcu_xml.cfg" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/modules/mcu_xml/dfx_log.i" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/ide_entry.py" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/packet_create.py" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/toolchain/BUILD.gn" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/toolchain/config.gni" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/anavref.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/baseaddr.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinc.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anatrim/anatrim.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anatrim/anatrim.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anavrefinit/anavrefinit.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anavrefinit/anavrefinit.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/chipinit.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/chipinit.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/crginit/crginit.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/crginit/crginit.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/flashinit/flashinit.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/flashinit/flashinit.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/systickinit/systickinit.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/systickinit/systickinit.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/codecopy.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/flash.lds" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp_info_read.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp_info_read.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/info.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/interrupt_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ioconfig.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/iomap/iomap.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ip_crg/ip_crg_common.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ip_crg/ip_crg_common.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/locktype.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/startup.S" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/sysctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/systick.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/target/userconfig.json" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/common/inc/acmp.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/inc/acmp_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/inc/acmp_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/src/acmp.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/src/acmp_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/common/inc/adc.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/inc/adc_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/inc/adc_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/src/adc.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/src/adc_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/common/inc/apt.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/inc/apt_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/src/apt.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/common/inc/baseinc.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/assert.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/base_math.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/clock.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/generalfunc.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/interrupt.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/lock.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/reset.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/typedefs.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/assert.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/base_math.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/clock.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/generalfunc.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/interrupt.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/lock.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/reset.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/common/inc/can.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/inc/can_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/src/can.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/common/inc/capm.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/inc/capm_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/src/capm.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/common/inc/cfd.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/inc/cfd_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/src/cfd.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/common/inc/cmm.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/inc/cmm_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/src/cmm.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/common/inc/crc.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/inc/crc_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/src/crc.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/common/inc/crg.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/inc/crg_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/src/crg.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/common/inc/dac.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/inc/dac_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/src/dac.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/inc/debug.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/cmd.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/cmd_common.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/command.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/common.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/config.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/console.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/dfx_debug.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/dfx_log.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/errno.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/event.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/ext_log.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/file_id_defs.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/log.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/module.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/type.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/app_command.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/cmd.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/cmd_common.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/config.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/console.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_debug.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_log.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_log_proc.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/event.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/ext_command.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/src/debug.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/common/inc/dma.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/inc/dma_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/inc/dma_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/src/dma.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/src/dma_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/common/inc/flash.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/inc/flash_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/src/flash.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/common/inc/gpio.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/inc/gpio_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/src/gpio.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/common/inc/gpt.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/inc/gpt_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/inc/gpt_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/src/gpt.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/src/gpt_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/common/inc/i2c.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/inc/i2c_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/inc/i2c_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/src/i2c.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/src/i2c_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/common/iocmg.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/inc/iocmg_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/src/iocmg.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/common/inc/iwdg.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/inc/iwdg_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/inc/iwdg_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/src/iwdg.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/src/iwdg_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/common/inc/pga.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/inc/pga_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/src/pga.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/common/inc/pmc.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/inc/pmc_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/src/pmc.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/common/inc/qdm.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/inc/qdm_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/src/qdm.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/common/inc/spi.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/inc/spi_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/inc/spi_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/src/spi.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/src/spi_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/common/inc/timer.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/inc/timer_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/inc/timer_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/src/timer.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/src/timer_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/common/inc/tsensor.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/inc/tsensor_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/src/tsensor.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/common/inc/uart.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/inc/uart_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/inc/uart_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/common/inc/wwdg.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/inc/wwdg_ex.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/inc/wwdg_ip.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/src/wwdg.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/src/wwdg_ex.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/adc_calibra/mcs_adcCalibr.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/adc_calibra/mcs_adcCalibr.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/brake/mcs_brake.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/brake/mcs_brake.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_filter.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_filter.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_lpfRk4.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_lpfRk4.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_pll.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_pll.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_startup.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_startup.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math_const.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_r1_svpwm.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_r1_svpwm.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_svpwm.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_svpwm.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/observer/mcs_fosmo.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/observer/mcs_fosmo.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_curr_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_curr_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_volt_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_volt_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pid_controller/mcs_pid_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pid_controller/mcs_pid_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/power/mcs_power_mgmt.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/power/mcs_power_mgmt.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_openphs_det.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_openphs_det.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_stall_det.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_stall_det.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_unbalance_det.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_unbalance_det.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/ramp/mcs_ramp_mgmt.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/ramp/mcs_ramp_mgmt.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_assert.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_mtr_param.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_mtr_param.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_sys_status.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_typedef.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/vf/mcs_vf_ctrl.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/vf/mcs_vf_ctrl.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/Makefile" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/README.md" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/include/mcs_smo_4th.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/include/nos_task.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/lib/libmcs_smo_4th.a" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/lib/libnostask.a" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/open_inte.hiproj" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/.ninja_deps" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/.ninja_log" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/args.gn" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.bin" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.elf" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.hex" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.list" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.map" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.log" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja.d" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/log.xml" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/build/target.elf.ninja" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/anatrim/anatrim.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/chipinit.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/crginit/crginit.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/flashinit/flashinit.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/systickinit/systickinit.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/fotp/fotp_info_read.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/ip_crg/ip_crg_common.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/startup.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/acmp/src/acmp.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/acmp/src/acmp_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/adc/src/adc.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/adc/src/adc_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/apt/src/apt.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/assert.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/base_math.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/clock.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/generalfunc.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/interrupt.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/lock.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/reset.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/can/src/can.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/capm/src/capm.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/cfd/src/cfd.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/cmm/src/cmm.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/crc/src/crc.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/crg/src/crg.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dac/src/dac.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/app_command.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/cmd.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/cmd_common.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/config.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/console.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_debug.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_log.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_log_proc.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/event.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/ext_command.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/src/debug.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dma/src/dma.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dma/src/dma_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/flash/src/flash.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpio/src/gpio.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpt/src/gpt.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpt/src/gpt_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/i2c/src/i2c.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/i2c/src/i2c_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iocmg/src/iocmg.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iwdg/src/iwdg.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iwdg/src/iwdg_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/pga/src/pga.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/pmc/src/pmc.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/qdm/src/qdm.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/spi/src/spi.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/spi/src/spi_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/timer/src/timer.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/timer/src/timer_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/tsensor/src/tsensor.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/uart/src/uart.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/uart/src/uart_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/wwdg/src/wwdg.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/wwdg/src/wwdg_ex.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/brake/mcs_brake.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_filter.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_lpfRk4.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_pll.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/math/mcs_math.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/modulation/mcs_r1_svpwm.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/modulation/mcs_svpwm.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/observer/mcs_fosmo.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/pfc/pfc_curr_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/pfc/pfc_volt_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/power/mcs_power_mgmt.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_openphs_det.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_stall_det.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_unbalance_det.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/ramp/mcs_ramp_mgmt.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/utilities/mcs_mtr_param.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/vf/mcs_vf_ctrl.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_calibration.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_core.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_ranging.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_strings.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/mine/src/vl53l0x.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/mine/src/vl53l0x_iic.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/platform/src/vl53l0x_i2c_platform.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/platform/src/vl53l0x_platform.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/generatecode/system_init.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/main.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/mycar/src/mycar_control.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_core.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_strings.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/mine/src/vl53l0x.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/mine/src/vl53l0x_iic.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/platform/src/vl53l0x_platform.o" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/toolchain.ninja" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/feature.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/main.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/system_init.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/main.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/inc/mycar_control.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/src/mycar_control.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_calibration.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_core.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_ranging.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_strings.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_def.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_device.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_interrupt_threshold_settings.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_tuning.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_calibration.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_core.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_ranging.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_strings.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x_iic.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x_iic.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_i2c_platform.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform_log.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_types.h" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_i2c_platform.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_platform.c" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/other/PCB\350\256\276\350\256\241.png" create mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/other/\345\237\272\344\272\216Hi3061M\347\232\204\346\231\272\350\203\275\350\257\255\351\237\263\345\212\251\346\211\213.xmind" diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/PCB\350\256\276\350\256\241.png" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/PCB\350\256\276\350\256\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..9a538db360d2f073af408387f34eedd4fa8adf3c GIT binary patch literal 20960 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/image-20241106145756013.png" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/image-20241106145756013.png" new file mode 100644 index 0000000000000000000000000000000000000000..f726fb0000e8309753527a3cca43737a628a6b50 GIT binary patch literal 82163 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
bBJAMhTQ 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
bBJAMhTQ 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/intellegent_assistant.jpg" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/README.assets/intellegent_assistant.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..4a20d2be47d8ed9d9901e0ad51092b8227b12bf6 GIT binary patch literal 292328 zcmbSxXFyXyux=pqBA|&B={-SIO6VO!4<+y!AcRnqjwmQq zK_EcrND~AEK~O;vU%dCe`s=;7=j{GCTh7ex?6)(s^LOg+B7oPz#M}hHzyJU+&>z6x zS%5JB$jJEbr6(r(%gn~i%*4dZ!OF_Q#>K(K#mT|R$$jcHFZU_FQ=FWWqcWKVrph?VejDR z#^1bTke+`YnhTRO0xD^={9iNbx^dR{mE;B1T=kb%LxrCC^GGci}C8_H9i-yLg z=9bpBH*dRpdi(kZ-ciTKCuoyX(=$uUE32Q@)<17-?tR-o`2OSP;nA;ud@%rk|H&4; z{7=UI55D;5d@(XH0hw6;@x{P+i=KgeOw1BWET;|aSiM8eNGiv&fs8VW>$}*cRFJ!1 zpU_c`v(l&a6ZzOZl!u6cnslDQu(~E)4{)$iQt|cjvoLnT%Nx&kl|oW@6z^8FkRr z=<_Rwh=9*0=L%i3b2NthKl!>CHd!wHVe2=(wA^m#GStRoecQgc?yOo1aINS1p^ZTn zGB50+U=7C7c(T-F-F5d@7v+PCZ$~sI9ydsB7`<8wWa1d(CM;$gIF!CW$G1YTe?!d} zQnSu^NaB=>9v=7qR&qUh^jf!n9SoyRD)Y1Z?2Y*qwuyREDacHoQe67Yoe;57S97hC zAnzE^e1#Z(dZ6Q>s_4~RL5*s~@K?re%4#YuT3g3S`RY2qYE8ltU->!)+q}a%-$OX( zJ}+-ujzVOiCmDdUSZ>2G6`>*A=UET0!tWKK%a`XAE+gJ?cl8)5Uq?dk1pAr{3XKNx zE0=r>lCxI8(n541vG~iW_q=U>Yru~n`~r|ukw1hfm*VCzPA2yIT-1j521N7XSQ{dv zzWaD_{HbwSsfWodwF)5riC8LcXT9&?+i<=PStM3iCu=mOr72FX3{eBM%7<=&- zkcO`E7Zyr-f1+DT=F3~MY!=QYcdt9O80 z{?*S=@1V5j`_zV_bh8GR>9j2iW(n1*3G|>ZQTmQh9$+kDIR<|Fy?2-(c(^~!Pc5Y9 z=1LY0_tnPo>982gyv^^f+EFlwF^b}FIzi-l-as}6IkefiV= z1*umW93~F_0-9!dwQx(d)eFj$ckFf<59`k$vh>Lp+c5QrmN}Fl|ptNvEzN8Lz^m zyzof*8HF5jVd9Q_uaXg$f8M8p>59`fj0yNzJO1Ekr^io-4IkJ+ZB9?e>ZC(F?&f69 znvM}>3UqC>nq*|WX=*+*7cHDWrD&F)51C04aGxYHze_75+YRAL8H))^-b`6`9sPJ= z!uod)t5#^z0|}$NtI-RjH9v>7(vh1#Tkdw-H+0CE)t`EIzGfHHN2Sp2%GX}DoIxQfPBlIEq(Q% zR&UQH*<6teG2Dnw#l9H%uy=~`V;Uu`DOjb(d-v&?Eyr!&3!i2)vA>16oRYuEDWn9K z7fg*o{-gw^dh>Ufs?WnDe^#!2Ml%)(fKw=G2Q7$T=x%_NyUoJoafVjnebO;>JbwZq zeX_nw4qAwj>XG=2IiNxT$zvfyI=CPJ^e4%|p4R~fH9$cks9qxsxL_#i8U>)vl84L8 zn;VIF_(X?V+@piT33^QvCCIph&;bp^H{`s=1=DoJ1o9D zQf>L0VRAp~Oo#ECXWW_c6Klf1X%~uTP2wMaLa4mGbVdC7d7d{-rMs(6O8Mf$)HZUE z7NAx{r4U>x~C?R;QLFF%Sad%7D03>+etB-O`5=x-x`z_PjmKVa=6l zQ+YGQ-N%nF)TF#Wbv9$b@pHJAU+t9Yc=C;qA(O>*+-vdq9)rXbOTgDBOw# zBM@G+`D0+`T5#mBYRN$bs$n;Yr6_>AdmKDuWmtK}@<&t8`RE|)CI-VHh9Rrrs0Aaq zq>E}FVbt=f)gH2jpNKR$o$b_Ziz1dpH=g>GqI=?N=LzOg%Ny-a-6`YhG{r*5g%k(IrpQ0L{h%8GF3YK>?4Q+f&>4w;Uh(DiRB( zqjwmfVs;MO#7nLAZs!;Ts(-%^WbCx_oxFW^#cMgcTtV;M;yM$pT#Bp{RkLpp2pL z()CZJQk|uYkMWMV4`WT3=`bCO(8Y|8jgR~nUgv^FIN`EOTZnyUS|#hK-O>9kvtWK& zj7&+fL|M^>die$bh;ZMGdx5nQbYIusEInhTv`EhJvQni0>ZCc ztR!+3g@XsU?-^Ub1`w7axwNQ9oAUdnl{GfMu_&8u(rv;ZMupV!^!(MemOrS~IWuP+ z`?X2I@tSB_q|8)(^);!s6z%#^hSOt~`vms6$cm@2o{inZp?sf=oeXVGRcmZnneF%J zDVTihgV~J>XPcUy)9eY{n2~bl4RLC?EBrq0EpEd%@qB6LmIq%&*g&_BVu|F7I!i~O z@c8PEMrC*RTFh)HA_6WQ`7Q714?F{b7!@IDKcxKA-o;_xeS4uKIKL`?EiYQgD1B?* zyv(Nxi@0bW&^)&Slg%w{7!-N1?jh4)j(!RxtWUhSD|!CxfS)L{sZ=g|g{4ILGYc%K z=Q>lUL%|QeNP&t}!*bp*Ywp<8@AdEAYG@3>L$uyJC`7lUUrxvx3ONywA}F>Ap5KM%p>PpQCf5iP`n7_SXWO&(l#VSA7KZ9SQTn5{zeku0 zq)!&_LjPRb(7DXoc*XMokYJC{uP+yhkzTI)kM)N5-C_3LPqh;Nl0i@#O z%YfOFy36NoTy-_ra7(Pua%ePrxdl-g5FY=Ng|((CqIb9}OR7FAUvKPqH$@&u~=W`1s*{g(mn~7<% zkMbWw=Wf+pcVAZVkm*{SRIm99Aj53u7OM|5{WX2<3cpLx(NeU$y(A5i-d~)N7b5?!p2m1wTO>M%1g&|Y$>}G7X+|65hQy>nM<^UQa6iWuwML9y&yIXAy1JGHTC!q6Qn!gfFaQ{9X$}Xd;gAq{hQbD9hPeT^BtFCfE^vg2 zwHfgoj7z*cIl%>Fo40LmUFMIJPxI?5`qiQ=laD7(y)?_mJG2xyT9WA?%t}G`0@g~FyiF}2e@F?oW_cvII!itaGtgkS8fPe2 zP3}-Cl_{loOqD5S7?vn)2hT`7x6Y{$E>1G+ulgAwX={NOA~9vUDLH+Bc23Us0M_HF zye_+~a&z);AfQ_6J-CxKd1kxKzmE>z?Or~DC_j_Y4;M+U+huAOP{ zA$fF)s$a1~-8#D+_{rtwS4U}&&Pi4KN4n;yvOvSdlp9kY^B``*$7PdMrZ+Onm*2vc z^dy|>a)OIB(uG%@ex$7Qw!CokeaOnvwmkfd!jijr{RYn3#rC2P@GE|jFtE(|glPvR z6maW&NS1S0u57g7Ydqa*!HoNy?AGcErM$nTTJml6C(KzPduP@uLF}cz7Jkb%ZTU~Y zgTDZ?JIB4TOzVd!7p}s9japx%4ihggh~t4t;C@PVpQf+1o7_(C6J?>;(bvh7`9jHu zStB&bsb7T9Y56TvErf4jtb7Pmsnw|6u%wtUjwoEmlxndut2g;A6f08)IZV_}#dHmJC9DTL?aV7f7 zC2CaClLlW~usHidxdWIX%*br+2XPSd4&^8yNw#iRvC3TRh1R#K2qRmoB@^Knj>yHz zPr+PJP?$Zt61DzXu>}OHa!!T7`y&5T_Sf_M0dAI5QJ+%_3Nq)OXjRF$S+Zt408=++ zn1{+SPNU|j!9I3b`z#W@J%$bcQT_m9jVehM4#f;>nY>I_AfeNs z&UvCA>f_9-DW*;?*)iC{3i6p2iRymE@>lo5a6SDr5T$aG;I_dg*b{^i;*(avwG+{g z70EoPHQWrI9Nl5;=DLQ>x!Kv3HIRfUa0fjeJ*Z8 zDK>|CBIdGJW@OE6k4dD!6w6wJiKE}NOD93bQNSRZH{EQueFVfaS%DS!h&bKwl?)q zZ#nbTpEs|Ci8<>S4xl1yc#F4GJsnSj2erY~I7zf^O*8%1Mq)SK`i=C(Kb zU6~rvz9vVx+MnNgQ(OPR+1}+1qIbH&NQH)M>$3+=`q#$ZXT$}R<$V?E-(TJ71x~^^ z!(kUKQj$~*`JwK&YQo(A0vzrSQ*Js7ueHu!|6@mi>_jy#JWx6|c{-0Z(o}t;HCZf@ z2Fv(9`{7 zeo}0@nFj1ZB@dyQC}{6;>kpdmnzfD`wbAS-;G&g#EQ<0Its)tG5YYn>9FoH_$ubLo z8XPiZnI%x+AO-<}A$e`AN4~>FS_7)|vg7_0>vp%whgnfQm6yednl)hOSm=O}J9t7Up1hSkhA)z5HG(22XqD_%EzPlJD8xFs!mi zJ$-n!=mLs|5L($)W#@h^zKd*UUU*O)ASf993fBxBEM2QHS{vA&B6A!N8OSP5qnV!s zv$-dRHNtgK;O$bKTGZIR$-u2tc-VpnPW$#4=j4R^i9tARBqBQF^P zl%d!NrCGPO-ICaArwc(&o+)?N<=2`7j$4Vh1$*4>xV&zHN>oJv<*C`l=9OzOTVb`- z@m3Mit1BJQ8b}zZC|)&e!x{)et_k4;hl#>tP1M98_Ou+XHT>Cgjy9jyXv6pv zsL0+bk2gp!J5Vp@8oD&rdUcAtD&!bfp*WK*Oei}m`OR?4AQ5f`R~M-8p5lT+xGajY zY^T$EzS6)9f@JCHaUWAPI2yWE4a^@Y}G4oVhPAC0d0-Sm-Ex-1N;zD{bbiBSO#%m z+sLT?8+=+MBuML*9QIk-u;hh+x%B1XGbakpBD z*;c<56?d+j=UMS^Ov)2!h!XdI2CnMV0R8#YQdV-A>=M?p%JB$YUMHm*lSON=tB)_} zOvOYTH)IzrIwhUQo@TGyk>!ieLh=L7xKAd-LIP`m92obt>}-=Qp?BSQpfmT~aG8U$ z%n0hxouA#S`Tj)_Y#gbLRi*__l>@@iAYn(v_GjSp4+M8Gw7siq6sZrvUtTczs8+;g zS;RMLpM#^5y_|6lwnbFA=&)0bXmkAck|#muu-!5sUxG&iU_{CGN(wC%O2s=kTjoXS z-l3$ooo3utkHWrca6%Y zL9~dU(95(9@t@$t%0o_zapRx_lfDsWv*$b%T{B%0NvMx&x+^X5ab+m(bxx4$q2l@F zBinn9G|5GW2RrsZ@IO8;Nq}z)r~Np`v-Ah@)*@UiqU{#oR1VPLx5{eEB(9?u830dWSrpY($bIP*>}$8>;jwjZ`&G`stm%&wC)n1$Q{euVq78EQ3*)T0 z^(8aX^f!c_^tT{B)}L^rIcIhI;m5I3iNX`+*BwJuY_a^eLHJ2+y&}sdZpQ{q8DyWq zr2NrZUE|8rP3Bj@QI!{it?JXQ1ESH(WSI2TORHlcHunzReTmm-k@q`a!AK&M(#K4~3=`8{VPJ}#>f+6i5R7tmKqOgB9Z;C0~ z@-vMvj>VMOSp!u8Ps_*laF~BU+wjW>Y9<6%$Iwq;E(Jqjhs4P8j2`XBaPcEzVObDvJ1Z8lJBObVy$8pua+~of)^kyB(*WM5&z!p(jaXXysbn#<`QPy zmhswZW&h&%gW~eaEkiS(3!n*ZBgLs76rB*q^|ZUp@ae2W?e3ro56-AOHXEkN8q8$C zE#9u}o=B0wb5}c;9vFL6#Jxm~<}|hhYW%LgO+!B193lBmn7+dbzIn$6+_IbTR2;v1 z4;zBy_8Hymy(N#p`o5R5u~6Kx5I*BP5k{+;cink^5ta9(H5igm8gKD7-u2Rlk*0Gv zYSNOQz!1NfJa|YP*-Ekq$v_NK*oKO$da!V9QsP~CPZgAuvO$Qs!3G>NGG43u^iIwZ zswydyuJRHQH(gmy(GjRY9JiQZ&#tUBVJ?9d$apulk|kMOitc}4H+FVMO+3t9w!Qd8 zX|a3i#OFQBc-xN~_4B=Ec3Cb{pMMl?ETR0iHhxl=as@O5Yi8J)$Hn7aUTN;my1Ga0 zk(h+{kdgj}=Df(L16XzjQPce+XRHN_d`Z1F?=Sh1B5$00Nema=Yw91v0hz@p8L%6a zDmXeoZ?!iVe(T1T6!j6CRP0acRH7T+L1+#bfn_EVP!&mh< z(Uh^G{t~xttNmD)TPPaUK(l(Fkv*85lQ69si9Q#7X&HoL3$dd;*Q-Mr2wA<{82TsiCUU`HP$(utrt+9 zg$q6jxQx$FjF3|uXI0&q8w)GUank%6vKj-`Su1l~A@~9yu6T?F_?#K&G(wtM#b{o0 z+lkfQgdg8)@>eG$TVOBkJ~@y>GGsfk5G_L8 zNBOFnP(*-lPJ4RBW3tm$tgYmys#QxIoA0>K6G7D?{~Wjy8w)opiKvV2Q)PpH#z5gf zmMrjPyjXO;DTrYo`FsR;+uo0UeH5jay=nRvVEY$fvsc8`p%J9BgSO3ZO0p( zmVWAu8t|dux$Ll;HQX`{E+qFbL!hHZc?K?Bm;?Vuo}r}-C`nhLO`Itv@9jmy>JMBI+s98L;Tv_<`RG& zMG1}a$IInwd3^nI8FoH}rm{IsF?B<9Hz!?f8KIGK8?J3~C%bL9ih>$cwwROqSsGz- zf2P5{T@kUtB0~y=x>2qL8 zlH?6w9vf)+F?6%#-Ew`nhFZOsJkV(VW&ghIU_QYE(rgfhG;1BQliD`zhg;ZF;DI4M zZr+JSY)aNZ#=OFYPnt!5R7k^S5I_}Y5wd|Gi5o$fwX#3}(d>^)stws^l^*m503AFL zH_t1V*TZ1KBg{j>_g3#h_i+`aY4be9E8d3x;4Z--dxmRj&<;l*qsTbK+@`Fvh$W+k zL&?HK{-49l!7mI+2$qKk{%l(C$-ny*Rlx*LHJnvGkZckLrehQKp3X+^!c}h?Ica_5 zj4XaGUeNUJW!OUdZ_9}`yzsu~MWJ))()cgA0hHbKhic1$Zh@uoh2OItZXm0o&uDy> zH!f^6dAE1XvoQ?zOk!3j!P)5%G(Wt0QMx&lJ5b@YW?AOEpD@n7;<8^TrQ@rwGx)Kg z>%OaMltO>`+Z%hL*z@)#50M@6!ed@-&H^wc03O$Hb>u^~9o+G)U4tFmTw>ho8&pv7 zPzH*X7g9N1W@p6_6iPIPK^uxW`;LR$f+WB43-!deh)_E9^RJ@9C&a!F-i;uJ0ocJrkT2$|LKLBTC{+*86`4^DltaLl5DiS z6dqL1<&@E_#WkMC8fc4QsOa}vTh%Wre=Lb}w>NttQQTh<$E|uH%z}iH_6v!^0;E(= z;)M3(17}D!cj|#z4&S+hH5_700V3cB=QqO)Dgml7ezr%c-wrmrJT%FH? z*C>@e#vF?iI40;ph5VLT$uooG*{?`?5P-aB!)Y~K#Eg}F3%3YDgKFP~y8z_oIiZ|n z^I3e{9O4IRO?m$X2#tzB@y0xd6T1!WEGxJmja>+j6_rsIeBLORe)THR126-H6FW)v6NrZg=OmnRNK@ZQEb8^;W26SbdLCm$g=kWq zK^#t=)WWR#U3C+)i2=!gY@>w$zPLDavjnMYNE?8AKG+||NqD}scEOZ&-2Q^pj5$fs zO&2XPUAy%9j5$U;Y3ZS7Y)Z6l;BjR7)>o zCpu^>JTOd&tKs*m(3xxvdEH8l`}2bloh+QDzxmwQ$DY%%oT=PBb|Ak@MQ=K0Rl&;lS&(jAUiYWdCLq$NsJgA zhR})uo1#$gua@+fgoNdEAwZ-ZjvOLk8{#A#R6+*tt86*@N;U*j3lj2w(dNz!fkfTi zn<>hDR#5ez_d?SzM&FAJMoe0rO+semvgAk)wHbM&VJ90#^*FaQta8=^tQo0Zr)$b;8St&-c9Dn<|!l zRuf=DubN?tnsO{9f|{}vsm$<)I~T9!XQIf#nrmfT@|`fV{dKk8b(|yCTR?Ty+aXM; z`+Mbd9kL0`fQ66~yrK%9Y!p`SIXw0RY!*)E|l95brJ(L_m+1*^s(X|IgfL_ z*k;uk^G);Nv3GOX4T0@^ajpL}Ol#j(hxo)dDa4LxKK&CgA}Q*TecvKi*!Gr0>)p!U zmTeOcD(vPje7gj8W#{ROMt8gSPH=w>mQv5`AFIoGsT1hMK>8+_2iUD_%$2{0`F25NiZ&W8_&hK$%*l4uG0NHu=EIjW zWcz@D;2T27=16tiLIOeS3uT@;jJsIBRa-_o>ykK@(NxIz1NuFBa@j0BV#A_HQlYEr zo2)tcssj%#MkG*87K%!h=+VmpY$J$z+1bgbvx2m6kAV?X`wg}-1@7{~@&be|S|B?@ zm2O4i!;A8TB1N-7iM8=YAQ=h@$$>e^b%po_pJ98e>fvKn&~{f6x147-bJ3`~Z)Y_R*xJpfmBL+~QiKsX1l_71+3M%in%lZU2dOWYRn=gwf zHIUcD`OXyTR#l(58eXGmaDW-NG5Q3;g+c;=b@T-VK;9D7a&C_RCp#2j(bTLSfQ)R2 z30&^Zk18`OUj?%%;Yq_%bfk^4-2qEp=|=ICjrg0?7}~GFvRw@kat-L$i_CDvx_$~( zFCKhJ{1jA5PBv?>=8?;CXka=4bPaa)SLgt)A4D zboa}fSog8!tmtd1nR8`caRKLkdjyrNrs{6xPuy{@8e~CSfhre-pCNV7P6KY3uDCyL zUO{ii17`C^0|@Q3;95?I5AOu18K*Y)vBP)EAyY%{;dP(Ew(XM=bEf2BisGw6nV@e< zvc$$_<>T%k&rZkZ00Ci+7dS`hJ_cc905U4KJm@D82ol^^V;X5K1+9L@GO6xcvB9n2 zmtI9yUFPPto^7!u6CwpDe9{(AVai+_29Qpl7!Zd?!^LP6I|rZ#WGh~hO|><%g+sp= zeOCpv9AN-M5*vqfe+su`jwwq)Q%nPc-N_#}!*7ll7Ey}aToDHyb6ie7N&f{z=dhfO zdjKDw$N@6}3C~M$0Q#D+bI?s|-UFEDtzL(4n6@yaYP2>N;%i8EG&MLTmRBtzN3?O# zV`jvnRC)2Bf4Zq;u8rz2iY58NDTYdlvos-mpcfO^_YMJ+o`vh+pg3Jg&Je*5qeqSt z*+D(V@W=;S@p<`U7-GGZvYnT-Vyx9h7Gl0Fy9pa8+wT|17*IF~Qv$&aS7}WZ5p~^t z8a+40%zpm78ZqSVJN`|{v4bG<96z{bvcBa^%wq3hsf1%dPY&62F}b0h}N+2h$2ZI@`LS1HSwz%srM*17>2VTeqb47#8r1FVT@ zHe=ya!7I$dLgP5UC&jgbahC0@^FWcpoN}&^Zq*YJMbKC6QY|ybvLXU|yk0JW{cb z6&8|ysS6C80cL6xk;`GS!_hfnl2r{{xjis{1zJHrMhG%wQ7W7YO>hQ#%d)Dv5A>vO zHYs5re-*~5`^I~Qgfl&MK7Dx(1l#x%RekaFXQPudI>tW-HWrG>IjsI+PE>YD)(%V8 z5Q`trc|%!lm=ZCjlKsW8%Pn(((RBqQoAM=PwJVHQEj4_o%^ z%YZeIU3lt**9C2)#3O+>%h@>VxNIS=r%#ED|Ac9Z)eetjl&7oK4Wl@f{81d{w1%xb zk+C4rdmNcacZf142qSlhou#7Vjo^fN3r%8=K&kC%oVzVEfRpw_m>P?NWO>uABcI1O zAFv4~#H<3e2_UI+BfCR$z70c-y7Z{m|vpsZ^pOk52iVCuTt1!k0 zz*WE!AgYFJjJ!ty6#yNyY`O&HZYK`8aVGXK|1-LibzvvA*fSSZlROUcR6HTS*|w)y zN`3KTZ5;R}G=tAQgv?+GNH#wPfbiZTq$jBft`VFyw-9jmepP-gDGR06bP|@MvG%wYE{WGf7MhqZ?ko&%2sRb>H8taG?*@8n5TRz`J{2mJs?y3bEVEOKrYZv^=%nl}Wc>Y=@4yY4A|}s+ zhDQsJV>q;h7A-|=?%`E~?N@Lu z%jEtBkVdF{nFu7zpobOIo~VWcJcdL{R?WR_`4sufp~xq_5uiNm*fy5W+f50NR!>1% zov*;u*fTt58#4Lf{oFp@qIb7yIeNaZp8HLlu+Yma@}Du!i_Cu(3a3w5;1lH9hk$O$=Jjw z>jIV1v2L)71PV1vaKmCy6K67?y=Nwv1&cftRVJU3Pi2-YyXAL#qOz7>0LJyWXdUdh zbajKkfl%S;A(&=dobeG%`L)s*_QU=t*r8D2Wkxsc#35d4p@rLXx`Etx<;cG;-nFHG zFDK<{ATIpc)I6*Enf}k%Lobs6f<<2`VxEHqV>BkXXP3LnZDh%eps_Ov#E zgBMct_&RF@+Oz}?T|xIm^Tp{!5dEjuN`^jZiW3?!rIy-W619e+A`f)r$v+5}omMmi zDQcQE(}SPyoet_M1J6#Q`n&}=G|S=Hze{oH?`&+b!IEKWoA{$q{ zadq2xfJS)OGQwE(m{gJmI$U0U)(ip^E!wrEbB)#a0KE~ic%kUZqJiR~tH@Z~y)Fw7 z#|5Q!^gr{60(naa*4;4Z(Z;Q8+!sQ#q~1lh)M)P&@kARE zAal3)MGt%zGI1C9g*CofS`mS&JNzPWkX@(|{YqgG)ViFdYA;lI`RM8%F!2*PBZQse4RG#{!hp_VP+%ib0HMC4Rs1@qlsxfvsPH>Ez3=?|ptBuu{ z$M3=MN68l|c#XRAo%t*0?>=9wTqjKL2~&fhMJM1aA|_K?P{bToZMWh>Mt!aiVrzcz z5iAt6udm%c-8`Q5p`L&RC&8HEj-qX^pjNUYs4 zOCG)QxHP4l{O)!QljBwzzJ6=<<3QM`aIQ`8Gf8x;nF4{Nh@zIujCEb6j zpCspECZ6`DL4QdgkD9A?ss5|o^D~6criq_q%dT)(8VFylGA0nz`!_tSUh$^mx64hJ zAgxDek=zgKGx*=mHuQgHf1E2l;S+q_Y6MPok8i3PVDJg3{|iXaTck%KSIEV!UtiMC zK_hbCG;pcd>L7-}pG!Nl>V8*zqsMW+d6oaH|h;aNWX2rk>iav^X21w{%Q;+x6n7vB8%Qg2lcwggT8)g$_}!Ct^2F9A57xzW?*~ z$j-}71IQU|x7tjMW<8cr{tLJ^y*M1@C1atfa%>9w) zR2gRC-msAHp6TF<1pfuJThb>&CEE7vwSp+_KQqR`AwL5~UoSD=-#N*?|F6&dA9;n0 zLTpeTHS5dJhG!PNxzu04t%K4NUeg2mkNT$bsA(_MiP1L4;%OVE{|W=qpdbDRrC%zj z9diF#{r9G|)5AZ}-vlCR={HOXe1G&U^p}|K+fZY47H2c{wjG~YrMe%t+f>%t{cqK= z~xO87wEyM>(TzW~3xkS*f1IJoE_(Pj7J3rnKs(djdjfJsB9EA1lt9yP6tmtWn# z{y*6B(}#;{Vk$Tqo(nkR8QsVutZ#E+zocpOOk!bo@X=9 zTkq6->g%^oQZWj~PwWR62fiYEGtZ1nR-`52*_X>7EcGsw#MG~47#(idb6(RWkNX@( zlE)o37C|DFbzg?%ek=S!{>h<>h-Wi>(Ls7~Stq;#ulp;!Lat@}A=vCt&(S+g>Mt=o znu%Q$=wLo8ms5DT>4J^1lT@AeF>Fg=QNR?Nafh94+v2U=wJc6`krcUUFD}{s z;~x(VOAbIT=c7!gK2p=_UlXI7kHz<*IqVi)QWQA)ayZp=D}SH+8xL#>*9z=`q_FA}+f> z$oiA>hg;0=zOiTZ9j?N-e_*2=&2gt>Ri_&Dx|sM|;r`7@5`BMg719O%RAKfJyg%yN z^p%m(AFgy-(~c#8)U-n*R-!PyNBfuO(L#Ff<%<79M#ZCTb$D5Ksh{N1zx@R~ANY*^ zt@4kyO8RK0_1jI4C8Vg2IMcswI=jkBk-5*b1XU(tpBNRab9%r+tvq$&T^F76V0Azw_`nJvDRM>>5*(b$6`b~ zy`jQ;;^H?;-|6LS06SOHT7MzMfMPqyx+B506W7xBu+J5p6~CVm<&MQu{tQ#gyZVQ9 zW>d$hbl~7W;WegzBHUs7IQIuqTot&V$*oGNHPHiJ-?^9l@z7vajPCj5{gbD&evMX= zp-ZOn#Ga!MWh@ty_blt6?Ctc6m{@~tn=J4`-=dsY*DrhN-E;paFVi!*;ouzhPokgg z51u&Kx3mg=ezuz&Lj5Nh$pfGv1Iq90NRjk$2|-7n9+rb)Js|R!Lb!(Li*k==2Y2Prbn#^I zm}~{R@Jkc!tEuXCQ$QYazn=2qC)`sm4qMhtIvdt=!M5%~R-k@@eNqP2)X=WH;@mE` zi@7mA-fjo{WzF-)}Z;3G4+EB%9w9!F`+_xqs7E^^oCr={K?z=!SeCc1#fj~3go9Ev*%BMf`jqevNNK+O99yV}y_1`n+qiT7mZw&B z|A64<+d_|{Rd1Y3xEvg=zPNX(l|*}YR*-|OR=jS{qjz@@5zU`;Y;;kIqmM9vQ1_z5 z<;a8u&YJMdgQaavpS3~QSqmqmBWtpwUM5xst@O= z*^h0|Y6|FT9H465EyY|kXXr4in}o)P#p0%st?^p0j(BPA@)|=9i`Guf+B{eqP90Op zhwUy8m^@}(VVMY&xDa|MSo3fR^*~v(7?)7dAKrYn%Y3;C1gs;ES+>howuc79^#vtQ z$!|OQx8cqo47nl2#3%FanC&T`&n0X0MVEY--G09*|2z6u?YigPrMxXl^nlF#c=UM8 zJj306vH6>8StfV-4;1xI6w3YHW%5w2WWqL;JQ;jfvugh3&t}Ob2)0Rfu`L$2qeF@nJvOJk{pV`eE(% z1fI*M^pPXJ#vJ^9-s8ik?9-PTKj?m6Myaq!aU0ImRa8H4mEuxrpeBmi28Or~C&C~X z5-ir0wrfg^7^~90N6`ZSQO~5SP3gY7r!J(ZJC9e_i-c*edrU$38a20H$8j{~D6Qyoq>w(r%wvf9cx9EZAw5j+GbXR$B?Irt6Qe5>xG1tzARd#xFb;cS>svsD+asVoFrX6D$o6E0m;- zSw397)d|9H4%w$nKmQdc6{ItfXPNk{T%o7tm6ZOBi}-mJT3angWPPntd%WE+Y0a+B zB;8E;LjMHd}Ou{@lFS(FavRHa_FCBG_iS4GSmXKJma;4TS9`fszTGTg8IBsXi zQfJ6ygGb{Z0cuK>TY^IAm}%=HCB?tc`ZwAN{^1mG5LD+kdPmMX{VsQTFh=e9ymqj9 zAAR~$z&}RUL$xm0$cuUg6OPrd zHz*x`;dMw5`ZUVqp*#{vL$Sg-vajB9iXhAo9A!g{)sqpatts;4*UMlxWbdY82s-&4 zswA|x!LsWAluF)6Lj98llX>tlfSh_oQd^JvzBJ27xaLYZVJqL^yIYX2@alK(7d?$m z`9r(8UyIzGR^J-+C{HR5EOKzXaZ=BX3urAdtxyO8e83NXI)3ad`p4HV=!#&SWI@e|!Z?ZRV!qbUeau zRMa=xZ9cAfpd}a^-(Jex_5e*Cv1q4{W=%vss1DV8JFn|S;>uIu`_gMihS}vue#0q0 zC)CHFHAfdy#shEY)`oHEub6QR=gG zq73YxOL4QBu9a#l4CRI;ylYiD<1?i_&+R_IjQwzI62UY7esR6iO`oo7=*4sh;%v{( z(gTBy)wKIrFL+W^Q*y6`$W9#4-&Oa1q_dH1hzv=dt7kxttUi&|i4=Ze%B*HJmittD?;|Wje*M#r(57+dk#3>b%yC z`z+;;54bA)7;b;We$KgBt6Zk$Tx)W{weM#4toUB3p9>v@be8FY=9y>!lP@LOt^KMwm& z_O-STwk7(9`;WA++^YQ;lif;YtE*gpASDiiennoSB=^G2d=(|t+5#IWZ_h&cFU>p4 zS33I?Jkd@%9~-P{di0an8NKo#C1p!6=Ew9QZF4li(C)g`bFrB;WPtfXUcSN9u; zv-d-t;$9A=!9dnkZ z;fG+F&3j_@%;f+M7=Oh`*&K z%bSJ;V1F!LQ6jhswi#Ymm81nvRp_V1c?i+~m;cF}cWvCjvbE8vXXxAAUoVf@nuf1U zwfW_J(GEOFp^VDufqdp0VLf~6))GPgP zIz_YN+#lio3tQ4FIW&!kF5i{D{bv1Ov{zI(c)qhgGPBxx-D%Oy@q~Uy*MFdvRfPQM zt?&8Cgxv2}TT0|?tO;uMmfH^2X#P%xt{^vOYRiF3h4=h&YcPZl4a z%{}aL?7{ghC<)=ATwXWnRv(Y5?dJS;))d28I*UXsj#b~#rXCxLFI_YK^=l1r2*2&X zX;;$WW?LgrMLBt#kdisH5YcbMQ5YPj`T0W=XXPHr&JJ^#q_BUyB1>+ zlh`(PoR3m6X7kchYP%o7Ep;%=bgjc7NuRl~ScmrK#XLjg;4ygwCZn(>hT6C3M2SK+f10a0N#&<5 zX{S7g;|CE%6Z6?)5@~soa;?zQJeSk->up*{EpQj?-5v~7c3)?=a8XTrRaeGnMg~^8 zs`G_2*eQS!C=DUmdo>IgUHXLHE3r2#>SrTnPe9+||72fT=pd=k@{KKe@_@aMp5}f` zh>}hEi~0gG+sq@5S&lo>@{CP!R6q6-v0yPW1%4_)UVb)G#Y+tc=qbxpti)4^Ns z;f9>nm0v?4TCPGF7xtvRRh(0WHEtS|95i3rZt4bi$dqt;BS_m@3S?<0H?`zRtlnbM zF%J;#UpXl5UCjYAZ$4O}&gdX}a!WNa$|q;G610Pvcl;L%;FH#}ZpgruS|J;Z#mked zKPVYmb9@>dDdl9$rzkX5D~C2YexiOXrnf7q9K5smo1t7J zy`a;vekO1|*!WcY`|}AT=gi%{lUn1K-Ni}hx&VhNLus@7Y(*9p`Eq?Of9`+8<)?VB z7El~)Y2e+XF?!+c&HGDcvw~|#0m!XNw=%XW;v_(2WVxiH))W_&1A3qKcR_#h$EV3n_PlLfI3P_o>cgohGQe{ZU#$cg+@K8*H=hq zmh>YOw4G|n80Dc<@nKAo!45-W)N|#e$h(PDq0GFTFkVuQ`b{etooH}Cp3YRpx~2PS z=03~K!6(Bdpa((RgLkc1m&bUhzC1P1tqj&tUQ}XYMxJ9@Z}2YkS4lvmlPkuA61VMe z%_gudx3op1vIM=k?U(3UT?^#{$S=-9Mb=Ehj4aJ8Z}shdBRw4_gBUWVga>1`EJeAy zkt#T!kuQf^_7YK_T#c8eWu%JA_s71Jlo&n5ZY%8}PHrj65A)ePb?X!9k{>Ge)i=A~ z&bp(oXDI$kZesn7&%<1s>2)nboulyR+1hn4oU`@ReURUc2>%x!zB&Dty5ZQpP8{I8 zNjNEa)u51``0C((dWEZbS(wpJpC7VT{4o|JOMIb68{Rr*lNnRVaionwIOL?Eer2-c3`EeJP7jukM`K6XaNJP6R%#g>~!_{#<`(+?aeiPfZf5_c6 zLXv9dJ{2)&RY>3-->510<}d7~y6CPvk2%17Sjs3Ff8N{4TWl(Ib#iNEOE)P*K=kIZIEvwOVV zpM=lzSXUJU3gW8(MO9U4OV@Y6B1V0nay1QW)Ab%RoI$tgB#O7dc}3(CXX=@)9Qy`q z$19#OCTfI#*GxU@^K_doq(rS5qMY8YmuY!2*_lD%%{32&xiF!Yf^oI1l-7pM;kMJnHxVnOV3ZfTNwXKLL)TEz zCCJ`9*Zl*LW_#g4CyP=qO4>oxBi5Ws>(fce^~Z_T&I=Q}sB62Auarq``SO)eDn~&- ziVK_OqkmIvnBVPERv2WDmO{%6L_e+E4=y)o8owF{JE|OWeLm0GHB>BDI9nqQJ}jlo z@^G%GqhY;2zT2PPIGHFc)^#uj=FRg!cb`00H`u=SA?C1H+y?4&53^h9yjQGp7s}AC zYWqc_>sJXK-c_e_#DHu=C9yM?_)6RXC_K{h!YrZ z7Lyd((tw)XoA4Wff27NzR3tta;g8W(U1`l0fpy3UBAF&}xM8Z5K`M!=n6*iCaA{BX z*7Tdapy7<7 zW>w_o)Km22iy4h`rM?8wyoFCzTNg5DBh8}b9mQ4F6a%Z}@N-CrBV-nm@|M-4p11@U z5}eI1L2d;`;*qC2a`?8R96A{|&0FY{A$-~qS_MRNsKFTdccoKgT#Jj)KfTF2r&EaUa!oT&qPQ~Cc0kzNu?mp-OPu(RbRa24h zq#AnEvtGge1L)l4zXI|B;?e7iZsWt>-L@>=O1^0;6qfXv zh}y4S(bS${31?@i+=I?Gtow|o&AaxdN;+!p3p0EiT(@%D(m1-#<<6~HhSxPfLC#}h7YF}4{<9{3?Hi#=141;hQxY^$%=}Mbh*(k;@XNnn^q%Q?y*AGLdZAG7BX<8HB@Ph<9=DMw#8n zHb9&*gaDo84+ZQmbvyypCa!1iTzj)bP38!A(G^QW#eKAfMLnD=hDcMD6tzGovb24B z@hXkeR2s$EQsvrY zDGVSV|JgXlNAgS^mLfHSpSlO`t*A7Chr4u|<5>DzPCogEdqQtFxlvHHCiwF#(o1wI zE?Bdt@Uv1*D z+SFkVR)rk?fwU&q@qUK}!?_%P@YYK|gWM3#-L;2aLwyH-FD>tk&ZU~S>`l2y$}Lsu zTG1|T?Lf=NOO*@{b7--aM;&mkz&}#OKMpJj9F0a; zM^^$zgc;Vgdu(!%`yntv0k8>cU^*HeX2?=ZD&a~XL5UgcKrF?%dEQKkqOtMJXZ%A? z2n9>qAw=WS6}k7E8j9Tm{x_N}@<#&sg2#MTMM{fgD}lM@bf#P31e7#(n7=IVrwrks z3N{3WoWTf}|Mj#6XG?w8D#&3EoJ&rKEL-(VdwbxbI4b_$yjtUeYj2KaunyJPOE}lL z$BuSnG~bFk-Vu%#Cgd;6?%4SEOM`1JLGd1Ex?}SmX=mQhxBwpP_$6rV8&NNyi63ai z*kNu#hMzG+I4W2TzA{bJ6aA&=@)gqC6vL26b!G$QqAYC8g2X{>KLW-5f!j?OU4rs2 zIH3!vIRNI6oB&?0o0lLEp#WM*bqaV8+}>0=D-J}v11y4SD7m@fPggbo#3p2dbj4!GHRmKZsVBhx=PkcfiL{F8`zv&Zc~KL)Bm{~x z!_t5fOA~ExKES}DQ@bpOg;g`(fpUF=P8`m_fzfzUS_P~R(i42A`73gmLmZLpc}P%Z zToYM)TS{)D=*~BQwGV{>9NOV9y`j2$;WYR2RxHYRlP^Jca`3v5$L^Uf zXg1dgEUENnpuX`X$gYO!FGQ>BW8#T|%ktW4o{iAN(%e4!AG_VW6&*#qWGnO|lRl4m{ zn?`Lo7Yg!AN=mkuZ^a@98-J3u!?&eG#SH}s5z^w|T$(t$ooD#4GsB{=`1ENMsa*`b z4GOG1)0Vw4MEX+=;vx~K(*dSgS(6^q11t=wzyvv4P5YWfq+bJeU8Fjk85Rd1FYNKA z=L6uFOHiBCf4KpSB?6`Y=7u`KO{7POl_bkN_-Fqm0*mX-ojgDs0QzGNRgDB1Wdb_n z!`Ycb0bF#VCdM?OhkZaI8r6*CsE3;%_UoSef9 zzN}sTjhC39TCnW>bdj=M-UmzAZurcYEj6D7Y%_=%#Pv1)B!Skqlk-RWdXGp z4$_mv%Hq&J=m-DvbqF%CIE4?hXu*yFWGdZKQmapxr)ZBztrAtcKP;oPWivw#?5x7uDbvWf>z`-{hPXa_P5!`?tgLX(A?f| zz33q1Ln~7LP2GY2+f)Cgwrg&$fluiU0r}^XN9f-XQWI9)0dazfYkB;xT>zR5cohTv z2VF>B_&Z2;EuG*n=`r?0+xNgZuvkWQim*VV%fC}~CZU2Im zdI2ME@GnFh)#U#@HK#Xp$HvEyAeaaTkOoHm-!k-f=l*AGx@X2Yu-t^(DgDQa)Aswn z0Q^66#o_?l_3v2F?GBj|Y-wId9wzz%1OmZ18ZjcR+7pP2t|dKv*iesoII10WRq zkKuN*X(z0Q>4E*fsDOKECi#{(X{<$>qkk6mo3xMR#5^2*=S;VGAytuZ0Er8rz_#ru zV>{P!m@)u1egaS(3tfxf(128|Lk`=43aBQh2DGucSVH~^l>_T9@HP=l_z8)F?5AIa zj!^YB63oj0p#X2~7pUhRS{Z$`aFNzUIJ^KBl(goJ_zlbF0p*S06~!sWfk1u9&w-X!_3W$yUzGXC)rl;?3~H~>iht^jL~ z+1a}oJkwcWD0=LFa0$9W4M*1!3c$bKz<<{giq@?I=Vl;rWLkeg;~zTKOZ!1cfi;o$ z5|r~0cNe}kcU+or393{AOx1d6lk9-~Ix9ACB25zBihv&No$G4;iUGJ&7BTKv5&MO> zPAF*p7bve+5fyzDjiYvl529D(1L!X@;dM|h&cm?D?()VcM}2GMxZtVb&NgFwO%(R z>d29YF!f{m2RG$;&s`iiYTiKqWc|s<4pwTrnI(vInW!&jY^c-}yvgnnOcYe>10rI! zE&;x-8d8pugNfgTx>nAHi1bLS4oWj2ZJ!UG{hAn|EVZ$; zCDRIQ2)}Ai0_-DqW|SwBbLSLPt<-T&f61?^B(|p_U3twS)@ISy>>0C!5qd8S^@c+y88cCaVZmQh!39uEtrL zC8VYFBg>1?L1cgwFe3sxh~I6B>e=9j>}G?W%qVPzNgo4Gk7v}U9coUqyBa~9jzF}X z>e+}&P{SY^^#Cwpf=7cW1M*kHAtvG{>EvK)m+Z_SI$$e2M>=^Q@1`>~D2hY2r$d-G zx@MZ2qJ1)Ee5!(@glnqf)WRunJ6eVXxmqHXtFqM1<)_-S=*0b055x@=d?_F4oR5`gBwlR28h-lMVa{p}!hut6)af z_jc5RThQU4R3cyg3kVeIOV(<;W}Vy5MY$;(@V9_gSaRmZ^konG26x+MfZif{QjRT8Wp; zQ@m6PBdKvPE5X?fMmgd9OhjE#Q9`%-YeeK33lP)Vb?+5{UJ&$R%)fnsamjVb3IIX9 z7z?EqV@2#qd^2Mi1ZA$PP;zDu06x%QAzkpJj?)7;NdCIl3;9!8ysEWGUh(ts3^F7=~dj722r|2;)(k$RL1nL0UgDhq3GZqvQ0P3$37w0 z0w6lJWVff&m7xX6>yKB;x6D2?JviWP^4_ewSWdqLU2)NOFlWdY+^HTZUc!%k-#UqQ zpfelpA~a84g62j_Bc6KxR=y`VGb4T)SJ>v`q@J{EZWeM0GB>GMgFM7~ioP`~u}TyN z7ycteFzgsuuj?r2|FKB%JD`#7&tn5((gAo;F%)!rli%_YHrY%H^*j^OEV!$nn^NnAgmIL>PA!!L8MzgNy z5}9z=(@=+!y5FWlsQVwj*QFG9!)RhX^y#PF+c59z<$F2ZHbRcYv+g6+KKw^h4iX@s z14yWm?cBWbP5KqUT4EjxOwg;@eL&B;Wb?>&usebPKQ`I_iSzsajnDpnJcFMtamaT> zGyf`;sA^PIW)P@!=BmE`9$bwa+b^^*a!K5$BM4261TBFXE$0D2aP-&67ylaS6I- za*?HQgXC(>6eFh6?PgIVY_T4FM^VCrcQAU6rbj);cZl^T)4}9>jd*P4;O>P z%%6-r`H@Y(e1g0LQ7FY&HVt+w!a@$rf8jioJFuze#r4~fG&45C$A zwJM_W<10>njVa|286&kDTKo#PIIaej0o_URvg1B5QH(fcJDyOJhuUcWbzU#Km<8-! zx!O8pr+$NJu-DX}bIu>xGbU!&Ir2}n>%xL|1MK@m0nVbroCucMs4tMyBHL&f`jqu3 z=pHan%@EfYgMcV{lfKLjvE(0wvZB?6$Pk8HZTY#onF&UNz{226ee>O>`ZR+I2Tl9T zX!wvdk{a+xW|JqQ{Wn?%!2E%261pA=4uD`gfdU0|BN1Pkh0COKrvEroT@4|Hq@|p7t6$QiyCl*SF_lQ*!wv_sYfq zrZBUxIIFzCz!KI!k7AoL3vGuZB&gbMF_)esRmu%MxOG&ErD^qlcaiN0|M*>Ca!Mt> zZtCWfI;I`z+@|{nkTBt>&oE4470T<$pOOiqFK740Z?pn#)8{_EQfLc6aN6NsjQS#~ zJ7rYAKFKd8AHFc{m$*>5^^ig+TV57vIedC%x; z&^OIjCWB^@${P!|_7^n7>@NeIN?&Yb6@={!~-dvqlM@Au2!iN70Y_7gnSqp@cV^j34I5z>-I<;CnS>>b{9z3UIb&7v`bAUt?nsmpRWP)?EnE{!z&dGD#u); zErQ1rw}sLsUArVK$XgI6isoB=ZzEhQZifE(QftV(e%rPoVU^}pg;aIiU{Uk3AFvJh zl}e4dsvNpV!Kq^K66Dx?&GI&{fuD$!Hzm3MuLm^LiT{iwH93+=WVLyXVyq)=Bp6c1ypc z8qE;-nl=yUyU>7vK~o%jfVd@ZpT%``mRy}7TbqWWg~n)xL#*Fnb;E5ki1vQg^Dg_m z>^sXT4VbGNdf2=qly)k|t?SZg$f-SE5x$M8=)&raij z)6nepwd2B_T$3hm1t^y#>H(2U&aidLb8K@T4MA%(6UbRU}zD_bnn&^=`x z{ZMUr8o6@lR667kqXV~Z1FZ1m{*2I_+5&R1GMXRIoyOw3?nGar!G`e^Yc#VK~z7W zq`EF#O*ppfZ{~e+k=5YF24A#oEfU=UFNOAd8A4Q~(l36Tr}}HY5yX!WI)H5l*S+$$ zxB{)3xs#TvBOu}Ee(_>eBL(dZ&hB>Qp4rIFZx?RbhOHX-WEDYJMM<= zm0QM!Eun8m_m_I5oo>Jv#12R=ML(|8G@s zitTk3UKkhX-a>w4W1*<|bHEpCO76d!s5;fJc#ZH}g7(VQp$tL*8vLqo{I=nW9k%go z%NNi!2PbOor~<#qd>-(*zm4iiD+Dju20>RjUH{_efSXGv=`V7PI_<)ZtpsCSH3^M< zKtiJH)GmJJ&wqsINh^pr7;AGHGYlc(3lII_`@MD&4ban(Ky${e)YH3ZIQsn5Lyu(i zL!dr}94)CBsOIuTmgLhP{YBS-Px`hOIsROLIqjYje6Ntu;`fEpgBu{JLWV#!v;mG^ zAHmCD6*rEXEB8Jufr)HoK$`w@%gOpy{+JX4CMs-4p!uf2KL(G0@zE6FZg{G}6eXaE zUmxrT`p89d65Ub?G~5V1Sg46}jJj6Vjah>3a}i>ODe7-_UxH2tOPV!4P}AG~&CRs1 zjUKkf8~VJsM@)t8{mrp=4N&akfW)FB8+qa&VdKS>Q)mjyfYgt3g*jBzhfqRu>BWiu z92T{ofIj#67chQ18-V#|+^#lfhioD({liZ43JyM}Z$z9V-q!8|?3Z);XCnpn zok~4d(mHE-bTxcDdI%eT+q%gWI7z$%ulLC#lIxW2BrVu7nN#66o4I&i`!Lc&Q#@e- z*cGPLD0|zDv|P*m32FKVX_9Gb!mn^k*lw~mH067;ndTeqhun)iWGbRu-f%+Nx5@7)CLLj{s-w!a_T>pN5n%v!6qTKXt$p(|tmf1;j7%~fEq$(i5 zxz1&07<=fZza(p(8t?eR;A6`E+-wmH8ZM+s`NyT?mD7*0j1r6AoplBo_dgH{#gJ@O zL%R>D7`rOZ6X(D41OE-=!H&gQWuT zw5wUU))jNi_>0$!bNYb^=rrZ|n9)J3xX}q)H!N%}v835l?to-xw2AoS&Q0q2;jP%2 zwL-C!^?Ye!`Zh&m0(Ie{RQ4OR>aE0ll{N7U+?HC+n9cCcGW1nU0tt}{>s0)mk7L(D zYb<%wl7dfYV&a>~ees)_b!ik^d?C4;SCGALbDF~qd#oQU?6IDx#R%twS@fSL*-rIq z3a}nUVxq;|P(;JrTEFW=wXY7Rw16z6DJ&LYJ32&yd;8u!_O|nhCh{{T9 zot*`h@_nD;_dQ6JB9|DFk7e;Kb)`tqh&eT0vKE*$`dEmWJD}Pra$X2qx^+=m&eA^m z@}lWj$49ZmvdfavGwrj4?v&Y!a`Rw(ZO}5q8C4gY@!a35 zGm^U2V(s3WU^{67@r;^UlV{zP;v?>5w=w+z>I8neGK427wFMfB@mTTz^4$8Hb3yBN)F!+UO!N8Pdn_ht7|kE)d` zyDT#ehbOp0GJfOT9Uwb;U+^C5StXlu*bw{yS&5bmtU>QEQ;I~R_?oOX7; zt7$@5Gs>~>hVCAWJ~i|x8(L-X8LUtmq>!t55Ln6lVreh1(u3kFew#Rv$d1?Ryr}Thf+Cu( zNCXp4x0JDqvTG+<3F4X!%NM9)8}u#xDeThVy?jU9qt%^m$lp|aM)Zm%R}W?* zUmda@v&~`q2Uf()Mo02?%yZ02^bFT*zZbt|8q4tsaJ$xL|3!K-1e-XVvyO6u+fUIl z@%YE&=8@6VyIeB?ojXJAo!FsXg}ns-idUy5O?DO0VFrKbr}RDqfSQ@Nd+?$L|FbFel6V@BtK(`O&<2FefR7R zZsZ}}*dB)mtf~Hf2fSzM2PEZ3EX0$p$IDdB=c8A@OCJL^h4Mj7Lukr_i=t!AJxG5O zm1!$9?4&?vPkim9c&hBoC1AQ46^MX-CVD-%DE5>cj9Rn2p3~_^L_O-&grSqAewGFt9Z!rWY!{v1JBEoCr3)?}kg{@cW4b zeh}U9T^L>3kt3cLRl!j#A#VkEfjIzc=FO`6`Ujjaon``%@|p=_*h^JWO_ORV^81hg zO}q{cHn(SPO(fUO+p%8gd`tnzMgfK`lh}_>lMsS|S8M6Fci$xMdN0jZ=&O37hw9;z z-ff4+b&%5$6G&y`hZ$b@!6spR*vtD%kOSjUNlBN1F?HZR(KERRYqw4fueA82NbnB? z><>8m6e?mMc+K*f>D(?+gs{1->jLp@mWZ-B1l?+;2q2n4GBC;;x>zi@Z1D@Y#& zdS0O5lVg7jBxzQ`r4&k=_MJ^d{C{aAMn@XzgSAjfH= zF+>JBxl2%58Ufbyu!o2b^c+sxt6ozcVaP@U&b|v7$I!Dgpdl1^IeSIu1{CQpDF+W| zmQWKtojS_*3ez(_6(9~s+=KrfCv3_C(gdK3M34WK6&B3?7NoEWIUH=3u$cN&Y85ak z4PA#E;Q;aDEe@Z~5+6c5FAX_`5{_N_WBj7d?B`N+kgJ;IKp42C(GT#IWB8n2+J2J| z-`NEu#h;1I?GnTTIm){}M}#%6>F;c_wBwtJbX5T4J^%@C#SS#D9RQLRPTdxMwmFyb ztRJ{tf>I#HoZ8Y`m!OY3831yC7}=Cx`cblnicksfN0hog^b_(;j;7;%3RTM3(=xTmC!ZW4gx}fQKQ5^C{2$s`ntdV zdSr4wLiFZ!x=Vcok#gL&wRia5=}U*$+2%30FGH5tKCu0scahucafhtqlZaUI{DwW) zm4=hz-%4q(8OdKfSwiw9?I}G~UWv57gRyed7ACRMg^%9Lxm3~?VMHlIb z+Wf+4+D2u!CB8bb>kS$#Xpq}KZPz7Sv|UZue#;Pvcc(kOU)Rh`*+tVDuhnSgabuE>t7<55!WM*gt^^}$>*(QNi5%cop& z;P9Fv*l0a(xzA65k46}-xcl9wNM>+rwaK))5bHmsv#u&`6tt533%*{arb(kDZ+1F2 z9!rtiZ+MU1Q_|`0p0&oc9+>mJUn)~|YNVb~=E>=e`=)O}Qev$xur4Y(`pytiGplVg zWtvI()2W^!;Lc)m8G<{{a^_msgE3xS`Q#_rtz6;XS~DAJY1fC%(5pXBqU#MK{pE0> zyv68O)`CwTETs62=J!S7LJnTc_G1(MfH)Y7HI2~r>f7HARcjm7UpLlOEmAU`VQdA8 zx(htdqJDG^#=RSQ7DmM=p!oe&l*z_Z|96POCXX_y3X2zEk$IqZMWhGO3bUX+vu|x| z{wrz)sdKJN(KXHqYg^_9(FZC{LcfxZN`EYki2E_C|+03*UZ&1ggBYLO=4HDpjDtg$(6iOVvJAb7Q{+0XXF z@O10b2tTQv^5@2I23+`S_Ryp+7mV>%(kKN1zj0*1Ri#AeQ1+K0EGaUg_1lp8gaN+k z#9+mw*LmaADOgX+LK{28c-@3k{7a()?@nLQS@~gTD%bBTO(EU~B>FqK+)2K^a=+NB zBMj^~%)ZTT*wXhi6!?_3!r)OtzCt?+!bkl0g3l}JkM~ir?NK!_hFWK_XxP#CSinuQ z{NIV}%x@$eTRN3+_)g0kr49FremhIP&amy37VFTd+}{^_=3!~GMPx=D1SVp=^P7Ai z^)wYZ%Cs|iB;^>x>6b@FqY)*64nO8uXf>4W-&WNLPrD67YmPZgZinbnJj+j;O+R z9?GJ!jm1gTbWn}*54lwfXGED(m4J>3LxKFZmqb9a;J%FTJ9E-U(pud2)SD;UuGamg zb^6@Wr}|E4V9iAm+QY?vT&SL-O6!N%4ea#`$LLIOlSLaH#pOiOBXcx56DV@sZ@s%~ z`~Xd(p)MhUzMq?Im(d5DndvyQ)9+*vAnyK_TVS!B&FMuC_iyhSCVh4TcZceSS?(m6 zbXMYpcixRY$gH$_Np91@N%NXry7H6#S<~^%nXtYs8V2i@aug=>Q?{Jtfr-3tuBTa@ zx4#@xY0Slmpna=V)U|6$myx-{%_{jYG*lG)r zYjvsN)ohuNqE0;ho(PI(VguSKaZ0dSo z;QuLJ0xm4GJbdfeY2>53$5tK$_H%WV`AZu^s?6#$UsM9?=Hky?e_1Lq*ivqzuku-h z!NciPb*7M2iGl|8+gH4V)A+tz$7hybxrsR`_n1uMlTgRSZEgTkag&-WSF-=TR(Qt-`k6tax=NV2t`JTOuaAQHKT)+3H z%cQdj7PDp1GGF^p_4Qe(%0W5XEl(KV=hPmz7{m`Gm^SJS%Zmx%v{NrMmAreg-i>7* zNqcWfbx)B%Hq$tg2)8W{1GmJISnQj2vJSeG=Qvy{l=grPu8ATa4feo%6H)-TlLc9Nc@BnLt9O)M1;zMZYiTxnDX z*$2dN-uij2FI*ECXstMDiWwk}acPR3t3b-|n#7vL0DB1V9LG7dZ9@s{*0b?wR}%wL z{VGe9w^f#E`tZts_EdP8P7BItKd69JxM*S%xmACRA2hy?NIjlTe6H^K+48A&nXbEi zPcB)zRq|~;nZ&o&GIu{vHyH`vw$_*quqW{^SB&LMLL*sTouq?(pGR@%`nPS#d_5l^ zjqA{BjFqQgC_6OZE%!L2xr)3yh_?J=n-JV*HiWDeyI*)m!6qSba0HcC!iH|% zK-QcO+>bmav11)g()Rt7)G+c@eSGL84D%e=D3S)deUAY+nv4QJteUJ3nxI4Kzh=Ue zbS0K-`=;OAk$G)W8y4H1Tjw+!C)_uCQ(U-^-!IWb^(A7H$5-3TB}sae24ift&lyMS z^wdnZ-HX(0*(POMXgGdZuKAM^sx*xAJ|@7Jc~TC zJW}>F4~%rHMzfA8%NyUG-549q&w0O5r6P0JyO8C<*ry6+Wct)&gGd1{ET(M8@^Zz;+ zt-8-l^P|uV*RvOi`@N^EB-UX_7hIhm4_OZbS9i4`Cw?@#)?}2UH?w|4fw!?_7KJ&N zs*odppBmVkFoPRa=5)Sy_bs(ej3(kqRm7J!USAPZF;udg_SQSMg-lI_u^nNS4oWi>L`Lns>zGm7nv|k z#dWiNW7=Or=x<*KZI7HCtr-r&f38IkYIlX6eUUb#55G6t#3%i$)NUs;s%(rZC zMQsOLRqBsQcyHTn8SvPld#CT1+)tD>M}Jt{?K(2qUsMyd)j6Xd?$zM1CfF z7?0Vq^-t~+ANiP7st340XGt3x+0PKw+Q8xF?SA$aYx5JilueYynLTQ9Qk;@s{d7W^ zBNz`XQYIF;P&du(6zQ(vfYqo!VbnwPKF#*)4+sylG=yg`mtf&o-lyW>if8$T4il-~ zPVU-uW7g@8Nv*j~pX(x!c`todOE(zeCsx728<Bh>KR(vLilLuDuzv@Epj>QFtnY{%w3=+i5xZbZJVN zT{tNq>uw%tBgMA%sjRkYZu>7noGP^@Hh5WgJ)(h-jrr>En5xzyhWE?8dxwE>bXcZ< z_+un3CqoxYloYYsbyrv8+uV%sy5e(|v>Z`9$U1Msq*zDPXg$^U;@c8VT@=qHJ3f{P ze@UgHiBs&#fg*W3!x--+?_-nk@ejsIa4wi^ifA+9m-G+Z9o{0enb$&x>NfOO#~tfZ zJJy@D4V>SUSFsFi0i`fF4c<3Ke%^~ zxGPWt-t#XFidm>BC4i&M^BK4>=c$0d+%=3e5Yb3s0SFzuVb@X;xGqe;ua17z;UQ_l zH#xlSo8{vIQPZ<)a~sQ0U!cfF{|3AiLV07L^+KbZU{tQ}%PS{n4;s0S;ah6ZggP}98(siZ41-P!3+WA~$9M_WBUbHWQYpT+S@X&^{NWv6rw;onv(8~6Xa)V6i&Dxa&*gFR7@*9rOK3ku`z zGV`2Pu|zV(j60ZDS!EE85m*{b8DLFxaU3ovVG>2?Xx%|PQ#V#d!^2av!Kk;=hvI-8 zyR9KK1_pvfKn=;Gbs40f1>N+f?xf8b9<^x@C~N~p{{VAIkx7y5RDgc^VQO5C)Y3&T zBX;Xm*}96E$mXGJb56iixQlWc=kMU_T_c~A)CIt%$2EG& zY#y~l$3v)wOpdi-7*<`pxgBccZ&1yXE~5&OTB^p`?@v-|CR)_cv4q@A6j!6@np#`i zD90poT$hBjrkY_R4h4Fzh4d*kTj-!c_m5iOsUz0I)8&sdHv9{qFjrw@*Akv#+AC|v z{vmBr(#ubYTH5LkCj+Rhq=xIkYYew{h^~VXtV4rbMZ|{k^6K(NEiCPlO>^In?}RRA zEFU*qn)I)RJ`cvuSIwPO>lxOh8oEKVbc9Dr2%P6P|4|?-wmFJMlE0>YEB-W0z;v26M zUp(@RM5Kg|u&#H+8r`>tbgA#Io8*jez0GUnjBRChbDt7?WV!~O_IMaI)Z73%t$1A1 zywf`~Zgx3iRyB_hORwrv-$=xn56Y*tQvMVAn(3!b+Ox>3TbbDpNlKGZJcO}1q|G+B zIrjifF5~M!UnbrtyDE{maBP-pA- z8tT0jA_&i$58+f87^clzvwUSq=}CJJR<0AgbjkLJGCGQi(ejNOb*U_z5LEZ7*I?Vv zxO6o_E6oA7n10!%juMYT!;aBj^tnPsQ zo>RFEds3Wqs60`i#p1mJTXqBO5sb!t>)60zT^ZTze8zK@)5TJAd!y#@dPk*A9q`5& z)on(~O+M~eBvP!5M>SJCSLoD~DnjSwRdV)aUwwTBDKiE}E+&GS@GY8~S3s2UE2BLLT+RYPO~c4SKZoR%Xf^s>e;?U1^|^ zL2C7FCs#?K86fdrKHFV2xda;PbYB!mhyiNkuZHH;9zG`t&+jAIKHC}YDmS@LQC@NX z010C+@luZ$`n7rARgvec6wgBQ*Vd5CzO})}<0$*JOgvu+AAD3iG?ARJl1E}@S_Fz~ ziasri{(1_0ek_ardXLVt_A*4QJdxUsgi?h=-nkU zMD@)s#I9L00tg1{@mbt*-=tbDH+> zkd?JPOf(&hSYI`%XU%2WjIC?w>zeh_vFgQH8+HqYt8MpcD@4Log1lEkBy2g&Ygnl@ zn*w~*x2H!zNa!@Q;8#Ne{GWwm>5=d&pn@-wq_kF-ilpZx)$5_RHA6g_Lo{p-d)E!| zXG%BPe1Uo5y8Br+_pW2ddX#b5$-Re4<*RgY){|Qw9C)9@t!aBJ5#G4F$%?Zg_32)d z@fTT)&oD!in)96&(X|`?c?8xR?ILN-rFK`d(Jn7rg*Y{)z6_Wq;-dHE0JO*$Ka_YHeD_7%LD`9(nfAGgUHMQ8Qa zV;ppr=aIvtZT=dy9jBGry*vI9t6(}0%Ak|OR_)kP_14Dmt(;Aj&y;x`D|XjghB5PS zD_i~%2v~L%T5kv-&JASoS2Oy{WxYSd8h-J*O}|>~G_7MvkPO_Y`kM1eJS^#)WYr0D zi--x@7*{N$>JjZ6x}N)IHk&uyxkLEYwYHsYF&ku4_}9>Ew7i5+q8SK;xlr)hvL zSYzI~-5D}%H>zjTKk$i1D98#$LjDGckNUOztHm_mjrzTq0mqmJy>$9_?GYwGo&oix z?5ZJi)kFR$cwRdgitPYn(!OZdp$T^&U*R?Ge-VByr-&o@BLj?LygKxm?j4)>j%(P% zDJbfC_*qHEQ`kNe{5O3<3wg?J^8h1?_Z9d~s}Rk&I3AVGd=K$PpQLG)M&x87fnMS~ zb*0^n@!%=1GZl!OC1lSh6^@-bxTbkTp9xY!gKj@6ttY_fW(1f&O7cvP z*%9}axK=KwbBp^*r*r2WW8fHA-J`ZS_7&y6Ciqu2p6|LAP(1~G+PdA0(G@!la^58H z-j}RJAv-cfb<@U6sW8kcMpr*RFLb$d$=OIa^{7nEw1d*U+u}FFhO(MhNcTiZ!2-Nv zQ_^16RvS($+@oGK7U$JrF{-S0G0m>`%ARYg@a};nzy#*GsF+7C4{G(Vh5DAAD~RrK zpL*$=<&Dmo)!ZR;T+=)mD?&ErwNt=XgaWxW?Aj)eq{#}EW#`;iQ*YtjJgCDcub-=k zX`V;+tBbMoviv>1$3`^2@UL&by5E(3A^m}BJFOqs7T%({ezHI9c6{Og01Eo}c5lj* zcn0`(HS~A(1-G~5O*##*2dCvz^_Ei3T0V6D0E8m(e}vFH9eO{6*U*olTlxxT_7or8 zAC*6?*wJSv&%?r3qxcOU@QYrr@E^*)fd0UT`=j!v9R?5Xtu>4^S;{_tZw_9M`DTAA zjOcfR{#ly(1o(Oe{spLyh2YM156Yj`&6aT%cnQ+3m#l61QZ0?hJjUOZd#%TZVHy3< z{Hi#7H4}f!CH$!R;k0vT9w@ex0sgH1R9Cr=3d4`}OZib+eQV6G?P#AA;*f(;dB&P& zHSZqniAbi@MsrLv&=x14XT4YR%_rI@3l?c}Rld+@^UVQb#(n8Qs-Ah~g`Ch9E_SHN z#%e!2;-Y!Z4G1h$)uj0=oNr>@o&t+*=IWv|LJ?NdF$ z#w#fo66hx#X{6OvxHzEBYck6_z3AUnJmc$0=9&PxywYwpQ_VD@awr1c^Xo`l)o(n~ zdFFs8+-Y}JZ#dJ0q}2gFEai`SX>KYXFq&zSs0TA1YCYcd8_m|D zGMWIH`4v`3!3LaVG~Lsk@q@mMyp zaaZGhDj9J$p|}NV<%s)4!ACi)Sey5C*mwg>{?OD^9z}D_*)yh`9Hf#xAH$k>vamsp zNUve|YvKJ=`HcpeCwWwPQpnp>R~@71%RSA#umk2G3iV&Kf5IVmeJzi}|t+baBi;Gd4hEH1Lp|%d&MQBennvK-=k_<^X+*-H39O;p2 zo+q|~aGpyy&E|Bho92~{gt=mDd^_;wrD<{Yt9fFzQ-CM991o>k@n4B`zYV6Z;oU;? z-rV1)c;}4a0@qFA7_@5*Qb*J^c>cw1zq+%xJxKMhG1PA)*EMUsMpep@vL)-aJ6CtZ z6NloJ%-d!AEIwI123f1;UyOb{8s4z_ZLFEKgyD!iO?t=0?-{3rd_OWH0e5n{SJYR@ zt#amfc^I^kHs&U_!@~aaII(r@?jxhNkwDNA?nn(^e%H573?jm=z9&nIH%o@G61R7?z-WKir} z(g?JS%^H|D8@qsF$#xN;5bg07o-OZA* z)A%1+I!B0YE_Y#f1vT|el*@H&CLDsHtK(>xqJjuLtx0D4(5G5rD_Bj8p{VbnF}~qRa~Za{+&X5h$fDxkKGkFuA(MLb ztCo|P-#?vZL`-rJYT{LpdGE&02r4S-)@l2<``brDUNl>v?_XR#pANI7Ph)TcBd!K} z8u@F+S|q+3*KRGHNKnUV_OH9h@t)E?&TmwHdz|2Xl=>|wlDt(x}lzScbg&D@olU}Ey9pu_0j`vbG_9lC9ZR>0k~GA0!_d~q%ybL$R_2_QjchV&qSDif3P(ex zN5HO*+ArPKMw<`HD}LQRPr{_MW9nlS>I!|11v1e6q@n>0E^xr zlGff(2^?3gdB3|qO7Jg@(w{C`!ltG&jnAI7twu}RsTqz&YMz;`rk5_`*wZc~+R_tT z<=p;ZU@M=J=s6QsJvtwX$rO8cQ;)@j{`Gk4k~2^iJo0Obcx5JV%L1hC&umYNQ33a< z2gP`p{o!6Ixcblw4(6lkNX_Nzq3#jSg)rS%j? z_If??KZv&N$C>)n@%Zx9zvZC(>*w{llz$Pa1@z0&%}>-&{{XYm^dk7y(SaMqA@MDo zx%t+FY9h80XYLbT9G)Y)Px)wn zI+;9GcE9q_{&fDUBsGJYJ!bCGJe`DN+OjV#qzZPL;o?p|2ejXbt#=y@~1O+69szwn$%kCs#U(|_SOx;eznkF9uoUNZ#! z`qH)WU~%`WKdDrSn#-p89<6!ePq)NUR@@J*a2_SlVY?3Sf%K{?;*slCW7d{r>T2mz zsZHGKqk^qT-5ztQ=>&2d_-gTl;IVAs1&e9FxF zSW|Y?^e+nhL%g@ztutfYtJJi=9?fwYlR5nB<@;N?pkdA{tkOJ5EGhwGTotgYTBF6q zU>u#|kE0jIGJ*cQ{&b__4AK7p%VYW1iraXV+;UA5>+S&{n(``PDt(j1mS0hHJ-$DP z^N;yyPH%}5ANgrtJj>$=V4-N$yJ-;0qf>|wc|rkll$b;hNC7q zV^i#8i29t*ZMOK3sxU@>8nk{TAzlS|TI#O9#A-y<|`&hO!jB^gczPGXg(pT z_OBQI)qH*9K-JuT5vA-TFRE1Td)!|TU}gD~QCr3P6BWpC+1Npa_bL zR4>rglNS{Pk(?S3jBEb*^{TeR4OVplf_}9Xs^+>@$2&A_{_Rb)5lw+UQ&MckYbhE> zVY@)2;*_lztjZgKNyRM~paP6hMF1G10*WXBKoszzqo>sX6%=4mNCqm93xSGbD8)Y% z#yx3)3n1pB*eXV->Z}8Hb*Am9DJnpSuLO3i`@0!nvl1Xy?$FTNQfV<074T zXSfyuv(T8E2AL~Eeg?=D?jHxV6Aqar!>=#XHR1XsM&{-y{a6b6$HE#&)ATDy!r+wz z*Pn@%m67dWW6b%Pr)j3iArHv(E84ZB@YMG4CG3zpBMxP8(z}m`^XQNw!F33d?oMz= z6=%m9)W^bYZemn3Tx~=H7)s#e_ilR}`q=Y@>+M^57l!Y3X-KmU8`WvP648#itwmx7 z%=OsoI?TF$um1oDriMJ3zvZ>h@iTf>be6X&q^zt`@ejg#-5Wq%XU_B1GyC-~lC{dp zs+R30N~m4`0EKtHCzbp!;o+c*#<{({#FrtCc8c)tjQ%Db7w}!tM=Lzb<;8Cje%+3yhfyRPjpJSC1>4vz(G?FVkQn*1ei=<%&nkSEb&Vs8# zNcM8d?u}%9V|!=kysM7c6_aO}Wh#G!=DK|}t>2d2Lm)Yvn=|`!r$*LzAG=8lK zb44^4w!Uf{balwA-8lI(;Px1&0+C9y}y3 zbad72(=LPNz^>qPS|4SPT+yzy>A+yk&o7__3zJ=AwDV)6Hr4 z(?pZQ`t{|Lsa=k7^vz(Ck=DOk!&X(PsUz~5^qncVv1F5XdaEmd4HC<@Jl0j+<}-s{ zj7|v*yO12#aXBWEYl7M4n;T}jVzfDn5T3Nz#_CwlT9arrz@z07X;#^dUycmbnC-w6 zTnZ6c@k;i%&1nS+4M8R|VzfoDQPQm= zHakyTFs{2yj1;bB${(CpU!}u{`K?h5oPFA6+OxBRO;q-+48^sNEnOy+9b;KVmad;k zgW7_T(rIw~g10T=;;LzO{{SGZh+)C$Qc^N?TU^9=t_xIC9IalZe{a4M$7=JPb^@}$ z9qANhEazbr;h!2~XO2!Q-R-USWMaI>;_iwhvyrjdvufke`4>=32`iM8Va<0s{h^9U zmmamp&un)Zn+;hR?zzo0L@`#L0tGNcd(_y{))D>1%O zYkyONY>&lZ&X^{oEJU)EJQG)KwFge7v%segDokv2cGp|RLspHxq|tGjq6f6 z9<>fBmY|u|Tk9ZoHM?P{EUUq;7CBXhMQdr-qB`fDBWP%MaLObe^p`e?br}S6S=w%+ z82}P1b_t@8bs4UEavcgOoMxk!6pv^x_vh2I*w~kXBKn&II}xa(pZ929M&7dHM<;wF-~SUN_F4+e2|x`Bzgt@|BiFac`F)HDe#!x329H4Tb0~+eI%~}=!78RGVh`y}@aaVOpv2jE<5f#oy=T>8Q*mkVl zD5FT>srD=EGzf{S>ajPaI7FSRCkUD>H9p3Fl4z|TEhwyglt}uWF2|U8y=gq^VWyl{ zrghkPnwnt%=Hwre5ROB zG{-pxt|YS>{%oi5VgOf9Lk^~uytoweHwK}Fa1A>E))L&_I|rNAo95E& z6l@hBH_fBXrPwG4C;>dmUpALurPwF|o@E|wJ7A;B6d)VsQi*AH3QsImAQ#M|&G)48 z=FiuoKl!lsS-4t=9o`fd0bLrfFj*W8lQni1p*ivmY%Cl3z`6h*D83d>8(K| z;&pjXY`12l0bivzOs;T;emg5 zAKg-Gz0fpky(i(d`E5NeE~A&tiZ(ovUP~0Oe>+;H%jzRi+&Q0$R~|7+2MxaS!13gIoigi_*dbXbsq_8H&zM_=sOk9@YQdK z7P0Am6oW>xm+iMtFqZotFwJcWc8$zsQ8`%iZ{FOrvrR9XG@V@6%>Mwirn~n2P7O61 zD+1+!J?rV4kMwOmX?p=*6nOgl>V6{Bt_yA+VFI_I8_LHXCVaHn#oH)J38MICnpHTG zo2VVJ=DoCh$eL*xBCXw92?lD0ntp86+sm&hC;~F80vfC?H#Zehd$*S(JXDq_Ny(rM zXgFGqMc&4yiGExPw`pV~Y|(U$61h&-OY<8zt($8_gmkMg+la+VR=M1+YL$dlzNDlS8c#Blc%@;IqT>}ktC()1kQ@-;)m4(DX>g#5 z<*N>Ow9RSF##cw#zYld^?N1C@P7X^(0VCF|YCklhPf@nGpV{M7`)`H~yEa-mI3C8m z168)!Z80D6>Q8 zQCP(>FVNP8n~^C~(9>@%{JC4+nV8iZ$j3^#WZqrHRj@fM4{DVdi3uI31INED*~E9VP~(;AXH!%>2_iq3r6mh^N$xWMtI|ZW;4WST_@sQzfV(zSSQj%1EqDT8b7mYCBAJt5Lue zdRD2KG*A(+rC82-n!NE~8iAJvv`osyi*`@|sn~!sS?a}46=o?n3{?T0bBYfhGe~PHfKK7(RgFPvtBxr86)Xl&*2Y-#WrRy(t=!( z%J@6LI~7>R)7rfj*GLxeg$s-h!n-RE4W)!cZ53X7AgtIGtWnP7b0XBK=~8(l3e=L= z4%HJxF?>8w~MC(ER)Om*H6~E@fp* z0C^a%C%U&Pkcm{nc>Rch)pGuN$d7CN6Ox0;)&T++S z+*v#Pi ztgpAI=Ct9Pc)>Nr>Gy^g+Qzy|JFvhU6;@yV%; z%wD3oo`*+6&o2Bv_T-gQS0cz*3G{=Y>3e58)fSyRF?9(Rg9-(WiiAN1uP+XTB8uH66Y{W)dx{Wu)iGh|C zlcH-Grgo_0iYqSLS&Br+VMSx?nXfW9Q<`Z9H6aw-R)Qlm!_d^EQx8KxScHmW3YMd4 z2_wOy2Ax2lLw1@lYD|hxS_VMC)J_i5R*2x#5{xTV#EBT!Bj+`0*?wBBaB}9Z+K=7W zPeTr*(XR%VWl0d=(}xv=w>OT&TMZ`4um=>FsR9j@qBB#4#V#lU5QdG0rvOv2MS!ia z(rh(gflVM{oq&U7Cf|CS6w(DSBgefM_o*o|DWMUctu%^|)MltdNT%b8eG~|bX{8Ej z`=|#r0MMqCDW?u8cTfPRO+8~il<4`Xlu!q+e$U!?ZBFjx$J`uO)P4oGgd6=*RNWPn zMnXMn=D&cPLwWSCbnw@SX7KY};YG#0#6~BHx*XTfR;Z&<-1_V#H!4Y;SBCZJ?qk%v zM|W^!LmNjNK>VwpYU1sCo}1XW=T+?{XrM7G6^NXa&lNa099DkOPh+`Jaax|y;5{j{ zPYsK!{ZQEG^PDtM{pU4T;)jVM@bH5|@b$7sWqA*p_b>O&X=#w@9xw1tl zYAT%q%d)zw{U9VZ+Yu--rIeQ%zuIRit{B#Na~BZhVcEK?-ecezVzRY)VjCHcBiIl@Qg`m>yc4mobA8v zr9Sm&MnNW{Xuz3=p{vY;$lvKjfPRwOo#B2}xFWtd{h~Y~bPtGAIwm2xYcfbw=qaefHM*V|o?qZUm05?u)3^MyKb2f=X6$q7fyYXT?8|np z^H1~;vhy8|B8-C5~rYaRdt@U5|IiJhQS62*+-wv0@in=x)}uupo(ytD@-S5Gnm z2sM*=1~ZP8R5&X)uodItpI67CPhsf zoQk1uAjMsP?jo8X-_yHSbK%tATt1k)v0j7WsPF|^1GdvG{!v?yTl~E$hLo8>TS&WB zfFWoGD<4s@-<~UYny)lL^H9L^?N3MKvW`VVrzwfHk&5i@>_caY$hgvq9m**bQl82? zsF@u@sp<`RC&ZtFHu|g*&211Qj(}IQtY$ID=7x=AQV7WOpv?UJ@pr+Sn--9W59MB2 ztN1?R$=Ddk$F+W&YrYP#)nZ`LE>E?1=ZwAv!*%8~QG@tWXwoeBI$H@MVhWmIwi)DC z(Y_@3B{i!#5S~4&&oys{Gujr+L}S{sHB9q`u}1Aq8alT@T}+-8o-E-Hi|Hrn|)=BhA0^$Qmr%>@!p z*v~bWah79N%M;e4WZjyg2rb6imPtSd6wSMHOd!w%F65I=jfkMA=7kgiJaTbUq`1vf z867F==7Ab8%xctg;{Dfo2rx`F|3(p&T18tX~?abx+3Rs z9pGV=G_QJ5NzHS*UZ64q8r8UABu5^VgQs%UMnQA0n90LcVd7#5%Vw}OMRjKDSTbBX zvB{&^*tIjge-One!(yo1U0ci!2(Cn2G=qc9G?|AXxTne-?9;q`tV$Y+4OQVhwPrNZ zbR?RO4*s=PAv3PD@gt%UywP05FiaMTT!x9Bm5#L2QWd6=UTN4w)f;p*Fw zsMytlooY5p2_T>oQf#AT0vH;XJQ{Y&QoK+yB5Emq>8Z-pQYXl2;zW#D`IfXThsjjt zLFU!_b;Nbk(8H-TW92mL8j=*snw4U#CAqwIAq&MO%CaJ(%BcdlS~k@FRw;bC5D;yo z+g3JHN>zacHl`^}D^9>iO(U&Mv{QBiMa5zcX)(oE*eMDOQE^zWibA|p;Rb1Zt|@_2 z6k|1D#ny$2ffcqIP`ImNF-jw#q*d5x*lO5}Qu$-jftBN2RO{N8%cWGopbupD5hlp5 zhoBYfOEwUXQ(isrK<$?Kf7u4TTshj_#=bKfQO2u2{{SzhofKV5j8l!_^{OHGrtjvs z=~efSTBSd5`U}B29*tw+!L6;k>bHe5wlQ=0*P3|0;wG!&-AUoP#jUlg{FVSs#nDwS>1ch|+K78w@4g0VUtsvL;kRRiYot~lqQ6j6N*6JM z8emuC$Aj(~%f>nssCKx#gaiKo0u}ooq}u-gqOJ$_rt z;{|37`qyW1rv0x=www>V6xNrGd^P6l^Af-77bA+)(X_()CAu)-4%+f3gHk@0mMNrp z4~=xsD^!wFG3G=7t9o{vCeadLI5F%s(|k+Oj7@0x;f~W$cpl5`J|DP=hJ2ZSO7d!8 z74|(?V;zq=@h+dT-qK8T`D$$n-_5jK{{RDXU0;i|P?{-VIY~cC#qhnh=$p?&`R9Ja*6EluDy| zf%sL{_(Nv`<&=I^>Lju0RqkPCLtc_d;k!KhP56CbYbW}!e+ucL@a?22g@u1AyKihn zoYvj7qOx?R7iXUM=i&XfucR?Zf%$t5mGPg&4*|`hUrOs42oI%xjmK#pl*mRw?Oqx2 z$Kk?XSxYogf~T$rN|G*oKcMSUX!?Y6BNZybzS#I9@diC-N{JdwxBz1{@kfdDIW$d9 zXq`wKxUTcyr;a4hb!g#vFoce#s=_}(1FVP`bTtc(rm%b^uO_RfM!|vHxvjU5VAYUS zxxfaqCmB;$r;{YsZN!+(0AycBf_=qgO1zrcyEz82=RBGTDxZ|o)v_s#%}WwyfFy{K zT2@R+6;?QgD(#eCFs6z+eH}LyuSM|uSV3GqiEsC7(DWF-O0)-UqNY?<)5C=|m!gok zu862;kJ5lLN}SQQt$911mRoY5@le3YojEm5RN&UF#8}N{%rFR~Nk&M=JXKQ|6?RkB zsydnghGB&@mvyw{5m)5gb5v)6n>=QL9R8!E+g+;$jZS^5gz*o6ZSGadM!%JMT()v^ zfNHFkGO!?~Xt0xL@LfmY%qBC4hvi&Wt?=M0HX{8i>FIO_eE#qBtoghg(;i{{DoeXQ zO1|(Uk%P7q`BqGx47ukJAIiSHo8jM>5AHuoia&-ykNkU&%7D8*JbwY-K5+^Bs+`{q z@1H-pZ_2*mhv7U#XUbp7tf#_A2q<&w}LmQFXMRD38LiuRa~!K*Vfs%D+NxJ{8%j5#_JtT>yIj~ZwXJXB2<0k2Hd zJ{;X!sr}Or!ns{X!#6hNfsFC(OHth%n~Y|o--@?&Wh_Oqrl_<{o`#EzkV}C_n^CG7 zcwA9%u=Rc^>meQL9MW&5BII*ptxl8s)@r$_l1?dssTIjy^==!`cr}WW5${tZxugc* zWsr5GF_G_CaZXdcT!!>_rhu~>7~3G$#g+a>)~sZaWEmAAF+-7BAU1BT66p^EHO*=| zF-9Z`-?P03f@;*!EYXud98`82dsURN3_4b<(S*+xOx^isr9opO(Sx76SD?@r`@f|Y z+M=&vR*t%;hmLD7B7G?%;}lg1^_O-hG*uLK1~W`C8l1^Z-Yd#Ghzv)XX^7P2$27v@ z6aiSoX@)MfIg_n0$S5Y{K2f8}r}?y=XrMzps#6igFPbw?5`rix5Qqt=<+u3_T#doa zB+fP(xRTCp;w(##dcAKEC@QVfk3O#3N%B`uLk^|Ocz#NlMNPMuZN)s!1!E*{9ft_I z(d5*BYXXn93X3owoappd>!iSoS-gTxM zywxNZ9!V7$d{YeDshjgx$Yst;=F)k!7ELA%9D&YQLz7dg{5pm6o^Cym&rbrFmc+K%ow0$e=3hJ6*rhE3yfB5xSoyhYHur0 zoiq2>73>nO&_}&^r@_bF;zWi zd%TxDbHRTcEWAJAJ9u6O{@2sb?hk1Py?M5`t#nK@m zhHH4s<)_lKY?lmb&C0PuinXbl(6G0_f(fkq$KR7#(#-L(r-Y` z%b7HDRR!vv;+!v6)`W?wn^ z%J6C01(=^hyBNbqEnU{iiKWi~KNPwN0W~<+?u8AC<7pnZGf3sWC1}Qd5hUBpYz}Li z@I8Y=E}?CV2Tq2chj%S3nkTgYneaEjbmJB{SC(T|(Oe(&|vkLsk(z@{T3@{uT zrEjK~B)9~1TJ;SxPg~n7Mk70xvvn;AA(B!TsPwEQfk`Q$M-_JB&O5^Be$6x|_*k`S zeUm+^t%v#+u^JJCbzo~j38XkT#S-S0#YPxi>Fb5*1^TkHeXCi|;9~t~|_;A*_@Cg(G(AE`2twzcC@A;OfL{?s^^A7%$@8uT z39q1%^iK$NJ!|u~;m?bu@Yb~xZz3|l8vA3weke_6PK|@^+yzkwV=S4^HJ@<#%~+YZ zHBp8^pbYz`;MP>9B-V}3dd+dkppq{2Vk3pB&D7K5ZqxyK2{XlP>9Ou%Shlf}!n&O* z-{l7s(MMCFMTJ`LG-blq7o#Q!72IiK2~?QQpHG`%70^L;8a}nlTO2KDTh2!rrXzmb zhLWvZ1uNRIt?mdtYFY0|2BC$<-4V@YOu5ZZEac{(-ME@WT!>q4pjd;}tOf#+kNGd-n+oqVqW`H>t@MWar<~97P7x-gk zaHsc6`B!Hhq1~F$w~uJ%kRCg%{1dggM%xJdtIjp=+2tl@D-Y>kT7*(L6&u(>`N|3` z2j}mJKW9m!FSY~t3iEAe;CHgOF=t#{5XTN#?mloUL26xhirEFgj_XSrpba-KGg5t=iu#oD)|(xaAd@XFRs; z&MA^XCOg+%X{ALaXfKDMWvsySW=90)G*_axh2bZl{HUqsD38q^w0Wb}vHsuhNN>-r za{Duroql>sh9DG|ld5s$}z;UuYh*pJ^Vo zoC}%&b6P55=P#R;=bBZz9<@ixV@j|!9?Ut-1-no>(;n~;d8)okW35Ecu+KEqEG}{< zJLNT@ZSq1%tmudDaBEs9_dwO9h~_Daqm#`$?M;emTl~hR7ULAGK5`$lF(#Bs=BHQ` zQ_&H9C{ZQMtCu6a0yi~li zP0H0+IhczEDeDLs=}{Y{rklZ3Nn}I^r7xDg)kxn{4fOzv#ZQVp~Mu9o5LFW=(?;ks};ilYw24VzTIgB(sHt>JXgpPT^#Uh>JNh2 z%Im%hRb!bg`1~v7GfXs^a!1(Yn2Srvi2t&!@Y znUgY+uxj9%`fC5uR!{ZT;%Bh(>4v;M7~YQ;wkEaBC@n z=8+~Vka?xbUCmU~9OsfLe%mMajw?B2564QeZ)Y^WbxEblPcfryc5}(CcqLZ@=Bz~1 z=TXdTDr*o{?G=xFQ&AT&+v$1)x`K}_NzHeD8u(E?=?v({@UHLRmxL{KTX>78JPP_l zMeuf=rl9@Wlk}@mF>^da!ruegf)|JL73vxv!P_fD4Jr(eYV;UoirIF?fB{Zv%!92} zjQNb49}H>sNwp$UM{+B^_-&~ewEO7Wfo@a}Y*#7LrtpTKVVhovHUQdxoq71HMmIgI zyWgnM>OLjZxGqlvX*H$cOSSuEp_7!75=Z4+SBWn}#VP}mV^*sk57m$M$U@&MTak~# zysMu>%6FF&{i98UkGe7|BT9r@Ug@_T0hej~>RVf#`U|i;ti@`x+yzT$#~xImntO(* z=&r2=+_!i?bY~UjkEQI?-L_+Fxg1xfBQo7cNBp#pIIe2$75hxU4nfUBrkSK>(Fcq) z#nf~glmjeO5nfGm;pbS}&%x<2bHoNgZ^nSh3*Sb2fu+ z+kR#FYJEpc-1}H_n&0pRf*msU5&~lJ-wxK#kDOL?AL;K zTm>zPsU6boROdEUVe3og zfmn-nM|zQOeNB6a`Qq)-^Aw86moYJ`$#fg7R=L|CIHm+q$Rr#Zb}%ZMKa$3#S;6l? z0W4y4WNvaRz`i;70dH+(kt63B>0bI|1HEGSn@f*Yu#p)-Bv1$D{->wDmwh5I+Q`-P zKfn(c`LHFkzs#ItHNkvm@Pp}kgtMw(XPj0)!R=`2+WH}E1|p~ryB0AdA%`_qR0*0* z8&O$w)OI7KX6rs8wY6+BVAJ+;mc+5wJ6kxc=RuQP{rAKR7jzPuUJD=@Y;fUS0NXU?Ee7gsH?De>dU;MwRkFvp$ioQxU{rfjw_|pU{IpG z-rL8PJbv_kb-QKb>m8%_ z#Wx*k?I|OzdHfzfv&Z~=r{`7&k8IEUyeH>V>?hcK@O@6QX-<06QbW%*$sZfppZRW| zogneOpKFBt==Kv1YJJYlWa5;tHOHroZI4M*{xvFi%H00|%SHU@dl`o{KIcx+smZ2% zt5^%-%V+-pmV@)DSHw2VKKQKp8r)pS+4Ds)rm9hD5lk|zoYI*A??4tj+G(4LgLO5Z z0Mr&NvgVr{nD14Y@@ZB0rC=_JsPpQHmlVS{y&x{M^#f0w^HmyRbImi&KC}UAf4wMb zsE$eIrrpI+MB9ZqIjYM1)tE+T0_07BQ=?UM;8cp$C6<-x;!Y~4e|m6!C<4y$O)XG| z=9hf{4bEz`wsB36@vCRlRf1^&pbmFa@GXX-t(cWb_O1iOUj(4KS1B5}`d6|FT#R(2 zJD(l+v)~G!GZy&&0D#wx_@m%Vuz7_bKb3xu+}S~Lq)8gL;atYC@cU2H6|oou`%o7@ zEOpO@S9*It?wDiRxcki}dp04E@n5BWF!&z~=_4c|zJk05#@_-OHjtzQeiW=ym5-6j zmFh84Lp6F&iGCE^*t3xlslX?^K<@vukoQ*0yZ!csx|AHyXUxb%G~o?NMIl{{SVcWz zT0&{N$nR8;U6U+pPZ6zE^9=%GDwTzHTG%Nt1y}n=y)fK+(V*_jMTRODam_&293E;0 zxa-YGE0U%>(^{|`Kx-b=x5-+iwp%gwqQzLMWeUcS+~TuZ@8&$zO?i&=SS)HAqt7(Y zwR_f6UV)x!7QX|%77H7K-$hpk~YqS)(E8}{|2 zGko5A)Gd4OSl?_uwHsX%-jEvx{Cd+3`1PztxjwYRaD8ftHqH0FMsM++Yah=(wBJ19 zfHv1r&w96Qce}lFQAvu^v!4{KT6Q`Wn3bg7-nC9Upckz#+eI9xzGB#8P6YbZ54R6m zPwfGN%`Q;pG=Cat#b+Hvdekqd@z$M%%xe6;v}H$n!)-yi=9&GV!}zGMDI370dVj!g z7{{V`o9q)lEv|lC6UJ-Ah5H}ktiuPe_+u#R=ugx(yc~Ev|>bQF9 zvbrJ$m0KO^E!m|8yw>b@rE+lmQtzli;*Hfl(2A7()8)_FGr-bly4Uu#q-0uLoVL-x zJ?q8C%zaIL=i<)|TKKa>xzp}YGRUWEAK^WXd{5$U3S4+oUAeHhQl>XMN$xXWqU70x zYeU)1`^fyuHo-a*_K{jLtUtPh)-B|@nAW`KY-Cmq%YN|J*Da5hW`>`BVqh~}3^JwE zT;SIhryPpX)AbgJ<21~fb5PUABnrndv@C0;Nmg{KSC(Mp;-F?!a(dL{23oHyW-@rB zj$e9UIpG}CQCpc`YK)qk5Z!C0@NSn4?eZxjB-J4{8V7-{bqpUY;GatMj|hAmp6D(i zB>Rf?4~2gXEhe^(NkWytHS6$cx@LtIB2@$mw2T`*ZPq>veTPqHmLR-(SI_<~(oT`8 z?TBLyUupbC@h!Y|GOId)k6QT;#uo{y>qJHK4c$dmh~_=-_I1>z@*)gjcN{5g4+`PS#B=S_WCOI#9g zRn&hfG#DlWBpQ91-1vy82&%-r)f7C zj${7-Jz{Utq_lEpZ*r&eAN^`^R|8AIR$fk{s78N{LjhemwLu#O9cu$axDoh@-yJ27 z2D*EQOpSng6I-QomQr>(OT95Jp}mBTry{;(*W)(cA=EAU2<5M>*3bPk=c6w*^0&mB zZ?ODA)}iPL3r6p43A-TF&Y1?P%MNp1nc)(DX>A>9Xf+_i1lCND zo@xRfJmAnHa!Ess=Akp}2b#~fy*qZEwC9kpG!k4}%;XbK7XX4Y*0M~Sb3)u4&9sn6z#R~`q$cD6zxUsjLrZjZY$%hQpv3~`7kl_X0Dp%m5FZ1 z`bNXzGFWKj8NOgR=Df?qe-SS=YsL{fZO>3^k2kYCds)sXw&0WAzKacqO!BJNYh!BB z-cDJGKIXPv(pLQHig8m$)k_Z!#QS+8QawWCbe;bI zI+-;~wazXd^Q`FVbmFJ#uzdyfnRhf3Sic=EU-PL3x2TW#d6V<1C~;B-bLH__c=K`tiN+JifV(|3eLseR9sn^;3R`Db~FB!h3x9om2_=Y@g zn{|1-QGwd8+wo0csmQOaRPKE(;7^Y5U5MenK2)3xn)aO=UyD&yXxuWe7{z=o7u^JL z^si_5A>*lj*fjgePFL#@{T@s0T`lcfi^@nugl(Wq=TK#Xmc_ zub7v+q3_O34H zMwZctWg{Nd`X}Q50EKq<>mf*o%~ zGsm@YmpW|L&UYyosj;GWDY9oZ9tzcfIiRNon8MoNsq0%-cYuyfU~JlI)w_}2fI1*! zVUtB?TioGDYA7iOoW8Vq%j;bK0Nc;4A=D48VvwwKKWSfDLv+5i&YeK|(|+E4YLW{b z3As)&0!m(>r6K%2bx3WHx8gV=AvywuQiBn z3GYZ|KC}lZs``P+=9%{5$E{^~hMbIZKv?QDnKz8q#mjB6l==$A@cM5Ry{SX9OPK!v zvp^h6T;Y#31eX~nnyT_0#+kb&fGl~Z)|=;4K++ljlg*^_YAPrKK>4NJ!Kl}*Em#Y? z-i_Y$%1|f(CYzdCY3gbO6lRi&0D3km#8YkWRVmAwv6scpJJS8D-l%|07(Vo@O^c@Q z-lI2u^;kyDnsVE*rE=0G`$?vogFv)zr8rs|E*zvrW6dCtny@WBsmp2yYD8F$C$Cxf zQ8L@l8zh1!Czh`+NB}j~_yxb>V>g(8brN~Q{ozHfYZqha&kKB6(R>T>CeuQ{5=#a8 zZJtPv$gFx-s@z7APbxrnTeEJBy;Rr3lWUqLw{>-YsA4Y-SO5uQD%64~m$0sWyLOSM>L zY+z!#9c%W8j%#-EpDstOe93dCO=iuxO4W3gmAaaw%o*wW{{WBm9~4Z;vNqCsR=0w@ z4K4M;OClB|=bGZY9W+v1Aa(dIew4#~ zh0^)xbNuV$;a}W8Ky>}%u(i9!jjIgwpEaj@H<)g@>lA1I032H5ZLjgAYdrq|7&Xx? z&i9`ut*mGN02~#)3gp$JqJpdN3QAPJ&64)x6jD!pK9`*BU2J; zRx;<2F5l9KtFM?wc`KjRzFqkJZT3HkR`VVf;>eGw2ELDJAMNod z{v;#yuLk|8EdI~p9|_%bGDRvA^sdZ2wLIKRebdWL=U!>1`0P~EG`bqhf0Eyh0@@4?3MIcvK_<6aUnF;=XtOLnU<+WC%n zt$j03`H01Rb{?Lm&eWcwY1WwST@{_L%hH=?r{MIh%UeD=SG!J$=G3TB7QWQ0XniYX zZ8+&i*=wWO9Ny5%OHXQ*Ej_DAZSmTq5OLClNX^tUlGi<{%WI0#TY7M}trasTGORY$ zYAbQ+Q^RjpB7=^VqNYbVO)Y(@Rkh=#UrT-}L2rRts(KU7ahlbxN#eP=thqc_d8=B2 zPZfbJmPz8c>QcKqDbGWk7I^JW`z>u7Ja(oVOm?n+VRNIL%!=FEtwU^cS7NmGt8m&@ zv7(Wjsu4qOS$bBFhP4?qeQp_n#?w>U+YC_lAW9fiPY$IPjN@6SbLo!=_|_}iME&5- z2YT#n^>vv(_a3$Jlf`GqP(h~Y+RF$wdk4;#Csi9Br)71n}F!m;PP1YQ@QC2bWc-K z3x)1Qa;dMt-5h>(D(cX%`~Lu~1szJxwDEAhwarJXNB!!T`&uwQ_v=AtL?;KhsStx) z!fTO(*Y&G#>v8)2v=nqGKosEMcdRk3jB(PC>vRnr0F&O7N$*_xYm3~}i>)c|QfQ69 z=hPZJ#`LUZ))4onuBxZK12ufpP4i7>i}gL}!t@^W0dUA^H=3?4)c2{WrUx_oQ!WhPk}BK(DX z{o_A`vst`_Vj~{Zibsj;3^=B#F`C%bygzZK$iSh%tiMo34J#CxJaT-rR6~xGQY{?c znN2cMZKjp1(5@+xlgy?Sq^%IiH_^JI=|DKDu}P2JNlnS1o+?HzDQSVJcX3DppBd(& z%}Ey~fIANhF6!vD)Z3!mANFep!b_ajN8%O6g>nAvNhgsrWSSJxk=B5?6ab*&keVr` zfERTpO(hfn^`}!4tv@wjHxyAt04CphOjD_+si*-cqK?Lx3cQ-N3_Gf%N9L_dMaZGM z4myHb5c8nn#Z>_c$B zcO$)T_zT4M-U#s>zNup6b}-(6@WQRdXqQh-f_wK2(Ylz&8K!Qi zGiv0F;gyj6*5Hp?@gIxc3e1*SD8r=Y^j7 z9xguv984aE#54H2Q1jk4cSlo#4MQ)8uC5fRkmuJm?LQbk3GefDeI7o3^TwjQLd!^Y zxM<}4+o{0^t$wG3#zPSs#h;eraI?e7riW?v5?#nMlbZEk0QeqDnURVdaoUr>{s%X6 zrdN(D=r0U-cHc<1T%gDm>Z8P)v3tT^8IHo$GJ`nuu7X`ADTgR2w%5_80Aj8s>bFYK z9Q@3|yYQ`?#e+mE3sLxSVRIV=LAd)@p}`2aZbubzJu)>p#%ioSW9Cm5d>VNcLmVd_ z!n|w5e-ExSmw(;22hzVnMwtxAL&g|=D~j=d!uu^=Cn*w!KGcSp@Dj&8jF|+Z3hlfr z@mo~T8C1y3gWkO>#@_@U)X5?)2eo+)v*7vk$6!W4riwm`@IS}fYqUhTkSlwd_8kw$ zHd>ruq{?&eU!Nf*wQb17Nc66s!`~70JrfGEF$3PN#542~+U_fXlyGX&bgz^=AMy2* zVq88y8um{O{8_Tp(SLlTpL)zl^(eVLD~Qx(^88h+k5mG;bl(%jazGW#YLa=rDbz^l zKo#=2?7wq!>v9Ep?9ra%=XTFXNUDo-xLFMS(VB`^K3&1|OjRp+NilmV{&o5ED|?6O zjtiLS?dSghiAJmb(+cTQ>twD8>t`SSgIr`%<43yZmSOy>ZtmpAJ~RISF0qf&wV_=sVNs*r%DbA+$z_S{@3IFDcut5 zy5D0zQC*mKX&zoCKI1$^?-!nGv)+N8YnwOjd(%zpde^kJK3&A&Q?nQWihb~_4T8?KYlU~~cZ?FT} zy_^hvvpD%=uHXGH+5%_%q{zT*oGPnD}ZO*>n0#}%<{ZZXoS+Q-do zTSvuv^x%0@o})aB3U8C`SG>L{o?UCmVa!wzQ`Q=?Blf4NRdNdDb%LHC;;gK6@SIcR zCgc%AR-%YfB4VeEQ&AzY$sIe(;+~_5UA!8r8S@z0lzAqx+5mG~dVt9_owm8>9Zsrp z(4cKcClwo7k4nWbdK8!{^>)QNHW#`8HSCM$LN;?}JtL3vOb0&QrUe(d(kEl%3GX@~% zwRZju_?@WueKw@7K=-VV5BOoVE5d*V$*)k;J_g+0TL}^#zSZz`52r=#H};LcgB!^{ z_0;K~w6mTht{&^)W}_K9U}N+ZpD)4PRuB1Nx{!NN2k6d;t0t*zl0@Ny06_+|g`ASF2EIV}J@K}EE=a8} zWF*kXp{QwyzuWkxpMM_Z23H#1YIhkZMFS zDdZa3^3eAbq69va49!U&6uxthTGJ3Gpr!jd9>Rb!{?y`?ZyvP1$cM0``xJhZ0ZDJ3 zkGH*BHfc@!3eY02_KSL&U+pFpKlXZ>L#G2lBp=$1NA|I&K9|;^Z6&#+1OEWFJ?X<& z9<@!hr>KsZASQq{Q&%3fAk~zPwS;V?9jS&1SFxZDiakwFda{@CxA6+&*vg)?&$mdK z>p;=gT(lE{7z3K*d_~}U4O%z-+T{CEuBz(YYIWBX517*_A3A(Q_&8x{T_Vc;E9dVO zcp6TLiNQjB7nNT3CzJt)YdGyvK=QB5YGp~I0=Kr-T> zTC;3EdI0SFBh=SJ;#S6kKhm(gB7+D>NW392NgoF>M5Y&mvuXc38v9SB7`T3N+~-U09gL~4+>Uvw(%o=*s#4FK)u@olmwU*+5fF=93o{8RIo89<>9u382eS zR!qi6diEcJpA}zAnKWDZ3qa=x%z9Ugm&qcT4bg&eDz+I<1XqigV55qI(^K2aanr(7 zO+631D6by)E%A0OVHZQyWdh+;2qq`5v9Dwa)MCFS#o?!hpCr%N@R+)Is(kPvdW+Vk zlA-mk6Sm<%;)*JX9N}e*sQ`j7LGN4+zwn~RQ@(raP_RxpDmohOJj}KQJdMlO2E9xk zKBg90Jr5%rfv1U!O=?u|$ASi*r>lsAzCVOkliE)XK|;S;wc-6~tS(GboWkFwcM<9K z+Jr&lWNqE6^<2L&hAIlo{G&0;s$u5zJmFGhCm`ai#VaqZcQW{4cAu8BX7Jbq{I&0+ zz%p&MMqFg#wyd>PVTK{A9`8qV&cRexIj!5A@jxBy6QrZ$Y#&OLrr>fv8shEsc_A1% ztMPc9ld0p-&<3UMlMUjs$r`vmqPRa3d?vHi5zKL@W9?mpUL%fN@&T(cYVjYuMFYD& zSn-#^DeX**ksNyp@?B@Z_d0v9XxL-gzd&dE9r_iJD+B9XhlqX|X?nD7%8D4!G|z-& zv6|5IAc~&L#CQ5*<|$oq?_WfCtKe}P+62$gSCec101a<6=6~H12eo9)k!QnS95p>9 zluIKrk5gYqcr(NU#QHU^s;hxI2Ct58ygxJq?u?9jiu$|Y#uwrKm^yr>zDquK!=GJ| z#?@P1M{6{{B>w>J)hl^1j(Swr4f0L&s!+9lYxYmlx|_asH1fIX;-|a1{{TprpZR8k z^sK%A0O*P{{8X1ylW{LSlu=FSI*UVhNx8+{w><@K={J~`{O7E-$7!=-@-BJ`*wZd{ zt>MpEMS3_|%}Jvf(!5TcuQuFFbN$Nb9^kaG;Qs&|zsf4$+Vht=>$bY+Cf_7EJz8Jo z9edO(b4tgRR*x#V&^70kZjui2r~ZXrhi|MEcT(TSn(~PyE20vAh1CB56uSWrnrCF zdr(#QKW%d%;Vz;i{{X;EdQ>Ew&o>cH)YjbWv9Bc6yj^{K&HKU>``146PjbhS#L{JQogaw2b$P104df~JtP5Kw zzmqMNCa1H}Cb(c&5nacIyfcPetyEC74-5EH46?H072l+LA_%+yDmcV;aH=R7tFR{M z{p;y+$a6^XG1BFU91-V=-O{1K_o`O5-1M!@GT$sXuf4+3K0d6?3s@^&-Yg1=-V9ch zF<@7<2xxh-WI{SY6l!YZW!T&N?(Ib-&#UR60_s^klm zmKvENsn$A?QjS7-h*mmrPAYXuUoV44Asogn+(47XQD{dzR@KBjnxydctlcwM$j|b< zsirS#z2wt;niVrnVw%N@ddF6TG~|Y>*@rOzkAqEU`qkx!gH15-YJHZ1QaPPsEJVcD zn0U6-c`_2cYuEKlLnKYbaNZ=*{OdO$WQzIBbsMI7_&U6-@_z?w5ojJFjz=688Lzv3 z7VB0T#+3|-gOwStfV@Mdy`9OB40B%F`#*e7HVnFa^5C8ZO@3>Nha}oQ-i*29bL`gA ztt1EJQ=e+8{vEM$a}po;4OP)~g}k?1I5`|vn3o)bUU}M#=kS$? zf^-d$jFCVeoU#eDyN#`tDtI;PUkZLQPodn$ZF3Vbse4Dq{ol}Cce1v z{{V>L)h$v;+%RAd6(*?b1o`M`@!exJpB$MP>}pKV1^)oG8a~v0Yd_2)k1*6+4G*;+ zS_RSdtp5No(dHUCfYKLd)|GCJW%;IoG4-RE4PkYT^rGuM>nG1Xw4!o5(Qq}z#~jh; zipduwcclAEderI$z_?z9oU=xI3dQ?NQj4QTpl$;Z>?x)gTRkfwZjDGTz39{nuVWK- z6-3?-Er2GU0_kD73A>jPn-c%Zagp7X*I65%%-Fl!K#Tlm+<7O4mqs5-w#Sd z22w%e*1N^IL)M&pryPK21Lsc>{2NP)zcw`>H=v@vg_hnaPatvaMJo>HSzHdqKW`ROg$;*r7+YKIZa!$8>AIYD*l?gr2>FE zuL?uAn$YpZ$CIO#2k%mNZXJ;+tj~zoIEFaEpp(zH@@c!Nv`_$An?)5R2u>+7Xf%`n z)CP1MC;%_S6rng#^oo0?PJkPOfTi!{qt^{QcO9>soY-hnW+n<^xO zr7@csrxS{S&T~+acO#ZwwMIz^t8BR@nl1NMt3xJdF=LvDf^%A}X@F|GTMlbP$gx9Z zOK%=pr~55gw6rX0MD{INN5*SLAVogP#F30u(PBjhEVn2*#Z_m^8qvRl%Y>0wk3KWa z06E_T)n{zxk)_UQo3l`8I^Ons8;G@Mq(!TD`PdMzbJUlx;~^^{<$t zPf=4^i7lrRM8ya>1Rh0rIhI=tR34h2N0(-D!Zl;>SHll7Hr|cMAkr%EYrwt|d}}b6 z^sQb@^a&#x_v?FzuOL}rV93KDiu|_~gq|91GDqq-Ol3S=IiSSFCecsDCM$^UBPuzh z9dS=I!S|>pz~D0Cv@{)VeI8z=qV6j^(vh`my9;~_L0dRpYc_8PNTlEz z_0Q~|_Gyo!ZXb4lJYM6%*D({c6HpBv@;vZs+75-!E1HT;1rB~e`A`RqeVXng(S=JL z)y!iI39nlJ0EA{K0nB6as2jlXyA!ZtfIQ7_Rz)i!XX+~_Rq*wOs~ZN40)4C2rtl;@ zfS;vOe~0Its&PfGQf(hLYySWWZD;dL3Nwx|TfPa?+e*?Swml;_uV`Mw%E7QZ( z<&n!;7lGB>--DstjPxV<*44f7+CFZ|YlCZ|+EvQuzxAz)TgP*^Jrq~6>oj>D&h4F6 zp{?UjnE}rWTu<#$deN#>rz=ZS(bB<*sL$wF%F^oKX{rI{uj3+^EK(= zD>pQGxXNi$XXi|stjGRZx93&b@@MMg{x!L8;On_R<&z)6wXJ?1UCKYyx8+}J6Z6@~ z;uy&J=QP!}nffkk(ye|MUP#~STk@`-N%%!|B8NXj~TYmCAj63*FmNDHc1HE z89#-4&XMqGVnAhHeKB1nr^8i%VNd`)sn{Hk5z{;vVF0>h*01(!+b$zbpjWex1SD#5 zqcw}F_)sZ3K&_&Tn>>MphHslV70~ICnIjc%RM7-1aJ?!`GTX~q`uw6E@$=b~?E=-j zIK^&huz^{TC(T81SNw$Er)J1WjX;o?6D5qguP$|kOqMpB6EJ*bfq;W!yDdVL(2&FReYMZY$r!0A@ zuNPWerjcb5w3}+likf2ULWy@P;+&$MQxqyya)rfF#RYgZDo4cyF-pR@LgFxDAl4k3 za$MaASY=;|>7u``uiq=0`%_A=OQ;q7MR*6aWqD2MN0falqyETRKe85p zIo~MLgeMiy4JZ!Oqe>X*SpmfOhr>|omNG*s1|)HjUnKlq_)j*Ib2QOHc4s^a`>*>e z9jl-5e}HZLMW;&}#0wGE6+n;7=se3w@ya@$E9g&w{{R!-8Dp`#lh6W9a=#b;6kK>` zP?kvIA#zSYuR781<7k$@}1J_r0tU0N9I?qtM+ z10>hc)|Qamz@|Jg$7%q@5t=-+Tc6o2{n}6Lmj3NeC>Wkuqsuk7{gmF6e`PnNE>JLx zO-bdN-u}vON<*ZdN;yEn^34i{w?DF5(wqI1M`}4h#|UWHYh3B4(v$l%`cM}#b{Ybj z*BW8RN>QbsN&@Cc6roLPe`TLf(t)O*N&@Ck2Ar$KY7I2{P;~MKN&@C+LTSqxtqAn; zO*!mJ^ckR%fLASpz03P%5msvgir$J zlkuj}Ko89srcpo(NktR@R-TO+d4*<*-tg=@rXN}W^gRLw5UKXAH^=jqzw-Sn(sYOd zS%Z$%*83)Dm-<>qQ>4ou~n{QJOPBL+GTXpaPXo6qHZ`6V{uaY1G_M0+Yox zO)e?P9#2ZLL<1(Q!ERcg1-G?dffWS+EuFT;1lEIGEPPdCAjcGo8IzM)6iU;1ohaH^ zdQ;LI4mqh7CdWz;$dLiatCsfPFG^c|Ie^X$X{DnqS;c6GF?9t9oK+;Za=U;e8s53n zOv{>(K#*GCflLfo^w*hvD`!s9)+qjAnpJqZb;Jk;2jO1RBD_vgMJU6lHTiZk z13WC+=zgPu%xU7GexnG^X}G6RUSaH!nh!MNO(U8K6m+GENiAhrt=z*hoQ6}1C>6CD zvZF3&vyQD8)r*XeWB76LN-OU#Pt_PlKSh*OawggO$eIRsa& zd@cCI+GEG2YffI=kf|~1zgqn-D$e6kDs@@;rfZW*n{_E8*rc@Gz#RHiV^1nM>s0KY$N2Mp(N2P1ZWOKtz z$3SU+v(LS6{hp7r(aHu0)5+~m76cBJxAuB)x4`LAQI~09`{m=-zCY9ei^ZNHj1pCE zT}FEKHTK1vAHH4>diax6Kk-<2kpBSF{Ga*}uZZF=fq9>6!_M^*D&76Z_iBRJ{LNEc zpWUDLsvB?P`q$@@*!>|hR2(b=-m6O4nqRF-TLuwSo=@LNpIX8O_b=JWi4Xg<=_EgA zU-!*HZg9{39Z{F!k z;;#hWX;K`Cgdnf316K^Un;>E9itclDvk7D0r_jR`w%0gK{bfM;;hc+pWW#S0r`JQ z<~2(UG%?jnmq;#-2aBN_4z}LLbVF0ZE+m#lhm697mecngFEKNf@BgH;j1Uka~Q9eJ;TtF+dZmy z?6caZh;nM=NC=>_JM3dUDZ<2K?$)Zp4M?yLN|pvNu^yEoSk}0=9+e_nk4iv!AH|=A zuz0ITozfs?3VV02&(Dbd0lV?%#ucHiyKzR5A$xlmU^N_)}c)^u8R`BX=Dg05hF zgwgf`>074QdQyF#+JL!<_5`vLSdwd8wI@ovi7a-u?}ekko2Go zAFz)~Pq6z}LH03C`yV|h0|)y&W2GU}^PVez?39Mn+JHIJrw>YR_HgvBh}rv7e#z}X z9RC3Jcl#oW=vL3I6an~7DnZhtP-;{aiPRXTky7nGl$$65EYfDB@^eR%KoI15QdIs$ z9z_5_MNi~VAfN^y=DN=c+V7BYT-;Xt^sd{%@ciS70PmobL8iNZb!)@CK{>kBt|ja9 zSFr1sA7s&`=NT2_vqU73$>(v+1eCUBkVBfbAplZ@0)Q$DY|-{wx-bVpMn|;;8U9|{ zOw`i%;;Z+d2NOw?Mhzw?0l?;z4AWPssRv2`RgX11QR0YGbyyMOy;&oWU~y4O>^f$y z+gq6rO3+;-I^>D~$+O(cmaU6>a_Lqr^tD*e6?)#>M;&BQ1+|GPaw^(cF5YUy3_PL- zT83GO1PTxrqKOs^@lYF(K~Yd!+;CK$D!jJ}jzwyTHLVe3QVmhn0>-69R!u;mI5?^| zS8X(hngB>{3`Bxy{{Y$;&oxGAK5Pmifu*TrGD)vD6V7TVrDtL)<+hY$Jl4*Ypaziq zxu_t+x6_{Ck0ytP?&f={)2j*0NKmdF_G)rYvC50q~_ zA$=9Oond{0+OSIbOjDiShQ907ehe&{D#)8*lpmcKcCVGbHh6B!LD!>8b{p}B2~-D~ zvvO%Sd(%%-Nk9r@#aptA&YeaxR2+Xg>HINdCY^IoN@vzzvEPS3;%F|vxZmx81_Yn)3i0CIB3^7sUp2v0<89X$( z;koeUt)$*~e^Q%I)FEhYVmKj&H+zb$UtRo5_+er36HQ?1Ak?EDy17xwK8C(h@ehY} z9|-Dl>H3^49ExzRM+__S?9VExgPYSs^&GP`r;CD3>SxhK72u?O2vJ280H1hd^rZ5{ zfd2rTP!2QcN)FydR2-o$XtNp8jY#sy^iPF<7_Ph>cA9pk?Qx~ZKn&euucqv7t#wN% z?(HR6t>hV2Q=0g4RaXZiBD?Q}e->{11#~U%Bs1v_Kp~Ia`d8?=K6lG%RgceeY?peJ zkE!eDYYJz`Wz~$tHk{JQE+^$q!bD;D&N_~A7>S% z$trCWp+#Eq1vo+gphbIAwqo6a=DrZRluzP65K1~V^oRcd9X&+VI}9xh>m%?0sq*X8B+1OLlOJ^{DLzRsR6qug|2k zKSWPcP21;-=~=}7`TqdktL}e$AF!<8cSzswRuMM2r2*yt0Ntic-@8g6JU{!j6~kc= zQd^t!Cbe##TAu0tVe~at%;y>PsV^IAf$dVhAm};==QVgu?^%#FT2`tg(2inP+lus0 zhm(fats?&brt07L|JH;bV1ZwMZ>?pn2` zH=I|Fc)Bqrq{Gs_%PBrvGJ2R6u;5mVEwZ78JXE+MzU~?$=G(b`9Yn=fV(}Bl#b9QN z-ZfefA>h@xZ`peDTPoemT`tF>O7ZSHNFuD+ zOKLyX5%|{yZL2;oTZ);r0N=)cI)2n#mOITu#9C#tlt{eR$7~|DK=F5W>Sf*V|*NKbNJSXL5zy#lPG%Dm6o7a=W_r>ibUHDbb+~Ey=Wt^|yA9a+@ z^qf!2d*v3|?3v?apVq%eKV_T2sQ50;^PB)H^T)?_pJee>{9}L~zWx1+0h_>r<|nKY}%)8}hDfwZZ| zHTu8ePYv7nhf12-Xv6MO21R~-{?R`NCh)GKJ>|4TS8*c(fVtd!0r;faW#Varq+Q2)pzXFeVY^wGLMy> z)S@9*3>2P8#RZiFLYK>0Bm_Y-E&i#d>CiY2`!@wNTSCej#ceO_+!twdP)N z^)=S`^6%{zWdYzujM16ahxo*}T3* zTuU9%1Uk(TBgY(7*1J;<)$3UBzs^Q#&9MF9$>M=rxobR*q#Cj^ zh;vn-e=W{w*Ec|p4M9blY4&HmHfeb#vQ6tNU{uk|B-~H~e%M2t3XSA-F4$XIV`#VO53M<6CYi0eZsL3Pcj(VCeejwajWns#XT78b9Z_qTqGamE- z=GQjn-gzTDZ8)e(*GuBvJIK28RB+YKky(Kb+_0}m_t5mTe#K?D zk0PlMeTVxtTK%2~qd&qiUs&3%Y?B_9^3TB6@-NyxfF3_8`mal0GRZ!bx-%7Fzy`8> zW8keb#@bWb-$1OyVPwZ3*GjNuF+#(%n&z*Eh9V9VM@0-w=uesq_EbU7*m$Q-lE+cES>bVjNacOSe3kKM;Rd7d(@|&I*BVTxFwjO6vSiS+xdDvsVDa>q;LFm*XM?X&8^G-0Dfs3 z{{SAZ(cNl2z8Tls9V}%(`020C9RvPBK>D+v{CL;F@e|T0`@R~6t&-pHsYzrq8|y{! z$Vzp9;GcTy&#^OH)Sdi#A_$eQ4BM6XV*QVm?vzsI?=TgY>D2_lDoPHYckIB~pa*imCi;JxZw{87^8o0L?O`5N`IulJ~)UTOaABkB2V z1jL`Z)ly3>pLl*XwFIzVDR@{KbK8;#VUb_5!2DWim_K12pQR_*NB3)U?81}m!nHFo z1&GhxsIDxA)5UKaYKD7ksi7I1P5p@His$a^M?6<~dui8-z`C^MxUCQ#cdptMiMZ`v z58^~GtIRRb*V0}iw+jP(E9cE}5ZcAZAH`p5lCERrb5~|zEL&EBm7wt^&Q=-t`8Fx4ljN5%H~E&Si=?PNcNUxUIL z%-?dxL;nB)HToB(d=Jp=f92UY{{UvUVEAjJTJS9+n-ayAWDSu;{8=CwjSN8tsNPpf&LWCM!!KZ&q;J`kHf+%>}d2Gc~gvQ9_w;=7-X zw_?x2S0mCh{Hyca+E=R2u*zd-Hhx$9NKO7U)Bx$`ALn0xe!});{vU5~g004D;0=Cn z?H?81Ip=hT`Pb>M?17-JoAB<)0gp99SID#I&vh^ibf{k3bH!|%af*el!Odh@h}P$x zDrhaqtrKZair*DQ41(UREwxD$SgQ#g09IR5&S^!qJ5|9RdsBoY_Mi$e+YrY*isHT} zd^fZ4j*~P}#H__m4lB|YE-{KvvTw*EBhr9BBK|Y{Exq`E;whOTWruknf!dSd?~3kp zTg!by(o-Cfk-b6dU!fl#z6;xU%SE_!gc*X82o?F!;{N~&U;I4RCW=_uVBLd}#Q=Vg zd>{CMZ{r^iTU?}poTw5mdK&cff+O61b@`9*YvY8!4>h>o&Mjjh9%NbKz1PG)w#|*L zyM2n>&F?_$eTn2Ic_PZyw~&Q9z8-Y&|JH z%rVlnO}#YR(y$p{XB2&$dRCEwlgOkqJM6>KkF$!=@+k5t0iE`7N7;v^X!#U*6ak&~ zap_0dhoxxw6nPW@o%UhrP5UsdKO&RJ_Mi;kvr+b8T0dv@qwN0F0yBQfJt(a&v-?p& zNAtuvsUnXw1jSDPtZa3Ujt(jR0B82Aa6`CNp=p{d22i&4qwM0fg{U5s(*lh2qQGVO z9@L&kwP_gCccu`civdII{?zri_N!ZxrHg4J12k9-Zx30W>&16F{>f%rIKZxV!^$@f zJ5}EmU;UR)J5O4WI1P5^?Ke){c{P>>Mln_uxR@qKl za?4t4rhK{esn*R=dR17XC2UUI)Tv@X2DJ*RM~rh#X)zZ{ECR)BzE*Ko;)zTKsl_ku z$fv_8P**g`EJw7)!m0VcGYr#=g-Pb3+5_&O2c!JNQ&@iRjM6)N+zNVIG^_}qmLP{~ z^{W^tayr$7(xhMyHKlE#w18w#BON@+TLP{@rb#I~fvxLp3(AmYuPvyCP%%(h%%+A* z@+$q7k+MNuD%gi0fl<$5@i8h0#R4zsT0~$C*sFJXYC^!Esv2#}k}_+tvbMLH0P-Br zI4hW@!P*>w+OjXa%W!zbby~NGEOhAh0bD+<;wY{h?4Ts9c3uwEQKDp#vGu7n>*%fB zm=RuMABd!~l=)}!s`vgNyS{v6&|-8~{xfJ9kxoT(ce?A$<;QwtIz;!MGaA>^JSNvI zw2A=di`?CljMa;63gUC~6J6z}gCm3nb_xYeJ>HX}q4OkCzb-#$K2B-8Dr@}0k-4!g1&|LDQV`s1bSD`F}B$SeJ$_<5{^|^ zMh6x3e}^Sm?IXvauakx(kXn)SzaJ8UTxBSJgDD zJ%3D_P1Nny=FU~xRfbCaD()%R6_rX5uLlXEN_AyMT+u!<_{s1uQ21?mCZVPYFSHpB za5-pe%ho{E`ZqnK7q+rnT*R~6$S~2k$RfT)`0M*W-S{H%U3)@CpF@$iNg9lpN%r)w z%=2uLR2!>LWAv<_J5^GpS98ayq;;nQk(z0*jB!5R5{pDoO-fPyw`4v>WB#!# z*bGE=ug(t)c#8AEz9zHQES#j4?ihf6^5>CXq8<_PWv`BWH)E_?Fl4xl76bTOxUbhT ztWvEDH>vp!V}y8mjTa1b-I%LPn5fEdc&~KvOfMYjF=;*k@g>9Yix~!g17DpQA{Ei# z^(&vu=DoZ2&iM5uwy$CE+eDia-W~djq3Iv@YsT!9M`)5Pq?lg8lmw5?ptpQywRPkj<_Pd zT(4YIPd76E0C$o;x`N94PMF_lm%e;QlWxYkT?^tI7cMQe1U8ogf*4>L_>19x?G>u{ zUP$1+k*=-BA36Dl<6lwuXU6^<_?KX;lOkMWsNt0R*X#7tKO(6E+YAWE9S-F@f+?aA zUTtHl>mCeo$-dLSJP+w!g`sP<9wxU9Z6Fen_dAN|Pr1b5VrGZ~P|FZ1YUGx#g!53k z92&H9*u}hnVDVTNaDdHSMcQFabJv5Gtro&KUlT$5hwsIF{{Z4kPbX28vDDYmULsuE zlY`LnUJv6m33BJ&zRw}3le0c!HjUZK({M6raxqu@H=x}3n^uO-*>YL2Uu#mVX~&tL zF9#K)zoej+4YzVyX{P)rsy`>bRi*#Dz8eqC0O&CtEy`-Y3g^j z1$fWI50APZhMnV+P*ULIVs#br@QmxT=(%Z7TAs^yt-)xgbc(q5tU3H^Y=`}D{Hx=? z5dPE`*D}a7`$uIt0!OYwUyhz7yC!pmO)==YjL5h9@_@CAC`hrEAneyg@nbMIW&jWs2`*Cb^*1$Neu#8pb%&cMdg6?lvLA_=n+w&^f?XMtav;_CZJ%1ry5H6==#iac+?T4b8{ zh^-KU@=Z9&{A=~k;I4q0H->ch5plL9&*fjAAF`*zseD1=%X`l&bWo6a99QY@g!HK_ z>>^JupdAHxZRmF+TgzWVO!AY^)}mNVAp4Zzp-%q*!&#c7Wcf+yP6!8T)gB+1RB~vt z#yJ&WP*6Jxo-s()l1J22qXlz7iO_pgfN@MintcE$Oj7NoqZ9!4w~lC;B>=|5n)oO7 z?C{Q+qiK_0M}=~D75Aj&mfiO9abKGM0JpO1y1uH`<08#_cA#kZwDWdmA9zendMD>J?Mz~fe$-z)Pif;z5@Jgy!cn*Xi;WkrpVwtdEj$YN&3c60q;x^ z=QV}lFBIGOr%AKFwvaq?BDO)UlV&Q(Ao6JPYGd@EVx&YqO&(28iZMtCJeoY3n>3UG z7n4VmQqe#V`81wQPelMh3!(fsQbr^InX5zR&$2C_QMTY2y* z&)WFwSqUKmk37%@n_czhpnH?gHAK#Ed8Qd?0@=9trWvZInM=IT1*MZFwe)y=$ufFY z4Zc}`^{&T5w8E*y0CakEA{e)H;<*0+6<##gMFBf&tiQPyc0}i#R~2-hXx$;?lRz13 zZtc!Et8v*JWQx5EVB3?9X=8BFpK1WDEszKeSWP%Q0OFpkB}`W4jcP6<+Gqnl-q^Sc zioFht=427pwwFy=FVZMGG49Vi2g)HHUo$-yGCBvG{bSAVNoi@hw6GQd{_IxqzQ z=QIHXaTY$+A&9A~mbz??ILWOGZ55;^Al5_}ViMIgzL@jBTvtnNq9Ww7=B2le8+i}O zKovC42{p?A$2GeTgO=IBBZ|G@{YDg&?i|(qOIqJ1*wc!jGv7{v*@q)Ei#$s(85pWJ z%RKV#Q-bHc0Bc?XZb6K3SJOz6P>3ux`g z^H>ae(rcQ9x7k8Q%1^a$x~Gce)FoiKQJ&S5xAzXkRf|vuPBkd)GD8Zhb>gOFDyFd^ zu(-No!&beAg(Z}XsWb$1GN!+l>5l}{V$r-Z-O5HvS50e*IgS<(-(EbsDyUS z0+fyh$HJ1%e(672=``;I1;LaB9`z=v*Mnx*AQCQs^U4rFxt&%~SEK(ecp zTIH@a3GUdJa>V+Yjci+YCZIrSGBU!EGU9TIAh7@4Xy=yv@<5n&*S{F`or!Hu{ zPmq2-{06!3CFHv9g&R+yOvR*$Moqat(!5+txMvuz(wVK{zOLr@qRVwJiAd2|k z_JH^cao{VdbeAa1$Rq3~FPt$3k#%quGq2t?6hCTw; zd_jEbi)#sF2fJg6+VC%lA@P@lH2qoz3?_+LvDo*oj6dL{pAwqd%SP};tlzx5K7GJb z(MLdQ^%zf@3PbJpg=zw(SKhA5gwEqB8_*dqc<5H~bev^?W8g}w2-+!(jN}j}gtM#h){{ZX1 z3bAANR=!SaL+YcsEyoc{^sMV&^_8P>{-RpWwfpsqR)*b8WFNU-t!G{z^s3QLB1+A< zIk{?UU^Fz*RIZM0CHmFfs!kr)l@<;p%CC_^Z%<6nrYv z{x@qHmxc8y8VH`q$sEXW<;Xf8rFrx{Yv2C>V;DUD0EzmXpYzVZ*Rzx+@k-mCPHfV` z$)7TOX8oD`W$;e&NiMBhRnc?u-&-#14|?K!H{zT90#v)xZwySQJ3;a99=gGH*>}?)?z#T}X1`>nk@+vQOv3m_`%1&9 zq*{N70wa;P%sm>thHV&L6xBR6dLWqm+c$izU!Iqi*WMe{-osP1lTOqlY%~&rKM-ry zz88FP)jSn6aZb;7U`P$P$2hp2LEUT@-$gTqsH%IEN}PYGMuy-zO_Mb<~jQC^8S74#RuTdxfG9@ZU8Sf4Y>0|i9O z3g_hbA~d)!buTTy(T@I=k_R>EV{>OxpDYe6CR)`?v+3pit^5;UzDio(&9je^Dyui` zo#BNfMWX654|TJraP@ zZM%wa((OlTv{RZk@M>OlU7E)zpokX6*#`?#!82Qbs$xGHicF3@YB9xmmGP6Vz2mly z5)@y$bXs4;O?yOeZDs*ivvXQU<5!DjCCRrw`)i9dA=;#Nt_ZWStq*YUKkX-VX>+Go z>RubQxf9$ZM&t~)Cl&5L7Jd)u-Z9gqltMh>x&15QjY3IdwBHLAk{K3dBdEd6efRLA z$8h-9!5UrLHu)OeQbV8O0=nqpWky`_-1Dnp<615ueK<{5BUVhDbrJcj3#xVoKV!uMcXEf@;DZNjR#O1Xp zy*4~wVE+9lmbm-X>|gNDH{Pf6rC-_N_@1ZouTSgrf0*;WuUq*~6?=4S^HrZtM$QSZ zpyB zh~vFe{{Vy*-@-0Yqds8!xvtZ}p9?iF8aDgZFZ4<(_Qe0fi@^1j(QhXx+0D^U{qkH|ir*}e(*Z=`rm1s1lk ztfQ=jd9Kf@-lo1zb#8qcrf}W^_%Y#+16fCJrD;&xDgZYG88zHTX$`o-psM#; znm`We02PUM;&_HtUnaR+n>UP7It^7vHRDg>y;eR9EC)O#s=h;xHrCaas}#c}fd;L- za9pX|jMej8haSf^BPuzdR)y7*MotDrQxWq_fWTpcUKRUAd>wdWZ_UT*-FbA6bHT|sr0B6*`w7I^vx5yxq zv{&Zui1Zn>Elz7`P^nhqBA~IBS8|sTsW>&+=~gA;4()~YjdBou?rKi>0f^7dWv4alSbjuz$(JOAI5_A#yg95D>7k~ z*R_3<`z(IZ@!vrghV{FEmoWgS@*cFn`xF5Ec%~T2pHWoowK#604IGOio`f2_jkp{d zM2(`9siSQI5|eE^Z6+urZrV1}sGtT>PTNM>0BscQv?|a7Vv3X~qJod-G@4*OwJ}VJ zX2V$>!j6=L&^YT!Kn*9YH}R+7QM6D4R8)$&p$A%)HOp~87PR|q@`H-+G`IwI;Gass z(dPL-#o*)Sl`2V_W=*s$wQvzK%XjZoRCFm0&} zK2Xg7OJ@m@T@T$gjd9^{w=E{$l-EOS;bH`JtxIG}$V%~=0Oo8o#E2ZNT1$0O+g7@J z4-T}I^*G&prv_YAdIIM4pmzMKt#M>Nm+POig&J%B#)j)bUOEv_V7mDQk zL3avBL}VYOVZtuvCla?cqiNxrtIkO+^`Hu{YqwVFRuacF*86^<-@MO0wc6<31duY8 zO#T(s+xR{UU>a?z1ps-DpW#_&#^fhH)zoQ!4_}4|bMIYj+TM$yp%_l*E+Z26`eKSEm)WMF$K;daknZd2!v9D@rv+F>6Qv_O(o+&(&>03tE9jXVm_MonF zG(%1iW3^lRIi(PgI#4wtk&M%JRkuuMiioWPOpZPdD(07d+GYH6A;t*JRAGv1e9P}a zN8dlQw~SL((_jrIasVSW@9As_ucRbzLGE!O6g_ zR>d72fq3>a4sbJGzv10cZy_0Mn(??-DUsH?Eel$E76UvAv7W-oicPgkMb%@}ZCB)|(wo(-k+o2D&mHaN%kO@42i<&vW(Ry!Z2Wf`0+$Jxo*oK$CukrbLsW!>7e zVYUaF`9th2p-@0bsnU(B|%lkD;O3?9|(pA0@CUVJdt?zM|}%(1n*tA+Yk%pMwz z_5T1JY8P@6&vSJ15_;g1U##FOxna_KpOxeAsukPleG{Q+pV?msbsLOh&I+}KXa1+~ z73iKaw*JrfHRXTPSnJO%IE(NV@p;2evp%;bUggR++|Bq^n;*KhTKoNRt5zSuUokz8 zqmJY5Kh#T9Eq~S;zjOZp9`e--Vf(}MtfR5FQ&B(FrDoiJuWzksNB*rom6r4ru zuYLWFbz3bT$J)f#*Kt|I)*<;6vw zK5?!VN9!N_B^nOgoqobW?K=MejUxEZKtqr1y*+-n3;s3ug>9qws~MYBzPC?VE*XEV zO7q+4*&2t7?qYu6PR;#m_Bw3*byH~lS@`epgW;dXtv+FUt7)2MuoReY;+aX^+co*i z;{88S_&ehXv`tocH5+woLv;%RvM*}#o4<%UU7=;Sz0|b_9Bvb^Q}5QXZhU(^^5ScG zCQ^_!acOfxau~pA$4OVX19foNbah zI4W!Nx4_>LuC$BcCA7X&h)_ZltB<|#?YUV2y6dKLY?xu?T_Xu?Hx1ck4G^lympd_d4<(zRSis6+Co zZW$PNuV($0{wzzU>TluAN_Q!hop)al@k1;tvQ&x1(9NgK-<;}SW{vKTnCI6Fx|Sr2hc3C3{bVK0R99g@aj) zTW5hZe5Do|Ry*$tcz$gL+2fiQ{jKP(M6wOCLLnAVbsr0V~_+#UOk|YvK@|<9k(!PY! zH5Jrsww494!L4B@7j$JPrnzOY%+IGs5jjy+nmc6SfU18Lyi;x9Jr-S7^f%ejbMn{4 z9yk5Hpp3~Lg{H|Yz>pqqyIqRB-&3EJEfMyu?e&$a^cCfPKKSk7&kKWS*HPVGNOq;Y zzs$t{0801|#y_;r#19&?t7>g$3-BYi;=Z2!kH2OapJ$EyUee!RTnyVoaK!EZ0BVO& zj#J!z9r#w~#alIvV${YP=86XNuW!|RX_k>05}z8=Me%u zE0S}*hg>0{G?OeUNjL(ruXVE7Scg8;%a@Yzjt&;3wy}j2mKimPp^^3*tJWpl;MJIP zOL%#ZZZ)C?%z@I5y|YDvthe z0}OG^cUlLJ;kW=agEePb@P&@G8)h()AL13~8qa~X4GKn<-*d)2D?L$1yJ`Bg7sx(f zL90^O#_Cx**Mj(a##c5Hi03Q_J?qsxJ>uxE5kYWC_o|G9(q^=_rE^e#P}a(nx{o88 zr8TzFc;dEFxs#2I9}?(R{vp#Qww(h8QaKg*#rsx%&(Eb^TwYq+{JA6*U#)(bvTew& z6XI{f`)?U&v%@4ooT7&T+Xl+ zh!fFk=J$w2D-M7f0QDU^#oKMXw>z>pG|M}?#ML6Zv6-QrTRW8ExC<+WUZ)^ef8iP9 zamg9%O#pj$!!O#4#oh#+BGhF5(bIzfe8cl9=Dz;`_+#-SP56VLTWUId>mtaYvV+Jz zmHB;rVI9r6WCM0TI_|$`uZ;J93H(JJoy@Fsn}-Tio)G4NGxZE8b;zdetUm|%rq{%p zR5y0g2_um~$Thx48KBH=1tD5~DZQzH%nC3m*rde(H;Oo=#T#h=oKeLt-+DIC2r?+8 z*+m5-`P=(FA%tSBze=v>t#MrSN^&L%sJ7JZbDEBtkqr&o^rK}uj8=$|sw+=Vwh}nv zsw7-yv~0#}Mr)6}l5gqC8bgqPFnxIqc)0EE@UQ$-$gT*U> zdf!nI7E*Ik+iUG_KcLNI+%K0PZ1t$6nml#q+K?WXY2uq}WJfcCKDDoF@efOlx3q&G zSBg23Sp2wwHD=4hcXunuZfRUrHhgvBxb=Ja9@OM|isvk^HAhAfyC^>O*=XMm=bR7S zl25I6+GoQgf*j3+rE+X}1+Ry%Z(nq!n40P|j{r+HKXgg;BE2+OX*wKvkfRY;x|hTY zOB8RjDC5$gb|BOI2MveMa8*Zq){MG_g`vlmWGn@FPl>)LUf#PRIYst0!s;6R#o0UM zWA!uzk6+imGeK$|J5V^_V!ZoN_>HJ)(zowfRQej@Rx>kXl51AOPvGO+o?jo_sw>em)-|P z+)+UKQFB#JXUZwyT~6bbw_rcrtve5fm+}vu-H-eRzPQu%zlUIc_UR%%m=$hs9DFy^ zhs!F<^ie^iVI$=a_*S~Ui*Xh7QJBIIdRNx}0JG6(&V#t3ZJ%BlN6_$UmGT{BzSC+$Vx+YAQQ z6oFbriE8EpRm@3B>I7iOwCZ`kgXHxLR_k+Aeb)jl#$#DaauEXyP z@M_-BqXNFW{iOa4r;W5juW4}stJ$vR3ORKhYvc^D3>+1a4%SoD5nq^NuwPc2jkG^n z%JT@~>7?GHWH<)0E*mat{PG+c%O`W1^Qlt1JxYww(;)j&No+<{)qx*c^M8lF6cGGF zxVG8yq?iL0>i!#ueYFi$@Me~a@kaE4-*tY0mwycW{{S-h&q4Un2ig7>9CZ6cWA(2m zi-<*gAIDp7C*a|mul!75ANcin;(w_X^0~M1neOD@!zf>Wtv^b&Vf-ITt9|~o`wF#T z)jpN;li2!Ltw-FS^l5+Is!$EGG4`vMU-9by0PodA7&0Gf$~zU*(@(h-W=sCLzuv7h z`;mPsE>32D_vs)t^zLqt`<05vm-@H!t(`Rg0Hq)IKfU{=%`czDkhT&8y*wM^o;-;Fo=o}1x_pG>y%nDn3EZm80DASZ$hhJZndjy--E2FIPmpzQ5^LA8GTz-ztU9Mm zRxgy&F=r)-?#Cv*@5G)1*Rt}sUfgq9__truIHO#gbgGtaf<7F zJ>t8)Jy>PupZBE;>Gb~acUMai%$?+kD4%WE-S3? zm&EB;RJPOuG+K?b4>}XU$giF)rIy9SusM!Y`>Z=xKs-WqXvNfSAl2=_+(${hjXRTL z_9MVLhLQ2N;XTHcf3o7&QnfJ1ttAMjHz+0N(UE{&%ALGb0LoqeaLm3b6v^GP4C;r%N) z6JzqT%Q&dYHEo+QiizyFJXDCKYkeiSBRhwosT%GZf_IIkhqePF6;|TJ;GWebXh|vz zWg9hTP1o-<_lQfh_AEe>20wG@UtH;0 zrM9!DL4RoCOL^2VBe%7FdH8)cYSxhUnZla;8{h=@aM;9nll%S|U$RE5WG9 z>r$SEqbt_40=tZpQ54Qp5moF4Mcb()sSlV zXU3D*c!7(99IK4`iu&8(Pma@5vx!WAvBw10#D`D0z13l!(C=kGKfQYQfVKO-4(buK znMlq!^r}pju6>8%zY1A+=fjsa7jdkL@tg)3ugX7St88iAY)X1jR6RAKE(<4Ga1KE>-< z@<`J;1EB9#CMHr;bg0B(2Njuj8lz~%C?g8%-yf zN0=x9z*5wHaHR9TlnpXkDla?fN1ae;j#tGV0E<#rxwIlVx|JObaCZ0iz8$(TN*HZ8 z=Dne12fbu#{u{Q|;BCqlY;f4DoNcNtGCvA<c9W=WFdg@55K8 z?*#{fJJ)sK{{S0_LdPTFhpi;+QR&j#k`EPBpj?Ai^vzNm*n;E}MeV6vvh=OfxeXsY ze$oE`4Pn=OJ$p95enNVEYw~Bt`Y_S_MR{rl0=dWMU$?$L(@v@3i@33t*hPLye$ZY3 zn@RCi-NwQO^V{C2M~A~9fws3w+R}Aavy>3uEoNO?a7HjiRf2O96>7}1k7&@f#k++; zZcSL#ELP?{z;o&=&2$ZK$aP%tUZtd6M|o^B&P7yAqgLwtO}>u)&B|Ot!O@3oSKXho-|Z6*j&!KBtxiyymAD8) z9B1CB%=(2JITVC*Oo4-pgOGYu#BLQ}HCB*{H)5N+GytciF!ZI(G|&RCdUA}KYV@ap zfj|-k7^0Gj3O}A_gJ|zfhSB9bDL;jF_8t+Q@<6*YpKA5L0sIS-RYhiqepU0XvX1Qa zj|$N~AK&W}4=x5E`&X^_H}+n;)}0zy*k{yN*1rzE0$OSIu}LgT&~+8;T5pFmofZ+f zQalc)0=lW)>Lz?^Yx^5U(32u6zyU$jV!rnA*T+8!crqEIYpCvK zU*TSB;*XD?8l?D(Bf)78lWGr9U1vMo`OQX6OsH{EJR1q9jGJf~ED4D@HPC5r2jujw zW9=BNZ5L7{iW&ghctjI!1B%g7V~j~3Pimy6?Fo+ctEEIFPc69=0k3a**OnqSJt|nB zjg#i+Dv~^QY(_>ZmZjn-?NEW#(?DsRRv1ezM-`EGtznyK;<@Xa*)AI^pP1D4+8x#7 z3=_>T9dW2{lXh}xsXNYcs!6VgOz<4jFbt&TyFDY}xQqheDEFe^d5n5x-Rolpx3rG~ z&pU$Alb>qzrP1`wAZBJvipkafB57mOOZaw(H%bI!-n9f8K860iWF&jn zl=zF|J?+-zhvZ*lTo$F{E6qYe(n`nisbfg`I_u&#nPVQ?Ql$G=J%8~A>iC_qZCddy zGg^6M!&g&bcC#i4=A%*A=(Rm+S-~<&PvcyMv#jk#RW)l;yH!GWbgoAB>&|oOR2C~- zOw3CY)}e>@q~uh%5&|mzou_%7xS%XH!p(~Vis&uSM6|G4tV_tI%=q9^Hi}jzSwT3f zmhtD1D?ZUTHce~90<9!@7^&IlJQ4*iYBMD_%&pPnU6SUIFXKq9PFA3iRdY%rF2O*_ zr6dH+U(urz-o~f76wzht9|hj(5vxY0=Ju;?@Z(fQ$ClrfeP8f<;a#SsZEYl&E5&-& zr|{Rq@JtiSUBG%)sSQGG{O*_G{;IkE07hf@RXIEhs*m}0Z_2+!zu{Wwk`57nDv$mZ zPKhDL)cmNiYLuDz>!WD5I%cGXc$o+|;!;*~L0LaC=nUYSn}r+KzTL1VEOdMt0ND z0XW5NeVGDus)8lla45Sf$gW|Gj&W7m$~@$XxM0iUHEpawk2#|3wG?K-X$e2->CI~h zbNjLQ)`gX>UW>bZj%oWwKW2>YvO<65ic%XmFn@BDXKf)|ifW@5vQ{zmzbj6$H*v-@ z8B_Y#=~ux&jQ$lL3Vb@+j=g6D#@#^@Kh4s=HatURCEk&B5_Q{=UTgmV2@b1nzhoCu z2;<`!u9!^ZoGgCQkBz*7m4`|iILTVB+Tf750B>Ic^~4s&}a z=UUw5wx{iw`1{~4pYW1d+6XC$Q4TiHCsp4A=mVa zZ9)bO9LO7v$GEFC@f7LWT&L+0tfxH)7W93Zb4_*Zv%cdJCVmk&7fW19A{7{L11$mY)Vne@3Ly&hvS@P7JF zY*o7@#ELztz0m#qquf>NL>tHZwe!>1`bh3Ub^ib!jqf#9PLlo=X7FOwbI0$hO%%q{ zT)fHVqNo9XI?6i_sVGub+}2nbnZN6$ZA7_>K013=L@G_l7(B~FQ?MHLu`G8jj=M>& zZJCQnj{gAsQ&(=9c>8DyKjn!v%)zBQf=7S;DAmO~na)-;yd7$?%XA%g5Q7!fSm~gi zM-|Ix*Xg6*GDtr9fnI^8$daz{(*W0HG;z+MV#`F1_U1cP7%aK33H__JCh(nxhxSKw zm9ASZjg0Ld{d)QbPq{_atcsj4EOTEoe%qRacNQ8Clz-*oU*s#>%i^6=&Bfv+N}h)| z;P2W;Q?pgKzbkhSLb8nUUG#Ez2jV*Jkw%ez-6e?a8LyM{7)vma*H>e6CA$WSMvc9V zeWIe$(DCVJ)Ti#%N3?jS;ZCij!19RW*R=Eeaq_@dnca9+CTBK`(KzdEIKdUu_&4I_ zuiBU-o&HZgNjdY?JZZzZgS zT?}pLMMvgt;fLZY+Y z>-Lw!H2erFdB2~Dy;nBAuj>oNjvVOt8731;m!!0a4+vkcO zCQwgx;)65dpWA2lZ*PQtKRU*fY)6LmoX(pU<+qca$zL_er{HBz9)`bdzBv3dvG}Xt zJ!`_6glf)E&1mFut^qh7TKs46CV_R~PY`MvHR>4dZ02Z~FzbSFXc5dchH^^tRV1=J zjApxiH%?2)&lw)n%Z&wNbBcm)dDYIE21pn+M25F-rFVLUlY)4~b6T#L(SlS^7cA&^ zscow1*K#gW+GLT(sLx9KtKqh_2Z?myty}2trYwpOZ~i*@JK$%*%~#?MqAn$kt#nw} zG_uG!ay={UYYPZ8n+R;Jlq@i)PzQf{Y-pD~X*lMXPBTVoY%p$Vgl9DBLD1BeL{_6C ztxS4T8FN4o5mA-mry`hFgH{H=!&`{$JaJ=bC;FSiuzhRj{{RwtN$&>sWqk$AJgI##BHGTuO}*!p15L(uXMg}y7BN51!`>@~_T5UsGjc_GhlF(EZK9pqa}W(XkaZSu z>_r}cRPr6GiXdE4P02M#k}67CD@2UOVv}t+(o+z^w9+bVxu%t*1SC>ag=xDgKsQrM zP(?6BD)U-c+G)W<$N&p?^&%44^`Ck;OOg&qjj&5 z{{U(4g3({t&vyhMu>|ld>)kg~j{e*NK_pg3i+nK_v8PQ8s2DPkGg~G}_=n?93(KNv z6Gq5X1L<5<)E!9cUvYlZ9|c;%=H_^zJ917yuZ^{hE=xJ&jnsmt6cy0GwwT8tAo2}* zFN5{`1&!N^^O<5XxgxJ=cdczGAmW)Py@rnJ(;$P9S(;X-f8gzAJx@%PqLMZQg*`=c z-W=Eb#RyuuIiyC6oP(O9J0GFHv!BOHPl&!Ah8d;;`ZWs5PdTr2j%~w(Uy)x9ynTJ} z)5P#<7LqW7c=He*F`E4{_(kz9$Kn@PDLCc9qX0vu3&Nb5*y6SwRfm)s3k5nrnc{grfQi=I*ANW+x}{txU^z z7otMg;;FQ`HCS#PO&LD51tISzCkCzQaut^%vsl)SjyEyQD-7%HCS`{stt@x{9kfCT)N{KX(V_B#znQE%eGt(`l-S2qM16t#NYpM`9+RfTg3y)K^OfhVJ)++zZ>xpo@u z)}mA_)grFyo+xTij7l0h2sYRq@oa>&>; z!#>>eP&N7@o<(NdY8%+%or{bmBWPV@b*+yG>-KtHxo`b3c& z#$z?o_;bVyV64{@B6c~XY?1Rv?N_VKHoak`Go6u)ve$|5IIm6ppfA7SBlwwd_H*Wl z$7EsJ292v}l5Q3kKlkL+mpV?V zsq$e&VCWAwq$)(R7Yf=0ysjh#}Zh!C5s2jt&m?!-P=l=Z~0Ox!`s2x7lBwwMg zB)ybAp*ycab6&sV-woeQrjTvsLcE>PkzOx!3SCIOFmQ8SFnS!72l;~)O5$8*taMtZ zaD?Wr?BlUYN%Boc=JlsECz@}Q*0QOrPKtUS&F~M#zErYkw=#UK%v+6njMMpOO?+LZ z-_4}oMRN-jc-S0@`ZqxMk!9jtB^71cc8UY8c|P^?c#Jo^>O}h7CNXkyOy|5^svE1> zIp7-N?oR32w)OLiiGH<$KYulM;qIez&BfGGlSf(b*6pD29hzW)B%5cCpPcq!KwVbbn zNckB4^+Tp1}nNj}$EpyVk zFBDteHkG2qVdlpz#@+c!&bjcV^{%THiM~lLnm;$sDOUIc!56H2| z7@q$CEpYdfT|uWT<<>7cMnJ&y!&g_~Xz$_GFQK?uC;KTNxK6(l0f;s?TQQ%8la^y$}9v+5*|lZx_@s2h1&E123R9DKsNzYTc* z08r5WMY(BUJz{f^MPAmQ!`?NFpDk?fo3~7wAy#nF>Sc+;(ypCKT3q0>k&|Cd{=mNw zPlLQ;eV{zPTo-I6gC~sl74sIS;cZL9?9CQuxAg19ZTukd@$j$2Z4UZI@)d3ZG4>|A zVKp_O^R+2To3xSpapF6{_In*lF_6Fpug?$oDDT1L&^6sJ$NFqIvDC+xajYsMEqHn z(xa0(UVTM7;cvoiLr?KWt)gAa_F1jpXZ!}e>qhunqUl(9gI>%#ze<}JYJB%;@c#f& z@jU)Un_)G}XOag4@vpAF3jYAXHZ*-tOt98GZLKHoz>ruZgCp9i+ha?%WwMPS9*8kq z_l5OMUq3+IA^1Kozd7gz(6RkjsktTlPTlQNQqQ=7l@%xYK6&K|Jg=^Mmv? z+J4X8B>w<}SK^(%`8>N#MSPbBp>EU}$ol)mI&>GdsAWLgTO&0-k!-MAqJe+~Gg*H! z;wT3rIW=n8b}j`3tqX2GQHpy-wmh0_zq>`xtz4aVz@&Or(*rP$O%)+bW}AxKz-}o5 z;-5*1KqV$AaYiaYZrVb$48*^GJvO=B^{#dI*iXF<26(QL^39`TSelFlQH^BcXqno0JH{jxjz_^B_3HX& zryijIRv_e8%r^HAZzkm=5nhkr?--C)IUfh7CWKMYd{+2hZQ{Ka;Y2~C+Hu8xUi^Ld zRdeAjV&$ZOq+yN@EA{V9)YAF@2?vVtkJ>ZfCAY+F26wiFeDI|3Iqy_bKN_#CF_Jn~ zW=u_9tMNDCuA$&t9>`!Ww3|4b}YT&Hl+fH+0QbOnw#1>K0y8w-sF19gccKhBVFI z^y`6#H5E|;lT%vU7#kysjT1EE4-~-e{5Rvs>;id*8*8#Z9Dd6V*iUR%hj~VjsREGB z?_Kz%scJ6xor0dg*CBPT-CVIRBQZXvsD<@3wP^s(RJM95}k1s>6WAEeJD14h?k0So!aXl`d|CK;x}u zPju1)QeB+62BK93Okm zJini%BJ5T%n)|c%8P}~I%I`>)XrY-`Bg|}WuZiq!g!hpqGBcB2(cx`B>>7WY36dF4 z{PR0%x$I}jbM#vAw7V(O%+xJoi}>>**NJ}6nx>N+RuO4eizCS;dyzqEx z&GlIBFK#88+#X@i2Cv-wHqkXrKwsM0powwvIj$D&Y?Y3!wJFYg&m5ooWYtpRRZtK7 zRacXrP)$N~-3lfM?*+T`0e}=;Xtr?2y>2a?I~8y$N-3R2^s(El-?IAoq*mvJ{v!Cl z!IMiSjp7@qJkGvh^FN()YqviyPimP##RVh3m-dDDpDLXAvRr@H1**UBy}l$qf8wc` zkF*P1VA{QTtD1epb`9njgNg=pzwo?1AsmT3O(LIo7Povi@fXIL;B~t3bde8VC2P<1 zokg{l^I8~T_C>{QcyaBmbmH?sU)@Co7Ilw^J|~XmNLR$O%e3P@QjluTgZ?M@%SOCo zWvrvh{{Zv%3bOuHjju-|H<4>s;t-oo?-;Mk@lJ znS};!q4a*6`%P;<5WlpoHJukqlTY$n7nYD=gICQrt()1;`)B#rtoTpLPY&E#qIqFF zon=^)|J%kzODds9r2K8;QP8U%0ll|`Ys-RIFnSdG!P-x~a*`uD#r-{1rJWyIPKX*#mc8rvoU#l3h6E~i zpYQ;2{lTMT`QxD!B2{*nf;(m)9DF=fkUO4>9OCxuckz<=M#}OonkBffb!%z~6z=&D z1ci}3fDBWU?18!TD}pMmz2l=IqaF}7>B5rAm<<4moM=6MHV03 zrxhI-W4qra2(r8mLLjd$O8*3MuTH%jF~fci#_!-?2G65}eB^Ti*FG&0P2v%XoQ&cVY(PI_S}_ftBxw8g$)GB5=e z_uG=QCfRrb9)LKzR$=Y_3j|P~qBdV&rIWfIC*F@g5sVCe;;U@oN~sLP-lauq+E5Eg z3`tGq;P=CA3DK~Mm#EG5X}mHz$~}#cEGzb);;VaN#`#!pD#>F$GO~6j`5LP^=(Ye? z)yY0E(aYI9?~B@7o2cFA0YuFs!Cpt@yI_-1Yl5p^PJfwWfAP;lm5-So=uAY+RPR5M zX)5@z(AmgUBE4_lx(Pr_(iJt=hL)VfHJ5FQw}Jlbuugc6xjVCpX17>=n5=88bTn#v z_GdqLTy)IUnQmI%w-ts#?);2+!VoNaSLWU=cfu&KKi}wl(EI|`HPajKx}0hDI(c8~ zf}@j%YpC77O`9-+%j<4?g0CzpaZDDnoF3{MNO(Bq>;|`zUxfc2FJb;|eaFi!bi~H$ z3YHsp^L2`_P(`-^uX3`F49e&#HJE*FQIkEGK6O0np@mBMBEc>jA-0YrpQGArFlsT~ z_HRYEC(;%9Rv|HmX~vx1)n(H3?UY^e*IVD! z&h2$B2Ul?>NH}O@-`hYN|KrTY_M9)$SEtO~Bk{(jmG!3%cnO0p=7 zGThJ*`GdM)RK7V10tG&AudlO0Jzt&kh6j>g`_wFZJ?&x& z>mQV2@aOm|Knq#%xGc+Ya+iI0NZ;K~-hn~IF#ZmH<=#R_6MsEWX0ujG2@5zGY)Da< z2z<1B*Wi~*_~d(83g5-g$i?wS-@8Oe#;8|j0Cz^sZ)GR9@g{o27&hDJN zI`L=TsxY{-Wyp0V`Jnr)`qdrT(VO{oS2?KTxvyT^w*e1qWcV_2u`ESh~{=E zcI{XXH96?R`G$WaR*Hs=gzcLsdKS*{IiSTO(y#5@`gNLpBnjuS|GN)gA9DTGVnLKP z9lEXQW7u~wG3pEMGqU8S*EQLy9}W6!Z{0sg;;#$%tU{YQt&p$P`IEZcLY(JSk5N?P za*(+m4<2S^-N#ICe!+zIm#u4k#eFJ{zmD;pBCCG+SMu;iy3|HDOK-4x!yM@pjJBa7 zPEZ=+Xm{`F^X95Ahd}VmRZd^%!>oWutxC|PnEocg-V*80)8{1^3dcb0+|8zZd$$A* zuI)Hjd8BapmXM9RU3h!7?Fnr8MODqM z7f9Zvw@qO3tx(+>-9C2Iwx!9%i<2_PsZ$wlxenCrgHRwNO*p6E~_r20{T z>I=;nLy1cMH}bV7uWLy{4Nu0rb#8gg9+y^6-`e7}>COa)ta%e0ZAm{8*IKIV)VjSPPeRZ-#TYhQVec~34U*ou1_tQn9+p>G zg2D8@A&Lo1e$F4<_bsv#mb?8u6o8oHbMS)3v;1q<=BYEa{X=Y>6&&)O*SAKRVjiJ+ESRL6XvoTc{K))O>cZbr z)5&K0T+^1R2P9?tP#{h4s$6uIO)fRBea7Y7RV!M-{4_HF2t76!PM#ufkEK1h6^3VJ zwzX-Ts5DibT|ivlxIEGq&bVf{TWew``;0fg7B{EEq6O3B&kGBFZK;>KU2NQ0^XHSb zpsCO-AKUfv=HlT3!+^*sNvB_@JU>zXpL*x)8Zup`k|in$7Rs!jpTX`Lk5T-pdVOZl z^Lb*JuQe3LSjZ+>nWyt-%}D+!L|2yFXZR zx?Ta?&KG$SG>v`M1A0m+*`LStHp@S(y1_=g*qqd$JPK-p6TqYAc?z1 zW4lTRxuV^ch_+o!819nF{^OY;OO3Ou%cBAq)Txuhx~b)&+Y}T3_tv&)uXAcc{+q4( z7ph-Dra2F#W1s#`NO1Daxk;!DeR5Le;=fp@Q})q-uiWzGrx)62uXD1l_WLlKplHox zcVcIviK_63Qon-vWch>2IipHn@QEz`9|^+RL@5PQtNBwnhWt2)o_J>+D;-8r4DE6% zDke)C_@ZSfr@?i<{Wz}6iZd)gnZEBtH>=LRf;v<@WwMIRI)F8X7a$85#l=B${; z+y^BZM7f7sNj0W$J5ToMw=D;YD3W=u?ON(#q^bFTWf%Cj=+qj13ov4z75k9ty3bg5 z>b7}ehh43kMJ>3h6-ybJyGkqXqFA$L+tf27 z{%WUkUZrf}Q~UK^T%seNPA1)G{0Ky?M6vc!CQiyV(9nFcN&mYasgh8q6i8yK89W_< zm3}aoZ}uRFoz|k=78)fiBtI>-1fMea#^*by^CSKv<2%xCgOaen$~!rDpzuit-!7f_ zDi0iQBs-Xp+yj`J3_nyYKfY%OsN-t~?uG|x^`NYGO8=saLQmB31M63ef8n#XMer^* z!aC6pnDQ;I0)KiIQddy&^YN$Y&h=G8$sQj$CfrVmP3Ph3@R?b{Tlqc<=%uiH9DF?~ z4xY2^m?zq;`i8hq7jJ-p%`=cuRYvSn^^k%xccSE`k zLe+COcC8P5KHS-=1w=3y;(POexVj47-?A;ol@7jS-Ps_B^aT_E!a0?>{MLOZVth@@nRtED*SS`?Sev zW7Q(e!}>J=wtTHo@vvqG++@ zA4z3}vA)XLP7ma6@)x`k&$IDW$j`uY=GxbF9|vVTzgdf2Ilcgl)+FRYiZnC=PKsPv zPCQAe@2AT&8kJT%C~g@`guQ|c8cz}D|mv@D+j-ZsQziNs1g$s zr0F9L$L|HVPquWOd~2hJKM?(Um|f%OF1P`E70_tZON5rJ$xjYx%%aUvfDF^Pr)+`m%NDw`X}Hd zuIVpvp$7$TWZO@I@QTPVBHOem{WkAhHEN(wV`^KVgq2W_5jA?9IocV`&6cR2hka-*y-Nhh1S4p>?4=)&@QEV{uWUNmP>=~ntnKJRtO84PTzG9mrM6dp;Xr4 zT}J`UkI6`P7~`y@pb)JednLRwBAt~HJXmo?VN;D46pSyB=5UdXRzm21_ld!`hMt^#z$z@Oppdi zsS7cjLb{YjG`YL)FZlzz3te5_DOoHD+}^iXQl!hej;>hOC|+0S3rY5oiRSP4Rb=(y zvO6bd4z@*9oq3gEbeI*+Jy;69GD0@v=`-XrNz4aSF|e`(k#0$mg?bUt4s9Kdr6fqV z;FFm{!I`(NAV-S-VDpq^KjUo+Q=8FhX>awEqc=ywqcr`I9TXalEW&YI&fn)^BV>68 z`5!;)nF{?`;mrFwNbY=LO{_}^Q$rYWYn-^$0Ez=A%F)LR*JHz?%#EmJvwsUq%vxsS zT@8^2c#2G{warQK8S@ZtXoIJ%x&EAhN21vW5G`$sFS~bzS>(rCr9HRrIpz-M0BD)r zAawh!?FBj?AXB-vXQFsma?2f>+kP$Zjf^vHSgoDEX^r+mrmMjg+s+w$hfqYk4~(FU zw##C(j*XVLN!`9&}fU`vQb1_N?BitStV_pF#>>CV=7)*n&b?<=Na6w zHS_X2?VJy^G*K$3cHLarx%Sh=iJwul|W80vpHLN2W0`8*M%KO1%f#5 zbleNgc3QgBUW%ymZmhoH!_7N>vxKX{SX~A`g)4Cw<--r(^DT51aKE<_!{lMv_>B-N zU=2-&{3IM={(1#$b95cs()K!7vZtst-q%uF0z9daN5EhOggp;On(F5)8#K>&tB{$V z<$^zm%dw1e*z$kjY%9PmM(S>HNcTa?iZ@PXzKYyragp{Zc5hVfW8o**G_@shT3;Q+ zcy61Y{>Y9_Lw3OF;8t5&yLslS=$C*`udNyn`t-m!O~twk)FK202ao&TGv!a8?*XR> z5g$t#dVfznrEJ7X-`%BkeVZviaTd*O6=TGUJH$?=W4EKD83dNIw&pM+lq#rxV6(^3 zm5KjTnv~OlvQ6lKUc)-=c<|sq5->f+HEJI%-5kXst{!2>erTr9lZ`TBOqk7+zEARS zWeRZ#y((!D#0`x?YZrU?e}cEDs;5yg!TiLz1y=mK2M!C=VY?U?Mm%!R@(xRqUxhj3 z1ntFfHI`BHd-`F8*|RUBvJqJ5t}J#DF;$~z&6nnqpd}U>qUbhhv^X75uwbdzZ!gI{ z0jgEB`KlpC_S_`J2<6rn15!)Rpyf$VBurkocYTm8u6&PB22C;~nCC03mVP;JaRB}1 z4RNK1^eR9s)i*i&7yM8hirKy^UOsKCaWa?FmEITKE<1rWCNb42{&a)J=#ipyf(mVJ zRCK(D=G2;roJWtBw<*Hn8w+~yCFax;T~lN%b0e@YyjzH<|V~@jFwnz!^jy| zj|J%?PwyeVOp7V2`V{xLd`hPM31bm7_Thne&;Bd7Oc zlIXN^=+fejH~_C^Y0({YIPu<%X~|^5#jrHj6$N%tB zF;bRs%q{{ccZm~$s(8VZUk&4o`c+9OvK^@G7G*rjbc)?Opy-XZ#-umvsr++v`wU#E zCaKfh2K3T=d=agg|NE70JqDUt?K|+g;p=K@TVb6j{Go-Jn2C6hLzUdn`l9z@ZLax) zyL4ogTk9>*rQsWw@9L7URGW-T4^?xoz0CGMyC0~WLCN24T5pd}H>}FEWT+DkT5!w_ zN_f`xjNoC2qb!}FD=ZIt#IwBjQ<};$fVsyX)VmlxgX-}d4KHw}akXitGr0IoR^gZL zjL35+V^cN%USyMXe1kvU(E1?_&9fGS1ZO5?kqq-c5-B}{%4;1xBtds^WXpXYTdrNN zk8XMDUTI19k0b@&v~7u9L}z!L4!p#L>V1aSxkD)lz}A@IKa!*%{``L=KgFp3eycRu zgHithHj};wQwu0xJ`LE{Za0=^Y-7I^t{*wNXr=y zU^K1omnW1SU+H1&qCI4bPP{YaGryl5(3}~xmL?FWFX+Ty=A{=|AJndVRA5n9q-*i@ z$fk$E3C#cf!`EO$u()g>v?BWg4g?7!Dre0JuZy>)Dm)kg%q-EQNNo^&6Cws&uE;Pp zUJ-!s8J4#!K;)Z5UUhQ-bh{FHj00hS7(NKp9d7}AV7$RN=wnk9@cxEkFe&5#e0fjs z*VmmPZ6cj~wETuWP%pvBL5VzHW#HI82|2F+{S2H>bFtiYCweVb^@jSiN%U39F`++x zJ+klUn{pbGfsmQP)qUPhBq^B9^Kt;eF4tyqIBUX~xb?EuJiJ)Q2-zHQ)?u z0G?OgVB9jvRL3Gkr|L34tC%CT=a1mc@0vlUu1o448LNU`b#LU8dLXt7#uKQq0q-(= z9~sM=mC9o{KZGK$Z9#For450kf~WhStF}>iXZvSBnl%mF&6&A-LDtSD|rFJ_Ho^0R_!tA0|q!B9BlEGXI&^}RR%DSFdz!^!zAzjYNM3ZD#R@^uh3)T z>bhDxc)j;|tKSsOIwC<+=Tp(ae-8Eu72YD*0z<&#+XtKbaTvqa{xuKitx@-`a-SRo zKie+Zh(}&}*D5zB1-h=DXL;YcNfZ4?cQRt~9*?_bM+xpJIr-fu9R(!g=|Lr8f3AxU zMKCKv&TWD1cHsFRo|Tb=IULwj-VcEt3TgHBS@#6_TwEhGY!W%LdKT|K3Ma|-CztCX zoVkczQTKUseM;_GeZJj+`e{L`3xlmc{9)(120I};K?8^k*r0*0I34Iw01k#Pw|mOm zcS9O3Vmju-EWQsmzofv^U$R?L60YbH+8I#71;Mpi-NgSkL<#r9mDhlll3TNT0jNtcTOGpkkRv z%iw#LR=AVAocS~F6rayKDnPqmIj$sqLGbd!O=)Fox8uI}e~Fg9=FZpi-1KZf0Z*|I z8pQPH*8uvXpn8y%(RIGcF+;j%73Stx~P#a_~&Y zjYu*gcaS{z_y}gy$pXf$Mfix7crjPxQD+N!uc~$9$wJVwbjROPH0v~rz_OT!C`rP{ zLhYjdckBnw%ZWr2Wg+*ovFz3=90Ni(kL!*L(gwf3D+w!@X$=nr&#;qT>m%pwl1Epz z7?qqQo+Zwki<93{m8|3;UdfHsv3-^p^Z^4$u=$VVE|J~ge60d_?j1HKcQ3Z#`-bk( z%8a3NdouR8Vg1oqL{GsWRRaHD-?-85YRdp~8VM;CJ9|@6a z<)WG1pOP1e7X!ObnV)EpyS$?4U z7!&?9ieHYnyylc&y^^*SSEM^`mX53;6~8<<0|IQW7_QP=WU){t$Aw$KMbmU*wz?4A zWKXvkfgJ|uy_*KYa)T}|1dRK+x`uCD6P?_pqGXhOCMlQHqAqvrN6NW8*@y&h2m$fk zDOAhCJPEvTiBCZ{UuJ~P8P;(Fx~jVBbFK1|ga-v+7tmx|-00rq-kqGM)Ugl=l|9(|No`+ zqhNMd;a+Zb{mh3{;G2TGdigh-_4^&S6=-Qi_I26sO?W*v*wwvB`t2LJ>YM3xh%H~k zivAKdgZ=2+?c`ZkC;!TuGE5_@b|K+(hA-lT3tPId;E!|`r^(UbTM8&`&!tfPBJ!<~ z{*a={q*&JB2e>t~T>7&RJDzKOkZn1Z$>0%&t~KC8FaA1;-~1C6cp!pE{L#iLKu>XS z0jz0GqTZT);cEcJDOUtOzwkE~NXcU^FKdMD@(Wy=KYo0;&=PQxca>cs$M0*Y%J#4& zHdz0-*rC@s58q=&{Zn<%!_>R!ElVC^TgC#naN5Cm)teo3SIPP0p=_|Q>n=)X| z3_-T#78>u+z{^c3A5Oem{Y1*lU0Gz8{f|VJ4nY}Ev&JmfpYP&ZIi~n$cdhp@(F70F zag=z?G$wXyPjBK>DueZrBXNae9aT+s5{LVUTA62cOQ{ca46O*!k=|y7po%xp?bFkp zo&uht?~ruwn~ySOf6oMGQJPEAMg?GPC5@@^<+u3O*WUImVFpgL$#H4-={RGHQJOWJFL8y)76U5y*NCxZAJ zawYFo>n<(Ei-PjH~5T8+}x+wbctz9sG|%3 z?R$alFDO%#-^0u@k+Y)jetB72M1E(uz#rL(nr;VrQCe4QT<_pzGMncox0^vvFQkGy z6Spc{%Y2hG#9rR3YFI7XN8a`oQN$^wGG`^)(v~}r%#{iU7dBz;X6(-4Kp(QJKoP-A zW-oopJ5$a-T>Gx106FR@H$1nf?s6qpd~olE!Yv-&OjBtu={fFW$h!P}qL9M^<@e-( z`4`fjuQO`iq;076Np6U@JqaIV`1xYF)wjL}Ib-$$r3U{%;;>+FBYUE}}WwW1TwdSoSm~y`v6$Fso*vyXt#~ORW>vR=~fbHmYJH zu?2HG%sNiZl>$*;D&mu}LwCF~xnBNB-6OI4_(Py=B4sH%N=^*_NuXXke=~8fBdTKj zZD~Qq&tPLN@Lrz&au@x~hpUAYFY&7yQ5vt#u0CH+#KG9qvm3O7PNRg601n~(YJQ)F zbMaf8Rzs!XqH^dTfU`Z$_>l>_<_GFn9b{Kb&8sEiNpSZp|VdKA7|reFbM#d zuHbWs+|w6SN|&$K4Crl~91`vDHymu-{Eaj#wyOE_qufPa37tN#6#h}1dB^b@SH1ErQnI18PHkbv&rZ3YOs) z3Et!-PkVPJKaa1aRZI95u+9mQc`u0=33@dg&AR9$S9d!tGh=}%%T^GwEK~*95;$Y&_Y&2=6*r6wh+7+7S_R~7Pv&^`UK`t|GBIWQ>KUc< z{#yQry*BC|a>BZ*W5vRXU&igGV^j?umQ6UE{73R|ds%*ZTkZ*=sBkvPm6QHvyc9Y( zRHliPy1C0|5V>!T_Eey}-{S;d9nc3(#eCduVOAc$S`1$@@F`tj`bU!Ub{*f~6c5KR z$sh6#5au8*qJCK@nDbREu+NwS{YO&ldgh1v>RHI)qFo*fbtFt(04>p+j>wX{VC^(( z`(Kwm)y>G~V^rN^`%c_^{+G4lkz{fFAz{@&8N!0G28&!fhEQ9s{1@jkB5#YNcv;W` zcz2naViyX8T?Fsmk0;V%!L&q{#X#1{(YfEJQkv6)tz8GxN9BwXEOd_Md13|Mnb7v; zFdNdkDvoiJ!-a2$(Z`VM`mrLFs>8owyxpTUzArD#2UB&o`=>P<-0uTCC-1;ZA-N(Q zr-DbB1XHRnXvx2qnx6ipME!k&N~N}Kxnm^>m^(k>cgnX4-Ku>)QHpGWiVM<87w)*Y z%z2-zAy<>mI43qmuO8`hngWrnOn3JPT76k=>IXd zw$-EKR9svRGUEJhcIQ-3qC33Be#uj)b*TObFtfWY3 zG*Ql(WM2k;PU{=7`)If~`#$`K{1M}cGv)HGkrdoxy%N4(dgvN0PvI2=#fmlh_&gQ< zc?seoIOfg#+GmVqk%?c?&m~dx2IET6_vKe}P7h+aE_wM?rS5>Psv#Ar$41JmZ&_+P zqqi;G30`Hz5+Oj!-McM1LO{6(5y^FhS4=fh=6gZza&6P>z?at`Dl%byilq!uArR)_ z+QrFT!?~u^VOet_==+HffVGhq8_&2l)#`Uu_t8&&zFyc6^`TNbBKXN>$Z|itVv8_$Q;<97T{}K8t6ke*Yo&GRH9BoYY+2A&`*YRUYRX4no$VsE4GD8 zhuuB2XG=TMW_Cy<6m=w*P{rmW4A_24!-_mz(8|O4@$qTL@UXXQ3xkyv{o%eOUV#(Q zf;T|qzAug1+D3Md@6=fdFuFD#(N0~`jGYpKY>B_>#xHw%2ciPM%QGI9Zs%++Z8hnx zDObQw8GT|~Xsxg+M}+S-u<#k6Da;|gFflYPsEael(ot#sVT&l*ho#V|ZIle@pS+&`N|S%fb- zc?+g{mcWq0pP=|MZmdkC%?ZXB5Ye%3}-?H8RqM}z^~KR%Ep&VNVic@3r~O> zW2S+t?roSSm(K7;30)O)`W1~HZwEWC*XtPjW9!?Uv>$CAPWw7d{(kFlv;sn!8;Mj{ zf+C?c*f~LA$3pryS>KCHMe!(obf=aR7C`x(L%Somrmdd)@8u$}(-lx2@ugtTXt~tb?vt~V@^uX%nl^Cbg<|e0wp^QzY3zlq#%n~?Dyo3R z^juH43QF^~+z+;?R#kDm%KV8a=8kOX4-(xK9Z|%8*>wfRpaRVXy)S>HDO7k~KZu+D z#-tkqq}}_eU(MWj1E-L@rEF@^c0}^++9=|wy8>ko&EQ(>5eYz1f|Khslm{90%veTI z%kJgeY(iNK-Snf6lYa+}SOA&aNNe$-7R2>Ve*<}u(JCF9){pgW<{M8<4BZR_Ed!vx zr-zp`xX(wldng9d~Oc zLbQ%{$G-?cl=W@ytsnF$*#Z)hdGBc`&>q?EOyQ3q8@VIsN8eNMZ+NRNx-MZ@FB!w| z=rZ#S#xGK_U&1A^Z+s;N?eaS`u99&PQ6h|h*$`8+h_HYytEPXCd_JR>YC z)KhR@yi?#qXhV**!y$^k6XN!eTp!4&%31x%pDSQyUw@S9wadd~u5?$f1DfIE8erwc z-x9a6;r1Nc?ky;~9ptK+Hj1HBS<%g>f~LsV$^S@gWARN3*mh8<$&4-`Mez9@J7$Xn zwXG8a(A?t!@bzYJZ`qDqtkS5g6G(P+yyj#!bkgo}Q*J_Nn=RN2x^`MX@<-4{^CT6% zo)_$?FRfibb9b6;cuz)Y?>3XZ*m?Bt%ZxGW(bFuLR-e+VcZs^gm5LX@T@2$y?;cGT z%7olB`?I^OaE+AqkGhAmz33U-Nz4-kY7+IVW{Mc3Qd`T_-C&9ugF}7kzUmmc zGVGw~U1@&V0!Ic=k_Y07>?*t6CKil2PHM{omIzWGuYJ-GrfX%xD0fn@VX{&lDBkec z;!rx9_6IxdS9;NY6pCFatPhhbba771ADMl@rf8h|{6pCvLjg3l_-NLIMU@W1JouhP zo{(Bdc&VMXb+RQv>;Lf4^>!I~hy7V~UA*mXFB0RpFf^~KD)4dTil^d@@}I?8vR!np zFNIxIb%VuAeMtkAAq5ED2tj=8n~j|qPidN;?QvLt>Qe5GIOOGCYHNj+^#-JeOUG0* z9a>bTVkx8+gqV9@AhCsXBJJO?QHb0y=wy_rLRTHHH<2 zFxB6$Rb%}M9GM0x)^ za(kw6$2+&m@9Jq(Qc@U?9DK?+)Tpny*Mis<1%(9*Oz4;!JNWpB?fx2Mw1r73twjPX z#=1mBOoJffQ@W>S*Oj0thZXZ8SR~>|n|5ZSNj5yw-dW_s)Ol<}d~nN@GVWyu<58Mu z8#Ug!buT)9;IIS!z9HnH?Dj}ICi_xOgr=QFMm%e=tz6P1*FNe}l@N`ORvPE1t(_1J zXaLIF$cl0Bh3K$`Xr{P9RHVO3df0Any8q0@v(?I%fpx;1=Y!(FQG7 znU_!f;iGcwzJ}1#bkRoRJvSp33Vhg4PG`6I^E3Yt^7Xa)Y|RF-Da|KI{;3>?@}|eY zPN7{kS>LG~r?0bI%02lCr&&NLPZ3IVN)81COZBgRnVT##+3%CTjtRo?&H^n)(N~a& zs04l)^pE6ta~sFo@pT!S6#`#^Uits}Jt5L*c7=I;c(wm$syX{(7ODAJJDsTLx%fX4 zOJH(Ku8jG9u}FX978Gj`;pu1piJv&)(;EKbv~r*?C4qvH!LBKe`vs0x7?uORO$5(^ z=PvC=u;=6%f&938Td&$5c>+4&YXxsK**X-R2AwI}F-fEQp6g-B%YzqAa&Vtb#PK3Q z7fJ!ToRkG`BZ;kU{^g8zu~=sHS2Yv4le$CK2jQ;7Qd_oIbUy2l)2#WKayRh?ab^l~ zr@S)6@%yh=cCRC5_f6z+l^l`>X!Ss&?;A}VF(>DrQtr1@rQYVr@F_I&73o^EYaWXC z6M&Bs5BCfwt5(#|NZv6bgBIW)kIKK^Tp|B5;>Dk|zjIygPq&o)hsM1$AE{qo)DE|8 z(t7m!9grSQoZBJ~gj|<@6KV3fAGu$F|GB z?R~{B-;9C>h5nH=4+h6ZzbV$b@B@(Qvda}#si}GB!K@?0XAJBw~2h4|nuEN1rmLA;w;ToOJaL`ESE6yw?Y z!uo5)9`ftr{6iEvP#fm;kK}e;IUK7mKax!}-bICCAJQ}YBgt9|?EuzX)L$=VW{qkl z-Yx1@<2C$~n(ytz%B!7~om5R>#$7~ZsfXg6Ur?V!9Lx#lP9?TA7teH^1WD^OjV-aQ z$8r7e*fwUJ?e~d~@-r(>VEzrKHmMG(SbqC}hm(u;DTJEI(C#S>mvE!36SJi&p`I#q z;i`1`wEQXn8FA8fngEv?<;n>s#0iP;1{k(=(KdZ~IA}eqQe2URZguLZ7-L#7$im1a z$+p~H2(*0TdxM$~|w}V+Hm81ZwBO?FnXGdKQ|Q zhAOke^@lBk(K8Jn8WM2U#br9;e{;>xfRwi18Bmpr;npM209y5- z7l;lg-@ZMbj@Lpu&pUN z&=d#*_enVRv)UmZUm(^3%`|h(*8A_FyzzAD zn7dbYYi1~_#aZ(#a*nK3Llh;hE}Mq2EuG%A7DWsLEZ?QRRjlJ2KxgL)LoN~fg@e&( zQEw}7%bW%+Za74H0k2geSUru+YGWk8FHH+u1)F9jk(cZnmx9qc@Wvdp_=S`5kc^eL z{M?_J`l?;dUwDEC<}dU(n7s+e4Y+5Qn|PAz|RYKgfJx>Iq~&SKF+S0X;W6CvgzhJvb_^~MDS!_@wG(zRLAC4?& z|I1OY#cOi}(fa99;Zts&&GQgGl1_NJ)+C*Me^4&AU=x?he-9eieF00p(7Lm$;v!;x zh_L%y_6yL7WmCyTEn9o|c=zO66e)&wn;qH0ABd4~&z5UX&%&>8)w!w(7_nB%p?MjId#IrG@nV0jI zN*4kI&2#-o9`styBo`WT`Lc{hjSiTpfwab)#>?Y-eF#k-GXoUuiux4eFQYgyA{1d%YgDrM_l12 z`7v~~I{b8vc1@1^s-DQ?>nj0-=9afO*Z1cx1+iCtc<(4TaeZBYY_g36551(R?u8_Y z$}$3;0zUv|t$h&`s5rHtSSw`GJsj)OkEs4ds!KoodUPsrv0`q=rL#sf=c#fmeO;S{5VA@TNaO%f$_E# zRhs`S55_iLZ!dAPBjG^UwbXg^zFnuI&#_k&{J*3Y9# z+g)5gt#@Qer0az+*VRXOD=b3}vf$n@(y*M`+AjtG+7`i03hIaMfqs2aBEu1rM&MTM z1zabO&h^1cZ+iHapFDD)nNG$o^Rn5YiCy=!eq?_&D5IcUH%zfDw=Lm#U-^Esa4B;) zt=_fpmDU3hHkMz!6GzZcU6nHa%XDSkXp2|DOrtW=*M!VitN)QOB~^!rc*sO+;*?5) zuc=$p1eXh0+$`#PrJc5S#@c6|R)fus%=6x%gP0r3g zS{Xy}h|}@LZ>f*^F2Ov60F9gPjwU|GeFB2?(qM7v85g64DRMeTrv0HE^8r`dl95R$$qboPi$WqzldNm{F(UTRA1e9mW-va#d?{mZ;&3772)m|dA!yaa78+OOw^dZ=%xe#VZi|)LMJ@Vie<455JSyye{T9M-9`%GkwF1$>-L&gv|>j z-_T{2GGRXyEN`#d?J1kvDT>qVomT}+n!`)Ne0c_09W`|G&8o*MgyF&0NRo+lxwkgs z^rkRVHIWSc1LWL2-G*Nk3wf;hvRiUT<~JjqWej684`(yN+3=-8m72yjXTGHkG1xe!(yB9)i-coxYR})1L2lyWbo74(KiyX zsOzLqkBxSmhBGD1*z_Msw*Z$_@~a}ZspB?T7 z>_7uI_l0J*J!zmZ=L>d8|2TXrbuGYX0~ky?1Uv;^5OSB`KX`5dZ!_KGipQoSFR<}k z>;6NX`Se^&$jSB>$jb+d>ZAY(1$nVF?hNQmn#ag42gSjsJtV;awX-!u2z?vuh#lVX z%ri`09N{9rkBEmarLwTRJ|vVbfzQ_!z*!->5_7Qm77F}n?*cV0tTisNOxgK{a+t%R z<iyh!iuY2;ou8x+i)&+{ z1~?+T#>*^P`+Qyf{T{5oYw!hx)68t;ABiu-0De3F)megC#MQS68^U%ky$MByrH1^B zDP<8>{hLNYOWO{bgGT=QZVJ)T-ydy|^=n?LM*ae2IgB&x>N;;fiLvA`bCtI5KZ%&N zlrOoR(#yDVzm&feJkQEhe9mb2P(zWdjOeVKbW5szZM@w!`y#vG`lRb#@E4Pt(^PR_ z!^@fU)s78qEG!S#8|@xE^}uwq#;ICC98#;E(3xG9DX;VW@a@=8rq9^UK_2gG8+v<4 zwOp{JY=6OPh7FPeI%?~^(O9YX!I<2i0^QQj{EbH2$z}A4d?PTtjsuR&brnU4>*k;q z{0S=KR=W5pMF42$uy`|Bh)_6eXhJoQ^`@HK80ii@{*(8_U~@s(saMLACjV8$Qou-;Zid%Sm=O4Adb{T)~{DYmM; z^?JxNGT(d+@e3z57-=i_vRhD4|uqxQh;j}X4 zw@-=(0yl#cX-m5sNI(US%#;K%4l_ zzuMS)czwYZs)1i4>zxRcgK*E~M(_W^GQFe0UC#cleD*uLL%fHHT5C_`@+bAYWtc3N zGfCEGYFt44gAN*6GyPvgsEsr3Ke03(W7lzf@yuEya4j_FzC3Lh>TD4g{TDur`p?+a zR_3G^sxPCFBXhIBnt-yYc;nCD8iP&da~bqBg_X{J8&>N|@?O7{e0TEs#|%B$yuX3g zn0a7G?o87{=e;~xacGI&*1s6}DIbkTu{blT6xiNZbrCr=ZIb0OY8?Bc?(D%1+KP=C zL!qNvpAXDwjaIGm8-^=7g-^5UU6Mf5gNo7HB5Lo|U9NbdRm>8mi~HA#|Bs~ej%NFD zzqk&xMvdCLD79;Z+SS&kl#-fhZDQ2kQhQ77qNu&a-h0=mE%u1L6Eh@ye)*o?pB(3K zlJ|+{dG5Wht6bzqoH5)oiyPbvzXGR0#D2`4#a=$A+EE5%i(F3ZZze?Y%ug9^jMm4~ zTJ@LqO{;UziH6m68ERECCk~Cw2Mu?w2CURk_hRjuowTtZKsP?v*2)JjIG)hj%~8Ep zwo}y-WxbfH$I2p}LN4*RohT2tOwoXJgO3#G-0nnd|&*P?(yml%I1t*WZ_s8^eH z=hy*K{Hiet$|W&3s(q|XPB#=x%}0}OdFXvpmw(WaYC~wFW?S{85?8QTaXLkz-cHo z!!L$tc?s_>O|ubXk#a9^Ls?S}3KVwC9(%>utzLvSrl*UvOx&$Wf>2i`Qq=-NK=4=GOo`+$4hEDD^03`=6*VaKPoSabUV_Uwo;;}~P8F$pV&fttAI}YG39G6otYFMA93+khS z5JA`M`F5|CyRWCS>-TGs)&$GcGGLY0rf!@|kNop~U--#l(wNu84meAFyCr_ECVrYU z?5nT-ePD@+?V@1Cl@aEU-ui*sk{m@xeejj55d-AJPr?_o&yl z%O9Kwdw-XGbbKPm(anFA9y=e##b%p*NT{YLx-4(g>TANWFW0tSe3S&LH`eWU}8kFWbdBnxF}fU+;c zS0Y4c;5`vNq;gMAxFKOsySX8BoR9G*-wx#IUI#m>E^f`fJ!j>nS} z9g{GlYUbon@B2=Sr=RR}T8L+bxO5II6teLawEV|=)lAFeNb^m=ctWZFa<$j^lr1 z-eX*_YI7!Y#Qn9n2k|@n_hB}RpFe_tYqt+*E*oDKQ6HyXmJ}#e-S6v!yDwY&u0XWZ zgIU&lW$hS=YX_YGcUsym*Nt!q4WFBu1bN<)t1x?P9txI=yGs8un%KQN*lIIDa$WbP z9P{Q$`B3OOvwV;&Af&=XFf3Zf4iNozH7!6Mu2G zFL#+Bt?C4uK!^Ix#iFpnsu{)F7djxPLsc6wR~(P+q=WG;v$9^=X4NU_^|;y!?i^vR zu|8xQcy3NY5misQwOa*qMQPz?TbjUvzaAiIMep!%EH_tcWvtZlR$>&%=#w9kV=Byq zKDQ5huPl=DZszX+F7gZU52Vw7)XKRplR9___35BNeIB03W{|+Zk&jiYJQJ3_895QZ zNwOzfHsUBspzKo|$9)*yjr%P{5p9y+yr50048NnU?$~$z)O_LHowyMK+F9QQxJ%wM_zVWJOZ@Luh@GN9>do0QP#aYrrjQQ`zXwpX`*(dr9|0$af_u z)3$KW+K4i@gLHnNoex=brw!%__3?$Ykl4jDL|dvp3K}T`l%{;SxYqRt(Qf?~O=ek8 zoN%S!%x(O@#GxqUxEyXzQ=J=!-l<9kGn6Wi>&uhXlPY>H*D7Wk&ex)?9UhRf*M)e( zJXn~N4uWt)LWuL*4MkU}ov6Ug2``;F)>cA!wPu4IH?a#}2x{eO66cf6KUmV?VM_4_{Pg#LAK0BdK&rH#Y-+wFf(ifFbd)wpGmzUu|M zeavPr&!QGe7?Gj6NDa`8ic!N;03eY>6H_9v zvfk+>eOlRc5hF*?$D_se*$=#`@(Lh8z|?GLcA#CVu^$k2D{>@7;uE%`(i-)8G)9%CXJ+Rrc! zb@z6cweo1n{L4o#&+Gd@-wj5j>OC4CNcFcU%g+77lD*<*~QY6w+`ijA>@4 zQZqef^|_gZ` zvs`(kR%dYU|9=tWJ)YFLp4Cax+1O@tyQJ7cOf|&m+yuu}fv7)whS&c+`)L3P+Gu?g z*uX;HnDDB=VQEXcY*JaRs%iM!TRXMU8MclDo7naP1#)>2>VG!$&biuBGu$yVVYH93 z>_lGM2($T}Yl~c#Y1BV`l#cIGrvI_b+sQ0+TRGz{xx$kvz3k1S^ar9t_bYx|*)Bn;x6l6<;0W z-Z_Xr_oia)<~D4V2&u@$v}D$SP6fgF=%$Y6sXbXNvobP*8?(D+sSRiT{nrF-OXF6? zH0GC*rSx-4^ZPV&yW^-=37=-ahDVjSgV%4!e%;2wBv0${aJ;Irv_B7hNG1q&=i8ph z&n(&nIo<3{nWbt?UXaSU@@sOBA6}PnW2CO{{c*Echt2)J_Cc(V=8d*=CUEh>?Vfo} zS9$5e`9D1V)cf1YxBKv5`8^zj37|WU>!MUHM4Jz$vXWh*-A_qO-rE)ry#7$kAkMOW zS={EmnE{PVKRA>+O5t+@+Nz6DM4da;=|rCQ`bYrgT+a?{XA_kP)--`aflVA^4Mr9EnvI!1y(tGM#L zfz^xZz{|?$drDFw1flpUM?>~Bk)n%FMOTx+wnieEUIly1XJf5$`LDKH_kZCV<0sgO z*~^Tju>EdW9K;evZF^6KR>?J7t=l7FV2GJrEvQ`%!<)=VUxVW-R3$k)~aVB5^ z5oPU}XBDuAn#B#yuv(1cSEIF4kV`Jg>EN!MyF&NQRsIhA=HWZI@{JKvCaMpejM3eP z722jy7%zL7>)6-tCp>3U#2vBoFP-Ax6u4KW48@AYsk6%Vz@61>dYUcxT*?|bJ8Hbg ziE_lY^gldsFN278&5PJh!y8>Klex86bJ1N?HU&wsOzmfV@=>r0f@uIOCDz*j<`{{o zv*c=cB%`P5aC2FaN8_ruRsUCvVZe%HZWGr9fDn)~f`%KqRe!L;$R1^E#!84_XB%a! zmc7a|S`RA#;|nhnc&DBX7K9cj{Uh>~G{a2dpi$n=+BZ)B;mP1yXfH?^wNpW~5OC_h zvlZ~-35|T6Eofnp#3SAB=RhKu(jX;viCOMgHyK(`^vrzQqz3YRw)k5HQ=~9R&yF^W zYPtiyYr9`;VwBst$bYQ$^W5{ERc*SCg>s^@Zber04SO&r~0vbUtml$^CKskwPpHveQ)7~ zUV=(ZC{9cF2sZ$$&zZ%L;fQ)`g|&9p)p3f!&NjAgk*^S`coO*Mfc6w2z>RT^c&Zjbl)6L9@O*WQ8=8#VbRny1A-jj%85UnHc(PS85)On3%B)h9CcaSzjP8(~|)UL1aY27e>yPtYi(EbJx z=nR`zy!IpB7`U~|Dbrojw)Sc`hu%bci3<&i(YD|U#ZL)@W)+a;eyDrvPqmKXlhnJ??D+8JC{!^(tQ8+7j{2$(q{5tAF!N7Bst@Rk8MNEb< z7uf zz@~(5i~0*nLMz8V&Zemd6OZvvbs_JqZ5l27b~xFH&PR^fZ7l`!@UkMmWIp{;dR?R9 z9OKXTbybx%l*l{8JHf4#VlS1~MS;1wY|1uKz3_=&m$;mBlv0?QCinH2TJ5luWSMQA zI<&2xZPM~&{W&^U$a4(Oiet0g2Y$595!`nhd#+mAzug=1&xCwc@?HhEq761z-ftw&E`14gYchT#_B2xq$N75ToWJk!SG-=#MQ(?oM4AxP zdTOfR&DJot?BkhBm%(TmfgMOlx_C*jH-184@Wug>ofWr^(%L z*afau7@?K>-g!IcuF{<+f1}@l*&aIOYf)X9o98U&gd1Mo5nug8arQ92Crwho(-WZE zskI4%@}l)NnbkLN5msWpuJide3(o2)zW6LJoKrV#a=jXz<63NJe$-OVfqwI#S||ORQvS=+g|M|zbYSr^MW6V>SU}nR@YTI?uUKjwoaFMx z6C;FENBhS6fOwFRCT;K~@X9s(sPlfdK zC2V4@7TCD!5_7)V4ndHG=b@}a045@OWV`Q{6fOs;QK{V^im{D5k3;3OsP?-4*Zy(5 zQPQkSzzv7O_KoM|ibRnd#;p%Pzvao?)HzTO*jg4RYu5>2@Ke_Pya5P_ySgb|-DBtw zeCrQVE{_Z<)W;ZqZ0WRPH#**l+vNu1R)uOlxH3RfI$#qZH{uIesJx}W()qvt@H9y1 zo?Tw8g$cF|0n=?LP-|GK+TL6((xtV)YhOeg?Uly#!bK#PEU7>4mX41<^(+sWrRtm+ zUg5Wd5uT4Gd(8i9E2}Pw8=Z*Ibkgih5s;g;#6vn8Gj&L#EGWbh3`$EcrNJ;1e87QG zZDv*SXeE#C`G%gr`s?^~!dv*Xv(d1lV zn(37u0ODKUnBJ6oFQgT0lv!u@rSQa65*~v7(3o0>V;?y1KW%vz{6n^EqchB-@Oq%( zmC{>h(4XgPi~B4Ljd9xw(65J|N2=F<`h7xu$l{7y-tRLy#rqAcL2oH|uN!1}=?ThI zy*DrT4unv&Q5P9YNB=UI*^L3F`5B^dLG600+kiwtZ0sMN0p8r8!L)fVdvxvKyH#=v z&Gl+lL(Kc0r$uO5&6@hJ#rAHr4YON$X?abx263et{`Fb+$(N$tgQphve-JgT>Yxo z^i{~z(M7X>Tl4u@e7{#`@6t`15sGWr`&Z+sL_i&-fA+S?zA1gkg5VeK0vP1VLyt*J)GEHJ5>~!?l#D8ZVs-cpSFzuW zU3i5Spjr&jm`Xt_dS0J7?!ME=xd2|xxt~;B7yX`VHL`);f+v{)s6&n5`TLh%gSyDA zM@KZ>L&g`CWE;DEYqVa`eUnBjwi^zSTk)oOh*N5Gz?@Bm`_rE)xH3!7l>J4M*m&bY z57UF6L%g>Pw&u?_?LEwU>`guy^W4I_8I}*O&q6S*aeS)*@_tI~Z3*g}%8L7Q9WF#m z(Q=;84Jt1|tKyQGzCK8u0u4`7X(NGYO|UIpi&PMp+r%a7>*rzRT(VeXk+1 z?qdz$xlxORl1^bKQ>VQEBZhJFV`*@xHD`cTr?~*y5F2yXQjH7F;wG`fd$F|84}KTp z`)bhN(`0I2a2aD^l>n^@sw5reh{xmX;!48H!1o(u;kXF)P9J&OcZgq9AF}>}V(qP9 z7@9a{r(+yBLsOFT5`9(hNDQ}vp)Q87zR6KH`$6K6*kkvw1jdZw#cM zUM^isFGB*%Q_8Hjrd9=ga0eRxn_u`l<~2Ad6i1W&Oh&@lUF^q-R6L2nR{9JI7AJt^ z&RGVTj6PJ#59Ka_1-H3Y9%R$D834AIs%w?|C_Dzh1!Et&m3D=FeM_+);5)PKs;0Kv zW^c`Z2Fv36I0fF*-{m|S&Hz?An~?pGV#vZTg^%N4IZG&Bsxg zDOdEO&`bJgq$eP`j5S;hXXn~CF*BlAOwMI(J9+H^MSYP!1)TY!I_BhoDGoL`qo zmUTAW-H;DmWke={w~Pw<4spF9oXm$EvGk%T1$xgB%-mPp&8V&150jm>IgT|={XU(z z3*CA~2mZA9NaZr)U&5EP1^ytpJSLtx=2H34H`LJ(#1iD zyFQ>JC^A*CQFw4;sFDcUc6lI2KIsM_vNZxM2&x|=Gd5@gKa=TqSrZ=qk`z|X0!EyC!J?;x=Jy;!ydzpq$+-pRhR}-D7zpWo` zc>~pvw%arrM8v-)bfznvR{YzqbrmW}{d}0frYZdeM*214515PoZyBF+ltroxgP>+q ztc`bRt%2~EvF}*gn6CdPg?$6@&sw-d0JxL+GH>M zhc~eH+|NK@C(^<8Wr<9r6>;{zwlRnWYoww3?^^Lps}Jf;$E|8Z3!+_q))oSF8E+D$ zssGYfO5^|v5HNBR5ZE(C2vblKpJRFP&EPAx-ENq(g7w+{`N3j)dva~ArgVtD>yM}9 zQ0d>FtI8xeI98({T&Uj<$PRLW zN!@F7;IjkqMZ^Me^o}gE?UIbTi}?K1v9@2A3ES6{HdPe1jkgK^UdGv0K4iVL_zt!} zD+5uolT9>W$9&f;-Wsnnb(J}3u-8v+`a!PJ6~A}0oYoIr>17{I5b9bZbx?7RLhF%` z)e4MI@GW%{!L@OO&ySwA1Se`cTKYA29-JLgPhzGh_4F@?|Ci~vzQbP98>{KfO*1Jt zkgq+7p$XZ8KR<3uIle{SVJ?MxX@E;^JCRB!2{tsLW|Z$9_yNVePXKaZ7?aFv#~V zjh;31T|dl^#{D;kJ&+2h-wxhe0{0_uWeO;2I{};b*Oq+u`xO){-7HI%>$tozI$%+y zuHqBRC~3E+H9#U5>%S=!))E4@CD^mR;iiZ=H9TWvrC&3wdcCId>pwiZ7GkGJPfKV1 zG47dJh5?zPGS(#iQ?5}LjOt6I z9{fR7#w;CS8UDx}jCM$yc+Wl=_WVySB)F4NKt_7~7~G@V&Dkgw=hvv)Rk*K@u9v*5 zBpO$Q_O5b-q4E+WVtx)Cnnvd@_dDCDoPg=GMSq!SQc^$uI!pZPUE{;L;h5k0@E^I= ziGxyNK0jhBOutvw`uE5laty0%&MF}CX}Ydp_UNJwO#<2HpIaK#>D;5ek{6{__2OwE zPCadgbK3ivOPv%7w)EFDz0Q@ohL~d$k33H%wOv_!Yc#7Gw9iz!q2?znr8nj020q{X zNpIn{c{Xw`8&I=C8~r!RtU&hgpk2C;!M`*3qO8J6zcKpAmVtX=?Gz&dPcXnf`+b;b zYKkshJ^J9OM0*lIT@6A0Ba@Ryr}tup&w0&X(3)S!2vP=&iB7m3o2w#a8*=y?J$zue zxx(~io0ro{{5AMb_FxC$^o75ikT~m6MmW^JV{LV*fp4Vzp4PU-#e4GbyG&8(W`V># zbymjiAWjIhk%L@;vkxbvH$xJovZ=7D(Lf|5Vro?#*r};}G zq0AGel9NE!fb-V7qhaqF(BG`sQvc4bW6K(l4WZsLMZGPVmnpFP_PQW`=xYA2bd?dr0)$SPfCPmcA)g3q7 z1kf9b-v)ta4q+3RH-dh%I?K ztqk&Qk!94ougV|;0t?V!&Gv>ASw0gS8YPwSWVLgx&`%SC(|5=#vbB>|`oB-M_-D#* z$N3T+b_nlxkVh*_!`u#kE$J>$HwBWPD(=cz@9UXo>B^)-xDbmVaXRe$R3Ti3uhh#( zZSwSz^qGJZ^CyYLAy$ve3fMzGnHf2*16nD|kV(VgY8tW^WsA@r5VP$)Q^Ky^=ho@E zprH=)Qw#029-fDuqB3l6W^l90fYTj8hiXGpsvGw2eRV7DU=6bNdy_u$CG}HXu*NSt z$}bva>{at0*VNDlw~Lz}W(3PmE4CXmUw$27r-;)eKk%mkl6iap#UwqG@6;lc*~vC! zK|})j8yEWCUqjk7FFz?bsU@VpDcKQ9`VNh9DPVKt8MdWK4(G)Ys%<&w%YMU&F<-Wcydm7O&sXCq_p%wLpc8NLa0jKA#}v2XjlFkOF{yOq-Gq zGc$xP#aWvOsU95O%1-qccKZx*{Ww<5lO6QIENxQXC!*A^-Zo}@yxVT0*{dqjS0awW z;(~Gdv_?3Xi}j0}jjzkMz;dh$D^_O;eZZaPB35e5V2>8OikugMVWhOqjW9C5_Z8lSx(#tLg8D;~c!N z9#sTnU}=9DdI@Pv4=vTm_G_7gi2Pn7i-O$*#PwOY6NU&Wy}@hLm)AW|Dnq*zeNPYg zJH*11w}-145iIL(VBrC8_Q;Tjo9e4w83F(%wI}7!iUgWe54${-Z_xwSQx65S)AFwMX#;tPmd() z%kocd5*S8(0X2epwo%u;LzlibjjINJ3y-*|f(ChzT73-+J1tywHpA3}*XB_e;vTOv z2oZMcF1)U6OuCO2wMszr+um{ZR(L}c6Ms<{;tf4cEx>*D`Z3PTuu!YQ;_e@#8#Slf zIGB^pbEPOH0ayRw9ZNeV`mw+t>|QJ1FktP29CYSxHv|fj%~w~RUgj%~*8)z-yub$S zzC~FNL6u*C66Idpy%hVYT#{@8jkQEKmi4jjyJz?_3*2~)0FPt$*4H24x(=4R{I>YR zt6~j7#Jl9L*|KK;alB$nOt~yMq0V>aab;t6)fYQv-_-N#rC*dv@9z7z3ql5+O%3+X zO)tNB@WmaLD<|%!T$9*K-tENOI4s3*BkLAj#@EH6Wbkx73f@^gTggEzk@o6QPKBXZ z^S_l=6Vuk+AfLJ2Kz;|oHdV64D(%-hRohiyGtX^B@u#c*Tu_oal8?2ev+eA%DUW2R zH(t#RyX(XwMNO%_F&_`d-TsBY(xTq|Bv=ny5K9<6#oJ_>1I&gm$N}FGP0-49qa{&& zUg2sf%u0HyMzWgTpnmCjK|lSN$_n~KNmfIY5vk7Z$0XUd3i=CzOz-m5Rdvi?`sItA zAVL3}5--HyN3<)|r+=X#Z@T1WQM*x>y2S@NO_Dlx3dLX-gBwv*?gS+~uG%%F7X3B$ zpM^hmcwgP9$nwnuJQ%V4h8XcaVb-sr=7c!xZ? zQaV##ClUW^fH5%VevFkC2Mz74si%jJ#(a}txN$P@SO46+;+tkXUB~F}s@fvK;3vWv zTsUDvoUML8nXZ)XFt;y$1N+Md;xmTgTpZ=_woeEFr5WX70z8OM^V5Zv_%XgG*V*%_ z9}@M^8zg(pQLF5Rod#{PPl>1N{d958!b`M}c=ARG)&xQkhq$R`h{po112P@9x(I~R z=eVjZb1+RN?Nr%Qoec6||IY_&43`5dP5hw{T~KBAa~W0EkT$~d1DDrYTq{+or@^3z zED5*;N+|l$L`h%JD)ZO#OMr-#9^mzRme12a1G8-2jDaS^c-)WQ8Ws7RZ|muP)Zr3t z))E62y+`Wo19z7pM10{GU9x3dHJq4NR<_`jY}w)3!gybvA#ya`57q*9U7PBV2zyt= z-kx{mi~2Dk1ALNPO@dZ>j53Y&!Zn~f(BzJnTf{2JFnp!(TrqriHn;g}OKChO@0HXm zz-CjOkLvPBpZBKN0+m_Ciiz?Q&SG4-RR>?#Ld3fM$Ia$E*%|Fe&7m&$FHo@^+4Oho z#=da;&CaOr^L+UZ=NJYQ83p>}+R$U9rsTRZ%8jYs3c&Yj5BdQ$-oH1jPDSZx#YFA{ zBwlX^%1LdOrIwOHYNU8vlrbC?x32I zY|pcvSmcT&489l2!{VNXNH#{hSe1DNL9}d2X4jdnSL)|VVXhqFioQ1<-1{p#l zUaC4#EgAi0{pF(QyB2cKVw3eOFks|i-MT9W$z1CS{}ZZLcqDjy*|S((=09J@pabnb zVlPPlJ^h^2AZ669@HJ-ZqSELy>Nm}|#@BQgFg{dvKe}#jYvF~H-Aye*c~HRdd@ODf zn=E^7lB&|ZlC9yjv>BQLr3zV9W+BvEhL5d^-{lvyW={RJXx@d{p?Cn`cDud5#mlOa z-0-NGMhqvxuvYbh zrVdXZy%p|(1TT+AIP#~N6^?cDPfqu+UFa&RemWn7j<-)N)KX*I6uR1Jbv!M~w;5lG zx`Dh$&93H^aB5+?Mjyrir#dLn-|z>1q-W)xQWfoJ*SSJ}UaPY{@0zqwA$-*SMUD$v z*Lw~ls)n=0iO5`S#%XG-zKn4Deedo`%(CpKhMWCO<)z*uEQs&hSO?lfK+g-O@c+p( zlyFCek=+6h6?+ET$*8y_;~`Q(Ae!9gk)Q7Y>skoM<~E!edK_WDC2%db6CIhiC%nnY zk%ou06;_5CT&fP6e_8L!?^T%0@(&Zfr7ZtU>+!q}^>a}m`SOI{5RpE-V>wVd1h zy$#}+>mWl}ABPtjq_IyN<LzlM*7Q2n;PO{N$9x8^KSKn31 z=pp<$HeU|UgBw%k9MdRzrC$*uVRUt<)W{T9{tot8?n_daS*4wWgR70*&bEYG4@nU< z7uz74u8V@Nl&?mo)rD7C42Xq2{sIKen8$Q||K-@VY8Xk{@!Q18%W;mY#nx;7epOy8 zzRFWd5)ANo)p32Mnw?EeY*O`@rgX%bGdwsdT^gU&FP;B!K!BEyh|wR(GO!Z^G&TLZ zw)E#fjrV+Rh~NC%vKIYD%lI#R^6^1cjoz-x3(i=BGWz^u4ID7?MfhS-{;>kSIc+_o zur5V+;lyKUTk-U4DvItuPpDUw6 ze|UHVb8Zq+l}Q0#C$L>)&LE+EsiUh}KF*5g!PiNM4k%g@qibjS{OPx{zgNd%u>}^p zQT#6YIYgyX$~*;!PyI+-9#QuoCmRVG0$9Kd0of>dMTX^1nR2Q`|v=V#ajInOvLRJ+dK+@ysA3c773%TP=6-O_KFk_Oo>=s`uaY|-Ai$?25U z4WpmO34JDbbNtCNT3M?T#k|^FVA38ErggM8h=h1FF-jI9m2%_?1lnr595~~ic?KXa zV5-Q5YEP#;Tf?x%{AK^3H`im%&gXov>uR;Gl0t9sB7gkRa)(Vf4J1PgD9EGd5J40q z+Cbwp+^pWi+1~8N%AwL9kOo-xdyvkFj%0JxS}<&?)*MK*xp@8BbZ+!A8jMqRe#nRA z%?KFxseoGe3@1v$a0#&A9~`zHleK~<{!Pn&E7Dq)G+_FrXW-he@UmRTuo73~W7-_W zHcUOP_Cj;$57W6J=AFIKEK4ER;+0v1lVsC+oEhC+r{I_jZ<|UWF}}IViPqJkgk+lRSP!D zs#gR9-1GAPS{c9*VTz4w1md*l5D+4CE(bwhR9Dwl^Brgf03&(*OuJY zFsHrgea-e(ICykzbFfc#j{EdZ1?hAmk6y}vJA4(+{!DD zosD&KbUqW^%_jD0)kX?jq%InjOK8!@TAYX)Hm=e5DU^DtnGjg3LnYPJov|PDFJL(* z0gt`3-!s+NY`?G?Sf5Qpz=E=9T5A%BiABM3qc0w{+mtK^3>1Cvx<1;v2lZh*?vF^o zYxghxxNxnsjPC%NG>gDA2>kI)_@*&gw@~P{9MOzZB|sMD_WDQQVtcCOso_8}6oT*L zY@7Yi&-pIp_@2o`)wgIx^$usOko`!feA(}nm9rshq#peb>{PeJl4z892r6S3!0A_{ zQixvdKt};jh*EScz@$d)J3UAWgp~77438CQ+ zzDEjnJcU0=z~@NEO3#%pc>jDSe>OFL>ZUHNg^#6#YbV|FWs! z=lzM-(4!eRuxy_n!1KP3k;E66p>hvqo*Olj?bc(wI)_2%7ym2xgx?K{80cex!YARO|jqO%r@ ztKSmd5l-kJoAd*HvruD9JV(9;Ukq*t_1Z3V-9E3&Azuo|gBsemvSjBN-xc3S;G@4ZD8E<_JOS_Hj@wEcwXwDH`ZQ%Z-TorWxnvT}4_ipZ3DoV~ zh$=FOWwZxeHKuEON_BP7%@i%>?|{hjYOd- z;VSAN!mdY|qoVzUk}RPcu|h!9V>7mjsx3GO0eQG!r#<{akv}?))cZQ*;_t;%N2hds z=@wU`E2#p+qKR=`+-J-LVH`T6w{s!2Ltng1{59X4-}4PVUs-0(vp~VTVwmL22^@&h ztJ6_!<>y-y^L>&|{H1Lof{KJl|IsriLc`^i#TKPfg%M}ngGI+|s$=^35E5(Z0^gz` zCvLEJP4%Myk9L~H;4=aa*abLD@+4Y}3@XYKFnS8N$t?4B~|57Tfmt$+GvJdTpBFR1%O{gy(7 znJ?h9$K$pr6w%tK{k;uQ+xFffJ+}74j}xj6B2+Hg=bwYze|W#bH73m*z2zh7!m3;B zD+&B@$OKZf9sPw-*~qWp6MHVj@Ao3Je`YQv)IBK)9A{7DNTz|x$okBVht+S76{7%H z`HhUH*lQcOFjURGA+~7wz?Nj_Veq+GqnJ@d-c)`Px1g(@+u_J}q0^TigNf{>9u3^{ z8Y~&v>GoTnKkA8UM~-Zi`u{T4NXx>JKL1o&4;Ut{p&KZFgbKdFf|oD+KTeG(JP_eJ zLk=?YP`D=4qJ4`D*G&JuK2Mfna!%hvOp3KXe`mBG6iJ6IX{`U49$U~6l(Y2EdOOy} zIL|A_$kvcKen!XxTNV?A@47o4xmXa`WKOgxH(xn&Wq6kkV2#bZTc-joK9mMuc8Th-m0(>?4*dx`4LCHsL|&lY7#n5Yg6 zveoyI{Cg^RsC`A{yyb!C! zjtcVIcS@$)hny6mxVSsS=+Pk#FaHm3)()t8@e{7_4b|A+phjh<(*iwZf$>FtJ~Traker>z%uU{{X}ZpJ0g@0(7ZnIX~P?F@f3ZV*FQhtl@lq+ zOw(rI&5ro$^8BSQzmxRC#Ha5k2onL*OzJ$QK2Qku4;Bb6r+=sCDv0C18gnjitq_Yy z7M%gwu4jh>174qg#+a(6}(F`o{-!_)Mr&JfSxv1cFS)KE4I~1G8|2EzqYS6}_FJ?%8De69}+JgH`0UezlM59!<3?nTwf=5jyTPS*G1OyvHfzqrzdwtV6&ap54)rH$`2+-&ab%?R2>DbVa(Hk8^RO&vbLUM> zmp46`d4vTDgoOcP*-s1L?jL3y^Vt89h~sWx1#Nm|%GMSW1MfcM**q+mt~=Di_X;2; z27C!(I~QJUb47q+4e55Y*Le2F2qJdsnN7c(T7K#pdkq#fKe6igf(}M8>dpX~*Qa5Y zVRZA`v$yHnxYz(ciuXUfQ6F5Ov&5AI!?0WM@H`V1qF-^EbnYl zK#f<@VDR@zVPRBPmW5MKCGU^dc{T-fEEiNtKb6{PxmPo*d~{O8mJ{_Kg){Sb>f(*P zqN0+aP}dl+{ceND*DvZIpRU31gRvpTSxJ-djo1T5BH98%vB`b|Hf6)NuSo@{9?*-W z0bDgYny1{KI5{xuAf6{%83&?2LEN3oK+7Q0H@;~Zu2giO;XtarJSy#n9%8+LI=})y z3AB(iBD1k25l|nw{n_28_<-bmjQFEJSX=!~Q~WK%1{ugvGl^>JSdE8LsHs@4Bj-l`-C# zugBhn6*yHWR@z9kc~3CCl3(F70Yv~Zr3bIZ+--(yCC0kSI>gZ`tKvv1xS>gAWh}x( z+P1AB_NoB)26_YM+N^uvK1E@tvF)Qy_Szfq1ELotZVMxyT=Od8UO?>T8Xt+g^I^Eu ziedx8=%r)n__Ts7Fq^l6>I$rC^SP<3C%3S09>?z__zN%}g1lbA7dpcRH zm!4pjN=w#Dd5pLFH;acua^r;h45wHr?M8N(cYwR7%FPYds0y(U35VK~8h<%%97<(7 zf3dUtf>CB0)Hb&^HQSy|37ZAfAG465_t)D+_$(bhUd>L8AFVB{e%#B_I)yLkc*H_S z>?T|?tn2Pa88l4U(cw6Q&~t;{ZCl=4F=_D=yIbA2>7>$nww4i6n=x_8yP(>_A2Jfi z6%ODz_v}k>QNqV(WNN2P)JyoThM#XV$;b~pfZ{>K?p>7Lu~FMw?8>BYX1)T3(4r*e z1#?`oq`9R;rD3X>zf|rwP)(_l%i`0L!GHm$0hgnS)xHTqTAqP;ptHZTCw&ImoUp*E z8$X2PScXEaW9Wt7yb;W)qbS}{Os0#==*ibw{ZfG&OE*>)Sszpy-*6H0DS5v#Kp=>8d>#<(prfZHg z>q9j7iXP>UO;jufH!OZry3qrAe>*gZi^d3PB3q=>%Ijt2Hv90ur`Cop(RRp!jjn#& zRUZ4jgm`Yi!n2I8D~aTCvR^A_{XGTA?z0lLId4)W>d(3}D=oZq65dX?BGAA9nGjC& ztnY0*AG%(;daX!QQuTv@BeNi^t>_Ir8)95%MUn5WNAD? ze-0NhxP>McFRGA04h6Pu3@cafQospwDHTp+*Xq{P2djLj@Q@A;P-ML?V+ONIAMJ4! zG@*(cZ8OzpF?qT%V|GC6!IG1QGa)MOB<9U)@y}h;`ou(5<6wyK;NMvd?k4PqnrV40 zfg9iMw#yr%*>iHz(E02YfJ9df%yX9Y0017a|5X`e0he|g8HHqWU#UaJXF%7pc>07? z)~j{)ZWP|HLspf_SL7V)bun^pDzkWs9t+Xyz9r|69v|gdO3ku0U0tC&mc-iV#kf)7 zP52+YeN)u$`Pk!3so~(u|6)qAyf5vc8}cXVc-a~)7}Ck#?xu=%Ag=}og|xqHo77>- zVj0O&L^Z_0dOvq}A^)-flJae9nV$@9j&=Fl+^BPjX_QJ{v4wqAX4`3hN4ALBR4j;X zPi};sR#XUVQYbUo5zI0Zfd690ziIMozLx!Z5AS3^LJ*sFYnlH3n5O|N_Z%pABxK_e zI#>#{qV{Lr&d8$`0|@Y3umdut}$G^M?0)U2~Q(~-mSVw_L$ z$6dl*(LIqJ>vLVzmdPk(e|xm2TlrTHtN;n^|Y6+>-xsCiUW0IqL+an-nM^o?|^cTr^LSMPc{7HL)rEjsSNmX0BnkxMbu zbD@=;=m$5wxFpNtEmV8#dQ-z}MgG#bVY|dpBuc#d@uz;L?|1_Wu*sK=bdsh4b!ATD z8e|nT)X=dF%qu^&scRFtWTsJRp33J&Xl_)T?=_7nLlWCMIcY!@v0n^4MkN0br4`9>$>?#i^dmwiNESzqm!|*oKEXKu%D_@7l1s^&JT_oUI{GnQ|uzf#Wv)=m0YG`$3;vJE@&$r{a~|P%@F- zsOmyLPNYW?;ewy^HySB3ihHUGv*hu=WW-*?{T)K6r!CWdfZ{dYMv`y5;V4)UmJuW2 z_X%E+7qzQdH|Y>Tc-<*#)^SraUEzif@t8v?(Ctlgm_RLzF+8iRCeDQoqLH> zed_`PW#6EExd+=V5bq5lr8P^FdCD_lVbq4~>!M!FbO+$Cc6!t-d~ z+%dI`Z;QG9jQ$)-MuUp7T^%XZqJKR_-7P$0JmfANQEF z!Mp0?kBvfZ?;he&=h>Q78%J6j=T23XE7&LIe64nTSXY4v%o82m5s|jak&20RIke9( zm$52cSrYlMYT3ouJYZ*R#3N06T)%Y3ZvKBnon=s4(HgEpvEp7_3KT6`Qrrs^cMDda zSSU_$*Am>@;O+|P*|HBX7vTa_`0XI9r ztT9k~J!d62_axzxGuL5tjpMb=@n-vLMZ!_jX%{GH^vF<%eOfdlgw?K86ZnPt=( zF9tcaPW!CB>#j6yj}I)t*dw{LM}@3@w9yhsA}ul zFSZ0ehD&`vu(Sw^1Z^*WFE7(PmGTSq&u<&ai4(lZ##zFt+_F?*KeMb^u*&+N5-mNmE-U|6Pb}7bT^*<*w|2r>=3n!j|ZIXZRSr-nyM2R@Uk%F?e(Z&&Q?BPwitPZwI^QQ zkZ*XOczMj;y)+n#Ls@=t$i?E^9+3JbjWirq0Nn$`%mTf+=`D6L9!vS{izfp}yheJ5 z>Bi-<7{sEgF=iR77=+gw9%t=}t%3FBcc3k)4qxRVCPA#*w0FoVSq*IrhxZ7*PwuUSpeAQd5q~f=$Qn%%_5o=S6>CL^*FF9k49eV($=K2VGjFGa1q)80%*dc@RAhCk0j zB-fM(a%*bcJ6QxcX^6r?UWaQ4z35WC!>p9eLnwrw8drJ}eUF^$8m>!`YFBu<0^QF~ zz2+@ljdkGoBk)NHvQI^U_{q0aTjf}Q%R5_7T7Ga_F{Nk#Yt17F6O*jC3(%wAhmP^a zsqx#7AT;4j#^*HTSmldcDb6gL9;@?nZD%B2abq*fzveE*e{tyay9}Nvo=e^Rt25i!>AKk3{hgjVEdycLiHjN|Fp-aT|`Op-@f=kgpMTf&1^mMoTq&LmW<+f9obGh>>PWgxYU$(bNH*7UsOj%Y z9TXn(f96gN1-7iGI@mpY9B1o>zbTIuV683q)u#3I4?v6@#&Flyh9Akmox;V;i@^_L zdG9Oiz{`IDmR~iRYvZ52$`G7d%PQaEui5YQqG-lmKJmi^qZ{I>?zG1BCej_Eq{<7< zSRa9fj`@^BHRI!vlCQ*+;l(!ouMVK2-E#|rZq)JSOPzu0Pj#=efzJ~Y%!ZOt`A!EW zL>|1`5``x6b1RM(ACX{Ih28`cdT!FiQ_h`r;^(0=2ZT$E zD|X~E#;$Hi7-w~Th-wGc-)6`Y9J`2Ev1EX3MV3X8P&D2T zdQlT2N#>yP1)dFTGmt^_X5bdJtTwwlW4D1&YA9x=?eX>GUc* zVFnFZ9O|t%k-BSLf9g|XEnNc_dlffxUfk`$a)j!b3>o3jI( z@8vf~D7GHve+Ep@F;6?Vi<4~LhV2o11uB_LD^kMjM3aw9v0{=ifkUj8`5fD$zV7>i zEA{7VNlT}`HtS@)le~NGj&gESQ1Oav5R~cX^z)mwLYZ~#=4kzv7mG#%aU%VUVx-?%)>ul63{Y2&k7(PeIJ(cdC)0`Xk_QI+Uy57tRM2r?) zO%j}*4kBWmSmWL{>MmB>@vda&*am$`zRLgQDuWx>TI`?0TIFHC8B1#Ll9PP>BuS^r6WkT28g`6Z+x2S#ul$y#X{-4>8{VFi~s|WJJe^a0l}yM z3a@U1sSec=W4k5!5{iqp4RhVTfQXfTO4$NT`5gmy#?%-pE3)Vp@!Unr!7>mFin__2 znPCj}1rVTSXX@Lf_NMKxCP!^Q$Ei+$>-tTF)_0&bOWnL>3juAlX7krrI#G zcshx5qt?!IvR?3d4+)Xxs6}<+LnCZ`N%VI%Zk)nQzbG19r{+k z5U|G*2rOzhQDM{$SRpK7O*+Io-Aed|q;m~qBl63^MP8xM@vU~gGn>Nb$@s;$FNDJyv^^o3|HO^9xdL0!0_ z>20zS3Ms&@>9gnv_ja6w+mX8c51t_l72A@;6UDN_aV8w0{?}$5J*|~hV6)>@zQ~;D zA0lj5xoEQ;aOa-+GDT+Az_uVID{J*PUNqc}e>|(|ssGKv#QF+ZtyERNn=KX7 zt?9W1R^(kL%u?eqJ|ZW&^-+nAK%sxg`EWWWORx-cP$-(K$Jz-Q%T>tkrxt8y8X zfg;TekjL00Wc1}p(qGKElG<8-`4g`EulRd_x?kmdj$6#_Nm{N0@X{_PpHuDtGBB0+ zkJc8iZLy6XBvvbmA_4BSy*88Wx;21cAEo^!{eKXTlgfPlO>zjw&QnjRZo+Rx`j) z5YL~&Wj?*N1n4z&mX3UL@Rf(8ZcEYt)qma@Zs_$4{|>}P_917Uo=MD>8LJt+8P`@J zvFwziZT|$-3l8Ta@!pzC9;0g{NLowDCy^q)Z@>~i2%&QRc9V-4C4TVX$C(P@)VEGH z6qve?*s$%l>0aSnwDmKkDm6l=YmXEj9`HDP*UdwyGZ@tM_Ja=!pgFgHyU<{8d58u!wZ~-<|Te7+s)x?17yv zU>=PDQ>RCNx$p|nHGPBxi!DF(litm)B+HOze)n3!1NQy+)nWjN8Wy((%!@@1L&>~+{e zD%bgPiouvbtNbtz;X>W$+Okg&R;8v-ilaIiO3mW{=%Tv@KDw^AuG~Wz$wOzS-lvXA;GtA49Kp?fEfu^G= zXN@99steFmY{9?E{&by-sa?*;P(&Q83V2}8m-5lK=z<<-qlz8G0bu|iUUB6 zE9c*a+9Us>?sJ9^TNE0)sq#wXz|~LuVVw&4NlxS@3T~ESa)w-6IJJ-Z2ZF~(u=qQb zE_^$xq#@?g!H@i3`vU0wbHkZ{4@g2R+QD5#kyrD^Xmf;T*qr<9^4q{Q%uaqP35ehw zt1xMxEzfNQpd+ZaxJpVZ3-{CW#9{A^%nUCFF5P{0G zJ9@mmA>E3W(5VBg@2=56}{h29K`na2JK2jaM*LbBk>=b3;P@LDURm2Y)f zq!)0@tvhpF&qOvwn;b?H3bS;voDU#K3*;K?xDdbs^+2{wn-ueRrZ}+iEOs{}U;Is%c$|QN{oUNxJWH4`j7p>N^EYb* zx5khy?#3#mXAkI>W-C-r`0Yg0_hVZ+HJo-$$1_HJW=17v@IbR|3{j;Y#;N+FSXC&R>i5v(&&4#~O!j{s z7~|vykcP`%msLBYX%Jz~eaEYBf~sEfq4>nivzPy{>hNY325jhSmn(|&kyR>S(#)xj zWrDb>y-)2>#!hYvXe^4^Th`4e|M!?5D<(?uEvf}=xaM|QNNTp%^;F!DawH<_wu2qu%AHy z{f+RiGu;=*TPu*+COF9k<$HN?#d2~Ye2{>?FeJTA<#zsh>e2pY)sVc%HG4OiMg-Eq~XW zW#!=3<;+?HC#9~ktQ>}4*KN!q?!826pgjDvu6meh`f4P)*b$?brCS<7{z&LW(8Di( z+wTA}5AhrOQIjji1ApuZAZ?PHy0RCQ$~Et(RaGi;Zj2wyviuD_iy(YolefC`*r7l+ zx^fuFEJvSwDi`n*p*}AVt0LaG8r!%bOl`_%ic=Oav_^ZEa%sFIwZxh2$%f=sR$X46(h*B*IgnK^4d`S z({|m&o!bC3BI?`cgw-Wah<3Jkth?vUE1#_Hn{24(hm|41!{QdXsnrNM<0&9@C&rea zDiZNYOc%qcz^GNXA3)oDPcWfhiOjVht$7u{C)yjKjsWw7EwMzM3(D))rhb}Xq)3~; zi@GMeGW%^74jb1>8E)0xN;IrkDZb*Z@gw*2d~Fq7b_79+nq@X;$j;_XTLI`h%}U-s z;5EG84*}l$S6qzWG@gr@GTp6K;UEPVzpQD+{kpAAam!YqxVKv%T^J{Qu!;(nN9TGi zlxq%g2E`1;Ot9o)xyY}H=*WOQv!w8U@22WQY%-vN6KENBzjUM@rbD5C6lZoY?;fcW z5S>_qLwq;Yj1-0Kt=Aa4Uq@WSY@(_VfA$rihrks4j_%#4ilKs!Q)Woe>m`3lkg=~$ z$k!6AV6x8%S0^8NeRYZk@=9;rez63RvLV|Z40gmB-L6Qln_3;yE&_C3Mq|#!@EwBx z9L&c~A)$>N&Qng~%7z4+(r>I(Jj?V{3(j;Z3c#4pCd`O(Bqlq5{o;UiM~3K4MBWa4 zr%}S;d2QvO7+>k}_@c2t*x-swk(y2#aX6V38`u;@9;!*U;x-rU|NivN)3!kc<6_W# z5Lwlq9+G0oB5oH|B+dA0j_(?bUMqRA#`h2KA{Rq67#ev(A&zIrE8p$&@TQOmB($d; z1*TxEH-@|E*kpd*0=n+@_wGHj@^NWDk4+niHZB~!w}tdO1mbA^G%G%#-pOaY)1ysr_tLZM2`V(+R)G=0+0HUIg*Ty}qvCQ$5qc zsL#v2*V`?^88u$S}+mZZk5280yvHpw~Fjl|rm z-)rM))gXQb4wpE+0^2YsQ~U!2VSl^J(U!beltd%NwXJXc0{hPv`W)Q)SFK-^j(=-p zn%j8BQ4u*sZrjb)KHCcyORp6ieS!0W^=@T(dcE>UgHFe0C(Vqbv?JHOXEa-e2`aq% zBjWf9t#|^{oDFH@o>ca@A-5*&XW+Wd^xKlk|NIS_r=#vT+ab84WrNQ=?S==`7__?0 z=}E#lgievQ-Cq^Ff|wCGojX6DK=F6--{bFJF2&!Geaaa>FK|B1sRB3z{t=1JT57CC z>{F4IJ}&jOJfIqEl$|_Gh9fh#pKPIl=k_iEFKwwLVkB-_*5MSRmS}V-8+;$}ilzjJ z<_$8RUgsKkdD5(#|%r5>@`=Cu{mmLoWe~p!XP!`PCl#F@bB}{{h0;=CAr5+o+!3(Zefc zY%zk~M@GG-_mpp>*RqvhbGa30fAbJ(Fk?e%j28^^E%*oE_K-aw^Z$+Xg<9q$8^pX} zY#oJ{T4V=i=<;r69!QA(o2wkbfiC_Tm*;A_<^n-YnHvj3C|40$ zNdZAk)OHi)pKyU_{HeeYDq52xe^pdFGc{}U7p%!%M%_0Ek%b%`3-Bnk<9_4+~jXs{7QysTmu9)T-3Jec>S~@OQpxbu9MC?EO>p?<-9KP zXFkGFbu5SPG*54f(4fY@&1a_7rDeIu$=M*bW?gt3*d{Fk-(BNY^S5Z2-{Hr+NfFFqGtqgO5nibhI=3mCl||x9l^E!Yn+ihU2zfUs@&qc(gQ6F_cnJWd>uXaG`8*Vs*%AcdB$4P?Vi^d351Hp zLi?&xUv_1@fkkw=6rX0wI3!*4FoZ(Phenmr8>ZnuU`=VH=K9=R4zKGV2G){b))ZQ{ z7qRIfe$u6-?|nWu3-9Z9xah)zQ*oE(EYa(JYN3* zY9>tq9PP0RQmWP?3Z9#13rsNUh7iS*lVc09WF}Y6DFhJt>)cE9XljNDnCV1u4!e&p z&BIO;TH;OOHWlo&tK3DLPS(#QmZRILsV79vL+nE;au!8OFIdm$Kis+95Z}4vog_Ud z$I3`A!0~*FgW*oU)~MyEJR_^f(hG)zWBtPa!>YnL7hobcB?$4jR&+6;OGmy!R=)u@ z#cz+E`Sn=wqrb%R>+!tyu@0woJJ)6e8I1+=ui}PLRy;G_#lYXvVmQv2O9G?v^YgB8 zoQ?4HlN@-wF6s%WH%-mw?Ie*Qn~vig`*4oin)`_)t8WbUuk-aN#>uLW5EXHA#YaUy zp_!|R2OG$7;fm1OqkZs92duGvRvaBAuL^^LZBN z{hVz2+ooi|+%X{+MQWd;B;ty~-9dsaUo%0NskKTA-+rh}bLh~AwCtcX7S~N?VmM0R zE$`$YKc3(9`SOj(1j5%|qH1$+UTJQ|W<)wH8D5h&pk!(ruBL6Lt%6ADnmj{LSE=V6 zd5og%Z)3W|OlPPX(r)$Zb{*-j2R5YtqUM2QQ$Qd7tXj;U1Y3Qj;70d*R+Hwxp&t#V%?Zx zZs;ZCcqKy(&t!N0PGWz!BGhye0^fmtFnQ3@oe#WhxdrmVpH4-3C8`X*UEHR|Z>c27 zt}Z+aKm;QrYeZL!c%B*xo{8?eAvZIDzmBrUe4#4XI3o0S3g=l%S)~X&$+}Nwo#o4O z0MwZPopyyrfMXVaZ{S}&p2yvcryR?5-FSMWg_p9+2j=3386I%nHd@}jp;Pk(3}3p#+MDO)-{{m;aO-(QJcY2)&Bt`(zC zqOhkzKIbNR@+r+{DvWdx2KcV}r7Q0C%vFN1=Qe0la%pBK6%FCGP- zu65sQ5C^^W?>a*Bum0kLQA~~0&D+~`dOZA2h$6qnF-U$w@((cH+kHDrhr|J0p7T6i zt6mqDvbl+NuX#9?6`zc9+l~SlR6L57Pn56*swgE=02%&eF9@X7hOUYzb3c*9rJ&su z4dqe+GzzBDZ5jbnNT>A$%2K*5ZE1cm2HOAzgbk%(=Rh8v6g?!_LC8&t)|MiREgzDA z%~tfH6jM_2STXsZGQu8ODQl~m}Jf=EcUU`at_zSCtDYgtm* zod+|sq=$g7q?%Ib|GTi7g7}o>!2otVE{ajW+piBq$de8dEods1{?szpjie+4ALNiP z#Z4>SY4?jn2&J89&=)xnQ{IgC+oR7szq%`5h=~$d?3diY=q7RKdS#T=GfeMwa|?Wo z+$u$!p&uQ3kA@+Q8x8PY+NwAr=?i|``dG)|tgvARdl}Pk`X=dzzzX_Q@c=^P*N6@5 znD)16dz4hCT<;CH3+iZYjld&#?svOWh5Q(zDTv~SI}_bY_KL*p9N9UJyFbNKsE0<6 zzbH`;Rov%X(CdrvD$^S6ZUaBH_?ys)bz?AHk)FeK39M=?Ud0}0y{YigdGyfg={-+` z%MrlihqJp;(;o{iYHXD~Xv=lNBf+MN@rUPPx&fFzY>2Y04VPymgk@Rl{Z-kPJS8mt z3otTjQxaaFev7#ybw@hzY>2#{bHWFm(#WawCQKRDp!lHUz@PwKMn5!5B$#+$$4rVb zM=2GBw)Cd=@n!al901lc%DqnXqa;02D*g*kMeqGdpw0C7pd^RS^LQ9? z78FsjA4WIJ7=xeUYwmB#I?nezHZrCYpv(U}Hi@j^2IyWfHa99$jwA0FS}CTUoqXf2 z79f4EgOrNUl0e?{eoN3z1z)LnIM0`!!*dA-^~E|f$#(iw!{{4xg}o8_RDUL76g@4e z{E}tfhYocp5(tTOh0|m&3Z5zBB(n7n%v7+Xi)bcKz9YZ=@79g^H)OjZ3xYjxGkp`u zc~Uh~2^WtQ*Lj#}`x~eqb;rMar)|wJs0ZYbd2t2H%Z-C})HA8Q%$*5DE`I%+#$B zP3(3n3Lp_w^!Oc$pGW;S_ZQ>!)Ht)}0xjty+TzZBW>g8s=dD8ayh;nKlc?es{Qbo$ow?29AA>mGAEBw-4)JK` z`a8%Ox|Z%;0_VL+a-h=QZ@SmhQRE_AR|ZGlsS%uBqXHJQ;qRe-tIWS|fy_Q+DFsmz z{;HO$XcM0mN$V1y?iO^N#P(2HOY*YfAZ9N_V<-BPwu-4q2d~x%?FhQoj4CWdz9hhY zo*>(A|L(G9K3X@PbbKxAyM-@2!}Iq&Y!s2d6l5mPDeR4IXs_EaDH2+rnIs9iF~fXb ze`cSWWIV@+bt)ZLGq?l82Rp2a4!c?MEWY_TYO1!u=YEuNpGaI=vfdfYiz^Y9wIVy0 zFxMsVkRE$Yj<`Kf{KS+9U+6)CoL53$Omk!Q-De?Us_vV@SgY&zRx}**#X2bzY^jPuXz#|@N zJLi*z7XRkgn1ILmS_J7+tsmF9yig_3Qx(T#Q)$qJCURjuAK?fuln}kst~oIJaJEgE zXFkq3PF93D#0d7CloUm9ag=-`LV229+MWk)eQt$&##UW(T3ABotkU>}_TBXS#KoHQ zJ<7QCe7$c7eYSv80TUqbhb8~v7)lGYXWbJn0`?pvdJ#{|#_2qL1K8AzQyCvv)Syjp z^XJpHK5XDym1KQ~a>bIRUC8N&fyvl_SY)KcE9MTYiJ%&Yv`ThcRB~>8Ch7B|JReYd z9=#jc68+S&=>Hn^8O^R%fl~gRls1I#WA3j4QcY=d2wQ#-;Z@=9G5|%viy$Td#MJJN z^pggvZ9W8`duTTUVYda8@F>|*maxHsu-RQ8s)xwZ4jU|mNE3LBEi5*ppcO`Uh2ogv zqSM^~yDfa4iSZCX@za_mn`II}D%IG&*brz0aSpEMkqIU6!h*;JUfA(LHC_q;a;HKS zQ3A1{ z@cXl&O-&;0nAXMwpwn(cTdJf)Rtl?mEj(TTri-DfouMCs8*{1kt7X!GhRS*)D2+j1 z+^t4syD~6K&&c=jR5sfVWkR_^8p9P=nmB)#61R_ z=`lq)k$&_-0W-mHBKOgKM!SE<0s{~gAU$LUp@7#z8x(Nz(J9UF4gSU+0Ba4=ent= zc*Q7Z)o0u||9f+vvW@+hMY*&;O;1Dx$07~Q1Zp^G&~91~Hga$Od-2JU0fewM*l5{u zv4ocFuSuS<46U02Uo?u=@=k-_V%3af4;+|PNWxVr)awIA>$>>%%tZAjU*{NjMUAdU z0(JJO<~08S;-HBB>EmDIit+95;t@XG$_P!K1wXDzC4!Zosom$(X3&Q(?NjwC* zcKEQT?{t5H?XqV%#FeU~zI#J4Wxx~vqG~86!mir>>Ri3#( z&H-z24zJ_%sX}9)nbL(bDKN7K&Vg2ScFTdfBA>SWeJ&`qKa<1YYEw_cy7+^@3zZtW zY;g|r;!r&z7cG3z2`!bA3^9q-FlJF2w5Cy?U}O#<$JI9Vfigmpk`QUOJr9G%mn(w4#ojm>-cO5B#iH<%fi6 z;wbL*^7qfS#TWT2asNO<35&&#+Ok=!wF?8x?E|Q0Iwak19>O!5rpkWf7h?CeH4(Fm zA6*Uf)8o4n&@738Vl%B}gi`f!Id{&Y)_+Fi6?!*=NS?}3l6P)vl+xHGzip*b=WzSy z;GLNWhD}6mLsah7gpfqbiX&6XnFi6hNR6Lq#2uf@svi9%2d6h%r5kW*)D_hKxIR3^L1%B>Bx+wKuKh2dr)l&=)Du~)I zzoFh9qM08sd+BGfhJRj_`rDOj*NH_l`z7#tYvuX+Gv;C0y4K7kG-7D;k7F>_Md4r>byD$9%M+zl|4JX9(_m&{Svk z9&^zFni0st#46(KbDQcPO#ze`ZLuUWO?77cn#pG-Ene?Wy{`)s`@K*%QasXSPET&j zGsCTF^xKn_rz<-OtiBu;(DP#t%pjD}v)a*8)5*58dGDg%4EZX{+c7%|0gqRu=|mk> zZ2H9A{;U}%jOW?a@5PxTr?NOMI;npJ;vp26GFCC>2m|-hM>M=DenGFtj&>6U2}Iu+ zlSt$h{gq`-ti7%F)cv?0MtMNK{!_4r%hL^{;PQE|cz%$q@5roH{s)`&6yn4FYLeB~ zWyJ$Q@8c+6s>uk-VysVOL;%O)p;8%VSl~@8x25gAUmh%ep`d?>*R#&xt5BpmS1WM4 z?F{K`lX%H^sLCq0*K>F~M3OzknwKlM=JxP1+#o%fT)St+X4|jSY}J|(5>}Lj<->1U z`i%-M%DF65yxrpY6wv4zO+PDG=zP*&=_dXMu*^d3Rpc5A8&GQ(3wtKE-wver<2)zm z@xAA2G*U45{pT;{aLUt{5~3S`YrOd%pfziUbYZ6ufa{{eb%#ROqPre`01 z;3_%~xXER6?z-~h5h98kxApnmCXPB3-H?evd#ul!Cv=zYDxxv-+K&oK`0085l5;O3 z0y!?n@$4$N>#){9>b&n2Z>#sVP9MKDTwo}%(HFTFB-|h)z&8N}Z@Odsv>j_|#k*Io zYbc+pk-~)COE|rWVHbb@0XoL3JpTdUs*ihhcV(4I_+$AT zA;kiI*UhMFNikD;)}eMO4=NfjCgsRJ{ihEN87oodzJLU*+~o2!0&+BIQ(LYLz8jP_JWTrQ+B;h+09!3>!L?uh;X@~p!u(G8HmXYK z%lo)gD|2014o3_nyVgUn+|+YUEEtVq!{wuMrz$zBn4N4F8x_bC==+z{J9-7ejZS~u zaBPR4{(HCPKKhVd?6>-N-1KQ<8;pWi^$L?2msOR!2|;$jY3a#5^Ep)p@%osN#{L{O z;YMP*-fwk6A%Iq7{Qw_N1>Z-H#HhoD!$*6wJB=h_TLS|&{R>vQY<8btRhbb9D*VrS z8UF8j#CU8C2#F>p~<{#ioA&q=4 zii#5v-!sS7_6$Yx()Z@Vz03(~4|;ea5kiM2>f`fkV>jd70+L54s&)%9Ly*d^PD#_; zU8(a2bYe-bP;!`#Om1Rf`#f7XueEbPZv~G1qRRGt(!$@ptrG&=k{TTOs?BdaP(554 z!X;8+86JP_TH;!2@XybFjbs7W?168Qyj_Ee%-GIhwN`EIP~+gFBe_;Sl}cWhQHMov zlyjDMp=O1gENMm?RjMk0>wf_~0n)s?=LcbRePni$HmgB4CS(cNb=S*>@x==-DIr2S zg{Jo;qMz(;fi8>+6$rVEp*wGwjd;UB_Z6yH7S$J1lLqDe)|xH} zi9^Z7KukY%!P_d_z}tB;xJOP1$VK zegR32QVI}sG2u~sq7IH;XrxZPU>||}tQ$Dds?^L;(#Ii74LVXcBrbmB5R_GF0^B0g z)j$s4naShpG7>eKOKp~n?5pZm6p+}pVgu4EWQ<~dU7=|=Fc%#TDf=Q0)@i)0i2AJH z~$eI zhwoGiNg-Q7Zt>4xsKp9TmC(nMPRIS2E zU)S}9I%oscRJ-i%;a02F_HDFcauA2Vv&QD)AGZN|5PI7n@aUgEjieay__Pt*w<})*;9jPqiVF_0|OM+ z9L;Yrzs!rm;zMuJ!?){2DQ;@s&xxT_+FJb}T2yc`Dv!!cDq{9GDfYTlo|$n-<@d)^ zg*jo_K8sFT*L8<*mRcEOm?w2B-JSNB&Iu^o_d*n^JVeL`s858E@V6kk;^q?Tzb12g zF$n)VGGBOsmUlr^(UjGf0XBNih50xe;4Nl+N1*w+oDrmUc-k#HzISYtDLoOd4BLkW~ZRRn)`J1`Y>c*%QdavSU? z&n1QjGvUyKx!9wN`C(RV}hVydNyx36DPl|HZD6r1?=JVdzm;d&!fea4TY zH|g)>y2!>$2Q!#w3fHqAf6(%F2ZVoAD8Z9EV!f}isqW@%y z)sU`^$mCQds+dJ)RQrJp_gRtV%-7e}g)iPo5u2I5`AO$p?Z20!nGUw0Eb09TPV!`I z%c53@8PD3-M zU(h4=NXxk~XCkiE_*8Tt4wKuvbYLDvls(|ylJsT2#G6jP7;`6*C!t){q&Fx?p@_&NPeaS|_D9&{U8CI8Gux@}qw+0x{l=!SqnF2YYR z>?Hi3ICHW?z#4NHmcw__g!ujzUk7iaos=(5KGPAOQ>FBlWG%CDxtzAYl0 z-T$3N_Ft0AK9U@+e}Fa6%{Wpxmnx#h=`H9wKQENBJvv-c)6|+paOS9h8>z$PO2Seg z*ryJfnOaw!Z#Z`=Sy6DqqSe_g>k7LR##-u72HxatEnv20~pBzReDcvR>u zx!-ig+PHm)LQl4=Ql!n${XUZYerBJ-BY(#rg8F@*fss7vCMPRc(>qvc)BF_+nFTWt z(1sE0-xM95SU^9bg~ewWUFNG(=2s>6XRvdR%DjaMh`B^gYZoh$c_}xLXXQ8s?iGxv zCzet*jOrtQ6%oB=1+Ht`p7D*qd-ozb2?RNngjKvaU8mUs{%Ev|r(l?L<{5D#v9Tl5 z=~4%kCX_m=s#Q_NHT-JC4f+Zc@*3CTsmxmFVF%s7T2kcJ|yOIr#B*CwXk*U*F zf_qy#QgKeuQi`x}Uh@WM zA+GnC!rVxaiqJJbH+zmn7@PAoW2MNDX@1G`tf9P!4wn@r=8FnoqRhwKN%AC@WId)9 z)9W}K7CAaM{Of#F+p5k#ZA#_mwXaid$x3%n19#w>Z?rBa3{=f0->|1V-LkD$W^<7kqT~yxe)>OmlJ8mp@NRi@7asoX29~ ziLWwffEPC7?V65xALd?~Cfng>!Lq2hls{&1S6ONFm=BQ|czyoLalNNhFKVZ)WkrwQ zl$HArP#Q+*oB4U((5YI1BPPaIU&5VCyMM#3L^+M`Vla?uGgVQd#HkLVptqD-2eMfG zwFlYhXq_(;sCZj<3;fQ7-})w+7W|&5RjALkdx;pIAMEv2p4MQ(wn>Bu93%81*B4Fr zUSUVaVz%W-k3<`@(~!Y^Ru~3d63{BcE$>;;ZKADFTG={(XSSRY#Il1G~_1N3Q+)}96ZOq=2A;p354i)d}91((W~XB9kg`lbYR#rU{*l4_@l`vJOZ+PO72sI))r~KyUrUYA zQ+g$1_uXP~1mK>qA@k-}^}?~+yQ2&|d`Vm{OO;87d9cx+QmN|!Ak3`Mzbt3dVPTNY zsO)#uc&uc@S~&dKHyTgm^K4^~`svn=_+MYG}4q#l6*`m!vuaHt9J1G45`A6#rbqqC8e;bTkR0~LJs8L zXK|gn&wwFZ1(3z(OoPbce41O0UEBE$wBXj1BSnV&|Nkmq27fSncc6kQu$+--heHJj z)tq@X%#X5L`$}+ToB8vl<|s2XYYvkMICCHZT9Uz{nLvAR%%Y9)uh&EL4_%dJoaqdT zjd8rBYPGJYHA49t34WOBA(jc>Wm=hQ0K)ubv^a|T^%t2uT&k=WRi9vN(r}ium&2ClWm{7eb5WyZ zL-|kj!qM*C{}%9_l&B90nIZz&nc^wO`^d1Nl4wjawxOr*1Zo#xhMiiQ@N}>OK-Q zwL1Z1fBgx`ahspcCOzj^H~MDMZVBBAczgGn=fre(6%&f#iq47mZm6MCMXjA?v(sL! zW#6Q#m}7-Mlj^Y25xp0%mpGT-_ey7K8Yw{$)PPJ?p(S+aEa^jlv@c{FiX{vmCj~jy z!)0}BRFYLuRu=Cf<Q71OlCuJ_}oa`)83_;oBB7?R#<*KH_aOWr#rW-_2B=giTQF( z%W1YrVK-m$e|UQDXtw|V{Xe#9Q6rQhirTbF)E;eZYR9Ii6?+q#)`-2^*n5T=u~+Td zTWw;m+Izfyd4JCL{Qh{JlN@qR&PjMa?)U4uZrAmT`zXJ%skW!kD;Ow>`g7yRLcxu~ zj{JEg8=18J&R(8+k)@wMBAqlr%U^4@rPiUiJ=vARS87-NkH0s%#iJY+k-^te+qVRy zX+a6UlyT`i5+7Ef@7QzIi`q#({5m?ofu0|4#?npMtO^_{We{S5WGH)k#B%vJJBI$5I23~ypz^+_=Q0V$Y~5G zOU8d#J%e_gfB-DAM{)5Nvpw33Ew?(&ezu-#^xj;)4b;RIe+#Mh3a`|9;8;0M`i{}p z0}A9TEc@0Lg6<^?6dpoc2$mi=k58bL$7ZRI6fc^CqzwP~QSDe=x#QT(Mr6g!>|Hl4 z#WHH0cp?6rH4tHMzpI-Kxu(tJ=3Tj#zvn8YeN0~pEHHBDK4%JS93*DlZ2$JCHJQEm z{uptPsD}XsTjtYF$Ci%C7SU6E7aL-I!nuM^h9MX<}!7ptd z&UAQk#rG66vCC^%mHgl`n(-tPT$b|nI9kikXw#}mQzUIF!www<{25WPn_?q7hLPm9p(8tvB73=!=WnIJ8+LO4C%;w;2oi2`j`r+MaC#&5looADD z=`%eA4e_oqTqhtNG& zf5wwOH&|5}4bR|}ps8y|dBiGiJbdpBPXP@9@Uyr;-@ zTk=yp&7aJ|FS4iULb^}RDW}sbjk$6&duSAZk={1H$ngLlFWX&jrjGYWGUy(`@!Kvk zu5CP+BBge0>8(9jlrttgBu1SAE;pOw?elvmeE6#~Vgizo)Zg*6Ql21eo^sN064qUq zn$7Z+e<(zmP}A7mON6OZi_wg(m>wES#8WU2Gt*d@r^JsafOk!guY4!OhGYzQb)yjq zm5#h%aam3006vyxy2D$@QCB6g0$SxOqlRWNqzpylWJxm9XcFK8+iufG>5+5Isi zxog}2@a^#%>zz<>sgUX_JylT7WyhpD`)Y2rlfHNd%AYn`#kZXa|B;N=(d*|4nJGoh zocu=rs2m0uj#w8KaeXf4#<-yXHUh;@vUzlaC7>PguLv9WY(aW$pgpYzTgyFXTZaQb zp$f5oDW2vdDgcqC_g{%-s%i(_wz8}1`ey167>VA=eEgz{%fxR+zNWJj`4c{+EjT=QikS3FhQUGxq2?;}hhOGBYZL-wzFI_3ZUwU7P^yWjYr4o6 z*6T^HBl&+S~SaUF5yH2zGpnOo+zc3wO3Mb@`! zL7oHeg)fTFRoGcAlPpHXW~FHX!~i0p5}g8BPMKYZ9uwRX3cV^)!%>CVKsCoEt+Dba z{!eE4pVadIt}mDe5R9&wgKmu6XRVEEBH{W~>RA`bZH37XO*-CpV1ZE%z5LDKfg6>g zCD6aEdhR3K-Kc3+h2?8cJzJaSA;$3-XU+nx9v!(1rdz}X1NVfng`)I;kasS`GTq*6 z-K3;#kw{VdZkO~}q^0#$A&p?-Z**%I+A=++)M>7~DA~bsm9=5d#v=$(uB~gF=2dA;&cCWTCtJudH}dRM4XZrSK}$revH$b$ zpHFJjOT8;wZntbBcpS+jx_*^yVAI49VeJqP$WlY_u~gT)HbhNI`7`eOlg+k>Xx?dl zYMZ=@ij^Q2x+u59Cid_0pGbM?y^gb`yD(aWtRnZ0=bh5OPrpun2o-ZK{txiQOk8~H zt31WOGPMC=GjH&U7eAWiQb)vPv033#4=cv-z6-HRN>f~JImbtH1sqiODU4fu;5hcJ z@(NL|Yt|qd2x{+b;#>QhRw&7N8Zfu5k-5FLjQQ_mMPRA0F^h~G{C;$+GcpaaJKt@^ zWgsJ-$P}Z`Oj*CSMPXRU2P zxbo>jl&UuZp6Zw(qD%J5H2XZiENNTgg!cS-q|p3?;lYz54!d>_@42Ky2c(>9)d)B! z>_G3PzqLmYEP;~k+Y%jlon&OiBne#Daai^gyS{^x`43;+1{suPOUGcGY;+$d3jpRl z;GDYwNzOEnbe%YU9fK~LQSehQ)6d@7iL~c)aUZbsSjS)cg>y1n8+9 zH+5`*-tIuY`R!E;*fd+_8xgJJo=E|9x>At$?o8Jnb8@#UGX?gnoBUDJ9+Q;>9@&Jv zZr@}?zk(xOZ8-Vnx9U}*`$y1Fe(QknG3_Y!yarG&bc##DA5&naA3O~x^h?L-0X*lv z^S=O^i9(p8#-$AB>Hnc2$=46^1)=G*~0mxqg(E+sqU6|$|I@@{QFDv@7%bYPr zwlkY%3P^g85_Q-%4M8xm$J(BVOVisDyw{fguI;JLPjKy%Kfi#{4x05JzC78n#o(ZA zRD*ORNiGU!Ym1|r#3voT&0k?oWR6tMp9AJGRcX&+ z$p*xu@Y_WcdsP)xd3jeMCh9@C-L-yarT%{dp4nYJwcSsvmTYF=H?~4MF8HXpvcOm) zxQl8Nvvy6`Z|Zi(W&OUtSuj^WEzojOi+Dr93iE_ZTAR>$6~W|O8B%cqh}((bXAA8j zkFL%>&aW2_T#PNb6-rqjMwiq$tv#DIV{8irm?@|s%Jt9Jp(l#}{_T@nMAF&QtH{~Y z)l(3zY5eQM0Unr;iV+m;5H=MyeN>d)h;G)=Vsv@$a@D08_9xq>q!g+iEAsKjco_Jo zi8K^>9zdds&hVGUOX6xGOpE1f)*)Ww_;Ny31-#7nMKX|PSxEsZG%rK0XO_j9Bc;Yi zlk*p1c?FEIt|~If*s}KhITL#_xu(H=657!@W@#{r`4&gr_C$@gO!No6EthV@zOVK= z8AE6$O;vrA48>9A8mw7|@)v(rM$G{#DFaTMK`i8CJ9*D{C+Pd(L_BxNX8viKr`jNQ zA2eR~QQ#W9u8NhDsyD_8$HFwo=H8^9muNK5)do0emc(U@!~O7L{&(M!`BV0b6%X?L z9dxoGl*;_Cc2HR5l0yJHLvos3S~SZ2)m#; z5yYO4YyYIlj;NlF33ovz;l?&`Idix%nvsb)Q68UDndmJSd8n&0Q(;FwCkNHXO}I*_ z=+t+-w@50^bq;=MLk+V?yzauSq)g6t-nm`M9yZcFatLi0w|3vzks>LQ(U-_*s+$LZ zPU~S*-3aj12I_e{Nvf&X0h!JodNn&yV;+!DzbXB?QFGVu zKHNM$1r@=KqHz4cS+MAnG*x#L0#EqbFL6;4kqCV>Y^VtCHLT#u%n)mQa)soP@W(2} zaY~<5{ixo@x~4h`{30-Eqw*Rc#K2Bai4siX_janverBY<(VUE5zLT<`)krsu9g5yw z05_5ozQPWC%}*tSL^7=m(amUQwEtwUDD7R8VUWruybzt5IKN>vkIsXimC=9NuN_k~tXCl?NlIYa**!|g8 z)E)9XTLJR=iJm})Bbdtc7fJV*B|r0613^vEQ$vV%)>wDN1Oh_{Z2>IK^X&7&5;Pp} zzw;YM#k+jXV$6zuWZ$DvqXXifCehdHSC&7;Nd8I2C8ltB^}!mas6MHTqhh^lJ~yw> zb`+VvLPWbT@sEauZt6L#t;j32NvTK!(gvI5dHhqR$QP*Jn$WxR$FUZ1CK*oU|2eOP zgcu;5JJ`i*3u$a+^{cKFx6LPjS9fAO4kTG?snL#)bl2O8CxR(tm9;lw-Q>JlcVtH< zFl&=zNF|ZYWwV&dTI7PtC&tk^d~@>yuCsd8_B7=trEurgfR=Zh_J-Do;nDf~p9gG` z{sQ*nkCbB|smDo^W3^T}^d{_Z;A*P605y=X)Th*5FE(OvovMWhk)%;(XvtLt- z5O8X@%A!_eCH|qVPkfU`8571vV4f3egjp=tfFjK3r7FxvqdX~t*8R^7x!ps$A;VKd z>J|ELg|Qpomc$VAB~}nqKc)Yadg&4p%vm09ppfvw)$raKC<#md{mW_ltdx6!%47Sw zM_l0gX+Sw})GoOuOki}S=)P8f+@tQ+_m%1q6&&5OvB$Udep?1N!!WhKv2+6ZG1Hc2 z+v7;B?JN@&K3*XHc(6L-Rv*T;Rf^oAyT~`-un?lz3XZGvi8|AsKS0??uQgii>riys zQ6q?iPlQX*A*1wM+AV@==VcxUxgA-WgCE%vUu{fSxXfH}N~mEJp`Gs|4RPdD zjg{1YcQZxDc?FRAOT3Kn@(|O6uqhos+Qq1i5)~Ctx47t2{%@tKQZQ2kv(5(8_ZDqODOI!IYot9rrvU1+$ zY7cBAW-=Fh5$^Rxylm?HD9E4wI>(Z?g#gX|s*U+gK9m^s=Umg+)Mu^AsZdD)H*(fS z4Bqq2#Jb+h*86pB!^h-=ciKU>GtrBY^zD)DRF|PK* zAP(`C@wW#%GCrh1?Y03RuMc>rrY73y?A1Qld*|!f9R0^xf65tIjP;UtUe>YYq!*vl zVNCZ%tn)?;%$D?caj}?1*@m}w{F7}=Vw7Vq+pXN-h~Aeln1(@|N+F*f=reVOV7K;d z;rW|MIlbUVzNa4lH2$Em(z5M(VbzCG=fklWx13z#RzobAukQ54xwUzH&BS3Wwy1R= zqo1vAbKJUl>f>k(u7tztI!a`w*PyU(QB~hGaa7owX0+8XcyrB=qaRrMP838MDM{K< z!F*=9pQul5W-vPH-1lC^VQ z5C15M$^BLbh|Vyc?5e{b;hEfjFX=Ch$)d>kK(D2Jak5vMKGf^q2J6 z6*jgtBG$T;M?BxJE3Q{zN0BtLC8)yw9(zSqX zMP;i4x$o|Ts91ts9Vc&p<+wM`AC{BjD|LHHx?ZEY`9_}-7Z|w^Rt~RxZ?7GVkpOnl zXGEX0PHJr*OrCO$Ve*sHXGi}(7Yq323yjL$JP8s2}2m5Pk zU-T}}FrXM+A{bt?)*euhB1U76vXHiaS*>wg#>_-wRxS2y)x-Cm+_*|nfB79wWcq?N zWtLUM`-5u_KsvKFC#ZxOl_HDg*I^ppa(=92*vjpp*%;$ruAA+0NglZXruh^pU@^+q z>JmON1R-)f)tB>po{UOZ7aNbr(D2BFIU76i4}Wk76PWoP1}RpSLvT~m&1PF>zwbmG zUlh~Qa#LHx*2Th9>w~m?D`7V9NRoq=rofVf6BP?@ul$>^kBU8p3kHEcQ<03~`v4`T zbAip~ct7i3hC7r~kz+I1d&=Sgobm30SNA2lywO9Kh3nuns`9)L2(<>rkjyQb>UrN# zZhPL{Jw1wIyZWxt5+{mHVy)OM{}m?@BEN{zUkQXxSuq1kekQ}xTx{ydUE!z_wgFp- zj>A--lpDmcK|67xc)qT;?BdHixZjIx{Ng`A1N}HToBCD*%}`(}ni>;=k4bMX9JVL@ zQG8Y2${{*a&ipPG3YZ%|y#EshoKkoZI=xVc_tgtZKS6P%&%l~?(4^f(f?@Q$u@XrQ zw@55r>Ty@EnCdt*-2R?@=3xAB*sa4Hj0?yUz(mv7p^EI>Pqv~aRW%i)Nc;2q3&$Zi z_3BM&G5}G`d7@Sgr(UfP^F)!DSB1Yohz<^LNuQY1L5d0h=J6+ntY=>;%AchbZSXTGkyV1aR~@qwpJ8PZeZi_Q+IpV)r*TVal-#n*x@Oq!4d>1Ij} z+AM^rOVL?o2KZ;`@BKzMiVOKaN+R9O3-rv!Whk*;^>%5^{Za+|UCmVBSO&d|3jKtM z-f?lvTK993VVC=}hSMca(o5T%_Q%nN(*jiFKw_&^P-3ip+n0f7IEW({dKH=@&w8(J%b!pa|h4^l}Y0{MdmV0H67(b47L37G(AOmuE#;n#*tK0lWV^6MK;No-RjJ(A8rw}t7zr!q7qvywETWyjmUsXGbtJ2J&U0*A7G8!4v>#*X7b9BZnC z)MYxl3_>3d#r3l4xYXCfs2q|2*H`5F477x@-w4Qr#I%y=2n%Q;5i2}M0`wpLkUGlfpP(UA_$1QRU{`uI=XJgA2n+vGQ!4PvUuM!%?)-WUJ*wfP}p3tJ88%;(ng>bBADmIY?=N8_|R02 zlfJZ;pt=sTKDHJ4q$w|pyOWLSzS<_G^Z(QHtmfM6ZuoQVvU&flPL3)Cb)N91tdjY* zFfZEmN~-ut_^c|L^gF}r4rHuI95VW&4@YI&c+Ue z^5$8%__Mybm7T=!1*>KQ50{@mB;HGx0n;=S#07CiUTn5=V(j5h?(vRCL(KH3#-Q&b z|0FoaXPGL@e!@(o)2pPxO?{E{Y>kk~1D7Y>_%va^D)Vb&pIjTPu7ssvqLz;C2||d^ z9#i!m^``$SSd+hma{tm^#njncs784pDstS5R_aqJ<*@o-^ZZTx&_3pqH)#9i#*$_B zm!H0E)9FO)RsG_1{UZ!sxo*2sZECl%tJcay^+TUOiHj3Py0iR-e~~2?eO3B067ns9 zUj?pAVvRjz&951VRa(N!DgB-@u+_n(FrOKLv|c@iZV8uQrCDni(cS+tg^=FdNVBBxQO>#|;GLQeuJF3lYQrHt6O5Bx7abj9Pp4HMO}|vN&_y)J-}Ig* zUaQh7-bFpUl*H6>7Vn4kN}{d~xr*N_J`Q1Ufkj?hp2Ur}{*L|mpwFu~!0i}a-%F~W zP8~;hDste6NQtjMfDyUI^_~8YYAN@ zn2qnjnBU>^43jtIR~HZ-9k3zE>8=CtLUYoCyt$>>;#4dy&%f#+w) z7)4oDtiEO!U^plGA}l$B{EGSQ{VM(4N0cqI$$tP7DdI`eKl+!0iMsP9OW;;ZcAU!N z);h`r&iZcV%^g?sR$DKyE|5Yd2fqRY3j^b@41Aq8lLslPWD2Bo{yd5jOl1wEm&y(5 z0Wi~U`by2E0jK0)v#-nR?tiMk-J?9IaU+Lmoj?S8ZjDpq)GKiF*^xvb2**KY$goM?G2 zKSgEOnI{VWFyE?x#Wm&|#pbz@QZCx+4=kvBH4USI(C^px1Ghm>k7SWKE4IY(EY?h* zBci|c(`@2~v!m$5NO8_*`zdQKvQUe7z9}6raqmCRGf4Ly!AhmjKiTqBPW})zzv6B9 z=$)b7W~o;tPah25&>&dmReZFLNOS|ei~#f(5#Zk5J8pBn}8JQM?QRazF%0-ZV6)5UXAPKj|HaXBEkS#Ex zHS@pFawJ!J==vPn?V1^GjU&rLD?MFmF(C!whYyKtE|heF21=ERSNMc9*m1mTb+bZ3 z)U$|x&%%GxrsTFpi@U4HgbE^_fJc%YNu4#ih>KU_4bP*CRp-9*3G8n_GO^Klh8PZ?q(E??2~K$52)aCv{-Sm6Ci;`R8VoTP@NA)5!ctSMF4nqr zCh%Q*t+}`gFyAfm<6m{DXO2`0t7|e^sXaRqd+>{ zYo&^px#OTvsXgeF1bs9N!Hvg{wyi5pGiwrn?WG3aQ_kiZThOx{f4`juOaXvc1rm_~Ei4aNFfhNz(SmFiP z=>%2sDcuMIbp#xFZvcqcktq_V-WaE<=_Z*)qHpCdBs~jUhEhkTV+BU5j1sfn&cy#r zi&$@`y4Q5iF@UCY1CYrk&cnXVd_yjLG?v2PbI-$M%-_k2&K4NFItjcFIT-2%#wJUafS`b{D;0qExmC~w63MG9GQ+qQKs!E}9!7~Z({+Xv zk{gyTYP$dzJ=4p^H|R-+w|+@aria!%ZnmLpRpXx2NKrlW`P$`Hd?DW{MMO8v1G}l& z?COF|iz?kPMdfdUr3dV6L^eE}ekG#J_S-moinyMBfqX7{mf7- zKh*^adQVy2IQ&TsP9*PxSpl0W)J_nN7T`SR8y1p8a^`Hqy#h0*o=XiY{{~wf%wz=)Ka_{>x;39VH9S1QVN1db#4W6F4s}QhwEq>K>Cfo52dXMTVJek?0vNVj&LSC z`&CxfQHrIikM|m=5SYF8`>IreDUup+$)yvxm3>0EWJTF}tBE72%=i^@`15y#tBQG| zK}z&600s(qv?`N)UhaEDI+X1SA3k>PoeQj(HT*^0|8VL20qY>#zgzP?TXg*`)dHR+ZnDIZv{Jt)>K&$iyTpCl;!VL(1+s zP8`1<4Bci%ie~Sb-UL=!Jp^r4*I#4NkuCLIMmRi80>N7EAny#VXZ;BOPK~FJj?~R^ zzw$$JME4yh|1P7t{g=Tg+5W(JbV!z?XXDRW-vocdb_h7?@zz+G?{IFa{bc7+-^MuE zT`tzn59)@pow(j)9$tRv=#{=wsGK>f}Bmt;*2QHLiZgm+igiP*P})o{{Zu0~p) zwVY)esZW*yf;D2AgO@6?1tq@=JH7$jMM)B^iW29U=|0@TbPpdzI^SQJ7elQslY71U zvq^%G9UvIuSE0Av%=6}-eVU4FS#{Pp#r44q8??>ztv~6|4bu&c^brLHkweGC0FPaB z%YX=*t&x6`>0UY4VhNBdaVqo9XwDD=E_0gL<9)O35d3CS6 zzV+QR@uXQM1I;8lY))p!63=0PM_I96B^FgIYC&OKszR9jCg59EXTI(Q&ba(NJ5H&` zcPvJt64nw*xtB7o!wfkio*FDVxc37pxEa`cJKO()uC@Mnd*W9oEjDP0d2ov{!Ehw5af%`;w>tjA_?K2c}&}$&|~wbVS@v!{AlKtO-u2h~w$D<-cCJ;PiFpV4R$RL`j ziXRW_iuKfv_g}RzTyCS>$iQi86^vBIekVQ{F!=FiY%+OQ{pBpB;gd=E1l88ps-Up< z?g=$9d2e@A-tNsZ=Ln?XeD!jF?#hFs@LlK~gr>bEF^|^q*5IsRYLO)5PVle0v$CLI z-gU~aZ`5+vvD=@iQrXIAdGSZ*4ymudzvSVYf^bx2-Sr~4H*q(ksd20ZYA^F8zpBqy z&n)$6*mMrnLj(+;u2`cC&r7Ior%0w{1W*p;P_J|AQHa1lEWs*!kW67u#Ru2ZsiF_{ z4u$Cmo?6?PZyk=8Q(v8eO9#uo9w*x#JTLT_w#oZWDy^SODtMh(ZgYEM&tR$UwD%#z zg!#HlCb3K8pl*UhB*ZxRgslhQYZFTNwHvzdnH09=&&_PKKe!boKX?k#zr}Pjj&DL1 z&kCIs3hAaxxLLx}(K#G37k^{EevmGF@)p{cr0YEF!9aX1SLW4PU-Xah@urYJn)vi0 z7nl6K*zDL_|3Q7|{F9;?i!+~WAd5+jaY}kc5r?E=>X)jsrL8dH{zd%R3*b*zsQu>& zSNN@SfEA`D;31Fg;h3vWg5QgY6mQ>SX6*AsSxml`D_*Qb0cDc5A#p6pX!V_`80}u= zAzn{;m3c9`!S;!7TE6d9rF^xzGo9ls(+>u&VuP0kjb_X*pgb(|olPM6-Ox$3cUXbb zgWU`Ifg;1a>$t8)z-F9@2Be7Z7t1E3gx`R0_R~oN@8A-HKkq(btWzm7+mE;UJ3Ol- z{5>MGUD0Jw+l@c;6H=wK*ICm;T-9XpIdz%Qfvn&8HTpl4Toy#x>z8@+PBR7aSA1RED&HM<(Z`hc z%(Uj(#pFLt*-yFE?!c3FXx0S36#!^pAS0yAOofOkqn)!NNNl_sen(l8TlVNCLqZhY zbWp#3eKMc^0?LE)1B?Mweew^P=#PPn(DWE&JnT*PgfjK-R(AtUm1vo-ghkKfJ+=zWzLEM6{b z^P6N#RG4Bxr7>F3O;*Xt$xv!wC8^7N{om;K|1ON%TZUa6<@Iat}Vl~S@ z(_y^l3-h2AqsqC5dAE3YCosycs-tc>dl9o2f? zHC2h)rsO-Qeqz7>st~ZKz#xEu9Y=A7C+_gPL{Jm>i*Wd5>kgpj)m>pq%=8z({{VM< zzUs$v!TuDx5Ld3g;$-fFHq^}Z=w-_IVS>;B-r{E5<3GtJf7F>t;Ca7hmx#l2t3mPB zGRa=Zl}B}%f!_)gFNeCPJsgHn^)zsJ+UIiWjH={}VKa#(535@!i3RS-q=q|m#Y39Q z$)7$`#5kE*L3BjITw|s0!_R}m7J7GQblDUhQ}~T(--%ArHE9=ZEc_z8wt>gu<%nM0 zIdC6DgDUoCxW=m8@i&Mte_mY9+4fzU!Dn?8j;wqftDn6ZQT9Bog(_5*CCzh;CYq$R zy__;oIDusNzX*l9o5|fR&hA{smH8DK7?Wt|P6u6}+dRn_j8s1-Hrlvz$-Fqlx@Q+D zD8c+G;+&QwDwEy|APb)P&7b~*JvA5f*|);=mhuOtigtFR#r%Oyw-D8(d?PwfMPB}N zJ)kNfv|Goz)f{;-VQySuzh-WNB#*f04M@?ac*nI23D!h4|LD7wc3f34qz zoqhk*oj58QvYknwpJss#Z?)SG{!aPLJO0(lHktVOo{C47m4=V#r@M9DE+Lq3@&Qjs zFZq#fjG6^AONP4zFFP|BN$dK0B@R)icSMVt(nkR4V6B4h5Z3N(=MP~sudE4OBZ ztA=NY3rdy)$NzW^pu`%LK)!c|S2%9Pq3g1`Tm}?|$*!UDBMQR+^WMpNQK%{Rj>M*$ z$E}`pFlYbd#{go03y-^m2yL*!CiKwY1B7Nl+oWq<(xaS2NQNJg$wd?G&Xpa1&st!_ zSbT?BS_GND&25T3Sl_YECKaTOoOozcblJTwA@9(_Qa>u##?QUOXp`XLCNJ@lE>-n= z;p}Hs0q;u+?%bA9MVBm~E=)r&2;)5CHX2w`5gkpa?Wr|cqCByG@<dD^~*7^@VezuTsvoN&-)^)#ZJr!Ju zThhk)#t=Ui$Me0WDM{Fo>dD^$mlc@AgJ+vBg8^N<;d3GVspHE+J4ecGB2}<;Nb^Zn z7=_-LMFJ&*+een5nHIivYx?*GyLAGTpK3O@PF(L>BKZdBiE5-Vc4`-5F|oLtpDr8O zv0lEpFapz&D_s6!4*t`HqPZq_{q znlr^k`z)qn`%}ZOiTs)KAE5;Wih@uoTq}lh0;Kn7xEOazow?TdpXQ0zVnKsa0Zo|f zg&RF&`(xvsOwP(nXP#!iIRa<+)Qp(8O*u}Pm*^l0p?du=wsBYaxi|b+oJ{bhdR4p8 z(mX*GIJW3zaQGerwY2Ja$SMvPwC7#lbiA|LH!OJE(OXNV6;@j?3@iyBD*ZJPNBr0G4cz-5v9Z+WM6B5D28|xvO3&Nvf6J$== z7NymN6VN?DNa={T0AQavh4CD0qF#Htn67!aU_M=j$$tH`DHV1 zn{*1D5O8$vGiBCCBmZa-rL8%I;CdYEQFFrzRFPmb>^RO}Q!l8xko(s1=gelMcq0^OC8;n8Jls6RMZq zc^VIdl}1wngCVpEofL3vo-LU{blON{1^P7xdh&vX5)f9B|39PGfKNbO?L4AaQdF%j z{M?(;A7v&{ew^H%yte;(A@r|Maf^)E6~!~RbEFBWL2F8uPv$hh4D?N*!Ge#E z=0~6;(Mm{6L9+M%;hnvMQ;05o1Gt5K~+8K_>P5EHYw4Fy=zeH)9O@{$?s8y zdD$yk%Zm8^!PacK-T+LiIJua8zU);~RGlrIeN~>mC;q`y@AL3fG+K3GFedww*hd zIkgAni47shOGl`lpX_Q+usNOL4DnG!u!g#ivPi! zdXnxJ*B>kZZu|627j_dVbtY)wpDYyJ+VF>QBMkEZ>o0ZSxv4TM_wmKxM@KhUV;RVz zp>IVp1K<{Z61xs$^zvz_(A6J(I1QlHw3WOX2Dp#6HazlaL?CCcdz_6``X8C4;RhjM z0$B4e7c4-&S^@KdU6`Nn*n7F&b*Voj9JPd&lWgpzT;EL_tLT%ZlNkoqHTKiPT53FVZ)AL;}=3&q)e1FzTU7 zBghM)cN_x~m-S`zzS+Ssz)-Nv?>_{gMa?jTO3a#>F`)f+D*jrP-Z)SorrmL00rRS7 zI1Q!doqGh!nA~;e+s3;oEPK>W_*yCG@W-FK&L3iYk4v1_CJ#-3DuycRtMAH9i;~Mg z`D@dvt39gYh1m6MV&}4sfGB^r09y>_*cT#nyb+d%kX!@)tT{sf{yzS#KS2L*5BCu& zk6#lG^>tWhkzw4}d*;Nmq<16kBa^XLteInRf8GrR1G#_@? zSxqg|Xo40fQfPcU$tHF@RFBcs2(S&h|4?P1*!24*TIyD1e00bfCp*z3TIY!9^vyhT z4`=36#A^pbV8!B2J)0z7<&%dzTCYnrQ+KKQJ10L!N-`oN_7C*qJ2~XuatB*Om6@9cn$;B3zIT-@p zLYoNTTb5@)QN*6Wf~5hY{GslpN2GTEU_a4l@^86ddA1u+kb^(P@;9{Wg!+i*<$V2C zB<_rC5kZtqs5w&F_T6M|s-d)Kwy z!=Hekshf!)x7k5j`-5BiMIAmqJ+)xMN~8p-R|P4RH9S6!m$@T#Uq6p|T@~o%vfriO z+LJtF@j4=0m|hNPY4E3Zb}@^l4d1})KY+}84@Ktb9K*7ptA}V`1>{b>KWNITrsaEf zChL5E7bT^BT?3~yev=Wi23HJB2WT&8hEb!oP4`tO%x4660$#}3A>C(O>Mj~kiGy)& zrpA1xB{yGPjVglB%vAUXv5IYhFzv-Ui8qt$lkQF_wCTPJd*OTym&C@-=p~XP<E@}sZ9 zF3O$K&ns1@&P8$jw)OKm1btT@W}w>_Cd7)a0_?Ai@2qJChWMVKOLEEnAR~w0W;2Fr z?m&SPulX#b1)dG_z!8gQAEms}1)+2<*4XDtr`kT@r_dog?2F<8nq9>XsSro;y@%+M zW?B8wGXM*1l~s8ptC(eee5#0K(&x?o^8GYcbG0Y6&oORO~PXCreuT z6VqD}w-TUG$plV}&9ZcMa77oQifEM3&YAi5>Wo&PSHB+Z-_Y0iBr#2P9w$l$9{p z(WNPeYyx$aCD}bdLQ|qWC|aO5x`Q_A>2D19GV&2TpxydjEmgHqA=j*;h!Or&*d{kk zzR|+smGlO~bcuy83s%zEu5l1r@=4cv^z(gM1^j=&{{RXodeyrRE%6CP?_4T~0$~i( zQl7W6rQ;&M?8uDgj`#cgA^n@aG5m=p!Z!86GPn%3MHAp6RNT8dLL@Vn_0S?LZ~sB* zB(OU~yOZ}TPbWz70l4{SO>_xvCrep5#p5TO4$%f4MW7O>|YHp7aXWJJf-m5yJ49wT=NH34I z0gSY}t7aV*Y9aZy1QT8Q8Wl5zJl#hnKg!f<01dkHm%ae|Z&pr_-y~wr?9+Uv%<-yX= zN)*4`fDXNVjg)nQ;{8bZF{WvNY!LN)T>6-SK$0OgoV^5qbR_t=joC=X&is>nAgZ=4 zz1D>CKC)c9P|*;3WsQ`}?aCt8RQNT21zFaS^}kYYl>=`e`hGX>t5WIiQ@tN#p*nRq zHJNA&N_dj5n(}ra`x!zhmY6VcG{M@K>75osvL!@_$BbA~I}(GGx2{hr#>*YW&#)uRu7uuA}-<^NUc19_^E#a?-}A zJ0_#S_mLQC%(&!u%NyX;Tza?SdGn*9=y*g6*W?62L;FH4y zk>e$ISKcI*!8eu^P=*rydD&F#NSkqA!#7&x4!>K;>OxQ-A{}ZUBbB`uMi3-Vh@T;H zRX|m*l&+Zyah@-X)$w1|!qP&nUK9__N_iq>rgg59G%=EdeZR0e0?_k5^~pUe!rdU~ z9$dsT#U`Y#&hm?50PcYqw(AM5IW!?j?uzrD>P)X>bP&r7PIy$&5*770C4C_EH6!EkhBhMq|rvSmLY#W#LZW!RNJ-FFqM7fGhA zjY1Dq^|XtzOaBNT${1@DwNhejfozx`^(PaKV{dFA23>gsq}m(DH->9_*c)ZO&W|;c z(R`JQR-|gg)5NV5 zOzItp>2mCWPtd(=U_*fQkR<&3G%Kh_;UQZ1NZ}zu5{czvTBa0JJ6WnQ3ML!3>RT?3 zi4}T$GZWY-d0C#<%09DYd|_y#8H4Gmd4KoL1S4ZKH7)kF3PC3jqmQFWo`nyg&MOz$ zyw?8#pu_u8(-xQIGgS>ZNV!WNOnPukq3Qw2D?${3@|N`~AE#VyNAl&S&R%2_gJ%rV z(V0!1nWbFM%R|I>34VycaUF^ECI7*1-dv`iJT>tOC6omypO`2)_<~YVzV0U#o0To5 zPK_+Dm|6`f9r;7Zjx!yd7Vair)#K+UECrPy*U+ua4Bk2UqH}-feq~g@!lk_}Tg!?? zirKHN92n`AeJ(+HUQ{OAFMewL$5nOATFVXISBkrnGHt+7CMoM%#t(P~tp=naS%hW# zRH10z^Gm~8-&n=l_q`@oEul{`KQ#th|9(1aQ^`DAOEt;H8;Gh6<6O?1{#2839Crf=bWSbd8zr?Qs}4bX12gOy-j(#K3MRa7~+)Z#okV+OUs(uFH(?1hV$v z>09N4(0HyxbtBK;9C?vFgD;O&_&@m$78^W7>P#Uex0lxvFN$pg(0HkTB^a+$xXs@y zuauM%1$PDtV?c zMM{wF?yij(qxOCFd!BQiKX#U9JNs+_2c|RxWs>Pd2eJ;oXNp*p{RucDOMIG`Zb1X<^`QJC%i-BsDyO zY>kGSlQ*b``yA;vYSlC?iO;$Iro4HDtlN-FMuDWF|HD(yP+6Bs<2fUKuRgf?5@UVa z-C8)K|5M<7Uk{~4bdi&rJ|ZCJ&i+299u$3JoEiCYR!aj{6=oj-&>fKT{*8!kV&8S^ zI@X*L`xP~)r%S<>^C1jxcdet}XR3BOhxu(^i*904K$ZAC3^QDbc~p3pLMmC>mAXA$s3ggIfj{d9q# zxi>*@lVF*PL?5xheyg%kZ4_)of3MJnqUPYmzYb>=M_08!9~{L6!{2PL_U(>`>8n3n zS|MQ%NkF5F)Iwk(N8iq2dQ!TX>z4~SvMzwC>*}U-#VcT?=eT+5iwkHsqau0U$n`cK zjBf|-U;@NZNm&isId(Y@`A&QOT#__e_`&@A5#=j!UvHXH0$u?mp*ZYY9nk`UHgH{5 zPSLSAkoiTBg03vjnZ355C-trCuoSgbwk08KxOqxM7$^tX`Qohmn@<&wXQF-ttPJr; zIR->k2&S2R?h~CU6oi0@704DBaXC^&zwS5{&Ogj)Sv|uu(e~6z?v?9D;E79cfFs!A zrtsNLeT00c3=0JC`TqYc(FSp#6hd8FYErOWY=gU+WR-Wg?z{Yo%y>jz)oc#~(PSr^ zoz}t46NA%nSBdY3IhbmJVOv|D?bC?UiL*YB;I9(WYqxay@p86&ZruIhI#vtcbR(4J zYNx0)o;X70c0xX4dcWw-NPOst?vnlSA6}d{VbmRY8AkGcqd9Do5$Sx^)SOEkC!`1Q zd?@$?*KzwJDG3|VxnHNbs-~`+I$JajM+_;~zLl;}8Pq&TD8GA$vQ=ypnNx@eeg!+I zMhK8nFTNOzdh_g>TxFIuSo)mq^g{i$s$<3NpZ*Tbw9>;nQzY}qHGN*(Yk;(wM71Ar z$K>+Lq7T_(gD*oSN@5Cc!peu-l(IVB?OxVni8<@4Lhkiy2WIyfK)pS-aiE_uTj{=`

)Z2nwffXJ_J-N|oW=N_CDx=gsP4Jjx~4gW!*<(Kh`V-YWn zf1EozyoJv>E-2N!e-8}naJHQ!fr;3Yq!fRb)+!c1d7X2i3~bEmw3;~ImsZH&5nrmy z;?t zJzxrr2R%VAzc<>l3#1C+>>DmjiNU3RB}$u#^P{-}xu>9Chit2Hd9{ya-bX}^^rl>_ z>8E=D_q*!&|DsAh;S2^j_zC-Zg!?v8ck+(uSKk%^Y||t}LbNyf#O~$Fen*KS@f6ol zyo*ya42X@V?#laxJdbJ{Kh7rH8DMG=6bo$0B5_3@la^$s<%7QHk3B`9F=-jd6n(&Xx4X#2PUW0hlc0uD3Dc%Fyu1F+*BVIr@F4N|%Zd)j zzdI2WRlnL~USn&tu2%}@wJk3_;utm(8c+Ar59oQHxcTbUcjxVY2zXy{112hOd6!N0 z24Q3JWHvc$+~}Rp|KqGj?wpj%WU-93v#(@|@Bw#QF zoCI~lg=l#|anzij4LHQ*_s>y9*kex>4TOv4>rV^h7*HB051cx*o`) zPW4f#7gbH92(ep7{FOrWr&7@EB9$DnCV~u(2XOR}&gyaVuq`Rk0zvR4vzOWE?eu4B zzG?tMskIfyo$I8j2lV3dXhIz)am^R_eSJuQCN7m={dFDoo&tY2vq4=(mA{On98!gy zXaX(ca5y#CWA2wOk^#9LI+N)do$Bkr=~orn^LF9BGV``SUyq^@dsuRLbnn_haqCyu zP_vN?Z@4Hg6#)#p)IzU=)hRH8x55WoA1rtu)rZ`Qqm6hT)1V%fO0M6PQ=?dR^8-@H zk0ukomTrlHJ&bq=#XFf=*iQmdPLE?Ec5U{Jzc_$u5lpQ$+T%Dc;vWa=&yu_Q8j=k{ zAf~&DLTWl^dg`;{w8>12Ud+?1fthWn4Dxe`u!f?v8}&y;_+UM`$4 z0GX@l=J*~c2gar{>9YfqjCT-3REyf5#kzLgtU8+*sQ@kF#U@mIIUw~krz z(!?-?w^g*|YTM&Sp($;Y-9w-9ZGB>>R@(+}-MQ7?lJ+1}YZ3&wXP=r?-zqHI-9*GP zHBasuhrN5`p}EqYOTwA<0IouDLxitZ9PR#qs?`b4Pj063HH7SdPIj`7GRVsnM-bJ2 zr}S9WHnQdhh_pn1AH(Hek4xi7bLGc>x_4 zjCE~Tmbj>Z`tmyirtaSHrX;)!54T!JY|&Vl7ZLP|LZf)XhT{fJnCNx>!&5p3Fx&|t zuVU9z%zmYv=cK=l6-JO{Abn~=zpsUyY9rR@iG2aFP@8*Ym6wXexDl643^ckuQxiGe z8;W?1{0m_Oxz9fM;r0Z`rgoVJsn}Y>x(BCeafi8RLfg5Pj}b*-&CVXC3E-!q#{T9` zauqd)_Fl^-uc^Jw0L+#BZfov9JkK}!EdDnZQ%kt%nJWHU=}AnPzP`mupeTBZ=Bm^P za|PZZDeZ9w(&FyslBAx>kpc-;;=L(HGiM|YsM{UAbBSBrADNu%Y)`)>A+`ekcD!WR zn8LUA*Ia$WR-R#`a<1L~`P|KDtbXiuR@Z}~pw!p)yFsunyOM!^md|=if-j8YGvl~( znrSHUq{`}Yi%Qle6>=Z$tCUP~;FWfOjUXI{Qe-fdN%VvRI`^@r`r@(NDi~)|yziXC zJ@8Oli?cYaAM6v2_l+%E^?wdV7%hxVU*5`n>wOlPS=@S8^oykhsI^z|6gZ9Lk>SAo zk>%k^`?L?;_vh0TKBSQWBz8CVZ3hfg?aIvw!&@Qe)$3;F&_eLa>+FK&uwU8(7N#VL z?lKFZ;8iQ*EEYtuE299LFoxpIpYOW)pi~MDQi{IKqv^WJiW<``3*Y^c>yV z=HA5Vek8%GobUhP@u`Ka+HTU+)|2Sb68@Jq)5w*}IN5)dI-Zh0Fr;t5<|Ot=#WSqY zsosk2wH#ys*VI6KlUWzL)!Q9Ni46cAhM2|y63y8SjZ|))i;ZO-O+GqR;dJZxfD2e0 z-^6@dosTLJ5!@M1L-{!nhfH;QY`;HNr&dbpPBq)~(o zc=`ZG`Z%r*IMGUnMB9as9k}bS^00A1t#j!QdG=o$F0fQ zWmWCL@c-#9mIyqFl_Q&nlMkB;Fp+n52^$wWRkmZE-`E`u4}Ro+>K`eEG_z>d(s2^`@@!G|fAsMCG+YIIj|XBn^oR6d@_ ziL`rk{A(|~k{EBcq=3$YA2o$_mv(bdCa`>aWl2>1Iu@mr9H}162 z5r|#8qP@-;x9D!qSnOIf-Y6aGpv`WvV5;l=L2c`ek~)ym3n%4b#mul|~wwI<02-YF2)OHo`)byjj3rxtsn$us& zK{#0nv!-@T*p0#ofBFex<{^0t#B2xSAIU=mMJSJM^s0+75#Twq{ts_QetA=(RJ_k$ z?=<=GZp5rU2Wy%cDeP&)#v&nN4bcZ=I?nRb&xh2f;AGNd<5X|`qkzS{{~>st8$`T z!D&UmTjAlm(1yIEC3u?jK<~FUS=*R56gQ3{CE7fXL}8p$cv=WnN_{d$ffh;zRXmtJ zK_PN9{u2Idi6@OZi8*ADYHhX}1KqsuEH5KL0Fp&Eht&u-xOWfyZ8MVPrz$o$_|yM2 zWLpuAog20m8hO;bk}sX_6&C-R4j<|CtC=|!*m(Y-b+ZwYKZ#{C`}EsU9+uN_Xi#Ht z*kB&A@VJonsKl2Y^k*6pH61{7@Xb+hLdK)ur!a74?(Wl1cm&%U<22ZD$Jjq1u9cqY zNTk2aFY1MWbwRi@2`K9Ey5TA^wq?YzIAp${y3klFAmFQ0?y%I()1Y&Q_2hd@FE{>q z`W^GxcaN2x-TNvo5JvVC*Tqfv@$RxZcWbgfmVQBi_awhUGCMbRS5a5MU^wTwpNLCA zW+YTJs@|~QaO|FYndRqr!QTY=*n3qS?_;I`Rk}G}7?0w{_+D*GpJ``|9`zq;;t5XD zbu+kgX^Um!3`hShx8dZ<&?sv_aLLES-bIX-#ZY;lgi)3J`mI<0sGxd&^jJ$uql>HV z^B=?9xVpC@CzIW7V(6Q?Kv|%p!*3>}910mfYhhBl-(SeM;0?{e4IyM~&WM4A0 z7>WyWAEZ0lN%ivLeQ@MhJk|;;T$Ca^Mi)3WC^p8@;UzdVyz(zsp?holK>QhAQ7;ad zgZKQIrtE`27PCv{DX=rl2bQn6X|J8#r1{{aLK)KRmYd&>n@3uvh>bfaq0DpIh`~Jm z+ql%fw+Smnrj#0N{Gj`zU*AIbuYLhK4}6%Wr{6NqD04qc375rFTX@c1z*&BV@s|5W zxUTeA^j%41d}RoN1Q*NKHu)OQ!T&(P@ZMX7e8KC}inc-{dxp3ShZ@FXu?lk7S(n}rCTIZT@rXI8R1-(%)p$2g;aEH_MS_#n94LSM-|C7p!)p9L2r;D;VO~}G?}FX* z`-L5K8B?K@g#bnInr$nNs;eEG;VySIkDk{S>m@&0XPA(K~oVXOPVDG7_po^;HzDlb}L{(eu zMl()TH=((_Qa|Oz^9g{{EW`HNot<#xIRw?_Z4wCtKKWX3eTnYC&$`nyXfwTCi}N0A zsBn=mpP&|es)wQvMKtJM1#+*dhg1@>ng5&p2YA5NuFkM3YuhiRckmyc8TU#Fc8d0X zs--%$n$$bznA)}gx6w6_{5XI^#)cb_ZdPe=FRRV{hga^?MpaQJ{2!j)M)OE=t~udC z!e%cAQn$e73Xb?ptgIojz8|4Im6AnRN|5VBXxQ`g9Ap%U0gv8ZhA*V$>wmv|3D$36 ztibBvci_I%GW=?P90MN9F{>fIAEW(U8ei?5gI_^V9@DL-CgQB_L}(Cn)$0N&2eY4q z7dhx_5qzJ*#U-w13ZI8Ru1Fv?+%2u-KUTgH4+rw-3n4~co#hhG-2tuqiIqA5HR|h> zk$g@#O~AkPN<2i0{-s^o)8D!k?+ol1{eE+&epq>n`ySIoL~yg{BT$ieK&K}X#T{fSrWNqLK?TNFx)})z6!Yww_~}fiD^h)N;`~zoeJe>RbUQ|; zEEjCLE`VQ$K75Tku10CxL;TlU4bcL|m#@3+y5_IS;7d3VetH_sjzE4(qKzMPJ1Rd= z*gBj%=aJluGe9ZZO}ShGUTm0}LP_Je-Ph$XdCS`7=+EOYU1qy}X*^RB1reBuA<$l<_w663{SDq0R z2tRQ@B+Gp!uh2@*l53}rD+t&Iv4bQ&SK7OB{$o#(Yq~)4ThVJD#hWo+{&WluAdn`Z za;2>m_lcn|kUR2JzapT%^Xr1=u!Gh>=8z)igvTQ;^cy$5S_gel81T%$goD$n@Q z14pvO>%1*NA|u@08Yfcz<=gRf{ucJ=nt!rwB$nl&pXro8_TlgyL;uUdq?e`83B(1O zNr}0OxyviVY6(vSY$*QSPS~u3KFmOuunYq@{*}y484Bdp808al_{o+oZVoj&C-`&_ zCIAh*tXCus;pf8pswAqK88guC{cclQbs)V~5K&lH=TaFO%j{Z}QWXm_G3y7c&08{sufdrss%)MLP|@mSWz5WH;Q`;QNf%W%sjC8@ zlmwws)ALW$tjTs2X;;jFyxuI&qEe!>Mg%X*6P$R z`Pw^WMHmPEJx4FDUrW}@$|aS3P|)Fooj}V`r!Ff1frDN0QX?L zM1A%m6{d&UFKM@KzmNQfchc8?qcc!V^QR#1gyw}Uey0Y*^ee{8lFs}7r?50`#Vx`Y zViYKVWx`M#-BO3hyNga}1! zY}WWO;nDngF(>x{5fsA?kKIYc*}+2VRN_Xh%?J+-I)V2IKmftg;^LB5=cImzYY1_c zZ}0><>s?R%s3(9G6{-uVTN&p>&e3P8dZug~Xyfjpdsm~8nDC9a zdT*Dxwi}ij3${y{zG{K}*U*)bG|EdK6qZ$G>>e#QjKd!9PE^STd++Nr2HG&9v=nME z`D^s)9vg4&*Yz!?LWh0~I3Md;H#DUxq!Rhg=-gNY#Vn|eCVh4y zj=icD9xuKHMKZc$`M7hH=P!u~j$9ci>kN)_O?Xhsgt{W-1d{?uo}hKpmCkVWh$a)8 z*R%0r!}eq+;~x3j{%ohl&fhJw1s<;T z`h5Z9$a7nq#ohV*U2+}patr%98A8TxbX}=cKYyg*8N}mLRKcL5TYCA5Swwc&)#i`T zuPmT|7gUoF|0iTrj3lq>$iQ#B44`CiB2YEX7mzw!98y-T4bv`KE$w>?VU7Di_`8N&W-a+c?2K$Ak>?oa>d{YHyDU&(% z7yGCL%oQN@UAuBgr~LNpDe9oo0|AIMYkeJ`0HF04FmRT3!G> z`;2Iz8#@*-#=3#<`@@>YvBm zsf>7o$&KX>z-~w|zadwT8FiByLh4at-3ys4P3;5{WBjYqTvARa%HNu}t)L+Q{MVF? z;7;bej9jJ()W<=fE3QrM-mBF4Ch$g2YHXb#0+9W7Z)k)eP%t5qQR1Bf@JHsv&yh%9 z3C3|NdWJyJhf|*&n@eI2ozRd>2Zl8_S52tZa(p~)dR1tqYuU)Ixjs3r!en65F>pH$ zV9}-)YfDf_mFDsv-m~%hbj$ncDvPi)f^Z-~w)|~hplI<#rMgrD+4wO@z_Cj=z*tAz|4mlWHm_nyTHsP$RRKht&>c4J7zibSs*@~Mri z73L<#4H(%v9FPxD6{K)HHp3SWvSie6#g5;UHiu8^x9Nxc%TU?rjCqD2A1pt8BkDXg zO)EBi-Kt9~Z*=_j)zj3UhxWKw!zw_HPk#)NN z;lV3>S{#t(nk}zjXtE1RcsP29E*P7x;2pJM0x zF~!kqoAUG}c2ttCu}(Px#Zp!4zx*B6-Hc%^X1~eYUxL;*n9Wlk&2K55x#exRofV#<((81SMB$|n3vf<^>lHYJjI|9lZ!%hD19MbVSi+trGTPTXNc~Un?-0$D&vHph*V!-cK zzpJ!FFTWnY>{IWy9rYs93|MIf(xD`@UGZDNz}U$)VYAYtc^HEjJQW#Vyo$>l#4W8c z6*?H}?}wbvZ>qlUZY8`jlx%PTEe`2Mdh2!4uKt9QPc>P}a>K=Yk?I@Icejv^r2#b? z)v~vucdE^_>V&JLS7E+?u&V*A8qVtj1veeK$+#IGl(mBC<2SgYQ?_$PKMH8NPr>q- z`mYixz)uJBOPuDZH+r1wx*~LSq5HM7B{)lgyBFI2M}3UW#gLv{(XEr8Y-_Yad^Q;O zZ=`aSe`|s|ti}bc)@HBg&{$@W&^|8+(IgFB!A-~Ie1oozn?gfR{4_Tm^ zOT}oA$Buko9>?xP#XR|l9}@o98gK~A)V!da^b@(yg05RYUhX$`vNVP3s;&yCnx*?A z0ealnkjfvkjq8SHR2c0|{>PYFqIHk2;c`6*FSer12Ea0RinmWzy)30$rb|#^6-NE5 zgTP&?Rs8x{Ks(9=dUc8$kfbh}wvH#Q!4$9aqMI@tPtV%)qyC_0M{cJ<@@43+OD6#g z0slH*p`cO83LPjGH1^B(*JtnU4(D)*@>gp=B>%&Uts=cgVS(pg^H&#D%p?@@K+9ja zjTW_MEO4iQ$|3&y1_2jllS&^@Lf2O({5ud#NVFGSlQS&7K}Q&I z>96c-QJlUNg*&XHUY#pAFUkqi%-47mV$_FA$_uAo(3n{tM0n;};{@*sVB)_k>u>9j;`@5ZJF^a@Mq$1q;C)ilOqHDv}^?kCRK zS;oxn&c=(&xNbU8FGB!d1ivj0On7S+Pgj?mUYugoK=tmXVn^uOi?hoop1fX7(W^ZS z1f7dz3kJY8c+#gpyy+sbTB{aypsC=0c-mRLB?~4d!h4Cu3RRQxwJj6kVm`1?b*Fc) z9ce7|#6c**QR!(d=#dS%>KQrFrU-)G$*^ID=kj4=U32i}X-akzxiRf){!ku%r>c3L z`AE=*P=M>9S#>q0Ndx+PuhpuyKG8q-c-Z;Dq8?HgQ7LLHFIiU3wm(g{^tfK!nB@kH z@n+LoB)vI8TdMu~Vuo8<)wTQnjU@Os>`NVCZRn;zBczL`kE@Mm$Crjj3tAdgvcBej zcsbqGAM|ro?K26pwclBB882I3WEoGTeqr%H0~@4N`}}OI%ozL+wKSb*ZN2lVq?|3ZMjaIDYNQUXQplhkSWGpiIHgfaTBOmDBeM_ow1vU}4M zG13ZH+2fupvYB!;+Hr!(9h#A%%!c!4m%j-L8J*eMJVV$#^wjBgkyerq@mlPI%|-)p z6{DV?etr3@r{r0FjeYfSZa=tTgQh)O?dw%#maDmin#tg96feo(YEOkTZ%4bP-`QJ} z=#x`>qf^6)`X20CA$$||?&Y`O9M)Cl9qzB^+zVK;y@;OG7gkd&w2h4-wCL*Gq5bj% zZRV?E^-^N~KP$Az4F={g)AX^~k)fFmQgjdsbjPy#lHb($t@Ih=sM2{@N?T~0^1C&B zWoof0YmOF{eTvWD@zE6vtg)@B19sE74Or|uBN$=$mr&lFqH~5Z*yPNmLWZ93m!~v+ zFP^P6KSxnTKpYQQ>qvRxgIk>4W_*Gp?EAcW-EV68vI#bWxud30=u*;-4D`2pYtt8?B#T$05gUBry;%!>|E+c5HbqIYu zYm;w$eb#RVDN^O#uI+SAoM}@h*&}s36le_%jPFL^?->GOebgSQHXG-Btv_OET0E*x zip&Y0jUGCivh&h8gM==Z%j6Un2*L8i3Ct{(d`$Fn-o=&C9?&FkaM{-B5G9uadLEYx`j;O`-P{&_RQU&-B@JUjQCa`*F}RE@vYvm9V9 z->BJlVzDJ*0c7h6DLfsDUc-);zdf+i0IPTp;{e!qK3VTBE%dZCf;F$E^s|3lKG%LI z8ii#B(eY7<-A3ipa&uwbANs(0pfjW+&8~K3fK5;~(Ct{ZE8!9c+#cUVz2x})J-}_V zYVq$M1(4`@V$temy1?qu;#k0S{?=Jeq|>pQLP~%;?M!|oivQ4rZePC=G?R##43BeP z`C{AblD&Y55*r}h)W$6jQRl){kK8i)4T;5VC%SN`Z4(i-?K@d(!uO;jxsoh(xau6- zJh?vOSPLIX^b;mDRNs~TlXBD_$uoM_aBp{5z2Na9z`YmRE%qOtDzP$kIIe>_q4Vd`;&b)KTsTL zE3}C{lEFuhj#x zr3*#F4m^P6?gpbe#rK_$4+?P6VDRI%f%CIu1#wl6cACF;+y+a=fOU%1_lvcpgMsh+ zquJ@dI1OfXa#~*HgHpl#^NUzR1n?N~!@u{gyz(*hjsH17a+l zm2a@$w*C14f}U_MOV_S@lf(r&5;OVsPIqUF*{K!hC2C&CPNdh%gS4@aavLUjK}7z* zLNPAVSqip4>EL?~_X{%gW&4dai_)zo8|E{){tPJBsHeFh_J15kmy2l_8Sj_$CDGIs z@GO)@rtdh;KQ3f8_<)42LJ|%T2LB~9ukvCm)a%r6DV$0CkhlqFARlUJRN0N4{jTsI zUaN&!1**@Gc)L3D&t{P~cNT%!J>f}?sd^-WsXXaf?LAn~B*fJE6IrZv@rc+I`?kQg z{beqZ$G@k&M$J-MOuc-xG=i&o$3; za|{3JX^v9vg9tz0AI(*ZFn5@*-FGsjspzN1mhVrtigL>TxLB>5iT_~<@eCSeD+_0+ zC&WWSwm5g(om^+pWGVLlI#f&zmxSi|q<2qFcd}Zs#lZqoJeFx}oBsw+?l~7?Jt~zI z1j+9L8e+sN$jP2(hWYc-9n?D}Na|eE9^ZHdR=Gooc`xhpEM-S#_Dvin)a~BLztxU^ z-*B`_eA#Ba8gk{)tqbXm{hodJ`xN+j!}i3&*ISxVZc)d(Mtf zTr~ebf9~087&qp*5SN)`MwQm>FRJv1naT+~Iei_X#;;v{vYNu3at6=7L?sPH59i!` zzIvd5!nu)L*Sj7Kmy8PKtmDR+U;o*QwpQM4J^wV^3IhzvJeMpzseAF%l+l)R(2PxR~mHVo|ac(LS$_9UTLnM z{*ljBXy+rDip9a3_>C1AE*?=d029tU_L(;R>S@VD1+HRj2@8b0Ca$@$fR9P=L_zu_qMf3MV=6zuR(Y^+T__p3HOLa8l$b8Wfo#7xP1AYF7{v@w#;G1eu+xxz*WBLYU z%0j4TAp9uKD#Z9U(RDc!c=V>x+HDHKsq*Qf^tm%%6jynU;Kcc(m655 z4!Zsr6$Lm`2SV=%tEDky$m$+fuLTKtZRGGun4Mz=sY{S|o`ERCu|@9OT;1GUciK1n zz!&<4YncXqd{)`C+bt4LDmz4p6sxx6n$_z$ufKn3ZQdSF=}9(T`UHypR24b5ZEf7m zp1Pg*;mzx0MYKEMk3Rp)!B@#>?iN1YTU!0c1-DX1++IhnOZMN$`=!-yNqn)X4UqNW zPYeB?E;V*DE?KNSyCJ7K?oZs>^ti;8V4)!x`&{cqBWCYt^UqiJoF(dnV>2B&8Aax# z*H6L6*zF9!NX00Bh`r-*!)g?e+q+-K_Ob2DWbwrf(C-+220J!ZZ(hEsq&R9k*tL33 z*E9F7$B>UJr-~hCZ}vS}IHs>^O}z}>D1L=jtTaMrh+G?U#=U%d$P}Nc`*Sm1Cv7Y; z*Cvi-kB;*4{f8$Pp`F&R8LhJfnr-~nz+!Zqlg%>SkGkZv7 zRg9bWw-y9K2<DX5@0f5D8y3|T$NM=Oya~wR?4Hx5iRI;}3xNycT6vIQBUazx>BOO}?@@0CL*`@!C z#fxhJr-k!TOBAdp9NUl}$ZdrrpXEpxQqXSIGCKDA+>mznt7DQaA5AYOcYg<@30gG! zLpA^;rt@BggeTVx5#NbDWk^NtxYYO0K2{x5mZ~61F8k)zq5=HYIrkCs*yPk`S*xZ+u^jbLBW;?zVkKWCkwQSAlAMJWX zb&d;tK~VPmWT_DRXF`uK0=;T~S_+2O_1-M*TWU}7p6V%VNuPUrRhs}PB}w)+PLE*m znVvieT}NnJ!xiaJ*C zul%#Z`nCkD;XtNQX9DIaa^bK?6omd6En&o+V#@&9h*m$$?31Ki0aYI^Ab^j$ln4o0^^&$4n-no{UE)5Lx z{&^=M4OEtHa1Dg7Ph%0z4$cxi9;Dl)?-E-o#{B5r{OI%kmKZ3bgZo)mi*)}wmaxxM zVO-_gQSNtXFsb+*1vx9Gnx;cdP1lER0Q6y*>yF~=L`f6NF8g`KO-abf-8;WT@cRNa zebyH!B{JvkXV*MtqVbds5~J2(w7TOjWUVI{ni(1@%7C3E)@d$_%!`kQN~}vQZi@@1 zgPJC-Q#>e9mvyjd)*k7oI1P>@Q3wqiA9nD>!S+sNEQ*nDjZ z7d|^|vpT$VeN==#W%r?v8&4a-<7x&>#}f#O)!i9V+n4*&*`zDp_*RM=`0exBzMj_C z*`#d2#B;(Johk%Vfp+*bs8kaRWjdVoYcDXVKllLzgzq%vRZS-3Qzt0i;M%vhyyO05Tnv=YExiDdcpm% zTx!496GZ2}=XNM&PQ3W`j8S?A|IpksB)A~L)tYx6@b1ub9t!jRVwqhl{^_GK%m{PXqYgcU9 z{g#EurIyJryG1_KVJu96?9u1^B&snK1i8SKJ!&x)6S}I;HJP3+JncpXZnq!dGo7e0 zAZzl+x-Y*ThpF$I<3YOkBXyeYF12rF_iTdi#2ozBi5WijP&Juvn^8%ME?xW_{RldK zGI0BAtZBd(;Ydm#)gMuk5HTS4DRq+}D3ouKkf%O;hmGbD#0~RU0C4!UxH@neqsJT^ z%Xpx!TT+N**J{A2de7$PY)1PxHHH2pb)Dhn7oShHH=H(Rvi4Syyfb>Uez<#Y*Q=C+ z|4h=37|(U*j8Tp2Q(Fu}YNt5$gUc^q>9rrP{m(cEV7?fAOc{LP?ai!47b${tCH=Al z+Wp9?>ue%W4W7iUJz9jg_V(mNF z>yEcLK2KFQs--*57O?I#m~ae7lWv;@cG6Ai`1h9ZM_i2G5y=Mc!sG1mdp=FRGI71a z?HD><+tL{Tob4Vb7c<>P;hu)kJ6gb(nzof-cOjL;*ZRf98O1_(bxMhD{yeeXcDPq$ zRJD(GcSE_nrmK7^**fSi=q04NU+UUS@@lMcO%jBfy6j6{$Wt=TW`{p}J!{|UpMYY9 zrSb^;bg?iQBP6^pdABhQi0xrQ*=bewAO_O9U2gjo4o z0dJ!Fg;7XF-agBGpRA?TuF2ZyB`@%6F zzQra|rGg1ZLLUi0t|BlT1QoUgv^)8>n}A-EQS|oT*F_(0eKe;z2nwuXuSyqahAsFb z4cwK?F$(@#!NegBfFhwIT-V*B1}D|9m~8}Y2%Jj2lKk}9e_W%U>%*_gbQG0qknXCP zYu2*~HWzV1bfC+^k`x18HS70vVjrizwq)n((hJI+BsQJdv2nBg?I}!jf@a-kog|V5 z-BGqym9RGg)8;TZHFHWV5Kr~xmm+Iin$Edb(M#*xe6Lm7ol4pFd4HMfhO`K;a*6FO zzv?i*8~!>Zp8jxa(vz1fZkdB8!Q%B)xyxI-kCxR&nzWWdQp8r;Gs)o1Xeiq6taDsT zy-3xLVP^;TnPkC`Iqb{D;|W%%(ium3qS-96{H?fzNHu`~ocBW;X`7H$Gkb?9=il;M z7geLC2JRxTe<*{hR3K~f6!yEr#3$X z1Bm~Uis4!TC9*u(k)=#+|uBlKnv(aZwo5u)MI~61X zR))QL8xhQD=gSed#hsh@oYVPP8Jl`~net=L-g=2#m54i!WU|Vpl4=}0sV1vIneJr& zqy9&I8}GthG8w?3@`GCMkP&-f^SFZ|QbI;e;fQxvnacRHJd><*llfCEv<$E@f4sh* z{U604AX=2QCr4%R*myb|(p--+izwfl8FDC(v2fr`nNJ00wOu<)RbS48V}TZ#{( z7a#e%uRFz=KWTTuIl?GSi?T$+d(S0jpE_kCE8DuB%$fiGkS$6S^od4*Vi`lwxazv`&PR*`ormFbV%Td z=e+rTXT%T>7e@fCm&+A%zkb5LGwtI#g8jWt@ql62mmMNrpu9t?D}3L0LBIbrq&2%G zUAaDJgC4YDB9D9H2b5=@%<-zLtmo2Oza`u*9yX6*DZw6SOO>XHr_F@iEPjtGcNWNw zb~n>PBr62cJgOmy^#XQT*axlrkNl+5ji&FC-GOaFH$~aBp8Dj-Q?v_;5RGVW&6>Hf zVhLYn+KRrRtgj}<;2E{!SVHz-`j;B-^XpWXaC*z|rl~P&yQpd910aL{a*tFcJgTxS z(q3OHjf0A?AztEqRRFSGT{}yJa@z2`d(%ohQc(VsElkdG(m~Ga$f#2%6Q}q^VOf?< zKGxCm%ST%9B09}L3suwQZ+B}hsbf2Z_B%=16e{bDJG{xGtm{L+04w9D(LG4hg?48n z^+ywebYgi8s($01C~^&CN7$jPCr_OTds>j1od02X?TmHs^j7O9n4Z|uF}rMO$;?g@I~p3|w?Y0|N?kg+&}|la#%7-dmyVoZ0SU5Y|AM0}a5l`f~~3 zep<$St1oS*VXHI_l5~fn+5Z}&JPsKi+O}L*(4`!?S9{xfEJTEz+-W;HUhFl*iD`mB z=`1{Lp!q6zwE-; z0CMdy&=oc)+z4KEuW-}{i?B`P#Wp?Ca~CePMpl*BlP&^dl;7;-Hu&A<-ASP$5_ss0 z;gpIFES`)eJqd9?ZzlORn#bEA#49D0qg5EKPxpU?yjNB($H}Qf%jgX+fZ-*ehzXET zzs4&ad)y8rH6U=tv0@YS#BjybOm<^$=1g~+7nO{`HzR*swtfuip-WgmOdP7d`4%p_ zvKmw=!6yNdMLD1gidd42!DIm^!kgD?cLy!uKZnXrgjVaRgEr0UIy?Nmx%?0mT)(64 zD!4{Bb3*y}js-@a9r&c+l#|0Iqhl*`bW}Cr^d+g}rcqmc_{fCeu8!|w#H*yYgo6_E zK?qf%-lSD8xK_*fr2=DDTdhG3tv<7A0flMW&vBbZ_G4h_Z}AzQfMA%C^v@5=1G&#H z)*)%AgyRnz%dZSFl?8otx|q8bc;}joPzC`^hp@OJoOAZUUnj}4kEmvb@MPWTlgrzy zwoW(i%rfa9O}6>HiQm0Be{%g4Fl8t*M}R_e^po7%p4Tt9(`zxkn;ma@ze|@M*40T% zvdW5oX(1-;y_pT`?eQ_an&13k@#_F0bgRHRx?t@I+iScwZJS}M?PdvxG{)?9=P*v@ zwKdEfZ=aKC-gR~CKt0NE{>(5(rtd4+V4{@Ua3U9-*#S5yR?M#R$vBXMBm-Shw*9hy z$A22U&+{K1M4fI4Ws!@^z_YAH*m~>QDt=hzZzo${Ry#hi;C~&rvQ^J_>53)0mr-bh z@v{FpGcvNDyGr{HuRYyqNJLA(3g1-SJqD*M(`_b!ZMub@{Ilv14Y#h6M`eqX7 zg)aOAPjWh$p`;wp#CeiN<6*2fsy5{Y`_wnHa|Z3me8D4s?jBstB%c+_b+C)JYjbW|G0+(Uvf=_vHpJ@F^r1IeK|2QCcgsS z-B3bQz+NC}garLI1)C~bC98jO!}&z?dIpCv&u%_m{Ss{~LteXyWpcO?3t^3yR~5>- zumo2Xf89qHJp1**<90Rkb}txW9(p^QIc)&wF%{-kqB||l@3d3S7b*Fug<_8qbVEL2 zoRKakyz+m3-)U|XLYJK z2X8@;zI?joGe;Zs%O2MbwyJSZY=D1y3U)Qzw zGHN=7-N`+f+Z4!d$JiRY`d+Ev-EPJWMJ})OxmxZdgylTG_2BdTWU%WE`cBnVAr>aX_wR_f;77LMLWETM%`S0|j<@qfgt&1se^RFc9l zFnqJty<7G;)o$%PdwUAcCTF(}Nj{b0+E0YF4Q^sB;D7gzO8QgwXYgWZ9x9dYI4x{P zm_LTC#aM+=wtDA}>@7{x-AH#gsjd_NbB>ki{{RrQJvPfvxALw;%Kgh%otRNu35xuq zJHyUZxsR;DO>)?6v^fO(Q#I7ihjg9IU4(7i4QK0;AF)b15nm+)+|ld(lZ3I;7S0Iw z@iPpOQ^w`y!VSxu8p^%#DnW9^zIIM3?S``j&AJHJW3kDvr>V~AoGWtlvXJ=ntnF#M z_&$|-Ve^{LyyhmaE(=?o68Ks?FXFAQm2e$bucvcb{t~br4)Cj9%9zw|cvJjJwYjNi z1H>L7Q!WjqnDZsgYxpz6@_a_|bRaG?+jF$9V4}ZU$ngHsoKKvnj^E)Ahf~5{6TI;? z@Y^eb%38dG#ahg|=BrkI!TudBvZ znmY00=IL`=9xCTKxUb z%U^hW6S|H58))p&hr}Reyqsp&J22awlX&gn$q^sQqyGSfku&fjZ_1}43ApkA{3$-c z0&*f1;2xmC@djwdS{6TrAo!+Jg98u3q!!lgkWf-Km1g7pSgR;$_?Ys8gkktpC&%&< zPRBomKl>`xIz}o)hSEL^LVzP*h|V_el)ZEP5wv8@BJ;qebS z{o5LAd_#P36aG{~ZD^O3sT;*N zILQrK;j9sOiE6C3R(T`JAC&=QWJ%)dp`E*^kHs2CJRH>`Q{lP#Lf3$TU?wTt2)uG4SqJTWaUPOP4QTDjMzAGqc$^GJKPM*Ks zH9%>bn7_U%C!Rcg@l-~g=*E!ghaY-?Et#YK@TN4e01DSVzH!m1JnMn{Mu0b()ee4Ds9McA;cFD#T#n|M z_RFt&0N6HZ&jO=1NzVeZ{@XYllS%gZ$E{KmG)|u%KPddEhfa?NSQcswQmkUyJMi02K-PSDsD6n(sa>-0txS`d0xopsBB+ zqwt<=)}=`styg}vD;(ycBbwBU4vVEo7c|J~RWt>M{fa{#{l6_&Wh#1B<&Dy^2;2fX zRc&j@fioE7&@(ch8g9)(8z6S8mb3tn*%@C4fn5%pqQ)aE#rMkkPD8MxZ z@!JbxywyR}tdXRrWN_aS><*!&kfSEND(_C7+1L~(74*KLYPa@mC{w^09Qv z{VVRUsZyuPcy(Rf&m{7hm+lkzQVAqcfC#SsYin3C3NPX+vq5LqYW`K*%$hRgea;k_ zTd|-d=b&os{HsCH7L``tpjG?@Nk$%-<4+Ok0aDjgxQaFD80lS2hsWO%SYccnf;*Mu z)x8hHkEq#z#7H-#-lsmu`xG5km>Rw4|6&+rUZG#)RrhwfZD{x#Eb&!9iGr31~`8q4ej zZ1_)F*LBT9>~USnvi|@8UMuGdPl@tFbr6o}=a9HnLVDM^=zcAd+r^r6`gF!ixWp?y zKZVa~&TS=j314ICmhq*XpM;ca5lt?oX&%UdKYZ3^s=g$Dh4(%o5=#mD(O~`6t`Fj0 z#2MSgVi6otq!yvDKfT_ywC{;puZcVs+9awXuyM3t^{!v6LK~V#4?3Eo$>;cquTO6O z0B-Vcp(o~!ZuOo201366F}jZq*(qV4-3%J*^=%Ks-XHMY&!2BJ_a#YJHRXc;07#NK zCZ1=3V_*4bFe|o=SkzwW$ySS|?8|pox?Zf{-RO&PCUA{WSmDj0V)bJXpB zXPp|s*BXVqV1x6#!oGRE@bX&xK-IL9cLlA2G5-Kbl;v8qb-g0~)CvOfqdPmF1)FU(wGZu^8KV9Oan`Gv z$C)_T(!23R-Tk+da8$<6<~pdxTRF+Dhv7x{o#U-CK84t=b9z68^-mGWBwAIJm$M+t zBx58B(eU-YtKkn2MRhHtmX~(@q!iTdL{6T|K)Ai}mG+Mut8U+Fe!p7jd|BZ4@RhtC zebU@CrvS%U-Urkte;SQIG+uqi;7r{zYpVEzD;*VKmhK4V5^wuD{pa_pXQ57JXM%L? z7gUc}w$#bvJB9*d%djV1p8o`iZWE>lpn10J3DdcOtx(LGkR`LYphdhA4F# zuz%ha;r8Av@lKnoi!Dz2?g>M3yNDIzRrc6-DV=q>91pAX{{Y$N!#aSCVDRm%J4Y`g z1Df-%+85y#kKkVq+Fjackfr?R4j=)ztV?ZwQ=9%`mtXhr)brll-Y8p}nJ!dx61Lz! zI`Lk1;X6xHiBV5uz(KVH=VeH@77N}y)(^ycZ?JgdP>Q+j_4L#+3aoC9dDF4zV^Fjm z40US5Thicj=gSBlhP=qX2AiCiv;Fn1$jHN#`lrC&9Mv_iAjJ@d+Upx9BaOB0`bUH8 z{3&DhSXfOwi-(sL$^1Uq9+RMXU<6py;8&o3X-6KuJk;}}^2pmxQg$=tvB7xK%6V=f zjtM?h=o+ysrnrjqL2(dM{p#vkAN;vf!YguNzw?1N?4Sc>fim5BJ z+QUu77w;HG=N&6I#6P{zE=c18tvbrD(D!0Lpf<@9aT@ajvM*%()vy~X9^w^B;RX%6Om@@he?-D4hees!DH ztU(*M0W+U!@@mi8JF}aVP(0FI>FS$4Wvef5)bht?AD0RR1HEPjeX@O)&Pb11$+~g?0<|5y)pJ>QOUl&& zwPNV-fXAFwl(Jb4RMthY{n)E9+({mGwKTw%^3F)4%7R5!^KfuM&1l-{M+Ia6)@AW4 zF>cf_EdeyM0KGF;WHTmNbOm9OAyx{h#l5{4dgg8N#3E zUlv_Wn`R($w!Xjpoh6oUhFWj~I1T*k$HzSqJFu%(dcWJ;e*pZcMxg%y-3GJsbN>K5 zze)pKkNISOD)CQ9)sFrD0OyGOs!@L-{{WUN`Bq9xbbsZM{Hj3rJ=YZl8e;hOfEr`n zss8|%U~4~g{`A8%sn_{X1=Db+Kj^}mE|GfM3a9;}BJfu<_0>i`Wc?@t;#@}G^1~G( z+`xmFYdN)um#D|#P&Tm>Q$TB*yHYudqHBvze|K3&QclA(pKk~FYJk(qnjMGj0YySW&%~Am)(!m_eYGu%bohGIxp&9C?rd#F50Mh}#@QlcQ?BbZ-7M%Y8 z%fP9|qQkMNBhhCrjY6_{{TGct*D%Ts-Oo6oDQat&iL<5 z8i4-*o>YHmCOMB30UJu^J!&H}4DnVDr3N`#g|$0x?$87#cBc8PeQICrJ5l^J4NBDZ zpa^$0G`StB!PG6VY9`cexu6DlymBb>N2MXu?Z3#Tole?-99SOJ8*TKaHlqRPYBPNS z?^J}vV4i}bWsK*FX}f^`02M}VA|r+r$s>3ZCyIthlqsjR!t;uaui{4>(S^)_v>n%uEWrE~W0^H)cv49A-Iw4X8G(DUySx1FvPJp)&3 zqib4Z2oc+WI#-@}isXN4&(AxnIc`bsUtx!hsUwzKp3*NMy~{>^Ue!wV2O_xd4QrA? zZ0WSN&TC5F#c^r}?h)HHlqpG8=0;T?x@hzUv$YFvv}cOy{5_-p0BGFAW#TM?YeV84 z{kEy9+gfS1(Lrlyn@or>WIpxu(2G3AkC{AgYWBLI7$ka%=GohL!REaK;x;WcP=sU} z;^%<_2Z-`}R_kI>S1symLqTn~(P!4F5%X1>2J-IWKK0Fr)(q7n>8}Wt8cbMFIP|Ty zb|B*dxql4!hQw&_lW>4yw7=ma(}+LmXfa=$;wo0>Jw;9&hgISEG)q|K{?)afSr0MX zM1JE|F28>kp({%e;4aViz3VkKyIFqZ@sahbmJ`Eq=xe(NQnR1D&kl6lWY3s>D&84& zH(c-yavCRw@4Q8Lu-L-Vx%{izzAJn+n_KZ^yFh%qM&?Ep)c9w^R-PHOSZv}7*!iR* zlV70HPI0-1J+wI=hkp-Oz?!5wt=v|+o$4HjB}}K~Ua4>5%b4yameWbo^x3Cv1%7*{y1w9>i#3Q(rlJAwuv&xI~w{U z#MVMRGVbqaS*_wSFTH%5Z!pv+zt(P-beq_d=qu^+Ki(b|XQ8h@hg1F}5J$vXlZfB* zuSVDH&X4xIe&@sbTze8Y{{W4v$@I82En3i$S)cP*Is?_RUu-7{6yz8~uL+Vcrw zh9NDQ=a_4{)_ei3@0LrstZnT<&ziCWT;GcPL1m(7S2{+OarWD*q}y?F8-P6paVgyF zr@6)Wc6hEJwHIINx32x|wQJLUBI&*n({xCm!?M}k->NHIHNC-hQcp~J*O+*6?oBnI znl2=P!wUAV6ZpOjW5N25+V94nG>E$`?d9F)doZrJ%IAMIjyvJ4#+CiQEIN*V(j(af zh?|)t^~GxZVbZj%3~82j^P7wR0QqezCe}Y%#6bI z#C;pa8XOSY-#({%0pe*C=Wo>2ktrsQZ^9Zawymo)b43L5EKFjK;NeNFe~21rhr^mA zcXrmc*Krg3t52Oa`sT2_HLu6vy+S+Ni$uMIDF!3nv~@omYd$;DZexQ-c(mB1+y%Nb zY*9$&l0y6)wo~JB42=sdv%R}QpTs?Dqxi*Rb9tcXm-j|H+tSRF-lFXJdn*d_eLKaM z9uvHeP_UoMxKFxqUDt*D1@SlI4wZeaCA{|mL&ID=Y5=NhG%GV|!yJ9ojneU|z%F;x^1v?J{`Gp<)%@ou988pfi}6s{GO7XrSi@P>h9 z;hhp28yJL8#s@*mA5&j9Y3sLDv_JIOf1Q0Vr(A!d`{KTOt|8A$osor+&uV%EzA(Ag zZDEmC{wRFQb$*V0E5dwD;HxcGSs>J`KeBZ}!#2z*BE4@|@pOJ3@wKFE<`8$~V5j@IpC zbDo=a*S@O8q0+}M@d+Yjxwgj=#q)l3B1o;%rFq_)s_Q-oxWn$2*dBX= zJ?pvCbzL{b3+C9$Ebk9k82qe#tK~8LHmcsG1JI>f4|Bx+HQI=LYGlXy*u!SHyFEVd zRJ@AL#@()Nr8r2}y?Rf^{U1;l@LWx4BwkvDB#M*vUeaaNJ}cYGMpn`y=h)X?6Ae=j z4qAxjskztqTlOmPHmhSD=CP_pqqAWBop~fzY2nY=3rFzG>vMam%c@=m$}0>i*S%a^ z%Y#%J=0VST^dhccah4t#y6}zMke$zNz!942zR4x-o#$h2Mg>y2zq!BE76)S@fn6q> zX?J@pDIUbOi|=mlO`;k(9S2Ffw$^;tbTkN%-dYXdK$Ij z&kJe(4Rd)Wt|b>^<$(6CO4G&qKZRslc=ZV&kx!apPvWmGv=eOVr0k3<$^0*4ZeX3| zx7U>9+L6+^pB4Cu)$|LvR^be+F^uvnQ&vqE;vN0&r=)9^+HLY7W^1AIHF$m9{B3!0 z4DPecu0u+P>eLtFF(dIEo?mjaFfWLCA<#W$^z1 z!8U#ww;I;Ee9M>lf;UrFJ{|liHcT#OM!wYFkgd)Sy>{Lv_)p@!Lf;-j&Fm}a6*?JB z8{1HnxsRUyJ@}^c#87#T{#CGiM;e|0uMe-FzAF4H@qBt}MBW~`l!pHRmP2)TZ2lA0 zt=X1M3sH!Jf(#8_Y;lhh@5twrY&S`0{PMCWAd2nun@eUy3liqJ8*dNlo@%P-_vNww z06bc{%?HBz_n#0NJ^npBwiRkd7CAoWm{&jH_RP}r&!uXaEgdWe3yQCL0nI)$f<+|YVCIk(4OTnFCEi(S>b%i#za=0m z>1PtXYumS4#nVskB&|zwd7us9`^!)G4Sj$6GV5|#d^ELHj5ZmE>t7qeF%e@utL#77 zi50#Z#k>2*`PYk%J8;@u_3!veCqMGaIzQngpZ1d(8zx&0!lN=-j@6X5w@cOo zQY><)<|9BFaZh8OLw;3h8%$xzVOV*8`R0Era+g2Ce<}dmAK62zns6FR0zA|CRxdr! z{#4LM_diOc2CSC4dCtj=MzC6^NsUuMk<%11;1h~qXb7!Xf32Wd+cEzDU5d;SW3Z`G zU`HZ=HDlAQJKR*sr&#y6ADv_FM*b5@kSq5i@t_T{rr3f103QOA$*_y9!2ByMEaLtr zKb;L{Z;oFy37UfIOI{7d6@>OS`QsE&BZdCgwe%Fm)vbL6LH&&f{Pd{XMTh(1s0q%k zYwb-srJuD`IwU;&^#f>eo{lI3Kx%eJ(uUM52<=&iLQn71Z=nu;f7XCCKHFiAqLb}* z2RS0L4u^sFsh`+{{{R&LYdo4^9I&eF`d>VX&TR#;_rF?%=nv~a8h&<|zLdjtrt`q6 z14AR;oBfhKC<6ZgpQj$;nqPMO1k+nbo1RT*h&I;OPCxR|e>!-y)4NE& zopVp4%ro&L^J|m@oL8cJPl=OLQv90p*_Y>P_b5Nzo^r)zt*2E1_ z)|{q*C?gcaF6wS+q@HP@)gh87tG1Ge>ZE+txF9V+6F8Q9?dehf0B62Ats8QxF~w?F zczXN9lP$fB49(n%Kyn!Joq-~>bpHSh>N?2Hrk{6kJy8xT-ToeY6!7+gbh?jPum*Z7mWrF``}bLGSm-}wC{tSHq|lqe-7TZdTxx0`X}Mf zz%Lm$g(J7Ru=^AL0CHi9+_?R+?@Eztrb7>>$|}{T$FC9ihe~N3%o+4GRx{U2pT%Mz*{{X^0_N!)>%?rjwU6024-Q>s2zG4qin#u7U(?_S= zO(EXry?l~N=cUl`olF^T*jF5KL zZeWq}*p1mv6q=UaHxi-Re=6;5?JbFrY#bVRvw&v^DfN*G3S$7%`6v+p-@M#cCKSt z@vW`fy276-4mQ?Co8scg_(RFZHT1Y|fbuFGp!?sAMR)%IA8GhjCyljJ;maEdqm;C> zV=J2IF4M`6NiEEi#k`uVTx~*9J1|e*EbPQAYu3IV!N0?Zd*oM@$hd&lvHUZL9}OuZ zxUYek_4Xq1MX`M!QcPquyARU7D3>=EgH1t{61H*mHTR#0ZAbPVqS)uiY<@<*GWdC* zjZ?&P?-_G&;AiS<=`v|Lak=H=DJi{9iVdC$@TJb6*cS~R$c1=rtK%I?+J7^C9m!)} znei)FZAVpoIAvh8Y;EnD^Gojw$$fZaFNE~=uVSlJH91u5M+d|`PEV2J^OyU(jcxdU zR@5)2Eq5BnYI-3xPS3;k_E8)zWd8B1kU~%#n&H^dR64yzz}QRW+c=O&7Z|UpJ{tbS zo*wZB!BgWaty{^|ZR3)CLQMV44i>ya;YWk?-yhn|4du+1_cr5!5XS2Ee~DicJVWr; z;HBS$ygLG|t^QKt_xOnPH4766zEjXtrzmqDDQU|ly{K8~?JA(2e<;uVJ9lF>`UUX! z_FDL7sQfM0ub_e2`%H&#+F6FyeYvmB^2lwl) zHB(0a>+OSbIpCXrFi4PIuGoDuUzRmO}>$LDjR5J{{WV=SHYpD zkVx}3`5fhrdYZR!t?Ji$Oge10vYkFA$hObPQSDB5QL!}bLM=Z2!tQHW?*7i|{#2iJ z>+}!9zqJ>G^nclJP}46O+RFa+7mY07=)Wy~bxj1Pj?{wQTvYo~9ojWu)IQCr!*>@F z+t25x=U+_f-?pX2{{X=2p8~C$eXi{`$##e;f7d zpN9GugnYyrc9$bb8peMA0M@*j0SB70hXal&dr~CqVR*O1T86Q$#*+*}k_->Vz30OR z%+lZ_apkY_uPM~@OIzDPIvh%vCcR(6nQac(WB35C7aJ?1(ZWr=3)c7=jix&JtN#F@ zSJCzVrF`3JajM#9r<}j~6@4)Z?TmlB{VV5BUdMv|(9ivysA=~@iBZQj*?c(h z9fyuQD>jR%fg~4k`D~>0J&(0v{B43O>+5Lb0EY~`*OvS`)@AVay4I30P_KnG_nCBD zDJFhpoYQcu>PMl6sCet*5A50Fi`^kEXSveilQAUZnB|YQE86@i`%L&7;&c(&c#7S0 zjY)uA?l1}Z)nAXcvG}jy&AsuAJ?)ciGJ(loTKRro4#Rvh(O~}oc{nxMDRR9ItQ_4~ zU7ulVKMZa4D|Vkrxrk zM;iYC%NbaeHS8W6{ig-`t+$LcWpH>mP_8SgjxJRCo~%#X@m-JhuABEk zaq}qlHRwMK^sO7hQ(kI*6cB2V-7n8?{{Ssgp9Q~ye0^+W(zO^Jn19E-!~!ds)P4?Y zULLtO`a8)1Q;=hBE7^`Bjv-oGji!4}pW`hjR&OQcYYVQ18`s6MrOXe6^GKO?lP7#LGK-#+O;r zVYt3V{odc<71U}TE7tXkGrPmm3EX3Pt#Ni=3$^>pnI)4>XiJ^jq^@7=`qJoiLt~iL z-rK}l<;Bw5n`oQ7Tmf0q>6%@X>I~9dAMPN@uU5ABHE_}I)ip@%V;y5oIIC9e;C}*U zNP^v5jtel|&2>`B?fhnHn>ft}z&h88)GJ18H16fNBv)50?t}2|z}ee*a@}K>;GEYn z;*X2^h5q|{1s2eB8+hWp%Tv6b@^*P-XLHn(T{ZDEFjVMKm2_7Z?9k7it!H_bEO*d0WJXoy=)$_IV!6kY1;nReheJ1 zhrmDe$W*g_*S;5ELTEsH`C`5%S(#5tnQmB)q*th-_c@QUuKxgOZwG3EI5m9|HG<=f z?-)77VtifrNASDGz8kjjCxWDc*IQ`wEHE4c^#Z&nL%#6tuc9r6tqj8QE@GZP zKZCk&gZ>@Mu8l@TyVSV1k9PolD`lZ4%Nn?gM!1?8zt)Pwp8L$`YuJ81d?3`kIi=b7 znbDVaayKLjVP4JJ!$3vw9@I8cL*QNQls9Xm6>-D(v`$T<&oIYxq|R{ zu8%|(mo~d)05`o&ap6R{e8C_d)Laf`8JKrUDLWHOz-YwShqtpC{pAr`*|FwI z@K0Evx>RgDS)QNQre8@j4b2Zw7x)nc#0A>FGZ25zW zbDyO-HAxWU+Y&$BtMOgD4VJf4_*K-`!mb+4PvJlq{{ZlkBw&WM{{Y8oFZfBViRRlM zg>D^Y)&BjG{#4)X9W{r|WIrmT23%etuy4N>-@>N;)zV}KI2AmSX!B$nZNG&!J1q&% z%^oR%3eTgtKRrml*vts?vG~>4^sf&%Un8N4|rnF9_4nFNh`jlAdKomn=0r!m? zu6<2T+MHDx)S{pWi(K|&QJJonxivrbj2^UuP`5qB09H45KvXSzax=wWYs+#tBC9;` zl6q4DqiT0UwL;pZ&pBGWs|$5uL&Xjb7*!+&VbtdCl!I54f6F?vB1SWUDia!>n5#$t zYf^#t1s~gw-D)!rT8P8fiU=lcYnMMQp*FzhichgGr2sv(XvjY;QJ(o0Vbb>zehbzi{)Xxm22N38`_# zHx<;jAZQ+x;F+ZZG~vZC7$M21=7R#P1~nY*#wpweLt05N2rxTVY+Y+w#p8|ENe1Lo zk}71t>pmU)IMzIQszVj6q>pdBZ*UJv`jq$@KZd>#xp-~Ckt64hb6!pG@Aj2{1vQnv zlcd8MC{=eW_p9o?55%^=6}&Rj$!w6y>GOy_U08I0prnBUjl4@qS8&686W(AE14vs+XDqTEa=iacsB3~JZyc&j${65R5O#b?{h5x#y!Ysag3Nr;DP`s8pu&tv#^ZE4}J3QIg_jdv;G zk5N`9id}LU+F4@xS0u?^UE$vp$!l)#%*+?CH9hx>tX~t`4vzk%6GyFww zZ)d26wPg$s%ws%Psd!)EcCq8n2YsVO)FY1Yf6F%OUPm-B#C}ydVVs)W@W+mIe+x>l zr(U(WQ};pO(BxEUs~yIP`!f7S)Gnp_eahQHs&liwVBAN4;9G54%Kqc+EzC+9x?3NQ zo;=iZ6}F(Uq2ZmqE1vOV>Dqvf>i+;x`*rDU(ng29XLc`Uc{~u9%V6?rPSZ_-Mcs5K zRXyVs(p#VT@Y0eI{{THM7d4}8;(zS%``hTHoBnyC4Yf#?jO{))TVn;KlIj-6kKV_E zDj}e0HZIfZ3~f;J_IRsLQ}~st+(bitmLZH{2*9oy=-g@-Ej*Gl6aDU$1f2~2Ha1b4 zeInK?IC^=Q%NpnIF6F$C$ux#XJ;|tyM0M*^S!vf=l;R6WT4@huts-Y6L9$oKh9;H0 z6jqjz;7xMs47SU4FTb8mdS8b;44Pe#Gk|A2*I8kq7En}IxkegT@oP<9$nn1u{6E!o z8;w3+JWL~X{odN?^()`Bc;W1n{_4un03L@N*Q;81aZrNiC+S{Sty|bz{7Jw29J&42 zNx$B$G0FW|q+SL7{Tma@vJ+m(@Ydirg;%#CykdC##3QYG*MVE?z7<}3iu~qG`=hJY zoJpbHp&*k3XYtK>f55*Bcz?kOtaz)$^V=*?hihv_#_1cLab4BRqiGi|T$Xj)isC#+ z@XJV-O&1pz63;n-q!EVsSMaY}FRJ3Ka#vT>`ESKqfz^CZt6hP__YA}7n#^g+rYiO1 zLOZF4Tu6VNRVc2+dJNaM%y`do4?o(EJbF{iN$E-Dr=t0KXm$6hl{5q`QUvf z0}&2iWmE4sUx^+Ax$s7@Brb&8vCMCd2(DTinDOslXY2kN()@L%zMZIr!!GD9M_ z$eZmE`%(6Y{RKnhiae1(%O7Zu&{6h?{RKtjtsY3A34YNZprh>(`U;ILjIXf~oxi%H zCcDoH{2|o*M)8-3!3zxJa>wwjr%^*zZAOgiOO`0%#l}>D(ATc`FlS4Mf3PdlG+)_} z*?4PGp5oj=3PN2OhD#h*muS=f0AxWN67e87{cFjuT~t;_vkWAt>my!BJiSWKAM@Ei z^eXyG8&H3`wexVCO?znB&+k+D*U|7lo$~(xu(jnKcF^!o+7nQHHtS4v?<-e}Nvm$W z^S_9&HSJ%t)B$7Cn2-5r)!abXc?2dq^Y zw;>eg(wx@2V%~bxXns}|+UmA)QNu=xvKVJVO(2m^zt*d&jMapUVzcJzb)-+HY1X$F z@e`PR;BA%eej2)$O|e(d{C6Z^5BT%chV`!uwq31P0phf$S;5>~hq>H*V!O7uHk!7d zrRv!K0GEq&+gTSrGWcbyPJYp)Pp8g$wYv^0$KFB#8RDr5wPy}yWQhB{qu>F^rwW|2P zQ`CzY?pgEiScZ3%vdm32;bZ(+q>ds8_BF**9agTq)+s{7lSv{r(uIDtS(TNG9%}xp zt2ON3>cU`SipjXRW$Dd%bt+0v-ese>@P+2sw)C!@W!!q#ocLD$Pc$ueR`Qbd^EilF zZJlv?6ueqe^q#eQ(9Kc2<`*>U7w?>y9?p5u>3S<|&Y3ri_$Rw(c}>9}URw@uRRblCDxNhfw9w6&c;>N=eF3^*r>tU0Yv z6)$EkkAMdi%FiKC_0?)Hv4M(?)yd5pWrups4Mu?;@ zx~tqq9#$fYfv<1knF%X6-C5eD!d^LKUA0y?NPc;z%DBx~5Ln$kyrct~)l11`J#qA` zcq83$T9K9(dRvdmykpZH{fF}KtyQJaiOFXccP zC&HSF^e!olplXr-0Lw`QbW7v=zVIRZDn#+@?VZ+$e+mdW7t^&!j!e>1qPo;A_%7$_ zE3f|mgxwF{u|xP%SH<=&erp8$sh~NPzSO1RbNN%j)p^5X@UE&q7U{qr^d%pKHeVF! z@&o>g1yCHhxYbvzqL_6JM0Id~3g~~~A=2~nTUD5RL7}$|Y533wA~h@Q^Mm+Mbz7m< zFnaW+31U~$J*fqPPaYeao3uO1Tc^AGs= z{c0!hc7@K{jD9o$${k)2Ogi*qpf%Nh!XKj#`FW)t5Yf;4yovzj(_D?Zk}BLqP*0Y0`-m3uxr#o;Anx zpzDXys0yv4;;TNE!=S6}t$(vo{{U^E>XZSVbjdv`Cemf+iq~Co6V)l-+OR)r0Oy}c zm!2vI(&Qh*T_fK^%|hCRwhl<34qf!Qd8)E$lML5YCCm++FsO42=jIh-IX1GHPbAY! zQUTQ0SZyuatBQ&A>tp<4ni0wsleTIH`%vkc>xQ3hKZsKv)&LJ8s7Ds}H)+_^Ci>`h zHP=h0M<#KKtlAhkJX1uRxzz5*V?yf}1E@8>CWr=lRY^2(Gt!uuL3QU*$e{R$j@2xh zP#NN?wwg22f=3S$5!#$QN7v=eK-ypc@G84mV?0)o1CaQWd-l65;=G=9$rbB9HGmr@ z$mw2JD&s!Y=+W5Yskun5GfWFs7;#XOT_z!nQf?H5i4_sfXac~&6%?zJ>qv}8S~EZn zjWJfE`-D|>=~AO%O#o=wT_voMxv!zV0sL-X3~F)d*OKPWVgcNE74r;}lsWXP7T2?^ zien@&pQnlmbiuEst(vzjIuM;tk?#`S%tj@jz<>t6A z8s3|`(->^3*K}KK49AMgpTgF++of(;^ImQWg{99Uz0}gk^L2n#s3QSuXT+WrpFy{d z;ejwpaIILdleWFP9OaZEr&E!Ntbo+W_@*Mn-!K(ISkC;_!yqE7%HZaNJ&uCkP|~g} zB8KnJhB*HJ0Fc{v(Km`T?KV7V8ccit0Oz&G&d1)ly~2&cm=-T}%}Z4z-CQ=_$h-km z@lxbhq5MDiMRnr_ORJ39*pK5s#Z-*hhv4rCS!(QKGd<1W=oEal)vxUT0IceBkMxwY zgY~a(@b`msuMFC(7FLLa4rL?eHMX%8Q;vSMq-nVvj-rcai)r7po}Fuhdw(^-9YWV< zW#H{A!`3Ywg_1lt7nZ1= z6pc4CV<#0q+u+dcTJ}jWu?*MI(^0YEN_S>g#a|GQ0{CWa%D-&5U9k@1-oA109pm2k zg5XUdmS*|bn!WK$$20iPSh>8KW;XHh8ukLYzk}C{cjDW|{sm4Csjn|HscJ1Are3dF z=d&2_ro9`%S(C$Rx&AuylHV&=p?C&D`VKuFzdw=pwm0r9%vx2)IUr`ZX7K~u`H0;S z3fG}r2WuI#-FjD&7#XFz3(3jpU3ghp*xP{{UR~%xAS2rlKT$O<1{*V~V0J-e&KL>w>yBScb>Hm(J5o zNf{3nVl6n+n#q?nE|t!Tc!{2s@YCZp$A`>%eyYuLr*u~*Ef@a)TE2nNyklYFD-FA% z)in7B+-w$F_{Z!Hd)569Rn+t=p(T~nmh3;ect25IO?I8H4BP(kud1{k zjXFfg1oyUcf4(qls)ORcgFxRJ+wqXNCU{{Z%g@IHo(zV^{rc8N1wKZ!qWT@O!0+IjWQ5^1_uha{CW zsRl0H_*3jFgVbiXyt{d$9ZqY>ZlBD$5)KGFSETq>(XQ;&vF%e*hq8^%I#|i#8|LV0 zY3+-vU=IdF$LC*3+1|say1a)jV_XXP#@5(Hs9Jw?y5sY&qoC3j>7tTf?yf7$I=UV) z`%RqMX+-yw*M-M!m^t>Zcm1j2*<+*Q{(745JAmPU2d*pVu#vSic{qn=Pjj?Kjl+th z0`thCYc^nhYKbg}KX})9#5hDVQmlMXuodr5*hhNIuu+PYNdlqT$DyYPnR*9bYZFcG|`1eaxEGQo2%GOmgc%f`9k-vuzVd8>V6M~ z*IBegxe1c2y=#&9UGTq7@Uae6XVeERBaRldJWugENQUzN086*jqg(WezJAJU&`jnz z-yeAL%fU9%#u;9Ii3;|wp4-JY{v`1PmlskN4fj{D6;s5zr259CJ;d^vT({mQ-kYH` zHaA{;=jFv(8M`oJ&=W*%u_LJ+olJpu5$NOc^vO@YQW#W)afJh0w^kP}->QAo{3Pt0qk(7X(q{gTgbcm%!B_NzCa33a=F-axBz zp2mS3jD1Zx({QV|o*LD3_9A;yn5yd(iU?)F6*1q=ecZ6-%!^JVRmJ3U(yTlg@09E}#%hPb$K;hlw=R z>?wcYEU{jZsr)Fg89^jb(WwEK(W_N_Q)eOn093Uy>w0?(loVJDY|GfSG)Xu(%U0s* z_6&GYQmxITofT-X7-P>P?=>omk!B>C*-D`dVfRtQ-8Ny z{pG3v`w#mcr8McAzk~FtQ(PU^rA>JU@B=^;4v>0ME6wno4UAX5p18b9Wnz1FA=BmA*=9rk) z*Iyipg|*f{!$~E!GgTzF>p>*vTh4x3g|(dL<*My!O+;;4tpS_jM_a2$;=H={C0Aet zdd2;hnFNE{ysyL&HLTCU>s|Dohb2wSw~wt?X!$gT@7IcSa)++8U?RtgUo2FiK@^)Q zfe)2U^1wA@FBJ9PHi2VO_=LxfKE_2Z{juli|n2%|FL_WDzW@_OdZ7E_gM@{Big{ zr^z9@)1zBUwi}FUFs<~jn>;b%8{Go^CbOBLkP*l=@A^N+i2PS&4xO%Tj`2WP=g(R| zcm@8Qai!ceHxZO@amcRM!P<&jTI~nxUXiZ&V$)i;D>^IWe3PKBF7X$Eue?3FXrwY* zddJjP6;;e!U5{YWJQu3#ei@Tlw}b6g@t^fc_l;-iw*Df$n8gQ$u9Z{oJ1M}dPlZ1n zbzg_DeU($~HpibXO7zKpYrRJP-dkI3G8@ak8yPUkG`lT;IfL9NCJ4?Iv|HElq}CIwBvtRP}4DJ`3t(@-%;$|$%P z-)DbHLjwS7X9L>1e~1474S(S$Epu};aa)ee+|?_wH)9v!FT<(4VXUpi;uO>3IplS( zsI4ucv$soobP>TA!l)HPLeMRATL|r})lxMak>0i803K_yoil=^K|mzbthlKo5$EQq zTkQDjT}n1NE@j*T21P|AOxCZ)Nv#KpCkG8#^E0ay4f4}kGbXNaUlFd?!Zcuc=N{BdcB>!mVCI1@}T#xSoopgZ9~NRS{ogvXbwWL>s~Lccmu>~q+DEG#}&Fm z&PnFG6-y(@oj-i@9}~_|1*}}VoE%oi!Ye^(;#nca8Kccmk4|W1+~hkB_0s$@vz5GG zJn{|%c&{@a??s;OUrDLl^z87}=${WU{f2#>xF07WtI<9lL;nC0CLitB#7*jbmqVww z{qo8W_YF;F;X6w|4PIPZ+mAWnV$zY*twHvF4>ikp_u`JJYvD_)D`OR!1ZeU)wRGX1 zym8`^blLO1vm`;TSqLs%@%h&$B1v@qUJoX;H0Wi!y^?1np*<_E(tI@>(y7`qYwD>} zy43hOl#-}&HeMci+hU=SkF{;s_y+1}Hi(HQu&-k9N5hxCxI~Q$JDvtB-gLi%+JA*? z7Ux=$-p!a~G^Z8mLJ1>etbCKF{3X7ejKPnsYOleooPVhwk*{a*hsJ*d_(DTxro;WG zAp7!v4S2VUe`u@w?eN;g9jqOKaa7VZiBA6j;j-!BgsPyAYUZzeJ8cV)8AW1i9})FE zO_-UE5505Gt7;bvNs-&>QDlwNI`+}6z&|=wc{G?taO?OQ=3TWF1jv_4JxcLaP2|Ay zGXwt7tR)2_q7^w#l3h41cFFqHIW6u1zU&o$J%NGFD?U_nkv8YN0CYV*wd;Niw{fS#yX7aXc~!HjT|n*8TxPw8 zOSuzAZtxG0hidZitK2=j2ET{uSTGT(S}5t~DgA5d9X@tz*kHy~s`L0)&#b#{U}8B^ z59?n>=sOz9+Up-Tmb}-_A3rrPg{3@&Tm!n@N)hlyVCgK#6k$2AX@r7{(&2 zNQPn$Gz_*B0nH(e4`EPdQSU&NvB;(X$Rm8HIPXNH7CnUtJIy-6i41K8-dEn=z7_VjVXTgm>PrNW`^2-F?TKujuGhSV(=(idj|^sHP>&--2{kvxe~q3U)xI9hqj)z-+9n%J$eh>C z9v<*Mq2g)8R`9Thwpw=ksw>zmej9(nDz=eFcz}#E$jA8#)fwFK&kg(?)NWQA%}pBG z-M(#&)rESEm7bg7dlrxcv$sLZo(Zmt<6p#m2f_MnluJ5KFO`s~>t7=H&*EmO;`!u_ zr7+q501Rq+(?UHH;vdHwi-=~@{5X8IIaw};Q}nMD`yKtn&ohThr>#&JcXkn5M%!`4bC*X7!n!?1a8;JD z<%|$>RDiLf-_2nO@|>=H4RqRn#64QX04Cm}vvXXOAS&Xe3z}ehEFTu-nlCEq#u-T% z+(mG@jLPy)I6$D};8P%jCp9e428ERO6wn!3YZIE*wS=?gvn^R+&1lKZ`Bql}T7meXHx?;)_Lc7p5^@1^YgDG1EyJgvU0r=1c6L?`Vc3pn7 z^ziKJK3kAS*0s)?Yasb9K>TVJ(t?w=>pzVEQe6_^f90-!8gl6uc;J&(lFmguPoKu7 z5!^4`nt&*OV_!F8P|2ZRka#t&vR^Mr0jUJ~jyNFD2Qemveh*fnx+a@Z&)pxD6anXr z3gej6Rd<3T)dfV~YsV?T0;_$ynxsiqM!PxdRb1VS^{sJr$2g`v>}#BX zOhzN!Tqk2yWWJxDl-AsrP_}p#UFL_Mlv6@6PNg8~4Mh5*b6T!oIr%EH!*1WgDU!^` z)gPW}BdNYSR*Tr%obgrLON5>%5m0Jp2Ov~`+Jh&GxO8a9KQ%0RS!xF-iSg{|nW$k-XKs!Yi8E4u->;9z@GVYl+vt!wJ5_F36nW17#9 z0yin*yOzg05;X%f$94y$IwMbUOhic`=ZbdVden%c9VwCwPy<4PQmQDZ0~%{H_Mi*# z7$eDZNpY(LQm~O(qA4ZLNvFl5ODkkH1po^%m5F0cdxecoDs!b9WhAz00Sd9?W`HVv zy~7d>It@nQBrF)#irGVtxGA&Rsz;SkNDk}3e-$qDg0}Z;Zf&|1W5^!W?z#+`Ka8}A zX0)AV0DSQtqP|4~9jkl8UMauu_0rr~+&nI)_)lM`?_BK-A4%GL6w>}6B#~&BW(`?+ z^4wufd7ic5T}Q$i#m=3nLIltp8559eu=q{!mf!voJ4x>x*~(Z4W#LVFZ;X6A+TO8u zt3qJE)8<@~2sMi}N6%4}lRq|T#vlg=HQ4Ka57GBYV8t7*%Hyu=Z?w4zTtvei@x@|j zg;?62u`#Ntc;=={hct^dG|duSUg=_uwy68n-{@W#)8e>D8ZSA!vsNF%-7GR_;2EEH&b|;(7Nv7$E5@|b3Q8gd8XXycQ+B@-bmMQ+AGU6OI>eLxE6YK z#m5b|C`cV^>Hh!_>Cku=!^uC0;nm+0COOK^%8l?Lsd$U|B zp=l&okauH><2*_6J5A6_BmiE^(+YSMcyPiM@KU(%57I-Jd zx^|>(bd55`?$^r==16hcvvnPeWkEB_JT>5(4-{Wq+j)C3en35Hj+9XpcM=V;w8qJ{|Zj*GtiD z@280#Sw`h7GfSj?&l=XdZ|0jqkpBRAzFO#E@HVdohYpKpsmEumOE;GcbBwOqhBK!4 zUttEUy3g9Q^t`qTa;%vGycgp)fwa9VR*LgZjct;5A)-;huXOMy!e5DA3-L{^kA32c zCbra{GYD6r_pc)O@oMmR{{T?Z?e7KMrIYOqjC|eeJxJ8@U$8GlW5r0YG=IaIzSc6R z`BY|@uRJFXgA|9U1TiG7f_5KKT9z7}_lKks+Q`HXcsx_>^vEybB^zv%$c)--rDOr) zpoKn%qxgH`4vpe%HcKsPC5rjJ?5a4fBg9rIXL9P;*goSA;uV>x=`c>8YtvY$9F*=V zD0L}rq4KWs<#=4w8ky3jGS%!}16}$RyY;UoxQiKH)$6|x@H88BuNyGZ2fde@^T&dR zAH*x(bSbvzHsd_`V!S%-cC26T3id4?U-*^VkNRdS=DHt5a6ccUk$f8rv63V+kPUNR z3w0Q5JPWInD2wIUm-&8b>i#;ed<|@R{{W;K^N$E!X_p=q)~s&hNo62BaWi8kzJm$; zGi7psz_9MdP6KW&SWa z)_ds&)rw5HKDeY=oQ@m4T7i1hrq(s+DrjLCpt8BeMA+u8wUIffjgjY?0KeeNyBlv2 z+KZciwFWyxeSxoOfprf7U(KpMgK?=^P63SDa?y(LXkcqe(s=$^5aclRuXFG}?Izk) zgjO2fme+A0z?vSvjRcySZlizk6U7nFX`<>D+Y~g7Dv-DpzbLOw@Xx}FeLN-BuP2{%*T@6q74-e*hqNCB_!LK`S=(9u>zP;p zK>F9szAN~}qWD!AYys7^9&`P`YK)G)RDn5>Z8J2oZK~5jEvpqE=9_DyTxtw(+eKd}jr*Sx*;*rcL^&0iCyb?@ zG7tr;7JdVTfiucU^cAfKg=}q80zKa5j!_)_y~LA-k^9tgOdjDQCmHWsH_%52bwB_f zm5eQZ({hZxk7_`7u>35yxq>&3T3E{r{L4>IgV)DCMy+iy{{U->!b^**ar?6%saI0H z{{Wt{3ZO4)ehRwK;Racwlh_GG4ip=^sbrZy12GGndHS`S?O0=&ZI)xI|cTv z?gmY!k#TZzcPckIuSfV}@V@87I;ym>gJ!tPH+tUizrt-pQ`q+`A&ZTp*1glheiQz} zu~=iklF4kqHPD_!S_tH*k? z(Mv-5MS8sf{OZhae4oN=J!HO7#M!5<&G`QSmYE+)Rw~A{SC{Gh8L8J%yvNNIWW{-Q zy~(FOqj&+pCa9BB`(EjP<%?6-T6`VwHFN&}+n4Bn)nt7t+#2NUzdS?opbN)ah?D+~ z-<3Ueh)-BZ{3|u}=`+Q+KZP`FZr^$U2hx>**BYghedWj0Q`YlNZ{Zb$+MF-D- zfx1UUfZdSTNH|p$8d_REMp0Pic)z+uG+f&Q&f!IX-8K*r!>u#>CKexgYc4yhWBgA} zH*l_YyAQ1v0>rvJV>lwJHj2!6Y*GuL#E&}yr-_#t`%N-Plf%#d06h&#x*I3)=BJM3 zSC2n6VP#nd`oTaM@@U1u9%20IjGi2qB&>~F!B1x&ojgeBI)gwQ!O?Ex=bd9fjr?Pws?X!Qz)nQ~Yt5j>bBK*olf#+LBQ;tt z9?U-S=kTdd#70HtKhl6BZwP zCaF!~=vN@-wBN@tP4|}+N8&v`U%mxd2R|={;*&TPQcnsIlBT;ctZBP)F;%A3tsfyO zkQ`LL8;oG1%991{bu2h_g^vQI2WCv;DtB(uMAvrX}&pH0hoqvRyjje7M{#ly! z7`!UT34Bt%hYVok4k!`ivd21S@9XeXEQvjnA_5&`^#Imnh-KJ1`Sj?G?9HPbkh->s%f$=L96mu$fJQ( z&7_#=ObR@MQpUTfWwnt{N?4+BDS>JfPflvwDU;V|tkJnMj=TS))YNawb6-Up_TaFkC{n`M{jl&+5 zX4(?%z|Ak&L6DKswDj~?+nT~dM7DO!yn8KgXRm7 z7fQsJ;C8ZfdG&2Amr$~g?-lAPSP4ES{7Ss|ho{FS_0R8A@d*2(ywzb9YUv~_YtWu=Bfzb^>kE+}CMn}Qde^4te;d3(XKD6%nJ&IizF|K$ zD}wO_%vbuo#IbO>s4ad$k=C;nk6gF$WwxR4{{ULFy}B00;F&zN{v%#V;qi&brYgP7 z#^xh6YfO{MA%$~S_zsLSxL-qGJ0yJ# z^g8uVF`03bn)%nn_KR!d4M}myeAm-jZMZi)^OIg3@dLxZV%PO;Mb2a0Ugle*?tJ!R zsz;sppT$z>+Dq9%CK_SRD~7fc>9P$%c+Z$dR1wy@ZwmNMZyWfcFEul18|9nWSAVK_ z8qZkOrOK*V!USjsax2=Yh_;7_sNEhlr|I(R7Sn3Ca{lYmvIs}HD-TTZU6;h0IQ%@T zVQa#%u46>Ees#zg9qaASgkQ4^lUgO+&8SGQ7#0=t zN5S1kPtb4e?{DNt?W17sr_#OC;+O63Z*8ERC&6)jn_>iOhaG;E)QwU*Uync7pAEb} z6|LT{7@Pim?f&(AeXRUq)9rOey0?rOW8q!-HROK~J|pWMGu0=&)bFLamB}Z26N=$v zx@ISmO$DRg?!G_jH@cJ;QePD*)qSg$*Zfna>(>+AAl-27mv36~Lho@P-}2+B6?x2X zs{NYhC-{X)Ry(*MisL?C>s=1J@V{Bn^cZ!StQ^?L0|`eX73bP*^r;y6x%IDG(mpfl zcb)-%3SPNuJp8%zrDAzcDY%%&FYfZA+OEYi-AA&uW*E`Nwuvgkv8nQ#99T*Z9xE%9L& zIr)e4ub{jv`}C`9pZR7h=WU_%H_+sMIsX92nQs{FHfzJJ?BkVObYcfe_wR_BM7}1{ z9?l+2ZMwW^bdzB_BYpJX*U(`X?$P1bmDtT9=I2Shx4aX(`4cRm3FC@?j=V)Dj(kyZ zt4kQSdx96`_NgxI+2A`yFgdDrwi&sA5tYt(uJeTLHEkl_!g>XSwvY#&-~!HjR2mJe zdcDww^3`PXxbrUML=hN0%_?XCCy?CNegXf7un(TX=VQ4K%nT`j&W5q{{W6QJ{QvUm6I1UU8cbh=Dc6UUN+XeMRg-Qs{{0HEV!66&do&wX-X_2!-n{9o*@-2IC)Cybr_z{Jj(Dtnt;fn^ zOJL_YP{OLor?3ZTDr2!r9Z0mXB)0ppHI$JMA$y9FbM@ zy&vrDk~8mJ!fDVdk=CBNWw=^?(A82$Jhu5ADamAn@++iWG6Fa>tD{E8gHY-RvPFF^ z7JfMd0~;OsAzrw

4FfC}f*-tr&3Sbh~M-QGv{SpHN2yeuO>^3IX8xZA9Cin_h}brmXj zg6Tf>0BAmgZrxDS4WYz7=pv#XC}G1<{{RU(kG((+{=(y_sGCYi^N>wXABt_iimWG! zYzN*zexiUfp3*P~!5@WJYbXy{2(Fqx5@}M5GAR5gH##lB`@m2KE&ZJvec25!_C$ny zvR72L+Cdpvg*aMRAGt5Scy?9Jw`aKM&ovK54~RO&(}R%u7%PXPI#xam_dF*Gv2))yttYAnc1Kv8K7y z!yS-}PzAxM-4Eb2_0=v1R5eB^br$>R1!&s&&G*z)fZy$zQ>dxhKp0E4SNj!0@$JXki)PP+7-|Yz%pSr9}E_zf{NJU4TeWMFxXw8xOiE zpg6OlTQEC@Dzw@yw;^k^n@o+f#Zi4F0pgh_95f@i9;2trEsyHFSQjMIjG-O)R*{;UN;Px{nlxpZ3C=TNr|GD z_THm|l1)JR)$k`dHKuQ)BmGdSvQCemlwzqdSkGO4=?^KIvlojeL4zJ@HdJDG0+8Fr z!?kFcEfUG%wqSQhRA=!DNs!4=+*v6H2C}X+<~jMRXtO&GzQ45cn}N-78nykoX21fs zuXKV@zH?l5siiVAb6pW;Jf=;|(6gLksmx==HsS`2jZ~3It(1weV-XQdF-OlztL45p zG~BxS*0&*|$+br9QJp?BQHj`7e$do&2$SqcI|@&-s1(C+^xw3e^sd6fy_%lY5wlU+ zrdyToQl-RasiN$5D7CQXkJ5y+&uY|GjjCv)L(-QpSjbBrPZczFSgmEZQ%@GcvvL`k z90h8^3<|im;-y?Ar)yXfbCMHs)5p?=7|wSbn%>mN7A=+e;8^yTZ0Vj z0PUK}7VAnQ3q``mrQ7^XwAQVb*H(#uAI7!se-1V6GUvdTnr5GW3zr1>Wxj5e@!GE@ zt=e79XyM_N;c@&(#2PQ5oRdA~{{TS`mAru`L*E&!EWrmHqc zuCu_O4z&LO7{_)mHIM9~gZFIx39d19vCeC&@TZ70#fR*dM2|PPq~p(^)`PC}J$u5> zC9JlR>XE4;DXkZAVfa^Z@QYWvf(w+m(RDZ^bHSDZ0js_f@eR*_yhmw!Z6}`?{{UAU z{{S+d&c1=T@z02SS89^W_6r+Qqj#4O4N>(7z0G5clvgRrX+9P42CF@~TG$v`Ob}$_ zit&GsR`)tKldakj`}pMu=ia`6drP^W?GtN~Ljr%xe=}$TzF_#Z;!8blJzCb@ce#!m zuv*}@e9Ri@g&5J;@-a2#QP{-r{-VAW@S`C(l0~RAKNb}kX6JQtzB$y7*)2pz3&$1A zX}X+&oacdA`!?CpMpliDUy3)$d#c4I?zKx#ix9>~OjREeKii^?QgT+W>9s7zpbqpmNI6|XJWaEI&`ZBqcW4rj8{#jX;aJVM(Qi;#Wfs{QBV^W>XX;ikyO``lK@wbY!$ZoWaDk&k)EhM2yudF^1d<^kE zucerEO(fVdMUOF<5%^b&!!d|r(&??&uvf)*eh>KT;-3UM!5+2tm|Kq~Q@N|pSV$&! zEJXXA&xjz<{0(k=J*31n4O{+SZcp%6#+uFd+B{RMj1TqaADw+6qT9>y2T|4Zn>)Yw znB1dHb$M^|DrUTw#GeCo{{RYHxQ5O32-%KhQS%?Ic5)=NIn=e(;%+WHxJSx4s&983 zN00$N_0Zh-Cs>h5Ykw#&_o?=u46Zdh=pmN+2zT-GR!t9>UkUs~)pP?Q+uSQaK4TYS zUd7-~+Cp26U;8syFx%;O7ObpeUBnvW2kiZ(_Cdft_K`i7x%1)alKdCbdmDs9T-);hosEOTF3d}z`C0OH8oUFq`0 zD8lcO-y6Rg`5sL|I5=}vYYn>=Q6YroV#%vZbm30ez^ZWS7W;bBpUb!(EZaxcv2(GM zd8Em{)WweADj9V-VgCSEPK!%5e}=^rpdi8BPZkT*j!#7dI$yREoE4b8y`b54~+c zCA_B(7_As|yD3IT%4;^pN2gxh#z)Dzx=TH3WM7&i_*ENi9YcJR04t}{G-!-teCt@Y z1)VF!5+ebEE40%5P+3OoV!3$qt7ShdicM=+Y3fEsFja1LtJ9wP+&gnl*3 zn^Zt>`K5x|S9~F)QQq6@q>te>dJS;@0M9iw#Y3lEg~$ZbgMDszR-^}@$E%43Jc^kv zQToTla4_ncigZS;8-0552k#c74#Z1rLERYqstFC5Kk9+5d3;2_#+7Ofdd!cR4FGAM zu`t1iepJuw{W^ZJf%sH0YZel4Mk>sARuT`D!2DWKeuw^Eu`&5WO)?$F>IU}H7^R_n?1e#8x7Jqj2*Ga5gN1d}N z`iiXj?e91!{{V#oxykt&ihs)|{HZ?MsN42+u9dt?cA4L77<(-s@m06{x3f9_0Cs_# z@@u+^{{S0)RWkUCQ3I)ATSvtDLv^&l`cp@UG z>06Jh=#QL`DT;IpgUrgO-heWPi5-SaU=Mnp9}|V^5Uq3J%_`u2?&3aw+N$#WKS@C_ z+$Z4F0Tg~HiN5q8ink88rpP~e2Q`&9fG=VvY@m;0P_Kk;SzlTh4s!37}O7_UF7`6rjkD^BB0n? zy#*vsZ>h|mc;>H1uD3?4mQaJ9Y8G;HifBho4zCl8Gjmg`EZm{4Js)AoHLYW)nD7TQ z$!9{bHaY1*Km|u_eq|UdioFbR$TDaZ$`2myF-R-}f?Bn{&l-*eSDY0Gia~QGeLX-p ztjTo!%zIYjoaU*>yqr=QoBfnA)~ickV<#Neua?KXBSrw^($r=n$AEaM&jPWndE*?_ zCxbbmGHhqPiZ*Jjx_1W^q|ue{QJ#mIw8UXeX6c%&cP4XNQ?7GVWrI1ZOq&!MagIes z(?&rXYDw+L%~E9`n$|3f6)zAKYUVWyaQnEfqJBXJvaVnZ4Rpns*x>K<@L2I!^Vsbt z0=qp%+mnG`y^bgJ)YdE%`zHjIaW9PvyLW3_6VN^jY! zt}7X4A8L%-XSHky6n3Y5ok;0L!o~@*Y6X)H^|)<^IH>;3Q*g1EkQJ%pa+PS?5!$2j zDq9_aE{fB|@umxG)5V}Q7bKE9z93k zOtmE<@rspg%|R8`YSeRz1}ec%OJh<-z}1MwWCLS>0nk*QSFov&REmJsL|Wr5uC6TK zbQ8%F4(P;JQKWoP*7Uq9&-SRt@X1`~mc8kWhy_~EpJb0v(|#}M_jp_TR)vpNUPW}4 zUL?^qA^VH;Qb*l$its~$ns1$sI(;iuI}yucsJYj*dmj}}(9XsaC;+D;8Ly)+w5uIo z!*&x%8r|j~WZXOAzEro=r?z0o#j)#Mo`>;oThcAW3RYNqhxDscOtRmI{5Pk*rqQLh zl%B%7Zx8;>b{-+{CEmO>CbThjt}5%|O@^Z;>y13Cp6F}V{1x%9!>RE8>%-GX*2YuS z>hvd5!}VW=cN$B^66r2C@Hy*H>An=dhWat~aQjVqHnVl6TwPl&wcl}7Jd@=OIh%R?y|c2MFqXN zb+m?TZ#eX?&TFficy6xk;Uz6vLcvMNJlDVcd!2Mo7hG7`%Ocsb9K^DnxcXO&N#OfE zQewcHc4f#Q)j>(>&I*x=)aSfK<;|wX%GujooKlr+j+N;$cp@@_6FDnTC&P&2E&JU1 zS6mU#&0~kTWqWcDJXH&8g8(2N4SEFM4J348vhZskoC$~+k-|tt`S3e4^ ze0Sh20sKF&&1I|kKuFNPAo^F&Hs1~JZSXw!tI+h{2Y8>r`git(TCuc;{+XJiM6P<@ z!k^h+#f^O{Yo0c|lS{WlFWJ@bk`datW1{>#zw!L~hm6|eP`9y|#U7j+h5+@hm*IZ7 z;tf+-ie~XcU&OJHZ8s1Nb6zR-NK%fP5mepZ9}MHAJbNO=+Yo zX}Oyu_O6>p(E^pqVNW@)W72*G=vS+3Ww>zeGI3jWzYFv@EhJ$qkFoYvZgvxqK4ug~@r^1_Yd`?d76e-5;mt>a@GHb+d=dAtdr2{6_XvwyYCN46E&@y*m% zQ_Rk=O2qmhuR-unf;9`cA-S}QSniKZ@m})UHI=!QVX=q=>GBGJ*~%u+Ai?8r70FVu z(@y6ve`|l?3*A0X6x#-kmw83%R=%S68?Ja)P4I=!iJ!x1G#5?wYgKj2SAzUxzlT(^ z(&U~&aWci_jlD^)diYDLX&O(#Js(fJTxuyNn6WbQD}q(pXR8W+?ao6|x_^e6js4z( zXZ@J>t@9xJ*ezL}Bk^9hEyR&rY7(4~c{RP`{btu+@#ls#wqX)#6D$T(*w?1ne$QHI zzq*@OFM3(NKpXDYeK*dob4hZaI(VY;FYM_c-I;f&Cb@TZz407CA1M_-)_xWCkNhd$ z3P)unym~qYaf2hAn)!d@55vpPhI+r+k`|Xql>Cx`_dShmI&CYGoyk03<7*AN1QsbQ z-(ZVuvTgg#UU%ZnV((kNGg`wfpx`j+zNC-E7S1W7UWJ>IFPu)BeD3 zC;Jiq0G2zxTF#rpwvux?Wc@3$x4pELerK!J*7|M9<+E5yvu3It&pH19gnq$>*jJi- zJ`8z}$U=(ri_I#{0rC_B>sbw_TuS?6lOIaS%I8#6QOM2VDeV(0EmAfY!yrg&&=K)k|2&zwJm^lRdVyKIw zhx=QD%xzMw%8|-r>MOB_PKIXMVFTQXu{VRFnKP78O$zAZQfOS@fl?SPk4`?7&`aTq zOL9SVC)%qvhP?TF)dkUxEnzvsnu)9n6SMrAIG^p&*cklVeEW1TwKdD5;~ccIu+K#?v5)j#a-Zo*PR~ z?w`u0tfT8t`ad;qtISe$Y8ZR!#N0a#6R-O6?QEx zRB)tMNS+&=dN4IKdL--jg-yW1io>rat;J;^UzLyNTZyF*KJPUwT1}>B)U>(%ZxFuW<4;>Kh}Zx)T2eXkCc-?jRLW; zdvxxETiYk)SQ6>ljm(EIs9&XBi8Tm%V2ZMurNkrWS_VU7;TD)?XvJMV7Srv9Wra;v zZxTqHZEwP(ZxAHFi50n^2V6tpt92q^qK37Saz+YA4eCNfG_TPmbKzZ)vHybz^N!=I*+|W%MLo#dFH@1mpsLo;*izN37#x)YLm#E^Hq-X-kXnl zNUH?04r&6*Y0ekcqr&>tAh8pS=Ae-{HEUq?rm}zyT4H8B!c_?qt!!N52D2t%&1j75 zW!y*Bvgg3fYh83WtZRiNn%*pijN7QZ%+_4Gdy-Bop^6@Ps~$oT(zZ;C9D7+X>M94b zBpT~x)5GT#Mol{e)u|aYa?fJi;+Qn{HPiioQh#TGPUP6;8&7;5Dl=l^wRHx{m~8#1 zxLD=>$iuOqTb$QO)xZM)Qbrf zptkv^3tqLDtW||d=B`B8r1Eh<8)*fLD)lNzDwgU5n5ihx4h<#+RY`N+r45ll4>1Fp ziJ~0yNX$lRBJIyLL=VQ*#XVmD_ox9RQ`ef2lB}!gPgX`8iiZM|a9YteBG9<<*+S$I z?^>D`wQz6JHIRe#tXNg#+~ja7Z2{Fal_b`h+U3)?KBscp-lcgchFQzR&5mom@Slrr z{5f}T<*9XrgK~P;oZDQiw~D{OTRc~yN2f(H#$(P(jMte`yNl5D{gUM$@n>1J@#XxQ zwDvz@bWOykdh$yz9caky%%3k6>v!6EwVl*VG8z^Y^8;CKp6?&R>@oP)eio~$wLH94 zH5H-i3*%iPX8C0!>sDd$ew0`*oyqTBK5dF;AcIXL0fKOQ8ug(e`T#Q zBm3)yf2C53CRS!2{3SXXHoM6vlR#o%a1x0;U2H9+f*4w7XUW@M;qhDGewFas zMw0I1S+usb=;B5jkJ7$I@z2HmCrXM-9}Ywlsm#l#=jk`d?jyhZEtRF zu8RE1Pu;II)c*i!jY?dLdl=*N&3Oi;s>^+GB-1&PS2-k_sk?aTS@Igj2Y;!2b@4U! z?USqv=z_Yh26(el*Yv&DcLrA@sjn5qcU}*>eKyTiNdwZjF%h&*{5*Bk^oXscywog~ zSIG01zrB4^9g5r7!l~C{{{SlaLqXMIyVh(|apqP2b@miiW>{hi(_;1dSIyLvu6-OM z4nx6zX&cATw2cc@iz_vq@=UBaJR19};m3?^z9D!INAU%_i4DcFi80y0uZDkXc$O~( z+eSwsab1V(3Gr~l_KyW$NJ=;lZMgLIudT~%QZ{FYid>DO?Pr8Yq>i=B__x9~UMbS& zvAu<5jzuHp9V@EALTR!_9AtH`Vs!L4RL{+yh<^=kz8!d`<4lzs?5@S2kd6xHrDHCT zG1k7={iFUDj~Vz~?``A%08O+T)Pc?ge50pn5gUF^Nb6rSiKL?|p0x(08=R1|k`i%} zDrof!i&OIar`Ebj^f{cLC;}=a(HQ{~As>ZsSnIMdA6~ybWGp?aS4q}0{;;yOPcMg+ zS1~aB>H(!o5GNqkV>Z{s?-;_|oO)J;j<9Y=Bh2+R#m{d1<#F#($9FxbA~{O?P&3iW zSlkRaR3@Qs4MB1VhIAg)=SNe#Eu69ZYf96^cUH^FlR=fvnqLWD#Kgu{LG4VE##kdO zaRZNWRdmlDn4AfTQC(%9i!|Hx!$_o`?^8i@&#rU`?sfPnX`&*I8+# zY1c`HZNKjdNqiG&AtoE8S_N}19b$F^cvcmm4yO?xG-9h<_*~hHiMRa?Ra;Ay;Ui-} zT-;lz3hdhp6YajJZ`Bvgs+ZFjPm>))_c^A>Q`aF?HJ?U63QHI_^e&HX5 zTtLyO$`e;@=G7zr09y=9J*vpoVnK=Q&U=t4ST13;`H8Sp3Z4y7Twv|3FE>ZMIFcuf z`-+)7Go@S%#c&hqYHSxWnfDB-6%4mxB|F!5(zPypB=IS0dBcxmSrV+)Y*J|Vd*ZCS zmBjY<3`2aMS|ri!=TcCHHEInyJMoYLnkUj^v;?CbDURk1#*MI@$fSKLqiHtH!Hb`2 z)|&cg$qo(&wL043JA;BkpK*$ixse`&)W^MQIdr?2vx!=|)Y4>;GLtXoS(mnVP!pEi zJ*sZQnCI25;wR^7o;_0PFXMApVU`laNW>qdTM*dFIGAVYO)^Ze;w!bzHyV~N5KQOy zs&QHaNs0dBhN1LHHl3hTxDm&$T7mPa&(fd$uVVcNKJ}Y*V>~$pMn086t&0U1Ra4M`B#@ zali4Y;qY{KPsGeKT|SfGn|n|iNlBm%at{wnaC+oc)rW?X*luM6*G(Ojqzknhns~KW z=xL%EnFMo2LdJs?yQf;*J_{vJVWgLAgIyJ+y4xqrX_+%MqS(ByDvaQBfm?S)TRE)v z^3yrRP0Vaih{y@~IH$--QW#aWxHutJqLeh5$i*v^k&ST*l5lH2Whf3SR_Z;3)d^g4 zO68l6{j%+JX8W<=}4;-iX3#PnleGH6U|23aY+86eiJ-J%Z5@yZ`&1TOY39Yw}IjT1n{c6)7=Wbs)6-z2lHMetWr#y36 za@d@lR;iH2ENDj*(+&?6X5UY5dX`&nEqSdIGi4=%wrA*S(=uj% z_E{r?RVUNrLUGM>Leq!)6vT7Q6R%NGHsRW~Btg#=N>uAW6iMsFCeUivk-DC? zC8z?Jh#b>e->qp4Jc^C&*?Uy5GfV_jMKRj77TmXLNi1?YQ~{PF1azePK6_S*+7X^A zRJG4)Or(r+ZbxcC86B%^*^YRq&60|dnaLkolpw*YCfo{*lNq3^6`4TIK*OzBan`Fn z0b(}eH48Q>XYW;?y-5U#HY#Mf0<)QjsQmIM18pTo9ckWLo|vpi?#Qb#UlHD@4Id~{ zgaWC3zMQw4vzh?5NE}pVqFHxTpz)JH7PRY2okHMSz=iTVR(0`{P1NL4Om81iUV-p( zTWGv%X16R1Qk}flQSl?;{f3kA3D}^L-r#Nkbgug^W@4{%%=C?YT0|u073`Wt_u4G2 z=Le{-FYzzKSz?jz^oIFICK~kLhnG4X=ZE5Z*{6y~M#exp*O5|{+2~WM?PgCVqGy_P z{{W^MY8RH0kkTZFBzQ>hm zcQEO9gC8W_4SstytdZxh9<=CXmIlZq5!_Hg`Uipt<_5;~h56^6B60 zHUV7y=b1%uSC-xn&{V#m;w?JbPT^b{{KmZT{{V?ET$`O<@~8v@BUb`D?JT@WwD$X0;!~D#?seH;PA`HMY_+ILNO?_=BkU zdgA{8Nt45}xr^*-mqYuqVv)QYrUS=X=G#GSKIPO7y=#WFIg!;*-8MWqta)12p8JSo znGSy%{SeZvKGmk%Fg&zMe@gt@g4v?Dg|YW#Q~KBG2f+<`PZ(&H^WEvcV6%oK9&5MF zCmxmH)uiIi_*KyGzuPlTj>EyW8>UvCNrBm(ab6+tGg7+Ie0!qaTC*(QXjK7!hYp9D{N=!vkL({95p=z60^(>lLtl zHva%G7z3kM**L~)%D-qI4@;={WM06Tme}sd9OAs3T`R@3bkLtGvGbZ~wpa0j%q^ID zn#t9z4Wye=>N(fYR++VHxB+l>)DYTR$2bWZ$lvW(%QM+ zBD;GVYnk|oV~l$WW})HWRJ85Ay#-`waFN+XaEE>Ysuw;QNr@+RQ-}S}E3Ctcgn6 zeZ0BB!Kcg|rmTJ@dHT#h8nGXUo&lYUAg*<^U@}qZi)|!b7?bs<%p9j*W#XtMeWuu{ z`c~9t()oD>b6$51{l&K|p@-76?7ULyz!VEi%F;U-{2ys~87p#Bn#n&8B;I_xwLei- zwC#9KFkCHbCg}hxa-x9uj#^I+YI=5e+KH5ZbWs$LfL7yAk|y;6yEXe%Dq1^%FR`j~ zc!KgKD=mshzPO-wXAgg&#eU@5-8??Vq_WYj^zp^g$UW<=8nvv)_nLa4K7y{pr0Lq4 zACZvzP!~D1)@@*4-$b%w&{LOE)9+NQR#c6%2D|@@LEwM&8x2r1+lK zQa~hRVtqwv$)?%du6D=Ipri*O6}8AG?AK=%(Rs&2Gm&)r|7$ z7E%>rNcW(3E}x)4F)XrRxOVjBqQkk8kX=RovI8Hur}@sg3prEh zMNcNLe-SDp5)XPJmRryDwxDOwQDC`E?yf*NXyhLCojuM;^CHK(*HagVAh=wWWHiaV zEgVWp%lH~B7dbSZ+0F|(pK(%w9x}5p<5#Zq{{SeE0B^#w5abVu-_!EwyTJh&p4 zbbCl38ii39@sUy+86AE@NV2@vk;(}Ip^n{RJPMLaYsi7)iiH|{ox*@7kV)CdqL9o- zQOy(uk2h%qoNr@RtTf{@@J&Z=Zt}hu6Z93*>AF!=%I*fN=q%Xj_V($zN!d+kMJ2q4 zYD`<}RKCY@r;)vV#c0_zyd(FpVET#(Xt5oJ210@=~xxwE9pFU$b~pAt2p!#ETf@|_#qDO_@DjIu6C+J73P zbwHz+6<%Fc2tPP950KJZ{{So;U{o?{gy-fJi6*F|kQB8rTrmWQjRh#0a$FgK=BpSE zbDGYVTKhghO0WL_2@Fgs+lOcb`t8j-4Zq9va z+@4aS*+g@;9o0^4Ft%}Pis&M-xR<150jd80vS(42lN56b$09URPbyNRT{&VLxvr8` z@)Ux~PrYT_+$qTUXyz#+Ig%hq$u!irS05^7tu42ncp|Msrm~Fg7^QL8%6m2${m>M{ zZypYKHLYYL>>)5@{Zh8YHEpCfDaW;XB_cO zl6D#Ssgl3Vzy7l&?nqfj7e9Or>hvvti$AnR3J5t=msW(PH0 z&srW#W}-5hq)5ql%~f`8YI!8!)n+BLR7(?kb4llwr1B(ghMcx8-Ayz=-?kCnlwP)e z^-P**J#$X}%O3SYxf)-wJ!;D8Igf5>k!fHtCp96lMH~}N0dvFp<7t|#69zvk3iT`h z02j&P31P$MXdKs$t)K_JYS`aRWrk9Cu86%X2es*!>@8U&T;*^LL#O?s7-rjPGa)<_ zjMo#Q{6QA;KrR3(q-Qns4~PE%YHtmAXGxCOX?B+q05V+xr^uMLJj%j-P90cGwpSuN zV?J4~GhOh+`i8G{GsQ9&Z2thOHS~0Uwtk4skL-H|U;5-JlYZA89GI5=$kWSz*8yFW zxgxbNo!Rqq_;ThOUoJa&AN{?DHFDEH^0fR-V+8x7@pDSPZPIl?0+;jf`OwCeX0$w-#!)|f^09@L> zxgQp_f-*ckr{n&(imiS7NNURFVGDo+s1+Flm-35B)F{T|I?k<|X(|t4g{4 z%e(&ozhd6`DVVLkK-qe?_X-$+95ym#8$n(jC^@;yPVl5{{XHcj%D0A zS@K}`VXU9Kquu`i-?LK3@WWbP`GZ{_`(|tE_wkR6*N-~PANt}dTYY23_uqE%(R2R* zOoa-fLCSo)ZScFql6}nr^#1_cGg_9v3%pSePYqrZ{^fl^{h#pyQO>@R{{Xufsja** zBK-iU zo58*?T<69&3-kh{txudSz7zaFxjSwAF>=54(~2bhoW3F7%v|UStbe@Xz2;vJc&0fV zH;bB#+_rJ+x@0HXh)c%%Mq^MEqw)eMYu%I$~doN@IIzB z4HiDw71xIMM>EwSzJ};!TL;k8$}5S5o;Jv0E2Gly*_14t``50S$75S(6_?^GCDe3F zxCjSw8rF%o15NU`?q0-JRTbjU7WXCKe0yfTGNQ9*y9IQ1XGy%Y84?*l>j}aR|t~*z~ z1=5kh-ZCh+v6?o_jm2srp-g6hreMvWTd_Mv4N#XsV8?55T|tBv;L`n{XwMW3<0i0@ z*-7O76$}yr*mbU|^^;=)0j_rC2IGN>2V!`%=GghUm$fpGU zbaM}s#d|x5RP8vablbV$oA-~!Yg~=0OS;!Rs9ndns^>n`(-TK&4z!CN5Q5&-6W-4= zWzN;EM^5ttZUu+r0VKfw=s|2wDb*GwB{dZB>olGE~#UyMX;%C z@m5DM-6m}Gcax32t zY8qf?xB1X^HA)W=t*o0b?G*dhQ)%K@{GyjC%zl-F;t^|p7{d~S>S{{4qh+q>_X+#B zLbtU?bt#no;yjAxG^<&y=I6`XpIYqf*%~jI7?J(KNtBLjQPNqIl9;Y~NWRG-$gcM8 z>gkHH?JrBnr^6){#cm%>iQU_OXRO zDXfc&bqsI~Z2hHf2NfIJf(~d48CLi0XxUthR^^wC?k&Jj+*U=+u;+@*mNJC%Kv?yS z7sf4eKse^QlzV%)vg)}t;MN+9md-Y@724>YAf814l0_>Jb()TnkGRBf^saX1+V0q$ zvbHOuvb_>7H9YV~GMv*9#x9|I8RkMqy=qu$PbtHIO;2@aZytCCptle#pK}#RS2u0r zjzr}}Q@-%TSK+puq}BTq3oi{?5vm~JsfhDS-vVFRmUOu+Jq2ea?Z%Y*XAHnsu9imx zZ3eQn4-Q-E0Pj^9_M~WzQ%l$E?r=PzyWY1F{&ZZyY=l-uqu^^>V9y-o2=uHYbuN`A z7I$zvW~66hCx|W-6`I*pdWy!smJL9hPvtc(pW>J%0VcO;KDDzArk$uRR@-4UBS_<= z(Qk50S7FDcL@ci2C(et^9-voOf1|asmV@O3wrdJqR^rvlxCBr#D{*SvJVg(w6(sg> zY$hie^vzEN%vbz40G~>ovm=P2!uYA7n^SN0rwN|v0b9+g6UcHSo25MoE5r~d$FEyyMH z5BuoUFBCd|K6*=!K|!vit4&6Gfx;cW;;tEERsHJ$S{F@lf91nSt_@H3B5Q zxwbhGfbI0E5evtE-JwPGrbI5KZ}lO4>g;xRgn!4#LFquO%a+FGB+S=aN1-)N{{U5r zJdNT*^`^_GtAZ!F-Sjn4wCyr7a?VWxvomgWW|WYKX^`Ap9(FOUG4?xbl!cq>DXro$ z4n%gK{uB(RFD}shv7f|L>!@EyrAlM)rCnzB?2wkBN7AiD4fKO7fKV4P?lkMWqDg(U z*mMUR$#60Ct+uqCxM0}!6efop{{Vg6Xcfv4*jm6oX+s~aKm8d;%DbxR@XeBp`Nuxy zn7TT~e|F%Hb3lyezgUUeZpY{;hgh2gEG|C^>Fq5QN6Zxd6{8wksQKbU_*B?dJoar$ z;j@)t_*5w*vYw=UYtd$XIZ);VC+S%CQdu1AfG^UhRyo*otE+*;qMm#ubo}|i{xx}= zWbEVVQ`?D8M{H9_RxzK#m$8CD-;a8S`zrbag9hPUg|(~5Ih}=D7GVZjY>#?kvN&OA z?Zd^i{V7vKj$gd&pGxdzn$i_H0Gh(oH8}D_UUPlN6*5+B=C^FX z?X}P0PULcsK`pJrWuT_@*4C<++A2 z(29axORmRiqSuh7c`Z?k@JMEYC+iQe;WAK&i?k*w_991 zWO^Fw^goGO{+?B2nWaJMX{j_mNWIUZPKRjc=7KZ$R<*X56j6YP6nZGHBhh{}Mgpz% zxgYHc^luG(NzrvoEO!d5e}&CgJeVqRM`x#7tY|PXTG7tRDvh1QGbUqoIrOVQdK%R> zPbw!x-g0YmN{BecbMQGWwz|y@(Cy7!TV`z|ZWX|*_O~8gQ$c}EX)#?%oc1&&yWO5@ zqDh%eL?q2R0htM>c2$gP^R{U#2Ic-{t=(6N+*dm>`P!o6DoCWU;-V@$lU755+dwRR z1!!A%Yf`=$g2qV)(z0M--~e%5-@^;z8%=J_#&Ro+ytR_fc7}MG83$B#ApW(j;LE?V z>k;$Aaaz-Qjh@R3WY+GQGhFqt$*z-28Cvw>*@ca}X8CGp&(BqD&jzJN`RiA+AuUgk z{w;WN<`0V6yFyQwCJ!~t%>;I*6FrL{6eNPoxwV7lG%Z{qab#pNx*8+l#AGTY> z4pe?5kXC`*tvQx_;Y~ogY>mr4D@@#}`>UFAMI^lt&{fFo zU=gl46s_`;f(=}YO_7IIA5mHsJ{eh?F2;or=SMp%5>Lj!MOGRxcKMSZg?f#Th2TW_ zP%-zZ-^0k9l#NANMlNRqr+9KF>Pr3<)9Jn$Kmkc{^{oc7w~Ua}s(l4owX(D7ZIO0A}BZe*6oP2jd*z^_r+Oj?Ftm<&K|h2l_?qa(!ye$M#LEWT}cn?MS4Kdu_g{5eT9dKBBNSUkP0)W)})q>swlm zy&4u4_M_@6EA4XM5+z-VedsMC7T-!Xl4YB59`(}cy4%{O(4VD64ULRnJ3d?MNpYw_ z3YCqJ4|)qovn|Y5K>qI^g=bH18f4aF`rwS8-zVWzCh;UkIglTvGjv+NSlLJmn!t7gD>q&f9kUs2QVf{#x>JOE#gfADcB+EiX{L=^HQMS7Go~>+PQ0R%^%#O-*OKGoGGg&F0p7xAlh`bCUq=bk!|oR*!W-DfKNeJiK3OPf*i zXBD{u>DI`0%B1@W$JVtFRh9t9=qg58dE%W4%OMqsd*S^)<@XzgAB}VOU)pj=N(nLa ztGaca^N-$c&%FR#n@P5@OvO23Dw=C^+qTf9$I`Wy#i3lvnI83-f2~{D($mDzGtGv`qunD6pqn1-0fBN6sabW18hQB{*(tfi4B$I>XMj+ed>k&iKr%y-dkyM z-!5TKlisC$HZ3@AoTws!^PDb^p-k=j?dR)V2=LG;@|eN@0BWw!tXg2KcM7NJR37Kd zB>BOY*w7s1JC6*?!0wtbJ*zwW4%X5_Wpe)jO4xaA)Ev1d>s2JyE#N0HZ~BS}CA7HG zqZ?K>&#o%uX$+?^9DQpf_=?nm1+WL{RHoNkpDi&!9a{O3t`a!g>s63&*ZYB#wY;mP_?Jr2U& z($yE4$LB=%7H|XehWu-Umi)FrFZfhJnoQ%&Gz!S-F12eTk+fEO-&!#|Rzld#A>t_y z;ZrV^bVtc<=!{mXI((xi*Q8pP+A@l2Z_Zx%?I z3WA`M#WzxefS^{a9}TaVe(>$B8*hb*{{ZVHIrgS2BaZ&ko^0-A{OTt=hD$DM(c<_~ zXOEb;t5N(b(@=8EY7E@ZCSxZ%NyoKDQbzm1&*5IkpAM|z`-4APlz1vQ`XV2write~ zQElZvb{9W|JNq{FU%PJKm3v}%U`BY3Kgy?FEJ8U%{HcPG;e*4Pw4ZVUKBA;w3u^>( z7$1duWRR-ozU+{;+5hLvD z$9z{&KZxOAeqbv;Ul78%!{(~ta~$|m7XJX2TYm~c;Se){#af@mfpQcBP_K&J@&eNf zj2<3X`t2Wu2S$i};+4zamjvx|Kv=%| zdsz;MGRCk}z^fs#hAxk31Rz#hZ_pHJ>cF&ox?K5d)A@HAZb{K5&A7v32gp zJX8kleJe6uN3SBPHlRs7)45hRKHnG}D!jUscsv1E&2ziGSCNS(sGAxW7mC@z6`3^o zCz^$WoZu5t7$$Cre=2E_V0p;T%~jrW&owXheanB#HvFlLq+GY~AIh0FD!hZ5tn&e$ zYX1QC9l`3PQjZVF-9=Ih7|(Imp=*|{^WnC~N`&}%f$2>J%uhLuG`k+vx-<=+dZtY} zD90cg(J>ssSsS16J05WCFrB_sJat{qTpgBq@?n=snbm-t!jn`sKpti26)qe z9Ew!2k35RDUAf|sRFgmiRcs;=X4s`k3gwc2GQ%{7~Q9CKS47MB%f-Fd9|PbQSYI!T$hX$O45H=fm z!T$gnG%o<#Eu>b=cJR^x%U4`!#@d{YqfW=9`2PT0)BI7TLjEc6efE!dpLY5j z6kqqTUM|*?XgbP({&Mc!8;*>|?}Cee11k1*lh= zdu@RvmCh9bB${Hj(hYH+7(7}300_^8E@TG|>$G~(t3F6JD66x?_3si|>b@k^?pk6& zn`&p$u_Sb98JC|*<)F9{tH{TeY@F4_)Yb*+YvU@*noXYdDA^b0x|tZ|usx|0P*4u{ z&0)=|i3!7Es~Mzx;z3;I+@{6up%4dd39OgY=E>PrWk}3-qGI+_?vaH0w0Wu1~#3 zJ6ggBh9Sjs_kJJ)IhePwsG;#RL#%Gp>`l$cCNrF10raiCGR+CgDK*ER7YsB zD){F1JnXe^z*Xo;>zZwZOuWa()~w5<>ELEn!1rqLi9R6f4y9s-MKzrI*NOEOAUmp` zQ$@+K?K4T?n=*Xhg!`JOapJEI+Nt|I5V7rEGjX8m_k7%3V?XUu+jvSwIFj=pjVpqQ z-|Bx6f^Jwmn3uLI6aEu%J0CXi52aSK@C}2eX1m?^)|Ib@dg`~Y!pH#nRH-H8qvpEB09aiX zMCNIi^Qi*ZTZ6sOk?&NSN1E^NU6c6J%LC4ml4T=0maG-{G z$Iw+j_(&vt{{Wx^bFX$)Sg8-)JuC-1oq;22|K0yX<7n) z>nRmt*;zWA{U|lC>p+&{0^Eb@YQtvZjmn~%B8OggR8hl^yPw8^SdeMspPw{PT4mr6 zD4>#Sw}RvEfGPTRrDvwLR03zS~H!A9`gUO11r)rQ;rG zGzT&~4fIRzLO!(B@csOU0|vd?eH%$(%L7$cO46Zhh0O!G<8b&JRJc8WHKhl_+s9nI zm_F6(X!>Mh0PUxXjW~bHa6cLabIDJ_*@ssqf$*rGyiI!9zSC46^pRAqd_!Ss2@(gO zj$_WP{u#p&`J*jcHlGjeRe7}s>MKI?;uH~*u|vDx6-)jT+le!_EvrDe%Sqr{B>w=H zMEpffAA{@@Ifga-DvVw(^FP)|MNYcil;3(*G$Jm`i{bkidMsz~ryC12A8|hcQ9*ZP z-* z9Hr&d_Z%FGkWU+o`M9oT^H-7bBaWyOs9b&1v{eTw*Gs5J27X{_i|ZTnhEZJ1w%4c$ zcjBqMp-JB^C@DniA5a7w%z~)TdAm5dQC#=iE!X~9W}4cKxCfC`v@}sQq#)$|tQyL_ zxpv@ z94+}(T%J)^!8yi-#$GXe^=}MoFrs z;w3*MYA9b0>h}ZpvIR9Nco$HR6TG!F!<2>f1X0T<{Avc);7sOKt54t?ydCj15d1tP zzH}q&Rba7=b*;p}?U(Yb!>t8li5UJB-@)Juc-Q7d{AzXZEw^Nk@}j|G&D&aM1OUhI zsuvQ?K5-iy`&X_ng5!*F8h%vM;b_nk}GS z0W=*N-1JKHA>sR2m*qferN)^W=LiKfO^z--9u+@y3Y}~rjBudWLfT>+=ZcK!QF@wW zSi;0>pWTD_Qf`m_c@N6A{{XX)6M>p?*yH#q+?yQC*5QG|WALgiX5^eLcEe8HpO^Hg z-$^()6-koLJXp9KtwSZ50P$T^x?}UjRc$5DTC16yWblwpRcn0LUvr`;%}{MAS3Fa= z&Ufry)f3sU2Mb*cmU}_Ks&d9bJX5$F@wPds65D9WtqCCH)pm@G)d5+Q4%GqNbAeXM zns1ay=|B~cSRPGGtTD|VQ+iWOO;iGz2RNh>9@O2KG~s|K0L>*C6jDqNslEyLrFG2? z8);k{h(J~Z@_p;rf3m#jvPTv1Kf}Km%i&#i-hISCNLdHBt$o$u3;4DD3K`=egD5;# zeIuSnH#di_BVzD7A@-z;T)xu|+2J!N{vbK8M2kxdr;OD*y$8(C?!o*ku~WH;%v*S# z*7-h0*!|Sh;{O2syj9tLA6i}#+{G{Vmx{yHJQ=U(jMCeIeQY~_7AZJ1RnH^+sV}Y@ z!*=poU zv_P^b<(j$g9(*%r;yn`O_aoa3?G;YX;Wvvk-x5ozwuLU4WQ-2UTWb+r z$nxq-Q=s_m;oI*7zMptmZSA!NGFmJgGJR{Ke-Ykz$HCeyob2=8AXQQZSk_03Z*?Du zdd`t+EI(0d|~*FKaG4(D1?== zw{55a;MZO8!{WZ9uFCp0hELhl?UB^=uO79~@7&?kWc4|(6CH`>_ab^2YCmd3w(@R| z4aH38gkYT2nEW#M=5NZZ$Klw}e9{wM0qGfH*4zw$Nv1SpWFnf~i%E_%(6`pE#crwh zQ9lt-S24*8IpjPB`~^)8lW@oVTbk=Uxq#rtK7yijo1Dw}3SrDr)AaeH<*k%`YSqLI zwBc1vS5Rcm+ovbeq)QoC^=7RRoyx#m1C96|)XA;GgT6=4*0yc*=U@3|e;Sqaxg;DQ zrcKUeG^pe!_l{~*)1pJvpRI2#gt2676$F}ek}>2h0wA^1?a29%el=`aT7ke(NSZ9H zzw5cA{=}Vn$OxcTD@g=vowCM13KlGmZkHaytu3XrAej?!r$={Wr)ahr^)wY?rx63T zLm~DQ>wD*ozGz*Cu&o%bV9r)GT9Dte{nTH|f~;2;X*XLr8|zmhiCJ1I4TK3sl%v4kk#DZCgA*Dm~6y+12yEX-8T7On4RUsX0aY|R_oVTzvzDC@Vj{g9SaZz}h>L%b-#PLPb^=2PRXp^pvVHp1a zQb*%RZ-_iZ4RZru-oHNbezgRe;EyFs53Nv+;yaNbVn;8`14Nl$M=mg`ALSHxh$AptxX)QZT-_!4xo#{kp48Osm6c0 z-&&i8DYtE`GVm&CZ{B4fkJhkF`r{%o_)`X;7~z8t#-`%sFHZudB(y@{WQb5zm>Qty%N9z;Ri!waNlk9Mwm^yj+j6)fHo5{(R-?HMK@3 z<~5lW-12bI6seZp;#2a;wt%sz9l9q*YMERPH-2?a+fSSfyxA2ow#Gqh)CGwj%3+4t z_|;aifRentUX5BSI*}BYbx)>*F{du3dWyTxV$IKpJ4jX7BzMV zSpM{Wbtu0n(X&_y6_{<)UgzFm%zzz6RQcZI(`2?SpQ=i9r zS^^=21L|usZyq_%l_DUZe5SKl-N;EO{{V@mjV5kO9DPk;f5KmJE_YpiRNweWHxHUt zf5w32HzbbQ0DRfG_BBoKtU)*|{{V$#KB8qgOMU+US{G5&6k;1F^Xf$caW$6eH{v)6 z`ii#&jF$ubSW)j-aL3|1zx8mc1L!Hzcz4B<{n<)=C?}NZq0pin%0)wWG&*2DQmYYI zFn9;WGk>qt8AsNvkB8UrjL&||ezXEZ&x~%eR3f7K;-hVKq{(}YzQU)A!Q-RMTCGRm zt99j$>I+E8{@#gmnOW+*{w#_t;xgZbbx?R>#ReKNQn!V4mLD(zfN0=l@yQtrZhtC= z{u245$q^7fmFNS)ni?K(ezhuSS`rKuQ$ZFy-TXm3zjibER6|v~JtJfISE#O^pu{+d ze=3G%(c#aR68=;VL(M<5^&jB1VtsK)r(U|@BV->+^a(W>IT2g0rw8dUgp z&VPA$e+uea!r~wGqDpjEEe{(>`ifz51}}$tcptr%Myb=`{*u3TCv)m+p-bX^@lp6x zzitE_tOw9mh>l|p4+mMp_brFxQ@(*~8XfT z{z@F-=nIm|tlJ#^<^KRGrzWWZ&+Z@csb1dz;m74wo&3D=4FO^%zm2oD-M=bmo>R(0 zQVaH6{_Ram9-$+D%OOBmt}iZ7W62+tME5tca-c8aT88n!<}lRHwmHxGH6f&AweF!G z3_%}CuI+Jio!ADoCckCQZK?rqBnS6l4I->&ohE4yFH$ClC0Xf-YaAW3Ml&=t`21s(Wkb4XUzd(tIq^^!v2*T+(yW7g#Hzv zY$8$f5NZh^Nb|LY1hitd_G7jt{HhsYmj@}2t!uR9Nddn~iJ1w@oYf|0WOGv3+(_q< zieqV;N6y^WK|HVl@(yb{dzBeAX@!g#w8F&TQAHB@xuiiPA=%}9+Tz1()M zTKWU_a`@K%7}R6aH93n|xe5y&mGgWvA^W|3Yf8l?R`XSg*7WCRW@RX!s#a|jvBx|P zB(|ADBMwJ3bif#KUmkn~{h=oC;EPDsWHaf^LaQ<6I{M#2*EIcl)owKVsO};asUh(d(y2dZ*gY{=vDn*dSoV_5A^KEt#|&+jj!b*j zBY2W$$?{t@5Bw!Fle9p?>p~MpPS=*oyhqQyF)#Y!-Er$!AKFvSxhhBDRHoEr$zR@n z6v?sEKBcgp5PkxL)rJmnT$z}#%Qn&OYP;$dkRP7&Z{tiXcAwhB_r)*vp~v6FaSP%t zIB>V2jVSR1C+f{LxFFY68b$73^#O04-I8JnI(e)>I#jaf_kcN%v#9#b{ahc3>UJjAHcWI_Uo>j-xRk&>- zhobKKiU9N2*88*s{c6CD^n;sKKT}?S3>d>ew7yNFbLA-fXamlpv%bmy07i^e$n;Cw zmB+}RO6|YmUYXpB`P1XnwD^AF4A2J!FNO68fp4_ndo5Eo_jb>QyMLfc^zZGc7;vkK zt0uFjsrlnVeu98Fh-15a1rop1RiUKby5z(8n(3w2?2p_`eJZTF?WrH?*#0yDkq3q^ z?sJW+?V7s>gYMM)>aF3rh&gZO64u4x4Wm56xH} zCPx_BKNC%pR)N7gP#T>}EW@SRN;ptzL*d&J31GF2Catucj0e)9{@Nq&F+YtK18KZH zV83-mM0ATZ>ku`H{vl<~z)e7PtBJS-iYx~~_B%Mo5dl#=w(;~htS>U+U-@XloR$vb zEin{W4OhK~1P*GXmrB{iLlu-6!(2$m&@EqsOSXRVH{n!4o@P$$KN=F|4B*JQt)%e$ za{btuzuu`6!V*dMZKEFK&<1MHmH8MNVKX;DTdCm-i2BNkJq1pl7Gw9WarB@LY+GD6 zKxqwy>FBLpJ9ugshFa;r15o{*+T7sFBV*oxIniTsKKi%iQ^Rf-?<4+Ix%Qhi2jrE% z;8h!6+Am9457nq7tppGe_Z#u6No5KC1^jA1?N~;3+JXM_Qm(Ar?1~ZfGy!RBV#nM{ zD!2CC*y-d7C<355)z<-BeiYX5&bx8Xn8Ljcb&GgU1rOm)J|c*WarjV8&p(U7dcphi z;-x+V)Sv!dO?Hi{MIk>q6)aa!<0fhabA|r^g?*^wn}TVF;pNM5B$ zonbJ0iU)Iv{{V$&7g;Wk=S)5T)1v#+Za-S+rqpfZW4JX&rpivu_|Q9;vG^}a9Zv7Y zu0i1KAb-mZ-&)f}vrgFh)XRNs4@X)D%u!zlX=P5^brja{U5V$)1L;}=Ux9c4H7M~E zct5($0nAmk@Xdw4{Ie#mrjcf!as!&DFN#tkaRI1Dj2oS>&@N+GMI=9Qc8YplO&?Ru zWB&lcT{MFqW~Lo}Q^|-53AwuZrQDeTN7kuME@#f-qO#v!xqbv-R4;jXC?_AS14z*R z&YiMEswu5ubff)x{&kMmH!4o&Bk`skK&bhpKb-~G*h?$2d6XKowrs2W*#%+S>g=cG zJHDo_uC#Xi$PEEv;fBm-eoxY(d33}W@|>Ee`o{-sYgzXigzQOGQ9%|pM3zT5w_-i% z3R+2=TYh!VKBssxH>%Vo^69_jx8+(`o>p{nMG}va5GuGcDfvQ=tzrr8TcnI>HeSAP z=kYXHIa#~s-}AO;)`Zk`7)jlC9xI-cPQ7lk1^j9;p-%ZNaz8pO9IWVPxVpLrHz;bS z*e)3JaULrq>C(Z++B5jmRUCck3H)fVaHzOzD5@< zQ-T8Jpv?iwGV1I$LYkn`OU~9mg-bokl0buRy+)EJB(^9HQZ!kZo#nChspE<<_lpxs zC4~2L^rjgj{uN{R)s{I@*|Cgqnf%BH8C{0=~|Z>%<7T24H@bNb8Y4KrYAFQE@bH9bxi*QBf3KWmHsM z7p4>e0cpvRZje&S8AQ6fL%Kv70f8Z;JCz)yyHiR!lrE)*ZfD2=hIzmH{kuQTTKBA* zdq4XLaQ)g(G%veDrq#LZ{t*x7YZut1JsNO+n@iI%z;Dt1s)aAT;MTONL84bSufvh` zy3{$1=*iN1KvYJgM2{NTH?*2&%jpR)t}IHrL|=(_e|3b4zTK=V*XO-Psq z&P)#cElOm%=$200xfY}s6g zWHB!q8I?`?jsAj5_#`E3+=fhATVTx_jp1l6597>~VFmlF+`ESAX!JW9t{3FP=||Mn zBt#Fqi9WfB-*mMl{cBINJocXVu2mmC>Liz+ue++YZ8w0hw4tBSH8F_%nw8f+X^Gq$ zDobJ2z39YHseEqy84)wpZJwlQ4R%Sp)w+{rBfojN@lI=k&+CSw*_eM%a9c0OWZ9jl zZGQ3c&b3TDbQgT8H<2rp&!-n;(qLu7;xeIQmE-sL%~5X6)>DdIt~ljW>)mL(i z2+>5K<#|b8z2e>AH`ENb{hP%c{W@q$ekn%4&KldtQs+-OTPFpF+UkE;-7@i=u%{vo z=d~=FH}aZxg{mLG{+Vwt%iaaK;ev$K2ma`zx)e*fMpBJ?nh6JWmrZyW5rF+gOHWSm z_`Xk-{;vcJ+T>gJ!UuKTuseO5wlNa|fuRz|=wO$i-UyX#l{Qd&tZY#79COyx92XiL*{YKmcK_kEOO?5EZN={+;eGyQa|l2@|s8oBDXF=pc2^>mHVd z6!&_KjRdf|EH{avdR9~|UqLC4G}8 z8>^F~sl1KXyEo4)$$UQ9OETq%_l>BFOX8=KJA(vR6srZb&cJ#I4TfBKdrvv5I|6sO z3WRR_RO5q~H`>)sT1@r}#^VGAB#|LPQ*k97qlv@s{$GknLGt`)SR zi=u0wWt8q<1q#Rf)>$!W%r!T$1s&sD-Ce8hKhx<*>4)z-k*i?2lHXlGMUm$uiq!=3~U;%Sq zjho+w)1oVXIBPX0)Vg_%I2fYtP=j0Oe?kIlr;qNy^a_#ZK-a^_HN)M~VsiIo7SGi@DUG z8?PF8QFD#IMRr_)ElWa3fA)UP&J#7lmvM5)N|TO2JAdy^6Q?K#OwI2Oqw{D);f~=L z(ux_;8_HTETlzD759k?HXEA@nh^2I-rA#RJ7_*2I$k6jrq@9;TbaiT~ zi#;iW#S(wyR!eRrul-(Qm{zVu@|krOlw&p=s6S1@LaLSJCP|dVR8*amA4>l&VSHGR?|j;UOOmX)7#Ek`B^qN3;KYML+yk=P`yE!smWb@-G6G3J zx7qJXLE2Lqmy|v$DNVHK3yI*oR>P0TU1Y$BCUM?G^E^TZ@&nyhCa~gQGU7R2_XxS_KgK zI~sH|@qbu2Rmxj^Ny(&xbM2maPi70PKjrGutF+3vUrn{eu7y4a{!*$?_jwYp9v5-If<6OaiHwJc#^1@ghts(N>aPxzD`Ycy+oSh-4Z8B3$Hhx zUYTxQ)Qjz7nGWM#v2?5pFqAID>3Sl!$A!$tiuN{*BNB;)8$I->yy<)5_#!w#!@C*l z%#%0Ek_>jcuPND=0bPj2&B&4efUi91RCZEU+)*3UVq`OUFzhT+%ZYe_6DDCi-DMCj z!SP+#X~xGF{m7;+hDwo#7=%bw{0~c7_q^y^m59;Nk3gGU0VrWiOPs^x>qWI5R#_6( z1SnzgI&&1K*NZzsiLl=X@~53X_GqW$AV-l4y4?+n)+>AfbB?jrNdAZB+9MLFd~J|0 zojXrrpxG{Bwwlk)_eAyG6;1(WwOfMw1L~U63!hgqlyb&%It1J-_FE{-I4pbD)N-Dk zUcGq&rN?)(gbT4wUm!|9WLx+!pLZUwuPl}TK^ak)0Yp4=^cUF4%}9F%h3q^iqLC*! z9iO|6y6y>tS^UCc?;k(1#)Q;c0Zv>$kuPMo)`>J+P){!uMpEKe zMsDt50BL1?8~LrFVjICeShnxZvl@*3N5Th^fMv(1!2vv}k=e_sq}yVxJ$NBL$(YB* zmbl9#jiAZU+&Sl1uZ!&XwHQcriuspd()y%wegoF&=7WH@*;t!)exy>y3GenRbJ>V* z4T~RQe?BF$14YPOzZzh-)<)@*jKE%Yra(VogCYzhKh|(dS)q?-7B^<}NK2$mBOrbN zVmMiZXl;A>AC_KWanetdt|&p4VczMn4~*5$)s3qpA+U-90|`o$KQ~}<=5woGj-fYw zdAswe1}-)_MTE*u5var3EH5y4xrOp5lfAtchx{`r22(V&X;CjTqx2%TT>tueq2|L* zJ$@H}ymUCC|HEo4H=$%i$$mXfmhyPv7@RgiH zAM$r^R|o!z*fT^)u3XqB{dTlSMa3SRbX%D-vW0*IyjXE5YKEsyxcXF~Qgg8gN-B~+ z{w6^VLpo2@=!2tpFD4pH_SNm5;2xToWBgrYh8vEnFW!B&PveSdTBJ!h=9%rMwd<^% zyX-b6xEF<$Uj3Dg$~Ne__!Nv^Uq&oTHj-=fz^k$$yDT9m=DVR1$(rWIcsGu`~Mf02un_CJoYc4eq@fnXP%}Q>A)i z#TPW>*3;G;nCXG5mSmcjBvfqkkd2#OMBLNKwFO8Kvkhi__NS&Op$Sfm?q$Y|Nd=S} zC>2KRp}MRyM-pAIAc1ou>@uz|{LsW;9sh;B>ads*>de&B%L-OezK2|R=uaWeE}LJ> zCjaf1Q&8lW|1 ziNk-M1|_q5zH~N;OUg12jx1Y)z5vV%0U7xmZhZtl{GduRNcPclu9l%t@7~X!gSch7 z+&U@R7DFVR#E9O(zVYhq`C<_NcZf-7v$=`pt+)17g^k*5$HGa-3k}WL zhL0`u#;=3VZ7!?GP?mZ&7jkh1TZlXaNaO{Yhp=NJ&3SNp5|a0pzui3$keMg=62X;6 z*3&Mlp80(!TMxug*4nxglsfZ`{7No^8!}H{`C6hLSpO^)3>EX)l#6jDr(CN9{`6l# zDeAQ22aN~o6Cl(N@q$V`PAy_`+(~W~rwJ2kKWH)4p!B_%nLGmtB&PmlCAEM_qjZ%1 zrW6nPo(4H}?if_aZ#7=M2y)z$@oWebZ`Qt$K&vZ(LCe5ZS^UB3{{$ienoM5*`F21r zG>SBwzfd|CBNj|bYBDlI`QUVZWN?_9hSE1&;@4x~g_U5rnjU8M`Naz90;)~<@Pr~n zt$Cp8V-l8c!IT4A>=J!n&kIO0yit0&$$(DJ#CRt%f!I^nFJ?(xnJEW9rfk*2hIJa> z(fdKX?q%Js@x`Hu2Pbtol&~Mn*QMoAJiZYjCT;a8Esxp;rS-V~Zy&+KT6VBLcRrkk z!0}tPB}%oFGmpa-&7+UxPJwRE+JU!1_&d4+_hwm9x>W2I>e<0mddIV6;CC1?G9+6y zbYAR{*;4FP(dN%8U1I&OXPd!P2~16ULC3yRv(<_fk4?7B|Hd+Fp$m{zBEfF?qE^ zfDe>;oaP!xd}ehCAMO%(gSH}hFJc_JDaO@|U#xkng==z9eyr6!*XqH+Gd-7wGWwQH z5>+Aou=d?bhPKB$1U)&ZU*%G+$M~0{S{^>3oiydZxodzQan>6C$jRG%(&`y=ioLQRt z=CXbk3mAlR1I-uFe_IBk*uNF|D@p7g9Gy;jd(?f&P^u~xfrY^>R-&#v*Z`LtQm3oaj9!;PK9|s-$ znri!!$SWfc*JpRr_z*Yvw$Ex(K~)Nhm~CfFaFf^7$N2lMoGMBeGDX@uG$|aqq7oXA4A0RO$l$-yY~f_>u^#Eq#}OicztEtPij# z+iOVtF~FX02JMzT&TMo)7YCopFv|Bv6s3D2l1d!kZYtUCd(v&|8YY6RzhQhh(HyQH zpSWZxPHW-&gF;UG&&TB5L5Tb-z)dX&b1SO#2!eWhqKh%r0X;TO8QcjXHiJ_9Rh`FH z%3es`HPWND`?cve>1)=uucjGQsM+lm`xhwS6W1V}v6&F^`asW0r_(J{cX7P} z2QpwFx4vg~njY*O4ws+VEdk~E!Vswn!T&P3m|m=*oo?sedc^~HrJMf~mY2^Tobgf6 zY9T52-h@xYHA0{u{B3Q<51;a&xOz0=bpSAQCJqB72=y?cLP!K4CZ~}NoyGeX6}sB1 z61f=fN0V5AuaQIy55=Uz)kBCI^Z39e9w^<3T^{UgH3c=t8f*XYV^=Cugi=Wi(Gmm|9{yM8798PHn$+R=`CWnz{Syq85A+!)?^TW=s06 zmC~TV4z!B`aRBxG_(sAbZq`uDz>=a;1@cgG`C+F{PVzK6QNL2~G>4X8yaoGr;$!vK zdVRmKE1Qgu0Jj){{%+bUVnKX&4}FsxB^$Iig;!YOindvrBQfN6rv}|Gv9+LHbzDNa z3_(7~59bfc{V~NO6IQVPY#E!hQcT8r&Z#Jg%>>J_r1cJvw@Hl~p;HBzT=hcKhK|{--#%lb^pG1)p57QeBNBGBEOMVtVFq*h3{}2QY^{sIH6Ke;XDxte>+ecJ z#r4qT^$dMTYuS!xr1yK@dcgAHFEOg7=dbcTpDN$#TE{6)n%jUP^v62l1AVK(+t`>> zp}x{0N0y)B}Nt`Wc&-bQ|Jk$UO1pN3j= zMCfND8T%%<5oV4A_ixb$xH@l~r||bVk)>l>MBazts6{(i=w4Rzg%XvuTV!fG=P5_H zoH5;rnmFr4fpbHfEUyTL>U7zbzfY7D`-o`v!?cL%sl7%jS22@~cLwRU9%+~l6+?&E zb3|f6RMy3f{J3g{ZFoxY`RE)*(xM2G7 z0=8PWSWV2U5mguxBw|*~#KKh;(5>Hrl*Jcc09+ ze|Tv$x3@%7Zr-0=&D`fez^W|C&6X`{$f#%c4&Irw@18*!}rea zm9|`N)-IC&^dse%zk@<+{QyBH+=%R|Mv8X@&rAaw++xUA1}?(0O`!)3!$@QJH!V@u zPlHUFEiP1Y03(X*?8RS7)`5SpCunHDa>nRy^Cb_1Gt^MAPH%~5c6jR(H{@F_Uc{3I zG`R_+gyE4rcqlg%#m4F6O`{WFR?3VMaGO>d=YKPNZ1~m+&6&s*|KdPc1aJJ7jk&eL zE&nLfmA~kOwfyd5msTc~M0Rb>NF&;Y{rCl{-yT{AbOSrzE_7?dtGT!MV*eFMDgKho zhW=YQ1I7oxJq*_A=k4Ke-1S;gJPidCH-R6`VY{J&VHN9&6)(W1b=xvt&!vW>2&bKQC*4Md1`%6L6fhQFMM3?Vzt&W8{h%XIktL_2dE z8fo^@6Dr1HZKbEr1uz@@P3Dv$9GpalD0 zWrtZnp&X-B($+ZBcUzoxQTnKLsVIrn4_(=n{~~&SA01&DyCip_e76vhq!Mi>-8)zH;HD#5b6b;mkPKXdrZ>{P{RKJS!VS8uegmn$H*Jl$t*o#T zx7IRj22mH3o~jo;6X)B@qI441?L~G@TfA7u*{iZ+x4R_+j_tSP zMz$4ihI=#_JBXPVh z<|lBVPwwRIZcylwwFK$bFCaQUyaufSZc^Cgn6WbK@DKEe>I)wc5DEo~P~KUg`Ay=PJugxpGwa1z}#(bw^T9A%8wY7Qs`jx3%qmLAeWq%bT-CyNL zLRuN~{C(U+t~X*7maEBf(FP$Md_VNaZ~|9#Szb-=vq5(Cc5uvgZ6PW#)i&>;-kW!6 zZxt#Q_~w$D&hD&J#D0lEkSB^;ygBW&YG1za^&)tDdLsnvb{LXA6_B(Fk{wR;>A+0t z#Y}1OM{jGj1L^4hiQ_*U<&zS!cZ~kPMHY}`@}k~ug2tQQ&llpd*y|pe{ct*$Yd38v zw#$~@^Kr&H;y^Og5Gzm!iOB)l@vi@0AnXDFKesC(4dOXIKc2%I3ulf9;7`Cbm zb9T6%Qw9wC*nxjMXVVueYtHqQe?=coWx3dxt}NL`Uhiwsmp5T5ZLUQB3O+gDAq)I_ zswb6AJxf6Piz2DU>E}y{=ha3nv=jwY?_Kbca$<4zT8$pYQ#sl#HHYhM7eJL@o+jtH zPi#qm75fpBYS@#fMaW9exE_DAAeSf3>*cq1bG`TPf)2OD>xN=#6U_2!+;A6?rtoxojoPGo_A zrE#%Yj8geWroVk_X_u8Lhd*liwrFtI0XlDxjz&YuRe^wm3cp@1Ulg)DzJ3#P1k`=z zIDSMrd0xppv|vVO6;FGtAVU}AmM!9OSv(u8M&B)p?mJr+#N^U$VbktEEDMpV^28>>w5&dm z3C_vI+$O&X^SQEi(vxHE+_CISx6>+*|09_&rV4BS&k+;YzW#N<&-r)YW;gS!*l(M$ z4~7+t_CE!GNn-T=Ty=7?iSF4ubNGMlrg%Z6ev)3iv3LS|3AvnlPuIzngO6-w07$Qdy`Pk@&92 zZG;rUz5VK4Wf0F`{rOcuFF5rW67gBo#8&631ppQ^nimrMBBk|7kkVkMe?^lA0Nu20 zR#cJX)BFbjFapQTWS$`TXZ25y80 z;Sz0l(=;(VMP}_I1Zi45y}o(xIl4cfY!r8%2H0f8D5C15DdFF(7SrL>ieD;d+i~^IpqPoHjp)L(h*aBv4W;Th z!p+M39ZW-cYjCg?5?Ji%vg|!B^M&`b{_FVj;_u|&;_*-@RbvW()^LsM~_3T5yb2rxtB*LvcTrl2l4oDN8)ZFZA;32 zQ|K;S&mILW&yNRKG#-8;+EFitfgsXXTk|z}o;PYeKNnPUqD!G`&Ll^VsEI8x?X4E+qgDfgJkLgda8xMSl$B^6`;a)_U=zZ`GhAeqq?5^c_s; z*mET(&$lK>XPa5_`;FY;-`$+yTTvD*@R}zTR4pB(X#b||X)O+47GC{Fsn)^G%0at| zU$_MusK)rRqowRyGw@4!I-Y7J`IOTS3i((Y!JNGVE^X~(Kqj*M zy*g?BylALXh=~tNEC1dfEdh;fp#(Vng+v45++pf#5L1wdwkBd*PoG@?_ks6&$E!(C zR>z!Hy6V42!lu}*HkV?BJSSVa{mY5DL&XYgpN6oUbzV)ck}PbD)iuL-D@VD=mRE`U z#T2efrSd=X*EaFqIuWogmN?Awv7Q&l{O!p&AfPZoBS%RWi%q|~2m8&eEKx>g?K$Z5 z#_a+s?_zUn%wK}@+y~y-;<@Tt8n5?|*-9YXU6J06oR?Hh+hY}86KLvLa29JhKAf(ckr*Fl~*f!GmxdPVIj( ziAU=6N`VPS`G3nz2k5{AdY~GH_P2)Fs0$I_1X)`SXz$GSr&2?98a~gNTmu%&On3zk2Z! zXy@*-u=ub6(Ye+( zlP`-az`1WDhLC(p1L2FeYMEFNF{?!zi$@T{f+qz6A z`?BUug0pF$My7!6-xrq!#0!Y0CnRn;7p0Jaszu#KB%u4C*|KZ?)t?T&+(CuAW4|8;a+34whsBMe-O-0Fsvg#wHP8=f>^I2cYQTYc4|C}f|`Z%6L+~>R!s-0DbgDa zTdpp|K|$kZpA-o!Z_06T%mpp&q%r{X$96{SV;zCbsk#0}V$s+`f6&`X+^wgkvC(g@ zC$Ov%c#UF|O=bHFP1Vg(={1v=R6&DJw((z$T$ITpnN>ZWP-2g(I+e?H!Zee0{O>}d zL#;On|5*;DY%G7}!YXyj=crHfR01@_*!zW;bH3ZmNeE#!Z-;;(=FKj;YBqDPf0s6l z72CMUg_`>O!#N-`!t$6|Si|Mr~T_61`O9a%~zRN8p0T&X#vbDRgil5HM%nc zKn!7dIR5w(lp#Sp6ma3tL%B=%4Rt0m&m#O5j%qA_slY z8;}jT@`v)ASRug)90sE18!Ek|(aob;x6x6E0unOO9InXcs<(P6hXJMx4IU`N_jkit z0V{9y(ZGP}Pk`;O-qZ5@dF(MpK?U5*Gz1ms8l1s=Yo8Ka*eU)v#*wh4Unw}f?s1ma zZ;fwvTKJTA0_ouopM~!9cnc5X{j=tSc$-~W)--g)Mk*@a&wbdtHBunP@@O~+Fhrxp z*z%d?NO`^0ebXE>onKB60&eK=Y440Nr)}WwO1QkC(ZFYV|G{9WB`>0PO&`41YTYo$ zf2T~L%c+X<@;m8l2>JYqc>lL0L=}g)A;tutxRl{6Gj9^se`IE)68a}YinDt4W91Ss zR1vD+^}n54ba{0@ELJ8|pQ4f(zZYsWMOUm%fdSGJHOWo;gPkbn_U8EB@=>z_7~R|n zNGg?wpuT2nMc{YwLMMdQM4`;{F;)H#gKW*0!*BYkTJOMLo8bT%8uugGqqOOn>sa~H zkcpRoeA~W`dV!I|_(=8_RKN-Y2N!nK@GEB}>h1HwJOFDt?Y)7TaN&meUj=%76uPWT z5-1qiYu!Jz2>XG_M}MHCKb4472{mSXt%#33Pl!!Rc?(aiB(lgO#o zuQdr#;8f~G<~KTmR)Ye6FAF=0u0qo$wG2SluyIU{odZ#w~^2@7(r4c*glmwli)0D!a`jtfs=M3+m4lraYC zh4zAjv@8tf!Of&GX##I^-0v21Aq1jfe=|yO>XIVXK?yHQWrGfgsh8Que@CO>wcw z9;Gax@plN@@#|FLY3qgmgrQqBHo zjo1(vme|MfZHrffP=+)|Pso|eZBee3n;9=KqWC;w#mJK=DG=4u;MXu;wU7swmw~UA z8qO7n0Wh;JT5&xJSRkN@ALJ`?eES_+!Ia1LFJqojDh*mZ3#UtpN5Q*MkLLuF61_s z@_rRLM?VqLfD+bbwk__&yvRXPQU<7^+EkO#)yD>|X!(-Sm$o04zA*})TV^qTJuj1Y zt&qQYpN6EwKGr&t{EQys8d)rLg=&0x*2E0;vQU{_@1rG2B`v5-DL$9553|4ND{B=wv7XsEJmI$A4$h-)85n(rfE5Dyl?Y3lQ%JUR zgrwSJic)PE+~r<$V3*wO%qOD~Y8=jYgaNY%kyZ9kcG`y(m<12yyk&pozSWF#L4L(_sB|M+C`7z5lSfS}gX5Z=U|W*aSr| zGXlgO;%3*96r%@XZMUe!cT#wI; zk!|!=?`{6YW`a(IdnN1LRIX{LQ{#&i_Lr;Z+4xg%U;#Nvy1#8Q?}RerVg1FDYqNp* z%78Coe1M+k(`KUExyNbFYy*EQm|CoU`_I$m&eUGZI{W!71yiYjN8;(q>bNcF^tfyGpB;CYEn+Pt(V^CumNV;3%y^e&4Ug2*0(BqzbyFaKL?f#KUvJs z938@MdE;{erGUUqQvF0BY#BE=08gY)?_uqyE>L3I@VCsT3O~g?l7H)3HQ*+&6?MRC zg(i9duZ5~W;E&oZ+Yi?FLiSkbb_}0*5e(_N94pv-Gs92?XyRFlGjqs`nS+^}kyS6- zb-0L9+50I6JrroxYX)7rQq{;Zuc$PZ`m=K#-z6-31Q8#Nmi=lQy{clf9&zLFtn8Ub zIy}dJ$x4`LNqVGhR~#LF3PimlYo()DmqYkQ$_|Bh)LkwHbI4R<+*Gg8#({3#!PLnW)(J=bkfU=WWy@=db&?8iGY z8RN8}%^(_GsTU4059(me2UyhS1T}J`&N&BQ$MEO z=&&UED=C6ZJuh_}zeJho$L98_oPOw*f1z&N?`dj#3be>)n`SqUW1V-1p^Xd@V%MRq zG1HoPznhxpfiBmMaRfzPZ#e}y`-lIiR!0`Z!B2D9Zgb}EmkeMOWuAs)Wcs_v^iP8K zgRvn1_XcYBN^v><-Rhj?0Fe>Q)0q~$_d^uP80o$^{p*Yl#?kq`5qfQhZR~t!jGYF{_x3l9lBnnjMy+#YK@i(STYHew;#ZOIW)gldOFAPo+asJ z;C~mz9#uuG=$mD^Ci29g1kPrr&i)2@m>(`NRLIZ&P3mTQ-Nd~*R~^2pg^#sP+?D<> zR_*n@s?O{1D@2y@ccQC0dCAMT^JutRc?}V<=Qv!=ur=kuAVj*$4`PqL8!j4je&TDq@ z*IX8L^}FKjYKuG`7OAX>Z8Zl*NP=Xi@iUDkstP#dQi2+^S67`WloMKx*FWfTKVpTv zH5PWdj#RL5X}{OP&o8a1IIM_F_^Wy2rOMI9Hr7>KzP{Bh{J7O9@xA`YO@!k9-v;J_ zgsA&w?7bA{o5rWCdHjjJ zwDPb`IWrfPxS^s`w{zbBCszHFVG44o-C)T>*6nI(ZoPS%8~@(0JSa}{Us*ZTi#cxx zGkW&NA<{jh&!lYx3bGq}_+f=sywe(?g*e7F>4cgm(5LxNU(jJ~j>P`+_`T1xV4z7p z)qa|C6R_7!Xi16+)&uKoF6!me&)Rswc4Zint}|9EEmWgMN{@`X_+bFSzq5W!W-|DtCHL1sF&@Ed({syua#RHUcxIPq)-_#E2Oen`C z7o>lRo^(C|3x7!jAe#9kxKU2V^9hL_(pG|X#n}+9Bzl>*IIE-qVV2Kv^U4cr>iP-n zIX^U#))>WY?ya-^@Q|4mg2G>V_2E*9n*3Xa#Pd6?1~SL8v#r0pTM$Dz>#|58z|AB- ze-yhczSBvf82Jb`R+rr%6|j+beIPH2dJ!7#`(=TaS~KC#QvzZ#RQs<~W1t}_;tW|! zKkYR603sFmlWP$wLl-_=_%yzoN*+VM0qXRvxf0dF0f>YAl_U9dRb~ftvtd-gC-Rt8 zJ7Q`Blp%fO!8N=KiLiB>pcpPhOjhp;^J4UEFl5I&&!vVwGtlLA=yp2nYMEJ@lDn5f z330PI6P4lj@LZ9-=u1~4+z7TH-lepYCSQOLm_Z%g4)7X9HECRVbuBj~N*Se$XpbI! z{$P+DSe#qyG*xV*jCSNAam;7nZ~2zA%CD1BBe`v*Yq6RQhCQG97MXtd!v^%N1bc#F zfPBtkXE(Z3TJkK|6;&4yr!oiWYOl~pE3WTbk@1qdMVTDcjBVV`Wwbnh{7UF9`zGzX zlcKm?IXj{?=Y{x6Hn7hqMpZ)@SvhB+N*B3vSk31sH1iLr1n({2A{pzH!W63xoM%LS zchl@gt5e(-{irDs1+2e211(j${cW+TC!%CnJmUYGwQ}25O@A%~cJ|o*T(ZMz7_iPb zXUlf0s$ofR*a#(z1x^K1Mn1l8b~rC*N5usfY_Z-NmO%R%OJCn`5ByxV0{M`_4QLcI z1qavUKv$eVSk~a_JLy41xJ7|9QR!2_a413ngF81W9t!0FIsqC~PI>;9I=FV-psQNz zC(`k5?k-~6tcgkxfcp|Vuq5*>ofq&^gePsuBc8iP9dU1Osc%l5C1a@m0{6MSk(1x; zRxb{5Hb}w`)YDsYTegE+sy^t-RVdl8$d2HyIUuH)pxj#x*3W>1oH9=KH7$oUt09qM z`0LGVp9wR9+5f)0JvE|h1BFrxg=oc+hHRz1$Ur~BcFcgnt&KsQ&YIimZcKkipWKV^ zn_5POzWo~t43`Mcso?BkHv22_2DL#v{BYDS;5S_o25spvdT*Owq@YE`BG1 zWMew=+kexl;`N76pIj);i|6(bR2A_Ncyze3m4UJfA4JDX>qfR6Rd#+8dwsPeP9HUX zr!#~&^L!bvxEL~hxHNR_1`YbX@Rll$z@Ar)v+eG7(Wj6 zxrtHg{i-=kI?tMesKA%trB#Bec}2%Mf&;DwYswUnXh*hFrn51B3T7Y`%Mce&VI#v` z5OHrD2z%2jX^m1eZN6{p3>L*c(C)LLcd$+>k(6sp2l)E^ip9tD?&mMTSJILO&3SBW zTKM_`2_J(Uw0>Qd&l0`xWqJQ;tHXb?;|W*o1WNzS-41c8Cus|=R4Dv2J*>Ta5D0$a z;YJgc^}nX~@eF$8nSu%jXi-YmK@k8mqvAg-55Q8EMp7SPpFekPXar=@3Yx)NoBc(CnC9hkSp z_&!PZS;L$}iqe)-Uu@={$=@wCF8@7f^SJ#mYFqiqf}lPx#`swfv3jgJla@e9%ZIoq zZNRVQxQ$@6*ZK|bv^~nd^yK$f?#l^75V7dk$k@y0mlgG9TO3IK<LisERFr1Y~+JDE%)MR^bj2q5QpU6}~@VrJDR=(hCj0Avu&Yu>{F-ofLdY>k+ zZ9F%IQza?0D8TcAu}{2qhszGl9(u#YzNWdD=B+RIp}|Y(AKx|onWlb~HY_gghjX7@ zFRhPDdS%*^F}#kl925c`vv>Xthx#X%<{who8#9>=>_6F9M)bJxI^6&fN~-h>&)nY- zyT7JWC@y2tn|xEr`uMw}cx&$G6d9&$X?<&wr%~XHfR!PGFMg$$%|ENs7&0-0Ne495iq3Kk{Lg8U#;DN`NpWGj+0*n?&PC?A}c9pF# z@*2v(qwOP}X;egO@B)>`@13cXbb;yhL_XfW$slCsI5`#1NpcH&1 zqc5~*9He0cXDnl;6C2vHf#O}X4@YGGOy^MRFLP3Tzzh0;ewF?_{UO4J@WJt&rV(Y% zfeNF%+9+ggs$ldYi!jq88)ceAS4+OuqKg6&RScEgat~^EMW=0`=I!v)*gv&x7;375 z=PouVUHUDO?6;2zXn^ul0L-v)%B%!RkO^k6q=Cx0(! zhp@b25RGVtKCh|8!Zi4B8}{mX71vE|&8wky>NxoE-}7j6`oc#-UhoC(03e_~%RY^>li z3x)H}*lkIyfeVvRO5Uj3dnGGi;p8^Lx0B^rY*)a7ll1E?DOs5$h{|OqGCv=iz&+Nn z5g8G#9@QyJjOCv)+cNlmR%ZK9Q_?M(!)jNN{WI>`;YBUn3$(8Oq&g<`aTa&cvqI@`&2c`zmsVMi43Vz8SJ4sP z*`K4LUHnLy7rR61eC2i$_gdm!^ihysX-`tw(=9fT3f6fhl4>xVN!Q^}sfW8gnu<&U zqHT~Nck?Zw z@y@$!0)Ee_Bc~d^LJ3sss6xZ%7j)UnzyGe%CVX<}mkj)%vSMFs`PBGF%C$QeZYX9w z`)%`oSdxy5frXyiVymyecq2x*c;pcF89eA|hxHI~y(KePN@n%Qma)xqo*MHmC~31W ziE!C$0j!TMknKcv06>}jx^xaN@U)!!QD^Ukb}MRp5n{OyB+E%a58uS#54@*BUB2T_ z(yRgWKrq1=>Bo;4a%@zp!PCeIyjj zD5o*wK7c4d3)?~XXVB%?^jqvl-f19}%#D$@G*3IqDU^PjF!a|b8kogL*!W}pgk2Wk zPi+%*mT=kXfHU-cBx2y10Qq$5RwHl&h}_vE>RYs&4H4;W;XGSlaSnOf^nS5F@J$*> zY>|5azWg5+)uJOV{k;(bdOk{jSsZV13_(ehYsN5J7V6i(ib=OOMn_J$KmWtZFqV$8?_vKjMPZ%4&e=Ue5euJaEu{Zud0yh( zqdyj@IUcejC6AaXv$+3`X|EIfTAByWk;z|7fT>Q|Kb z+y{y}T!YBld8A*073e5^DVH<)44>n%a~n-G`P=(Zb3n*4O*0g;E;wEqHRQhkpv=*= z+k&ELA~d@C!|)$gwOxT(`DGjOnH~H4pXCrZ>+yXh9MT$WnYy|4J;=S*%N-a%uX`q_~RQTV3kUeWeY1|^&?g4?_~^Me}b>}e$}o$8udG(s9RIoBnRF{4bJlJ zq4=(t>)42rR$8)&o_5iBf+zu*JKYzHbR1I8=^l-L8opa3i?Y#(#f)`hT7Ih6Hv9sM zm#(0aCS1$8xGt%~#=Y7{DUMZG8?+ZY2A*#fayJBTL*nsy)#IT^f?QOe?*Hr;YDZPsVyug5|y&^KhYVwZ_-n}7L zpb{&+ev|gAZob?KfVD)@(DlZS`{7auR-(um(Yy=d(w}nPD_Z(U@RO6Nc>c7uF|jje zP87Q}AJm{x7OH{it4|9}bRiQnjWHBo=E1EtXMOhAV?9KY6CwZQ5c55_uzX@u3XkDg zhPt%2KMew@1MOF!RsI^Tj?0jb)tJ6(cc`8NKY1E#FnXsS2cdpTm~0HpVBc=D+w;Css4V?4AG6PTp_9D>yf)N}=DjL~ z!Ox4;0$YF9_CqPFBwi2~7A6f%E3L@JPvhg3quI0iQfUdGUV7hAnts7f8c)uM1H60K zn(bD2gzsZNm|$}M%CDQQht>KcPEnk|c8KpA zq{=|YwyqH>TVYl8b&1>tBFhw7rBlwklDfPB;l;18HMLVy35n&CDjGZuRIV!{S1^v! zjhzV}325o~vj~L$9XhDY?XbZq#Ap$_DeV8F=&Yln>bfvKbb}x*Fm#K8bc52}4N}tG z(gM;9ogzpN-QC^N-6`n|IfT65{r;Y_);(*@%(-Xp{XD;?_RWc=)QC}lOj{F0`s$Uv zoj9Gbyg>PTnzSB)FxsvZA@;&%_BjOUqGj(0&}mVDD;jzIJ5al=AT=WfUbpz;-D&fA zNctP!l3C5q*^&b|=En(%NO+OdR1vu@greWJN*XZ+N0}u$J)ch_pV>R)QAmZ#Rba!b zKhkso{dq~)o=nv4@h6hch+|bx&iawJZbZ*K_$#0!_1~~*?WhOq)F;Y%)ltNBzwUu- zk76B7SE(_+veRwN+u-kOb8WUd8w6S!J>kzX7+~v^Q#@obH!l&ik8M?{-aFbTI(4ng zqDJxrwKa@6AK|zXLCh#yZCwIHy5JU zD@mqwn9I4>Y@XCDI??Nf+S4YzFBhP%l|f|l))shW=I3^E2swEau+2JRIl};PtT}Ja zs;PW4HYFWIzuAAm)Rzc_w$h}$3+1)*2xkv!G7b=#$J#R~=)9ANwm#VC7`+)Xka%@@ z_}Kztdtb2QEzpBsS)}}tZu2ar0%O2-Jc%(3P7>Ec z^a0}&emHDjV1ps@MT&3(p|pr>r__hK%5H!Xuoux#NB^oMHZ<332U=($@CuDP07q=W zX5tIuSIP|+oa@P~b>8MltDa7L+Q!Xm>wG*pY>clj$ zTd*s_!!IgZ1w;57t>X)5q1g+(kifz)t^CrtDruAz}(NOVK290wx zVX0q|ou9bRVnA1~t+bOrB?LyWM_)%>96ghEr7t#8kR4)I-Bi>Xp13`4*(2TL6X2Ws z#qoX!y=*e{Y%{yH;}71f`L%>6eDfK#_wE;O7Z1I6rE=g>C|HbR!%sg^{>_GZtXu7l z3gWH*dAoR)2OXYsL|25k80j27=_>zI4Cn#Qyg*n_B#BYJ@Hfzl(Mm8e&)oDMf2^Hn zCVTXaVYMjrmshoM3OB?^*H>?s6qM}DU}fU7Uz4Agu2{s=Zm|EPYa~}8L13l9{VXLL z$UbpEd!Odj<9Y2!$XwVBA9ZsnZ&A7(=Ci}b5llC4i`VVtf=3O@&UGY@jSQA=^L?yZ z1vQgUUap#5cA3U{M>ub|t6B_2hV`SLk`tfRIRBD%C~nk*W|aeStmF(`nNcq#X^coGczc9M)6HGihF z-TT$S$}i@7h#=D5*zzS-=si%5z0W}`!;x0_5D3_LM7Vhh1D zCZeMBN07RU8#ISWQsbJDH6x?qXx0q5@%u=pjk647$rE6%N{wep(1D_0g&mwofNH!c1w4QTg75;iq#%mS z^=N`aNotaoK|wu{B2D&DMC6wZEHn?IXOU#`SgXAJ%0rk{%n0`J3yLIl3gW2unCI<# z-zPP-J+0enQwb!KQ69_vt*m#UOsW)a0HWbP(5ott2nn8+OH>{1^S8Q-7jWZ`zraaC zz%+u32Qri(X3&&Nd7L#k-krC)3;^4+BDca1*McY7p36TWB7A;73V|a$F_atryaM+Z z2vd%#jz%7;o5ab&|G@#5ImT6yT2w}vUyDSV69lipD^7dX*PbqS78`l^lLTRjOOLaR zsyH1!EN{FKJdo%SwNyckjmE;7iuS#9ko9RWm_13<4~0gHI83H#WJ5})WTt9e5R(;$ z5-{Ewh4u}7+7eg$>t>*`yYi+4kS6!+(tHvvWEBB1;5rgq$iFnA@&?9Lwx z;^2NUoc}-=XOjAVfJv=H^RNH_c^E3ZwXU{Bn7#(2@V}2$XkG&bIjnq6ua6`A3LBJm z@WZ^aArF*(H^{C;E*&i9m9IoDk|mH)8a|?&@wXQG3(gh0OuJ0{LZCZ3fgO%u3LT%6 zL9(2c*nK;z9WaO_-_1SaF_=$zow75LK1xJN+_z&C`kNOGqGtBm?t^ElMdin8yHDV) zw|*ZGidXNw>%j3mV#v2x6M54ib!QFshMr-EN$jYtb&iMo62^KN)I@-6i8KCTfkk=& zBJKeA@F03uoK`GH0Aw-ezz)uDG(q24#~Y}jMx^ktu)X>i1Ia3qh)1$qFyW2XLwog) zt)kR6*ZZxXr3`c+Szs^8`Ih9V?+*@5rRN2aq?Am77><-YN3U2)w2D!4A?#>bFceJ$$NpmGerQ_mxlq!c&lKir9WX`Vs;BSt|s&P z9kDU~_`AqvG)x{Y`;KRh#;gPuke=`he=^fyv`du~AZW%v@dfRb*+>IlmjeUdaU!9ZI9UJxK6gW zeRg^c>j(vez8KFOPSTUFtndlCwDWpfo}&Vi?IcMA2VeK%g$iXthV_7QBlJB#p=zRT#za50)G%}(W+lcydxkZq-5tSW$` zqQuZQ7t$o6u-` zeqkAR4@$dG@v=8N#FU#WF{|xiVqlI%+S?0s-U)!W*X*%3T~<`Amg%QO|Lv>su!>mE zd_D1~MfqFB-NOaYE^%T+PSn_2tkbi6`8&k3^zw3#M{C=AmSlQlKCftbJ{zR-#;)B= ztzK5@5{(q+Cy7U3;Bi_41APLbf`2XHR~)aooc-PCO%>fowicOZcBI`48gIc6E1!b? zwtb$nmS!8UHH+Ag{>xUzDDL^`NYmFRgonzSRJ_|Idxfu->L>^DdokZ4GP#t2JqiPT z4EyNY)r*(F;*lnQdW6Ww)%2zZ$i0kaDH%A8d}(0YvqI8)t~#WvBrK{q)UBB*##75)VDp+vxIp< zE+5q*P5qOt`my&y+nOG{{bDy3mExt3guKJqyBE+PGAco4@5>lSoYzgG1zbScSAMq@ zv3~F4R8-s7ADD^~E7ZBP79yh=R8~yIo8CCMZdRkDi4S+ih?z|ApOp?7H!Y^GkPrpWY|Osq0K{a(dPl364Q&XL-k@Rsi(v zHxs|R!y@$3X1Hj`D@GJzwCUAnx)S+dKPpLW9^Vg=)~vIGgUbT=9d53wJX;SXV;=rT zF8X87wm8`WJp{ZFLJ<~*K9R9Ng*va8h8&9yygVi`43n3AI z)o`tUZ;8lXp%udWs}{Bw7t1om9~fcx8#Xuk)n@IN1l|oI)a|~k)c{{D`u!xn{-t;$ z6pqfSz*6;*Y(W3g$kUPCA@4gqBWkzNJTF?3#k&~qOuFxe*<0ex?Ly8NU6v}aX&a}V z9Zg_wU0I1BH4;*a+82R&SCldjT?;sWF0cQ$2=VW2A~i_AF*Z?~^nh3GJ3S%RIK8!4 zB5&xP2$%9Vda)4b>p?@ueV6gV^_c5LSalII-6GTmHe3>;_#HVG=_GxvE4g}R9Jt@| zY_5*0{Uw!fGu1&4gH~Ek^iY?}J9&K=W)v(K`kC|gXC5tGuJMA#s=m=ddCc_~XOrca zjk2aJpZUm-DVdPJ#Y%QYIJAa8#h9n|Cni7K)(CkoS_(~QCvBeMN-WjVhlm{3)`fN} zMDaP3YjU?ayWR2~Mf;SK^$J0MnrJL%Fq}xzq#GFcbx=GmFdNBFo1O=G9iiPy%WGa} zD7ZkCgIxDQ#H{(^#c5KY5Ah8nhvfwevhrT4_U`KA{G72LP^1VC^rDPfKN_KCJ! z6z>W7p|&0tSp*;VHE89YS7CSJZs*XJB;nb&WNstqf_Tv{z&hm$m1J;eHx{5Er2o(< zf^9B|Td2*2)GfY)Fojd0^8V=zu$qQ_Ym4dxyFM^-LoHy&liO}(IMle^5^VjUF%|*R zGN-Z*)X!k|Li=GA-C!isTE=SNFhk8F{Fp#SU(o{D52~25l-r4Id{BU<>`qNkAO681 z3*MC=Ou2GX0~1YnuE5CwT<6`8ZOA^o@SzW7z+=lKdH{HE1ESmSL$r#(%PUqb zi4$-Y%QGF@vjD9+D&8K&0gC`GTi%-ggG0vi>3I;=f1uJ3yWczM>w~>BXe8ZHx9!2x z#YUrY;{JKV1sQ$Ipu~D?3j`3=cH4^$YR+zI-H{*8{Z~hMd}OJ;53A}=xz>)~T~7o1 zs*8~78HV4R-%85XDh~86cfN&%jgSEJC@PuJ=g8xU>7s z!j&8_^}#un%Pk41n;YA6@4`R*47a0l;tTJlT39a7ij3sr5&uJsmJlkc)k#&%*C{vl z!12=s-@XzPM;Z8M*%*L<*m2A97C5@UMP+cmHXZmqdh6}1m!SBKqg|Da&!{aG(4Mxe z3MT!?FAFNehra&ty;|m+OI9s;A66vulS{OeqqH_Vw)THFDs z^^2~D#eEI_|9e;;@-`0WV)yKf_w{6MWn8q0OKKb0)f%eUK$#!{^w$Y<{!d?|kzWO# zhWc)ce%9l2tKt_z%?@|SGA90Pi$fjXwOB+Yq-per(-K-OOQo0weC{y^XI zS%(fg(4M!xF@sHj*qF=1`-Lr$-vobF$!)JBsR6sTI=T^0T)CVuOqqr}R0=EfuT1}u zS553Cs#zx|8sD=?=dKcpo>@P)aH7qSZZKLDFg6G16O7`3@U$ndN`)YbX?wENWvK#; zT8?}aShQf%FF?;zr}E>T*Er`*MU_l#y8Fm7Z!IE}0fPu!Y+f31`^Hy(gQmP00>${9 z>U&qPYgrB%9Nh^`4m`11Ism;IL^(0;jd>A;aI!sW?_NIt;JLmjb-T*-6dwJAIw`l5 zbbHGsF$W7u8|?bGVedmn>#wDy--eUo*rN#;y1GrQl7@QwDsU=0QCyQKJ74g;<^KaM z4QAd!i{Z9Wptl3sQI{i8HbI~4ZwiM#yl01(zmN>A`(9Y8I`z+i$p$z`Z2_h^wZFrm z)TG}%ax(Z8eo^STLuTZVdh7J>jF}iWICHM6ccU=?FF$8k+I7oF!)Ox6`+~)|Rvgqc z#8q5UnV%?mUooIDpM%bV11vI{Nc5m5sAA+{)HF9B*Au}nEUEu?)g0914wxSp(JTn6 zZJCc{aJeTB8WrWLRQ~0?MxHG*><`mvh;M77Q|nR#0Okn{onwzPWPBNF8^sww;Q>}u ziW;AAM!KzBaoGvdyvI0GdV8>G*|8aee7H1oQ5f|r9OX=%08f7mD3cTOzSi75)$`18 zg#J~g9Aw|-Y5uEji<6?ZGa>YwbX@E-e4D_@dX)PGx!Jtq^`HS4_S0((#yJkMr_bcK z`6@rUwg;X(nRHQZhu#N>hL6OhJ#&-?8fpd^6*>BAtJF-5UKa}H=lrO67DoLnaH8Hb zpgt;@8fId1cfJ`U3$Ye)}6jm&lvo;*1utNpfDy~6H` zX=fapzH23_b$yK^Tr=qo8kfLsx#QqR3!2uWNk#ij(-f<#M_WjE$*xd+EC0qNQEk_> z>@Izl=#x{+i3=zEJu@Fp;~+~w$!mG}cp|3a3liX#&G8RMKD zwa64_^D2cNv5}9HB%-a-?xvjOc6HB19UncMj9kYqITj!hHwqq4ae2iW9WXA4xa?-0 zVu6<6$_woXow#*5LI1Cuk))C2w=vmvxbMNac_5KRf``h=o^h0FVX;mwC5wo1#{Td*}k$>H~zAHR@ZKmO=m) z4j@PEm>y}iR}*K91B<@?qv9UF6X?X>;I zH-#7NgV9Z&`)-kQW7@V={8N&?iP`(BXtBImz`l;U-IQK=(Bp1dCSLWrjjzQ)=hct> znSWZno`IL`z8W3*yGgfmdV5eWebpunb@{JzwL0t1mnBP0Sh4EBzM@EsSjD)0#&_ylQWpY z@b^gOX;7m+{_ahzdn6$PWtpfLPMw5}hH)XHo^jX49Pm}{U350hjx2@dM#CbqOb*l3 zidkVdgi!YKqt^L-OklJ)G5{W~{J1yD^hRb?>(UmbDpH1Ryth%U0BSPz3gg81uqFEa ziisq6IM-`W!41*`1<0@Fo=$D_B)nt1{YX>oFFHvCQC}F4cRg+kjtBJ!nE~Z`pe^#o z(rEr3Ex}x@neYY?!<)b%D+m$U!4!prp(Wy1t=`xDwGaVQ*eE7N^yP%7phm3glxEN}#`g8~7bo$&)A?n(Yi;h6)# zj#A`#$VvjHI^(qymkuOi#O*!g#bhOWe;@ANg2DiUs>Q6ln*bzM4Q92QKC&6&Vzn@rGL&Fl3{Z4Q6;)rG&u&bS1_F3MG*;rJ2A&=AcoP`DP zY3^FaiugS{;0TA1>(gZQ08*8$ShOk6+yQV#OcM!A13&J-Q*u5J$H6 zflI&V07qPEf)qG{l&17EU#<}3*}oPFWMEtgMpt|zyLvqU9>h=VUJi0*A)2Cflq}S-=49j4Zk@JV;xgPec~ZlpwLtatNR>q`r*&)3Q7< zc3nJnt_wwI#_O6-&pv2;Ubw7k;vhY@f81Vmsu5JNH=Vrzco+1(Qse0bebCJ*f9v0T z+S@C4BZtNcaHUbVyDz*1goB-(oUFC>-UW{X7_MgHg-&X6TI1D0X(Pe?3Jxr9$hDoy z)`S@0z&<-$+UL0hr3+yd4y7ydLMuT{$1@K6u8`F03(c13Jro*qlrvyid&WSvXGqfF zQ8^f6eN;guvsw}S>eH$@2Y9$toRb@+UYGp7V4!U-4_!Jxg|bOIXFzv0+3*$UrqWl` zPUOIEkf2IYR6W7{UI?wcta|fWg zz^u+5YZk&3ztuEDlYUs+dDNb&mU^d_aiZAX)r!Hx9~e)HQ!gTc+!)`qZGYES;r=Z2 z?Gx>Wj_1PX6grj+pQXf89>7@YjsY#`oBRm;d>1V&EHlB-QZTZ-xUMf8Fbp*Z7=`1&ZdR=yq@sLN{eQ%tUxtt0>{N+<3==GnsO z1pBE-zmT_ugHz!bCbo-xyEeaJ_9f&WE8}(9t;ly#hP<+h*x>hS zxtJtdQ+P@03{5&Tt>t>{PLQ;e0l-V!zBNqC5L4UD#SP&U0vnz<@p9NL98?e#3q3QH ziYvr9-{}joD=m3VI%vz26uZupg@V8e3v@-XVmKBp#SDU0X-x|%A z)&#%HTVC3NfTEJT;le1w@(;Vv3yn$Hzp)AJ*gc_rr_ty4tzGNE8 z(X#fhcP0)k7{FDYC_~FmT*l~TiZf<}-*VEa-sj`S&?JURA0;`O0xn%`FhuPyof@QZy|2H5bJG##&NTT|t8zb$@&4MS~5 zuqAJqL+V8gTs}9UMiW1R?8&`c|E6#)-c(cW4d_Px)8;&?z^O8&VQF#9rAS)TY7?0RjO`*h5`vu{F ziDeE`8;3nROVk3wTYyFG_rrSIr3v{!jHGGwBJ^6po?$tD>|bv$&0=qGzt-y=aTUWx zxK5{eh|_mK#w7s9+fzy|V!bO-*sD*V{Nyg?W*iOYQTF~BLwDh*j@+%3`%9-o5L9rn+L57PKev`l|A;Z4;0h7;5x{J8kY#+xlB#xR zMG{qcoaf>_`oabF*_Y`(4{mbW~n5ZnN zW!09h#eOf9V=iC{KSDL@hl=$^pft+s)?IR~UVRF$0W!Ddh^XT(WCpZ~$h?=s93(Mj zbTXY95rq$Q6JYzk+8&KGs=TkA%MJYkv|1NBZs}Z3j*N~9wph3H*<0Wlt`wqmG#7O? z^t!tc)TFqCy|n6O3K?SKt4#(;$?*U?(mT zMw%2BR|b76ic?y{x@x#chOL#9qS}(BC;C~#Jt@Oyhnn9!JOvz~W%gZH<1oBwF*Y;R z6Fqx*mURc4>qBD3ZgFasxSN&^LBAFqGe?NtJl_WA#Ct}N{iiNW{s$}nSyw?YLPy|L zFl8+tD?;|N<31#)X){+!+kNCjg|c=8JvOvY23Ed@v8A7M3$;O5&Eq}{1yf#3H?=7q z-S)rmaYPbq&z_xsUKMs%76}v=6)6y$|udBC2pjd*x_mwl$xdkS(N?iq8gQ(U% zt?~e`j4rZoH#g*ceDgUgN2(z7UwD-K3c!<+Fv2|N@c)bfnvK^*+($f3O*Dl>R2Dzx zIj2TWWO~OSz3trRD$1fvh3j#FIl;Sz^hX>XqkN2Cf4K7_&${w3!@gv&j;|NI5XU{W`8rf zmGlKdxO(A(ekp7}j5iEid(=2R=^@5cvEYm>8tP7(_I$cn!ihG1Ro*r(zw_$TK56 zX3JKI=dRcd6jLK4_<#0sl^{Vj-Gi<>B5lIlLL$v9Og~xYkXy@bBlwx&@iWln<#^Cg zx*LPQuz?8NX%$t0GcO8&ukYs^bTgX`=Y~3+dO~}oR4cNS${|BqzDU}8IClHbuqu9B_HWw};X86ET?VuEiN<`^X+(BH5C=w@w+2)}GZ zk{p)1{Y7c?rtrp$nCkh;S}ZzY#(h4SPM5OuJ#$Dg67wbz8+>u@P{BBW8XCM1Ijc} zKg#%G4@rB$0Eq_U-EyoT@S4!6J%GOc^!$xj+i5Q(?`lDvGEN-jJ4t_Ad9p7Xda$qk z7~GG=`Fts&C)(+`um^R95{MvU!ep9#Bgf;WtIRo2*fEz z1bbkOE3}u!_TIOOUYqcCv(1k@H?AuXM4e|IU+5E~mkNqf`(TOW5sw9cJ$KSlkJ^FR zp#r+hv>n6p1+8(GR6d^&;m(C2ts!U1ZIL+j;;$ohwSALpME7a}=_ll(C#SSt&U=U7 zjx&@$TVM-55+L0FcZ#C*yQFb}P@hpP z&rMwpy;61_heYgbzEPjHz2m2Uh7>Zs5CE=x`{P3vVOnZlnup|X5e;Z>c#h5JZ7EkB zR65)b?}75NWQq3L+mUJ!!SL-6odh6AURy6a7gE^j2N4TIJM+WhAM^@U3gze?@`2#K zqHLXZ*E+epVw9PkeK_iYb%9GY`(O|~U62jC7`I9C$pczIX4In=dYDtPb#olVT++Yv z9XRT9#$ogZ_^bb!1M*?XQOmZ}{QZG6^oE4^g>1e$IFc80G;DBEih0KgQ1T{@4)T^S z`XbnStN9bz;&;S&>1Y#!8bPDal8Mk2J(}S{8fGGHbmKs_=p9xH^0yNxfalbB0*B1# z_jGP=r`Im|`1tBQkXNZZ3mw3Cb`W|d@g0}^!N*kd&1Lq1F@_8Mq9vLk6)dKz_N&bK z-Dk!z;_CQ6D(Ws++tRCR^5p_S;KlGfc5BvFYSoiaFoUpNz?y2sEkN3YEQ*Ea`{XY~(>6Uu{l*x zd5ITP%IwjXzaPL@D*D13ga;_zY#9FoHOX&bbmwr+e;@hm@attOipylKyt@I+%)$tu zn~w7O+v6OiD|6)B6!5cr>m8X!mfHP;Urk^NB~sn-!fUX|FJ)Zv^Kn^uI~twMkjqVC z5yc!-2?J~G^U!t0*7rZMt(!JGiBi(cz7Qi#8J!An$3tF+oyrJb>!q2mmHFuDuN8L| zWoSPGY3D=sSC`6Eclo$ECWc;7pda_lKe8w5HqbZ=#VWj)lx#zZBqOX_te_C+);V7A)j89SIgziUFkz=5PxERrH9eFEKH^7n&)(m%w`|AOa_=1~` zPzYStyQa8r+sr@Kjky>eae0b4s0KHhFz^s4dbM?S$@;2?h{=FF?SXszZ~dnH5na&il0Sg=fW z2V!fce;NfcjZ9&e1hVtOnj^iH{5k?Fej0>03ma}C*iOkl>1lL+>lVp!qSCs=?786~#Y{fi zl&X9PnM?Un;oM3uTZIVF618iY*!-*edT>5sti^0lor5ZCfluCDhf(V+1|!OgJoMes z>r0OM*umM_e>a4HSRhw*+_nXiK_UXlGE(i;_GHmRgjf{R0xq^7c^SBJR}HiTh4=Jz zux?0*R{l)t7knokulr3v_WKI6+f&+iIGaTuKPIX^4x zwNOTjOGGGdy_%14GI0AVssB56NSZ{XIj;(3i1mS<5n2MH zP94>|F#cy>)idB3kLYCdrpV`%@1|=4rKH+3z^SNGI0&i~-i26WdQX=$FauOamBeIR z4cEFlf+%w_rcvnfpsnhn5cOF$q?fX)!HRmIhxa6atWqTCPsFor8>#S@#kcxa3XS(= z32n$$l^vrO#{Iqy#!ViXlLgspq-8}d$(pg>IJ5o7FSwX_-NEoE>LEyCEGANzVLz9wSPpriZ>09m7ZZGGcfA7d&TXK z2@)G~ekJLQQT;2xaHdD%^VHu1m7C0|HZ_<9!l1_dZ)48#^xa_a%IzSHGiT=HD{vqR!~8S7Yd6g0oNC({iF zn~PKgeeuF5#IHb1T_#<3uZ@j2*ODRu*`Bv{Nouez4cLd*#U5sE9b<_0_eTo7dml+X zx_^+b`~M6qHMye8BKGK6TlLS(I}&J>HqxJMUp5+a`vR6(XyVJdrF2PHVN3Y~;momF zSA|d~`)vvZP}%pkFKU08s&$^ZE9j=@W7N*6rG`b5)vCzwwY~lWt?4Ecq`RW=-Qut= zr021m8MpgtsV91}+7-zmpp%`&ov>{a?I}R{4ku+LB0u1$6{iqmRLt^>JASb zv*Gt)14ufSh|dP@EE2gWyA2GMQ_mh+ZdV1t2-R1?B*X*}QTy-w8`fgDsLGD5U`~aQ zPK>#V;C=#IHKLYX#Q+;hlq=Se`{O7(l_6FyEg3B zM{T%ogxVG>9+C%Jz-t$Bz-Ohls~n62!c?d;;Wa$xYPFW--Gv%*izER|;R1x_mmTAn zH+=%Q?(%ed57vKu-i?KMRNQZ)wKBOjx zqmuvFRDYFTuv`@V1GWr)rZ=qKPHWI9ft3`#;?&6k$U{}PMm(-5VR{jZ6}S&4*{FV) z^EG>;wv3}UB?{=3Qg}{W(<9k;f_qIFN7wsP689=s84z#;$k%6;4|&9W3Nl<8vv%lb z&a$6<=V#e0BV?;~XfW6GQ*G=`AS>q;l;!8U-NY9!qElM%Paz2g(++IAgMb;jXSON) z)UWF!kYbP@#S&1&2&jwfg;p4YQ$_Tuqj+DnI(QzhWk2$V?7R0Dgz8@fUx*Ze87oUl zW7T_-@L9aYGi$UXmUhGL!iL{VjR2lYGjN%Sbgl-_u8`rUBaf8k-cU zMu5yLs$=lXRw^H%tf&ASYu6l3p9c9KI^de!UG&JmidK#tkgw)50XrIc0MgdWtPu`YT{tMW`JAp6N5;uJ`zwpJ2H-hFv$H*IH!1ViS6_ms17z=xQRQ3t66 zUy2~Raon;#D(o-3XmJ8dEC~`@@<3C!<`*LSa!F#df%}xlUH}2;IT^17fHbLr^?Lpx z4|+gu9o{XrP~`pZk6^jw(Brqdq#}*mat_#&W>X5A_cio(8J86-<*0&3%^ zj}*k&X+gBcH6j2*VnSx;tty{HH=3PVIM=Sq9N=F?9zB^KF1{Cy!I(>aM?>Q+hgfFt zD&CMpF0<4DPzHRjCqIWu>fgi$lh($1^!13}NW{|F-sRY62IBcODwP%TD9?c;I;1FL zQ4TiVgD(KoX~7yITuDgA8N+@lc2M`6o6%~&wT4l?`es2ub9z-gHR&v4-exp2(VtL? zrKY>9^kS3d&|Gt%W?jCca{~Ye@bgiBoW$V>=z?qhu8QUB<(iVDS;vTai|hNrLqn}f zh67Cj%@-&Ow>%}-aM=mV&6jju^?+3mHRD7z(|p*ElA z9JAe*?nV^Fer&dE%**uG#SJFp?_O#Yx^&Z0*@rttM>NaLB~o4^EZ!tdT=1EyVXqH^ zuF(S>gbAY6O$!8Hy zy;;Z&_SG+c)H7pFvMtAq09-Of*(AkF(s2ZeprfiL!eEB9v|6!p>xIr{Ao2^7rm4kc zmzlXuT^9wSe3dRzWT0 z+1~p&gS<)pQ{_nho~C!fY`w}}vHBeUq4Fs&vOQ+pkWDFc+l#yN15~<**BbuE7R7>E z=hiCl9^>%bo}3S>@uBtexc?GWH_hUt)%x&mSA_DN@Sv`JvSFLs!d{55=ilu`A&<(jWMiq%*xcoV^A7r zV5T<8U%qEV4uIHV1@ zr?2|xf9EN#T{*JV$a#Afj`~G_<_76oc04>lBD3f*CfV+i`=x3dR&n1l#hcY1cA*MU zx6Pn>|EP|JntqtV9)h$^JW#etpQs(AQ{htCsH&Epc~3mnDT9#%1Wm!)ZiYZsBjw`< z-{UNPc$J1c&$OxCIpkAr#?9_lsteSXf460_AbnLh69bxl*=%X;<5qakt~blqXmDpc zw?ADs_?X2wiqg!+lrViOPzv%_N4Lu0zT84W^?}kY|6+`v%Cj_NPj?~LjdQvkQslj0 zOn6O)KUouW6dIYCw}HK6|7~Yx^v}lT-fQC?>+pa7 zALwf}wV@2SBP$UI|J959eqL&7#c{)@xZj`No5!vPq%tazMR949d~ms+Qv6BR7OG(2 zagkl@v>Q2rnt`#E2abFvIu`;38-kj{>Khd!2qZiseq4iBm+@=Hr>~D=$;&|3Kx22fN8Pke@^n*p9K>qTeL2LFd2VMM(+t#On~! zu2I_I55|ejtqdI5+Kuf&!yy6^yR2=^?mFUzwLf|NwBtT6f#zMvKSSv=*Hp$mKW2lr zBL|o1jT`WqJQ2;(t^Z`)ISRHF@sThV7MzMtHJ*#>Sy9R%!#r5n&HCEgu#9PitC@F8 zZD?~fl9zb$*?~vz0cVK;LCia5i+W3!vf`A%DjFRlyJ};D%>wWipoB!R^kO?QwM7A_ zEa3_J$yPuIn})f~LK?i(wm4g}sXEy+muM#(E_W28)*m7)fl%a<)%lq$7PQm+>09mh z6u%Y^25kw;&S_HqeEeUXGAy#$<;D&f*zOH(x7B{C<{nG3;|JvreKb&}L9&x}NZ z55-3@$MdS)QejBUF`y6xzwXlv6<~~}g#TN&%)Yf=1QPdT*@7D#$q7TX+)QZ9z!5I| z&vl=*jQRvLf1Eo$>6P*qT7~RJNUl|t_*&qR;S^3m!rtwH*_$L^$QFjB2x4wO^)$P^ z)V}bBX*5U!ksrof5DqhJvsX$SUs7HOD_&&rIhOFNtYig?6wZsrm_R@zgC7>`dy&z> zrk2c3l^lhQxoKlYvj!E%FQ~4+ogZgrIT`nUitk5F)QHr1jIdii3KpNGuIQs$473#9 z%sRK1CR=>V5s6)jF0E@o(ecstK8imIz&O|b`#!GL!E^MZT_*pqNK4X#<^%BJoc=|- zfxafSyQysRcF139?ya#oqhb7wh}XwX+_kqzXS-{dm(kh5Ymm$5g2FL4NiMm+N5cBkSZ6o9se(aG8~FO zalY{l3>vGGzJD`ZsX*94>1is^4q+*)PL{y3gV#L9mt?=-*Cz&)+2W9E_}(cbENejw z0S}jk@aw!P+dR;ERAvo&{c`UVRroP|NS(I?1()ywbf3H@3T|+*OGaJJ4Eqs6#bt~0 z24hHFIZIlP`n2bniFMAr2&_0J4sK)Bvq|r6GJ7FZMm~1?iacUxzUS{N#bWmu(-@%O zAPn9rKc3OUV2N}|ry5owP>kTkQ%Ef@WEJ~^LtQCc6*Dfk<_p?bsnF8UBE{5A>tQ1?K&_VyrxS#0R5l9v|u@R zlU(Y6?()?Z_AhNqgW=;%4gWW#GjB%abGNx%yRy?d#mV}16yRpeCMtrYh0xjc$HSCtL<=Nkh>=kEk>440m zN&Zj?JX`94i@4ONmJ=A4&UbB>cyBWX7#mpreVAgY<3);U??-BieSKT>vNEk>PxMC_sVS}%xi#m4%@~gk7VVht+H);LMB9R7T+Iw5CAG!LgW8|0A5VQ6CHvXEO zOzpn5ALiYoyqvjx@-=)^TZU&ZzkZI7^*_*IT-e48M)_E|(NJ$Ix%l@&;o@28*M7PmF~`9O4J35voYUNay^InQQzTvOo%maH>aPQASj0v2Ug8>1p?uJvO}IqL9BV zKoG+JI6BL)wz_r+2X}YZB0-9~1b26*SaB^yifeIqOL2EC?q1y83lxeMf6xBT-(*9= z#g?_^nYrhJaF!m9)1<25LMtaLgd0JY?$nfuvaD*OEwfY-sl+5^*f-}$Td92(sUb@9 z7}j)||9ROeo1nSY*s!wUu8u2a#5WhCVd<>zy0i}Km&6)`@&{!SI*z%49F15D+G7A* z-nyT;?{U|{J0Zngr2S#StHoW|=e_a> zHA?Tr*>U-6gayfJ-Nugp&>!QWg%tKlhF(^RbQ+kRMPOfY!D&fdgL#CDVZvd7RS2@* z=OzokrsDZf0N4mE6*AHnI#FE zI$Gl;}|A&4X%ieLDe__X6L|?2hNI-Ayqppbc+IyPG9h)|TCWq))?OvCXBau7* z(yaJ7St1Z**nCBvVxE%)dN}BaiF%s`aTPV-(+>Y4rhsqmoJ^8e& z@+T-d{F2GLbq?IQ0%i?$Zd*REYKiN@vC!j;Ai#U%n%=kmkoY`{X#DeLe02Rv&T+v^ zCtK!iYyO=!Hy@$3#fDb$>C!e3QBZSsit`i#q`LGQnk5-Sb2vB&uyy*T`G(!L7mTx&gJ#(A9Ge&^RCWyDU1t?ahJJ(gMy8%*#8pch( zg`%8Em9@wBwq!D@BZ7p~F4{CEs!%P?uT#c0?rJ^Wai$@MEaS>zM7`wczM!*T-NYmt z+4kpG9D*@-wff$H>YoxghXIG)lJ;wpD9H1(UWDY=a;k7R^^GmSM(QFsMVDZ;evDkO;# zQSNKy*Ud&SapGu*R@W^*K`1QGbXSjpicMtUPpG307nB#-1I|bT9|)@h)CHiJL-s!% zqaq+GdOnV5*02d99Uf4#p^59(V;pc7y-4$Q-?7!rvqx_-uCa(ka8tUlO16ESCAv2_5xlm)8@; z!MXlmAga<#Ys^(J5fjP0BG#Tr1HQ)9#X(ikPczCv!ZM`?Y^Nz_?Z2x$Q2t=h{ zt_9q{$G`_{)P29iH=jTd^eoLuZ>P$0b+gw}-Qn#RHo-$sev;!c7F3;lF*DzHEU4js z$3@Yj^X47sDf~V9kCAe*sv7z-*Z#jlF401*UQDVexm|u=gXM zKR=;xls+Xb%Nj;5S?w>t%t83*n%qMSHA&ZUMUzs}xfWGLX*T$;yr*oOPcD`{J9!zD z3fBe6@k{IT4X5zI>4mB5Hnpcy1rx7@s39cFE`uQ^e(Fx`QQ^-svHU9&>09W@QU9}E zK9EKm<5FVA$N2nNz1f)c*V{ddAk02gX%e!-?hv0~CMkAR7Wb7iSzi;bE&7>eP8K}d z-O6(7R3|J(7y0gsqiW)*@5UepoZ^o&*32`8x<8xDb+m2T^*viG!|jvq{m5B^@E{aE z(TL+uZhuw2gk4o;J?k+)l*!*L#QUG(X~)kfiQz!*s&KRcfiyl>vjrN#mEc~dByF!6%g;{IC->j+J75I z6<&7i#W2prDiBLsR5}1bkCZ;Q=r6qLhuu={)UbsAqJI@kU$v4+@GT9XoDuE+Yy%cX zy&Hd(Ld$I>rW`0~TdvW{3;Mhq#^YnPgYl7_pml7lsO9tc9@&QY*3mEFm6kw<0T>$m z=qk3Oyg_GA9Viw<>nyK)5e>a7hM^LMVqb_2<9fI7bc^@u5Pq;WeQSv9<^*w@eWC!G zQMcmFS6N4!EK3sc4w!@znmH$&s1a_}U7ysS>9z9+uCibQKdJJK zAlQ_Hd5gpS-E>bLL%W{J>!_AnjQV|SSoMH#R~>Be!>Tf1 zZ8b)(0!m40ZrKm+Yr2I;_GQ?oL%yL7xkS{^T}=~p{17ACHc%yT(OH-;$BYjomDV~& z=q0VqXKPJ#pDKuRf6fSFFG~8Jlo{BhZ8n%ufdgs-@#^b`S-_AhyN^HK%M{P1(Nq=?O{iGZb`)LX5NN;$B4diuf zsQ%2(R1KgNv#Pyl|8JpKlJ7pxEOzhmqB)CxOv^I3y9A`BlU(g5S}T}06*hpl@+T+N zc?;RG1`V9D+}8#;Q{6Ux^;$8*a0+QFkJz zdAZw%3hO1OGGg0Q050|U!`4O<41D9)t_w9ZXw|;D>O&5hz-ib8n*{=bBqfc^| z@iHKHH}3@cqz)C)F124IW57C&%nmi#u&Ly#q^V;g1%lmQTRRoC8o;yjC?A5CMbUk$ zg@xW16iZs=u}2tSkyzINMG4%a(IYX6V4QDe6H%SWogA&G^%tT0LPi$!uS#l=$hK1g z3qp1>R0=$z%#!YZh^QbROdmIj@8NdpqtL-G+g%;qH?YFCfWFRokJGBL$|HWu2BPvf zco|8i?R;~WYw`Dj59P@Nwxz4r;}FWQe5NL^b!{x)#*ftxSr`M*yJ?@;Z0iAeRbwnE zWwfu*2syX)AW<#~-4Q)%rJ3dClnLxeyb!ULgReXGa!&gacQx?s?Kr#R9RKUiF&UZ< zJ`TR)ML4`3A+PS>JyLY`+d6mScqmgSH@;vw9t&uO`JH%9;$M7yuIuaxuWTN|GSM^V z4o%CKTs&NMN#?3Hi39l->ph$m{{>~+_QoVP1z(t&xKwR53kGZN8F+MRGBS$9v9+MHaw|-@~*Bhg}g2VBzlMYiYHD+;lZ>1o}_J?vKo_63=iu z(B+?Xa{N6ssmnD1z5O^vs7K;UC1PX(M<_|~RJKR5oR5sT*nFJ; z4|vBYv!rWe-;6AHejwrKMxnSlB+djRD#+uY+V?$dJhg=3R`<}KoTkRKT{Fmbjgvm8 zd3~V(nd!^QpF|agMkiHa*RAX7cb>KyVD@A5T>C1D6Boz7q$i}9;QIly_8`+MKN>c^Zm6< z^J@r2Ad<}4E)6&lr6}vRGK7QuAiTX?7*Y3fS>WEd|Uw6pSwWS8r zYZ8Zme3YTW$eHUkF6J5(rQ}K_#;W*{p@z3<7KIV{u19(VzSn;Z9DD3(ers3FAiW53{SkMg2k$<$cjl zz05!i;!+E*BUE;kk@q7JDLN)!P8GW7NO7Mm7-`;L*_TLmXM)S1M92&HU4D3FGJBrS zQt5(=`Bkgv8szvFD))ggqK@;QJc0hB#cn~4$chVaA;7aG+V!sM{>`Pdg^SAR&mewM z3LsE^6uMUXaBcFk<12;$eH1SI~zBb?_W`-otii=yJL9Az552%RBX^tPU&Bk zKIF6lSQz9E$v!^FeVTF3(rWF-*%w3u%gQeVm|zqU7Kg4q`C%B#RMKi&g-wrBwKm|L zMz;$S7H=*Rd2lGj>BVjp!;yXwW+C8;Gde?Fd)wQ@^3Yq*mha=b5sfnd?qFj4n>Y$| z-Ll&Rt7UGE&pOojkLeVhmc-8sAC@fIK`tk=q;XwbIKDXf_c&L{MicY~`YG$h(z9pp zvWLdIi!rr4^!1jb_QB0r*nDL9n>r{w4%L@>Gc6!TBZm=9)d!^Q+R>^E5*th72|K+J zNd=tfEY^EI^om%_JD4TLs3Yl{x$gwV4qPG~KJv9zYxeN&FY;9^7}G5c?$UJ-3ZZkZ z>3+xH?P?=?_mNSoM2Gm6Wp-UYEM!AJqLj>a%}vZjm<_oqP74&on$ha-bOP%buIgtq zZevpSWt;W_CdG-iaIIo=b~mVS^4YOYd2=2Y#;kgKJ_b>i>ovpGVKk(g#c{EbtmBTry>`cP|7M=W+r?dYpj+W8`hv@HQBrVGujZb6krl=rNf`W&Oly@m%L zI^BrZhu-X#pQ|d?^-)0=d-IMaB!iXyG8`N0=0DJw?uR`d)>B`QEl{@&>(Js3xj1mwp)ZnMB0@b3e`81t^+lB!2{mIf1 zd$qQQ3S)f?1y!(AVb6#|-WFJE&K!uAy&3p6A;rwi7BHtSk6o1(q}(K_04KNVbQH1* z$RYs`h4^a8T15Y$Down`mI_%iT7eq1@*O`~6_0)vcKARq_fvZr7D2Jq>waNMKW6u} zydSO(%9$GH%pOUjWP@StJ9aP0AR#`?B4f-aTL7>@_XgJQ z(sGK;Kz2xKyIOo$n=8ba6co56XnBvzTW{0M%oPOq4xV)WbdyJ#Q(s! zNIxnrs_U#ZJBe{16m<_vjU0}({ul}pyuR$&rwGQ1ECB`Cw1qvkUCf{E5NC$7)zD|DtcGh^T`cfq3)ckf9|=B~(&UfC zxS$yQWi=r7Wplgsj@HYK&`Pk>GV&hSANjq{#|)uJea6V<5SE}@uTp^8-6*{bOBC4m zXN>CM9_iwBo~j29sC*OLoC6_%JT)F=hutl$2;kqb!V@O?{8pZveFSVw8QPkbi`Yp zYO>dS`$+#kCa_9N{N!II<(H+>j>b6E``CBbu51(4d!Ji*%G9N$I;zJ>b)-sJR`%6I zZLOomdX^A^s>$7@+FkhA1*4(t^nDP}Em2xhnwy8O72X~1Ei>)&>6*Qeeq`M*pKdW| zmlSkw{&0KF5fFc|&pWW;*P{aL4AteNZ%0f*MlzN82Bmx3g zXV{}mz$q>V#6`!Rj@JH}1-0RD{s+>^)_oE7{|%;tPfCe)pzqy=q9u_bAOY5-66O?D zK$iqsjN?f%zm_-%e!qYa;ZiVIA3?+w9qfFyKHDNzerOs@9v^0oZFR-812vxNGGPvx zP5dC`ZMxA8z%ON_@K6ik8y^=a?Bip@UCgygcqCBnp=b~_ql#lr2$480Qhz$h)`eX( z#cljl(2RFaTWW^7N-f?)6;)}6A1NSSLuHW^_2K)gZ9T$FMD@`aUhIpG^;IgIcsE0x zl&$uOV3jQuF>DON6y5HI0@<4zVp&4p!-PObjiAX&VYGQxf*~sr*Wr~h$&<6JJ&6bg zH#4(qX=`YytG(m~Q6!H(yF1pNLzS1fP>XUl!7VyStflADU4iF!sUJlt@LOT_&iBRx z2U1=b)fsK!6G~iarhe@NR1bSn6VCuY>~RjYFYnM1D2)?)ruG_AsLefV!>K?WTBNf3 znV9TNrO3*Xo4U-uAO@5!w&?zx|EMFTZ*)_;NMg`Pj#}R|RTW$D9Q_q7-xD#Vyi`8! zKM=Tq^o%o?hgI(9igz2oLavYZv$p$;=f~IE*YbMfLqmrpwPeJZ`HGwiC3@n_0D|ql z8|Wl$+n#3kz!--)#NQ2Kd^`5{o_f_b%B;k0-QGD83kT`c#119i(rluti|~Yggd1W! zlw)AhsVrM$@_7;-nRt1=AMsBn%q#fS%`g?%SRX-*k9ynCV9{k{^niSdLUTp!kkP7A zqEmxLPfAIt{(6WSQ1v8e$J^dFMqG-8UH1tf?U63fkJCih^IR>b;hcD~pihSmDU3d1ogQ6IHgQKXDRjk<6!~CZ9G1C& z6+&&9B8ab#Vq_K#-=E1V-NU#ZU;x4&7r{b$ef@l{F~0jd+6hm?oTs-fEa{r#WVhV{# z=?Z|g6f}nbPC}%?kTF{t|y) zG1W-;)o}}IE*r>`rHc4zKXZMdqfdE7=%;LR)RgqXL5yy2qf^wsVUQCwnbeUhT`jb7GiXZy(^mKMraQqGch zCijY%=TKuJMMj{xb43dJy*x&qm>RMyiGmiaPj!`U_JifYBcX)Hd*I0kajoI57)jEp zzQbx-@}WUs%$Q2CFJ;6Fb%^XMP;h*BodP!m7%y3oWEj%m%ILD)ZR?8zJ!(8Sy?eX@ zXc@0+kh^TphZ@XLb>XysYs5?LXFj9uCL*Yd3B{}OX)kZ{w?U+aR0v^-uAU?4DFadi z2gJ&yu$BCQUD%|>pRd^9dGE^2j{-CH5FID7NsUFg3!UTH;uLT#gtzehL#sJ|{rP+g z>-{82&m&xXGt4*!rGr~bR;Jd5tR1qI1xu~acBXzgOdOwZw_s`$wpc36R7u{HrTrN9 zsiOHJHq~|zi~X(6e4(a=a7lSJZ>L}s5%Ue;vlB?Z4~)%D7W_!Rl{Wn)iXn>I^$5XG z$%*mvdcXe)lZqI$(EHp1&s7OKCNFALfN2W>P6>F#9wX~ z3Lg8+gXVo?luJu8Py-r)pT>B)Y7uv%!M*e9Eg(0#p+A!?HHli7T~IgJ6>UE}2iG0e z-+`poGr^YHuv}r!$3cR>yEJ1nlQ*cfC->1f_`mZlhdh$EYEK{?XejMcfw@MEqd}7? zL(99|jGY?$g)-u5mX*b_Uj7XG?dRby`8`<)b z=OcB*ah_nL5sZd8(|?zZCk^@-b57K+J646p8%pl>v`pqL^p4zamg-e0H|Vw37C{53 zLGvQ%F-ga<-$)&~*8dXw9*u;TvrrT_l;@}{Q+tF7K$|*@CT(XXnWyR7?DYd4_uI?= z@TPxg1&A#pKa)%8V^2;Y6kL<|;R(6!V1^FPR;lcxONQRo$!a+&#W05qWr%HN06xs> z=(l5BN~usy)(W&(c{gKA`wWsN{C6FW<-f286ElE?u5kxNZEPs`T&rgL6!8_t7~Yir zXKWhZp+5p(7$agGN;LVqE}(=Uu`A1j>5Yo>Bt<@YL{J7nAzeX-jgB$OlF=%l? znnCDLtR>tO$v<9mSwC)c>2k?HRI-7G+gjA!m*`H)pDzmA5s@p%vFTr+sMwEU6eW_k zYGx?1S?J&)(kIKLc;=hO@A*NbArl2x5hESel{I_nb5jkAKMny1>qW zOQ(0jT{*i5m?}dP1K8RR=)&{^;;Mp(bn;z%b!dSZ5|Qx;rW_P#q6*WMHp^yk@zXtX znE$vr5S=dSD?0{+2xrP74n=7lHK|Z1#|A-w&2>$AFJ3H-Jo{WgTogin@=9}CDwzyZ zJ`;Wf(a35rA@@B5rhE9uD^koKBwm@|@*)SMZ%Ruku`vFvw~(1`2FSn`$LQ1F5LTnF zcF_l!qrVeah$BldqPrPl?4z(fgK<>Na9Bgx8dN}^sgP)|n{nj*sK0ldKI%qYlRy+J zTX?*aN|D@QASB6;x+FxHfOELrFeaj3zjTYr@#;;v3(dM?Z@I6dZZEE;@K&CO$ z&BmdvxnG1SJ9W!zi|$@e6UsX&Il!QvY|-?%pKl*8nJSacNR$alO3AK-lAabI zcI@G0?I*T{<->lNA_>2uq1*={+P}2te=5p>q6Z`QmA&ZScM}GRQ$}Y;P;3*9AY?cj z+@2Q9|A8#r=GHs6RIMf!`1AcN=YZ=v+8T$Irh2nxmI@G^&t$QeQ;PLM5s zIy(nD_B&578@@9?b3zS#(4uQGaer~dlh^AUx~8y!xKh~6a-xi_+^b*R352jfy;UOx zc^cx0X2*SFuC1D`SmxRHdiEiH>I9GZ)fUFOz11>UQ}zmc<)J>5F00H_^|W-{TCace z0r)rRX~EEkS4huVqQx#*;=?C05I@g72;f_(azpf6a6f9=<_GZA=){Yzp>e%`IgZdi z{FwyN|KcW$D^an`OcnwbumL0M8ZVxEf#GsVkt~p!1GQB2^Mo}gEBE4$emF1hnls}g zMD0e){`M};-#QSSmN}Bo<4289I5y==f#^46pe<@^6lEO7YFXy3nvd8rjs6dd`WfV^ zB2Q%7=UW+jCU$I>tR!$`31v0X)Go+Q9q)`=tG@MMU&xFTTGyjb0RoCm(_M6SrNsd4CiMeF6*sZNPzBz!UxTCkm7f4L7Pk^F0tKRl=GWH#<#5T7gC~>122Vg& z7iFeO;@|Mv5tegTd7YOQ{ETvf?-aIhIixJ+huKc8se@lVjFJ@fTZMFTco2vancy-D zl(JS+Q*2B9<1bkq6R%BT731SNK;nwZGR?0=v_XQjE33kpNy@kEb5d~8XDgQ1N3s4) z`N)bvIKZ@QI*@&eJJDW{mzjX`b_JMZwDfNhNKmHMl?_z9m%Bm8FKTPJP7wN^m-?$V zEAe{Nel=&v8)&D+!YH<)2K_LeMO0t@O!7&1et5sa#DG*Q_}mbqh(;?J#H(t8NbL=D z@$K8`QLCgqFU~ziXnJ%Wm5)R^C)SVhu%||dR?P>o*S1?3b6eX@R!N6}4sI(M6(w^x zeyW9j+31jbbI2mKn;{DlJ?&jnJ`AM;@+{sLHM1Fd zGY1N+b39g8fDmZ_k-F7>gUF%XPT*?8rL9AVi^8aYj^8lkm(!YGAfw+Xzo zMw=TaxNTw)K^^OpmUztS4M{pjb2VXp8zX8h?q?Y?9w+tUhG|w^XhTy#r%gxoPx?y5qGX;&wriR>qA14V8Zro0nebh$e#U?SDnZaDmFr!G8LE}y9~RbcrF zU_d9@Oc8E#SZK+8mn?Vf6OVw19+n+qN)JZgznRx$6f7|15VXz1OD@3)jneENr>n$$jzbH*eImOD51Q9 z`fBUXgt4=R$(<>6W2agE2c%vC%NOSX0#tmey5g7Z2_>`fxz9a4+Qx9D_Jyq)GLK(X#DU+SR=`7l=HfR)`-@ij~w?g|Ff0l7-aZ-3-`q5YtBW<4TWxUHs?C+$%=}2}aqQ)5xqcF(d z0=@NKZZ7_en-=1z+D+Y@x9RqO^UpTi)-6Zp(`;I(Z?d3R;?csp8_F)xS$}HPw$WLB zMqDn6k(vJ+Hg<4OND;F~1?}$7)o!y^IO_WSBv{FGzrl1^fWC;ZG%H7x3^$N`26_!e z_C$ogkse0!tjyP~&{(=V%+X_GySXB862i=^!<56#=t(abC86z?#z-vg(EPB!v;Auk zk&8w#nh^z#PL3rdPdJV@>3Xe8eyC#+vvkQ0-S+ z#B&^0um{C-^ZQ`W{Zhh{u!rU@zF1zHM++A6&`_kx1-hOpuAF{|^GK$=W9NwPh3P4l ztLgAueZ`Cj5)8jmsq=17qeQ8Pd(*ECpPj%&As{sr5C?9ephwjuZ*6KVtPrTHJiVUk z!%g{l_Lr~oj`S@ccgBACO=n=}FEIcYqT*S==cdW(4su0-VzNGxH!yl6jO6xU-vq;K z7Sw#Dp?AE5*Wx2!q|OE%1n%MZ4`tB#z=WP#InvfsO1=H3Mx* zrzd1Uu62c*{1aC8aj*QIuiW*uJ7a=<#@Vhx!T$gOe&6Z!qvztUwF;_%=TNNVy@vbR zVU6)4yCEFF0FB8bs>%*O^v*L_dUh7LOz!W{=4qxFGdBJgLf%a3TuSuyAUj^aMf2;W zqn=Grp*d=-Oh?oh6jRX2Q~n9lLzjlMGPWt1rOwD&6jJW&G^W)WB>1(x=Z>L(u&8|S zpXD2iGYhiu@P+v|$^zN=$dl2%S z*AMGWwSI|M^Ti3n*;!@)LP}5C(cHNl0kX`=?%D#es*C=pZ#fBiW0s4mTM?%g54RgF zm7_V0W|%{TYd#L*P8rT{vugIK*uCx^XZ#1CZw?d$gd^M^d9PS4+WSG4fWKkaj?eZZu`y$E5}(Rt=EbY3WLuT@0kRgz!io}5D{Zl2gX`I#z0WKcl_rd>yD0H*oUhLRu?R{YxJMMtCr2U$(%n6fr%<>fStK47= z1~c5Qa9uxGhkk|1X@5(_2oH8A+$>>~pYJdu6ll<(ARVN2$0wf$`uUi5gG5;{SN8GE z6PK$4Q9G%I(7Xg~Nq~|8w(qr{0vT;jVwXyla;$clhi!V}9Tg7;`koguhSG^N4#y_* zM}ipniIS-@$QSgD>x}U-i%ck zKQfDE^2q!#K)UIdqT%?L(_&DtK`If_-Q z|2#e~rIZ>A%uGg0&z0GLpc@cuvcz(H4q70QI=9^da=t zO3N}{_QO|xd{7)-{mTJ<47yd?$6Kw>t%;nVBpq5@pnHz1fwCFK>(912EB$_zJgHWT zit4C{RJS?%T8RnT_HAqsz;ON%#dwd)@hzWFsJ4YDH4 zCFvFlTR5;4HAnl&I>E*KE6Qa)_%PP_A{bSn3McYp;nk1#Bycxi%L>83jBL=X9v8b& z2os6pQG2DjiQ*sq3ffYCW!l%dBnaMLgqs_ibd?iKp-Ioq=5SH_f}jt3!cDB{B$I?(U|wG7fldJwbFPVyl?Oi(IFKH~zr2 zZbxS2lf{ety`Sc?8OGRluJXQIyos-E%)#6QQiLv88cGJMR|2xik(dK23oTt;>xNCe zEfP~Y5sP5duWVt<9{h%`sSOQys;UF)_L~cn^gjhvNPYCP2;$g~Yxn-eAo#o-_<&eS zo>q`h;~7@!O`A0OqZ}?(NVOVM9Dwo;|v6JtMr92O>!xh%-Ua z-40l+e@EU_XpN+wR9op}T*WePsm=dS7}g}b1ORh7*KuXnI$_t=F?H$)x|Eo0&TG&| zF#>WnkbxPYom)yrDro~zbn}zkIPEe|K1yqfa1k%+BQ5VtIkAP%RR)AwhP zg=Y}xOKxTU0eT&OTF7^>LHak=8|UV*r!=&?1u!o|0#QxHl_Fk$6Z{%=>g;{>V?5Cv zgwU<0(7Za#AcfYADrL+pCv`DbN{w{{{tD{&tsbt+=nFtMqv<1~h;D0P7ZetM{0B1N z=08wvCk-=LYX?{)Gx8xz1cKf`wRnU-XDR*2SRm=mQ+yLRuVnNNL;HzUlb zt58I4e|bG^Jnj38j#4KYqrNQObNFU=qP1*!$ifTb(Mwp&fExN&y{3=_SGV2snxQq< zhb`Lou~R43@8J-LEIKbA{leCY$d^1ik4PA8yXu{Gbi1n|e)VLVxOE-~Ha?a4`33G8 zxIS@mLyh~c>w{I#Z5Rrvur0Qxn}Eo7F^ME{^%@&FP)TE17QY*yxL-=i*GiWZ4O)p9 zKQK;*Uknjl(0f)QN*WCE`=xoi ziPyC6Um7-`BnFUI+jau$dXc-zWJ7^p_@q1Wb5@dmeSxI53v*F#C+7g5G-ScvZzNT+ zL%^9u{S>B%wGEB{>A|;DA`^geexSw1RDnU<3>`K~QK2^%s8avE7VCGw0~13}(=;r! z#o>yixN1Ui<9dL9P%0w#7tY>Zl7Xl!8gSdx2 zXf#)-Z@mjTKbcExaJo>=vP+yFEEco^LN+KY=L6 z1EX+ZiA0<5=l5sw;Ox!^n~hsG!A031@GS)JtgST+U~1#2`$upM-PLHKm}R=DB`NY0#P$waA{r7kZaR^;DnH+ z=#;hE5&2#}sw2|bUX{sb+?1Qie9u?M8faZ!R@NDh+#~^hr8sfqY?j>NKj_#@;!Os zLC6cwf7XxPl6)_f+mEwg_%$l<*M!ARmNkWvTP=PDdC=t)LTouoT5Rct#Dhh7h70@k z?!M}F74*2u;a|x+XF<~xoDG@+BACGy%z^+}0ti|TOf0ogH0=7bKtrX1VhIq-{4tk` zXg-nL4};7%{1g{gUw>om>8TAlj1uDnNY*h%(4lpj<3~zFao?bVrYXg{WXEH8dBky# z^=NAPUcpm8Srw7SbC>vMu^TKYK=L~{``g1m-k2>PGaQGon%)J969(%K*s$q=hEU?* zoJ>cv2XBM+s)fzmWJ-Hucmk;9vyZBV1TB;8gh{6(4|#) zC{6g@s{CU0y+#NNMF#IFhV)iJJd7r9+;-&#iX-hvg+^Dm63&%VTCchY+f zb_mn{)Qa1NAhxL9!e|fGG~Uf;Q+Q7LlDd%Mp6C#C{EPY6PSu>tm?AaOwhC z-{k@Ql`Whqo0o#uCi1xOe;SIa&G|PzgbGY~2coqm?m3q;L^hOi1TyZ7W@3(UbI*fuslGdzkS= zTfgjqG$pPi7T_H(JkXybPl7MHt-QAPmG=3_B(_%V-9-k^>h==~5Knq;CxOYJ{Czh` zJhHLxyjV@49D`1J$I#UYF-(K13qo<(*W;PxAfZP;slp&cZB&DMe?(Wg%$AY5utaOG zj*5(ads#0ID8_+D;cbLj4d>;T_6S{_YQQg=1uIv1GLX!!@R@EKDD3hqYZyzU8p+~4 zN-}0Gx~;BK!@w;j83I3$<~*k=eQ;ZSd{r5*9H%L>*F5@s3`HB& z-k8_WGIG#p7-~eFOpykw{RMa0CJSR%tAM^FZ?AFeyQTcq8J=P;xEqE$*H_x>$h=Ka zbwN{N+)fOJkTsZW&{=I&1@M}08Y+x+sQu~?^y8-Y8Or(}l_>t#+EA=GDd=MUo2Dx} z(QR?^*_yl9eCTzp=rT408# z(gu@rTYhxqIiKv+14Qb+Rs^E5W6V>HYT9KL51&@ zs#iU@=8WlmjobUSWYj5kn{3~2_Cv`&ZsD(qc$uHzIuV$v5!=NL{G7G^YAkQ%>Y*W; zuW&+u`j|dRu2^i-&jA7Leh_ni*`7NBeYT@JTo-D)$pSqkm@#K+Y#Q{rHiLv7p14@Z z{zqRdj@~?^%#Of@ISmmRi3cW*Apwv110wk6@5Cl^Sp*kFB>FFfTYiI~eNc1~5m9Hd z%j4`G@~9jbHxu~T_gmVUjUgn4kY9Fw^ubL@nhB^<_q+>)=&sC$d}xC(fN}Nl13TF< z8RVhz_K}M~m;i3Yk~NqJK0D~*tYaGFUjGQ5rwPTH`Zfmy+KmxHklT5ee5@O#%;zI< zYDs!r3_(X~!2sMT2(Zy##Y%J0B{;K`I(+@2u9d4e!tjgLq+tMJ=e457m-n$&wr=Qv$Vm<2vpXS@~}tIIC6q( z1>=+rhba34Vl3=OqHVC>Ls@~n^-Pp=4pj$OENu>hLit-77gCE(j!J~?IPs{XIwJA4 zakoh6!Fn zHw!=?+9Q*XFhfk@A>NAOJd%Nv<9X-pq^@YOF$20|{C$hi@Msh4e_!%^2=g;O;+BGc&C6OiWpXn}s?X{kD z-$Skd;wcWtHoA*JSR`PJ+*fCyHImwO8Mt~my;=1e8Y5^AnvC4hYOJHOR1>pZy6WZo z5vRbT68n2$>+9Ig|52h}mbG^1V79u59o@JN4cY~JJ{Yd>`>B$ds_t;A%UFZpwiM(N(Dkq~9_xzH}jpwdqhW$<ZpmQ2zi>{dtwCGG067Z^xAy zK5>XIZ~~U5&C9qGM984$P>G$S7}0UW!uQBs2!)vle{ID9h2$_kZ<^2om99CB)3(mu9yeT_p(MALgGZE5A-2%%+&A*}8COLRgZp zqs5+q6sxM(e%xl->#L*;ZFW8Otr+-im6(v5#(hQ9wEJ)s_coJ!3QZarBS%;}kA~c@ zw)Lt;z=^>2GDKrZd?DYM)b?NBGLS-kJ0-c=W+u&v?q>qq!->Cp6DeR3Kp?w|IpXS9 zrG{qg9NsoUK*;i*7Y`ui_G*(Pizc0`7?TxkvO!#c&9dV+H}6H-3(rpXzfVX2+yfla zm0t1rcT(^ZRI>2)o_y?8Zvh_N#2{N64pK0YBerQ^uZxq*+g+ztLizxK#x#MI%g~KMw+R(wD_Mv}+Y~pt+ zi6+R^=sqd8T}KpIfh=U~z}P;^sd@Z1hyC}lzZ2Eezi|#JXO@c4ajDqxi^`k$j24uJ z8q8WUz0d>-gT4nNB|U25Gw+FW6U5gZ_uyKfT~(ad+I;&Dqz|0%@57rQ&eD9n?OXF& z3r$0SV50A)ShyIfof+VcU|B7=m(Yx9pa5Wm>Q0FyKm7EdikE-eSW58mr|Luy+dtRZ zb$v+9G8U`FqI*kXp;7+BxY*ZOifDs<0I8>Oy(EbFs5M9=-ly|AZB`f?HS#!1biWz+ zI5)HqMD5ElGF&2Ufu_AvGbUE~mI3(jlG1hv0fa4r;zs#^ql2g_Zf;%JbW05Tdt$~a z=D2HTY>-8i!1rHoZ7pWgA{5<@b*<89_jZ14ggMCorThmcc5W3EY3zjU0lPh=l6>R! zdIAKs&)i4S%#9w0)bm?=_eJzDP+86NRh?GMK!hiP2H`k=EJE)=5UWz83$>;u(?@kp z9{cAJg+ioY2ySM^Q$b8N*ReFnLNMgq&~K_!as$0t%>_Bt0N$H><8Hxj$Ly53 zD%MKDCDjy+z0wC4Jn$*BwD5U4N#5l$vsnFa;)}d7cU*Ak>O&^WQJDBPR=kXIPd<)l zg0ccmH;*`=wOmP9qq{Ncxy&)BBNtNz%7@;;ZWkATwif8%Us3ryL|da;x!IqEcfr40 z8c}eF2J`zusy(p{41Ap2cB&<5UW*Qo)uncx4o)$3i=kKsqbh0vfY{mKGaQ(oL&(V~ zS=-g5Bn>u-!0hSV@?m-QiylcVKh2SPT~rnU9zEMcY$gZ=nji!(~982 zPd!mC2imPNv}5h;KBDrZ&0`25-PIYR*tqTPRS^|F#}wYZ7nOe73U&eGd-|uCD7XzN zuMTb?1||twznv>Ov+k*K%8pTq952FMkt)t0FX=i^l^SE~l`&M~KJ5h2W$cjia=u5q zERG$r8yXp^78b`j?m>BCh596Qh?(hWL-avD@R{+b8%8{T+sS7}VaYPa3xUZ_D`W33 zzw076{+$4>Y#arlbxf`4a z^qfi_s(6rNZ43>J*W7Zb#>QmP-pEU=-*zLbD%y_(ySZMS4&}bW836o5j&-gABPxCG zgkfh!o$?=7D2-na40Xvj@bS8b$A|3aGx^ZoNU$>_)hg?+NHh7wgr29@4B-Pu&Y0{E z3+|iGq?KF|hf1m6%aEFcQw4@zZ1YrX=SYh{PM%Wm#T@ZSM<8dJQ9`e|J5?(oQsSu( zx{aK7AW>v1qa4gaEw`f)7aDiwwn-VveBc=e9}He|cga%&lfF%{J=Z-48Kic;#0{A& z6g=65j)q;O`3p-CCrX+l)|cjlLM(|dUsHh}YN3P|o@{D`g?qV!BXurX(jZwK;o*ei zP79gf)go*%TXzA|A(BQKa+nUB(ure0|6<$s%;*T<4xIrYeZV*!D*2 zs(R0rkQtEQu6VcHT`pmi0yn&w!E4F!rgyg$v5s44X57MYy4)MW>5L9bCY{piPSJQ- zJ?8ts%J7B$Qrwvt?)`vHZm$3p#oQ6bk zYa@)$lhsuO2tTH!lykWkD0DjP#LAnlIO@Vct>)I(KW3-#>iLW|{!9So#V@b3Z(gd>v>Bq!z4jMKycIs~mOV2~`_-e`0wE9;wu1XFyxW{tF>)@l<$f zb!Mfp&9!5cBlM>arnkJ&B31mP=ZNuFb5b7^UhUT8R0^V9Pp|%%|9Qzwy5yV0bS&>q z5Kkr>c|Y{s84VU0VU3b3q`d5yr6)QSRT4gBi(XOUN3Vk4u5oIgekFPm zYP`w#lXNvTU#B7HC_K}TCt>Kp7op)F;dJMoEKMTr+C-&_&4i;qQbMsA5cDBnI4l=M ztU8}1B!B*H_Mv{z+DKSBg$$hlAz=YC1P@Y{J_!g7t7l6TF8Ul|RyGE% z2ibiUe?Fp#wS^{qt?jOJIrq~b_$q|BR9S{F9X9%gg2dw-gvNwlJUvZjWr>8-M2CI^j)7v-`?N94wKZ@Hf#5c#a( z|9#gSLO%ISJuRH1mDZipd|Bb5rg7)?|M6GdBn^(JNL9$>>30+of1eXy$;2zziWryR9r6?PbRlql?`Z z8~-td%qxo2_oSU)YM!~N(I59PkX@vDHZ*drRgu{MkUt3nS)KCd&|DN0auII~0c4YT zCpaWbNsh6TVwd%U+VB<^ZII|rAZk4_s%?=UR{zUAfRkZ~{%7rL-5C!0=5k4&Z)wym z{PmgkJx{V=3)^f*DjG>CC#(_C8tG4DcnxCWXIM3G>UqqCowJLR-d+{fo7Y)rN1f^L z?fK0i>?8Fonmmv8Kh8igHdc|EDLbttWiRK!8A^i^zg6FGR_;z-?ztP%c528kAM!R4s^ zvLl9ytq00%XKH5YzAh3T{VkU1ua9<-w5blbl{8Nh?`*~L`JloMcK6+iB zM|R9Lb;>jZVj(^Rz*;C@{_YP@y8j1)%m1AYoPSL_QY_FvKVT3Kmw6P++UjXS=#|}B zUGM0}CS1wGS!#W5K#TzmrzoWNZ})t>tvFOrOkdN5{iXzW`DL9`T^Ggf$P7}ia6dCs zA9XjX1G4X8V7#IwesTlXF@i}Q!L?=K*(Q^tZ9oHK-tN=nv+rx_tVzSwz0*ut zY5zJGF$REY`K3b*|6a;7TAdy2(%m=!OX`i}Dri+L^C}PdV&vIbq+`EZO;dM6S9@ z_CH~9Y$~5i9?Jv%OkqCYzPyk1XVxiFHaD+HtWa}2)X-{c32>h9KfR$&kPFYz zyAV%Xd`4lv`C^o=YVttNVoo%qL;g7^&hZ7hAn|PxDFLPYe;|3vIfOCZQ=YhZiEiOy zvHw6(sn4yG{}%NalSmU77z>OjsDQF0MYuNlv-$bf^h@XN8(lmjy4p?;rymWWO`-5v zx@ijDi7FtCiKXa-=Uv696jgm!dB4Ga#bb#IE51wO`3U%u z?4ULR+Z*h3fxVS$e$opV`1abB1^yW5hVfx$`Tj&$sfRJ3gV`N$i3*jHYPCV+pxYW& zXItDOM!R6-c^_3)`Q?!d!gbz65VJVcv{}Sh$!4;Qklq+i!}wQ8hh&X-gy@dv==)W` zG{;e=3R6Z&V}ysBTA?RzxcW!fR{Ckp=FxCmynjW|=K&5Pk&xDfDy|3uEM|%SKmcJA zYPz!yK2iFoQSq3hV{w(9g1m~XGJacG`$H5`5jIp;^&jZ$%|T{5Ajcg5DZH}J?mZ=O zI|0UAX(v|GKAc{Fm#6mqDd=`5*%+NKzVGTbALGg!HuzB>D@(Sm^0d~bO2Xg=te7bT zLA-b4_Vxm5|rBZG5{>I>U! zWLalNbJN#5ODc4EcQQr@&vL!iP^b>$K7HW-Ns7#ptQR*)-K3t^68&Y}@ur5}j?O>m ztc(W>RMCyHP>5n19XXERMF0OZ(o0La1{zLWp1PK3 zS$<;VE@eo&73nj6`~yDsL;1eHxler0;hY*8B;Zet!Xe+0gP9knCdW#9c62lGCUT9m zu$Y^6w0t~X4lt1^F#<1|dIr6J)aI?PveZEtDq#b8H}+S&c_L7TS(ZkN%FLvt_i~g3 zQ*d+^u`R6Cwi60wAc!cj7S6?trt}M^njb{J0TSw5^OxFZv;Y~=mjIy^oNXr#EYY(T zdTeL2W!~38udDt7pDI;F;^V+=rp~|Sl+2h!z;gK;gFd>3k}ZE*x9v&~Gkpe4b?KcP z+JntJ+gu!ife*L~zg*T}phBuJzUSd`9EG!Bq8*7GoP_&_ItWrVEp4ZQOl5a)eczvz^|Rx_Z~mFJW!PWq5Ag@ z2kQ*gru@^jcaamm&8w|r8*=U(Lb&BNh0eza{>m%@s-JeBtut0B0;X9^*I)~(1joPX z?^89;rB3hhBUW9z4X4n!`INO#2aEZ>0({L)rA3G7>?eIMl4`v>U$dq6=y7-BicWzx z`}I$@ls;BLAMaK1|E|Dd9q!8gy7AqGlT3}Mf5p%>$&xJpIZK&rk@l`ial3iR19Nfsv+OD^9%^&wX`o9iu>;`Alk<*`GLTq;!9~ zfgdDYW4O-%15m7T`RB(S9M7s$yE11!<5_uoT6+GUr5qHrlL9=k;<)NPq^!MERiWBe ziM~T7`${eGKsZ8$eXL4DsaWYt`dyU9zGu5gef6Lm>4y{1k~B-SLdsov!IgHUrKjwW z-y*vog*`#b+rLKh0IPhEtDfM+OB3R0x8utcnEQEms8bo31-$+49=N+BVEWfk(OY-S`#F~K)e*{_ z>DpbxR7zsbc(Qec+~qRaP^&SNUsjX{MQ;Z@FwHjoRiBz!VDn4(tJzbFWbeak&UrO% z@+55<-~kurKMfYu#D763rWI8L6>v#mR!tGy)QJKB=sKfs@y!rvXwvI+rOT3GPqy@O zQfEBKvtSpmr3Xbb!sy0tFZA57Xhr7-E7k3R<`K(dKwjBu=z$RtWl2>^^@{#sq=?M~ zo-2~y{J^ALRa1Z8$7St0E?=8H->SuzbFcEYhv@a3GF9+#3$ue2KkT;&_Ywo2=#)| zvJf71Q8#E8=O`8|2Q-Brq8MC>22y?IgO8)ozo6QDXf3b(;O}G{`In8Wh2;ufs263? zKjUi_B*uU^0`tV@bb;MuJ_l9~2JR6YZW3}|-4}AwHotx(F~ zV*P%2HncZ+b0}k`i*y9oLZ*zyGQAlG#zj;ceLb@|Pdh*}e9qcS{FKv#DvfHXiy}bB zn(T`3K(?AlJJ-M_2$Sw7~-G5v)c#JA==d9X@akWuc>ZP+kgvL@Ls3TKGId>Q zG~;H&Y{)?vJg@rYa5i#_8LdonX&zG@#cGfKcA-5p?8fWT%t(1Uf+ss(JYduI4 z!6b3QR&E^SV;`1BYajSa(ob$?`jR^H@wo|MNOp&di0>DDv-BOcPSn-gUl^d_AC*3V z(E$|k-M)6bDVq)gI8l^@KLgXz^}13K;?bg;PyOnlJpL>x@KtTA|3K<#HN_p4`NI+7 z3~6Em+JS^{;}<<*psBilc$J%9^sYpntBv5vDM~O3E^NTG$iF02?QN47SoAMosT{R= z8~9$I?gT!BgWR0GS9Vq;Selu@^PY!0$jL(!xkKRjcBgW0+sjlv+MVzG7a`ruFlw|; zkgMVqqO@7GsraG;KK$AmfoDmzd(pvT++%xbalc);t3yN9E&tCOgCe>`K7`RF?+Jsl zR%QF?JQrPY;P|0Mh)p;otcsLvHyjXkES=JjFFZ>4WtpS}1C_o{xZNpMk$6;h+Eo_I zsT^za6slDB_LYF{uf^xyHh7DC%07@pza;=|!WG=}0~gaDF>qpT2e2;$NyuR^MmV7Rwc*AV6po#HGK!+9>$w zj>U7T$$sCTxB2@&kiQOrF}g#cnU0M(YS{r?rtxB#z3*raVFtCy3WX^Su-fS)prt7) zWZv6u&u(iaeN_ME+0gcF@Nm!Q*5MSX#Sd^#CBM-|0mKsR=Yy>=2*pgHu-yfKP zH(4kTY9zL@pJZ4$jXIBz3KV%slJrnTQgj0P#44hZr*ykz{<@2fqxUf$P z*!_Pj;b=;H^Rc~{Tj*jE_;{{S9*Bwm_8I97fFg)#IX-R{$$bwT57L4?4Ml(O^i1BD|%~Y)@ zSti(JXY>a!4qD6t@>QZ-)+@y18Jl6?e?Z}Vx#srO(dDl^PDrkd5cP|+o81+iZo|YW zMcteW!l!$suBH69!OuXBi+QDe($?}Y(js9wQM&E0u3~|TsJg~NH+ebHsl966Hq`}({OJI${YN>N1dDi)>$)#Bsxp*ozLc=zMP=~ zt>NuK)mv}4>N%BYk}Pl>?_P%TWj*oP%PO31_CJ0Irztc)!e)ba%N|V^2-a950UzNo z0eaVQd(5xR^tl9aoB@9zljcVH@H{1LD>8$titfuqy)~AxiW+}Ftze9{It+Od0Rl~; z6iygIie6}^23L0a?rzLak|F-5`ipwAB*gr4{=P8KR%C=B_X_<^QAXdja@Z>KL(R?k zPtCDrPP{;XVIPt44(~n{*vzN&%O%L{5*>L@h`jMW!>u-(8r*zTzxi42^S|pQMMD=TS@aROV~Va46o%sAk7eBGm| zz=6xYfgV7SAM)Q?;ouwD6W38|7hWOSvEZrX42fE`(p|3B^(L^6dKRSKa>fp}?qddYVGPwjiRi~mAQ^max)hLDeXuY6t$EyZV<@gDm#XfIb2|19t} zK)=S1F<~u74OPS>?JQu zsss`&eV~{UUdZ;giSVSR3jaD*pj0K%g7Y^98j-#k?u>ul$6h$3t?K3U6(7$b^7gp7C}MmWqM&eFShsTgoAkJWdXUOoA-`7RB7Q4!r;}HIN9=-~Bzy`g*?f zqAW)tyIPIjlSTYu`{A2?b!3v<<03skh(3|Od3R)EcKNB{(7h2*vA(U3kK4SSmwm=4 zO<0*W-)P8pTwBCp3SIvk%(ut&#b#vtH08BI-hi?sNTfK1W%AEh-o3KW@mB5|y7kJ0 zmgzh1$*~V+`EyPFk{05}nw8KCScA&LlTg%6V&T%vclz@`8WvBBIR?i*{c5}Cn*V`% z;=hEfe$oEN`58D~&-BNqa@zPwTF}Z++nJzW4j+nUWChAG1MV_sOgzS{aZFe}>X7}{ z7O6eXWw64c>Psbd#B3pfUM)p$tDBOy&Jk=bkGE)K5Guci_QRUn80Dnqro9KRmM)r* z2oRc9K8N9h4${R$<);z&!v*_U&PR-as2X>SM`=G>Y&xrZH@nXi>e0+&NRbw=eslSj zg^nA1R0}1Hp|hg)nVoyDsHMnvKDZ;1K1#74{eh5Fg7WN}tvJRorEn|suZ)Yv(C#TA ziM2csC3e4M%VBwDZCd%VBPT5$uGw;R0qe_w+O~8F%o01R?nCebEo-kNakdrs%G4|% zXxkd{yG8=6em*do@*0q` z;oR+SjWC^>D;*G|HyOnC_~0k@D@iXIrRwXYKtV%JUyoQBbp`)F5^im236Bc!__Fb6 z^K9>X|E&pt#m^5O@3tgB2t|v!kNYMP4+H_wKR`RJd2|dUy|Yn~;24dR(B_XpFwkh= zy8-5vDc%=W0|)&jS3xMCNh?S<`$YWAVm>|J#)Ah}L!#1aHtsOKDF@uvk`%v&=H^bf zhd*C9Z>9-2Ag;HK;q(Tve)l1u-=$ld>Dy6cqUUAwA7|enj``FB!0jMiZ=-Ib4i|zr zzROH}2}ThX8RHW_r8DjYqQAYIG2BHl@g3YTV0##7F~Nal@gSXI^CBifk3GVZ7w`OY z?Y6ImTW9JFHi8yzD>4RX`8^S*K;tJ?X{hQaA=n34e`N1;7&|AxEu)*Q8&HaY+~;E> zpk^Q7?-ToK2fGxkCaAleYSGOW93G%uR-~UE@OY8XdiQQeB>aUKz&AZjoiv#RCzUABO?97YSp&;gDJAZ#IDBlNP z@cONI9%ayeY>xoxMl9bP9p)-IB~Q0n>|eD5I%EzLzVFbGZUm0i7Jca;%TH>0a}IKs-H%EW;<-qgRYcN z^oz(0XNG&rES=|0o&JMd;QB|qa1Ge2Pf@poWrRw&>oZxnx@XcgDxIT zt!8rwvrwEPUA!#iwXaSPY~AcWnDhvO<2%Imrpp~vbOQKfp{CX4SshjSeya}>gu{}{;~`<79cY$x}I?N%P=el!8XFRs2-)3#B;`iC;K-c<&&ELrfK47P!h zGzWe73(M8%&o-1|c7ISlwp;-5XBjCvw{xv#oN$4Ms<;G2q^Sjmp;%Gnx0{^wlygsk z#y6vlSib>z@gWcxV{|}sP|+6oMf0#$PVl?@ zVsH7GubOvhusU#jV#LXfsm-F3?((sIUry}IXwc>Af{Wvgn=c7pTCDK7>7EADH-~hu zmGlbuJ;2mohETdY#)S##DLlr0r{uE{i@Odg^$7ka^r^e&*A2J<>}7FKgldi??L zj#l5nlZqA7iTce~La)da)r@wjaU>vF@#OkzQg22}N}Iv-@v-kEQEZt8{$igSO$z{B zRt7z%=ncvwUgG@!K&~Mw{-RP9l6^dKv73lRc>{|ln+!z_FVaq{&k~m%V>gCn=1bKI zqF=Y0dhEiViGn`P?i$I-6h47J(XAAon`j(cD+VUQ%Z_#BK;=axSl`?$P z`hW~D0-v#TU)EdTh1=;4J1K02YE0!iREkoF?Bu@hbECQ8EO?6pkp@|=`botHykxDP zs(1HiTO=)>CCLAc*?1BNDsPj2qpD$>lW2_+ZSc!PY&ai7-A}U7{dcSXJb!mwb&(7$ z(ePcR%kfXTGAH3xn+wv289u{2PPwRiTTuQ6M~vkbfo<~Upo=~tiC*;In0BJjqF+?s zKb-z7^(Rx38~qz~2uz9Dy$_a4w(E6`hlp?}vBFhn%EiN*!ZTd5KHOD06j+}HBS24K zprTjmhQyS^pwhXydb>x*_4@TPx`iyaZEQ{*6bl63xLIglHLF}~?^gRmeuL!#ha7t& z-R`mS>w4H%l=qv6l?HHpW_jZej{YZZTdv-^REAT?)7~)~{311YD0-m-Fv%K*pECTJ z8yFrahE-X&gjkz6v>?G$z}Y5U8|Ch$+1%&Pa(((!F_3cQ(BYYK%R!>fXRdZDTrO6T z^X7;d@lWz`EqK54^i*Fb&xG#aJI>r9gV$DNb``RJ<^?MkT!-}g=yPjAA)xN~_H*P_ z-39l4r*hKNoKZgM^OG)`U>}9d)ZZujs=k(8T?asBJ^&25sc^c1HK;cC?;^?hEDwxH z)%NFJc=g>|+JozGyDu>OZinleHDHR1)KBw(tssw9V$FQZyn@c)w808ho)^lU;3S!Q z!FI0q7T1APEV3J%>QeQRreb{fz*8{%c4)jY)eJD-0YuR)5n$zsi) z5tYZvjvpiUATAijkxC{$0Drk@T!Z-$c}|nlVLiciu)CwMd=oRCS&3r%mqtIywgb<} z+o_#~uilk%#7Vq;$&U2da;SZlCl|VYz&q96pMO?Zrm_;EIHJG(T(#>gvDCGb>}zdq zoMA3l!#1gDyx8x}odmTl6IHDJyMwQL453V3vDb`?K+L8LN?2>F!Gd?|2Y+j{_t`0m z9MVt5dPy63R73Ls2O~%p0Sam%cz}qR9stNWcWv;KnL|SzxVbH$it+Pnuz3J$qVH$gLSNow3Rgo@_9&8K`(FQ=_RgA$W+gv> zP=zWQcbvop0qIzWql<2t5Nx|kfI#3wm)^&Wv`~}+iH`h}Ka1Ai$$Ow2jTCw!tp^?Nzu&cl<3}9?@f*p&M%NbwdjvAy_(?9P_v3 z#3~BBO{J1ry%v5}8WS8hmMH)6e&DyZdsLYTn8tesz+_z8#OnbbhMMM=+CTS-;0Kaha!l`bTc1X#ZX z>?oR62-rZrVQKYQa(&-{hATi!Rs^iH%&dq`u>0J(%2)~=#)i2JA zJmSwyASzoQ!{z(~0JxRU?xO@$Dds|J#7{B4@W0Apgf6e=-!dIOuDYpC)>XQ!AJaI` zP7!@A9@y=~9cUiLK5Z#8^xl~@L$Az-2qW#Vm%H4o0!HPxE*-x3r7{ouf zzD|_Z3G&}k0W>+w)oVggSRc-V-FO^Kz=dH3^`7A2*UY?g1|UoU9woRcNnBnF^4%$o z9Uy)8a-a^^&GIk#-E}_7Q!49b9eJ?S8`LPK&Ci81!AlRlD(M`I+Vm)RT+ED(wLu#O zJzL{b3n2%%qhuXlDwlvD-ft>#*R1Pbj<(Ie7+PeEfen*51lGTrDP_okQ&F-`saAv~ zFVin!w4F0r$@eY+g!`P0NSTM&w|w(+OdoX>|nEBnNj zhd!C-Pa6Rmo0u5iIzkYmb9cOoz5AQQB+t@S{{3G@0Ld3VHyn#Sj_8zEhnu8_@FAsPSc&4n0k~~1)_F3o<-FYizrQ?E! z6{}=MY+OjJ-}QNdz*mil$cr=~yy)AvkgErO+ah6s*=xfK^;5$|m?r(i=Ut(334u!Q z>D2JfMi~13SNoslyx*q>$L=Zx9<@_;xoKSfe(}d%zqKX!6}YKw#`ZMk$w}`t5nR^z z(;t6A$HYuc)qYkrjKlMW7-^wRX0CR_iO(?Yeq5C+hM$Fo2eU@j2hGY$;1w9~Hevo^r>9Dn~Kc(EhGAv zHXBFwQ&P5T(6!4BRfE30f2JKInz%G*vEA|ZywJYC=ReL{ULm~APM655Hh3MWj~5sm zg8~nd*?6&D(1%FMDwmWgm#+V-5Euqb&b|~2v1n;+0ur}nd@paOi0sLsf7Q@Zo4>En zuwKio$7>^L#3&yeub!~298No61gSCK(N>Oc8+^+^-`{#tLrXHS70$*FOZls>)5HP@AU)l4pN16N^ zG4;IcCBs^v2NFyETQdruM~Dz{xk|bF8`mDF!qHF&r>TZt2S$Y`>$o5j$b$eOMKG!q z`j%P`?MInvRBe%od2_r(b!;A182vd7t563&%~RAGKw+>G{0}rh$~9ByVCBD@VN;!Y zIsV5r;0lnzTMmY-cG`h)SPXoTpeN4EbjeFG+?FjS&!}e(RIe2I^xG2_it$c z=v^HyJeqReLxk>%oN&Q2)$jN0{NR>aep|a6Kb+nU)}jqiVfzM6>K$w!1+3me>V6wW>C!nH9k!`R*DVAu>N3CoP zb&MiQ8@?}<_%UF^Mkhc^U0wS>wh5X46HRl30I;5f7zLoX->y zKttN53M-ieONybFSzQ{XwlS=|U~A$VL5SP4%11nh$Vgpi?(*4{M43nhW*G6H_wg)K z9?&?am?l1SEI6D{D!V7rZ-RC zKGRhI)QCWT^uAo2Y6P>Hf9a(Uac4M6um;Yrxg1G_IQNyj%6c&-ZIf-4M2}&$RO7Bm z32SOZ^nuN{@8oqjEPh70cmasluWKh7{iP10JZ06*itvdSz%%=1#Tak$-GLqhP>OAm ztPi(E$gBA*X#GrEJH-EH3r-W&FG{Kr=-+_nqqfF02kkoCM&A(}URiZ@w3H}3n&o!U zc&|RBM{_-+#&$aYMC6-CI);$ybn(wA*Ny*9>Pj6#HH0g`;Px{xdk3*FI z$_F#PO*^g!zJpMf+ik5=n6moi{n7sDhf=`9gm<{KnAwt2!6M>;F8)EqNZc6n+DHTk z$P@YfE7tPB;@@Jb=f!2N+)O6paIwysZ@Ouv1Ef52Pt?e$dnRMw1m!?Gy4Bn*QHgNPk``fYWA=BFhwhukFc?B}BS_sne#!hum8+nFF zA+oMw(ya`2q}d#L8M#DHAX4hiQuM!?am(f zf&4#Ew?<8KcjeXV3k2p#_op6f-iDUE;uD~{nSOsiD?p!;_i$p8-(sGJ`TAn9y4)ae zOg&sF{;e(6HU{wkn#HBI7p$&azUEp6;2oC>0-N! zd_xZ4uRTz-Q;6Y$vLnq~;>tYRQn#HbGv)f;n%gA}q<;ItC0OK{P#fnsF_7_s5pB>p z6!EuA-rSXUx9*CPc{&xF2`sH=WB~!1 z&6Y1Q5_o}N^|Qg!hy}ZB6CyJ)zzO`fN{T+vV?aPmVU3GjcA-&I^?T}npc1;7mTcy@ z5GjA=5Bv^y25#J|LIbMcN+bbNL#W{*4@!=eF(;G8yp;oZ&o79D4`If@XjSH8D*4lF zaTbF(edWJJ4vw^gHB7fWb?szyQ}e^W3BiSRMCYv{Krr6jpaFvUZ&462og_h)wghZ_ zWWa}Yguhj|BS4eUR%DRf;_2qRbUW^Py|zhhLgnbYQ{3VUZ48-htUKX>P_S+qOa7kG z?fERR9 z8V;1SA6)3YFD+JmA02Zbv^@ck=jobSuLkZqK5>s5Hp63`Wk~EIWAzgxKSfD{#lDPK z^jQXCpjdbXUgoVS93oj0+*}b!M}?sJ+r>ONbX5NQUsYEg5B2l^SJGC>5^{tsltdKC z*>0DsVsjYvFRKc&x=N_;pB-$b`ZEKu@g{McIN0S>eq*EInq{Y@m&xA~9blr}A18P*% z_;Tt#orJbO`JnD&EtJ$7Xe(5afTz}bpS!wLSWPun@ zeY^LqoF4nt*TF8N@NNgN#xEQBc$=mL{gXiUkwe%mtrW=Z@+il9H^ArG`9I$uWp1XY zkU16q91N*e+$OH^sO3tbnPBhnoixWL@zRQ>makx2K0@;$D0~H%1k3JhcaFH}?88Cj z^^NY+(*7l>5<*OKbbS?|mk`UrDr+d@9x6 zAi6J})Ocf_53TbRbyrE{^~m_yrGy95_Caye`0k4RUXKVx={_r!TuXLk z_-vO>k+l^lieAamt9rSHbP7g*@Q*G^NEYFp(Z8j^Sw0fkw4C%-u`8*#{kOS5;ZpA- z$;a`gS_z1p-(x)5>T-XBIwu|a^P0|I*aZPg<{7>8sZwZYJ?Erwk{GPSw|-#p3eJ1! zR-VSCYto{6rWl@?tEKaD?_jq8p~0Bpx{#B?1j1(%6Jo&kGP6i5^>_V+JnJ>HvY3SI z51!9P?Rj)28Rbc`tt6Vr>0^a!l_oi$c1_T`yHU1#eD}J3N|ftJIUA+lz0zXWFe>vr zdbRWlC|p~thMYA!IDEKCN#n+;u-5V83l@!}+m`~#t2-FX?)X9k0=4Du{U!l$+TUUA+zhn7%`!ru#&&sI_)p2`YL<373m zN0k!iDd2cE$$KOLR@($F<^g4%%j3L}Q2ielrY6sP&1@o)ZH1`Z4Mo}Fl$`hYQ&LJt zDY5ei9gz?_)wov-jwo@=&ll^$SO$;%9S!?Mza1rGq?w_j(&(kkb0l63-*|(CE2?qf z4B;hIi=zs;?vjQ|VTMNNOJ5l$+WCtTN3}byh2d+PPsB!IPMW=PLw3C`Tx@H`tvaZl zYF36WWUbzq!wlb@r2XZ%?W=i4<9@PbKt;a*F%8OVpVF;Xx)1_;VEA=7)IPnJqpQ#7 zb_M60yO!(42U*s)Ok`Jl_Yde*$2dUp5%AYdUhMF6TWiX>xm}VXKF7T|3SK<4eU3>R zuAKH#(o?v&me1o4?wXe={yFmI`0?iYGpBzS5780x3Kz#pb9XPB1nWe8_*E0IoM~Zh zAM*CXMWYU*5A3bx)e7ghoc{(f%5oNl=5#v`7!eE3hu2(s6{Envy4O%MW9mUPBhhra z!;EblM-1!N`thNDm)O%}6z65xpu%Qw3$ATQr&f>q!=OrCek*77E0Sv-q=}yfHqaOx zm*t7=S_i~R0?tL|&o zanvi0eUfRD(@+v^-WSD2`Q5Kx(^h}FNnryrXbeawNY|O5>#8WfEKlj)p1Psyp|WgutG@@4MM_R%F&n#tPFG zy_iy=N#uBjSfgbn!4P6Rzan|2_pS1L%}{Bry7nHl!Xl=ZMRx8lv=oUNiQB7FHY?9!d5i4PIa{|EKeofuciBEP zMO>xjb`B1kV&hK3Id!xPSo~c??4^KXO+ShcZa_+BFbq}gV%$w~#JrbO_q>EiGCb(i z`w%YUi7BfJ{06=!rG-Q4}3-jv;+N^NtEF33hKd`-(of z3QJd0d2#=Bm+;DOiu`DXAuO;9zRm!wj>fQ~VWdeZF~Pg=6*^O6OgV`G?Hsp@z%)Z( z9ma+ilQ7xv*aD;b{(c(AHz49uAP#>9q!}t#TZ_hQKq4P*K!z;wKeNA+QLjNztmjB3!T1d$Yh|B`wvd{_|O25WuF{VtH5 zRB!`3Bo+3i02I1ibQ#=$gd5|DDH?WA8ZfIh<^PV8Y&D(>RPN~D>HE-l;l?3aZnp&G zz^H5_I89g%C$F;X_Y0owi%aVziX(QN`j1$FkHPNWt#t1Z-Z+F(LPBR-GZil8E{j(_ zLajAlso#1;FVe3?;tXYgYa!o|d?sQFZpFj4wCJu2|id1k1xlO}% z=jgXu+}1lHXq=>0dc(JJ>;FG6I_+wS?dk=Ij^7GAHX3Y{&X3^IP*T3D23S)@KL$pS zjvcZNjTL3^34zKqx%aosr*PiWM~)U8*zxI4( z7kKDhJn+yYM#~0-8=~?Phg?}>>isC$XjbfxDB)-{s*ICb-LjmcV80s3m{g-XcA1hr zC@(V^XE}l^`h|HodZU1G0%Rz!$)&6~mYCf&GX;lgpvzQ@V;5f1C;O z!O|3QSog@JC7@}R+k+FhK^&y*a=(VFF>~`^0+z-cfQ|7xNWGj3-w#d-r#()4*;t2a zuXObzz`4&6XcBkeE2{uQ8;+?WZBb&4Uc?FHW&;zbkieUwEf00==i~B;k~ylUe(Jf< zZ3%ijd5oTb_Ka(IwuqUTA7o;HE!lz8JXY{b3uWjs$BaTONUkX#9z`XZUb7F#_Y%yr zY3I!16#Gr)pK+urc#dIyl)v=0WHG9{0kMTWH~Vg<$%pyHlEpu*#b5S3MJv}5qhuY5 z|7Lc%Bpjz%VEmTsKnYTtbLK>DqKI@V*@Cn#CA=F;^#MRIGReePAoSDJLsz1uk(wF) z+(U7&HpdPlvJE9LHB1D2TwTxQI$o!MJR5_Y<#A`9(quO+&IZ*E-0h+=@ZCG7H@b$tCNG6Czav%ya9eXLx zkoF)}Q(M6zYi$h6fH?ln!{5U^A95cq-inu&`WVpAQ1A?Zus0B4XlggA(C3CPLGr2c zyIVF*z_j1XVLiQ|67=ciUsNTUVNkQ?@CcNS=>?#m>jyzwTM3*SW#E~*s$j;lkC}Z- z<{gPg`S}n0SQ)(9Q$k+KZ7jg8&ip|RCsZ93Ttur0qt@xHI3WTrUadPN^@Es&K`r97%lk~OH0!wp`>t_FFlF$f?@sex0{fw3`|#%6@7hK1DPDCw@q z%?5+njCCk*l$NNThkN!E`+Dpa?td;+{tiB$GxH=Z8%V|bld+>SB`Sx5$>HIx_7{EJj;rq&9P zw)p3QUx|(o%oGE#@;^XEcN)I#Q-UJCJ-a=5L)Rv%QW)Od+tB7##eE0ttdIfKFRIwl zmo&78ckEWDSNwOV``#v1O%Ki0Y-gK9p;i~Z0;kR-rn*p`FRb?jtq=4tVd$wm(AR5S zgz$Ooyt#s{JS5?|hl<%eCt<0X;ACuQ-6wr;$E}ru^B8|5zrcYnQk*cyUTcQxwcu*p z3&XGe!>6=C{F&K|n74cY9G5G_#lG5YydM8~o8GvPXy=sWBBK?~W1~kH{-XSG9N3vi z8kYQ+67k;Pi$dKQzurw%Z92A^@}Bm@cNp9aUHK!Bz=OVy?E+*MN>H=>GXi4=Q&#W% zS`q55+Y=8Q!^|xHmtiZpe2D-rw&1nZ?2#y$v}>MZrVUtn+gKONhb0JJPF5>O`oc1D z6L1Iv1Fv2SIBTol&1(9WUnE$VY0GR2dLl~LfaJeI@h9&d(g8I@=#K{FXGtX03{~QQ z`0C~)VE^Ub;PZVq!O?3qaFVp3`Jb~C&U=+teT*PEAqk_`qDI&RXg)(enDv=*WU&CY z`-LUPlVvI^qU1*UwTP)M79Dvu3SZs|DVst#<J4niA#il>86isoWHYE)P1Aoi>Z-OEX;`{?W4tz|)G`RRFxas1WivV(BpyCrf zp-O7I>d&8B$zY5iXpjWw)*IOb0YNMdGO`JU?ib2iW9wV$$B{@z<@v?Cu2Gp2O!BLc z-Gd|Qb-~0TB$*{DW>AAauhZ91L2@>N_$=)x7HN@k97%FV& z34RipC>WBl<0~^Bn$U5K!w0L0qnIHlkPl(+vW7|@dF5*U5{F?_YKka)eWkzw1-q9k zGnvst@H*@Xw&B4D%&$47;PNEt35-J)wR_gtOvT>3W~FVLQyhY}rYVk+veHbnsB1LG z!e|inU+kn0JTdQ`WA#fxJsIS^;69ATuG5&N$h12yI}cTlNE$wJ*SfG?XLP->3mnU& zdW9lNQb|ayG1sR1nKPaBq4hRDDG4|w0;JjZH($HSw6sHXomjW9*8Nrd`ikTmW!cYW z=_XhJbOL~)4Q zOC4vdGA*yyn)7yTgQ9H}W_@MQ9HhNu*xO+m+=sdPxrpaLi0`0x26tdt&)P-VU8=)< zOT}3h@9Re6M^5;#1O4Ud77T3fDb{c3V``xs4n=^{jRPX!TU;q~5`F7{K^_qhX=1k4 z8%N2TbSO9qbg6i0Gj%t0z@+N_nr9@6I!O0kI50%ORwGGzTWhBn0|u0KF6Kj(Xv4pp zEKL6^fonpnVtjGWfjFiCN|F01s^+CEeSE%4;U66-yAN~!mz6zdZ1*H_p@Ns@$V`g1 z*ck4t?FrFsS$gLKD44!SO3cXL*0+Bh$EbX)h~_1Y&zwism%iz8@F!xb z$R)W_#*TAs+9UZUD#1s@o4r%O{Va7KkZ#Og9;1h{chcg2T0g;Y3(VX3 zK$9v0miUrfVAKe!C=)5r8h7XM|9eiD)o?!RWk6#!$xLF???9`|A!K%XnoLsH@2 zBk51BZw*KeC1XfKQV5ZQm`#DCZc>3#uFEox`11uI?=&096ctlQY(&Bs%)%7AVGWkZ zVNn&}A56VnK^7CjENJVyfJZP%+M2)&+t4GCfBgjQSY1K*DJaqhZjuv5J>yw9+Di|C z(klUy)O9#g)jYrIV~QFW96*I2+d1}_%hN;oO?^Crxbuff != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + if (uartHandle->rxState == UART_STATE_BUSY_RX) { + unsigned int tmp; + while (USART_RX_STA!=2) { + if (uartHandle->baseAddress->UART_FR.BIT.rxfe == 0x01) { /* True when the RX FIFO is empty */ + break; + } + tmp = uartHandle->baseAddress->UART_DR.reg; + if(USART_RX_STA==1)//接收到了0x0d + { + if((tmp & 0xFF)!=0x0a)tmp=0;//接收错误,重新开始 + else USART_RX_STA = 2; //接收完成了 + } + else //还没收到0X0D + { + if((tmp & 0xFF)==0x0d)USART_RX_STA = 1; + else + { + *(uartHandle->rxbuff)=(tmp & 0xFF); + uartHandle->rxbuff++; + //长度校验实现 + } + } + } + uartHandle->baseAddress->UART_ICR.reg |= 0x20050; /* Clear rxic, rtic and rxfneic */ + if (uartHandle->userCallBack.ReadItFinishCallBack != NULL && USART_RX_STA==2) { + USART_RX_STA = 0; + uartHandle->userCallBack.ReadItFinishCallBack(uartHandle); + } + } + return; +} +``` + +### 开启串口接收 + +只需调用一次,即开启对应中断。 + +```c +void UART0_InterruptTxInit(UART_Handle *uartHandle) +{ + uartHandle->rxState = UART_STATE_BUSY_RX; + uartHandle->rxbuff = readData; + 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 */ + } +} +``` + +### 串口回调函数 + +```c +/** + * 串口读中断回调函数 +*/ +void UART0ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + // DBG_PRINTF("Read Finish: %s\r\n", readData); + g_uart0.rxbuff = readData;//这很重要,将接收数组的初始地址赋给该指针 + g_uartReceiveFlag = true;//接收数据后,接收标志置为true + return; +} +``` + +### IIC采用模拟引脚 + +适配IO口配置 + +```c +#include "main.h" //io相关头文件 + +// 上电复位默认IIC地址 +#define VL53L0X_IIC_ADDR 0x29 +// ID标识 +#define VL53L0X_MODULE_ID 0xEEAA + +// 下面的引脚配置需要改为与自己MCU相关的 +/*硬件复位/使能引脚*/ + #define VL53L0X_XSH(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_LOW_LEVEL); \ + }while(0) + + +/*IIC引脚*/ +#define VL53L0X_IIC_SCL(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_LOW_LEVEL); \ + }while(0) + +#define VL53L0X_IIC_SDA(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_LOW_LEVEL); \ + }while(0) + +// IIC SDA引脚方向[输入(1)输出(0)] +#define VL53L0X_SDA_Direction(x) do{ x ? \ + HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_INPUT_MODE) : \ + HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_OUTPUT_MODE); \ + }while(0) +//IIC 输入模式下获取SDA的引脚值,用于读取数据或者获取ACK +#define VL53L0X_IIC_READ_SDA() HAL_GPIO_GetPinValue(&g_gpio4, GPIO_PIN_4) +// +``` + +### + +## 实物图 + + + +![intellegent_assistant](README.assets/intellegent_assistant.jpg) + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.attachinit" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.attachinit" new file mode 100644 index 00000000..15f40d61 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.attachinit" @@ -0,0 +1,16 @@ +echo debug_tool = openocd(HiSpark-Link)\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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.launchinit" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.launchinit" new file mode 100644 index 00000000..f514a5d8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/.launchinit" @@ -0,0 +1,17 @@ +echo debug_tool = openocd(HiSpark-Link)\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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/c_cpp_properties.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/c_cpp_properties.json" new file mode 100644 index 00000000..9a0bd499 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/c_cpp_properties.json" @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "c/cpp plugin configurations", + "compilerPath": "d:\\software\\compiler\\HiSpark\\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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/launch.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/launch.json" new file mode 100644 index 00000000..8e61cfef --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.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-Link)", + "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\\ft2232h-ftdi-swd.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-Link)", + "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\\ft2232h-ftdi-swd.cfg", + "-f", + "target\\3061MNPICA-swd.cfg" + ], + "svdFile": "${command:projectWizardExtensionPath}\\resources\\debug\\svd\\3061MNPICA.svd" + } + ] +} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/problems.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/problems.json" new file mode 100644 index 00000000..0ad7d435 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/problems.json" @@ -0,0 +1 @@ +[{"key":0,"message":"warning: implicit declaration of function 'GetDistance'; did you mean 'IsQDMInstance'? [-Wimplicit-function-declaration]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\mycar\\src\\mycar_control.c","line":"205","column":"18","displayLine":"205","type":"warning"},{"key":1,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"281","column":"23","displayLine":"281","type":"warning"},{"key":2,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"285","column":"28","displayLine":"285","type":"warning"},{"key":3,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"289","column":"28","displayLine":"289","type":"warning"},{"key":4,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"292","column":"28","displayLine":"292","type":"warning"},{"key":5,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"296","column":"28","displayLine":"296","type":"warning"},{"key":6,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"299","column":"29","displayLine":"299","type":"warning"},{"key":7,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"302","column":"29","displayLine":"302","type":"warning"},{"key":8,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"304","column":"29","displayLine":"304","type":"warning"},{"key":9,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"306","column":"29","displayLine":"306","type":"warning"},{"key":10,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"308","column":"29","displayLine":"308","type":"warning"},{"key":11,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"321","column":"28","displayLine":"321","type":"warning"},{"key":12,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"324","column":"29","displayLine":"324","type":"warning"},{"key":13,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"327","column":"29","displayLine":"327","type":"warning"},{"key":14,"message":"warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\main.c","line":"331","column":"29","displayLine":"331","type":"warning"},{"key":15,"message":"warning: no previous prototype for 'get_next_good_spad' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"403","column":"6","displayLine":"403","type":"warning"},{"key":16,"message":"warning: no previous prototype for 'is_aperture' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"453","column":"9","displayLine":"453","type":"warning"},{"key":17,"message":"warning: no previous prototype for 'enable_spad_bit' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"470","column":"15","displayLine":"470","type":"warning"},{"key":18,"message":"warning: no previous prototype for 'count_enabled_spads' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"488","column":"15","displayLine":"488","type":"warning"},{"key":19,"message":"warning: no previous prototype for 'set_ref_spad_map' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"546","column":"15","displayLine":"546","type":"warning"},{"key":20,"message":"warning: no previous prototype for 'get_ref_spad_map' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"554","column":"15","displayLine":"554","type":"warning"},{"key":21,"message":"warning: no previous prototype for 'enable_ref_spads' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"563","column":"15","displayLine":"563","type":"warning"},{"key":22,"message":"warning: no previous prototype for 'perform_ref_signal_measurement' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"636","column":"15","displayLine":"636","type":"warning"},{"key":23,"message":"warning: no previous prototype for 'VL53L0X_perform_single_ref_calibration' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"1075","column":"15","displayLine":"1075","type":"warning"},{"key":24,"message":"warning: no previous prototype for 'VL53L0X_ref_calibration_io' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"1098","column":"15","displayLine":"1098","type":"warning"},{"key":25,"message":"warning: no previous prototype for 'VL53L0X_perform_vhv_calibration' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.c","line":"1134","column":"15","displayLine":"1134","type":"warning"},{"key":26,"message":"warning: no previous prototype for 'VL53L0X_device_read_strobe' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"179","column":"15","displayLine":"179","type":"warning"},{"key":27,"message":"warning: no previous prototype for 'VL53L0X_calc_macro_period_ps' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"482","column":"10","displayLine":"482","type":"warning"},{"key":28,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"482","column":"51","displayLine":"482","type":"warning"},{"key":29,"message":"warning: no previous prototype for 'VL53L0X_calc_timeout_us' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"565","column":"10","displayLine":"565","type":"warning"},{"key":30,"message":"warning: no previous prototype for 'get_dmax_lut_points' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"1498","column":"15","displayLine":"1498","type":"warning"},{"key":31,"message":"warning: comparison between signed and unsigned integer expressions [-Wsign-compare]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"1505","column":"24","displayLine":"1505","type":"warning"},{"key":32,"message":"warning: comparison between signed and unsigned integer expressions [-Wsign-compare]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.c","line":"1512","column":"12","displayLine":"1512","type":"warning"},{"key":33,"message":"warning: unused parameter 'pPowerMode' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"238","column":"28","displayLine":"238","type":"warning"},{"key":34,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"327","column":"53","displayLine":"327","type":"warning"},{"key":35,"message":"warning: unused parameter 'GroupParamHold' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"327","column":"66","displayLine":"327","type":"warning"},{"key":36,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"339","column":"59","displayLine":"339","type":"warning"},{"key":37,"message":"warning: unused parameter 'pUpperLimitMilliMeter' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"340","column":"12","displayLine":"340","type":"warning"},{"key":38,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"780","column":"52","displayLine":"780","type":"warning"},{"key":39,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1031","column":"52","displayLine":"1031","type":"warning"},{"key":40,"message":"warning: unused parameter 'HistogramMode' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1032","column":"25","displayLine":"1032","type":"warning"},{"key":41,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1044","column":"52","displayLine":"1044","type":"warning"},{"key":42,"message":"warning: unused parameter 'pHistogramMode' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1045","column":"26","displayLine":"1045","type":"warning"},{"key":43,"message":"warning: no previous prototype for 'sequence_step_enabled' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1204","column":"15","displayLine":"1204","type":"warning"},{"key":44,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1204","column":"49","displayLine":"1204","type":"warning"},{"key":45,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"1297","column":"60","displayLine":"1297","type":"warning"},{"key":46,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2137","column":"69","displayLine":"2137","type":"warning"},{"key":47,"message":"warning: unused parameter 'pHistogramMeasurementData' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2138","column":"38","displayLine":"2138","type":"warning"},{"key":48,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2165","column":"59","displayLine":"2165","type":"warning"},{"key":49,"message":"warning: unused parameter 'TimeoutMs' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2166","column":"11","displayLine":"2166","type":"warning"},{"key":50,"message":"warning: unused parameter 'pXtalkPerSpad' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2166","column":"38","displayLine":"2166","type":"warning"},{"key":51,"message":"warning: unused parameter 'pAmbientTooHigh' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2167","column":"11","displayLine":"2167","type":"warning"},{"key":52,"message":"warning: no previous prototype for 'VL53L0X_CheckAndLoadInterruptSettings' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2208","column":"15","displayLine":"2208","type":"warning"},{"key":53,"message":"warning: switch missing default case [-Wswitch-default]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2221","column":"2","displayLine":"2221","type":"warning"},{"key":54,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2432","column":"68","displayLine":"2432","type":"warning"},{"key":55,"message":"warning: unused parameter 'MaxLoop' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2433","column":"11","displayLine":"2433","type":"warning"},{"key":56,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2625","column":"63","displayLine":"2625","type":"warning"},{"key":57,"message":"warning: unused parameter 'pHistogramMeasurementData' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2626","column":"38","displayLine":"2626","type":"warning"},{"key":58,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2665","column":"55","displayLine":"2665","type":"warning"},{"key":59,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2680","column":"55","displayLine":"2680","type":"warning"},{"key":60,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2693","column":"58","displayLine":"2693","type":"warning"},{"key":61,"message":"warning: unused parameter 'DeviceMode' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2876","column":"22","displayLine":"2876","type":"warning"},{"key":62,"message":"warning: unused parameter 'DeviceMode' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2902","column":"22","displayLine":"2902","type":"warning"},{"key":63,"message":"warning: unused parameter 'InterruptMask' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"2964","column":"16","displayLine":"2964","type":"warning"},{"key":64,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"3013","column":"55","displayLine":"3013","type":"warning"},{"key":65,"message":"warning: unused parameter 'InterruptMask' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api.c","line":"3014","column":"17","displayLine":"3014","type":"warning"},{"key":66,"message":"warning: no previous prototype for 'VL53L0X_check_part_used' [-Wmissing-prototypes]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_strings.c","line":"45","column":"15","displayLine":"45","type":"warning"},{"key":67,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\core\\src\\vl53l0x_api_strings.c","line":"422","column":"56","displayLine":"422","type":"warning"},{"key":68,"message":"warning: unused variable 'wait_ms' [-Wunused-variable]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.c","line":"232","column":"11","displayLine":"232","type":"warning"},{"key":69,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.c","line":"92","column":"54","displayLine":"92","type":"warning"},{"key":70,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.c","line":"98","column":"56","displayLine":"98","type":"warning"},{"key":71,"message":"warning: unused parameter 'Dev' [-Wunused-parameter]","file":"h:\\git\\open_intellect\\code\\op_inte\\open_inte\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.c","line":"262","column":"48","displayLine":"262","type":"warning"}] \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/settings.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/settings.json" new file mode 100644 index 00000000..c8dc3549 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/.vscode/settings.json" @@ -0,0 +1,12 @@ +{ + "files.associations": { + "regex.h": "c", + "ctype.h": "c", + "cctype": "c", + "main.h": "c", + "vl53l0x.h": "c", + "vl53l0x_i2c_platform.h": "c", + "mycar_control.h": "c", + "clock.h": "c" + } +} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/README.md" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/README.md" new file mode 100644 index 00000000..f6818c85 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/README.md" @@ -0,0 +1,223 @@ +## 案例使用文档 + + +MCU有关 + +### 外设 + +主要使用到的外设: + +| 外设 | 功能实现 | +| :----------: | :-----------------------------------------------: | +| GPT | 电机控制 | +| 串口0 | 不定长中断接收、回车换行为结束帧 | +| IIC | IIC通讯协议实现,数据接收和发送,单字节多字节通讯 | +| IO口外部中断 | 中断计数测速 | +| 定时器0 | 1ms计数,实现定时执行对应控制程序 | + +GPT1和2分别控制两个电机,设置A点为1,B点进行控制,实现不同的占空比控制 + +IO口外部中断,分别检测两个电机的转速码盘,一个孔计数一次,用来测速 + +定时器1ms计数,用来设置定时任务,如250ms进行一次PID调速、10s进行一次速度和距离打印等 + +串口:与树莓派进行通讯,实现字符串识别和交互,接收到对应字符串时触发对应的动作。 + +IIC通讯,用于和VL53L0X进行通讯,获取测量距离。 + + + +### IO口配置 + + + +| 芯片引脚号 | 生态板对应引脚 | 初始化 | 外设 | 功能 | +| :--------: | :------------: | :------------------: | :------: | :-------------: | +| PIN47 | J2_32 | GPIO0_5_AS_GPT1_PWM | GPT1 | 右侧电机PWM控制 | +| PIN16 | J1_33 | GPIO5_2_AS_GPT2_PWM | GPT2 | 左侧电机PWM控制 | +| PIN39 | 调试版_Tx | GPIO0_3_AS_UART0_TXD | UART0_TX | 串口0写信号线 | +| PIN40 | 调试版_Rx | GPIO0_4_AS_UART0_RXD | UART0_RX | 串口0读信号线 | +| PIN28 | J2_31 | GPIO1_1_AS_GPIO1_1 | IO中断 | 右边电机测速 | +| PIN18 | J1_34 | GPIO1_4_AS_GPIO1_4 | IO中断 | 左边电机测速 | +| PIN9 | J1_38 | GPIO3_5_AS_GPIO3_5 | IO | 左电机驱动IN0 | +| PIN8 | J1_35 | GPIO3_6_AS_GPIO3_6 | IO | 左电机驱动IN1 | +| PIN2 | J1_37 | GPIO5_3_AS_GPIO5_3 | IO | 右电机驱动IN0 | +| PIN10 | J1_39 | GPIO5_1_AS_GPIO5_1 | IO | 右电机驱动IN1 | +| PIN26 | J2_26 | GPIO4_3_AS_I2C0_SDA | I2C0_SDA | IIC数据线 | +| PIN25 | J2_25 | GPIO4_2_AS_I2C0_SCL | I2C0_SCL | IIC时钟线 | +| | | | | | + + +### 工程文件结构 + +最后附上工程代码文件结构图 + +![image-20241106161837183](../README.assets/image-20241106161837183.png) + +vl53l0x是激光模块有关文件夹 + +​ core是相关计算算法核心 + +​ mine是自己配置的移植文件 + +​ IIC相关 +​ user->vl53l0x->mine->inc->vl53l0x_iic.c +​ 包含IIC通讯协议的具体实现 + +​ 自定义封装调用接口 + +​ platform是通讯环境移植配置 + +mycar是相关电机控制封装实现 + +main.c是主程序循环,串口接收处理,计时中断函数,定时任务处理,模式切换等。 + + + + +### 主程序执行流程 + +初始化: + IO口、外设时钟初始化 + 开启串口中断 + Vl53l0x激光测距初始化(IIC通讯)包含设备验证和初始化 + 定时器启动 + Vl53l0x激光测距启动 + + 主循环: + 获取距离 + 测量完毕返回结果,否则返回0; + 避障检测 + 少于一定距离,停止驱动电机 + 模式判断 + 桌面模式 + 久坐检测 + 人脸识别 + 地面模式 + 守卫模式(门口检测,入侵抓拍) + 定时任务(标志判断) + 250ms + PID调速 + 10ms + 久坐计数 + 信息打印 + 1ms + 电机和速度设定检测 + 停转动作实现 + 串口接收与识别 + 接收串口数据 + 字符串处理 + 字符匹配 + 实现对应控制和相关功能 + +此外串口发送安插在对应功能中实现。 + + + +**其他相关代码,源码中有详细注释。** + + + + + + +### 串口不定长 + +串口不定长,修改了中断函数 + +```c +unsigned char USART_RX_STA=0; //接收状态标记 0表示开始接收,1表示接收到0d, 2表示接收完毕 +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 (USART_RX_STA!=2) { + if (uartHandle->baseAddress->UART_FR.BIT.rxfe == 0x01) { /* True when the RX FIFO is empty */ + break; + } + tmp = uartHandle->baseAddress->UART_DR.reg; + if(USART_RX_STA==1)//接收到了0x0d + { + if((tmp & 0xFF)!=0x0a)tmp=0;//接收错误,重新开始 + else USART_RX_STA = 2; //接收完成了 + } + else //还没收到0X0D + { + if((tmp & 0xFF)==0x0d)USART_RX_STA = 1; + else + { + *(uartHandle->rxbuff)=(tmp & 0xFF); + uartHandle->rxbuff++; + //长度校验实现 + } + } + } + uartHandle->baseAddress->UART_ICR.reg |= 0x20050; /* Clear rxic, rtic and rxfneic */ + if (uartHandle->userCallBack.ReadItFinishCallBack != NULL && USART_RX_STA==2) { + USART_RX_STA = 0; + uartHandle->userCallBack.ReadItFinishCallBack(uartHandle); + } + } + return; +} +``` + +### 开启串口接收 + +只需调用一次,即开启对应中断。 + +```c +void UART0_InterruptTxInit(UART_Handle *uartHandle) +{ + uartHandle->rxState = UART_STATE_BUSY_RX; + uartHandle->rxbuff = readData; + 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 */ + } +} +``` + +### 串口回调函数 + +```c +/** + * 串口读中断回调函数 +*/ +void UART0ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + // DBG_PRINTF("Read Finish: %s\r\n", readData); + g_uart0.rxbuff = readData;//这很重要,将接收数组的初始地址赋给该指针 + g_uartReceiveFlag = true;//接收数据后,接收标志置为true + return; +} +``` + +### IIC采用模拟引脚 + +适配IO口配置 +见文件目录下user->vl53l0x->mine->inc->vl53l0x_iic.h + +user->vl53l0x->mine->inc->vl53l0x_iic.c +包含IIC通讯协议的具体实现 + + + +## 相关资料 + +视频链接: + +【基于Hi3061的智能语音助手】 https://www.bilibili.com/video/BV1r3DVY6EzJ/?share_source=copy_web&vd_source=f30ab208955ac16ef5352976aceafa19 + +博客链接: + +[CSDN 海思mcu体验官](https://blog.csdn.net/ns_ice/category_12775178.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12775178&sharerefer=PC&sharesource=NS_ice&sharefrom=from_link) + +源码链接: + +https://gitee.com/ns-ice/open_intellect diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/assembleFile.asm" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/assembleFile.asm" new file mode 100644 index 00000000..fee147a8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/assembleFile.asm" @@ -0,0 +1,21222 @@ + +h:\git\open_intellect\code\op_inte\open_inte\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: 378010ef jal ra,30015d0 + +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: 2e4010ef jal ra,30015b2 + +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: 7ab000ef jal ra,3001356 + 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: 01000197 auipc gp,0x1000 + 3000554: 0e418193 addi gp,gp,228 # 4000634 <__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: 9cc18293 addi t0,gp,-1588 # 4000000 + 30005a8: 01008317 auipc t1,0x1008 + 30005ac: a5830313 addi t1,t1,-1448 # 4008000 + 30005b0: 00000393 li t2,0 + +030005b4 : + 30005b4: 0072a023 sw t2,0(t0) + 30005b8: 00428293 addi t0,t0,4 + 30005bc: fe62cce3 blt t0,t1,30005b4 + +030005c0 : + 30005c0: ff000297 auipc t0,0xff000 + 30005c4: a4028293 addi t0,t0,-1472 # 2000000 + 30005c8: 00000317 auipc t1,0x0 + 30005cc: 12830313 addi t1,t1,296 # 30006f0 + 30005d0: ff000397 auipc t2,0xff000 + 30005d4: a3038393 addi t2,t2,-1488 # 2000000 + 30005d8: f0dff0ef jal ra,30004e4 + +030005dc : + 30005dc: 9cc18293 addi t0,gp,-1588 # 4000000 + 30005e0: 00000317 auipc t1,0x0 + 30005e4: 11030313 addi t1,t1,272 # 30006f0 + 30005e8: 9cc18393 addi t2,gp,-1588 # 4000000 + 30005ec: ef9ff0ef jal ra,30004e4 + +030005f0 : + 30005f0: 9ec18293 addi t0,gp,-1556 # 4000020 + 30005f4: 0000f317 auipc t1,0xf + 30005f8: f8430313 addi t1,t1,-124 # 300f578 <__data_load> + 30005fc: f1818393 addi t2,gp,-232 # 400054c + 3000600: ee5ff0ef jal ra,30004e4 + +03000604 : + 3000604: 000012b7 lui t0,0x1 + 3000608: b0028293 addi t0,t0,-1280 # b00 + 300060c: 3b029073 csrw pmpaddr0,t0 + 3000610: 004002b7 lui t0,0x400 + 3000614: 40028293 addi t0,t0,1024 # 400400 + 3000618: 3b129073 csrw pmpaddr1,t0 + 300061c: 008002b7 lui t0,0x800 + 3000620: 3b229073 csrw pmpaddr2,t0 + 3000624: 008022b7 lui t0,0x802 + 3000628: 3b329073 csrw pmpaddr3,t0 + 300062c: 00c002b7 lui t0,0xc00 + 3000630: 3b429073 csrw pmpaddr4,t0 + 3000634: 010002b7 lui t0,0x1000 + 3000638: 3b529073 csrw pmpaddr5,t0 + 300063c: 010022b7 lui t0,0x1002 + 3000640: 3b629073 csrw pmpaddr6,t0 + 3000644: 070002b7 lui t0,0x7000 + 3000648: 40028293 addi t0,t0,1024 # 7000400 + 300064c: 3b729073 csrw pmpaddr7,t0 + 3000650: f33332b7 lui t0,0xf3333 + 3000654: 33328293 addi t0,t0,819 # f3333333 + 3000658: 7d829073 csrw 0x7d8,t0 + 300065c: 8d8892b7 lui t0,0x8d889 + 3000660: d8b28293 addi t0,t0,-629 # 8d888d8b + 3000664: 3a029073 csrw pmpcfg0,t0 + 3000668: 8b8b92b7 lui t0,0x8b8b9 + 300066c: d8828293 addi t0,t0,-632 # 8b8b8d88 + 3000670: 3a129073 csrw pmpcfg1,t0 + 3000674: 7c005073 csrwi 0x7c0,0 + 3000678: 0ff0000f fence + 300067c: 7c105073 csrwi 0x7c1,0 + 3000680: 0ff0000f fence + 3000684: 000022b7 lui t0,0x2 + 3000688: 00828293 addi t0,t0,8 # 2008 + 300068c: 3002a073 csrs mstatus,t0 + 3000690: 02000293 li t0,32 + 3000694: 3012a073 csrs misa,t0 + 3000698: 111112b7 lui t0,0x11111 + 300069c: 11128293 addi t0,t0,273 # 11111111 + 30006a0: bc029073 csrw 0xbc0,t0 + 30006a4: bc129073 csrw 0xbc1,t0 + 30006a8: bc229073 csrw 0xbc2,t0 + 30006ac: bc329073 csrw 0xbc3,t0 + 30006b0: bc429073 csrw 0xbc4,t0 + 30006b4: bc529073 csrw 0xbc5,t0 + 30006b8: bc629073 csrw 0xbc6,t0 + 30006bc: bc729073 csrw 0xbc7,t0 + 30006c0: bc829073 csrw 0xbc8,t0 + 30006c4: bc929073 csrw 0xbc9,t0 + 30006c8: bca29073 csrw 0xbca,t0 + 30006cc: bcb29073 csrw 0xbcb,t0 + 30006d0: bcc29073 csrw 0xbcc,t0 + 30006d4: bcd29073 csrw 0xbcd,t0 + 30006d8: bce29073 csrw 0xbce,t0 + 30006dc: bcf29073 csrw 0xbcf,t0 + 30006e0: 00000073 ecall + 30006e4: 014000ef jal ra,30006f8 + 30006e8: 1b3060ef jal ra,300709a

+ +030006ec : + 30006ec: 0000006f j 30006ec + +Disassembly of section .text: + +030006f0 : + 30006f0: 1141 addi sp,sp,-16 + 30006f2: c622 sw s0,12(sp) + 30006f4: 0800 addi s0,sp,16 + 30006f6: a001 j 30006f6 + +030006f8 : + 30006f8: 1101 addi sp,sp,-32 + 30006fa: ce06 sw ra,28(sp) + 30006fc: cc22 sw s0,24(sp) + 30006fe: 1000 addi s0,sp,32 + 3000700: fec40793 addi a5,s0,-20 + 3000704: 853e mv a0,a5 + 3000706: 4ab060ef jal ra,30073b0 + 300070a: 87aa mv a5,a0 + 300070c: c391 beqz a5,3000710 + 300070e: 37cd jal ra,30006f0 + 3000710: fec42783 lw a5,-20(s0) + 3000714: 853e mv a0,a5 + 3000716: 78e000ef jal ra,3000ea4 + 300071a: 04f000ef jal ra,3000f68 + 300071e: fec42783 lw a5,-20(s0) + 3000722: 853e mv a0,a5 + 3000724: 25a1 jal ra,3000d6c + 3000726: 46d000ef jal ra,3001392 + 300072a: 23d5 jal ra,3000d0e + 300072c: 2b41 jal ra,3000cbc + 300072e: 0001 nop + 3000730: 40f2 lw ra,28(sp) + 3000732: 4462 lw s0,24(sp) + 3000734: 6105 addi sp,sp,32 + 3000736: 8082 ret + +03000738 : + 3000738: 1101 addi sp,sp,-32 + 300073a: ce22 sw s0,28(sp) + 300073c: 1000 addi s0,sp,32 + 300073e: fea42623 sw a0,-20(s0) + 3000742: fec42783 lw a5,-20(s0) + 3000746: d017f753 fcvt.s.wu fa4,a5 + 300074a: 0300f7b7 lui a5,0x300f + 300074e: de47a787 flw fa5,-540(a5) # 300ede4 <__rodata_start> + 3000752: 18f777d3 fdiv.s fa5,fa4,fa5 + 3000756: 9ef1a627 fsw fa5,-1556(gp) # 4000020 + 300075a: 0001 nop + 300075c: 4472 lw s0,28(sp) + 300075e: 6105 addi sp,sp,32 + 3000760: 8082 ret + +03000762 : + 3000762: 7179 addi sp,sp,-48 + 3000764: d606 sw ra,44(sp) + 3000766: d422 sw s0,40(sp) + 3000768: 1800 addi s0,sp,48 + 300076a: fe040793 addi a5,s0,-32 + 300076e: 863e mv a2,a5 + 3000770: 4591 li a1,4 + 3000772: 4501 li a0,0 + 3000774: 2391 jal ra,3000cb8 + 3000776: fd040793 addi a5,s0,-48 + 300077a: 863e mv a2,a5 + 300077c: 4589 li a1,2 + 300077e: 4501 li a0,0 + 3000780: 2b25 jal ra,3000cb8 + 3000782: fe042703 lw a4,-32(s0) + 3000786: 5aa597b7 lui a5,0x5aa59 + 300078a: 66978793 addi a5,a5,1641 # 5aa59669 + 300078e: 00f71763 bne a4,a5,300079c + 3000792: fd042703 lw a4,-48(s0) + 3000796: 57fd li a5,-1 + 3000798: 00f71463 bne a4,a5,30007a0 + 300079c: 4781 li a5,0 + 300079e: a011 j 30007a2 + 30007a0: 4785 li a5,1 + 30007a2: 853e mv a0,a5 + 30007a4: 50b2 lw ra,44(sp) + 30007a6: 5422 lw s0,40(sp) + 30007a8: 6145 addi sp,sp,48 + 30007aa: 8082 ret + +030007ac : + 30007ac: 711d addi sp,sp,-96 + 30007ae: ce86 sw ra,92(sp) + 30007b0: cca2 sw s0,88(sp) + 30007b2: 1080 addi s0,sp,96 + 30007b4: fdc40793 addi a5,s0,-36 + 30007b8: 863e mv a2,a5 + 30007ba: 45d1 li a1,20 + 30007bc: 4501 li a0,0 + 30007be: 29ed jal ra,3000cb8 + 30007c0: 18100737 lui a4,0x18100 + 30007c4: fdc42783 lw a5,-36(s0) + 30007c8: 83c1 srli a5,a5,0x10 + 30007ca: 9bfd andi a5,a5,-1 + 30007cc: 0ff7f693 andi a3,a5,255 + 30007d0: 433c lw a5,64(a4) + 30007d2: 0ff6f693 andi a3,a3,255 + 30007d6: f007f793 andi a5,a5,-256 + 30007da: 8fd5 or a5,a5,a3 + 30007dc: c33c sw a5,64(a4) + 30007de: 18100737 lui a4,0x18100 + 30007e2: fdc42783 lw a5,-36(s0) + 30007e6: 83a1 srli a5,a5,0x8 + 30007e8: 9bfd andi a5,a5,-1 + 30007ea: 0ff7f693 andi a3,a5,255 + 30007ee: 433c lw a5,64(a4) + 30007f0: 0ff6f693 andi a3,a3,255 + 30007f4: 06a2 slli a3,a3,0x8 + 30007f6: 7641 lui a2,0xffff0 + 30007f8: 0ff60613 addi a2,a2,255 # ffff00ff + 30007fc: 8ff1 and a5,a5,a2 + 30007fe: 8fd5 or a5,a5,a3 + 3000800: c33c sw a5,64(a4) + 3000802: 18100737 lui a4,0x18100 + 3000806: fdc42783 lw a5,-36(s0) + 300080a: 0ff7f693 andi a3,a5,255 + 300080e: 433c lw a5,64(a4) + 3000810: 0ff6f693 andi a3,a3,255 + 3000814: 06c2 slli a3,a3,0x10 + 3000816: ff010637 lui a2,0xff010 + 300081a: 167d addi a2,a2,-1 # ff00ffff + 300081c: 8ff1 and a5,a5,a2 + 300081e: 8fd5 or a5,a5,a3 + 3000820: c33c sw a5,64(a4) + 3000822: fe042783 lw a5,-32(s0) + 3000826: 83c1 srli a5,a5,0x10 + 3000828: 9bfd andi a5,a5,-1 + 300082a: 9f81 uxtb a5 + 300082c: fef42623 sw a5,-20(s0) + 3000830: fe042783 lw a5,-32(s0) + 3000834: 83a1 srli a5,a5,0x8 + 3000836: 9bfd andi a5,a5,-1 + 3000838: 9f81 uxtb a5 + 300083a: 07a2 slli a5,a5,0x8 + 300083c: 873e mv a4,a5 + 300083e: fec42783 lw a5,-20(s0) + 3000842: 8fd9 or a5,a5,a4 + 3000844: fef42623 sw a5,-20(s0) + 3000848: fe042783 lw a5,-32(s0) + 300084c: 9f81 uxtb a5 + 300084e: 07c2 slli a5,a5,0x10 + 3000850: 873e mv a4,a5 + 3000852: fec42783 lw a5,-20(s0) + 3000856: 8fd9 or a5,a5,a4 + 3000858: fef42623 sw a5,-20(s0) + 300085c: fdc42783 lw a5,-36(s0) + 3000860: 83e1 srli a5,a5,0x18 + 3000862: 9f81 uxtb a5 + 3000864: 07e2 slli a5,a5,0x18 + 3000866: 873e mv a4,a5 + 3000868: fec42783 lw a5,-20(s0) + 300086c: 8fd9 or a5,a5,a4 + 300086e: fef42623 sw a5,-20(s0) + 3000872: 181007b7 lui a5,0x18100 + 3000876: fec42703 lw a4,-20(s0) + 300087a: c3f8 sw a4,68(a5) + 300087c: fcc40793 addi a5,s0,-52 + 3000880: 863e mv a2,a5 + 3000882: 45d5 li a1,21 + 3000884: 4501 li a0,0 + 3000886: 290d jal ra,3000cb8 + 3000888: 18000737 lui a4,0x18000 + 300088c: fd042783 lw a5,-48(s0) + 3000890: 86be mv a3,a5 + 3000892: 6789 lui a5,0x2 + 3000894: 17fd addi a5,a5,-1 # 1fff + 3000896: 8ff5 and a5,a5,a3 + 3000898: 01079613 slli a2,a5,0x10 + 300089c: 8241 srli a2,a2,0x10 + 300089e: 6785 lui a5,0x1 + 30008a0: 973e add a4,a4,a5 + 30008a2: 80872783 lw a5,-2040(a4) # 17fff808 + 30008a6: 6689 lui a3,0x2 + 30008a8: 16fd addi a3,a3,-1 # 1fff + 30008aa: 8ef1 and a3,a3,a2 + 30008ac: 06c2 slli a3,a3,0x10 + 30008ae: e0010637 lui a2,0xe0010 + 30008b2: 167d addi a2,a2,-1 # e000ffff + 30008b4: 8ff1 and a5,a5,a2 + 30008b6: 8fd5 or a5,a5,a3 + 30008b8: 80f72423 sw a5,-2040(a4) + 30008bc: 18000737 lui a4,0x18000 + 30008c0: fd042783 lw a5,-48(s0) + 30008c4: 83c1 srli a5,a5,0x10 + 30008c6: 86be mv a3,a5 + 30008c8: 6785 lui a5,0x1 + 30008ca: 17fd addi a5,a5,-1 # fff + 30008cc: 8ff5 and a5,a5,a3 + 30008ce: 01079613 slli a2,a5,0x10 + 30008d2: 8241 srli a2,a2,0x10 + 30008d4: 6785 lui a5,0x1 + 30008d6: 973e add a4,a4,a5 + 30008d8: 80872783 lw a5,-2040(a4) # 17fff808 + 30008dc: 6685 lui a3,0x1 + 30008de: 16fd addi a3,a3,-1 # fff + 30008e0: 8ef1 and a3,a3,a2 + 30008e2: 767d lui a2,0xfffff + 30008e4: 8ff1 and a5,a5,a2 + 30008e6: 8fd5 or a5,a5,a3 + 30008e8: 80f72423 sw a5,-2040(a4) + 30008ec: fe042783 lw a5,-32(s0) + 30008f0: 83e1 srli a5,a5,0x18 + 30008f2: 0ff7f713 andi a4,a5,255 + 30008f6: 185007b7 lui a5,0x18500 + 30008fa: cb98 sw a4,16(a5) + 30008fc: 18000737 lui a4,0x18000 + 3000900: fd442783 lw a5,-44(s0) + 3000904: 86be mv a3,a5 + 3000906: 6785 lui a5,0x1 + 3000908: 17fd addi a5,a5,-1 # fff + 300090a: 8ff5 and a5,a5,a3 + 300090c: 01079613 slli a2,a5,0x10 + 3000910: 8241 srli a2,a2,0x10 + 3000912: 6785 lui a5,0x1 + 3000914: 973e add a4,a4,a5 + 3000916: 80472783 lw a5,-2044(a4) # 17fff804 + 300091a: 6685 lui a3,0x1 + 300091c: 16fd addi a3,a3,-1 # fff + 300091e: 8ef1 and a3,a3,a2 + 3000920: 767d lui a2,0xfffff + 3000922: 8ff1 and a5,a5,a2 + 3000924: 8fd5 or a5,a5,a3 + 3000926: 80f72223 sw a5,-2044(a4) + 300092a: fd842783 lw a5,-40(s0) + 300092e: 83a5 srli a5,a5,0x9 + 3000930: 853e mv a0,a5 + 3000932: 3519 jal ra,3000738 + 3000934: 18200737 lui a4,0x18200 + 3000938: fcc42783 lw a5,-52(s0) + 300093c: 1ff7f793 andi a5,a5,511 + 3000940: 01079693 slli a3,a5,0x10 + 3000944: 82c1 srli a3,a3,0x10 + 3000946: 531c lw a5,32(a4) + 3000948: 1ff6f693 andi a3,a3,511 + 300094c: e007f793 andi a5,a5,-512 + 3000950: 8fd5 or a5,a5,a3 + 3000952: d31c sw a5,32(a4) + 3000954: 18201737 lui a4,0x18201 + 3000958: fcc42783 lw a5,-52(s0) + 300095c: 83c1 srli a5,a5,0x10 + 300095e: 1ff7f793 andi a5,a5,511 + 3000962: 01079693 slli a3,a5,0x10 + 3000966: 82c1 srli a3,a3,0x10 + 3000968: 531c lw a5,32(a4) + 300096a: 1ff6f693 andi a3,a3,511 + 300096e: e007f793 andi a5,a5,-512 + 3000972: 8fd5 or a5,a5,a3 + 3000974: d31c sw a5,32(a4) + 3000976: fbc40793 addi a5,s0,-68 + 300097a: 863e mv a2,a5 + 300097c: 45d9 li a1,22 + 300097e: 4501 li a0,0 + 3000980: 256d jal ra,300102a + 3000982: 18000737 lui a4,0x18000 + 3000986: fbc42783 lw a5,-68(s0) + 300098a: 86be mv a3,a5 + 300098c: 6789 lui a5,0x2 + 300098e: 17fd addi a5,a5,-1 # 1fff + 3000990: 8ff5 and a5,a5,a3 + 3000992: 01079613 slli a2,a5,0x10 + 3000996: 8241 srli a2,a2,0x10 + 3000998: 6785 lui a5,0x1 + 300099a: 973e add a4,a4,a5 + 300099c: 81472783 lw a5,-2028(a4) # 17fff814 + 30009a0: 6689 lui a3,0x2 + 30009a2: 16fd addi a3,a3,-1 # 1fff + 30009a4: 8ef1 and a3,a3,a2 + 30009a6: 06c2 slli a3,a3,0x10 + 30009a8: e0010637 lui a2,0xe0010 + 30009ac: 167d addi a2,a2,-1 # e000ffff + 30009ae: 8ff1 and a5,a5,a2 + 30009b0: 8fd5 or a5,a5,a3 + 30009b2: 80f72a23 sw a5,-2028(a4) + 30009b6: 18000737 lui a4,0x18000 + 30009ba: fbc42783 lw a5,-68(s0) + 30009be: 83c1 srli a5,a5,0x10 + 30009c0: 86be mv a3,a5 + 30009c2: 6785 lui a5,0x1 + 30009c4: 17fd addi a5,a5,-1 # fff + 30009c6: 8ff5 and a5,a5,a3 + 30009c8: 01079613 slli a2,a5,0x10 + 30009cc: 8241 srli a2,a2,0x10 + 30009ce: 6785 lui a5,0x1 + 30009d0: 973e add a4,a4,a5 + 30009d2: 81472783 lw a5,-2028(a4) # 17fff814 + 30009d6: 6685 lui a3,0x1 + 30009d8: 16fd addi a3,a3,-1 # fff + 30009da: 8ef1 and a3,a3,a2 + 30009dc: 767d lui a2,0xfffff + 30009de: 8ff1 and a5,a5,a2 + 30009e0: 8fd5 or a5,a5,a3 + 30009e2: 80f72a23 sw a5,-2028(a4) + 30009e6: 18000737 lui a4,0x18000 + 30009ea: fc042783 lw a5,-64(s0) + 30009ee: 86be mv a3,a5 + 30009f0: 6789 lui a5,0x2 + 30009f2: 17fd addi a5,a5,-1 # 1fff + 30009f4: 8ff5 and a5,a5,a3 + 30009f6: 01079613 slli a2,a5,0x10 + 30009fa: 8241 srli a2,a2,0x10 + 30009fc: 6785 lui a5,0x1 + 30009fe: 973e add a4,a4,a5 + 3000a00: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a04: 6689 lui a3,0x2 + 3000a06: 16fd addi a3,a3,-1 # 1fff + 3000a08: 8ef1 and a3,a3,a2 + 3000a0a: 06c2 slli a3,a3,0x10 + 3000a0c: e0010637 lui a2,0xe0010 + 3000a10: 167d addi a2,a2,-1 # e000ffff + 3000a12: 8ff1 and a5,a5,a2 + 3000a14: 8fd5 or a5,a5,a3 + 3000a16: 80f72c23 sw a5,-2024(a4) + 3000a1a: 18000737 lui a4,0x18000 + 3000a1e: fc042783 lw a5,-64(s0) + 3000a22: 83c1 srli a5,a5,0x10 + 3000a24: 86be mv a3,a5 + 3000a26: 6785 lui a5,0x1 + 3000a28: 17fd addi a5,a5,-1 # fff + 3000a2a: 8ff5 and a5,a5,a3 + 3000a2c: 01079613 slli a2,a5,0x10 + 3000a30: 8241 srli a2,a2,0x10 + 3000a32: 6785 lui a5,0x1 + 3000a34: 973e add a4,a4,a5 + 3000a36: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a3a: 6685 lui a3,0x1 + 3000a3c: 16fd addi a3,a3,-1 # fff + 3000a3e: 8ef1 and a3,a3,a2 + 3000a40: 767d lui a2,0xfffff + 3000a42: 8ff1 and a5,a5,a2 + 3000a44: 8fd5 or a5,a5,a3 + 3000a46: 80f72c23 sw a5,-2024(a4) + 3000a4a: 18000737 lui a4,0x18000 + 3000a4e: fc442783 lw a5,-60(s0) + 3000a52: 86be mv a3,a5 + 3000a54: 6789 lui a5,0x2 + 3000a56: 17fd addi a5,a5,-1 # 1fff + 3000a58: 8ff5 and a5,a5,a3 + 3000a5a: 01079613 slli a2,a5,0x10 + 3000a5e: 8241 srli a2,a2,0x10 + 3000a60: 6785 lui a5,0x1 + 3000a62: 973e add a4,a4,a5 + 3000a64: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a68: 6689 lui a3,0x2 + 3000a6a: 16fd addi a3,a3,-1 # 1fff + 3000a6c: 8ef1 and a3,a3,a2 + 3000a6e: 06c2 slli a3,a3,0x10 + 3000a70: e0010637 lui a2,0xe0010 + 3000a74: 167d addi a2,a2,-1 # e000ffff + 3000a76: 8ff1 and a5,a5,a2 + 3000a78: 8fd5 or a5,a5,a3 + 3000a7a: 80f72e23 sw a5,-2020(a4) + 3000a7e: 18000737 lui a4,0x18000 + 3000a82: fc442783 lw a5,-60(s0) + 3000a86: 83c1 srli a5,a5,0x10 + 3000a88: 86be mv a3,a5 + 3000a8a: 6785 lui a5,0x1 + 3000a8c: 17fd addi a5,a5,-1 # fff + 3000a8e: 8ff5 and a5,a5,a3 + 3000a90: 01079613 slli a2,a5,0x10 + 3000a94: 8241 srli a2,a2,0x10 + 3000a96: 6785 lui a5,0x1 + 3000a98: 973e add a4,a4,a5 + 3000a9a: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a9e: 6685 lui a3,0x1 + 3000aa0: 16fd addi a3,a3,-1 # fff + 3000aa2: 8ef1 and a3,a3,a2 + 3000aa4: 767d lui a2,0xfffff + 3000aa6: 8ff1 and a5,a5,a2 + 3000aa8: 8fd5 or a5,a5,a3 + 3000aaa: 80f72e23 sw a5,-2020(a4) + 3000aae: 18000737 lui a4,0x18000 + 3000ab2: fc842783 lw a5,-56(s0) + 3000ab6: 86be mv a3,a5 + 3000ab8: 6789 lui a5,0x2 + 3000aba: 17fd addi a5,a5,-1 # 1fff + 3000abc: 8ff5 and a5,a5,a3 + 3000abe: 01079613 slli a2,a5,0x10 + 3000ac2: 8241 srli a2,a2,0x10 + 3000ac4: 6785 lui a5,0x1 + 3000ac6: 973e add a4,a4,a5 + 3000ac8: 82072783 lw a5,-2016(a4) # 17fff820 + 3000acc: 6689 lui a3,0x2 + 3000ace: 16fd addi a3,a3,-1 # 1fff + 3000ad0: 8ef1 and a3,a3,a2 + 3000ad2: 06c2 slli a3,a3,0x10 + 3000ad4: e0010637 lui a2,0xe0010 + 3000ad8: 167d addi a2,a2,-1 # e000ffff + 3000ada: 8ff1 and a5,a5,a2 + 3000adc: 8fd5 or a5,a5,a3 + 3000ade: 82f72023 sw a5,-2016(a4) + 3000ae2: 18000737 lui a4,0x18000 + 3000ae6: fc842783 lw a5,-56(s0) + 3000aea: 83c1 srli a5,a5,0x10 + 3000aec: 86be mv a3,a5 + 3000aee: 6785 lui a5,0x1 + 3000af0: 17fd addi a5,a5,-1 # fff + 3000af2: 8ff5 and a5,a5,a3 + 3000af4: 01079613 slli a2,a5,0x10 + 3000af8: 8241 srli a2,a2,0x10 + 3000afa: 6785 lui a5,0x1 + 3000afc: 973e add a4,a4,a5 + 3000afe: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b02: 6685 lui a3,0x1 + 3000b04: 16fd addi a3,a3,-1 # fff + 3000b06: 8ef1 and a3,a3,a2 + 3000b08: 767d lui a2,0xfffff + 3000b0a: 8ff1 and a5,a5,a2 + 3000b0c: 8fd5 or a5,a5,a3 + 3000b0e: 82f72023 sw a5,-2016(a4) + 3000b12: fac40793 addi a5,s0,-84 + 3000b16: 863e mv a2,a5 + 3000b18: 45dd li a1,23 + 3000b1a: 4501 li a0,0 + 3000b1c: 2339 jal ra,300102a + 3000b1e: 18000737 lui a4,0x18000 + 3000b22: fac42783 lw a5,-84(s0) + 3000b26: 86be mv a3,a5 + 3000b28: 6789 lui a5,0x2 + 3000b2a: 17fd addi a5,a5,-1 # 1fff + 3000b2c: 8ff5 and a5,a5,a3 + 3000b2e: 01079613 slli a2,a5,0x10 + 3000b32: 8241 srli a2,a2,0x10 + 3000b34: 6785 lui a5,0x1 + 3000b36: 973e add a4,a4,a5 + 3000b38: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b3c: 6689 lui a3,0x2 + 3000b3e: 16fd addi a3,a3,-1 # 1fff + 3000b40: 8ef1 and a3,a3,a2 + 3000b42: 06c2 slli a3,a3,0x10 + 3000b44: e0010637 lui a2,0xe0010 + 3000b48: 167d addi a2,a2,-1 # e000ffff + 3000b4a: 8ff1 and a5,a5,a2 + 3000b4c: 8fd5 or a5,a5,a3 + 3000b4e: 82f72223 sw a5,-2012(a4) + 3000b52: 18000737 lui a4,0x18000 + 3000b56: fac42783 lw a5,-84(s0) + 3000b5a: 83c1 srli a5,a5,0x10 + 3000b5c: 86be mv a3,a5 + 3000b5e: 6785 lui a5,0x1 + 3000b60: 17fd addi a5,a5,-1 # fff + 3000b62: 8ff5 and a5,a5,a3 + 3000b64: 01079613 slli a2,a5,0x10 + 3000b68: 8241 srli a2,a2,0x10 + 3000b6a: 6785 lui a5,0x1 + 3000b6c: 973e add a4,a4,a5 + 3000b6e: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b72: 6685 lui a3,0x1 + 3000b74: 16fd addi a3,a3,-1 # fff + 3000b76: 8ef1 and a3,a3,a2 + 3000b78: 767d lui a2,0xfffff + 3000b7a: 8ff1 and a5,a5,a2 + 3000b7c: 8fd5 or a5,a5,a3 + 3000b7e: 82f72223 sw a5,-2012(a4) + 3000b82: 18000737 lui a4,0x18000 + 3000b86: fb042783 lw a5,-80(s0) + 3000b8a: 86be mv a3,a5 + 3000b8c: 6789 lui a5,0x2 + 3000b8e: 17fd addi a5,a5,-1 # 1fff + 3000b90: 8ff5 and a5,a5,a3 + 3000b92: 01079613 slli a2,a5,0x10 + 3000b96: 8241 srli a2,a2,0x10 + 3000b98: 6785 lui a5,0x1 + 3000b9a: 973e add a4,a4,a5 + 3000b9c: 82872783 lw a5,-2008(a4) # 17fff828 + 3000ba0: 6689 lui a3,0x2 + 3000ba2: 16fd addi a3,a3,-1 # 1fff + 3000ba4: 8ef1 and a3,a3,a2 + 3000ba6: 06c2 slli a3,a3,0x10 + 3000ba8: e0010637 lui a2,0xe0010 + 3000bac: 167d addi a2,a2,-1 # e000ffff + 3000bae: 8ff1 and a5,a5,a2 + 3000bb0: 8fd5 or a5,a5,a3 + 3000bb2: 82f72423 sw a5,-2008(a4) + 3000bb6: 18000737 lui a4,0x18000 + 3000bba: fb042783 lw a5,-80(s0) + 3000bbe: 83c1 srli a5,a5,0x10 + 3000bc0: 86be mv a3,a5 + 3000bc2: 6785 lui a5,0x1 + 3000bc4: 17fd addi a5,a5,-1 # fff + 3000bc6: 8ff5 and a5,a5,a3 + 3000bc8: 01079613 slli a2,a5,0x10 + 3000bcc: 8241 srli a2,a2,0x10 + 3000bce: 6785 lui a5,0x1 + 3000bd0: 973e add a4,a4,a5 + 3000bd2: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bd6: 6685 lui a3,0x1 + 3000bd8: 16fd addi a3,a3,-1 # fff + 3000bda: 8ef1 and a3,a3,a2 + 3000bdc: 767d lui a2,0xfffff + 3000bde: 8ff1 and a5,a5,a2 + 3000be0: 8fd5 or a5,a5,a3 + 3000be2: 82f72423 sw a5,-2008(a4) + 3000be6: 18000737 lui a4,0x18000 + 3000bea: fb442783 lw a5,-76(s0) + 3000bee: 86be mv a3,a5 + 3000bf0: 6789 lui a5,0x2 + 3000bf2: 17fd addi a5,a5,-1 # 1fff + 3000bf4: 8ff5 and a5,a5,a3 + 3000bf6: 01079613 slli a2,a5,0x10 + 3000bfa: 8241 srli a2,a2,0x10 + 3000bfc: 6785 lui a5,0x1 + 3000bfe: 973e add a4,a4,a5 + 3000c00: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c04: 6689 lui a3,0x2 + 3000c06: 16fd addi a3,a3,-1 # 1fff + 3000c08: 8ef1 and a3,a3,a2 + 3000c0a: 06c2 slli a3,a3,0x10 + 3000c0c: e0010637 lui a2,0xe0010 + 3000c10: 167d addi a2,a2,-1 # e000ffff + 3000c12: 8ff1 and a5,a5,a2 + 3000c14: 8fd5 or a5,a5,a3 + 3000c16: 82f72623 sw a5,-2004(a4) + 3000c1a: 18000737 lui a4,0x18000 + 3000c1e: fb442783 lw a5,-76(s0) + 3000c22: 83c1 srli a5,a5,0x10 + 3000c24: 86be mv a3,a5 + 3000c26: 6785 lui a5,0x1 + 3000c28: 17fd addi a5,a5,-1 # fff + 3000c2a: 8ff5 and a5,a5,a3 + 3000c2c: 01079613 slli a2,a5,0x10 + 3000c30: 8241 srli a2,a2,0x10 + 3000c32: 6785 lui a5,0x1 + 3000c34: 973e add a4,a4,a5 + 3000c36: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c3a: 6685 lui a3,0x1 + 3000c3c: 16fd addi a3,a3,-1 # fff + 3000c3e: 8ef1 and a3,a3,a2 + 3000c40: 767d lui a2,0xfffff + 3000c42: 8ff1 and a5,a5,a2 + 3000c44: 8fd5 or a5,a5,a3 + 3000c46: 82f72623 sw a5,-2004(a4) + 3000c4a: 18000737 lui a4,0x18000 + 3000c4e: fb842783 lw a5,-72(s0) + 3000c52: 86be mv a3,a5 + 3000c54: 6789 lui a5,0x2 + 3000c56: 17fd addi a5,a5,-1 # 1fff + 3000c58: 8ff5 and a5,a5,a3 + 3000c5a: 01079613 slli a2,a5,0x10 + 3000c5e: 8241 srli a2,a2,0x10 + 3000c60: 6785 lui a5,0x1 + 3000c62: 973e add a4,a4,a5 + 3000c64: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c68: 6689 lui a3,0x2 + 3000c6a: 16fd addi a3,a3,-1 # 1fff + 3000c6c: 8ef1 and a3,a3,a2 + 3000c6e: 06c2 slli a3,a3,0x10 + 3000c70: e0010637 lui a2,0xe0010 + 3000c74: 167d addi a2,a2,-1 # e000ffff + 3000c76: 8ff1 and a5,a5,a2 + 3000c78: 8fd5 or a5,a5,a3 + 3000c7a: 82f72823 sw a5,-2000(a4) + 3000c7e: 18000737 lui a4,0x18000 + 3000c82: fb842783 lw a5,-72(s0) + 3000c86: 83c1 srli a5,a5,0x10 + 3000c88: 86be mv a3,a5 + 3000c8a: 6785 lui a5,0x1 + 3000c8c: 17fd addi a5,a5,-1 # fff + 3000c8e: 8ff5 and a5,a5,a3 + 3000c90: 01079613 slli a2,a5,0x10 + 3000c94: 8241 srli a2,a2,0x10 + 3000c96: 6785 lui a5,0x1 + 3000c98: 973e add a4,a4,a5 + 3000c9a: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c9e: 6685 lui a3,0x1 + 3000ca0: 16fd addi a3,a3,-1 # fff + 3000ca2: 8ef1 and a3,a3,a2 + 3000ca4: 767d lui a2,0xfffff + 3000ca6: 8ff1 and a5,a5,a2 + 3000ca8: 8fd5 or a5,a5,a3 + 3000caa: 82f72823 sw a5,-2000(a4) + 3000cae: 0001 nop + 3000cb0: 40f6 lw ra,92(sp) + 3000cb2: 4466 lw s0,88(sp) + 3000cb4: 6125 addi sp,sp,96 + 3000cb6: 8082 ret + +03000cb8 : + 3000cb8: 3720006f j 300102a + +03000cbc : + 3000cbc: 1141 addi sp,sp,-16 + 3000cbe: c606 sw ra,12(sp) + 3000cc0: c422 sw s0,8(sp) + 3000cc2: 0800 addi s0,sp,16 + 3000cc4: 3c79 jal ra,3000762 + 3000cc6: 87aa mv a5,a0 + 3000cc8: 0017c793 xori a5,a5,1 + 3000ccc: 9f81 uxtb a5 + 3000cce: eb9d bnez a5,3000d04 + 3000cd0: 4585 li a1,1 + 3000cd2: 18000537 lui a0,0x18000 + 3000cd6: 2849 jal ra,3000d68 + 3000cd8: 4585 li a1,1 + 3000cda: 18200537 lui a0,0x18200 + 3000cde: 2069 jal ra,3000d68 + 3000ce0: 4585 li a1,1 + 3000ce2: 18201537 lui a0,0x18201 + 3000ce6: 2049 jal ra,3000d68 + 3000ce8: 34d1 jal ra,30007ac + 3000cea: 4581 li a1,0 + 3000cec: 18000537 lui a0,0x18000 + 3000cf0: 28a5 jal ra,3000d68 + 3000cf2: 4581 li a1,0 + 3000cf4: 18200537 lui a0,0x18200 + 3000cf8: 2885 jal ra,3000d68 + 3000cfa: 4581 li a1,0 + 3000cfc: 18201537 lui a0,0x18201 + 3000d00: 20a5 jal ra,3000d68 + 3000d02: a011 j 3000d06 + 3000d04: 0001 nop + 3000d06: 40b2 lw ra,12(sp) + 3000d08: 4422 lw s0,8(sp) + 3000d0a: 0141 addi sp,sp,16 + 3000d0c: 8082 ret + +03000d0e : + 3000d0e: 1141 addi sp,sp,-16 + 3000d10: c606 sw ra,12(sp) + 3000d12: c422 sw s0,8(sp) + 3000d14: 0800 addi s0,sp,16 + 3000d16: 4585 li a1,1 + 3000d18: 18100537 lui a0,0x18100 + 3000d1c: 20b1 jal ra,3000d68 + 3000d1e: 18100737 lui a4,0x18100 + 3000d22: 531c lw a5,32(a4) + 3000d24: 66c1 lui a3,0x10 + 3000d26: 8fd5 or a5,a5,a3 + 3000d28: d31c sw a5,32(a4) + 3000d2a: 18100737 lui a4,0x18100 + 3000d2e: 431c lw a5,0(a4) + 3000d30: 0017e793 ori a5,a5,1 + 3000d34: c31c sw a5,0(a4) + 3000d36: 000f47b7 lui a5,0xf4 + 3000d3a: 24078593 addi a1,a5,576 # f4240 + 3000d3e: 0c800513 li a0,200 + 3000d42: 234d jal ra,30012e4 + 3000d44: 18100737 lui a4,0x18100 + 3000d48: 531c lw a5,32(a4) + 3000d4a: 0017e793 ori a5,a5,1 + 3000d4e: d31c sw a5,32(a4) + 3000d50: 000f47b7 lui a5,0xf4 + 3000d54: 24078593 addi a1,a5,576 # f4240 + 3000d58: 02800513 li a0,40 + 3000d5c: 2361 jal ra,30012e4 + 3000d5e: 0001 nop + 3000d60: 40b2 lw ra,12(sp) + 3000d62: 4422 lw s0,8(sp) + 3000d64: 0141 addi sp,sp,16 + 3000d66: 8082 ret + +03000d68 : + 3000d68: 09d0106f j 3002604 + +03000d6c : + 3000d6c: 715d addi sp,sp,-80 + 3000d6e: c686 sw ra,76(sp) + 3000d70: c4a2 sw s0,72(sp) + 3000d72: 0880 addi s0,sp,80 + 3000d74: faa42e23 sw a0,-68(s0) + 3000d78: 100007b7 lui a5,0x10000 + 3000d7c: fcf42423 sw a5,-56(s0) + 3000d80: fbc42783 lw a5,-68(s0) + 3000d84: fef42023 sw a5,-32(s0) + 3000d88: fe042703 lw a4,-32(s0) + 3000d8c: 4785 li a5,1 + 3000d8e: 00f71663 bne a4,a5,3000d9a + 3000d92: 3e800593 li a1,1000 + 3000d96: 4529 li a0,10 + 3000d98: 23b1 jal ra,30012e4 + 3000d9a: fc840793 addi a5,s0,-56 + 3000d9e: 853e mv a0,a5 + 3000da0: 56e010ef jal ra,300230e + 3000da4: 0001 nop + 3000da6: 40b6 lw ra,76(sp) + 3000da8: 4426 lw s0,72(sp) + 3000daa: 6161 addi sp,sp,80 + 3000dac: 8082 ret + +03000dae : + 3000dae: 7179 addi sp,sp,-48 + 3000db0: d622 sw s0,44(sp) + 3000db2: 1800 addi s0,sp,48 + 3000db4: fca42e23 sw a0,-36(s0) + 3000db8: fcb42c23 sw a1,-40(s0) + 3000dbc: fdc42783 lw a5,-36(s0) + 3000dc0: fef42423 sw a5,-24(s0) + 3000dc4: fe842703 lw a4,-24(s0) + 3000dc8: 023c37b7 lui a5,0x23c3 + 3000dcc: 45f78793 addi a5,a5,1119 # 23c345f + 3000dd0: 00e7e863 bltu a5,a4,3000de0 + 3000dd4: 023c37b7 lui a5,0x23c3 + 3000dd8: 46078793 addi a5,a5,1120 # 23c3460 + 3000ddc: fef42423 sw a5,-24(s0) + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 46078793 addi a5,a5,1120 # 23c3460 + 3000dec: 02f777b3 remu a5,a4,a5 + 3000df0: ef81 bnez a5,3000e08 + 3000df2: fe842703 lw a4,-24(s0) + 3000df6: 023c37b7 lui a5,0x23c3 + 3000dfa: 46078793 addi a5,a5,1120 # 23c3460 + 3000dfe: 02f757b3 divu a5,a4,a5 + 3000e02: fef42623 sw a5,-20(s0) + 3000e06: a821 j 3000e1e + 3000e08: fe842703 lw a4,-24(s0) + 3000e0c: 023c37b7 lui a5,0x23c3 + 3000e10: 46078793 addi a5,a5,1120 # 23c3460 + 3000e14: 02f757b3 divu a5,a4,a5 + 3000e18: 0785 addi a5,a5,1 + 3000e1a: fef42623 sw a5,-20(s0) + 3000e1e: fec42703 lw a4,-20(s0) + 3000e22: 4791 li a5,4 + 3000e24: 00e7f563 bgeu a5,a4,3000e2e + 3000e28: 4791 li a5,4 + 3000e2a: fef42623 sw a5,-20(s0) + 3000e2e: fd842783 lw a5,-40(s0) + 3000e32: fec42703 lw a4,-20(s0) + 3000e36: c398 sw a4,0(a5) + 3000e38: 0001 nop + 3000e3a: 5432 lw s0,44(sp) + 3000e3c: 6145 addi sp,sp,48 + 3000e3e: 8082 ret + +03000e40 : + 3000e40: 7179 addi sp,sp,-48 + 3000e42: d606 sw ra,44(sp) + 3000e44: d422 sw s0,40(sp) + 3000e46: 1800 addi s0,sp,48 + 3000e48: fca42e23 sw a0,-36(s0) + 3000e4c: fdc42783 lw a5,-36(s0) + 3000e50: 4705 li a4,1 + 3000e52: 02e78063 beq a5,a4,3000e72 + 3000e56: 4705 li a4,1 + 3000e58: 00e7e663 bltu a5,a4,3000e64 + 3000e5c: 4709 li a4,2 + 3000e5e: 02e78163 beq a5,a4,3000e80 + 3000e62: a025 j 3000e8a + 3000e64: 017d87b7 lui a5,0x17d8 + 3000e68: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e6c: fef42623 sw a5,-20(s0) + 3000e70: a01d j 3000e96 + 3000e72: 01c9c7b7 lui a5,0x1c9c + 3000e76: 38078793 addi a5,a5,896 # 1c9c380 + 3000e7a: fef42623 sw a5,-20(s0) + 3000e7e: a821 j 3000e96 + 3000e80: 5ac010ef jal ra,300242c + 3000e84: fea42623 sw a0,-20(s0) + 3000e88: a039 j 3000e96 + 3000e8a: 67a1 lui a5,0x8 + 3000e8c: d0078793 addi a5,a5,-768 # 7d00 + 3000e90: fef42623 sw a5,-20(s0) + 3000e94: 0001 nop + 3000e96: fec42783 lw a5,-20(s0) + 3000e9a: 853e mv a0,a5 + 3000e9c: 50b2 lw ra,44(sp) + 3000e9e: 5422 lw s0,40(sp) + 3000ea0: 6145 addi sp,sp,48 + 3000ea2: 8082 ret + +03000ea4 : + 3000ea4: 7179 addi sp,sp,-48 + 3000ea6: d606 sw ra,44(sp) + 3000ea8: d422 sw s0,40(sp) + 3000eaa: 1800 addi s0,sp,48 + 3000eac: fca42e23 sw a0,-36(s0) + 3000eb0: 147107b7 lui a5,0x14710 + 3000eb4: fef42623 sw a5,-20(s0) + 3000eb8: fdc42503 lw a0,-36(s0) + 3000ebc: 3751 jal ra,3000e40 + 3000ebe: fea42423 sw a0,-24(s0) + 3000ec2: fec42703 lw a4,-20(s0) + 3000ec6: 6785 lui a5,0x1 + 3000ec8: 97ba add a5,a5,a4 + 3000eca: 9407a783 lw a5,-1728(a5) # 940 + 3000ece: fef42223 sw a5,-28(s0) + 3000ed2: fe040793 addi a5,s0,-32 + 3000ed6: 85be mv a1,a5 + 3000ed8: fe842503 lw a0,-24(s0) + 3000edc: 3dc9 jal ra,3000dae + 3000ede: fe042783 lw a5,-32(s0) + 3000ee2: 8bbd andi a5,a5,15 + 3000ee4: 0ff7f713 andi a4,a5,255 + 3000ee8: fe442783 lw a5,-28(s0) + 3000eec: 8b3d andi a4,a4,15 + 3000eee: 0712 slli a4,a4,0x4 + 3000ef0: f0f7f793 andi a5,a5,-241 + 3000ef4: 8fd9 or a5,a5,a4 + 3000ef6: fef42223 sw a5,-28(s0) + 3000efa: fe442783 lw a5,-28(s0) + 3000efe: 00100737 lui a4,0x100 + 3000f02: 8fd9 or a5,a5,a4 + 3000f04: fef42223 sw a5,-28(s0) + 3000f08: fe442783 lw a5,-28(s0) + 3000f0c: 00400737 lui a4,0x400 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00400737 lui a4,0x400 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00100737 lui a4,0x100 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + 3000f32: fe442703 lw a4,-28(s0) + 3000f36: fec42683 lw a3,-20(s0) + 3000f3a: 6785 lui a5,0x1 + 3000f3c: 97b6 add a5,a5,a3 + 3000f3e: 94e7a023 sw a4,-1728(a5) # 940 + 3000f42: 0001 nop + 3000f44: fec42703 lw a4,-20(s0) + 3000f48: 6785 lui a5,0x1 + 3000f4a: 97ba add a5,a5,a4 + 3000f4c: 9407a783 lw a5,-1728(a5) # 940 + 3000f50: 83d1 srli a5,a5,0x14 + 3000f52: 8b85 andi a5,a5,1 + 3000f54: 0ff7f713 andi a4,a5,255 + 3000f58: 4785 li a5,1 + 3000f5a: fef705e3 beq a4,a5,3000f44 + 3000f5e: 0001 nop + 3000f60: 50b2 lw ra,44(sp) + 3000f62: 5422 lw s0,40(sp) + 3000f64: 6145 addi sp,sp,48 + 3000f66: 8082 ret + +03000f68 : + 3000f68: 1141 addi sp,sp,-16 + 3000f6a: c622 sw s0,12(sp) + 3000f6c: 0800 addi s0,sp,16 + 3000f6e: 143807b7 lui a5,0x14380 + 3000f72: 0007a023 sw zero,0(a5) # 14380000 + 3000f76: 14380737 lui a4,0x14380 + 3000f7a: 431c lw a5,0(a4) + 3000f7c: 0017e793 ori a5,a5,1 + 3000f80: c31c sw a5,0(a4) + 3000f82: 0001 nop + 3000f84: 4432 lw s0,12(sp) + 3000f86: 0141 addi sp,sp,16 + 3000f88: 8082 ret + +03000f8a : + 3000f8a: 1141 addi sp,sp,-16 + 3000f8c: c606 sw ra,12(sp) + 3000f8e: c422 sw s0,8(sp) + 3000f90: 0800 addi s0,sp,16 + 3000f92: 14380537 lui a0,0x14380 + 3000f96: 590010ef jal ra,3002526 + 3000f9a: 87aa mv a5,a0 + 3000f9c: 853e mv a0,a5 + 3000f9e: 40b2 lw ra,12(sp) + 3000fa0: 4422 lw s0,8(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + 3000fa6: 1101 addi sp,sp,-32 + 3000fa8: ce22 sw s0,28(sp) + 3000faa: 1000 addi s0,sp,32 + 3000fac: fea42623 sw a0,-20(s0) + 3000fb0: fec42783 lw a5,-20(s0) + 3000fb4: 1007a783 lw a5,256(a5) + 3000fb8: 83c1 srli a5,a5,0x10 + 3000fba: 8b85 andi a5,a5,1 + 3000fbc: 9f81 uxtb a5 + 3000fbe: e38d bnez a5,3000fe0 + 3000fc0: fec42783 lw a5,-20(s0) + 3000fc4: 1007a783 lw a5,256(a5) + 3000fc8: 83cd srli a5,a5,0x13 + 3000fca: 8b85 andi a5,a5,1 + 3000fcc: 9f81 uxtb a5 + 3000fce: eb89 bnez a5,3000fe0 + 3000fd0: fec42783 lw a5,-20(s0) + 3000fd4: 1007a783 lw a5,256(a5) + 3000fd8: 83d1 srli a5,a5,0x14 + 3000fda: 8b85 andi a5,a5,1 + 3000fdc: 9f81 uxtb a5 + 3000fde: c3a9 beqz a5,3001020 + 3000fe0: fec42703 lw a4,-20(s0) + 3000fe4: 10c72783 lw a5,268(a4) # 1438010c + 3000fe8: 000806b7 lui a3,0x80 + 3000fec: 8fd5 or a5,a5,a3 + 3000fee: 10f72623 sw a5,268(a4) + 3000ff2: fec42703 lw a4,-20(s0) + 3000ff6: 10c72783 lw a5,268(a4) + 3000ffa: 66c1 lui a3,0x10 + 3000ffc: 8fd5 or a5,a5,a3 + 3000ffe: 10f72623 sw a5,268(a4) + 3001002: fec42703 lw a4,-20(s0) + 3001006: 10c72783 lw a5,268(a4) + 300100a: 001006b7 lui a3,0x100 + 300100e: 8fd5 or a5,a5,a3 + 3001010: 10f72623 sw a5,268(a4) + 3001014: fec42783 lw a5,-20(s0) + 3001018: 2007a023 sw zero,512(a5) + 300101c: 4785 li a5,1 + 300101e: a011 j 3001022 + 3001020: 4781 li a5,0 + 3001022: 853e mv a0,a5 + 3001024: 4472 lw s0,28(sp) + 3001026: 6105 addi sp,sp,32 + 3001028: 8082 ret + +0300102a : + 300102a: 7179 addi sp,sp,-48 + 300102c: d606 sw ra,44(sp) + 300102e: d422 sw s0,40(sp) + 3001030: 1800 addi s0,sp,48 + 3001032: fca42e23 sw a0,-36(s0) + 3001036: fcb42c23 sw a1,-40(s0) + 300103a: fcc42a23 sw a2,-44(s0) + 300103e: 147107b7 lui a5,0x14710 + 3001042: fef42423 sw a5,-24(s0) + 3001046: fd442783 lw a5,-44(s0) + 300104a: e399 bnez a5,3001050 + 300104c: 4785 li a5,1 + 300104e: aa15 j 3001182 + 3001050: fdc42703 lw a4,-36(s0) + 3001054: 4785 li a5,1 + 3001056: 00e7e763 bltu a5,a4,3001064 + 300105a: fd842703 lw a4,-40(s0) + 300105e: 47e5 li a5,25 + 3001060: 00e7f463 bgeu a5,a4,3001068 + 3001064: 4785 li a5,1 + 3001066: aa31 j 3001182 + 3001068: fe842783 lw a5,-24(s0) + 300106c: 439c lw a5,0(a5) + 300106e: 8b85 andi a5,a5,1 + 3001070: 9f81 uxtb a5 + 3001072: c399 beqz a5,3001078 + 3001074: 4785 li a5,1 + 3001076: a231 j 3001182 + 3001078: fe842783 lw a5,-24(s0) + 300107c: fedcc737 lui a4,0xfedcc + 3001080: a9870713 addi a4,a4,-1384 # fedcba98 + 3001084: 20e7a023 sw a4,512(a5) # 14710200 + 3001088: fdc42783 lw a5,-36(s0) + 300108c: e781 bnez a5,3001094 + 300108e: 008007b7 lui a5,0x800 + 3001092: a019 j 3001098 + 3001094: 008017b7 lui a5,0x801 + 3001098: fef42223 sw a5,-28(s0) + 300109c: fd842783 lw a5,-40(s0) + 30010a0: 0792 slli a5,a5,0x4 + 30010a2: fe442703 lw a4,-28(s0) + 30010a6: 97ba add a5,a5,a4 + 30010a8: fef42223 sw a5,-28(s0) + 30010ac: fe442783 lw a5,-28(s0) + 30010b0: 0027d713 srli a4,a5,0x2 + 30010b4: 004007b7 lui a5,0x400 + 30010b8: 17fd addi a5,a5,-1 # 3fffff + 30010ba: 00f77633 and a2,a4,a5 + 30010be: fe842703 lw a4,-24(s0) + 30010c2: 435c lw a5,4(a4) + 30010c4: 004006b7 lui a3,0x400 + 30010c8: 16fd addi a3,a3,-1 # 3fffff + 30010ca: 8ef1 and a3,a3,a2 + 30010cc: 068a slli a3,a3,0x2 + 30010ce: ff000637 lui a2,0xff000 + 30010d2: 060d addi a2,a2,3 # ff000003 + 30010d4: 8ff1 and a5,a5,a2 + 30010d6: 8fd5 or a5,a5,a3 + 30010d8: c35c sw a5,4(a4) + 30010da: fe842703 lw a4,-24(s0) + 30010de: 431c lw a5,0(a4) + 30010e0: 8ff7f793 andi a5,a5,-1793 + 30010e4: 1007e793 ori a5,a5,256 + 30010e8: c31c sw a5,0(a4) + 30010ea: fe842703 lw a4,-24(s0) + 30010ee: 431c lw a5,0(a4) + 30010f0: d00006b7 lui a3,0xd0000 + 30010f4: 16fd addi a3,a3,-1 # cfffffff + 30010f6: 8efd and a3,a3,a5 + 30010f8: 100007b7 lui a5,0x10000 + 30010fc: 8fd5 or a5,a5,a3 + 30010fe: c31c sw a5,0(a4) + 3001100: fe842703 lw a4,-24(s0) + 3001104: 431c lw a5,0(a4) + 3001106: 0017e793 ori a5,a5,1 + 300110a: c31c sw a5,0(a4) + 300110c: 0001 nop + 300110e: fe842783 lw a5,-24(s0) + 3001112: 439c lw a5,0(a5) + 3001114: 8b85 andi a5,a5,1 + 3001116: 9f81 uxtb a5 + 3001118: fbfd bnez a5,300110e + 300111a: 0001 nop + 300111c: fe842783 lw a5,-24(s0) + 3001120: 439c lw a5,0(a5) + 3001122: 8399 srli a5,a5,0x6 + 3001124: 8b8d andi a5,a5,3 + 3001126: 9f81 uxtb a5 + 3001128: fbf5 bnez a5,300111c + 300112a: fe842503 lw a0,-24(s0) + 300112e: 3da5 jal ra,3000fa6 + 3001130: 87aa mv a5,a0 + 3001132: c399 beqz a5,3001138 + 3001134: 4785 li a5,1 + 3001136: a0b1 j 3001182 + 3001138: fe042623 sw zero,-20(s0) + 300113c: a00d j 300115e + 300113e: fe842783 lw a5,-24(s0) + 3001142: 6007a703 lw a4,1536(a5) # 10000600 + 3001146: fd442683 lw a3,-44(s0) + 300114a: fec42783 lw a5,-20(s0) + 300114e: 078a slli a5,a5,0x2 + 3001150: 97b6 add a5,a5,a3 + 3001152: c398 sw a4,0(a5) + 3001154: fec42783 lw a5,-20(s0) + 3001158: 0785 addi a5,a5,1 + 300115a: fef42623 sw a5,-20(s0) + 300115e: fec42703 lw a4,-20(s0) + 3001162: 478d li a5,3 + 3001164: fce7fde3 bgeu a5,a4,300113e + 3001168: fe842703 lw a4,-24(s0) + 300116c: 10c72783 lw a5,268(a4) + 3001170: 0107e793 ori a5,a5,16 + 3001174: 10f72623 sw a5,268(a4) + 3001178: fe842783 lw a5,-24(s0) + 300117c: 2007a023 sw zero,512(a5) + 3001180: 4781 li a5,0 + 3001182: 853e mv a0,a5 + 3001184: 50b2 lw ra,44(sp) + 3001186: 5422 lw s0,40(sp) + 3001188: 6145 addi sp,sp,48 + 300118a: 8082 ret + +0300118c : + 300118c: 7179 addi sp,sp,-48 + 300118e: d622 sw s0,44(sp) + 3001190: 1800 addi s0,sp,48 + 3001192: fca42e23 sw a0,-36(s0) + 3001196: fe042623 sw zero,-20(s0) + 300119a: a081 j 30011da + 300119c: 0300f7b7 lui a5,0x300f + 30011a0: de878713 addi a4,a5,-536 # 300ede8 + 30011a4: fec42683 lw a3,-20(s0) + 30011a8: 47b1 li a5,12 + 30011aa: 02f687b3 mul a5,a3,a5 + 30011ae: 97ba add a5,a5,a4 + 30011b0: 439c lw a5,0(a5) + 30011b2: fdc42703 lw a4,-36(s0) + 30011b6: 00f71d63 bne a4,a5,30011d0 + 30011ba: fec42703 lw a4,-20(s0) + 30011be: 47b1 li a5,12 + 30011c0: 02f70733 mul a4,a4,a5 + 30011c4: 0300f7b7 lui a5,0x300f + 30011c8: de878793 addi a5,a5,-536 # 300ede8 + 30011cc: 97ba add a5,a5,a4 + 30011ce: a829 j 30011e8 + 30011d0: fec42783 lw a5,-20(s0) + 30011d4: 0785 addi a5,a5,1 + 30011d6: fef42623 sw a5,-20(s0) + 30011da: fec42703 lw a4,-20(s0) + 30011de: 02d00793 li a5,45 + 30011e2: fae7fde3 bgeu a5,a4,300119c + 30011e6: 4781 li a5,0 + 30011e8: 853e mv a0,a5 + 30011ea: 5432 lw s0,44(sp) + 30011ec: 6145 addi sp,sp,48 + 30011ee: 8082 ret + +030011f0 : + 30011f0: 1101 addi sp,sp,-32 + 30011f2: ce22 sw s0,28(sp) + 30011f4: 1000 addi s0,sp,32 + 30011f6: fea42623 sw a0,-20(s0) + 30011fa: feb42423 sw a1,-24(s0) + 30011fe: 0001 nop + 3001200: 4472 lw s0,28(sp) + 3001202: 6105 addi sp,sp,32 + 3001204: 8082 ret + +03001206 : + 3001206: 1141 addi sp,sp,-16 + 3001208: c622 sw s0,12(sp) + 300120a: 0800 addi s0,sp,16 + 300120c: 143807b7 lui a5,0x14380 + 3001210: 479c lw a5,8(a5) + 3001212: 853e mv a0,a5 + 3001214: 4432 lw s0,12(sp) + 3001216: 0141 addi sp,sp,16 + 3001218: 8082 ret + +0300121a : + 300121a: 7179 addi sp,sp,-48 + 300121c: d606 sw ra,44(sp) + 300121e: d422 sw s0,40(sp) + 3001220: 1800 addi s0,sp,48 + 3001222: fca42e23 sw a0,-36(s0) + 3001226: 37c5 jal ra,3001206 + 3001228: fea42623 sw a0,-20(s0) + 300122c: 3bb9 jal ra,3000f8a + 300122e: 872a mv a4,a0 + 3001230: 000f47b7 lui a5,0xf4 + 3001234: 24078793 addi a5,a5,576 # f4240 + 3001238: 02f757b3 divu a5,a4,a5 + 300123c: fdc42703 lw a4,-36(s0) + 3001240: 02f707b3 mul a5,a4,a5 + 3001244: fef42423 sw a5,-24(s0) + 3001248: 3f7d jal ra,3001206 + 300124a: fea42223 sw a0,-28(s0) + 300124e: fe442703 lw a4,-28(s0) + 3001252: fec42783 lw a5,-20(s0) + 3001256: 40f707b3 sub a5,a4,a5 + 300125a: fef42023 sw a5,-32(s0) + 300125e: fe042703 lw a4,-32(s0) + 3001262: fe842783 lw a5,-24(s0) + 3001266: fef761e3 bltu a4,a5,3001248 + 300126a: 0001 nop + 300126c: 50b2 lw ra,44(sp) + 300126e: 5422 lw s0,40(sp) + 3001270: 6145 addi sp,sp,48 + 3001272: 8082 ret + +03001274 : + 3001274: 7179 addi sp,sp,-48 + 3001276: d606 sw ra,44(sp) + 3001278: d422 sw s0,40(sp) + 300127a: 1800 addi s0,sp,48 + 300127c: fca42e23 sw a0,-36(s0) + 3001280: fe042623 sw zero,-20(s0) + 3001284: a809 j 3001296 + 3001286: 3e800513 li a0,1000 + 300128a: 3f41 jal ra,300121a + 300128c: fec42783 lw a5,-20(s0) + 3001290: 0785 addi a5,a5,1 + 3001292: fef42623 sw a5,-20(s0) + 3001296: fec42703 lw a4,-20(s0) + 300129a: fdc42783 lw a5,-36(s0) + 300129e: fef764e3 bltu a4,a5,3001286 + 30012a2: 0001 nop + 30012a4: 50b2 lw ra,44(sp) + 30012a6: 5422 lw s0,40(sp) + 30012a8: 6145 addi sp,sp,48 + 30012aa: 8082 ret + +030012ac : + 30012ac: 7179 addi sp,sp,-48 + 30012ae: d606 sw ra,44(sp) + 30012b0: d422 sw s0,40(sp) + 30012b2: 1800 addi s0,sp,48 + 30012b4: fca42e23 sw a0,-36(s0) + 30012b8: fe042623 sw zero,-20(s0) + 30012bc: a809 j 30012ce + 30012be: 3e800513 li a0,1000 + 30012c2: 3f4d jal ra,3001274 + 30012c4: fec42783 lw a5,-20(s0) + 30012c8: 0785 addi a5,a5,1 + 30012ca: fef42623 sw a5,-20(s0) + 30012ce: fec42703 lw a4,-20(s0) + 30012d2: fdc42783 lw a5,-36(s0) + 30012d6: fef764e3 bltu a4,a5,30012be + 30012da: 0001 nop + 30012dc: 50b2 lw ra,44(sp) + 30012de: 5422 lw s0,40(sp) + 30012e0: 6145 addi sp,sp,48 + 30012e2: 8082 ret + +030012e4 : + 30012e4: 1101 addi sp,sp,-32 + 30012e6: ce06 sw ra,28(sp) + 30012e8: cc22 sw s0,24(sp) + 30012ea: 1000 addi s0,sp,32 + 30012ec: fea42623 sw a0,-20(s0) + 30012f0: feb42423 sw a1,-24(s0) + 30012f4: fe842783 lw a5,-24(s0) + 30012f8: 3e800713 li a4,1000 + 30012fc: 02e78063 beq a5,a4,300131c + 3001300: 000f4737 lui a4,0xf4 + 3001304: 24070713 addi a4,a4,576 # f4240 + 3001308: 00e78e63 beq a5,a4,3001324 + 300130c: 4705 li a4,1 + 300130e: 00e78363 beq a5,a4,3001314 + 3001312: a829 j 300132c + 3001314: fec42503 lw a0,-20(s0) + 3001318: 3f51 jal ra,30012ac + 300131a: a809 j 300132c + 300131c: fec42503 lw a0,-20(s0) + 3001320: 3f91 jal ra,3001274 + 3001322: a029 j 300132c + 3001324: fec42503 lw a0,-20(s0) + 3001328: 3dcd jal ra,300121a + 300132a: 0001 nop + 300132c: 0001 nop + 300132e: 40f2 lw ra,28(sp) + 3001330: 4462 lw s0,24(sp) + 3001332: 6105 addi sp,sp,32 + 3001334: 8082 ret + +03001336 : + 3001336: 1101 addi sp,sp,-32 + 3001338: ce22 sw s0,28(sp) + 300133a: 1000 addi s0,sp,32 + 300133c: fea42623 sw a0,-20(s0) + 3001340: 0ff0000f fence + 3001344: fec42783 lw a5,-20(s0) + 3001348: 82be mv t0,a5 + 300134a: bf029073 csrw 0xbf0,t0 + 300134e: 0001 nop + 3001350: 4472 lw s0,28(sp) + 3001352: 6105 addi sp,sp,32 + 3001354: 8082 ret + +03001356 : + 3001356: 1101 addi sp,sp,-32 + 3001358: ce06 sw ra,28(sp) + 300135a: cc22 sw s0,24(sp) + 300135c: 1000 addi s0,sp,32 + 300135e: fea42623 sw a0,-20(s0) + 3001362: f1818713 addi a4,gp,-232 # 400054c + 3001366: fec42783 lw a5,-20(s0) + 300136a: 078e slli a5,a5,0x3 + 300136c: 97ba add a5,a5,a4 + 300136e: 4394 lw a3,0(a5) + 3001370: f1818713 addi a4,gp,-232 # 400054c + 3001374: fec42783 lw a5,-20(s0) + 3001378: 078e slli a5,a5,0x3 + 300137a: 97ba add a5,a5,a4 + 300137c: 43dc lw a5,4(a5) + 300137e: 853e mv a0,a5 + 3001380: 9682 jalr a3 + 3001382: fec42503 lw a0,-20(s0) + 3001386: 3f45 jal ra,3001336 + 3001388: 0001 nop + 300138a: 40f2 lw ra,28(sp) + 300138c: 4462 lw s0,24(sp) + 300138e: 6105 addi sp,sp,32 + 3001390: 8082 ret + +03001392 : + 3001392: 1101 addi sp,sp,-32 + 3001394: ce22 sw s0,28(sp) + 3001396: 1000 addi s0,sp,32 + 3001398: fe042623 sw zero,-20(s0) + 300139c: a80d j 30013ce + 300139e: f1818713 addi a4,gp,-232 # 400054c + 30013a2: fec42783 lw a5,-20(s0) + 30013a6: 078e slli a5,a5,0x3 + 30013a8: 97ba add a5,a5,a4 + 30013aa: 03002737 lui a4,0x3002 + 30013ae: c2670713 addi a4,a4,-986 # 3001c26 + 30013b2: c398 sw a4,0(a5) + 30013b4: f1818713 addi a4,gp,-232 # 400054c + 30013b8: fec42783 lw a5,-20(s0) + 30013bc: 078e slli a5,a5,0x3 + 30013be: 97ba add a5,a5,a4 + 30013c0: 0007a223 sw zero,4(a5) + 30013c4: fec42783 lw a5,-20(s0) + 30013c8: 0785 addi a5,a5,1 + 30013ca: fef42623 sw a5,-20(s0) + 30013ce: fec42703 lw a4,-20(s0) + 30013d2: 07200793 li a5,114 + 30013d6: fce7f4e3 bgeu a5,a4,300139e + 30013da: 0001 nop + 30013dc: 4472 lw s0,28(sp) + 30013de: 6105 addi sp,sp,32 + 30013e0: 8082 ret + +030013e2 : + 30013e2: 1101 addi sp,sp,-32 + 30013e4: ce06 sw ra,28(sp) + 30013e6: cc22 sw s0,24(sp) + 30013e8: 1000 addi s0,sp,32 + 30013ea: fea42623 sw a0,-20(s0) + 30013ee: feb42423 sw a1,-24(s0) + 30013f2: fec42223 sw a2,-28(s0) + 30013f6: fe842783 lw a5,-24(s0) + 30013fa: eb89 bnez a5,300140c + 30013fc: 06300593 li a1,99 + 3001400: 0300f7b7 lui a5,0x300f + 3001404: 01078513 addi a0,a5,16 # 300f010 + 3001408: 33e5 jal ra,30011f0 + 300140a: a001 j 300140a + 300140c: fec42703 lw a4,-20(s0) + 3001410: 07200793 li a5,114 + 3001414: 00e7fb63 bgeu a5,a4,300142a + 3001418: 06400593 li a1,100 + 300141c: 0300f7b7 lui a5,0x300f + 3001420: 01078513 addi a0,a5,16 # 300f010 + 3001424: 33f1 jal ra,30011f0 + 3001426: 4789 li a5,2 + 3001428: a80d j 300145a + 300142a: f1818713 addi a4,gp,-232 # 400054c + 300142e: fec42783 lw a5,-20(s0) + 3001432: 078e slli a5,a5,0x3 + 3001434: 97ba add a5,a5,a4 + 3001436: 4398 lw a4,0(a5) + 3001438: 030027b7 lui a5,0x3002 + 300143c: c2678793 addi a5,a5,-986 # 3001c26 + 3001440: 00f70463 beq a4,a5,3001448 + 3001444: 478d li a5,3 + 3001446: a811 j 300145a + 3001448: fe442603 lw a2,-28(s0) + 300144c: fe842583 lw a1,-24(s0) + 3001450: fec42503 lw a0,-20(s0) + 3001454: 7e4000ef jal ra,3001c38 + 3001458: 4781 li a5,0 + 300145a: 853e mv a0,a5 + 300145c: 40f2 lw ra,28(sp) + 300145e: 4462 lw s0,24(sp) + 3001460: 6105 addi sp,sp,32 + 3001462: 8082 ret + +03001464 : + 3001464: 7139 addi sp,sp,-64 + 3001466: de06 sw ra,60(sp) + 3001468: dc22 sw s0,56(sp) + 300146a: 0080 addi s0,sp,64 + 300146c: fca42623 sw a0,-52(s0) + 3001470: fcc42703 lw a4,-52(s0) + 3001474: 47e5 li a5,25 + 3001476: 00e7f863 bgeu a5,a4,3001486 + 300147a: fcc42703 lw a4,-52(s0) + 300147e: 07200793 li a5,114 + 3001482: 00e7fb63 bgeu a5,a4,3001498 + 3001486: 0c300593 li a1,195 + 300148a: 0300f7b7 lui a5,0x300f + 300148e: 01078513 addi a0,a5,16 # 300f010 + 3001492: 3bb9 jal ra,30011f0 + 3001494: 4789 li a5,2 + 3001496: a8cd j 3001588 + 3001498: fcc42703 lw a4,-52(s0) + 300149c: 47fd li a5,31 + 300149e: 02e7e063 bltu a5,a4,30014be + 30014a2: 4705 li a4,1 + 30014a4: fcc42783 lw a5,-52(s0) + 30014a8: 00f717b3 sll a5,a4,a5 + 30014ac: fef42623 sw a5,-20(s0) + 30014b0: fec42783 lw a5,-20(s0) + 30014b4: 3047a7f3 csrrs a5,mie,a5 + 30014b8: fcf42c23 sw a5,-40(s0) + 30014bc: a0e9 j 3001586 + 30014be: fcc42703 lw a4,-52(s0) + 30014c2: 03f00793 li a5,63 + 30014c6: 02e7ef63 bltu a5,a4,3001504 + 30014ca: fcc42783 lw a5,-52(s0) + 30014ce: 1781 addi a5,a5,-32 + 30014d0: fef42623 sw a5,-20(s0) + 30014d4: be0027f3 csrr a5,0xbe0 + 30014d8: fcf42e23 sw a5,-36(s0) + 30014dc: fdc42783 lw a5,-36(s0) + 30014e0: fef42223 sw a5,-28(s0) + 30014e4: 4705 li a4,1 + 30014e6: fec42783 lw a5,-20(s0) + 30014ea: 00f717b3 sll a5,a4,a5 + 30014ee: fe442703 lw a4,-28(s0) + 30014f2: 8fd9 or a5,a5,a4 + 30014f4: fef42223 sw a5,-28(s0) + 30014f8: fe442783 lw a5,-28(s0) + 30014fc: 82be mv t0,a5 + 30014fe: be029073 csrw 0xbe0,t0 + 3001502: a051 j 3001586 + 3001504: fcc42703 lw a4,-52(s0) + 3001508: 05f00793 li a5,95 + 300150c: 04e7e063 bltu a5,a4,300154c + 3001510: fcc42783 lw a5,-52(s0) + 3001514: fc078793 addi a5,a5,-64 + 3001518: fef42623 sw a5,-20(s0) + 300151c: be1027f3 csrr a5,0xbe1 + 3001520: fef42023 sw a5,-32(s0) + 3001524: fe042783 lw a5,-32(s0) + 3001528: fef42223 sw a5,-28(s0) + 300152c: 4705 li a4,1 + 300152e: fec42783 lw a5,-20(s0) + 3001532: 00f717b3 sll a5,a4,a5 + 3001536: fe442703 lw a4,-28(s0) + 300153a: 8fd9 or a5,a5,a4 + 300153c: fef42223 sw a5,-28(s0) + 3001540: fe442783 lw a5,-28(s0) + 3001544: 82be mv t0,a5 + 3001546: be129073 csrw 0xbe1,t0 + 300154a: a835 j 3001586 + 300154c: fcc42783 lw a5,-52(s0) + 3001550: fa078793 addi a5,a5,-96 + 3001554: fef42623 sw a5,-20(s0) + 3001558: be2027f3 csrr a5,0xbe2 + 300155c: fef42423 sw a5,-24(s0) + 3001560: fe842783 lw a5,-24(s0) + 3001564: fef42223 sw a5,-28(s0) + 3001568: 4705 li a4,1 + 300156a: fec42783 lw a5,-20(s0) + 300156e: 00f717b3 sll a5,a4,a5 + 3001572: fe442703 lw a4,-28(s0) + 3001576: 8fd9 or a5,a5,a4 + 3001578: fef42223 sw a5,-28(s0) + 300157c: fe442783 lw a5,-28(s0) + 3001580: 82be mv t0,a5 + 3001582: be229073 csrw 0xbe2,t0 + 3001586: 4781 li a5,0 + 3001588: 853e mv a0,a5 + 300158a: 50f2 lw ra,60(sp) + 300158c: 5462 lw s0,56(sp) + 300158e: 6121 addi sp,sp,64 + 3001590: 8082 ret + +03001592 : + 3001592: 1101 addi sp,sp,-32 + 3001594: ce22 sw s0,28(sp) + 3001596: 1000 addi s0,sp,32 + 3001598: fea42623 sw a0,-20(s0) + 300159c: 0001 nop + 300159e: 4472 lw s0,28(sp) + 30015a0: 6105 addi sp,sp,32 + 30015a2: 8082 ret + +030015a4 : + 30015a4: 1141 addi sp,sp,-16 + 30015a6: c622 sw s0,12(sp) + 30015a8: 0800 addi s0,sp,16 + 30015aa: 0001 nop + 30015ac: 4432 lw s0,12(sp) + 30015ae: 0141 addi sp,sp,16 + 30015b0: 8082 ret + +030015b2 : + 30015b2: 1101 addi sp,sp,-32 + 30015b4: ce06 sw ra,28(sp) + 30015b6: cc22 sw s0,24(sp) + 30015b8: 1000 addi s0,sp,32 + 30015ba: fea42623 sw a0,-20(s0) + 30015be: fec42503 lw a0,-20(s0) + 30015c2: 3fc1 jal ra,3001592 + 30015c4: 37c5 jal ra,30015a4 + 30015c6: 0001 nop + 30015c8: 40f2 lw ra,28(sp) + 30015ca: 4462 lw s0,24(sp) + 30015cc: 6105 addi sp,sp,32 + 30015ce: 8082 ret + +030015d0 : + 30015d0: 1101 addi sp,sp,-32 + 30015d2: ce06 sw ra,28(sp) + 30015d4: cc22 sw s0,24(sp) + 30015d6: 1000 addi s0,sp,32 + 30015d8: fea42623 sw a0,-20(s0) + 30015dc: fec42783 lw a5,-20(s0) + 30015e0: eb89 bnez a5,30015f2 + 30015e2: 12d00593 li a1,301 + 30015e6: 0300f7b7 lui a5,0x300f + 30015ea: 01078513 addi a0,a5,16 # 300f010 + 30015ee: 3109 jal ra,30011f0 + 30015f0: a001 j 30015f0 + 30015f2: fec42503 lw a0,-20(s0) + 30015f6: 3f71 jal ra,3001592 + 30015f8: 3775 jal ra,30015a4 + 30015fa: 0001 nop + 30015fc: 40f2 lw ra,28(sp) + 30015fe: 4462 lw s0,24(sp) + 3001600: 6105 addi sp,sp,32 + 3001602: 8082 ret + +03001604 : + 3001604: 711d addi sp,sp,-96 + 3001606: cea2 sw s0,92(sp) + 3001608: 1080 addi s0,sp,96 + 300160a: faa42623 sw a0,-84(s0) + 300160e: fab42423 sw a1,-88(s0) + 3001612: fac42223 sw a2,-92(s0) + 3001616: fac42783 lw a5,-84(s0) + 300161a: 17e1 addi a5,a5,-8 + 300161c: 471d li a4,7 + 300161e: 2af76363 bltu a4,a5,30018c4 + 3001622: 00279713 slli a4,a5,0x2 + 3001626: 0300f7b7 lui a5,0x300f + 300162a: 03078793 addi a5,a5,48 # 300f030 + 300162e: 97ba add a5,a5,a4 + 3001630: 439c lw a5,0(a5) + 3001632: 8782 jr a5 + 3001634: bc8027f3 csrr a5,0xbc8 + 3001638: faf42a23 sw a5,-76(s0) + 300163c: fb442783 lw a5,-76(s0) + 3001640: faf42823 sw a5,-80(s0) + 3001644: fa842783 lw a5,-88(s0) + 3001648: 078a slli a5,a5,0x2 + 300164a: 8bf1 andi a5,a5,28 + 300164c: 473d li a4,15 + 300164e: 00f717b3 sll a5,a4,a5 + 3001652: fff7c793 not a5,a5 + 3001656: fb042703 lw a4,-80(s0) + 300165a: 8ff9 and a5,a5,a4 + 300165c: faf42823 sw a5,-80(s0) + 3001660: fa842783 lw a5,-88(s0) + 3001664: 078a slli a5,a5,0x2 + 3001666: 8bf1 andi a5,a5,28 + 3001668: fa442703 lw a4,-92(s0) + 300166c: 00f717b3 sll a5,a4,a5 + 3001670: fb042703 lw a4,-80(s0) + 3001674: 8fd9 or a5,a5,a4 + 3001676: faf42823 sw a5,-80(s0) + 300167a: fb042783 lw a5,-80(s0) + 300167e: 82be mv t0,a5 + 3001680: bc829073 csrw 0xbc8,t0 + 3001684: a489 j 30018c6 + 3001686: bc9027f3 csrr a5,0xbc9 + 300168a: faf42e23 sw a5,-68(s0) + 300168e: fbc42783 lw a5,-68(s0) + 3001692: faf42c23 sw a5,-72(s0) + 3001696: fa842783 lw a5,-88(s0) + 300169a: 078a slli a5,a5,0x2 + 300169c: 8bf1 andi a5,a5,28 + 300169e: 473d li a4,15 + 30016a0: 00f717b3 sll a5,a4,a5 + 30016a4: fff7c793 not a5,a5 + 30016a8: fb842703 lw a4,-72(s0) + 30016ac: 8ff9 and a5,a5,a4 + 30016ae: faf42c23 sw a5,-72(s0) + 30016b2: fa842783 lw a5,-88(s0) + 30016b6: 078a slli a5,a5,0x2 + 30016b8: 8bf1 andi a5,a5,28 + 30016ba: fa442703 lw a4,-92(s0) + 30016be: 00f717b3 sll a5,a4,a5 + 30016c2: fb842703 lw a4,-72(s0) + 30016c6: 8fd9 or a5,a5,a4 + 30016c8: faf42c23 sw a5,-72(s0) + 30016cc: fb842783 lw a5,-72(s0) + 30016d0: 82be mv t0,a5 + 30016d2: bc929073 csrw 0xbc9,t0 + 30016d6: aac5 j 30018c6 + 30016d8: bca027f3 csrr a5,0xbca + 30016dc: fcf42223 sw a5,-60(s0) + 30016e0: fc442783 lw a5,-60(s0) + 30016e4: fcf42023 sw a5,-64(s0) + 30016e8: fa842783 lw a5,-88(s0) + 30016ec: 078a slli a5,a5,0x2 + 30016ee: 8bf1 andi a5,a5,28 + 30016f0: 473d li a4,15 + 30016f2: 00f717b3 sll a5,a4,a5 + 30016f6: fff7c793 not a5,a5 + 30016fa: fc042703 lw a4,-64(s0) + 30016fe: 8ff9 and a5,a5,a4 + 3001700: fcf42023 sw a5,-64(s0) + 3001704: fa842783 lw a5,-88(s0) + 3001708: 078a slli a5,a5,0x2 + 300170a: 8bf1 andi a5,a5,28 + 300170c: fa442703 lw a4,-92(s0) + 3001710: 00f717b3 sll a5,a4,a5 + 3001714: fc042703 lw a4,-64(s0) + 3001718: 8fd9 or a5,a5,a4 + 300171a: fcf42023 sw a5,-64(s0) + 300171e: fc042783 lw a5,-64(s0) + 3001722: 82be mv t0,a5 + 3001724: bca29073 csrw 0xbca,t0 + 3001728: aa79 j 30018c6 + 300172a: bcb027f3 csrr a5,0xbcb + 300172e: fcf42623 sw a5,-52(s0) + 3001732: fcc42783 lw a5,-52(s0) + 3001736: fcf42423 sw a5,-56(s0) + 300173a: fa842783 lw a5,-88(s0) + 300173e: 078a slli a5,a5,0x2 + 3001740: 8bf1 andi a5,a5,28 + 3001742: 473d li a4,15 + 3001744: 00f717b3 sll a5,a4,a5 + 3001748: fff7c793 not a5,a5 + 300174c: fc842703 lw a4,-56(s0) + 3001750: 8ff9 and a5,a5,a4 + 3001752: fcf42423 sw a5,-56(s0) + 3001756: fa842783 lw a5,-88(s0) + 300175a: 078a slli a5,a5,0x2 + 300175c: 8bf1 andi a5,a5,28 + 300175e: fa442703 lw a4,-92(s0) + 3001762: 00f717b3 sll a5,a4,a5 + 3001766: fc842703 lw a4,-56(s0) + 300176a: 8fd9 or a5,a5,a4 + 300176c: fcf42423 sw a5,-56(s0) + 3001770: fc842783 lw a5,-56(s0) + 3001774: 82be mv t0,a5 + 3001776: bcb29073 csrw 0xbcb,t0 + 300177a: a2b1 j 30018c6 + 300177c: bcc027f3 csrr a5,0xbcc + 3001780: fcf42a23 sw a5,-44(s0) + 3001784: fd442783 lw a5,-44(s0) + 3001788: fcf42823 sw a5,-48(s0) + 300178c: fa842783 lw a5,-88(s0) + 3001790: 078a slli a5,a5,0x2 + 3001792: 8bf1 andi a5,a5,28 + 3001794: 473d li a4,15 + 3001796: 00f717b3 sll a5,a4,a5 + 300179a: fff7c793 not a5,a5 + 300179e: fd042703 lw a4,-48(s0) + 30017a2: 8ff9 and a5,a5,a4 + 30017a4: fcf42823 sw a5,-48(s0) + 30017a8: fa842783 lw a5,-88(s0) + 30017ac: 078a slli a5,a5,0x2 + 30017ae: 8bf1 andi a5,a5,28 + 30017b0: fa442703 lw a4,-92(s0) + 30017b4: 00f717b3 sll a5,a4,a5 + 30017b8: fd042703 lw a4,-48(s0) + 30017bc: 8fd9 or a5,a5,a4 + 30017be: fcf42823 sw a5,-48(s0) + 30017c2: fd042783 lw a5,-48(s0) + 30017c6: 82be mv t0,a5 + 30017c8: bcc29073 csrw 0xbcc,t0 + 30017cc: a8ed j 30018c6 + 30017ce: bcd027f3 csrr a5,0xbcd + 30017d2: fcf42e23 sw a5,-36(s0) + 30017d6: fdc42783 lw a5,-36(s0) + 30017da: fcf42c23 sw a5,-40(s0) + 30017de: fa842783 lw a5,-88(s0) + 30017e2: 078a slli a5,a5,0x2 + 30017e4: 8bf1 andi a5,a5,28 + 30017e6: 473d li a4,15 + 30017e8: 00f717b3 sll a5,a4,a5 + 30017ec: fff7c793 not a5,a5 + 30017f0: fd842703 lw a4,-40(s0) + 30017f4: 8ff9 and a5,a5,a4 + 30017f6: fcf42c23 sw a5,-40(s0) + 30017fa: fa842783 lw a5,-88(s0) + 30017fe: 078a slli a5,a5,0x2 + 3001800: 8bf1 andi a5,a5,28 + 3001802: fa442703 lw a4,-92(s0) + 3001806: 00f717b3 sll a5,a4,a5 + 300180a: fd842703 lw a4,-40(s0) + 300180e: 8fd9 or a5,a5,a4 + 3001810: fcf42c23 sw a5,-40(s0) + 3001814: fd842783 lw a5,-40(s0) + 3001818: 82be mv t0,a5 + 300181a: bcd29073 csrw 0xbcd,t0 + 300181e: a065 j 30018c6 + 3001820: bce027f3 csrr a5,0xbce + 3001824: fef42223 sw a5,-28(s0) + 3001828: fe442783 lw a5,-28(s0) + 300182c: fef42023 sw a5,-32(s0) + 3001830: fa842783 lw a5,-88(s0) + 3001834: 078a slli a5,a5,0x2 + 3001836: 8bf1 andi a5,a5,28 + 3001838: 473d li a4,15 + 300183a: 00f717b3 sll a5,a4,a5 + 300183e: fff7c793 not a5,a5 + 3001842: fe042703 lw a4,-32(s0) + 3001846: 8ff9 and a5,a5,a4 + 3001848: fef42023 sw a5,-32(s0) + 300184c: fa842783 lw a5,-88(s0) + 3001850: 078a slli a5,a5,0x2 + 3001852: 8bf1 andi a5,a5,28 + 3001854: fa442703 lw a4,-92(s0) + 3001858: 00f717b3 sll a5,a4,a5 + 300185c: fe042703 lw a4,-32(s0) + 3001860: 8fd9 or a5,a5,a4 + 3001862: fef42023 sw a5,-32(s0) + 3001866: fe042783 lw a5,-32(s0) + 300186a: 82be mv t0,a5 + 300186c: bce29073 csrw 0xbce,t0 + 3001870: a899 j 30018c6 + 3001872: bcf027f3 csrr a5,0xbcf + 3001876: fef42623 sw a5,-20(s0) + 300187a: fec42783 lw a5,-20(s0) + 300187e: fef42423 sw a5,-24(s0) + 3001882: fa842783 lw a5,-88(s0) + 3001886: 078a slli a5,a5,0x2 + 3001888: 8bf1 andi a5,a5,28 + 300188a: 473d li a4,15 + 300188c: 00f717b3 sll a5,a4,a5 + 3001890: fff7c793 not a5,a5 + 3001894: fe842703 lw a4,-24(s0) + 3001898: 8ff9 and a5,a5,a4 + 300189a: fef42423 sw a5,-24(s0) + 300189e: fa842783 lw a5,-88(s0) + 30018a2: 078a slli a5,a5,0x2 + 30018a4: 8bf1 andi a5,a5,28 + 30018a6: fa442703 lw a4,-92(s0) + 30018aa: 00f717b3 sll a5,a4,a5 + 30018ae: fe842703 lw a4,-24(s0) + 30018b2: 8fd9 or a5,a5,a4 + 30018b4: fef42423 sw a5,-24(s0) + 30018b8: fe842783 lw a5,-24(s0) + 30018bc: 82be mv t0,a5 + 30018be: bcf29073 csrw 0xbcf,t0 + 30018c2: a011 j 30018c6 + 30018c4: 0001 nop + 30018c6: 0001 nop + 30018c8: 4476 lw s0,92(sp) + 30018ca: 6125 addi sp,sp,96 + 30018cc: 8082 ret + +030018ce : + 30018ce: 7159 addi sp,sp,-112 + 30018d0: d686 sw ra,108(sp) + 30018d2: d4a2 sw s0,104(sp) + 30018d4: 1880 addi s0,sp,112 + 30018d6: f8a42e23 sw a0,-100(s0) + 30018da: f8b42c23 sw a1,-104(s0) + 30018de: f9c42783 lw a5,-100(s0) + 30018e2: 838d srli a5,a5,0x3 + 30018e4: fef42623 sw a5,-20(s0) + 30018e8: fec42703 lw a4,-20(s0) + 30018ec: 479d li a5,7 + 30018ee: 2ae7e563 bltu a5,a4,3001b98 + 30018f2: fec42783 lw a5,-20(s0) + 30018f6: 00279713 slli a4,a5,0x2 + 30018fa: 0300f7b7 lui a5,0x300f + 30018fe: 05078793 addi a5,a5,80 # 300f050 + 3001902: 97ba add a5,a5,a4 + 3001904: 439c lw a5,0(a5) + 3001906: 8782 jr a5 + 3001908: bc0027f3 csrr a5,0xbc0 + 300190c: faf42823 sw a5,-80(s0) + 3001910: fb042783 lw a5,-80(s0) + 3001914: faf42623 sw a5,-84(s0) + 3001918: f9c42783 lw a5,-100(s0) + 300191c: 078a slli a5,a5,0x2 + 300191e: 8bf1 andi a5,a5,28 + 3001920: 473d li a4,15 + 3001922: 00f717b3 sll a5,a4,a5 + 3001926: fff7c793 not a5,a5 + 300192a: fac42703 lw a4,-84(s0) + 300192e: 8ff9 and a5,a5,a4 + 3001930: faf42623 sw a5,-84(s0) + 3001934: f9c42783 lw a5,-100(s0) + 3001938: 078a slli a5,a5,0x2 + 300193a: 8bf1 andi a5,a5,28 + 300193c: f9842703 lw a4,-104(s0) + 3001940: 00f717b3 sll a5,a4,a5 + 3001944: fac42703 lw a4,-84(s0) + 3001948: 8fd9 or a5,a5,a4 + 300194a: faf42623 sw a5,-84(s0) + 300194e: fac42783 lw a5,-84(s0) + 3001952: 82be mv t0,a5 + 3001954: bc029073 csrw 0xbc0,t0 + 3001958: ac81 j 3001ba8 + 300195a: bc1027f3 csrr a5,0xbc1 + 300195e: faf42c23 sw a5,-72(s0) + 3001962: fb842783 lw a5,-72(s0) + 3001966: faf42a23 sw a5,-76(s0) + 300196a: f9c42783 lw a5,-100(s0) + 300196e: 078a slli a5,a5,0x2 + 3001970: 8bf1 andi a5,a5,28 + 3001972: 473d li a4,15 + 3001974: 00f717b3 sll a5,a4,a5 + 3001978: fff7c793 not a5,a5 + 300197c: fb442703 lw a4,-76(s0) + 3001980: 8ff9 and a5,a5,a4 + 3001982: faf42a23 sw a5,-76(s0) + 3001986: f9c42783 lw a5,-100(s0) + 300198a: 078a slli a5,a5,0x2 + 300198c: 8bf1 andi a5,a5,28 + 300198e: f9842703 lw a4,-104(s0) + 3001992: 00f717b3 sll a5,a4,a5 + 3001996: fb442703 lw a4,-76(s0) + 300199a: 8fd9 or a5,a5,a4 + 300199c: faf42a23 sw a5,-76(s0) + 30019a0: fb442783 lw a5,-76(s0) + 30019a4: 82be mv t0,a5 + 30019a6: bc129073 csrw 0xbc1,t0 + 30019aa: aafd j 3001ba8 + 30019ac: bc2027f3 csrr a5,0xbc2 + 30019b0: fcf42023 sw a5,-64(s0) + 30019b4: fc042783 lw a5,-64(s0) + 30019b8: faf42e23 sw a5,-68(s0) + 30019bc: f9c42783 lw a5,-100(s0) + 30019c0: 078a slli a5,a5,0x2 + 30019c2: 8bf1 andi a5,a5,28 + 30019c4: 473d li a4,15 + 30019c6: 00f717b3 sll a5,a4,a5 + 30019ca: fff7c793 not a5,a5 + 30019ce: fbc42703 lw a4,-68(s0) + 30019d2: 8ff9 and a5,a5,a4 + 30019d4: faf42e23 sw a5,-68(s0) + 30019d8: f9c42783 lw a5,-100(s0) + 30019dc: 078a slli a5,a5,0x2 + 30019de: 8bf1 andi a5,a5,28 + 30019e0: f9842703 lw a4,-104(s0) + 30019e4: 00f717b3 sll a5,a4,a5 + 30019e8: fbc42703 lw a4,-68(s0) + 30019ec: 8fd9 or a5,a5,a4 + 30019ee: faf42e23 sw a5,-68(s0) + 30019f2: fbc42783 lw a5,-68(s0) + 30019f6: 82be mv t0,a5 + 30019f8: bc229073 csrw 0xbc2,t0 + 30019fc: a275 j 3001ba8 + 30019fe: bc3027f3 csrr a5,0xbc3 + 3001a02: fcf42423 sw a5,-56(s0) + 3001a06: fc842783 lw a5,-56(s0) + 3001a0a: fcf42223 sw a5,-60(s0) + 3001a0e: f9c42783 lw a5,-100(s0) + 3001a12: 078a slli a5,a5,0x2 + 3001a14: 8bf1 andi a5,a5,28 + 3001a16: 473d li a4,15 + 3001a18: 00f717b3 sll a5,a4,a5 + 3001a1c: fff7c793 not a5,a5 + 3001a20: fc442703 lw a4,-60(s0) + 3001a24: 8ff9 and a5,a5,a4 + 3001a26: fcf42223 sw a5,-60(s0) + 3001a2a: f9c42783 lw a5,-100(s0) + 3001a2e: 078a slli a5,a5,0x2 + 3001a30: 8bf1 andi a5,a5,28 + 3001a32: f9842703 lw a4,-104(s0) + 3001a36: 00f717b3 sll a5,a4,a5 + 3001a3a: fc442703 lw a4,-60(s0) + 3001a3e: 8fd9 or a5,a5,a4 + 3001a40: fcf42223 sw a5,-60(s0) + 3001a44: fc442783 lw a5,-60(s0) + 3001a48: 82be mv t0,a5 + 3001a4a: bc329073 csrw 0xbc3,t0 + 3001a4e: aaa9 j 3001ba8 + 3001a50: bc4027f3 csrr a5,0xbc4 + 3001a54: fcf42823 sw a5,-48(s0) + 3001a58: fd042783 lw a5,-48(s0) + 3001a5c: fcf42623 sw a5,-52(s0) + 3001a60: f9c42783 lw a5,-100(s0) + 3001a64: 078a slli a5,a5,0x2 + 3001a66: 8bf1 andi a5,a5,28 + 3001a68: 473d li a4,15 + 3001a6a: 00f717b3 sll a5,a4,a5 + 3001a6e: fff7c793 not a5,a5 + 3001a72: fcc42703 lw a4,-52(s0) + 3001a76: 8ff9 and a5,a5,a4 + 3001a78: fcf42623 sw a5,-52(s0) + 3001a7c: f9c42783 lw a5,-100(s0) + 3001a80: 078a slli a5,a5,0x2 + 3001a82: 8bf1 andi a5,a5,28 + 3001a84: f9842703 lw a4,-104(s0) + 3001a88: 00f717b3 sll a5,a4,a5 + 3001a8c: fcc42703 lw a4,-52(s0) + 3001a90: 8fd9 or a5,a5,a4 + 3001a92: fcf42623 sw a5,-52(s0) + 3001a96: fcc42783 lw a5,-52(s0) + 3001a9a: 82be mv t0,a5 + 3001a9c: bc429073 csrw 0xbc4,t0 + 3001aa0: a221 j 3001ba8 + 3001aa2: bc5027f3 csrr a5,0xbc5 + 3001aa6: fcf42c23 sw a5,-40(s0) + 3001aaa: fd842783 lw a5,-40(s0) + 3001aae: fcf42a23 sw a5,-44(s0) + 3001ab2: f9c42783 lw a5,-100(s0) + 3001ab6: 078a slli a5,a5,0x2 + 3001ab8: 8bf1 andi a5,a5,28 + 3001aba: 473d li a4,15 + 3001abc: 00f717b3 sll a5,a4,a5 + 3001ac0: fff7c793 not a5,a5 + 3001ac4: fd442703 lw a4,-44(s0) + 3001ac8: 8ff9 and a5,a5,a4 + 3001aca: fcf42a23 sw a5,-44(s0) + 3001ace: f9c42783 lw a5,-100(s0) + 3001ad2: 078a slli a5,a5,0x2 + 3001ad4: 8bf1 andi a5,a5,28 + 3001ad6: f9842703 lw a4,-104(s0) + 3001ada: 00f717b3 sll a5,a4,a5 + 3001ade: fd442703 lw a4,-44(s0) + 3001ae2: 8fd9 or a5,a5,a4 + 3001ae4: fcf42a23 sw a5,-44(s0) + 3001ae8: fd442783 lw a5,-44(s0) + 3001aec: 82be mv t0,a5 + 3001aee: bc529073 csrw 0xbc5,t0 + 3001af2: a85d j 3001ba8 + 3001af4: bc6027f3 csrr a5,0xbc6 + 3001af8: fef42023 sw a5,-32(s0) + 3001afc: fe042783 lw a5,-32(s0) + 3001b00: fcf42e23 sw a5,-36(s0) + 3001b04: f9c42783 lw a5,-100(s0) + 3001b08: 078a slli a5,a5,0x2 + 3001b0a: 8bf1 andi a5,a5,28 + 3001b0c: 473d li a4,15 + 3001b0e: 00f717b3 sll a5,a4,a5 + 3001b12: fff7c793 not a5,a5 + 3001b16: fdc42703 lw a4,-36(s0) + 3001b1a: 8ff9 and a5,a5,a4 + 3001b1c: fcf42e23 sw a5,-36(s0) + 3001b20: f9c42783 lw a5,-100(s0) + 3001b24: 078a slli a5,a5,0x2 + 3001b26: 8bf1 andi a5,a5,28 + 3001b28: f9842703 lw a4,-104(s0) + 3001b2c: 00f717b3 sll a5,a4,a5 + 3001b30: fdc42703 lw a4,-36(s0) + 3001b34: 8fd9 or a5,a5,a4 + 3001b36: fcf42e23 sw a5,-36(s0) + 3001b3a: fdc42783 lw a5,-36(s0) + 3001b3e: 82be mv t0,a5 + 3001b40: bc629073 csrw 0xbc6,t0 + 3001b44: a095 j 3001ba8 + 3001b46: bc7027f3 csrr a5,0xbc7 + 3001b4a: fef42423 sw a5,-24(s0) + 3001b4e: fe842783 lw a5,-24(s0) + 3001b52: fef42223 sw a5,-28(s0) + 3001b56: f9c42783 lw a5,-100(s0) + 3001b5a: 078a slli a5,a5,0x2 + 3001b5c: 8bf1 andi a5,a5,28 + 3001b5e: 473d li a4,15 + 3001b60: 00f717b3 sll a5,a4,a5 + 3001b64: fff7c793 not a5,a5 + 3001b68: fe442703 lw a4,-28(s0) + 3001b6c: 8ff9 and a5,a5,a4 + 3001b6e: fef42223 sw a5,-28(s0) + 3001b72: f9c42783 lw a5,-100(s0) + 3001b76: 078a slli a5,a5,0x2 + 3001b78: 8bf1 andi a5,a5,28 + 3001b7a: f9842703 lw a4,-104(s0) + 3001b7e: 00f717b3 sll a5,a4,a5 + 3001b82: fe442703 lw a4,-28(s0) + 3001b86: 8fd9 or a5,a5,a4 + 3001b88: fef42223 sw a5,-28(s0) + 3001b8c: fe442783 lw a5,-28(s0) + 3001b90: 82be mv t0,a5 + 3001b92: bc729073 csrw 0xbc7,t0 + 3001b96: a809 j 3001ba8 + 3001b98: f9842603 lw a2,-104(s0) + 3001b9c: f9c42583 lw a1,-100(s0) + 3001ba0: fec42503 lw a0,-20(s0) + 3001ba4: 3485 jal ra,3001604 + 3001ba6: 0001 nop + 3001ba8: 0001 nop + 3001baa: 50b6 lw ra,108(sp) + 3001bac: 5426 lw s0,104(sp) + 3001bae: 6165 addi sp,sp,112 + 3001bb0: 8082 ret + +03001bb2 : + 3001bb2: 1101 addi sp,sp,-32 + 3001bb4: ce06 sw ra,28(sp) + 3001bb6: cc22 sw s0,24(sp) + 3001bb8: 1000 addi s0,sp,32 + 3001bba: fea42623 sw a0,-20(s0) + 3001bbe: feb42423 sw a1,-24(s0) + 3001bc2: fec42703 lw a4,-20(s0) + 3001bc6: 47e5 li a5,25 + 3001bc8: 00e7f863 bgeu a5,a4,3001bd8 + 3001bcc: fec42703 lw a4,-20(s0) + 3001bd0: 07200793 li a5,114 + 3001bd4: 00e7fb63 bgeu a5,a4,3001bea + 3001bd8: 18c00593 li a1,396 + 3001bdc: 0300f7b7 lui a5,0x300f + 3001be0: 01078513 addi a0,a5,16 # 300f010 + 3001be4: 219d jal ra,300204a + 3001be6: 4789 li a5,2 + 3001be8: a815 j 3001c1c + 3001bea: fe842783 lw a5,-24(s0) + 3001bee: c791 beqz a5,3001bfa + 3001bf0: fe842703 lw a4,-24(s0) + 3001bf4: 47bd li a5,15 + 3001bf6: 00e7fb63 bgeu a5,a4,3001c0c + 3001bfa: 18d00593 li a1,397 + 3001bfe: 0300f7b7 lui a5,0x300f + 3001c02: 01078513 addi a0,a5,16 # 300f010 + 3001c06: 2191 jal ra,300204a + 3001c08: 4795 li a5,5 + 3001c0a: a809 j 3001c1c + 3001c0c: fec42783 lw a5,-20(s0) + 3001c10: 1799 addi a5,a5,-26 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853e mv a0,a5 + 3001c18: 395d jal ra,30018ce + 3001c1a: 4781 li a5,0 + 3001c1c: 853e mv a0,a5 + 3001c1e: 40f2 lw ra,28(sp) + 3001c20: 4462 lw s0,24(sp) + 3001c22: 6105 addi sp,sp,32 + 3001c24: 8082 ret + +03001c26 : + 3001c26: 1101 addi sp,sp,-32 + 3001c28: ce22 sw s0,28(sp) + 3001c2a: 1000 addi s0,sp,32 + 3001c2c: fea42623 sw a0,-20(s0) + 3001c30: 0001 nop + 3001c32: 4472 lw s0,28(sp) + 3001c34: 6105 addi sp,sp,32 + 3001c36: 8082 ret + +03001c38 : + 3001c38: 1101 addi sp,sp,-32 + 3001c3a: ce22 sw s0,28(sp) + 3001c3c: 1000 addi s0,sp,32 + 3001c3e: fea42623 sw a0,-20(s0) + 3001c42: feb42423 sw a1,-24(s0) + 3001c46: fec42223 sw a2,-28(s0) + 3001c4a: f1818713 addi a4,gp,-232 # 400054c + 3001c4e: fec42783 lw a5,-20(s0) + 3001c52: 078e slli a5,a5,0x3 + 3001c54: 97ba add a5,a5,a4 + 3001c56: fe442703 lw a4,-28(s0) + 3001c5a: c3d8 sw a4,4(a5) + 3001c5c: f1818713 addi a4,gp,-232 # 400054c + 3001c60: fec42783 lw a5,-20(s0) + 3001c64: 078e slli a5,a5,0x3 + 3001c66: 97ba add a5,a5,a4 + 3001c68: fe842703 lw a4,-24(s0) + 3001c6c: c398 sw a4,0(a5) + 3001c6e: 0001 nop + 3001c70: 4472 lw s0,28(sp) + 3001c72: 6105 addi sp,sp,32 + 3001c74: 8082 ret + +03001c76 : + 3001c76: 1141 addi sp,sp,-16 + 3001c78: c622 sw s0,12(sp) + 3001c7a: 0800 addi s0,sp,16 + 3001c7c: 101007b7 lui a5,0x10100 + 3001c80: 43f8 lw a4,68(a5) + 3001c82: 67c1 lui a5,0x10 + 3001c84: 17f9 addi a5,a5,-2 # fffe + 3001c86: 00f776b3 and a3,a4,a5 + 3001c8a: 101007b7 lui a5,0x10100 + 3001c8e: ea510737 lui a4,0xea510 + 3001c92: 9736 add a4,a4,a3 + 3001c94: c3f8 sw a4,68(a5) + 3001c96: 0001 nop + 3001c98: 4432 lw s0,12(sp) + 3001c9a: 0141 addi sp,sp,16 + 3001c9c: 8082 ret + +03001c9e : + 3001c9e: 1141 addi sp,sp,-16 + 3001ca0: c622 sw s0,12(sp) + 3001ca2: 0800 addi s0,sp,16 + 3001ca4: 101007b7 lui a5,0x10100 + 3001ca8: 43f8 lw a4,68(a5) + 3001caa: 67c1 lui a5,0x10 + 3001cac: 17fd addi a5,a5,-1 # ffff + 3001cae: 8ff9 and a5,a5,a4 + 3001cb0: 0017e693 ori a3,a5,1 + 3001cb4: 101007b7 lui a5,0x10100 + 3001cb8: ea510737 lui a4,0xea510 + 3001cbc: 9736 add a4,a4,a3 + 3001cbe: c3f8 sw a4,68(a5) + 3001cc0: 0001 nop + 3001cc2: 4432 lw s0,12(sp) + 3001cc4: 0141 addi sp,sp,16 + 3001cc6: 8082 ret + +03001cc8 : + 3001cc8: 1101 addi sp,sp,-32 + 3001cca: ce22 sw s0,28(sp) + 3001ccc: 1000 addi s0,sp,32 + 3001cce: fea42623 sw a0,-20(s0) + 3001cd2: fec42783 lw a5,-20(s0) + 3001cd6: c791 beqz a5,3001ce2 + 3001cd8: fec42703 lw a4,-20(s0) + 3001cdc: 4785 li a5,1 + 3001cde: 00f71463 bne a4,a5,3001ce6 + 3001ce2: 4785 li a5,1 + 3001ce4: a011 j 3001ce8 + 3001ce6: 4781 li a5,0 + 3001ce8: 8b85 andi a5,a5,1 + 3001cea: 9f81 uxtb a5 + 3001cec: 853e mv a0,a5 + 3001cee: 4472 lw s0,28(sp) + 3001cf0: 6105 addi sp,sp,32 + 3001cf2: 8082 ret + +03001cf4 : + 3001cf4: 1101 addi sp,sp,-32 + 3001cf6: ce22 sw s0,28(sp) + 3001cf8: 1000 addi s0,sp,32 + 3001cfa: fea42623 sw a0,-20(s0) + 3001cfe: fec42783 lw a5,-20(s0) + 3001d02: 0087b793 sltiu a5,a5,8 + 3001d06: 9f81 uxtb a5 + 3001d08: 853e mv a0,a5 + 3001d0a: 4472 lw s0,28(sp) + 3001d0c: 6105 addi sp,sp,32 + 3001d0e: 8082 ret + +03001d10 : + 3001d10: 1101 addi sp,sp,-32 + 3001d12: ce22 sw s0,28(sp) + 3001d14: 1000 addi s0,sp,32 + 3001d16: fea42623 sw a0,-20(s0) + 3001d1a: fec42783 lw a5,-20(s0) + 3001d1e: 0087b793 sltiu a5,a5,8 + 3001d22: 9f81 uxtb a5 + 3001d24: 853e mv a0,a5 + 3001d26: 4472 lw s0,28(sp) + 3001d28: 6105 addi sp,sp,32 + 3001d2a: 8082 ret + +03001d2c : + 3001d2c: 1101 addi sp,sp,-32 + 3001d2e: ce22 sw s0,28(sp) + 3001d30: 1000 addi s0,sp,32 + 3001d32: fea42623 sw a0,-20(s0) + 3001d36: fec42783 lw a5,-20(s0) + 3001d3a: 0087b793 sltiu a5,a5,8 + 3001d3e: 9f81 uxtb a5 + 3001d40: 853e mv a0,a5 + 3001d42: 4472 lw s0,28(sp) + 3001d44: 6105 addi sp,sp,32 + 3001d46: 8082 ret + +03001d48 : + 3001d48: 1101 addi sp,sp,-32 + 3001d4a: ce22 sw s0,28(sp) + 3001d4c: 1000 addi s0,sp,32 + 3001d4e: fea42623 sw a0,-20(s0) + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0807b793 sltiu a5,a5,128 + 3001d5a: 9f81 uxtb a5 + 3001d5c: 853e mv a0,a5 + 3001d5e: 4472 lw s0,28(sp) + 3001d60: 6105 addi sp,sp,32 + 3001d62: 8082 ret + +03001d64 : + 3001d64: 1101 addi sp,sp,-32 + 3001d66: ce22 sw s0,28(sp) + 3001d68: 1000 addi s0,sp,32 + 3001d6a: fea42623 sw a0,-20(s0) + 3001d6e: fec42783 lw a5,-20(s0) + 3001d72: cb99 beqz a5,3001d88 + 3001d74: fec42703 lw a4,-20(s0) + 3001d78: 4785 li a5,1 + 3001d7a: 00f70763 beq a4,a5,3001d88 + 3001d7e: fec42703 lw a4,-20(s0) + 3001d82: 4789 li a5,2 + 3001d84: 00f71463 bne a4,a5,3001d8c + 3001d88: 4785 li a5,1 + 3001d8a: a011 j 3001d8e + 3001d8c: 4781 li a5,0 + 3001d8e: 8b85 andi a5,a5,1 + 3001d90: 9f81 uxtb a5 + 3001d92: 853e mv a0,a5 + 3001d94: 4472 lw s0,28(sp) + 3001d96: 6105 addi sp,sp,32 + 3001d98: 8082 ret + +03001d9a : + 3001d9a: 1101 addi sp,sp,-32 + 3001d9c: ce22 sw s0,28(sp) + 3001d9e: 1000 addi s0,sp,32 + 3001da0: fea42623 sw a0,-20(s0) + 3001da4: fec42783 lw a5,-20(s0) + 3001da8: c791 beqz a5,3001db4 + 3001daa: fec42703 lw a4,-20(s0) + 3001dae: 4785 li a5,1 + 3001db0: 00f71463 bne a4,a5,3001db8 + 3001db4: 4785 li a5,1 + 3001db6: a011 j 3001dba + 3001db8: 4781 li a5,0 + 3001dba: 8b85 andi a5,a5,1 + 3001dbc: 9f81 uxtb a5 + 3001dbe: 853e mv a0,a5 + 3001dc0: 4472 lw s0,28(sp) + 3001dc2: 6105 addi sp,sp,32 + 3001dc4: 8082 ret + +03001dc6 : + 3001dc6: 1101 addi sp,sp,-32 + 3001dc8: ce22 sw s0,28(sp) + 3001dca: 1000 addi s0,sp,32 + 3001dcc: fea42623 sw a0,-20(s0) + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 0407b793 sltiu a5,a5,64 + 3001dd8: 9f81 uxtb a5 + 3001dda: 853e mv a0,a5 + 3001ddc: 4472 lw s0,28(sp) + 3001dde: 6105 addi sp,sp,32 + 3001de0: 8082 ret + +03001de2 : + 3001de2: 7179 addi sp,sp,-48 + 3001de4: d622 sw s0,44(sp) + 3001de6: 1800 addi s0,sp,48 + 3001de8: fca42e23 sw a0,-36(s0) + 3001dec: fcb42c23 sw a1,-40(s0) + 3001df0: fdc42783 lw a5,-36(s0) + 3001df4: fef42623 sw a5,-20(s0) + 3001df8: fd842783 lw a5,-40(s0) + 3001dfc: cb89 beqz a5,3001e0e + 3001dfe: fec42703 lw a4,-20(s0) + 3001e02: fd842783 lw a5,-40(s0) + 3001e06: 02f757b3 divu a5,a4,a5 + 3001e0a: fef42623 sw a5,-20(s0) + 3001e0e: fec42703 lw a4,-20(s0) + 3001e12: 003d17b7 lui a5,0x3d1 + 3001e16: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3001e1a: 00e7fc63 bgeu a5,a4,3001e32 + 3001e1e: fec42703 lw a4,-20(s0) + 3001e22: 007277b7 lui a5,0x727 + 3001e26: 0e078793 addi a5,a5,224 # 7270e0 + 3001e2a: 00e7e463 bltu a5,a4,3001e32 + 3001e2e: 4785 li a5,1 + 3001e30: a011 j 3001e34 + 3001e32: 4781 li a5,0 + 3001e34: 8b85 andi a5,a5,1 + 3001e36: 9f81 uxtb a5 + 3001e38: 853e mv a0,a5 + 3001e3a: 5432 lw s0,44(sp) + 3001e3c: 6145 addi sp,sp,48 + 3001e3e: 8082 ret + +03001e40 : + 3001e40: 7179 addi sp,sp,-48 + 3001e42: d622 sw s0,44(sp) + 3001e44: 1800 addi s0,sp,48 + 3001e46: fca42e23 sw a0,-36(s0) + 3001e4a: fcb42c23 sw a1,-40(s0) + 3001e4e: fdc42703 lw a4,-36(s0) + 3001e52: 01c9c7b7 lui a5,0x1c9c + 3001e56: 38078793 addi a5,a5,896 # 1c9c380 + 3001e5a: 00e7f463 bgeu a5,a4,3001e62 + 3001e5e: 4781 li a5,0 + 3001e60: a08d j 3001ec2 + 3001e62: fd842703 lw a4,-40(s0) + 3001e66: 07f00793 li a5,127 + 3001e6a: 00e7f463 bgeu a5,a4,3001e72 + 3001e6e: 4781 li a5,0 + 3001e70: a889 j 3001ec2 + 3001e72: fd842703 lw a4,-40(s0) + 3001e76: 4799 li a5,6 + 3001e78: 00e7f963 bgeu a5,a4,3001e8a + 3001e7c: fdc42703 lw a4,-36(s0) + 3001e80: fd842783 lw a5,-40(s0) + 3001e84: 02f707b3 mul a5,a4,a5 + 3001e88: a031 j 3001e94 + 3001e8a: fdc42703 lw a4,-36(s0) + 3001e8e: 4799 li a5,6 + 3001e90: 02f707b3 mul a5,a4,a5 + 3001e94: fef42623 sw a5,-20(s0) + 3001e98: fec42703 lw a4,-20(s0) + 3001e9c: 05f5e7b7 lui a5,0x5f5e + 3001ea0: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3001ea4: 00e7fc63 bgeu a5,a4,3001ebc + 3001ea8: fec42703 lw a4,-20(s0) + 3001eac: 11e1a7b7 lui a5,0x11e1a + 3001eb0: 30078793 addi a5,a5,768 # 11e1a300 + 3001eb4: 00e7e463 bltu a5,a4,3001ebc + 3001eb8: 4785 li a5,1 + 3001eba: a011 j 3001ebe + 3001ebc: 4781 li a5,0 + 3001ebe: 8b85 andi a5,a5,1 + 3001ec0: 9f81 uxtb a5 + 3001ec2: 853e mv a0,a5 + 3001ec4: 5432 lw s0,44(sp) + 3001ec6: 6145 addi sp,sp,48 + 3001ec8: 8082 ret + +03001eca : + 3001eca: 7179 addi sp,sp,-48 + 3001ecc: d622 sw s0,44(sp) + 3001ece: 1800 addi s0,sp,48 + 3001ed0: fca42e23 sw a0,-36(s0) + 3001ed4: fcb42c23 sw a1,-40(s0) + 3001ed8: fdc42783 lw a5,-36(s0) + 3001edc: fef42623 sw a5,-20(s0) + 3001ee0: fd842783 lw a5,-40(s0) + 3001ee4: cb91 beqz a5,3001ef8 + 3001ee6: fd842783 lw a5,-40(s0) + 3001eea: 0785 addi a5,a5,1 + 3001eec: fec42703 lw a4,-20(s0) + 3001ef0: 02f757b3 divu a5,a4,a5 + 3001ef4: fef42623 sw a5,-20(s0) + 3001ef8: fec42703 lw a4,-20(s0) + 3001efc: 08f0d7b7 lui a5,0x8f0d + 3001f00: 18178793 addi a5,a5,385 # 8f0d181 + 3001f04: 00f737b3 sltu a5,a4,a5 + 3001f08: 9f81 uxtb a5 + 3001f0a: 853e mv a0,a5 + 3001f0c: 5432 lw s0,44(sp) + 3001f0e: 6145 addi sp,sp,48 + 3001f10: 8082 ret + +03001f12 : + 3001f12: 7179 addi sp,sp,-48 + 3001f14: d622 sw s0,44(sp) + 3001f16: 1800 addi s0,sp,48 + 3001f18: fca42e23 sw a0,-36(s0) + 3001f1c: fcb42c23 sw a1,-40(s0) + 3001f20: fdc42783 lw a5,-36(s0) + 3001f24: fef42623 sw a5,-20(s0) + 3001f28: fd842783 lw a5,-40(s0) + 3001f2c: cb91 beqz a5,3001f40 + 3001f2e: fd842783 lw a5,-40(s0) + 3001f32: 0785 addi a5,a5,1 + 3001f34: fec42703 lw a4,-20(s0) + 3001f38: 02f757b3 divu a5,a4,a5 + 3001f3c: fef42623 sw a5,-20(s0) + 3001f40: fec42703 lw a4,-20(s0) + 3001f44: 05f5e7b7 lui a5,0x5f5e + 3001f48: 10178793 addi a5,a5,257 # 5f5e101 + 3001f4c: 00f737b3 sltu a5,a4,a5 + 3001f50: 9f81 uxtb a5 + 3001f52: 853e mv a0,a5 + 3001f54: 5432 lw s0,44(sp) + 3001f56: 6145 addi sp,sp,48 + 3001f58: 8082 ret + +03001f5a : + 3001f5a: 1101 addi sp,sp,-32 + 3001f5c: ce22 sw s0,28(sp) + 3001f5e: 1000 addi s0,sp,32 + 3001f60: fea42623 sw a0,-20(s0) + 3001f64: fec42783 lw a5,-20(s0) + 3001f68: c385 beqz a5,3001f88 + 3001f6a: fec42703 lw a4,-20(s0) + 3001f6e: 4785 li a5,1 + 3001f70: 00f70c63 beq a4,a5,3001f88 + 3001f74: fec42703 lw a4,-20(s0) + 3001f78: 4789 li a5,2 + 3001f7a: 00f70763 beq a4,a5,3001f88 + 3001f7e: fec42703 lw a4,-20(s0) + 3001f82: 478d li a5,3 + 3001f84: 00f71463 bne a4,a5,3001f8c + 3001f88: 4785 li a5,1 + 3001f8a: a011 j 3001f8e + 3001f8c: 4781 li a5,0 + 3001f8e: 8b85 andi a5,a5,1 + 3001f90: 9f81 uxtb a5 + 3001f92: 853e mv a0,a5 + 3001f94: 4472 lw s0,28(sp) + 3001f96: 6105 addi sp,sp,32 + 3001f98: 8082 ret + +03001f9a : + 3001f9a: 1101 addi sp,sp,-32 + 3001f9c: ce22 sw s0,28(sp) + 3001f9e: 1000 addi s0,sp,32 + 3001fa0: fea42623 sw a0,-20(s0) + 3001fa4: fec42783 lw a5,-20(s0) + 3001fa8: c385 beqz a5,3001fc8 + 3001faa: fec42703 lw a4,-20(s0) + 3001fae: 4785 li a5,1 + 3001fb0: 00f70c63 beq a4,a5,3001fc8 + 3001fb4: fec42703 lw a4,-20(s0) + 3001fb8: 4789 li a5,2 + 3001fba: 00f70763 beq a4,a5,3001fc8 + 3001fbe: fec42703 lw a4,-20(s0) + 3001fc2: 478d li a5,3 + 3001fc4: 00f71463 bne a4,a5,3001fcc + 3001fc8: 4785 li a5,1 + 3001fca: a011 j 3001fce + 3001fcc: 4781 li a5,0 + 3001fce: 8b85 andi a5,a5,1 + 3001fd0: 9f81 uxtb a5 + 3001fd2: 853e mv a0,a5 + 3001fd4: 4472 lw s0,28(sp) + 3001fd6: 6105 addi sp,sp,32 + 3001fd8: 8082 ret + +03001fda : + 3001fda: 1101 addi sp,sp,-32 + 3001fdc: ce06 sw ra,28(sp) + 3001fde: cc22 sw s0,24(sp) + 3001fe0: 1000 addi s0,sp,32 + 3001fe2: fea42623 sw a0,-20(s0) + 3001fe6: feb42423 sw a1,-24(s0) + 3001fea: fec42703 lw a4,-20(s0) + 3001fee: 100007b7 lui a5,0x10000 + 3001ff2: 00f70a63 beq a4,a5,3002006 + 3001ff6: 64b00593 li a1,1611 + 3001ffa: 0300f7b7 lui a5,0x300f + 3001ffe: 07078513 addi a0,a5,112 # 300f070 + 3002002: 20a1 jal ra,300204a + 3002004: a001 j 3002004 + 3002006: fe842503 lw a0,-24(s0) + 300200a: 3ba9 jal ra,3001d64 + 300200c: 87aa mv a5,a0 + 300200e: 0017c793 xori a5,a5,1 + 3002012: 9f81 uxtb a5 + 3002014: cb89 beqz a5,3002026 + 3002016: 64c00593 li a1,1612 + 300201a: 0300f7b7 lui a5,0x300f + 300201e: 07078513 addi a0,a5,112 # 300f070 + 3002022: 2025 jal ra,300204a + 3002024: a839 j 3002042 + 3002026: fe842783 lw a5,-24(s0) + 300202a: 8b8d andi a5,a5,3 + 300202c: 0ff7f693 andi a3,a5,255 + 3002030: fec42703 lw a4,-20(s0) + 3002034: 10072783 lw a5,256(a4) # ea510100 + 3002038: 8a8d andi a3,a3,3 + 300203a: 9bf1 andi a5,a5,-4 + 300203c: 8fd5 or a5,a5,a3 + 300203e: 10f72023 sw a5,256(a4) + 3002042: 40f2 lw ra,28(sp) + 3002044: 4462 lw s0,24(sp) + 3002046: 6105 addi sp,sp,32 + 3002048: 8082 ret + +0300204a : + 300204a: 9a6ff06f j 30011f0 + +0300204e : + 300204e: 7179 addi sp,sp,-48 + 3002050: d606 sw ra,44(sp) + 3002052: d422 sw s0,40(sp) + 3002054: 1800 addi s0,sp,48 + 3002056: fca42e23 sw a0,-36(s0) + 300205a: fdc42783 lw a5,-36(s0) + 300205e: eb89 bnez a5,3002070 + 3002060: 07100593 li a1,113 + 3002064: 0300f7b7 lui a5,0x300f + 3002068: 08c78513 addi a0,a5,140 # 300f08c + 300206c: 3ff9 jal ra,300204a + 300206e: a001 j 300206e + 3002070: fdc42783 lw a5,-36(s0) + 3002074: 4398 lw a4,0(a5) + 3002076: 100007b7 lui a5,0x10000 + 300207a: 00f70a63 beq a4,a5,300208e + 300207e: 07200593 li a1,114 + 3002082: 0300f7b7 lui a5,0x300f + 3002086: 08c78513 addi a0,a5,140 # 300f08c + 300208a: 37c1 jal ra,300204a + 300208c: a001 j 300208c + 300208e: fdc42783 lw a5,-36(s0) + 3002092: 43dc lw a5,4(a5) + 3002094: 853e mv a0,a5 + 3002096: 390d jal ra,3001cc8 + 3002098: 87aa mv a5,a0 + 300209a: 0017c793 xori a5,a5,1 + 300209e: 9f81 uxtb a5 + 30020a0: cb91 beqz a5,30020b4 + 30020a2: 07400593 li a1,116 + 30020a6: 0300f7b7 lui a5,0x300f + 30020aa: 08c78513 addi a0,a5,140 # 300f08c + 30020ae: 3f71 jal ra,300204a + 30020b0: 4785 li a5,1 + 30020b2: ac89 j 3002304 + 30020b4: fdc42783 lw a5,-36(s0) + 30020b8: 479c lw a5,8(a5) + 30020ba: 853e mv a0,a5 + 30020bc: 3925 jal ra,3001cf4 + 30020be: 87aa mv a5,a0 + 30020c0: 0017c793 xori a5,a5,1 + 30020c4: 9f81 uxtb a5 + 30020c6: cb91 beqz a5,30020da + 30020c8: 07500593 li a1,117 + 30020cc: 0300f7b7 lui a5,0x300f + 30020d0: 08c78513 addi a0,a5,140 # 300f08c + 30020d4: 3f9d jal ra,300204a + 30020d6: 4785 li a5,1 + 30020d8: a435 j 3002304 + 30020da: fdc42783 lw a5,-36(s0) + 30020de: 47dc lw a5,12(a5) + 30020e0: 853e mv a0,a5 + 30020e2: 319d jal ra,3001d48 + 30020e4: 87aa mv a5,a0 + 30020e6: 0017c793 xori a5,a5,1 + 30020ea: 9f81 uxtb a5 + 30020ec: cb91 beqz a5,3002100 + 30020ee: 07600593 li a1,118 + 30020f2: 0300f7b7 lui a5,0x300f + 30020f6: 08c78513 addi a0,a5,140 # 300f08c + 30020fa: 3f81 jal ra,300204a + 30020fc: 4785 li a5,1 + 30020fe: a419 j 3002304 + 3002100: fdc42783 lw a5,-36(s0) + 3002104: 4b9c lw a5,16(a5) + 3002106: 853e mv a0,a5 + 3002108: 3121 jal ra,3001d10 + 300210a: 87aa mv a5,a0 + 300210c: 0017c793 xori a5,a5,1 + 3002110: 9f81 uxtb a5 + 3002112: cb91 beqz a5,3002126 + 3002114: 07700593 li a1,119 + 3002118: 0300f7b7 lui a5,0x300f + 300211c: 08c78513 addi a0,a5,140 # 300f08c + 3002120: 372d jal ra,300204a + 3002122: 4785 li a5,1 + 3002124: a2c5 j 3002304 + 3002126: fdc42783 lw a5,-36(s0) + 300212a: 4fdc lw a5,28(a5) + 300212c: 853e mv a0,a5 + 300212e: 3efd jal ra,3001d2c + 3002130: 87aa mv a5,a0 + 3002132: 0017c793 xori a5,a5,1 + 3002136: 9f81 uxtb a5 + 3002138: cb91 beqz a5,300214c + 300213a: 07800593 li a1,120 + 300213e: 0300f7b7 lui a5,0x300f + 3002142: 08c78513 addi a0,a5,140 # 300f08c + 3002146: 3711 jal ra,300204a + 3002148: 4785 li a5,1 + 300214a: aa6d j 3002304 + 300214c: fdc42783 lw a5,-36(s0) + 3002150: 539c lw a5,32(a5) + 3002152: 853e mv a0,a5 + 3002154: 3199 jal ra,3001d9a + 3002156: 87aa mv a5,a0 + 3002158: 0017c793 xori a5,a5,1 + 300215c: 9f81 uxtb a5 + 300215e: cb91 beqz a5,3002172 + 3002160: 07a00593 li a1,122 + 3002164: 0300f7b7 lui a5,0x300f + 3002168: 08c78513 addi a0,a5,140 # 300f08c + 300216c: 3df9 jal ra,300204a + 300216e: 4785 li a5,1 + 3002170: aa51 j 3002304 + 3002172: fdc42783 lw a5,-36(s0) + 3002176: 53dc lw a5,36(a5) + 3002178: 853e mv a0,a5 + 300217a: 31b1 jal ra,3001dc6 + 300217c: 87aa mv a5,a0 + 300217e: 0017c793 xori a5,a5,1 + 3002182: 9f81 uxtb a5 + 3002184: cb91 beqz a5,3002198 + 3002186: 07b00593 li a1,123 + 300218a: 0300f7b7 lui a5,0x300f + 300218e: 08c78513 addi a0,a5,140 # 300f08c + 3002192: 3d65 jal ra,300204a + 3002194: 4785 li a5,1 + 3002196: a2bd j 3002304 + 3002198: fdc42783 lw a5,-36(s0) + 300219c: 4f9c lw a5,24(a5) + 300219e: 853e mv a0,a5 + 30021a0: 36d1 jal ra,3001d64 + 30021a2: 87aa mv a5,a0 + 30021a4: 0017c793 xori a5,a5,1 + 30021a8: 9f81 uxtb a5 + 30021aa: cb91 beqz a5,30021be + 30021ac: 07c00593 li a1,124 + 30021b0: 0300f7b7 lui a5,0x300f + 30021b4: 08c78513 addi a0,a5,140 # 300f08c + 30021b8: 3d49 jal ra,300204a + 30021ba: 4785 li a5,1 + 30021bc: a2a1 j 3002304 + 30021be: 100017b7 lui a5,0x10001 + 30021c2: f0478793 addi a5,a5,-252 # 10000f04 + 30021c6: 670d lui a4,0x3 + 30021c8: 06e70713 addi a4,a4,110 # 306e + 30021cc: c398 sw a4,0(a5) + 30021ce: fdc42783 lw a5,-36(s0) + 30021d2: 439c lw a5,0(a5) + 30021d4: fef42623 sw a5,-20(s0) + 30021d8: fec42703 lw a4,-20(s0) + 30021dc: 2ae1a823 sw a4,688(gp) # 40008e4 + 30021e0: fdc42503 lw a0,-36(s0) + 30021e4: 2521 jal ra,30027ec + 30021e6: 87aa mv a5,a0 + 30021e8: c399 beqz a5,30021ee + 30021ea: 4785 li a5,1 + 30021ec: aa21 j 3002304 + 30021ee: 3461 jal ra,3001c76 + 30021f0: fdc42783 lw a5,-36(s0) + 30021f4: 43dc lw a5,4(a5) + 30021f6: 8b85 andi a5,a5,1 + 30021f8: 0ff7f693 andi a3,a5,255 + 30021fc: fec42703 lw a4,-20(s0) + 3002200: 431c lw a5,0(a4) + 3002202: 8a85 andi a3,a3,1 + 3002204: 9bf9 andi a5,a5,-2 + 3002206: 8fd5 or a5,a5,a3 + 3002208: c31c sw a5,0(a4) + 300220a: fdc42783 lw a5,-36(s0) + 300220e: 479c lw a5,8(a5) + 3002210: 8bbd andi a5,a5,15 + 3002212: 0ff7f693 andi a3,a5,255 + 3002216: fec42703 lw a4,-20(s0) + 300221a: 435c lw a5,4(a4) + 300221c: 8abd andi a3,a3,15 + 300221e: 9bc1 andi a5,a5,-16 + 3002220: 8fd5 or a5,a5,a3 + 3002222: c35c sw a5,4(a4) + 3002224: fdc42783 lw a5,-36(s0) + 3002228: 47dc lw a5,12(a5) + 300222a: 0ff7f693 andi a3,a5,255 + 300222e: fec42703 lw a4,-20(s0) + 3002232: 471c lw a5,8(a4) + 3002234: 0ff6f693 andi a3,a3,255 + 3002238: f007f793 andi a5,a5,-256 + 300223c: 8fd5 or a5,a5,a3 + 300223e: c71c sw a5,8(a4) + 3002240: fdc42783 lw a5,-36(s0) + 3002244: 4b9c lw a5,16(a5) + 3002246: 8bbd andi a5,a5,15 + 3002248: 0ff7f693 andi a3,a5,255 + 300224c: fec42703 lw a4,-20(s0) + 3002250: 475c lw a5,12(a4) + 3002252: 8abd andi a3,a3,15 + 3002254: 9bc1 andi a5,a5,-16 + 3002256: 8fd5 or a5,a5,a3 + 3002258: c75c sw a5,12(a4) + 300225a: fdc42783 lw a5,-36(s0) + 300225e: 4fdc lw a5,28(a5) + 3002260: 8bbd andi a5,a5,15 + 3002262: 0ff7f693 andi a3,a5,255 + 3002266: fec42703 lw a4,-20(s0) + 300226a: 475c lw a5,12(a4) + 300226c: 8abd andi a3,a3,15 + 300226e: 0692 slli a3,a3,0x4 + 3002270: f0f7f793 andi a5,a5,-241 + 3002274: 8fd5 or a5,a5,a3 + 3002276: c75c sw a5,12(a4) + 3002278: fec42703 lw a4,-20(s0) + 300227c: 4b1c lw a5,16(a4) + 300227e: 9bf9 andi a5,a5,-2 + 3002280: cb1c sw a5,16(a4) + 3002282: 0001 nop + 3002284: fec42783 lw a5,-20(s0) + 3002288: 4fdc lw a5,28(a5) + 300228a: 8b85 andi a5,a5,1 + 300228c: 0ff7f713 andi a4,a5,255 + 3002290: 4785 li a5,1 + 3002292: fef719e3 bne a4,a5,3002284 + 3002296: 3421 jal ra,3001c9e + 3002298: fdc42503 lw a0,-36(s0) + 300229c: 2d09 jal ra,30028ae + 300229e: 87aa mv a5,a0 + 30022a0: c399 beqz a5,30022a6 + 30022a2: 4785 li a5,1 + 30022a4: a085 j 3002304 + 30022a6: 0001 nop + 30022a8: fec42703 lw a4,-20(s0) + 30022ac: 6785 lui a5,0x1 + 30022ae: 97ba add a5,a5,a4 + 30022b0: f107a783 lw a5,-240(a5) # f10 + 30022b4: 8b85 andi a5,a5,1 + 30022b6: 0ff7f713 andi a4,a5,255 + 30022ba: 4785 li a5,1 + 30022bc: fef716e3 bne a4,a5,30022a8 + 30022c0: fdc42783 lw a5,-36(s0) + 30022c4: 53dc lw a5,36(a5) + 30022c6: 03f7f793 andi a5,a5,63 + 30022ca: 0ff7f693 andi a3,a5,255 + 30022ce: fec42703 lw a4,-20(s0) + 30022d2: 10c72783 lw a5,268(a4) + 30022d6: 03f6f693 andi a3,a3,63 + 30022da: fc07f793 andi a5,a5,-64 + 30022de: 8fd5 or a5,a5,a3 + 30022e0: 10f72623 sw a5,268(a4) + 30022e4: fdc42783 lw a5,-36(s0) + 30022e8: 539c lw a5,32(a5) + 30022ea: 8b85 andi a5,a5,1 + 30022ec: 0ff7f693 andi a3,a5,255 + 30022f0: fec42703 lw a4,-20(s0) + 30022f4: 10872783 lw a5,264(a4) + 30022f8: 8a85 andi a3,a3,1 + 30022fa: 9bf9 andi a5,a5,-2 + 30022fc: 8fd5 or a5,a5,a3 + 30022fe: 10f72423 sw a5,264(a4) + 3002302: 4781 li a5,0 + 3002304: 853e mv a0,a5 + 3002306: 50b2 lw ra,44(sp) + 3002308: 5422 lw s0,40(sp) + 300230a: 6145 addi sp,sp,48 + 300230c: 8082 ret + +0300230e : + 300230e: 7179 addi sp,sp,-48 + 3002310: d606 sw ra,44(sp) + 3002312: d422 sw s0,40(sp) + 3002314: 1800 addi s0,sp,48 + 3002316: fca42e23 sw a0,-36(s0) + 300231a: fdc42783 lw a5,-36(s0) + 300231e: eb89 bnez a5,3002330 + 3002320: 10a00593 li a1,266 + 3002324: 0300f7b7 lui a5,0x300f + 3002328: 08c78513 addi a0,a5,140 # 300f08c + 300232c: 3b39 jal ra,300204a + 300232e: a001 j 300232e + 3002330: fdc42783 lw a5,-36(s0) + 3002334: 4398 lw a4,0(a5) + 3002336: 100007b7 lui a5,0x10000 + 300233a: 00f70a63 beq a4,a5,300234e + 300233e: 10b00593 li a1,267 + 3002342: 0300f7b7 lui a5,0x300f + 3002346: 08c78513 addi a0,a5,140 # 300f08c + 300234a: 3301 jal ra,300204a + 300234c: a001 j 300234c + 300234e: fdc42783 lw a5,-36(s0) + 3002352: 4f9c lw a5,24(a5) + 3002354: 853e mv a0,a5 + 3002356: 3439 jal ra,3001d64 + 3002358: 87aa mv a5,a0 + 300235a: 0017c793 xori a5,a5,1 + 300235e: 9f81 uxtb a5 + 3002360: cb91 beqz a5,3002374 + 3002362: 10c00593 li a1,268 + 3002366: 0300f7b7 lui a5,0x300f + 300236a: 08c78513 addi a0,a5,140 # 300f08c + 300236e: 39f1 jal ra,300204a + 3002370: 4785 li a5,1 + 3002372: a005 j 3002392 + 3002374: fdc42783 lw a5,-36(s0) + 3002378: 439c lw a5,0(a5) + 300237a: fef42623 sw a5,-20(s0) + 300237e: 38e5 jal ra,3001c76 + 3002380: fdc42783 lw a5,-36(s0) + 3002384: 4f9c lw a5,24(a5) + 3002386: 85be mv a1,a5 + 3002388: fec42503 lw a0,-20(s0) + 300238c: 31b9 jal ra,3001fda + 300238e: 3a01 jal ra,3001c9e + 3002390: 4781 li a5,0 + 3002392: 853e mv a0,a5 + 3002394: 50b2 lw ra,44(sp) + 3002396: 5422 lw s0,40(sp) + 3002398: 6145 addi sp,sp,48 + 300239a: 8082 ret + +0300239c : + 300239c: 1101 addi sp,sp,-32 + 300239e: ce06 sw ra,28(sp) + 30023a0: cc22 sw s0,24(sp) + 30023a2: 1000 addi s0,sp,32 + 30023a4: 2b01a783 lw a5,688(gp) # 40008e4 + 30023a8: fef42623 sw a5,-20(s0) + 30023ac: fec42703 lw a4,-20(s0) + 30023b0: 100007b7 lui a5,0x10000 + 30023b4: 00f70a63 beq a4,a5,30023c8 + 30023b8: 12200593 li a1,290 + 30023bc: 0300f7b7 lui a5,0x300f + 30023c0: 08c78513 addi a0,a5,140 # 300f08c + 30023c4: 3159 jal ra,300204a + 30023c6: a001 j 30023c6 + 30023c8: fec42783 lw a5,-20(s0) + 30023cc: 439c lw a5,0(a5) + 30023ce: 8b85 andi a5,a5,1 + 30023d0: 9f81 uxtb a5 + 30023d2: 853e mv a0,a5 + 30023d4: 2335 jal ra,3002900 + 30023d6: fea42423 sw a0,-24(s0) + 30023da: fec42783 lw a5,-20(s0) + 30023de: 43dc lw a5,4(a5) + 30023e0: 8bbd andi a5,a5,15 + 30023e2: 9f81 uxtb a5 + 30023e4: 853e mv a0,a5 + 30023e6: 2391 jal ra,300292a + 30023e8: 872a mv a4,a0 + 30023ea: fe842783 lw a5,-24(s0) + 30023ee: 02e7d7b3 divu a5,a5,a4 + 30023f2: fef42423 sw a5,-24(s0) + 30023f6: fec42783 lw a5,-20(s0) + 30023fa: 479c lw a5,8(a5) + 30023fc: 9f81 uxtb a5 + 30023fe: 853e mv a0,a5 + 3002400: 2ba1 jal ra,3002958 + 3002402: fea42223 sw a0,-28(s0) + 3002406: fe442783 lw a5,-28(s0) + 300240a: 4719 li a4,6 + 300240c: 00e7f363 bgeu a5,a4,3002412 + 3002410: 4799 li a5,6 + 3002412: fe842703 lw a4,-24(s0) + 3002416: 02f707b3 mul a5,a4,a5 + 300241a: fef42423 sw a5,-24(s0) + 300241e: fe842783 lw a5,-24(s0) + 3002422: 853e mv a0,a5 + 3002424: 40f2 lw ra,28(sp) + 3002426: 4462 lw s0,24(sp) + 3002428: 6105 addi sp,sp,32 + 300242a: 8082 ret + +0300242c : + 300242c: 1101 addi sp,sp,-32 + 300242e: ce06 sw ra,28(sp) + 3002430: cc22 sw s0,24(sp) + 3002432: 1000 addi s0,sp,32 + 3002434: 2b01a783 lw a5,688(gp) # 40008e4 + 3002438: fef42423 sw a5,-24(s0) + 300243c: fe842703 lw a4,-24(s0) + 3002440: 100007b7 lui a5,0x10000 + 3002444: 00f70a63 beq a4,a5,3002458 + 3002448: 13700593 li a1,311 + 300244c: 0300f7b7 lui a5,0x300f + 3002450: 08c78513 addi a0,a5,140 # 300f08c + 3002454: 3edd jal ra,300204a + 3002456: a001 j 3002456 + 3002458: 3791 jal ra,300239c + 300245a: fea42623 sw a0,-20(s0) + 300245e: fe842783 lw a5,-24(s0) + 3002462: 47dc lw a5,12(a5) + 3002464: 8bbd andi a5,a5,15 + 3002466: 9f81 uxtb a5 + 3002468: 853e mv a0,a5 + 300246a: 2b05 jal ra,300299a + 300246c: fea42223 sw a0,-28(s0) + 3002470: fe442783 lw a5,-28(s0) + 3002474: cb89 beqz a5,3002486 + 3002476: fec42703 lw a4,-20(s0) + 300247a: fe442783 lw a5,-28(s0) + 300247e: 02f757b3 divu a5,a4,a5 + 3002482: fef42623 sw a5,-20(s0) + 3002486: fec42783 lw a5,-20(s0) + 300248a: 853e mv a0,a5 + 300248c: 40f2 lw ra,28(sp) + 300248e: 4462 lw s0,24(sp) + 3002490: 6105 addi sp,sp,32 + 3002492: 8082 ret + +03002494 : + 3002494: 1101 addi sp,sp,-32 + 3002496: ce06 sw ra,28(sp) + 3002498: cc22 sw s0,24(sp) + 300249a: 1000 addi s0,sp,32 + 300249c: 2b01a783 lw a5,688(gp) # 40008e4 + 30024a0: fef42423 sw a5,-24(s0) + 30024a4: fe842703 lw a4,-24(s0) + 30024a8: 100007b7 lui a5,0x10000 + 30024ac: 00f70a63 beq a4,a5,30024c0 + 30024b0: 14c00593 li a1,332 + 30024b4: 0300f7b7 lui a5,0x300f + 30024b8: 08c78513 addi a0,a5,140 # 300f08c + 30024bc: 3679 jal ra,300204a + 30024be: a001 j 30024be + 30024c0: fe842783 lw a5,-24(s0) + 30024c4: 1007a783 lw a5,256(a5) + 30024c8: 8b8d andi a5,a5,3 + 30024ca: 9f81 uxtb a5 + 30024cc: fef42223 sw a5,-28(s0) + 30024d0: fe442783 lw a5,-28(s0) + 30024d4: 4705 li a4,1 + 30024d6: 02e78063 beq a5,a4,30024f6 + 30024da: 4705 li a4,1 + 30024dc: 00e7e663 bltu a5,a4,30024e8 + 30024e0: 4709 li a4,2 + 30024e2: 02e78163 beq a5,a4,3002504 + 30024e6: a01d j 300250c + 30024e8: 017d87b7 lui a5,0x17d8 + 30024ec: 84078793 addi a5,a5,-1984 # 17d7840 + 30024f0: fef42623 sw a5,-20(s0) + 30024f4: a015 j 3002518 + 30024f6: 01c9c7b7 lui a5,0x1c9c + 30024fa: 38078793 addi a5,a5,896 # 1c9c380 + 30024fe: fef42623 sw a5,-20(s0) + 3002502: a819 j 3002518 + 3002504: 3725 jal ra,300242c + 3002506: fea42623 sw a0,-20(s0) + 300250a: a039 j 3002518 + 300250c: 67a1 lui a5,0x8 + 300250e: d0078793 addi a5,a5,-768 # 7d00 + 3002512: fef42623 sw a5,-20(s0) + 3002516: 0001 nop + 3002518: fec42783 lw a5,-20(s0) + 300251c: 853e mv a0,a5 + 300251e: 40f2 lw ra,28(sp) + 3002520: 4462 lw s0,24(sp) + 3002522: 6105 addi sp,sp,32 + 3002524: 8082 ret + +03002526 : + 3002526: 7179 addi sp,sp,-48 + 3002528: d606 sw ra,44(sp) + 300252a: d422 sw s0,40(sp) + 300252c: 1800 addi s0,sp,48 + 300252e: fca42e23 sw a0,-36(s0) + 3002532: fdc42783 lw a5,-36(s0) + 3002536: eb89 bnez a5,3002548 + 3002538: 16900593 li a1,361 + 300253c: 0300f7b7 lui a5,0x300f + 3002540: 08c78513 addi a0,a5,140 # 300f08c + 3002544: 3619 jal ra,300204a + 3002546: a001 j 3002546 + 3002548: 2b01a703 lw a4,688(gp) # 40008e4 + 300254c: 100007b7 lui a5,0x10000 + 3002550: 00f70a63 beq a4,a5,3002564 + 3002554: 16a00593 li a1,362 + 3002558: 0300f7b7 lui a5,0x300f + 300255c: 08c78513 addi a0,a5,140 # 300f08c + 3002560: 34ed jal ra,300204a + 3002562: a001 j 3002562 + 3002564: 3f05 jal ra,3002494 + 3002566: fea42423 sw a0,-24(s0) + 300256a: 67a1 lui a5,0x8 + 300256c: d0078793 addi a5,a5,-768 # 7d00 + 3002570: fef42623 sw a5,-20(s0) + 3002574: fdc42503 lw a0,-36(s0) + 3002578: c15fe0ef jal ra,300118c + 300257c: fea42223 sw a0,-28(s0) + 3002580: fe442783 lw a5,-28(s0) + 3002584: e781 bnez a5,300258c + 3002586: fec42783 lw a5,-20(s0) + 300258a: a885 j 30025fa + 300258c: fe442783 lw a5,-28(s0) + 3002590: 43dc lw a5,4(a5) + 3002592: 4715 li a4,5 + 3002594: 04f76863 bltu a4,a5,30025e4 + 3002598: 00279713 slli a4,a5,0x2 + 300259c: 0300f7b7 lui a5,0x300f + 30025a0: 0c878793 addi a5,a5,200 # 300f0c8 + 30025a4: 97ba add a5,a5,a4 + 30025a6: 439c lw a5,0(a5) + 30025a8: 8782 jr a5 + 30025aa: fe842783 lw a5,-24(s0) + 30025ae: fef42623 sw a5,-20(s0) + 30025b2: a815 j 30025e6 + 30025b4: 2b01a783 lw a5,688(gp) # 40008e4 + 30025b8: 439c lw a5,0(a5) + 30025ba: 8b85 andi a5,a5,1 + 30025bc: 9f81 uxtb a5 + 30025be: 853e mv a0,a5 + 30025c0: 2681 jal ra,3002900 + 30025c2: fea42623 sw a0,-20(s0) + 30025c6: a005 j 30025e6 + 30025c8: 35f1 jal ra,3002494 + 30025ca: fea42023 sw a0,-32(s0) + 30025ce: 33f9 jal ra,300239c + 30025d0: 87aa mv a5,a0 + 30025d2: fe042603 lw a2,-32(s0) + 30025d6: 85be mv a1,a5 + 30025d8: fe442503 lw a0,-28(s0) + 30025dc: 28dd jal ra,30026d2 + 30025de: fea42623 sw a0,-20(s0) + 30025e2: a011 j 30025e6 + 30025e4: 0001 nop + 30025e6: fec42783 lw a5,-20(s0) + 30025ea: e791 bnez a5,30025f6 + 30025ec: 67a1 lui a5,0x8 + 30025ee: d0078793 addi a5,a5,-768 # 7d00 + 30025f2: fef42623 sw a5,-20(s0) + 30025f6: fec42783 lw a5,-20(s0) + 30025fa: 853e mv a0,a5 + 30025fc: 50b2 lw ra,44(sp) + 30025fe: 5422 lw s0,40(sp) + 3002600: 6145 addi sp,sp,48 + 3002602: 8082 ret + +03002604 : + 3002604: 7179 addi sp,sp,-48 + 3002606: d606 sw ra,44(sp) + 3002608: d422 sw s0,40(sp) + 300260a: 1800 addi s0,sp,48 + 300260c: fca42e23 sw a0,-36(s0) + 3002610: fcb42c23 sw a1,-40(s0) + 3002614: fdc42783 lw a5,-36(s0) + 3002618: eb89 bnez a5,300262a + 300261a: 19c00593 li a1,412 + 300261e: 0300f7b7 lui a5,0x300f + 3002622: 08c78513 addi a0,a5,140 # 300f08c + 3002626: 3415 jal ra,300204a + 3002628: a001 j 3002628 + 300262a: 2b01a703 lw a4,688(gp) # 40008e4 + 300262e: 100007b7 lui a5,0x10000 + 3002632: 00f70a63 beq a4,a5,3002646 + 3002636: 19d00593 li a1,413 + 300263a: 0300f7b7 lui a5,0x300f + 300263e: 08c78513 addi a0,a5,140 # 300f08c + 3002642: 3421 jal ra,300204a + 3002644: a001 j 3002644 + 3002646: fd842703 lw a4,-40(s0) + 300264a: 4785 li a5,1 + 300264c: 00f70e63 beq a4,a5,3002668 + 3002650: fd842783 lw a5,-40(s0) + 3002654: cb91 beqz a5,3002668 + 3002656: 19f00593 li a1,415 + 300265a: 0300f7b7 lui a5,0x300f + 300265e: 08c78513 addi a0,a5,140 # 300f08c + 3002662: 32e5 jal ra,300204a + 3002664: 4785 li a5,1 + 3002666: a08d j 30026c8 + 3002668: fdc42503 lw a0,-36(s0) + 300266c: b21fe0ef jal ra,300118c + 3002670: fea42623 sw a0,-20(s0) + 3002674: fec42783 lw a5,-20(s0) + 3002678: c799 beqz a5,3002686 + 300267a: fec42783 lw a5,-20(s0) + 300267e: 43d8 lw a4,4(a5) + 3002680: 4795 li a5,5 + 3002682: 00e7f463 bgeu a5,a4,300268a + 3002686: 4785 li a5,1 + 3002688: a081 j 30026c8 + 300268a: fec42783 lw a5,-20(s0) + 300268e: 43d4 lw a3,4(a5) + 3002690: 9f018713 addi a4,gp,-1552 # 4000024 + 3002694: 02400793 li a5,36 + 3002698: 02f687b3 mul a5,a3,a5 + 300269c: 97ba add a5,a5,a4 + 300269e: 479c lw a5,8(a5) + 30026a0: e399 bnez a5,30026a6 + 30026a2: 4785 li a5,1 + 30026a4: a015 j 30026c8 + 30026a6: fec42783 lw a5,-20(s0) + 30026aa: 43d4 lw a3,4(a5) + 30026ac: 9f018713 addi a4,gp,-1552 # 4000024 + 30026b0: 02400793 li a5,36 + 30026b4: 02f687b3 mul a5,a3,a5 + 30026b8: 97ba add a5,a5,a4 + 30026ba: 479c lw a5,8(a5) + 30026bc: fd842583 lw a1,-40(s0) + 30026c0: fec42503 lw a0,-20(s0) + 30026c4: 9782 jalr a5 + 30026c6: 4781 li a5,0 + 30026c8: 853e mv a0,a5 + 30026ca: 50b2 lw ra,44(sp) + 30026cc: 5422 lw s0,40(sp) + 30026ce: 6145 addi sp,sp,48 + 30026d0: 8082 ret + +030026d2 : + 30026d2: 7139 addi sp,sp,-64 + 30026d4: de06 sw ra,60(sp) + 30026d6: dc22 sw s0,56(sp) + 30026d8: 0080 addi s0,sp,64 + 30026da: fca42623 sw a0,-52(s0) + 30026de: fcb42423 sw a1,-56(s0) + 30026e2: fcc42223 sw a2,-60(s0) + 30026e6: fcc42783 lw a5,-52(s0) + 30026ea: eb89 bnez a5,30026fc + 30026ec: 2af00593 li a1,687 + 30026f0: 0300f7b7 lui a5,0x300f + 30026f4: 08c78513 addi a0,a5,140 # 300f08c + 30026f8: 2f11 jal ra,3002e0c + 30026fa: a001 j 30026fa + 30026fc: 2b01a783 lw a5,688(gp) # 40008e4 + 3002700: eb89 bnez a5,3002712 + 3002702: 2b000593 li a1,688 + 3002706: 0300f7b7 lui a5,0x300f + 300270a: 08c78513 addi a0,a5,140 # 300f08c + 300270e: 2dfd jal ra,3002e0c + 3002710: a001 j 3002710 + 3002712: fe042623 sw zero,-20(s0) + 3002716: fcc42783 lw a5,-52(s0) + 300271a: 43d8 lw a4,4(a5) + 300271c: 02400793 li a5,36 + 3002720: 02f70733 mul a4,a4,a5 + 3002724: 9f018793 addi a5,gp,-1552 # 4000024 + 3002728: 97ba add a5,a5,a4 + 300272a: fef42423 sw a5,-24(s0) + 300272e: fe842783 lw a5,-24(s0) + 3002732: 4fdc lw a5,28(a5) + 3002734: e399 bnez a5,300273a + 3002736: 4781 li a5,0 + 3002738: a06d j 30027e2 + 300273a: fe842783 lw a5,-24(s0) + 300273e: 4fdc lw a5,28(a5) + 3002740: fcc42503 lw a0,-52(s0) + 3002744: 9782 jalr a5 + 3002746: fea42223 sw a0,-28(s0) + 300274a: fe442703 lw a4,-28(s0) + 300274e: 478d li a5,3 + 3002750: 00f71763 bne a4,a5,300275e + 3002754: fc442783 lw a5,-60(s0) + 3002758: fef42623 sw a5,-20(s0) + 300275c: a8b1 j 30027b8 + 300275e: fe442783 lw a5,-28(s0) + 3002762: eb81 bnez a5,3002772 + 3002764: 017d87b7 lui a5,0x17d8 + 3002768: 84078793 addi a5,a5,-1984 # 17d7840 + 300276c: fef42623 sw a5,-20(s0) + 3002770: a0a1 j 30027b8 + 3002772: fe442703 lw a4,-28(s0) + 3002776: 4785 li a5,1 + 3002778: 00f71963 bne a4,a5,300278a + 300277c: 01c9c7b7 lui a5,0x1c9c + 3002780: 38078793 addi a5,a5,896 # 1c9c380 + 3002784: fef42623 sw a5,-20(s0) + 3002788: a805 j 30027b8 + 300278a: fe442703 lw a4,-28(s0) + 300278e: 4789 li a5,2 + 3002790: 02f71463 bne a4,a5,30027b8 + 3002794: 2b01a783 lw a5,688(gp) # 40008e4 + 3002798: 47dc lw a5,12(a5) + 300279a: 8391 srli a5,a5,0x4 + 300279c: 8bbd andi a5,a5,15 + 300279e: 9f81 uxtb a5 + 30027a0: 853e mv a0,a5 + 30027a2: 2ae5 jal ra,300299a + 30027a4: fea42023 sw a0,-32(s0) + 30027a8: fc842703 lw a4,-56(s0) + 30027ac: fe042783 lw a5,-32(s0) + 30027b0: 02f757b3 divu a5,a4,a5 + 30027b4: fef42623 sw a5,-20(s0) + 30027b8: fe842783 lw a5,-24(s0) + 30027bc: 539c lw a5,32(a5) + 30027be: e399 bnez a5,30027c4 + 30027c0: 4781 li a5,0 + 30027c2: a005 j 30027e2 + 30027c4: fe842783 lw a5,-24(s0) + 30027c8: 539c lw a5,32(a5) + 30027ca: fcc42503 lw a0,-52(s0) + 30027ce: 9782 jalr a5 + 30027d0: fca42e23 sw a0,-36(s0) + 30027d4: fdc42783 lw a5,-36(s0) + 30027d8: 0785 addi a5,a5,1 + 30027da: fec42703 lw a4,-20(s0) + 30027de: 02f757b3 divu a5,a4,a5 + 30027e2: 853e mv a0,a5 + 30027e4: 50f2 lw ra,60(sp) + 30027e6: 5462 lw s0,56(sp) + 30027e8: 6121 addi sp,sp,64 + 30027ea: 8082 ret + +030027ec : + 30027ec: 7179 addi sp,sp,-48 + 30027ee: d606 sw ra,44(sp) + 30027f0: d422 sw s0,40(sp) + 30027f2: 1800 addi s0,sp,48 + 30027f4: fca42e23 sw a0,-36(s0) + 30027f8: fdc42783 lw a5,-36(s0) + 30027fc: 43dc lw a5,4(a5) + 30027fe: 853e mv a0,a5 + 3002800: 2201 jal ra,3002900 + 3002802: fea42623 sw a0,-20(s0) + 3002806: fdc42783 lw a5,-36(s0) + 300280a: 479c lw a5,8(a5) + 300280c: 853e mv a0,a5 + 300280e: 2a31 jal ra,300292a + 3002810: fea42423 sw a0,-24(s0) + 3002814: fe842583 lw a1,-24(s0) + 3002818: fec42503 lw a0,-20(s0) + 300281c: dc6ff0ef jal ra,3001de2 + 3002820: 87aa mv a5,a0 + 3002822: 0017c793 xori a5,a5,1 + 3002826: 9f81 uxtb a5 + 3002828: c399 beqz a5,300282e + 300282a: 4785 li a5,1 + 300282c: a8a5 j 30028a4 + 300282e: fec42703 lw a4,-20(s0) + 3002832: fe842783 lw a5,-24(s0) + 3002836: 02f757b3 divu a5,a4,a5 + 300283a: fef42623 sw a5,-20(s0) + 300283e: fdc42783 lw a5,-36(s0) + 3002842: 47dc lw a5,12(a5) + 3002844: 85be mv a1,a5 + 3002846: fec42503 lw a0,-20(s0) + 300284a: df6ff0ef jal ra,3001e40 + 300284e: 87aa mv a5,a0 + 3002850: 0017c793 xori a5,a5,1 + 3002854: 9f81 uxtb a5 + 3002856: c399 beqz a5,300285c + 3002858: 4785 li a5,1 + 300285a: a0a9 j 30028a4 + 300285c: fdc42783 lw a5,-36(s0) + 3002860: 47dc lw a5,12(a5) + 3002862: 4719 li a4,6 + 3002864: 00e7f363 bgeu a5,a4,300286a + 3002868: 4799 li a5,6 + 300286a: fec42703 lw a4,-20(s0) + 300286e: 02f707b3 mul a5,a4,a5 + 3002872: fef42623 sw a5,-20(s0) + 3002876: fdc42783 lw a5,-36(s0) + 300287a: 4b9c lw a5,16(a5) + 300287c: 85be mv a1,a5 + 300287e: fec42503 lw a0,-20(s0) + 3002882: e48ff0ef jal ra,3001eca + 3002886: 87aa mv a5,a0 + 3002888: cf89 beqz a5,30028a2 + 300288a: fdc42783 lw a5,-36(s0) + 300288e: 4fdc lw a5,28(a5) + 3002890: 85be mv a1,a5 + 3002892: fec42503 lw a0,-20(s0) + 3002896: e7cff0ef jal ra,3001f12 + 300289a: 87aa mv a5,a0 + 300289c: c399 beqz a5,30028a2 + 300289e: 4781 li a5,0 + 30028a0: a011 j 30028a4 + 30028a2: 4785 li a5,1 + 30028a4: 853e mv a0,a5 + 30028a6: 50b2 lw ra,44(sp) + 30028a8: 5422 lw s0,40(sp) + 30028aa: 6145 addi sp,sp,48 + 30028ac: 8082 ret + +030028ae : + 30028ae: 7179 addi sp,sp,-48 + 30028b0: d622 sw s0,44(sp) + 30028b2: 1800 addi s0,sp,48 + 30028b4: fca42e23 sw a0,-36(s0) + 30028b8: fdc42783 lw a5,-36(s0) + 30028bc: 539c lw a5,32(a5) + 30028be: e791 bnez a5,30028ca + 30028c0: 017d87b7 lui a5,0x17d8 + 30028c4: 84078793 addi a5,a5,-1984 # 17d7840 + 30028c8: a029 j 30028d2 + 30028ca: 01c9c7b7 lui a5,0x1c9c + 30028ce: 38078793 addi a5,a5,896 # 1c9c380 + 30028d2: fef42623 sw a5,-20(s0) + 30028d6: fdc42783 lw a5,-36(s0) + 30028da: 53dc lw a5,36(a5) + 30028dc: 0785 addi a5,a5,1 + 30028de: fec42703 lw a4,-20(s0) + 30028e2: 02f75733 divu a4,a4,a5 + 30028e6: 000f47b7 lui a5,0xf4 + 30028ea: 24078793 addi a5,a5,576 # f4240 + 30028ee: 00f71463 bne a4,a5,30028f6 + 30028f2: 4781 li a5,0 + 30028f4: a011 j 30028f8 + 30028f6: 4785 li a5,1 + 30028f8: 853e mv a0,a5 + 30028fa: 5432 lw s0,44(sp) + 30028fc: 6145 addi sp,sp,48 + 30028fe: 8082 ret + +03002900 : + 3002900: 1101 addi sp,sp,-32 + 3002902: ce22 sw s0,28(sp) + 3002904: 1000 addi s0,sp,32 + 3002906: fea42623 sw a0,-20(s0) + 300290a: fec42783 lw a5,-20(s0) + 300290e: e791 bnez a5,300291a + 3002910: 017d87b7 lui a5,0x17d8 + 3002914: 84078793 addi a5,a5,-1984 # 17d7840 + 3002918: a029 j 3002922 + 300291a: 01c9c7b7 lui a5,0x1c9c + 300291e: 38078793 addi a5,a5,896 # 1c9c380 + 3002922: 853e mv a0,a5 + 3002924: 4472 lw s0,28(sp) + 3002926: 6105 addi sp,sp,32 + 3002928: 8082 ret + +0300292a : + 300292a: 7179 addi sp,sp,-48 + 300292c: d622 sw s0,44(sp) + 300292e: 1800 addi s0,sp,48 + 3002930: fca42e23 sw a0,-36(s0) + 3002934: fdc42783 lw a5,-36(s0) + 3002938: e789 bnez a5,3002942 + 300293a: 4785 li a5,1 + 300293c: fef42623 sw a5,-20(s0) + 3002940: a031 j 300294c + 3002942: fdc42783 lw a5,-36(s0) + 3002946: 0785 addi a5,a5,1 + 3002948: fef42623 sw a5,-20(s0) + 300294c: fec42783 lw a5,-20(s0) + 3002950: 853e mv a0,a5 + 3002952: 5432 lw s0,44(sp) + 3002954: 6145 addi sp,sp,48 + 3002956: 8082 ret + +03002958 : + 3002958: 7179 addi sp,sp,-48 + 300295a: d622 sw s0,44(sp) + 300295c: 1800 addi s0,sp,48 + 300295e: fca42e23 sw a0,-36(s0) + 3002962: fdc42783 lw a5,-36(s0) + 3002966: fef42623 sw a5,-20(s0) + 300296a: fec42703 lw a4,-20(s0) + 300296e: 4795 li a5,5 + 3002970: 00e7e563 bltu a5,a4,300297a + 3002974: 4799 li a5,6 + 3002976: fef42623 sw a5,-20(s0) + 300297a: fec42703 lw a4,-20(s0) + 300297e: 07f00793 li a5,127 + 3002982: 00e7f663 bgeu a5,a4,300298e + 3002986: 07f00793 li a5,127 + 300298a: fef42623 sw a5,-20(s0) + 300298e: fec42783 lw a5,-20(s0) + 3002992: 853e mv a0,a5 + 3002994: 5432 lw s0,44(sp) + 3002996: 6145 addi sp,sp,48 + 3002998: 8082 ret + +0300299a : + 300299a: 7179 addi sp,sp,-48 + 300299c: d622 sw s0,44(sp) + 300299e: 1800 addi s0,sp,48 + 30029a0: fca42e23 sw a0,-36(s0) + 30029a4: fdc42783 lw a5,-36(s0) + 30029a8: fef42623 sw a5,-20(s0) + 30029ac: fec42703 lw a4,-20(s0) + 30029b0: 479d li a5,7 + 30029b2: 00e7f663 bgeu a5,a4,30029be + 30029b6: 47a1 li a5,8 + 30029b8: fef42623 sw a5,-20(s0) + 30029bc: a031 j 30029c8 + 30029be: fec42783 lw a5,-20(s0) + 30029c2: 0785 addi a5,a5,1 + 30029c4: fef42623 sw a5,-20(s0) + 30029c8: fec42783 lw a5,-20(s0) + 30029cc: 853e mv a0,a5 + 30029ce: 5432 lw s0,44(sp) + 30029d0: 6145 addi sp,sp,48 + 30029d2: 8082 ret + +030029d4 : + 30029d4: 7179 addi sp,sp,-48 + 30029d6: d606 sw ra,44(sp) + 30029d8: d422 sw s0,40(sp) + 30029da: 1800 addi s0,sp,48 + 30029dc: fca42e23 sw a0,-36(s0) + 30029e0: fcb42c23 sw a1,-40(s0) + 30029e4: fdc42783 lw a5,-36(s0) + 30029e8: eb89 bnez a5,30029fa + 30029ea: 34d00593 li a1,845 + 30029ee: 0300f7b7 lui a5,0x300f + 30029f2: 08c78513 addi a0,a5,140 # 300f08c + 30029f6: 2919 jal ra,3002e0c + 30029f8: a001 j 30029f8 + 30029fa: 2b01a783 lw a5,688(gp) # 40008e4 + 30029fe: eb89 bnez a5,3002a10 + 3002a00: 34e00593 li a1,846 + 3002a04: 0300f7b7 lui a5,0x300f + 3002a08: 08c78513 addi a0,a5,140 # 300f08c + 3002a0c: 2101 jal ra,3002e0c + 3002a0e: a001 j 3002a0e + 3002a10: 2b01a783 lw a5,688(gp) # 40008e4 + 3002a14: fef42623 sw a5,-20(s0) + 3002a18: fdc42783 lw a5,-36(s0) + 3002a1c: 279e lhu a5,8(a5) + 3002a1e: 873e mv a4,a5 + 3002a20: fec42783 lw a5,-20(s0) + 3002a24: 97ba add a5,a5,a4 + 3002a26: fef42423 sw a5,-24(s0) + 3002a2a: fe842783 lw a5,-24(s0) + 3002a2e: 439c lw a5,0(a5) + 3002a30: fef42223 sw a5,-28(s0) + 3002a34: fd842783 lw a5,-40(s0) + 3002a38: 8b85 andi a5,a5,1 + 3002a3a: c7c1 beqz a5,3002ac2 + 3002a3c: fe442783 lw a5,-28(s0) + 3002a40: 9fa1 uxth a5 + 3002a42: 01079713 slli a4,a5,0x10 + 3002a46: 8741 srai a4,a4,0x10 + 3002a48: fdc42783 lw a5,-36(s0) + 3002a4c: 27bc lbu a5,10(a5) + 3002a4e: 86be mv a3,a5 + 3002a50: 4785 li a5,1 + 3002a52: 00d797b3 sll a5,a5,a3 + 3002a56: 07c2 slli a5,a5,0x10 + 3002a58: 87c1 srai a5,a5,0x10 + 3002a5a: 8fd9 or a5,a5,a4 + 3002a5c: 07c2 slli a5,a5,0x10 + 3002a5e: 87c1 srai a5,a5,0x10 + 3002a60: 01079693 slli a3,a5,0x10 + 3002a64: 82c1 srli a3,a3,0x10 + 3002a66: fe442783 lw a5,-28(s0) + 3002a6a: 6741 lui a4,0x10 + 3002a6c: 177d addi a4,a4,-1 # ffff + 3002a6e: 8f75 and a4,a4,a3 + 3002a70: 76c1 lui a3,0xffff0 + 3002a72: 8ff5 and a5,a5,a3 + 3002a74: 8fd9 or a5,a5,a4 + 3002a76: fef42223 sw a5,-28(s0) + 3002a7a: fe442783 lw a5,-28(s0) + 3002a7e: 83c1 srli a5,a5,0x10 + 3002a80: 9fa1 uxth a5 + 3002a82: 01079713 slli a4,a5,0x10 + 3002a86: 8741 srai a4,a4,0x10 + 3002a88: fdc42783 lw a5,-36(s0) + 3002a8c: 27bc lbu a5,10(a5) + 3002a8e: 86be mv a3,a5 + 3002a90: 4785 li a5,1 + 3002a92: 00d797b3 sll a5,a5,a3 + 3002a96: 07c2 slli a5,a5,0x10 + 3002a98: 87c1 srai a5,a5,0x10 + 3002a9a: fff7c793 not a5,a5 + 3002a9e: 07c2 slli a5,a5,0x10 + 3002aa0: 87c1 srai a5,a5,0x10 + 3002aa2: 8ff9 and a5,a5,a4 + 3002aa4: 07c2 slli a5,a5,0x10 + 3002aa6: 87c1 srai a5,a5,0x10 + 3002aa8: 01079713 slli a4,a5,0x10 + 3002aac: 8341 srli a4,a4,0x10 + 3002aae: fe442783 lw a5,-28(s0) + 3002ab2: 0742 slli a4,a4,0x10 + 3002ab4: 66c1 lui a3,0x10 + 3002ab6: 16fd addi a3,a3,-1 # ffff + 3002ab8: 8ff5 and a5,a5,a3 + 3002aba: 8fd9 or a5,a5,a4 + 3002abc: fef42223 sw a5,-28(s0) + 3002ac0: a059 j 3002b46 + 3002ac2: fe442783 lw a5,-28(s0) + 3002ac6: 9fa1 uxth a5 + 3002ac8: 01079713 slli a4,a5,0x10 + 3002acc: 8741 srai a4,a4,0x10 + 3002ace: fdc42783 lw a5,-36(s0) + 3002ad2: 27bc lbu a5,10(a5) + 3002ad4: 86be mv a3,a5 + 3002ad6: 4785 li a5,1 + 3002ad8: 00d797b3 sll a5,a5,a3 + 3002adc: 07c2 slli a5,a5,0x10 + 3002ade: 87c1 srai a5,a5,0x10 + 3002ae0: fff7c793 not a5,a5 + 3002ae4: 07c2 slli a5,a5,0x10 + 3002ae6: 87c1 srai a5,a5,0x10 + 3002ae8: 8ff9 and a5,a5,a4 + 3002aea: 07c2 slli a5,a5,0x10 + 3002aec: 87c1 srai a5,a5,0x10 + 3002aee: 01079693 slli a3,a5,0x10 + 3002af2: 82c1 srli a3,a3,0x10 + 3002af4: fe442783 lw a5,-28(s0) + 3002af8: 6741 lui a4,0x10 + 3002afa: 177d addi a4,a4,-1 # ffff + 3002afc: 8f75 and a4,a4,a3 + 3002afe: 76c1 lui a3,0xffff0 + 3002b00: 8ff5 and a5,a5,a3 + 3002b02: 8fd9 or a5,a5,a4 + 3002b04: fef42223 sw a5,-28(s0) + 3002b08: fe442783 lw a5,-28(s0) + 3002b0c: 83c1 srli a5,a5,0x10 + 3002b0e: 9fa1 uxth a5 + 3002b10: 01079713 slli a4,a5,0x10 + 3002b14: 8741 srai a4,a4,0x10 + 3002b16: fdc42783 lw a5,-36(s0) + 3002b1a: 27bc lbu a5,10(a5) + 3002b1c: 86be mv a3,a5 + 3002b1e: 4785 li a5,1 + 3002b20: 00d797b3 sll a5,a5,a3 + 3002b24: 07c2 slli a5,a5,0x10 + 3002b26: 87c1 srai a5,a5,0x10 + 3002b28: 8fd9 or a5,a5,a4 + 3002b2a: 07c2 slli a5,a5,0x10 + 3002b2c: 87c1 srai a5,a5,0x10 + 3002b2e: 01079713 slli a4,a5,0x10 + 3002b32: 8341 srli a4,a4,0x10 + 3002b34: fe442783 lw a5,-28(s0) + 3002b38: 0742 slli a4,a4,0x10 + 3002b3a: 66c1 lui a3,0x10 + 3002b3c: 16fd addi a3,a3,-1 # ffff + 3002b3e: 8ff5 and a5,a5,a3 + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fef42223 sw a5,-28(s0) + 3002b46: fe442703 lw a4,-28(s0) + 3002b4a: fe842783 lw a5,-24(s0) + 3002b4e: c398 sw a4,0(a5) + 3002b50: 0001 nop + 3002b52: 50b2 lw ra,44(sp) + 3002b54: 5422 lw s0,40(sp) + 3002b56: 6145 addi sp,sp,48 + 3002b58: 8082 ret + +03002b5a : + 3002b5a: 7179 addi sp,sp,-48 + 3002b5c: d606 sw ra,44(sp) + 3002b5e: d422 sw s0,40(sp) + 3002b60: 1800 addi s0,sp,48 + 3002b62: fca42e23 sw a0,-36(s0) + 3002b66: fdc42783 lw a5,-36(s0) + 3002b6a: eb89 bnez a5,3002b7c + 3002b6c: 36500593 li a1,869 + 3002b70: 0300f7b7 lui a5,0x300f + 3002b74: 08c78513 addi a0,a5,140 # 300f08c + 3002b78: 2c51 jal ra,3002e0c + 3002b7a: a001 j 3002b7a + 3002b7c: 2b01a783 lw a5,688(gp) # 40008e4 + 3002b80: eb89 bnez a5,3002b92 + 3002b82: 36600593 li a1,870 + 3002b86: 0300f7b7 lui a5,0x300f + 3002b8a: 08c78513 addi a0,a5,140 # 300f08c + 3002b8e: 2cbd jal ra,3002e0c + 3002b90: a001 j 3002b90 + 3002b92: 2b01a783 lw a5,688(gp) # 40008e4 + 3002b96: fef42623 sw a5,-20(s0) + 3002b9a: fdc42783 lw a5,-36(s0) + 3002b9e: 279e lhu a5,8(a5) + 3002ba0: 873e mv a4,a5 + 3002ba2: fec42783 lw a5,-20(s0) + 3002ba6: 97ba add a5,a5,a4 + 3002ba8: fef42423 sw a5,-24(s0) + 3002bac: fe842783 lw a5,-24(s0) + 3002bb0: 439c lw a5,0(a5) + 3002bb2: fef42223 sw a5,-28(s0) + 3002bb6: fe442783 lw a5,-28(s0) + 3002bba: 9fa1 uxth a5 + 3002bbc: 873e mv a4,a5 + 3002bbe: fdc42783 lw a5,-36(s0) + 3002bc2: 27bc lbu a5,10(a5) + 3002bc4: 40f757b3 sra a5,a4,a5 + 3002bc8: 8b85 andi a5,a5,1 + 3002bca: 00f037b3 snez a5,a5 + 3002bce: 9f81 uxtb a5 + 3002bd0: 853e mv a0,a5 + 3002bd2: 50b2 lw ra,44(sp) + 3002bd4: 5422 lw s0,40(sp) + 3002bd6: 6145 addi sp,sp,48 + 3002bd8: 8082 ret + +03002bda : + 3002bda: 7179 addi sp,sp,-48 + 3002bdc: d606 sw ra,44(sp) + 3002bde: d422 sw s0,40(sp) + 3002be0: 1800 addi s0,sp,48 + 3002be2: fca42e23 sw a0,-36(s0) + 3002be6: fcb42c23 sw a1,-40(s0) + 3002bea: fdc42783 lw a5,-36(s0) + 3002bee: eb89 bnez a5,3002c00 + 3002bf0: 37900593 li a1,889 + 3002bf4: 0300f7b7 lui a5,0x300f + 3002bf8: 08c78513 addi a0,a5,140 # 300f08c + 3002bfc: 2c01 jal ra,3002e0c + 3002bfe: a001 j 3002bfe + 3002c00: 2b01a783 lw a5,688(gp) # 40008e4 + 3002c04: eb89 bnez a5,3002c16 + 3002c06: 37a00593 li a1,890 + 3002c0a: 0300f7b7 lui a5,0x300f + 3002c0e: 08c78513 addi a0,a5,140 # 300f08c + 3002c12: 2aed jal ra,3002e0c + 3002c14: a001 j 3002c14 + 3002c16: 2b01a783 lw a5,688(gp) # 40008e4 + 3002c1a: fef42623 sw a5,-20(s0) + 3002c1e: fdc42783 lw a5,-36(s0) + 3002c22: 279e lhu a5,8(a5) + 3002c24: 873e mv a4,a5 + 3002c26: fec42783 lw a5,-20(s0) + 3002c2a: 97ba add a5,a5,a4 + 3002c2c: fef42423 sw a5,-24(s0) + 3002c30: fe842783 lw a5,-24(s0) + 3002c34: 439c lw a5,0(a5) + 3002c36: fef42223 sw a5,-28(s0) + 3002c3a: fd842783 lw a5,-40(s0) + 3002c3e: 8b85 andi a5,a5,1 + 3002c40: c3a9 beqz a5,3002c82 + 3002c42: fe442783 lw a5,-28(s0) + 3002c46: 83c1 srli a5,a5,0x10 + 3002c48: 9fa1 uxth a5 + 3002c4a: 01079713 slli a4,a5,0x10 + 3002c4e: 8741 srai a4,a4,0x10 + 3002c50: fdc42783 lw a5,-36(s0) + 3002c54: 27bc lbu a5,10(a5) + 3002c56: 86be mv a3,a5 + 3002c58: 4785 li a5,1 + 3002c5a: 00d797b3 sll a5,a5,a3 + 3002c5e: 07c2 slli a5,a5,0x10 + 3002c60: 87c1 srai a5,a5,0x10 + 3002c62: 8fd9 or a5,a5,a4 + 3002c64: 07c2 slli a5,a5,0x10 + 3002c66: 87c1 srai a5,a5,0x10 + 3002c68: 01079713 slli a4,a5,0x10 + 3002c6c: 8341 srli a4,a4,0x10 + 3002c6e: fe442783 lw a5,-28(s0) + 3002c72: 0742 slli a4,a4,0x10 + 3002c74: 66c1 lui a3,0x10 + 3002c76: 16fd addi a3,a3,-1 # ffff + 3002c78: 8ff5 and a5,a5,a3 + 3002c7a: 8fd9 or a5,a5,a4 + 3002c7c: fef42223 sw a5,-28(s0) + 3002c80: a0a1 j 3002cc8 + 3002c82: fe442783 lw a5,-28(s0) + 3002c86: 83c1 srli a5,a5,0x10 + 3002c88: 9fa1 uxth a5 + 3002c8a: 01079713 slli a4,a5,0x10 + 3002c8e: 8741 srai a4,a4,0x10 + 3002c90: fdc42783 lw a5,-36(s0) + 3002c94: 27bc lbu a5,10(a5) + 3002c96: 86be mv a3,a5 + 3002c98: 4785 li a5,1 + 3002c9a: 00d797b3 sll a5,a5,a3 + 3002c9e: 07c2 slli a5,a5,0x10 + 3002ca0: 87c1 srai a5,a5,0x10 + 3002ca2: fff7c793 not a5,a5 + 3002ca6: 07c2 slli a5,a5,0x10 + 3002ca8: 87c1 srai a5,a5,0x10 + 3002caa: 8ff9 and a5,a5,a4 + 3002cac: 07c2 slli a5,a5,0x10 + 3002cae: 87c1 srai a5,a5,0x10 + 3002cb0: 01079713 slli a4,a5,0x10 + 3002cb4: 8341 srli a4,a4,0x10 + 3002cb6: fe442783 lw a5,-28(s0) + 3002cba: 0742 slli a4,a4,0x10 + 3002cbc: 66c1 lui a3,0x10 + 3002cbe: 16fd addi a3,a3,-1 # ffff + 3002cc0: 8ff5 and a5,a5,a3 + 3002cc2: 8fd9 or a5,a5,a4 + 3002cc4: fef42223 sw a5,-28(s0) + 3002cc8: fe442703 lw a4,-28(s0) + 3002ccc: fe842783 lw a5,-24(s0) + 3002cd0: c398 sw a4,0(a5) + 3002cd2: 0001 nop + 3002cd4: 50b2 lw ra,44(sp) + 3002cd6: 5422 lw s0,40(sp) + 3002cd8: 6145 addi sp,sp,48 + 3002cda: 8082 ret + +03002cdc : + 3002cdc: 7179 addi sp,sp,-48 + 3002cde: d606 sw ra,44(sp) + 3002ce0: d422 sw s0,40(sp) + 3002ce2: 1800 addi s0,sp,48 + 3002ce4: fca42e23 sw a0,-36(s0) + 3002ce8: fdc42783 lw a5,-36(s0) + 3002cec: eb89 bnez a5,3002cfe + 3002cee: 38f00593 li a1,911 + 3002cf2: 0300f7b7 lui a5,0x300f + 3002cf6: 08c78513 addi a0,a5,140 # 300f08c + 3002cfa: 2a09 jal ra,3002e0c + 3002cfc: a001 j 3002cfc + 3002cfe: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d02: eb89 bnez a5,3002d14 + 3002d04: 39000593 li a1,912 + 3002d08: 0300f7b7 lui a5,0x300f + 3002d0c: 08c78513 addi a0,a5,140 # 300f08c + 3002d10: 28f5 jal ra,3002e0c + 3002d12: a001 j 3002d12 + 3002d14: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d18: fef42623 sw a5,-20(s0) + 3002d1c: fdc42783 lw a5,-36(s0) + 3002d20: 279e lhu a5,8(a5) + 3002d22: 873e mv a4,a5 + 3002d24: fec42783 lw a5,-20(s0) + 3002d28: 97ba add a5,a5,a4 + 3002d2a: fef42423 sw a5,-24(s0) + 3002d2e: fe842783 lw a5,-24(s0) + 3002d32: 439c lw a5,0(a5) + 3002d34: fef42223 sw a5,-28(s0) + 3002d38: fe442783 lw a5,-28(s0) + 3002d3c: 83c1 srli a5,a5,0x10 + 3002d3e: 9fa1 uxth a5 + 3002d40: 873e mv a4,a5 + 3002d42: fdc42783 lw a5,-36(s0) + 3002d46: 27bc lbu a5,10(a5) + 3002d48: 40f757b3 sra a5,a4,a5 + 3002d4c: 8b85 andi a5,a5,1 + 3002d4e: 00f037b3 snez a5,a5 + 3002d52: 9f81 uxtb a5 + 3002d54: 853e mv a0,a5 + 3002d56: 50b2 lw ra,44(sp) + 3002d58: 5422 lw s0,40(sp) + 3002d5a: 6145 addi sp,sp,48 + 3002d5c: 8082 ret + +03002d5e : + 3002d5e: 7179 addi sp,sp,-48 + 3002d60: d606 sw ra,44(sp) + 3002d62: d422 sw s0,40(sp) + 3002d64: 1800 addi s0,sp,48 + 3002d66: fca42e23 sw a0,-36(s0) + 3002d6a: fcb42c23 sw a1,-40(s0) + 3002d6e: fdc42783 lw a5,-36(s0) + 3002d72: eb89 bnez a5,3002d84 + 3002d74: 3a200593 li a1,930 + 3002d78: 0300f7b7 lui a5,0x300f + 3002d7c: 08c78513 addi a0,a5,140 # 300f08c + 3002d80: 2071 jal ra,3002e0c + 3002d82: a001 j 3002d82 + 3002d84: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d88: eb89 bnez a5,3002d9a + 3002d8a: 3a300593 li a1,931 + 3002d8e: 0300f7b7 lui a5,0x300f + 3002d92: 08c78513 addi a0,a5,140 # 300f08c + 3002d96: 289d jal ra,3002e0c + 3002d98: a001 j 3002d98 + 3002d9a: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d9e: fef42623 sw a5,-20(s0) + 3002da2: fdc42783 lw a5,-36(s0) + 3002da6: 279e lhu a5,8(a5) + 3002da8: 873e mv a4,a5 + 3002daa: fec42783 lw a5,-20(s0) + 3002dae: 97ba add a5,a5,a4 + 3002db0: fef42423 sw a5,-24(s0) + 3002db4: fe842783 lw a5,-24(s0) + 3002db8: 43dc lw a5,4(a5) + 3002dba: fef42223 sw a5,-28(s0) + 3002dbe: fd842783 lw a5,-40(s0) + 3002dc2: cf99 beqz a5,3002de0 + 3002dc4: fe442783 lw a5,-28(s0) + 3002dc8: 0017e793 ori a5,a5,1 + 3002dcc: fef42223 sw a5,-28(s0) + 3002dd0: fe442783 lw a5,-28(s0) + 3002dd4: 7741 lui a4,0xffff0 + 3002dd6: 177d addi a4,a4,-1 # fffeffff + 3002dd8: 8ff9 and a5,a5,a4 + 3002dda: fef42223 sw a5,-28(s0) + 3002dde: a829 j 3002df8 + 3002de0: fe442783 lw a5,-28(s0) + 3002de4: 9bf9 andi a5,a5,-2 + 3002de6: fef42223 sw a5,-28(s0) + 3002dea: fe442783 lw a5,-28(s0) + 3002dee: 7741 lui a4,0xffff0 + 3002df0: 177d addi a4,a4,-1 # fffeffff + 3002df2: 8ff9 and a5,a5,a4 + 3002df4: fef42223 sw a5,-28(s0) + 3002df8: fe442703 lw a4,-28(s0) + 3002dfc: fe842783 lw a5,-24(s0) + 3002e00: c3d8 sw a4,4(a5) + 3002e02: 0001 nop + 3002e04: 50b2 lw ra,44(sp) + 3002e06: 5422 lw s0,40(sp) + 3002e08: 6145 addi sp,sp,48 + 3002e0a: 8082 ret + +03002e0c : + 3002e0c: be4fe06f j 30011f0 + +03002e10 : + 3002e10: 7179 addi sp,sp,-48 + 3002e12: d606 sw ra,44(sp) + 3002e14: d422 sw s0,40(sp) + 3002e16: 1800 addi s0,sp,48 + 3002e18: fca42e23 sw a0,-36(s0) + 3002e1c: fdc42783 lw a5,-36(s0) + 3002e20: eb89 bnez a5,3002e32 + 3002e22: 3ba00593 li a1,954 + 3002e26: 0300f7b7 lui a5,0x300f + 3002e2a: 08c78513 addi a0,a5,140 # 300f08c + 3002e2e: 3ff9 jal ra,3002e0c + 3002e30: a001 j 3002e30 + 3002e32: 2b01a783 lw a5,688(gp) # 40008e4 + 3002e36: eb89 bnez a5,3002e48 + 3002e38: 3bb00593 li a1,955 + 3002e3c: 0300f7b7 lui a5,0x300f + 3002e40: 08c78513 addi a0,a5,140 # 300f08c + 3002e44: 37e1 jal ra,3002e0c + 3002e46: a001 j 3002e46 + 3002e48: 2b01a783 lw a5,688(gp) # 40008e4 + 3002e4c: fef42623 sw a5,-20(s0) + 3002e50: fdc42783 lw a5,-36(s0) + 3002e54: 279e lhu a5,8(a5) + 3002e56: 873e mv a4,a5 + 3002e58: fec42783 lw a5,-20(s0) + 3002e5c: 97ba add a5,a5,a4 + 3002e5e: fef42423 sw a5,-24(s0) + 3002e62: fe842783 lw a5,-24(s0) + 3002e66: 43dc lw a5,4(a5) + 3002e68: 8b85 andi a5,a5,1 + 3002e6a: 9f81 uxtb a5 + 3002e6c: c399 beqz a5,3002e72 + 3002e6e: 4785 li a5,1 + 3002e70: a011 j 3002e74 + 3002e72: 4781 li a5,0 + 3002e74: fef42223 sw a5,-28(s0) + 3002e78: fe442783 lw a5,-28(s0) + 3002e7c: 853e mv a0,a5 + 3002e7e: 50b2 lw ra,44(sp) + 3002e80: 5422 lw s0,40(sp) + 3002e82: 6145 addi sp,sp,48 + 3002e84: 8082 ret + +03002e86 : + 3002e86: 7179 addi sp,sp,-48 + 3002e88: d606 sw ra,44(sp) + 3002e8a: d422 sw s0,40(sp) + 3002e8c: 1800 addi s0,sp,48 + 3002e8e: fca42e23 sw a0,-36(s0) + 3002e92: fcb42c23 sw a1,-40(s0) + 3002e96: fdc42783 lw a5,-36(s0) + 3002e9a: eb89 bnez a5,3002eac + 3002e9c: 3cc00593 li a1,972 + 3002ea0: 0300f7b7 lui a5,0x300f + 3002ea4: 08c78513 addi a0,a5,140 # 300f08c + 3002ea8: 3795 jal ra,3002e0c + 3002eaa: a001 j 3002eaa + 3002eac: 2b01a783 lw a5,688(gp) # 40008e4 + 3002eb0: eb89 bnez a5,3002ec2 + 3002eb2: 3cd00593 li a1,973 + 3002eb6: 0300f7b7 lui a5,0x300f + 3002eba: 08c78513 addi a0,a5,140 # 300f08c + 3002ebe: 37b9 jal ra,3002e0c + 3002ec0: a001 j 3002ec0 + 3002ec2: 2b01a703 lw a4,688(gp) # 40008e4 + 3002ec6: 100007b7 lui a5,0x10000 + 3002eca: 00f70a63 beq a4,a5,3002ede + 3002ece: 3ce00593 li a1,974 + 3002ed2: 0300f7b7 lui a5,0x300f + 3002ed6: 08c78513 addi a0,a5,140 # 300f08c + 3002eda: 3f0d jal ra,3002e0c + 3002edc: a001 j 3002edc + 3002ede: fd842503 lw a0,-40(s0) + 3002ee2: 878ff0ef jal ra,3001f5a + 3002ee6: 87aa mv a5,a0 + 3002ee8: 0017c793 xori a5,a5,1 + 3002eec: 9f81 uxtb a5 + 3002eee: cb89 beqz a5,3002f00 + 3002ef0: 3cf00593 li a1,975 + 3002ef4: 0300f7b7 lui a5,0x300f + 3002ef8: 08c78513 addi a0,a5,140 # 300f08c + 3002efc: 3f01 jal ra,3002e0c + 3002efe: a0bd j 3002f6c + 3002f00: 2b01a783 lw a5,688(gp) # 40008e4 + 3002f04: fef42623 sw a5,-20(s0) + 3002f08: fdc42783 lw a5,-36(s0) + 3002f0c: 279e lhu a5,8(a5) + 3002f0e: 873e mv a4,a5 + 3002f10: fec42783 lw a5,-20(s0) + 3002f14: 97ba add a5,a5,a4 + 3002f16: fef42423 sw a5,-24(s0) + 3002f1a: fd842703 lw a4,-40(s0) + 3002f1e: 478d li a5,3 + 3002f20: 00f71a63 bne a4,a5,3002f34 + 3002f24: fe842703 lw a4,-24(s0) + 3002f28: 435c lw a5,4(a4) + 3002f2a: 010006b7 lui a3,0x1000 + 3002f2e: 8fd5 or a5,a5,a3 + 3002f30: c35c sw a5,4(a4) + 3002f32: a82d j 3002f6c + 3002f34: d43fe0ef jal ra,3001c76 + 3002f38: 2b01a703 lw a4,688(gp) # 40008e4 + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: 8b8d andi a5,a5,3 + 3002f42: 0ff7f693 andi a3,a5,255 + 3002f46: 10072783 lw a5,256(a4) + 3002f4a: 8a8d andi a3,a3,3 + 3002f4c: 0692 slli a3,a3,0x4 + 3002f4e: fcf7f793 andi a5,a5,-49 + 3002f52: 8fd5 or a5,a5,a3 + 3002f54: 10f72023 sw a5,256(a4) + 3002f58: d47fe0ef jal ra,3001c9e + 3002f5c: fe842703 lw a4,-24(s0) + 3002f60: 435c lw a5,4(a4) + 3002f62: ff0006b7 lui a3,0xff000 + 3002f66: 16fd addi a3,a3,-1 # feffffff + 3002f68: 8ff5 and a5,a5,a3 + 3002f6a: c35c sw a5,4(a4) + 3002f6c: 50b2 lw ra,44(sp) + 3002f6e: 5422 lw s0,40(sp) + 3002f70: 6145 addi sp,sp,48 + 3002f72: 8082 ret + +03002f74 : + 3002f74: 7179 addi sp,sp,-48 + 3002f76: d606 sw ra,44(sp) + 3002f78: d422 sw s0,40(sp) + 3002f7a: 1800 addi s0,sp,48 + 3002f7c: fca42e23 sw a0,-36(s0) + 3002f80: fdc42783 lw a5,-36(s0) + 3002f84: eb89 bnez a5,3002f96 + 3002f86: 3e400593 li a1,996 + 3002f8a: 0300f7b7 lui a5,0x300f + 3002f8e: 08c78513 addi a0,a5,140 # 300f08c + 3002f92: 3dad jal ra,3002e0c + 3002f94: a001 j 3002f94 + 3002f96: 2b01a783 lw a5,688(gp) # 40008e4 + 3002f9a: eb89 bnez a5,3002fac + 3002f9c: 3e500593 li a1,997 + 3002fa0: 0300f7b7 lui a5,0x300f + 3002fa4: 08c78513 addi a0,a5,140 # 300f08c + 3002fa8: 3595 jal ra,3002e0c + 3002faa: a001 j 3002faa + 3002fac: 2b01a783 lw a5,688(gp) # 40008e4 + 3002fb0: fef42623 sw a5,-20(s0) + 3002fb4: fdc42783 lw a5,-36(s0) + 3002fb8: 279e lhu a5,8(a5) + 3002fba: 873e mv a4,a5 + 3002fbc: fec42783 lw a5,-20(s0) + 3002fc0: 97ba add a5,a5,a4 + 3002fc2: fef42423 sw a5,-24(s0) + 3002fc6: fe842783 lw a5,-24(s0) + 3002fca: 43dc lw a5,4(a5) + 3002fcc: 83e1 srli a5,a5,0x18 + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f713 andi a4,a5,255 + 3002fd4: 4785 li a5,1 + 3002fd6: 00f71463 bne a4,a5,3002fde + 3002fda: 478d li a5,3 + 3002fdc: a801 j 3002fec + 3002fde: 2b01a783 lw a5,688(gp) # 40008e4 + 3002fe2: 1007a783 lw a5,256(a5) + 3002fe6: 8391 srli a5,a5,0x4 + 3002fe8: 8b8d andi a5,a5,3 + 3002fea: 9f81 uxtb a5 + 3002fec: 853e mv a0,a5 + 3002fee: 50b2 lw ra,44(sp) + 3002ff0: 5422 lw s0,40(sp) + 3002ff2: 6145 addi sp,sp,48 + 3002ff4: 8082 ret + +03002ff6 : + 3002ff6: 7179 addi sp,sp,-48 + 3002ff8: d606 sw ra,44(sp) + 3002ffa: d422 sw s0,40(sp) + 3002ffc: 1800 addi s0,sp,48 + 3002ffe: fca42e23 sw a0,-36(s0) + 3003002: fcb42c23 sw a1,-40(s0) + 3003006: fdc42783 lw a5,-36(s0) + 300300a: eb89 bnez a5,300301c + 300300c: 3f700593 li a1,1015 + 3003010: 0300f7b7 lui a5,0x300f + 3003014: 08c78513 addi a0,a5,140 # 300f08c + 3003018: 3bd5 jal ra,3002e0c + 300301a: a001 j 300301a + 300301c: 2b01a783 lw a5,688(gp) # 40008e4 + 3003020: eb89 bnez a5,3003032 + 3003022: 3f800593 li a1,1016 + 3003026: 0300f7b7 lui a5,0x300f + 300302a: 08c78513 addi a0,a5,140 # 300f08c + 300302e: 3bf9 jal ra,3002e0c + 3003030: a001 j 3003030 + 3003032: fd842503 lw a0,-40(s0) + 3003036: f65fe0ef jal ra,3001f9a + 300303a: 87aa mv a5,a0 + 300303c: 0017c793 xori a5,a5,1 + 3003040: 9f81 uxtb a5 + 3003042: cb89 beqz a5,3003054 + 3003044: 3f900593 li a1,1017 + 3003048: 0300f7b7 lui a5,0x300f + 300304c: 08c78513 addi a0,a5,140 # 300f08c + 3003050: 3b75 jal ra,3002e0c + 3003052: a0b5 j 30030be + 3003054: 2b01a783 lw a5,688(gp) # 40008e4 + 3003058: fef42623 sw a5,-20(s0) + 300305c: fdc42783 lw a5,-36(s0) + 3003060: 279e lhu a5,8(a5) + 3003062: 873e mv a4,a5 + 3003064: fec42783 lw a5,-20(s0) + 3003068: 97ba add a5,a5,a4 + 300306a: fef42423 sw a5,-24(s0) + 300306e: fe842783 lw a5,-24(s0) + 3003072: 43dc lw a5,4(a5) + 3003074: 83e1 srli a5,a5,0x18 + 3003076: 8b85 andi a5,a5,1 + 3003078: 9f81 uxtb a5 + 300307a: fef42223 sw a5,-28(s0) + 300307e: fe442703 lw a4,-28(s0) + 3003082: 4785 li a5,1 + 3003084: 02f71163 bne a4,a5,30030a6 + 3003088: fd842783 lw a5,-40(s0) + 300308c: 8b8d andi a5,a5,3 + 300308e: 0ff7f693 andi a3,a5,255 + 3003092: fe842703 lw a4,-24(s0) + 3003096: 431c lw a5,0(a4) + 3003098: 8a8d andi a3,a3,3 + 300309a: 06a2 slli a3,a3,0x8 + 300309c: cff7f793 andi a5,a5,-769 + 30030a0: 8fd5 or a5,a5,a3 + 30030a2: c31c sw a5,0(a4) + 30030a4: a829 j 30030be + 30030a6: fd842783 lw a5,-40(s0) + 30030aa: 8b8d andi a5,a5,3 + 30030ac: 0ff7f693 andi a3,a5,255 + 30030b0: fe842703 lw a4,-24(s0) + 30030b4: 431c lw a5,0(a4) + 30030b6: 8a8d andi a3,a3,3 + 30030b8: 9bf1 andi a5,a5,-4 + 30030ba: 8fd5 or a5,a5,a3 + 30030bc: c31c sw a5,0(a4) + 30030be: 50b2 lw ra,44(sp) + 30030c0: 5422 lw s0,40(sp) + 30030c2: 6145 addi sp,sp,48 + 30030c4: 8082 ret + +030030c6 : + 30030c6: 7179 addi sp,sp,-48 + 30030c8: d606 sw ra,44(sp) + 30030ca: d422 sw s0,40(sp) + 30030cc: 1800 addi s0,sp,48 + 30030ce: fca42e23 sw a0,-36(s0) + 30030d2: fdc42783 lw a5,-36(s0) + 30030d6: eb89 bnez a5,30030e8 + 30030d8: 40c00593 li a1,1036 + 30030dc: 0300f7b7 lui a5,0x300f + 30030e0: 08c78513 addi a0,a5,140 # 300f08c + 30030e4: 3325 jal ra,3002e0c + 30030e6: a001 j 30030e6 + 30030e8: 2b01a783 lw a5,688(gp) # 40008e4 + 30030ec: eb89 bnez a5,30030fe + 30030ee: 40d00593 li a1,1037 + 30030f2: 0300f7b7 lui a5,0x300f + 30030f6: 08c78513 addi a0,a5,140 # 300f08c + 30030fa: 3b09 jal ra,3002e0c + 30030fc: a001 j 30030fc + 30030fe: 2b01a783 lw a5,688(gp) # 40008e4 + 3003102: fef42623 sw a5,-20(s0) + 3003106: fdc42783 lw a5,-36(s0) + 300310a: 279e lhu a5,8(a5) + 300310c: 873e mv a4,a5 + 300310e: fec42783 lw a5,-20(s0) + 3003112: 97ba add a5,a5,a4 + 3003114: fef42423 sw a5,-24(s0) + 3003118: fe842783 lw a5,-24(s0) + 300311c: 43dc lw a5,4(a5) + 300311e: 83e1 srli a5,a5,0x18 + 3003120: 8b85 andi a5,a5,1 + 3003122: 9f81 uxtb a5 + 3003124: fef42223 sw a5,-28(s0) + 3003128: fe442703 lw a4,-28(s0) + 300312c: 4785 li a5,1 + 300312e: 00f71963 bne a4,a5,3003140 + 3003132: fe842783 lw a5,-24(s0) + 3003136: 439c lw a5,0(a5) + 3003138: 83a1 srli a5,a5,0x8 + 300313a: 8b8d andi a5,a5,3 + 300313c: 9f81 uxtb a5 + 300313e: a031 j 300314a + 3003140: fe842783 lw a5,-24(s0) + 3003144: 439c lw a5,0(a5) + 3003146: 8b8d andi a5,a5,3 + 3003148: 9f81 uxtb a5 + 300314a: 853e mv a0,a5 + 300314c: 50b2 lw ra,44(sp) + 300314e: 5422 lw s0,40(sp) + 3003150: 6145 addi sp,sp,48 + 3003152: 8082 ret + +03003154 : + 3003154: 7179 addi sp,sp,-48 + 3003156: d606 sw ra,44(sp) + 3003158: d422 sw s0,40(sp) + 300315a: 1800 addi s0,sp,48 + 300315c: fca42e23 sw a0,-36(s0) + 3003160: fcb42c23 sw a1,-40(s0) + 3003164: fdc42783 lw a5,-36(s0) + 3003168: eb89 bnez a5,300317a + 300316a: 42100593 li a1,1057 + 300316e: 0300f7b7 lui a5,0x300f + 3003172: 08c78513 addi a0,a5,140 # 300f08c + 3003176: 3959 jal ra,3002e0c + 3003178: a001 j 3003178 + 300317a: 2b01a783 lw a5,688(gp) # 40008e4 + 300317e: eb89 bnez a5,3003190 + 3003180: 42200593 li a1,1058 + 3003184: 0300f7b7 lui a5,0x300f + 3003188: 08c78513 addi a0,a5,140 # 300f08c + 300318c: 3141 jal ra,3002e0c + 300318e: a001 j 300318e + 3003190: 2b01a783 lw a5,688(gp) # 40008e4 + 3003194: fef42623 sw a5,-20(s0) + 3003198: fdc42783 lw a5,-36(s0) + 300319c: 279e lhu a5,8(a5) + 300319e: 873e mv a4,a5 + 30031a0: fec42783 lw a5,-20(s0) + 30031a4: 97ba add a5,a5,a4 + 30031a6: fef42423 sw a5,-24(s0) + 30031aa: fd842783 lw a5,-40(s0) + 30031ae: 8b85 andi a5,a5,1 + 30031b0: 0ff7f693 andi a3,a5,255 + 30031b4: fe842703 lw a4,-24(s0) + 30031b8: 431c lw a5,0(a4) + 30031ba: 8a85 andi a3,a3,1 + 30031bc: 9bf9 andi a5,a5,-2 + 30031be: 8fd5 or a5,a5,a3 + 30031c0: c31c sw a5,0(a4) + 30031c2: 0001 nop + 30031c4: 50b2 lw ra,44(sp) + 30031c6: 5422 lw s0,40(sp) + 30031c8: 6145 addi sp,sp,48 + 30031ca: 8082 ret + +030031cc : + 30031cc: 7179 addi sp,sp,-48 + 30031ce: d606 sw ra,44(sp) + 30031d0: d422 sw s0,40(sp) + 30031d2: 1800 addi s0,sp,48 + 30031d4: fca42e23 sw a0,-36(s0) + 30031d8: fdc42783 lw a5,-36(s0) + 30031dc: eb89 bnez a5,30031ee + 30031de: 43000593 li a1,1072 + 30031e2: 0300f7b7 lui a5,0x300f + 30031e6: 08c78513 addi a0,a5,140 # 300f08c + 30031ea: 310d jal ra,3002e0c + 30031ec: a001 j 30031ec + 30031ee: 2b01a783 lw a5,688(gp) # 40008e4 + 30031f2: eb89 bnez a5,3003204 + 30031f4: 43100593 li a1,1073 + 30031f8: 0300f7b7 lui a5,0x300f + 30031fc: 08c78513 addi a0,a5,140 # 300f08c + 3003200: 3131 jal ra,3002e0c + 3003202: a001 j 3003202 + 3003204: 2b01a783 lw a5,688(gp) # 40008e4 + 3003208: fef42623 sw a5,-20(s0) + 300320c: fdc42783 lw a5,-36(s0) + 3003210: 279e lhu a5,8(a5) + 3003212: 873e mv a4,a5 + 3003214: fec42783 lw a5,-20(s0) + 3003218: 97ba add a5,a5,a4 + 300321a: fef42423 sw a5,-24(s0) + 300321e: fe842783 lw a5,-24(s0) + 3003222: 439c lw a5,0(a5) + 3003224: 8b85 andi a5,a5,1 + 3003226: 9f81 uxtb a5 + 3003228: 853e mv a0,a5 + 300322a: 50b2 lw ra,44(sp) + 300322c: 5422 lw s0,40(sp) + 300322e: 6145 addi sp,sp,48 + 3003230: 8082 ret + +03003232 : + 3003232: 7179 addi sp,sp,-48 + 3003234: d606 sw ra,44(sp) + 3003236: d422 sw s0,40(sp) + 3003238: 1800 addi s0,sp,48 + 300323a: fca42e23 sw a0,-36(s0) + 300323e: fcb42c23 sw a1,-40(s0) + 3003242: fdc42783 lw a5,-36(s0) + 3003246: eb89 bnez a5,3003258 + 3003248: 44000593 li a1,1088 + 300324c: 0300f7b7 lui a5,0x300f + 3003250: 08c78513 addi a0,a5,140 # 300f08c + 3003254: 3e65 jal ra,3002e0c + 3003256: a001 j 3003256 + 3003258: 2b01a783 lw a5,688(gp) # 40008e4 + 300325c: eb89 bnez a5,300326e + 300325e: 44100593 li a1,1089 + 3003262: 0300f7b7 lui a5,0x300f + 3003266: 08c78513 addi a0,a5,140 # 300f08c + 300326a: 364d jal ra,3002e0c + 300326c: a001 j 300326c + 300326e: fd842703 lw a4,-40(s0) + 3003272: 4785 li a5,1 + 3003274: 00f70d63 beq a4,a5,300328e + 3003278: fd842783 lw a5,-40(s0) + 300327c: cb89 beqz a5,300328e + 300327e: 44200593 li a1,1090 + 3003282: 0300f7b7 lui a5,0x300f + 3003286: 08c78513 addi a0,a5,140 # 300f08c + 300328a: 3649 jal ra,3002e0c + 300328c: a209 j 300338e + 300328e: 2b01a783 lw a5,688(gp) # 40008e4 + 3003292: fef42623 sw a5,-20(s0) + 3003296: fdc42783 lw a5,-36(s0) + 300329a: 279e lhu a5,8(a5) + 300329c: 873e mv a4,a5 + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 97ba add a5,a5,a4 + 30032a4: fdc42703 lw a4,-36(s0) + 30032a8: 2738 lbu a4,10(a4) + 30032aa: 97ba add a5,a5,a4 + 30032ac: fef42423 sw a5,-24(s0) + 30032b0: fd842703 lw a4,-40(s0) + 30032b4: 4785 li a5,1 + 30032b6: 02f71b63 bne a4,a5,30032ec + 30032ba: fe842783 lw a5,-24(s0) + 30032be: 439c lw a5,0(a5) + 30032c0: 83c1 srli a5,a5,0x10 + 30032c2: 8b85 andi a5,a5,1 + 30032c4: 0ff7f713 andi a4,a5,255 + 30032c8: 4785 li a5,1 + 30032ca: 02f71163 bne a4,a5,30032ec + 30032ce: fe842703 lw a4,-24(s0) + 30032d2: 431c lw a5,0(a4) + 30032d4: 76c1 lui a3,0xffff0 + 30032d6: 16fd addi a3,a3,-1 # fffeffff + 30032d8: 8ff5 and a5,a5,a3 + 30032da: c31c sw a5,0(a4) + 30032dc: 2b41c783 lbu a5,692(gp) # 40008e8 + 30032e0: 0785 addi a5,a5,1 + 30032e2: 0ff7f713 andi a4,a5,255 + 30032e6: 2ae18a23 sb a4,692(gp) # 40008e8 + 30032ea: a81d j 3003320 + 30032ec: fd842783 lw a5,-40(s0) + 30032f0: eb85 bnez a5,3003320 + 30032f2: fe842783 lw a5,-24(s0) + 30032f6: 439c lw a5,0(a5) + 30032f8: 83c1 srli a5,a5,0x10 + 30032fa: 8b85 andi a5,a5,1 + 30032fc: 9f81 uxtb a5 + 30032fe: e38d bnez a5,3003320 + 3003300: fe842703 lw a4,-24(s0) + 3003304: 431c lw a5,0(a4) + 3003306: 66c1 lui a3,0x10 + 3003308: 8fd5 or a5,a5,a3 + 300330a: c31c sw a5,0(a4) + 300330c: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003310: cb81 beqz a5,3003320 + 3003312: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003316: 17fd addi a5,a5,-1 + 3003318: 0ff7f713 andi a4,a5,255 + 300331c: 2ae18a23 sb a4,692(gp) # 40008e8 + 3003320: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003324: eb85 bnez a5,3003354 + 3003326: fd842783 lw a5,-40(s0) + 300332a: e78d bnez a5,3003354 + 300332c: 10000737 lui a4,0x10000 + 3003330: 6785 lui a5,0x1 + 3003332: 973e add a4,a4,a5 + 3003334: a5072783 lw a5,-1456(a4) # ffffa50 + 3003338: 9bf9 andi a5,a5,-2 + 300333a: a4f72823 sw a5,-1456(a4) + 300333e: 10000737 lui a4,0x10000 + 3003342: 6785 lui a5,0x1 + 3003344: 973e add a4,a4,a5 + 3003346: a5072783 lw a5,-1456(a4) # ffffa50 + 300334a: 66c1 lui a3,0x10 + 300334c: 8fd5 or a5,a5,a3 + 300334e: a4f72823 sw a5,-1456(a4) + 3003352: a835 j 300338e + 3003354: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003358: cb9d beqz a5,300338e + 300335a: fd842703 lw a4,-40(s0) + 300335e: 4785 li a5,1 + 3003360: 02f71763 bne a4,a5,300338e + 3003364: 10000737 lui a4,0x10000 + 3003368: 6785 lui a5,0x1 + 300336a: 973e add a4,a4,a5 + 300336c: a5072783 lw a5,-1456(a4) # ffffa50 + 3003370: 76c1 lui a3,0xffff0 + 3003372: 16fd addi a3,a3,-1 # fffeffff + 3003374: 8ff5 and a5,a5,a3 + 3003376: a4f72823 sw a5,-1456(a4) + 300337a: 10000737 lui a4,0x10000 + 300337e: 6785 lui a5,0x1 + 3003380: 973e add a4,a4,a5 + 3003382: a5072783 lw a5,-1456(a4) # ffffa50 + 3003386: 0017e793 ori a5,a5,1 + 300338a: a4f72823 sw a5,-1456(a4) + 300338e: 50b2 lw ra,44(sp) + 3003390: 5422 lw s0,40(sp) + 3003392: 6145 addi sp,sp,48 + 3003394: 8082 ret + +03003396 : + 3003396: 7179 addi sp,sp,-48 + 3003398: d606 sw ra,44(sp) + 300339a: d422 sw s0,40(sp) + 300339c: 1800 addi s0,sp,48 + 300339e: fca42e23 sw a0,-36(s0) + 30033a2: fdc42783 lw a5,-36(s0) + 30033a6: eb89 bnez a5,30033b8 + 30033a8: 46200593 li a1,1122 + 30033ac: 0300f7b7 lui a5,0x300f + 30033b0: 08c78513 addi a0,a5,140 # 300f08c + 30033b4: 3ca1 jal ra,3002e0c + 30033b6: a001 j 30033b6 + 30033b8: 2b01a783 lw a5,688(gp) # 40008e4 + 30033bc: eb89 bnez a5,30033ce + 30033be: 46300593 li a1,1123 + 30033c2: 0300f7b7 lui a5,0x300f + 30033c6: 08c78513 addi a0,a5,140 # 300f08c + 30033ca: 3489 jal ra,3002e0c + 30033cc: a001 j 30033cc + 30033ce: 2b01a783 lw a5,688(gp) # 40008e4 + 30033d2: fef42623 sw a5,-20(s0) + 30033d6: fdc42783 lw a5,-36(s0) + 30033da: 279e lhu a5,8(a5) + 30033dc: 873e mv a4,a5 + 30033de: fec42783 lw a5,-20(s0) + 30033e2: 97ba add a5,a5,a4 + 30033e4: fdc42703 lw a4,-36(s0) + 30033e8: 2738 lbu a4,10(a4) + 30033ea: 97ba add a5,a5,a4 + 30033ec: fef42423 sw a5,-24(s0) + 30033f0: fe842783 lw a5,-24(s0) + 30033f4: 439c lw a5,0(a5) + 30033f6: 83c1 srli a5,a5,0x10 + 30033f8: 8b85 andi a5,a5,1 + 30033fa: 9f81 uxtb a5 + 30033fc: 0017c793 xori a5,a5,1 + 3003400: 9f81 uxtb a5 + 3003402: 853e mv a0,a5 + 3003404: 50b2 lw ra,44(sp) + 3003406: 5422 lw s0,40(sp) + 3003408: 6145 addi sp,sp,48 + 300340a: 8082 ret + +0300340c : + 300340c: 1101 addi sp,sp,-32 + 300340e: ce22 sw s0,28(sp) + 3003410: 1000 addi s0,sp,32 + 3003412: fea42623 sw a0,-20(s0) + 3003416: 0001 nop + 3003418: 140007b7 lui a5,0x14000 + 300341c: 4f9c lw a5,24(a5) + 300341e: 8395 srli a5,a5,0x5 + 3003420: 8b85 andi a5,a5,1 + 3003422: 0ff7f713 andi a4,a5,255 + 3003426: 4785 li a5,1 + 3003428: fef708e3 beq a4,a5,3003418 + 300342c: 14000737 lui a4,0x14000 + 3003430: fec42783 lw a5,-20(s0) + 3003434: 0ff7f693 andi a3,a5,255 + 3003438: 431c lw a5,0(a4) + 300343a: 0ff6f693 andi a3,a3,255 + 300343e: f007f793 andi a5,a5,-256 + 3003442: 8fd5 or a5,a5,a3 + 3003444: c31c sw a5,0(a4) + 3003446: 0001 nop + 3003448: 4472 lw s0,28(sp) + 300344a: 6105 addi sp,sp,32 + 300344c: 8082 ret + +0300344e : + 300344e: 7179 addi sp,sp,-48 + 3003450: d606 sw ra,44(sp) + 3003452: d422 sw s0,40(sp) + 3003454: 1800 addi s0,sp,48 + 3003456: fca42e23 sw a0,-36(s0) + 300345a: fe042623 sw zero,-20(s0) + 300345e: a00d j 3003480 + 3003460: fdc42783 lw a5,-36(s0) + 3003464: 00078783 lb a5,0(a5) # 14000000 + 3003468: 853e mv a0,a5 + 300346a: 374d jal ra,300340c + 300346c: fdc42783 lw a5,-36(s0) + 3003470: 0785 addi a5,a5,1 + 3003472: fcf42e23 sw a5,-36(s0) + 3003476: fec42783 lw a5,-20(s0) + 300347a: 0785 addi a5,a5,1 + 300347c: fef42623 sw a5,-20(s0) + 3003480: fdc42783 lw a5,-36(s0) + 3003484: 00078783 lb a5,0(a5) + 3003488: ffe1 bnez a5,3003460 + 300348a: fec42783 lw a5,-20(s0) + 300348e: 853e mv a0,a5 + 3003490: 50b2 lw ra,44(sp) + 3003492: 5422 lw s0,40(sp) + 3003494: 6145 addi sp,sp,48 + 3003496: 8082 ret + +03003498 : + 3003498: 7179 addi sp,sp,-48 + 300349a: d622 sw s0,44(sp) + 300349c: 1800 addi s0,sp,48 + 300349e: fca42e23 sw a0,-36(s0) + 30034a2: fcb42c23 sw a1,-40(s0) + 30034a6: 4785 li a5,1 + 30034a8: fef42623 sw a5,-20(s0) + 30034ac: a809 j 30034be + 30034ae: fec42703 lw a4,-20(s0) + 30034b2: fdc42783 lw a5,-36(s0) + 30034b6: 02f707b3 mul a5,a4,a5 + 30034ba: fef42623 sw a5,-20(s0) + 30034be: fd842783 lw a5,-40(s0) + 30034c2: fff78713 addi a4,a5,-1 + 30034c6: fce42c23 sw a4,-40(s0) + 30034ca: f3f5 bnez a5,30034ae + 30034cc: fec42783 lw a5,-20(s0) + 30034d0: 853e mv a0,a5 + 30034d2: 5432 lw s0,44(sp) + 30034d4: 6145 addi sp,sp,48 + 30034d6: 8082 ret + +030034d8 : + 30034d8: 7179 addi sp,sp,-48 + 30034da: d622 sw s0,44(sp) + 30034dc: 1800 addi s0,sp,48 + 30034de: fca42e23 sw a0,-36(s0) + 30034e2: fcb42c23 sw a1,-40(s0) + 30034e6: fe042623 sw zero,-20(s0) + 30034ea: fd842783 lw a5,-40(s0) + 30034ee: e78d bnez a5,3003518 + 30034f0: 4781 li a5,0 + 30034f2: a099 j 3003538 + 30034f4: fec42783 lw a5,-20(s0) + 30034f8: 0785 addi a5,a5,1 + 30034fa: fef42623 sw a5,-20(s0) + 30034fe: fec42703 lw a4,-20(s0) + 3003502: 47fd li a5,31 + 3003504: 00e7ee63 bltu a5,a4,3003520 + 3003508: fdc42703 lw a4,-36(s0) + 300350c: fd842783 lw a5,-40(s0) + 3003510: 02f757b3 divu a5,a4,a5 + 3003514: fcf42e23 sw a5,-36(s0) + 3003518: fdc42783 lw a5,-36(s0) + 300351c: ffe1 bnez a5,30034f4 + 300351e: a011 j 3003522 + 3003520: 0001 nop + 3003522: fec42783 lw a5,-20(s0) + 3003526: c781 beqz a5,300352e + 3003528: fec42783 lw a5,-20(s0) + 300352c: a011 j 3003530 + 300352e: 4785 li a5,1 + 3003530: fef42623 sw a5,-20(s0) + 3003534: fec42783 lw a5,-20(s0) + 3003538: 853e mv a0,a5 + 300353a: 5432 lw s0,44(sp) + 300353c: 6145 addi sp,sp,48 + 300353e: 8082 ret + +03003540 : + 3003540: 7179 addi sp,sp,-48 + 3003542: d606 sw ra,44(sp) + 3003544: d422 sw s0,40(sp) + 3003546: 1800 addi s0,sp,48 + 3003548: fca42e23 sw a0,-36(s0) + 300354c: fcb42c23 sw a1,-40(s0) + 3003550: fcc42a23 sw a2,-44(s0) + 3003554: a069 j 30035de + 3003556: fd442783 lw a5,-44(s0) + 300355a: 17fd addi a5,a5,-1 + 300355c: 85be mv a1,a5 + 300355e: fd842503 lw a0,-40(s0) + 3003562: 3f1d jal ra,3003498 + 3003564: 872a mv a4,a0 + 3003566: fdc42783 lw a5,-36(s0) + 300356a: 02e7d7b3 divu a5,a5,a4 + 300356e: fef407a3 sb a5,-17(s0) + 3003572: fd442783 lw a5,-44(s0) + 3003576: 17fd addi a5,a5,-1 + 3003578: 85be mv a1,a5 + 300357a: fd842503 lw a0,-40(s0) + 300357e: 3f29 jal ra,3003498 + 3003580: 872a mv a4,a0 + 3003582: fdc42783 lw a5,-36(s0) + 3003586: 02e7f7b3 remu a5,a5,a4 + 300358a: fcf42e23 sw a5,-36(s0) + 300358e: fd842703 lw a4,-40(s0) + 3003592: 47a9 li a5,10 + 3003594: 00f71963 bne a4,a5,30035a6 + 3003598: fef44783 lbu a5,-17(s0) + 300359c: 03078793 addi a5,a5,48 + 30035a0: 853e mv a0,a5 + 30035a2: 35ad jal ra,300340c + 30035a4: a805 j 30035d4 + 30035a6: fd842703 lw a4,-40(s0) + 30035aa: 47c1 li a5,16 + 30035ac: 02f71d63 bne a4,a5,30035e6 + 30035b0: fef44703 lbu a4,-17(s0) + 30035b4: 47a5 li a5,9 + 30035b6: 00e7e963 bltu a5,a4,30035c8 + 30035ba: fef44783 lbu a5,-17(s0) + 30035be: 03078793 addi a5,a5,48 + 30035c2: 853e mv a0,a5 + 30035c4: 35a1 jal ra,300340c + 30035c6: a039 j 30035d4 + 30035c8: fef44783 lbu a5,-17(s0) + 30035cc: 03778793 addi a5,a5,55 + 30035d0: 853e mv a0,a5 + 30035d2: 3d2d jal ra,300340c + 30035d4: fd442783 lw a5,-44(s0) + 30035d8: 17fd addi a5,a5,-1 + 30035da: fcf42a23 sw a5,-44(s0) + 30035de: fd442783 lw a5,-44(s0) + 30035e2: fbb5 bnez a5,3003556 + 30035e4: a011 j 30035e8 + 30035e6: 0001 nop + 30035e8: 0001 nop + 30035ea: 50b2 lw ra,44(sp) + 30035ec: 5422 lw s0,40(sp) + 30035ee: 6145 addi sp,sp,48 + 30035f0: 8082 ret + +030035f2 : + 30035f2: 7179 addi sp,sp,-48 + 30035f4: d606 sw ra,44(sp) + 30035f6: d422 sw s0,40(sp) + 30035f8: 1800 addi s0,sp,48 + 30035fa: fca42e23 sw a0,-36(s0) + 30035fe: fdc42783 lw a5,-36(s0) + 3003602: e791 bnez a5,300360e + 3003604: 03000513 li a0,48 + 3003608: 3511 jal ra,300340c + 300360a: 4785 li a5,1 + 300360c: a82d j 3003646 + 300360e: fdc42783 lw a5,-36(s0) + 3003612: 0007db63 bgez a5,3003628 + 3003616: 02d00513 li a0,45 + 300361a: 3bcd jal ra,300340c + 300361c: fdc42783 lw a5,-36(s0) + 3003620: 40f007b3 neg a5,a5 + 3003624: fcf42e23 sw a5,-36(s0) + 3003628: 45a9 li a1,10 + 300362a: fdc42503 lw a0,-36(s0) + 300362e: 356d jal ra,30034d8 + 3003630: fea42623 sw a0,-20(s0) + 3003634: fdc42783 lw a5,-36(s0) + 3003638: fec42603 lw a2,-20(s0) + 300363c: 45a9 li a1,10 + 300363e: 853e mv a0,a5 + 3003640: 3701 jal ra,3003540 + 3003642: fec42783 lw a5,-20(s0) + 3003646: 853e mv a0,a5 + 3003648: 50b2 lw ra,44(sp) + 300364a: 5422 lw s0,40(sp) + 300364c: 6145 addi sp,sp,48 + 300364e: 8082 ret + +03003650 : + 3003650: 7179 addi sp,sp,-48 + 3003652: d606 sw ra,44(sp) + 3003654: d422 sw s0,40(sp) + 3003656: 1800 addi s0,sp,48 + 3003658: fca42e23 sw a0,-36(s0) + 300365c: fdc42783 lw a5,-36(s0) + 3003660: e791 bnez a5,300366c + 3003662: 03000513 li a0,48 + 3003666: 335d jal ra,300340c + 3003668: 4785 li a5,1 + 300366a: a005 j 300368a + 300366c: fdc42783 lw a5,-36(s0) + 3003670: 45c1 li a1,16 + 3003672: 853e mv a0,a5 + 3003674: 3595 jal ra,30034d8 + 3003676: fea42623 sw a0,-20(s0) + 300367a: fec42603 lw a2,-20(s0) + 300367e: 45c1 li a1,16 + 3003680: fdc42503 lw a0,-36(s0) + 3003684: 3d75 jal ra,3003540 + 3003686: fec42783 lw a5,-20(s0) + 300368a: 853e mv a0,a5 + 300368c: 50b2 lw ra,44(sp) + 300368e: 5422 lw s0,40(sp) + 3003690: 6145 addi sp,sp,48 + 3003692: 8082 ret + +03003694 : + 3003694: 7139 addi sp,sp,-64 + 3003696: de06 sw ra,60(sp) + 3003698: dc22 sw s0,56(sp) + 300369a: 0080 addi s0,sp,64 + 300369c: fca42627 fsw fa0,-52(s0) + 30036a0: fca42423 sw a0,-56(s0) + 30036a4: fe042623 sw zero,-20(s0) + 30036a8: fcc42787 flw fa5,-52(s0) + 30036ac: f0000753 fmv.w.x fa4,zero + 30036b0: a0e797d3 flt.s a5,fa5,fa4 + 30036b4: cf99 beqz a5,30036d2 + 30036b6: 02d00513 li a0,45 + 30036ba: 3b89 jal ra,300340c + 30036bc: fec42783 lw a5,-20(s0) + 30036c0: 0785 addi a5,a5,1 + 30036c2: fef42623 sw a5,-20(s0) + 30036c6: fcc42787 flw fa5,-52(s0) + 30036ca: 20f797d3 fneg.s fa5,fa5 + 30036ce: fcf42627 fsw fa5,-52(s0) + 30036d2: fcc42787 flw fa5,-52(s0) + 30036d6: c00797d3 fcvt.w.s a5,fa5,rtz + 30036da: fef42023 sw a5,-32(s0) + 30036de: fc842783 lw a5,-56(s0) + 30036e2: 0785 addi a5,a5,1 + 30036e4: 85be mv a1,a5 + 30036e6: 4529 li a0,10 + 30036e8: 3b45 jal ra,3003498 + 30036ea: fca42e23 sw a0,-36(s0) + 30036ee: fdc42783 lw a5,-36(s0) + 30036f2: d017f753 fcvt.s.wu fa4,a5 + 30036f6: fe042783 lw a5,-32(s0) + 30036fa: d007f7d3 fcvt.s.w fa5,a5 + 30036fe: fcc42687 flw fa3,-52(s0) + 3003702: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3003706: 10f777d3 fmul.s fa5,fa4,fa5 + 300370a: c00797d3 fcvt.w.s a5,fa5,rtz + 300370e: fef42423 sw a5,-24(s0) + 3003712: fe842703 lw a4,-24(s0) + 3003716: 47a9 li a5,10 + 3003718: 02f77733 remu a4,a4,a5 + 300371c: 4791 li a5,4 + 300371e: 00e7fb63 bgeu a5,a4,3003734 + 3003722: fe842703 lw a4,-24(s0) + 3003726: 47a9 li a5,10 + 3003728: 02f757b3 divu a5,a4,a5 + 300372c: 0785 addi a5,a5,1 + 300372e: fef42423 sw a5,-24(s0) + 3003732: a801 j 3003742 + 3003734: fe842703 lw a4,-24(s0) + 3003738: 47a9 li a5,10 + 300373a: 02f757b3 divu a5,a4,a5 + 300373e: fef42423 sw a5,-24(s0) + 3003742: fe042503 lw a0,-32(s0) + 3003746: 3575 jal ra,30035f2 + 3003748: 872a mv a4,a0 + 300374a: fec42783 lw a5,-20(s0) + 300374e: 97ba add a5,a5,a4 + 3003750: fef42623 sw a5,-20(s0) + 3003754: 02e00513 li a0,46 + 3003758: 3955 jal ra,300340c + 300375a: fec42783 lw a5,-20(s0) + 300375e: 0785 addi a5,a5,1 + 3003760: fef42623 sw a5,-20(s0) + 3003764: 45a9 li a1,10 + 3003766: fe842503 lw a0,-24(s0) + 300376a: 33bd jal ra,30034d8 + 300376c: fca42c23 sw a0,-40(s0) + 3003770: fc842703 lw a4,-56(s0) + 3003774: fd842783 lw a5,-40(s0) + 3003778: 02e7f763 bgeu a5,a4,30037a6 + 300377c: fe042223 sw zero,-28(s0) + 3003780: a809 j 3003792 + 3003782: 03000513 li a0,48 + 3003786: 3159 jal ra,300340c + 3003788: fe442783 lw a5,-28(s0) + 300378c: 0785 addi a5,a5,1 + 300378e: fef42223 sw a5,-28(s0) + 3003792: fc842703 lw a4,-56(s0) + 3003796: fd842783 lw a5,-40(s0) + 300379a: 40f707b3 sub a5,a4,a5 + 300379e: fe442703 lw a4,-28(s0) + 30037a2: fef760e3 bltu a4,a5,3003782 + 30037a6: fe842783 lw a5,-24(s0) + 30037aa: fd842603 lw a2,-40(s0) + 30037ae: 45a9 li a1,10 + 30037b0: 853e mv a0,a5 + 30037b2: 3379 jal ra,3003540 + 30037b4: fec42703 lw a4,-20(s0) + 30037b8: fc842783 lw a5,-56(s0) + 30037bc: 97ba add a5,a5,a4 + 30037be: fef42623 sw a5,-20(s0) + 30037c2: fec42783 lw a5,-20(s0) + 30037c6: 853e mv a0,a5 + 30037c8: 50f2 lw ra,60(sp) + 30037ca: 5462 lw s0,56(sp) + 30037cc: 6121 addi sp,sp,64 + 30037ce: 8082 ret + +030037d0 : + 30037d0: 7139 addi sp,sp,-64 + 30037d2: de06 sw ra,60(sp) + 30037d4: dc22 sw s0,56(sp) + 30037d6: 0080 addi s0,sp,64 + 30037d8: 87aa mv a5,a0 + 30037da: fcb42423 sw a1,-56(s0) + 30037de: fcf407a3 sb a5,-49(s0) + 30037e2: fe042623 sw zero,-20(s0) + 30037e6: fe0405a3 sb zero,-21(s0) + 30037ea: fe042223 sw zero,-28(s0) + 30037ee: fe042023 sw zero,-32(s0) + 30037f2: fc042e23 sw zero,-36(s0) + 30037f6: fc042c23 sw zero,-40(s0) + 30037fa: fc042a23 sw zero,-44(s0) + 30037fe: fcf40783 lb a5,-49(s0) + 3003802: fa878793 addi a5,a5,-88 + 3003806: 02000713 li a4,32 + 300380a: 14f76063 bltu a4,a5,300394a + 300380e: 00279713 slli a4,a5,0x2 + 3003812: 0300f7b7 lui a5,0x300f + 3003816: 0e078793 addi a5,a5,224 # 300f0e0 + 300381a: 97ba add a5,a5,a4 + 300381c: 439c lw a5,0(a5) + 300381e: 8782 jr a5 + 3003820: fc842783 lw a5,-56(s0) + 3003824: 439c lw a5,0(a5) + 3003826: 00478693 addi a3,a5,4 + 300382a: fc842703 lw a4,-56(s0) + 300382e: c314 sw a3,0(a4) + 3003830: 439c lw a5,0(a5) + 3003832: fef405a3 sb a5,-21(s0) + 3003836: feb40783 lb a5,-21(s0) + 300383a: 853e mv a0,a5 + 300383c: 3ec1 jal ra,300340c + 300383e: fec42783 lw a5,-20(s0) + 3003842: 0785 addi a5,a5,1 + 3003844: fef42623 sw a5,-20(s0) + 3003848: aa19 j 300395e + 300384a: fc842783 lw a5,-56(s0) + 300384e: 439c lw a5,0(a5) + 3003850: 00478693 addi a3,a5,4 + 3003854: fc842703 lw a4,-56(s0) + 3003858: c314 sw a3,0(a4) + 300385a: 439c lw a5,0(a5) + 300385c: fef42223 sw a5,-28(s0) + 3003860: fe442503 lw a0,-28(s0) + 3003864: 36ed jal ra,300344e + 3003866: 87aa mv a5,a0 + 3003868: 873e mv a4,a5 + 300386a: fec42783 lw a5,-20(s0) + 300386e: 97ba add a5,a5,a4 + 3003870: fef42623 sw a5,-20(s0) + 3003874: a0ed j 300395e + 3003876: fc842783 lw a5,-56(s0) + 300387a: 439c lw a5,0(a5) + 300387c: 00478693 addi a3,a5,4 + 3003880: fc842703 lw a4,-56(s0) + 3003884: c314 sw a3,0(a4) + 3003886: 439c lw a5,0(a5) + 3003888: fef42023 sw a5,-32(s0) + 300388c: fe042503 lw a0,-32(s0) + 3003890: 338d jal ra,30035f2 + 3003892: 872a mv a4,a0 + 3003894: fec42783 lw a5,-20(s0) + 3003898: 97ba add a5,a5,a4 + 300389a: fef42623 sw a5,-20(s0) + 300389e: a0c1 j 300395e + 30038a0: fc842783 lw a5,-56(s0) + 30038a4: 439c lw a5,0(a5) + 30038a6: 00478693 addi a3,a5,4 + 30038aa: fc842703 lw a4,-56(s0) + 30038ae: c314 sw a3,0(a4) + 30038b0: 439c lw a5,0(a5) + 30038b2: fcf42e23 sw a5,-36(s0) + 30038b6: fdc42783 lw a5,-36(s0) + 30038ba: 45a9 li a1,10 + 30038bc: 853e mv a0,a5 + 30038be: 3929 jal ra,30034d8 + 30038c0: fca42823 sw a0,-48(s0) + 30038c4: fd042603 lw a2,-48(s0) + 30038c8: 45a9 li a1,10 + 30038ca: fdc42503 lw a0,-36(s0) + 30038ce: 398d jal ra,3003540 + 30038d0: fec42703 lw a4,-20(s0) + 30038d4: fd042783 lw a5,-48(s0) + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42623 sw a5,-20(s0) + 30038de: a041 j 300395e + 30038e0: fc842783 lw a5,-56(s0) + 30038e4: 439c lw a5,0(a5) + 30038e6: 00478693 addi a3,a5,4 + 30038ea: fc842703 lw a4,-56(s0) + 30038ee: c314 sw a3,0(a4) + 30038f0: 439c lw a5,0(a5) + 30038f2: fcf42c23 sw a5,-40(s0) + 30038f6: fd842503 lw a0,-40(s0) + 30038fa: 3b99 jal ra,3003650 + 30038fc: 872a mv a4,a0 + 30038fe: fec42783 lw a5,-20(s0) + 3003902: 97ba add a5,a5,a4 + 3003904: fef42623 sw a5,-20(s0) + 3003908: a899 j 300395e + 300390a: fc842783 lw a5,-56(s0) + 300390e: 439c lw a5,0(a5) + 3003910: 079d addi a5,a5,7 + 3003912: 9be1 andi a5,a5,-8 + 3003914: 00878693 addi a3,a5,8 + 3003918: fc842703 lw a4,-56(s0) + 300391c: c314 sw a3,0(a4) + 300391e: 0047a803 lw a6,4(a5) + 3003922: 439c lw a5,0(a5) + 3003924: 853e mv a0,a5 + 3003926: 85c2 mv a1,a6 + 3003928: 5d70a0ef jal ra,300e6fe <__truncdfsf2> + 300392c: 20a507d3 fmv.s fa5,fa0 + 3003930: fcf42a27 fsw fa5,-44(s0) + 3003934: 4515 li a0,5 + 3003936: fd442507 flw fa0,-44(s0) + 300393a: 3ba9 jal ra,3003694 + 300393c: 872a mv a4,a0 + 300393e: fec42783 lw a5,-20(s0) + 3003942: 97ba add a5,a5,a4 + 3003944: fef42623 sw a5,-20(s0) + 3003948: a819 j 300395e + 300394a: fcf40783 lb a5,-49(s0) + 300394e: 853e mv a0,a5 + 3003950: 3c75 jal ra,300340c + 3003952: fec42783 lw a5,-20(s0) + 3003956: 0785 addi a5,a5,1 + 3003958: fef42623 sw a5,-20(s0) + 300395c: 0001 nop + 300395e: fec42783 lw a5,-20(s0) + 3003962: 853e mv a0,a5 + 3003964: 50f2 lw ra,60(sp) + 3003966: 5462 lw s0,56(sp) + 3003968: 6121 addi sp,sp,64 + 300396a: 8082 ret + +0300396c : + 300396c: 7139 addi sp,sp,-64 + 300396e: de06 sw ra,60(sp) + 3003970: dc22 sw s0,56(sp) + 3003972: 0080 addi s0,sp,64 + 3003974: fca42623 sw a0,-52(s0) + 3003978: fcb42423 sw a1,-56(s0) + 300397c: fc042e23 sw zero,-36(s0) + 3003980: fe042623 sw zero,-20(s0) + 3003984: fe042423 sw zero,-24(s0) + 3003988: fcc42783 lw a5,-52(s0) + 300398c: e791 bnez a5,3003998 + 300398e: 03000513 li a0,48 + 3003992: 3cad jal ra,300340c + 3003994: 4785 li a5,1 + 3003996: a0dd j 3003a7c + 3003998: fcc42783 lw a5,-52(s0) + 300399c: 0607dd63 bgez a5,3003a16 + 30039a0: 02d00513 li a0,45 + 30039a4: 34a5 jal ra,300340c + 30039a6: fe842783 lw a5,-24(s0) + 30039aa: 0785 addi a5,a5,1 + 30039ac: fef42423 sw a5,-24(s0) + 30039b0: fcc42783 lw a5,-52(s0) + 30039b4: 40f007b3 neg a5,a5 + 30039b8: fcf42623 sw a5,-52(s0) + 30039bc: 45a9 li a1,10 + 30039be: fcc42503 lw a0,-52(s0) + 30039c2: 3e19 jal ra,30034d8 + 30039c4: 87aa mv a5,a0 + 30039c6: fef42623 sw a5,-20(s0) + 30039ca: fc842703 lw a4,-56(s0) + 30039ce: fec42783 lw a5,-20(s0) + 30039d2: 40f707b3 sub a5,a4,a5 + 30039d6: fcf42e23 sw a5,-36(s0) + 30039da: fe042223 sw zero,-28(s0) + 30039de: a831 j 30039fa + 30039e0: 03000513 li a0,48 + 30039e4: 3425 jal ra,300340c + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 0785 addi a5,a5,1 + 30039ec: fef42423 sw a5,-24(s0) + 30039f0: fe442783 lw a5,-28(s0) + 30039f4: 0785 addi a5,a5,1 + 30039f6: fef42223 sw a5,-28(s0) + 30039fa: fe442703 lw a4,-28(s0) + 30039fe: fdc42783 lw a5,-36(s0) + 3003a02: fcf74fe3 blt a4,a5,30039e0 + 3003a06: fec42783 lw a5,-20(s0) + 3003a0a: fe842703 lw a4,-24(s0) + 3003a0e: 97ba add a5,a5,a4 + 3003a10: fef42423 sw a5,-24(s0) + 3003a14: a891 j 3003a68 + 3003a16: 45a9 li a1,10 + 3003a18: fcc42503 lw a0,-52(s0) + 3003a1c: 3c75 jal ra,30034d8 + 3003a1e: 87aa mv a5,a0 + 3003a20: fef42623 sw a5,-20(s0) + 3003a24: fec42783 lw a5,-20(s0) + 3003a28: fef42423 sw a5,-24(s0) + 3003a2c: fc842703 lw a4,-56(s0) + 3003a30: fec42783 lw a5,-20(s0) + 3003a34: 40f707b3 sub a5,a4,a5 + 3003a38: fcf42e23 sw a5,-36(s0) + 3003a3c: fe042023 sw zero,-32(s0) + 3003a40: a831 j 3003a5c + 3003a42: 03000513 li a0,48 + 3003a46: 32d9 jal ra,300340c + 3003a48: fe842783 lw a5,-24(s0) + 3003a4c: 0785 addi a5,a5,1 + 3003a4e: fef42423 sw a5,-24(s0) + 3003a52: fe042783 lw a5,-32(s0) + 3003a56: 0785 addi a5,a5,1 + 3003a58: fef42023 sw a5,-32(s0) + 3003a5c: fe042703 lw a4,-32(s0) + 3003a60: fdc42783 lw a5,-36(s0) + 3003a64: fcf74fe3 blt a4,a5,3003a42 + 3003a68: fcc42783 lw a5,-52(s0) + 3003a6c: fec42703 lw a4,-20(s0) + 3003a70: 863a mv a2,a4 + 3003a72: 45a9 li a1,10 + 3003a74: 853e mv a0,a5 + 3003a76: 34e9 jal ra,3003540 + 3003a78: fe842783 lw a5,-24(s0) + 3003a7c: 853e mv a0,a5 + 3003a7e: 50f2 lw ra,60(sp) + 3003a80: 5462 lw s0,56(sp) + 3003a82: 6121 addi sp,sp,64 + 3003a84: 8082 ret + +03003a86 : + 3003a86: 7179 addi sp,sp,-48 + 3003a88: d622 sw s0,44(sp) + 3003a8a: 1800 addi s0,sp,48 + 3003a8c: fca42e23 sw a0,-36(s0) + 3003a90: fe042623 sw zero,-20(s0) + 3003a94: a02d j 3003abe + 3003a96: fec42703 lw a4,-20(s0) + 3003a9a: 47a9 li a5,10 + 3003a9c: 02f70733 mul a4,a4,a5 + 3003aa0: fe842783 lw a5,-24(s0) + 3003aa4: 97ba add a5,a5,a4 + 3003aa6: fd078793 addi a5,a5,-48 + 3003aaa: fef42623 sw a5,-20(s0) + 3003aae: fdc42783 lw a5,-36(s0) + 3003ab2: 439c lw a5,0(a5) + 3003ab4: 00178713 addi a4,a5,1 + 3003ab8: fdc42783 lw a5,-36(s0) + 3003abc: c398 sw a4,0(a5) + 3003abe: fdc42783 lw a5,-36(s0) + 3003ac2: 439c lw a5,0(a5) + 3003ac4: 00078783 lb a5,0(a5) + 3003ac8: fef42423 sw a5,-24(s0) + 3003acc: fe842703 lw a4,-24(s0) + 3003ad0: 02f00793 li a5,47 + 3003ad4: 00e7d863 bge a5,a4,3003ae4 + 3003ad8: fe842703 lw a4,-24(s0) + 3003adc: 03900793 li a5,57 + 3003ae0: fae7dbe3 bge a5,a4,3003a96 + 3003ae4: fec42783 lw a5,-20(s0) + 3003ae8: 853e mv a0,a5 + 3003aea: 5432 lw s0,44(sp) + 3003aec: 6145 addi sp,sp,48 + 3003aee: 8082 ret + +03003af0 : + 3003af0: 711d addi sp,sp,-96 + 3003af2: de06 sw ra,60(sp) + 3003af4: dc22 sw s0,56(sp) + 3003af6: 0080 addi s0,sp,64 + 3003af8: fca42623 sw a0,-52(s0) + 3003afc: c04c sw a1,4(s0) + 3003afe: c410 sw a2,8(s0) + 3003b00: c454 sw a3,12(s0) + 3003b02: c818 sw a4,16(s0) + 3003b04: c85c sw a5,20(s0) + 3003b06: 01042c23 sw a6,24(s0) + 3003b0a: 01142e23 sw a7,28(s0) + 3003b0e: fe042623 sw zero,-20(s0) + 3003b12: fe042423 sw zero,-24(s0) + 3003b16: fe042223 sw zero,-28(s0) + 3003b1a: fe042023 sw zero,-32(s0) + 3003b1e: fc042e23 sw zero,-36(s0) + 3003b22: 02040793 addi a5,s0,32 + 3003b26: 1791 addi a5,a5,-28 + 3003b28: fcf42c23 sw a5,-40(s0) + 3003b2c: aa09 j 3003c3e + 3003b2e: fcc42783 lw a5,-52(s0) + 3003b32: 00078703 lb a4,0(a5) + 3003b36: 02500793 li a5,37 + 3003b3a: 00f70e63 beq a4,a5,3003b56 + 3003b3e: fcc42783 lw a5,-52(s0) + 3003b42: 00078783 lb a5,0(a5) + 3003b46: 853e mv a0,a5 + 3003b48: 30d1 jal ra,300340c + 3003b4a: fec42783 lw a5,-20(s0) + 3003b4e: 0785 addi a5,a5,1 + 3003b50: fef42623 sw a5,-20(s0) + 3003b54: a0c5 j 3003c34 + 3003b56: fcc42783 lw a5,-52(s0) + 3003b5a: 0785 addi a5,a5,1 + 3003b5c: fcf42623 sw a5,-52(s0) + 3003b60: fcc42783 lw a5,-52(s0) + 3003b64: 00078703 lb a4,0(a5) + 3003b68: 03000793 li a5,48 + 3003b6c: 04f71263 bne a4,a5,3003bb0 + 3003b70: fcc42783 lw a5,-52(s0) + 3003b74: 0785 addi a5,a5,1 + 3003b76: fcf42623 sw a5,-52(s0) + 3003b7a: fcc40793 addi a5,s0,-52 + 3003b7e: 853e mv a0,a5 + 3003b80: 3719 jal ra,3003a86 + 3003b82: fea42423 sw a0,-24(s0) + 3003b86: fd842783 lw a5,-40(s0) + 3003b8a: 00478713 addi a4,a5,4 + 3003b8e: fce42c23 sw a4,-40(s0) + 3003b92: 439c lw a5,0(a5) + 3003b94: fcf42e23 sw a5,-36(s0) + 3003b98: fe842583 lw a1,-24(s0) + 3003b9c: fdc42503 lw a0,-36(s0) + 3003ba0: 33f1 jal ra,300396c + 3003ba2: 872a mv a4,a0 + 3003ba4: fec42783 lw a5,-20(s0) + 3003ba8: 97ba add a5,a5,a4 + 3003baa: fef42623 sw a5,-20(s0) + 3003bae: a059 j 3003c34 + 3003bb0: fcc42783 lw a5,-52(s0) + 3003bb4: 00078703 lb a4,0(a5) + 3003bb8: 02e00793 li a5,46 + 3003bbc: 04f71d63 bne a4,a5,3003c16 + 3003bc0: fcc42783 lw a5,-52(s0) + 3003bc4: 0785 addi a5,a5,1 + 3003bc6: fcf42623 sw a5,-52(s0) + 3003bca: fcc40793 addi a5,s0,-52 + 3003bce: 853e mv a0,a5 + 3003bd0: 3d5d jal ra,3003a86 + 3003bd2: fea42223 sw a0,-28(s0) + 3003bd6: fd842783 lw a5,-40(s0) + 3003bda: 079d addi a5,a5,7 + 3003bdc: 9be1 andi a5,a5,-8 + 3003bde: 00878713 addi a4,a5,8 + 3003be2: fce42c23 sw a4,-40(s0) + 3003be6: 0047a803 lw a6,4(a5) + 3003bea: 439c lw a5,0(a5) + 3003bec: 853e mv a0,a5 + 3003bee: 85c2 mv a1,a6 + 3003bf0: 30f0a0ef jal ra,300e6fe <__truncdfsf2> + 3003bf4: 20a507d3 fmv.s fa5,fa0 + 3003bf8: fef42027 fsw fa5,-32(s0) + 3003bfc: fe442783 lw a5,-28(s0) + 3003c00: 853e mv a0,a5 + 3003c02: fe042507 flw fa0,-32(s0) + 3003c06: 3479 jal ra,3003694 + 3003c08: 872a mv a4,a0 + 3003c0a: fec42783 lw a5,-20(s0) + 3003c0e: 97ba add a5,a5,a4 + 3003c10: fef42623 sw a5,-20(s0) + 3003c14: a005 j 3003c34 + 3003c16: fcc42783 lw a5,-52(s0) + 3003c1a: 00078783 lb a5,0(a5) + 3003c1e: fd840713 addi a4,s0,-40 + 3003c22: 85ba mv a1,a4 + 3003c24: 853e mv a0,a5 + 3003c26: 366d jal ra,30037d0 + 3003c28: 872a mv a4,a0 + 3003c2a: fec42783 lw a5,-20(s0) + 3003c2e: 97ba add a5,a5,a4 + 3003c30: fef42623 sw a5,-20(s0) + 3003c34: fcc42783 lw a5,-52(s0) + 3003c38: 0785 addi a5,a5,1 + 3003c3a: fcf42623 sw a5,-52(s0) + 3003c3e: fcc42783 lw a5,-52(s0) + 3003c42: 00078783 lb a5,0(a5) + 3003c46: ee0794e3 bnez a5,3003b2e + 3003c4a: fec42783 lw a5,-20(s0) + 3003c4e: 853e mv a0,a5 + 3003c50: 50f2 lw ra,60(sp) + 3003c52: 5462 lw s0,56(sp) + 3003c54: 6125 addi sp,sp,96 + 3003c56: 8082 ret + +03003c58 : + 3003c58: 1101 addi sp,sp,-32 + 3003c5a: ce22 sw s0,28(sp) + 3003c5c: 1000 addi s0,sp,32 + 3003c5e: fea42623 sw a0,-20(s0) + 3003c62: fec42783 lw a5,-20(s0) + 3003c66: c791 beqz a5,3003c72 + 3003c68: fec42703 lw a4,-20(s0) + 3003c6c: 4785 li a5,1 + 3003c6e: 00f71463 bne a4,a5,3003c76 + 3003c72: 4785 li a5,1 + 3003c74: a011 j 3003c78 + 3003c76: 4781 li a5,0 + 3003c78: 8b85 andi a5,a5,1 + 3003c7a: 9f81 uxtb a5 + 3003c7c: 853e mv a0,a5 + 3003c7e: 4472 lw s0,28(sp) + 3003c80: 6105 addi sp,sp,32 + 3003c82: 8082 ret + +03003c84 : + 3003c84: 1101 addi sp,sp,-32 + 3003c86: ce22 sw s0,28(sp) + 3003c88: 1000 addi s0,sp,32 + 3003c8a: fea42623 sw a0,-20(s0) + 3003c8e: fec42783 lw a5,-20(s0) + 3003c92: c791 beqz a5,3003c9e + 3003c94: fec42703 lw a4,-20(s0) + 3003c98: 4785 li a5,1 + 3003c9a: 00f71463 bne a4,a5,3003ca2 + 3003c9e: 4785 li a5,1 + 3003ca0: a011 j 3003ca4 + 3003ca2: 4781 li a5,0 + 3003ca4: 8b85 andi a5,a5,1 + 3003ca6: 9f81 uxtb a5 + 3003ca8: 853e mv a0,a5 + 3003caa: 4472 lw s0,28(sp) + 3003cac: 6105 addi sp,sp,32 + 3003cae: 8082 ret + +03003cb0 : + 3003cb0: 1101 addi sp,sp,-32 + 3003cb2: ce22 sw s0,28(sp) + 3003cb4: 1000 addi s0,sp,32 + 3003cb6: fea42623 sw a0,-20(s0) + 3003cba: fec42783 lw a5,-20(s0) + 3003cbe: 0ff7f793 andi a5,a5,255 + 3003cc2: cb81 beqz a5,3003cd2 + 3003cc4: fec42783 lw a5,-20(s0) + 3003cc8: f007f793 andi a5,a5,-256 + 3003ccc: e399 bnez a5,3003cd2 + 3003cce: 4785 li a5,1 + 3003cd0: a011 j 3003cd4 + 3003cd2: 4781 li a5,0 + 3003cd4: 8b85 andi a5,a5,1 + 3003cd6: 9f81 uxtb a5 + 3003cd8: 853e mv a0,a5 + 3003cda: 4472 lw s0,28(sp) + 3003cdc: 6105 addi sp,sp,32 + 3003cde: 8082 ret + +03003ce0 : + 3003ce0: 1101 addi sp,sp,-32 + 3003ce2: ce22 sw s0,28(sp) + 3003ce4: 1000 addi s0,sp,32 + 3003ce6: fea42623 sw a0,-20(s0) + 3003cea: fec42703 lw a4,-20(s0) + 3003cee: 4785 li a5,1 + 3003cf0: 04f70e63 beq a4,a5,3003d4c + 3003cf4: fec42703 lw a4,-20(s0) + 3003cf8: 4789 li a5,2 + 3003cfa: 04f70963 beq a4,a5,3003d4c + 3003cfe: fec42703 lw a4,-20(s0) + 3003d02: 4791 li a5,4 + 3003d04: 04f70463 beq a4,a5,3003d4c + 3003d08: fec42703 lw a4,-20(s0) + 3003d0c: 47a1 li a5,8 + 3003d0e: 02f70f63 beq a4,a5,3003d4c + 3003d12: fec42703 lw a4,-20(s0) + 3003d16: 47c1 li a5,16 + 3003d18: 02f70a63 beq a4,a5,3003d4c + 3003d1c: fec42703 lw a4,-20(s0) + 3003d20: 02000793 li a5,32 + 3003d24: 02f70463 beq a4,a5,3003d4c + 3003d28: fec42703 lw a4,-20(s0) + 3003d2c: 04000793 li a5,64 + 3003d30: 00f70e63 beq a4,a5,3003d4c + 3003d34: fec42703 lw a4,-20(s0) + 3003d38: 08000793 li a5,128 + 3003d3c: 00f70863 beq a4,a5,3003d4c + 3003d40: fec42703 lw a4,-20(s0) + 3003d44: 0ff00793 li a5,255 + 3003d48: 00f71463 bne a4,a5,3003d50 + 3003d4c: 4785 li a5,1 + 3003d4e: a011 j 3003d52 + 3003d50: 4781 li a5,0 + 3003d52: 8b85 andi a5,a5,1 + 3003d54: 9f81 uxtb a5 + 3003d56: 853e mv a0,a5 + 3003d58: 4472 lw s0,28(sp) + 3003d5a: 6105 addi sp,sp,32 + 3003d5c: 8082 ret + +03003d5e : + 3003d5e: 1101 addi sp,sp,-32 + 3003d60: ce22 sw s0,28(sp) + 3003d62: 1000 addi s0,sp,32 + 3003d64: fea42623 sw a0,-20(s0) + 3003d68: fec42703 lw a4,-20(s0) + 3003d6c: 478d li a5,3 + 3003d6e: 02f70963 beq a4,a5,3003da0 + 3003d72: fec42703 lw a4,-20(s0) + 3003d76: 4789 li a5,2 + 3003d78: 02f70463 beq a4,a5,3003da0 + 3003d7c: fec42703 lw a4,-20(s0) + 3003d80: 4785 li a5,1 + 3003d82: 00f70f63 beq a4,a5,3003da0 + 3003d86: fec42783 lw a5,-20(s0) + 3003d8a: cb99 beqz a5,3003da0 + 3003d8c: fec42703 lw a4,-20(s0) + 3003d90: 4791 li a5,4 + 3003d92: 00f70763 beq a4,a5,3003da0 + 3003d96: fec42703 lw a4,-20(s0) + 3003d9a: 4795 li a5,5 + 3003d9c: 00f71463 bne a4,a5,3003da4 + 3003da0: 4785 li a5,1 + 3003da2: a011 j 3003da6 + 3003da4: 4781 li a5,0 + 3003da6: 8b85 andi a5,a5,1 + 3003da8: 9f81 uxtb a5 + 3003daa: 853e mv a0,a5 + 3003dac: 4472 lw s0,28(sp) + 3003dae: 6105 addi sp,sp,32 + 3003db0: 8082 ret + +03003db2 : + 3003db2: 1101 addi sp,sp,-32 + 3003db4: ce06 sw ra,28(sp) + 3003db6: cc22 sw s0,24(sp) + 3003db8: 1000 addi s0,sp,32 + 3003dba: fea42623 sw a0,-20(s0) + 3003dbe: feb42423 sw a1,-24(s0) + 3003dc2: fec42223 sw a2,-28(s0) + 3003dc6: fec42703 lw a4,-20(s0) + 3003dca: 145007b7 lui a5,0x14500 + 3003dce: 04f70863 beq a4,a5,3003e1e + 3003dd2: fec42703 lw a4,-20(s0) + 3003dd6: 145017b7 lui a5,0x14501 + 3003dda: 04f70263 beq a4,a5,3003e1e + 3003dde: fec42703 lw a4,-20(s0) + 3003de2: 145027b7 lui a5,0x14502 + 3003de6: 02f70c63 beq a4,a5,3003e1e + 3003dea: fec42703 lw a4,-20(s0) + 3003dee: 145037b7 lui a5,0x14503 + 3003df2: 02f70663 beq a4,a5,3003e1e + 3003df6: fec42703 lw a4,-20(s0) + 3003dfa: 145047b7 lui a5,0x14504 + 3003dfe: 02f70063 beq a4,a5,3003e1e + 3003e02: fec42703 lw a4,-20(s0) + 3003e06: 145057b7 lui a5,0x14505 + 3003e0a: 00f70a63 beq a4,a5,3003e1e + 3003e0e: 18e00593 li a1,398 + 3003e12: 0300f7b7 lui a5,0x300f + 3003e16: 16478513 addi a0,a5,356 # 300f164 + 3003e1a: 2d51 jal ra,30044ae + 3003e1c: a001 j 3003e1c + 3003e1e: fe842503 lw a0,-24(s0) + 3003e22: 3579 jal ra,3003cb0 + 3003e24: 87aa mv a5,a0 + 3003e26: 0017c793 xori a5,a5,1 + 3003e2a: 9f81 uxtb a5 + 3003e2c: cb89 beqz a5,3003e3e + 3003e2e: 18f00593 li a1,399 + 3003e32: 0300f7b7 lui a5,0x300f + 3003e36: 16478513 addi a0,a5,356 # 300f164 + 3003e3a: 2d95 jal ra,30044ae + 3003e3c: a089 j 3003e7e + 3003e3e: fe442503 lw a0,-28(s0) + 3003e42: 3d19 jal ra,3003c58 + 3003e44: 87aa mv a5,a0 + 3003e46: 0017c793 xori a5,a5,1 + 3003e4a: 9f81 uxtb a5 + 3003e4c: cb89 beqz a5,3003e5e + 3003e4e: 19000593 li a1,400 + 3003e52: 0300f7b7 lui a5,0x300f + 3003e56: 16478513 addi a0,a5,356 # 300f164 + 3003e5a: 2d91 jal ra,30044ae + 3003e5c: a00d j 3003e7e + 3003e5e: fe442703 lw a4,-28(s0) + 3003e62: 4785 li a5,1 + 3003e64: 00f71563 bne a4,a5,3003e6e + 3003e68: fe842783 lw a5,-24(s0) + 3003e6c: a011 j 3003e70 + 3003e6e: 4781 li a5,0 + 3003e70: fec42683 lw a3,-20(s0) + 3003e74: fe842703 lw a4,-24(s0) + 3003e78: 070a slli a4,a4,0x2 + 3003e7a: 9736 add a4,a4,a3 + 3003e7c: c31c sw a5,0(a4) + 3003e7e: 40f2 lw ra,28(sp) + 3003e80: 4462 lw s0,24(sp) + 3003e82: 6105 addi sp,sp,32 + 3003e84: 8082 ret + +03003e86 : + 3003e86: 1101 addi sp,sp,-32 + 3003e88: ce06 sw ra,28(sp) + 3003e8a: cc22 sw s0,24(sp) + 3003e8c: 1000 addi s0,sp,32 + 3003e8e: fea42623 sw a0,-20(s0) + 3003e92: feb42423 sw a1,-24(s0) + 3003e96: fec42223 sw a2,-28(s0) + 3003e9a: fec42703 lw a4,-20(s0) + 3003e9e: 145007b7 lui a5,0x14500 + 3003ea2: 04f70863 beq a4,a5,3003ef2 + 3003ea6: fec42703 lw a4,-20(s0) + 3003eaa: 145017b7 lui a5,0x14501 + 3003eae: 04f70263 beq a4,a5,3003ef2 + 3003eb2: fec42703 lw a4,-20(s0) + 3003eb6: 145027b7 lui a5,0x14502 + 3003eba: 02f70c63 beq a4,a5,3003ef2 + 3003ebe: fec42703 lw a4,-20(s0) + 3003ec2: 145037b7 lui a5,0x14503 + 3003ec6: 02f70663 beq a4,a5,3003ef2 + 3003eca: fec42703 lw a4,-20(s0) + 3003ece: 145047b7 lui a5,0x14504 + 3003ed2: 02f70063 beq a4,a5,3003ef2 + 3003ed6: fec42703 lw a4,-20(s0) + 3003eda: 145057b7 lui a5,0x14505 + 3003ede: 00f70a63 beq a4,a5,3003ef2 + 3003ee2: 1b700593 li a1,439 + 3003ee6: 0300f7b7 lui a5,0x300f + 3003eea: 16478513 addi a0,a5,356 # 300f164 + 3003eee: 23c1 jal ra,30044ae + 3003ef0: a001 j 3003ef0 + 3003ef2: fe842503 lw a0,-24(s0) + 3003ef6: 3b6d jal ra,3003cb0 + 3003ef8: 87aa mv a5,a0 + 3003efa: 0017c793 xori a5,a5,1 + 3003efe: 9f81 uxtb a5 + 3003f00: cb89 beqz a5,3003f12 + 3003f02: 1b800593 li a1,440 + 3003f06: 0300f7b7 lui a5,0x300f + 3003f0a: 16478513 addi a0,a5,356 # 300f164 + 3003f0e: 2345 jal ra,30044ae + 3003f10: a095 j 3003f74 + 3003f12: fe442503 lw a0,-28(s0) + 3003f16: 33bd jal ra,3003c84 + 3003f18: 87aa mv a5,a0 + 3003f1a: 0017c793 xori a5,a5,1 + 3003f1e: 9f81 uxtb a5 + 3003f20: cb89 beqz a5,3003f32 + 3003f22: 1b900593 li a1,441 + 3003f26: 0300f7b7 lui a5,0x300f + 3003f2a: 16478513 addi a0,a5,356 # 300f164 + 3003f2e: 2341 jal ra,30044ae + 3003f30: a091 j 3003f74 + 3003f32: fe442783 lw a5,-28(s0) + 3003f36: ef99 bnez a5,3003f54 + 3003f38: fec42783 lw a5,-20(s0) + 3003f3c: 4007a703 lw a4,1024(a5) + 3003f40: fe842783 lw a5,-24(s0) + 3003f44: fff7c793 not a5,a5 + 3003f48: 8f7d and a4,a4,a5 + 3003f4a: fec42783 lw a5,-20(s0) + 3003f4e: 40e7a023 sw a4,1024(a5) + 3003f52: a00d j 3003f74 + 3003f54: fe442703 lw a4,-28(s0) + 3003f58: 4785 li a5,1 + 3003f5a: 00f71d63 bne a4,a5,3003f74 + 3003f5e: fec42783 lw a5,-20(s0) + 3003f62: 4007a703 lw a4,1024(a5) + 3003f66: fe842783 lw a5,-24(s0) + 3003f6a: 8f5d or a4,a4,a5 + 3003f6c: fec42783 lw a5,-20(s0) + 3003f70: 40e7a023 sw a4,1024(a5) + 3003f74: 40f2 lw ra,28(sp) + 3003f76: 4462 lw s0,24(sp) + 3003f78: 6105 addi sp,sp,32 + 3003f7a: 8082 ret + +03003f7c : + 3003f7c: 1101 addi sp,sp,-32 + 3003f7e: ce06 sw ra,28(sp) + 3003f80: cc22 sw s0,24(sp) + 3003f82: 1000 addi s0,sp,32 + 3003f84: fea42623 sw a0,-20(s0) + 3003f88: feb42423 sw a1,-24(s0) + 3003f8c: fec42703 lw a4,-20(s0) + 3003f90: 145007b7 lui a5,0x14500 + 3003f94: 04f70863 beq a4,a5,3003fe4 + 3003f98: fec42703 lw a4,-20(s0) + 3003f9c: 145017b7 lui a5,0x14501 + 3003fa0: 04f70263 beq a4,a5,3003fe4 + 3003fa4: fec42703 lw a4,-20(s0) + 3003fa8: 145027b7 lui a5,0x14502 + 3003fac: 02f70c63 beq a4,a5,3003fe4 + 3003fb0: fec42703 lw a4,-20(s0) + 3003fb4: 145037b7 lui a5,0x14503 + 3003fb8: 02f70663 beq a4,a5,3003fe4 + 3003fbc: fec42703 lw a4,-20(s0) + 3003fc0: 145047b7 lui a5,0x14504 + 3003fc4: 02f70063 beq a4,a5,3003fe4 + 3003fc8: fec42703 lw a4,-20(s0) + 3003fcc: 145057b7 lui a5,0x14505 + 3003fd0: 00f70a63 beq a4,a5,3003fe4 + 3003fd4: 25c00593 li a1,604 + 3003fd8: 0300f7b7 lui a5,0x300f + 3003fdc: 16478513 addi a0,a5,356 # 300f164 + 3003fe0: 21f9 jal ra,30044ae + 3003fe2: a001 j 3003fe2 + 3003fe4: fe842503 lw a0,-24(s0) + 3003fe8: 31e1 jal ra,3003cb0 + 3003fea: 87aa mv a5,a0 + 3003fec: 0017c793 xori a5,a5,1 + 3003ff0: 9f81 uxtb a5 + 3003ff2: cb89 beqz a5,3004004 + 3003ff4: 25d00593 li a1,605 + 3003ff8: 0300f7b7 lui a5,0x300f + 3003ffc: 16478513 addi a0,a5,356 # 300f164 + 3004000: 217d jal ra,30044ae + 3004002: a821 j 300401a + 3004004: fec42783 lw a5,-20(s0) + 3004008: 41c7a703 lw a4,1052(a5) + 300400c: fe842783 lw a5,-24(s0) + 3004010: 8f5d or a4,a4,a5 + 3004012: fec42783 lw a5,-20(s0) + 3004016: 40e7ae23 sw a4,1052(a5) + 300401a: 40f2 lw ra,28(sp) + 300401c: 4462 lw s0,24(sp) + 300401e: 6105 addi sp,sp,32 + 3004020: 8082 ret + +03004022 : + 3004022: 1101 addi sp,sp,-32 + 3004024: ce06 sw ra,28(sp) + 3004026: cc22 sw s0,24(sp) + 3004028: 1000 addi s0,sp,32 + 300402a: fea42623 sw a0,-20(s0) + 300402e: feb42423 sw a1,-24(s0) + 3004032: fec42703 lw a4,-20(s0) + 3004036: 145007b7 lui a5,0x14500 + 300403a: 04f70863 beq a4,a5,300408a + 300403e: fec42703 lw a4,-20(s0) + 3004042: 145017b7 lui a5,0x14501 + 3004046: 04f70263 beq a4,a5,300408a + 300404a: fec42703 lw a4,-20(s0) + 300404e: 145027b7 lui a5,0x14502 + 3004052: 02f70c63 beq a4,a5,300408a + 3004056: fec42703 lw a4,-20(s0) + 300405a: 145037b7 lui a5,0x14503 + 300405e: 02f70663 beq a4,a5,300408a + 3004062: fec42703 lw a4,-20(s0) + 3004066: 145047b7 lui a5,0x14504 + 300406a: 02f70063 beq a4,a5,300408a + 300406e: fec42703 lw a4,-20(s0) + 3004072: 145057b7 lui a5,0x14505 + 3004076: 00f70a63 beq a4,a5,300408a + 300407a: 26900593 li a1,617 + 300407e: 0300f7b7 lui a5,0x300f + 3004082: 16478513 addi a0,a5,356 # 300f164 + 3004086: 2125 jal ra,30044ae + 3004088: a001 j 3004088 + 300408a: fe842503 lw a0,-24(s0) + 300408e: 310d jal ra,3003cb0 + 3004090: 87aa mv a5,a0 + 3004092: 0017c793 xori a5,a5,1 + 3004096: 9f81 uxtb a5 + 3004098: cb89 beqz a5,30040aa + 300409a: 26a00593 li a1,618 + 300409e: 0300f7b7 lui a5,0x300f + 30040a2: 16478513 addi a0,a5,356 # 300f164 + 30040a6: 2121 jal ra,30044ae + 30040a8: a00d j 30040ca + 30040aa: fe842583 lw a1,-24(s0) + 30040ae: fec42503 lw a0,-20(s0) + 30040b2: 35e9 jal ra,3003f7c + 30040b4: fec42783 lw a5,-20(s0) + 30040b8: 4107a703 lw a4,1040(a5) + 30040bc: fe842783 lw a5,-24(s0) + 30040c0: 8f5d or a4,a4,a5 + 30040c2: fec42783 lw a5,-20(s0) + 30040c6: 40e7a823 sw a4,1040(a5) + 30040ca: 40f2 lw ra,28(sp) + 30040cc: 4462 lw s0,24(sp) + 30040ce: 6105 addi sp,sp,32 + 30040d0: 8082 ret + +030040d2 : + 30040d2: 1101 addi sp,sp,-32 + 30040d4: ce06 sw ra,28(sp) + 30040d6: cc22 sw s0,24(sp) + 30040d8: 1000 addi s0,sp,32 + 30040da: fea42623 sw a0,-20(s0) + 30040de: feb42423 sw a1,-24(s0) + 30040e2: fec42703 lw a4,-20(s0) + 30040e6: 145007b7 lui a5,0x14500 + 30040ea: 04f70863 beq a4,a5,300413a + 30040ee: fec42703 lw a4,-20(s0) + 30040f2: 145017b7 lui a5,0x14501 + 30040f6: 04f70263 beq a4,a5,300413a + 30040fa: fec42703 lw a4,-20(s0) + 30040fe: 145027b7 lui a5,0x14502 + 3004102: 02f70c63 beq a4,a5,300413a + 3004106: fec42703 lw a4,-20(s0) + 300410a: 145037b7 lui a5,0x14503 + 300410e: 02f70663 beq a4,a5,300413a + 3004112: fec42703 lw a4,-20(s0) + 3004116: 145047b7 lui a5,0x14504 + 300411a: 02f70063 beq a4,a5,300413a + 300411e: fec42703 lw a4,-20(s0) + 3004122: 145057b7 lui a5,0x14505 + 3004126: 00f70a63 beq a4,a5,300413a + 300412a: 27800593 li a1,632 + 300412e: 0300f7b7 lui a5,0x300f + 3004132: 16478513 addi a0,a5,356 # 300f164 + 3004136: 2ea5 jal ra,30044ae + 3004138: a001 j 3004138 + 300413a: fe842503 lw a0,-24(s0) + 300413e: 3e8d jal ra,3003cb0 + 3004140: 87aa mv a5,a0 + 3004142: 0017c793 xori a5,a5,1 + 3004146: 9f81 uxtb a5 + 3004148: cb89 beqz a5,300415a + 300414a: 27900593 li a1,633 + 300414e: 0300f7b7 lui a5,0x300f + 3004152: 16478513 addi a0,a5,356 # 300f164 + 3004156: 2ea1 jal ra,30044ae + 3004158: a831 j 3004174 + 300415a: fec42783 lw a5,-20(s0) + 300415e: 4107a703 lw a4,1040(a5) + 3004162: fe842783 lw a5,-24(s0) + 3004166: fff7c793 not a5,a5 + 300416a: 8f7d and a4,a4,a5 + 300416c: fec42783 lw a5,-20(s0) + 3004170: 40e7a823 sw a4,1040(a5) + 3004174: 40f2 lw ra,28(sp) + 3004176: 4462 lw s0,24(sp) + 3004178: 6105 addi sp,sp,32 + 300417a: 8082 ret + +0300417c : + 300417c: 1101 addi sp,sp,-32 + 300417e: ce06 sw ra,28(sp) + 3004180: cc22 sw s0,24(sp) + 3004182: 1000 addi s0,sp,32 + 3004184: fea42623 sw a0,-20(s0) + 3004188: fec42703 lw a4,-20(s0) + 300418c: 145007b7 lui a5,0x14500 + 3004190: 04f70863 beq a4,a5,30041e0 + 3004194: fec42703 lw a4,-20(s0) + 3004198: 145017b7 lui a5,0x14501 + 300419c: 04f70263 beq a4,a5,30041e0 + 30041a0: fec42703 lw a4,-20(s0) + 30041a4: 145027b7 lui a5,0x14502 + 30041a8: 02f70c63 beq a4,a5,30041e0 + 30041ac: fec42703 lw a4,-20(s0) + 30041b0: 145037b7 lui a5,0x14503 + 30041b4: 02f70663 beq a4,a5,30041e0 + 30041b8: fec42703 lw a4,-20(s0) + 30041bc: 145047b7 lui a5,0x14504 + 30041c0: 02f70063 beq a4,a5,30041e0 + 30041c4: fec42703 lw a4,-20(s0) + 30041c8: 145057b7 lui a5,0x14505 + 30041cc: 00f70a63 beq a4,a5,30041e0 + 30041d0: 29a00593 li a1,666 + 30041d4: 0300f7b7 lui a5,0x300f + 30041d8: 16478513 addi a0,a5,356 # 300f164 + 30041dc: 2cc9 jal ra,30044ae + 30041de: a001 j 30041de + 30041e0: fec42783 lw a5,-20(s0) + 30041e4: 4187a783 lw a5,1048(a5) + 30041e8: 0ff7f793 andi a5,a5,255 + 30041ec: 853e mv a0,a5 + 30041ee: 40f2 lw ra,28(sp) + 30041f0: 4462 lw s0,24(sp) + 30041f2: 6105 addi sp,sp,32 + 30041f4: 8082 ret + +030041f6 : + 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: fdc42783 lw a5,-36(s0) + 3004206: eb89 bnez a5,3004218 + 3004208: 02b00593 li a1,43 + 300420c: 0300f7b7 lui a5,0x300f + 3004210: 18478513 addi a0,a5,388 # 300f184 + 3004214: 2c69 jal ra,30044ae + 3004216: a001 j 3004216 + 3004218: fdc42783 lw a5,-36(s0) + 300421c: 4398 lw a4,0(a5) + 300421e: 145007b7 lui a5,0x14500 + 3004222: 04f70d63 beq a4,a5,300427c + 3004226: fdc42783 lw a5,-36(s0) + 300422a: 4398 lw a4,0(a5) + 300422c: 145017b7 lui a5,0x14501 + 3004230: 04f70663 beq a4,a5,300427c + 3004234: fdc42783 lw a5,-36(s0) + 3004238: 4398 lw a4,0(a5) + 300423a: 145027b7 lui a5,0x14502 + 300423e: 02f70f63 beq a4,a5,300427c + 3004242: fdc42783 lw a5,-36(s0) + 3004246: 4398 lw a4,0(a5) + 3004248: 145037b7 lui a5,0x14503 + 300424c: 02f70863 beq a4,a5,300427c + 3004250: fdc42783 lw a5,-36(s0) + 3004254: 4398 lw a4,0(a5) + 3004256: 145047b7 lui a5,0x14504 + 300425a: 02f70163 beq a4,a5,300427c + 300425e: fdc42783 lw a5,-36(s0) + 3004262: 4398 lw a4,0(a5) + 3004264: 145057b7 lui a5,0x14505 + 3004268: 00f70a63 beq a4,a5,300427c + 300426c: 02c00593 li a1,44 + 3004270: 0300f7b7 lui a5,0x300f + 3004274: 18478513 addi a0,a5,388 # 300f184 + 3004278: 2c1d jal ra,30044ae + 300427a: a001 j 300427a + 300427c: fdc42783 lw a5,-36(s0) + 3004280: 43dc lw a5,4(a5) + 3004282: 853e mv a0,a5 + 3004284: 3435 jal ra,3003cb0 + 3004286: 87aa mv a5,a0 + 3004288: 0017c793 xori a5,a5,1 + 300428c: 9f81 uxtb a5 + 300428e: cb89 beqz a5,30042a0 + 3004290: 02d00593 li a1,45 + 3004294: 0300f7b7 lui a5,0x300f + 3004298: 18478513 addi a0,a5,388 # 300f184 + 300429c: 2c09 jal ra,30044ae + 300429e: a81d j 30042d4 + 30042a0: fe042623 sw zero,-20(s0) + 30042a4: a01d j 30042ca + 30042a6: 4705 li a4,1 + 30042a8: fec42783 lw a5,-20(s0) + 30042ac: 00f717b3 sll a5,a4,a5 + 30042b0: 86be mv a3,a5 + 30042b2: fdc42703 lw a4,-36(s0) + 30042b6: fec42783 lw a5,-20(s0) + 30042ba: 078e slli a5,a5,0x3 + 30042bc: 97ba add a5,a5,a4 + 30042be: c794 sw a3,8(a5) + 30042c0: fec42783 lw a5,-20(s0) + 30042c4: 0785 addi a5,a5,1 + 30042c6: fef42623 sw a5,-20(s0) + 30042ca: fec42703 lw a4,-20(s0) + 30042ce: 479d li a5,7 + 30042d0: fce7fbe3 bgeu a5,a4,30042a6 + 30042d4: 50b2 lw ra,44(sp) + 30042d6: 5422 lw s0,40(sp) + 30042d8: 6145 addi sp,sp,48 + 30042da: 8082 ret + +030042dc : + 30042dc: 1101 addi sp,sp,-32 + 30042de: ce06 sw ra,28(sp) + 30042e0: cc22 sw s0,24(sp) + 30042e2: 1000 addi s0,sp,32 + 30042e4: fea42623 sw a0,-20(s0) + 30042e8: feb42423 sw a1,-24(s0) + 30042ec: fec42223 sw a2,-28(s0) + 30042f0: fec42783 lw a5,-20(s0) + 30042f4: eb89 bnez a5,3004306 + 30042f6: 04f00593 li a1,79 + 30042fa: 0300f7b7 lui a5,0x300f + 30042fe: 18478513 addi a0,a5,388 # 300f184 + 3004302: 2275 jal ra,30044ae + 3004304: a001 j 3004304 + 3004306: fec42783 lw a5,-20(s0) + 300430a: 4398 lw a4,0(a5) + 300430c: 145007b7 lui a5,0x14500 + 3004310: 04f70d63 beq a4,a5,300436a + 3004314: fec42783 lw a5,-20(s0) + 3004318: 4398 lw a4,0(a5) + 300431a: 145017b7 lui a5,0x14501 + 300431e: 04f70663 beq a4,a5,300436a + 3004322: fec42783 lw a5,-20(s0) + 3004326: 4398 lw a4,0(a5) + 3004328: 145027b7 lui a5,0x14502 + 300432c: 02f70f63 beq a4,a5,300436a + 3004330: fec42783 lw a5,-20(s0) + 3004334: 4398 lw a4,0(a5) + 3004336: 145037b7 lui a5,0x14503 + 300433a: 02f70863 beq a4,a5,300436a + 300433e: fec42783 lw a5,-20(s0) + 3004342: 4398 lw a4,0(a5) + 3004344: 145047b7 lui a5,0x14504 + 3004348: 02f70163 beq a4,a5,300436a + 300434c: fec42783 lw a5,-20(s0) + 3004350: 4398 lw a4,0(a5) + 3004352: 145057b7 lui a5,0x14505 + 3004356: 00f70a63 beq a4,a5,300436a + 300435a: 05000593 li a1,80 + 300435e: 0300f7b7 lui a5,0x300f + 3004362: 18478513 addi a0,a5,388 # 300f184 + 3004366: 22a1 jal ra,30044ae + 3004368: a001 j 3004368 + 300436a: fe842503 lw a0,-24(s0) + 300436e: 3289 jal ra,3003cb0 + 3004370: 87aa mv a5,a0 + 3004372: 0017c793 xori a5,a5,1 + 3004376: 9f81 uxtb a5 + 3004378: cb89 beqz a5,300438a + 300437a: 05100593 li a1,81 + 300437e: 0300f7b7 lui a5,0x300f + 3004382: 18478513 addi a0,a5,388 # 300f184 + 3004386: 2225 jal ra,30044ae + 3004388: a815 j 30043bc + 300438a: fe442503 lw a0,-28(s0) + 300438e: 38dd jal ra,3003c84 + 3004390: 87aa mv a5,a0 + 3004392: 0017c793 xori a5,a5,1 + 3004396: 9f81 uxtb a5 + 3004398: cb89 beqz a5,30043aa + 300439a: 05200593 li a1,82 + 300439e: 0300f7b7 lui a5,0x300f + 30043a2: 18478513 addi a0,a5,388 # 300f184 + 30043a6: 2221 jal ra,30044ae + 30043a8: a811 j 30043bc + 30043aa: fec42783 lw a5,-20(s0) + 30043ae: 439c lw a5,0(a5) + 30043b0: fe442603 lw a2,-28(s0) + 30043b4: fe842583 lw a1,-24(s0) + 30043b8: 853e mv a0,a5 + 30043ba: 34f1 jal ra,3003e86 + 30043bc: 40f2 lw ra,28(sp) + 30043be: 4462 lw s0,24(sp) + 30043c0: 6105 addi sp,sp,32 + 30043c2: 8082 ret + +030043c4 : + 30043c4: 1101 addi sp,sp,-32 + 30043c6: ce06 sw ra,28(sp) + 30043c8: cc22 sw s0,24(sp) + 30043ca: 1000 addi s0,sp,32 + 30043cc: fea42623 sw a0,-20(s0) + 30043d0: feb42423 sw a1,-24(s0) + 30043d4: fec42223 sw a2,-28(s0) + 30043d8: fec42783 lw a5,-20(s0) + 30043dc: eb89 bnez a5,30043ee + 30043de: 05f00593 li a1,95 + 30043e2: 0300f7b7 lui a5,0x300f + 30043e6: 18478513 addi a0,a5,388 # 300f184 + 30043ea: 20d1 jal ra,30044ae + 30043ec: a001 j 30043ec + 30043ee: fec42783 lw a5,-20(s0) + 30043f2: 4398 lw a4,0(a5) + 30043f4: 145007b7 lui a5,0x14500 + 30043f8: 04f70d63 beq a4,a5,3004452 + 30043fc: fec42783 lw a5,-20(s0) + 3004400: 4398 lw a4,0(a5) + 3004402: 145017b7 lui a5,0x14501 + 3004406: 04f70663 beq a4,a5,3004452 + 300440a: fec42783 lw a5,-20(s0) + 300440e: 4398 lw a4,0(a5) + 3004410: 145027b7 lui a5,0x14502 + 3004414: 02f70f63 beq a4,a5,3004452 + 3004418: fec42783 lw a5,-20(s0) + 300441c: 4398 lw a4,0(a5) + 300441e: 145037b7 lui a5,0x14503 + 3004422: 02f70863 beq a4,a5,3004452 + 3004426: fec42783 lw a5,-20(s0) + 300442a: 4398 lw a4,0(a5) + 300442c: 145047b7 lui a5,0x14504 + 3004430: 02f70163 beq a4,a5,3004452 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 4398 lw a4,0(a5) + 300443a: 145057b7 lui a5,0x14505 + 300443e: 00f70a63 beq a4,a5,3004452 + 3004442: 06000593 li a1,96 + 3004446: 0300f7b7 lui a5,0x300f + 300444a: 18478513 addi a0,a5,388 # 300f184 + 300444e: 2085 jal ra,30044ae + 3004450: a001 j 3004450 + 3004452: fe842503 lw a0,-24(s0) + 3004456: 38a9 jal ra,3003cb0 + 3004458: 87aa mv a5,a0 + 300445a: 0017c793 xori a5,a5,1 + 300445e: 9f81 uxtb a5 + 3004460: cb89 beqz a5,3004472 + 3004462: 06100593 li a1,97 + 3004466: 0300f7b7 lui a5,0x300f + 300446a: 18478513 addi a0,a5,388 # 300f184 + 300446e: 2081 jal ra,30044ae + 3004470: a81d j 30044a6 + 3004472: fe442503 lw a0,-28(s0) + 3004476: fe2ff0ef jal ra,3003c58 + 300447a: 87aa mv a5,a0 + 300447c: 0017c793 xori a5,a5,1 + 3004480: 9f81 uxtb a5 + 3004482: cb89 beqz a5,3004494 + 3004484: 06200593 li a1,98 + 3004488: 0300f7b7 lui a5,0x300f + 300448c: 18478513 addi a0,a5,388 # 300f184 + 3004490: 2839 jal ra,30044ae + 3004492: a811 j 30044a6 + 3004494: fec42783 lw a5,-20(s0) + 3004498: 439c lw a5,0(a5) + 300449a: fe442603 lw a2,-28(s0) + 300449e: fe842583 lw a1,-24(s0) + 30044a2: 853e mv a0,a5 + 30044a4: 3239 jal ra,3003db2 + 30044a6: 40f2 lw ra,28(sp) + 30044a8: 4462 lw s0,24(sp) + 30044aa: 6105 addi sp,sp,32 + 30044ac: 8082 ret + +030044ae : + 30044ae: d43fc06f j 30011f0 + +030044b2 : + 30044b2: 1101 addi sp,sp,-32 + 30044b4: ce06 sw ra,28(sp) + 30044b6: cc22 sw s0,24(sp) + 30044b8: 1000 addi s0,sp,32 + 30044ba: fea42623 sw a0,-20(s0) + 30044be: feb42423 sw a1,-24(s0) + 30044c2: fec42783 lw a5,-20(s0) + 30044c6: eb89 bnez a5,30044d8 + 30044c8: 06e00593 li a1,110 + 30044cc: 0300f7b7 lui a5,0x300f + 30044d0: 18478513 addi a0,a5,388 # 300f184 + 30044d4: 3fe9 jal ra,30044ae + 30044d6: a001 j 30044d6 + 30044d8: fec42783 lw a5,-20(s0) + 30044dc: 4398 lw a4,0(a5) + 30044de: 145007b7 lui a5,0x14500 + 30044e2: 04f70d63 beq a4,a5,300453c + 30044e6: fec42783 lw a5,-20(s0) + 30044ea: 4398 lw a4,0(a5) + 30044ec: 145017b7 lui a5,0x14501 + 30044f0: 04f70663 beq a4,a5,300453c + 30044f4: fec42783 lw a5,-20(s0) + 30044f8: 4398 lw a4,0(a5) + 30044fa: 145027b7 lui a5,0x14502 + 30044fe: 02f70f63 beq a4,a5,300453c + 3004502: fec42783 lw a5,-20(s0) + 3004506: 4398 lw a4,0(a5) + 3004508: 145037b7 lui a5,0x14503 + 300450c: 02f70863 beq a4,a5,300453c + 3004510: fec42783 lw a5,-20(s0) + 3004514: 4398 lw a4,0(a5) + 3004516: 145047b7 lui a5,0x14504 + 300451a: 02f70163 beq a4,a5,300453c + 300451e: fec42783 lw a5,-20(s0) + 3004522: 4398 lw a4,0(a5) + 3004524: 145057b7 lui a5,0x14505 + 3004528: 00f70a63 beq a4,a5,300453c + 300452c: 06f00593 li a1,111 + 3004530: 0300f7b7 lui a5,0x300f + 3004534: 18478513 addi a0,a5,388 # 300f184 + 3004538: 3f9d jal ra,30044ae + 300453a: a001 j 300453a + 300453c: fe842503 lw a0,-24(s0) + 3004540: fa0ff0ef jal ra,3003ce0 + 3004544: 87aa mv a5,a0 + 3004546: 0017c793 xori a5,a5,1 + 300454a: 9f81 uxtb a5 + 300454c: cb89 beqz a5,300455e + 300454e: 07000593 li a1,112 + 3004552: 0300f7b7 lui a5,0x300f + 3004556: 18478513 addi a0,a5,388 # 300f184 + 300455a: 3f91 jal ra,30044ae + 300455c: a001 j 300455c + 300455e: fec42783 lw a5,-20(s0) + 3004562: 439c lw a5,0(a5) + 3004564: 3fc7a703 lw a4,1020(a5) + 3004568: fe842783 lw a5,-24(s0) + 300456c: 8ff9 and a5,a5,a4 + 300456e: 00f037b3 snez a5,a5 + 3004572: 9f81 uxtb a5 + 3004574: 853e mv a0,a5 + 3004576: 40f2 lw ra,28(sp) + 3004578: 4462 lw s0,24(sp) + 300457a: 6105 addi sp,sp,32 + 300457c: 8082 ret + +0300457e : + 300457e: 1101 addi sp,sp,-32 + 3004580: ce22 sw s0,28(sp) + 3004582: 1000 addi s0,sp,32 + 3004584: fea42623 sw a0,-20(s0) + 3004588: feb42423 sw a1,-24(s0) + 300458c: fec42223 sw a2,-28(s0) + 3004590: fec42783 lw a5,-20(s0) + 3004594: 439c lw a5,0(a5) + 3004596: 4087a683 lw a3,1032(a5) + 300459a: fe842783 lw a5,-24(s0) + 300459e: fff7c713 not a4,a5 + 30045a2: fec42783 lw a5,-20(s0) + 30045a6: 439c lw a5,0(a5) + 30045a8: 8f75 and a4,a4,a3 + 30045aa: 40e7a423 sw a4,1032(a5) + 30045ae: fec42783 lw a5,-20(s0) + 30045b2: 439c lw a5,0(a5) + 30045b4: 4047a683 lw a3,1028(a5) + 30045b8: fec42783 lw a5,-20(s0) + 30045bc: 439c lw a5,0(a5) + 30045be: fe842703 lw a4,-24(s0) + 30045c2: 8f55 or a4,a4,a3 + 30045c4: 40e7a223 sw a4,1028(a5) + 30045c8: fe442703 lw a4,-28(s0) + 30045cc: 478d li a5,3 + 30045ce: 02f71063 bne a4,a5,30045ee + 30045d2: fec42783 lw a5,-20(s0) + 30045d6: 439c lw a5,0(a5) + 30045d8: 40c7a683 lw a3,1036(a5) + 30045dc: fec42783 lw a5,-20(s0) + 30045e0: 439c lw a5,0(a5) + 30045e2: fe842703 lw a4,-24(s0) + 30045e6: 8f55 or a4,a4,a3 + 30045e8: 40e7a623 sw a4,1036(a5) + 30045ec: a005 j 300460c + 30045ee: fec42783 lw a5,-20(s0) + 30045f2: 439c lw a5,0(a5) + 30045f4: 40c7a683 lw a3,1036(a5) + 30045f8: fe842783 lw a5,-24(s0) + 30045fc: fff7c713 not a4,a5 + 3004600: fec42783 lw a5,-20(s0) + 3004604: 439c lw a5,0(a5) + 3004606: 8f75 and a4,a4,a3 + 3004608: 40e7a623 sw a4,1036(a5) + 300460c: 0001 nop + 300460e: 4472 lw s0,28(sp) + 3004610: 6105 addi sp,sp,32 + 3004612: 8082 ret + +03004614 : + 3004614: 1101 addi sp,sp,-32 + 3004616: ce22 sw s0,28(sp) + 3004618: 1000 addi s0,sp,32 + 300461a: fea42623 sw a0,-20(s0) + 300461e: feb42423 sw a1,-24(s0) + 3004622: fec42223 sw a2,-28(s0) + 3004626: fec42783 lw a5,-20(s0) + 300462a: 439c lw a5,0(a5) + 300462c: 4047a683 lw a3,1028(a5) + 3004630: fe842783 lw a5,-24(s0) + 3004634: fff7c713 not a4,a5 + 3004638: fec42783 lw a5,-20(s0) + 300463c: 439c lw a5,0(a5) + 300463e: 8f75 and a4,a4,a3 + 3004640: 40e7a223 sw a4,1028(a5) + 3004644: fec42783 lw a5,-20(s0) + 3004648: 439c lw a5,0(a5) + 300464a: 4087a683 lw a3,1032(a5) + 300464e: fe842783 lw a5,-24(s0) + 3004652: fff7c713 not a4,a5 + 3004656: fec42783 lw a5,-20(s0) + 300465a: 439c lw a5,0(a5) + 300465c: 8f75 and a4,a4,a3 + 300465e: 40e7a423 sw a4,1032(a5) + 3004662: fe442703 lw a4,-28(s0) + 3004666: 4785 li a5,1 + 3004668: 02f71063 bne a4,a5,3004688 + 300466c: fec42783 lw a5,-20(s0) + 3004670: 439c lw a5,0(a5) + 3004672: 40c7a683 lw a3,1036(a5) + 3004676: fec42783 lw a5,-20(s0) + 300467a: 439c lw a5,0(a5) + 300467c: fe842703 lw a4,-24(s0) + 3004680: 8f55 or a4,a4,a3 + 3004682: 40e7a623 sw a4,1036(a5) + 3004686: a005 j 30046a6 + 3004688: fec42783 lw a5,-20(s0) + 300468c: 439c lw a5,0(a5) + 300468e: 40c7a683 lw a3,1036(a5) + 3004692: fe842783 lw a5,-24(s0) + 3004696: fff7c713 not a4,a5 + 300469a: fec42783 lw a5,-20(s0) + 300469e: 439c lw a5,0(a5) + 30046a0: 8f75 and a4,a4,a3 + 30046a2: 40e7a623 sw a4,1036(a5) + 30046a6: 0001 nop + 30046a8: 4472 lw s0,28(sp) + 30046aa: 6105 addi sp,sp,32 + 30046ac: 8082 ret + +030046ae : + 30046ae: 1101 addi sp,sp,-32 + 30046b0: ce06 sw ra,28(sp) + 30046b2: cc22 sw s0,24(sp) + 30046b4: 1000 addi s0,sp,32 + 30046b6: fea42623 sw a0,-20(s0) + 30046ba: feb42423 sw a1,-24(s0) + 30046be: fec42223 sw a2,-28(s0) + 30046c2: fec42783 lw a5,-20(s0) + 30046c6: eb89 bnez a5,30046d8 + 30046c8: 0ef00593 li a1,239 + 30046cc: 0300f7b7 lui a5,0x300f + 30046d0: 18478513 addi a0,a5,388 # 300f184 + 30046d4: 3be9 jal ra,30044ae + 30046d6: a001 j 30046d6 + 30046d8: fec42783 lw a5,-20(s0) + 30046dc: 4398 lw a4,0(a5) + 30046de: 145007b7 lui a5,0x14500 + 30046e2: 04f70d63 beq a4,a5,300473c + 30046e6: fec42783 lw a5,-20(s0) + 30046ea: 4398 lw a4,0(a5) + 30046ec: 145017b7 lui a5,0x14501 + 30046f0: 04f70663 beq a4,a5,300473c + 30046f4: fec42783 lw a5,-20(s0) + 30046f8: 4398 lw a4,0(a5) + 30046fa: 145027b7 lui a5,0x14502 + 30046fe: 02f70f63 beq a4,a5,300473c + 3004702: fec42783 lw a5,-20(s0) + 3004706: 4398 lw a4,0(a5) + 3004708: 145037b7 lui a5,0x14503 + 300470c: 02f70863 beq a4,a5,300473c + 3004710: fec42783 lw a5,-20(s0) + 3004714: 4398 lw a4,0(a5) + 3004716: 145047b7 lui a5,0x14504 + 300471a: 02f70163 beq a4,a5,300473c + 300471e: fec42783 lw a5,-20(s0) + 3004722: 4398 lw a4,0(a5) + 3004724: 145057b7 lui a5,0x14505 + 3004728: 00f70a63 beq a4,a5,300473c + 300472c: 0f000593 li a1,240 + 3004730: 0300f7b7 lui a5,0x300f + 3004734: 18478513 addi a0,a5,388 # 300f184 + 3004738: 3b9d jal ra,30044ae + 300473a: a001 j 300473a + 300473c: fe842503 lw a0,-24(s0) + 3004740: d70ff0ef jal ra,3003cb0 + 3004744: 87aa mv a5,a0 + 3004746: 0017c793 xori a5,a5,1 + 300474a: 9f81 uxtb a5 + 300474c: cb91 beqz a5,3004760 + 300474e: 0f100593 li a1,241 + 3004752: 0300f7b7 lui a5,0x300f + 3004756: 18478513 addi a0,a5,388 # 300f184 + 300475a: 3b91 jal ra,30044ae + 300475c: 4785 li a5,1 + 300475e: aa91 j 30048b2 + 3004760: fe442503 lw a0,-28(s0) + 3004764: dfaff0ef jal ra,3003d5e + 3004768: 87aa mv a5,a0 + 300476a: 0017c793 xori a5,a5,1 + 300476e: 9f81 uxtb a5 + 3004770: cb91 beqz a5,3004784 + 3004772: 0f200593 li a1,242 + 3004776: 0300f7b7 lui a5,0x300f + 300477a: 18478513 addi a0,a5,388 # 300f184 + 300477e: 3b05 jal ra,30044ae + 3004780: 4785 li a5,1 + 3004782: aa05 j 30048b2 + 3004784: fec42783 lw a5,-20(s0) + 3004788: 439c lw a5,0(a5) + 300478a: fe842583 lw a1,-24(s0) + 300478e: 853e mv a0,a5 + 3004790: 3289 jal ra,30040d2 + 3004792: fe442703 lw a4,-28(s0) + 3004796: 478d li a5,3 + 3004798: 00f70763 beq a4,a5,30047a6 + 300479c: fe442703 lw a4,-28(s0) + 30047a0: 4789 li a5,2 + 30047a2: 00f71a63 bne a4,a5,30047b6 + 30047a6: fe442603 lw a2,-28(s0) + 30047aa: fe842583 lw a1,-24(s0) + 30047ae: fec42503 lw a0,-20(s0) + 30047b2: 33f1 jal ra,300457e + 30047b4: a0f5 j 30048a0 + 30047b6: fe442703 lw a4,-28(s0) + 30047ba: 4791 li a5,4 + 30047bc: 04f71e63 bne a4,a5,3004818 + 30047c0: fec42783 lw a5,-20(s0) + 30047c4: 439c lw a5,0(a5) + 30047c6: 40c7a683 lw a3,1036(a5) + 30047ca: fe842783 lw a5,-24(s0) + 30047ce: fff7c713 not a4,a5 + 30047d2: fec42783 lw a5,-20(s0) + 30047d6: 439c lw a5,0(a5) + 30047d8: 8f75 and a4,a4,a3 + 30047da: 40e7a623 sw a4,1036(a5) + 30047de: fec42783 lw a5,-20(s0) + 30047e2: 439c lw a5,0(a5) + 30047e4: 4047a683 lw a3,1028(a5) + 30047e8: fe842783 lw a5,-24(s0) + 30047ec: fff7c713 not a4,a5 + 30047f0: fec42783 lw a5,-20(s0) + 30047f4: 439c lw a5,0(a5) + 30047f6: 8f75 and a4,a4,a3 + 30047f8: 40e7a223 sw a4,1028(a5) + 30047fc: fec42783 lw a5,-20(s0) + 3004800: 439c lw a5,0(a5) + 3004802: 4087a683 lw a3,1032(a5) + 3004806: fec42783 lw a5,-20(s0) + 300480a: 439c lw a5,0(a5) + 300480c: fe842703 lw a4,-24(s0) + 3004810: 8f55 or a4,a4,a3 + 3004812: 40e7a423 sw a4,1032(a5) + 3004816: a069 j 30048a0 + 3004818: fe442703 lw a4,-28(s0) + 300481c: 4785 li a5,1 + 300481e: 00f70563 beq a4,a5,3004828 + 3004822: fe442783 lw a5,-28(s0) + 3004826: eb89 bnez a5,3004838 + 3004828: fe442603 lw a2,-28(s0) + 300482c: fe842583 lw a1,-24(s0) + 3004830: fec42503 lw a0,-20(s0) + 3004834: 33c5 jal ra,3004614 + 3004836: a0ad j 30048a0 + 3004838: fe442703 lw a4,-28(s0) + 300483c: 4795 li a5,5 + 300483e: 06f71163 bne a4,a5,30048a0 + 3004842: fec42783 lw a5,-20(s0) + 3004846: 439c lw a5,0(a5) + 3004848: 40c7a683 lw a3,1036(a5) + 300484c: fe842783 lw a5,-24(s0) + 3004850: fff7c713 not a4,a5 + 3004854: fec42783 lw a5,-20(s0) + 3004858: 439c lw a5,0(a5) + 300485a: 8f75 and a4,a4,a3 + 300485c: 40e7a623 sw a4,1036(a5) + 3004860: fec42783 lw a5,-20(s0) + 3004864: 439c lw a5,0(a5) + 3004866: 4047a683 lw a3,1028(a5) + 300486a: fe842783 lw a5,-24(s0) + 300486e: fff7c713 not a4,a5 + 3004872: fec42783 lw a5,-20(s0) + 3004876: 439c lw a5,0(a5) + 3004878: 8f75 and a4,a4,a3 + 300487a: 40e7a223 sw a4,1028(a5) + 300487e: fec42783 lw a5,-20(s0) + 3004882: 439c lw a5,0(a5) + 3004884: 4087a683 lw a3,1032(a5) + 3004888: fe842783 lw a5,-24(s0) + 300488c: fff7c713 not a4,a5 + 3004890: fec42783 lw a5,-20(s0) + 3004894: 439c lw a5,0(a5) + 3004896: 8f75 and a4,a4,a3 + 3004898: 40e7a423 sw a4,1032(a5) + 300489c: 4785 li a5,1 + 300489e: a811 j 30048b2 + 30048a0: fec42783 lw a5,-20(s0) + 30048a4: 439c lw a5,0(a5) + 30048a6: fe842583 lw a1,-24(s0) + 30048aa: 853e mv a0,a5 + 30048ac: f76ff0ef jal ra,3004022 + 30048b0: 4781 li a5,0 + 30048b2: 853e mv a0,a5 + 30048b4: 40f2 lw ra,28(sp) + 30048b6: 4462 lw s0,24(sp) + 30048b8: 6105 addi sp,sp,32 + 30048ba: 8082 ret + +030048bc : + 30048bc: 7179 addi sp,sp,-48 + 30048be: d606 sw ra,44(sp) + 30048c0: d422 sw s0,40(sp) + 30048c2: 1800 addi s0,sp,48 + 30048c4: fca42e23 sw a0,-36(s0) + 30048c8: fcb42c23 sw a1,-40(s0) + 30048cc: fdc42783 lw a5,-36(s0) + 30048d0: eb89 bnez a5,30048e2 + 30048d2: 11300593 li a1,275 + 30048d6: 0300f7b7 lui a5,0x300f + 30048da: 18478513 addi a0,a5,388 # 300f184 + 30048de: 3ec1 jal ra,30044ae + 30048e0: a001 j 30048e0 + 30048e2: fdc42783 lw a5,-36(s0) + 30048e6: 4398 lw a4,0(a5) + 30048e8: 145007b7 lui a5,0x14500 + 30048ec: 04f70d63 beq a4,a5,3004946 + 30048f0: fdc42783 lw a5,-36(s0) + 30048f4: 4398 lw a4,0(a5) + 30048f6: 145017b7 lui a5,0x14501 + 30048fa: 04f70663 beq a4,a5,3004946 + 30048fe: fdc42783 lw a5,-36(s0) + 3004902: 4398 lw a4,0(a5) + 3004904: 145027b7 lui a5,0x14502 + 3004908: 02f70f63 beq a4,a5,3004946 + 300490c: fdc42783 lw a5,-36(s0) + 3004910: 4398 lw a4,0(a5) + 3004912: 145037b7 lui a5,0x14503 + 3004916: 02f70863 beq a4,a5,3004946 + 300491a: fdc42783 lw a5,-36(s0) + 300491e: 4398 lw a4,0(a5) + 3004920: 145047b7 lui a5,0x14504 + 3004924: 02f70163 beq a4,a5,3004946 + 3004928: fdc42783 lw a5,-36(s0) + 300492c: 4398 lw a4,0(a5) + 300492e: 145057b7 lui a5,0x14505 + 3004932: 00f70a63 beq a4,a5,3004946 + 3004936: 11400593 li a1,276 + 300493a: 0300f7b7 lui a5,0x300f + 300493e: 18478513 addi a0,a5,388 # 300f184 + 3004942: 36b5 jal ra,30044ae + 3004944: a001 j 3004944 + 3004946: fd842503 lw a0,-40(s0) + 300494a: b66ff0ef jal ra,3003cb0 + 300494e: 87aa mv a5,a0 + 3004950: 0017c793 xori a5,a5,1 + 3004954: 9f81 uxtb a5 + 3004956: cb89 beqz a5,3004968 + 3004958: 11500593 li a1,277 + 300495c: 0300f7b7 lui a5,0x300f + 3004960: 18478513 addi a0,a5,388 # 300f184 + 3004964: 36a9 jal ra,30044ae + 3004966: a899 j 30049bc + 3004968: fe042623 sw zero,-20(s0) + 300496c: a099 j 30049b2 + 300496e: fdc42703 lw a4,-36(s0) + 3004972: fec42783 lw a5,-20(s0) + 3004976: 078e slli a5,a5,0x3 + 3004978: 97ba add a5,a5,a4 + 300497a: 479c lw a5,8(a5) + 300497c: fd842703 lw a4,-40(s0) + 3004980: 02f71463 bne a4,a5,30049a8 + 3004984: fdc42703 lw a4,-36(s0) + 3004988: fec42783 lw a5,-20(s0) + 300498c: 078e slli a5,a5,0x3 + 300498e: 97ba add a5,a5,a4 + 3004990: 47dc lw a5,12(a5) + 3004992: cb99 beqz a5,30049a8 + 3004994: fdc42703 lw a4,-36(s0) + 3004998: fec42783 lw a5,-20(s0) + 300499c: 078e slli a5,a5,0x3 + 300499e: 97ba add a5,a5,a4 + 30049a0: 47dc lw a5,12(a5) + 30049a2: fdc42503 lw a0,-36(s0) + 30049a6: 9782 jalr a5 + 30049a8: fec42783 lw a5,-20(s0) + 30049ac: 0785 addi a5,a5,1 + 30049ae: fef42623 sw a5,-20(s0) + 30049b2: fec42703 lw a4,-20(s0) + 30049b6: 479d li a5,7 + 30049b8: fae7fbe3 bgeu a5,a4,300496e + 30049bc: 50b2 lw ra,44(sp) + 30049be: 5422 lw s0,40(sp) + 30049c0: 6145 addi sp,sp,48 + 30049c2: 8082 ret + +030049c4 : + 30049c4: 7179 addi sp,sp,-48 + 30049c6: d606 sw ra,44(sp) + 30049c8: d422 sw s0,40(sp) + 30049ca: 1800 addi s0,sp,48 + 30049cc: fca42e23 sw a0,-36(s0) + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: fef42423 sw a5,-24(s0) + 30049d8: fe842783 lw a5,-24(s0) + 30049dc: eb89 bnez a5,30049ee + 30049de: 12700593 li a1,295 + 30049e2: 0300f7b7 lui a5,0x300f + 30049e6: 18478513 addi a0,a5,388 # 300f184 + 30049ea: 34d1 jal ra,30044ae + 30049ec: a001 j 30049ec + 30049ee: fe842783 lw a5,-24(s0) + 30049f2: 4398 lw a4,0(a5) + 30049f4: 145007b7 lui a5,0x14500 + 30049f8: 04f70d63 beq a4,a5,3004a52 + 30049fc: fe842783 lw a5,-24(s0) + 3004a00: 4398 lw a4,0(a5) + 3004a02: 145017b7 lui a5,0x14501 + 3004a06: 04f70663 beq a4,a5,3004a52 + 3004a0a: fe842783 lw a5,-24(s0) + 3004a0e: 4398 lw a4,0(a5) + 3004a10: 145027b7 lui a5,0x14502 + 3004a14: 02f70f63 beq a4,a5,3004a52 + 3004a18: fe842783 lw a5,-24(s0) + 3004a1c: 4398 lw a4,0(a5) + 3004a1e: 145037b7 lui a5,0x14503 + 3004a22: 02f70863 beq a4,a5,3004a52 + 3004a26: fe842783 lw a5,-24(s0) + 3004a2a: 4398 lw a4,0(a5) + 3004a2c: 145047b7 lui a5,0x14504 + 3004a30: 02f70163 beq a4,a5,3004a52 + 3004a34: fe842783 lw a5,-24(s0) + 3004a38: 4398 lw a4,0(a5) + 3004a3a: 145057b7 lui a5,0x14505 + 3004a3e: 00f70a63 beq a4,a5,3004a52 + 3004a42: 12800593 li a1,296 + 3004a46: 0300f7b7 lui a5,0x300f + 3004a4a: 18478513 addi a0,a5,388 # 300f184 + 3004a4e: 3485 jal ra,30044ae + 3004a50: a001 j 3004a50 + 3004a52: fe042623 sw zero,-20(s0) + 3004a56: fe042223 sw zero,-28(s0) + 3004a5a: fe842783 lw a5,-24(s0) + 3004a5e: 439c lw a5,0(a5) + 3004a60: 853e mv a0,a5 + 3004a62: f1aff0ef jal ra,300417c + 3004a66: fea42023 sw a0,-32(s0) + 3004a6a: a0b1 j 3004ab6 + 3004a6c: 4705 li a4,1 + 3004a6e: fec42783 lw a5,-20(s0) + 3004a72: 00f717b3 sll a5,a4,a5 + 3004a76: 873e mv a4,a5 + 3004a78: fe042783 lw a5,-32(s0) + 3004a7c: 8ff9 and a5,a5,a4 + 3004a7e: fef42223 sw a5,-28(s0) + 3004a82: fe442783 lw a5,-28(s0) + 3004a86: c39d beqz a5,3004aac + 3004a88: fe842783 lw a5,-24(s0) + 3004a8c: fe442703 lw a4,-28(s0) + 3004a90: c3d8 sw a4,4(a5) + 3004a92: fe842783 lw a5,-24(s0) + 3004a96: 439c lw a5,0(a5) + 3004a98: fe442583 lw a1,-28(s0) + 3004a9c: 853e mv a0,a5 + 3004a9e: cdeff0ef jal ra,3003f7c + 3004aa2: fe442583 lw a1,-28(s0) + 3004aa6: fe842503 lw a0,-24(s0) + 3004aaa: 3d09 jal ra,30048bc + 3004aac: fec42783 lw a5,-20(s0) + 3004ab0: 0785 addi a5,a5,1 + 3004ab2: fef42623 sw a5,-20(s0) + 3004ab6: fe042703 lw a4,-32(s0) + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 00f757b3 srl a5,a4,a5 + 3004ac2: f7cd bnez a5,3004a6c + 3004ac4: 0001 nop + 3004ac6: 50b2 lw ra,44(sp) + 3004ac8: 5422 lw s0,40(sp) + 3004aca: 6145 addi sp,sp,48 + 3004acc: 8082 ret + +03004ace : + 3004ace: 7179 addi sp,sp,-48 + 3004ad0: d606 sw ra,44(sp) + 3004ad2: d422 sw s0,40(sp) + 3004ad4: 1800 addi s0,sp,48 + 3004ad6: fca42e23 sw a0,-36(s0) + 3004ada: fcb42c23 sw a1,-40(s0) + 3004ade: fcc42a23 sw a2,-44(s0) + 3004ae2: fdc42783 lw a5,-36(s0) + 3004ae6: eb89 bnez a5,3004af8 + 3004ae8: 14200593 li a1,322 + 3004aec: 0300f7b7 lui a5,0x300f + 3004af0: 18478513 addi a0,a5,388 # 300f184 + 3004af4: 3a6d jal ra,30044ae + 3004af6: a001 j 3004af6 + 3004af8: fdc42783 lw a5,-36(s0) + 3004afc: 4398 lw a4,0(a5) + 3004afe: 145007b7 lui a5,0x14500 + 3004b02: 04f70d63 beq a4,a5,3004b5c + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 4398 lw a4,0(a5) + 3004b0c: 145017b7 lui a5,0x14501 + 3004b10: 04f70663 beq a4,a5,3004b5c + 3004b14: fdc42783 lw a5,-36(s0) + 3004b18: 4398 lw a4,0(a5) + 3004b1a: 145027b7 lui a5,0x14502 + 3004b1e: 02f70f63 beq a4,a5,3004b5c + 3004b22: fdc42783 lw a5,-36(s0) + 3004b26: 4398 lw a4,0(a5) + 3004b28: 145037b7 lui a5,0x14503 + 3004b2c: 02f70863 beq a4,a5,3004b5c + 3004b30: fdc42783 lw a5,-36(s0) + 3004b34: 4398 lw a4,0(a5) + 3004b36: 145047b7 lui a5,0x14504 + 3004b3a: 02f70163 beq a4,a5,3004b5c + 3004b3e: fdc42783 lw a5,-36(s0) + 3004b42: 4398 lw a4,0(a5) + 3004b44: 145057b7 lui a5,0x14505 + 3004b48: 00f70a63 beq a4,a5,3004b5c + 3004b4c: 14300593 li a1,323 + 3004b50: 0300f7b7 lui a5,0x300f + 3004b54: 18478513 addi a0,a5,388 # 300f184 + 3004b58: 3a99 jal ra,30044ae + 3004b5a: a001 j 3004b5a + 3004b5c: fd842503 lw a0,-40(s0) + 3004b60: 980ff0ef jal ra,3003ce0 + 3004b64: 87aa mv a5,a0 + 3004b66: 0017c793 xori a5,a5,1 + 3004b6a: 9f81 uxtb a5 + 3004b6c: cb89 beqz a5,3004b7e + 3004b6e: 14400593 li a1,324 + 3004b72: 0300f7b7 lui a5,0x300f + 3004b76: 18478513 addi a0,a5,388 # 300f184 + 3004b7a: 3a15 jal ra,30044ae + 3004b7c: a091 j 3004bc0 + 3004b7e: fe042623 sw zero,-20(s0) + 3004b82: a815 j 3004bb6 + 3004b84: fdc42703 lw a4,-36(s0) + 3004b88: fec42783 lw a5,-20(s0) + 3004b8c: 078e slli a5,a5,0x3 + 3004b8e: 97ba add a5,a5,a4 + 3004b90: 479c lw a5,8(a5) + 3004b92: fd842703 lw a4,-40(s0) + 3004b96: 00f71b63 bne a4,a5,3004bac + 3004b9a: fdc42703 lw a4,-36(s0) + 3004b9e: fec42783 lw a5,-20(s0) + 3004ba2: 078e slli a5,a5,0x3 + 3004ba4: 97ba add a5,a5,a4 + 3004ba6: fd442703 lw a4,-44(s0) + 3004baa: c7d8 sw a4,12(a5) + 3004bac: fec42783 lw a5,-20(s0) + 3004bb0: 0785 addi a5,a5,1 + 3004bb2: fef42623 sw a5,-20(s0) + 3004bb6: fec42703 lw a4,-20(s0) + 3004bba: 479d li a5,7 + 3004bbc: fce7f4e3 bgeu a5,a4,3004b84 + 3004bc0: 50b2 lw ra,44(sp) + 3004bc2: 5422 lw s0,40(sp) + 3004bc4: 6145 addi sp,sp,48 + 3004bc6: 8082 ret + +03004bc8 : + 3004bc8: 1101 addi sp,sp,-32 + 3004bca: ce22 sw s0,28(sp) + 3004bcc: 1000 addi s0,sp,32 + 3004bce: fea42623 sw a0,-20(s0) + 3004bd2: fec42783 lw a5,-20(s0) + 3004bd6: 4007b793 sltiu a5,a5,1024 + 3004bda: 9f81 uxtb a5 + 3004bdc: 853e mv a0,a5 + 3004bde: 4472 lw s0,28(sp) + 3004be0: 6105 addi sp,sp,32 + 3004be2: 8082 ret + +03004be4 : + 3004be4: 1101 addi sp,sp,-32 + 3004be6: ce22 sw s0,28(sp) + 3004be8: 1000 addi s0,sp,32 + 3004bea: fea42623 sw a0,-20(s0) + 3004bee: fec42703 lw a4,-20(s0) + 3004bf2: 6785 lui a5,0x1 + 3004bf4: 00f737b3 sltu a5,a4,a5 + 3004bf8: 9f81 uxtb a5 + 3004bfa: 853e mv a0,a5 + 3004bfc: 4472 lw s0,28(sp) + 3004bfe: 6105 addi sp,sp,32 + 3004c00: 8082 ret + +03004c02 : + 3004c02: 1101 addi sp,sp,-32 + 3004c04: ce22 sw s0,28(sp) + 3004c06: 1000 addi s0,sp,32 + 3004c08: fea42623 sw a0,-20(s0) + 3004c0c: fec42703 lw a4,-20(s0) + 3004c10: 4785 li a5,1 + 3004c12: 00e7f963 bgeu a5,a4,3004c24 + 3004c16: fec42703 lw a4,-20(s0) + 3004c1a: 67c1 lui a5,0x10 + 3004c1c: 00f77463 bgeu a4,a5,3004c24 + 3004c20: 4785 li a5,1 + 3004c22: a011 j 3004c26 + 3004c24: 4781 li a5,0 + 3004c26: 8b85 andi a5,a5,1 + 3004c28: 9f81 uxtb a5 + 3004c2a: 853e mv a0,a5 + 3004c2c: 4472 lw s0,28(sp) + 3004c2e: 6105 addi sp,sp,32 + 3004c30: 8082 ret + +03004c32 : + 3004c32: 1101 addi sp,sp,-32 + 3004c34: ce22 sw s0,28(sp) + 3004c36: 1000 addi s0,sp,32 + 3004c38: fea42623 sw a0,-20(s0) + 3004c3c: fec42703 lw a4,-20(s0) + 3004c40: 67c1 lui a5,0x10 + 3004c42: 00f737b3 sltu a5,a4,a5 + 3004c46: 9f81 uxtb a5 + 3004c48: 853e mv a0,a5 + 3004c4a: 4472 lw s0,28(sp) + 3004c4c: 6105 addi sp,sp,32 + 3004c4e: 8082 ret + +03004c50 : + 3004c50: 1101 addi sp,sp,-32 + 3004c52: ce22 sw s0,28(sp) + 3004c54: 1000 addi s0,sp,32 + 3004c56: fea42623 sw a0,-20(s0) + 3004c5a: fec42783 lw a5,-20(s0) + 3004c5e: 0047b793 sltiu a5,a5,4 + 3004c62: 9f81 uxtb a5 + 3004c64: 853e mv a0,a5 + 3004c66: 4472 lw s0,28(sp) + 3004c68: 6105 addi sp,sp,32 + 3004c6a: 8082 ret + +03004c6c : + 3004c6c: 1101 addi sp,sp,-32 + 3004c6e: ce06 sw ra,28(sp) + 3004c70: cc22 sw s0,24(sp) + 3004c72: 1000 addi s0,sp,32 + 3004c74: fea42623 sw a0,-20(s0) + 3004c78: fec42783 lw a5,-20(s0) + 3004c7c: eb89 bnez a5,3004c8e + 3004c7e: 03500593 li a1,53 + 3004c82: 0300f7b7 lui a5,0x300f + 3004c86: 1a078513 addi a0,a5,416 # 300f1a0 + 3004c8a: 2b85 jal ra,30051fa + 3004c8c: a001 j 3004c8c + 3004c8e: fec42783 lw a5,-20(s0) + 3004c92: 4398 lw a4,0(a5) + 3004c94: 147007b7 lui a5,0x14700 + 3004c98: 02f70f63 beq a4,a5,3004cd6 + 3004c9c: fec42783 lw a5,-20(s0) + 3004ca0: 4398 lw a4,0(a5) + 3004ca2: 147017b7 lui a5,0x14701 + 3004ca6: 02f70863 beq a4,a5,3004cd6 + 3004caa: fec42783 lw a5,-20(s0) + 3004cae: 4398 lw a4,0(a5) + 3004cb0: 147027b7 lui a5,0x14702 + 3004cb4: 02f70163 beq a4,a5,3004cd6 + 3004cb8: fec42783 lw a5,-20(s0) + 3004cbc: 4398 lw a4,0(a5) + 3004cbe: 147037b7 lui a5,0x14703 + 3004cc2: 00f70a63 beq a4,a5,3004cd6 + 3004cc6: 03600593 li a1,54 + 3004cca: 0300f7b7 lui a5,0x300f + 3004cce: 1a078513 addi a0,a5,416 # 300f1a0 + 3004cd2: 2325 jal ra,30051fa + 3004cd4: a001 j 3004cd4 + 3004cd6: fec42503 lw a0,-20(s0) + 3004cda: 207d jal ra,3004d88 + 3004cdc: fec42503 lw a0,-20(s0) + 3004ce0: 2a15 jal ra,3004e14 + 3004ce2: 872a mv a4,a0 + 3004ce4: 4785 li a5,1 + 3004ce6: 00f71463 bne a4,a5,3004cee + 3004cea: 4785 li a5,1 + 3004cec: a011 j 3004cf0 + 3004cee: 4781 li a5,0 + 3004cf0: 853e mv a0,a5 + 3004cf2: 40f2 lw ra,28(sp) + 3004cf4: 4462 lw s0,24(sp) + 3004cf6: 6105 addi sp,sp,32 + 3004cf8: 8082 ret + +03004cfa : + 3004cfa: 7179 addi sp,sp,-48 + 3004cfc: d606 sw ra,44(sp) + 3004cfe: d422 sw s0,40(sp) + 3004d00: 1800 addi s0,sp,48 + 3004d02: fca42e23 sw a0,-36(s0) + 3004d06: fdc42783 lw a5,-36(s0) + 3004d0a: eb89 bnez a5,3004d1c + 3004d0c: 04600593 li a1,70 + 3004d10: 0300f7b7 lui a5,0x300f + 3004d14: 1a078513 addi a0,a5,416 # 300f1a0 + 3004d18: 21cd jal ra,30051fa + 3004d1a: a001 j 3004d1a + 3004d1c: fdc42783 lw a5,-36(s0) + 3004d20: 4398 lw a4,0(a5) + 3004d22: 147007b7 lui a5,0x14700 + 3004d26: 02f70f63 beq a4,a5,3004d64 + 3004d2a: fdc42783 lw a5,-36(s0) + 3004d2e: 4398 lw a4,0(a5) + 3004d30: 147017b7 lui a5,0x14701 + 3004d34: 02f70863 beq a4,a5,3004d64 + 3004d38: fdc42783 lw a5,-36(s0) + 3004d3c: 4398 lw a4,0(a5) + 3004d3e: 147027b7 lui a5,0x14702 + 3004d42: 02f70163 beq a4,a5,3004d64 + 3004d46: fdc42783 lw a5,-36(s0) + 3004d4a: 4398 lw a4,0(a5) + 3004d4c: 147037b7 lui a5,0x14703 + 3004d50: 00f70a63 beq a4,a5,3004d64 + 3004d54: 04700593 li a1,71 + 3004d58: 0300f7b7 lui a5,0x300f + 3004d5c: 1a078513 addi a0,a5,416 # 300f1a0 + 3004d60: 2969 jal ra,30051fa + 3004d62: a001 j 3004d62 + 3004d64: fec42783 lw a5,-20(s0) + 3004d68: 0017e793 ori a5,a5,1 + 3004d6c: fef42623 sw a5,-20(s0) + 3004d70: fdc42783 lw a5,-36(s0) + 3004d74: 439c lw a5,0(a5) + 3004d76: fec42703 lw a4,-20(s0) + 3004d7a: 40e7a623 sw a4,1036(a5) + 3004d7e: 0001 nop + 3004d80: 50b2 lw ra,44(sp) + 3004d82: 5422 lw s0,40(sp) + 3004d84: 6145 addi sp,sp,48 + 3004d86: 8082 ret + +03004d88 : + 3004d88: 7179 addi sp,sp,-48 + 3004d8a: d606 sw ra,44(sp) + 3004d8c: d422 sw s0,40(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + 3004d94: fdc42783 lw a5,-36(s0) + 3004d98: eb89 bnez a5,3004daa + 3004d9a: 05500593 li a1,85 + 3004d9e: 0300f7b7 lui a5,0x300f + 3004da2: 1a078513 addi a0,a5,416 # 300f1a0 + 3004da6: 2991 jal ra,30051fa + 3004da8: a001 j 3004da8 + 3004daa: fdc42783 lw a5,-36(s0) + 3004dae: 4398 lw a4,0(a5) + 3004db0: 147007b7 lui a5,0x14700 + 3004db4: 02f70f63 beq a4,a5,3004df2 + 3004db8: fdc42783 lw a5,-36(s0) + 3004dbc: 4398 lw a4,0(a5) + 3004dbe: 147017b7 lui a5,0x14701 + 3004dc2: 02f70863 beq a4,a5,3004df2 + 3004dc6: fdc42783 lw a5,-36(s0) + 3004dca: 4398 lw a4,0(a5) + 3004dcc: 147027b7 lui a5,0x14702 + 3004dd0: 02f70163 beq a4,a5,3004df2 + 3004dd4: fdc42783 lw a5,-36(s0) + 3004dd8: 4398 lw a4,0(a5) + 3004dda: 147037b7 lui a5,0x14703 + 3004dde: 00f70a63 beq a4,a5,3004df2 + 3004de2: 05600593 li a1,86 + 3004de6: 0300f7b7 lui a5,0x300f + 3004dea: 1a078513 addi a0,a5,416 # 300f1a0 + 3004dee: 2131 jal ra,30051fa + 3004df0: a001 j 3004df0 + 3004df2: fec42783 lw a5,-20(s0) + 3004df6: 9bf9 andi a5,a5,-2 + 3004df8: fef42623 sw a5,-20(s0) + 3004dfc: fdc42783 lw a5,-36(s0) + 3004e00: 439c lw a5,0(a5) + 3004e02: fec42703 lw a4,-20(s0) + 3004e06: 40e7a623 sw a4,1036(a5) + 3004e0a: 0001 nop + 3004e0c: 50b2 lw ra,44(sp) + 3004e0e: 5422 lw s0,40(sp) + 3004e10: 6145 addi sp,sp,48 + 3004e12: 8082 ret + +03004e14 : + 3004e14: 7179 addi sp,sp,-48 + 3004e16: d606 sw ra,44(sp) + 3004e18: d422 sw s0,40(sp) + 3004e1a: 1800 addi s0,sp,48 + 3004e1c: fca42e23 sw a0,-36(s0) + 3004e20: fdc42783 lw a5,-36(s0) + 3004e24: eb89 bnez a5,3004e36 + 3004e26: 06500593 li a1,101 + 3004e2a: 0300f7b7 lui a5,0x300f + 3004e2e: 1a078513 addi a0,a5,416 # 300f1a0 + 3004e32: 26e1 jal ra,30051fa + 3004e34: a001 j 3004e34 + 3004e36: fdc42783 lw a5,-36(s0) + 3004e3a: 4398 lw a4,0(a5) + 3004e3c: 147007b7 lui a5,0x14700 + 3004e40: 02f70f63 beq a4,a5,3004e7e + 3004e44: fdc42783 lw a5,-36(s0) + 3004e48: 4398 lw a4,0(a5) + 3004e4a: 147017b7 lui a5,0x14701 + 3004e4e: 02f70863 beq a4,a5,3004e7e + 3004e52: fdc42783 lw a5,-36(s0) + 3004e56: 4398 lw a4,0(a5) + 3004e58: 147027b7 lui a5,0x14702 + 3004e5c: 02f70163 beq a4,a5,3004e7e + 3004e60: fdc42783 lw a5,-36(s0) + 3004e64: 4398 lw a4,0(a5) + 3004e66: 147037b7 lui a5,0x14703 + 3004e6a: 00f70a63 beq a4,a5,3004e7e + 3004e6e: 06600593 li a1,102 + 3004e72: 0300f7b7 lui a5,0x300f + 3004e76: 1a078513 addi a0,a5,416 # 300f1a0 + 3004e7a: 2641 jal ra,30051fa + 3004e7c: a001 j 3004e7c + 3004e7e: fdc42783 lw a5,-36(s0) + 3004e82: 4fdc lw a5,28(a5) + 3004e84: 853e mv a0,a5 + 3004e86: 3bb5 jal ra,3004c02 + 3004e88: 87aa mv a5,a0 + 3004e8a: 0017c793 xori a5,a5,1 + 3004e8e: 9f81 uxtb a5 + 3004e90: cb91 beqz a5,3004ea4 + 3004e92: 06700593 li a1,103 + 3004e96: 0300f7b7 lui a5,0x300f + 3004e9a: 1a078513 addi a0,a5,416 # 300f1a0 + 3004e9e: 2eb1 jal ra,30051fa + 3004ea0: 4785 li a5,1 + 3004ea2: ac95 j 3005116 + 3004ea4: fdc42783 lw a5,-36(s0) + 3004ea8: 479c lw a5,8(a5) + 3004eaa: 853e mv a0,a5 + 3004eac: 3b25 jal ra,3004be4 + 3004eae: 87aa mv a5,a0 + 3004eb0: 0017c793 xori a5,a5,1 + 3004eb4: 9f81 uxtb a5 + 3004eb6: cb91 beqz a5,3004eca + 3004eb8: 06800593 li a1,104 + 3004ebc: 0300f7b7 lui a5,0x300f + 3004ec0: 1a078513 addi a0,a5,416 # 300f1a0 + 3004ec4: 2e1d jal ra,30051fa + 3004ec6: 4785 li a5,1 + 3004ec8: a4b9 j 3005116 + 3004eca: fdc42783 lw a5,-36(s0) + 3004ece: 47dc lw a5,12(a5) + 3004ed0: 853e mv a0,a5 + 3004ed2: 3385 jal ra,3004c32 + 3004ed4: 87aa mv a5,a0 + 3004ed6: 0017c793 xori a5,a5,1 + 3004eda: 9f81 uxtb a5 + 3004edc: cb91 beqz a5,3004ef0 + 3004ede: 06900593 li a1,105 + 3004ee2: 0300f7b7 lui a5,0x300f + 3004ee6: 1a078513 addi a0,a5,416 # 300f1a0 + 3004eea: 2e01 jal ra,30051fa + 3004eec: 4785 li a5,1 + 3004eee: a425 j 3005116 + 3004ef0: fdc42783 lw a5,-36(s0) + 3004ef4: 4bdc lw a5,20(a5) + 3004ef6: 853e mv a0,a5 + 3004ef8: 3b2d jal ra,3004c32 + 3004efa: 87aa mv a5,a0 + 3004efc: 0017c793 xori a5,a5,1 + 3004f00: 9f81 uxtb a5 + 3004f02: cb91 beqz a5,3004f16 + 3004f04: 06a00593 li a1,106 + 3004f08: 0300f7b7 lui a5,0x300f + 3004f0c: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f10: 24ed jal ra,30051fa + 3004f12: 4785 li a5,1 + 3004f14: a409 j 3005116 + 3004f16: fdc42783 lw a5,-36(s0) + 3004f1a: 47d8 lw a4,12(a5) + 3004f1c: fdc42783 lw a5,-36(s0) + 3004f20: 4bdc lw a5,20(a5) + 3004f22: 00e7fb63 bgeu a5,a4,3004f38 + 3004f26: 06b00593 li a1,107 + 3004f2a: 0300f7b7 lui a5,0x300f + 3004f2e: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f32: 24e1 jal ra,30051fa + 3004f34: 4785 li a5,1 + 3004f36: a2c5 j 3005116 + 3004f38: fdc42783 lw a5,-36(s0) + 3004f3c: 4bd8 lw a4,20(a5) + 3004f3e: fdc42783 lw a5,-36(s0) + 3004f42: 4fdc lw a5,28(a5) + 3004f44: 00e7fb63 bgeu a5,a4,3004f5a + 3004f48: 06c00593 li a1,108 + 3004f4c: 0300f7b7 lui a5,0x300f + 3004f50: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f54: 245d jal ra,30051fa + 3004f56: 4785 li a5,1 + 3004f58: aa7d j 3005116 + 3004f5a: fdc42783 lw a5,-36(s0) + 3004f5e: 4b9c lw a5,16(a5) + 3004f60: 853e mv a0,a5 + 3004f62: 31fd jal ra,3004c50 + 3004f64: 87aa mv a5,a0 + 3004f66: 0017c793 xori a5,a5,1 + 3004f6a: 9f81 uxtb a5 + 3004f6c: cb91 beqz a5,3004f80 + 3004f6e: 06d00593 li a1,109 + 3004f72: 0300f7b7 lui a5,0x300f + 3004f76: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f7a: 2441 jal ra,30051fa + 3004f7c: 4785 li a5,1 + 3004f7e: aa61 j 3005116 + 3004f80: fdc42783 lw a5,-36(s0) + 3004f84: 4f9c lw a5,24(a5) + 3004f86: 853e mv a0,a5 + 3004f88: 31e1 jal ra,3004c50 + 3004f8a: 87aa mv a5,a0 + 3004f8c: 0017c793 xori a5,a5,1 + 3004f90: 9f81 uxtb a5 + 3004f92: cb91 beqz a5,3004fa6 + 3004f94: 06e00593 li a1,110 + 3004f98: 0300f7b7 lui a5,0x300f + 3004f9c: 1a078513 addi a0,a5,416 # 300f1a0 + 3004fa0: 2ca9 jal ra,30051fa + 3004fa2: 4785 li a5,1 + 3004fa4: aa8d j 3005116 + 3004fa6: fdc42783 lw a5,-36(s0) + 3004faa: 539c lw a5,32(a5) + 3004fac: 853e mv a0,a5 + 3004fae: 3929 jal ra,3004bc8 + 3004fb0: 87aa mv a5,a0 + 3004fb2: 0017c793 xori a5,a5,1 + 3004fb6: 9f81 uxtb a5 + 3004fb8: cb91 beqz a5,3004fcc + 3004fba: 06f00593 li a1,111 + 3004fbe: 0300f7b7 lui a5,0x300f + 3004fc2: 1a078513 addi a0,a5,416 # 300f1a0 + 3004fc6: 2c15 jal ra,30051fa + 3004fc8: 4785 li a5,1 + 3004fca: a2b1 j 3005116 + 3004fcc: fdc42783 lw a5,-36(s0) + 3004fd0: 439c lw a5,0(a5) + 3004fd2: fef42623 sw a5,-20(s0) + 3004fd6: fdc42783 lw a5,-36(s0) + 3004fda: 0257c683 lbu a3,37(a5) + 3004fde: fec42703 lw a4,-20(s0) + 3004fe2: 50072783 lw a5,1280(a4) # 14000500 + 3004fe6: 8a85 andi a3,a3,1 + 3004fe8: 9bf9 andi a5,a5,-2 + 3004fea: 8fd5 or a5,a5,a3 + 3004fec: 50f72023 sw a5,1280(a4) + 3004ff0: fdc42783 lw a5,-36(s0) + 3004ff4: 4798 lw a4,8(a5) + 3004ff6: fec42783 lw a5,-20(s0) + 3004ffa: cb98 sw a4,16(a5) + 3004ffc: fdc42783 lw a5,-36(s0) + 3005000: 4fd8 lw a4,28(a5) + 3005002: fec42783 lw a5,-20(s0) + 3005006: cbd8 sw a4,20(a5) + 3005008: fdc42783 lw a5,-36(s0) + 300500c: 47d8 lw a4,12(a5) + 300500e: fec42783 lw a5,-20(s0) + 3005012: cf98 sw a4,24(a5) + 3005014: fdc42783 lw a5,-36(s0) + 3005018: 4b9c lw a5,16(a5) + 300501a: 8b8d andi a5,a5,3 + 300501c: 0ff7f693 andi a3,a5,255 + 3005020: fec42703 lw a4,-20(s0) + 3005024: 10072783 lw a5,256(a4) + 3005028: 8a8d andi a3,a3,3 + 300502a: 9bf1 andi a5,a5,-4 + 300502c: 8fd5 or a5,a5,a3 + 300502e: 10f72023 sw a5,256(a4) + 3005032: fdc42783 lw a5,-36(s0) + 3005036: 4bd8 lw a4,20(a5) + 3005038: fec42783 lw a5,-20(s0) + 300503c: cfd8 sw a4,28(a5) + 300503e: fdc42783 lw a5,-36(s0) + 3005042: 4f9c lw a5,24(a5) + 3005044: 8b8d andi a5,a5,3 + 3005046: 0ff7f693 andi a3,a5,255 + 300504a: fec42703 lw a4,-20(s0) + 300504e: 10072783 lw a5,256(a4) + 3005052: 8a8d andi a3,a3,3 + 3005054: 0692 slli a3,a3,0x4 + 3005056: fcf7f793 andi a5,a5,-49 + 300505a: 8fd5 or a5,a5,a3 + 300505c: 10f72023 sw a5,256(a4) + 3005060: fdc42783 lw a5,-36(s0) + 3005064: 0247c683 lbu a3,36(a5) + 3005068: fec42703 lw a4,-20(s0) + 300506c: 40072783 lw a5,1024(a4) + 3005070: 06fe slli a3,a3,0x1f + 3005072: 80000637 lui a2,0x80000 + 3005076: fff64613 not a2,a2 + 300507a: 8ff1 and a5,a5,a2 + 300507c: 8fd5 or a5,a5,a3 + 300507e: 40f72023 sw a5,1024(a4) + 3005082: fdc42783 lw a5,-36(s0) + 3005086: 539c lw a5,32(a5) + 3005088: 3ff7f793 andi a5,a5,1023 + 300508c: 01079693 slli a3,a5,0x10 + 3005090: 82c1 srli a3,a3,0x10 + 3005092: fec42703 lw a4,-20(s0) + 3005096: 40072783 lw a5,1024(a4) + 300509a: 3ff6f693 andi a3,a3,1023 + 300509e: c007f793 andi a5,a5,-1024 + 30050a2: 8fd5 or a5,a5,a3 + 30050a4: 40f72023 sw a5,1024(a4) + 30050a8: fdc42783 lw a5,-36(s0) + 30050ac: 0307c683 lbu a3,48(a5) + 30050b0: fec42703 lw a4,-20(s0) + 30050b4: 20072783 lw a5,512(a4) + 30050b8: 8a85 andi a3,a3,1 + 30050ba: 9bf9 andi a5,a5,-2 + 30050bc: 8fd5 or a5,a5,a3 + 30050be: 20f72023 sw a5,512(a4) + 30050c2: fdc42783 lw a5,-36(s0) + 30050c6: 0317c683 lbu a3,49(a5) + 30050ca: fec42703 lw a4,-20(s0) + 30050ce: 20072783 lw a5,512(a4) + 30050d2: 8a85 andi a3,a3,1 + 30050d4: 0692 slli a3,a3,0x4 + 30050d6: 9bbd andi a5,a5,-17 + 30050d8: 8fd5 or a5,a5,a3 + 30050da: 20f72023 sw a5,512(a4) + 30050de: fdc42783 lw a5,-36(s0) + 30050e2: 0277c683 lbu a3,39(a5) + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: 30072783 lw a5,768(a4) + 30050ee: 8a85 andi a3,a3,1 + 30050f0: 0686 slli a3,a3,0x1 + 30050f2: 9bf5 andi a5,a5,-3 + 30050f4: 8fd5 or a5,a5,a3 + 30050f6: 30f72023 sw a5,768(a4) + 30050fa: fdc42783 lw a5,-36(s0) + 30050fe: 0267c683 lbu a3,38(a5) + 3005102: fec42703 lw a4,-20(s0) + 3005106: 30072783 lw a5,768(a4) + 300510a: 8a85 andi a3,a3,1 + 300510c: 9bf9 andi a5,a5,-2 + 300510e: 8fd5 or a5,a5,a3 + 3005110: 30f72023 sw a5,768(a4) + 3005114: 4781 li a5,0 + 3005116: 853e mv a0,a5 + 3005118: 50b2 lw ra,44(sp) + 300511a: 5422 lw s0,40(sp) + 300511c: 6145 addi sp,sp,48 + 300511e: 8082 ret + +03005120 : + 3005120: 7179 addi sp,sp,-48 + 3005122: d606 sw ra,44(sp) + 3005124: d422 sw s0,40(sp) + 3005126: 1800 addi s0,sp,48 + 3005128: fca42e23 sw a0,-36(s0) + 300512c: fcb42c23 sw a1,-40(s0) + 3005130: fdc42783 lw a5,-36(s0) + 3005134: eb89 bnez a5,3005146 + 3005136: 0d800593 li a1,216 + 300513a: 0300f7b7 lui a5,0x300f + 300513e: 1a078513 addi a0,a5,416 # 300f1a0 + 3005142: 2865 jal ra,30051fa + 3005144: a001 j 3005144 + 3005146: fd842783 lw a5,-40(s0) + 300514a: eb89 bnez a5,300515c + 300514c: 0d900593 li a1,217 + 3005150: 0300f7b7 lui a5,0x300f + 3005154: 1a078513 addi a0,a5,416 # 300f1a0 + 3005158: 204d jal ra,30051fa + 300515a: a001 j 300515a + 300515c: fdc42783 lw a5,-36(s0) + 3005160: 4398 lw a4,0(a5) + 3005162: 147007b7 lui a5,0x14700 + 3005166: 02f70f63 beq a4,a5,30051a4 + 300516a: fdc42783 lw a5,-36(s0) + 300516e: 4398 lw a4,0(a5) + 3005170: 147017b7 lui a5,0x14701 + 3005174: 02f70863 beq a4,a5,30051a4 + 3005178: fdc42783 lw a5,-36(s0) + 300517c: 4398 lw a4,0(a5) + 300517e: 147027b7 lui a5,0x14702 + 3005182: 02f70163 beq a4,a5,30051a4 + 3005186: fdc42783 lw a5,-36(s0) + 300518a: 4398 lw a4,0(a5) + 300518c: 147037b7 lui a5,0x14703 + 3005190: 00f70a63 beq a4,a5,30051a4 + 3005194: 0da00593 li a1,218 + 3005198: 0300f7b7 lui a5,0x300f + 300519c: 1a078513 addi a0,a5,416 # 300f1a0 + 30051a0: 28a9 jal ra,30051fa + 30051a2: a001 j 30051a2 + 30051a4: fdc42783 lw a5,-36(s0) + 30051a8: 439c lw a5,0(a5) + 30051aa: fef42623 sw a5,-20(s0) + 30051ae: fec42783 lw a5,-20(s0) + 30051b2: 4f98 lw a4,24(a5) + 30051b4: fd842783 lw a5,-40(s0) + 30051b8: c398 sw a4,0(a5) + 30051ba: fec42783 lw a5,-20(s0) + 30051be: 4fd8 lw a4,28(a5) + 30051c0: fd842783 lw a5,-40(s0) + 30051c4: c798 sw a4,8(a5) + 30051c6: fec42783 lw a5,-20(s0) + 30051ca: 1007a783 lw a5,256(a5) + 30051ce: 8b8d andi a5,a5,3 + 30051d0: 9f81 uxtb a5 + 30051d2: 873e mv a4,a5 + 30051d4: fd842783 lw a5,-40(s0) + 30051d8: c3d8 sw a4,4(a5) + 30051da: fec42783 lw a5,-20(s0) + 30051de: 1007a783 lw a5,256(a5) + 30051e2: 8391 srli a5,a5,0x4 + 30051e4: 8b8d andi a5,a5,3 + 30051e6: 9f81 uxtb a5 + 30051e8: 873e mv a4,a5 + 30051ea: fd842783 lw a5,-40(s0) + 30051ee: c7d8 sw a4,12(a5) + 30051f0: 0001 nop + 30051f2: 50b2 lw ra,44(sp) + 30051f4: 5422 lw s0,40(sp) + 30051f6: 6145 addi sp,sp,48 + 30051f8: 8082 ret + +030051fa : + 30051fa: ff7fb06f j 30011f0 + +030051fe : + 30051fe: 1101 addi sp,sp,-32 + 3005200: ce22 sw s0,28(sp) + 3005202: 1000 addi s0,sp,32 + 3005204: fea42623 sw a0,-20(s0) + 3005208: fec42783 lw a5,-20(s0) + 300520c: c385 beqz a5,300522c + 300520e: fec42703 lw a4,-20(s0) + 3005212: 4785 li a5,1 + 3005214: 00f70c63 beq a4,a5,300522c + 3005218: fec42703 lw a4,-20(s0) + 300521c: 4789 li a5,2 + 300521e: 00f70763 beq a4,a5,300522c + 3005222: fec42703 lw a4,-20(s0) + 3005226: 478d li a5,3 + 3005228: 00f71463 bne a4,a5,3005230 + 300522c: 4785 li a5,1 + 300522e: a011 j 3005232 + 3005230: 4781 li a5,0 + 3005232: 8b85 andi a5,a5,1 + 3005234: 9f81 uxtb a5 + 3005236: 853e mv a0,a5 + 3005238: 4472 lw s0,28(sp) + 300523a: 6105 addi sp,sp,32 + 300523c: 8082 ret + +0300523e : + 300523e: 1101 addi sp,sp,-32 + 3005240: ce22 sw s0,28(sp) + 3005242: 1000 addi s0,sp,32 + 3005244: fea42623 sw a0,-20(s0) + 3005248: fec42783 lw a5,-20(s0) + 300524c: c791 beqz a5,3005258 + 300524e: fec42703 lw a4,-20(s0) + 3005252: 4785 li a5,1 + 3005254: 00f71463 bne a4,a5,300525c + 3005258: 4785 li a5,1 + 300525a: a011 j 300525e + 300525c: 4781 li a5,0 + 300525e: 8b85 andi a5,a5,1 + 3005260: 9f81 uxtb a5 + 3005262: 853e mv a0,a5 + 3005264: 4472 lw s0,28(sp) + 3005266: 6105 addi sp,sp,32 + 3005268: 8082 ret + +0300526a : + 300526a: 1101 addi sp,sp,-32 + 300526c: ce22 sw s0,28(sp) + 300526e: 1000 addi s0,sp,32 + 3005270: fea42623 sw a0,-20(s0) + 3005274: fec42703 lw a4,-20(s0) + 3005278: 67c1 lui a5,0x10 + 300527a: 00f737b3 sltu a5,a4,a5 + 300527e: 9f81 uxtb a5 + 3005280: 853e mv a0,a5 + 3005282: 4472 lw s0,28(sp) + 3005284: 6105 addi sp,sp,32 + 3005286: 8082 ret + +03005288 : + 3005288: 1101 addi sp,sp,-32 + 300528a: ce22 sw s0,28(sp) + 300528c: 1000 addi s0,sp,32 + 300528e: fea42623 sw a0,-20(s0) + 3005292: fec42703 lw a4,-20(s0) + 3005296: 4785 li a5,1 + 3005298: 00f70563 beq a4,a5,30052a2 + 300529c: fec42783 lw a5,-20(s0) + 30052a0: e399 bnez 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 + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + 30052b4: 1101 addi sp,sp,-32 + 30052b6: ce22 sw s0,28(sp) + 30052b8: 1000 addi s0,sp,32 + 30052ba: fea42623 sw a0,-20(s0) + 30052be: fec42783 lw a5,-20(s0) + 30052c2: 4007b793 sltiu a5,a5,1024 + 30052c6: 9f81 uxtb a5 + 30052c8: 853e mv a0,a5 + 30052ca: 4472 lw s0,28(sp) + 30052cc: 6105 addi sp,sp,32 + 30052ce: 8082 ret + +030052d0 : + 30052d0: 1101 addi sp,sp,-32 + 30052d2: ce22 sw s0,28(sp) + 30052d4: 1000 addi s0,sp,32 + 30052d6: fea42623 sw a0,-20(s0) + 30052da: fec42783 lw a5,-20(s0) + 30052de: 4007b793 sltiu a5,a5,1024 + 30052e2: 9f81 uxtb a5 + 30052e4: 853e mv a0,a5 + 30052e6: 4472 lw s0,28(sp) + 30052e8: 6105 addi sp,sp,32 + 30052ea: 8082 ret + +030052ec : + 30052ec: 1101 addi sp,sp,-32 + 30052ee: ce22 sw s0,28(sp) + 30052f0: 1000 addi s0,sp,32 + 30052f2: fea42623 sw a0,-20(s0) + 30052f6: fec42703 lw a4,-20(s0) + 30052fa: 4785 li a5,1 + 30052fc: 00f70563 beq a4,a5,3005306 + 3005300: fec42783 lw a5,-20(s0) + 3005304: e399 bnez a5,300530a + 3005306: 4785 li a5,1 + 3005308: a011 j 300530c + 300530a: 4781 li a5,0 + 300530c: 8b85 andi a5,a5,1 + 300530e: 9f81 uxtb a5 + 3005310: 853e mv a0,a5 + 3005312: 4472 lw s0,28(sp) + 3005314: 6105 addi sp,sp,32 + 3005316: 8082 ret + +03005318 : + 3005318: 1101 addi sp,sp,-32 + 300531a: ce22 sw s0,28(sp) + 300531c: 1000 addi s0,sp,32 + 300531e: fea42623 sw a0,-20(s0) + 3005322: fec42783 lw a5,-20(s0) + 3005326: 0107b793 sltiu a5,a5,16 + 300532a: 9f81 uxtb a5 + 300532c: 853e mv a0,a5 + 300532e: 4472 lw s0,28(sp) + 3005330: 6105 addi sp,sp,32 + 3005332: 8082 ret + +03005334 : + 3005334: 1101 addi sp,sp,-32 + 3005336: ce22 sw s0,28(sp) + 3005338: 1000 addi s0,sp,32 + 300533a: fea42623 sw a0,-20(s0) + 300533e: fec42783 lw a5,-20(s0) + 3005342: 00f037b3 snez a5,a5 + 3005346: 9f81 uxtb a5 + 3005348: 853e mv a0,a5 + 300534a: 4472 lw s0,28(sp) + 300534c: 6105 addi sp,sp,32 + 300534e: 8082 ret + +03005350 : + 3005350: 1101 addi sp,sp,-32 + 3005352: ce22 sw s0,28(sp) + 3005354: 1000 addi s0,sp,32 + 3005356: fea42623 sw a0,-20(s0) + 300535a: fec42703 lw a4,-20(s0) + 300535e: 4785 li a5,1 + 3005360: 00f70563 beq a4,a5,300536a + 3005364: fec42783 lw a5,-20(s0) + 3005368: e399 bnez a5,300536e + 300536a: 4785 li a5,1 + 300536c: a011 j 3005370 + 300536e: 4781 li a5,0 + 3005370: 8b85 andi a5,a5,1 + 3005372: 9f81 uxtb a5 + 3005374: 853e mv a0,a5 + 3005376: 4472 lw s0,28(sp) + 3005378: 6105 addi sp,sp,32 + 300537a: 8082 ret + +0300537c : + 300537c: 1101 addi sp,sp,-32 + 300537e: ce22 sw s0,28(sp) + 3005380: 1000 addi s0,sp,32 + 3005382: fea42623 sw a0,-20(s0) + 3005386: fec42783 lw a5,-20(s0) + 300538a: 0107b793 sltiu a5,a5,16 + 300538e: 9f81 uxtb a5 + 3005390: 853e mv a0,a5 + 3005392: 4472 lw s0,28(sp) + 3005394: 6105 addi sp,sp,32 + 3005396: 8082 ret + +03005398 : + 3005398: 1101 addi sp,sp,-32 + 300539a: ce22 sw s0,28(sp) + 300539c: 1000 addi s0,sp,32 + 300539e: fea42623 sw a0,-20(s0) + 30053a2: fec42783 lw a5,-20(s0) + 30053a6: 0107b793 sltiu a5,a5,16 + 30053aa: 9f81 uxtb a5 + 30053ac: 853e mv a0,a5 + 30053ae: 4472 lw s0,28(sp) + 30053b0: 6105 addi sp,sp,32 + 30053b2: 8082 ret + +030053b4 : + 30053b4: 1101 addi sp,sp,-32 + 30053b6: ce22 sw s0,28(sp) + 30053b8: 1000 addi s0,sp,32 + 30053ba: fea42623 sw a0,-20(s0) + 30053be: fec42783 lw a5,-20(s0) + 30053c2: 0107b793 sltiu a5,a5,16 + 30053c6: 9f81 uxtb a5 + 30053c8: 853e mv a0,a5 + 30053ca: 4472 lw s0,28(sp) + 30053cc: 6105 addi sp,sp,32 + 30053ce: 8082 ret + +030053d0 : + 30053d0: 1101 addi sp,sp,-32 + 30053d2: ce06 sw ra,28(sp) + 30053d4: cc22 sw s0,24(sp) + 30053d6: 1000 addi s0,sp,32 + 30053d8: fea42623 sw a0,-20(s0) + 30053dc: feb42423 sw a1,-24(s0) + 30053e0: fec42783 lw a5,-20(s0) + 30053e4: 43dc lw a5,4(a5) + 30053e6: 853e mv a0,a5 + 30053e8: 3d19 jal ra,30051fe + 30053ea: 87aa mv a5,a0 + 30053ec: 0017c793 xori a5,a5,1 + 30053f0: 9f81 uxtb a5 + 30053f2: cb91 beqz a5,3005406 + 30053f4: 09000593 li a1,144 + 30053f8: 0300f7b7 lui a5,0x300f + 30053fc: 1bc78513 addi a0,a5,444 # 300f1bc + 3005400: 3bed jal ra,30051fa + 3005402: 4785 li a5,1 + 3005404: a439 j 3005612 + 3005406: fec42783 lw a5,-20(s0) + 300540a: 479c lw a5,8(a5) + 300540c: 853e mv a0,a5 + 300540e: 3d05 jal ra,300523e + 3005410: 87aa mv a5,a0 + 3005412: 0017c793 xori a5,a5,1 + 3005416: 9f81 uxtb a5 + 3005418: cb91 beqz a5,300542c + 300541a: 09100593 li a1,145 + 300541e: 0300f7b7 lui a5,0x300f + 3005422: 1bc78513 addi a0,a5,444 # 300f1bc + 3005426: 3bd1 jal ra,30051fa + 3005428: 4785 li a5,1 + 300542a: a2e5 j 3005612 + 300542c: fec42783 lw a5,-20(s0) + 3005430: 4b9c lw a5,16(a5) + 3005432: 853e mv a0,a5 + 3005434: 3d1d jal ra,300526a + 3005436: 87aa mv a5,a0 + 3005438: 0017c793 xori a5,a5,1 + 300543c: 9f81 uxtb a5 + 300543e: cb91 beqz a5,3005452 + 3005440: 09200593 li a1,146 + 3005444: 0300f7b7 lui a5,0x300f + 3005448: 1bc78513 addi a0,a5,444 # 300f1bc + 300544c: 337d jal ra,30051fa + 300544e: 4785 li a5,1 + 3005450: a2c9 j 3005612 + 3005452: fec42783 lw a5,-20(s0) + 3005456: 4bdc lw a5,20(a5) + 3005458: 853e mv a0,a5 + 300545a: 3de9 jal ra,3005334 + 300545c: 87aa mv a5,a0 + 300545e: 0017c793 xori a5,a5,1 + 3005462: 9f81 uxtb a5 + 3005464: cb91 beqz a5,3005478 + 3005466: 09400593 li a1,148 + 300546a: 0300f7b7 lui a5,0x300f + 300546e: 1bc78513 addi a0,a5,444 # 300f1bc + 3005472: 3361 jal ra,30051fa + 3005474: 4785 li a5,1 + 3005476: aa71 j 3005612 + 3005478: fe842783 lw a5,-24(s0) + 300547c: eb91 bnez a5,3005490 + 300547e: 09500593 li a1,149 + 3005482: 0300f7b7 lui a5,0x300f + 3005486: 1bc78513 addi a0,a5,444 # 300f1bc + 300548a: 3b85 jal ra,30051fa + 300548c: 4785 li a5,1 + 300548e: a251 j 3005612 + 3005490: fec42783 lw a5,-20(s0) + 3005494: 4bdc lw a5,20(a5) + 3005496: fe842703 lw a4,-24(s0) + 300549a: 00f77463 bgeu a4,a5,30054a2 + 300549e: 4785 li a5,1 + 30054a0: aa8d j 3005612 + 30054a2: fec42783 lw a5,-20(s0) + 30054a6: 4f9c lw a5,24(a5) + 30054a8: 853e mv a0,a5 + 30054aa: 355d jal ra,3005350 + 30054ac: 87aa mv a5,a0 + 30054ae: 0017c793 xori a5,a5,1 + 30054b2: 9f81 uxtb a5 + 30054b4: cb91 beqz a5,30054c8 + 30054b6: 09b00593 li a1,155 + 30054ba: 0300f7b7 lui a5,0x300f + 30054be: 1bc78513 addi a0,a5,444 # 300f1bc + 30054c2: 3b25 jal ra,30051fa + 30054c4: 4785 li a5,1 + 30054c6: a2b1 j 3005612 + 30054c8: fec42783 lw a5,-20(s0) + 30054cc: 5bdc lw a5,52(a5) + 30054ce: 853e mv a0,a5 + 30054d0: 3575 jal ra,300537c + 30054d2: 87aa mv a5,a0 + 30054d4: 0017c793 xori a5,a5,1 + 30054d8: 9f81 uxtb a5 + 30054da: cb91 beqz a5,30054ee + 30054dc: 09c00593 li a1,156 + 30054e0: 0300f7b7 lui a5,0x300f + 30054e4: 1bc78513 addi a0,a5,444 # 300f1bc + 30054e8: 3b09 jal ra,30051fa + 30054ea: 4785 li a5,1 + 30054ec: a21d j 3005612 + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: 5b9c lw a5,48(a5) + 30054f4: 853e mv a0,a5 + 30054f6: 354d jal ra,3005398 + 30054f8: 87aa mv a5,a0 + 30054fa: 0017c793 xori a5,a5,1 + 30054fe: 9f81 uxtb a5 + 3005500: cb91 beqz a5,3005514 + 3005502: 09d00593 li a1,157 + 3005506: 0300f7b7 lui a5,0x300f + 300550a: 1bc78513 addi a0,a5,444 # 300f1bc + 300550e: 31f5 jal ra,30051fa + 3005510: 4785 li a5,1 + 3005512: a201 j 3005612 + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4fbc lw a5,88(a5) + 300551a: 853e mv a0,a5 + 300551c: 3bf5 jal ra,3005318 + 300551e: 87aa mv a5,a0 + 3005520: 0017c793 xori a5,a5,1 + 3005524: 9f81 uxtb a5 + 3005526: cb91 beqz a5,300553a + 3005528: 09e00593 li a1,158 + 300552c: 0300f7b7 lui a5,0x300f + 3005530: 1bc78513 addi a0,a5,444 # 300f1bc + 3005534: 31d9 jal ra,30051fa + 3005536: 4785 li a5,1 + 3005538: a8e9 j 3005612 + 300553a: fec42783 lw a5,-20(s0) + 300553e: 4ffc lw a5,92(a5) + 3005540: 853e mv a0,a5 + 3005542: 3d8d jal ra,30053b4 + 3005544: 87aa mv a5,a0 + 3005546: 0017c793 xori a5,a5,1 + 300554a: 9f81 uxtb a5 + 300554c: cb91 beqz a5,3005560 + 300554e: 09f00593 li a1,159 + 3005552: 0300f7b7 lui a5,0x300f + 3005556: 1bc78513 addi a0,a5,444 # 300f1bc + 300555a: 3145 jal ra,30051fa + 300555c: 4785 li a5,1 + 300555e: a855 j 3005612 + 3005560: fec42783 lw a5,-20(s0) + 3005564: 43d8 lw a4,4(a5) + 3005566: 4789 li a5,2 + 3005568: 00f70863 beq a4,a5,3005578 + 300556c: fec42783 lw a5,-20(s0) + 3005570: 43d8 lw a4,4(a5) + 3005572: 478d li a5,3 + 3005574: 08f71e63 bne a4,a5,3005610 + 3005578: fec42783 lw a5,-20(s0) + 300557c: 47dc lw a5,12(a5) + 300557e: 853e mv a0,a5 + 3005580: 3b15 jal ra,30052b4 + 3005582: 87aa mv a5,a0 + 3005584: 0017c793 xori a5,a5,1 + 3005588: 9f81 uxtb a5 + 300558a: cb91 beqz a5,300559e + 300558c: 0a300593 li a1,163 + 3005590: 0300f7b7 lui a5,0x300f + 3005594: 1bc78513 addi a0,a5,444 # 300f1bc + 3005598: 318d jal ra,30051fa + 300559a: 4785 li a5,1 + 300559c: a89d j 3005612 + 300559e: fec42783 lw a5,-20(s0) + 30055a2: 4fdc lw a5,28(a5) + 30055a4: 853e mv a0,a5 + 30055a6: 31cd jal ra,3005288 + 30055a8: 87aa mv a5,a0 + 30055aa: 0017c793 xori a5,a5,1 + 30055ae: 9f81 uxtb a5 + 30055b0: cb91 beqz a5,30055c4 + 30055b2: 0a400593 li a1,164 + 30055b6: 0300f7b7 lui a5,0x300f + 30055ba: 1bc78513 addi a0,a5,444 # 300f1bc + 30055be: 3935 jal ra,30051fa + 30055c0: 4785 li a5,1 + 30055c2: a881 j 3005612 + 30055c4: fec42783 lw a5,-20(s0) + 30055c8: 53bc lw a5,96(a5) + 30055ca: 853e mv a0,a5 + 30055cc: 3305 jal ra,30052ec + 30055ce: 87aa mv a5,a0 + 30055d0: 0017c793 xori a5,a5,1 + 30055d4: 9f81 uxtb a5 + 30055d6: cb91 beqz a5,30055ea + 30055d8: 0a500593 li a1,165 + 30055dc: 0300f7b7 lui a5,0x300f + 30055e0: 1bc78513 addi a0,a5,444 # 300f1bc + 30055e4: 3919 jal ra,30051fa + 30055e6: 4785 li a5,1 + 30055e8: a02d j 3005612 + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 53fc lw a5,100(a5) + 30055f0: 853e mv a0,a5 + 30055f2: 39f9 jal ra,30052d0 + 30055f4: 87aa mv a5,a0 + 30055f6: 0017c793 xori a5,a5,1 + 30055fa: 9f81 uxtb a5 + 30055fc: cb91 beqz a5,3005610 + 30055fe: 0a600593 li a1,166 + 3005602: 0300f7b7 lui a5,0x300f + 3005606: 1bc78513 addi a0,a5,444 # 300f1bc + 300560a: 3ec5 jal ra,30051fa + 300560c: 4785 li a5,1 + 300560e: a011 j 3005612 + 3005610: 4781 li a5,0 + 3005612: 853e mv a0,a5 + 3005614: 40f2 lw ra,28(sp) + 3005616: 4462 lw s0,24(sp) + 3005618: 6105 addi sp,sp,32 + 300561a: 8082 ret + +0300561c : + 300561c: 7139 addi sp,sp,-64 + 300561e: de06 sw ra,60(sp) + 3005620: dc22 sw s0,56(sp) + 3005622: 0080 addi s0,sp,64 + 3005624: fca42623 sw a0,-52(s0) + 3005628: fcc42783 lw a5,-52(s0) + 300562c: eb89 bnez a5,300563e + 300562e: 4f400593 li a1,1268 + 3005632: 0300f7b7 lui a5,0x300f + 3005636: 1bc78513 addi a0,a5,444 # 300f1bc + 300563a: 36c1 jal ra,30051fa + 300563c: a001 j 300563c + 300563e: fcc42783 lw a5,-52(s0) + 3005642: 4398 lw a4,0(a5) + 3005644: 141007b7 lui a5,0x14100 + 3005648: 02f70163 beq a4,a5,300566a + 300564c: fcc42783 lw a5,-52(s0) + 3005650: 4398 lw a4,0(a5) + 3005652: 141017b7 lui a5,0x14101 + 3005656: 00f70a63 beq a4,a5,300566a + 300565a: 4f500593 li a1,1269 + 300565e: 0300f7b7 lui a5,0x300f + 3005662: 1bc78513 addi a0,a5,444 # 300f1bc + 3005666: 3e51 jal ra,30051fa + 3005668: a001 j 3005668 + 300566a: fcc42783 lw a5,-52(s0) + 300566e: 439c lw a5,0(a5) + 3005670: 853e mv a0,a5 + 3005672: eb5fc0ef jal ra,3002526 + 3005676: fea42423 sw a0,-24(s0) + 300567a: fe842583 lw a1,-24(s0) + 300567e: fcc42503 lw a0,-52(s0) + 3005682: 33b9 jal ra,30053d0 + 3005684: 87aa mv a5,a0 + 3005686: c399 beqz a5,300568c + 3005688: 4785 li a5,1 + 300568a: a4ad j 30058f4 + 300568c: fcc42783 lw a5,-52(s0) + 3005690: 4709 li a4,2 + 3005692: c3f8 sw a4,68(a5) + 3005694: fcc42783 lw a5,-52(s0) + 3005698: 439c lw a5,0(a5) + 300569a: 0e07a223 sw zero,228(a5) + 300569e: fcc42783 lw a5,-52(s0) + 30056a2: 439c lw a5,0(a5) + 30056a4: 01000737 lui a4,0x1000 + 30056a8: 177d addi a4,a4,-1 # ffffff + 30056aa: 0ee7a023 sw a4,224(a5) + 30056ae: fcc42783 lw a5,-52(s0) + 30056b2: 4fb4 lw a3,88(a5) + 30056b4: fcc42783 lw a5,-52(s0) + 30056b8: 4398 lw a4,0(a5) + 30056ba: 87b6 mv a5,a3 + 30056bc: 8bbd andi a5,a5,15 + 30056be: 0ff7f693 andi a3,a5,255 + 30056c2: 10c72783 lw a5,268(a4) + 30056c6: 8abd andi a3,a3,15 + 30056c8: 9bc1 andi a5,a5,-16 + 30056ca: 8fd5 or a5,a5,a3 + 30056cc: 10f72623 sw a5,268(a4) + 30056d0: fcc42783 lw a5,-52(s0) + 30056d4: 4fbc lw a5,88(a5) + 30056d6: 07a5 addi a5,a5,9 + 30056d8: fef42223 sw a5,-28(s0) + 30056dc: fcc42783 lw a5,-52(s0) + 30056e0: 4fbc lw a5,88(a5) + 30056e2: 07a1 addi a5,a5,8 + 30056e4: fef42023 sw a5,-32(s0) + 30056e8: fcc42783 lw a5,-52(s0) + 30056ec: 4bd8 lw a4,20(a5) + 30056ee: 67e1 lui a5,0x18 + 30056f0: 6a078793 addi a5,a5,1696 # 186a0 + 30056f4: 02e7ee63 bltu a5,a4,3005730 + 30056f8: fcc42783 lw a5,-52(s0) + 30056fc: 4bdc lw a5,20(a5) + 30056fe: 0786 slli a5,a5,0x1 + 3005700: fe842703 lw a4,-24(s0) + 3005704: 02f75733 divu a4,a4,a5 + 3005708: fe042783 lw a5,-32(s0) + 300570c: 40f707b3 sub a5,a4,a5 + 3005710: fef42623 sw a5,-20(s0) + 3005714: fec42783 lw a5,-20(s0) + 3005718: fff78713 addi a4,a5,-1 + 300571c: 67c1 lui a5,0x10 + 300571e: 17fd addi a5,a5,-1 # ffff + 3005720: 8f7d and a4,a4,a5 + 3005722: fec42783 lw a5,-20(s0) + 3005726: 07c2 slli a5,a5,0x10 + 3005728: 8fd9 or a5,a5,a4 + 300572a: fef42623 sw a5,-20(s0) + 300572e: a8b9 j 300578c + 3005730: fe842703 lw a4,-24(s0) + 3005734: 06400793 li a5,100 + 3005738: 02f75733 divu a4,a4,a5 + 300573c: 02400793 li a5,36 + 3005740: 02f70733 mul a4,a4,a5 + 3005744: fcc42783 lw a5,-52(s0) + 3005748: 4bdc lw a5,20(a5) + 300574a: 02f75733 divu a4,a4,a5 + 300574e: fe042783 lw a5,-32(s0) + 3005752: 40f707b3 sub a5,a4,a5 + 3005756: 07c2 slli a5,a5,0x10 + 3005758: fef42623 sw a5,-20(s0) + 300575c: fe842703 lw a4,-24(s0) + 3005760: 06400793 li a5,100 + 3005764: 02f757b3 divu a5,a4,a5 + 3005768: 00679713 slli a4,a5,0x6 + 300576c: fcc42783 lw a5,-52(s0) + 3005770: 4bdc lw a5,20(a5) + 3005772: 02f75733 divu a4,a4,a5 + 3005776: fe442783 lw a5,-28(s0) + 300577a: 8f1d sub a4,a4,a5 + 300577c: 67c1 lui a5,0x10 + 300577e: 17fd addi a5,a5,-1 # ffff + 3005780: 8ff9 and a5,a5,a4 + 3005782: fec42703 lw a4,-20(s0) + 3005786: 8fd9 or a5,a5,a4 + 3005788: fef42623 sw a5,-20(s0) + 300578c: fcc42783 lw a5,-52(s0) + 3005790: 439c lw a5,0(a5) + 3005792: fec42703 lw a4,-20(s0) + 3005796: c3d8 sw a4,4(a5) + 3005798: fcc42783 lw a5,-52(s0) + 300579c: 4b9c lw a5,16(a5) + 300579e: 07c2 slli a5,a5,0x10 + 30057a0: fcf42e23 sw a5,-36(s0) + 30057a4: fcc42783 lw a5,-52(s0) + 30057a8: 4ffc lw a5,92(a5) + 30057aa: 8bbd andi a5,a5,15 + 30057ac: fdc42703 lw a4,-36(s0) + 30057b0: 8fd9 or a5,a5,a4 + 30057b2: fcf42c23 sw a5,-40(s0) + 30057b6: fcc42783 lw a5,-52(s0) + 30057ba: 439c lw a5,0(a5) + 30057bc: fd842703 lw a4,-40(s0) + 30057c0: c798 sw a4,8(a5) + 30057c2: fcc42783 lw a5,-52(s0) + 30057c6: 5bd4 lw a3,52(a5) + 30057c8: fcc42783 lw a5,-52(s0) + 30057cc: 4398 lw a4,0(a5) + 30057ce: 87b6 mv a5,a3 + 30057d0: 8bbd andi a5,a5,15 + 30057d2: 0ff7f693 andi a3,a5,255 + 30057d6: 0c872783 lw a5,200(a4) + 30057da: 8abd andi a3,a3,15 + 30057dc: 9bc1 andi a5,a5,-16 + 30057de: 8fd5 or a5,a5,a3 + 30057e0: 0cf72423 sw a5,200(a4) + 30057e4: fcc42783 lw a5,-52(s0) + 30057e8: 5b94 lw a3,48(a5) + 30057ea: fcc42783 lw a5,-52(s0) + 30057ee: 4398 lw a4,0(a5) + 30057f0: 87b6 mv a5,a3 + 30057f2: 8bbd andi a5,a5,15 + 30057f4: 0ff7f693 andi a3,a5,255 + 30057f8: 0cc72783 lw a5,204(a4) + 30057fc: 8abd andi a3,a3,15 + 30057fe: 9bc1 andi a5,a5,-16 + 3005800: 8fd5 or a5,a5,a3 + 3005802: 0cf72623 sw a5,204(a4) + 3005806: fcc42783 lw a5,-52(s0) + 300580a: 43d4 lw a3,4(a5) + 300580c: fcc42783 lw a5,-52(s0) + 3005810: 4398 lw a4,0(a5) + 3005812: 87b6 mv a5,a3 + 3005814: 8b8d andi a5,a5,3 + 3005816: 0ff7f693 andi a3,a5,255 + 300581a: 431c lw a5,0(a4) + 300581c: 8a8d andi a3,a3,3 + 300581e: 9bf1 andi a5,a5,-4 + 3005820: 8fd5 or a5,a5,a3 + 3005822: c31c sw a5,0(a4) + 3005824: fcc42783 lw a5,-52(s0) + 3005828: 4f94 lw a3,24(a5) + 300582a: fcc42783 lw a5,-52(s0) + 300582e: 4398 lw a4,0(a5) + 3005830: 87b6 mv a5,a3 + 3005832: 8b85 andi a5,a5,1 + 3005834: 0ff7f693 andi a3,a5,255 + 3005838: 431c lw a5,0(a4) + 300583a: 8a85 andi a3,a3,1 + 300583c: 0692 slli a3,a3,0x4 + 300583e: 9bbd andi a5,a5,-17 + 3005840: 8fd5 or a5,a5,a3 + 3005842: c31c sw a5,0(a4) + 3005844: fcc42783 lw a5,-52(s0) + 3005848: 43d8 lw a4,4(a5) + 300584a: 4789 li a5,2 + 300584c: 00f70863 beq a4,a5,300585c + 3005850: fcc42783 lw a5,-52(s0) + 3005854: 43d8 lw a4,4(a5) + 3005856: 478d li a5,3 + 3005858: 08f71963 bne a4,a5,30058ea + 300585c: fcc42783 lw a5,-52(s0) + 3005860: 47d4 lw a3,12(a5) + 3005862: fcc42783 lw a5,-52(s0) + 3005866: 4398 lw a4,0(a5) + 3005868: 87b6 mv a5,a3 + 300586a: 3ff7f793 andi a5,a5,1023 + 300586e: 01079693 slli a3,a5,0x10 + 3005872: 82c1 srli a3,a3,0x10 + 3005874: 475c lw a5,12(a4) + 3005876: 3ff6f693 andi a3,a3,1023 + 300587a: c007f793 andi a5,a5,-1024 + 300587e: 8fd5 or a5,a5,a3 + 3005880: c75c sw a5,12(a4) + 3005882: fcc42783 lw a5,-52(s0) + 3005886: 4fd4 lw a3,28(a5) + 3005888: fcc42783 lw a5,-52(s0) + 300588c: 4398 lw a4,0(a5) + 300588e: 87b6 mv a5,a3 + 3005890: 8b85 andi a5,a5,1 + 3005892: 0ff7f693 andi a3,a5,255 + 3005896: 475c lw a5,12(a4) + 3005898: 8a85 andi a3,a3,1 + 300589a: 06e2 slli a3,a3,0x18 + 300589c: ff000637 lui a2,0xff000 + 30058a0: 167d addi a2,a2,-1 # feffffff + 30058a2: 8ff1 and a5,a5,a2 + 30058a4: 8fd5 or a5,a5,a3 + 30058a6: c75c sw a5,12(a4) + 30058a8: fcc42783 lw a5,-52(s0) + 30058ac: 53b8 lw a4,96(a5) + 30058ae: 4785 li a5,1 + 30058b0: 02f71d63 bne a4,a5,30058ea + 30058b4: fcc42783 lw a5,-52(s0) + 30058b8: 4398 lw a4,0(a5) + 30058ba: 4b1c lw a5,16(a4) + 30058bc: 004006b7 lui a3,0x400 + 30058c0: 8fd5 or a5,a5,a3 + 30058c2: cb1c sw a5,16(a4) + 30058c4: fcc42783 lw a5,-52(s0) + 30058c8: 53f4 lw a3,100(a5) + 30058ca: fcc42783 lw a5,-52(s0) + 30058ce: 4398 lw a4,0(a5) + 30058d0: 87b6 mv a5,a3 + 30058d2: 3ff7f793 andi a5,a5,1023 + 30058d6: 01079693 slli a3,a5,0x10 + 30058da: 82c1 srli a3,a3,0x10 + 30058dc: 4b1c lw a5,16(a4) + 30058de: 3ff6f693 andi a3,a3,1023 + 30058e2: c007f793 andi a5,a5,-1024 + 30058e6: 8fd5 or a5,a5,a3 + 30058e8: cb1c sw a5,16(a4) + 30058ea: fcc42783 lw a5,-52(s0) + 30058ee: 4705 li a4,1 + 30058f0: c3f8 sw a4,68(a5) + 30058f2: 4781 li a5,0 + 30058f4: 853e mv a0,a5 + 30058f6: 50f2 lw ra,60(sp) + 30058f8: 5462 lw s0,56(sp) + 30058fa: 6121 addi sp,sp,64 + 30058fc: 8082 ret + +030058fe : + 30058fe: 1101 addi sp,sp,-32 + 3005900: ce06 sw ra,28(sp) + 3005902: cc22 sw s0,24(sp) + 3005904: 1000 addi s0,sp,32 + 3005906: fea42623 sw a0,-20(s0) + 300590a: feb42423 sw a1,-24(s0) + 300590e: fec42703 lw a4,-20(s0) + 3005912: 77c1 lui a5,0xffff0 + 3005914: 8f7d and a4,a4,a5 + 3005916: 147f07b7 lui a5,0x147f0 + 300591a: 00f70a63 beq a4,a5,300592e + 300591e: 08b00593 li a1,139 + 3005922: 0300f7b7 lui a5,0x300f + 3005926: 1d878513 addi a0,a5,472 # 300f1d8 + 300592a: 2df1 jal ra,3006006 + 300592c: a001 j 300592c + 300592e: fec42783 lw a5,-20(s0) + 3005932: fe842703 lw a4,-24(s0) + 3005936: c398 sw a4,0(a5) + 3005938: 0001 nop + 300593a: 40f2 lw ra,28(sp) + 300593c: 4462 lw s0,24(sp) + 300593e: 6105 addi sp,sp,32 + 3005940: 8082 ret + +03005942 : + 3005942: 1101 addi sp,sp,-32 + 3005944: ce06 sw ra,28(sp) + 3005946: cc22 sw s0,24(sp) + 3005948: 1000 addi s0,sp,32 + 300594a: fea42623 sw a0,-20(s0) + 300594e: feb42423 sw a1,-24(s0) + 3005952: fec42703 lw a4,-20(s0) + 3005956: 77c1 lui a5,0xffff0 + 3005958: 8f7d and a4,a4,a5 + 300595a: 147f07b7 lui a5,0x147f0 + 300595e: 00f70a63 beq a4,a5,3005972 + 3005962: 0ba00593 li a1,186 + 3005966: 0300f7b7 lui a5,0x300f + 300596a: 1d878513 addi a0,a5,472 # 300f1d8 + 300596e: 2d61 jal ra,3006006 + 3005970: a001 j 3005970 + 3005972: fe842703 lw a4,-24(s0) + 3005976: 478d li a5,3 + 3005978: 00e7fa63 bgeu a5,a4,300598c + 300597c: 0bb00593 li a1,187 + 3005980: 0300f7b7 lui a5,0x300f + 3005984: 1d878513 addi a0,a5,472 # 300f1d8 + 3005988: 2dbd jal ra,3006006 + 300598a: a839 j 30059a8 + 300598c: fe842783 lw a5,-24(s0) + 3005990: 8b8d andi a5,a5,3 + 3005992: 0ff7f693 andi a3,a5,255 + 3005996: fec42703 lw a4,-20(s0) + 300599a: 431c lw a5,0(a4) + 300599c: 8a8d andi a3,a3,3 + 300599e: 0692 slli a3,a3,0x4 + 30059a0: fcf7f793 andi a5,a5,-49 + 30059a4: 8fd5 or a5,a5,a3 + 30059a6: c31c sw a5,0(a4) + 30059a8: 40f2 lw ra,28(sp) + 30059aa: 4462 lw s0,24(sp) + 30059ac: 6105 addi sp,sp,32 + 30059ae: 8082 ret + +030059b0 : + 30059b0: 1101 addi sp,sp,-32 + 30059b2: ce06 sw ra,28(sp) + 30059b4: cc22 sw s0,24(sp) + 30059b6: 1000 addi s0,sp,32 + 30059b8: fea42623 sw a0,-20(s0) + 30059bc: feb42423 sw a1,-24(s0) + 30059c0: fec42703 lw a4,-20(s0) + 30059c4: 77c1 lui a5,0xffff0 + 30059c6: 8f7d and a4,a4,a5 + 30059c8: 147f07b7 lui a5,0x147f0 + 30059cc: 00f70a63 beq a4,a5,30059e0 + 30059d0: 0d200593 li a1,210 + 30059d4: 0300f7b7 lui a5,0x300f + 30059d8: 1d878513 addi a0,a5,472 # 300f1d8 + 30059dc: 252d jal ra,3006006 + 30059de: a001 j 30059de + 30059e0: fe842703 lw a4,-24(s0) + 30059e4: 478d li a5,3 + 30059e6: 00e7fa63 bgeu a5,a4,30059fa + 30059ea: 0d300593 li a1,211 + 30059ee: 0300f7b7 lui a5,0x300f + 30059f2: 1d878513 addi a0,a5,472 # 300f1d8 + 30059f6: 2d01 jal ra,3006006 + 30059f8: a835 j 3005a34 + 30059fa: fe842783 lw a5,-24(s0) + 30059fe: 8385 srli a5,a5,0x1 + 3005a00: 8b85 andi a5,a5,1 + 3005a02: 0ff7f693 andi a3,a5,255 + 3005a06: fec42703 lw a4,-20(s0) + 3005a0a: 431c lw a5,0(a4) + 3005a0c: 8a85 andi a3,a3,1 + 3005a0e: 06a2 slli a3,a3,0x8 + 3005a10: eff7f793 andi a5,a5,-257 + 3005a14: 8fd5 or a5,a5,a3 + 3005a16: c31c sw a5,0(a4) + 3005a18: fe842783 lw a5,-24(s0) + 3005a1c: 8b85 andi a5,a5,1 + 3005a1e: 0ff7f693 andi a3,a5,255 + 3005a22: fec42703 lw a4,-20(s0) + 3005a26: 431c lw a5,0(a4) + 3005a28: 8a85 andi a3,a3,1 + 3005a2a: 069e slli a3,a3,0x7 + 3005a2c: f7f7f793 andi a5,a5,-129 + 3005a30: 8fd5 or a5,a5,a3 + 3005a32: c31c sw a5,0(a4) + 3005a34: 40f2 lw ra,28(sp) + 3005a36: 4462 lw s0,24(sp) + 3005a38: 6105 addi sp,sp,32 + 3005a3a: 8082 ret + +03005a3c : + 3005a3c: 1101 addi sp,sp,-32 + 3005a3e: ce06 sw ra,28(sp) + 3005a40: cc22 sw s0,24(sp) + 3005a42: 1000 addi s0,sp,32 + 3005a44: fea42623 sw a0,-20(s0) + 3005a48: feb42423 sw a1,-24(s0) + 3005a4c: fec42703 lw a4,-20(s0) + 3005a50: 77c1 lui a5,0xffff0 + 3005a52: 8f7d and a4,a4,a5 + 3005a54: 147f07b7 lui a5,0x147f0 + 3005a58: 00f70a63 beq a4,a5,3005a6c + 3005a5c: 0ed00593 li a1,237 + 3005a60: 0300f7b7 lui a5,0x300f + 3005a64: 1d878513 addi a0,a5,472 # 300f1d8 + 3005a68: 2b79 jal ra,3006006 + 3005a6a: a001 j 3005a6a + 3005a6c: fe842703 lw a4,-24(s0) + 3005a70: 4785 li a5,1 + 3005a72: 00e7fa63 bgeu a5,a4,3005a86 + 3005a76: 0ee00593 li a1,238 + 3005a7a: 0300f7b7 lui a5,0x300f + 3005a7e: 1d878513 addi a0,a5,472 # 300f1d8 + 3005a82: 2351 jal ra,3006006 + 3005a84: a839 j 3005aa2 + 3005a86: fe842783 lw a5,-24(s0) + 3005a8a: 8b85 andi a5,a5,1 + 3005a8c: 0ff7f693 andi a3,a5,255 + 3005a90: fec42703 lw a4,-20(s0) + 3005a94: 431c lw a5,0(a4) + 3005a96: 8a85 andi a3,a3,1 + 3005a98: 06a6 slli a3,a3,0x9 + 3005a9a: dff7f793 andi a5,a5,-513 + 3005a9e: 8fd5 or a5,a5,a3 + 3005aa0: c31c sw a5,0(a4) + 3005aa2: 40f2 lw ra,28(sp) + 3005aa4: 4462 lw s0,24(sp) + 3005aa6: 6105 addi sp,sp,32 + 3005aa8: 8082 ret + +03005aaa : + 3005aaa: 1101 addi sp,sp,-32 + 3005aac: ce06 sw ra,28(sp) + 3005aae: cc22 sw s0,24(sp) + 3005ab0: 1000 addi s0,sp,32 + 3005ab2: fea42623 sw a0,-20(s0) + 3005ab6: feb42423 sw a1,-24(s0) + 3005aba: fec42703 lw a4,-20(s0) + 3005abe: 77c1 lui a5,0xffff0 + 3005ac0: 8f7d and a4,a4,a5 + 3005ac2: 147f07b7 lui a5,0x147f0 + 3005ac6: 00f70a63 beq a4,a5,3005ada + 3005aca: 10500593 li a1,261 + 3005ace: 0300f7b7 lui a5,0x300f + 3005ad2: 1d878513 addi a0,a5,472 # 300f1d8 + 3005ad6: 2b05 jal ra,3006006 + 3005ad8: a001 j 3005ad8 + 3005ada: fe842703 lw a4,-24(s0) + 3005ade: 4785 li a5,1 + 3005ae0: 00e7fa63 bgeu a5,a4,3005af4 + 3005ae4: 10600593 li a1,262 + 3005ae8: 0300f7b7 lui a5,0x300f + 3005aec: 1d878513 addi a0,a5,472 # 300f1d8 + 3005af0: 2b19 jal ra,3006006 + 3005af2: a839 j 3005b10 + 3005af4: fe842783 lw a5,-24(s0) + 3005af8: 8b85 andi a5,a5,1 + 3005afa: 0ff7f693 andi a3,a5,255 + 3005afe: fec42703 lw a4,-20(s0) + 3005b02: 431c lw a5,0(a4) + 3005b04: 8a85 andi a3,a3,1 + 3005b06: 06aa slli a3,a3,0xa + 3005b08: bff7f793 andi a5,a5,-1025 + 3005b0c: 8fd5 or a5,a5,a3 + 3005b0e: c31c sw a5,0(a4) + 3005b10: 40f2 lw ra,28(sp) + 3005b12: 4462 lw s0,24(sp) + 3005b14: 6105 addi sp,sp,32 + 3005b16: 8082 ret + +03005b18 : + 3005b18: 7179 addi sp,sp,-48 + 3005b1a: d622 sw s0,44(sp) + 3005b1c: 1800 addi s0,sp,48 + 3005b1e: fca42e23 sw a0,-36(s0) + 3005b22: 147f07b7 lui a5,0x147f0 + 3005b26: fef42623 sw a5,-20(s0) + 3005b2a: fdc42783 lw a5,-36(s0) + 3005b2e: 0107d713 srli a4,a5,0x10 + 3005b32: 6785 lui a5,0x1 + 3005b34: 17fd addi a5,a5,-1 # fff + 3005b36: 8ff9 and a5,a5,a4 + 3005b38: fef42423 sw a5,-24(s0) + 3005b3c: fec42703 lw a4,-20(s0) + 3005b40: fe842783 lw a5,-24(s0) + 3005b44: 97ba add a5,a5,a4 + 3005b46: fef42223 sw a5,-28(s0) + 3005b4a: fe442703 lw a4,-28(s0) + 3005b4e: 77c1 lui a5,0xffff0 + 3005b50: 8f7d and a4,a4,a5 + 3005b52: 147f07b7 lui a5,0x147f0 + 3005b56: 00f70463 beq a4,a5,3005b5e + 3005b5a: 4781 li a5,0 + 3005b5c: a019 j 3005b62 + 3005b5e: fe442783 lw a5,-28(s0) + 3005b62: 853e mv a0,a5 + 3005b64: 5432 lw s0,44(sp) + 3005b66: 6145 addi sp,sp,48 + 3005b68: 8082 ret + +03005b6a : + 3005b6a: 7179 addi sp,sp,-48 + 3005b6c: d606 sw ra,44(sp) + 3005b6e: d422 sw s0,40(sp) + 3005b70: 1800 addi s0,sp,48 + 3005b72: fca42e23 sw a0,-36(s0) + 3005b76: fdc42503 lw a0,-36(s0) + 3005b7a: 3f79 jal ra,3005b18 + 3005b7c: fea42623 sw a0,-20(s0) + 3005b80: fdc42703 lw a4,-36(s0) + 3005b84: 67c1 lui a5,0x10 + 3005b86: 17fd addi a5,a5,-1 # ffff + 3005b88: 8ff9 and a5,a5,a4 + 3005b8a: fef42423 sw a5,-24(s0) + 3005b8e: fe842583 lw a1,-24(s0) + 3005b92: fec42503 lw a0,-20(s0) + 3005b96: 33a5 jal ra,30058fe + 3005b98: 4781 li a5,0 + 3005b9a: 853e mv a0,a5 + 3005b9c: 50b2 lw ra,44(sp) + 3005b9e: 5422 lw s0,40(sp) + 3005ba0: 6145 addi sp,sp,48 + 3005ba2: 8082 ret + +03005ba4 : + 3005ba4: 7179 addi sp,sp,-48 + 3005ba6: d606 sw ra,44(sp) + 3005ba8: d422 sw s0,40(sp) + 3005baa: 1800 addi s0,sp,48 + 3005bac: fca42e23 sw a0,-36(s0) + 3005bb0: fcb42c23 sw a1,-40(s0) + 3005bb4: fd842703 lw a4,-40(s0) + 3005bb8: 478d li a5,3 + 3005bba: 00e7fb63 bgeu a5,a4,3005bd0 + 3005bbe: 07800593 li a1,120 + 3005bc2: 0300f7b7 lui a5,0x300f + 3005bc6: 1f878513 addi a0,a5,504 # 300f1f8 + 3005bca: 2935 jal ra,3006006 + 3005bcc: 4791 li a5,4 + 3005bce: a821 j 3005be6 + 3005bd0: fdc42503 lw a0,-36(s0) + 3005bd4: 3791 jal ra,3005b18 + 3005bd6: fea42623 sw a0,-20(s0) + 3005bda: fd842583 lw a1,-40(s0) + 3005bde: fec42503 lw a0,-20(s0) + 3005be2: 33f9 jal ra,30059b0 + 3005be4: 4781 li a5,0 + 3005be6: 853e mv a0,a5 + 3005be8: 50b2 lw ra,44(sp) + 3005bea: 5422 lw s0,40(sp) + 3005bec: 6145 addi sp,sp,48 + 3005bee: 8082 ret + +03005bf0 : + 3005bf0: 7179 addi sp,sp,-48 + 3005bf2: d606 sw ra,44(sp) + 3005bf4: d422 sw s0,40(sp) + 3005bf6: 1800 addi s0,sp,48 + 3005bf8: fca42e23 sw a0,-36(s0) + 3005bfc: fcb42c23 sw a1,-40(s0) + 3005c00: fd842703 lw a4,-40(s0) + 3005c04: 4785 li a5,1 + 3005c06: 00e7fb63 bgeu a5,a4,3005c1c + 3005c0a: 09300593 li a1,147 + 3005c0e: 0300f7b7 lui a5,0x300f + 3005c12: 1f878513 addi a0,a5,504 # 300f1f8 + 3005c16: 2ec5 jal ra,3006006 + 3005c18: 4791 li a5,4 + 3005c1a: a821 j 3005c32 + 3005c1c: fdc42503 lw a0,-36(s0) + 3005c20: 3de5 jal ra,3005b18 + 3005c22: fea42623 sw a0,-20(s0) + 3005c26: fd842583 lw a1,-40(s0) + 3005c2a: fec42503 lw a0,-20(s0) + 3005c2e: 3db5 jal ra,3005aaa + 3005c30: 4781 li a5,0 + 3005c32: 853e mv a0,a5 + 3005c34: 50b2 lw ra,44(sp) + 3005c36: 5422 lw s0,40(sp) + 3005c38: 6145 addi sp,sp,48 + 3005c3a: 8082 ret + +03005c3c : + 3005c3c: 7179 addi sp,sp,-48 + 3005c3e: d606 sw ra,44(sp) + 3005c40: d422 sw s0,40(sp) + 3005c42: 1800 addi s0,sp,48 + 3005c44: fca42e23 sw a0,-36(s0) + 3005c48: fcb42c23 sw a1,-40(s0) + 3005c4c: fd842703 lw a4,-40(s0) + 3005c50: 4785 li a5,1 + 3005c52: 00e7fb63 bgeu a5,a4,3005c68 + 3005c56: 0ae00593 li a1,174 + 3005c5a: 0300f7b7 lui a5,0x300f + 3005c5e: 1f878513 addi a0,a5,504 # 300f1f8 + 3005c62: 2655 jal ra,3006006 + 3005c64: 4791 li a5,4 + 3005c66: a821 j 3005c7e + 3005c68: fdc42503 lw a0,-36(s0) + 3005c6c: 3575 jal ra,3005b18 + 3005c6e: fea42623 sw a0,-20(s0) + 3005c72: fd842583 lw a1,-40(s0) + 3005c76: fec42503 lw a0,-20(s0) + 3005c7a: 33c9 jal ra,3005a3c + 3005c7c: 4781 li a5,0 + 3005c7e: 853e mv a0,a5 + 3005c80: 50b2 lw ra,44(sp) + 3005c82: 5422 lw s0,40(sp) + 3005c84: 6145 addi sp,sp,48 + 3005c86: 8082 ret + +03005c88 : + 3005c88: 7179 addi sp,sp,-48 + 3005c8a: d606 sw ra,44(sp) + 3005c8c: d422 sw s0,40(sp) + 3005c8e: 1800 addi s0,sp,48 + 3005c90: fca42e23 sw a0,-36(s0) + 3005c94: fcb42c23 sw a1,-40(s0) + 3005c98: fd842703 lw a4,-40(s0) + 3005c9c: 478d li a5,3 + 3005c9e: 00e7fb63 bgeu a5,a4,3005cb4 + 3005ca2: 0cb00593 li a1,203 + 3005ca6: 0300f7b7 lui a5,0x300f + 3005caa: 1f878513 addi a0,a5,504 # 300f1f8 + 3005cae: 2ea1 jal ra,3006006 + 3005cb0: 4791 li a5,4 + 3005cb2: a821 j 3005cca + 3005cb4: fdc42503 lw a0,-36(s0) + 3005cb8: 3585 jal ra,3005b18 + 3005cba: fea42623 sw a0,-20(s0) + 3005cbe: fd842583 lw a1,-40(s0) + 3005cc2: fec42503 lw a0,-20(s0) + 3005cc6: 39b5 jal ra,3005942 + 3005cc8: 4781 li a5,0 + 3005cca: 853e mv a0,a5 + 3005ccc: 50b2 lw ra,44(sp) + 3005cce: 5422 lw s0,40(sp) + 3005cd0: 6145 addi sp,sp,48 + 3005cd2: 8082 ret + +03005cd4 : + 3005cd4: 1101 addi sp,sp,-32 + 3005cd6: ce22 sw s0,28(sp) + 3005cd8: 1000 addi s0,sp,32 + 3005cda: fea42623 sw a0,-20(s0) + 3005cde: fec42783 lw a5,-20(s0) + 3005ce2: cb99 beqz a5,3005cf8 + 3005ce4: fec42703 lw a4,-20(s0) + 3005ce8: 4785 li a5,1 + 3005cea: 00f70763 beq a4,a5,3005cf8 + 3005cee: fec42703 lw a4,-20(s0) + 3005cf2: 4789 li a5,2 + 3005cf4: 00f71463 bne a4,a5,3005cfc + 3005cf8: 4785 li a5,1 + 3005cfa: a011 j 3005cfe + 3005cfc: 4781 li a5,0 + 3005cfe: 8b85 andi a5,a5,1 + 3005d00: 9f81 uxtb a5 + 3005d02: 853e mv a0,a5 + 3005d04: 4472 lw s0,28(sp) + 3005d06: 6105 addi sp,sp,32 + 3005d08: 8082 ret + +03005d0a : + 3005d0a: 1101 addi sp,sp,-32 + 3005d0c: ce22 sw s0,28(sp) + 3005d0e: 1000 addi s0,sp,32 + 3005d10: fea42623 sw a0,-20(s0) + 3005d14: fec42783 lw a5,-20(s0) + 3005d18: c791 beqz a5,3005d24 + 3005d1a: fec42703 lw a4,-20(s0) + 3005d1e: 4785 li a5,1 + 3005d20: 00f71463 bne a4,a5,3005d28 + 3005d24: 4785 li a5,1 + 3005d26: a011 j 3005d2a + 3005d28: 4781 li a5,0 + 3005d2a: 8b85 andi a5,a5,1 + 3005d2c: 9f81 uxtb a5 + 3005d2e: 853e mv a0,a5 + 3005d30: 4472 lw s0,28(sp) + 3005d32: 6105 addi sp,sp,32 + 3005d34: 8082 ret + +03005d36 : + 3005d36: 1101 addi sp,sp,-32 + 3005d38: ce22 sw s0,28(sp) + 3005d3a: 1000 addi s0,sp,32 + 3005d3c: fea42623 sw a0,-20(s0) + 3005d40: fec42783 lw a5,-20(s0) + 3005d44: c791 beqz a5,3005d50 + 3005d46: fec42703 lw a4,-20(s0) + 3005d4a: 4785 li a5,1 + 3005d4c: 00f71463 bne a4,a5,3005d54 + 3005d50: 4785 li a5,1 + 3005d52: a011 j 3005d56 + 3005d54: 4781 li a5,0 + 3005d56: 8b85 andi a5,a5,1 + 3005d58: 9f81 uxtb a5 + 3005d5a: 853e mv a0,a5 + 3005d5c: 4472 lw s0,28(sp) + 3005d5e: 6105 addi sp,sp,32 + 3005d60: 8082 ret + +03005d62 : + 3005d62: 1101 addi sp,sp,-32 + 3005d64: ce22 sw s0,28(sp) + 3005d66: 1000 addi s0,sp,32 + 3005d68: fea42623 sw a0,-20(s0) + 3005d6c: fec42783 lw a5,-20(s0) + 3005d70: 00f037b3 snez a5,a5 + 3005d74: 9f81 uxtb a5 + 3005d76: 853e mv a0,a5 + 3005d78: 4472 lw s0,28(sp) + 3005d7a: 6105 addi sp,sp,32 + 3005d7c: 8082 ret + +03005d7e : + 3005d7e: 1101 addi sp,sp,-32 + 3005d80: ce22 sw s0,28(sp) + 3005d82: 1000 addi s0,sp,32 + 3005d84: fea42623 sw a0,-20(s0) + 3005d88: fec42783 lw a5,-20(s0) + 3005d8c: cb99 beqz a5,3005da2 + 3005d8e: fec42703 lw a4,-20(s0) + 3005d92: 4785 li a5,1 + 3005d94: 00f70763 beq a4,a5,3005da2 + 3005d98: fec42703 lw a4,-20(s0) + 3005d9c: 4789 li a5,2 + 3005d9e: 00f71463 bne a4,a5,3005da6 + 3005da2: 4785 li a5,1 + 3005da4: a011 j 3005da8 + 3005da6: 4781 li a5,0 + 3005da8: 8b85 andi a5,a5,1 + 3005daa: 9f81 uxtb a5 + 3005dac: 853e mv a0,a5 + 3005dae: 4472 lw s0,28(sp) + 3005db0: 6105 addi sp,sp,32 + 3005db2: 8082 ret + +03005db4 : + 3005db4: 1101 addi sp,sp,-32 + 3005db6: ce06 sw ra,28(sp) + 3005db8: cc22 sw s0,24(sp) + 3005dba: 1000 addi s0,sp,32 + 3005dbc: fea42623 sw a0,-20(s0) + 3005dc0: fec42783 lw a5,-20(s0) + 3005dc4: eb89 bnez a5,3005dd6 + 3005dc6: 02800593 li a1,40 + 3005dca: 0300f7b7 lui a5,0x300f + 3005dce: 23878513 addi a0,a5,568 # 300f238 + 3005dd2: 2c15 jal ra,3006006 + 3005dd4: a001 j 3005dd4 + 3005dd6: fec42783 lw a5,-20(s0) + 3005dda: 4398 lw a4,0(a5) + 3005ddc: 143007b7 lui a5,0x14300 + 3005de0: 02f70f63 beq a4,a5,3005e1e + 3005de4: fec42783 lw a5,-20(s0) + 3005de8: 4398 lw a4,0(a5) + 3005dea: 143017b7 lui a5,0x14301 + 3005dee: 02f70863 beq a4,a5,3005e1e + 3005df2: fec42783 lw a5,-20(s0) + 3005df6: 4398 lw a4,0(a5) + 3005df8: 143027b7 lui a5,0x14302 + 3005dfc: 02f70163 beq a4,a5,3005e1e + 3005e00: fec42783 lw a5,-20(s0) + 3005e04: 4398 lw a4,0(a5) + 3005e06: 143037b7 lui a5,0x14303 + 3005e0a: 00f70a63 beq a4,a5,3005e1e + 3005e0e: 02900593 li a1,41 + 3005e12: 0300f7b7 lui a5,0x300f + 3005e16: 23878513 addi a0,a5,568 # 300f238 + 3005e1a: 22f5 jal ra,3006006 + 3005e1c: a001 j 3005e1c + 3005e1e: fec42783 lw a5,-20(s0) + 3005e22: 4bdc lw a5,20(a5) + 3005e24: 853e mv a0,a5 + 3005e26: 3f35 jal ra,3005d62 + 3005e28: 87aa mv a5,a0 + 3005e2a: 0017c793 xori a5,a5,1 + 3005e2e: 9f81 uxtb a5 + 3005e30: cb91 beqz a5,3005e44 + 3005e32: 02b00593 li a1,43 + 3005e36: 0300f7b7 lui a5,0x300f + 3005e3a: 23878513 addi a0,a5,568 # 300f238 + 3005e3e: 22e1 jal ra,3006006 + 3005e40: 4785 li a5,1 + 3005e42: aa6d j 3005ffc + 3005e44: fec42783 lw a5,-20(s0) + 3005e48: 4f9c lw a5,24(a5) + 3005e4a: 853e mv a0,a5 + 3005e4c: 3f19 jal ra,3005d62 + 3005e4e: 87aa mv a5,a0 + 3005e50: 0017c793 xori a5,a5,1 + 3005e54: 9f81 uxtb a5 + 3005e56: cb91 beqz a5,3005e6a + 3005e58: 02c00593 li a1,44 + 3005e5c: 0300f7b7 lui a5,0x300f + 3005e60: 23878513 addi a0,a5,568 # 300f238 + 3005e64: 224d jal ra,3006006 + 3005e66: 4785 li a5,1 + 3005e68: aa51 j 3005ffc + 3005e6a: fec42783 lw a5,-20(s0) + 3005e6e: 479c lw a5,8(a5) + 3005e70: 853e mv a0,a5 + 3005e72: 358d jal ra,3005cd4 + 3005e74: 87aa mv a5,a0 + 3005e76: 0017c793 xori a5,a5,1 + 3005e7a: 9f81 uxtb a5 + 3005e7c: cb91 beqz a5,3005e90 + 3005e7e: 02d00593 li a1,45 + 3005e82: 0300f7b7 lui a5,0x300f + 3005e86: 23878513 addi a0,a5,568 # 300f238 + 3005e8a: 2ab5 jal ra,3006006 + 3005e8c: 4785 li a5,1 + 3005e8e: a2bd j 3005ffc + 3005e90: fec42783 lw a5,-20(s0) + 3005e94: 4b9c lw a5,16(a5) + 3005e96: 853e mv a0,a5 + 3005e98: 3d79 jal ra,3005d36 + 3005e9a: 87aa mv a5,a0 + 3005e9c: 0017c793 xori a5,a5,1 + 3005ea0: 9f81 uxtb a5 + 3005ea2: cb91 beqz a5,3005eb6 + 3005ea4: 02e00593 li a1,46 + 3005ea8: 0300f7b7 lui a5,0x300f + 3005eac: 23878513 addi a0,a5,568 # 300f238 + 3005eb0: 2a99 jal ra,3006006 + 3005eb2: 4785 li a5,1 + 3005eb4: a2a1 j 3005ffc + 3005eb6: fec42783 lw a5,-20(s0) + 3005eba: 47dc lw a5,12(a5) + 3005ebc: 853e mv a0,a5 + 3005ebe: 35c1 jal ra,3005d7e + 3005ec0: 87aa mv a5,a0 + 3005ec2: 0017c793 xori a5,a5,1 + 3005ec6: 9f81 uxtb a5 + 3005ec8: cb91 beqz a5,3005edc + 3005eca: 02f00593 li a1,47 + 3005ece: 0300f7b7 lui a5,0x300f + 3005ed2: 23878513 addi a0,a5,568 # 300f238 + 3005ed6: 2a05 jal ra,3006006 + 3005ed8: 4785 li a5,1 + 3005eda: a20d j 3005ffc + 3005edc: fec42783 lw a5,-20(s0) + 3005ee0: 439c lw a5,0(a5) + 3005ee2: 4705 li a4,1 + 3005ee4: c7d8 sw a4,12(a5) + 3005ee6: fec42783 lw a5,-20(s0) + 3005eea: 439c lw a5,0(a5) + 3005eec: fec42703 lw a4,-20(s0) + 3005ef0: 4b58 lw a4,20(a4) + 3005ef2: c398 sw a4,0(a5) + 3005ef4: fec42783 lw a5,-20(s0) + 3005ef8: 439c lw a5,0(a5) + 3005efa: fec42703 lw a4,-20(s0) + 3005efe: 4f18 lw a4,24(a4) + 3005f00: cf98 sw a4,24(a5) + 3005f02: fec42783 lw a5,-20(s0) + 3005f06: 4398 lw a4,0(a5) + 3005f08: 471c lw a5,8(a4) + 3005f0a: f7f7f793 andi a5,a5,-129 + 3005f0e: c71c sw a5,8(a4) + 3005f10: fec42783 lw a5,-20(s0) + 3005f14: 4398 lw a4,0(a5) + 3005f16: fec42783 lw a5,-20(s0) + 3005f1a: 2fd4 lbu a3,28(a5) + 3005f1c: 471c lw a5,8(a4) + 3005f1e: 8a85 andi a3,a3,1 + 3005f20: 0696 slli a3,a3,0x5 + 3005f22: fdf7f793 andi a5,a5,-33 + 3005f26: 8fd5 or a5,a5,a3 + 3005f28: c71c sw a5,8(a4) + 3005f2a: fec42783 lw a5,-20(s0) + 3005f2e: 47d4 lw a3,12(a5) + 3005f30: fec42783 lw a5,-20(s0) + 3005f34: 4398 lw a4,0(a5) + 3005f36: 87b6 mv a5,a3 + 3005f38: 8b8d andi a5,a5,3 + 3005f3a: 0ff7f693 andi a3,a5,255 + 3005f3e: 471c lw a5,8(a4) + 3005f40: 8a8d andi a3,a3,3 + 3005f42: 068a slli a3,a3,0x2 + 3005f44: 9bcd andi a5,a5,-13 + 3005f46: 8fd5 or a5,a5,a3 + 3005f48: c71c sw a5,8(a4) + 3005f4a: fec42783 lw a5,-20(s0) + 3005f4e: 4b94 lw a3,16(a5) + 3005f50: fec42783 lw a5,-20(s0) + 3005f54: 4398 lw a4,0(a5) + 3005f56: 87b6 mv a5,a3 + 3005f58: 8b85 andi a5,a5,1 + 3005f5a: 0ff7f693 andi a3,a5,255 + 3005f5e: 471c lw a5,8(a4) + 3005f60: 8a85 andi a3,a3,1 + 3005f62: 0686 slli a3,a3,0x1 + 3005f64: 9bf5 andi a5,a5,-3 + 3005f66: 8fd5 or a5,a5,a3 + 3005f68: c71c sw a5,8(a4) + 3005f6a: fec42783 lw a5,-20(s0) + 3005f6e: 4798 lw a4,8(a5) + 3005f70: 4789 li a5,2 + 3005f72: 00f71a63 bne a4,a5,3005f86 + 3005f76: fec42783 lw a5,-20(s0) + 3005f7a: 4398 lw a4,0(a5) + 3005f7c: 471c lw a5,8(a4) + 3005f7e: 0017e793 ori a5,a5,1 + 3005f82: c71c sw a5,8(a4) + 3005f84: a805 j 3005fb4 + 3005f86: fec42783 lw a5,-20(s0) + 3005f8a: 4398 lw a4,0(a5) + 3005f8c: 471c lw a5,8(a4) + 3005f8e: 9bf9 andi a5,a5,-2 + 3005f90: c71c sw a5,8(a4) + 3005f92: fec42783 lw a5,-20(s0) + 3005f96: 479c lw a5,8(a5) + 3005f98: fec42703 lw a4,-20(s0) + 3005f9c: 4318 lw a4,0(a4) + 3005f9e: 00f037b3 snez a5,a5 + 3005fa2: 0ff7f693 andi a3,a5,255 + 3005fa6: 471c lw a5,8(a4) + 3005fa8: 8a85 andi a3,a3,1 + 3005faa: 069a slli a3,a3,0x6 + 3005fac: fbf7f793 andi a5,a5,-65 + 3005fb0: 8fd5 or a5,a5,a3 + 3005fb2: c71c sw a5,8(a4) + 3005fb4: fec42783 lw a5,-20(s0) + 3005fb8: 4398 lw a4,0(a5) + 3005fba: fec42783 lw a5,-20(s0) + 3005fbe: 2ff4 lbu a3,30(a5) + 3005fc0: 4f5c lw a5,28(a4) + 3005fc2: 8a85 andi a3,a3,1 + 3005fc4: 0686 slli a3,a3,0x1 + 3005fc6: 9bf5 andi a5,a5,-3 + 3005fc8: 8fd5 or a5,a5,a3 + 3005fca: cf5c sw a5,28(a4) + 3005fcc: fec42783 lw a5,-20(s0) + 3005fd0: 4398 lw a4,0(a5) + 3005fd2: fec42783 lw a5,-20(s0) + 3005fd6: 2ff4 lbu a3,30(a5) + 3005fd8: 4f5c lw a5,28(a4) + 3005fda: 8a85 andi a3,a3,1 + 3005fdc: 9bf9 andi a5,a5,-2 + 3005fde: 8fd5 or a5,a5,a3 + 3005fe0: cf5c sw a5,28(a4) + 3005fe2: fec42783 lw a5,-20(s0) + 3005fe6: 4398 lw a4,0(a5) + 3005fe8: fec42783 lw a5,-20(s0) + 3005fec: 3fd4 lbu a3,29(a5) + 3005fee: 4f5c lw a5,28(a4) + 3005ff0: 8a85 andi a3,a3,1 + 3005ff2: 068a slli a3,a3,0x2 + 3005ff4: 9bed andi a5,a5,-5 + 3005ff6: 8fd5 or a5,a5,a3 + 3005ff8: cf5c sw a5,28(a4) + 3005ffa: 4781 li a5,0 + 3005ffc: 853e mv a0,a5 + 3005ffe: 40f2 lw ra,28(sp) + 3006000: 4462 lw s0,24(sp) + 3006002: 6105 addi sp,sp,32 + 3006004: 8082 ret + +03006006 : + 3006006: 9eafb06f j 30011f0 + +0300600a : + 300600a: 1101 addi sp,sp,-32 + 300600c: ce06 sw ra,28(sp) + 300600e: cc22 sw s0,24(sp) + 3006010: 1000 addi s0,sp,32 + 3006012: fea42623 sw a0,-20(s0) + 3006016: fec42783 lw a5,-20(s0) + 300601a: eb89 bnez a5,300602c + 300601c: 0bc00593 li a1,188 + 3006020: 0300f7b7 lui a5,0x300f + 3006024: 23878513 addi a0,a5,568 # 300f238 + 3006028: 3ff9 jal ra,3006006 + 300602a: a001 j 300602a + 300602c: fec42783 lw a5,-20(s0) + 3006030: 4398 lw a4,0(a5) + 3006032: 143007b7 lui a5,0x14300 + 3006036: 02f70f63 beq a4,a5,3006074 + 300603a: fec42783 lw a5,-20(s0) + 300603e: 4398 lw a4,0(a5) + 3006040: 143017b7 lui a5,0x14301 + 3006044: 02f70863 beq a4,a5,3006074 + 3006048: fec42783 lw a5,-20(s0) + 300604c: 4398 lw a4,0(a5) + 300604e: 143027b7 lui a5,0x14302 + 3006052: 02f70163 beq a4,a5,3006074 + 3006056: fec42783 lw a5,-20(s0) + 300605a: 4398 lw a4,0(a5) + 300605c: 143037b7 lui a5,0x14303 + 3006060: 00f70a63 beq a4,a5,3006074 + 3006064: 0bd00593 li a1,189 + 3006068: 0300f7b7 lui a5,0x300f + 300606c: 23878513 addi a0,a5,568 # 300f238 + 3006070: 3f59 jal ra,3006006 + 3006072: a001 j 3006072 + 3006074: fec42783 lw a5,-20(s0) + 3006078: 4398 lw a4,0(a5) + 300607a: 471c lw a5,8(a4) + 300607c: 0807e793 ori a5,a5,128 + 3006080: c71c sw a5,8(a4) + 3006082: 0001 nop + 3006084: 40f2 lw ra,28(sp) + 3006086: 4462 lw s0,24(sp) + 3006088: 6105 addi sp,sp,32 + 300608a: 8082 ret + +0300608c : + 300608c: 7179 addi sp,sp,-48 + 300608e: d606 sw ra,44(sp) + 3006090: d422 sw s0,40(sp) + 3006092: 1800 addi s0,sp,48 + 3006094: fca42e23 sw a0,-36(s0) + 3006098: fdc42783 lw a5,-36(s0) + 300609c: eb89 bnez a5,30060ae + 300609e: 0d800593 li a1,216 + 30060a2: 0300f7b7 lui a5,0x300f + 30060a6: 23878513 addi a0,a5,568 # 300f238 + 30060aa: 3fb1 jal ra,3006006 + 30060ac: a001 j 30060ac + 30060ae: fdc42783 lw a5,-36(s0) + 30060b2: fef42623 sw a5,-20(s0) + 30060b6: fec42783 lw a5,-20(s0) + 30060ba: 4398 lw a4,0(a5) + 30060bc: 143007b7 lui a5,0x14300 + 30060c0: 02f70f63 beq a4,a5,30060fe + 30060c4: fec42783 lw a5,-20(s0) + 30060c8: 4398 lw a4,0(a5) + 30060ca: 143017b7 lui a5,0x14301 + 30060ce: 02f70863 beq a4,a5,30060fe + 30060d2: fec42783 lw a5,-20(s0) + 30060d6: 4398 lw a4,0(a5) + 30060d8: 143027b7 lui a5,0x14302 + 30060dc: 02f70163 beq a4,a5,30060fe + 30060e0: fec42783 lw a5,-20(s0) + 30060e4: 4398 lw a4,0(a5) + 30060e6: 143037b7 lui a5,0x14303 + 30060ea: 00f70a63 beq a4,a5,30060fe + 30060ee: 0da00593 li a1,218 + 30060f2: 0300f7b7 lui a5,0x300f + 30060f6: 23878513 addi a0,a5,568 # 300f238 + 30060fa: 3731 jal ra,3006006 + 30060fc: a001 j 30060fc + 30060fe: fec42783 lw a5,-20(s0) + 3006102: 439c lw a5,0(a5) + 3006104: 4bdc lw a5,20(a5) + 3006106: 8385 srli a5,a5,0x1 + 3006108: 8b85 andi a5,a5,1 + 300610a: 0ff7f713 andi a4,a5,255 + 300610e: 4785 li a5,1 + 3006110: 02f71363 bne a4,a5,3006136 + 3006114: fec42783 lw a5,-20(s0) + 3006118: 4398 lw a4,0(a5) + 300611a: 531c lw a5,32(a4) + 300611c: 0017e793 ori a5,a5,1 + 3006120: d31c sw a5,32(a4) + 3006122: fec42783 lw a5,-20(s0) + 3006126: 53dc lw a5,36(a5) + 3006128: c799 beqz a5,3006136 + 300612a: fec42783 lw a5,-20(s0) + 300612e: 53dc lw a5,36(a5) + 3006130: fec42503 lw a0,-20(s0) + 3006134: 9782 jalr a5 + 3006136: fec42783 lw a5,-20(s0) + 300613a: 439c lw a5,0(a5) + 300613c: 4bdc lw a5,20(a5) + 300613e: 8b85 andi a5,a5,1 + 3006140: 0ff7f713 andi a4,a5,255 + 3006144: 4785 li a5,1 + 3006146: 02f71263 bne a4,a5,300616a + 300614a: fec42783 lw a5,-20(s0) + 300614e: 439c lw a5,0(a5) + 3006150: 4705 li a4,1 + 3006152: c7d8 sw a4,12(a5) + 3006154: fec42783 lw a5,-20(s0) + 3006158: 539c lw a5,32(a5) + 300615a: cb81 beqz a5,300616a + 300615c: fec42783 lw a5,-20(s0) + 3006160: 539c lw a5,32(a5) + 3006162: fec42503 lw a0,-20(s0) + 3006166: 9782 jalr a5 + 3006168: 0001 nop + 300616a: 0001 nop + 300616c: 50b2 lw ra,44(sp) + 300616e: 5422 lw s0,40(sp) + 3006170: 6145 addi sp,sp,48 + 3006172: 8082 ret + +03006174 : + 3006174: 1101 addi sp,sp,-32 + 3006176: ce06 sw ra,28(sp) + 3006178: cc22 sw s0,24(sp) + 300617a: 1000 addi s0,sp,32 + 300617c: fea42623 sw a0,-20(s0) + 3006180: feb42423 sw a1,-24(s0) + 3006184: fec42223 sw a2,-28(s0) + 3006188: fec42783 lw a5,-20(s0) + 300618c: eb89 bnez a5,300619e + 300618e: 0fa00593 li a1,250 + 3006192: 0300f7b7 lui a5,0x300f + 3006196: 23878513 addi a0,a5,568 # 300f238 + 300619a: 35b5 jal ra,3006006 + 300619c: a001 j 300619c + 300619e: fe442783 lw a5,-28(s0) + 30061a2: eb89 bnez a5,30061b4 + 30061a4: 0fb00593 li a1,251 + 30061a8: 0300f7b7 lui a5,0x300f + 30061ac: 23878513 addi a0,a5,568 # 300f238 + 30061b0: 3d99 jal ra,3006006 + 30061b2: a001 j 30061b2 + 30061b4: fe842503 lw a0,-24(s0) + 30061b8: 3e89 jal ra,3005d0a + 30061ba: 87aa mv a5,a0 + 30061bc: 0017c793 xori a5,a5,1 + 30061c0: 9f81 uxtb a5 + 30061c2: cb89 beqz a5,30061d4 + 30061c4: 0fc00593 li a1,252 + 30061c8: 0300f7b7 lui a5,0x300f + 30061cc: 23878513 addi a0,a5,568 # 300f238 + 30061d0: 3d1d jal ra,3006006 + 30061d2: a001 j 30061d2 + 30061d4: fe842783 lw a5,-24(s0) + 30061d8: cb91 beqz a5,30061ec + 30061da: 4705 li a4,1 + 30061dc: 00e79e63 bne a5,a4,30061f8 + 30061e0: fec42783 lw a5,-20(s0) + 30061e4: fe442703 lw a4,-28(s0) + 30061e8: d3d8 sw a4,36(a5) + 30061ea: a809 j 30061fc + 30061ec: fec42783 lw a5,-20(s0) + 30061f0: fe442703 lw a4,-28(s0) + 30061f4: d398 sw a4,32(a5) + 30061f6: a019 j 30061fc + 30061f8: 4785 li a5,1 + 30061fa: a011 j 30061fe + 30061fc: 4781 li a5,0 + 30061fe: 853e mv a0,a5 + 3006200: 40f2 lw ra,28(sp) + 3006202: 4462 lw s0,24(sp) + 3006204: 6105 addi sp,sp,32 + 3006206: 8082 ret + +03006208 : + 3006208: 1101 addi sp,sp,-32 + 300620a: ce22 sw s0,28(sp) + 300620c: 1000 addi s0,sp,32 + 300620e: fea42623 sw a0,-20(s0) + 3006212: fec42783 lw a5,-20(s0) + 3006216: 0047b793 sltiu a5,a5,4 + 300621a: 9f81 uxtb a5 + 300621c: 853e mv a0,a5 + 300621e: 4472 lw s0,28(sp) + 3006220: 6105 addi sp,sp,32 + 3006222: 8082 ret + +03006224 : + 3006224: 1101 addi sp,sp,-32 + 3006226: ce22 sw s0,28(sp) + 3006228: 1000 addi s0,sp,32 + 300622a: fea42623 sw a0,-20(s0) + 300622e: fec42783 lw a5,-20(s0) + 3006232: c791 beqz a5,300623e + 3006234: fec42703 lw a4,-20(s0) + 3006238: 4785 li a5,1 + 300623a: 00f71463 bne a4,a5,3006242 + 300623e: 4785 li a5,1 + 3006240: a011 j 3006244 + 3006242: 4781 li a5,0 + 3006244: 8b85 andi a5,a5,1 + 3006246: 9f81 uxtb a5 + 3006248: 853e mv a0,a5 + 300624a: 4472 lw s0,28(sp) + 300624c: 6105 addi sp,sp,32 + 300624e: 8082 ret + +03006250 : + 3006250: 1101 addi sp,sp,-32 + 3006252: ce22 sw s0,28(sp) + 3006254: 1000 addi s0,sp,32 + 3006256: fea42623 sw a0,-20(s0) + 300625a: fec42703 lw a4,-20(s0) + 300625e: 4791 li a5,4 + 3006260: 00e7e463 bltu a5,a4,3006268 + 3006264: 4785 li a5,1 + 3006266: a011 j 300626a + 3006268: 4781 li a5,0 + 300626a: 853e mv a0,a5 + 300626c: 4472 lw s0,28(sp) + 300626e: 6105 addi sp,sp,32 + 3006270: 8082 ret + +03006272 : + 3006272: 1101 addi sp,sp,-32 + 3006274: ce22 sw s0,28(sp) + 3006276: 1000 addi s0,sp,32 + 3006278: fea42623 sw a0,-20(s0) + 300627c: fec42783 lw a5,-20(s0) + 3006280: c385 beqz a5,30062a0 + 3006282: fec42703 lw a4,-20(s0) + 3006286: 4785 li a5,1 + 3006288: 00f70c63 beq a4,a5,30062a0 + 300628c: fec42703 lw a4,-20(s0) + 3006290: 4789 li a5,2 + 3006292: 00f70763 beq a4,a5,30062a0 + 3006296: fec42703 lw a4,-20(s0) + 300629a: 478d li a5,3 + 300629c: 00f71463 bne a4,a5,30062a4 + 30062a0: 4785 li a5,1 + 30062a2: a011 j 30062a6 + 30062a4: 4781 li a5,0 + 30062a6: 853e mv a0,a5 + 30062a8: 4472 lw s0,28(sp) + 30062aa: 6105 addi sp,sp,32 + 30062ac: 8082 ret + +030062ae : + 30062ae: 1101 addi sp,sp,-32 + 30062b0: ce22 sw s0,28(sp) + 30062b2: 1000 addi s0,sp,32 + 30062b4: fea42623 sw a0,-20(s0) + 30062b8: fec42783 lw a5,-20(s0) + 30062bc: 0107b793 sltiu a5,a5,16 + 30062c0: 9f81 uxtb a5 + 30062c2: 853e mv a0,a5 + 30062c4: 4472 lw s0,28(sp) + 30062c6: 6105 addi sp,sp,32 + 30062c8: 8082 ret + +030062ca : + 30062ca: 1101 addi sp,sp,-32 + 30062cc: ce22 sw s0,28(sp) + 30062ce: 1000 addi s0,sp,32 + 30062d0: fea42623 sw a0,-20(s0) + 30062d4: fec42783 lw a5,-20(s0) + 30062d8: 0057b793 sltiu a5,a5,5 + 30062dc: 9f81 uxtb a5 + 30062de: 853e mv a0,a5 + 30062e0: 4472 lw s0,28(sp) + 30062e2: 6105 addi sp,sp,32 + 30062e4: 8082 ret + +030062e6 : + 30062e6: 7179 addi sp,sp,-48 + 30062e8: d622 sw s0,44(sp) + 30062ea: 1800 addi s0,sp,48 + 30062ec: fca42e23 sw a0,-36(s0) + 30062f0: fcb42c23 sw a1,-40(s0) + 30062f4: fd842783 lw a5,-40(s0) + 30062f8: e399 bnez a5,30062fe + 30062fa: 4781 li a5,0 + 30062fc: a005 j 300631c + 30062fe: fd842783 lw a5,-40(s0) + 3006302: 0017d713 srli a4,a5,0x1 + 3006306: fdc42783 lw a5,-36(s0) + 300630a: 973e add a4,a4,a5 + 300630c: fd842783 lw a5,-40(s0) + 3006310: 02f757b3 divu a5,a4,a5 + 3006314: fef42623 sw a5,-20(s0) + 3006318: fec42783 lw a5,-20(s0) + 300631c: 853e mv a0,a5 + 300631e: 5432 lw s0,44(sp) + 3006320: 6145 addi sp,sp,48 + 3006322: 8082 ret + +03006324 : + 3006324: 1101 addi sp,sp,-32 + 3006326: ce06 sw ra,28(sp) + 3006328: cc22 sw s0,24(sp) + 300632a: 1000 addi s0,sp,32 + 300632c: fea42623 sw a0,-20(s0) + 3006330: fec42783 lw a5,-20(s0) + 3006334: 439c lw a5,0(a5) + 3006336: 43bc lw a5,64(a5) + 3006338: 83cd srli a5,a5,0x13 + 300633a: 8b85 andi a5,a5,1 + 300633c: 0ff7f713 andi a4,a5,255 + 3006340: 4785 li a5,1 + 3006342: 06f71b63 bne a4,a5,30063b8 + 3006346: fec42783 lw a5,-20(s0) + 300634a: 4398 lw a4,0(a5) + 300634c: 4f7c lw a5,92(a4) + 300634e: 9bf9 andi a5,a5,-2 + 3006350: cf7c sw a5,92(a4) + 3006352: fec42783 lw a5,-20(s0) + 3006356: 4398 lw a4,0(a5) + 3006358: 5f1c lw a5,56(a4) + 300635a: fff006b7 lui a3,0xfff00 + 300635e: 16fd addi a3,a3,-1 # ffefffff + 3006360: 8ff5 and a5,a5,a3 + 3006362: df1c sw a5,56(a4) + 3006364: fec42783 lw a5,-20(s0) + 3006368: 4398 lw a4,0(a5) + 300636a: 5f1c lw a5,56(a4) + 300636c: fff806b7 lui a3,0xfff80 + 3006370: 16fd addi a3,a3,-1 # fff7ffff + 3006372: 8ff5 and a5,a5,a3 + 3006374: df1c sw a5,56(a4) + 3006376: fec42783 lw a5,-20(s0) + 300637a: 4398 lw a4,0(a5) + 300637c: 437c lw a5,68(a4) + 300637e: 000806b7 lui a3,0x80 + 3006382: 8fd5 or a5,a5,a3 + 3006384: c37c sw a5,68(a4) + 3006386: fec42783 lw a5,-20(s0) + 300638a: 4398 lw a4,0(a5) + 300638c: 5b1c lw a5,48(a4) + 300638e: 1007e793 ori a5,a5,256 + 3006392: db1c sw a5,48(a4) + 3006394: fec42783 lw a5,-20(s0) + 3006398: 4398 lw a4,0(a5) + 300639a: 5b1c lw a5,48(a4) + 300639c: 2007e793 ori a5,a5,512 + 30063a0: db1c sw a5,48(a4) + 30063a2: fec42783 lw a5,-20(s0) + 30063a6: 57fc lw a5,108(a5) + 30063a8: c7b9 beqz a5,30063f6 + 30063aa: fec42783 lw a5,-20(s0) + 30063ae: 57fc lw a5,108(a5) + 30063b0: fec42503 lw a0,-20(s0) + 30063b4: 9782 jalr a5 + 30063b6: a081 j 30063f6 + 30063b8: 0001 nop + 30063ba: fec42783 lw a5,-20(s0) + 30063be: 439c lw a5,0(a5) + 30063c0: 4ffc lw a5,92(a5) + 30063c2: 8391 srli a5,a5,0x4 + 30063c4: 8b85 andi a5,a5,1 + 30063c6: 0ff7f713 andi a4,a5,255 + 30063ca: 4785 li a5,1 + 30063cc: fef707e3 beq a4,a5,30063ba + 30063d0: fec42783 lw a5,-20(s0) + 30063d4: 4398 lw a4,0(a5) + 30063d6: 437c lw a5,68(a4) + 30063d8: 001006b7 lui a3,0x100 + 30063dc: 8fd5 or a5,a5,a3 + 30063de: c37c sw a5,68(a4) + 30063e0: fec42783 lw a5,-20(s0) + 30063e4: 5bbc lw a5,112(a5) + 30063e6: cb81 beqz a5,30063f6 + 30063e8: fec42783 lw a5,-20(s0) + 30063ec: 5bbc lw a5,112(a5) + 30063ee: fec42503 lw a0,-20(s0) + 30063f2: 9782 jalr a5 + 30063f4: 0001 nop + 30063f6: 0001 nop + 30063f8: 40f2 lw ra,28(sp) + 30063fa: 4462 lw s0,24(sp) + 30063fc: 6105 addi sp,sp,32 + 30063fe: 8082 ret + +03006400 : + 3006400: 1101 addi sp,sp,-32 + 3006402: ce06 sw ra,28(sp) + 3006404: cc22 sw s0,24(sp) + 3006406: 1000 addi s0,sp,32 + 3006408: fea42623 sw a0,-20(s0) + 300640c: fec42783 lw a5,-20(s0) + 3006410: 4398 lw a4,0(a5) + 3006412: 5f1c lw a5,56(a4) + 3006414: ffe006b7 lui a3,0xffe00 + 3006418: 16fd addi a3,a3,-1 # ffdfffff + 300641a: 8ff5 and a5,a5,a3 + 300641c: df1c sw a5,56(a4) + 300641e: fec42783 lw a5,-20(s0) + 3006422: 4398 lw a4,0(a5) + 3006424: 437c lw a5,68(a4) + 3006426: 002006b7 lui a3,0x200 + 300642a: 8fd5 or a5,a5,a3 + 300642c: c37c sw a5,68(a4) + 300642e: fec42783 lw a5,-20(s0) + 3006432: 5bfc lw a5,116(a5) + 3006434: c799 beqz a5,3006442 + 3006436: fec42783 lw a5,-20(s0) + 300643a: 5bfc lw a5,116(a5) + 300643c: fec42503 lw a0,-20(s0) + 3006440: 9782 jalr a5 + 3006442: 0001 nop + 3006444: 40f2 lw ra,28(sp) + 3006446: 4462 lw s0,24(sp) + 3006448: 6105 addi sp,sp,32 + 300644a: 8082 ret + +0300644c : + 300644c: 1101 addi sp,sp,-32 + 300644e: ce22 sw s0,28(sp) + 3006450: 1000 addi s0,sp,32 + 3006452: fea42623 sw a0,-20(s0) + 3006456: fec42783 lw a5,-20(s0) + 300645a: 4b9c lw a5,16(a5) + 300645c: 4711 li a4,4 + 300645e: 06f76e63 bltu a4,a5,30064da + 3006462: 00279713 slli a4,a5,0x2 + 3006466: 0300f7b7 lui a5,0x300f + 300646a: 25878793 addi a5,a5,600 # 300f258 + 300646e: 97ba add a5,a5,a4 + 3006470: 439c lw a5,0(a5) + 3006472: 8782 jr a5 + 3006474: fec42783 lw a5,-20(s0) + 3006478: 439c lw a5,0(a5) + 300647a: 57d8 lw a4,44(a5) + 300647c: fec42783 lw a5,-20(s0) + 3006480: 439c lw a5,0(a5) + 3006482: 00276713 ori a4,a4,2 + 3006486: d7d8 sw a4,44(a5) + 3006488: a891 j 30064dc + 300648a: fec42783 lw a5,-20(s0) + 300648e: 439c lw a5,0(a5) + 3006490: 57d8 lw a4,44(a5) + 3006492: fec42783 lw a5,-20(s0) + 3006496: 439c lw a5,0(a5) + 3006498: 00676713 ori a4,a4,6 + 300649c: d7d8 sw a4,44(a5) + 300649e: a83d j 30064dc + 30064a0: fec42783 lw a5,-20(s0) + 30064a4: 439c lw a5,0(a5) + 30064a6: 57d8 lw a4,44(a5) + 30064a8: fec42783 lw a5,-20(s0) + 30064ac: 439c lw a5,0(a5) + 30064ae: 08276713 ori a4,a4,130 + 30064b2: d7d8 sw a4,44(a5) + 30064b4: a025 j 30064dc + 30064b6: fec42783 lw a5,-20(s0) + 30064ba: 439c lw a5,0(a5) + 30064bc: 57d8 lw a4,44(a5) + 30064be: fec42783 lw a5,-20(s0) + 30064c2: 439c lw a5,0(a5) + 30064c4: 08676713 ori a4,a4,134 + 30064c8: d7d8 sw a4,44(a5) + 30064ca: a809 j 30064dc + 30064cc: fec42783 lw a5,-20(s0) + 30064d0: 4398 lw a4,0(a5) + 30064d2: 575c lw a5,44(a4) + 30064d4: 9bf5 andi a5,a5,-3 + 30064d6: d75c sw a5,44(a4) + 30064d8: a011 j 30064dc + 30064da: 0001 nop + 30064dc: 4472 lw s0,28(sp) + 30064de: 6105 addi sp,sp,32 + 30064e0: 8082 ret + +030064e2 : + 30064e2: 7179 addi sp,sp,-48 + 30064e4: d606 sw ra,44(sp) + 30064e6: d422 sw s0,40(sp) + 30064e8: 1800 addi s0,sp,48 + 30064ea: fca42e23 sw a0,-36(s0) + 30064ee: fdc42783 lw a5,-36(s0) + 30064f2: eb89 bnez a5,3006504 + 30064f4: 09700593 li a1,151 + 30064f8: 0300f7b7 lui a5,0x300f + 30064fc: 26c78513 addi a0,a5,620 # 300f26c + 3006500: 3619 jal ra,3006006 + 3006502: a001 j 3006502 + 3006504: fdc42783 lw a5,-36(s0) + 3006508: 4398 lw a4,0(a5) + 300650a: 140007b7 lui a5,0x14000 + 300650e: 02f70f63 beq a4,a5,300654c + 3006512: fdc42783 lw a5,-36(s0) + 3006516: 4398 lw a4,0(a5) + 3006518: 140017b7 lui a5,0x14001 + 300651c: 02f70863 beq a4,a5,300654c + 3006520: fdc42783 lw a5,-36(s0) + 3006524: 4398 lw a4,0(a5) + 3006526: 140027b7 lui a5,0x14002 + 300652a: 02f70163 beq a4,a5,300654c + 300652e: fdc42783 lw a5,-36(s0) + 3006532: 4398 lw a4,0(a5) + 3006534: 140037b7 lui a5,0x14003 + 3006538: 00f70a63 beq a4,a5,300654c + 300653c: 09800593 li a1,152 + 3006540: 0300f7b7 lui a5,0x300f + 3006544: 26c78513 addi a0,a5,620 # 300f26c + 3006548: 3c7d jal ra,3006006 + 300654a: a001 j 300654a + 300654c: fdc42783 lw a5,-36(s0) + 3006550: 47bc lw a5,72(a5) + 3006552: cb91 beqz a5,3006566 + 3006554: 09900593 li a1,153 + 3006558: 0300f7b7 lui a5,0x300f + 300655c: 26c78513 addi a0,a5,620 # 300f26c + 3006560: 345d jal ra,3006006 + 3006562: 4785 li a5,1 + 3006564: ae0d j 3006896 + 3006566: fdc42783 lw a5,-36(s0) + 300656a: 47fc lw a5,76(a5) + 300656c: cb91 beqz a5,3006580 + 300656e: 09a00593 li a1,154 + 3006572: 0300f7b7 lui a5,0x300f + 3006576: 26c78513 addi a0,a5,620 # 300f26c + 300657a: 3471 jal ra,3006006 + 300657c: 4785 li a5,1 + 300657e: ae21 j 3006896 + 3006580: fdc42783 lw a5,-36(s0) + 3006584: 479c lw a5,8(a5) + 3006586: 853e mv a0,a5 + 3006588: 3141 jal ra,3006208 + 300658a: 87aa mv a5,a0 + 300658c: 0017c793 xori a5,a5,1 + 3006590: 9f81 uxtb a5 + 3006592: cb91 beqz a5,30065a6 + 3006594: 09c00593 li a1,156 + 3006598: 0300f7b7 lui a5,0x300f + 300659c: 26c78513 addi a0,a5,620 # 300f26c + 30065a0: 349d jal ra,3006006 + 30065a2: 4785 li a5,1 + 30065a4: accd j 3006896 + 30065a6: fdc42783 lw a5,-36(s0) + 30065aa: 47dc lw a5,12(a5) + 30065ac: 853e mv a0,a5 + 30065ae: 399d jal ra,3006224 + 30065b0: 87aa mv a5,a0 + 30065b2: 0017c793 xori a5,a5,1 + 30065b6: 9f81 uxtb a5 + 30065b8: cb91 beqz a5,30065cc + 30065ba: 09d00593 li a1,157 + 30065be: 0300f7b7 lui a5,0x300f + 30065c2: 26c78513 addi a0,a5,620 # 300f26c + 30065c6: 3481 jal ra,3006006 + 30065c8: 4785 li a5,1 + 30065ca: a4f1 j 3006896 + 30065cc: fdc42783 lw a5,-36(s0) + 30065d0: 4b9c lw a5,16(a5) + 30065d2: 853e mv a0,a5 + 30065d4: 39b5 jal ra,3006250 + 30065d6: 87aa mv a5,a0 + 30065d8: 0017c793 xori a5,a5,1 + 30065dc: 9f81 uxtb a5 + 30065de: cb91 beqz a5,30065f2 + 30065e0: 09e00593 li a1,158 + 30065e4: 0300f7b7 lui a5,0x300f + 30065e8: 26c78513 addi a0,a5,620 # 300f26c + 30065ec: 3c29 jal ra,3006006 + 30065ee: 4785 li a5,1 + 30065f0: a45d j 3006896 + 30065f2: fdc42783 lw a5,-36(s0) + 30065f6: 4bdc lw a5,20(a5) + 30065f8: 853e mv a0,a5 + 30065fa: 39a5 jal ra,3006272 + 30065fc: 87aa mv a5,a0 + 30065fe: 0017c793 xori a5,a5,1 + 3006602: 9f81 uxtb a5 + 3006604: cb91 beqz a5,3006618 + 3006606: 09f00593 li a1,159 + 300660a: 0300f7b7 lui a5,0x300f + 300660e: 26c78513 addi a0,a5,620 # 300f26c + 3006612: 3ad5 jal ra,3006006 + 3006614: 4785 li a5,1 + 3006616: a441 j 3006896 + 3006618: fdc42783 lw a5,-36(s0) + 300661c: 4f9c lw a5,24(a5) + 300661e: 853e mv a0,a5 + 3006620: 3989 jal ra,3006272 + 3006622: 87aa mv a5,a0 + 3006624: 0017c793 xori a5,a5,1 + 3006628: 9f81 uxtb a5 + 300662a: cb91 beqz a5,300663e + 300662c: 0a000593 li a1,160 + 3006630: 0300f7b7 lui a5,0x300f + 3006634: 26c78513 addi a0,a5,620 # 300f26c + 3006638: 32f9 jal ra,3006006 + 300663a: 4785 li a5,1 + 300663c: aca9 j 3006896 + 300663e: fdc42783 lw a5,-36(s0) + 3006642: 5b9c lw a5,48(a5) + 3006644: 853e mv a0,a5 + 3006646: 31a5 jal ra,30062ae + 3006648: 87aa mv a5,a0 + 300664a: 0017c793 xori a5,a5,1 + 300664e: 9f81 uxtb a5 + 3006650: cb91 beqz a5,3006664 + 3006652: 0a100593 li a1,161 + 3006656: 0300f7b7 lui a5,0x300f + 300665a: 26c78513 addi a0,a5,620 # 300f26c + 300665e: 3265 jal ra,3006006 + 3006660: 4785 li a5,1 + 3006662: ac15 j 3006896 + 3006664: fdc42783 lw a5,-36(s0) + 3006668: 5bdc lw a5,52(a5) + 300666a: 853e mv a0,a5 + 300666c: 3189 jal ra,30062ae + 300666e: 87aa mv a5,a0 + 3006670: 0017c793 xori a5,a5,1 + 3006674: 9f81 uxtb a5 + 3006676: cb91 beqz a5,300668a + 3006678: 0a200593 li a1,162 + 300667c: 0300f7b7 lui a5,0x300f + 3006680: 26c78513 addi a0,a5,620 # 300f26c + 3006684: 3249 jal ra,3006006 + 3006686: 4785 li a5,1 + 3006688: a439 j 3006896 + 300668a: fdc42783 lw a5,-36(s0) + 300668e: 5fbc lw a5,120(a5) + 3006690: 853e mv a0,a5 + 3006692: 3925 jal ra,30062ca + 3006694: 87aa mv a5,a0 + 3006696: 0017c793 xori a5,a5,1 + 300669a: 9f81 uxtb a5 + 300669c: cb91 beqz a5,30066b0 + 300669e: 0a300593 li a1,163 + 30066a2: 0300f7b7 lui a5,0x300f + 30066a6: 26c78513 addi a0,a5,620 # 300f26c + 30066aa: 3ab1 jal ra,3006006 + 30066ac: 4785 li a5,1 + 30066ae: a2e5 j 3006896 + 30066b0: fdc42783 lw a5,-36(s0) + 30066b4: 4398 lw a4,0(a5) + 30066b6: 5b1c lw a5,48(a4) + 30066b8: 9bf9 andi a5,a5,-2 + 30066ba: db1c sw a5,48(a4) + 30066bc: 0001 nop + 30066be: fdc42783 lw a5,-36(s0) + 30066c2: 439c lw a5,0(a5) + 30066c4: 4f9c lw a5,24(a5) + 30066c6: 838d srli a5,a5,0x3 + 30066c8: 8b85 andi a5,a5,1 + 30066ca: 0ff7f713 andi a4,a5,255 + 30066ce: 4785 li a5,1 + 30066d0: fef707e3 beq a4,a5,30066be + 30066d4: fdc42783 lw a5,-36(s0) + 30066d8: 439c lw a5,0(a5) + 30066da: 853e mv a0,a5 + 30066dc: e4bfb0ef jal ra,3002526 + 30066e0: fea42623 sw a0,-20(s0) + 30066e4: fdc42783 lw a5,-36(s0) + 30066e8: 5fb4 lw a3,120(a5) + 30066ea: fdc42783 lw a5,-36(s0) + 30066ee: 4398 lw a4,0(a5) + 30066f0: 87b6 mv a5,a3 + 30066f2: 8bbd andi a5,a5,15 + 30066f4: 0ff7f693 andi a3,a5,255 + 30066f8: 4f3c lw a5,88(a4) + 30066fa: 8abd andi a3,a3,15 + 30066fc: 9bc1 andi a5,a5,-16 + 30066fe: 8fd5 or a5,a5,a3 + 3006700: cf3c sw a5,88(a4) + 3006702: fdc42783 lw a5,-36(s0) + 3006706: 4398 lw a4,0(a5) + 3006708: fdc42783 lw a5,-36(s0) + 300670c: 07c7c683 lbu a3,124(a5) + 3006710: 4b3c lw a5,80(a4) + 3006712: 8a85 andi a3,a3,1 + 3006714: 9bf9 andi a5,a5,-2 + 3006716: 8fd5 or a5,a5,a3 + 3006718: cb3c sw a5,80(a4) + 300671a: fdc42783 lw a5,-36(s0) + 300671e: 439c lw a5,0(a5) + 3006720: 4fbc lw a5,88(a5) + 3006722: fef42423 sw a5,-24(s0) + 3006726: fdc42783 lw a5,-36(s0) + 300672a: 43d8 lw a4,4(a5) + 300672c: 46c1 li a3,16 + 300672e: fe842783 lw a5,-24(s0) + 3006732: 40f687b3 sub a5,a3,a5 + 3006736: fec42683 lw a3,-20(s0) + 300673a: 02f6d7b3 divu a5,a3,a5 + 300673e: 00e7f463 bgeu a5,a4,3006746 + 3006742: 4785 li a5,1 + 3006744: aa89 j 3006896 + 3006746: 4741 li a4,16 + 3006748: fe842783 lw a5,-24(s0) + 300674c: 40f707b3 sub a5,a4,a5 + 3006750: fec42703 lw a4,-20(s0) + 3006754: 02f757b3 divu a5,a4,a5 + 3006758: 079a slli a5,a5,0x6 + 300675a: fef42223 sw a5,-28(s0) + 300675e: fdc42783 lw a5,-36(s0) + 3006762: 43dc lw a5,4(a5) + 3006764: 85be mv a1,a5 + 3006766: fe442503 lw a0,-28(s0) + 300676a: 3eb5 jal ra,30062e6 + 300676c: fea42023 sw a0,-32(s0) + 3006770: fdc42783 lw a5,-36(s0) + 3006774: 439c lw a5,0(a5) + 3006776: 0207a423 sw zero,40(a5) + 300677a: fdc42783 lw a5,-36(s0) + 300677e: 439c lw a5,0(a5) + 3006780: 0207a223 sw zero,36(a5) + 3006784: fdc42783 lw a5,-36(s0) + 3006788: 439c lw a5,0(a5) + 300678a: fe042703 lw a4,-32(s0) + 300678e: 03f77713 andi a4,a4,63 + 3006792: d798 sw a4,40(a5) + 3006794: fdc42783 lw a5,-36(s0) + 3006798: 439c lw a5,0(a5) + 300679a: fe042703 lw a4,-32(s0) + 300679e: 8319 srli a4,a4,0x6 + 30067a0: d3d8 sw a4,36(a5) + 30067a2: fdc42783 lw a5,-36(s0) + 30067a6: 439c lw a5,0(a5) + 30067a8: 0207a623 sw zero,44(a5) + 30067ac: fdc42783 lw a5,-36(s0) + 30067b0: 4794 lw a3,8(a5) + 30067b2: fdc42783 lw a5,-36(s0) + 30067b6: 4398 lw a4,0(a5) + 30067b8: 87b6 mv a5,a3 + 30067ba: 8b8d andi a5,a5,3 + 30067bc: 0ff7f693 andi a3,a5,255 + 30067c0: 575c lw a5,44(a4) + 30067c2: 8a8d andi a3,a3,3 + 30067c4: 0696 slli a3,a3,0x5 + 30067c6: f9f7f793 andi a5,a5,-97 + 30067ca: 8fd5 or a5,a5,a3 + 30067cc: d75c sw a5,44(a4) + 30067ce: fdc42783 lw a5,-36(s0) + 30067d2: 47d4 lw a3,12(a5) + 30067d4: fdc42783 lw a5,-36(s0) + 30067d8: 4398 lw a4,0(a5) + 30067da: 87b6 mv a5,a3 + 30067dc: 8b85 andi a5,a5,1 + 30067de: 0ff7f693 andi a3,a5,255 + 30067e2: 575c lw a5,44(a4) + 30067e4: 8a85 andi a3,a3,1 + 30067e6: 068e slli a3,a3,0x3 + 30067e8: 9bdd andi a5,a5,-9 + 30067ea: 8fd5 or a5,a5,a3 + 30067ec: d75c sw a5,44(a4) + 30067ee: fdc42503 lw a0,-36(s0) + 30067f2: 39a9 jal ra,300644c + 30067f4: fdc42783 lw a5,-36(s0) + 30067f8: 02c7c783 lbu a5,44(a5) + 30067fc: cbb1 beqz a5,3006850 + 30067fe: fdc42783 lw a5,-36(s0) + 3006802: 4398 lw a4,0(a5) + 3006804: 575c lw a5,44(a4) + 3006806: 0107e793 ori a5,a5,16 + 300680a: d75c sw a5,44(a4) + 300680c: fdc42783 lw a5,-36(s0) + 3006810: 5bd4 lw a3,52(a5) + 3006812: fdc42783 lw a5,-36(s0) + 3006816: 4398 lw a4,0(a5) + 3006818: 87b6 mv a5,a3 + 300681a: 8bbd andi a5,a5,15 + 300681c: 0ff7f693 andi a3,a5,255 + 3006820: 5b5c lw a5,52(a4) + 3006822: 8abd andi a3,a3,15 + 3006824: 06a2 slli a3,a3,0x8 + 3006826: 767d lui a2,0xfffff + 3006828: 0ff60613 addi a2,a2,255 # fffff0ff + 300682c: 8ff1 and a5,a5,a2 + 300682e: 8fd5 or a5,a5,a3 + 3006830: db5c sw a5,52(a4) + 3006832: fdc42783 lw a5,-36(s0) + 3006836: 5b94 lw a3,48(a5) + 3006838: fdc42783 lw a5,-36(s0) + 300683c: 4398 lw a4,0(a5) + 300683e: 87b6 mv a5,a3 + 3006840: 8bbd andi a5,a5,15 + 3006842: 0ff7f693 andi a3,a5,255 + 3006846: 5b5c lw a5,52(a4) + 3006848: 8abd andi a3,a3,15 + 300684a: 9bc1 andi a5,a5,-16 + 300684c: 8fd5 or a5,a5,a3 + 300684e: db5c sw a5,52(a4) + 3006850: fdc42783 lw a5,-36(s0) + 3006854: 5f98 lw a4,56(a5) + 3006856: 4785 li a5,1 + 3006858: 00f71c63 bne a4,a5,3006870 + 300685c: fdc42783 lw a5,-36(s0) + 3006860: 439c lw a5,0(a5) + 3006862: 5b94 lw a3,48(a5) + 3006864: fdc42783 lw a5,-36(s0) + 3006868: 439c lw a5,0(a5) + 300686a: 6731 lui a4,0xc + 300686c: 8f55 or a4,a4,a3 + 300686e: db98 sw a4,48(a5) + 3006870: fdc42783 lw a5,-36(s0) + 3006874: 439c lw a5,0(a5) + 3006876: 5b98 lw a4,48(a5) + 3006878: fdc42783 lw a5,-36(s0) + 300687c: 439c lw a5,0(a5) + 300687e: 30176713 ori a4,a4,769 + 3006882: db98 sw a4,48(a5) + 3006884: fdc42783 lw a5,-36(s0) + 3006888: 4705 li a4,1 + 300688a: c7b8 sw a4,72(a5) + 300688c: fdc42783 lw a5,-36(s0) + 3006890: 4705 li a4,1 + 3006892: c7f8 sw a4,76(a5) + 3006894: 4781 li a5,0 + 3006896: 853e mv a0,a5 + 3006898: 50b2 lw ra,44(sp) + 300689a: 5422 lw s0,40(sp) + 300689c: 6145 addi sp,sp,48 + 300689e: 8082 ret + +030068a0 : + 30068a0: 1101 addi sp,sp,-32 + 30068a2: ce06 sw ra,28(sp) + 30068a4: cc22 sw s0,24(sp) + 30068a6: 1000 addi s0,sp,32 + 30068a8: fea42623 sw a0,-20(s0) + 30068ac: fec42783 lw a5,-20(s0) + 30068b0: eb89 bnez a5,30068c2 + 30068b2: 16200593 li a1,354 + 30068b6: 0300f7b7 lui a5,0x300f + 30068ba: 26c78513 addi a0,a5,620 # 300f26c + 30068be: 25b1 jal ra,3006f0a + 30068c0: a001 j 30068c0 + 30068c2: fec42783 lw a5,-20(s0) + 30068c6: 4398 lw a4,0(a5) + 30068c8: 140007b7 lui a5,0x14000 + 30068cc: 02f70f63 beq a4,a5,300690a + 30068d0: fec42783 lw a5,-20(s0) + 30068d4: 4398 lw a4,0(a5) + 30068d6: 140017b7 lui a5,0x14001 + 30068da: 02f70863 beq a4,a5,300690a + 30068de: fec42783 lw a5,-20(s0) + 30068e2: 4398 lw a4,0(a5) + 30068e4: 140027b7 lui a5,0x14002 + 30068e8: 02f70163 beq a4,a5,300690a + 30068ec: fec42783 lw a5,-20(s0) + 30068f0: 4398 lw a4,0(a5) + 30068f2: 140037b7 lui a5,0x14003 + 30068f6: 00f70a63 beq a4,a5,300690a + 30068fa: 16300593 li a1,355 + 30068fe: 0300f7b7 lui a5,0x300f + 3006902: 26c78513 addi a0,a5,620 # 300f26c + 3006906: 2511 jal ra,3006f0a + 3006908: a001 j 3006908 + 300690a: fec42783 lw a5,-20(s0) + 300690e: 4fdc lw a5,28(a5) + 3006910: eb89 bnez a5,3006922 + 3006912: 16400593 li a1,356 + 3006916: 0300f7b7 lui a5,0x300f + 300691a: 26c78513 addi a0,a5,620 # 300f26c + 300691e: 23f5 jal ra,3006f0a + 3006920: a001 j 3006920 + 3006922: fec42783 lw a5,-20(s0) + 3006926: 47b8 lw a4,72(a5) + 3006928: 478d li a5,3 + 300692a: 0af71f63 bne a4,a5,30069e8 + 300692e: a8a1 j 3006986 + 3006930: fec42783 lw a5,-20(s0) + 3006934: 439c lw a5,0(a5) + 3006936: 4f9c lw a5,24(a5) + 3006938: 8395 srli a5,a5,0x5 + 300693a: 8b85 andi a5,a5,1 + 300693c: 0ff7f713 andi a4,a5,255 + 3006940: 4785 li a5,1 + 3006942: 04f70763 beq a4,a5,3006990 + 3006946: fec42783 lw a5,-20(s0) + 300694a: 4fdc lw a5,28(a5) + 300694c: fec42703 lw a4,-20(s0) + 3006950: 4318 lw a4,0(a4) + 3006952: 239c lbu a5,0(a5) + 3006954: 0ff7f693 andi a3,a5,255 + 3006958: 431c lw a5,0(a4) + 300695a: 0ff6f693 andi a3,a3,255 + 300695e: f007f793 andi a5,a5,-256 + 3006962: 8fd5 or a5,a5,a3 + 3006964: c31c sw a5,0(a4) + 3006966: fec42783 lw a5,-20(s0) + 300696a: 4fdc lw a5,28(a5) + 300696c: 00178713 addi a4,a5,1 + 3006970: fec42783 lw a5,-20(s0) + 3006974: cfd8 sw a4,28(a5) + 3006976: fec42783 lw a5,-20(s0) + 300697a: 53dc lw a5,36(a5) + 300697c: fff78713 addi a4,a5,-1 + 3006980: fec42783 lw a5,-20(s0) + 3006984: d3d8 sw a4,36(a5) + 3006986: fec42783 lw a5,-20(s0) + 300698a: 53dc lw a5,36(a5) + 300698c: f3d5 bnez a5,3006930 + 300698e: a011 j 3006992 + 3006990: 0001 nop + 3006992: fec42783 lw a5,-20(s0) + 3006996: 53dc lw a5,36(a5) + 3006998: eba1 bnez a5,30069e8 + 300699a: fec42783 lw a5,-20(s0) + 300699e: 439c lw a5,0(a5) + 30069a0: 5f94 lw a3,56(a5) + 30069a2: fec42783 lw a5,-20(s0) + 30069a6: 439c lw a5,0(a5) + 30069a8: 777d lui a4,0xfffff + 30069aa: fdf70713 addi a4,a4,-33 # ffffefdf + 30069ae: 8f75 and a4,a4,a3 + 30069b0: df98 sw a4,56(a5) + 30069b2: fec42783 lw a5,-20(s0) + 30069b6: 439c lw a5,0(a5) + 30069b8: 43f4 lw a3,68(a5) + 30069ba: fec42783 lw a5,-20(s0) + 30069be: 439c lw a5,0(a5) + 30069c0: 6705 lui a4,0x1 + 30069c2: 02070713 addi a4,a4,32 # 1020 + 30069c6: 8f55 or a4,a4,a3 + 30069c8: c3f8 sw a4,68(a5) + 30069ca: fec42783 lw a5,-20(s0) + 30069ce: 4705 li a4,1 + 30069d0: c7b8 sw a4,72(a5) + 30069d2: fec42783 lw a5,-20(s0) + 30069d6: 4bfc lw a5,84(a5) + 30069d8: cb81 beqz a5,30069e8 + 30069da: fec42783 lw a5,-20(s0) + 30069de: 4bfc lw a5,84(a5) + 30069e0: fec42503 lw a0,-20(s0) + 30069e4: 9782 jalr a5 + 30069e6: 0001 nop + 30069e8: 0001 nop + 30069ea: 40f2 lw ra,28(sp) + 30069ec: 4462 lw s0,24(sp) + 30069ee: 6105 addi sp,sp,32 + 30069f0: 8082 ret + +030069f2 : + 30069f2: 7179 addi sp,sp,-48 + 30069f4: d606 sw ra,44(sp) + 30069f6: d422 sw s0,40(sp) + 30069f8: 1800 addi s0,sp,48 + 30069fa: fca42e23 sw a0,-36(s0) + 30069fe: fdc42783 lw a5,-36(s0) + 3006a02: eb89 bnez a5,3006a14 + 3006a04: 1fe00593 li a1,510 + 3006a08: 0300f7b7 lui a5,0x300f + 3006a0c: 26c78513 addi a0,a5,620 # 300f26c + 3006a10: 29ed jal ra,3006f0a + 3006a12: a001 j 3006a12 + 3006a14: fdc42783 lw a5,-36(s0) + 3006a18: 539c lw a5,32(a5) + 3006a1a: eb89 bnez a5,3006a2c + 3006a1c: 1ff00593 li a1,511 + 3006a20: 0300f7b7 lui a5,0x300f + 3006a24: 26c78513 addi a0,a5,620 # 300f26c + 3006a28: 21cd jal ra,3006f0a + 3006a2a: a001 j 3006a2a + 3006a2c: fdc42783 lw a5,-36(s0) + 3006a30: 4398 lw a4,0(a5) + 3006a32: 140007b7 lui a5,0x14000 + 3006a36: 02f70f63 beq a4,a5,3006a74 + 3006a3a: fdc42783 lw a5,-36(s0) + 3006a3e: 4398 lw a4,0(a5) + 3006a40: 140017b7 lui a5,0x14001 + 3006a44: 02f70863 beq a4,a5,3006a74 + 3006a48: fdc42783 lw a5,-36(s0) + 3006a4c: 4398 lw a4,0(a5) + 3006a4e: 140027b7 lui a5,0x14002 + 3006a52: 02f70163 beq a4,a5,3006a74 + 3006a56: fdc42783 lw a5,-36(s0) + 3006a5a: 4398 lw a4,0(a5) + 3006a5c: 140037b7 lui a5,0x14003 + 3006a60: 00f70a63 beq a4,a5,3006a74 + 3006a64: 20000593 li a1,512 + 3006a68: 0300f7b7 lui a5,0x300f + 3006a6c: 26c78513 addi a0,a5,620 # 300f26c + 3006a70: 2969 jal ra,3006f0a + 3006a72: a001 j 3006a72 + 3006a74: fdc42783 lw a5,-36(s0) + 3006a78: 47f8 lw a4,76(a5) + 3006a7a: 4791 li a5,4 + 3006a7c: 0cf71763 bne a4,a5,3006b4a + 3006a80: a8bd j 3006afe + 3006a82: fdc42783 lw a5,-36(s0) + 3006a86: 439c lw a5,0(a5) + 3006a88: 4f9c lw a5,24(a5) + 3006a8a: 8391 srli a5,a5,0x4 + 3006a8c: 8b85 andi a5,a5,1 + 3006a8e: 0ff7f713 andi a4,a5,255 + 3006a92: 4785 li a5,1 + 3006a94: 06f70b63 beq a4,a5,3006b0a + 3006a98: fdc42783 lw a5,-36(s0) + 3006a9c: 439c lw a5,0(a5) + 3006a9e: 439c lw a5,0(a5) + 3006aa0: fef42623 sw a5,-20(s0) + 3006aa4: 2b51c703 lbu a4,693(gp) # 40008e9 + 3006aa8: 4785 li a5,1 + 3006aaa: 02f71063 bne a4,a5,3006aca + 3006aae: fec42783 lw a5,-20(s0) + 3006ab2: 0ff7f713 andi a4,a5,255 + 3006ab6: 47a9 li a5,10 + 3006ab8: 00f70563 beq a4,a5,3006ac2 + 3006abc: fe042623 sw zero,-20(s0) + 3006ac0: a83d j 3006afe + 3006ac2: 4709 li a4,2 + 3006ac4: 2ae18aa3 sb a4,693(gp) # 40008e9 + 3006ac8: a81d j 3006afe + 3006aca: fec42783 lw a5,-20(s0) + 3006ace: 0ff7f713 andi a4,a5,255 + 3006ad2: 47b5 li a5,13 + 3006ad4: 00f71663 bne a4,a5,3006ae0 + 3006ad8: 4705 li a4,1 + 3006ada: 2ae18aa3 sb a4,693(gp) # 40008e9 + 3006ade: a005 j 3006afe + 3006ae0: fdc42783 lw a5,-36(s0) + 3006ae4: 539c lw a5,32(a5) + 3006ae6: fec42703 lw a4,-20(s0) + 3006aea: 9f01 uxtb a4 + 3006aec: a398 sb a4,0(a5) + 3006aee: fdc42783 lw a5,-36(s0) + 3006af2: 539c lw a5,32(a5) + 3006af4: 00178713 addi a4,a5,1 + 3006af8: fdc42783 lw a5,-36(s0) + 3006afc: d398 sw a4,32(a5) + 3006afe: 2b51c703 lbu a4,693(gp) # 40008e9 + 3006b02: 4789 li a5,2 + 3006b04: f6f71fe3 bne a4,a5,3006a82 + 3006b08: a011 j 3006b0c + 3006b0a: 0001 nop + 3006b0c: fdc42783 lw a5,-36(s0) + 3006b10: 439c lw a5,0(a5) + 3006b12: 43f4 lw a3,68(a5) + 3006b14: fdc42783 lw a5,-36(s0) + 3006b18: 439c lw a5,0(a5) + 3006b1a: 00020737 lui a4,0x20 + 3006b1e: 05070713 addi a4,a4,80 # 20050 + 3006b22: 8f55 or a4,a4,a3 + 3006b24: c3f8 sw a4,68(a5) + 3006b26: fdc42783 lw a5,-36(s0) + 3006b2a: 4fbc lw a5,88(a5) + 3006b2c: cf99 beqz a5,3006b4a + 3006b2e: 2b51c703 lbu a4,693(gp) # 40008e9 + 3006b32: 4789 li a5,2 + 3006b34: 00f71b63 bne a4,a5,3006b4a + 3006b38: 2a018aa3 sb zero,693(gp) # 40008e9 + 3006b3c: fdc42783 lw a5,-36(s0) + 3006b40: 4fbc lw a5,88(a5) + 3006b42: fdc42503 lw a0,-36(s0) + 3006b46: 9782 jalr a5 + 3006b48: 0001 nop + 3006b4a: 0001 nop + 3006b4c: 50b2 lw ra,44(sp) + 3006b4e: 5422 lw s0,40(sp) + 3006b50: 6145 addi sp,sp,48 + 3006b52: 8082 ret + +03006b54 : + 3006b54: 7179 addi sp,sp,-48 + 3006b56: d606 sw ra,44(sp) + 3006b58: d422 sw s0,40(sp) + 3006b5a: 1800 addi s0,sp,48 + 3006b5c: fca42e23 sw a0,-36(s0) + 3006b60: fe042623 sw zero,-20(s0) + 3006b64: fdc42783 lw a5,-36(s0) + 3006b68: 439c lw a5,0(a5) + 3006b6a: 43bc lw a5,64(a5) + 3006b6c: 83a9 srli a5,a5,0xa + 3006b6e: 8b85 andi a5,a5,1 + 3006b70: 0ff7f713 andi a4,a5,255 + 3006b74: 4785 li a5,1 + 3006b76: 02f71763 bne a4,a5,3006ba4 + 3006b7a: fdc42783 lw a5,-36(s0) + 3006b7e: 439c lw a5,0(a5) + 3006b80: 43bc lw a5,64(a5) + 3006b82: 83a9 srli a5,a5,0xa + 3006b84: 8b85 andi a5,a5,1 + 3006b86: 9f81 uxtb a5 + 3006b88: 873e mv a4,a5 + 3006b8a: fec42783 lw a5,-20(s0) + 3006b8e: 8fd9 or a5,a5,a4 + 3006b90: fef42623 sw a5,-20(s0) + 3006b94: fdc42783 lw a5,-36(s0) + 3006b98: 4398 lw a4,0(a5) + 3006b9a: 437c lw a5,68(a4) + 3006b9c: 4007e793 ori a5,a5,1024 + 3006ba0: c37c sw a5,68(a4) + 3006ba2: a0c1 j 3006c62 + 3006ba4: fdc42783 lw a5,-36(s0) + 3006ba8: 439c lw a5,0(a5) + 3006baa: 43bc lw a5,64(a5) + 3006bac: 83a5 srli a5,a5,0x9 + 3006bae: 8b85 andi a5,a5,1 + 3006bb0: 0ff7f713 andi a4,a5,255 + 3006bb4: 4785 li a5,1 + 3006bb6: 02f71763 bne a4,a5,3006be4 + 3006bba: fdc42783 lw a5,-36(s0) + 3006bbe: 439c lw a5,0(a5) + 3006bc0: 43bc lw a5,64(a5) + 3006bc2: 83a5 srli a5,a5,0x9 + 3006bc4: 8b85 andi a5,a5,1 + 3006bc6: 9f81 uxtb a5 + 3006bc8: 873e mv a4,a5 + 3006bca: fec42783 lw a5,-20(s0) + 3006bce: 8fd9 or a5,a5,a4 + 3006bd0: fef42623 sw a5,-20(s0) + 3006bd4: fdc42783 lw a5,-36(s0) + 3006bd8: 4398 lw a4,0(a5) + 3006bda: 437c lw a5,68(a4) + 3006bdc: 2007e793 ori a5,a5,512 + 3006be0: c37c sw a5,68(a4) + 3006be2: a041 j 3006c62 + 3006be4: fdc42783 lw a5,-36(s0) + 3006be8: 439c lw a5,0(a5) + 3006bea: 43bc lw a5,64(a5) + 3006bec: 83a1 srli a5,a5,0x8 + 3006bee: 8b85 andi a5,a5,1 + 3006bf0: 0ff7f713 andi a4,a5,255 + 3006bf4: 4785 li a5,1 + 3006bf6: 02f71763 bne a4,a5,3006c24 + 3006bfa: fdc42783 lw a5,-36(s0) + 3006bfe: 439c lw a5,0(a5) + 3006c00: 43bc lw a5,64(a5) + 3006c02: 83a1 srli a5,a5,0x8 + 3006c04: 8b85 andi a5,a5,1 + 3006c06: 9f81 uxtb a5 + 3006c08: 873e mv a4,a5 + 3006c0a: fec42783 lw a5,-20(s0) + 3006c0e: 8fd9 or a5,a5,a4 + 3006c10: fef42623 sw a5,-20(s0) + 3006c14: fdc42783 lw a5,-36(s0) + 3006c18: 4398 lw a4,0(a5) + 3006c1a: 437c lw a5,68(a4) + 3006c1c: 1007e793 ori a5,a5,256 + 3006c20: c37c sw a5,68(a4) + 3006c22: a081 j 3006c62 + 3006c24: fdc42783 lw a5,-36(s0) + 3006c28: 439c lw a5,0(a5) + 3006c2a: 43bc lw a5,64(a5) + 3006c2c: 839d srli a5,a5,0x7 + 3006c2e: 8b85 andi a5,a5,1 + 3006c30: 0ff7f713 andi a4,a5,255 + 3006c34: 4785 li a5,1 + 3006c36: 02f71663 bne a4,a5,3006c62 + 3006c3a: fdc42783 lw a5,-36(s0) + 3006c3e: 439c lw a5,0(a5) + 3006c40: 43bc lw a5,64(a5) + 3006c42: 839d srli a5,a5,0x7 + 3006c44: 8b85 andi a5,a5,1 + 3006c46: 9f81 uxtb a5 + 3006c48: 873e mv a4,a5 + 3006c4a: fec42783 lw a5,-20(s0) + 3006c4e: 8fd9 or a5,a5,a4 + 3006c50: fef42623 sw a5,-20(s0) + 3006c54: fdc42783 lw a5,-36(s0) + 3006c58: 4398 lw a4,0(a5) + 3006c5a: 437c lw a5,68(a4) + 3006c5c: 0807e793 ori a5,a5,128 + 3006c60: c37c sw a5,68(a4) + 3006c62: fec42783 lw a5,-20(s0) + 3006c66: c79d beqz a5,3006c94 + 3006c68: fdc42783 lw a5,-36(s0) + 3006c6c: fec42703 lw a4,-20(s0) + 3006c70: cbb8 sw a4,80(a5) + 3006c72: fdc42783 lw a5,-36(s0) + 3006c76: 4f98 lw a4,24(a5) + 3006c78: 4785 li a5,1 + 3006c7a: 00f71d63 bne a4,a5,3006c94 + 3006c7e: fdc42783 lw a5,-36(s0) + 3006c82: 53fc lw a5,100(a5) + 3006c84: cb81 beqz a5,3006c94 + 3006c86: fdc42783 lw a5,-36(s0) + 3006c8a: 53fc lw a5,100(a5) + 3006c8c: fdc42503 lw a0,-36(s0) + 3006c90: 9782 jalr a5 + 3006c92: 0001 nop + 3006c94: 0001 nop + 3006c96: 50b2 lw ra,44(sp) + 3006c98: 5422 lw s0,40(sp) + 3006c9a: 6145 addi sp,sp,48 + 3006c9c: 8082 ret + +03006c9e : + 3006c9e: 7179 addi sp,sp,-48 + 3006ca0: d606 sw ra,44(sp) + 3006ca2: d422 sw s0,40(sp) + 3006ca4: 1800 addi s0,sp,48 + 3006ca6: fca42e23 sw a0,-36(s0) + 3006caa: fdc42783 lw a5,-36(s0) + 3006cae: eb89 bnez a5,3006cc0 + 3006cb0: 2dc00593 li a1,732 + 3006cb4: 0300f7b7 lui a5,0x300f + 3006cb8: 26c78513 addi a0,a5,620 # 300f26c + 3006cbc: 24b9 jal ra,3006f0a + 3006cbe: a001 j 3006cbe + 3006cc0: fdc42783 lw a5,-36(s0) + 3006cc4: fef42623 sw a5,-20(s0) + 3006cc8: fec42783 lw a5,-20(s0) + 3006ccc: 4398 lw a4,0(a5) + 3006cce: 140007b7 lui a5,0x14000 + 3006cd2: 02f70f63 beq a4,a5,3006d10 + 3006cd6: fec42783 lw a5,-20(s0) + 3006cda: 4398 lw a4,0(a5) + 3006cdc: 140017b7 lui a5,0x14001 + 3006ce0: 02f70863 beq a4,a5,3006d10 + 3006ce4: fec42783 lw a5,-20(s0) + 3006ce8: 4398 lw a4,0(a5) + 3006cea: 140027b7 lui a5,0x14002 + 3006cee: 02f70163 beq a4,a5,3006d10 + 3006cf2: fec42783 lw a5,-20(s0) + 3006cf6: 4398 lw a4,0(a5) + 3006cf8: 140037b7 lui a5,0x14003 + 3006cfc: 00f70a63 beq a4,a5,3006d10 + 3006d00: 2de00593 li a1,734 + 3006d04: 0300f7b7 lui a5,0x300f + 3006d08: 26c78513 addi a0,a5,620 # 300f26c + 3006d0c: 2afd jal ra,3006f0a + 3006d0e: a001 j 3006d0e + 3006d10: fec42783 lw a5,-20(s0) + 3006d14: 439c lw a5,0(a5) + 3006d16: 43bc lw a5,64(a5) + 3006d18: 8395 srli a5,a5,0x5 + 3006d1a: 8b85 andi a5,a5,1 + 3006d1c: 0ff7f713 andi a4,a5,255 + 3006d20: 4785 li a5,1 + 3006d22: 00f70d63 beq a4,a5,3006d3c + 3006d26: fec42783 lw a5,-20(s0) + 3006d2a: 439c lw a5,0(a5) + 3006d2c: 43bc lw a5,64(a5) + 3006d2e: 83b1 srli a5,a5,0xc + 3006d30: 8b85 andi a5,a5,1 + 3006d32: 0ff7f713 andi a4,a5,255 + 3006d36: 4785 li a5,1 + 3006d38: 00f71563 bne a4,a5,3006d42 + 3006d3c: fec42503 lw a0,-20(s0) + 3006d40: 3685 jal ra,30068a0 + 3006d42: fec42783 lw a5,-20(s0) + 3006d46: 439c lw a5,0(a5) + 3006d48: 43bc lw a5,64(a5) + 3006d4a: 8391 srli a5,a5,0x4 + 3006d4c: 8b85 andi a5,a5,1 + 3006d4e: 0ff7f713 andi a4,a5,255 + 3006d52: 4785 li a5,1 + 3006d54: 02f70863 beq a4,a5,3006d84 + 3006d58: fec42783 lw a5,-20(s0) + 3006d5c: 439c lw a5,0(a5) + 3006d5e: 43bc lw a5,64(a5) + 3006d60: 8399 srli a5,a5,0x6 + 3006d62: 8b85 andi a5,a5,1 + 3006d64: 0ff7f713 andi a4,a5,255 + 3006d68: 4785 li a5,1 + 3006d6a: 00f70d63 beq a4,a5,3006d84 + 3006d6e: fec42783 lw a5,-20(s0) + 3006d72: 439c lw a5,0(a5) + 3006d74: 43bc lw a5,64(a5) + 3006d76: 83c5 srli a5,a5,0x11 + 3006d78: 8b85 andi a5,a5,1 + 3006d7a: 0ff7f713 andi a4,a5,255 + 3006d7e: 4785 li a5,1 + 3006d80: 00f71563 bne a4,a5,3006d8a + 3006d84: fec42503 lw a0,-20(s0) + 3006d88: 31ad jal ra,30069f2 + 3006d8a: fec42783 lw a5,-20(s0) + 3006d8e: 439c lw a5,0(a5) + 3006d90: 43bc lw a5,64(a5) + 3006d92: 83d5 srli a5,a5,0x15 + 3006d94: 8b85 andi a5,a5,1 + 3006d96: 0ff7f713 andi a4,a5,255 + 3006d9a: 4785 li a5,1 + 3006d9c: 00f71663 bne a4,a5,3006da8 + 3006da0: fec42503 lw a0,-20(s0) + 3006da4: e5cff0ef jal ra,3006400 + 3006da8: fec42783 lw a5,-20(s0) + 3006dac: 439c lw a5,0(a5) + 3006dae: 43bc lw a5,64(a5) + 3006db0: 83cd srli a5,a5,0x13 + 3006db2: 8b85 andi a5,a5,1 + 3006db4: 0ff7f713 andi a4,a5,255 + 3006db8: 4785 li a5,1 + 3006dba: 00f70d63 beq a4,a5,3006dd4 + 3006dbe: fec42783 lw a5,-20(s0) + 3006dc2: 439c lw a5,0(a5) + 3006dc4: 43bc lw a5,64(a5) + 3006dc6: 83d1 srli a5,a5,0x14 + 3006dc8: 8b85 andi a5,a5,1 + 3006dca: 0ff7f713 andi a4,a5,255 + 3006dce: 4785 li a5,1 + 3006dd0: 00f71663 bne a4,a5,3006ddc + 3006dd4: fec42503 lw a0,-20(s0) + 3006dd8: d4cff0ef jal ra,3006324 + 3006ddc: fec42783 lw a5,-20(s0) + 3006de0: 439c lw a5,0(a5) + 3006de2: 43bc lw a5,64(a5) + 3006de4: 7807f793 andi a5,a5,1920 + 3006de8: c789 beqz a5,3006df2 + 3006dea: fec42503 lw a0,-20(s0) + 3006dee: 339d jal ra,3006b54 + 3006df0: 0001 nop + 3006df2: 0001 nop + 3006df4: 50b2 lw ra,44(sp) + 3006df6: 5422 lw s0,40(sp) + 3006df8: 6145 addi sp,sp,48 + 3006dfa: 8082 ret + +03006dfc : + 3006dfc: 1101 addi sp,sp,-32 + 3006dfe: ce06 sw ra,28(sp) + 3006e00: cc22 sw s0,24(sp) + 3006e02: 1000 addi s0,sp,32 + 3006e04: fea42623 sw a0,-20(s0) + 3006e08: feb42423 sw a1,-24(s0) + 3006e0c: fec42223 sw a2,-28(s0) + 3006e10: fec42783 lw a5,-20(s0) + 3006e14: eb89 bnez a5,3006e26 + 3006e16: 30200593 li a1,770 + 3006e1a: 0300f7b7 lui a5,0x300f + 3006e1e: 26c78513 addi a0,a5,620 # 300f26c + 3006e22: 20e5 jal ra,3006f0a + 3006e24: a001 j 3006e24 + 3006e26: fec42783 lw a5,-20(s0) + 3006e2a: 4398 lw a4,0(a5) + 3006e2c: 140007b7 lui a5,0x14000 + 3006e30: 02f70f63 beq a4,a5,3006e6e + 3006e34: fec42783 lw a5,-20(s0) + 3006e38: 4398 lw a4,0(a5) + 3006e3a: 140017b7 lui a5,0x14001 + 3006e3e: 02f70863 beq a4,a5,3006e6e + 3006e42: fec42783 lw a5,-20(s0) + 3006e46: 4398 lw a4,0(a5) + 3006e48: 140027b7 lui a5,0x14002 + 3006e4c: 02f70163 beq a4,a5,3006e6e + 3006e50: fec42783 lw a5,-20(s0) + 3006e54: 4398 lw a4,0(a5) + 3006e56: 140037b7 lui a5,0x14003 + 3006e5a: 00f70a63 beq a4,a5,3006e6e + 3006e5e: 30300593 li a1,771 + 3006e62: 0300f7b7 lui a5,0x300f + 3006e66: 26c78513 addi a0,a5,620 # 300f26c + 3006e6a: 2045 jal ra,3006f0a + 3006e6c: a001 j 3006e6c + 3006e6e: fe842703 lw a4,-24(s0) + 3006e72: 47a1 li a5,8 + 3006e74: 08e7e363 bltu a5,a4,3006efa + 3006e78: fe842783 lw a5,-24(s0) + 3006e7c: 00279713 slli a4,a5,0x2 + 3006e80: 0300f7b7 lui a5,0x300f + 3006e84: 28878793 addi a5,a5,648 # 300f288 + 3006e88: 97ba add a5,a5,a4 + 3006e8a: 439c lw a5,0(a5) + 3006e8c: 8782 jr a5 + 3006e8e: fec42783 lw a5,-20(s0) + 3006e92: fe442703 lw a4,-28(s0) + 3006e96: cbf8 sw a4,84(a5) + 3006e98: a09d j 3006efe + 3006e9a: fec42783 lw a5,-20(s0) + 3006e9e: fe442703 lw a4,-28(s0) + 3006ea2: cfb8 sw a4,88(a5) + 3006ea4: a8a9 j 3006efe + 3006ea6: fec42783 lw a5,-20(s0) + 3006eaa: fe442703 lw a4,-28(s0) + 3006eae: cff8 sw a4,92(a5) + 3006eb0: a0b9 j 3006efe + 3006eb2: fec42783 lw a5,-20(s0) + 3006eb6: fe442703 lw a4,-28(s0) + 3006eba: d3b8 sw a4,96(a5) + 3006ebc: a089 j 3006efe + 3006ebe: fec42783 lw a5,-20(s0) + 3006ec2: fe442703 lw a4,-28(s0) + 3006ec6: d3f8 sw a4,100(a5) + 3006ec8: a81d j 3006efe + 3006eca: fec42783 lw a5,-20(s0) + 3006ece: fe442703 lw a4,-28(s0) + 3006ed2: d7b8 sw a4,104(a5) + 3006ed4: a02d j 3006efe + 3006ed6: fec42783 lw a5,-20(s0) + 3006eda: fe442703 lw a4,-28(s0) + 3006ede: d7f8 sw a4,108(a5) + 3006ee0: a839 j 3006efe + 3006ee2: fec42783 lw a5,-20(s0) + 3006ee6: fe442703 lw a4,-28(s0) + 3006eea: dbb8 sw a4,112(a5) + 3006eec: a809 j 3006efe + 3006eee: fec42783 lw a5,-20(s0) + 3006ef2: fe442703 lw a4,-28(s0) + 3006ef6: dbf8 sw a4,116(a5) + 3006ef8: a019 j 3006efe + 3006efa: 4785 li a5,1 + 3006efc: a011 j 3006f00 + 3006efe: 4781 li a5,0 + 3006f00: 853e mv a0,a5 + 3006f02: 40f2 lw ra,28(sp) + 3006f04: 4462 lw s0,24(sp) + 3006f06: 6105 addi sp,sp,32 + 3006f08: 8082 ret + +03006f0a : + 3006f0a: ae6fa06f j 30011f0 + +03006f0e : + 3006f0e: 1101 addi sp,sp,-32 + 3006f10: ce22 sw s0,28(sp) + 3006f12: 1000 addi s0,sp,32 + 3006f14: fea42623 sw a0,-20(s0) + 3006f18: 3ac18793 addi a5,gp,940 # 40009e0 + 3006f1c: 2b818713 addi a4,gp,696 # 40008ec + 3006f20: d398 sw a4,32(a5) + 3006f22: 4705 li a4,1 + 3006f24: 2ce18623 sb a4,716(gp) # 4000900 + 3006f28: 0001 nop + 3006f2a: 4472 lw s0,28(sp) + 3006f2c: 6105 addi sp,sp,32 + 3006f2e: 8082 ret + +03006f30 : + 3006f30: 1101 addi sp,sp,-32 + 3006f32: ce22 sw s0,28(sp) + 3006f34: 1000 addi s0,sp,32 + 3006f36: fea42623 sw a0,-20(s0) + 3006f3a: 2e01a783 lw a5,736(gp) # 4000914 + 3006f3e: 00178713 addi a4,a5,1 + 3006f42: 2ee1a023 sw a4,736(gp) # 4000914 + 3006f46: 2e01a703 lw a4,736(gp) # 4000914 + 3006f4a: 3e800793 li a5,1000 + 3006f4e: 02f777b3 remu a5,a4,a5 + 3006f52: e781 bnez a5,3006f5a + 3006f54: 4705 li a4,1 + 3006f56: 2ce18723 sb a4,718(gp) # 4000902 + 3006f5a: 2e01a703 lw a4,736(gp) # 4000914 + 3006f5e: 0fa00793 li a5,250 + 3006f62: 02f777b3 remu a5,a4,a5 + 3006f66: e781 bnez a5,3006f6e + 3006f68: 4705 li a4,1 + 3006f6a: 2ce186a3 sb a4,717(gp) # 4000901 + 3006f6e: 2e01a703 lw a4,736(gp) # 4000914 + 3006f72: 6789 lui a5,0x2 + 3006f74: 71078793 addi a5,a5,1808 # 2710 + 3006f78: 02f777b3 remu a5,a4,a5 + 3006f7c: e781 bnez a5,3006f84 + 3006f7e: 4705 li a4,1 + 3006f80: 2ce187a3 sb a4,719(gp) # 4000903 + 3006f84: 2e01a703 lw a4,736(gp) # 4000914 + 3006f88: 052667b7 lui a5,0x5266 + 3006f8c: c0078793 addi a5,a5,-1024 # 5265c00 + 3006f90: 00f71463 bne a4,a5,3006f98 + 3006f94: 2e01a023 sw zero,736(gp) # 4000914 + 3006f98: 0001 nop + 3006f9a: 4472 lw s0,28(sp) + 3006f9c: 6105 addi sp,sp,32 + 3006f9e: 8082 ret + +03006fa0 : + 3006fa0: 7179 addi sp,sp,-48 + 3006fa2: d622 sw s0,44(sp) + 3006fa4: 1800 addi s0,sp,48 + 3006fa6: fca42e23 sw a0,-36(s0) + 3006faa: fdc42783 lw a5,-36(s0) + 3006fae: fef42623 sw a5,-20(s0) + 3006fb2: 2d41a783 lw a5,724(gp) # 4000908 + 3006fb6: 00178713 addi a4,a5,1 + 3006fba: 2ce1aa23 sw a4,724(gp) # 4000908 + 3006fbe: 0001 nop + 3006fc0: 5432 lw s0,44(sp) + 3006fc2: 6145 addi sp,sp,48 + 3006fc4: 8082 ret + +03006fc6 : + 3006fc6: 7179 addi sp,sp,-48 + 3006fc8: d622 sw s0,44(sp) + 3006fca: 1800 addi s0,sp,48 + 3006fcc: fca42e23 sw a0,-36(s0) + 3006fd0: fdc42783 lw a5,-36(s0) + 3006fd4: fef42623 sw a5,-20(s0) + 3006fd8: 2d01a783 lw a5,720(gp) # 4000904 + 3006fdc: 00178713 addi a4,a5,1 + 3006fe0: 2ce1a823 sw a4,720(gp) # 4000904 + 3006fe4: 0001 nop + 3006fe6: 5432 lw s0,44(sp) + 3006fe8: 6145 addi sp,sp,48 + 3006fea: 8082 ret + +03006fec : + 3006fec: 1101 addi sp,sp,-32 + 3006fee: ce22 sw s0,28(sp) + 3006ff0: 1000 addi s0,sp,32 + 3006ff2: fea42623 sw a0,-20(s0) + 3006ff6: fec42783 lw a5,-20(s0) + 3006ffa: 4711 li a4,4 + 3006ffc: c7f8 sw a4,76(a5) + 3006ffe: fec42783 lw a5,-20(s0) + 3007002: 2b818713 addi a4,gp,696 # 40008ec + 3007006: d398 sw a4,32(a5) + 3007008: fec42783 lw a5,-20(s0) + 300700c: 02c7c783 lbu a5,44(a5) + 3007010: cf81 beqz a5,3007028 + 3007012: fec42783 lw a5,-20(s0) + 3007016: 439c lw a5,0(a5) + 3007018: 5f98 lw a4,56(a5) + 300701a: fec42783 lw a5,-20(s0) + 300701e: 439c lw a5,0(a5) + 3007020: 7d076713 ori a4,a4,2000 + 3007024: df98 sw a4,56(a5) + 3007026: a831 j 3007042 + 3007028: fec42783 lw a5,-20(s0) + 300702c: 439c lw a5,0(a5) + 300702e: 5f94 lw a3,56(a5) + 3007030: fec42783 lw a5,-20(s0) + 3007034: 439c lw a5,0(a5) + 3007036: 00020737 lui a4,0x20 + 300703a: 78070713 addi a4,a4,1920 # 20780 + 300703e: 8f55 or a4,a4,a3 + 3007040: df98 sw a4,56(a5) + 3007042: 0001 nop + 3007044: 4472 lw s0,28(sp) + 3007046: 6105 addi sp,sp,32 + 3007048: 8082 ret + +0300704a : + 300704a: 7179 addi sp,sp,-48 + 300704c: d622 sw s0,44(sp) + 300704e: 1800 addi s0,sp,48 + 3007050: fca42e23 sw a0,-36(s0) + 3007054: fe042623 sw zero,-20(s0) + 3007058: a01d j 300707e + 300705a: fec42703 lw a4,-20(s0) + 300705e: 47a9 li a5,10 + 3007060: 02f707b3 mul a5,a4,a5 + 3007064: fdc42703 lw a4,-36(s0) + 3007068: 2318 lbu a4,0(a4) + 300706a: 97ba add a5,a5,a4 + 300706c: fd078793 addi a5,a5,-48 + 3007070: fef42623 sw a5,-20(s0) + 3007074: fdc42783 lw a5,-36(s0) + 3007078: 0785 addi a5,a5,1 + 300707a: fcf42e23 sw a5,-36(s0) + 300707e: fdc42783 lw a5,-36(s0) + 3007082: 239c lbu a5,0(a5) + 3007084: fd078713 addi a4,a5,-48 + 3007088: 47a5 li a5,9 + 300708a: fce7f8e3 bgeu a5,a4,300705a + 300708e: fec42783 lw a5,-20(s0) + 3007092: 853e mv a0,a5 + 3007094: 5432 lw s0,44(sp) + 3007096: 6145 addi sp,sp,48 + 3007098: 8082 ret + +0300709a
: + 300709a: 1141 addi sp,sp,-16 + 300709c: c606 sw ra,12(sp) + 300709e: c422 sw s0,8(sp) + 30070a0: 0800 addi s0,sp,16 + 30070a2: 5f5000ef jal ra,3007e96 + 30070a6: 2c018623 sb zero,716(gp) # 4000900 + 30070aa: 3ac18513 addi a0,gp,940 # 40009e0 + 30070ae: 3f3d jal ra,3006fec + 30070b0: 387060ef jal ra,300dc36 + 30070b4: 38418513 addi a0,gp,900 # 40009b8 + 30070b8: f53fe0ef jal ra,300600a + 30070bc: 3a9060ef jal ra,300dc64 + 30070c0: 3cd060ef jal ra,300dc8c + 30070c4: 87aa mv a5,a0 + 30070c6: 873e mv a4,a5 + 30070c8: 2ce19d23 sh a4,730(gp) # 400090e + 30070cc: 2da1d783 lhu a5,730(gp) # 400090e + 30070d0: c785 beqz a5,30070f8 + 30070d2: 2da1d703 lhu a4,730(gp) # 400090e + 30070d6: 07700793 li a5,119 + 30070da: 00e7ef63 bltu a5,a4,30070f8 + 30070de: ac01a423 sw zero,-1336(gp) # 40000fc + 30070e2: 2b71c783 lbu a5,695(gp) # 40008eb + 30070e6: eb89 bnez a5,30070f8 + 30070e8: 4705 li a4,1 + 30070ea: 2ae18ba3 sb a4,695(gp) # 40008eb + 30070ee: 0300f7b7 lui a5,0x300f + 30070f2: 2ac78513 addi a0,a5,684 # 300f2ac + 30070f6: 2c4d jal ra,30073a8 + 30070f8: 2d81c783 lbu a5,728(gp) # 400090c + 30070fc: ef81 bnez a5,3007114 + 30070fe: 2dc1c783 lbu a5,732(gp) # 4000910 + 3007102: c3a9 beqz a5,3007144 + 3007104: 2c018e23 sb zero,732(gp) # 4000910 + 3007108: 0300f7b7 lui a5,0x300f + 300710c: 2c878513 addi a0,a5,712 # 300f2c8 + 3007110: 2c61 jal ra,30073a8 + 3007112: a80d j 3007144 + 3007114: 2d81c703 lbu a4,728(gp) # 400090c + 3007118: 4785 li a5,1 + 300711a: 02f71563 bne a4,a5,3007144 + 300711e: 2dd1c783 lbu a5,733(gp) # 4000911 + 3007122: c38d beqz a5,3007144 + 3007124: 2da1d783 lhu a5,730(gp) # 400090e + 3007128: cf91 beqz a5,3007144 + 300712a: 2da1d703 lhu a4,730(gp) # 400090e + 300712e: 1f300793 li a5,499 + 3007132: 00e7e963 bltu a5,a4,3007144 + 3007136: 0300f7b7 lui a5,0x300f + 300713a: 31078513 addi a0,a5,784 # 300f310 + 300713e: 24ad jal ra,30073a8 + 3007140: 2c018ea3 sb zero,733(gp) # 4000911 + 3007144: 2cf1c783 lbu a5,719(gp) # 4000903 + 3007148: 9f81 uxtb a5 + 300714a: c7a9 beqz a5,3007194 + 300714c: 2c0187a3 sb zero,719(gp) # 4000903 + 3007150: 2da1d783 lhu a5,730(gp) # 400090e + 3007154: cf95 beqz a5,3007190 + 3007156: 2da1d703 lhu a4,730(gp) # 400090e + 300715a: 1f300793 li a5,499 + 300715e: 02e7e963 bltu a5,a4,3007190 + 3007162: 2e41a783 lw a5,740(gp) # 4000918 + 3007166: 00178713 addi a4,a5,1 + 300716a: 2ee1a223 sw a4,740(gp) # 4000918 + 300716e: 2e41a783 lw a5,740(gp) # 4000918 + 3007172: d017f753 fcvt.s.wu fa4,a5 + 3007176: 0300f7b7 lui a5,0x300f + 300717a: 3ac7a787 flw fa5,940(a5) # 300f3ac + 300717e: a0e787d3 fle.s a5,fa5,fa4 + 3007182: cb89 beqz a5,3007194 + 3007184: 4705 li a4,1 + 3007186: 2ce18e23 sb a4,732(gp) # 4000910 + 300718a: 2e01a223 sw zero,740(gp) # 4000918 + 300718e: a019 j 3007194 + 3007190: 2e01a223 sw zero,740(gp) # 4000918 + 3007194: 2ce1c783 lbu a5,718(gp) # 4000902 + 3007198: 9f81 uxtb a5 + 300719a: c795 beqz a5,30071c6 + 300719c: 2c018723 sb zero,718(gp) # 4000902 + 30071a0: 2b61c783 lbu a5,694(gp) # 40008ea + 30071a4: c38d beqz a5,30071c6 + 30071a6: ac81a783 lw a5,-1336(gp) # 40000fc + 30071aa: ef91 bnez a5,30071c6 + 30071ac: 2d01a783 lw a5,720(gp) # 4000904 + 30071b0: eb99 bnez a5,30071c6 + 30071b2: 2d41a783 lw a5,724(gp) # 4000908 + 30071b6: eb81 bnez a5,30071c6 + 30071b8: 4501 li a0,0 + 30071ba: 22ed jal ra,30073a4 + 30071bc: 0300f7b7 lui a5,0x300f + 30071c0: 33c78513 addi a0,a5,828 # 300f33c + 30071c4: 22d5 jal ra,30073a8 + 30071c6: 2cd1c783 lbu a5,717(gp) # 4000901 + 30071ca: 9f81 uxtb a5 + 30071cc: c3a1 beqz a5,300720c + 30071ce: 2c0186a3 sb zero,717(gp) # 4000901 + 30071d2: 2b61c783 lbu a5,694(gp) # 40008ea + 30071d6: c795 beqz a5,3007202 + 30071d8: 2d01a783 lw a5,720(gp) # 4000904 + 30071dc: d017f7d3 fcvt.s.wu fa5,a5 + 30071e0: 2d41a783 lw a5,724(gp) # 4000908 + 30071e4: d017f753 fcvt.s.wu fa4,a5 + 30071e8: ac81a783 lw a5,-1336(gp) # 40000fc + 30071ec: 873e mv a4,a5 + 30071ee: ac81a783 lw a5,-1336(gp) # 40000fc + 30071f2: 85be mv a1,a5 + 30071f4: 853a mv a0,a4 + 30071f6: 20e705d3 fmv.s fa1,fa4 + 30071fa: 20f78553 fmv.s fa0,fa5 + 30071fe: 609000ef jal ra,3008006 + 3007202: 4781 li a5,0 + 3007204: 2cf1aa23 sw a5,724(gp) # 4000908 + 3007208: 2cf1a823 sw a5,720(gp) # 4000904 + 300720c: 2cc1c783 lbu a5,716(gp) # 4000900 + 3007210: 9f81 uxtb a5 + 3007212: ea0787e3 beqz a5,30070c0 + 3007216: 4611 li a2,4 + 3007218: 0300f7b7 lui a5,0x300f + 300721c: 34478593 addi a1,a5,836 # 300f344 + 3007220: 2b818513 addi a0,gp,696 # 40008ec + 3007224: 2261 jal ra,30073ac + 3007226: 87aa mv a5,a0 + 3007228: eb91 bnez a5,300723c + 300722a: 2bc18793 addi a5,gp,700 # 40008f0 + 300722e: 853e mv a0,a5 + 3007230: 3d29 jal ra,300704a + 3007232: 87aa mv a5,a0 + 3007234: 873e mv a4,a5 + 3007236: ace1a423 sw a4,-1336(gp) # 40000fc + 300723a: aaa1 j 3007392 + 300723c: 4611 li a2,4 + 300723e: 0300f7b7 lui a5,0x300f + 3007242: 34c78593 addi a1,a5,844 # 300f34c + 3007246: 2b818513 addi a0,gp,696 # 40008ec + 300724a: 228d jal ra,30073ac + 300724c: 87aa mv a5,a0 + 300724e: e781 bnez a5,3007256 + 3007250: 1e6010ef jal ra,3008436 + 3007254: aa3d j 3007392 + 3007256: 4611 li a2,4 + 3007258: 0300f7b7 lui a5,0x300f + 300725c: 35478593 addi a1,a5,852 # 300f354 + 3007260: 2b818513 addi a0,gp,696 # 40008ec + 3007264: 22a1 jal ra,30073ac + 3007266: 87aa mv a5,a0 + 3007268: 12078563 beqz a5,3007392 + 300726c: 4611 li a2,4 + 300726e: 0300f7b7 lui a5,0x300f + 3007272: 35c78593 addi a1,a5,860 # 300f35c + 3007276: 2b818513 addi a0,gp,696 # 40008ec + 300727a: 2a0d jal ra,30073ac + 300727c: 87aa mv a5,a0 + 300727e: 10078a63 beqz a5,3007392 + 3007282: 4615 li a2,5 + 3007284: 0300f7b7 lui a5,0x300f + 3007288: 36478593 addi a1,a5,868 # 300f364 + 300728c: 2b818513 addi a0,gp,696 # 40008ec + 3007290: 2a31 jal ra,30073ac + 3007292: 87aa mv a5,a0 + 3007294: e781 bnez a5,300729c + 3007296: 4505 li a0,1 + 3007298: 2231 jal ra,30073a4 + 300729a: a8e5 j 3007392 + 300729c: 4615 li a2,5 + 300729e: 0300f7b7 lui a5,0x300f + 30072a2: 36c78593 addi a1,a5,876 # 300f36c + 30072a6: 2b818513 addi a0,gp,696 # 40008ec + 30072aa: 2209 jal ra,30073ac + 30072ac: 87aa mv a5,a0 + 30072ae: e799 bnez a5,30072bc + 30072b0: 1b4010ef jal ra,3008464 + 30072b4: 4705 li a4,1 + 30072b6: 2ce18ea3 sb a4,733(gp) # 4000911 + 30072ba: a8e1 j 3007392 + 30072bc: 4611 li a2,4 + 30072be: 0300f7b7 lui a5,0x300f + 30072c2: 37478593 addi a1,a5,884 # 300f374 + 30072c6: 2b818513 addi a0,gp,696 # 40008ec + 30072ca: 20cd jal ra,30073ac + 30072cc: 87aa mv a5,a0 + 30072ce: e781 bnez a5,30072d6 + 30072d0: 4501 li a0,0 + 30072d2: 28c9 jal ra,30073a4 + 30072d4: a87d j 3007392 + 30072d6: 4611 li a2,4 + 30072d8: 0300f7b7 lui a5,0x300f + 30072dc: 37c78593 addi a1,a5,892 # 300f37c + 30072e0: 2b818513 addi a0,gp,696 # 40008ec + 30072e4: 20e1 jal ra,30073ac + 30072e6: 87aa mv a5,a0 + 30072e8: e781 bnez a5,30072f0 + 30072ea: 022010ef jal ra,300830c + 30072ee: a055 j 3007392 + 30072f0: 4615 li a2,5 + 30072f2: 0300f7b7 lui a5,0x300f + 30072f6: 38478593 addi a1,a5,900 # 300f384 + 30072fa: 2b818513 addi a0,gp,696 # 40008ec + 30072fe: 207d jal ra,30073ac + 3007300: 87aa mv a5,a0 + 3007302: e781 bnez a5,300730a + 3007304: 048010ef jal ra,300834c + 3007308: a069 j 3007392 + 300730a: 4611 li a2,4 + 300730c: 0300f7b7 lui a5,0x300f + 3007310: 38c78593 addi a1,a5,908 # 300f38c + 3007314: 2b818513 addi a0,gp,696 # 40008ec + 3007318: 2851 jal ra,30073ac + 300731a: 87aa mv a5,a0 + 300731c: e781 bnez a5,3007324 + 300731e: 06e010ef jal ra,300838c + 3007322: a885 j 3007392 + 3007324: 460d li a2,3 + 3007326: 0300f7b7 lui a5,0x300f + 300732a: 39478593 addi a1,a5,916 # 300f394 + 300732e: 2b818513 addi a0,gp,696 # 40008ec + 3007332: 28ad jal ra,30073ac + 3007334: 87aa mv a5,a0 + 3007336: e781 bnez a5,300733e + 3007338: 086010ef jal ra,30083be + 300733c: a899 j 3007392 + 300733e: 460d li a2,3 + 3007340: 0300f7b7 lui a5,0x300f + 3007344: 39878593 addi a1,a5,920 # 300f398 + 3007348: 2b818513 addi a0,gp,696 # 40008ec + 300734c: 2085 jal ra,30073ac + 300734e: 87aa mv a5,a0 + 3007350: e781 bnez a5,3007358 + 3007352: 0a6010ef jal ra,30083f8 + 3007356: a835 j 3007392 + 3007358: 4611 li a2,4 + 300735a: 0300f7b7 lui a5,0x300f + 300735e: 39c78593 addi a1,a5,924 # 300f39c + 3007362: 2b818513 addi a0,gp,696 # 40008ec + 3007366: 2099 jal ra,30073ac + 3007368: 87aa mv a5,a0 + 300736a: e781 bnez a5,3007372 + 300736c: 2c018c23 sb zero,728(gp) # 400090c + 3007370: a00d j 3007392 + 3007372: 4611 li a2,4 + 3007374: 0300f7b7 lui a5,0x300f + 3007378: 3a478593 addi a1,a5,932 # 300f3a4 + 300737c: 2b818513 addi a0,gp,696 # 40008ec + 3007380: 2035 jal ra,30073ac + 3007382: 87aa mv a5,a0 + 3007384: e799 bnez a5,3007392 + 3007386: 4705 li a4,1 + 3007388: 2ce18c23 sb a4,728(gp) # 400090c + 300738c: 4705 li a4,1 + 300738e: 2ce18ea3 sb a4,733(gp) # 4000911 + 3007392: 2c018623 sb zero,716(gp) # 4000900 + 3007396: 4651 li a2,20 + 3007398: 4581 li a1,0 + 300739a: 2b818513 addi a0,gp,696 # 40008ec + 300739e: 0ef070ef jal ra,300ec8c + 30073a2: bb39 j 30070c0 + +030073a4 : + 30073a4: 6fb0006f j 300829e + +030073a8 : + 30073a8: f48fc06f j 3003af0 + +030073ac : + 30073ac: 1b30706f j 300ed5e + +030073b0 : + 30073b0: 715d addi sp,sp,-80 + 30073b2: c686 sw ra,76(sp) + 30073b4: c4a2 sw s0,72(sp) + 30073b6: 0880 addi s0,sp,80 + 30073b8: faa42e23 sw a0,-68(s0) + 30073bc: 100007b7 lui a5,0x10000 + 30073c0: fcf42423 sw a5,-56(s0) + 30073c4: fc042623 sw zero,-52(s0) + 30073c8: 478d li a5,3 + 30073ca: fcf42823 sw a5,-48(s0) + 30073ce: 03000793 li a5,48 + 30073d2: fcf42a23 sw a5,-44(s0) + 30073d6: 4785 li a5,1 + 30073d8: fcf42c23 sw a5,-40(s0) + 30073dc: 4789 li a5,2 + 30073de: fef42023 sw a5,-32(s0) + 30073e2: 4789 li a5,2 + 30073e4: fef42223 sw a5,-28(s0) + 30073e8: fe042423 sw zero,-24(s0) + 30073ec: 47e1 li a5,24 + 30073ee: fef42623 sw a5,-20(s0) + 30073f2: fc840793 addi a5,s0,-56 + 30073f6: 853e mv a0,a5 + 30073f8: c57fa0ef jal ra,300204e + 30073fc: 87aa mv a5,a0 + 30073fe: c399 beqz a5,3007404 + 3007400: 4785 li a5,1 + 3007402: a039 j 3007410 + 3007404: fe042703 lw a4,-32(s0) + 3007408: fbc42783 lw a5,-68(s0) + 300740c: c398 sw a4,0(a5) + 300740e: 4781 li a5,0 + 3007410: 853e mv a0,a5 + 3007412: 40b6 lw ra,76(sp) + 3007414: 4426 lw s0,72(sp) + 3007416: 6161 addi sp,sp,80 + 3007418: 8082 ret + +0300741a : + 300741a: 1141 addi sp,sp,-16 + 300741c: c606 sw ra,12(sp) + 300741e: c422 sw s0,8(sp) + 3007420: 0800 addi s0,sp,16 + 3007422: 4585 li a1,1 + 3007424: 14504537 lui a0,0x14504 + 3007428: 215d jal ra,30078ce + 300742a: 56c18793 addi a5,gp,1388 # 4000ba0 + 300742e: 14504737 lui a4,0x14504 + 3007432: c398 sw a4,0(a5) + 3007434: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007438: 4741 li a4,16 + 300743a: c3d8 sw a4,4(a5) + 300743c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007440: 2add jal ra,3007636 + 3007442: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007446: 43dc lw a5,4(a5) + 3007448: 4605 li a2,1 + 300744a: 85be mv a1,a5 + 300744c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007450: 22ed jal ra,300763a + 3007452: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007456: 43dc lw a5,4(a5) + 3007458: 4601 li a2,0 + 300745a: 85be mv a1,a5 + 300745c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007460: 2af9 jal ra,300763e + 3007462: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007466: 43dc lw a5,4(a5) + 3007468: 4615 li a2,5 + 300746a: 85be mv a1,a5 + 300746c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007470: 22c9 jal ra,3007632 + 3007472: 4585 li a1,1 + 3007474: 14503537 lui a0,0x14503 + 3007478: 2999 jal ra,30078ce + 300747a: 52418793 addi a5,gp,1316 # 4000b58 + 300747e: 14503737 lui a4,0x14503 + 3007482: c398 sw a4,0(a5) + 3007484: 52418793 addi a5,gp,1316 # 4000b58 + 3007488: 4741 li a4,16 + 300748a: c3d8 sw a4,4(a5) + 300748c: 52418513 addi a0,gp,1316 # 4000b58 + 3007490: 225d jal ra,3007636 + 3007492: 52418793 addi a5,gp,1316 # 4000b58 + 3007496: 43dc lw a5,4(a5) + 3007498: 4605 li a2,1 + 300749a: 85be mv a1,a5 + 300749c: 52418513 addi a0,gp,1316 # 4000b58 + 30074a0: 2a69 jal ra,300763a + 30074a2: 52418793 addi a5,gp,1316 # 4000b58 + 30074a6: 43dc lw a5,4(a5) + 30074a8: 4601 li a2,0 + 30074aa: 85be mv a1,a5 + 30074ac: 52418513 addi a0,gp,1316 # 4000b58 + 30074b0: 2279 jal ra,300763e + 30074b2: 52418793 addi a5,gp,1316 # 4000b58 + 30074b6: 43dc lw a5,4(a5) + 30074b8: 4615 li a2,5 + 30074ba: 85be mv a1,a5 + 30074bc: 52418513 addi a0,gp,1316 # 4000b58 + 30074c0: 2a8d jal ra,3007632 + 30074c2: 4585 li a1,1 + 30074c4: 14502537 lui a0,0x14502 + 30074c8: 2119 jal ra,30078ce + 30074ca: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074ce: 14502737 lui a4,0x14502 + 30074d2: c398 sw a4,0(a5) + 30074d4: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074d8: 4711 li a4,4 + 30074da: c3d8 sw a4,4(a5) + 30074dc: 4dc18513 addi a0,gp,1244 # 4000b10 + 30074e0: 2a99 jal ra,3007636 + 30074e2: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074e6: 43dc lw a5,4(a5) + 30074e8: 4605 li a2,1 + 30074ea: 85be mv a1,a5 + 30074ec: 4dc18513 addi a0,gp,1244 # 4000b10 + 30074f0: 22a9 jal ra,300763a + 30074f2: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074f6: 43dc lw a5,4(a5) + 30074f8: 4605 li a2,1 + 30074fa: 85be mv a1,a5 + 30074fc: 4dc18513 addi a0,gp,1244 # 4000b10 + 3007500: 2a3d jal ra,300763e + 3007502: 4dc18793 addi a5,gp,1244 # 4000b10 + 3007506: 43dc lw a5,4(a5) + 3007508: 4615 li a2,5 + 300750a: 85be mv a1,a5 + 300750c: 4dc18513 addi a0,gp,1244 # 4000b10 + 3007510: 220d jal ra,3007632 + 3007512: 4585 li a1,1 + 3007514: 14501537 lui a0,0x14501 + 3007518: 2e5d jal ra,30078ce + 300751a: 49418793 addi a5,gp,1172 # 4000ac8 + 300751e: 14501737 lui a4,0x14501 + 3007522: c398 sw a4,0(a5) + 3007524: 49418793 addi a5,gp,1172 # 4000ac8 + 3007528: 4749 li a4,18 + 300752a: c3d8 sw a4,4(a5) + 300752c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007530: 2219 jal ra,3007636 + 3007532: 49418793 addi a5,gp,1172 # 4000ac8 + 3007536: 43dc lw a5,4(a5) + 3007538: 4601 li a2,0 + 300753a: 85be mv a1,a5 + 300753c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007540: 28ed jal ra,300763a + 3007542: 49418793 addi a5,gp,1172 # 4000ac8 + 3007546: 43dc lw a5,4(a5) + 3007548: 4601 li a2,0 + 300754a: 85be mv a1,a5 + 300754c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007550: 20fd jal ra,300763e + 3007552: 49418793 addi a5,gp,1172 # 4000ac8 + 3007556: 43dc lw a5,4(a5) + 3007558: 4611 li a2,4 + 300755a: 85be mv a1,a5 + 300755c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007560: 28c9 jal ra,3007632 + 3007562: 030077b7 lui a5,0x3007 + 3007566: fa078613 addi a2,a5,-96 # 3006fa0 + 300756a: 4589 li a1,2 + 300756c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007570: d5efd0ef jal ra,3004ace + 3007574: 030077b7 lui a5,0x3007 + 3007578: fc678613 addi a2,a5,-58 # 3006fc6 + 300757c: 45c1 li a1,16 + 300757e: 49418513 addi a0,gp,1172 # 4000ac8 + 3007582: d4cfd0ef jal ra,3004ace + 3007586: 49418613 addi a2,gp,1172 # 4000ac8 + 300758a: 030057b7 lui a5,0x3005 + 300758e: 9c478593 addi a1,a5,-1596 # 30049c4 + 3007592: 06e00513 li a0,110 + 3007596: 211d jal ra,30079bc + 3007598: 4589 li a1,2 + 300759a: 06e00513 li a0,110 + 300759e: 2929 jal ra,30079b8 + 30075a0: 06e00513 li a0,110 + 30075a4: 2901 jal ra,30079b4 + 30075a6: 4585 li a1,1 + 30075a8: 14503537 lui a0,0x14503 + 30075ac: 260d jal ra,30078ce + 30075ae: 52418793 addi a5,gp,1316 # 4000b58 + 30075b2: 14503737 lui a4,0x14503 + 30075b6: c398 sw a4,0(a5) + 30075b8: 52418793 addi a5,gp,1316 # 4000b58 + 30075bc: 06000713 li a4,96 + 30075c0: c3d8 sw a4,4(a5) + 30075c2: 52418513 addi a0,gp,1316 # 4000b58 + 30075c6: 2885 jal ra,3007636 + 30075c8: 52418793 addi a5,gp,1316 # 4000b58 + 30075cc: 43dc lw a5,4(a5) + 30075ce: 4605 li a2,1 + 30075d0: 85be mv a1,a5 + 30075d2: 52418513 addi a0,gp,1316 # 4000b58 + 30075d6: 2095 jal ra,300763a + 30075d8: 52418793 addi a5,gp,1316 # 4000b58 + 30075dc: 43dc lw a5,4(a5) + 30075de: 4601 li a2,0 + 30075e0: 85be mv a1,a5 + 30075e2: 52418513 addi a0,gp,1316 # 4000b58 + 30075e6: 28a1 jal ra,300763e + 30075e8: 4585 li a1,1 + 30075ea: 14505537 lui a0,0x14505 + 30075ee: 24c5 jal ra,30078ce + 30075f0: 5b418793 addi a5,gp,1460 # 4000be8 + 30075f4: 14505737 lui a4,0x14505 + 30075f8: c398 sw a4,0(a5) + 30075fa: 5b418793 addi a5,gp,1460 # 4000be8 + 30075fe: 4729 li a4,10 + 3007600: c3d8 sw a4,4(a5) + 3007602: 5b418513 addi a0,gp,1460 # 4000be8 + 3007606: 2805 jal ra,3007636 + 3007608: 5b418793 addi a5,gp,1460 # 4000be8 + 300760c: 43dc lw a5,4(a5) + 300760e: 4605 li a2,1 + 3007610: 85be mv a1,a5 + 3007612: 5b418513 addi a0,gp,1460 # 4000be8 + 3007616: 2015 jal ra,300763a + 3007618: 5b418793 addi a5,gp,1460 # 4000be8 + 300761c: 43dc lw a5,4(a5) + 300761e: 4601 li a2,0 + 3007620: 85be mv a1,a5 + 3007622: 5b418513 addi a0,gp,1460 # 4000be8 + 3007626: 2821 jal ra,300763e + 3007628: 0001 nop + 300762a: 40b2 lw ra,12(sp) + 300762c: 4422 lw s0,8(sp) + 300762e: 0141 addi sp,sp,16 + 3007630: 8082 ret + +03007632 : + 3007632: 87cfd06f j 30046ae + +03007636 : + 3007636: bc1fc06f j 30041f6 + +0300763a : + 300763a: ca3fc06f j 30042dc + +0300763e : + 300763e: d87fc06f j 30043c4 + +03007642 : + 3007642: 1141 addi sp,sp,-16 + 3007644: c606 sw ra,12(sp) + 3007646: c422 sw s0,8(sp) + 3007648: 0800 addi s0,sp,16 + 300764a: 4585 li a1,1 + 300764c: 14701537 lui a0,0x14701 + 3007650: 2cbd jal ra,30078ce + 3007652: 2e818793 addi a5,gp,744 # 400091c + 3007656: 14701737 lui a4,0x14701 + 300765a: c398 sw a4,0(a5) + 300765c: 2e818793 addi a5,gp,744 # 400091c + 3007660: 4725 li a4,9 + 3007662: c798 sw a4,8(a5) + 3007664: 2e818793 addi a5,gp,744 # 400091c + 3007668: 3e700713 li a4,999 + 300766c: cfd8 sw a4,28(a5) + 300766e: 2e818793 addi a5,gp,744 # 400091c + 3007672: 4705 li a4,1 + 3007674: c7d8 sw a4,12(a5) + 3007676: 2e818793 addi a5,gp,744 # 400091c + 300767a: 4709 li a4,2 + 300767c: cb98 sw a4,16(a5) + 300767e: 2e818793 addi a5,gp,744 # 400091c + 3007682: 12b00713 li a4,299 + 3007686: cbd8 sw a4,20(a5) + 3007688: 2e818793 addi a5,gp,744 # 400091c + 300768c: 4705 li a4,1 + 300768e: cf98 sw a4,24(a5) + 3007690: 2e818793 addi a5,gp,744 # 400091c + 3007694: 4705 li a4,1 + 3007696: 02e782a3 sb a4,37(a5) + 300769a: 2e818793 addi a5,gp,744 # 400091c + 300769e: 4705 li a4,1 + 30076a0: 02e78223 sb a4,36(a5) + 30076a4: 2e818793 addi a5,gp,744 # 400091c + 30076a8: 02078823 sb zero,48(a5) + 30076ac: 2e818793 addi a5,gp,744 # 400091c + 30076b0: 020788a3 sb zero,49(a5) + 30076b4: 2e818793 addi a5,gp,744 # 400091c + 30076b8: 020783a3 sb zero,39(a5) + 30076bc: 2e818793 addi a5,gp,744 # 400091c + 30076c0: 02078323 sb zero,38(a5) + 30076c4: 2e818513 addi a0,gp,744 # 400091c + 30076c8: 2a1d jal ra,30077fe + 30076ca: 0001 nop + 30076cc: 40b2 lw ra,12(sp) + 30076ce: 4422 lw s0,8(sp) + 30076d0: 0141 addi sp,sp,16 + 30076d2: 8082 ret + +030076d4 : + 30076d4: 1141 addi sp,sp,-16 + 30076d6: c606 sw ra,12(sp) + 30076d8: c422 sw s0,8(sp) + 30076da: 0800 addi s0,sp,16 + 30076dc: 4585 li a1,1 + 30076de: 14702537 lui a0,0x14702 + 30076e2: 22f5 jal ra,30078ce + 30076e4: 31c18793 addi a5,gp,796 # 4000950 + 30076e8: 14702737 lui a4,0x14702 + 30076ec: c398 sw a4,0(a5) + 30076ee: 31c18793 addi a5,gp,796 # 4000950 + 30076f2: 4725 li a4,9 + 30076f4: c798 sw a4,8(a5) + 30076f6: 31c18793 addi a5,gp,796 # 4000950 + 30076fa: 3e700713 li a4,999 + 30076fe: cfd8 sw a4,28(a5) + 3007700: 31c18793 addi a5,gp,796 # 4000950 + 3007704: 4705 li a4,1 + 3007706: c7d8 sw a4,12(a5) + 3007708: 31c18793 addi a5,gp,796 # 4000950 + 300770c: 4709 li a4,2 + 300770e: cb98 sw a4,16(a5) + 3007710: 31c18793 addi a5,gp,796 # 4000950 + 3007714: 12b00713 li a4,299 + 3007718: cbd8 sw a4,20(a5) + 300771a: 31c18793 addi a5,gp,796 # 4000950 + 300771e: 4705 li a4,1 + 3007720: cf98 sw a4,24(a5) + 3007722: 31c18793 addi a5,gp,796 # 4000950 + 3007726: 4705 li a4,1 + 3007728: 02e782a3 sb a4,37(a5) + 300772c: 31c18793 addi a5,gp,796 # 4000950 + 3007730: 4705 li a4,1 + 3007732: 02e78223 sb a4,36(a5) + 3007736: 31c18793 addi a5,gp,796 # 4000950 + 300773a: 02078823 sb zero,48(a5) + 300773e: 31c18793 addi a5,gp,796 # 4000950 + 3007742: 020788a3 sb zero,49(a5) + 3007746: 31c18793 addi a5,gp,796 # 4000950 + 300774a: 020783a3 sb zero,39(a5) + 300774e: 31c18793 addi a5,gp,796 # 4000950 + 3007752: 02078323 sb zero,38(a5) + 3007756: 31c18513 addi a0,gp,796 # 4000950 + 300775a: 2055 jal ra,30077fe + 300775c: 0001 nop + 300775e: 40b2 lw ra,12(sp) + 3007760: 4422 lw s0,8(sp) + 3007762: 0141 addi sp,sp,16 + 3007764: 8082 ret + +03007766 : + 3007766: 1141 addi sp,sp,-16 + 3007768: c606 sw ra,12(sp) + 300776a: c422 sw s0,8(sp) + 300776c: 0800 addi s0,sp,16 + 300776e: 4585 li a1,1 + 3007770: 14703537 lui a0,0x14703 + 3007774: 2aa9 jal ra,30078ce + 3007776: 35018793 addi a5,gp,848 # 4000984 + 300777a: 14703737 lui a4,0x14703 + 300777e: c398 sw a4,0(a5) + 3007780: 35018793 addi a5,gp,848 # 4000984 + 3007784: 12b00713 li a4,299 + 3007788: c798 sw a4,8(a5) + 300778a: 35018793 addi a5,gp,848 # 4000984 + 300778e: 6709 lui a4,0x2 + 3007790: 70f70713 addi a4,a4,1807 # 270f + 3007794: cfd8 sw a4,28(a5) + 3007796: 35018793 addi a5,gp,848 # 4000984 + 300779a: 4705 li a4,1 + 300779c: c7d8 sw a4,12(a5) + 300779e: 35018793 addi a5,gp,848 # 4000984 + 30077a2: 4709 li a4,2 + 30077a4: cb98 sw a4,16(a5) + 30077a6: 35018793 addi a5,gp,848 # 4000984 + 30077aa: 6705 lui a4,0x1 + 30077ac: 38770713 addi a4,a4,903 # 1387 + 30077b0: cbd8 sw a4,20(a5) + 30077b2: 35018793 addi a5,gp,848 # 4000984 + 30077b6: 4705 li a4,1 + 30077b8: cf98 sw a4,24(a5) + 30077ba: 35018793 addi a5,gp,848 # 4000984 + 30077be: 4705 li a4,1 + 30077c0: 02e782a3 sb a4,37(a5) + 30077c4: 35018793 addi a5,gp,848 # 4000984 + 30077c8: 4705 li a4,1 + 30077ca: 02e78223 sb a4,36(a5) + 30077ce: 35018793 addi a5,gp,848 # 4000984 + 30077d2: 02078823 sb zero,48(a5) + 30077d6: 35018793 addi a5,gp,848 # 4000984 + 30077da: 020788a3 sb zero,49(a5) + 30077de: 35018793 addi a5,gp,848 # 4000984 + 30077e2: 020783a3 sb zero,39(a5) + 30077e6: 35018793 addi a5,gp,848 # 4000984 + 30077ea: 02078323 sb zero,38(a5) + 30077ee: 35018513 addi a0,gp,848 # 4000984 + 30077f2: 2031 jal ra,30077fe + 30077f4: 0001 nop + 30077f6: 40b2 lw ra,12(sp) + 30077f8: 4422 lw s0,8(sp) + 30077fa: 0141 addi sp,sp,16 + 30077fc: 8082 ret + +030077fe : + 30077fe: c6efd06f j 3004c6c + +03007802 : + 3007802: 1101 addi sp,sp,-32 + 3007804: ce06 sw ra,28(sp) + 3007806: cc22 sw s0,24(sp) + 3007808: 1000 addi s0,sp,32 + 300780a: 4585 li a1,1 + 300780c: 14300537 lui a0,0x14300 + 3007810: 287d jal ra,30078ce + 3007812: 14300537 lui a0,0x14300 + 3007816: d11fa0ef jal ra,3002526 + 300781a: 872a mv a4,a0 + 300781c: 000f47b7 lui a5,0xf4 + 3007820: 24078793 addi a5,a5,576 # f4240 + 3007824: 02f75733 divu a4,a4,a5 + 3007828: 3e800793 li a5,1000 + 300782c: 02f707b3 mul a5,a4,a5 + 3007830: fef42623 sw a5,-20(s0) + 3007834: 38418793 addi a5,gp,900 # 40009b8 + 3007838: 14300737 lui a4,0x14300 + 300783c: c398 sw a4,0(a5) + 300783e: fec42783 lw a5,-20(s0) + 3007842: fff78713 addi a4,a5,-1 + 3007846: 38418793 addi a5,gp,900 # 40009b8 + 300784a: cbd8 sw a4,20(a5) + 300784c: fec42783 lw a5,-20(s0) + 3007850: fff78713 addi a4,a5,-1 + 3007854: 38418793 addi a5,gp,900 # 40009b8 + 3007858: cf98 sw a4,24(a5) + 300785a: 38418793 addi a5,gp,900 # 40009b8 + 300785e: 4705 li a4,1 + 3007860: c798 sw a4,8(a5) + 3007862: 38418793 addi a5,gp,900 # 40009b8 + 3007866: 0007a623 sw zero,12(a5) + 300786a: 38418793 addi a5,gp,900 # 40009b8 + 300786e: 4705 li a4,1 + 3007870: cb98 sw a4,16(a5) + 3007872: 38418793 addi a5,gp,900 # 40009b8 + 3007876: 4705 li a4,1 + 3007878: afd8 sb a4,28(a5) + 300787a: 38418793 addi a5,gp,900 # 40009b8 + 300787e: 00078ea3 sb zero,29(a5) + 3007882: 38418793 addi a5,gp,900 # 40009b8 + 3007886: 00078f23 sb zero,30(a5) + 300788a: 38418513 addi a0,gp,900 # 40009b8 + 300788e: d26fe0ef jal ra,3005db4 + 3007892: 38418613 addi a2,gp,900 # 40009b8 + 3007896: 030067b7 lui a5,0x3006 + 300789a: 08c78593 addi a1,a5,140 # 300608c + 300789e: 02000513 li a0,32 + 30078a2: 2a29 jal ra,30079bc + 30078a4: 030077b7 lui a5,0x3007 + 30078a8: f3078613 addi a2,a5,-208 # 3006f30 + 30078ac: 4581 li a1,0 + 30078ae: 38418513 addi a0,gp,900 # 40009b8 + 30078b2: 8c3fe0ef jal ra,3006174 + 30078b6: 4585 li a1,1 + 30078b8: 02000513 li a0,32 + 30078bc: 28f5 jal ra,30079b8 + 30078be: 02000513 li a0,32 + 30078c2: 28cd jal ra,30079b4 + 30078c4: 0001 nop + 30078c6: 40f2 lw ra,28(sp) + 30078c8: 4462 lw s0,24(sp) + 30078ca: 6105 addi sp,sp,32 + 30078cc: 8082 ret + +030078ce : + 30078ce: d37fa06f j 3002604 + +030078d2 : + 30078d2: 1101 addi sp,sp,-32 + 30078d4: ce22 sw s0,28(sp) + 30078d6: 1000 addi s0,sp,32 + 30078d8: fea42623 sw a0,-20(s0) + 30078dc: 0001 nop + 30078de: 4472 lw s0,28(sp) + 30078e0: 6105 addi sp,sp,32 + 30078e2: 8082 ret + +030078e4 : + 30078e4: 1141 addi sp,sp,-16 + 30078e6: c606 sw ra,12(sp) + 30078e8: c422 sw s0,8(sp) + 30078ea: 0800 addi s0,sp,16 + 30078ec: 4585 li a1,1 + 30078ee: 14000537 lui a0,0x14000 + 30078f2: 3ff1 jal ra,30078ce + 30078f4: 3ac18793 addi a5,gp,940 # 40009e0 + 30078f8: 14000737 lui a4,0x14000 + 30078fc: c398 sw a4,0(a5) + 30078fe: 3ac18793 addi a5,gp,940 # 40009e0 + 3007902: 6771 lui a4,0x1c + 3007904: 20070713 addi a4,a4,512 # 1c200 + 3007908: c3d8 sw a4,4(a5) + 300790a: 3ac18793 addi a5,gp,940 # 40009e0 + 300790e: 470d li a4,3 + 3007910: c798 sw a4,8(a5) + 3007912: 3ac18793 addi a5,gp,940 # 40009e0 + 3007916: 0007a623 sw zero,12(a5) + 300791a: 3ac18793 addi a5,gp,940 # 40009e0 + 300791e: 4711 li a4,4 + 3007920: cb98 sw a4,16(a5) + 3007922: 3ac18793 addi a5,gp,940 # 40009e0 + 3007926: 4705 li a4,1 + 3007928: cbd8 sw a4,20(a5) + 300792a: 3ac18793 addi a5,gp,940 # 40009e0 + 300792e: 4705 li a4,1 + 3007930: cf98 sw a4,24(a5) + 3007932: 3ac18793 addi a5,gp,940 # 40009e0 + 3007936: 4705 li a4,1 + 3007938: 02e78623 sb a4,44(a5) + 300793c: 3ac18793 addi a5,gp,940 # 40009e0 + 3007940: 4721 li a4,8 + 3007942: db98 sw a4,48(a5) + 3007944: 3ac18793 addi a5,gp,940 # 40009e0 + 3007948: 4721 li a4,8 + 300794a: dbd8 sw a4,52(a5) + 300794c: 3ac18793 addi a5,gp,940 # 40009e0 + 3007950: 0207ac23 sw zero,56(a5) + 3007954: 3ac18793 addi a5,gp,940 # 40009e0 + 3007958: 0607ac23 sw zero,120(a5) + 300795c: 3ac18793 addi a5,gp,940 # 40009e0 + 3007960: 06078e23 sb zero,124(a5) + 3007964: 3ac18513 addi a0,gp,940 # 40009e0 + 3007968: b7bfe0ef jal ra,30064e2 + 300796c: 030087b7 lui a5,0x3008 + 3007970: 8d278613 addi a2,a5,-1838 # 30078d2 + 3007974: 4581 li a1,0 + 3007976: 3ac18513 addi a0,gp,940 # 40009e0 + 300797a: c82ff0ef jal ra,3006dfc + 300797e: 030077b7 lui a5,0x3007 + 3007982: f0e78613 addi a2,a5,-242 # 3006f0e + 3007986: 4585 li a1,1 + 3007988: 3ac18513 addi a0,gp,940 # 40009e0 + 300798c: c70ff0ef jal ra,3006dfc + 3007990: 3ac18613 addi a2,gp,940 # 40009e0 + 3007994: 030077b7 lui a5,0x3007 + 3007998: c9e78593 addi a1,a5,-866 # 3006c9e + 300799c: 4571 li a0,28 + 300799e: 2839 jal ra,30079bc + 30079a0: 458d li a1,3 + 30079a2: 4571 li a0,28 + 30079a4: 2811 jal ra,30079b8 + 30079a6: 4571 li a0,28 + 30079a8: 2031 jal ra,30079b4 + 30079aa: 0001 nop + 30079ac: 40b2 lw ra,12(sp) + 30079ae: 4422 lw s0,8(sp) + 30079b0: 0141 addi sp,sp,16 + 30079b2: 8082 ret + +030079b4 : + 30079b4: ab1f906f j 3001464 + +030079b8 : + 30079b8: 9fafa06f j 3001bb2 + +030079bc : + 30079bc: a27f906f j 30013e2 + +030079c0 : + 30079c0: 1141 addi sp,sp,-16 + 30079c2: c606 sw ra,12(sp) + 30079c4: c422 sw s0,8(sp) + 30079c6: 0800 addi s0,sp,16 + 30079c8: 4585 li a1,1 + 30079ca: 14100537 lui a0,0x14100 + 30079ce: 3701 jal ra,30078ce + 30079d0: 42c18793 addi a5,gp,1068 # 4000a60 + 30079d4: 14100737 lui a4,0x14100 + 30079d8: c398 sw a4,0(a5) + 30079da: 42c18793 addi a5,gp,1068 # 4000a60 + 30079de: 4705 li a4,1 + 30079e0: c3d8 sw a4,4(a5) + 30079e2: 42c18793 addi a5,gp,1068 # 4000a60 + 30079e6: 0007a423 sw zero,8(a5) + 30079ea: 42c18793 addi a5,gp,1068 # 4000a60 + 30079ee: 4729 li a4,10 + 30079f0: cb98 sw a4,16(a5) + 30079f2: 42c18793 addi a5,gp,1068 # 4000a60 + 30079f6: 00062737 lui a4,0x62 + 30079fa: a8070713 addi a4,a4,-1408 # 61a80 + 30079fe: cbd8 sw a4,20(a5) + 3007a00: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a04: 0207a023 sw zero,32(a5) + 3007a08: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a0c: 0007ac23 sw zero,24(a5) + 3007a10: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a14: 0407ac23 sw zero,88(a5) + 3007a18: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a1c: 0407ae23 sw zero,92(a5) + 3007a20: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a24: 6709 lui a4,0x2 + 3007a26: 71070713 addi a4,a4,1808 # 2710 + 3007a2a: d7d8 sw a4,44(a5) + 3007a2c: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a30: 0407a223 sw zero,68(a5) + 3007a34: 42c18513 addi a0,gp,1068 # 4000a60 + 3007a38: be5fd0ef jal ra,300561c + 3007a3c: 0001 nop + 3007a3e: 40b2 lw ra,12(sp) + 3007a40: 4422 lw s0,8(sp) + 3007a42: 0141 addi sp,sp,16 + 3007a44: 8082 ret + +03007a46 : + 3007a46: 1141 addi sp,sp,-16 + 3007a48: c606 sw ra,12(sp) + 3007a4a: c422 sw s0,8(sp) + 3007a4c: 0800 addi s0,sp,16 + 3007a4e: 10100737 lui a4,0x10100 + 3007a52: 4f1c lw a5,24(a4) + 3007a54: 9bbd andi a5,a5,-17 + 3007a56: cf1c sw a5,24(a4) + 3007a58: 10100737 lui a4,0x10100 + 3007a5c: 4f1c lw a5,24(a4) + 3007a5e: 0017e793 ori a5,a5,1 + 3007a62: cf1c sw a5,24(a4) + 3007a64: 018807b7 lui a5,0x1880 + 3007a68: 2b178513 addi a0,a5,689 # 18802b1 + 3007a6c: 211d jal ra,3007e92 + 3007a6e: 4581 li a1,0 + 3007a70: 018807b7 lui a5,0x1880 + 3007a74: 2b178513 addi a0,a5,689 # 18802b1 + 3007a78: 2919 jal ra,3007e8e + 3007a7a: 4581 li a1,0 + 3007a7c: 018807b7 lui a5,0x1880 + 3007a80: 2b178513 addi a0,a5,689 # 18802b1 + 3007a84: 2119 jal ra,3007e8a + 3007a86: 4585 li a1,1 + 3007a88: 018807b7 lui a5,0x1880 + 3007a8c: 2b178513 addi a0,a5,689 # 18802b1 + 3007a90: 2edd jal ra,3007e86 + 3007a92: 4589 li a1,2 + 3007a94: 018807b7 lui a5,0x1880 + 3007a98: 2b178513 addi a0,a5,689 # 18802b1 + 3007a9c: 26dd jal ra,3007e82 + 3007a9e: 018c07b7 lui a5,0x18c0 + 3007aa2: 31178513 addi a0,a5,785 # 18c0311 + 3007aa6: 26f5 jal ra,3007e92 + 3007aa8: 4581 li a1,0 + 3007aaa: 018c07b7 lui a5,0x18c0 + 3007aae: 31178513 addi a0,a5,785 # 18c0311 + 3007ab2: 2ef1 jal ra,3007e8e + 3007ab4: 4581 li a1,0 + 3007ab6: 018c07b7 lui a5,0x18c0 + 3007aba: 31178513 addi a0,a5,785 # 18c0311 + 3007abe: 26f1 jal ra,3007e8a + 3007ac0: 4585 li a1,1 + 3007ac2: 018c07b7 lui a5,0x18c0 + 3007ac6: 31178513 addi a0,a5,785 # 18c0311 + 3007aca: 2e75 jal ra,3007e86 + 3007acc: 4589 li a1,2 + 3007ace: 018c07b7 lui a5,0x18c0 + 3007ad2: 31178513 addi a0,a5,785 # 18c0311 + 3007ad6: 2675 jal ra,3007e82 + 3007ad8: 01a007b7 lui a5,0x1a00 + 3007adc: 22278513 addi a0,a5,546 # 1a00222 + 3007ae0: 2e4d jal ra,3007e92 + 3007ae2: 4581 li a1,0 + 3007ae4: 01a007b7 lui a5,0x1a00 + 3007ae8: 22278513 addi a0,a5,546 # 1a00222 + 3007aec: 264d jal ra,3007e8e + 3007aee: 4581 li a1,0 + 3007af0: 01a007b7 lui a5,0x1a00 + 3007af4: 22278513 addi a0,a5,546 # 1a00222 + 3007af8: 2e49 jal ra,3007e8a + 3007afa: 4585 li a1,1 + 3007afc: 01a007b7 lui a5,0x1a00 + 3007b00: 22278513 addi a0,a5,546 # 1a00222 + 3007b04: 2649 jal ra,3007e86 + 3007b06: 4589 li a1,2 + 3007b08: 01a007b7 lui a5,0x1a00 + 3007b0c: 22278513 addi a0,a5,546 # 1a00222 + 3007b10: 2e8d jal ra,3007e82 + 3007b12: 011407b7 lui a5,0x1140 + 3007b16: 23178513 addi a0,a5,561 # 1140231 + 3007b1a: 2ea5 jal ra,3007e92 + 3007b1c: 4581 li a1,0 + 3007b1e: 011407b7 lui a5,0x1140 + 3007b22: 23178513 addi a0,a5,561 # 1140231 + 3007b26: 26a5 jal ra,3007e8e + 3007b28: 4581 li a1,0 + 3007b2a: 011407b7 lui a5,0x1140 + 3007b2e: 23178513 addi a0,a5,561 # 1140231 + 3007b32: 2ea1 jal ra,3007e8a + 3007b34: 4585 li a1,1 + 3007b36: 011407b7 lui a5,0x1140 + 3007b3a: 23178513 addi a0,a5,561 # 1140231 + 3007b3e: 26a1 jal ra,3007e86 + 3007b40: 4589 li a1,2 + 3007b42: 011407b7 lui a5,0x1140 + 3007b46: 23178513 addi a0,a5,561 # 1140231 + 3007b4a: 2e25 jal ra,3007e82 + 3007b4c: 011807b7 lui a5,0x1180 + 3007b50: 23178513 addi a0,a5,561 # 1180231 + 3007b54: 2e3d jal ra,3007e92 + 3007b56: 4581 li a1,0 + 3007b58: 011807b7 lui a5,0x1180 + 3007b5c: 23178513 addi a0,a5,561 # 1180231 + 3007b60: 263d jal ra,3007e8e + 3007b62: 4581 li a1,0 + 3007b64: 011807b7 lui a5,0x1180 + 3007b68: 23178513 addi a0,a5,561 # 1180231 + 3007b6c: 2e39 jal ra,3007e8a + 3007b6e: 4585 li a1,1 + 3007b70: 011807b7 lui a5,0x1180 + 3007b74: 23178513 addi a0,a5,561 # 1180231 + 3007b78: 2639 jal ra,3007e86 + 3007b7a: 4589 li a1,2 + 3007b7c: 011807b7 lui a5,0x1180 + 3007b80: 23178513 addi a0,a5,561 # 1180231 + 3007b84: 2cfd jal ra,3007e82 + 3007b86: 019007b7 lui a5,0x1900 + 3007b8a: 23378513 addi a0,a5,563 # 1900233 + 3007b8e: 2611 jal ra,3007e92 + 3007b90: 4581 li a1,0 + 3007b92: 019007b7 lui a5,0x1900 + 3007b96: 23378513 addi a0,a5,563 # 1900233 + 3007b9a: 2cd5 jal ra,3007e8e + 3007b9c: 4581 li a1,0 + 3007b9e: 019007b7 lui a5,0x1900 + 3007ba2: 23378513 addi a0,a5,563 # 1900233 + 3007ba6: 24d5 jal ra,3007e8a + 3007ba8: 4585 li a1,1 + 3007baa: 019007b7 lui a5,0x1900 + 3007bae: 23378513 addi a0,a5,563 # 1900233 + 3007bb2: 2cd1 jal ra,3007e86 + 3007bb4: 4589 li a1,2 + 3007bb6: 019007b7 lui a5,0x1900 + 3007bba: 23378513 addi a0,a5,563 # 1900233 + 3007bbe: 24d1 jal ra,3007e82 + 3007bc0: 019407b7 lui a5,0x1940 + 3007bc4: 23378513 addi a0,a5,563 # 1940233 + 3007bc8: 24e9 jal ra,3007e92 + 3007bca: 4589 li a1,2 + 3007bcc: 019407b7 lui a5,0x1940 + 3007bd0: 23378513 addi a0,a5,563 # 1940233 + 3007bd4: 2c6d jal ra,3007e8e + 3007bd6: 4581 li a1,0 + 3007bd8: 019407b7 lui a5,0x1940 + 3007bdc: 23378513 addi a0,a5,563 # 1940233 + 3007be0: 246d jal ra,3007e8a + 3007be2: 4585 li a1,1 + 3007be4: 019407b7 lui a5,0x1940 + 3007be8: 23378513 addi a0,a5,563 # 1940233 + 3007bec: 2c69 jal ra,3007e86 + 3007bee: 4589 li a1,2 + 3007bf0: 019407b7 lui a5,0x1940 + 3007bf4: 23378513 addi a0,a5,563 # 1940233 + 3007bf8: 2469 jal ra,3007e82 + 3007bfa: 016c07b7 lui a5,0x16c0 + 3007bfe: 23078513 addi a0,a5,560 # 16c0230 + 3007c02: 2c41 jal ra,3007e92 + 3007c04: 4581 li a1,0 + 3007c06: 016c07b7 lui a5,0x16c0 + 3007c0a: 23078513 addi a0,a5,560 # 16c0230 + 3007c0e: 2441 jal ra,3007e8e + 3007c10: 4581 li a1,0 + 3007c12: 016c07b7 lui a5,0x16c0 + 3007c16: 23078513 addi a0,a5,560 # 16c0230 + 3007c1a: 2c85 jal ra,3007e8a + 3007c1c: 4585 li a1,1 + 3007c1e: 016c07b7 lui a5,0x16c0 + 3007c22: 23078513 addi a0,a5,560 # 16c0230 + 3007c26: 2485 jal ra,3007e86 + 3007c28: 4589 li a1,2 + 3007c2a: 016c07b7 lui a5,0x16c0 + 3007c2e: 23078513 addi a0,a5,560 # 16c0230 + 3007c32: 2c81 jal ra,3007e82 + 3007c34: 014407b7 lui a5,0x1440 + 3007c38: 23078513 addi a0,a5,560 # 1440230 + 3007c3c: 2c99 jal ra,3007e92 + 3007c3e: 4581 li a1,0 + 3007c40: 014407b7 lui a5,0x1440 + 3007c44: 23078513 addi a0,a5,560 # 1440230 + 3007c48: 2499 jal ra,3007e8e + 3007c4a: 4581 li a1,0 + 3007c4c: 014407b7 lui a5,0x1440 + 3007c50: 23078513 addi a0,a5,560 # 1440230 + 3007c54: 2c1d jal ra,3007e8a + 3007c56: 4585 li a1,1 + 3007c58: 014407b7 lui a5,0x1440 + 3007c5c: 23078513 addi a0,a5,560 # 1440230 + 3007c60: 241d jal ra,3007e86 + 3007c62: 4589 li a1,2 + 3007c64: 014407b7 lui a5,0x1440 + 3007c68: 23078513 addi a0,a5,560 # 1440230 + 3007c6c: 2c19 jal ra,3007e82 + 3007c6e: 012007b7 lui a5,0x1200 + 3007c72: 23078513 addi a0,a5,560 # 1200230 + 3007c76: 2c31 jal ra,3007e92 + 3007c78: 4581 li a1,0 + 3007c7a: 012007b7 lui a5,0x1200 + 3007c7e: 23078513 addi a0,a5,560 # 1200230 + 3007c82: 2431 jal ra,3007e8e + 3007c84: 4581 li a1,0 + 3007c86: 012007b7 lui a5,0x1200 + 3007c8a: 23078513 addi a0,a5,560 # 1200230 + 3007c8e: 2af5 jal ra,3007e8a + 3007c90: 4585 li a1,1 + 3007c92: 012007b7 lui a5,0x1200 + 3007c96: 23078513 addi a0,a5,560 # 1200230 + 3007c9a: 22f5 jal ra,3007e86 + 3007c9c: 4589 li a1,2 + 3007c9e: 012007b7 lui a5,0x1200 + 3007ca2: 23078513 addi a0,a5,560 # 1200230 + 3007ca6: 2af1 jal ra,3007e82 + 3007ca8: 011c07b7 lui a5,0x11c0 + 3007cac: 23078513 addi a0,a5,560 # 11c0230 + 3007cb0: 22cd jal ra,3007e92 + 3007cb2: 4581 li a1,0 + 3007cb4: 011c07b7 lui a5,0x11c0 + 3007cb8: 23078513 addi a0,a5,560 # 11c0230 + 3007cbc: 2ac9 jal ra,3007e8e + 3007cbe: 4581 li a1,0 + 3007cc0: 011c07b7 lui a5,0x11c0 + 3007cc4: 23078513 addi a0,a5,560 # 11c0230 + 3007cc8: 22c9 jal ra,3007e8a + 3007cca: 4585 li a1,1 + 3007ccc: 011c07b7 lui a5,0x11c0 + 3007cd0: 23078513 addi a0,a5,560 # 11c0230 + 3007cd4: 2a4d jal ra,3007e86 + 3007cd6: 4589 li a1,2 + 3007cd8: 011c07b7 lui a5,0x11c0 + 3007cdc: 23078513 addi a0,a5,560 # 11c0230 + 3007ce0: 224d jal ra,3007e82 + 3007ce2: 010407b7 lui a5,0x1040 + 3007ce6: 23078513 addi a0,a5,560 # 1040230 + 3007cea: 2265 jal ra,3007e92 + 3007cec: 4581 li a1,0 + 3007cee: 010407b7 lui a5,0x1040 + 3007cf2: 23078513 addi a0,a5,560 # 1040230 + 3007cf6: 2a61 jal ra,3007e8e + 3007cf8: 4581 li a1,0 + 3007cfa: 010407b7 lui a5,0x1040 + 3007cfe: 23078513 addi a0,a5,560 # 1040230 + 3007d02: 2261 jal ra,3007e8a + 3007d04: 4585 li a1,1 + 3007d06: 010407b7 lui a5,0x1040 + 3007d0a: 23078513 addi a0,a5,560 # 1040230 + 3007d0e: 2aa5 jal ra,3007e86 + 3007d10: 4589 li a1,2 + 3007d12: 010407b7 lui a5,0x1040 + 3007d16: 23078513 addi a0,a5,560 # 1040230 + 3007d1a: 22a5 jal ra,3007e82 + 3007d1c: 012407b7 lui a5,0x1240 + 3007d20: 23078513 addi a0,a5,560 # 1240230 + 3007d24: 22bd jal ra,3007e92 + 3007d26: 4581 li a1,0 + 3007d28: 012407b7 lui a5,0x1240 + 3007d2c: 23078513 addi a0,a5,560 # 1240230 + 3007d30: 2ab9 jal ra,3007e8e + 3007d32: 4581 li a1,0 + 3007d34: 012407b7 lui a5,0x1240 + 3007d38: 23078513 addi a0,a5,560 # 1240230 + 3007d3c: 22b9 jal ra,3007e8a + 3007d3e: 4585 li a1,1 + 3007d40: 012407b7 lui a5,0x1240 + 3007d44: 23078513 addi a0,a5,560 # 1240230 + 3007d48: 2a3d jal ra,3007e86 + 3007d4a: 4589 li a1,2 + 3007d4c: 012407b7 lui a5,0x1240 + 3007d50: 23078513 addi a0,a5,560 # 1240230 + 3007d54: 223d jal ra,3007e82 + 3007d56: 016407b7 lui a5,0x1640 + 3007d5a: 23278513 addi a0,a5,562 # 1640232 + 3007d5e: 2a15 jal ra,3007e92 + 3007d60: 4581 li a1,0 + 3007d62: 016407b7 lui a5,0x1640 + 3007d66: 23278513 addi a0,a5,562 # 1640232 + 3007d6a: 2215 jal ra,3007e8e + 3007d6c: 4581 li a1,0 + 3007d6e: 016407b7 lui a5,0x1640 + 3007d72: 23278513 addi a0,a5,562 # 1640232 + 3007d76: 2a11 jal ra,3007e8a + 3007d78: 4585 li a1,1 + 3007d7a: 016407b7 lui a5,0x1640 + 3007d7e: 23278513 addi a0,a5,562 # 1640232 + 3007d82: 2211 jal ra,3007e86 + 3007d84: 4589 li a1,2 + 3007d86: 016407b7 lui a5,0x1640 + 3007d8a: 23278513 addi a0,a5,562 # 1640232 + 3007d8e: 28d5 jal ra,3007e82 + 3007d90: 016007b7 lui a5,0x1600 + 3007d94: 23278513 addi a0,a5,562 # 1600232 + 3007d98: 28ed jal ra,3007e92 + 3007d9a: 4581 li a1,0 + 3007d9c: 016007b7 lui a5,0x1600 + 3007da0: 23278513 addi a0,a5,562 # 1600232 + 3007da4: 20ed jal ra,3007e8e + 3007da6: 4581 li a1,0 + 3007da8: 016007b7 lui a5,0x1600 + 3007dac: 23278513 addi a0,a5,562 # 1600232 + 3007db0: 28e9 jal ra,3007e8a + 3007db2: 4585 li a1,1 + 3007db4: 016007b7 lui a5,0x1600 + 3007db8: 23278513 addi a0,a5,562 # 1600232 + 3007dbc: 20e9 jal ra,3007e86 + 3007dbe: 4589 li a1,2 + 3007dc0: 016007b7 lui a5,0x1600 + 3007dc4: 23278513 addi a0,a5,562 # 1600232 + 3007dc8: 286d jal ra,3007e82 + 3007dca: 017407b7 lui a5,0x1740 + 3007dce: 23078513 addi a0,a5,560 # 1740230 + 3007dd2: 20c1 jal ra,3007e92 + 3007dd4: 4581 li a1,0 + 3007dd6: 017407b7 lui a5,0x1740 + 3007dda: 23078513 addi a0,a5,560 # 1740230 + 3007dde: 2845 jal ra,3007e8e + 3007de0: 4581 li a1,0 + 3007de2: 017407b7 lui a5,0x1740 + 3007de6: 23078513 addi a0,a5,560 # 1740230 + 3007dea: 2045 jal ra,3007e8a + 3007dec: 4585 li a1,1 + 3007dee: 017407b7 lui a5,0x1740 + 3007df2: 23078513 addi a0,a5,560 # 1740230 + 3007df6: 2841 jal ra,3007e86 + 3007df8: 4589 li a1,2 + 3007dfa: 017407b7 lui a5,0x1740 + 3007dfe: 23078513 addi a0,a5,560 # 1740230 + 3007e02: 2041 jal ra,3007e82 + 3007e04: 017007b7 lui a5,0x1700 + 3007e08: 23078513 addi a0,a5,560 # 1700230 + 3007e0c: 2059 jal ra,3007e92 + 3007e0e: 4581 li a1,0 + 3007e10: 017007b7 lui a5,0x1700 + 3007e14: 23078513 addi a0,a5,560 # 1700230 + 3007e18: 289d jal ra,3007e8e + 3007e1a: 4581 li a1,0 + 3007e1c: 017007b7 lui a5,0x1700 + 3007e20: 23078513 addi a0,a5,560 # 1700230 + 3007e24: 209d jal ra,3007e8a + 3007e26: 4585 li a1,1 + 3007e28: 017007b7 lui a5,0x1700 + 3007e2c: 23078513 addi a0,a5,560 # 1700230 + 3007e30: 2899 jal ra,3007e86 + 3007e32: 4589 li a1,2 + 3007e34: 017007b7 lui a5,0x1700 + 3007e38: 23078513 addi a0,a5,560 # 1700230 + 3007e3c: 2099 jal ra,3007e82 + 3007e3e: 018007b7 lui a5,0x1800 + 3007e42: 23078513 addi a0,a5,560 # 1800230 + 3007e46: 20b1 jal ra,3007e92 + 3007e48: 4581 li a1,0 + 3007e4a: 018007b7 lui a5,0x1800 + 3007e4e: 23078513 addi a0,a5,560 # 1800230 + 3007e52: 2835 jal ra,3007e8e + 3007e54: 4581 li a1,0 + 3007e56: 018007b7 lui a5,0x1800 + 3007e5a: 23078513 addi a0,a5,560 # 1800230 + 3007e5e: 2035 jal ra,3007e8a + 3007e60: 4585 li a1,1 + 3007e62: 018007b7 lui a5,0x1800 + 3007e66: 23078513 addi a0,a5,560 # 1800230 + 3007e6a: 2831 jal ra,3007e86 + 3007e6c: 4589 li a1,2 + 3007e6e: 018007b7 lui a5,0x1800 + 3007e72: 23078513 addi a0,a5,560 # 1800230 + 3007e76: 2031 jal ra,3007e82 + 3007e78: 0001 nop + 3007e7a: 40b2 lw ra,12(sp) + 3007e7c: 4422 lw s0,8(sp) + 3007e7e: 0141 addi sp,sp,16 + 3007e80: 8082 ret + +03007e82 : + 3007e82: e07fd06f j 3005c88 + +03007e86 : + 3007e86: db7fd06f j 3005c3c + +03007e8a : + 3007e8a: d67fd06f j 3005bf0 + +03007e8e : + 3007e8e: d17fd06f j 3005ba4 + +03007e92 : + 3007e92: cd9fd06f j 3005b6a + +03007e96 : + 3007e96: 1141 addi sp,sp,-16 + 3007e98: c606 sw ra,12(sp) + 3007e9a: c422 sw s0,8(sp) + 3007e9c: 0800 addi s0,sp,16 + 3007e9e: 3665 jal ra,3007a46 + 3007ea0: 3491 jal ra,30078e4 + 3007ea2: 3e39 jal ra,30079c0 + 3007ea4: f9eff0ef jal ra,3007642 + 3007ea8: 3035 jal ra,30076d4 + 3007eaa: 3875 jal ra,3007766 + 3007eac: 3a99 jal ra,3007802 + 3007eae: d6cff0ef jal ra,300741a + 3007eb2: 0001 nop + 3007eb4: 40b2 lw ra,12(sp) + 3007eb6: 4422 lw s0,8(sp) + 3007eb8: 0141 addi sp,sp,16 + 3007eba: 8082 ret + +03007ebc : + 3007ebc: 1101 addi sp,sp,-32 + 3007ebe: ce06 sw ra,28(sp) + 3007ec0: cc22 sw s0,24(sp) + 3007ec2: 1000 addi s0,sp,32 + 3007ec4: 87aa mv a5,a0 + 3007ec6: 86ae mv a3,a1 + 3007ec8: 8732 mv a4,a2 + 3007eca: fef407a3 sb a5,-17(s0) + 3007ece: 87b6 mv a5,a3 + 3007ed0: fef40723 sb a5,-18(s0) + 3007ed4: 87ba mv a5,a4 + 3007ed6: fef406a3 sb a5,-19(s0) + 3007eda: fef44703 lbu a4,-17(s0) + 3007ede: 4789 li a5,2 + 3007ee0: 04f71163 bne a4,a5,3007f22 + 3007ee4: fee44783 lbu a5,-18(s0) + 3007ee8: 863e mv a2,a5 + 3007eea: 02000593 li a1,32 + 3007eee: 52418513 addi a0,gp,1316 # 4000b58 + 3007ef2: 28bd jal ra,3007f70 + 3007ef4: fed44783 lbu a5,-19(s0) + 3007ef8: 863e mv a2,a5 + 3007efa: 04000593 li a1,64 + 3007efe: 52418513 addi a0,gp,1316 # 4000b58 + 3007f02: 20bd jal ra,3007f70 + 3007f04: fee44783 lbu a5,-18(s0) + 3007f08: 863e mv a2,a5 + 3007f0a: 45a1 li a1,8 + 3007f0c: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f10: 2085 jal ra,3007f70 + 3007f12: fed44783 lbu a5,-19(s0) + 3007f16: 863e mv a2,a5 + 3007f18: 4589 li a1,2 + 3007f1a: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f1e: 2889 jal ra,3007f70 + 3007f20: a099 j 3007f66 + 3007f22: fef44783 lbu a5,-17(s0) + 3007f26: e395 bnez a5,3007f4a + 3007f28: fee44783 lbu a5,-18(s0) + 3007f2c: 863e mv a2,a5 + 3007f2e: 02000593 li a1,32 + 3007f32: 52418513 addi a0,gp,1316 # 4000b58 + 3007f36: 282d jal ra,3007f70 + 3007f38: fed44783 lbu a5,-19(s0) + 3007f3c: 863e mv a2,a5 + 3007f3e: 04000593 li a1,64 + 3007f42: 52418513 addi a0,gp,1316 # 4000b58 + 3007f46: 202d jal ra,3007f70 + 3007f48: a839 j 3007f66 + 3007f4a: fee44783 lbu a5,-18(s0) + 3007f4e: 863e mv a2,a5 + 3007f50: 45a1 li a1,8 + 3007f52: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f56: 2829 jal ra,3007f70 + 3007f58: fed44783 lbu a5,-19(s0) + 3007f5c: 863e mv a2,a5 + 3007f5e: 4589 li a1,2 + 3007f60: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f64: 2031 jal ra,3007f70 + 3007f66: 0001 nop + 3007f68: 40f2 lw ra,28(sp) + 3007f6a: 4462 lw s0,24(sp) + 3007f6c: 6105 addi sp,sp,32 + 3007f6e: 8082 ret + +03007f70 : + 3007f70: c54fc06f j 30043c4 + +03007f74 : + 3007f74: 7139 addi sp,sp,-64 + 3007f76: de06 sw ra,60(sp) + 3007f78: dc22 sw s0,56(sp) + 3007f7a: 0080 addi s0,sp,64 + 3007f7c: fca42623 sw a0,-52(s0) + 3007f80: fcb42423 sw a1,-56(s0) + 3007f84: fe040793 addi a5,s0,-32 + 3007f88: 85be mv a1,a5 + 3007f8a: 2e818513 addi a0,gp,744 # 400091c + 3007f8e: 2631 jal ra,300829a + 3007f90: fd040793 addi a5,s0,-48 + 3007f94: 85be mv a1,a5 + 3007f96: 31c18513 addi a0,gp,796 # 4000950 + 3007f9a: 2601 jal ra,300829a + 3007f9c: 2e818793 addi a5,gp,744 # 400091c + 3007fa0: 439c lw a5,0(a5) + 3007fa2: fc842703 lw a4,-56(s0) + 3007fa6: cfd8 sw a4,28(a5) + 3007fa8: 31c18793 addi a5,gp,796 # 4000950 + 3007fac: 439c lw a5,0(a5) + 3007fae: fcc42703 lw a4,-52(s0) + 3007fb2: cfd8 sw a4,28(a5) + 3007fb4: fec42683 lw a3,-20(s0) + 3007fb8: 2e818793 addi a5,gp,744 # 400091c + 3007fbc: 4398 lw a4,0(a5) + 3007fbe: 87b6 mv a5,a3 + 3007fc0: 8b8d andi a5,a5,3 + 3007fc2: 0ff7f693 andi a3,a5,255 + 3007fc6: 10072783 lw a5,256(a4) # 10100100 + 3007fca: 8a8d andi a3,a3,3 + 3007fcc: 0692 slli a3,a3,0x4 + 3007fce: fcf7f793 andi a5,a5,-49 + 3007fd2: 8fd5 or a5,a5,a3 + 3007fd4: 10f72023 sw a5,256(a4) + 3007fd8: fdc42683 lw a3,-36(s0) + 3007fdc: 31c18793 addi a5,gp,796 # 4000950 + 3007fe0: 4398 lw a4,0(a5) + 3007fe2: 87b6 mv a5,a3 + 3007fe4: 8b8d andi a5,a5,3 + 3007fe6: 0ff7f693 andi a3,a5,255 + 3007fea: 10072783 lw a5,256(a4) + 3007fee: 8a8d andi a3,a3,3 + 3007ff0: 0692 slli a3,a3,0x4 + 3007ff2: fcf7f793 andi a5,a5,-49 + 3007ff6: 8fd5 or a5,a5,a3 + 3007ff8: 10f72023 sw a5,256(a4) + 3007ffc: 0001 nop + 3007ffe: 50f2 lw ra,60(sp) + 3008000: 5462 lw s0,56(sp) + 3008002: 6121 addi sp,sp,64 + 3008004: 8082 ret + +03008006 : + 3008006: 7139 addi sp,sp,-64 + 3008008: de06 sw ra,60(sp) + 300800a: dc22 sw s0,56(sp) + 300800c: 0080 addi s0,sp,64 + 300800e: fca42627 fsw fa0,-52(s0) + 3008012: fcb42427 fsw fa1,-56(s0) + 3008016: fca42223 sw a0,-60(s0) + 300801a: fcb42023 sw a1,-64(s0) + 300801e: fe042623 sw zero,-20(s0) + 3008022: fe042423 sw zero,-24(s0) + 3008026: fe042223 sw zero,-28(s0) + 300802a: fe042023 sw zero,-32(s0) + 300802e: fc042e23 sw zero,-36(s0) + 3008032: fc042c23 sw zero,-40(s0) + 3008036: fc442783 lw a5,-60(s0) + 300803a: d017f753 fcvt.s.wu fa4,a5 + 300803e: fcc42787 flw fa5,-52(s0) + 3008042: 08f777d3 fsub.s fa5,fa4,fa5 + 3008046: fef42627 fsw fa5,-20(s0) + 300804a: fec42787 flw fa5,-20(s0) + 300804e: fef42227 fsw fa5,-28(s0) + 3008052: 5fc1a787 flw fa5,1532(gp) # 4000c30 + 3008056: fec42707 flw fa4,-20(s0) + 300805a: 08f777d3 fsub.s fa5,fa4,fa5 + 300805e: fef42027 fsw fa5,-32(s0) + 3008062: 5fc1a787 flw fa5,1532(gp) # 4000c30 + 3008066: 00f7f7d3 fadd.s fa5,fa5,fa5 + 300806a: fec42707 flw fa4,-20(s0) + 300806e: 08f77753 fsub.s fa4,fa4,fa5 + 3008072: 6001a787 flw fa5,1536(gp) # 4000c34 + 3008076: 00f777d3 fadd.s fa5,fa4,fa5 + 300807a: fcf42e27 fsw fa5,-36(s0) + 300807e: acc1a707 flw fa4,-1332(gp) # 4000100 + 3008082: fe442787 flw fa5,-28(s0) + 3008086: 10f77753 fmul.s fa4,fa4,fa5 + 300808a: ad01a687 flw fa3,-1328(gp) # 4000104 + 300808e: fe042787 flw fa5,-32(s0) + 3008092: 10f6f7d3 fmul.s fa5,fa3,fa5 + 3008096: 00f77753 fadd.s fa4,fa4,fa5 + 300809a: ad41a687 flw fa3,-1324(gp) # 4000108 + 300809e: fdc42787 flw fa5,-36(s0) + 30080a2: 10f6f7d3 fmul.s fa5,fa3,fa5 + 30080a6: 00f77753 fadd.s fa4,fa4,fa5 + 30080aa: 0300f7b7 lui a5,0x300f + 30080ae: 3b07a787 flw fa5,944(a5) # 300f3b0 + 30080b2: 00f777d3 fadd.s fa5,fa4,fa5 + 30080b6: fcf42c27 fsw fa5,-40(s0) + 30080ba: 60c1a783 lw a5,1548(gp) # 4000c40 + 30080be: d007f753 fcvt.s.w fa4,a5 + 30080c2: fd842787 flw fa5,-40(s0) + 30080c6: 00f777d3 fadd.s fa5,fa4,fa5 + 30080ca: c0079753 fcvt.w.s a4,fa5,rtz + 30080ce: 60e1a623 sw a4,1548(gp) # 4000c40 + 30080d2: 5fc1a787 flw fa5,1532(gp) # 4000c30 + 30080d6: 60f1a027 fsw fa5,1536(gp) # 4000c34 + 30080da: fec42787 flw fa5,-20(s0) + 30080de: 5ef1ae27 fsw fa5,1532(gp) # 4000c30 + 30080e2: fc042783 lw a5,-64(s0) + 30080e6: d017f753 fcvt.s.wu fa4,a5 + 30080ea: fc842787 flw fa5,-56(s0) + 30080ee: 08f777d3 fsub.s fa5,fa4,fa5 + 30080f2: fef42427 fsw fa5,-24(s0) + 30080f6: fe842787 flw fa5,-24(s0) + 30080fa: fef42227 fsw fa5,-28(s0) + 30080fe: 6041a787 flw fa5,1540(gp) # 4000c38 + 3008102: fe842707 flw fa4,-24(s0) + 3008106: 08f777d3 fsub.s fa5,fa4,fa5 + 300810a: fef42027 fsw fa5,-32(s0) + 300810e: 6041a787 flw fa5,1540(gp) # 4000c38 + 3008112: 00f7f7d3 fadd.s fa5,fa5,fa5 + 3008116: fe842707 flw fa4,-24(s0) + 300811a: 08f77753 fsub.s fa4,fa4,fa5 + 300811e: 6081a787 flw fa5,1544(gp) # 4000c3c + 3008122: 00f777d3 fadd.s fa5,fa4,fa5 + 3008126: fcf42e27 fsw fa5,-36(s0) + 300812a: acc1a707 flw fa4,-1332(gp) # 4000100 + 300812e: fe442787 flw fa5,-28(s0) + 3008132: 10f77753 fmul.s fa4,fa4,fa5 + 3008136: ad01a687 flw fa3,-1328(gp) # 4000104 + 300813a: fe042787 flw fa5,-32(s0) + 300813e: 10f6f7d3 fmul.s fa5,fa3,fa5 + 3008142: 00f77753 fadd.s fa4,fa4,fa5 + 3008146: ad41a687 flw fa3,-1324(gp) # 4000108 + 300814a: fdc42787 flw fa5,-36(s0) + 300814e: 10f6f7d3 fmul.s fa5,fa3,fa5 + 3008152: 00f777d3 fadd.s fa5,fa4,fa5 + 3008156: fcf42c27 fsw fa5,-40(s0) + 300815a: 6101a783 lw a5,1552(gp) # 4000c44 + 300815e: d007f753 fcvt.s.w fa4,a5 + 3008162: fd842787 flw fa5,-40(s0) + 3008166: 00f777d3 fadd.s fa5,fa4,fa5 + 300816a: c0079753 fcvt.w.s a4,fa5,rtz + 300816e: 60e1a823 sw a4,1552(gp) # 4000c44 + 3008172: 6041a787 flw fa5,1540(gp) # 4000c38 + 3008176: 60f1a427 fsw fa5,1544(gp) # 4000c3c + 300817a: fe842787 flw fa5,-24(s0) + 300817e: 60f1a227 fsw fa5,1540(gp) # 4000c38 + 3008182: 6101a783 lw a5,1552(gp) # 4000c44 + 3008186: 00f04563 bgtz a5,3008190 + 300818a: 4705 li a4,1 + 300818c: 60e1a823 sw a4,1552(gp) # 4000c44 + 3008190: 6101a703 lw a4,1552(gp) # 4000c44 + 3008194: 31f00793 li a5,799 + 3008198: 00e7d663 bge a5,a4,30081a4 + 300819c: 31f00713 li a4,799 + 30081a0: 60e1a823 sw a4,1552(gp) # 4000c44 + 30081a4: 60c1a783 lw a5,1548(gp) # 4000c40 + 30081a8: 00f04563 bgtz a5,30081b2 + 30081ac: 4705 li a4,1 + 30081ae: 60e1a623 sw a4,1548(gp) # 4000c40 + 30081b2: 60c1a703 lw a4,1548(gp) # 4000c40 + 30081b6: 31f00793 li a5,799 + 30081ba: 00e7d663 bge a5,a4,30081c6 + 30081be: 31f00713 li a4,799 + 30081c2: 60e1a623 sw a4,1548(gp) # 4000c40 + 30081c6: 60c1a783 lw a5,1548(gp) # 4000c40 + 30081ca: 873e mv a4,a5 + 30081cc: 6101a783 lw a5,1552(gp) # 4000c44 + 30081d0: 85be mv a1,a5 + 30081d2: 853a mv a0,a4 + 30081d4: 3345 jal ra,3007f74 + 30081d6: 0001 nop + 30081d8: 50f2 lw ra,60(sp) + 30081da: 5462 lw s0,56(sp) + 30081dc: 6121 addi sp,sp,64 + 30081de: 8082 ret + +030081e0 : + 30081e0: 715d addi sp,sp,-80 + 30081e2: c686 sw ra,76(sp) + 30081e4: c4a2 sw s0,72(sp) + 30081e6: 0880 addi s0,sp,80 + 30081e8: faa42e23 sw a0,-68(s0) + 30081ec: fab42c23 sw a1,-72(s0) + 30081f0: fec42783 lw a5,-20(s0) + 30081f4: 0017e793 ori a5,a5,1 + 30081f8: fef42623 sw a5,-20(s0) + 30081fc: 2e818793 addi a5,gp,744 # 400091c + 3008200: 439c lw a5,0(a5) + 3008202: fec42703 lw a4,-20(s0) + 3008206: 40e7a623 sw a4,1036(a5) + 300820a: 31c18793 addi a5,gp,796 # 4000950 + 300820e: 439c lw a5,0(a5) + 3008210: fec42703 lw a4,-20(s0) + 3008214: 40e7a623 sw a4,1036(a5) + 3008218: fdc40793 addi a5,s0,-36 + 300821c: 85be mv a1,a5 + 300821e: 2e818513 addi a0,gp,744 # 400091c + 3008222: 28a5 jal ra,300829a + 3008224: fcc40793 addi a5,s0,-52 + 3008228: 85be mv a1,a5 + 300822a: 31c18513 addi a0,gp,796 # 4000950 + 300822e: 20b5 jal ra,300829a + 3008230: 2e818793 addi a5,gp,744 # 400091c + 3008234: 439c lw a5,0(a5) + 3008236: fbc42703 lw a4,-68(s0) + 300823a: cfd8 sw a4,28(a5) + 300823c: 31c18793 addi a5,gp,796 # 4000950 + 3008240: 439c lw a5,0(a5) + 3008242: fb842703 lw a4,-72(s0) + 3008246: cfd8 sw a4,28(a5) + 3008248: fe842683 lw a3,-24(s0) + 300824c: 2e818793 addi a5,gp,744 # 400091c + 3008250: 4398 lw a4,0(a5) + 3008252: 87b6 mv a5,a3 + 3008254: 8b8d andi a5,a5,3 + 3008256: 0ff7f693 andi a3,a5,255 + 300825a: 10072783 lw a5,256(a4) + 300825e: 8a8d andi a3,a3,3 + 3008260: 0692 slli a3,a3,0x4 + 3008262: fcf7f793 andi a5,a5,-49 + 3008266: 8fd5 or a5,a5,a3 + 3008268: 10f72023 sw a5,256(a4) + 300826c: fd842683 lw a3,-40(s0) + 3008270: 31c18793 addi a5,gp,796 # 4000950 + 3008274: 4398 lw a4,0(a5) + 3008276: 87b6 mv a5,a3 + 3008278: 8b8d andi a5,a5,3 + 300827a: 0ff7f693 andi a3,a5,255 + 300827e: 10072783 lw a5,256(a4) + 3008282: 8a8d andi a3,a3,3 + 3008284: 0692 slli a3,a3,0x4 + 3008286: fcf7f793 andi a5,a5,-49 + 300828a: 8fd5 or a5,a5,a3 + 300828c: 10f72023 sw a5,256(a4) + 3008290: 0001 nop + 3008292: 40b6 lw ra,76(sp) + 3008294: 4426 lw s0,72(sp) + 3008296: 6161 addi sp,sp,80 + 3008298: 8082 ret + +0300829a : + 300829a: e87fc06f j 3005120 + +0300829e : + 300829e: 1101 addi sp,sp,-32 + 30082a0: ce06 sw ra,28(sp) + 30082a2: cc22 sw s0,24(sp) + 30082a4: 1000 addi s0,sp,32 + 30082a6: 87aa mv a5,a0 + 30082a8: fef407a3 sb a5,-17(s0) + 30082ac: fef44783 lbu a5,-17(s0) + 30082b0: cb85 beqz a5,30082e0 + 30082b2: 4601 li a2,0 + 30082b4: 4585 li a1,1 + 30082b6: 4509 li a0,2 + 30082b8: 3111 jal ra,3007ebc + 30082ba: 3e800593 li a1,1000 + 30082be: 4505 li a0,1 + 30082c0: 2afd jal ra,30084be + 30082c2: 2e818513 addi a0,gp,744 # 400091c + 30082c6: 22b5 jal ra,3008432 + 30082c8: 31c18513 addi a0,gp,796 # 4000950 + 30082cc: 229d jal ra,3008432 + 30082ce: 4721 li a4,8 + 30082d0: ace1a423 sw a4,-1336(gp) # 40000fc + 30082d4: 4705 li a4,1 + 30082d6: 2ae18b23 sb a4,694(gp) # 40008ea + 30082da: 2a018ba3 sb zero,695(gp) # 40008eb + 30082de: a015 j 3008302 + 30082e0: 2e818513 addi a0,gp,744 # 400091c + 30082e4: aa5fc0ef jal ra,3004d88 + 30082e8: 31c18513 addi a0,gp,796 # 4000950 + 30082ec: a9dfc0ef jal ra,3004d88 + 30082f0: 4601 li a2,0 + 30082f2: 4581 li a1,0 + 30082f4: 4509 li a0,2 + 30082f6: 36d9 jal ra,3007ebc + 30082f8: 2a018b23 sb zero,694(gp) # 40008ea + 30082fc: 4705 li a4,1 + 30082fe: 2ae18ba3 sb a4,695(gp) # 40008eb + 3008302: 0001 nop + 3008304: 40f2 lw ra,28(sp) + 3008306: 4462 lw s0,24(sp) + 3008308: 6105 addi sp,sp,32 + 300830a: 8082 ret + +0300830c : + 300830c: 1141 addi sp,sp,-16 + 300830e: c606 sw ra,12(sp) + 3008310: c422 sw s0,8(sp) + 3008312: 0800 addi s0,sp,16 + 3008314: 4605 li a2,1 + 3008316: 4581 li a1,0 + 3008318: 4505 li a0,1 + 300831a: 364d jal ra,3007ebc + 300831c: 4601 li a2,0 + 300831e: 4585 li a1,1 + 3008320: 4501 li a0,0 + 3008322: 3e69 jal ra,3007ebc + 3008324: 17100593 li a1,369 + 3008328: 17100513 li a0,369 + 300832c: 3d55 jal ra,30081e0 + 300832e: 4705 li a4,1 + 3008330: 2ae18b23 sb a4,694(gp) # 40008ea + 3008334: 3e800593 li a1,1000 + 3008338: 44c00513 li a0,1100 + 300833c: 2249 jal ra,30084be + 300833e: 4501 li a0,0 + 3008340: 3fb9 jal ra,300829e + 3008342: 0001 nop + 3008344: 40b2 lw ra,12(sp) + 3008346: 4422 lw s0,8(sp) + 3008348: 0141 addi sp,sp,16 + 300834a: 8082 ret + +0300834c : + 300834c: 1141 addi sp,sp,-16 + 300834e: c606 sw ra,12(sp) + 3008350: c422 sw s0,8(sp) + 3008352: 0800 addi s0,sp,16 + 3008354: 4605 li a2,1 + 3008356: 4581 li a1,0 + 3008358: 4501 li a0,0 + 300835a: 368d jal ra,3007ebc + 300835c: 4601 li a2,0 + 300835e: 4585 li a1,1 + 3008360: 4505 li a0,1 + 3008362: 3ea9 jal ra,3007ebc + 3008364: 18f00593 li a1,399 + 3008368: 17100513 li a0,369 + 300836c: 3d95 jal ra,30081e0 + 300836e: 4705 li a4,1 + 3008370: 2ae18b23 sb a4,694(gp) # 40008ea + 3008374: 3e800593 li a1,1000 + 3008378: 44c00513 li a0,1100 + 300837c: 2289 jal ra,30084be + 300837e: 4501 li a0,0 + 3008380: 3f39 jal ra,300829e + 3008382: 0001 nop + 3008384: 40b2 lw ra,12(sp) + 3008386: 4422 lw s0,8(sp) + 3008388: 0141 addi sp,sp,16 + 300838a: 8082 ret + +0300838c : + 300838c: 1141 addi sp,sp,-16 + 300838e: c606 sw ra,12(sp) + 3008390: c422 sw s0,8(sp) + 3008392: 0800 addi s0,sp,16 + 3008394: 4605 li a2,1 + 3008396: 4581 li a1,0 + 3008398: 4509 li a0,2 + 300839a: 360d jal ra,3007ebc + 300839c: 2e818513 addi a0,gp,744 # 400091c + 30083a0: 2849 jal ra,3008432 + 30083a2: 31c18513 addi a0,gp,796 # 4000950 + 30083a6: 2071 jal ra,3008432 + 30083a8: 4721 li a4,8 + 30083aa: ace1a423 sw a4,-1336(gp) # 40000fc + 30083ae: 4705 li a4,1 + 30083b0: 2ae18b23 sb a4,694(gp) # 40008ea + 30083b4: 0001 nop + 30083b6: 40b2 lw ra,12(sp) + 30083b8: 4422 lw s0,8(sp) + 30083ba: 0141 addi sp,sp,16 + 30083bc: 8082 ret + +030083be : + 30083be: 1141 addi sp,sp,-16 + 30083c0: c606 sw ra,12(sp) + 30083c2: c422 sw s0,8(sp) + 30083c4: 0800 addi s0,sp,16 + 30083c6: 4605 li a2,1 + 30083c8: 4581 li a1,0 + 30083ca: 4501 li a0,0 + 30083cc: 3cc5 jal ra,3007ebc + 30083ce: 4601 li a2,0 + 30083d0: 4585 li a1,1 + 30083d2: 4505 li a0,1 + 30083d4: 34e5 jal ra,3007ebc + 30083d6: 2e818513 addi a0,gp,744 # 400091c + 30083da: 28a1 jal ra,3008432 + 30083dc: 31c18513 addi a0,gp,796 # 4000950 + 30083e0: 2889 jal ra,3008432 + 30083e2: 4721 li a4,8 + 30083e4: ace1a423 sw a4,-1336(gp) # 40000fc + 30083e8: 4705 li a4,1 + 30083ea: 2ae18b23 sb a4,694(gp) # 40008ea + 30083ee: 0001 nop + 30083f0: 40b2 lw ra,12(sp) + 30083f2: 4422 lw s0,8(sp) + 30083f4: 0141 addi sp,sp,16 + 30083f6: 8082 ret + +030083f8 : + 30083f8: 1141 addi sp,sp,-16 + 30083fa: c606 sw ra,12(sp) + 30083fc: c422 sw s0,8(sp) + 30083fe: 0800 addi s0,sp,16 + 3008400: 4605 li a2,1 + 3008402: 4581 li a1,0 + 3008404: 4505 li a0,1 + 3008406: 3c5d jal ra,3007ebc + 3008408: 4601 li a2,0 + 300840a: 4585 li a1,1 + 300840c: 4501 li a0,0 + 300840e: 347d jal ra,3007ebc + 3008410: 2e818513 addi a0,gp,744 # 400091c + 3008414: 2839 jal ra,3008432 + 3008416: 31c18513 addi a0,gp,796 # 4000950 + 300841a: 2821 jal ra,3008432 + 300841c: 4721 li a4,8 + 300841e: ace1a423 sw a4,-1336(gp) # 40000fc + 3008422: 4705 li a4,1 + 3008424: 2ae18b23 sb a4,694(gp) # 40008ea + 3008428: 0001 nop + 300842a: 40b2 lw ra,12(sp) + 300842c: 4422 lw s0,8(sp) + 300842e: 0141 addi sp,sp,16 + 3008430: 8082 ret + +03008432 : + 3008432: 8c9fc06f j 3004cfa + +03008436 : + 3008436: 1141 addi sp,sp,-16 + 3008438: c606 sw ra,12(sp) + 300843a: c422 sw s0,8(sp) + 300843c: 0800 addi s0,sp,16 + 300843e: 4601 li a2,0 + 3008440: 4585 li a1,1 + 3008442: 4509 li a0,2 + 3008444: 3ca5 jal ra,3007ebc + 3008446: 1c100593 li a1,449 + 300844a: 19e00513 li a0,414 + 300844e: 3b49 jal ra,30081e0 + 3008450: 4585 li a1,1 + 3008452: 4525 li a0,9 + 3008454: 20ad jal ra,30084be + 3008456: 4501 li a0,0 + 3008458: 3599 jal ra,300829e + 300845a: 0001 nop + 300845c: 40b2 lw ra,12(sp) + 300845e: 4422 lw s0,8(sp) + 3008460: 0141 addi sp,sp,16 + 3008462: 8082 ret + +03008464 : + 3008464: 1101 addi sp,sp,-32 + 3008466: ce06 sw ra,28(sp) + 3008468: cc22 sw s0,24(sp) + 300846a: 1000 addi s0,sp,32 + 300846c: 4601 li a2,0 + 300846e: 4585 li a1,1 + 3008470: 4509 li a0,2 + 3008472: 34a9 jal ra,3007ebc + 3008474: 1c100593 li a1,449 + 3008478: 19e00513 li a0,414 + 300847c: 3395 jal ra,30081e0 + 300847e: 00f050ef jal ra,300dc8c + 3008482: 87aa mv a5,a0 + 3008484: fef41723 sh a5,-18(s0) + 3008488: fee45703 lhu a4,-18(s0) + 300848c: 2ee00793 li a5,750 + 3008490: 00e7f363 bgeu a5,a4,3008496 + 3008494: b7ed j 300847e + 3008496: 0001 nop + 3008498: 3d55 jal ra,300834c + 300849a: 4601 li a2,0 + 300849c: 4585 li a1,1 + 300849e: 4509 li a0,2 + 30084a0: 3c31 jal ra,3007ebc + 30084a2: 1c100593 li a1,449 + 30084a6: 19e00513 li a0,414 + 30084aa: 3b1d jal ra,30081e0 + 30084ac: 4585 li a1,1 + 30084ae: 4525 li a0,9 + 30084b0: 2039 jal ra,30084be + 30084b2: 3da9 jal ra,300830c + 30084b4: 0001 nop + 30084b6: 40f2 lw ra,28(sp) + 30084b8: 4462 lw s0,24(sp) + 30084ba: 6105 addi sp,sp,32 + 30084bc: 8082 ret + +030084be : + 30084be: e27f806f j 30012e4 + +030084c2 : + 30084c2: 7179 addi sp,sp,-48 + 30084c4: d606 sw ra,44(sp) + 30084c6: d422 sw s0,40(sp) + 30084c8: 1800 addi s0,sp,48 + 30084ca: fca42e23 sw a0,-36(s0) + 30084ce: fcb42c23 sw a1,-40(s0) + 30084d2: fe0407a3 sb zero,-17(s0) + 30084d6: fd842583 lw a1,-40(s0) + 30084da: fdc42503 lw a0,-36(s0) + 30084de: 034020ef jal ra,300a512 + 30084e2: 87aa mv a5,a0 + 30084e4: fef407a3 sb a5,-17(s0) + 30084e8: fef40783 lb a5,-17(s0) + 30084ec: 853e mv a0,a5 + 30084ee: 50b2 lw ra,44(sp) + 30084f0: 5422 lw s0,40(sp) + 30084f2: 6145 addi sp,sp,48 + 30084f4: 8082 ret + +030084f6 : + 30084f6: 7179 addi sp,sp,-48 + 30084f8: d606 sw ra,44(sp) + 30084fa: d422 sw s0,40(sp) + 30084fc: 1800 addi s0,sp,48 + 30084fe: fca42e23 sw a0,-36(s0) + 3008502: 87ae mv a5,a1 + 3008504: fcf40da3 sb a5,-37(s0) + 3008508: fe0407a3 sb zero,-17(s0) + 300850c: fdb44783 lbu a5,-37(s0) + 3008510: 8385 srli a5,a5,0x1 + 3008512: 9f81 uxtb a5 + 3008514: 863e mv a2,a5 + 3008516: 08a00593 li a1,138 + 300851a: fdc42503 lw a0,-36(s0) + 300851e: 2559 jal ra,3008ba4 + 3008520: 87aa mv a5,a0 + 3008522: fef407a3 sb a5,-17(s0) + 3008526: fef40783 lb a5,-17(s0) + 300852a: 853e mv a0,a5 + 300852c: 50b2 lw ra,44(sp) + 300852e: 5422 lw s0,40(sp) + 3008530: 6145 addi sp,sp,48 + 3008532: 8082 ret + +03008534 : + 3008534: 7171 addi sp,sp,-176 + 3008536: d706 sw ra,172(sp) + 3008538: d522 sw s0,168(sp) + 300853a: 1900 addi s0,sp,176 + 300853c: f4a42e23 sw a0,-164(s0) + 3008540: fe0407a3 sb zero,-17(s0) + 3008544: fef40783 lb a5,-17(s0) + 3008548: eb91 bnez a5,300855c + 300854a: 4601 li a2,0 + 300854c: 08800593 li a1,136 + 3008550: f5c42503 lw a0,-164(s0) + 3008554: 2d81 jal ra,3008ba4 + 3008556: 87aa mv a5,a0 + 3008558: fef407a3 sb a5,-17(s0) + 300855c: f5c42783 lw a5,-164(s0) + 3008560: 10078e23 sb zero,284(a5) + 3008564: f5c42783 lw a5,-164(s0) + 3008568: 3e800713 li a4,1000 + 300856c: 16e79f23 sh a4,382(a5) + 3008570: f5c42783 lw a5,-164(s0) + 3008574: 00097737 lui a4,0x97 + 3008578: 0a470713 addi a4,a4,164 # 970a4 + 300857c: 10e7a023 sw a4,256(a5) + 3008580: f5c42783 lw a5,-164(s0) + 3008584: 0007ac23 sw zero,24(a5) + 3008588: f7040793 addi a5,s0,-144 + 300858c: 85be mv a1,a5 + 300858e: f5c42503 lw a0,-164(s0) + 3008592: 2d19 jal ra,3008ba8 + 3008594: 87aa mv a5,a0 + 3008596: fef407a3 sb a5,-17(s0) + 300859a: fef40783 lb a5,-17(s0) + 300859e: efc1 bnez a5,3008636 + 30085a0: f6040823 sb zero,-144(s0) + 30085a4: f60408a3 sb zero,-143(s0) + 30085a8: fa042623 sw zero,-84(s0) + 30085ac: 04b007b7 lui a5,0x4b00 + 30085b0: fcf42423 sw a5,-56(s0) + 30085b4: 67ad lui a5,0xb + 30085b6: 33378793 addi a5,a5,819 # b333 + 30085ba: faf42823 sw a5,-80(s0) + 30085be: 044c07b7 lui a5,0x44c0 + 30085c2: fcf42623 sw a5,-52(s0) + 30085c6: 000207b7 lui a5,0x20 + 30085ca: faf42a23 sw a5,-76(s0) + 30085ce: 038407b7 lui a5,0x3840 + 30085d2: fcf42823 sw a5,-48(s0) + 30085d6: 0003d7b7 lui a5,0x3d + 30085da: ccc78793 addi a5,a5,-820 # 3cccc + 30085de: faf42c23 sw a5,-72(s0) + 30085e2: 02ee07b7 lui a5,0x2ee0 + 30085e6: fcf42a23 sw a5,-44(s0) + 30085ea: 000757b7 lui a5,0x75 + 30085ee: ccc78793 addi a5,a5,-820 # 74ccc + 30085f2: faf42e23 sw a5,-68(s0) + 30085f6: 022607b7 lui a5,0x2260 + 30085fa: fcf42c23 sw a5,-40(s0) + 30085fe: 000a07b7 lui a5,0xa0 + 3008602: fcf42023 sw a5,-64(s0) + 3008606: 01f407b7 lui a5,0x1f40 + 300860a: fcf42e23 sw a5,-36(s0) + 300860e: 000f07b7 lui a5,0xf0 + 3008612: fcf42223 sw a5,-60(s0) + 3008616: 019007b7 lui a5,0x1900 + 300861a: fef42023 sw a5,-32(s0) + 300861e: f5c42783 lw a5,-164(s0) + 3008622: 07a1 addi a5,a5,8 # 1900008 + 3008624: f7040713 addi a4,s0,-144 + 3008628: 07800693 li a3,120 + 300862c: 8636 mv a2,a3 + 300862e: 85ba mv a1,a4 + 3008630: 853e mv a0,a5 + 3008632: 2f8060ef jal ra,300e92a + 3008636: f5c42783 lw a5,-164(s0) + 300863a: 06400713 li a4,100 + 300863e: 16e79023 sh a4,352(a5) + 3008642: f5c42783 lw a5,-164(s0) + 3008646: 38400713 li a4,900 + 300864a: 16e79123 sh a4,354(a5) + 300864e: f5c42783 lw a5,-164(s0) + 3008652: 1f400713 li a4,500 + 3008656: 16e79223 sh a4,356(a5) + 300865a: f5c42783 lw a5,-164(s0) + 300865e: 6705 lui a4,0x1 + 3008660: a0070713 addi a4,a4,-1536 # a00 + 3008664: 16e79423 sh a4,360(a5) + 3008668: f5c42783 lw a5,-164(s0) + 300866c: 4705 li a4,1 + 300866e: 16e78e23 sb a4,380(a5) + 3008672: 4605 li a2,1 + 3008674: 08000593 li a1,128 + 3008678: f5c42503 lw a0,-164(s0) + 300867c: 2325 jal ra,3008ba4 + 300867e: 87aa mv a5,a0 + 3008680: 873e mv a4,a5 + 3008682: fef44783 lbu a5,-17(s0) + 3008686: 8fd9 or a5,a5,a4 + 3008688: fef407a3 sb a5,-17(s0) + 300868c: 4605 li a2,1 + 300868e: 0ff00593 li a1,255 + 3008692: f5c42503 lw a0,-164(s0) + 3008696: 2339 jal ra,3008ba4 + 3008698: 87aa mv a5,a0 + 300869a: 873e mv a4,a5 + 300869c: fef44783 lbu a5,-17(s0) + 30086a0: 8fd9 or a5,a5,a4 + 30086a2: fef407a3 sb a5,-17(s0) + 30086a6: 4601 li a2,0 + 30086a8: 4581 li a1,0 + 30086aa: f5c42503 lw a0,-164(s0) + 30086ae: 29dd jal ra,3008ba4 + 30086b0: 87aa mv a5,a0 + 30086b2: 873e mv a4,a5 + 30086b4: fef44783 lbu a5,-17(s0) + 30086b8: 8fd9 or a5,a5,a4 + 30086ba: fef407a3 sb a5,-17(s0) + 30086be: f6f40793 addi a5,s0,-145 + 30086c2: 863e mv a2,a5 + 30086c4: 09100593 li a1,145 + 30086c8: f5c42503 lw a0,-164(s0) + 30086cc: 717050ef jal ra,300e5e2 + 30086d0: 87aa mv a5,a0 + 30086d2: 873e mv a4,a5 + 30086d4: fef44783 lbu a5,-17(s0) + 30086d8: 8fd9 or a5,a5,a4 + 30086da: fef407a3 sb a5,-17(s0) + 30086de: f6f44703 lbu a4,-145(s0) + 30086e2: f5c42783 lw a5,-164(s0) + 30086e6: 16e78323 sb a4,358(a5) + 30086ea: 4605 li a2,1 + 30086ec: 4581 li a1,0 + 30086ee: f5c42503 lw a0,-164(s0) + 30086f2: 294d jal ra,3008ba4 + 30086f4: 87aa mv a5,a0 + 30086f6: 873e mv a4,a5 + 30086f8: fef44783 lbu a5,-17(s0) + 30086fc: 8fd9 or a5,a5,a4 + 30086fe: fef407a3 sb a5,-17(s0) + 3008702: 4601 li a2,0 + 3008704: 0ff00593 li a1,255 + 3008708: f5c42503 lw a0,-164(s0) + 300870c: 2961 jal ra,3008ba4 + 300870e: 87aa mv a5,a0 + 3008710: 873e mv a4,a5 + 3008712: fef44783 lbu a5,-17(s0) + 3008716: 8fd9 or a5,a5,a4 + 3008718: fef407a3 sb a5,-17(s0) + 300871c: 4601 li a2,0 + 300871e: 08000593 li a1,128 + 3008722: f5c42503 lw a0,-164(s0) + 3008726: 29bd jal ra,3008ba4 + 3008728: 87aa mv a5,a0 + 300872a: 873e mv a4,a5 + 300872c: fef44783 lbu a5,-17(s0) + 3008730: 8fd9 or a5,a5,a4 + 3008732: fef407a3 sb a5,-17(s0) + 3008736: fe042423 sw zero,-24(s0) + 300873a: a805 j 300876a + 300873c: fef40783 lb a5,-17(s0) + 3008740: eb9d bnez a5,3008776 + 3008742: fe842783 lw a5,-24(s0) + 3008746: 9fa1 uxth a5 + 3008748: 4605 li a2,1 + 300874a: 85be mv a1,a5 + 300874c: f5c42503 lw a0,-164(s0) + 3008750: 2225 jal ra,3008878 + 3008752: 87aa mv a5,a0 + 3008754: 873e mv a4,a5 + 3008756: fef44783 lbu a5,-17(s0) + 300875a: 8fd9 or a5,a5,a4 + 300875c: fef407a3 sb a5,-17(s0) + 3008760: fe842783 lw a5,-24(s0) + 3008764: 0785 addi a5,a5,1 + 3008766: fef42423 sw a5,-24(s0) + 300876a: fe842703 lw a4,-24(s0) + 300876e: 4795 li a5,5 + 3008770: fce7d6e3 bge a5,a4,300873c + 3008774: a011 j 3008778 + 3008776: 0001 nop + 3008778: fef40783 lb a5,-17(s0) + 300877c: eb89 bnez a5,300878e + 300877e: 4601 li a2,0 + 3008780: 4589 li a1,2 + 3008782: f5c42503 lw a0,-164(s0) + 3008786: 28cd jal ra,3008878 + 3008788: 87aa mv a5,a0 + 300878a: fef407a3 sb a5,-17(s0) + 300878e: fef40783 lb a5,-17(s0) + 3008792: eb89 bnez a5,30087a4 + 3008794: 4601 li a2,0 + 3008796: 458d li a1,3 + 3008798: f5c42503 lw a0,-164(s0) + 300879c: 28f1 jal ra,3008878 + 300879e: 87aa mv a5,a0 + 30087a0: fef407a3 sb a5,-17(s0) + 30087a4: fef40783 lb a5,-17(s0) + 30087a8: eb89 bnez a5,30087ba + 30087aa: 4601 li a2,0 + 30087ac: 4591 li a1,4 + 30087ae: f5c42503 lw a0,-164(s0) + 30087b2: 20d9 jal ra,3008878 + 30087b4: 87aa mv a5,a0 + 30087b6: fef407a3 sb a5,-17(s0) + 30087ba: fef40783 lb a5,-17(s0) + 30087be: eb89 bnez a5,30087d0 + 30087c0: 4601 li a2,0 + 30087c2: 4595 li a1,5 + 30087c4: f5c42503 lw a0,-164(s0) + 30087c8: 2845 jal ra,3008878 + 30087ca: 87aa mv a5,a0 + 30087cc: fef407a3 sb a5,-17(s0) + 30087d0: fef40783 lb a5,-17(s0) + 30087d4: eb91 bnez a5,30087e8 + 30087d6: 00120637 lui a2,0x120 + 30087da: 4581 li a1,0 + 30087dc: f5c42503 lw a0,-164(s0) + 30087e0: 2851 jal ra,3008874 + 30087e2: 87aa mv a5,a0 + 30087e4: fef407a3 sb a5,-17(s0) + 30087e8: fef40783 lb a5,-17(s0) + 30087ec: eb89 bnez a5,30087fe + 30087ee: 6611 lui a2,0x4 + 30087f0: 4585 li a1,1 + 30087f2: f5c42503 lw a0,-164(s0) + 30087f6: 28bd jal ra,3008874 + 30087f8: 87aa mv a5,a0 + 30087fa: fef407a3 sb a5,-17(s0) + 30087fe: fef40783 lb a5,-17(s0) + 3008802: eb91 bnez a5,3008816 + 3008804: 00230637 lui a2,0x230 + 3008808: 4589 li a1,2 + 300880a: f5c42503 lw a0,-164(s0) + 300880e: 209d jal ra,3008874 + 3008810: 87aa mv a5,a0 + 3008812: fef407a3 sb a5,-17(s0) + 3008816: fef40783 lb a5,-17(s0) + 300881a: eb89 bnez a5,300882c + 300881c: 4601 li a2,0 + 300881e: 458d li a1,3 + 3008820: f5c42503 lw a0,-164(s0) + 3008824: 2881 jal ra,3008874 + 3008826: 87aa mv a5,a0 + 3008828: fef407a3 sb a5,-17(s0) + 300882c: fef40783 lb a5,-17(s0) + 3008830: e785 bnez a5,3008858 + 3008832: f5c42783 lw a5,-164(s0) + 3008836: 577d li a4,-1 + 3008838: 14e78e23 sb a4,348(a5) + 300883c: 0ff00613 li a2,255 + 3008840: 4585 li a1,1 + 3008842: f5c42503 lw a0,-164(s0) + 3008846: 2eb9 jal ra,3008ba4 + 3008848: 87aa mv a5,a0 + 300884a: fef407a3 sb a5,-17(s0) + 300884e: f5c42783 lw a5,-164(s0) + 3008852: 4705 li a4,1 + 3008854: 14e78f23 sb a4,350(a5) + 3008858: fef40783 lb a5,-17(s0) + 300885c: e789 bnez a5,3008866 + 300885e: f5c42783 lw a5,-164(s0) + 3008862: 140780a3 sb zero,321(a5) + 3008866: fef40783 lb a5,-17(s0) + 300886a: 853e mv a0,a5 + 300886c: 50ba lw ra,172(sp) + 300886e: 542a lw s0,168(sp) + 3008870: 614d addi sp,sp,176 + 3008872: 8082 ret + +03008874 : + 3008874: 4810006f j 30094f4 + +03008878 : + 3008878: 2c10006f j 3009338 + +0300887c : + 300887c: 7131 addi sp,sp,-192 + 300887e: df06 sw ra,188(sp) + 3008880: dd22 sw s0,184(sp) + 3008882: 0180 addi s0,sp,192 + 3008884: f4a42623 sw a0,-180(s0) + 3008888: fe0407a3 sb zero,-17(s0) + 300888c: f6440793 addi a5,s0,-156 + 3008890: 07800713 li a4,120 + 3008894: 863a mv a2,a4 + 3008896: 4581 li a1,0 + 3008898: 853e mv a0,a5 + 300889a: 3f2060ef jal ra,300ec8c + 300889e: f6041123 sh zero,-158(s0) + 30088a2: f60400a3 sb zero,-159(s0) + 30088a6: fe0403a3 sb zero,-25(s0) + 30088aa: fe042023 sw zero,-32(s0) + 30088ae: f6040023 sb zero,-160(s0) + 30088b2: f4042e23 sw zero,-164(s0) + 30088b6: fc040fa3 sb zero,-33(s0) + 30088ba: 4585 li a1,1 + 30088bc: f4c42503 lw a0,-180(s0) + 30088c0: 5ff020ef jal ra,300b6be + 30088c4: 87aa mv a5,a0 + 30088c6: fef407a3 sb a5,-17(s0) + 30088ca: f4c42783 lw a5,-180(s0) + 30088ce: 13f7c783 lbu a5,319(a5) + 30088d2: fef42023 sw a5,-32(s0) + 30088d6: f4c42783 lw a5,-180(s0) + 30088da: 1407c783 lbu a5,320(a5) + 30088de: fcf40fa3 sb a5,-33(s0) + 30088e2: fdf44703 lbu a4,-33(s0) + 30088e6: 4785 li a5,1 + 30088e8: 02e7e563 bltu a5,a4,3008912 + 30088ec: fdf44703 lbu a4,-33(s0) + 30088f0: 4785 li a5,1 + 30088f2: 00f71863 bne a4,a5,3008902 + 30088f6: fe042703 lw a4,-32(s0) + 30088fa: 02000793 li a5,32 + 30088fe: 00e7ea63 bltu a5,a4,3008912 + 3008902: fdf44783 lbu a5,-33(s0) + 3008906: e785 bnez a5,300892e + 3008908: fe042703 lw a4,-32(s0) + 300890c: 47b1 li a5,12 + 300890e: 02e7f063 bgeu a5,a4,300892e + 3008912: f6040713 addi a4,s0,-160 + 3008916: f5c40793 addi a5,s0,-164 + 300891a: 863a mv a2,a4 + 300891c: 85be mv a1,a5 + 300891e: f4c42503 lw a0,-180(s0) + 3008922: 0fe020ef jal ra,300aa20 + 3008926: 87aa mv a5,a0 + 3008928: fef407a3 sb a5,-17(s0) + 300892c: a829 j 3008946 + 300892e: fdf44783 lbu a5,-33(s0) + 3008932: 863e mv a2,a5 + 3008934: fe042583 lw a1,-32(s0) + 3008938: f4c42503 lw a0,-180(s0) + 300893c: 5aa020ef jal ra,300aee6 + 3008940: 87aa mv a5,a0 + 3008942: fef407a3 sb a5,-17(s0) + 3008946: ad818793 addi a5,gp,-1320 # 400010c + 300894a: fef42423 sw a5,-24(s0) + 300894e: fef40783 lb a5,-17(s0) + 3008952: e78d bnez a5,300897c + 3008954: f4c42783 lw a5,-180(s0) + 3008958: 17c7c783 lbu a5,380(a5) + 300895c: fef403a3 sb a5,-25(s0) + 3008960: fe744783 lbu a5,-25(s0) + 3008964: eb81 bnez a5,3008974 + 3008966: f4c42783 lw a5,-180(s0) + 300896a: 1787a783 lw a5,376(a5) + 300896e: fef42423 sw a5,-24(s0) + 3008972: a029 j 300897c + 3008974: ad818793 addi a5,gp,-1320 # 400010c + 3008978: fef42423 sw a5,-24(s0) + 300897c: fef40783 lb a5,-17(s0) + 3008980: eb91 bnez a5,3008994 + 3008982: fe842583 lw a1,-24(s0) + 3008986: f4c42503 lw a0,-180(s0) + 300898a: 288040ef jal ra,300cc12 + 300898e: 87aa mv a5,a0 + 3008990: fef407a3 sb a5,-17(s0) + 3008994: fef40783 lb a5,-17(s0) + 3008998: ef81 bnez a5,30089b0 + 300899a: 4701 li a4,0 + 300899c: 4691 li a3,4 + 300899e: 4601 li a2,0 + 30089a0: 4581 li a1,0 + 30089a2: f4c42503 lw a0,-180(s0) + 30089a6: 6f0010ef jal ra,300a096 + 30089aa: 87aa mv a5,a0 + 30089ac: fef407a3 sb a5,-17(s0) + 30089b0: fef40783 lb a5,-17(s0) + 30089b4: e7b9 bnez a5,3008a02 + 30089b6: 4605 li a2,1 + 30089b8: 0ff00593 li a1,255 + 30089bc: f4c42503 lw a0,-180(s0) + 30089c0: 22d5 jal ra,3008ba4 + 30089c2: 87aa mv a5,a0 + 30089c4: fef407a3 sb a5,-17(s0) + 30089c8: f6240793 addi a5,s0,-158 + 30089cc: 863e mv a2,a5 + 30089ce: 08400593 li a1,132 + 30089d2: f4c42503 lw a0,-180(s0) + 30089d6: 463050ef jal ra,300e638 + 30089da: 87aa mv a5,a0 + 30089dc: 873e mv a4,a5 + 30089de: fef44783 lbu a5,-17(s0) + 30089e2: 8fd9 or a5,a5,a4 + 30089e4: fef407a3 sb a5,-17(s0) + 30089e8: 4601 li a2,0 + 30089ea: 0ff00593 li a1,255 + 30089ee: f4c42503 lw a0,-180(s0) + 30089f2: 2a4d jal ra,3008ba4 + 30089f4: 87aa mv a5,a0 + 30089f6: 873e mv a4,a5 + 30089f8: fef44783 lbu a5,-17(s0) + 30089fc: 8fd9 or a5,a5,a4 + 30089fe: fef407a3 sb a5,-17(s0) + 3008a02: fef40783 lb a5,-17(s0) + 3008a06: eb89 bnez a5,3008a18 + 3008a08: f6245783 lhu a5,-158(s0) + 3008a0c: 0792 slli a5,a5,0x4 + 3008a0e: 873e mv a4,a5 + 3008a10: f4c42783 lw a5,-180(s0) + 3008a14: 10e7a023 sw a4,256(a5) + 3008a18: fef40783 lb a5,-17(s0) + 3008a1c: eb91 bnez a5,3008a30 + 3008a1e: f6440793 addi a5,s0,-156 + 3008a22: 85be mv a1,a5 + 3008a24: f4c42503 lw a0,-180(s0) + 3008a28: 2241 jal ra,3008ba8 + 3008a2a: 87aa mv a5,a0 + 3008a2c: fef407a3 sb a5,-17(s0) + 3008a30: fef40783 lb a5,-17(s0) + 3008a34: e39d bnez a5,3008a5a + 3008a36: f6140793 addi a5,s0,-159 + 3008a3a: 85be mv a1,a5 + 3008a3c: f4c42503 lw a0,-180(s0) + 3008a40: 264d jal ra,3008de2 + 3008a42: 87aa mv a5,a0 + 3008a44: fef407a3 sb a5,-17(s0) + 3008a48: fef40783 lb a5,-17(s0) + 3008a4c: e799 bnez a5,3008a5a + 3008a4e: f6144703 lbu a4,-159(s0) + 3008a52: f4c42783 lw a5,-180(s0) + 3008a56: 14e78ea3 sb a4,349(a5) + 3008a5a: fef40783 lb a5,-17(s0) + 3008a5e: ef89 bnez a5,3008a78 + 3008a60: f4c42783 lw a5,-180(s0) + 3008a64: 07a1 addi a5,a5,8 + 3008a66: f6440713 addi a4,s0,-156 + 3008a6a: 07800693 li a3,120 + 3008a6e: 8636 mv a2,a3 + 3008a70: 85ba mv a1,a4 + 3008a72: 853e mv a0,a5 + 3008a74: 6b7050ef jal ra,300e92a + 3008a78: fef40783 lb a5,-17(s0) + 3008a7c: e78d bnez a5,3008aa6 + 3008a7e: f6140793 addi a5,s0,-159 + 3008a82: 863e mv a2,a5 + 3008a84: 4585 li a1,1 + 3008a86: f4c42503 lw a0,-180(s0) + 3008a8a: 359050ef jal ra,300e5e2 + 3008a8e: 87aa mv a5,a0 + 3008a90: fef407a3 sb a5,-17(s0) + 3008a94: fef40783 lb a5,-17(s0) + 3008a98: e799 bnez a5,3008aa6 + 3008a9a: f6144703 lbu a4,-159(s0) + 3008a9e: f4c42783 lw a5,-180(s0) + 3008aa2: 14e78e23 sb a4,348(a5) + 3008aa6: fef40783 lb a5,-17(s0) + 3008aaa: eb89 bnez a5,3008abc + 3008aac: 4601 li a2,0 + 3008aae: 4581 li a1,0 + 3008ab0: f4c42503 lw a0,-180(s0) + 3008ab4: 210d jal ra,3008ed6 + 3008ab6: 87aa mv a5,a0 + 3008ab8: fef407a3 sb a5,-17(s0) + 3008abc: fef40783 lb a5,-17(s0) + 3008ac0: eb89 bnez a5,3008ad2 + 3008ac2: 4601 li a2,0 + 3008ac4: 4589 li a1,2 + 3008ac6: f4c42503 lw a0,-180(s0) + 3008aca: 2131 jal ra,3008ed6 + 3008acc: 87aa mv a5,a0 + 3008ace: fef407a3 sb a5,-17(s0) + 3008ad2: fef40783 lb a5,-17(s0) + 3008ad6: e791 bnez a5,3008ae2 + 3008ad8: f4c42783 lw a5,-180(s0) + 3008adc: 470d li a4,3 + 3008ade: 14e78f23 sb a4,350(a5) + 3008ae2: fef40783 lb a5,-17(s0) + 3008ae6: eb99 bnez a5,3008afc + 3008ae8: f5b40793 addi a5,s0,-165 + 3008aec: 863e mv a2,a5 + 3008aee: 4581 li a1,0 + 3008af0: f4c42503 lw a0,-180(s0) + 3008af4: 264d jal ra,3008e96 + 3008af6: 87aa mv a5,a0 + 3008af8: fef407a3 sb a5,-17(s0) + 3008afc: fef40783 lb a5,-17(s0) + 3008b00: e799 bnez a5,3008b0e + 3008b02: f5b44703 lbu a4,-165(s0) + 3008b06: f4c42783 lw a5,-180(s0) + 3008b0a: 10e78a23 sb a4,276(a5) + 3008b0e: fef40783 lb a5,-17(s0) + 3008b12: eb99 bnez a5,3008b28 + 3008b14: f5b40793 addi a5,s0,-165 + 3008b18: 863e mv a2,a5 + 3008b1a: 4585 li a1,1 + 3008b1c: f4c42503 lw a0,-180(s0) + 3008b20: 2e9d jal ra,3008e96 + 3008b22: 87aa mv a5,a0 + 3008b24: fef407a3 sb a5,-17(s0) + 3008b28: fef40783 lb a5,-17(s0) + 3008b2c: e799 bnez a5,3008b3a + 3008b2e: f5b44703 lbu a4,-165(s0) + 3008b32: f4c42783 lw a5,-180(s0) + 3008b36: 10e78623 sb a4,268(a5) + 3008b3a: fef40783 lb a5,-17(s0) + 3008b3e: ef81 bnez a5,3008b56 + 3008b40: f5440793 addi a5,s0,-172 + 3008b44: 863e mv a2,a5 + 3008b46: 458d li a1,3 + 3008b48: f4c42503 lw a0,-180(s0) + 3008b4c: 051030ef jal ra,300c39c + 3008b50: 87aa mv a5,a0 + 3008b52: fef407a3 sb a5,-17(s0) + 3008b56: fef40783 lb a5,-17(s0) + 3008b5a: e799 bnez a5,3008b68 + 3008b5c: f5442703 lw a4,-172(s0) + 3008b60: f4c42783 lw a5,-180(s0) + 3008b64: 10e7a823 sw a4,272(a5) + 3008b68: fef40783 lb a5,-17(s0) + 3008b6c: ef81 bnez a5,3008b84 + 3008b6e: f5440793 addi a5,s0,-172 + 3008b72: 863e mv a2,a5 + 3008b74: 4591 li a1,4 + 3008b76: f4c42503 lw a0,-180(s0) + 3008b7a: 023030ef jal ra,300c39c + 3008b7e: 87aa mv a5,a0 + 3008b80: fef407a3 sb a5,-17(s0) + 3008b84: fef40783 lb a5,-17(s0) + 3008b88: e799 bnez a5,3008b96 + 3008b8a: f5442703 lw a4,-172(s0) + 3008b8e: f4c42783 lw a5,-180(s0) + 3008b92: 10e7a423 sw a4,264(a5) + 3008b96: fef40783 lb a5,-17(s0) + 3008b9a: 853e mv a0,a5 + 3008b9c: 50fa lw ra,188(sp) + 3008b9e: 546a lw s0,184(sp) + 3008ba0: 6129 addi sp,sp,192 + 3008ba2: 8082 ret + +03008ba4 : + 3008ba4: 0e10506f j 300e484 + +03008ba8 : + 3008ba8: 7179 addi sp,sp,-48 + 3008baa: d606 sw ra,44(sp) + 3008bac: d422 sw s0,40(sp) + 3008bae: 1800 addi s0,sp,48 + 3008bb0: fca42e23 sw a0,-36(s0) + 3008bb4: fcb42c23 sw a1,-40(s0) + 3008bb8: fe0407a3 sb zero,-17(s0) + 3008bbc: fd842783 lw a5,-40(s0) + 3008bc0: 85be mv a1,a5 + 3008bc2: fdc42503 lw a0,-36(s0) + 3008bc6: 2acd jal ra,3008db8 + 3008bc8: 87aa mv a5,a0 + 3008bca: fef407a3 sb a5,-17(s0) + 3008bce: fef40783 lb a5,-17(s0) + 3008bd2: eb99 bnez a5,3008be8 + 3008bd4: fd842783 lw a5,-40(s0) + 3008bd8: 07a1 addi a5,a5,8 + 3008bda: 85be mv a1,a5 + 3008bdc: fdc42503 lw a0,-36(s0) + 3008be0: 2505 jal ra,3009200 + 3008be2: 87aa mv a5,a0 + 3008be4: fef407a3 sb a5,-17(s0) + 3008be8: fef40783 lb a5,-17(s0) + 3008bec: e789 bnez a5,3008bf6 + 3008bee: fd842783 lw a5,-40(s0) + 3008bf2: 00078623 sb zero,12(a5) + 3008bf6: fef40783 lb a5,-17(s0) + 3008bfa: eb99 bnez a5,3008c10 + 3008bfc: fd842783 lw a5,-40(s0) + 3008c00: 07c1 addi a5,a5,16 + 3008c02: 85be mv a1,a5 + 3008c04: fdc42503 lw a0,-36(s0) + 3008c08: 2565 jal ra,30092b0 + 3008c0a: 87aa mv a5,a0 + 3008c0c: fef407a3 sb a5,-17(s0) + 3008c10: fef40783 lb a5,-17(s0) + 3008c14: eb99 bnez a5,3008c2a + 3008c16: fd842783 lw a5,-40(s0) + 3008c1a: 07d1 addi a5,a5,20 + 3008c1c: 85be mv a1,a5 + 3008c1e: fdc42503 lw a0,-36(s0) + 3008c22: 3045 jal ra,30084c2 + 3008c24: 87aa mv a5,a0 + 3008c26: fef407a3 sb a5,-17(s0) + 3008c2a: fef40783 lb a5,-17(s0) + 3008c2e: ebd9 bnez a5,3008cc4 + 3008c30: fe042423 sw zero,-24(s0) + 3008c34: a8bd j 3008cb2 + 3008c36: fef40783 lb a5,-17(s0) + 3008c3a: e3d1 bnez a5,3008cbe + 3008c3c: fe842783 lw a5,-24(s0) + 3008c40: 01079693 slli a3,a5,0x10 + 3008c44: 82c1 srli a3,a3,0x10 + 3008c46: fe842783 lw a5,-24(s0) + 3008c4a: 07a1 addi a5,a5,8 + 3008c4c: 078a slli a5,a5,0x2 + 3008c4e: fd842703 lw a4,-40(s0) + 3008c52: 97ba add a5,a5,a4 + 3008c54: 0791 addi a5,a5,4 + 3008c56: 863e mv a2,a5 + 3008c58: 85b6 mv a1,a3 + 3008c5a: fdc42503 lw a0,-36(s0) + 3008c5e: 189000ef jal ra,30095e6 + 3008c62: 87aa mv a5,a0 + 3008c64: 873e mv a4,a5 + 3008c66: fef44783 lbu a5,-17(s0) + 3008c6a: 8fd9 or a5,a5,a4 + 3008c6c: fef407a3 sb a5,-17(s0) + 3008c70: fef40783 lb a5,-17(s0) + 3008c74: e7b9 bnez a5,3008cc2 + 3008c76: fe842783 lw a5,-24(s0) + 3008c7a: 01079693 slli a3,a5,0x10 + 3008c7e: 82c1 srli a3,a3,0x10 + 3008c80: fe842783 lw a5,-24(s0) + 3008c84: 07c1 addi a5,a5,16 + 3008c86: fd842703 lw a4,-40(s0) + 3008c8a: 97ba add a5,a5,a4 + 3008c8c: 07a1 addi a5,a5,8 + 3008c8e: 863e mv a2,a5 + 3008c90: 85b6 mv a1,a3 + 3008c92: fdc42503 lw a0,-36(s0) + 3008c96: 005000ef jal ra,300949a + 3008c9a: 87aa mv a5,a0 + 3008c9c: 873e mv a4,a5 + 3008c9e: fef44783 lbu a5,-17(s0) + 3008ca2: 8fd9 or a5,a5,a4 + 3008ca4: fef407a3 sb a5,-17(s0) + 3008ca8: fe842783 lw a5,-24(s0) + 3008cac: 0785 addi a5,a5,1 + 3008cae: fef42423 sw a5,-24(s0) + 3008cb2: fe842703 lw a4,-24(s0) + 3008cb6: 4795 li a5,5 + 3008cb8: f6e7dfe3 bge a5,a4,3008c36 + 3008cbc: a021 j 3008cc4 + 3008cbe: 0001 nop + 3008cc0: a011 j 3008cc4 + 3008cc2: 0001 nop + 3008cc4: fef40783 lb a5,-17(s0) + 3008cc8: ef89 bnez a5,3008ce2 + 3008cca: fd842783 lw a5,-40(s0) + 3008cce: 07478793 addi a5,a5,116 + 3008cd2: 85be mv a1,a5 + 3008cd4: fdc42503 lw a0,-36(s0) + 3008cd8: 269000ef jal ra,3009740 + 3008cdc: 87aa mv a5,a0 + 3008cde: fef407a3 sb a5,-17(s0) + 3008ce2: fef40783 lb a5,-17(s0) + 3008ce6: eb99 bnez a5,3008cfc + 3008ce8: fd842783 lw a5,-40(s0) + 3008cec: 0791 addi a5,a5,4 + 3008cee: 85be mv a1,a5 + 3008cf0: fdc42503 lw a0,-36(s0) + 3008cf4: 22bd jal ra,3008e62 + 3008cf6: 87aa mv a5,a0 + 3008cf8: fef407a3 sb a5,-17(s0) + 3008cfc: fef40783 lb a5,-17(s0) + 3008d00: efb1 bnez a5,3008d5c + 3008d02: fe042423 sw zero,-24(s0) + 3008d06: a0b1 j 3008d52 + 3008d08: fdc42703 lw a4,-36(s0) + 3008d0c: fe842783 lw a5,-24(s0) + 3008d10: 07b1 addi a5,a5,12 + 3008d12: 078a slli a5,a5,0x2 + 3008d14: 97ba add a5,a5,a4 + 3008d16: 4bd8 lw a4,20(a5) + 3008d18: fd842683 lw a3,-40(s0) + 3008d1c: fe842783 lw a5,-24(s0) + 3008d20: 07b1 addi a5,a5,12 + 3008d22: 078a slli a5,a5,0x2 + 3008d24: 97b6 add a5,a5,a3 + 3008d26: c7d8 sw a4,12(a5) + 3008d28: fdc42703 lw a4,-36(s0) + 3008d2c: fe842783 lw a5,-24(s0) + 3008d30: 07c1 addi a5,a5,16 + 3008d32: 078a slli a5,a5,0x2 + 3008d34: 97ba add a5,a5,a4 + 3008d36: 5398 lw a4,32(a5) + 3008d38: fd842683 lw a3,-40(s0) + 3008d3c: fe842783 lw a5,-24(s0) + 3008d40: 07c1 addi a5,a5,16 + 3008d42: 078a slli a5,a5,0x2 + 3008d44: 97b6 add a5,a5,a3 + 3008d46: cf98 sw a4,24(a5) + 3008d48: fe842783 lw a5,-24(s0) + 3008d4c: 0785 addi a5,a5,1 + 3008d4e: fef42423 sw a5,-24(s0) + 3008d52: fe842703 lw a4,-24(s0) + 3008d56: 4799 li a5,6 + 3008d58: fae7d8e3 bge a5,a4,3008d08 + 3008d5c: fef40783 lb a5,-17(s0) + 3008d60: 853e mv a0,a5 + 3008d62: 50b2 lw ra,44(sp) + 3008d64: 5422 lw s0,40(sp) + 3008d66: 6145 addi sp,sp,48 + 3008d68: 8082 ret + +03008d6a : + 3008d6a: 7179 addi sp,sp,-48 + 3008d6c: d622 sw s0,44(sp) + 3008d6e: 1800 addi s0,sp,48 + 3008d70: fca42e23 sw a0,-36(s0) + 3008d74: 87ae mv a5,a1 + 3008d76: fcf40da3 sb a5,-37(s0) + 3008d7a: fe0407a3 sb zero,-17(s0) + 3008d7e: fdb44783 lbu a5,-37(s0) + 3008d82: 4755 li a4,21 + 3008d84: 02f76163 bltu a4,a5,3008da6 + 3008d88: 00279713 slli a4,a5,0x2 + 3008d8c: 0300f7b7 lui a5,0x300f + 3008d90: 3b478793 addi a5,a5,948 # 300f3b4 + 3008d94: 97ba add a5,a5,a4 + 3008d96: 439c lw a5,0(a5) + 3008d98: 8782 jr a5 + 3008d9a: fdc42783 lw a5,-36(s0) + 3008d9e: fdb44703 lbu a4,-37(s0) + 3008da2: a798 sb a4,8(a5) + 3008da4: a021 j 3008dac + 3008da6: 57e1 li a5,-8 + 3008da8: fef407a3 sb a5,-17(s0) + 3008dac: fef40783 lb a5,-17(s0) + 3008db0: 853e mv a0,a5 + 3008db2: 5432 lw s0,44(sp) + 3008db4: 6145 addi sp,sp,48 + 3008db6: 8082 ret + +03008db8 : + 3008db8: 7179 addi sp,sp,-48 + 3008dba: d622 sw s0,44(sp) + 3008dbc: 1800 addi s0,sp,48 + 3008dbe: fca42e23 sw a0,-36(s0) + 3008dc2: fcb42c23 sw a1,-40(s0) + 3008dc6: fe0407a3 sb zero,-17(s0) + 3008dca: fdc42783 lw a5,-36(s0) + 3008dce: 2798 lbu a4,8(a5) + 3008dd0: fd842783 lw a5,-40(s0) + 3008dd4: a398 sb a4,0(a5) + 3008dd6: fef40783 lb a5,-17(s0) + 3008dda: 853e mv a0,a5 + 3008ddc: 5432 lw s0,44(sp) + 3008dde: 6145 addi sp,sp,48 + 3008de0: 8082 ret + +03008de2 : + 3008de2: 7179 addi sp,sp,-48 + 3008de4: d606 sw ra,44(sp) + 3008de6: d422 sw s0,40(sp) + 3008de8: 1800 addi s0,sp,48 + 3008dea: fca42e23 sw a0,-36(s0) + 3008dee: fcb42c23 sw a1,-40(s0) + 3008df2: fe0407a3 sb zero,-17(s0) + 3008df6: fd842603 lw a2,-40(s0) + 3008dfa: 45a5 li a1,9 + 3008dfc: fdc42503 lw a0,-36(s0) + 3008e00: 2ef5 jal ra,30091fc + 3008e02: 87aa mv a5,a0 + 3008e04: fef407a3 sb a5,-17(s0) + 3008e08: fef40783 lb a5,-17(s0) + 3008e0c: eb91 bnez a5,3008e20 + 3008e0e: fd842783 lw a5,-40(s0) + 3008e12: 239c lbu a5,0(a5) + 3008e14: 8b85 andi a5,a5,1 + 3008e16: 0ff7f713 andi a4,a5,255 + 3008e1a: fd842783 lw a5,-40(s0) + 3008e1e: a398 sb a4,0(a5) + 3008e20: fef40783 lb a5,-17(s0) + 3008e24: 853e mv a0,a5 + 3008e26: 50b2 lw ra,44(sp) + 3008e28: 5422 lw s0,40(sp) + 3008e2a: 6145 addi sp,sp,48 + 3008e2c: 8082 ret + +03008e2e : + 3008e2e: 7179 addi sp,sp,-48 + 3008e30: d606 sw ra,44(sp) + 3008e32: d422 sw s0,40(sp) + 3008e34: 1800 addi s0,sp,48 + 3008e36: fca42e23 sw a0,-36(s0) + 3008e3a: fcb42c23 sw a1,-40(s0) + 3008e3e: fe0407a3 sb zero,-17(s0) + 3008e42: fd842583 lw a1,-40(s0) + 3008e46: fdc42503 lw a0,-36(s0) + 3008e4a: 20f030ef jal ra,300c858 + 3008e4e: 87aa mv a5,a0 + 3008e50: fef407a3 sb a5,-17(s0) + 3008e54: fef40783 lb a5,-17(s0) + 3008e58: 853e mv a0,a5 + 3008e5a: 50b2 lw ra,44(sp) + 3008e5c: 5422 lw s0,40(sp) + 3008e5e: 6145 addi sp,sp,48 + 3008e60: 8082 ret + +03008e62 : + 3008e62: 7179 addi sp,sp,-48 + 3008e64: d606 sw ra,44(sp) + 3008e66: d422 sw s0,40(sp) + 3008e68: 1800 addi s0,sp,48 + 3008e6a: fca42e23 sw a0,-36(s0) + 3008e6e: fcb42c23 sw a1,-40(s0) + 3008e72: fe0407a3 sb zero,-17(s0) + 3008e76: fd842583 lw a1,-40(s0) + 3008e7a: fdc42503 lw a0,-36(s0) + 3008e7e: 3f1030ef jal ra,300ca6e + 3008e82: 87aa mv a5,a0 + 3008e84: fef407a3 sb a5,-17(s0) + 3008e88: fef40783 lb a5,-17(s0) + 3008e8c: 853e mv a0,a5 + 3008e8e: 50b2 lw ra,44(sp) + 3008e90: 5422 lw s0,40(sp) + 3008e92: 6145 addi sp,sp,48 + 3008e94: 8082 ret + +03008e96 : + 3008e96: 7179 addi sp,sp,-48 + 3008e98: d606 sw ra,44(sp) + 3008e9a: d422 sw s0,40(sp) + 3008e9c: 1800 addi s0,sp,48 + 3008e9e: fca42e23 sw a0,-36(s0) + 3008ea2: 87ae mv a5,a1 + 3008ea4: fcc42a23 sw a2,-44(s0) + 3008ea8: fcf40da3 sb a5,-37(s0) + 3008eac: fe0407a3 sb zero,-17(s0) + 3008eb0: fdb44783 lbu a5,-37(s0) + 3008eb4: fd442603 lw a2,-44(s0) + 3008eb8: 85be mv a1,a5 + 3008eba: fdc42503 lw a0,-36(s0) + 3008ebe: 111030ef jal ra,300c7ce + 3008ec2: 87aa mv a5,a0 + 3008ec4: fef407a3 sb a5,-17(s0) + 3008ec8: fef40783 lb a5,-17(s0) + 3008ecc: 853e mv a0,a5 + 3008ece: 50b2 lw ra,44(sp) + 3008ed0: 5422 lw s0,40(sp) + 3008ed2: 6145 addi sp,sp,48 + 3008ed4: 8082 ret + +03008ed6 : + 3008ed6: 7179 addi sp,sp,-48 + 3008ed8: d606 sw ra,44(sp) + 3008eda: d422 sw s0,40(sp) + 3008edc: 1800 addi s0,sp,48 + 3008ede: fca42e23 sw a0,-36(s0) + 3008ee2: 87ae mv a5,a1 + 3008ee4: 8732 mv a4,a2 + 3008ee6: fcf40da3 sb a5,-37(s0) + 3008eea: 87ba mv a5,a4 + 3008eec: fcf40d23 sb a5,-38(s0) + 3008ef0: fe0407a3 sb zero,-17(s0) + 3008ef4: fe0403a3 sb zero,-25(s0) + 3008ef8: fe040723 sb zero,-18(s0) + 3008efc: fe740793 addi a5,s0,-25 + 3008f00: 863e mv a2,a5 + 3008f02: 4585 li a1,1 + 3008f04: fdc42503 lw a0,-36(s0) + 3008f08: 2cd5 jal ra,30091fc + 3008f0a: 87aa mv a5,a0 + 3008f0c: fef407a3 sb a5,-17(s0) + 3008f10: fe744783 lbu a5,-25(s0) + 3008f14: fef40723 sb a5,-18(s0) + 3008f18: fef40783 lb a5,-17(s0) + 3008f1c: eff1 bnez a5,3008ff8 + 3008f1e: fda44703 lbu a4,-38(s0) + 3008f22: 4785 li a5,1 + 3008f24: 06f71763 bne a4,a5,3008f92 + 3008f28: fdb44783 lbu a5,-37(s0) + 3008f2c: 4711 li a4,4 + 3008f2e: 04f76e63 bltu a4,a5,3008f8a + 3008f32: 00279713 slli a4,a5,0x2 + 3008f36: 0300f7b7 lui a5,0x300f + 3008f3a: 40c78793 addi a5,a5,1036 # 300f40c + 3008f3e: 97ba add a5,a5,a4 + 3008f40: 439c lw a5,0(a5) + 3008f42: 8782 jr a5 + 3008f44: fee44783 lbu a5,-18(s0) + 3008f48: 0107e793 ori a5,a5,16 + 3008f4c: fef40723 sb a5,-18(s0) + 3008f50: a06d j 3008ffa + 3008f52: fee44783 lbu a5,-18(s0) + 3008f56: 0287e793 ori a5,a5,40 + 3008f5a: fef40723 sb a5,-18(s0) + 3008f5e: a871 j 3008ffa + 3008f60: fee44783 lbu a5,-18(s0) + 3008f64: 0047e793 ori a5,a5,4 + 3008f68: fef40723 sb a5,-18(s0) + 3008f6c: a079 j 3008ffa + 3008f6e: fee44783 lbu a5,-18(s0) + 3008f72: 0407e793 ori a5,a5,64 + 3008f76: fef40723 sb a5,-18(s0) + 3008f7a: a041 j 3008ffa + 3008f7c: fee44783 lbu a5,-18(s0) + 3008f80: f807e793 ori a5,a5,-128 + 3008f84: fef40723 sb a5,-18(s0) + 3008f88: a88d j 3008ffa + 3008f8a: 57f1 li a5,-4 + 3008f8c: fef407a3 sb a5,-17(s0) + 3008f90: a0ad j 3008ffa + 3008f92: fdb44783 lbu a5,-37(s0) + 3008f96: 4711 li a4,4 + 3008f98: 04f76c63 bltu a4,a5,3008ff0 + 3008f9c: 00279713 slli a4,a5,0x2 + 3008fa0: 0300f7b7 lui a5,0x300f + 3008fa4: 42078793 addi a5,a5,1056 # 300f420 + 3008fa8: 97ba add a5,a5,a4 + 3008faa: 439c lw a5,0(a5) + 3008fac: 8782 jr a5 + 3008fae: fee44783 lbu a5,-18(s0) + 3008fb2: 9bbd andi a5,a5,-17 + 3008fb4: fef40723 sb a5,-18(s0) + 3008fb8: a089 j 3008ffa + 3008fba: fee44783 lbu a5,-18(s0) + 3008fbe: fd77f793 andi a5,a5,-41 + 3008fc2: fef40723 sb a5,-18(s0) + 3008fc6: a815 j 3008ffa + 3008fc8: fee44783 lbu a5,-18(s0) + 3008fcc: 9bed andi a5,a5,-5 + 3008fce: fef40723 sb a5,-18(s0) + 3008fd2: a025 j 3008ffa + 3008fd4: fee44783 lbu a5,-18(s0) + 3008fd8: fbf7f793 andi a5,a5,-65 + 3008fdc: fef40723 sb a5,-18(s0) + 3008fe0: a829 j 3008ffa + 3008fe2: fee44783 lbu a5,-18(s0) + 3008fe6: 07f7f793 andi a5,a5,127 + 3008fea: fef40723 sb a5,-18(s0) + 3008fee: a031 j 3008ffa + 3008ff0: 57f1 li a5,-4 + 3008ff2: fef407a3 sb a5,-17(s0) + 3008ff6: a011 j 3008ffa + 3008ff8: 0001 nop + 3008ffa: fe744783 lbu a5,-25(s0) + 3008ffe: fee44703 lbu a4,-18(s0) + 3009002: 04f70563 beq a4,a5,300904c + 3009006: fef40783 lb a5,-17(s0) + 300900a: eb99 bnez a5,3009020 + 300900c: fee44783 lbu a5,-18(s0) + 3009010: 863e mv a2,a5 + 3009012: 4585 li a1,1 + 3009014: fdc42503 lw a0,-36(s0) + 3009018: 3671 jal ra,3008ba4 + 300901a: 87aa mv a5,a0 + 300901c: fef407a3 sb a5,-17(s0) + 3009020: fef40783 lb a5,-17(s0) + 3009024: e799 bnez a5,3009032 + 3009026: fdc42783 lw a5,-36(s0) + 300902a: fee44703 lbu a4,-18(s0) + 300902e: 14e78e23 sb a4,348(a5) + 3009032: fef40783 lb a5,-17(s0) + 3009036: eb99 bnez a5,300904c + 3009038: fdc42783 lw a5,-36(s0) + 300903c: 47dc lw a5,12(a5) + 300903e: fef42423 sw a5,-24(s0) + 3009042: fe842583 lw a1,-24(s0) + 3009046: fdc42503 lw a0,-36(s0) + 300904a: 33d5 jal ra,3008e2e + 300904c: fef40783 lb a5,-17(s0) + 3009050: 853e mv a0,a5 + 3009052: 50b2 lw ra,44(sp) + 3009054: 5422 lw s0,40(sp) + 3009056: 6145 addi sp,sp,48 + 3009058: 8082 ret + +0300905a : + 300905a: 7179 addi sp,sp,-48 + 300905c: d622 sw s0,44(sp) + 300905e: 1800 addi s0,sp,48 + 3009060: fca42e23 sw a0,-36(s0) + 3009064: 87ae mv a5,a1 + 3009066: 8732 mv a4,a2 + 3009068: fcd42a23 sw a3,-44(s0) + 300906c: fcf40da3 sb a5,-37(s0) + 3009070: 87ba mv a5,a4 + 3009072: fcf40d23 sb a5,-38(s0) + 3009076: fe0407a3 sb zero,-17(s0) + 300907a: fd442783 lw a5,-44(s0) + 300907e: 00078023 sb zero,0(a5) + 3009082: fdb44783 lbu a5,-37(s0) + 3009086: 4711 li a4,4 + 3009088: 08f76063 bltu a4,a5,3009108 + 300908c: 00279713 slli a4,a5,0x2 + 3009090: 0300f7b7 lui a5,0x300f + 3009094: 43478793 addi a5,a5,1076 # 300f434 + 3009098: 97ba add a5,a5,a4 + 300909a: 439c lw a5,0(a5) + 300909c: 8782 jr a5 + 300909e: fda44783 lbu a5,-38(s0) + 30090a2: 8791 srai a5,a5,0x4 + 30090a4: 9f81 uxtb a5 + 30090a6: 8b85 andi a5,a5,1 + 30090a8: 0ff7f713 andi a4,a5,255 + 30090ac: fd442783 lw a5,-44(s0) + 30090b0: a398 sb a4,0(a5) + 30090b2: a8b1 j 300910e + 30090b4: fda44783 lbu a5,-38(s0) + 30090b8: 878d srai a5,a5,0x3 + 30090ba: 9f81 uxtb a5 + 30090bc: 8b85 andi a5,a5,1 + 30090be: 0ff7f713 andi a4,a5,255 + 30090c2: fd442783 lw a5,-44(s0) + 30090c6: a398 sb a4,0(a5) + 30090c8: a099 j 300910e + 30090ca: fda44783 lbu a5,-38(s0) + 30090ce: 8789 srai a5,a5,0x2 + 30090d0: 9f81 uxtb a5 + 30090d2: 8b85 andi a5,a5,1 + 30090d4: 0ff7f713 andi a4,a5,255 + 30090d8: fd442783 lw a5,-44(s0) + 30090dc: a398 sb a4,0(a5) + 30090de: a805 j 300910e + 30090e0: fda44783 lbu a5,-38(s0) + 30090e4: 8799 srai a5,a5,0x6 + 30090e6: 9f81 uxtb a5 + 30090e8: 8b85 andi a5,a5,1 + 30090ea: 0ff7f713 andi a4,a5,255 + 30090ee: fd442783 lw a5,-44(s0) + 30090f2: a398 sb a4,0(a5) + 30090f4: a829 j 300910e + 30090f6: fda44783 lbu a5,-38(s0) + 30090fa: 839d srli a5,a5,0x7 + 30090fc: 0ff7f713 andi a4,a5,255 + 3009100: fd442783 lw a5,-44(s0) + 3009104: a398 sb a4,0(a5) + 3009106: a021 j 300910e + 3009108: 57f1 li a5,-4 + 300910a: fef407a3 sb a5,-17(s0) + 300910e: fef40783 lb a5,-17(s0) + 3009112: 853e mv a0,a5 + 3009114: 5432 lw s0,44(sp) + 3009116: 6145 addi sp,sp,48 + 3009118: 8082 ret + +0300911a : + 300911a: 7179 addi sp,sp,-48 + 300911c: d606 sw ra,44(sp) + 300911e: d422 sw s0,40(sp) + 3009120: 1800 addi s0,sp,48 + 3009122: fca42e23 sw a0,-36(s0) + 3009126: fcb42c23 sw a1,-40(s0) + 300912a: fe0407a3 sb zero,-17(s0) + 300912e: fe040723 sb zero,-18(s0) + 3009132: fee40793 addi a5,s0,-18 + 3009136: 863e mv a2,a5 + 3009138: 4585 li a1,1 + 300913a: fdc42503 lw a0,-36(s0) + 300913e: 287d jal ra,30091fc + 3009140: 87aa mv a5,a0 + 3009142: fef407a3 sb a5,-17(s0) + 3009146: fef40783 lb a5,-17(s0) + 300914a: ef91 bnez a5,3009166 + 300914c: fee44783 lbu a5,-18(s0) + 3009150: fd842703 lw a4,-40(s0) + 3009154: 86ba mv a3,a4 + 3009156: 863e mv a2,a5 + 3009158: 4581 li a1,0 + 300915a: fdc42503 lw a0,-36(s0) + 300915e: 3df5 jal ra,300905a + 3009160: 87aa mv a5,a0 + 3009162: fef407a3 sb a5,-17(s0) + 3009166: fef40783 lb a5,-17(s0) + 300916a: ef99 bnez a5,3009188 + 300916c: fee44703 lbu a4,-18(s0) + 3009170: fd842783 lw a5,-40(s0) + 3009174: 0789 addi a5,a5,2 + 3009176: 86be mv a3,a5 + 3009178: 863a mv a2,a4 + 300917a: 4585 li a1,1 + 300917c: fdc42503 lw a0,-36(s0) + 3009180: 3de9 jal ra,300905a + 3009182: 87aa mv a5,a0 + 3009184: fef407a3 sb a5,-17(s0) + 3009188: fef40783 lb a5,-17(s0) + 300918c: ef99 bnez a5,30091aa + 300918e: fee44703 lbu a4,-18(s0) + 3009192: fd842783 lw a5,-40(s0) + 3009196: 0785 addi a5,a5,1 + 3009198: 86be mv a3,a5 + 300919a: 863a mv a2,a4 + 300919c: 4589 li a1,2 + 300919e: fdc42503 lw a0,-36(s0) + 30091a2: 3d65 jal ra,300905a + 30091a4: 87aa mv a5,a0 + 30091a6: fef407a3 sb a5,-17(s0) + 30091aa: fef40783 lb a5,-17(s0) + 30091ae: ef99 bnez a5,30091cc + 30091b0: fee44703 lbu a4,-18(s0) + 30091b4: fd842783 lw a5,-40(s0) + 30091b8: 078d addi a5,a5,3 + 30091ba: 86be mv a3,a5 + 30091bc: 863a mv a2,a4 + 30091be: 458d li a1,3 + 30091c0: fdc42503 lw a0,-36(s0) + 30091c4: 3d59 jal ra,300905a + 30091c6: 87aa mv a5,a0 + 30091c8: fef407a3 sb a5,-17(s0) + 30091cc: fef40783 lb a5,-17(s0) + 30091d0: ef99 bnez a5,30091ee + 30091d2: fee44703 lbu a4,-18(s0) + 30091d6: fd842783 lw a5,-40(s0) + 30091da: 0791 addi a5,a5,4 + 30091dc: 86be mv a3,a5 + 30091de: 863a mv a2,a4 + 30091e0: 4591 li a1,4 + 30091e2: fdc42503 lw a0,-36(s0) + 30091e6: 3d95 jal ra,300905a + 30091e8: 87aa mv a5,a0 + 30091ea: fef407a3 sb a5,-17(s0) + 30091ee: fef40783 lb a5,-17(s0) + 30091f2: 853e mv a0,a5 + 30091f4: 50b2 lw ra,44(sp) + 30091f6: 5422 lw s0,40(sp) + 30091f8: 6145 addi sp,sp,48 + 30091fa: 8082 ret + +030091fc : + 30091fc: 3e60506f j 300e5e2 + +03009200 : + 3009200: 7179 addi sp,sp,-48 + 3009202: d606 sw ra,44(sp) + 3009204: d422 sw s0,40(sp) + 3009206: 1800 addi s0,sp,48 + 3009208: fca42e23 sw a0,-36(s0) + 300920c: fcb42c23 sw a1,-40(s0) + 3009210: fe0407a3 sb zero,-17(s0) + 3009214: fec40793 addi a5,s0,-20 + 3009218: 863e mv a2,a5 + 300921a: 0f800593 li a1,248 + 300921e: fdc42503 lw a0,-36(s0) + 3009222: 2b29 jal ra,300973c + 3009224: 87aa mv a5,a0 + 3009226: fef407a3 sb a5,-17(s0) + 300922a: fef40783 lb a5,-17(s0) + 300922e: ef81 bnez a5,3009246 + 3009230: fe840793 addi a5,s0,-24 + 3009234: 863e mv a2,a5 + 3009236: 4591 li a1,4 + 3009238: fdc42503 lw a0,-36(s0) + 300923c: 452050ef jal ra,300e68e + 3009240: 87aa mv a5,a0 + 3009242: fef407a3 sb a5,-17(s0) + 3009246: fef40783 lb a5,-17(s0) + 300924a: e39d bnez a5,3009270 + 300924c: fec45783 lhu a5,-20(s0) + 3009250: cb91 beqz a5,3009264 + 3009252: fe842783 lw a5,-24(s0) + 3009256: fec45703 lhu a4,-20(s0) + 300925a: 02e7d733 divu a4,a5,a4 + 300925e: fd842783 lw a5,-40(s0) + 3009262: c398 sw a4,0(a5) + 3009264: fd842783 lw a5,-40(s0) + 3009268: 4398 lw a4,0(a5) + 300926a: fdc42783 lw a5,-36(s0) + 300926e: cb98 sw a4,16(a5) + 3009270: fef40783 lb a5,-17(s0) + 3009274: 853e mv a0,a5 + 3009276: 50b2 lw ra,44(sp) + 3009278: 5422 lw s0,40(sp) + 300927a: 6145 addi sp,sp,48 + 300927c: 8082 ret + +0300927e : + 300927e: 7179 addi sp,sp,-48 + 3009280: d622 sw s0,44(sp) + 3009282: 1800 addi s0,sp,48 + 3009284: fca42e23 sw a0,-36(s0) + 3009288: fcb42c23 sw a1,-40(s0) + 300928c: fe0407a3 sb zero,-17(s0) + 3009290: fdc42783 lw a5,-36(s0) + 3009294: 2bdc lbu a5,20(a5) + 3009296: fef40723 sb a5,-18(s0) + 300929a: fd842783 lw a5,-40(s0) + 300929e: fee44703 lbu a4,-18(s0) + 30092a2: a398 sb a4,0(a5) + 30092a4: fef40783 lb a5,-17(s0) + 30092a8: 853e mv a0,a5 + 30092aa: 5432 lw s0,44(sp) + 30092ac: 6145 addi sp,sp,48 + 30092ae: 8082 ret + +030092b0 : + 30092b0: 7179 addi sp,sp,-48 + 30092b2: d606 sw ra,44(sp) + 30092b4: d422 sw s0,40(sp) + 30092b6: 1800 addi s0,sp,48 + 30092b8: fca42e23 sw a0,-36(s0) + 30092bc: fcb42c23 sw a1,-40(s0) + 30092c0: fe0407a3 sb zero,-17(s0) + 30092c4: fe640793 addi a5,s0,-26 + 30092c8: 863e mv a2,a5 + 30092ca: 02000593 li a1,32 + 30092ce: fdc42503 lw a0,-36(s0) + 30092d2: 21ad jal ra,300973c + 30092d4: 87aa mv a5,a0 + 30092d6: fef407a3 sb a5,-17(s0) + 30092da: fef40783 lb a5,-17(s0) + 30092de: e7b1 bnez a5,300932a + 30092e0: fe645783 lhu a5,-26(s0) + 30092e4: e385 bnez a5,3009304 + 30092e6: fdc42783 lw a5,-36(s0) + 30092ea: 4f9c lw a5,24(a5) + 30092ec: fef42423 sw a5,-24(s0) + 30092f0: fd842783 lw a5,-40(s0) + 30092f4: fe842703 lw a4,-24(s0) + 30092f8: c398 sw a4,0(a5) + 30092fa: fdc42783 lw a5,-36(s0) + 30092fe: 00078a23 sb zero,20(a5) + 3009302: a025 j 300932a + 3009304: fe645783 lhu a5,-26(s0) + 3009308: 078e slli a5,a5,0x3 + 300930a: fef42423 sw a5,-24(s0) + 300930e: fd842783 lw a5,-40(s0) + 3009312: fe842703 lw a4,-24(s0) + 3009316: c398 sw a4,0(a5) + 3009318: fdc42783 lw a5,-36(s0) + 300931c: fe842703 lw a4,-24(s0) + 3009320: cf98 sw a4,24(a5) + 3009322: fdc42783 lw a5,-36(s0) + 3009326: 4705 li a4,1 + 3009328: abd8 sb a4,20(a5) + 300932a: fef40783 lb a5,-17(s0) + 300932e: 853e mv a0,a5 + 3009330: 50b2 lw ra,44(sp) + 3009332: 5422 lw s0,40(sp) + 3009334: 6145 addi sp,sp,48 + 3009336: 8082 ret + +03009338 : + 3009338: 7179 addi sp,sp,-48 + 300933a: d606 sw ra,44(sp) + 300933c: d422 sw s0,40(sp) + 300933e: 1800 addi s0,sp,48 + 3009340: fca42e23 sw a0,-36(s0) + 3009344: 87ae mv a5,a1 + 3009346: 8732 mv a4,a2 + 3009348: fcf41d23 sh a5,-38(s0) + 300934c: 87ba mv a5,a4 + 300934e: fcf40ca3 sb a5,-39(s0) + 3009352: fe0407a3 sb zero,-17(s0) + 3009356: fe042423 sw zero,-24(s0) + 300935a: fe0403a3 sb zero,-25(s0) + 300935e: fe040323 sb zero,-26(s0) + 3009362: fda45703 lhu a4,-38(s0) + 3009366: 4795 li a5,5 + 3009368: 00e7f663 bgeu a5,a4,3009374 + 300936c: 57f1 li a5,-4 + 300936e: fef407a3 sb a5,-17(s0) + 3009372: a0fd j 3009460 + 3009374: fd944783 lbu a5,-39(s0) + 3009378: eb89 bnez a5,300938a + 300937a: fe042423 sw zero,-24(s0) + 300937e: fe0403a3 sb zero,-25(s0) + 3009382: 4785 li a5,1 + 3009384: fef40323 sb a5,-26(s0) + 3009388: a005 j 30093a8 + 300938a: fda45783 lhu a5,-38(s0) + 300938e: fdc42703 lw a4,-36(s0) + 3009392: 07a1 addi a5,a5,8 + 3009394: 078a slli a5,a5,0x2 + 3009396: 97ba add a5,a5,a4 + 3009398: 47dc lw a5,12(a5) + 300939a: fef42423 sw a5,-24(s0) + 300939e: fe040323 sb zero,-26(s0) + 30093a2: 4785 li a5,1 + 30093a4: fef403a3 sb a5,-25(s0) + 30093a8: fda45783 lhu a5,-38(s0) + 30093ac: 4715 li a4,5 + 30093ae: 0af76663 bltu a4,a5,300945a + 30093b2: 00279713 slli a4,a5,0x2 + 30093b6: 0300f7b7 lui a5,0x300f + 30093ba: 44878793 addi a5,a5,1096 # 300f448 + 30093be: 97ba add a5,a5,a4 + 30093c0: 439c lw a5,0(a5) + 30093c2: 8782 jr a5 + 30093c4: fdc42783 lw a5,-36(s0) + 30093c8: fe744703 lbu a4,-25(s0) + 30093cc: 02e78023 sb a4,32(a5) + 30093d0: a841 j 3009460 + 30093d2: fe842783 lw a5,-24(s0) + 30093d6: 83a5 srli a5,a5,0x9 + 30093d8: 9fa1 uxth a5 + 30093da: 863e mv a2,a5 + 30093dc: 04400593 li a1,68 + 30093e0: fdc42503 lw a0,-36(s0) + 30093e4: 2afd jal ra,30095e2 + 30093e6: 87aa mv a5,a0 + 30093e8: fef407a3 sb a5,-17(s0) + 30093ec: a895 j 3009460 + 30093ee: fdc42783 lw a5,-36(s0) + 30093f2: fe744703 lbu a4,-25(s0) + 30093f6: 02e78123 sb a4,34(a5) + 30093fa: a09d j 3009460 + 30093fc: fdc42783 lw a5,-36(s0) + 3009400: fe744703 lbu a4,-25(s0) + 3009404: 02e781a3 sb a4,35(a5) + 3009408: a8a1 j 3009460 + 300940a: fe644783 lbu a5,-26(s0) + 300940e: 0786 slli a5,a5,0x1 + 3009410: fef402a3 sb a5,-27(s0) + 3009414: fe544783 lbu a5,-27(s0) + 3009418: 86be mv a3,a5 + 300941a: 0fe00613 li a2,254 + 300941e: 06000593 li a1,96 + 3009422: fdc42503 lw a0,-36(s0) + 3009426: 116050ef jal ra,300e53c + 300942a: 87aa mv a5,a0 + 300942c: fef407a3 sb a5,-17(s0) + 3009430: a805 j 3009460 + 3009432: fe644783 lbu a5,-26(s0) + 3009436: 0792 slli a5,a5,0x4 + 3009438: fef402a3 sb a5,-27(s0) + 300943c: fe544783 lbu a5,-27(s0) + 3009440: 86be mv a3,a5 + 3009442: 0ef00613 li a2,239 + 3009446: 06000593 li a1,96 + 300944a: fdc42503 lw a0,-36(s0) + 300944e: 0ee050ef jal ra,300e53c + 3009452: 87aa mv a5,a0 + 3009454: fef407a3 sb a5,-17(s0) + 3009458: a021 j 3009460 + 300945a: 57f1 li a5,-4 + 300945c: fef407a3 sb a5,-17(s0) + 3009460: fef40783 lb a5,-17(s0) + 3009464: e785 bnez a5,300948c + 3009466: fd944783 lbu a5,-39(s0) + 300946a: eb89 bnez a5,300947c + 300946c: fda45783 lhu a5,-38(s0) + 3009470: fdc42703 lw a4,-36(s0) + 3009474: 97ba add a5,a5,a4 + 3009476: 02078023 sb zero,32(a5) + 300947a: a809 j 300948c + 300947c: fda45783 lhu a5,-38(s0) + 3009480: fdc42703 lw a4,-36(s0) + 3009484: 97ba add a5,a5,a4 + 3009486: 4705 li a4,1 + 3009488: 02e78023 sb a4,32(a5) + 300948c: fef40783 lb a5,-17(s0) + 3009490: 853e mv a0,a5 + 3009492: 50b2 lw ra,44(sp) + 3009494: 5422 lw s0,40(sp) + 3009496: 6145 addi sp,sp,48 + 3009498: 8082 ret + +0300949a : + 300949a: 7179 addi sp,sp,-48 + 300949c: d622 sw s0,44(sp) + 300949e: 1800 addi s0,sp,48 + 30094a0: fca42e23 sw a0,-36(s0) + 30094a4: 87ae mv a5,a1 + 30094a6: fcc42a23 sw a2,-44(s0) + 30094aa: fcf41d23 sh a5,-38(s0) + 30094ae: fe0407a3 sb zero,-17(s0) + 30094b2: fda45703 lhu a4,-38(s0) + 30094b6: 4795 li a5,5 + 30094b8: 00e7fa63 bgeu a5,a4,30094cc + 30094bc: 57f1 li a5,-4 + 30094be: fef407a3 sb a5,-17(s0) + 30094c2: fd442783 lw a5,-44(s0) + 30094c6: 00078023 sb zero,0(a5) + 30094ca: a839 j 30094e8 + 30094cc: fda45783 lhu a5,-38(s0) + 30094d0: fdc42703 lw a4,-36(s0) + 30094d4: 97ba add a5,a5,a4 + 30094d6: 0207c783 lbu a5,32(a5) + 30094da: fef40723 sb a5,-18(s0) + 30094de: fd442783 lw a5,-44(s0) + 30094e2: fee44703 lbu a4,-18(s0) + 30094e6: a398 sb a4,0(a5) + 30094e8: fef40783 lb a5,-17(s0) + 30094ec: 853e mv a0,a5 + 30094ee: 5432 lw s0,44(sp) + 30094f0: 6145 addi sp,sp,48 + 30094f2: 8082 ret + +030094f4 : + 30094f4: 7179 addi sp,sp,-48 + 30094f6: d606 sw ra,44(sp) + 30094f8: d422 sw s0,40(sp) + 30094fa: 1800 addi s0,sp,48 + 30094fc: fca42e23 sw a0,-36(s0) + 3009500: 87ae mv a5,a1 + 3009502: fcc42a23 sw a2,-44(s0) + 3009506: fcf41d23 sh a5,-38(s0) + 300950a: fe0407a3 sb zero,-17(s0) + 300950e: fda45783 lhu a5,-38(s0) + 3009512: fdc42703 lw a4,-36(s0) + 3009516: 97ba add a5,a5,a4 + 3009518: 0207c783 lbu a5,32(a5) + 300951c: fef40723 sb a5,-18(s0) + 3009520: fee44783 lbu a5,-18(s0) + 3009524: ef81 bnez a5,300953c + 3009526: fda45783 lhu a5,-38(s0) + 300952a: fdc42703 lw a4,-36(s0) + 300952e: 07a1 addi a5,a5,8 + 3009530: 078a slli a5,a5,0x2 + 3009532: 97ba add a5,a5,a4 + 3009534: fd442703 lw a4,-44(s0) + 3009538: c7d8 sw a4,12(a5) + 300953a: a869 j 30095d4 + 300953c: fda45783 lhu a5,-38(s0) + 3009540: 4715 li a4,5 + 3009542: 06f76963 bltu a4,a5,30095b4 + 3009546: 00279713 slli a4,a5,0x2 + 300954a: 0300f7b7 lui a5,0x300f + 300954e: 46078793 addi a5,a5,1120 # 300f460 + 3009552: 97ba add a5,a5,a4 + 3009554: 439c lw a5,0(a5) + 3009556: 8782 jr a5 + 3009558: fdc42783 lw a5,-36(s0) + 300955c: fd442703 lw a4,-44(s0) + 3009560: d7d8 sw a4,44(a5) + 3009562: a8a1 j 30095ba + 3009564: fd442783 lw a5,-44(s0) + 3009568: 83a5 srli a5,a5,0x9 + 300956a: 9fa1 uxth a5 + 300956c: 863e mv a2,a5 + 300956e: 04400593 li a1,68 + 3009572: fdc42503 lw a0,-36(s0) + 3009576: 20b5 jal ra,30095e2 + 3009578: 87aa mv a5,a0 + 300957a: fef407a3 sb a5,-17(s0) + 300957e: a835 j 30095ba + 3009580: fdc42783 lw a5,-36(s0) + 3009584: fd442703 lw a4,-44(s0) + 3009588: dbd8 sw a4,52(a5) + 300958a: a805 j 30095ba + 300958c: fdc42783 lw a5,-36(s0) + 3009590: fd442703 lw a4,-44(s0) + 3009594: df98 sw a4,56(a5) + 3009596: a015 j 30095ba + 3009598: fd442783 lw a5,-44(s0) + 300959c: 83a5 srli a5,a5,0x9 + 300959e: 9fa1 uxth a5 + 30095a0: 863e mv a2,a5 + 30095a2: 06400593 li a1,100 + 30095a6: fdc42503 lw a0,-36(s0) + 30095aa: 2825 jal ra,30095e2 + 30095ac: 87aa mv a5,a0 + 30095ae: fef407a3 sb a5,-17(s0) + 30095b2: a021 j 30095ba + 30095b4: 57f1 li a5,-4 + 30095b6: fef407a3 sb a5,-17(s0) + 30095ba: fef40783 lb a5,-17(s0) + 30095be: eb99 bnez a5,30095d4 + 30095c0: fda45783 lhu a5,-38(s0) + 30095c4: fdc42703 lw a4,-36(s0) + 30095c8: 07a1 addi a5,a5,8 + 30095ca: 078a slli a5,a5,0x2 + 30095cc: 97ba add a5,a5,a4 + 30095ce: fd442703 lw a4,-44(s0) + 30095d2: c7d8 sw a4,12(a5) + 30095d4: fef40783 lb a5,-17(s0) + 30095d8: 853e mv a0,a5 + 30095da: 50b2 lw ra,44(sp) + 30095dc: 5422 lw s0,40(sp) + 30095de: 6145 addi sp,sp,48 + 30095e0: 8082 ret + +030095e2 : + 30095e2: 6ff0406f j 300e4e0 + +030095e6 : + 30095e6: 7179 addi sp,sp,-48 + 30095e8: d606 sw ra,44(sp) + 30095ea: d422 sw s0,40(sp) + 30095ec: 1800 addi s0,sp,48 + 30095ee: fca42e23 sw a0,-36(s0) + 30095f2: 87ae mv a5,a1 + 30095f4: fcc42a23 sw a2,-44(s0) + 30095f8: fcf41d23 sh a5,-38(s0) + 30095fc: fe0407a3 sb zero,-17(s0) + 3009600: fe040723 sb zero,-18(s0) + 3009604: fda45783 lhu a5,-38(s0) + 3009608: 4715 li a4,5 + 300960a: 0af76063 bltu a4,a5,30096aa + 300960e: 00279713 slli a4,a5,0x2 + 3009612: 0300f7b7 lui a5,0x300f + 3009616: 47878793 addi a5,a5,1144 # 300f478 + 300961a: 97ba add a5,a5,a4 + 300961c: 439c lw a5,0(a5) + 300961e: 8782 jr a5 + 3009620: fdc42783 lw a5,-36(s0) + 3009624: 57dc lw a5,44(a5) + 3009626: fef42423 sw a5,-24(s0) + 300962a: fe040723 sb zero,-18(s0) + 300962e: a049 j 30096b0 + 3009630: fe640793 addi a5,s0,-26 + 3009634: 863e mv a2,a5 + 3009636: 04400593 li a1,68 + 300963a: fdc42503 lw a0,-36(s0) + 300963e: 28fd jal ra,300973c + 3009640: 87aa mv a5,a0 + 3009642: fef407a3 sb a5,-17(s0) + 3009646: fef40783 lb a5,-17(s0) + 300964a: e791 bnez a5,3009656 + 300964c: fe645783 lhu a5,-26(s0) + 3009650: 07a6 slli a5,a5,0x9 + 3009652: fef42423 sw a5,-24(s0) + 3009656: 4785 li a5,1 + 3009658: fef40723 sb a5,-18(s0) + 300965c: a891 j 30096b0 + 300965e: fdc42783 lw a5,-36(s0) + 3009662: 5bdc lw a5,52(a5) + 3009664: fef42423 sw a5,-24(s0) + 3009668: fe040723 sb zero,-18(s0) + 300966c: a091 j 30096b0 + 300966e: fdc42783 lw a5,-36(s0) + 3009672: 5f9c lw a5,56(a5) + 3009674: fef42423 sw a5,-24(s0) + 3009678: fe040723 sb zero,-18(s0) + 300967c: a815 j 30096b0 + 300967e: fe640793 addi a5,s0,-26 + 3009682: 863e mv a2,a5 + 3009684: 06400593 li a1,100 + 3009688: fdc42503 lw a0,-36(s0) + 300968c: 2845 jal ra,300973c + 300968e: 87aa mv a5,a0 + 3009690: fef407a3 sb a5,-17(s0) + 3009694: fef40783 lb a5,-17(s0) + 3009698: e791 bnez a5,30096a4 + 300969a: fe645783 lhu a5,-26(s0) + 300969e: 07a6 slli a5,a5,0x9 + 30096a0: fef42423 sw a5,-24(s0) + 30096a4: fe040723 sb zero,-18(s0) + 30096a8: a021 j 30096b0 + 30096aa: 57f1 li a5,-4 + 30096ac: fef407a3 sb a5,-17(s0) + 30096b0: fef40783 lb a5,-17(s0) + 30096b4: efad bnez a5,300972e + 30096b6: fee44703 lbu a4,-18(s0) + 30096ba: 4785 li a5,1 + 30096bc: 06f71463 bne a4,a5,3009724 + 30096c0: fe842783 lw a5,-24(s0) + 30096c4: eb85 bnez a5,30096f4 + 30096c6: fda45783 lhu a5,-38(s0) + 30096ca: fdc42703 lw a4,-36(s0) + 30096ce: 07a1 addi a5,a5,8 + 30096d0: 078a slli a5,a5,0x2 + 30096d2: 97ba add a5,a5,a4 + 30096d4: 47dc lw a5,12(a5) + 30096d6: fef42423 sw a5,-24(s0) + 30096da: fd442783 lw a5,-44(s0) + 30096de: fe842703 lw a4,-24(s0) + 30096e2: c398 sw a4,0(a5) + 30096e4: fda45783 lhu a5,-38(s0) + 30096e8: fdc42703 lw a4,-36(s0) + 30096ec: 97ba add a5,a5,a4 + 30096ee: 02078023 sb zero,32(a5) + 30096f2: a835 j 300972e + 30096f4: fd442783 lw a5,-44(s0) + 30096f8: fe842703 lw a4,-24(s0) + 30096fc: c398 sw a4,0(a5) + 30096fe: fda45783 lhu a5,-38(s0) + 3009702: fdc42703 lw a4,-36(s0) + 3009706: 07a1 addi a5,a5,8 + 3009708: 078a slli a5,a5,0x2 + 300970a: 97ba add a5,a5,a4 + 300970c: fe842703 lw a4,-24(s0) + 3009710: c7d8 sw a4,12(a5) + 3009712: fda45783 lhu a5,-38(s0) + 3009716: fdc42703 lw a4,-36(s0) + 300971a: 97ba add a5,a5,a4 + 300971c: 4705 li a4,1 + 300971e: 02e78023 sb a4,32(a5) + 3009722: a031 j 300972e + 3009724: fd442783 lw a5,-44(s0) + 3009728: fe842703 lw a4,-24(s0) + 300972c: c398 sw a4,0(a5) + 300972e: fef40783 lb a5,-17(s0) + 3009732: 853e mv a0,a5 + 3009734: 50b2 lw ra,44(sp) + 3009736: 5422 lw s0,40(sp) + 3009738: 6145 addi sp,sp,48 + 300973a: 8082 ret + +0300973c : + 300973c: 6fd0406f j 300e638 + +03009740 : + 3009740: 7179 addi sp,sp,-48 + 3009742: d606 sw ra,44(sp) + 3009744: d422 sw s0,40(sp) + 3009746: 1800 addi s0,sp,48 + 3009748: fca42e23 sw a0,-36(s0) + 300974c: fcb42c23 sw a1,-40(s0) + 3009750: fe0407a3 sb zero,-17(s0) + 3009754: fee40793 addi a5,s0,-18 + 3009758: 863e mv a2,a5 + 300975a: 4585 li a1,1 + 300975c: fdc42503 lw a0,-36(s0) + 3009760: 3c71 jal ra,30091fc + 3009762: 87aa mv a5,a0 + 3009764: fef407a3 sb a5,-17(s0) + 3009768: fef40783 lb a5,-17(s0) + 300976c: e795 bnez a5,3009798 + 300976e: fee44703 lbu a4,-18(s0) + 3009772: fdc42783 lw a5,-36(s0) + 3009776: 14e78e23 sb a4,348(a5) + 300977a: fee44783 lbu a5,-18(s0) + 300977e: 07e2 slli a5,a5,0x18 + 3009780: 87e1 srai a5,a5,0x18 + 3009782: 0007d763 bgez a5,3009790 + 3009786: fd842783 lw a5,-40(s0) + 300978a: 4705 li a4,1 + 300978c: a398 sb a4,0(a5) + 300978e: a029 j 3009798 + 3009790: fd842783 lw a5,-40(s0) + 3009794: 00078023 sb zero,0(a5) + 3009798: fef40783 lb a5,-17(s0) + 300979c: eb81 bnez a5,30097ac + 300979e: fd842783 lw a5,-40(s0) + 30097a2: 2398 lbu a4,0(a5) + 30097a4: fdc42783 lw a5,-36(s0) + 30097a8: 06e78e23 sb a4,124(a5) + 30097ac: fef40783 lb a5,-17(s0) + 30097b0: 853e mv a0,a5 + 30097b2: 50b2 lw ra,44(sp) + 30097b4: 5422 lw s0,40(sp) + 30097b6: 6145 addi sp,sp,48 + 30097b8: 8082 ret + +030097ba : + 30097ba: 7179 addi sp,sp,-48 + 30097bc: d606 sw ra,44(sp) + 30097be: d422 sw s0,40(sp) + 30097c0: 1800 addi s0,sp,48 + 30097c2: fca42e23 sw a0,-36(s0) + 30097c6: fe0407a3 sb zero,-17(s0) + 30097ca: fee40793 addi a5,s0,-18 + 30097ce: 85be mv a1,a5 + 30097d0: fdc42503 lw a0,-36(s0) + 30097d4: de4ff0ef jal ra,3008db8 + 30097d8: 87aa mv a5,a0 + 30097da: fef407a3 sb a5,-17(s0) + 30097de: fef40783 lb a5,-17(s0) + 30097e2: eb91 bnez a5,30097f6 + 30097e4: fee44783 lbu a5,-18(s0) + 30097e8: e799 bnez a5,30097f6 + 30097ea: fdc42503 lw a0,-36(s0) + 30097ee: 2cd1 jal ra,3009ac2 + 30097f0: 87aa mv a5,a0 + 30097f2: fef407a3 sb a5,-17(s0) + 30097f6: fef40783 lb a5,-17(s0) + 30097fa: eb81 bnez a5,300980a + 30097fc: fdc42503 lw a0,-36(s0) + 3009800: 4df010ef jal ra,300b4de + 3009804: 87aa mv a5,a0 + 3009806: fef407a3 sb a5,-17(s0) + 300980a: fef40783 lb a5,-17(s0) + 300980e: eb89 bnez a5,3009820 + 3009810: fee44783 lbu a5,-18(s0) + 3009814: e791 bnez a5,3009820 + 3009816: fdc42783 lw a5,-36(s0) + 300981a: 470d li a4,3 + 300981c: 14e78f23 sb a4,350(a5) + 3009820: fef40783 lb a5,-17(s0) + 3009824: 853e mv a0,a5 + 3009826: 50b2 lw ra,44(sp) + 3009828: 5422 lw s0,40(sp) + 300982a: 6145 addi sp,sp,48 + 300982c: 8082 ret + +0300982e : + 300982e: 7179 addi sp,sp,-48 + 3009830: d606 sw ra,44(sp) + 3009832: d422 sw s0,40(sp) + 3009834: 1800 addi s0,sp,48 + 3009836: fca42e23 sw a0,-36(s0) + 300983a: fcb42c23 sw a1,-40(s0) + 300983e: fcc42a23 sw a2,-44(s0) + 3009842: fe0407a3 sb zero,-17(s0) + 3009846: 4685 li a3,1 + 3009848: fd442603 lw a2,-44(s0) + 300984c: fd842583 lw a1,-40(s0) + 3009850: fdc42503 lw a0,-36(s0) + 3009854: 3ed010ef jal ra,300b440 + 3009858: 87aa mv a5,a0 + 300985a: fef407a3 sb a5,-17(s0) + 300985e: fef40783 lb a5,-17(s0) + 3009862: 853e mv a0,a5 + 3009864: 50b2 lw ra,44(sp) + 3009866: 5422 lw s0,40(sp) + 3009868: 6145 addi sp,sp,48 + 300986a: 8082 ret + +0300986c : + 300986c: 7179 addi sp,sp,-48 + 300986e: d606 sw ra,44(sp) + 3009870: d422 sw s0,40(sp) + 3009872: 1800 addi s0,sp,48 + 3009874: fca42e23 sw a0,-36(s0) + 3009878: 87ae mv a5,a1 + 300987a: fcf40da3 sb a5,-37(s0) + 300987e: fe0407a3 sb zero,-17(s0) + 3009882: fdc42783 lw a5,-36(s0) + 3009886: 1067c783 lbu a5,262(a5) + 300988a: fef40723 sb a5,-18(s0) + 300988e: fee44783 lbu a5,-18(s0) + 3009892: 4709 li a4,2 + 3009894: 0ce78063 beq a5,a4,3009954 + 3009898: 470d li a4,3 + 300989a: 16e78363 beq a5,a4,3009a00 + 300989e: 4705 li a4,1 + 30098a0: 20e79663 bne a5,a4,3009aac + 30098a4: fe440713 addi a4,s0,-28 + 30098a8: fe840793 addi a5,s0,-24 + 30098ac: 86ba mv a3,a4 + 30098ae: 863e mv a2,a5 + 30098b0: 4585 li a1,1 + 30098b2: fdc42503 lw a0,-36(s0) + 30098b6: 2411 jal ra,3009aba + 30098b8: 87aa mv a5,a0 + 30098ba: fef407a3 sb a5,-17(s0) + 30098be: fe842703 lw a4,-24(s0) + 30098c2: 00ff07b7 lui a5,0xff0 + 30098c6: 1ce7fe63 bgeu a5,a4,3009aa2 + 30098ca: fef40783 lb a5,-17(s0) + 30098ce: 1c079a63 bnez a5,3009aa2 + 30098d2: fdb44783 lbu a5,-37(s0) + 30098d6: cb91 beqz a5,30098ea + 30098d8: bcc18593 addi a1,gp,-1076 # 4000200 + 30098dc: fdc42503 lw a0,-36(s0) + 30098e0: 2af9 jal ra,3009abe + 30098e2: 87aa mv a5,a0 + 30098e4: fef407a3 sb a5,-17(s0) + 30098e8: aa6d j 3009aa2 + 30098ea: 4611 li a2,4 + 30098ec: 0ff00593 li a1,255 + 30098f0: fdc42503 lw a0,-36(s0) + 30098f4: 2e59 jal ra,3009c8a + 30098f6: 87aa mv a5,a0 + 30098f8: 873e mv a4,a5 + 30098fa: fef44783 lbu a5,-17(s0) + 30098fe: 8fd9 or a5,a5,a4 + 3009900: fef407a3 sb a5,-17(s0) + 3009904: 4601 li a2,0 + 3009906: 07000593 li a1,112 + 300990a: fdc42503 lw a0,-36(s0) + 300990e: 2eb5 jal ra,3009c8a + 3009910: 87aa mv a5,a0 + 3009912: 873e mv a4,a5 + 3009914: fef44783 lbu a5,-17(s0) + 3009918: 8fd9 or a5,a5,a4 + 300991a: fef407a3 sb a5,-17(s0) + 300991e: 4601 li a2,0 + 3009920: 0ff00593 li a1,255 + 3009924: fdc42503 lw a0,-36(s0) + 3009928: 268d jal ra,3009c8a + 300992a: 87aa mv a5,a0 + 300992c: 873e mv a4,a5 + 300992e: fef44783 lbu a5,-17(s0) + 3009932: 8fd9 or a5,a5,a4 + 3009934: fef407a3 sb a5,-17(s0) + 3009938: 4601 li a2,0 + 300993a: 08000593 li a1,128 + 300993e: fdc42503 lw a0,-36(s0) + 3009942: 26a1 jal ra,3009c8a + 3009944: 87aa mv a5,a0 + 3009946: 873e mv a4,a5 + 3009948: fef44783 lbu a5,-17(s0) + 300994c: 8fd9 or a5,a5,a4 + 300994e: fef407a3 sb a5,-17(s0) + 3009952: aa81 j 3009aa2 + 3009954: fe440713 addi a4,s0,-28 + 3009958: fe840793 addi a5,s0,-24 + 300995c: 86ba mv a3,a4 + 300995e: 863e mv a2,a5 + 3009960: 4585 li a1,1 + 3009962: fdc42503 lw a0,-36(s0) + 3009966: 2a91 jal ra,3009aba + 3009968: 87aa mv a5,a0 + 300996a: fef407a3 sb a5,-17(s0) + 300996e: fe442783 lw a5,-28(s0) + 3009972: 12078a63 beqz a5,3009aa6 + 3009976: fef40783 lb a5,-17(s0) + 300997a: 12079663 bnez a5,3009aa6 + 300997e: fdb44783 lbu a5,-37(s0) + 3009982: cb91 beqz a5,3009996 + 3009984: bcc18593 addi a1,gp,-1076 # 4000200 + 3009988: fdc42503 lw a0,-36(s0) + 300998c: 2a0d jal ra,3009abe + 300998e: 87aa mv a5,a0 + 3009990: fef407a3 sb a5,-17(s0) + 3009994: aa09 j 3009aa6 + 3009996: 4611 li a2,4 + 3009998: 0ff00593 li a1,255 + 300999c: fdc42503 lw a0,-36(s0) + 30099a0: 24ed jal ra,3009c8a + 30099a2: 87aa mv a5,a0 + 30099a4: 873e mv a4,a5 + 30099a6: fef44783 lbu a5,-17(s0) + 30099aa: 8fd9 or a5,a5,a4 + 30099ac: fef407a3 sb a5,-17(s0) + 30099b0: 4601 li a2,0 + 30099b2: 07000593 li a1,112 + 30099b6: fdc42503 lw a0,-36(s0) + 30099ba: 2cc1 jal ra,3009c8a + 30099bc: 87aa mv a5,a0 + 30099be: 873e mv a4,a5 + 30099c0: fef44783 lbu a5,-17(s0) + 30099c4: 8fd9 or a5,a5,a4 + 30099c6: fef407a3 sb a5,-17(s0) + 30099ca: 4601 li a2,0 + 30099cc: 0ff00593 li a1,255 + 30099d0: fdc42503 lw a0,-36(s0) + 30099d4: 2c5d jal ra,3009c8a + 30099d6: 87aa mv a5,a0 + 30099d8: 873e mv a4,a5 + 30099da: fef44783 lbu a5,-17(s0) + 30099de: 8fd9 or a5,a5,a4 + 30099e0: fef407a3 sb a5,-17(s0) + 30099e4: 4601 li a2,0 + 30099e6: 08000593 li a1,128 + 30099ea: fdc42503 lw a0,-36(s0) + 30099ee: 2c71 jal ra,3009c8a + 30099f0: 87aa mv a5,a0 + 30099f2: 873e mv a4,a5 + 30099f4: fef44783 lbu a5,-17(s0) + 30099f8: 8fd9 or a5,a5,a4 + 30099fa: fef407a3 sb a5,-17(s0) + 30099fe: a065 j 3009aa6 + 3009a00: fe440713 addi a4,s0,-28 + 3009a04: fe840793 addi a5,s0,-24 + 3009a08: 86ba mv a3,a4 + 3009a0a: 863e mv a2,a5 + 3009a0c: 4585 li a1,1 + 3009a0e: fdc42503 lw a0,-36(s0) + 3009a12: 2065 jal ra,3009aba + 3009a14: 87aa mv a5,a0 + 3009a16: fef407a3 sb a5,-17(s0) + 3009a1a: fef40783 lb a5,-17(s0) + 3009a1e: e7d1 bnez a5,3009aaa + 3009a20: fdb44783 lbu a5,-37(s0) + 3009a24: cb91 beqz a5,3009a38 + 3009a26: bcc18593 addi a1,gp,-1076 # 4000200 + 3009a2a: fdc42503 lw a0,-36(s0) + 3009a2e: 2841 jal ra,3009abe + 3009a30: 87aa mv a5,a0 + 3009a32: fef407a3 sb a5,-17(s0) + 3009a36: a895 j 3009aaa + 3009a38: 4611 li a2,4 + 3009a3a: 0ff00593 li a1,255 + 3009a3e: fdc42503 lw a0,-36(s0) + 3009a42: 24a1 jal ra,3009c8a + 3009a44: 87aa mv a5,a0 + 3009a46: 873e mv a4,a5 + 3009a48: fef44783 lbu a5,-17(s0) + 3009a4c: 8fd9 or a5,a5,a4 + 3009a4e: fef407a3 sb a5,-17(s0) + 3009a52: 4601 li a2,0 + 3009a54: 07000593 li a1,112 + 3009a58: fdc42503 lw a0,-36(s0) + 3009a5c: 243d jal ra,3009c8a + 3009a5e: 87aa mv a5,a0 + 3009a60: 873e mv a4,a5 + 3009a62: fef44783 lbu a5,-17(s0) + 3009a66: 8fd9 or a5,a5,a4 + 3009a68: fef407a3 sb a5,-17(s0) + 3009a6c: 4601 li a2,0 + 3009a6e: 0ff00593 li a1,255 + 3009a72: fdc42503 lw a0,-36(s0) + 3009a76: 2c11 jal ra,3009c8a + 3009a78: 87aa mv a5,a0 + 3009a7a: 873e mv a4,a5 + 3009a7c: fef44783 lbu a5,-17(s0) + 3009a80: 8fd9 or a5,a5,a4 + 3009a82: fef407a3 sb a5,-17(s0) + 3009a86: 4601 li a2,0 + 3009a88: 08000593 li a1,128 + 3009a8c: fdc42503 lw a0,-36(s0) + 3009a90: 2aed jal ra,3009c8a + 3009a92: 87aa mv a5,a0 + 3009a94: 873e mv a4,a5 + 3009a96: fef44783 lbu a5,-17(s0) + 3009a9a: 8fd9 or a5,a5,a4 + 3009a9c: fef407a3 sb a5,-17(s0) + 3009aa0: a029 j 3009aaa + 3009aa2: 0001 nop + 3009aa4: a021 j 3009aac + 3009aa6: 0001 nop + 3009aa8: a011 j 3009aac + 3009aaa: 0001 nop + 3009aac: fef40783 lb a5,-17(s0) + 3009ab0: 853e mv a0,a5 + 3009ab2: 50b2 lw ra,44(sp) + 3009ab4: 5422 lw s0,40(sp) + 3009ab6: 6145 addi sp,sp,48 + 3009ab8: 8082 ret + +03009aba : + 3009aba: 0ab0006f j 300a364 + +03009abe : + 3009abe: 1540306f j 300cc12 + +03009ac2 : + 3009ac2: 7179 addi sp,sp,-48 + 3009ac4: d606 sw ra,44(sp) + 3009ac6: d422 sw s0,40(sp) + 3009ac8: 1800 addi s0,sp,48 + 3009aca: fca42e23 sw a0,-36(s0) + 3009ace: fe0407a3 sb zero,-17(s0) + 3009ad2: 4785 li a5,1 + 3009ad4: fef403a3 sb a5,-25(s0) + 3009ad8: fe640793 addi a5,s0,-26 + 3009adc: 85be mv a1,a5 + 3009ade: fdc42503 lw a0,-36(s0) + 3009ae2: ad6ff0ef jal ra,3008db8 + 3009ae6: 4605 li a2,1 + 3009ae8: 08000593 li a1,128 + 3009aec: fdc42503 lw a0,-36(s0) + 3009af0: 2a69 jal ra,3009c8a + 3009af2: 87aa mv a5,a0 + 3009af4: fef407a3 sb a5,-17(s0) + 3009af8: 4605 li a2,1 + 3009afa: 0ff00593 li a1,255 + 3009afe: fdc42503 lw a0,-36(s0) + 3009b02: 2261 jal ra,3009c8a + 3009b04: 87aa mv a5,a0 + 3009b06: fef407a3 sb a5,-17(s0) + 3009b0a: 4601 li a2,0 + 3009b0c: 4581 li a1,0 + 3009b0e: fdc42503 lw a0,-36(s0) + 3009b12: 2aa5 jal ra,3009c8a + 3009b14: 87aa mv a5,a0 + 3009b16: fef407a3 sb a5,-17(s0) + 3009b1a: fdc42783 lw a5,-36(s0) + 3009b1e: 1667c783 lbu a5,358(a5) # ff0166 + 3009b22: 863e mv a2,a5 + 3009b24: 09100593 li a1,145 + 3009b28: fdc42503 lw a0,-36(s0) + 3009b2c: 2ab9 jal ra,3009c8a + 3009b2e: 87aa mv a5,a0 + 3009b30: fef407a3 sb a5,-17(s0) + 3009b34: 4605 li a2,1 + 3009b36: 4581 li a1,0 + 3009b38: fdc42503 lw a0,-36(s0) + 3009b3c: 22b9 jal ra,3009c8a + 3009b3e: 87aa mv a5,a0 + 3009b40: fef407a3 sb a5,-17(s0) + 3009b44: 4601 li a2,0 + 3009b46: 0ff00593 li a1,255 + 3009b4a: fdc42503 lw a0,-36(s0) + 3009b4e: 2a35 jal ra,3009c8a + 3009b50: 87aa mv a5,a0 + 3009b52: fef407a3 sb a5,-17(s0) + 3009b56: 4601 li a2,0 + 3009b58: 08000593 li a1,128 + 3009b5c: fdc42503 lw a0,-36(s0) + 3009b60: 222d jal ra,3009c8a + 3009b62: 87aa mv a5,a0 + 3009b64: fef407a3 sb a5,-17(s0) + 3009b68: fe644783 lbu a5,-26(s0) + 3009b6c: 4705 li a4,1 + 3009b6e: 08e78863 beq a5,a4,3009bfe + 3009b72: 470d li a4,3 + 3009b74: 0ce78063 beq a5,a4,3009c34 + 3009b78: 0e079963 bnez a5,3009c6a + 3009b7c: 4605 li a2,1 + 3009b7e: 4581 li a1,0 + 3009b80: fdc42503 lw a0,-36(s0) + 3009b84: 2219 jal ra,3009c8a + 3009b86: 87aa mv a5,a0 + 3009b88: fef407a3 sb a5,-17(s0) + 3009b8c: fe744783 lbu a5,-25(s0) + 3009b90: fef402a3 sb a5,-27(s0) + 3009b94: fef40783 lb a5,-17(s0) + 3009b98: efe9 bnez a5,3009c72 + 3009b9a: fe042423 sw zero,-24(s0) + 3009b9e: fe842783 lw a5,-24(s0) + 3009ba2: cf81 beqz a5,3009bba + 3009ba4: fe540793 addi a5,s0,-27 + 3009ba8: 863e mv a2,a5 + 3009baa: 4581 li a1,0 + 3009bac: fdc42503 lw a0,-36(s0) + 3009bb0: 233040ef jal ra,300e5e2 + 3009bb4: 87aa mv a5,a0 + 3009bb6: fef407a3 sb a5,-17(s0) + 3009bba: fe842783 lw a5,-24(s0) + 3009bbe: 0785 addi a5,a5,1 + 3009bc0: fef42423 sw a5,-24(s0) + 3009bc4: fe544703 lbu a4,-27(s0) + 3009bc8: fe744783 lbu a5,-25(s0) + 3009bcc: 8ff9 and a5,a5,a4 + 3009bce: 9f81 uxtb a5 + 3009bd0: fe744703 lbu a4,-25(s0) + 3009bd4: 00f71b63 bne a4,a5,3009bea + 3009bd8: fef40783 lb a5,-17(s0) + 3009bdc: e799 bnez a5,3009bea + 3009bde: fe842703 lw a4,-24(s0) + 3009be2: 7cf00793 li a5,1999 + 3009be6: fae7fce3 bgeu a5,a4,3009b9e + 3009bea: fe842703 lw a4,-24(s0) + 3009bee: 7cf00793 li a5,1999 + 3009bf2: 08e7f063 bgeu a5,a4,3009c72 + 3009bf6: 57e5 li a5,-7 + 3009bf8: fef407a3 sb a5,-17(s0) + 3009bfc: a89d j 3009c72 + 3009bfe: fef40783 lb a5,-17(s0) + 3009c02: eb81 bnez a5,3009c12 + 3009c04: 4585 li a1,1 + 3009c06: fdc42503 lw a0,-36(s0) + 3009c0a: 318d jal ra,300986c + 3009c0c: 87aa mv a5,a0 + 3009c0e: fef407a3 sb a5,-17(s0) + 3009c12: 4609 li a2,2 + 3009c14: 4581 li a1,0 + 3009c16: fdc42503 lw a0,-36(s0) + 3009c1a: 2885 jal ra,3009c8a + 3009c1c: 87aa mv a5,a0 + 3009c1e: fef407a3 sb a5,-17(s0) + 3009c22: fef40783 lb a5,-17(s0) + 3009c26: eba1 bnez a5,3009c76 + 3009c28: fdc42783 lw a5,-36(s0) + 3009c2c: 4711 li a4,4 + 3009c2e: 14e78f23 sb a4,350(a5) + 3009c32: a091 j 3009c76 + 3009c34: fef40783 lb a5,-17(s0) + 3009c38: eb81 bnez a5,3009c48 + 3009c3a: 4585 li a1,1 + 3009c3c: fdc42503 lw a0,-36(s0) + 3009c40: 3135 jal ra,300986c + 3009c42: 87aa mv a5,a0 + 3009c44: fef407a3 sb a5,-17(s0) + 3009c48: 4611 li a2,4 + 3009c4a: 4581 li a1,0 + 3009c4c: fdc42503 lw a0,-36(s0) + 3009c50: 282d jal ra,3009c8a + 3009c52: 87aa mv a5,a0 + 3009c54: fef407a3 sb a5,-17(s0) + 3009c58: fef40783 lb a5,-17(s0) + 3009c5c: ef99 bnez a5,3009c7a + 3009c5e: fdc42783 lw a5,-36(s0) + 3009c62: 4711 li a4,4 + 3009c64: 14e78f23 sb a4,350(a5) + 3009c68: a809 j 3009c7a + 3009c6a: 57e1 li a5,-8 + 3009c6c: fef407a3 sb a5,-17(s0) + 3009c70: a031 j 3009c7c + 3009c72: 0001 nop + 3009c74: a021 j 3009c7c + 3009c76: 0001 nop + 3009c78: a011 j 3009c7c + 3009c7a: 0001 nop + 3009c7c: fef40783 lb a5,-17(s0) + 3009c80: 853e mv a0,a5 + 3009c82: 50b2 lw ra,44(sp) + 3009c84: 5422 lw s0,40(sp) + 3009c86: 6145 addi sp,sp,48 + 3009c88: 8082 ret + +03009c8a : + 3009c8a: 7fa0406f j 300e484 + +03009c8e : + 3009c8e: 7179 addi sp,sp,-48 + 3009c90: d606 sw ra,44(sp) + 3009c92: d422 sw s0,40(sp) + 3009c94: 1800 addi s0,sp,48 + 3009c96: fca42e23 sw a0,-36(s0) + 3009c9a: fcb42c23 sw a1,-40(s0) + 3009c9e: fe0407a3 sb zero,-17(s0) + 3009ca2: fdc42783 lw a5,-36(s0) + 3009ca6: 1067c783 lbu a5,262(a5) + 3009caa: fef40723 sb a5,-18(s0) + 3009cae: fee44703 lbu a4,-18(s0) + 3009cb2: 4791 li a5,4 + 3009cb4: 02f71b63 bne a4,a5,3009cea + 3009cb8: fe840793 addi a5,s0,-24 + 3009cbc: 85be mv a1,a5 + 3009cbe: fdc42503 lw a0,-36(s0) + 3009cc2: 7c2000ef jal ra,300a484 + 3009cc6: 87aa mv a5,a0 + 3009cc8: fef407a3 sb a5,-17(s0) + 3009ccc: fe842703 lw a4,-24(s0) + 3009cd0: 4791 li a5,4 + 3009cd2: 00f71763 bne a4,a5,3009ce0 + 3009cd6: fd842783 lw a5,-40(s0) + 3009cda: 4705 li a4,1 + 3009cdc: a398 sb a4,0(a5) + 3009cde: a089 j 3009d20 + 3009ce0: fd842783 lw a5,-40(s0) + 3009ce4: 00078023 sb zero,0(a5) + 3009ce8: a825 j 3009d20 + 3009cea: fed40793 addi a5,s0,-19 + 3009cee: 863e mv a2,a5 + 3009cf0: 45d1 li a1,20 + 3009cf2: fdc42503 lw a0,-36(s0) + 3009cf6: 0ed040ef jal ra,300e5e2 + 3009cfa: 87aa mv a5,a0 + 3009cfc: fef407a3 sb a5,-17(s0) + 3009d00: fef40783 lb a5,-17(s0) + 3009d04: ef91 bnez a5,3009d20 + 3009d06: fed44783 lbu a5,-19(s0) + 3009d0a: 8b85 andi a5,a5,1 + 3009d0c: c791 beqz a5,3009d18 + 3009d0e: fd842783 lw a5,-40(s0) + 3009d12: 4705 li a4,1 + 3009d14: a398 sb a4,0(a5) + 3009d16: a029 j 3009d20 + 3009d18: fd842783 lw a5,-40(s0) + 3009d1c: 00078023 sb zero,0(a5) + 3009d20: fef40783 lb a5,-17(s0) + 3009d24: 853e mv a0,a5 + 3009d26: 50b2 lw ra,44(sp) + 3009d28: 5422 lw s0,40(sp) + 3009d2a: 6145 addi sp,sp,48 + 3009d2c: 8082 ret + +03009d2e : + 3009d2e: 7159 addi sp,sp,-112 + 3009d30: d686 sw ra,108(sp) + 3009d32: d4a2 sw s0,104(sp) + 3009d34: 1880 addi s0,sp,112 + 3009d36: f8a42e23 sw a0,-100(s0) + 3009d3a: f8b42c23 sw a1,-104(s0) + 3009d3e: fe0407a3 sb zero,-17(s0) + 3009d42: fc840793 addi a5,s0,-56 + 3009d46: 46b1 li a3,12 + 3009d48: 863e mv a2,a5 + 3009d4a: 45d1 li a1,20 + 3009d4c: f9c42503 lw a0,-100(s0) + 3009d50: 6c4040ef jal ra,300e414 + 3009d54: 87aa mv a5,a0 + 3009d56: fef407a3 sb a5,-17(s0) + 3009d5a: fef40783 lb a5,-17(s0) + 3009d5e: 1e079663 bnez a5,3009f4a + 3009d62: f9842783 lw a5,-104(s0) + 3009d66: 00078b23 sb zero,22(a5) + 3009d6a: f9842783 lw a5,-104(s0) + 3009d6e: 0007a023 sw zero,0(a5) + 3009d72: fd244783 lbu a5,-46(s0) + 3009d76: 9fa1 uxth a5 + 3009d78: 07a2 slli a5,a5,0x8 + 3009d7a: 01079713 slli a4,a5,0x10 + 3009d7e: 8341 srli a4,a4,0x10 + 3009d80: fd344783 lbu a5,-45(s0) + 3009d84: 9fa1 uxth a5 + 3009d86: 97ba add a5,a5,a4 + 3009d88: fef41623 sh a5,-20(s0) + 3009d8c: f9842783 lw a5,-104(s0) + 3009d90: 0007a223 sw zero,4(a5) + 3009d94: fce44783 lbu a5,-50(s0) + 3009d98: 9fa1 uxth a5 + 3009d9a: 07a2 slli a5,a5,0x8 + 3009d9c: 01079713 slli a4,a5,0x10 + 3009da0: 8341 srli a4,a4,0x10 + 3009da2: fcf44783 lbu a5,-49(s0) + 3009da6: 9fa1 uxth a5 + 3009da8: 97ba add a5,a5,a4 + 3009daa: 9fa1 uxth a5 + 3009dac: 07a6 slli a5,a5,0x9 + 3009dae: fef42223 sw a5,-28(s0) + 3009db2: f9842783 lw a5,-104(s0) + 3009db6: fe442703 lw a4,-28(s0) + 3009dba: c7d8 sw a4,12(a5) + 3009dbc: fd044783 lbu a5,-48(s0) + 3009dc0: 9fa1 uxth a5 + 3009dc2: 07a2 slli a5,a5,0x8 + 3009dc4: 01079713 slli a4,a5,0x10 + 3009dc8: 8341 srli a4,a4,0x10 + 3009dca: fd144783 lbu a5,-47(s0) + 3009dce: 9fa1 uxth a5 + 3009dd0: 97ba add a5,a5,a4 + 3009dd2: fef41123 sh a5,-30(s0) + 3009dd6: fe245783 lhu a5,-30(s0) + 3009dda: 07a6 slli a5,a5,0x9 + 3009ddc: 873e mv a4,a5 + 3009dde: f9842783 lw a5,-104(s0) + 3009de2: cb98 sw a4,16(a5) + 3009de4: fca44783 lbu a5,-54(s0) + 3009de8: 9fa1 uxth a5 + 3009dea: 07a2 slli a5,a5,0x8 + 3009dec: 01079713 slli a4,a5,0x10 + 3009df0: 8341 srli a4,a4,0x10 + 3009df2: fcb44783 lbu a5,-53(s0) + 3009df6: 9fa1 uxth a5 + 3009df8: 97ba add a5,a5,a4 + 3009dfa: fef41023 sh a5,-32(s0) + 3009dfe: f9842783 lw a5,-104(s0) + 3009e02: fe045703 lhu a4,-32(s0) + 3009e06: abda sh a4,20(a5) + 3009e08: fc844783 lbu a5,-56(s0) + 3009e0c: fcf40fa3 sb a5,-33(s0) + 3009e10: f9c42783 lw a5,-100(s0) + 3009e14: 17e7d783 lhu a5,382(a5) + 3009e18: fcf41e23 sh a5,-36(s0) + 3009e1c: f9c42783 lw a5,-100(s0) + 3009e20: 15d7c783 lbu a5,349(a5) + 3009e24: fcf40da3 sb a5,-37(s0) + 3009e28: fdc45703 lhu a4,-36(s0) + 3009e2c: 3e800793 li a5,1000 + 3009e30: 0af70163 beq a4,a5,3009ed2 + 3009e34: fdc45703 lhu a4,-36(s0) + 3009e38: fec45783 lhu a5,-20(s0) + 3009e3c: 02f707b3 mul a5,a4,a5 + 3009e40: 1f478713 addi a4,a5,500 + 3009e44: 3e800793 li a5,1000 + 3009e48: 02f747b3 div a5,a4,a5 + 3009e4c: fef41623 sh a5,-20(s0) + 3009e50: f9c42783 lw a5,-100(s0) + 3009e54: 4f9c lw a5,24(a5) + 3009e56: fcf41c23 sh a5,-40(s0) + 3009e5a: f9c42783 lw a5,-100(s0) + 3009e5e: 2bdc lbu a5,20(a5) + 3009e60: fcf40ba3 sb a5,-41(s0) + 3009e64: fd744783 lbu a5,-41(s0) + 3009e68: c7ad beqz a5,3009ed2 + 3009e6a: fd845703 lhu a4,-40(s0) + 3009e6e: fe045783 lhu a5,-32(s0) + 3009e72: 02f707b3 mul a5,a4,a5 + 3009e76: 87a1 srai a5,a5,0x8 + 3009e78: 873e mv a4,a5 + 3009e7a: fe442783 lw a5,-28(s0) + 3009e7e: 02e79163 bne a5,a4,3009ea0 + 3009e82: fdb44783 lbu a5,-37(s0) + 3009e86: c799 beqz a5,3009e94 + 3009e88: 6789 lui a5,0x2 + 3009e8a: 2b878793 addi a5,a5,696 # 22b8 + 3009e8e: fef41523 sh a5,-22(s0) + 3009e92: a825 j 3009eca + 3009e94: 77e5 lui a5,0xffff9 + 3009e96: ae078793 addi a5,a5,-1312 # ffff8ae0 + 3009e9a: fef41523 sh a5,-22(s0) + 3009e9e: a035 j 3009eca + 3009ea0: fec45703 lhu a4,-20(s0) + 3009ea4: fe442783 lw a5,-28(s0) + 3009ea8: 02f70733 mul a4,a4,a5 + 3009eac: fd845683 lhu a3,-40(s0) + 3009eb0: fe045783 lhu a5,-32(s0) + 3009eb4: 02f687b3 mul a5,a3,a5 + 3009eb8: 87a1 srai a5,a5,0x8 + 3009eba: 86be mv a3,a5 + 3009ebc: fe442783 lw a5,-28(s0) + 3009ec0: 8f95 sub a5,a5,a3 + 3009ec2: 02f757b3 divu a5,a4,a5 + 3009ec6: fef41523 sh a5,-22(s0) + 3009eca: fea45783 lhu a5,-22(s0) + 3009ece: fef41623 sh a5,-20(s0) + 3009ed2: fdb44783 lbu a5,-37(s0) + 3009ed6: c785 beqz a5,3009efe + 3009ed8: fec45783 lhu a5,-20(s0) + 3009edc: 8389 srli a5,a5,0x2 + 3009ede: 01079713 slli a4,a5,0x10 + 3009ee2: 8341 srli a4,a4,0x10 + 3009ee4: f9842783 lw a5,-104(s0) + 3009ee8: a79a sh a4,8(a5) + 3009eea: fec45783 lhu a5,-20(s0) + 3009eee: 9f81 uxtb a5 + 3009ef0: 079a slli a5,a5,0x6 + 3009ef2: 0ff7f713 andi a4,a5,255 + 3009ef6: f9842783 lw a5,-104(s0) + 3009efa: bbf8 sb a4,23(a5) + 3009efc: a811 j 3009f10 + 3009efe: f9842783 lw a5,-104(s0) + 3009f02: fec45703 lhu a4,-20(s0) + 3009f06: a79a sh a4,8(a5) + 3009f08: f9842783 lw a5,-104(s0) + 3009f0c: 00078ba3 sb zero,23(a5) + 3009f10: fd640793 addi a5,s0,-42 + 3009f14: fe045683 lhu a3,-32(s0) + 3009f18: fdf44583 lbu a1,-33(s0) + 3009f1c: f9842703 lw a4,-104(s0) + 3009f20: fe442603 lw a2,-28(s0) + 3009f24: f9c42503 lw a0,-100(s0) + 3009f28: 7e0030ef jal ra,300d708 + 3009f2c: 87aa mv a5,a0 + 3009f2e: 873e mv a4,a5 + 3009f30: fef44783 lbu a5,-17(s0) + 3009f34: 8fd9 or a5,a5,a4 + 3009f36: fef407a3 sb a5,-17(s0) + 3009f3a: fef40783 lb a5,-17(s0) + 3009f3e: e791 bnez a5,3009f4a + 3009f40: fd644703 lbu a4,-42(s0) + 3009f44: f9842783 lw a5,-104(s0) + 3009f48: af98 sb a4,24(a5) + 3009f4a: fef40783 lb a5,-17(s0) + 3009f4e: e7e9 bnez a5,300a018 + 3009f50: f9c42783 lw a5,-100(s0) + 3009f54: 0807a803 lw a6,128(a5) + 3009f58: 0847a503 lw a0,132(a5) + 3009f5c: 0887a583 lw a1,136(a5) + 3009f60: 08c7a603 lw a2,140(a5) + 3009f64: 0907a683 lw a3,144(a5) + 3009f68: 0947a703 lw a4,148(a5) + 3009f6c: 0987a783 lw a5,152(a5) + 3009f70: fb042623 sw a6,-84(s0) + 3009f74: faa42823 sw a0,-80(s0) + 3009f78: fab42a23 sw a1,-76(s0) + 3009f7c: fac42c23 sw a2,-72(s0) + 3009f80: fad42e23 sw a3,-68(s0) + 3009f84: fce42023 sw a4,-64(s0) + 3009f88: fcf42223 sw a5,-60(s0) + 3009f8c: f9842783 lw a5,-104(s0) + 3009f90: 279e lhu a5,8(a5) + 3009f92: faf41a23 sh a5,-76(s0) + 3009f96: f9842783 lw a5,-104(s0) + 3009f9a: 3bfc lbu a5,23(a5) + 3009f9c: fcf401a3 sb a5,-61(s0) + 3009fa0: f9842783 lw a5,-104(s0) + 3009fa4: 27be lhu a5,10(a5) + 3009fa6: faf41b23 sh a5,-74(s0) + 3009faa: f9842783 lw a5,-104(s0) + 3009fae: 43dc lw a5,4(a5) + 3009fb0: faf42823 sw a5,-80(s0) + 3009fb4: f9842783 lw a5,-104(s0) + 3009fb8: 47dc lw a5,12(a5) + 3009fba: faf42c23 sw a5,-72(s0) + 3009fbe: f9842783 lw a5,-104(s0) + 3009fc2: 4b9c lw a5,16(a5) + 3009fc4: faf42e23 sw a5,-68(s0) + 3009fc8: f9842783 lw a5,-104(s0) + 3009fcc: 2bde lhu a5,20(a5) + 3009fce: fcf41023 sh a5,-64(s0) + 3009fd2: f9842783 lw a5,-104(s0) + 3009fd6: 2f9c lbu a5,24(a5) + 3009fd8: fcf40223 sb a5,-60(s0) + 3009fdc: f9c42783 lw a5,-100(s0) + 3009fe0: fac42883 lw a7,-84(s0) + 3009fe4: fb042803 lw a6,-80(s0) + 3009fe8: fb442503 lw a0,-76(s0) + 3009fec: fb842583 lw a1,-72(s0) + 3009ff0: fbc42603 lw a2,-68(s0) + 3009ff4: fc042683 lw a3,-64(s0) + 3009ff8: fc442703 lw a4,-60(s0) + 3009ffc: 0917a023 sw a7,128(a5) + 300a000: 0907a223 sw a6,132(a5) + 300a004: 08a7a423 sw a0,136(a5) + 300a008: 08b7a623 sw a1,140(a5) + 300a00c: 08c7a823 sw a2,144(a5) + 300a010: 08d7aa23 sw a3,148(a5) + 300a014: 08e7ac23 sw a4,152(a5) + 300a018: fef40783 lb a5,-17(s0) + 300a01c: 853e mv a0,a5 + 300a01e: 50b6 lw ra,108(sp) + 300a020: 5426 lw s0,104(sp) + 300a022: 6165 addi sp,sp,112 + 300a024: 8082 ret + +0300a026 : + 300a026: 7179 addi sp,sp,-48 + 300a028: d606 sw ra,44(sp) + 300a02a: d422 sw s0,40(sp) + 300a02c: 1800 addi s0,sp,48 + 300a02e: fca42e23 sw a0,-36(s0) + 300a032: fcb42c23 sw a1,-40(s0) + 300a036: fe0407a3 sb zero,-17(s0) + 300a03a: 4581 li a1,0 + 300a03c: fdc42503 lw a0,-36(s0) + 300a040: d2bfe0ef jal ra,3008d6a + 300a044: 87aa mv a5,a0 + 300a046: fef407a3 sb a5,-17(s0) + 300a04a: fef40783 lb a5,-17(s0) + 300a04e: eb81 bnez a5,300a05e + 300a050: fdc42503 lw a0,-36(s0) + 300a054: f66ff0ef jal ra,30097ba + 300a058: 87aa mv a5,a0 + 300a05a: fef407a3 sb a5,-17(s0) + 300a05e: fef40783 lb a5,-17(s0) + 300a062: eb89 bnez a5,300a074 + 300a064: fd842583 lw a1,-40(s0) + 300a068: fdc42503 lw a0,-36(s0) + 300a06c: 31c9 jal ra,3009d2e + 300a06e: 87aa mv a5,a0 + 300a070: fef407a3 sb a5,-17(s0) + 300a074: fef40783 lb a5,-17(s0) + 300a078: eb81 bnez a5,300a088 + 300a07a: 4581 li a1,0 + 300a07c: fdc42503 lw a0,-36(s0) + 300a080: 269d jal ra,300a3e6 + 300a082: 87aa mv a5,a0 + 300a084: fef407a3 sb a5,-17(s0) + 300a088: fef40783 lb a5,-17(s0) + 300a08c: 853e mv a0,a5 + 300a08e: 50b2 lw ra,44(sp) + 300a090: 5422 lw s0,40(sp) + 300a092: 6145 addi sp,sp,48 + 300a094: 8082 ret + +0300a096 : + 300a096: 7179 addi sp,sp,-48 + 300a098: d606 sw ra,44(sp) + 300a09a: d422 sw s0,40(sp) + 300a09c: 1800 addi s0,sp,48 + 300a09e: fca42e23 sw a0,-36(s0) + 300a0a2: 87ae mv a5,a1 + 300a0a4: fcf40da3 sb a5,-37(s0) + 300a0a8: 87b2 mv a5,a2 + 300a0aa: fcf40d23 sb a5,-38(s0) + 300a0ae: 87b6 mv a5,a3 + 300a0b0: fcf40ca3 sb a5,-39(s0) + 300a0b4: 87ba mv a5,a4 + 300a0b6: fcf40c23 sb a5,-40(s0) + 300a0ba: fe0407a3 sb zero,-17(s0) + 300a0be: fdb44783 lbu a5,-37(s0) + 300a0c2: c789 beqz a5,300a0cc + 300a0c4: 57d9 li a5,-10 + 300a0c6: fef407a3 sb a5,-17(s0) + 300a0ca: a471 j 300a356 + 300a0cc: fda44703 lbu a4,-38(s0) + 300a0d0: 47d1 li a5,20 + 300a0d2: 02f71863 bne a4,a5,300a102 + 300a0d6: fd844783 lbu a5,-40(s0) + 300a0da: e789 bnez a5,300a0e4 + 300a0dc: 47c1 li a5,16 + 300a0de: fef40723 sb a5,-18(s0) + 300a0e2: a021 j 300a0ea + 300a0e4: 4785 li a5,1 + 300a0e6: fef40723 sb a5,-18(s0) + 300a0ea: fee44783 lbu a5,-18(s0) + 300a0ee: 863e mv a2,a5 + 300a0f0: 08400593 li a1,132 + 300a0f4: fdc42503 lw a0,-36(s0) + 300a0f8: 3e49 jal ra,3009c8a + 300a0fa: 87aa mv a5,a0 + 300a0fc: fef407a3 sb a5,-17(s0) + 300a100: ac99 j 300a356 + 300a102: fda44703 lbu a4,-38(s0) + 300a106: 47d5 li a5,21 + 300a108: 18f71463 bne a4,a5,300a290 + 300a10c: 4605 li a2,1 + 300a10e: 0ff00593 li a1,255 + 300a112: fdc42503 lw a0,-36(s0) + 300a116: 3e95 jal ra,3009c8a + 300a118: 87aa mv a5,a0 + 300a11a: 873e mv a4,a5 + 300a11c: fef44783 lbu a5,-17(s0) + 300a120: 8fd9 or a5,a5,a4 + 300a122: fef407a3 sb a5,-17(s0) + 300a126: 4601 li a2,0 + 300a128: 4581 li a1,0 + 300a12a: fdc42503 lw a0,-36(s0) + 300a12e: 3eb1 jal ra,3009c8a + 300a130: 87aa mv a5,a0 + 300a132: 873e mv a4,a5 + 300a134: fef44783 lbu a5,-17(s0) + 300a138: 8fd9 or a5,a5,a4 + 300a13a: fef407a3 sb a5,-17(s0) + 300a13e: 4601 li a2,0 + 300a140: 0ff00593 li a1,255 + 300a144: fdc42503 lw a0,-36(s0) + 300a148: 3689 jal ra,3009c8a + 300a14a: 87aa mv a5,a0 + 300a14c: 873e mv a4,a5 + 300a14e: fef44783 lbu a5,-17(s0) + 300a152: 8fd9 or a5,a5,a4 + 300a154: fef407a3 sb a5,-17(s0) + 300a158: 4605 li a2,1 + 300a15a: 08000593 li a1,128 + 300a15e: fdc42503 lw a0,-36(s0) + 300a162: 3625 jal ra,3009c8a + 300a164: 87aa mv a5,a0 + 300a166: 873e mv a4,a5 + 300a168: fef44783 lbu a5,-17(s0) + 300a16c: 8fd9 or a5,a5,a4 + 300a16e: fef407a3 sb a5,-17(s0) + 300a172: 4609 li a2,2 + 300a174: 08500593 li a1,133 + 300a178: fdc42503 lw a0,-36(s0) + 300a17c: 3639 jal ra,3009c8a + 300a17e: 87aa mv a5,a0 + 300a180: 873e mv a4,a5 + 300a182: fef44783 lbu a5,-17(s0) + 300a186: 8fd9 or a5,a5,a4 + 300a188: fef407a3 sb a5,-17(s0) + 300a18c: 4611 li a2,4 + 300a18e: 0ff00593 li a1,255 + 300a192: fdc42503 lw a0,-36(s0) + 300a196: 3cd5 jal ra,3009c8a + 300a198: 87aa mv a5,a0 + 300a19a: 873e mv a4,a5 + 300a19c: fef44783 lbu a5,-17(s0) + 300a1a0: 8fd9 or a5,a5,a4 + 300a1a2: fef407a3 sb a5,-17(s0) + 300a1a6: 4601 li a2,0 + 300a1a8: 0cd00593 li a1,205 + 300a1ac: fdc42503 lw a0,-36(s0) + 300a1b0: 3ce9 jal ra,3009c8a + 300a1b2: 87aa mv a5,a0 + 300a1b4: 873e mv a4,a5 + 300a1b6: fef44783 lbu a5,-17(s0) + 300a1ba: 8fd9 or a5,a5,a4 + 300a1bc: fef407a3 sb a5,-17(s0) + 300a1c0: 4645 li a2,17 + 300a1c2: 0cc00593 li a1,204 + 300a1c6: fdc42503 lw a0,-36(s0) + 300a1ca: 34c1 jal ra,3009c8a + 300a1cc: 87aa mv a5,a0 + 300a1ce: 873e mv a4,a5 + 300a1d0: fef44783 lbu a5,-17(s0) + 300a1d4: 8fd9 or a5,a5,a4 + 300a1d6: fef407a3 sb a5,-17(s0) + 300a1da: 461d li a2,7 + 300a1dc: 0ff00593 li a1,255 + 300a1e0: fdc42503 lw a0,-36(s0) + 300a1e4: 345d jal ra,3009c8a + 300a1e6: 87aa mv a5,a0 + 300a1e8: 873e mv a4,a5 + 300a1ea: fef44783 lbu a5,-17(s0) + 300a1ee: 8fd9 or a5,a5,a4 + 300a1f0: fef407a3 sb a5,-17(s0) + 300a1f4: 4601 li a2,0 + 300a1f6: 0be00593 li a1,190 + 300a1fa: fdc42503 lw a0,-36(s0) + 300a1fe: 3471 jal ra,3009c8a + 300a200: 87aa mv a5,a0 + 300a202: 873e mv a4,a5 + 300a204: fef44783 lbu a5,-17(s0) + 300a208: 8fd9 or a5,a5,a4 + 300a20a: fef407a3 sb a5,-17(s0) + 300a20e: 4619 li a2,6 + 300a210: 0ff00593 li a1,255 + 300a214: fdc42503 lw a0,-36(s0) + 300a218: 3c8d jal ra,3009c8a + 300a21a: 87aa mv a5,a0 + 300a21c: 873e mv a4,a5 + 300a21e: fef44783 lbu a5,-17(s0) + 300a222: 8fd9 or a5,a5,a4 + 300a224: fef407a3 sb a5,-17(s0) + 300a228: 4625 li a2,9 + 300a22a: 0cc00593 li a1,204 + 300a22e: fdc42503 lw a0,-36(s0) + 300a232: 3ca1 jal ra,3009c8a + 300a234: 87aa mv a5,a0 + 300a236: 873e mv a4,a5 + 300a238: fef44783 lbu a5,-17(s0) + 300a23c: 8fd9 or a5,a5,a4 + 300a23e: fef407a3 sb a5,-17(s0) + 300a242: 4601 li a2,0 + 300a244: 0ff00593 li a1,255 + 300a248: fdc42503 lw a0,-36(s0) + 300a24c: 3c3d jal ra,3009c8a + 300a24e: 87aa mv a5,a0 + 300a250: 873e mv a4,a5 + 300a252: fef44783 lbu a5,-17(s0) + 300a256: 8fd9 or a5,a5,a4 + 300a258: fef407a3 sb a5,-17(s0) + 300a25c: 4605 li a2,1 + 300a25e: 0ff00593 li a1,255 + 300a262: fdc42503 lw a0,-36(s0) + 300a266: 3415 jal ra,3009c8a + 300a268: 87aa mv a5,a0 + 300a26a: 873e mv a4,a5 + 300a26c: fef44783 lbu a5,-17(s0) + 300a270: 8fd9 or a5,a5,a4 + 300a272: fef407a3 sb a5,-17(s0) + 300a276: 4601 li a2,0 + 300a278: 4581 li a1,0 + 300a27a: fdc42503 lw a0,-36(s0) + 300a27e: 3431 jal ra,3009c8a + 300a280: 87aa mv a5,a0 + 300a282: 873e mv a4,a5 + 300a284: fef44783 lbu a5,-17(s0) + 300a288: 8fd9 or a5,a5,a4 + 300a28a: fef407a3 sb a5,-17(s0) + 300a28e: a0e1 j 300a356 + 300a290: fef40783 lb a5,-17(s0) + 300a294: e7b1 bnez a5,300a2e0 + 300a296: fd944783 lbu a5,-39(s0) + 300a29a: 4711 li a4,4 + 300a29c: 02f76e63 bltu a4,a5,300a2d8 + 300a2a0: 00279713 slli a4,a5,0x2 + 300a2a4: 0300f7b7 lui a5,0x300f + 300a2a8: 49078793 addi a5,a5,1168 # 300f490 + 300a2ac: 97ba add a5,a5,a4 + 300a2ae: 439c lw a5,0(a5) + 300a2b0: 8782 jr a5 + 300a2b2: fe040723 sb zero,-18(s0) + 300a2b6: a035 j 300a2e2 + 300a2b8: 4785 li a5,1 + 300a2ba: fef40723 sb a5,-18(s0) + 300a2be: a015 j 300a2e2 + 300a2c0: 4789 li a5,2 + 300a2c2: fef40723 sb a5,-18(s0) + 300a2c6: a831 j 300a2e2 + 300a2c8: 478d li a5,3 + 300a2ca: fef40723 sb a5,-18(s0) + 300a2ce: a811 j 300a2e2 + 300a2d0: 4791 li a5,4 + 300a2d2: fef40723 sb a5,-18(s0) + 300a2d6: a031 j 300a2e2 + 300a2d8: 57d5 li a5,-11 + 300a2da: fef407a3 sb a5,-17(s0) + 300a2de: a011 j 300a2e2 + 300a2e0: 0001 nop + 300a2e2: fef40783 lb a5,-17(s0) + 300a2e6: eb99 bnez a5,300a2fc + 300a2e8: fee44783 lbu a5,-18(s0) + 300a2ec: 863e mv a2,a5 + 300a2ee: 45a9 li a1,10 + 300a2f0: fdc42503 lw a0,-36(s0) + 300a2f4: 3a59 jal ra,3009c8a + 300a2f6: 87aa mv a5,a0 + 300a2f8: fef407a3 sb a5,-17(s0) + 300a2fc: fef40783 lb a5,-17(s0) + 300a300: eb85 bnez a5,300a330 + 300a302: fd844783 lbu a5,-40(s0) + 300a306: e781 bnez a5,300a30e + 300a308: fe040723 sb zero,-18(s0) + 300a30c: a021 j 300a314 + 300a30e: 47c1 li a5,16 + 300a310: fef40723 sb a5,-18(s0) + 300a314: fee44783 lbu a5,-18(s0) + 300a318: 86be mv a3,a5 + 300a31a: 0ef00613 li a2,239 + 300a31e: 08400593 li a1,132 + 300a322: fdc42503 lw a0,-36(s0) + 300a326: 216040ef jal ra,300e53c + 300a32a: 87aa mv a5,a0 + 300a32c: fef407a3 sb a5,-17(s0) + 300a330: fef40783 lb a5,-17(s0) + 300a334: e799 bnez a5,300a342 + 300a336: fdc42783 lw a5,-36(s0) + 300a33a: fd944703 lbu a4,-39(s0) + 300a33e: 10e78323 sb a4,262(a5) + 300a342: fef40783 lb a5,-17(s0) + 300a346: eb81 bnez a5,300a356 + 300a348: 4581 li a1,0 + 300a34a: fdc42503 lw a0,-36(s0) + 300a34e: 2861 jal ra,300a3e6 + 300a350: 87aa mv a5,a0 + 300a352: fef407a3 sb a5,-17(s0) + 300a356: fef40783 lb a5,-17(s0) + 300a35a: 853e mv a0,a5 + 300a35c: 50b2 lw ra,44(sp) + 300a35e: 5422 lw s0,40(sp) + 300a360: 6145 addi sp,sp,48 + 300a362: 8082 ret + +0300a364 : + 300a364: 7179 addi sp,sp,-48 + 300a366: d606 sw ra,44(sp) + 300a368: d422 sw s0,40(sp) + 300a36a: 1800 addi s0,sp,48 + 300a36c: fca42e23 sw a0,-36(s0) + 300a370: 87ae mv a5,a1 + 300a372: fcc42a23 sw a2,-44(s0) + 300a376: fcd42823 sw a3,-48(s0) + 300a37a: fcf40da3 sb a5,-37(s0) + 300a37e: fe0407a3 sb zero,-17(s0) + 300a382: fec40793 addi a5,s0,-20 + 300a386: 863e mv a2,a5 + 300a388: 45b9 li a1,14 + 300a38a: fdc42503 lw a0,-36(s0) + 300a38e: 2569 jal ra,300aa18 + 300a390: 87aa mv a5,a0 + 300a392: fef407a3 sb a5,-17(s0) + 300a396: fec45783 lhu a5,-20(s0) + 300a39a: 07c6 slli a5,a5,0x11 + 300a39c: 873e mv a4,a5 + 300a39e: 1ffe07b7 lui a5,0x1ffe0 + 300a3a2: 8f7d and a4,a4,a5 + 300a3a4: fd442783 lw a5,-44(s0) + 300a3a8: c398 sw a4,0(a5) + 300a3aa: fef40783 lb a5,-17(s0) + 300a3ae: e78d bnez a5,300a3d8 + 300a3b0: fec40793 addi a5,s0,-20 + 300a3b4: 863e mv a2,a5 + 300a3b6: 45b1 li a1,12 + 300a3b8: fdc42503 lw a0,-36(s0) + 300a3bc: 2db1 jal ra,300aa18 + 300a3be: 87aa mv a5,a0 + 300a3c0: fef407a3 sb a5,-17(s0) + 300a3c4: fec45783 lhu a5,-20(s0) + 300a3c8: 07c6 slli a5,a5,0x11 + 300a3ca: 873e mv a4,a5 + 300a3cc: 1ffe07b7 lui a5,0x1ffe0 + 300a3d0: 8f7d and a4,a4,a5 + 300a3d2: fd042783 lw a5,-48(s0) + 300a3d6: c398 sw a4,0(a5) + 300a3d8: fef40783 lb a5,-17(s0) + 300a3dc: 853e mv a0,a5 + 300a3de: 50b2 lw ra,44(sp) + 300a3e0: 5422 lw s0,40(sp) + 300a3e2: 6145 addi sp,sp,48 + 300a3e4: 8082 ret + +0300a3e6 : + 300a3e6: 7179 addi sp,sp,-48 + 300a3e8: d606 sw ra,44(sp) + 300a3ea: d422 sw s0,40(sp) + 300a3ec: 1800 addi s0,sp,48 + 300a3ee: fca42e23 sw a0,-36(s0) + 300a3f2: fcb42c23 sw a1,-40(s0) + 300a3f6: fe0407a3 sb zero,-17(s0) + 300a3fa: fe040723 sb zero,-18(s0) + 300a3fe: 4605 li a2,1 + 300a400: 45ad li a1,11 + 300a402: fdc42503 lw a0,-36(s0) + 300a406: 2d19 jal ra,300aa1c + 300a408: 87aa mv a5,a0 + 300a40a: fef407a3 sb a5,-17(s0) + 300a40e: 4601 li a2,0 + 300a410: 45ad li a1,11 + 300a412: fdc42503 lw a0,-36(s0) + 300a416: 2519 jal ra,300aa1c + 300a418: 87aa mv a5,a0 + 300a41a: 873e mv a4,a5 + 300a41c: fef44783 lbu a5,-17(s0) + 300a420: 8fd9 or a5,a5,a4 + 300a422: fef407a3 sb a5,-17(s0) + 300a426: fed40793 addi a5,s0,-19 + 300a42a: 863e mv a2,a5 + 300a42c: 45cd li a1,19 + 300a42e: fdc42503 lw a0,-36(s0) + 300a432: 1b0040ef jal ra,300e5e2 + 300a436: 87aa mv a5,a0 + 300a438: 873e mv a4,a5 + 300a43a: fef44783 lbu a5,-17(s0) + 300a43e: 8fd9 or a5,a5,a4 + 300a440: fef407a3 sb a5,-17(s0) + 300a444: fee44783 lbu a5,-18(s0) + 300a448: 0785 addi a5,a5,1 # 1ffe0001 + 300a44a: fef40723 sb a5,-18(s0) + 300a44e: fed44783 lbu a5,-19(s0) + 300a452: 8b9d andi a5,a5,7 + 300a454: cb89 beqz a5,300a466 + 300a456: fee44703 lbu a4,-18(s0) + 300a45a: 4789 li a5,2 + 300a45c: 00e7e563 bltu a5,a4,300a466 + 300a460: fef40783 lb a5,-17(s0) + 300a464: dfc9 beqz a5,300a3fe + 300a466: fee44703 lbu a4,-18(s0) + 300a46a: 4789 li a5,2 + 300a46c: 00e7f563 bgeu a5,a4,300a476 + 300a470: 57d1 li a5,-12 + 300a472: fef407a3 sb a5,-17(s0) + 300a476: fef40783 lb a5,-17(s0) + 300a47a: 853e mv a0,a5 + 300a47c: 50b2 lw ra,44(sp) + 300a47e: 5422 lw s0,40(sp) + 300a480: 6145 addi sp,sp,48 + 300a482: 8082 ret + +0300a484 : + 300a484: 7179 addi sp,sp,-48 + 300a486: d606 sw ra,44(sp) + 300a488: d422 sw s0,40(sp) + 300a48a: 1800 addi s0,sp,48 + 300a48c: fca42e23 sw a0,-36(s0) + 300a490: fcb42c23 sw a1,-40(s0) + 300a494: fe0407a3 sb zero,-17(s0) + 300a498: fee40793 addi a5,s0,-18 + 300a49c: 863e mv a2,a5 + 300a49e: 45cd li a1,19 + 300a4a0: fdc42503 lw a0,-36(s0) + 300a4a4: 13e040ef jal ra,300e5e2 + 300a4a8: 87aa mv a5,a0 + 300a4aa: fef407a3 sb a5,-17(s0) + 300a4ae: fee44783 lbu a5,-18(s0) + 300a4b2: 0077f713 andi a4,a5,7 + 300a4b6: fd842783 lw a5,-40(s0) + 300a4ba: c398 sw a4,0(a5) + 300a4bc: fee44783 lbu a5,-18(s0) + 300a4c0: 8be1 andi a5,a5,24 + 300a4c2: c781 beqz a5,300a4ca + 300a4c4: 57e9 li a5,-6 + 300a4c6: fef407a3 sb a5,-17(s0) + 300a4ca: fef40783 lb a5,-17(s0) + 300a4ce: 853e mv a0,a5 + 300a4d0: 50b2 lw ra,44(sp) + 300a4d2: 5422 lw s0,40(sp) + 300a4d4: 6145 addi sp,sp,48 + 300a4d6: 8082 ret + +0300a4d8 : + 300a4d8: 7179 addi sp,sp,-48 + 300a4da: d606 sw ra,44(sp) + 300a4dc: d422 sw s0,40(sp) + 300a4de: 1800 addi s0,sp,48 + 300a4e0: fca42e23 sw a0,-36(s0) + 300a4e4: fcb42c23 sw a1,-40(s0) + 300a4e8: fcc42a23 sw a2,-44(s0) + 300a4ec: fe0407a3 sb zero,-17(s0) + 300a4f0: fd442603 lw a2,-44(s0) + 300a4f4: fd842583 lw a1,-40(s0) + 300a4f8: fdc42503 lw a0,-36(s0) + 300a4fc: 2315 jal ra,300aa20 + 300a4fe: 87aa mv a5,a0 + 300a500: fef407a3 sb a5,-17(s0) + 300a504: fef40783 lb a5,-17(s0) + 300a508: 853e mv a0,a5 + 300a50a: 50b2 lw ra,44(sp) + 300a50c: 5422 lw s0,40(sp) + 300a50e: 6145 addi sp,sp,48 + 300a510: 8082 ret + +0300a512 : + 300a512: 7179 addi sp,sp,-48 + 300a514: d606 sw ra,44(sp) + 300a516: d422 sw s0,40(sp) + 300a518: 1800 addi s0,sp,48 + 300a51a: fca42e23 sw a0,-36(s0) + 300a51e: fcb42c23 sw a1,-40(s0) + 300a522: fe0407a3 sb zero,-17(s0) + 300a526: 7ff00793 li a5,2047 + 300a52a: fef41623 sh a5,-20(s0) + 300a52e: 6785 lui a5,0x1 + 300a530: fef41523 sh a5,-22(s0) + 300a534: fe840793 addi a5,s0,-24 + 300a538: 863e mv a2,a5 + 300a53a: 02800593 li a1,40 + 300a53e: fdc42503 lw a0,-36(s0) + 300a542: 29d9 jal ra,300aa18 + 300a544: 87aa mv a5,a0 + 300a546: fef407a3 sb a5,-17(s0) + 300a54a: fef40783 lb a5,-17(s0) + 300a54e: efb1 bnez a5,300a5aa + 300a550: fe845703 lhu a4,-24(s0) + 300a554: 6785 lui a5,0x1 + 300a556: 17fd addi a5,a5,-1 # fff + 300a558: 8ff9 and a5,a5,a4 + 300a55a: 9fa1 uxth a5 + 300a55c: fef41423 sh a5,-24(s0) + 300a560: fe845783 lhu a5,-24(s0) + 300a564: 873e mv a4,a5 + 300a566: fec41783 lh a5,-20(s0) + 300a56a: 02e7d463 bge a5,a4,300a592 + 300a56e: fe845703 lhu a4,-24(s0) + 300a572: fea45783 lhu a5,-22(s0) + 300a576: 40f707b3 sub a5,a4,a5 + 300a57a: 9fa1 uxth a5 + 300a57c: 07c2 slli a5,a5,0x10 + 300a57e: 87c1 srai a5,a5,0x10 + 300a580: 873e mv a4,a5 + 300a582: 0fa00793 li a5,250 + 300a586: 02f70733 mul a4,a4,a5 + 300a58a: fd842783 lw a5,-40(s0) + 300a58e: c398 sw a4,0(a5) + 300a590: a829 j 300a5aa + 300a592: fe845783 lhu a5,-24(s0) + 300a596: 07c2 slli a5,a5,0x10 + 300a598: 87c1 srai a5,a5,0x10 + 300a59a: 873e mv a4,a5 + 300a59c: 0fa00793 li a5,250 + 300a5a0: 02f70733 mul a4,a4,a5 + 300a5a4: fd842783 lw a5,-40(s0) + 300a5a8: c398 sw a4,0(a5) + 300a5aa: fef40783 lb a5,-17(s0) + 300a5ae: 853e mv a0,a5 + 300a5b0: 50b2 lw ra,44(sp) + 300a5b2: 5422 lw s0,40(sp) + 300a5b4: 6145 addi sp,sp,48 + 300a5b6: 8082 ret + +0300a5b8 : + 300a5b8: 7139 addi sp,sp,-64 + 300a5ba: de22 sw s0,60(sp) + 300a5bc: 0080 addi s0,sp,64 + 300a5be: fca42623 sw a0,-52(s0) + 300a5c2: fcb42423 sw a1,-56(s0) + 300a5c6: fcc42223 sw a2,-60(s0) + 300a5ca: fcd42023 sw a3,-64(s0) + 300a5ce: 47a1 li a5,8 + 300a5d0: fef42023 sw a5,-32(s0) + 300a5d4: fe040323 sb zero,-26(s0) + 300a5d8: fc042783 lw a5,-64(s0) + 300a5dc: 577d li a4,-1 + 300a5de: c398 sw a4,0(a5) + 300a5e0: fc442703 lw a4,-60(s0) + 300a5e4: fe042783 lw a5,-32(s0) + 300a5e8: 02f757b3 divu a5,a4,a5 + 300a5ec: fcf42e23 sw a5,-36(s0) + 300a5f0: fc442703 lw a4,-60(s0) + 300a5f4: fe042783 lw a5,-32(s0) + 300a5f8: 02f777b3 remu a5,a4,a5 + 300a5fc: fcf42c23 sw a5,-40(s0) + 300a600: fdc42783 lw a5,-36(s0) + 300a604: fef42623 sw a5,-20(s0) + 300a608: a841 j 300a698 + 300a60a: fe042423 sw zero,-24(s0) + 300a60e: fcc42703 lw a4,-52(s0) + 300a612: fec42783 lw a5,-20(s0) + 300a616: 97ba add a5,a5,a4 + 300a618: 239c lbu a5,0(a5) + 300a61a: fef403a3 sb a5,-25(s0) + 300a61e: fec42703 lw a4,-20(s0) + 300a622: fdc42783 lw a5,-36(s0) + 300a626: 04f71e63 bne a4,a5,300a682 + 300a62a: fe744703 lbu a4,-25(s0) + 300a62e: fd842783 lw a5,-40(s0) + 300a632: 40f757b3 sra a5,a4,a5 + 300a636: fef403a3 sb a5,-25(s0) + 300a63a: fd842783 lw a5,-40(s0) + 300a63e: fef42423 sw a5,-24(s0) + 300a642: a081 j 300a682 + 300a644: fe744783 lbu a5,-25(s0) + 300a648: 8b85 andi a5,a5,1 + 300a64a: c395 beqz a5,300a66e + 300a64c: 4785 li a5,1 + 300a64e: fef40323 sb a5,-26(s0) + 300a652: fec42703 lw a4,-20(s0) + 300a656: fe042783 lw a5,-32(s0) + 300a65a: 02f70733 mul a4,a4,a5 + 300a65e: fe842783 lw a5,-24(s0) + 300a662: 97ba add a5,a5,a4 + 300a664: 873e mv a4,a5 + 300a666: fc042783 lw a5,-64(s0) + 300a66a: c398 sw a4,0(a5) + 300a66c: a00d j 300a68e + 300a66e: fe744783 lbu a5,-25(s0) + 300a672: 8385 srli a5,a5,0x1 + 300a674: fef403a3 sb a5,-25(s0) + 300a678: fe842783 lw a5,-24(s0) + 300a67c: 0785 addi a5,a5,1 + 300a67e: fef42423 sw a5,-24(s0) + 300a682: fe842703 lw a4,-24(s0) + 300a686: fe042783 lw a5,-32(s0) + 300a68a: faf76de3 bltu a4,a5,300a644 + 300a68e: fec42783 lw a5,-20(s0) + 300a692: 0785 addi a5,a5,1 + 300a694: fef42623 sw a5,-20(s0) + 300a698: fec42703 lw a4,-20(s0) + 300a69c: fc842783 lw a5,-56(s0) + 300a6a0: 00f77563 bgeu a4,a5,300a6aa + 300a6a4: fe644783 lbu a5,-26(s0) + 300a6a8: d3ad beqz a5,300a60a + 300a6aa: 0001 nop + 300a6ac: 5472 lw s0,60(sp) + 300a6ae: 6121 addi sp,sp,64 + 300a6b0: 8082 ret + +0300a6b2 : + 300a6b2: 7179 addi sp,sp,-48 + 300a6b4: d622 sw s0,44(sp) + 300a6b6: 1800 addi s0,sp,48 + 300a6b8: fca42e23 sw a0,-36(s0) + 300a6bc: 4785 li a5,1 + 300a6be: fef407a3 sb a5,-17(s0) + 300a6c2: fdc42783 lw a5,-36(s0) + 300a6c6: 8399 srli a5,a5,0x6 + 300a6c8: fef42423 sw a5,-24(s0) + 300a6cc: d8418713 addi a4,gp,-636 # 40003b8 + 300a6d0: fe842783 lw a5,-24(s0) + 300a6d4: 078a slli a5,a5,0x2 + 300a6d6: 97ba add a5,a5,a4 + 300a6d8: 439c lw a5,0(a5) + 300a6da: e399 bnez a5,300a6e0 + 300a6dc: fe0407a3 sb zero,-17(s0) + 300a6e0: fef44783 lbu a5,-17(s0) + 300a6e4: 853e mv a0,a5 + 300a6e6: 5432 lw s0,44(sp) + 300a6e8: 6145 addi sp,sp,48 + 300a6ea: 8082 ret + +0300a6ec : + 300a6ec: 7179 addi sp,sp,-48 + 300a6ee: d622 sw s0,44(sp) + 300a6f0: 1800 addi s0,sp,48 + 300a6f2: fca42e23 sw a0,-36(s0) + 300a6f6: fcb42c23 sw a1,-40(s0) + 300a6fa: fcc42a23 sw a2,-44(s0) + 300a6fe: fe0407a3 sb zero,-17(s0) + 300a702: 47a1 li a5,8 + 300a704: fef42423 sw a5,-24(s0) + 300a708: fd442703 lw a4,-44(s0) + 300a70c: fe842783 lw a5,-24(s0) + 300a710: 02f757b3 divu a5,a4,a5 + 300a714: fef42223 sw a5,-28(s0) + 300a718: fd442703 lw a4,-44(s0) + 300a71c: fe842783 lw a5,-24(s0) + 300a720: 02f777b3 remu a5,a4,a5 + 300a724: fef42023 sw a5,-32(s0) + 300a728: fe442703 lw a4,-28(s0) + 300a72c: fd842783 lw a5,-40(s0) + 300a730: 00f76763 bltu a4,a5,300a73e + 300a734: fce00793 li a5,-50 + 300a738: fef407a3 sb a5,-17(s0) + 300a73c: a82d j 300a776 + 300a73e: fdc42703 lw a4,-36(s0) + 300a742: fe442783 lw a5,-28(s0) + 300a746: 97ba add a5,a5,a4 + 300a748: 239c lbu a5,0(a5) + 300a74a: 01879713 slli a4,a5,0x18 + 300a74e: 8761 srai a4,a4,0x18 + 300a750: 4685 li a3,1 + 300a752: fe042783 lw a5,-32(s0) + 300a756: 00f697b3 sll a5,a3,a5 + 300a75a: 07e2 slli a5,a5,0x18 + 300a75c: 87e1 srai a5,a5,0x18 + 300a75e: 8fd9 or a5,a5,a4 + 300a760: 01879693 slli a3,a5,0x18 + 300a764: 86e1 srai a3,a3,0x18 + 300a766: fdc42703 lw a4,-36(s0) + 300a76a: fe442783 lw a5,-28(s0) + 300a76e: 97ba add a5,a5,a4 + 300a770: 0ff6f713 andi a4,a3,255 + 300a774: a398 sb a4,0(a5) + 300a776: fef40783 lb a5,-17(s0) + 300a77a: 853e mv a0,a5 + 300a77c: 5432 lw s0,44(sp) + 300a77e: 6145 addi sp,sp,48 + 300a780: 8082 ret + +0300a782 : + 300a782: 7179 addi sp,sp,-48 + 300a784: d606 sw ra,44(sp) + 300a786: d422 sw s0,40(sp) + 300a788: 1800 addi s0,sp,48 + 300a78a: fca42e23 sw a0,-36(s0) + 300a78e: fcb42c23 sw a1,-40(s0) + 300a792: 4699 li a3,6 + 300a794: fd842603 lw a2,-40(s0) + 300a798: 0b000593 li a1,176 + 300a79c: fdc42503 lw a0,-36(s0) + 300a7a0: 401030ef jal ra,300e3a0 + 300a7a4: 87aa mv a5,a0 + 300a7a6: fef407a3 sb a5,-17(s0) + 300a7aa: fef40783 lb a5,-17(s0) + 300a7ae: 853e mv a0,a5 + 300a7b0: 50b2 lw ra,44(sp) + 300a7b2: 5422 lw s0,40(sp) + 300a7b4: 6145 addi sp,sp,48 + 300a7b6: 8082 ret + +0300a7b8 : + 300a7b8: 7179 addi sp,sp,-48 + 300a7ba: d606 sw ra,44(sp) + 300a7bc: d422 sw s0,40(sp) + 300a7be: 1800 addi s0,sp,48 + 300a7c0: fca42e23 sw a0,-36(s0) + 300a7c4: fcb42c23 sw a1,-40(s0) + 300a7c8: 4699 li a3,6 + 300a7ca: fd842603 lw a2,-40(s0) + 300a7ce: 0b000593 li a1,176 + 300a7d2: fdc42503 lw a0,-36(s0) + 300a7d6: 43f030ef jal ra,300e414 + 300a7da: 87aa mv a5,a0 + 300a7dc: fef407a3 sb a5,-17(s0) + 300a7e0: fef40783 lb a5,-17(s0) + 300a7e4: 853e mv a0,a5 + 300a7e6: 50b2 lw ra,44(sp) + 300a7e8: 5422 lw s0,40(sp) + 300a7ea: 6145 addi sp,sp,48 + 300a7ec: 8082 ret + +0300a7ee : + 300a7ee: 715d addi sp,sp,-80 + 300a7f0: c686 sw ra,76(sp) + 300a7f2: c4a2 sw s0,72(sp) + 300a7f4: 0880 addi s0,sp,80 + 300a7f6: fca42623 sw a0,-52(s0) + 300a7fa: fcc42223 sw a2,-60(s0) + 300a7fe: fcd42023 sw a3,-64(s0) + 300a802: fae42e23 sw a4,-68(s0) + 300a806: faf42c23 sw a5,-72(s0) + 300a80a: fb042a23 sw a6,-76(s0) + 300a80e: fb142823 sw a7,-80(s0) + 300a812: 87ae mv a5,a1 + 300a814: fcf405a3 sb a5,-53(s0) + 300a818: fe0407a3 sb zero,-17(s0) + 300a81c: fb442783 lw a5,-76(s0) + 300a820: fcf42e23 sw a5,-36(s0) + 300a824: fb442783 lw a5,-76(s0) + 300a828: fef42023 sw a5,-32(s0) + 300a82c: fe042423 sw zero,-24(s0) + 300a830: a8ad j 300a8aa + 300a832: fdc40793 addi a5,s0,-36 + 300a836: 86be mv a3,a5 + 300a838: fe042603 lw a2,-32(s0) + 300a83c: fbc42583 lw a1,-68(s0) + 300a840: fc442503 lw a0,-60(s0) + 300a844: 3b95 jal ra,300a5b8 + 300a846: fdc42703 lw a4,-36(s0) + 300a84a: 57fd li a5,-1 + 300a84c: 00f71763 bne a4,a5,300a85a + 300a850: fce00793 li a5,-50 + 300a854: fef407a3 sb a5,-17(s0) + 300a858: a8b9 j 300a8b6 + 300a85a: fdc42783 lw a5,-36(s0) + 300a85e: 873e mv a4,a5 + 300a860: fb842783 lw a5,-72(s0) + 300a864: 97ba add a5,a5,a4 + 300a866: 853e mv a0,a5 + 300a868: 35a9 jal ra,300a6b2 + 300a86a: 87aa mv a5,a0 + 300a86c: 873e mv a4,a5 + 300a86e: fcb44783 lbu a5,-53(s0) + 300a872: 00e78763 beq a5,a4,300a880 + 300a876: fce00793 li a5,-50 + 300a87a: fef407a3 sb a5,-17(s0) + 300a87e: a825 j 300a8b6 + 300a880: fdc42783 lw a5,-36(s0) + 300a884: fef42023 sw a5,-32(s0) + 300a888: fe042603 lw a2,-32(s0) + 300a88c: fbc42583 lw a1,-68(s0) + 300a890: fc042503 lw a0,-64(s0) + 300a894: 3da1 jal ra,300a6ec + 300a896: fe042783 lw a5,-32(s0) + 300a89a: 0785 addi a5,a5,1 + 300a89c: fef42023 sw a5,-32(s0) + 300a8a0: fe842783 lw a5,-24(s0) + 300a8a4: 0785 addi a5,a5,1 + 300a8a6: fef42423 sw a5,-24(s0) + 300a8aa: fe842703 lw a4,-24(s0) + 300a8ae: fb042783 lw a5,-80(s0) + 300a8b2: f8f760e3 bltu a4,a5,300a832 + 300a8b6: 401c lw a5,0(s0) + 300a8b8: fe042703 lw a4,-32(s0) + 300a8bc: c398 sw a4,0(a5) + 300a8be: fef40783 lb a5,-17(s0) + 300a8c2: eb89 bnez a5,300a8d4 + 300a8c4: fc042583 lw a1,-64(s0) + 300a8c8: fcc42503 lw a0,-52(s0) + 300a8cc: 3d5d jal ra,300a782 + 300a8ce: 87aa mv a5,a0 + 300a8d0: fef407a3 sb a5,-17(s0) + 300a8d4: fef40783 lb a5,-17(s0) + 300a8d8: efa1 bnez a5,300a930 + 300a8da: fd440793 addi a5,s0,-44 + 300a8de: 85be mv a1,a5 + 300a8e0: fcc42503 lw a0,-52(s0) + 300a8e4: 3dd1 jal ra,300a7b8 + 300a8e6: 87aa mv a5,a0 + 300a8e8: fef407a3 sb a5,-17(s0) + 300a8ec: fe042223 sw zero,-28(s0) + 300a8f0: a815 j 300a924 + 300a8f2: fc042703 lw a4,-64(s0) + 300a8f6: fe442783 lw a5,-28(s0) + 300a8fa: 97ba add a5,a5,a4 + 300a8fc: 2398 lbu a4,0(a5) + 300a8fe: fe442783 lw a5,-28(s0) + 300a902: ff040693 addi a3,s0,-16 + 300a906: 97b6 add a5,a5,a3 + 300a908: fe47c783 lbu a5,-28(a5) + 300a90c: 00f70763 beq a4,a5,300a91a + 300a910: fce00793 li a5,-50 + 300a914: fef407a3 sb a5,-17(s0) + 300a918: a821 j 300a930 + 300a91a: fe442783 lw a5,-28(s0) + 300a91e: 0785 addi a5,a5,1 + 300a920: fef42223 sw a5,-28(s0) + 300a924: fe442703 lw a4,-28(s0) + 300a928: fbc42783 lw a5,-68(s0) + 300a92c: fcf763e3 bltu a4,a5,300a8f2 + 300a930: fef40783 lb a5,-17(s0) + 300a934: 853e mv a0,a5 + 300a936: 40b6 lw ra,76(sp) + 300a938: 4426 lw s0,72(sp) + 300a93a: 6161 addi sp,sp,80 + 300a93c: 8082 ret + +0300a93e : + 300a93e: 7139 addi sp,sp,-64 + 300a940: de06 sw ra,60(sp) + 300a942: dc22 sw s0,56(sp) + 300a944: 0080 addi s0,sp,64 + 300a946: fca42623 sw a0,-52(s0) + 300a94a: fcb42423 sw a1,-56(s0) + 300a94e: fe0407a3 sb zero,-17(s0) + 300a952: fe040723 sb zero,-18(s0) + 300a956: fcc42783 lw a5,-52(s0) + 300a95a: 15c7c783 lbu a5,348(a5) + 300a95e: fef40723 sb a5,-18(s0) + 300a962: fef40783 lb a5,-17(s0) + 300a966: eb91 bnez a5,300a97a + 300a968: 0c000613 li a2,192 + 300a96c: 4585 li a1,1 + 300a96e: fcc42503 lw a0,-52(s0) + 300a972: 206d jal ra,300aa1c + 300a974: 87aa mv a5,a0 + 300a976: fef407a3 sb a5,-17(s0) + 300a97a: fef40783 lb a5,-17(s0) + 300a97e: eb99 bnez a5,300a994 + 300a980: fd040793 addi a5,s0,-48 + 300a984: 85be mv a1,a5 + 300a986: fcc42503 lw a0,-52(s0) + 300a98a: e9cff0ef jal ra,300a026 + 300a98e: 87aa mv a5,a0 + 300a990: fef407a3 sb a5,-17(s0) + 300a994: fef40783 lb a5,-17(s0) + 300a998: eb91 bnez a5,300a9ac + 300a99a: 4605 li a2,1 + 300a99c: 0ff00593 li a1,255 + 300a9a0: fcc42503 lw a0,-52(s0) + 300a9a4: 28a5 jal ra,300aa1c + 300a9a6: 87aa mv a5,a0 + 300a9a8: fef407a3 sb a5,-17(s0) + 300a9ac: fef40783 lb a5,-17(s0) + 300a9b0: eb99 bnez a5,300a9c6 + 300a9b2: fc842603 lw a2,-56(s0) + 300a9b6: 0b600593 li a1,182 + 300a9ba: fcc42503 lw a0,-52(s0) + 300a9be: 28a9 jal ra,300aa18 + 300a9c0: 87aa mv a5,a0 + 300a9c2: fef407a3 sb a5,-17(s0) + 300a9c6: fef40783 lb a5,-17(s0) + 300a9ca: eb91 bnez a5,300a9de + 300a9cc: 4601 li a2,0 + 300a9ce: 0ff00593 li a1,255 + 300a9d2: fcc42503 lw a0,-52(s0) + 300a9d6: 2099 jal ra,300aa1c + 300a9d8: 87aa mv a5,a0 + 300a9da: fef407a3 sb a5,-17(s0) + 300a9de: fef40783 lb a5,-17(s0) + 300a9e2: e785 bnez a5,300aa0a + 300a9e4: fee44783 lbu a5,-18(s0) + 300a9e8: 863e mv a2,a5 + 300a9ea: 4585 li a1,1 + 300a9ec: fcc42503 lw a0,-52(s0) + 300a9f0: 2035 jal ra,300aa1c + 300a9f2: 87aa mv a5,a0 + 300a9f4: fef407a3 sb a5,-17(s0) + 300a9f8: fef40783 lb a5,-17(s0) + 300a9fc: e799 bnez a5,300aa0a + 300a9fe: fcc42783 lw a5,-52(s0) + 300aa02: fee44703 lbu a4,-18(s0) + 300aa06: 14e78e23 sb a4,348(a5) + 300aa0a: fef40783 lb a5,-17(s0) + 300aa0e: 853e mv a0,a5 + 300aa10: 50f2 lw ra,60(sp) + 300aa12: 5462 lw s0,56(sp) + 300aa14: 6121 addi sp,sp,64 + 300aa16: 8082 ret + +0300aa18 : + 300aa18: 4210306f j 300e638 + +0300aa1c : + 300aa1c: 2690306f j 300e484 + +0300aa20 : + 300aa20: 7119 addi sp,sp,-128 + 300aa22: de86 sw ra,124(sp) + 300aa24: dca2 sw s0,120(sp) + 300aa26: 0100 addi s0,sp,128 + 300aa28: f8a42e23 sw a0,-100(s0) + 300aa2c: f8b42c23 sw a1,-104(s0) + 300aa30: f8c42a23 sw a2,-108(s0) + 300aa34: fe0407a3 sb zero,-17(s0) + 300aa38: fb400793 li a5,-76 + 300aa3c: fcf40923 sb a5,-46(s0) + 300aa40: 478d li a5,3 + 300aa42: fcf42623 sw a5,-52(s0) + 300aa46: 02c00793 li a5,44 + 300aa4a: fcf42423 sw a5,-56(s0) + 300aa4e: fe042423 sw zero,-24(s0) + 300aa52: fa042823 sw zero,-80(s0) + 300aa56: fa042623 sw zero,-84(s0) + 300aa5a: 6785 lui a5,0x1 + 300aa5c: a0078793 addi a5,a5,-1536 # a00 + 300aa60: fcf41323 sh a5,-58(s0) + 300aa64: fe042223 sw zero,-28(s0) + 300aa68: fe042023 sw zero,-32(s0) + 300aa6c: 4799 li a5,6 + 300aa6e: fcf42023 sw a5,-64(s0) + 300aa72: fa042e23 sw zero,-68(s0) + 300aa76: fc042e23 sw zero,-36(s0) + 300aa7a: fc040da3 sb zero,-37(s0) + 300aa7e: fa0404a3 sb zero,-87(s0) + 300aa82: fa040423 sb zero,-88(s0) + 300aa86: fc042a23 sw zero,-44(s0) + 300aa8a: fc0409a3 sb zero,-45(s0) + 300aa8e: f9c42783 lw a5,-100(s0) + 300aa92: 1687d783 lhu a5,360(a5) + 300aa96: fcf41323 sh a5,-58(s0) + 300aa9a: fe042023 sw zero,-32(s0) + 300aa9e: a829 j 300aab8 + 300aaa0: f9c42703 lw a4,-100(s0) + 300aaa4: fe042783 lw a5,-32(s0) + 300aaa8: 97ba add a5,a5,a4 + 300aaaa: 14078823 sb zero,336(a5) + 300aaae: fe042783 lw a5,-32(s0) + 300aab2: 0785 addi a5,a5,1 + 300aab4: fef42023 sw a5,-32(s0) + 300aab8: fe042703 lw a4,-32(s0) + 300aabc: fc042783 lw a5,-64(s0) + 300aac0: fef760e3 bltu a4,a5,300aaa0 + 300aac4: 4605 li a2,1 + 300aac6: 0ff00593 li a1,255 + 300aaca: f9c42503 lw a0,-100(s0) + 300aace: 37b9 jal ra,300aa1c + 300aad0: 87aa mv a5,a0 + 300aad2: fef407a3 sb a5,-17(s0) + 300aad6: fef40783 lb a5,-17(s0) + 300aada: eb91 bnez a5,300aaee + 300aadc: 4601 li a2,0 + 300aade: 04f00593 li a1,79 + 300aae2: f9c42503 lw a0,-100(s0) + 300aae6: 3f1d jal ra,300aa1c + 300aae8: 87aa mv a5,a0 + 300aaea: fef407a3 sb a5,-17(s0) + 300aaee: fef40783 lb a5,-17(s0) + 300aaf2: eb99 bnez a5,300ab08 + 300aaf4: 02c00613 li a2,44 + 300aaf8: 04e00593 li a1,78 + 300aafc: f9c42503 lw a0,-100(s0) + 300ab00: 3f31 jal ra,300aa1c + 300ab02: 87aa mv a5,a0 + 300ab04: fef407a3 sb a5,-17(s0) + 300ab08: fef40783 lb a5,-17(s0) + 300ab0c: eb91 bnez a5,300ab20 + 300ab0e: 4601 li a2,0 + 300ab10: 0ff00593 li a1,255 + 300ab14: f9c42503 lw a0,-100(s0) + 300ab18: 3711 jal ra,300aa1c + 300ab1a: 87aa mv a5,a0 + 300ab1c: fef407a3 sb a5,-17(s0) + 300ab20: fef40783 lb a5,-17(s0) + 300ab24: ef81 bnez a5,300ab3c + 300ab26: fd244783 lbu a5,-46(s0) + 300ab2a: 863e mv a2,a5 + 300ab2c: 0b600593 li a1,182 + 300ab30: f9c42503 lw a0,-100(s0) + 300ab34: 35e5 jal ra,300aa1c + 300ab36: 87aa mv a5,a0 + 300ab38: fef407a3 sb a5,-17(s0) + 300ab3c: fef40783 lb a5,-17(s0) + 300ab40: eb91 bnez a5,300ab54 + 300ab42: 4601 li a2,0 + 300ab44: 08000593 li a1,128 + 300ab48: f9c42503 lw a0,-100(s0) + 300ab4c: 3dc1 jal ra,300aa1c + 300ab4e: 87aa mv a5,a0 + 300ab50: fef407a3 sb a5,-17(s0) + 300ab54: fef40783 lb a5,-17(s0) + 300ab58: ef99 bnez a5,300ab76 + 300ab5a: fa840713 addi a4,s0,-88 + 300ab5e: fa940793 addi a5,s0,-87 + 300ab62: 4681 li a3,0 + 300ab64: 863a mv a2,a4 + 300ab66: 85be mv a1,a5 + 300ab68: f9c42503 lw a0,-100(s0) + 300ab6c: 0d5000ef jal ra,300b440 + 300ab70: 87aa mv a5,a0 + 300ab72: fef407a3 sb a5,-17(s0) + 300ab76: fef40783 lb a5,-17(s0) + 300ab7a: e7b9 bnez a5,300abc8 + 300ab7c: fe042423 sw zero,-24(s0) + 300ab80: fe842783 lw a5,-24(s0) + 300ab84: faf42823 sw a5,-80(s0) + 300ab88: fe042223 sw zero,-28(s0) + 300ab8c: fe442783 lw a5,-28(s0) + 300ab90: 0ff7f593 andi a1,a5,255 + 300ab94: f9c42783 lw a5,-100(s0) + 300ab98: 15678613 addi a2,a5,342 + 300ab9c: f9c42783 lw a5,-100(s0) + 300aba0: 15078693 addi a3,a5,336 + 300aba4: fd244703 lbu a4,-46(s0) + 300aba8: fb040793 addi a5,s0,-80 + 300abac: c03e sw a5,0(sp) + 300abae: fcc42883 lw a7,-52(s0) + 300abb2: fe842803 lw a6,-24(s0) + 300abb6: 87ba mv a5,a4 + 300abb8: fc042703 lw a4,-64(s0) + 300abbc: f9c42503 lw a0,-100(s0) + 300abc0: 313d jal ra,300a7ee + 300abc2: 87aa mv a5,a0 + 300abc4: fef407a3 sb a5,-17(s0) + 300abc8: fef40783 lb a5,-17(s0) + 300abcc: 10079863 bnez a5,300acdc + 300abd0: fb042783 lw a5,-80(s0) + 300abd4: fef42423 sw a5,-24(s0) + 300abd8: faa40793 addi a5,s0,-86 + 300abdc: 85be mv a1,a5 + 300abde: f9c42503 lw a0,-100(s0) + 300abe2: 3bb1 jal ra,300a93e + 300abe4: 87aa mv a5,a0 + 300abe6: fef407a3 sb a5,-17(s0) + 300abea: fef40783 lb a5,-17(s0) + 300abee: e3fd bnez a5,300acd4 + 300abf0: faa45783 lhu a5,-86(s0) + 300abf4: fc645703 lhu a4,-58(s0) + 300abf8: 0cf77e63 bgeu a4,a5,300acd4 + 300abfc: fe042023 sw zero,-32(s0) + 300ac00: a829 j 300ac1a + 300ac02: f9c42703 lw a4,-100(s0) + 300ac06: fe042783 lw a5,-32(s0) + 300ac0a: 97ba add a5,a5,a4 + 300ac0c: 14078823 sb zero,336(a5) + 300ac10: fe042783 lw a5,-32(s0) + 300ac14: 0785 addi a5,a5,1 + 300ac16: fef42023 sw a5,-32(s0) + 300ac1a: fe042703 lw a4,-32(s0) + 300ac1e: fc042783 lw a5,-64(s0) + 300ac22: fef760e3 bltu a4,a5,300ac02 + 300ac26: a031 j 300ac32 + 300ac28: fe842783 lw a5,-24(s0) + 300ac2c: 0785 addi a5,a5,1 + 300ac2e: fef42423 sw a5,-24(s0) + 300ac32: fd244703 lbu a4,-46(s0) + 300ac36: fe842783 lw a5,-24(s0) + 300ac3a: 97ba add a5,a5,a4 + 300ac3c: 853e mv a0,a5 + 300ac3e: 3c95 jal ra,300a6b2 + 300ac40: 87aa mv a5,a0 + 300ac42: e799 bnez a5,300ac50 + 300ac44: fe842703 lw a4,-24(s0) + 300ac48: fc842783 lw a5,-56(s0) + 300ac4c: fcf76ee3 bltu a4,a5,300ac28 + 300ac50: 4785 li a5,1 + 300ac52: fef42223 sw a5,-28(s0) + 300ac56: fe442783 lw a5,-28(s0) + 300ac5a: 0ff7f593 andi a1,a5,255 + 300ac5e: f9c42783 lw a5,-100(s0) + 300ac62: 15678613 addi a2,a5,342 + 300ac66: f9c42783 lw a5,-100(s0) + 300ac6a: 15078693 addi a3,a5,336 + 300ac6e: fd244703 lbu a4,-46(s0) + 300ac72: fb040793 addi a5,s0,-80 + 300ac76: c03e sw a5,0(sp) + 300ac78: fcc42883 lw a7,-52(s0) + 300ac7c: fe842803 lw a6,-24(s0) + 300ac80: 87ba mv a5,a4 + 300ac82: fc042703 lw a4,-64(s0) + 300ac86: f9c42503 lw a0,-100(s0) + 300ac8a: 3695 jal ra,300a7ee + 300ac8c: 87aa mv a5,a0 + 300ac8e: fef407a3 sb a5,-17(s0) + 300ac92: fef40783 lb a5,-17(s0) + 300ac96: e3b1 bnez a5,300acda + 300ac98: fb042783 lw a5,-80(s0) + 300ac9c: fef42423 sw a5,-24(s0) + 300aca0: faa40793 addi a5,s0,-86 + 300aca4: 85be mv a1,a5 + 300aca6: f9c42503 lw a0,-100(s0) + 300acaa: 3951 jal ra,300a93e + 300acac: 87aa mv a5,a0 + 300acae: fef407a3 sb a5,-17(s0) + 300acb2: fef40783 lb a5,-17(s0) + 300acb6: e395 bnez a5,300acda + 300acb8: faa45783 lhu a5,-86(s0) + 300acbc: fc645703 lhu a4,-58(s0) + 300acc0: 00f77d63 bgeu a4,a5,300acda + 300acc4: 4785 li a5,1 + 300acc6: fcf409a3 sb a5,-45(s0) + 300acca: fcc42783 lw a5,-52(s0) + 300acce: fcf42a23 sw a5,-44(s0) + 300acd2: a021 j 300acda + 300acd4: fe042223 sw zero,-28(s0) + 300acd8: a011 j 300acdc + 300acda: 0001 nop + 300acdc: fef40783 lb a5,-17(s0) + 300ace0: 1a079863 bnez a5,300ae90 + 300ace4: faa45783 lhu a5,-86(s0) + 300ace8: fc645703 lhu a4,-58(s0) + 300acec: 1ae7f263 bgeu a5,a4,300ae90 + 300acf0: fe442783 lw a5,-28(s0) + 300acf4: fcf409a3 sb a5,-45(s0) + 300acf8: fcc42783 lw a5,-52(s0) + 300acfc: fcf42a23 sw a5,-44(s0) + 300ad00: f9c42783 lw a5,-100(s0) + 300ad04: 15078713 addi a4,a5,336 + 300ad08: fb440793 addi a5,s0,-76 + 300ad0c: fc042603 lw a2,-64(s0) + 300ad10: 85ba mv a1,a4 + 300ad12: 853e mv a0,a5 + 300ad14: 22f9 jal ra,300aee2 + 300ad16: faa45783 lhu a5,-86(s0) + 300ad1a: 873e mv a4,a5 + 300ad1c: fc645783 lhu a5,-58(s0) + 300ad20: 40f707b3 sub a5,a4,a5 + 300ad24: 853e mv a0,a5 + 300ad26: 3fb030ef jal ra,300e920 + 300ad2a: 87aa mv a5,a0 + 300ad2c: fcf42e23 sw a5,-36(s0) + 300ad30: fc040da3 sb zero,-37(s0) + 300ad34: a2b1 j 300ae80 + 300ad36: f9c42783 lw a5,-100(s0) + 300ad3a: 15678793 addi a5,a5,342 + 300ad3e: fac40713 addi a4,s0,-84 + 300ad42: 86ba mv a3,a4 + 300ad44: fe842603 lw a2,-24(s0) + 300ad48: fc042583 lw a1,-64(s0) + 300ad4c: 853e mv a0,a5 + 300ad4e: 30ad jal ra,300a5b8 + 300ad50: fac42703 lw a4,-84(s0) + 300ad54: 57fd li a5,-1 + 300ad56: 00f71763 bne a4,a5,300ad64 + 300ad5a: fce00793 li a5,-50 + 300ad5e: fef407a3 sb a5,-17(s0) + 300ad62: a23d j 300ae90 + 300ad64: fd244783 lbu a5,-46(s0) + 300ad68: fac42703 lw a4,-84(s0) + 300ad6c: 97ba add a5,a5,a4 + 300ad6e: 853e mv a0,a5 + 300ad70: 3289 jal ra,300a6b2 + 300ad72: 87aa mv a5,a0 + 300ad74: 873e mv a4,a5 + 300ad76: fe442783 lw a5,-28(s0) + 300ad7a: 00e78663 beq a5,a4,300ad86 + 300ad7e: 4785 li a5,1 + 300ad80: fcf40da3 sb a5,-37(s0) + 300ad84: a231 j 300ae90 + 300ad86: fd442783 lw a5,-44(s0) + 300ad8a: 0785 addi a5,a5,1 + 300ad8c: fcf42a23 sw a5,-44(s0) + 300ad90: fac42783 lw a5,-84(s0) + 300ad94: fef42423 sw a5,-24(s0) + 300ad98: f9c42783 lw a5,-100(s0) + 300ad9c: 15078793 addi a5,a5,336 + 300ada0: fe842603 lw a2,-24(s0) + 300ada4: fc042583 lw a1,-64(s0) + 300ada8: 853e mv a0,a5 + 300adaa: 3289 jal ra,300a6ec + 300adac: 87aa mv a5,a0 + 300adae: fef407a3 sb a5,-17(s0) + 300adb2: fef40783 lb a5,-17(s0) + 300adb6: e38d bnez a5,300add8 + 300adb8: fe842783 lw a5,-24(s0) + 300adbc: 0785 addi a5,a5,1 + 300adbe: fef42423 sw a5,-24(s0) + 300adc2: f9c42783 lw a5,-100(s0) + 300adc6: 15078793 addi a5,a5,336 + 300adca: 85be mv a1,a5 + 300adcc: f9c42503 lw a0,-100(s0) + 300add0: 3a4d jal ra,300a782 + 300add2: 87aa mv a5,a0 + 300add4: fef407a3 sb a5,-17(s0) + 300add8: fef40783 lb a5,-17(s0) + 300addc: e7dd bnez a5,300ae8a + 300adde: faa40793 addi a5,s0,-86 + 300ade2: 85be mv a1,a5 + 300ade4: f9c42503 lw a0,-100(s0) + 300ade8: 3e99 jal ra,300a93e + 300adea: 87aa mv a5,a0 + 300adec: fef407a3 sb a5,-17(s0) + 300adf0: fef40783 lb a5,-17(s0) + 300adf4: efc9 bnez a5,300ae8e + 300adf6: faa45783 lhu a5,-86(s0) + 300adfa: 873e mv a4,a5 + 300adfc: fc645783 lhu a5,-58(s0) + 300ae00: 40f707b3 sub a5,a4,a5 + 300ae04: 853e mv a0,a5 + 300ae06: 31b030ef jal ra,300e920 + 300ae0a: 87aa mv a5,a0 + 300ae0c: faf42e23 sw a5,-68(s0) + 300ae10: faa45783 lhu a5,-86(s0) + 300ae14: fc645703 lhu a4,-58(s0) + 300ae18: 04f77563 bgeu a4,a5,300ae62 + 300ae1c: fbc42703 lw a4,-68(s0) + 300ae20: fdc42783 lw a5,-36(s0) + 300ae24: 02e7fb63 bgeu a5,a4,300ae5a + 300ae28: fb440793 addi a5,s0,-76 + 300ae2c: 85be mv a1,a5 + 300ae2e: f9c42503 lw a0,-100(s0) + 300ae32: 3a81 jal ra,300a782 + 300ae34: 87aa mv a5,a0 + 300ae36: fef407a3 sb a5,-17(s0) + 300ae3a: f9c42783 lw a5,-100(s0) + 300ae3e: 15078793 addi a5,a5,336 + 300ae42: fb440713 addi a4,s0,-76 + 300ae46: fc042603 lw a2,-64(s0) + 300ae4a: 85ba mv a1,a4 + 300ae4c: 853e mv a0,a5 + 300ae4e: 2851 jal ra,300aee2 + 300ae50: fd442783 lw a5,-44(s0) + 300ae54: 17fd addi a5,a5,-1 + 300ae56: fcf42a23 sw a5,-44(s0) + 300ae5a: 4785 li a5,1 + 300ae5c: fcf40da3 sb a5,-37(s0) + 300ae60: a005 j 300ae80 + 300ae62: fbc42783 lw a5,-68(s0) + 300ae66: fcf42e23 sw a5,-36(s0) + 300ae6a: f9c42783 lw a5,-100(s0) + 300ae6e: 15078713 addi a4,a5,336 + 300ae72: fb440793 addi a5,s0,-76 + 300ae76: fc042603 lw a2,-64(s0) + 300ae7a: 85ba mv a1,a4 + 300ae7c: 853e mv a0,a5 + 300ae7e: 2095 jal ra,300aee2 + 300ae80: fdb44783 lbu a5,-37(s0) + 300ae84: ea0789e3 beqz a5,300ad36 + 300ae88: a021 j 300ae90 + 300ae8a: 0001 nop + 300ae8c: a011 j 300ae90 + 300ae8e: 0001 nop + 300ae90: fef40783 lb a5,-17(s0) + 300ae94: e3a1 bnez a5,300aed4 + 300ae96: f9842783 lw a5,-104(s0) + 300ae9a: fd442703 lw a4,-44(s0) + 300ae9e: c398 sw a4,0(a5) + 300aea0: f9442783 lw a5,-108(s0) + 300aea4: fd344703 lbu a4,-45(s0) + 300aea8: a398 sb a4,0(a5) + 300aeaa: f9c42783 lw a5,-100(s0) + 300aeae: 4705 li a4,1 + 300aeb0: 14e780a3 sb a4,321(a5) + 300aeb4: f9842783 lw a5,-104(s0) + 300aeb8: 439c lw a5,0(a5) + 300aeba: 0ff7f713 andi a4,a5,255 + 300aebe: f9c42783 lw a5,-100(s0) + 300aec2: 12e78fa3 sb a4,319(a5) + 300aec6: f9442783 lw a5,-108(s0) + 300aeca: 2398 lbu a4,0(a5) + 300aecc: f9c42783 lw a5,-100(s0) + 300aed0: 14e78023 sb a4,320(a5) + 300aed4: fef40783 lb a5,-17(s0) + 300aed8: 853e mv a0,a5 + 300aeda: 50f6 lw ra,124(sp) + 300aedc: 5466 lw s0,120(sp) + 300aede: 6109 addi sp,sp,128 + 300aee0: 8082 ret + +0300aee2 : + 300aee2: 2490306f j 300e92a + +0300aee6 : + 300aee6: 715d addi sp,sp,-80 + 300aee8: c686 sw ra,76(sp) + 300aeea: c4a2 sw s0,72(sp) + 300aeec: 0880 addi s0,sp,80 + 300aeee: fca42623 sw a0,-52(s0) + 300aef2: fcb42423 sw a1,-56(s0) + 300aef6: 87b2 mv a5,a2 + 300aef8: fcf403a3 sb a5,-57(s0) + 300aefc: fe0407a3 sb zero,-17(s0) + 300af00: fe042423 sw zero,-24(s0) + 300af04: fb400793 li a5,-76 + 300af08: fef401a3 sb a5,-29(s0) + 300af0c: 4799 li a5,6 + 300af0e: fcf42e23 sw a5,-36(s0) + 300af12: 02c00793 li a5,44 + 300af16: fcf42c23 sw a5,-40(s0) + 300af1a: 4605 li a2,1 + 300af1c: 0ff00593 li a1,255 + 300af20: fcc42503 lw a0,-52(s0) + 300af24: 3ce5 jal ra,300aa1c + 300af26: 87aa mv a5,a0 + 300af28: fef407a3 sb a5,-17(s0) + 300af2c: fef40783 lb a5,-17(s0) + 300af30: eb91 bnez a5,300af44 + 300af32: 4601 li a2,0 + 300af34: 04f00593 li a1,79 + 300af38: fcc42503 lw a0,-52(s0) + 300af3c: 34c5 jal ra,300aa1c + 300af3e: 87aa mv a5,a0 + 300af40: fef407a3 sb a5,-17(s0) + 300af44: fef40783 lb a5,-17(s0) + 300af48: eb99 bnez a5,300af5e + 300af4a: 02c00613 li a2,44 + 300af4e: 04e00593 li a1,78 + 300af52: fcc42503 lw a0,-52(s0) + 300af56: 34d9 jal ra,300aa1c + 300af58: 87aa mv a5,a0 + 300af5a: fef407a3 sb a5,-17(s0) + 300af5e: fef40783 lb a5,-17(s0) + 300af62: eb91 bnez a5,300af76 + 300af64: 4601 li a2,0 + 300af66: 0ff00593 li a1,255 + 300af6a: fcc42503 lw a0,-52(s0) + 300af6e: 347d jal ra,300aa1c + 300af70: 87aa mv a5,a0 + 300af72: fef407a3 sb a5,-17(s0) + 300af76: fef40783 lb a5,-17(s0) + 300af7a: ef81 bnez a5,300af92 + 300af7c: fe344783 lbu a5,-29(s0) + 300af80: 863e mv a2,a5 + 300af82: 0b600593 li a1,182 + 300af86: fcc42503 lw a0,-52(s0) + 300af8a: 3c49 jal ra,300aa1c + 300af8c: 87aa mv a5,a0 + 300af8e: fef407a3 sb a5,-17(s0) + 300af92: fe042223 sw zero,-28(s0) + 300af96: a829 j 300afb0 + 300af98: fcc42703 lw a4,-52(s0) + 300af9c: fe442783 lw a5,-28(s0) + 300afa0: 97ba add a5,a5,a4 + 300afa2: 14078823 sb zero,336(a5) + 300afa6: fe442783 lw a5,-28(s0) + 300afaa: 0785 addi a5,a5,1 + 300afac: fef42223 sw a5,-28(s0) + 300afb0: fe442703 lw a4,-28(s0) + 300afb4: fdc42783 lw a5,-36(s0) + 300afb8: fef760e3 bltu a4,a5,300af98 + 300afbc: fc744783 lbu a5,-57(s0) + 300afc0: c79d beqz a5,300afee + 300afc2: a031 j 300afce + 300afc4: fe842783 lw a5,-24(s0) + 300afc8: 0785 addi a5,a5,1 + 300afca: fef42423 sw a5,-24(s0) + 300afce: fe344703 lbu a4,-29(s0) + 300afd2: fe842783 lw a5,-24(s0) + 300afd6: 97ba add a5,a5,a4 + 300afd8: 853e mv a0,a5 + 300afda: ed8ff0ef jal ra,300a6b2 + 300afde: 87aa mv a5,a0 + 300afe0: e799 bnez a5,300afee + 300afe2: fe842703 lw a4,-24(s0) + 300afe6: fd842783 lw a5,-40(s0) + 300afea: fcf76de3 bltu a4,a5,300afc4 + 300afee: fcc42783 lw a5,-52(s0) + 300aff2: 15678613 addi a2,a5,342 + 300aff6: fcc42783 lw a5,-52(s0) + 300affa: 15078693 addi a3,a5,336 + 300affe: fe344703 lbu a4,-29(s0) + 300b002: fc744583 lbu a1,-57(s0) + 300b006: fd440793 addi a5,s0,-44 + 300b00a: c03e sw a5,0(sp) + 300b00c: fc842883 lw a7,-56(s0) + 300b010: fe842803 lw a6,-24(s0) + 300b014: 87ba mv a5,a4 + 300b016: fdc42703 lw a4,-36(s0) + 300b01a: fcc42503 lw a0,-52(s0) + 300b01e: fd0ff0ef jal ra,300a7ee + 300b022: 87aa mv a5,a0 + 300b024: fef407a3 sb a5,-17(s0) + 300b028: fef40783 lb a5,-17(s0) + 300b02c: e785 bnez a5,300b054 + 300b02e: fcc42783 lw a5,-52(s0) + 300b032: 4705 li a4,1 + 300b034: 14e780a3 sb a4,321(a5) + 300b038: fc842783 lw a5,-56(s0) + 300b03c: 0ff7f713 andi a4,a5,255 + 300b040: fcc42783 lw a5,-52(s0) + 300b044: 12e78fa3 sb a4,319(a5) + 300b048: fcc42783 lw a5,-52(s0) + 300b04c: fc744703 lbu a4,-57(s0) + 300b050: 14e78023 sb a4,320(a5) + 300b054: fef40783 lb a5,-17(s0) + 300b058: 853e mv a0,a5 + 300b05a: 40b6 lw ra,76(sp) + 300b05c: 4426 lw s0,72(sp) + 300b05e: 6161 addi sp,sp,80 + 300b060: 8082 ret + +0300b062 : + 300b062: 7179 addi sp,sp,-48 + 300b064: d606 sw ra,44(sp) + 300b066: d422 sw s0,40(sp) + 300b068: 1800 addi s0,sp,48 + 300b06a: fca42e23 sw a0,-36(s0) + 300b06e: 87ae mv a5,a1 + 300b070: fcf40da3 sb a5,-37(s0) + 300b074: fe0407a3 sb zero,-17(s0) + 300b078: fef40783 lb a5,-17(s0) + 300b07c: ef91 bnez a5,300b098 + 300b07e: fdb44783 lbu a5,-37(s0) + 300b082: 0017e793 ori a5,a5,1 + 300b086: 9f81 uxtb a5 + 300b088: 863e mv a2,a5 + 300b08a: 4581 li a1,0 + 300b08c: fdc42503 lw a0,-36(s0) + 300b090: 3271 jal ra,300aa1c + 300b092: 87aa mv a5,a0 + 300b094: fef407a3 sb a5,-17(s0) + 300b098: fef40783 lb a5,-17(s0) + 300b09c: e799 bnez a5,300b0aa + 300b09e: fdc42503 lw a0,-36(s0) + 300b0a2: 2935 jal ra,300b4de + 300b0a4: 87aa mv a5,a0 + 300b0a6: fef407a3 sb a5,-17(s0) + 300b0aa: fef40783 lb a5,-17(s0) + 300b0ae: eb89 bnez a5,300b0c0 + 300b0b0: 4581 li a1,0 + 300b0b2: fdc42503 lw a0,-36(s0) + 300b0b6: b30ff0ef jal ra,300a3e6 + 300b0ba: 87aa mv a5,a0 + 300b0bc: fef407a3 sb a5,-17(s0) + 300b0c0: fef40783 lb a5,-17(s0) + 300b0c4: eb89 bnez a5,300b0d6 + 300b0c6: 4601 li a2,0 + 300b0c8: 4581 li a1,0 + 300b0ca: fdc42503 lw a0,-36(s0) + 300b0ce: 32b9 jal ra,300aa1c + 300b0d0: 87aa mv a5,a0 + 300b0d2: fef407a3 sb a5,-17(s0) + 300b0d6: fef40783 lb a5,-17(s0) + 300b0da: 853e mv a0,a5 + 300b0dc: 50b2 lw ra,44(sp) + 300b0de: 5422 lw s0,40(sp) + 300b0e0: 6145 addi sp,sp,48 + 300b0e2: 8082 ret + +0300b0e4 : + 300b0e4: 7139 addi sp,sp,-64 + 300b0e6: de06 sw ra,60(sp) + 300b0e8: dc22 sw s0,56(sp) + 300b0ea: 0080 addi s0,sp,64 + 300b0ec: fca42e23 sw a0,-36(s0) + 300b0f0: 852e mv a0,a1 + 300b0f2: 85b2 mv a1,a2 + 300b0f4: 8636 mv a2,a3 + 300b0f6: fce42a23 sw a4,-44(s0) + 300b0fa: fcf42823 sw a5,-48(s0) + 300b0fe: 86c2 mv a3,a6 + 300b100: 8746 mv a4,a7 + 300b102: 87aa mv a5,a0 + 300b104: fcf40da3 sb a5,-37(s0) + 300b108: 87ae mv a5,a1 + 300b10a: fcf40d23 sb a5,-38(s0) + 300b10e: 87b2 mv a5,a2 + 300b110: fcf40ca3 sb a5,-39(s0) + 300b114: 87b6 mv a5,a3 + 300b116: fcf40c23 sb a5,-40(s0) + 300b11a: 87ba mv a5,a4 + 300b11c: fcf407a3 sb a5,-49(s0) + 300b120: fe0407a3 sb zero,-17(s0) + 300b124: fe040723 sb zero,-18(s0) + 300b128: 4605 li a2,1 + 300b12a: 0ff00593 li a1,255 + 300b12e: fdc42503 lw a0,-36(s0) + 300b132: 30ed jal ra,300aa1c + 300b134: 87aa mv a5,a0 + 300b136: 873e mv a4,a5 + 300b138: fef44783 lbu a5,-17(s0) + 300b13c: 8fd9 or a5,a5,a4 + 300b13e: fef407a3 sb a5,-17(s0) + 300b142: 4601 li a2,0 + 300b144: 4581 li a1,0 + 300b146: fdc42503 lw a0,-36(s0) + 300b14a: 2b85 jal ra,300b6ba + 300b14c: 87aa mv a5,a0 + 300b14e: 873e mv a4,a5 + 300b150: fef44783 lbu a5,-17(s0) + 300b154: 8fd9 or a5,a5,a4 + 300b156: fef407a3 sb a5,-17(s0) + 300b15a: 4601 li a2,0 + 300b15c: 0ff00593 li a1,255 + 300b160: fdc42503 lw a0,-36(s0) + 300b164: 2b99 jal ra,300b6ba + 300b166: 87aa mv a5,a0 + 300b168: 873e mv a4,a5 + 300b16a: fef44783 lbu a5,-17(s0) + 300b16e: 8fd9 or a5,a5,a4 + 300b170: fef407a3 sb a5,-17(s0) + 300b174: fdb44783 lbu a5,-37(s0) + 300b178: c7a9 beqz a5,300b1c2 + 300b17a: fd844783 lbu a5,-40(s0) + 300b17e: cf99 beqz a5,300b19c + 300b180: fd442603 lw a2,-44(s0) + 300b184: 0cb00593 li a1,203 + 300b188: fdc42503 lw a0,-36(s0) + 300b18c: 232d jal ra,300b6b6 + 300b18e: 87aa mv a5,a0 + 300b190: 873e mv a4,a5 + 300b192: fef44783 lbu a5,-17(s0) + 300b196: 8fd9 or a5,a5,a4 + 300b198: fef407a3 sb a5,-17(s0) + 300b19c: fcf44783 lbu a5,-49(s0) + 300b1a0: cba5 beqz a5,300b210 + 300b1a2: fee40793 addi a5,s0,-18 + 300b1a6: 863e mv a2,a5 + 300b1a8: 0ee00593 li a1,238 + 300b1ac: fdc42503 lw a0,-36(s0) + 300b1b0: 2319 jal ra,300b6b6 + 300b1b2: 87aa mv a5,a0 + 300b1b4: 873e mv a4,a5 + 300b1b6: fef44783 lbu a5,-17(s0) + 300b1ba: 8fd9 or a5,a5,a4 + 300b1bc: fef407a3 sb a5,-17(s0) + 300b1c0: a881 j 300b210 + 300b1c2: fd844783 lbu a5,-40(s0) + 300b1c6: c385 beqz a5,300b1e6 + 300b1c8: fda44783 lbu a5,-38(s0) + 300b1cc: 863e mv a2,a5 + 300b1ce: 0cb00593 li a1,203 + 300b1d2: fdc42503 lw a0,-36(s0) + 300b1d6: 21d5 jal ra,300b6ba + 300b1d8: 87aa mv a5,a0 + 300b1da: 873e mv a4,a5 + 300b1dc: fef44783 lbu a5,-17(s0) + 300b1e0: 8fd9 or a5,a5,a4 + 300b1e2: fef407a3 sb a5,-17(s0) + 300b1e6: fcf44783 lbu a5,-49(s0) + 300b1ea: c39d beqz a5,300b210 + 300b1ec: fd944783 lbu a5,-39(s0) + 300b1f0: 86be mv a3,a5 + 300b1f2: 08000613 li a2,128 + 300b1f6: 0ee00593 li a1,238 + 300b1fa: fdc42503 lw a0,-36(s0) + 300b1fe: 33e030ef jal ra,300e53c + 300b202: 87aa mv a5,a0 + 300b204: 873e mv a4,a5 + 300b206: fef44783 lbu a5,-17(s0) + 300b20a: 8fd9 or a5,a5,a4 + 300b20c: fef407a3 sb a5,-17(s0) + 300b210: 4605 li a2,1 + 300b212: 0ff00593 li a1,255 + 300b216: fdc42503 lw a0,-36(s0) + 300b21a: 2145 jal ra,300b6ba + 300b21c: 87aa mv a5,a0 + 300b21e: 873e mv a4,a5 + 300b220: fef44783 lbu a5,-17(s0) + 300b224: 8fd9 or a5,a5,a4 + 300b226: fef407a3 sb a5,-17(s0) + 300b22a: 4605 li a2,1 + 300b22c: 4581 li a1,0 + 300b22e: fdc42503 lw a0,-36(s0) + 300b232: 2161 jal ra,300b6ba + 300b234: 87aa mv a5,a0 + 300b236: 873e mv a4,a5 + 300b238: fef44783 lbu a5,-17(s0) + 300b23c: 8fd9 or a5,a5,a4 + 300b23e: fef407a3 sb a5,-17(s0) + 300b242: 4601 li a2,0 + 300b244: 0ff00593 li a1,255 + 300b248: fdc42503 lw a0,-36(s0) + 300b24c: 21bd jal ra,300b6ba + 300b24e: 87aa mv a5,a0 + 300b250: 873e mv a4,a5 + 300b252: fef44783 lbu a5,-17(s0) + 300b256: 8fd9 or a5,a5,a4 + 300b258: fef407a3 sb a5,-17(s0) + 300b25c: fee44783 lbu a5,-18(s0) + 300b260: 9bbd andi a5,a5,-17 + 300b262: 0ff7f713 andi a4,a5,255 + 300b266: fd042783 lw a5,-48(s0) + 300b26a: a398 sb a4,0(a5) + 300b26c: fef40783 lb a5,-17(s0) + 300b270: 853e mv a0,a5 + 300b272: 50f2 lw ra,60(sp) + 300b274: 5462 lw s0,56(sp) + 300b276: 6121 addi sp,sp,64 + 300b278: 8082 ret + +0300b27a : + 300b27a: 7179 addi sp,sp,-48 + 300b27c: d606 sw ra,44(sp) + 300b27e: d422 sw s0,40(sp) + 300b280: 1800 addi s0,sp,48 + 300b282: fca42e23 sw a0,-36(s0) + 300b286: fcb42c23 sw a1,-40(s0) + 300b28a: 87b2 mv a5,a2 + 300b28c: 8736 mv a4,a3 + 300b28e: fcf40ba3 sb a5,-41(s0) + 300b292: 87ba mv a5,a4 + 300b294: fcf40b23 sb a5,-42(s0) + 300b298: fe0407a3 sb zero,-17(s0) + 300b29c: fe040723 sb zero,-18(s0) + 300b2a0: fe0406a3 sb zero,-19(s0) + 300b2a4: fe040623 sb zero,-20(s0) + 300b2a8: fe0405a3 sb zero,-21(s0) + 300b2ac: fd644783 lbu a5,-42(s0) + 300b2b0: c799 beqz a5,300b2be + 300b2b2: fdc42783 lw a5,-36(s0) + 300b2b6: 15c7c783 lbu a5,348(a5) + 300b2ba: fef40723 sb a5,-18(s0) + 300b2be: 4605 li a2,1 + 300b2c0: 4585 li a1,1 + 300b2c2: fdc42503 lw a0,-36(s0) + 300b2c6: 2ed5 jal ra,300b6ba + 300b2c8: 87aa mv a5,a0 + 300b2ca: fef407a3 sb a5,-17(s0) + 300b2ce: fef40783 lb a5,-17(s0) + 300b2d2: eb89 bnez a5,300b2e4 + 300b2d4: 04000593 li a1,64 + 300b2d8: fdc42503 lw a0,-36(s0) + 300b2dc: 3359 jal ra,300b062 + 300b2de: 87aa mv a5,a0 + 300b2e0: fef407a3 sb a5,-17(s0) + 300b2e4: fef40783 lb a5,-17(s0) + 300b2e8: eb85 bnez a5,300b318 + 300b2ea: fd744703 lbu a4,-41(s0) + 300b2ee: 4785 li a5,1 + 300b2f0: 02f71463 bne a4,a5,300b318 + 300b2f4: feb40793 addi a5,s0,-21 + 300b2f8: fec44683 lbu a3,-20(s0) + 300b2fc: fed44603 lbu a2,-19(s0) + 300b300: 4881 li a7,0 + 300b302: 4805 li a6,1 + 300b304: fd842703 lw a4,-40(s0) + 300b308: 4585 li a1,1 + 300b30a: fdc42503 lw a0,-36(s0) + 300b30e: 3bd9 jal ra,300b0e4 + 300b310: 87aa mv a5,a0 + 300b312: fef407a3 sb a5,-17(s0) + 300b316: a029 j 300b320 + 300b318: fd842783 lw a5,-40(s0) + 300b31c: 00078023 sb zero,0(a5) + 300b320: fef40783 lb a5,-17(s0) + 300b324: e79d bnez a5,300b352 + 300b326: fd644783 lbu a5,-42(s0) + 300b32a: c785 beqz a5,300b352 + 300b32c: fee44783 lbu a5,-18(s0) + 300b330: 863e mv a2,a5 + 300b332: 4585 li a1,1 + 300b334: fdc42503 lw a0,-36(s0) + 300b338: 2649 jal ra,300b6ba + 300b33a: 87aa mv a5,a0 + 300b33c: fef407a3 sb a5,-17(s0) + 300b340: fef40783 lb a5,-17(s0) + 300b344: e799 bnez a5,300b352 + 300b346: fdc42783 lw a5,-36(s0) + 300b34a: fee44703 lbu a4,-18(s0) + 300b34e: 14e78e23 sb a4,348(a5) + 300b352: fef40783 lb a5,-17(s0) + 300b356: 853e mv a0,a5 + 300b358: 50b2 lw ra,44(sp) + 300b35a: 5422 lw s0,40(sp) + 300b35c: 6145 addi sp,sp,48 + 300b35e: 8082 ret + +0300b360 : + 300b360: 7179 addi sp,sp,-48 + 300b362: d606 sw ra,44(sp) + 300b364: d422 sw s0,40(sp) + 300b366: 1800 addi s0,sp,48 + 300b368: fca42e23 sw a0,-36(s0) + 300b36c: fcb42c23 sw a1,-40(s0) + 300b370: 87b2 mv a5,a2 + 300b372: 8736 mv a4,a3 + 300b374: fcf40ba3 sb a5,-41(s0) + 300b378: 87ba mv a5,a4 + 300b37a: fcf40b23 sb a5,-42(s0) + 300b37e: fe0407a3 sb zero,-17(s0) + 300b382: fe040723 sb zero,-18(s0) + 300b386: fe0406a3 sb zero,-19(s0) + 300b38a: fe040623 sb zero,-20(s0) + 300b38e: fd644783 lbu a5,-42(s0) + 300b392: c799 beqz a5,300b3a0 + 300b394: fdc42783 lw a5,-36(s0) + 300b398: 15c7c783 lbu a5,348(a5) + 300b39c: fef40723 sb a5,-18(s0) + 300b3a0: 4609 li a2,2 + 300b3a2: 4585 li a1,1 + 300b3a4: fdc42503 lw a0,-36(s0) + 300b3a8: 2e09 jal ra,300b6ba + 300b3aa: 87aa mv a5,a0 + 300b3ac: fef407a3 sb a5,-17(s0) + 300b3b0: fef40783 lb a5,-17(s0) + 300b3b4: eb81 bnez a5,300b3c4 + 300b3b6: 4581 li a1,0 + 300b3b8: fdc42503 lw a0,-36(s0) + 300b3bc: 315d jal ra,300b062 + 300b3be: 87aa mv a5,a0 + 300b3c0: fef407a3 sb a5,-17(s0) + 300b3c4: fef40783 lb a5,-17(s0) + 300b3c8: eb85 bnez a5,300b3f8 + 300b3ca: fd744703 lbu a4,-41(s0) + 300b3ce: 4785 li a5,1 + 300b3d0: 02f71463 bne a4,a5,300b3f8 + 300b3d4: feb40713 addi a4,s0,-21 + 300b3d8: fec44683 lbu a3,-20(s0) + 300b3dc: fed44603 lbu a2,-19(s0) + 300b3e0: 4885 li a7,1 + 300b3e2: 4801 li a6,0 + 300b3e4: fd842783 lw a5,-40(s0) + 300b3e8: 4585 li a1,1 + 300b3ea: fdc42503 lw a0,-36(s0) + 300b3ee: 39dd jal ra,300b0e4 + 300b3f0: 87aa mv a5,a0 + 300b3f2: fef407a3 sb a5,-17(s0) + 300b3f6: a029 j 300b400 + 300b3f8: fd842783 lw a5,-40(s0) + 300b3fc: 00078023 sb zero,0(a5) + 300b400: fef40783 lb a5,-17(s0) + 300b404: e79d bnez a5,300b432 + 300b406: fd644783 lbu a5,-42(s0) + 300b40a: c785 beqz a5,300b432 + 300b40c: fee44783 lbu a5,-18(s0) + 300b410: 863e mv a2,a5 + 300b412: 4585 li a1,1 + 300b414: fdc42503 lw a0,-36(s0) + 300b418: 244d jal ra,300b6ba + 300b41a: 87aa mv a5,a0 + 300b41c: fef407a3 sb a5,-17(s0) + 300b420: fef40783 lb a5,-17(s0) + 300b424: e799 bnez a5,300b432 + 300b426: fdc42783 lw a5,-36(s0) + 300b42a: fee44703 lbu a4,-18(s0) + 300b42e: 14e78e23 sb a4,348(a5) + 300b432: fef40783 lb a5,-17(s0) + 300b436: 853e mv a0,a5 + 300b438: 50b2 lw ra,44(sp) + 300b43a: 5422 lw s0,40(sp) + 300b43c: 6145 addi sp,sp,48 + 300b43e: 8082 ret + +0300b440 : + 300b440: 7179 addi sp,sp,-48 + 300b442: d606 sw ra,44(sp) + 300b444: d422 sw s0,40(sp) + 300b446: 1800 addi s0,sp,48 + 300b448: fca42e23 sw a0,-36(s0) + 300b44c: fcb42c23 sw a1,-40(s0) + 300b450: fcc42a23 sw a2,-44(s0) + 300b454: 87b6 mv a5,a3 + 300b456: fcf409a3 sb a5,-45(s0) + 300b45a: fe0407a3 sb zero,-17(s0) + 300b45e: fe040723 sb zero,-18(s0) + 300b462: fdc42783 lw a5,-36(s0) + 300b466: 15c7c783 lbu a5,348(a5) + 300b46a: fef40723 sb a5,-18(s0) + 300b46e: fd344783 lbu a5,-45(s0) + 300b472: 4681 li a3,0 + 300b474: 863e mv a2,a5 + 300b476: fd842583 lw a1,-40(s0) + 300b47a: fdc42503 lw a0,-36(s0) + 300b47e: 3bf5 jal ra,300b27a + 300b480: 87aa mv a5,a0 + 300b482: fef407a3 sb a5,-17(s0) + 300b486: fef40783 lb a5,-17(s0) + 300b48a: ef89 bnez a5,300b4a4 + 300b48c: fd344783 lbu a5,-45(s0) + 300b490: 4681 li a3,0 + 300b492: 863e mv a2,a5 + 300b494: fd442583 lw a1,-44(s0) + 300b498: fdc42503 lw a0,-36(s0) + 300b49c: 35d1 jal ra,300b360 + 300b49e: 87aa mv a5,a0 + 300b4a0: fef407a3 sb a5,-17(s0) + 300b4a4: fef40783 lb a5,-17(s0) + 300b4a8: e785 bnez a5,300b4d0 + 300b4aa: fee44783 lbu a5,-18(s0) + 300b4ae: 863e mv a2,a5 + 300b4b0: 4585 li a1,1 + 300b4b2: fdc42503 lw a0,-36(s0) + 300b4b6: 2411 jal ra,300b6ba + 300b4b8: 87aa mv a5,a0 + 300b4ba: fef407a3 sb a5,-17(s0) + 300b4be: fef40783 lb a5,-17(s0) + 300b4c2: e799 bnez a5,300b4d0 + 300b4c4: fdc42783 lw a5,-36(s0) + 300b4c8: fee44703 lbu a4,-18(s0) + 300b4cc: 14e78e23 sb a4,348(a5) + 300b4d0: fef40783 lb a5,-17(s0) + 300b4d4: 853e mv a0,a5 + 300b4d6: 50b2 lw ra,44(sp) + 300b4d8: 5422 lw s0,40(sp) + 300b4da: 6145 addi sp,sp,48 + 300b4dc: 8082 ret + +0300b4de : + 300b4de: 7179 addi sp,sp,-48 + 300b4e0: d606 sw ra,44(sp) + 300b4e2: d422 sw s0,40(sp) + 300b4e4: 1800 addi s0,sp,48 + 300b4e6: fca42e23 sw a0,-36(s0) + 300b4ea: fe0407a3 sb zero,-17(s0) + 300b4ee: fe0403a3 sb zero,-25(s0) + 300b4f2: fe042423 sw zero,-24(s0) + 300b4f6: fe740793 addi a5,s0,-25 + 300b4fa: 85be mv a1,a5 + 300b4fc: fdc42503 lw a0,-36(s0) + 300b500: f8efe0ef jal ra,3009c8e + 300b504: 87aa mv a5,a0 + 300b506: fef407a3 sb a5,-17(s0) + 300b50a: fef40783 lb a5,-17(s0) + 300b50e: eb95 bnez a5,300b542 + 300b510: fe744703 lbu a4,-25(s0) + 300b514: 4785 li a5,1 + 300b516: 02f70863 beq a4,a5,300b546 + 300b51a: fe842783 lw a5,-24(s0) + 300b51e: 0785 addi a5,a5,1 + 300b520: fef42423 sw a5,-24(s0) + 300b524: fe842703 lw a4,-24(s0) + 300b528: 7cf00793 li a5,1999 + 300b52c: 00e7f663 bgeu a5,a4,300b538 + 300b530: 57e5 li a5,-7 + 300b532: fef407a3 sb a5,-17(s0) + 300b536: a809 j 300b548 + 300b538: fdc42503 lw a0,-36(s0) + 300b53c: 1a8030ef jal ra,300e6e4 + 300b540: bf5d j 300b4f6 + 300b542: 0001 nop + 300b544: a011 j 300b548 + 300b546: 0001 nop + 300b548: fef40783 lb a5,-17(s0) + 300b54c: 853e mv a0,a5 + 300b54e: 50b2 lw ra,44(sp) + 300b550: 5422 lw s0,40(sp) + 300b552: 6145 addi sp,sp,48 + 300b554: 8082 ret + +0300b556 : + 300b556: 7179 addi sp,sp,-48 + 300b558: d622 sw s0,44(sp) + 300b55a: 1800 addi s0,sp,48 + 300b55c: 87aa mv a5,a0 + 300b55e: fcf40fa3 sb a5,-33(s0) + 300b562: fe0407a3 sb zero,-17(s0) + 300b566: fdf44783 lbu a5,-33(s0) + 300b56a: 0785 addi a5,a5,1 + 300b56c: 9f81 uxtb a5 + 300b56e: 0786 slli a5,a5,0x1 + 300b570: fef407a3 sb a5,-17(s0) + 300b574: fef44783 lbu a5,-17(s0) + 300b578: 853e mv a0,a5 + 300b57a: 5432 lw s0,44(sp) + 300b57c: 6145 addi sp,sp,48 + 300b57e: 8082 ret + +0300b580 : + 300b580: 7179 addi sp,sp,-48 + 300b582: d622 sw s0,44(sp) + 300b584: 1800 addi s0,sp,48 + 300b586: fca42e23 sw a0,-36(s0) + 300b58a: fe042623 sw zero,-20(s0) + 300b58e: 400007b7 lui a5,0x40000 + 300b592: fef42423 sw a5,-24(s0) + 300b596: a031 j 300b5a2 + 300b598: fe842783 lw a5,-24(s0) + 300b59c: 8389 srli a5,a5,0x2 + 300b59e: fef42423 sw a5,-24(s0) + 300b5a2: fe842703 lw a4,-24(s0) + 300b5a6: fdc42783 lw a5,-36(s0) + 300b5aa: fee7e7e3 bltu a5,a4,300b598 + 300b5ae: a881 j 300b5fe + 300b5b0: fec42703 lw a4,-20(s0) + 300b5b4: fe842783 lw a5,-24(s0) + 300b5b8: 97ba add a5,a5,a4 + 300b5ba: fdc42703 lw a4,-36(s0) + 300b5be: 02f76663 bltu a4,a5,300b5ea + 300b5c2: fec42703 lw a4,-20(s0) + 300b5c6: fe842783 lw a5,-24(s0) + 300b5ca: 97ba add a5,a5,a4 + 300b5cc: fdc42703 lw a4,-36(s0) + 300b5d0: 40f707b3 sub a5,a4,a5 + 300b5d4: fcf42e23 sw a5,-36(s0) + 300b5d8: fec42783 lw a5,-20(s0) + 300b5dc: 8385 srli a5,a5,0x1 + 300b5de: fe842703 lw a4,-24(s0) + 300b5e2: 97ba add a5,a5,a4 + 300b5e4: fef42623 sw a5,-20(s0) + 300b5e8: a031 j 300b5f4 + 300b5ea: fec42783 lw a5,-20(s0) + 300b5ee: 8385 srli a5,a5,0x1 + 300b5f0: fef42623 sw a5,-20(s0) + 300b5f4: fe842783 lw a5,-24(s0) + 300b5f8: 8389 srli a5,a5,0x2 + 300b5fa: fef42423 sw a5,-24(s0) + 300b5fe: fe842783 lw a5,-24(s0) + 300b602: f7dd bnez a5,300b5b0 + 300b604: fec42783 lw a5,-20(s0) + 300b608: 853e mv a0,a5 + 300b60a: 5432 lw s0,44(sp) + 300b60c: 6145 addi sp,sp,48 + 300b60e: 8082 ret + +0300b610 : + 300b610: 7179 addi sp,sp,-48 + 300b612: d606 sw ra,44(sp) + 300b614: d422 sw s0,40(sp) + 300b616: 1800 addi s0,sp,48 + 300b618: fca42e23 sw a0,-36(s0) + 300b61c: fe0407a3 sb zero,-17(s0) + 300b620: 4601 li a2,0 + 300b622: 08300593 li a1,131 + 300b626: fdc42503 lw a0,-36(s0) + 300b62a: 2841 jal ra,300b6ba + 300b62c: 87aa mv a5,a0 + 300b62e: 873e mv a4,a5 + 300b630: fef44783 lbu a5,-17(s0) + 300b634: 8fd9 or a5,a5,a4 + 300b636: fef407a3 sb a5,-17(s0) + 300b63a: fef40783 lb a5,-17(s0) + 300b63e: eba1 bnez a5,300b68e + 300b640: fe042423 sw zero,-24(s0) + 300b644: fe740793 addi a5,s0,-25 + 300b648: 863e mv a2,a5 + 300b64a: 08300593 li a1,131 + 300b64e: fdc42503 lw a0,-36(s0) + 300b652: 2095 jal ra,300b6b6 + 300b654: 87aa mv a5,a0 + 300b656: fef407a3 sb a5,-17(s0) + 300b65a: fe744783 lbu a5,-25(s0) + 300b65e: ef99 bnez a5,300b67c + 300b660: fef40783 lb a5,-17(s0) + 300b664: ef81 bnez a5,300b67c + 300b666: fe842783 lw a5,-24(s0) + 300b66a: 0785 addi a5,a5,1 # 40000001 + 300b66c: fef42423 sw a5,-24(s0) + 300b670: fe842703 lw a4,-24(s0) + 300b674: 7cf00793 li a5,1999 + 300b678: fce7f6e3 bgeu a5,a4,300b644 + 300b67c: fe842703 lw a4,-24(s0) + 300b680: 7cf00793 li a5,1999 + 300b684: 00e7f563 bgeu a5,a4,300b68e + 300b688: 57e5 li a5,-7 + 300b68a: fef407a3 sb a5,-17(s0) + 300b68e: 4605 li a2,1 + 300b690: 08300593 li a1,131 + 300b694: fdc42503 lw a0,-36(s0) + 300b698: 200d jal ra,300b6ba + 300b69a: 87aa mv a5,a0 + 300b69c: 873e mv a4,a5 + 300b69e: fef44783 lbu a5,-17(s0) + 300b6a2: 8fd9 or a5,a5,a4 + 300b6a4: fef407a3 sb a5,-17(s0) + 300b6a8: fef40783 lb a5,-17(s0) + 300b6ac: 853e mv a0,a5 + 300b6ae: 50b2 lw ra,44(sp) + 300b6b0: 5422 lw s0,40(sp) + 300b6b2: 6145 addi sp,sp,48 + 300b6b4: 8082 ret + +0300b6b6 : + 300b6b6: 72d0206f j 300e5e2 + +0300b6ba : + 300b6ba: 5cb0206f j 300e484 + +0300b6be : + 300b6be: 7119 addi sp,sp,-128 + 300b6c0: de86 sw ra,124(sp) + 300b6c2: dca2 sw s0,120(sp) + 300b6c4: 0100 addi s0,sp,128 + 300b6c6: f8a42623 sw a0,-116(s0) + 300b6ca: 87ae mv a5,a1 + 300b6cc: f8f405a3 sb a5,-117(s0) + 300b6d0: fe0407a3 sb zero,-17(s0) + 300b6d4: fe040723 sb zero,-18(s0) + 300b6d8: fe0406a3 sb zero,-19(s0) + 300b6dc: fa042c23 sw zero,-72(s0) + 300b6e0: fa042a23 sw zero,-76(s0) + 300b6e4: fc042c23 sw zero,-40(s0) + 300b6e8: fe041523 sh zero,-22(s0) + 300b6ec: 6789 lui a5,0x2 + 300b6ee: 90078793 addi a5,a5,-1792 # 1900 + 300b6f2: fcf42a23 sw a5,-44(s0) + 300b6f6: fe042223 sw zero,-28(s0) + 300b6fa: fe042023 sw zero,-32(s0) + 300b6fe: fc042823 sw zero,-48(s0) + 300b702: f8c42783 lw a5,-116(s0) + 300b706: 11c7c783 lbu a5,284(a5) + 300b70a: fcf407a3 sb a5,-49(s0) + 300b70e: fcf44703 lbu a4,-49(s0) + 300b712: 479d li a5,7 + 300b714: 14f70ae3 beq a4,a5,300c068 + 300b718: 4605 li a2,1 + 300b71a: 08000593 li a1,128 + 300b71e: f8c42503 lw a0,-116(s0) + 300b722: 3f61 jal ra,300b6ba + 300b724: 87aa mv a5,a0 + 300b726: 873e mv a4,a5 + 300b728: fef44783 lbu a5,-17(s0) + 300b72c: 8fd9 or a5,a5,a4 + 300b72e: fef407a3 sb a5,-17(s0) + 300b732: 4605 li a2,1 + 300b734: 0ff00593 li a1,255 + 300b738: f8c42503 lw a0,-116(s0) + 300b73c: 3fbd jal ra,300b6ba + 300b73e: 87aa mv a5,a0 + 300b740: 873e mv a4,a5 + 300b742: fef44783 lbu a5,-17(s0) + 300b746: 8fd9 or a5,a5,a4 + 300b748: fef407a3 sb a5,-17(s0) + 300b74c: 4601 li a2,0 + 300b74e: 4581 li a1,0 + 300b750: f8c42503 lw a0,-116(s0) + 300b754: 379d jal ra,300b6ba + 300b756: 87aa mv a5,a0 + 300b758: 873e mv a4,a5 + 300b75a: fef44783 lbu a5,-17(s0) + 300b75e: 8fd9 or a5,a5,a4 + 300b760: fef407a3 sb a5,-17(s0) + 300b764: 4619 li a2,6 + 300b766: 0ff00593 li a1,255 + 300b76a: f8c42503 lw a0,-116(s0) + 300b76e: 37b1 jal ra,300b6ba + 300b770: 87aa mv a5,a0 + 300b772: 873e mv a4,a5 + 300b774: fef44783 lbu a5,-17(s0) + 300b778: 8fd9 or a5,a5,a4 + 300b77a: fef407a3 sb a5,-17(s0) + 300b77e: fc740793 addi a5,s0,-57 + 300b782: 863e mv a2,a5 + 300b784: 08300593 li a1,131 + 300b788: f8c42503 lw a0,-116(s0) + 300b78c: 372d jal ra,300b6b6 + 300b78e: 87aa mv a5,a0 + 300b790: 873e mv a4,a5 + 300b792: fef44783 lbu a5,-17(s0) + 300b796: 8fd9 or a5,a5,a4 + 300b798: fef407a3 sb a5,-17(s0) + 300b79c: fc744783 lbu a5,-57(s0) + 300b7a0: 0047e793 ori a5,a5,4 + 300b7a4: 9f81 uxtb a5 + 300b7a6: 863e mv a2,a5 + 300b7a8: 08300593 li a1,131 + 300b7ac: f8c42503 lw a0,-116(s0) + 300b7b0: 3729 jal ra,300b6ba + 300b7b2: 87aa mv a5,a0 + 300b7b4: 873e mv a4,a5 + 300b7b6: fef44783 lbu a5,-17(s0) + 300b7ba: 8fd9 or a5,a5,a4 + 300b7bc: fef407a3 sb a5,-17(s0) + 300b7c0: 461d li a2,7 + 300b7c2: 0ff00593 li a1,255 + 300b7c6: f8c42503 lw a0,-116(s0) + 300b7ca: 3dc5 jal ra,300b6ba + 300b7cc: 87aa mv a5,a0 + 300b7ce: 873e mv a4,a5 + 300b7d0: fef44783 lbu a5,-17(s0) + 300b7d4: 8fd9 or a5,a5,a4 + 300b7d6: fef407a3 sb a5,-17(s0) + 300b7da: 4605 li a2,1 + 300b7dc: 08100593 li a1,129 + 300b7e0: f8c42503 lw a0,-116(s0) + 300b7e4: 3dd9 jal ra,300b6ba + 300b7e6: 87aa mv a5,a0 + 300b7e8: 873e mv a4,a5 + 300b7ea: fef44783 lbu a5,-17(s0) + 300b7ee: 8fd9 or a5,a5,a4 + 300b7f0: fef407a3 sb a5,-17(s0) + 300b7f4: f8c42503 lw a0,-116(s0) + 300b7f8: 6ed020ef jal ra,300e6e4 + 300b7fc: 87aa mv a5,a0 + 300b7fe: 873e mv a4,a5 + 300b800: fef44783 lbu a5,-17(s0) + 300b804: 8fd9 or a5,a5,a4 + 300b806: fef407a3 sb a5,-17(s0) + 300b80a: 4605 li a2,1 + 300b80c: 08000593 li a1,128 + 300b810: f8c42503 lw a0,-116(s0) + 300b814: 355d jal ra,300b6ba + 300b816: 87aa mv a5,a0 + 300b818: 873e mv a4,a5 + 300b81a: fef44783 lbu a5,-17(s0) + 300b81e: 8fd9 or a5,a5,a4 + 300b820: fef407a3 sb a5,-17(s0) + 300b824: f8b44783 lbu a5,-117(s0) + 300b828: 8b85 andi a5,a5,1 + 300b82a: 16078163 beqz a5,300b98c + 300b82e: fcf44783 lbu a5,-49(s0) + 300b832: 8b85 andi a5,a5,1 + 300b834: 14079c63 bnez a5,300b98c + 300b838: 06b00613 li a2,107 + 300b83c: 09400593 li a1,148 + 300b840: f8c42503 lw a0,-116(s0) + 300b844: 3d9d jal ra,300b6ba + 300b846: 87aa mv a5,a0 + 300b848: 873e mv a4,a5 + 300b84a: fef44783 lbu a5,-17(s0) + 300b84e: 8fd9 or a5,a5,a4 + 300b850: fef407a3 sb a5,-17(s0) + 300b854: f8c42503 lw a0,-116(s0) + 300b858: 3b65 jal ra,300b610 + 300b85a: 87aa mv a5,a0 + 300b85c: 873e mv a4,a5 + 300b85e: fef44783 lbu a5,-17(s0) + 300b862: 8fd9 or a5,a5,a4 + 300b864: fef407a3 sb a5,-17(s0) + 300b868: fc040793 addi a5,s0,-64 + 300b86c: 863e mv a2,a5 + 300b86e: 09000593 li a1,144 + 300b872: f8c42503 lw a0,-116(s0) + 300b876: 619020ef jal ra,300e68e + 300b87a: 87aa mv a5,a0 + 300b87c: 873e mv a4,a5 + 300b87e: fef44783 lbu a5,-17(s0) + 300b882: 8fd9 or a5,a5,a4 + 300b884: fef407a3 sb a5,-17(s0) + 300b888: fc042783 lw a5,-64(s0) + 300b88c: 83a1 srli a5,a5,0x8 + 300b88e: 9f81 uxtb a5 + 300b890: 07f7f793 andi a5,a5,127 + 300b894: fef40723 sb a5,-18(s0) + 300b898: fc042783 lw a5,-64(s0) + 300b89c: 83bd srli a5,a5,0xf + 300b89e: 9f81 uxtb a5 + 300b8a0: 8b85 andi a5,a5,1 + 300b8a2: fef406a3 sb a5,-19(s0) + 300b8a6: 02400613 li a2,36 + 300b8aa: 09400593 li a1,148 + 300b8ae: f8c42503 lw a0,-116(s0) + 300b8b2: 3521 jal ra,300b6ba + 300b8b4: 87aa mv a5,a0 + 300b8b6: 873e mv a4,a5 + 300b8b8: fef44783 lbu a5,-17(s0) + 300b8bc: 8fd9 or a5,a5,a4 + 300b8be: fef407a3 sb a5,-17(s0) + 300b8c2: f8c42503 lw a0,-116(s0) + 300b8c6: 33a9 jal ra,300b610 + 300b8c8: 87aa mv a5,a0 + 300b8ca: 873e mv a4,a5 + 300b8cc: fef44783 lbu a5,-17(s0) + 300b8d0: 8fd9 or a5,a5,a4 + 300b8d2: fef407a3 sb a5,-17(s0) + 300b8d6: fc040793 addi a5,s0,-64 + 300b8da: 863e mv a2,a5 + 300b8dc: 09000593 li a1,144 + 300b8e0: f8c42503 lw a0,-116(s0) + 300b8e4: 5ab020ef jal ra,300e68e + 300b8e8: 87aa mv a5,a0 + 300b8ea: 873e mv a4,a5 + 300b8ec: fef44783 lbu a5,-17(s0) + 300b8f0: 8fd9 or a5,a5,a4 + 300b8f2: fef407a3 sb a5,-17(s0) + 300b8f6: fc042783 lw a5,-64(s0) + 300b8fa: 83e1 srli a5,a5,0x18 + 300b8fc: 9f81 uxtb a5 + 300b8fe: f8f40c23 sb a5,-104(s0) + 300b902: fc042783 lw a5,-64(s0) + 300b906: 83c1 srli a5,a5,0x10 + 300b908: 9f81 uxtb a5 + 300b90a: f8f40ca3 sb a5,-103(s0) + 300b90e: fc042783 lw a5,-64(s0) + 300b912: 83a1 srli a5,a5,0x8 + 300b914: 9f81 uxtb a5 + 300b916: f8f40d23 sb a5,-102(s0) + 300b91a: fc042783 lw a5,-64(s0) + 300b91e: 9f81 uxtb a5 + 300b920: f8f40da3 sb a5,-101(s0) + 300b924: 02500613 li a2,37 + 300b928: 09400593 li a1,148 + 300b92c: f8c42503 lw a0,-116(s0) + 300b930: 3369 jal ra,300b6ba + 300b932: 87aa mv a5,a0 + 300b934: 873e mv a4,a5 + 300b936: fef44783 lbu a5,-17(s0) + 300b93a: 8fd9 or a5,a5,a4 + 300b93c: fef407a3 sb a5,-17(s0) + 300b940: f8c42503 lw a0,-116(s0) + 300b944: 31f1 jal ra,300b610 + 300b946: 87aa mv a5,a0 + 300b948: 873e mv a4,a5 + 300b94a: fef44783 lbu a5,-17(s0) + 300b94e: 8fd9 or a5,a5,a4 + 300b950: fef407a3 sb a5,-17(s0) + 300b954: fc040793 addi a5,s0,-64 + 300b958: 863e mv a2,a5 + 300b95a: 09000593 li a1,144 + 300b95e: f8c42503 lw a0,-116(s0) + 300b962: 52d020ef jal ra,300e68e + 300b966: 87aa mv a5,a0 + 300b968: 873e mv a4,a5 + 300b96a: fef44783 lbu a5,-17(s0) + 300b96e: 8fd9 or a5,a5,a4 + 300b970: fef407a3 sb a5,-17(s0) + 300b974: fc042783 lw a5,-64(s0) + 300b978: 83e1 srli a5,a5,0x18 + 300b97a: 9f81 uxtb a5 + 300b97c: f8f40e23 sb a5,-100(s0) + 300b980: fc042783 lw a5,-64(s0) + 300b984: 83c1 srli a5,a5,0x10 + 300b986: 9f81 uxtb a5 + 300b988: f8f40ea3 sb a5,-99(s0) + 300b98c: f8b44783 lbu a5,-117(s0) + 300b990: 8b89 andi a5,a5,2 + 300b992: 3c078763 beqz a5,300bd60 + 300b996: fcf44783 lbu a5,-49(s0) + 300b99a: 8b89 andi a5,a5,2 + 300b99c: 3c079263 bnez a5,300bd60 + 300b9a0: 4609 li a2,2 + 300b9a2: 09400593 li a1,148 + 300b9a6: f8c42503 lw a0,-116(s0) + 300b9aa: 3b01 jal ra,300b6ba + 300b9ac: 87aa mv a5,a0 + 300b9ae: 873e mv a4,a5 + 300b9b0: fef44783 lbu a5,-17(s0) + 300b9b4: 8fd9 or a5,a5,a4 + 300b9b6: fef407a3 sb a5,-17(s0) + 300b9ba: f8c42503 lw a0,-116(s0) + 300b9be: 3989 jal ra,300b610 + 300b9c0: 87aa mv a5,a0 + 300b9c2: 873e mv a4,a5 + 300b9c4: fef44783 lbu a5,-17(s0) + 300b9c8: 8fd9 or a5,a5,a4 + 300b9ca: fef407a3 sb a5,-17(s0) + 300b9ce: fbf40793 addi a5,s0,-65 + 300b9d2: 863e mv a2,a5 + 300b9d4: 09000593 li a1,144 + 300b9d8: f8c42503 lw a0,-116(s0) + 300b9dc: 39e9 jal ra,300b6b6 + 300b9de: 87aa mv a5,a0 + 300b9e0: 873e mv a4,a5 + 300b9e2: fef44783 lbu a5,-17(s0) + 300b9e6: 8fd9 or a5,a5,a4 + 300b9e8: fef407a3 sb a5,-17(s0) + 300b9ec: 07b00613 li a2,123 + 300b9f0: 09400593 li a1,148 + 300b9f4: f8c42503 lw a0,-116(s0) + 300b9f8: 31c9 jal ra,300b6ba + 300b9fa: 87aa mv a5,a0 + 300b9fc: 873e mv a4,a5 + 300b9fe: fef44783 lbu a5,-17(s0) + 300ba02: 8fd9 or a5,a5,a4 + 300ba04: fef407a3 sb a5,-17(s0) + 300ba08: f8c42503 lw a0,-116(s0) + 300ba0c: 3111 jal ra,300b610 + 300ba0e: 87aa mv a5,a0 + 300ba10: 873e mv a4,a5 + 300ba12: fef44783 lbu a5,-17(s0) + 300ba16: 8fd9 or a5,a5,a4 + 300ba18: fef407a3 sb a5,-17(s0) + 300ba1c: fbe40793 addi a5,s0,-66 + 300ba20: 863e mv a2,a5 + 300ba22: 09000593 li a1,144 + 300ba26: f8c42503 lw a0,-116(s0) + 300ba2a: 3171 jal ra,300b6b6 + 300ba2c: 87aa mv a5,a0 + 300ba2e: 873e mv a4,a5 + 300ba30: fef44783 lbu a5,-17(s0) + 300ba34: 8fd9 or a5,a5,a4 + 300ba36: fef407a3 sb a5,-17(s0) + 300ba3a: 07700613 li a2,119 + 300ba3e: 09400593 li a1,148 + 300ba42: f8c42503 lw a0,-116(s0) + 300ba46: 3995 jal ra,300b6ba + 300ba48: 87aa mv a5,a0 + 300ba4a: 873e mv a4,a5 + 300ba4c: fef44783 lbu a5,-17(s0) + 300ba50: 8fd9 or a5,a5,a4 + 300ba52: fef407a3 sb a5,-17(s0) + 300ba56: f8c42503 lw a0,-116(s0) + 300ba5a: 3e5d jal ra,300b610 + 300ba5c: 87aa mv a5,a0 + 300ba5e: 873e mv a4,a5 + 300ba60: fef44783 lbu a5,-17(s0) + 300ba64: 8fd9 or a5,a5,a4 + 300ba66: fef407a3 sb a5,-17(s0) + 300ba6a: fc040793 addi a5,s0,-64 + 300ba6e: 863e mv a2,a5 + 300ba70: 09000593 li a1,144 + 300ba74: f8c42503 lw a0,-116(s0) + 300ba78: 417020ef jal ra,300e68e + 300ba7c: 87aa mv a5,a0 + 300ba7e: 873e mv a4,a5 + 300ba80: fef44783 lbu a5,-17(s0) + 300ba84: 8fd9 or a5,a5,a4 + 300ba86: fef407a3 sb a5,-17(s0) + 300ba8a: fc042783 lw a5,-64(s0) + 300ba8e: 83e5 srli a5,a5,0x19 + 300ba90: 07e2 slli a5,a5,0x18 + 300ba92: 87e1 srai a5,a5,0x18 + 300ba94: 07f7f793 andi a5,a5,127 + 300ba98: 07e2 slli a5,a5,0x18 + 300ba9a: 87e1 srai a5,a5,0x18 + 300ba9c: faf40023 sb a5,-96(s0) + 300baa0: fc042783 lw a5,-64(s0) + 300baa4: 83c9 srli a5,a5,0x12 + 300baa6: 07e2 slli a5,a5,0x18 + 300baa8: 87e1 srai a5,a5,0x18 + 300baaa: 07f7f793 andi a5,a5,127 + 300baae: 07e2 slli a5,a5,0x18 + 300bab0: 87e1 srai a5,a5,0x18 + 300bab2: faf400a3 sb a5,-95(s0) + 300bab6: fc042783 lw a5,-64(s0) + 300baba: 83ad srli a5,a5,0xb + 300babc: 07e2 slli a5,a5,0x18 + 300babe: 87e1 srai a5,a5,0x18 + 300bac0: 07f7f793 andi a5,a5,127 + 300bac4: 07e2 slli a5,a5,0x18 + 300bac6: 87e1 srai a5,a5,0x18 + 300bac8: faf40123 sb a5,-94(s0) + 300bacc: fc042783 lw a5,-64(s0) + 300bad0: 8391 srli a5,a5,0x4 + 300bad2: 07e2 slli a5,a5,0x18 + 300bad4: 87e1 srai a5,a5,0x18 + 300bad6: 07f7f793 andi a5,a5,127 + 300bada: 07e2 slli a5,a5,0x18 + 300badc: 87e1 srai a5,a5,0x18 + 300bade: faf401a3 sb a5,-93(s0) + 300bae2: fc042783 lw a5,-64(s0) + 300bae6: 9f81 uxtb a5 + 300bae8: 078e slli a5,a5,0x3 + 300baea: 9f81 uxtb a5 + 300baec: 0787f793 andi a5,a5,120 + 300baf0: 9f81 uxtb a5 + 300baf2: fcf403a3 sb a5,-57(s0) + 300baf6: 07800613 li a2,120 + 300bafa: 09400593 li a1,148 + 300bafe: f8c42503 lw a0,-116(s0) + 300bb02: 3e65 jal ra,300b6ba + 300bb04: 87aa mv a5,a0 + 300bb06: 873e mv a4,a5 + 300bb08: fef44783 lbu a5,-17(s0) + 300bb0c: 8fd9 or a5,a5,a4 + 300bb0e: fef407a3 sb a5,-17(s0) + 300bb12: f8c42503 lw a0,-116(s0) + 300bb16: 3ced jal ra,300b610 + 300bb18: 87aa mv a5,a0 + 300bb1a: 873e mv a4,a5 + 300bb1c: fef44783 lbu a5,-17(s0) + 300bb20: 8fd9 or a5,a5,a4 + 300bb22: fef407a3 sb a5,-17(s0) + 300bb26: fc040793 addi a5,s0,-64 + 300bb2a: 863e mv a2,a5 + 300bb2c: 09000593 li a1,144 + 300bb30: f8c42503 lw a0,-116(s0) + 300bb34: 696000ef jal ra,300c1ca + 300bb38: 87aa mv a5,a0 + 300bb3a: 873e mv a4,a5 + 300bb3c: fef44783 lbu a5,-17(s0) + 300bb40: 8fd9 or a5,a5,a4 + 300bb42: fef407a3 sb a5,-17(s0) + 300bb46: fc042783 lw a5,-64(s0) + 300bb4a: 83f5 srli a5,a5,0x1d + 300bb4c: 9f81 uxtb a5 + 300bb4e: 07f7f793 andi a5,a5,127 + 300bb52: 0ff7f713 andi a4,a5,255 + 300bb56: fc744783 lbu a5,-57(s0) + 300bb5a: 97ba add a5,a5,a4 + 300bb5c: 9f81 uxtb a5 + 300bb5e: 07e2 slli a5,a5,0x18 + 300bb60: 87e1 srai a5,a5,0x18 + 300bb62: faf40223 sb a5,-92(s0) + 300bb66: fc042783 lw a5,-64(s0) + 300bb6a: 83d9 srli a5,a5,0x16 + 300bb6c: 07e2 slli a5,a5,0x18 + 300bb6e: 87e1 srai a5,a5,0x18 + 300bb70: 07f7f793 andi a5,a5,127 + 300bb74: 07e2 slli a5,a5,0x18 + 300bb76: 87e1 srai a5,a5,0x18 + 300bb78: faf402a3 sb a5,-91(s0) + 300bb7c: fc042783 lw a5,-64(s0) + 300bb80: 83bd srli a5,a5,0xf + 300bb82: 07e2 slli a5,a5,0x18 + 300bb84: 87e1 srai a5,a5,0x18 + 300bb86: 07f7f793 andi a5,a5,127 + 300bb8a: 07e2 slli a5,a5,0x18 + 300bb8c: 87e1 srai a5,a5,0x18 + 300bb8e: faf40323 sb a5,-90(s0) + 300bb92: fc042783 lw a5,-64(s0) + 300bb96: 83a1 srli a5,a5,0x8 + 300bb98: 07e2 slli a5,a5,0x18 + 300bb9a: 87e1 srai a5,a5,0x18 + 300bb9c: 07f7f793 andi a5,a5,127 + 300bba0: 07e2 slli a5,a5,0x18 + 300bba2: 87e1 srai a5,a5,0x18 + 300bba4: faf403a3 sb a5,-89(s0) + 300bba8: fc042783 lw a5,-64(s0) + 300bbac: 8385 srli a5,a5,0x1 + 300bbae: 07e2 slli a5,a5,0x18 + 300bbb0: 87e1 srai a5,a5,0x18 + 300bbb2: 07f7f793 andi a5,a5,127 + 300bbb6: 07e2 slli a5,a5,0x18 + 300bbb8: 87e1 srai a5,a5,0x18 + 300bbba: faf40423 sb a5,-88(s0) + 300bbbe: fc042783 lw a5,-64(s0) + 300bbc2: 9f81 uxtb a5 + 300bbc4: 079a slli a5,a5,0x6 + 300bbc6: 9f81 uxtb a5 + 300bbc8: 0407f793 andi a5,a5,64 + 300bbcc: 9f81 uxtb a5 + 300bbce: fcf403a3 sb a5,-57(s0) + 300bbd2: 07900613 li a2,121 + 300bbd6: 09400593 li a1,148 + 300bbda: f8c42503 lw a0,-116(s0) + 300bbde: 3cf1 jal ra,300b6ba + 300bbe0: 87aa mv a5,a0 + 300bbe2: 873e mv a4,a5 + 300bbe4: fef44783 lbu a5,-17(s0) + 300bbe8: 8fd9 or a5,a5,a4 + 300bbea: fef407a3 sb a5,-17(s0) + 300bbee: f8c42503 lw a0,-116(s0) + 300bbf2: 3c39 jal ra,300b610 + 300bbf4: 87aa mv a5,a0 + 300bbf6: 873e mv a4,a5 + 300bbf8: fef44783 lbu a5,-17(s0) + 300bbfc: 8fd9 or a5,a5,a4 + 300bbfe: fef407a3 sb a5,-17(s0) + 300bc02: fc040793 addi a5,s0,-64 + 300bc06: 863e mv a2,a5 + 300bc08: 09000593 li a1,144 + 300bc0c: f8c42503 lw a0,-116(s0) + 300bc10: 2b6d jal ra,300c1ca + 300bc12: 87aa mv a5,a0 + 300bc14: 873e mv a4,a5 + 300bc16: fef44783 lbu a5,-17(s0) + 300bc1a: 8fd9 or a5,a5,a4 + 300bc1c: fef407a3 sb a5,-17(s0) + 300bc20: fc042783 lw a5,-64(s0) + 300bc24: 83e9 srli a5,a5,0x1a + 300bc26: 9f81 uxtb a5 + 300bc28: 07f7f793 andi a5,a5,127 + 300bc2c: 0ff7f713 andi a4,a5,255 + 300bc30: fc744783 lbu a5,-57(s0) + 300bc34: 97ba add a5,a5,a4 + 300bc36: 9f81 uxtb a5 + 300bc38: 07e2 slli a5,a5,0x18 + 300bc3a: 87e1 srai a5,a5,0x18 + 300bc3c: faf404a3 sb a5,-87(s0) + 300bc40: fc042783 lw a5,-64(s0) + 300bc44: 83cd srli a5,a5,0x13 + 300bc46: 07e2 slli a5,a5,0x18 + 300bc48: 87e1 srai a5,a5,0x18 + 300bc4a: 07f7f793 andi a5,a5,127 + 300bc4e: 07e2 slli a5,a5,0x18 + 300bc50: 87e1 srai a5,a5,0x18 + 300bc52: faf40523 sb a5,-86(s0) + 300bc56: fc042783 lw a5,-64(s0) + 300bc5a: 83b1 srli a5,a5,0xc + 300bc5c: 07e2 slli a5,a5,0x18 + 300bc5e: 87e1 srai a5,a5,0x18 + 300bc60: 07f7f793 andi a5,a5,127 + 300bc64: 07e2 slli a5,a5,0x18 + 300bc66: 87e1 srai a5,a5,0x18 + 300bc68: faf405a3 sb a5,-85(s0) + 300bc6c: fc042783 lw a5,-64(s0) + 300bc70: 8395 srli a5,a5,0x5 + 300bc72: 07e2 slli a5,a5,0x18 + 300bc74: 87e1 srai a5,a5,0x18 + 300bc76: 07f7f793 andi a5,a5,127 + 300bc7a: 07e2 slli a5,a5,0x18 + 300bc7c: 87e1 srai a5,a5,0x18 + 300bc7e: faf40623 sb a5,-84(s0) + 300bc82: fc042783 lw a5,-64(s0) + 300bc86: 9f81 uxtb a5 + 300bc88: 078a slli a5,a5,0x2 + 300bc8a: 9f81 uxtb a5 + 300bc8c: 07c7f793 andi a5,a5,124 + 300bc90: 9f81 uxtb a5 + 300bc92: fcf403a3 sb a5,-57(s0) + 300bc96: 07a00613 li a2,122 + 300bc9a: 09400593 li a1,148 + 300bc9e: f8c42503 lw a0,-116(s0) + 300bca2: 3c21 jal ra,300b6ba + 300bca4: 87aa mv a5,a0 + 300bca6: 873e mv a4,a5 + 300bca8: fef44783 lbu a5,-17(s0) + 300bcac: 8fd9 or a5,a5,a4 + 300bcae: fef407a3 sb a5,-17(s0) + 300bcb2: f8c42503 lw a0,-116(s0) + 300bcb6: 3aa9 jal ra,300b610 + 300bcb8: 87aa mv a5,a0 + 300bcba: 873e mv a4,a5 + 300bcbc: fef44783 lbu a5,-17(s0) + 300bcc0: 8fd9 or a5,a5,a4 + 300bcc2: fef407a3 sb a5,-17(s0) + 300bcc6: fc040793 addi a5,s0,-64 + 300bcca: 863e mv a2,a5 + 300bccc: 09000593 li a1,144 + 300bcd0: f8c42503 lw a0,-116(s0) + 300bcd4: 29dd jal ra,300c1ca + 300bcd6: 87aa mv a5,a0 + 300bcd8: 873e mv a4,a5 + 300bcda: fef44783 lbu a5,-17(s0) + 300bcde: 8fd9 or a5,a5,a4 + 300bce0: fef407a3 sb a5,-17(s0) + 300bce4: fc042783 lw a5,-64(s0) + 300bce8: 83f9 srli a5,a5,0x1e + 300bcea: 9f81 uxtb a5 + 300bcec: 07f7f793 andi a5,a5,127 + 300bcf0: 0ff7f713 andi a4,a5,255 + 300bcf4: fc744783 lbu a5,-57(s0) + 300bcf8: 97ba add a5,a5,a4 + 300bcfa: 9f81 uxtb a5 + 300bcfc: 07e2 slli a5,a5,0x18 + 300bcfe: 87e1 srai a5,a5,0x18 + 300bd00: faf406a3 sb a5,-83(s0) + 300bd04: fc042783 lw a5,-64(s0) + 300bd08: 83dd srli a5,a5,0x17 + 300bd0a: 07e2 slli a5,a5,0x18 + 300bd0c: 87e1 srai a5,a5,0x18 + 300bd0e: 07f7f793 andi a5,a5,127 + 300bd12: 07e2 slli a5,a5,0x18 + 300bd14: 87e1 srai a5,a5,0x18 + 300bd16: faf40723 sb a5,-82(s0) + 300bd1a: fc042783 lw a5,-64(s0) + 300bd1e: 83c1 srli a5,a5,0x10 + 300bd20: 07e2 slli a5,a5,0x18 + 300bd22: 87e1 srai a5,a5,0x18 + 300bd24: 07f7f793 andi a5,a5,127 + 300bd28: 07e2 slli a5,a5,0x18 + 300bd2a: 87e1 srai a5,a5,0x18 + 300bd2c: faf407a3 sb a5,-81(s0) + 300bd30: fc042783 lw a5,-64(s0) + 300bd34: 83a5 srli a5,a5,0x9 + 300bd36: 07e2 slli a5,a5,0x18 + 300bd38: 87e1 srai a5,a5,0x18 + 300bd3a: 07f7f793 andi a5,a5,127 + 300bd3e: 07e2 slli a5,a5,0x18 + 300bd40: 87e1 srai a5,a5,0x18 + 300bd42: faf40823 sb a5,-80(s0) + 300bd46: fc042783 lw a5,-64(s0) + 300bd4a: 8389 srli a5,a5,0x2 + 300bd4c: 07e2 slli a5,a5,0x18 + 300bd4e: 87e1 srai a5,a5,0x18 + 300bd50: 07f7f793 andi a5,a5,127 + 300bd54: 07e2 slli a5,a5,0x18 + 300bd56: 87e1 srai a5,a5,0x18 + 300bd58: faf408a3 sb a5,-79(s0) + 300bd5c: fa040923 sb zero,-78(s0) + 300bd60: f8b44783 lbu a5,-117(s0) + 300bd64: 8b91 andi a5,a5,4 + 300bd66: 22078363 beqz a5,300bf8c + 300bd6a: fcf44783 lbu a5,-49(s0) + 300bd6e: 8b91 andi a5,a5,4 + 300bd70: 20079e63 bnez a5,300bf8c + 300bd74: 07b00613 li a2,123 + 300bd78: 09400593 li a1,148 + 300bd7c: f8c42503 lw a0,-116(s0) + 300bd80: 3a2d jal ra,300b6ba + 300bd82: 87aa mv a5,a0 + 300bd84: 873e mv a4,a5 + 300bd86: fef44783 lbu a5,-17(s0) + 300bd8a: 8fd9 or a5,a5,a4 + 300bd8c: fef407a3 sb a5,-17(s0) + 300bd90: f8c42503 lw a0,-116(s0) + 300bd94: 290d jal ra,300c1c6 + 300bd96: 87aa mv a5,a0 + 300bd98: 873e mv a4,a5 + 300bd9a: fef44783 lbu a5,-17(s0) + 300bd9e: 8fd9 or a5,a5,a4 + 300bda0: fef407a3 sb a5,-17(s0) + 300bda4: fb840793 addi a5,s0,-72 + 300bda8: 863e mv a2,a5 + 300bdaa: 09000593 li a1,144 + 300bdae: f8c42503 lw a0,-116(s0) + 300bdb2: 2921 jal ra,300c1ca + 300bdb4: 87aa mv a5,a0 + 300bdb6: 873e mv a4,a5 + 300bdb8: fef44783 lbu a5,-17(s0) + 300bdbc: 8fd9 or a5,a5,a4 + 300bdbe: fef407a3 sb a5,-17(s0) + 300bdc2: 07c00613 li a2,124 + 300bdc6: 09400593 li a1,148 + 300bdca: f8c42503 lw a0,-116(s0) + 300bdce: 2101 jal ra,300c1ce + 300bdd0: 87aa mv a5,a0 + 300bdd2: 873e mv a4,a5 + 300bdd4: fef44783 lbu a5,-17(s0) + 300bdd8: 8fd9 or a5,a5,a4 + 300bdda: fef407a3 sb a5,-17(s0) + 300bdde: f8c42503 lw a0,-116(s0) + 300bde2: 26d5 jal ra,300c1c6 + 300bde4: 87aa mv a5,a0 + 300bde6: 873e mv a4,a5 + 300bde8: fef44783 lbu a5,-17(s0) + 300bdec: 8fd9 or a5,a5,a4 + 300bdee: fef407a3 sb a5,-17(s0) + 300bdf2: fb440793 addi a5,s0,-76 + 300bdf6: 863e mv a2,a5 + 300bdf8: 09000593 li a1,144 + 300bdfc: f8c42503 lw a0,-116(s0) + 300be00: 26e9 jal ra,300c1ca + 300be02: 87aa mv a5,a0 + 300be04: 873e mv a4,a5 + 300be06: fef44783 lbu a5,-17(s0) + 300be0a: 8fd9 or a5,a5,a4 + 300be0c: fef407a3 sb a5,-17(s0) + 300be10: 07300613 li a2,115 + 300be14: 09400593 li a1,148 + 300be18: f8c42503 lw a0,-116(s0) + 300be1c: 2e4d jal ra,300c1ce + 300be1e: 87aa mv a5,a0 + 300be20: 873e mv a4,a5 + 300be22: fef44783 lbu a5,-17(s0) + 300be26: 8fd9 or a5,a5,a4 + 300be28: fef407a3 sb a5,-17(s0) + 300be2c: f8c42503 lw a0,-116(s0) + 300be30: 2e59 jal ra,300c1c6 + 300be32: 87aa mv a5,a0 + 300be34: 873e mv a4,a5 + 300be36: fef44783 lbu a5,-17(s0) + 300be3a: 8fd9 or a5,a5,a4 + 300be3c: fef407a3 sb a5,-17(s0) + 300be40: fc040793 addi a5,s0,-64 + 300be44: 863e mv a2,a5 + 300be46: 09000593 li a1,144 + 300be4a: f8c42503 lw a0,-116(s0) + 300be4e: 2eb5 jal ra,300c1ca + 300be50: 87aa mv a5,a0 + 300be52: 873e mv a4,a5 + 300be54: fef44783 lbu a5,-17(s0) + 300be58: 8fd9 or a5,a5,a4 + 300be5a: fef407a3 sb a5,-17(s0) + 300be5e: fc042783 lw a5,-64(s0) + 300be62: 00879713 slli a4,a5,0x8 + 300be66: 67c1 lui a5,0x10 + 300be68: 17fd addi a5,a5,-1 # ffff + 300be6a: 8ff9 and a5,a5,a4 + 300be6c: fef42023 sw a5,-32(s0) + 300be70: 07400613 li a2,116 + 300be74: 09400593 li a1,148 + 300be78: f8c42503 lw a0,-116(s0) + 300be7c: 2e89 jal ra,300c1ce + 300be7e: 87aa mv a5,a0 + 300be80: 873e mv a4,a5 + 300be82: fef44783 lbu a5,-17(s0) + 300be86: 8fd9 or a5,a5,a4 + 300be88: fef407a3 sb a5,-17(s0) + 300be8c: f8c42503 lw a0,-116(s0) + 300be90: 2e1d jal ra,300c1c6 + 300be92: 87aa mv a5,a0 + 300be94: 873e mv a4,a5 + 300be96: fef44783 lbu a5,-17(s0) + 300be9a: 8fd9 or a5,a5,a4 + 300be9c: fef407a3 sb a5,-17(s0) + 300bea0: fc040793 addi a5,s0,-64 + 300bea4: 863e mv a2,a5 + 300bea6: 09000593 li a1,144 + 300beaa: f8c42503 lw a0,-116(s0) + 300beae: 2e31 jal ra,300c1ca + 300beb0: 87aa mv a5,a0 + 300beb2: 873e mv a4,a5 + 300beb4: fef44783 lbu a5,-17(s0) + 300beb8: 8fd9 or a5,a5,a4 + 300beba: fef407a3 sb a5,-17(s0) + 300bebe: fc042783 lw a5,-64(s0) + 300bec2: 83e1 srli a5,a5,0x18 + 300bec4: fe042703 lw a4,-32(s0) + 300bec8: 8fd9 or a5,a5,a4 + 300beca: fef42023 sw a5,-32(s0) + 300bece: 07500613 li a2,117 + 300bed2: 09400593 li a1,148 + 300bed6: f8c42503 lw a0,-116(s0) + 300beda: 2cd5 jal ra,300c1ce + 300bedc: 87aa mv a5,a0 + 300bede: 873e mv a4,a5 + 300bee0: fef44783 lbu a5,-17(s0) + 300bee4: 8fd9 or a5,a5,a4 + 300bee6: fef407a3 sb a5,-17(s0) + 300beea: f8c42503 lw a0,-116(s0) + 300beee: 2ce1 jal ra,300c1c6 + 300bef0: 87aa mv a5,a0 + 300bef2: 873e mv a4,a5 + 300bef4: fef44783 lbu a5,-17(s0) + 300bef8: 8fd9 or a5,a5,a4 + 300befa: fef407a3 sb a5,-17(s0) + 300befe: fc040793 addi a5,s0,-64 + 300bf02: 863e mv a2,a5 + 300bf04: 09000593 li a1,144 + 300bf08: f8c42503 lw a0,-116(s0) + 300bf0c: 2c7d jal ra,300c1ca + 300bf0e: 87aa mv a5,a0 + 300bf10: 873e mv a4,a5 + 300bf12: fef44783 lbu a5,-17(s0) + 300bf16: 8fd9 or a5,a5,a4 + 300bf18: fef407a3 sb a5,-17(s0) + 300bf1c: fc042783 lw a5,-64(s0) + 300bf20: 00879713 slli a4,a5,0x8 + 300bf24: 67c1 lui a5,0x10 + 300bf26: 17fd addi a5,a5,-1 # ffff + 300bf28: 8ff9 and a5,a5,a4 + 300bf2a: fef42223 sw a5,-28(s0) + 300bf2e: 07600613 li a2,118 + 300bf32: 09400593 li a1,148 + 300bf36: f8c42503 lw a0,-116(s0) + 300bf3a: 2c51 jal ra,300c1ce + 300bf3c: 87aa mv a5,a0 + 300bf3e: 873e mv a4,a5 + 300bf40: fef44783 lbu a5,-17(s0) + 300bf44: 8fd9 or a5,a5,a4 + 300bf46: fef407a3 sb a5,-17(s0) + 300bf4a: f8c42503 lw a0,-116(s0) + 300bf4e: 2ca5 jal ra,300c1c6 + 300bf50: 87aa mv a5,a0 + 300bf52: 873e mv a4,a5 + 300bf54: fef44783 lbu a5,-17(s0) + 300bf58: 8fd9 or a5,a5,a4 + 300bf5a: fef407a3 sb a5,-17(s0) + 300bf5e: fc040793 addi a5,s0,-64 + 300bf62: 863e mv a2,a5 + 300bf64: 09000593 li a1,144 + 300bf68: f8c42503 lw a0,-116(s0) + 300bf6c: 2cb9 jal ra,300c1ca + 300bf6e: 87aa mv a5,a0 + 300bf70: 873e mv a4,a5 + 300bf72: fef44783 lbu a5,-17(s0) + 300bf76: 8fd9 or a5,a5,a4 + 300bf78: fef407a3 sb a5,-17(s0) + 300bf7c: fc042783 lw a5,-64(s0) + 300bf80: 83e1 srli a5,a5,0x18 + 300bf82: fe442703 lw a4,-28(s0) + 300bf86: 8fd9 or a5,a5,a4 + 300bf88: fef42223 sw a5,-28(s0) + 300bf8c: 4601 li a2,0 + 300bf8e: 08100593 li a1,129 + 300bf92: f8c42503 lw a0,-116(s0) + 300bf96: 2c25 jal ra,300c1ce + 300bf98: 87aa mv a5,a0 + 300bf9a: 873e mv a4,a5 + 300bf9c: fef44783 lbu a5,-17(s0) + 300bfa0: 8fd9 or a5,a5,a4 + 300bfa2: fef407a3 sb a5,-17(s0) + 300bfa6: 4619 li a2,6 + 300bfa8: 0ff00593 li a1,255 + 300bfac: f8c42503 lw a0,-116(s0) + 300bfb0: 2c39 jal ra,300c1ce + 300bfb2: 87aa mv a5,a0 + 300bfb4: 873e mv a4,a5 + 300bfb6: fef44783 lbu a5,-17(s0) + 300bfba: 8fd9 or a5,a5,a4 + 300bfbc: fef407a3 sb a5,-17(s0) + 300bfc0: fc740793 addi a5,s0,-57 + 300bfc4: 863e mv a2,a5 + 300bfc6: 08300593 li a1,131 + 300bfca: f8c42503 lw a0,-116(s0) + 300bfce: 614020ef jal ra,300e5e2 + 300bfd2: 87aa mv a5,a0 + 300bfd4: 873e mv a4,a5 + 300bfd6: fef44783 lbu a5,-17(s0) + 300bfda: 8fd9 or a5,a5,a4 + 300bfdc: fef407a3 sb a5,-17(s0) + 300bfe0: fc744783 lbu a5,-57(s0) + 300bfe4: 9bed andi a5,a5,-5 + 300bfe6: 9f81 uxtb a5 + 300bfe8: 863e mv a2,a5 + 300bfea: 08300593 li a1,131 + 300bfee: f8c42503 lw a0,-116(s0) + 300bff2: 2af1 jal ra,300c1ce + 300bff4: 87aa mv a5,a0 + 300bff6: 873e mv a4,a5 + 300bff8: fef44783 lbu a5,-17(s0) + 300bffc: 8fd9 or a5,a5,a4 + 300bffe: fef407a3 sb a5,-17(s0) + 300c002: 4605 li a2,1 + 300c004: 0ff00593 li a1,255 + 300c008: f8c42503 lw a0,-116(s0) + 300c00c: 22c9 jal ra,300c1ce + 300c00e: 87aa mv a5,a0 + 300c010: 873e mv a4,a5 + 300c012: fef44783 lbu a5,-17(s0) + 300c016: 8fd9 or a5,a5,a4 + 300c018: fef407a3 sb a5,-17(s0) + 300c01c: 4605 li a2,1 + 300c01e: 4581 li a1,0 + 300c020: f8c42503 lw a0,-116(s0) + 300c024: 226d jal ra,300c1ce + 300c026: 87aa mv a5,a0 + 300c028: 873e mv a4,a5 + 300c02a: fef44783 lbu a5,-17(s0) + 300c02e: 8fd9 or a5,a5,a4 + 300c030: fef407a3 sb a5,-17(s0) + 300c034: 4601 li a2,0 + 300c036: 0ff00593 li a1,255 + 300c03a: f8c42503 lw a0,-116(s0) + 300c03e: 2a41 jal ra,300c1ce + 300c040: 87aa mv a5,a0 + 300c042: 873e mv a4,a5 + 300c044: fef44783 lbu a5,-17(s0) + 300c048: 8fd9 or a5,a5,a4 + 300c04a: fef407a3 sb a5,-17(s0) + 300c04e: 4601 li a2,0 + 300c050: 08000593 li a1,128 + 300c054: f8c42503 lw a0,-116(s0) + 300c058: 2a9d jal ra,300c1ce + 300c05a: 87aa mv a5,a0 + 300c05c: 873e mv a4,a5 + 300c05e: fef44783 lbu a5,-17(s0) + 300c062: 8fd9 or a5,a5,a4 + 300c064: fef407a3 sb a5,-17(s0) + 300c068: fef40783 lb a5,-17(s0) + 300c06c: 14079663 bnez a5,300c1b8 + 300c070: fcf44703 lbu a4,-49(s0) + 300c074: 479d li a5,7 + 300c076: 14f70163 beq a4,a5,300c1b8 + 300c07a: f8b44783 lbu a5,-117(s0) + 300c07e: 8b85 andi a5,a5,1 + 300c080: cfa1 beqz a5,300c0d8 + 300c082: fcf44783 lbu a5,-49(s0) + 300c086: 8b85 andi a5,a5,1 + 300c088: eba1 bnez a5,300c0d8 + 300c08a: f8c42783 lw a5,-116(s0) + 300c08e: fee44703 lbu a4,-18(s0) + 300c092: 12e78fa3 sb a4,319(a5) + 300c096: f8c42783 lw a5,-116(s0) + 300c09a: fed44703 lbu a4,-19(s0) + 300c09e: 14e78023 sb a4,320(a5) + 300c0a2: fc042e23 sw zero,-36(s0) + 300c0a6: a025 j 300c0ce + 300c0a8: fdc42783 lw a5,-36(s0) + 300c0ac: ff040713 addi a4,s0,-16 + 300c0b0: 97ba add a5,a5,a4 + 300c0b2: fa87c703 lbu a4,-88(a5) + 300c0b6: f8c42683 lw a3,-116(s0) + 300c0ba: fdc42783 lw a5,-36(s0) + 300c0be: 97b6 add a5,a5,a3 + 300c0c0: 14e78b23 sb a4,342(a5) + 300c0c4: fdc42783 lw a5,-36(s0) + 300c0c8: 0785 addi a5,a5,1 + 300c0ca: fcf42e23 sw a5,-36(s0) + 300c0ce: fdc42703 lw a4,-36(s0) + 300c0d2: 4795 li a5,5 + 300c0d4: fce7dae3 bge a5,a4,300c0a8 + 300c0d8: f8b44783 lbu a5,-117(s0) + 300c0dc: 8b89 andi a5,a5,2 + 300c0de: cf95 beqz a5,300c11a + 300c0e0: fcf44783 lbu a5,-49(s0) + 300c0e4: 8b89 andi a5,a5,2 + 300c0e6: eb95 bnez a5,300c11a + 300c0e8: fbf44703 lbu a4,-65(s0) + 300c0ec: f8c42783 lw a5,-116(s0) + 300c0f0: 10e78ea3 sb a4,285(a5) + 300c0f4: fbe44703 lbu a4,-66(s0) + 300c0f8: f8c42783 lw a5,-116(s0) + 300c0fc: 10e78f23 sb a4,286(a5) + 300c100: f8c42783 lw a5,-116(s0) + 300c104: 11f78793 addi a5,a5,287 + 300c108: fcf42423 sw a5,-56(s0) + 300c10c: fa040793 addi a5,s0,-96 + 300c110: 85be mv a1,a5 + 300c112: fc842503 lw a0,-56(s0) + 300c116: 435020ef jal ra,300ed4a + 300c11a: f8b44783 lbu a5,-117(s0) + 300c11e: 8b91 andi a5,a5,4 + 300c120: cfb5 beqz a5,300c19c + 300c122: fcf44783 lbu a5,-49(s0) + 300c126: 8b91 andi a5,a5,4 + 300c128: ebb5 bnez a5,300c19c + 300c12a: fb842703 lw a4,-72(s0) + 300c12e: f8c42783 lw a5,-116(s0) + 300c132: 14e7a223 sw a4,324(a5) + 300c136: fb442703 lw a4,-76(s0) + 300c13a: f8c42783 lw a5,-116(s0) + 300c13e: 14e7a423 sw a4,328(a5) + 300c142: fe042783 lw a5,-32(s0) + 300c146: 07a6 slli a5,a5,0x9 + 300c148: fcf42823 sw a5,-48(s0) + 300c14c: f8c42783 lw a5,-116(s0) + 300c150: fd042703 lw a4,-48(s0) + 300c154: 14e7a623 sw a4,332(a5) + 300c158: fe041523 sh zero,-22(s0) + 300c15c: fe442783 lw a5,-28(s0) + 300c160: cb8d beqz a5,300c192 + 300c162: fe442703 lw a4,-28(s0) + 300c166: fd442783 lw a5,-44(s0) + 300c16a: 40f707b3 sub a5,a4,a5 + 300c16e: fcf42c23 sw a5,-40(s0) + 300c172: fd842703 lw a4,-40(s0) + 300c176: 3e800793 li a5,1000 + 300c17a: 02f707b3 mul a5,a4,a5 + 300c17e: 8391 srli a5,a5,0x4 + 300c180: fef41523 sh a5,-22(s0) + 300c184: fea45783 lhu a5,-22(s0) + 300c188: 40f007b3 neg a5,a5 + 300c18c: 9fa1 uxth a5 + 300c18e: fef41523 sh a5,-22(s0) + 300c192: fea41703 lh a4,-22(s0) + 300c196: f8c42783 lw a5,-116(s0) + 300c19a: c3d8 sw a4,4(a5) + 300c19c: fcf44703 lbu a4,-49(s0) + 300c1a0: f8b44783 lbu a5,-117(s0) + 300c1a4: 8fd9 or a5,a5,a4 + 300c1a6: 9f81 uxtb a5 + 300c1a8: fcf403a3 sb a5,-57(s0) + 300c1ac: fc744703 lbu a4,-57(s0) + 300c1b0: f8c42783 lw a5,-116(s0) + 300c1b4: 10e78e23 sb a4,284(a5) + 300c1b8: fef40783 lb a5,-17(s0) + 300c1bc: 853e mv a0,a5 + 300c1be: 50f6 lw ra,124(sp) + 300c1c0: 5466 lw s0,120(sp) + 300c1c2: 6109 addi sp,sp,128 + 300c1c4: 8082 ret + +0300c1c6 : + 300c1c6: c4aff06f j 300b610 + +0300c1ca : + 300c1ca: 4c40206f j 300e68e + +0300c1ce : + 300c1ce: 2b60206f j 300e484 + +0300c1d2 : + 300c1d2: 7179 addi sp,sp,-48 + 300c1d4: d622 sw s0,44(sp) + 300c1d6: 1800 addi s0,sp,48 + 300c1d8: fca42e23 sw a0,-36(s0) + 300c1dc: 87ae mv a5,a1 + 300c1de: fcf40da3 sb a5,-37(s0) + 300c1e2: 67700793 li a5,1655 + 300c1e6: 4801 li a6,0 + 300c1e8: fef42423 sw a5,-24(s0) + 300c1ec: ff042623 sw a6,-20(s0) + 300c1f0: 6785 lui a5,0x1 + 300c1f2: 90078793 addi a5,a5,-1792 # 900 + 300c1f6: fef42223 sw a5,-28(s0) + 300c1fa: fdb44703 lbu a4,-37(s0) + 300c1fe: fe442783 lw a5,-28(s0) + 300c202: 02f70733 mul a4,a4,a5 + 300c206: fe842783 lw a5,-24(s0) + 300c20a: 02f707b3 mul a5,a4,a5 + 300c20e: fef42023 sw a5,-32(s0) + 300c212: fe042783 lw a5,-32(s0) + 300c216: 853e mv a0,a5 + 300c218: 5432 lw s0,44(sp) + 300c21a: 6145 addi sp,sp,48 + 300c21c: 8082 ret + +0300c21e : + 300c21e: 7179 addi sp,sp,-48 + 300c220: d622 sw s0,44(sp) + 300c222: 1800 addi s0,sp,48 + 300c224: fca42e23 sw a0,-36(s0) + 300c228: fe041723 sh zero,-18(s0) + 300c22c: fe042423 sw zero,-24(s0) + 300c230: fe041323 sh zero,-26(s0) + 300c234: fdc42783 lw a5,-36(s0) + 300c238: c7a9 beqz a5,300c282 + 300c23a: fdc42783 lw a5,-36(s0) + 300c23e: 17fd addi a5,a5,-1 + 300c240: fef42423 sw a5,-24(s0) + 300c244: a819 j 300c25a + 300c246: fe842783 lw a5,-24(s0) + 300c24a: 8385 srli a5,a5,0x1 + 300c24c: fef42423 sw a5,-24(s0) + 300c250: fe645783 lhu a5,-26(s0) + 300c254: 0785 addi a5,a5,1 + 300c256: fef41323 sh a5,-26(s0) + 300c25a: fe842783 lw a5,-24(s0) + 300c25e: f007f793 andi a5,a5,-256 + 300c262: f3f5 bnez a5,300c246 + 300c264: fe645783 lhu a5,-26(s0) + 300c268: 07a2 slli a5,a5,0x8 + 300c26a: 01079713 slli a4,a5,0x10 + 300c26e: 8341 srli a4,a4,0x10 + 300c270: fe842783 lw a5,-24(s0) + 300c274: 9fa1 uxth a5 + 300c276: 0ff7f793 andi a5,a5,255 + 300c27a: 9fa1 uxth a5 + 300c27c: 97ba add a5,a5,a4 + 300c27e: fef41723 sh a5,-18(s0) + 300c282: fee45783 lhu a5,-18(s0) + 300c286: 853e mv a0,a5 + 300c288: 5432 lw s0,44(sp) + 300c28a: 6145 addi sp,sp,48 + 300c28c: 8082 ret + +0300c28e : + 300c28e: 7179 addi sp,sp,-48 + 300c290: d622 sw s0,44(sp) + 300c292: 1800 addi s0,sp,48 + 300c294: 87aa mv a5,a0 + 300c296: fcf41f23 sh a5,-34(s0) + 300c29a: fe042623 sw zero,-20(s0) + 300c29e: fde45783 lhu a5,-34(s0) + 300c2a2: 0ff7f793 andi a5,a5,255 + 300c2a6: fde45703 lhu a4,-34(s0) + 300c2aa: 8321 srli a4,a4,0x8 + 300c2ac: 9f21 uxth a4 + 300c2ae: 00e797b3 sll a5,a5,a4 + 300c2b2: 0785 addi a5,a5,1 + 300c2b4: fef42623 sw a5,-20(s0) + 300c2b8: fec42783 lw a5,-20(s0) + 300c2bc: 853e mv a0,a5 + 300c2be: 5432 lw s0,44(sp) + 300c2c0: 6145 addi sp,sp,48 + 300c2c2: 8082 ret + +0300c2c4 : + 300c2c4: 7179 addi sp,sp,-48 + 300c2c6: d606 sw ra,44(sp) + 300c2c8: d422 sw s0,40(sp) + 300c2ca: 1800 addi s0,sp,48 + 300c2cc: fca42e23 sw a0,-36(s0) + 300c2d0: fcb42c23 sw a1,-40(s0) + 300c2d4: 87b2 mv a5,a2 + 300c2d6: fcf40ba3 sb a5,-41(s0) + 300c2da: fe042623 sw zero,-20(s0) + 300c2de: fd744783 lbu a5,-41(s0) + 300c2e2: 85be mv a1,a5 + 300c2e4: fdc42503 lw a0,-36(s0) + 300c2e8: 35ed jal ra,300c1d2 + 300c2ea: fea42423 sw a0,-24(s0) + 300c2ee: fe842783 lw a5,-24(s0) + 300c2f2: 1f478713 addi a4,a5,500 + 300c2f6: 3e800793 li a5,1000 + 300c2fa: 02f757b3 divu a5,a4,a5 + 300c2fe: fef42223 sw a5,-28(s0) + 300c302: fd842703 lw a4,-40(s0) + 300c306: 3e800793 li a5,1000 + 300c30a: 02f70733 mul a4,a4,a5 + 300c30e: fe442783 lw a5,-28(s0) + 300c312: 8385 srli a5,a5,0x1 + 300c314: 973e add a4,a4,a5 + 300c316: fe442783 lw a5,-28(s0) + 300c31a: 02f757b3 divu a5,a4,a5 + 300c31e: fef42623 sw a5,-20(s0) + 300c322: fec42783 lw a5,-20(s0) + 300c326: 853e mv a0,a5 + 300c328: 50b2 lw ra,44(sp) + 300c32a: 5422 lw s0,40(sp) + 300c32c: 6145 addi sp,sp,48 + 300c32e: 8082 ret + +0300c330 : + 300c330: 7179 addi sp,sp,-48 + 300c332: d606 sw ra,44(sp) + 300c334: d422 sw s0,40(sp) + 300c336: 1800 addi s0,sp,48 + 300c338: fca42e23 sw a0,-36(s0) + 300c33c: 87ae mv a5,a1 + 300c33e: 8732 mv a4,a2 + 300c340: fcf41d23 sh a5,-38(s0) + 300c344: 87ba mv a5,a4 + 300c346: fcf40ca3 sb a5,-39(s0) + 300c34a: fe042623 sw zero,-20(s0) + 300c34e: fd944783 lbu a5,-39(s0) + 300c352: 85be mv a1,a5 + 300c354: fdc42503 lw a0,-36(s0) + 300c358: 3dad jal ra,300c1d2 + 300c35a: fea42423 sw a0,-24(s0) + 300c35e: fe842783 lw a5,-24(s0) + 300c362: 1f478713 addi a4,a5,500 + 300c366: 3e800793 li a5,1000 + 300c36a: 02f757b3 divu a5,a4,a5 + 300c36e: fef42223 sw a5,-28(s0) + 300c372: fda45703 lhu a4,-38(s0) + 300c376: fe442783 lw a5,-28(s0) + 300c37a: 02f707b3 mul a5,a4,a5 + 300c37e: 1f478713 addi a4,a5,500 + 300c382: 3e800793 li a5,1000 + 300c386: 02f757b3 divu a5,a4,a5 + 300c38a: fef42623 sw a5,-20(s0) + 300c38e: fec42783 lw a5,-20(s0) + 300c392: 853e mv a0,a5 + 300c394: 50b2 lw ra,44(sp) + 300c396: 5422 lw s0,40(sp) + 300c398: 6145 addi sp,sp,48 + 300c39a: 8082 ret + +0300c39c : + 300c39c: 7139 addi sp,sp,-64 + 300c39e: de06 sw ra,60(sp) + 300c3a0: dc22 sw s0,56(sp) + 300c3a2: 0080 addi s0,sp,64 + 300c3a4: fca42623 sw a0,-52(s0) + 300c3a8: 87ae mv a5,a1 + 300c3aa: fcc42223 sw a2,-60(s0) + 300c3ae: fcf405a3 sb a5,-53(s0) + 300c3b2: fe0407a3 sb zero,-17(s0) + 300c3b6: fe040023 sb zero,-32(s0) + 300c3ba: fe042423 sw zero,-24(s0) + 300c3be: fc041f23 sh zero,-34(s0) + 300c3c2: fe041223 sh zero,-28(s0) + 300c3c6: fcb44783 lbu a5,-53(s0) + 300c3ca: cb99 beqz a5,300c3e0 + 300c3cc: fcb44703 lbu a4,-53(s0) + 300c3d0: 4785 li a5,1 + 300c3d2: 00f70763 beq a4,a5,300c3e0 + 300c3d6: fcb44703 lbu a4,-53(s0) + 300c3da: 4789 li a5,2 + 300c3dc: 04f71f63 bne a4,a5,300c43a + 300c3e0: fe140793 addi a5,s0,-31 + 300c3e4: 863e mv a2,a5 + 300c3e6: 4581 li a1,0 + 300c3e8: fcc42503 lw a0,-52(s0) + 300c3ec: 2ee9 jal ra,300c7c6 + 300c3ee: 87aa mv a5,a0 + 300c3f0: fef407a3 sb a5,-17(s0) + 300c3f4: fef40783 lb a5,-17(s0) + 300c3f8: ef89 bnez a5,300c412 + 300c3fa: fe040793 addi a5,s0,-32 + 300c3fe: 863e mv a2,a5 + 300c400: 04600593 li a1,70 + 300c404: fcc42503 lw a0,-52(s0) + 300c408: 1da020ef jal ra,300e5e2 + 300c40c: 87aa mv a5,a0 + 300c40e: fef407a3 sb a5,-17(s0) + 300c412: fe044783 lbu a5,-32(s0) + 300c416: 9fa1 uxth a5 + 300c418: 853e mv a0,a5 + 300c41a: 3d95 jal ra,300c28e + 300c41c: 87aa mv a5,a0 + 300c41e: fef41123 sh a5,-30(s0) + 300c422: fe144703 lbu a4,-31(s0) + 300c426: fe245783 lhu a5,-30(s0) + 300c42a: 863a mv a2,a4 + 300c42c: 85be mv a1,a5 + 300c42e: fcc42503 lw a0,-52(s0) + 300c432: 3dfd jal ra,300c330 + 300c434: fea42423 sw a0,-24(s0) + 300c438: a299 j 300c57e + 300c43a: fcb44703 lbu a4,-53(s0) + 300c43e: 478d li a5,3 + 300c440: 06f71b63 bne a4,a5,300c4b6 + 300c444: fe140793 addi a5,s0,-31 + 300c448: 863e mv a2,a5 + 300c44a: 4581 li a1,0 + 300c44c: fcc42503 lw a0,-52(s0) + 300c450: 2e9d jal ra,300c7c6 + 300c452: 87aa mv a5,a0 + 300c454: fef407a3 sb a5,-17(s0) + 300c458: fef40783 lb a5,-17(s0) + 300c45c: 12079163 bnez a5,300c57e + 300c460: fe140793 addi a5,s0,-31 + 300c464: 863e mv a2,a5 + 300c466: 4581 li a1,0 + 300c468: fcc42503 lw a0,-52(s0) + 300c46c: 2ea9 jal ra,300c7c6 + 300c46e: 87aa mv a5,a0 + 300c470: fef407a3 sb a5,-17(s0) + 300c474: fef40783 lb a5,-17(s0) + 300c478: ef81 bnez a5,300c490 + 300c47a: fde40793 addi a5,s0,-34 + 300c47e: 863e mv a2,a5 + 300c480: 05100593 li a1,81 + 300c484: fcc42503 lw a0,-52(s0) + 300c488: 2689 jal ra,300c7ca + 300c48a: 87aa mv a5,a0 + 300c48c: fef407a3 sb a5,-17(s0) + 300c490: fde45783 lhu a5,-34(s0) + 300c494: 853e mv a0,a5 + 300c496: 3be5 jal ra,300c28e + 300c498: 87aa mv a5,a0 + 300c49a: fef41323 sh a5,-26(s0) + 300c49e: fe144703 lbu a4,-31(s0) + 300c4a2: fe645783 lhu a5,-26(s0) + 300c4a6: 863a mv a2,a4 + 300c4a8: 85be mv a1,a5 + 300c4aa: fcc42503 lw a0,-52(s0) + 300c4ae: 3549 jal ra,300c330 + 300c4b0: fea42423 sw a0,-24(s0) + 300c4b4: a0e9 j 300c57e + 300c4b6: fcb44703 lbu a4,-53(s0) + 300c4ba: 4791 li a5,4 + 300c4bc: 0cf71163 bne a4,a5,300c57e + 300c4c0: fd440793 addi a5,s0,-44 + 300c4c4: 85be mv a1,a5 + 300c4c6: fcc42503 lw a0,-52(s0) + 300c4ca: 2345 jal ra,300ca6a + 300c4cc: fe041323 sh zero,-26(s0) + 300c4d0: fd744783 lbu a5,-41(s0) + 300c4d4: c3a1 beqz a5,300c514 + 300c4d6: fe140793 addi a5,s0,-31 + 300c4da: 863e mv a2,a5 + 300c4dc: 4581 li a1,0 + 300c4de: fcc42503 lw a0,-52(s0) + 300c4e2: 24d5 jal ra,300c7c6 + 300c4e4: 87aa mv a5,a0 + 300c4e6: fef407a3 sb a5,-17(s0) + 300c4ea: fef40783 lb a5,-17(s0) + 300c4ee: e39d bnez a5,300c514 + 300c4f0: fde40793 addi a5,s0,-34 + 300c4f4: 863e mv a2,a5 + 300c4f6: 05100593 li a1,81 + 300c4fa: fcc42503 lw a0,-52(s0) + 300c4fe: 24f1 jal ra,300c7ca + 300c500: 87aa mv a5,a0 + 300c502: fef407a3 sb a5,-17(s0) + 300c506: fde45783 lhu a5,-34(s0) + 300c50a: 853e mv a0,a5 + 300c50c: 3349 jal ra,300c28e + 300c50e: 87aa mv a5,a0 + 300c510: fef41323 sh a5,-26(s0) + 300c514: fef40783 lb a5,-17(s0) + 300c518: eb99 bnez a5,300c52e + 300c51a: fe140793 addi a5,s0,-31 + 300c51e: 863e mv a2,a5 + 300c520: 4585 li a1,1 + 300c522: fcc42503 lw a0,-52(s0) + 300c526: 2445 jal ra,300c7c6 + 300c528: 87aa mv a5,a0 + 300c52a: fef407a3 sb a5,-17(s0) + 300c52e: fef40783 lb a5,-17(s0) + 300c532: e39d bnez a5,300c558 + 300c534: fdc40793 addi a5,s0,-36 + 300c538: 863e mv a2,a5 + 300c53a: 07100593 li a1,113 + 300c53e: fcc42503 lw a0,-52(s0) + 300c542: 2461 jal ra,300c7ca + 300c544: 87aa mv a5,a0 + 300c546: fef407a3 sb a5,-17(s0) + 300c54a: fdc45783 lhu a5,-36(s0) + 300c54e: 853e mv a0,a5 + 300c550: 3b3d jal ra,300c28e + 300c552: 87aa mv a5,a0 + 300c554: fef41223 sh a5,-28(s0) + 300c558: fe445703 lhu a4,-28(s0) + 300c55c: fe645783 lhu a5,-26(s0) + 300c560: 40f707b3 sub a5,a4,a5 + 300c564: fef41223 sh a5,-28(s0) + 300c568: fe144703 lbu a4,-31(s0) + 300c56c: fe445783 lhu a5,-28(s0) + 300c570: 863a mv a2,a4 + 300c572: 85be mv a1,a5 + 300c574: fcc42503 lw a0,-52(s0) + 300c578: 3b65 jal ra,300c330 + 300c57a: fea42423 sw a0,-24(s0) + 300c57e: fc442783 lw a5,-60(s0) + 300c582: fe842703 lw a4,-24(s0) + 300c586: c398 sw a4,0(a5) + 300c588: fef40783 lb a5,-17(s0) + 300c58c: 853e mv a0,a5 + 300c58e: 50f2 lw ra,60(sp) + 300c590: 5462 lw s0,56(sp) + 300c592: 6121 addi sp,sp,64 + 300c594: 8082 ret + +0300c596 : + 300c596: 7139 addi sp,sp,-64 + 300c598: de06 sw ra,60(sp) + 300c59a: dc22 sw s0,56(sp) + 300c59c: 0080 addi s0,sp,64 + 300c59e: fca42623 sw a0,-52(s0) + 300c5a2: 87ae mv a5,a1 + 300c5a4: fcc42223 sw a2,-60(s0) + 300c5a8: fcf405a3 sb a5,-53(s0) + 300c5ac: fe0407a3 sb zero,-17(s0) + 300c5b0: fcb44783 lbu a5,-53(s0) + 300c5b4: cb99 beqz a5,300c5ca + 300c5b6: fcb44703 lbu a4,-53(s0) + 300c5ba: 4785 li a5,1 + 300c5bc: 00f70763 beq a4,a5,300c5ca + 300c5c0: fcb44703 lbu a4,-53(s0) + 300c5c4: 4789 li a5,2 + 300c5c6: 08f71363 bne a4,a5,300c64c + 300c5ca: fe340793 addi a5,s0,-29 + 300c5ce: 863e mv a2,a5 + 300c5d0: 4581 li a1,0 + 300c5d2: fcc42503 lw a0,-52(s0) + 300c5d6: 2ac5 jal ra,300c7c6 + 300c5d8: 87aa mv a5,a0 + 300c5da: fef407a3 sb a5,-17(s0) + 300c5de: fef40783 lb a5,-17(s0) + 300c5e2: e7a9 bnez a5,300c62c + 300c5e4: fe344783 lbu a5,-29(s0) + 300c5e8: 863e mv a2,a5 + 300c5ea: fc442583 lw a1,-60(s0) + 300c5ee: fcc42503 lw a0,-52(s0) + 300c5f2: 39c9 jal ra,300c2c4 + 300c5f4: 87aa mv a5,a0 + 300c5f6: fef41223 sh a5,-28(s0) + 300c5fa: fe445703 lhu a4,-28(s0) + 300c5fe: 10000793 li a5,256 + 300c602: 00e7f663 bgeu a5,a4,300c60e + 300c606: 57fd li a5,-1 + 300c608: fef40723 sb a5,-18(s0) + 300c60c: a039 j 300c61a + 300c60e: fe445783 lhu a5,-28(s0) + 300c612: 9f81 uxtb a5 + 300c614: 17fd addi a5,a5,-1 + 300c616: fef40723 sb a5,-18(s0) + 300c61a: fee44783 lbu a5,-18(s0) + 300c61e: 01079713 slli a4,a5,0x10 + 300c622: 8341 srli a4,a4,0x10 + 300c624: fcc42783 lw a5,-52(s0) + 300c628: 10e79223 sh a4,260(a5) + 300c62c: fef40783 lb a5,-17(s0) + 300c630: 18079463 bnez a5,300c7b8 + 300c634: fee44783 lbu a5,-18(s0) + 300c638: 863e mv a2,a5 + 300c63a: 04600593 li a1,70 + 300c63e: fcc42503 lw a0,-52(s0) + 300c642: 3671 jal ra,300c1ce + 300c644: 87aa mv a5,a0 + 300c646: fef407a3 sb a5,-17(s0) + 300c64a: a2bd j 300c7b8 + 300c64c: fcb44703 lbu a4,-53(s0) + 300c650: 478d li a5,3 + 300c652: 08f71163 bne a4,a5,300c6d4 + 300c656: fef40783 lb a5,-17(s0) + 300c65a: e3b9 bnez a5,300c6a0 + 300c65c: fe340793 addi a5,s0,-29 + 300c660: 863e mv a2,a5 + 300c662: 4581 li a1,0 + 300c664: fcc42503 lw a0,-52(s0) + 300c668: 2ab9 jal ra,300c7c6 + 300c66a: 87aa mv a5,a0 + 300c66c: fef407a3 sb a5,-17(s0) + 300c670: fe344783 lbu a5,-29(s0) + 300c674: 863e mv a2,a5 + 300c676: fc442583 lw a1,-60(s0) + 300c67a: fcc42503 lw a0,-52(s0) + 300c67e: 3199 jal ra,300c2c4 + 300c680: 87aa mv a5,a0 + 300c682: fef41623 sh a5,-20(s0) + 300c686: fec45783 lhu a5,-20(s0) + 300c68a: 853e mv a0,a5 + 300c68c: 3e49 jal ra,300c21e + 300c68e: 87aa mv a5,a0 + 300c690: fef41023 sh a5,-32(s0) + 300c694: fe045703 lhu a4,-32(s0) + 300c698: fcc42783 lw a5,-52(s0) + 300c69c: 10e79223 sh a4,260(a5) + 300c6a0: fef40783 lb a5,-17(s0) + 300c6a4: ef89 bnez a5,300c6be + 300c6a6: fe045783 lhu a5,-32(s0) + 300c6aa: 863e mv a2,a5 + 300c6ac: 05100593 li a1,81 + 300c6b0: fcc42503 lw a0,-52(s0) + 300c6b4: 62d010ef jal ra,300e4e0 + 300c6b8: 87aa mv a5,a0 + 300c6ba: fef407a3 sb a5,-17(s0) + 300c6be: fef40783 lb a5,-17(s0) + 300c6c2: 0e079b63 bnez a5,300c7b8 + 300c6c6: fcc42783 lw a5,-52(s0) + 300c6ca: fc442703 lw a4,-60(s0) + 300c6ce: 10e7a823 sw a4,272(a5) + 300c6d2: a0dd j 300c7b8 + 300c6d4: fcb44703 lbu a4,-53(s0) + 300c6d8: 4791 li a5,4 + 300c6da: 0cf71c63 bne a4,a5,300c7b2 + 300c6de: fd840793 addi a5,s0,-40 + 300c6e2: 85be mv a1,a5 + 300c6e4: fcc42503 lw a0,-52(s0) + 300c6e8: 2649 jal ra,300ca6a + 300c6ea: fe041623 sh zero,-20(s0) + 300c6ee: fdb44783 lbu a5,-37(s0) + 300c6f2: c3a1 beqz a5,300c732 + 300c6f4: fe340793 addi a5,s0,-29 + 300c6f8: 863e mv a2,a5 + 300c6fa: 4581 li a1,0 + 300c6fc: fcc42503 lw a0,-52(s0) + 300c700: 20d9 jal ra,300c7c6 + 300c702: 87aa mv a5,a0 + 300c704: fef407a3 sb a5,-17(s0) + 300c708: fef40783 lb a5,-17(s0) + 300c70c: e39d bnez a5,300c732 + 300c70e: fe040793 addi a5,s0,-32 + 300c712: 863e mv a2,a5 + 300c714: 05100593 li a1,81 + 300c718: fcc42503 lw a0,-52(s0) + 300c71c: 207d jal ra,300c7ca + 300c71e: 87aa mv a5,a0 + 300c720: fef407a3 sb a5,-17(s0) + 300c724: fe045783 lhu a5,-32(s0) + 300c728: 853e mv a0,a5 + 300c72a: 3695 jal ra,300c28e + 300c72c: 87aa mv a5,a0 + 300c72e: fef41623 sh a5,-20(s0) + 300c732: fef40783 lb a5,-17(s0) + 300c736: eb99 bnez a5,300c74c + 300c738: fe340793 addi a5,s0,-29 + 300c73c: 863e mv a2,a5 + 300c73e: 4585 li a1,1 + 300c740: fcc42503 lw a0,-52(s0) + 300c744: 2049 jal ra,300c7c6 + 300c746: 87aa mv a5,a0 + 300c748: fef407a3 sb a5,-17(s0) + 300c74c: fef40783 lb a5,-17(s0) + 300c750: e7a5 bnez a5,300c7b8 + 300c752: fe344783 lbu a5,-29(s0) + 300c756: 863e mv a2,a5 + 300c758: fc442583 lw a1,-60(s0) + 300c75c: fcc42503 lw a0,-52(s0) + 300c760: 3695 jal ra,300c2c4 + 300c762: fea42423 sw a0,-24(s0) + 300c766: fec45783 lhu a5,-20(s0) + 300c76a: fe842703 lw a4,-24(s0) + 300c76e: 97ba add a5,a5,a4 + 300c770: fef42423 sw a5,-24(s0) + 300c774: fe842503 lw a0,-24(s0) + 300c778: 345d jal ra,300c21e + 300c77a: 87aa mv a5,a0 + 300c77c: fef41323 sh a5,-26(s0) + 300c780: fef40783 lb a5,-17(s0) + 300c784: ef89 bnez a5,300c79e + 300c786: fe645783 lhu a5,-26(s0) + 300c78a: 863e mv a2,a5 + 300c78c: 07100593 li a1,113 + 300c790: fcc42503 lw a0,-52(s0) + 300c794: 54d010ef jal ra,300e4e0 + 300c798: 87aa mv a5,a0 + 300c79a: fef407a3 sb a5,-17(s0) + 300c79e: fef40783 lb a5,-17(s0) + 300c7a2: eb99 bnez a5,300c7b8 + 300c7a4: fcc42783 lw a5,-52(s0) + 300c7a8: fc442703 lw a4,-60(s0) + 300c7ac: 10e7a423 sw a4,264(a5) + 300c7b0: a021 j 300c7b8 + 300c7b2: 57f1 li a5,-4 + 300c7b4: fef407a3 sb a5,-17(s0) + 300c7b8: fef40783 lb a5,-17(s0) + 300c7bc: 853e mv a0,a5 + 300c7be: 50f2 lw ra,60(sp) + 300c7c0: 5462 lw s0,56(sp) + 300c7c2: 6121 addi sp,sp,64 + 300c7c4: 8082 ret + +0300c7c6 : + 300c7c6: ed0fc06f j 3008e96 + +0300c7ca : + 300c7ca: 66f0106f j 300e638 + +0300c7ce : + 300c7ce: 7179 addi sp,sp,-48 + 300c7d0: d606 sw ra,44(sp) + 300c7d2: d422 sw s0,40(sp) + 300c7d4: 1800 addi s0,sp,48 + 300c7d6: fca42e23 sw a0,-36(s0) + 300c7da: 87ae mv a5,a1 + 300c7dc: fcc42a23 sw a2,-44(s0) + 300c7e0: fcf40da3 sb a5,-37(s0) + 300c7e4: fe0407a3 sb zero,-17(s0) + 300c7e8: fdb44783 lbu a5,-37(s0) + 300c7ec: c789 beqz a5,300c7f6 + 300c7ee: 4705 li a4,1 + 300c7f0: 02e78063 beq a5,a4,300c810 + 300c7f4: a81d j 300c82a + 300c7f6: fee40793 addi a5,s0,-18 + 300c7fa: 863e mv a2,a5 + 300c7fc: 05000593 li a1,80 + 300c800: fdc42503 lw a0,-36(s0) + 300c804: 5df010ef jal ra,300e5e2 + 300c808: 87aa mv a5,a0 + 300c80a: fef407a3 sb a5,-17(s0) + 300c80e: a00d j 300c830 + 300c810: fee40793 addi a5,s0,-18 + 300c814: 863e mv a2,a5 + 300c816: 07000593 li a1,112 + 300c81a: fdc42503 lw a0,-36(s0) + 300c81e: 5c5010ef jal ra,300e5e2 + 300c822: 87aa mv a5,a0 + 300c824: fef407a3 sb a5,-17(s0) + 300c828: a021 j 300c830 + 300c82a: 57f1 li a5,-4 + 300c82c: fef407a3 sb a5,-17(s0) + 300c830: fef40783 lb a5,-17(s0) + 300c834: eb99 bnez a5,300c84a + 300c836: fee44783 lbu a5,-18(s0) + 300c83a: 853e mv a0,a5 + 300c83c: d1bfe0ef jal ra,300b556 + 300c840: 87aa mv a5,a0 + 300c842: 873e mv a4,a5 + 300c844: fd442783 lw a5,-44(s0) + 300c848: a398 sb a4,0(a5) + 300c84a: fef40783 lb a5,-17(s0) + 300c84e: 853e mv a0,a5 + 300c850: 50b2 lw ra,44(sp) + 300c852: 5422 lw s0,40(sp) + 300c854: 6145 addi sp,sp,48 + 300c856: 8082 ret + +0300c858 : + 300c858: 711d addi sp,sp,-96 + 300c85a: ce86 sw ra,92(sp) + 300c85c: cca2 sw s0,88(sp) + 300c85e: 1080 addi s0,sp,96 + 300c860: faa42623 sw a0,-84(s0) + 300c864: fab42423 sw a1,-88(s0) + 300c868: fe0407a3 sb zero,-17(s0) + 300c86c: 7d000793 li a5,2000 + 300c870: faf42e23 sw a5,-68(s0) + 300c874: 77600793 li a5,1910 + 300c878: fef42223 sw a5,-28(s0) + 300c87c: 3c000793 li a5,960 + 300c880: fef42023 sw a5,-32(s0) + 300c884: 29400793 li a5,660 + 300c888: fcf42e23 sw a5,-36(s0) + 300c88c: 24e00793 li a5,590 + 300c890: fcf42c23 sw a5,-40(s0) + 300c894: 2b200793 li a5,690 + 300c898: fcf42a23 sw a5,-44(s0) + 300c89c: 29400793 li a5,660 + 300c8a0: fcf42823 sw a5,-48(s0) + 300c8a4: 22600793 li a5,550 + 300c8a8: fcf42623 sw a5,-52(s0) + 300c8ac: fa042c23 sw zero,-72(s0) + 300c8b0: fc042423 sw zero,-56(s0) + 300c8b4: fe442703 lw a4,-28(s0) + 300c8b8: fe042783 lw a5,-32(s0) + 300c8bc: 97ba add a5,a5,a4 + 300c8be: fa842703 lw a4,-88(s0) + 300c8c2: 40f707b3 sub a5,a4,a5 + 300c8c6: fef42423 sw a5,-24(s0) + 300c8ca: fc040793 addi a5,s0,-64 + 300c8ce: 85be mv a1,a5 + 300c8d0: fac42503 lw a0,-84(s0) + 300c8d4: 2a59 jal ra,300ca6a + 300c8d6: 87aa mv a5,a0 + 300c8d8: fef407a3 sb a5,-17(s0) + 300c8dc: fef40783 lb a5,-17(s0) + 300c8e0: e7f5 bnez a5,300c9cc + 300c8e2: fc044783 lbu a5,-64(s0) + 300c8e6: e799 bnez a5,300c8f4 + 300c8e8: fc144783 lbu a5,-63(s0) + 300c8ec: e781 bnez a5,300c8f4 + 300c8ee: fc244783 lbu a5,-62(s0) + 300c8f2: cfe9 beqz a5,300c9cc + 300c8f4: fbc40793 addi a5,s0,-68 + 300c8f8: 863e mv a2,a5 + 300c8fa: 4589 li a1,2 + 300c8fc: fac42503 lw a0,-84(s0) + 300c900: 3c71 jal ra,300c39c + 300c902: 87aa mv a5,a0 + 300c904: fef407a3 sb a5,-17(s0) + 300c908: fef40783 lb a5,-17(s0) + 300c90c: c781 beqz a5,300c914 + 300c90e: fef40783 lb a5,-17(s0) + 300c912: a2b9 j 300ca60 + 300c914: fc044783 lbu a5,-64(s0) + 300c918: cb95 beqz a5,300c94c + 300c91a: fbc42783 lw a5,-68(s0) + 300c91e: fd842703 lw a4,-40(s0) + 300c922: 97ba add a5,a5,a4 + 300c924: fcf42423 sw a5,-56(s0) + 300c928: fc842703 lw a4,-56(s0) + 300c92c: fe842783 lw a5,-24(s0) + 300c930: 00f77b63 bgeu a4,a5,300c946 + 300c934: fe842703 lw a4,-24(s0) + 300c938: fc842783 lw a5,-56(s0) + 300c93c: 40f707b3 sub a5,a4,a5 + 300c940: fef42423 sw a5,-24(s0) + 300c944: a021 j 300c94c + 300c946: 57f1 li a5,-4 + 300c948: fef407a3 sb a5,-17(s0) + 300c94c: fef40783 lb a5,-17(s0) + 300c950: c781 beqz a5,300c958 + 300c952: fef40783 lb a5,-17(s0) + 300c956: a229 j 300ca60 + 300c958: fc244783 lbu a5,-62(s0) + 300c95c: cf85 beqz a5,300c994 + 300c95e: fbc42703 lw a4,-68(s0) + 300c962: fd442783 lw a5,-44(s0) + 300c966: 97ba add a5,a5,a4 + 300c968: 0786 slli a5,a5,0x1 + 300c96a: fcf42423 sw a5,-56(s0) + 300c96e: fc842703 lw a4,-56(s0) + 300c972: fe842783 lw a5,-24(s0) + 300c976: 00f77b63 bgeu a4,a5,300c98c + 300c97a: fe842703 lw a4,-24(s0) + 300c97e: fc842783 lw a5,-56(s0) + 300c982: 40f707b3 sub a5,a4,a5 + 300c986: fef42423 sw a5,-24(s0) + 300c98a: a089 j 300c9cc + 300c98c: 57f1 li a5,-4 + 300c98e: fef407a3 sb a5,-17(s0) + 300c992: a82d j 300c9cc + 300c994: fc144783 lbu a5,-63(s0) + 300c998: cb95 beqz a5,300c9cc + 300c99a: fbc42783 lw a5,-68(s0) + 300c99e: fdc42703 lw a4,-36(s0) + 300c9a2: 97ba add a5,a5,a4 + 300c9a4: fcf42423 sw a5,-56(s0) + 300c9a8: fc842703 lw a4,-56(s0) + 300c9ac: fe842783 lw a5,-24(s0) + 300c9b0: 00f77b63 bgeu a4,a5,300c9c6 + 300c9b4: fe842703 lw a4,-24(s0) + 300c9b8: fc842783 lw a5,-56(s0) + 300c9bc: 40f707b3 sub a5,a4,a5 + 300c9c0: fef42423 sw a5,-24(s0) + 300c9c4: a021 j 300c9cc + 300c9c6: 57f1 li a5,-4 + 300c9c8: fef407a3 sb a5,-17(s0) + 300c9cc: fef40783 lb a5,-17(s0) + 300c9d0: c781 beqz a5,300c9d8 + 300c9d2: fef40783 lb a5,-17(s0) + 300c9d6: a069 j 300ca60 + 300c9d8: fc344783 lbu a5,-61(s0) + 300c9dc: c7a1 beqz a5,300ca24 + 300c9de: fb840793 addi a5,s0,-72 + 300c9e2: 863e mv a2,a5 + 300c9e4: 458d li a1,3 + 300c9e6: fac42503 lw a0,-84(s0) + 300c9ea: 3a4d jal ra,300c39c + 300c9ec: 87aa mv a5,a0 + 300c9ee: fef407a3 sb a5,-17(s0) + 300c9f2: fb842783 lw a5,-72(s0) + 300c9f6: fd042703 lw a4,-48(s0) + 300c9fa: 97ba add a5,a5,a4 + 300c9fc: fcf42423 sw a5,-56(s0) + 300ca00: fc842703 lw a4,-56(s0) + 300ca04: fe842783 lw a5,-24(s0) + 300ca08: 00f77b63 bgeu a4,a5,300ca1e + 300ca0c: fe842703 lw a4,-24(s0) + 300ca10: fc842783 lw a5,-56(s0) + 300ca14: 40f707b3 sub a5,a4,a5 + 300ca18: fef42423 sw a5,-24(s0) + 300ca1c: a021 j 300ca24 + 300ca1e: 57f1 li a5,-4 + 300ca20: fef407a3 sb a5,-17(s0) + 300ca24: fef40783 lb a5,-17(s0) + 300ca28: eb95 bnez a5,300ca5c + 300ca2a: fc444783 lbu a5,-60(s0) + 300ca2e: c79d beqz a5,300ca5c + 300ca30: fe842703 lw a4,-24(s0) + 300ca34: fcc42783 lw a5,-52(s0) + 300ca38: 40f707b3 sub a5,a4,a5 + 300ca3c: fef42423 sw a5,-24(s0) + 300ca40: fe842603 lw a2,-24(s0) + 300ca44: 4591 li a1,4 + 300ca46: fac42503 lw a0,-84(s0) + 300ca4a: 36b1 jal ra,300c596 + 300ca4c: 87aa mv a5,a0 + 300ca4e: fef407a3 sb a5,-17(s0) + 300ca52: fac42783 lw a5,-84(s0) + 300ca56: fa842703 lw a4,-88(s0) + 300ca5a: c7d8 sw a4,12(a5) + 300ca5c: fef40783 lb a5,-17(s0) + 300ca60: 853e mv a0,a5 + 300ca62: 40f6 lw ra,92(sp) + 300ca64: 4466 lw s0,88(sp) + 300ca66: 6125 addi sp,sp,96 + 300ca68: 8082 ret + +0300ca6a : + 300ca6a: eb0fc06f j 300911a + +0300ca6e : + 300ca6e: 711d addi sp,sp,-96 + 300ca70: ce86 sw ra,92(sp) + 300ca72: cca2 sw s0,88(sp) + 300ca74: 1080 addi s0,sp,96 + 300ca76: faa42623 sw a0,-84(s0) + 300ca7a: fab42423 sw a1,-88(s0) + 300ca7e: fe0407a3 sb zero,-17(s0) + 300ca82: 7d000793 li a5,2000 + 300ca86: fcf42023 sw a5,-64(s0) + 300ca8a: 77600793 li a5,1910 + 300ca8e: fef42423 sw a5,-24(s0) + 300ca92: 3c000793 li a5,960 + 300ca96: fef42223 sw a5,-28(s0) + 300ca9a: 29400793 li a5,660 + 300ca9e: fef42023 sw a5,-32(s0) + 300caa2: 24e00793 li a5,590 + 300caa6: fcf42e23 sw a5,-36(s0) + 300caaa: 2b200793 li a5,690 + 300caae: fcf42c23 sw a5,-40(s0) + 300cab2: 29400793 li a5,660 + 300cab6: fcf42a23 sw a5,-44(s0) + 300caba: 22600793 li a5,550 + 300cabe: fcf42823 sw a5,-48(s0) + 300cac2: fa042e23 sw zero,-68(s0) + 300cac6: fe842703 lw a4,-24(s0) + 300caca: fe442783 lw a5,-28(s0) + 300cace: 973e add a4,a4,a5 + 300cad0: fa842783 lw a5,-88(s0) + 300cad4: c398 sw a4,0(a5) + 300cad6: fc840793 addi a5,s0,-56 + 300cada: 85be mv a1,a5 + 300cadc: fac42503 lw a0,-84(s0) + 300cae0: 3769 jal ra,300ca6a + 300cae2: 87aa mv a5,a0 + 300cae4: fef407a3 sb a5,-17(s0) + 300cae8: fef40783 lb a5,-17(s0) + 300caec: c781 beqz a5,300caf4 + 300caee: fef40783 lb a5,-17(s0) + 300caf2: aa09 j 300cc04 + 300caf4: fc844783 lbu a5,-56(s0) + 300caf8: e799 bnez a5,300cb06 + 300cafa: fc944783 lbu a5,-55(s0) + 300cafe: e781 bnez a5,300cb06 + 300cb00: fca44783 lbu a5,-54(s0) + 300cb04: cfad beqz a5,300cb7e + 300cb06: fc040793 addi a5,s0,-64 + 300cb0a: 863e mv a2,a5 + 300cb0c: 4589 li a1,2 + 300cb0e: fac42503 lw a0,-84(s0) + 300cb12: 28f5 jal ra,300cc0e + 300cb14: 87aa mv a5,a0 + 300cb16: fef407a3 sb a5,-17(s0) + 300cb1a: fef40783 lb a5,-17(s0) + 300cb1e: e3a5 bnez a5,300cb7e + 300cb20: fc844783 lbu a5,-56(s0) + 300cb24: cf89 beqz a5,300cb3e + 300cb26: fa842783 lw a5,-88(s0) + 300cb2a: 4398 lw a4,0(a5) + 300cb2c: fc042683 lw a3,-64(s0) + 300cb30: fdc42783 lw a5,-36(s0) + 300cb34: 97b6 add a5,a5,a3 + 300cb36: 973e add a4,a4,a5 + 300cb38: fa842783 lw a5,-88(s0) + 300cb3c: c398 sw a4,0(a5) + 300cb3e: fca44783 lbu a5,-54(s0) + 300cb42: cf99 beqz a5,300cb60 + 300cb44: fa842783 lw a5,-88(s0) + 300cb48: 4398 lw a4,0(a5) + 300cb4a: fc042683 lw a3,-64(s0) + 300cb4e: fd842783 lw a5,-40(s0) + 300cb52: 97b6 add a5,a5,a3 + 300cb54: 0786 slli a5,a5,0x1 + 300cb56: 973e add a4,a4,a5 + 300cb58: fa842783 lw a5,-88(s0) + 300cb5c: c398 sw a4,0(a5) + 300cb5e: a005 j 300cb7e + 300cb60: fc944783 lbu a5,-55(s0) + 300cb64: cf89 beqz a5,300cb7e + 300cb66: fa842783 lw a5,-88(s0) + 300cb6a: 4398 lw a4,0(a5) + 300cb6c: fc042683 lw a3,-64(s0) + 300cb70: fe042783 lw a5,-32(s0) + 300cb74: 97b6 add a5,a5,a3 + 300cb76: 973e add a4,a4,a5 + 300cb78: fa842783 lw a5,-88(s0) + 300cb7c: c398 sw a4,0(a5) + 300cb7e: fef40783 lb a5,-17(s0) + 300cb82: eb95 bnez a5,300cbb6 + 300cb84: fcb44783 lbu a5,-53(s0) + 300cb88: c79d beqz a5,300cbb6 + 300cb8a: fbc40793 addi a5,s0,-68 + 300cb8e: 863e mv a2,a5 + 300cb90: 458d li a1,3 + 300cb92: fac42503 lw a0,-84(s0) + 300cb96: 28a5 jal ra,300cc0e + 300cb98: 87aa mv a5,a0 + 300cb9a: fef407a3 sb a5,-17(s0) + 300cb9e: fa842783 lw a5,-88(s0) + 300cba2: 4398 lw a4,0(a5) + 300cba4: fbc42683 lw a3,-68(s0) + 300cba8: fd442783 lw a5,-44(s0) + 300cbac: 97b6 add a5,a5,a3 + 300cbae: 973e add a4,a4,a5 + 300cbb0: fa842783 lw a5,-88(s0) + 300cbb4: c398 sw a4,0(a5) + 300cbb6: fef40783 lb a5,-17(s0) + 300cbba: eb95 bnez a5,300cbee + 300cbbc: fcc44783 lbu a5,-52(s0) + 300cbc0: c79d beqz a5,300cbee + 300cbc2: fc440793 addi a5,s0,-60 + 300cbc6: 863e mv a2,a5 + 300cbc8: 4591 li a1,4 + 300cbca: fac42503 lw a0,-84(s0) + 300cbce: 2081 jal ra,300cc0e + 300cbd0: 87aa mv a5,a0 + 300cbd2: fef407a3 sb a5,-17(s0) + 300cbd6: fa842783 lw a5,-88(s0) + 300cbda: 4398 lw a4,0(a5) + 300cbdc: fc442683 lw a3,-60(s0) + 300cbe0: fd042783 lw a5,-48(s0) + 300cbe4: 97b6 add a5,a5,a3 + 300cbe6: 973e add a4,a4,a5 + 300cbe8: fa842783 lw a5,-88(s0) + 300cbec: c398 sw a4,0(a5) + 300cbee: fef40783 lb a5,-17(s0) + 300cbf2: e799 bnez a5,300cc00 + 300cbf4: fa842783 lw a5,-88(s0) + 300cbf8: 4398 lw a4,0(a5) + 300cbfa: fac42783 lw a5,-84(s0) + 300cbfe: c7d8 sw a4,12(a5) + 300cc00: fef40783 lb a5,-17(s0) + 300cc04: 853e mv a0,a5 + 300cc06: 40f6 lw ra,92(sp) + 300cc08: 4466 lw s0,88(sp) + 300cc0a: 6125 addi sp,sp,96 + 300cc0c: 8082 ret + +0300cc0e : + 300cc0e: f8eff06f j 300c39c + +0300cc12 : + 300cc12: 7139 addi sp,sp,-64 + 300cc14: de06 sw ra,60(sp) + 300cc16: dc22 sw s0,56(sp) + 300cc18: 0080 addi s0,sp,64 + 300cc1a: fca42623 sw a0,-52(s0) + 300cc1e: fcb42423 sw a1,-56(s0) + 300cc22: fe0407a3 sb zero,-17(s0) + 300cc26: fe042223 sw zero,-28(s0) + 300cc2a: a49d j 300ce90 + 300cc2c: fe442783 lw a5,-28(s0) + 300cc30: fc842703 lw a4,-56(s0) + 300cc34: 97ba add a5,a5,a4 + 300cc36: 239c lbu a5,0(a5) + 300cc38: fef401a3 sb a5,-29(s0) + 300cc3c: fe442783 lw a5,-28(s0) + 300cc40: 0785 addi a5,a5,1 + 300cc42: fef42223 sw a5,-28(s0) + 300cc46: fe344703 lbu a4,-29(s0) + 300cc4a: 0ff00793 li a5,255 + 300cc4e: 1af71c63 bne a4,a5,300ce06 + 300cc52: fe442783 lw a5,-28(s0) + 300cc56: fc842703 lw a4,-56(s0) + 300cc5a: 97ba add a5,a5,a4 + 300cc5c: 239c lbu a5,0(a5) + 300cc5e: fef400a3 sb a5,-31(s0) + 300cc62: fe442783 lw a5,-28(s0) + 300cc66: 0785 addi a5,a5,1 + 300cc68: fef42223 sw a5,-28(s0) + 300cc6c: fe144783 lbu a5,-31(s0) + 300cc70: 4705 li a4,1 + 300cc72: 06e78c63 beq a5,a4,300ccea + 300cc76: 4705 li a4,1 + 300cc78: 00f74463 blt a4,a5,300cc80 + 300cc7c: cb89 beqz a5,300cc8e + 300cc7e: a241 j 300cdfe + 300cc80: 4709 li a4,2 + 300cc82: 0ce78263 beq a5,a4,300cd46 + 300cc86: 470d li a4,3 + 300cc88: 10e78d63 beq a5,a4,300cda2 + 300cc8c: aa8d j 300cdfe + 300cc8e: fe442783 lw a5,-28(s0) + 300cc92: fc842703 lw a4,-56(s0) + 300cc96: 97ba add a5,a5,a4 + 300cc98: 239c lbu a5,0(a5) + 300cc9a: fef40023 sb a5,-32(s0) + 300cc9e: fe442783 lw a5,-28(s0) + 300cca2: 0785 addi a5,a5,1 + 300cca4: fef42223 sw a5,-28(s0) + 300cca8: fe442783 lw a5,-28(s0) + 300ccac: fc842703 lw a4,-56(s0) + 300ccb0: 97ba add a5,a5,a4 + 300ccb2: 239c lbu a5,0(a5) + 300ccb4: fcf40fa3 sb a5,-33(s0) + 300ccb8: fe442783 lw a5,-28(s0) + 300ccbc: 0785 addi a5,a5,1 + 300ccbe: fef42223 sw a5,-28(s0) + 300ccc2: fe044783 lbu a5,-32(s0) + 300ccc6: 9fa1 uxth a5 + 300ccc8: 07a2 slli a5,a5,0x8 + 300ccca: 01079713 slli a4,a5,0x10 + 300ccce: 8341 srli a4,a4,0x10 + 300ccd0: fdf44783 lbu a5,-33(s0) + 300ccd4: 9fa1 uxth a5 + 300ccd6: 97ba add a5,a5,a4 + 300ccd8: fcf41e23 sh a5,-36(s0) + 300ccdc: fcc42783 lw a5,-52(s0) + 300cce0: fdc45703 lhu a4,-36(s0) + 300cce4: 16e79023 sh a4,352(a5) + 300cce8: a265 j 300ce90 + 300ccea: fe442783 lw a5,-28(s0) + 300ccee: fc842703 lw a4,-56(s0) + 300ccf2: 97ba add a5,a5,a4 + 300ccf4: 239c lbu a5,0(a5) + 300ccf6: fef40023 sb a5,-32(s0) + 300ccfa: fe442783 lw a5,-28(s0) + 300ccfe: 0785 addi a5,a5,1 + 300cd00: fef42223 sw a5,-28(s0) + 300cd04: fe442783 lw a5,-28(s0) + 300cd08: fc842703 lw a4,-56(s0) + 300cd0c: 97ba add a5,a5,a4 + 300cd0e: 239c lbu a5,0(a5) + 300cd10: fcf40fa3 sb a5,-33(s0) + 300cd14: fe442783 lw a5,-28(s0) + 300cd18: 0785 addi a5,a5,1 + 300cd1a: fef42223 sw a5,-28(s0) + 300cd1e: fe044783 lbu a5,-32(s0) + 300cd22: 9fa1 uxth a5 + 300cd24: 07a2 slli a5,a5,0x8 + 300cd26: 01079713 slli a4,a5,0x10 + 300cd2a: 8341 srli a4,a4,0x10 + 300cd2c: fdf44783 lbu a5,-33(s0) + 300cd30: 9fa1 uxth a5 + 300cd32: 97ba add a5,a5,a4 + 300cd34: fcf41e23 sh a5,-36(s0) + 300cd38: fcc42783 lw a5,-52(s0) + 300cd3c: fdc45703 lhu a4,-36(s0) + 300cd40: 16e79123 sh a4,354(a5) + 300cd44: a2b1 j 300ce90 + 300cd46: fe442783 lw a5,-28(s0) + 300cd4a: fc842703 lw a4,-56(s0) + 300cd4e: 97ba add a5,a5,a4 + 300cd50: 239c lbu a5,0(a5) + 300cd52: fef40023 sb a5,-32(s0) + 300cd56: fe442783 lw a5,-28(s0) + 300cd5a: 0785 addi a5,a5,1 + 300cd5c: fef42223 sw a5,-28(s0) + 300cd60: fe442783 lw a5,-28(s0) + 300cd64: fc842703 lw a4,-56(s0) + 300cd68: 97ba add a5,a5,a4 + 300cd6a: 239c lbu a5,0(a5) + 300cd6c: fcf40fa3 sb a5,-33(s0) + 300cd70: fe442783 lw a5,-28(s0) + 300cd74: 0785 addi a5,a5,1 + 300cd76: fef42223 sw a5,-28(s0) + 300cd7a: fe044783 lbu a5,-32(s0) + 300cd7e: 9fa1 uxth a5 + 300cd80: 07a2 slli a5,a5,0x8 + 300cd82: 01079713 slli a4,a5,0x10 + 300cd86: 8341 srli a4,a4,0x10 + 300cd88: fdf44783 lbu a5,-33(s0) + 300cd8c: 9fa1 uxth a5 + 300cd8e: 97ba add a5,a5,a4 + 300cd90: fcf41e23 sh a5,-36(s0) + 300cd94: fcc42783 lw a5,-52(s0) + 300cd98: fdc45703 lhu a4,-36(s0) + 300cd9c: 16e79223 sh a4,356(a5) + 300cda0: a8c5 j 300ce90 + 300cda2: fe442783 lw a5,-28(s0) + 300cda6: fc842703 lw a4,-56(s0) + 300cdaa: 97ba add a5,a5,a4 + 300cdac: 239c lbu a5,0(a5) + 300cdae: fef40023 sb a5,-32(s0) + 300cdb2: fe442783 lw a5,-28(s0) + 300cdb6: 0785 addi a5,a5,1 + 300cdb8: fef42223 sw a5,-28(s0) + 300cdbc: fe442783 lw a5,-28(s0) + 300cdc0: fc842703 lw a4,-56(s0) + 300cdc4: 97ba add a5,a5,a4 + 300cdc6: 239c lbu a5,0(a5) + 300cdc8: fcf40fa3 sb a5,-33(s0) + 300cdcc: fe442783 lw a5,-28(s0) + 300cdd0: 0785 addi a5,a5,1 + 300cdd2: fef42223 sw a5,-28(s0) + 300cdd6: fe044783 lbu a5,-32(s0) + 300cdda: 9fa1 uxth a5 + 300cddc: 07a2 slli a5,a5,0x8 + 300cdde: 01079713 slli a4,a5,0x10 + 300cde2: 8341 srli a4,a4,0x10 + 300cde4: fdf44783 lbu a5,-33(s0) + 300cde8: 9fa1 uxth a5 + 300cdea: 97ba add a5,a5,a4 + 300cdec: fcf41e23 sh a5,-36(s0) + 300cdf0: fcc42783 lw a5,-52(s0) + 300cdf4: fdc45703 lhu a4,-36(s0) + 300cdf8: 16e79423 sh a4,360(a5) + 300cdfc: a851 j 300ce90 + 300cdfe: 57f1 li a5,-4 + 300ce00: fef407a3 sb a5,-17(s0) + 300ce04: a071 j 300ce90 + 300ce06: fe344703 lbu a4,-29(s0) + 300ce0a: 4791 li a5,4 + 300ce0c: 06e7ef63 bltu a5,a4,300ce8a + 300ce10: fe442783 lw a5,-28(s0) + 300ce14: fc842703 lw a4,-56(s0) + 300ce18: 97ba add a5,a5,a4 + 300ce1a: 239c lbu a5,0(a5) + 300ce1c: fef40123 sb a5,-30(s0) + 300ce20: fe442783 lw a5,-28(s0) + 300ce24: 0785 addi a5,a5,1 + 300ce26: fef42223 sw a5,-28(s0) + 300ce2a: fe042423 sw zero,-24(s0) + 300ce2e: a805 j 300ce5e + 300ce30: fe442783 lw a5,-28(s0) + 300ce34: fc842703 lw a4,-56(s0) + 300ce38: 97ba add a5,a5,a4 + 300ce3a: 2398 lbu a4,0(a5) + 300ce3c: fe842783 lw a5,-24(s0) + 300ce40: ff040693 addi a3,s0,-16 + 300ce44: 97b6 add a5,a5,a3 + 300ce46: fee78423 sb a4,-24(a5) + 300ce4a: fe442783 lw a5,-28(s0) + 300ce4e: 0785 addi a5,a5,1 + 300ce50: fef42223 sw a5,-28(s0) + 300ce54: fe842783 lw a5,-24(s0) + 300ce58: 0785 addi a5,a5,1 + 300ce5a: fef42423 sw a5,-24(s0) + 300ce5e: fe344783 lbu a5,-29(s0) + 300ce62: fe842703 lw a4,-24(s0) + 300ce66: fcf745e3 blt a4,a5,300ce30 + 300ce6a: fe344683 lbu a3,-29(s0) + 300ce6e: fd840713 addi a4,s0,-40 + 300ce72: fe244783 lbu a5,-30(s0) + 300ce76: 863a mv a2,a4 + 300ce78: 85be mv a1,a5 + 300ce7a: fcc42503 lw a0,-52(s0) + 300ce7e: 522010ef jal ra,300e3a0 + 300ce82: 87aa mv a5,a0 + 300ce84: fef407a3 sb a5,-17(s0) + 300ce88: a021 j 300ce90 + 300ce8a: 57f1 li a5,-4 + 300ce8c: fef407a3 sb a5,-17(s0) + 300ce90: fe442783 lw a5,-28(s0) + 300ce94: fc842703 lw a4,-56(s0) + 300ce98: 97ba add a5,a5,a4 + 300ce9a: 239c lbu a5,0(a5) + 300ce9c: c789 beqz a5,300cea6 + 300ce9e: fef40783 lb a5,-17(s0) + 300cea2: d80785e3 beqz a5,300cc2c + 300cea6: fef40783 lb a5,-17(s0) + 300ceaa: 853e mv a0,a5 + 300ceac: 50f2 lw ra,60(sp) + 300ceae: 5462 lw s0,56(sp) + 300ceb0: 6121 addi sp,sp,64 + 300ceb2: 8082 ret + +0300ceb4 : + 300ceb4: 7179 addi sp,sp,-48 + 300ceb6: d606 sw ra,44(sp) + 300ceb8: d422 sw s0,40(sp) + 300ceba: 1800 addi s0,sp,48 + 300cebc: fca42e23 sw a0,-36(s0) + 300cec0: fcb42c23 sw a1,-40(s0) + 300cec4: fcc42a23 sw a2,-44(s0) + 300cec8: fe0407a3 sb zero,-17(s0) + 300cecc: fd442783 lw a5,-44(s0) + 300ced0: 0007a023 sw zero,0(a5) + 300ced4: fe340793 addi a5,s0,-29 + 300ced8: 85be mv a1,a5 + 300ceda: fdc42503 lw a0,-36(s0) + 300cede: ba0fc0ef jal ra,300927e + 300cee2: 87aa mv a5,a0 + 300cee4: fef407a3 sb a5,-17(s0) + 300cee8: fef40783 lb a5,-17(s0) + 300ceec: ef85 bnez a5,300cf24 + 300ceee: fe344783 lbu a5,-29(s0) + 300cef2: cb8d beqz a5,300cf24 + 300cef4: fdc42783 lw a5,-36(s0) + 300cef8: 4f9c lw a5,24(a5) + 300cefa: fef42423 sw a5,-24(s0) + 300cefe: fd842783 lw a5,-40(s0) + 300cf02: 2bde lhu a5,20(a5) + 300cf04: 873e mv a4,a5 + 300cf06: fe842783 lw a5,-24(s0) + 300cf0a: 02e787b3 mul a5,a5,a4 + 300cf0e: fef42223 sw a5,-28(s0) + 300cf12: fe442783 lw a5,-28(s0) + 300cf16: 08078793 addi a5,a5,128 + 300cf1a: 0087d713 srli a4,a5,0x8 + 300cf1e: fd442783 lw a5,-44(s0) + 300cf22: c398 sw a4,0(a5) + 300cf24: fef40783 lb a5,-17(s0) + 300cf28: 853e mv a0,a5 + 300cf2a: 50b2 lw ra,44(sp) + 300cf2c: 5422 lw s0,40(sp) + 300cf2e: 6145 addi sp,sp,48 + 300cf30: 8082 ret + +0300cf32 : + 300cf32: 7179 addi sp,sp,-48 + 300cf34: d606 sw ra,44(sp) + 300cf36: d422 sw s0,40(sp) + 300cf38: 1800 addi s0,sp,48 + 300cf3a: fca42e23 sw a0,-36(s0) + 300cf3e: fcb42c23 sw a1,-40(s0) + 300cf42: fcc42a23 sw a2,-44(s0) + 300cf46: fe0407a3 sb zero,-17(s0) + 300cf4a: fd842783 lw a5,-40(s0) + 300cf4e: 47d8 lw a4,12(a5) + 300cf50: fd442783 lw a5,-44(s0) + 300cf54: c398 sw a4,0(a5) + 300cf56: fe840793 addi a5,s0,-24 + 300cf5a: 863e mv a2,a5 + 300cf5c: fd842583 lw a1,-40(s0) + 300cf60: fdc42503 lw a0,-36(s0) + 300cf64: 3f81 jal ra,300ceb4 + 300cf66: 87aa mv a5,a0 + 300cf68: fef407a3 sb a5,-17(s0) + 300cf6c: fef40783 lb a5,-17(s0) + 300cf70: eb91 bnez a5,300cf84 + 300cf72: fd442783 lw a5,-44(s0) + 300cf76: 4398 lw a4,0(a5) + 300cf78: fe842783 lw a5,-24(s0) + 300cf7c: 973e add a4,a4,a5 + 300cf7e: fd442783 lw a5,-44(s0) + 300cf82: c398 sw a4,0(a5) + 300cf84: fef40783 lb a5,-17(s0) + 300cf88: 853e mv a0,a5 + 300cf8a: 50b2 lw ra,44(sp) + 300cf8c: 5422 lw s0,40(sp) + 300cf8e: 6145 addi sp,sp,48 + 300cf90: 8082 ret + +0300cf92 : + 300cf92: 7179 addi sp,sp,-48 + 300cf94: d622 sw s0,44(sp) + 300cf96: d426 sw s1,40(sp) + 300cf98: 1800 addi s0,sp,48 + 300cf9a: 84aa mv s1,a0 + 300cf9c: fcb42e23 sw a1,-36(s0) + 300cfa0: fcc42c23 sw a2,-40(s0) + 300cfa4: fcd42a23 sw a3,-44(s0) + 300cfa8: fce42823 sw a4,-48(s0) + 300cfac: fe0401a3 sb zero,-29(s0) + 300cfb0: fe042623 sw zero,-20(s0) + 300cfb4: fe042423 sw zero,-24(s0) + 300cfb8: fe042223 sw zero,-28(s0) + 300cfbc: fe042223 sw zero,-28(s0) + 300cfc0: a025 j 300cfe8 + 300cfc2: fe442783 lw a5,-28(s0) + 300cfc6: 078a slli a5,a5,0x2 + 300cfc8: 97a6 add a5,a5,s1 + 300cfca: 439c lw a5,0(a5) + 300cfcc: fd842703 lw a4,-40(s0) + 300cfd0: 00e7e763 bltu a5,a4,300cfde + 300cfd4: fe442783 lw a5,-28(s0) + 300cfd8: fef42423 sw a5,-24(s0) + 300cfdc: a821 j 300cff4 + 300cfde: fe442783 lw a5,-28(s0) + 300cfe2: 0785 addi a5,a5,1 + 300cfe4: fef42223 sw a5,-28(s0) + 300cfe8: fe442783 lw a5,-28(s0) + 300cfec: fdc42703 lw a4,-36(s0) + 300cff0: fce7e9e3 bltu a5,a4,300cfc2 + 300cff4: fe442783 lw a5,-28(s0) + 300cff8: fdc42703 lw a4,-36(s0) + 300cffc: 00f71c63 bne a4,a5,300d014 + 300d000: fdc42783 lw a5,-36(s0) + 300d004: 17fd addi a5,a5,-1 + 300d006: fef42423 sw a5,-24(s0) + 300d00a: fe842783 lw a5,-24(s0) + 300d00e: fef42623 sw a5,-20(s0) + 300d012: a821 j 300d02a + 300d014: fe842783 lw a5,-24(s0) + 300d018: e781 bnez a5,300d020 + 300d01a: fe042623 sw zero,-20(s0) + 300d01e: a031 j 300d02a + 300d020: fe842783 lw a5,-24(s0) + 300d024: 17fd addi a5,a5,-1 + 300d026: fef42623 sw a5,-20(s0) + 300d02a: fec42703 lw a4,-20(s0) + 300d02e: fd442783 lw a5,-44(s0) + 300d032: c398 sw a4,0(a5) + 300d034: fe842703 lw a4,-24(s0) + 300d038: fd042783 lw a5,-48(s0) + 300d03c: c398 sw a4,0(a5) + 300d03e: fe340783 lb a5,-29(s0) + 300d042: 853e mv a0,a5 + 300d044: 5432 lw s0,44(sp) + 300d046: 54a2 lw s1,40(sp) + 300d048: 6145 addi sp,sp,48 + 300d04a: 8082 ret + +0300d04c : + 300d04c: 7111 addi sp,sp,-256 + 300d04e: df86 sw ra,252(sp) + 300d050: dda2 sw s0,248(sp) + 300d052: 0200 addi s0,sp,256 + 300d054: f4a42623 sw a0,-180(s0) + 300d058: f4b42423 sw a1,-184(s0) + 300d05c: f4c42223 sw a2,-188(s0) + 300d060: fe0405a3 sb zero,-21(s0) + 300d064: f4042c23 sw zero,-168(s0) + 300d068: f4042a23 sw zero,-172(s0) + 300d06c: f5c40793 addi a5,s0,-164 + 300d070: 85be mv a1,a5 + 300d072: f4c42503 lw a0,-180(s0) + 300d076: b33fb0ef jal ra,3008ba8 + 300d07a: 87aa mv a5,a0 + 300d07c: fef405a3 sb a5,-21(s0) + 300d080: f9842783 lw a5,-104(s0) + 300d084: f4842703 lw a4,-184(s0) + 300d088: 00e7e763 bltu a5,a4,300d096 + 300d08c: fb442783 lw a5,-76(s0) + 300d090: fef42623 sw a5,-20(s0) + 300d094: aa21 j 300d1ac + 300d096: fb042783 lw a5,-80(s0) + 300d09a: f4842703 lw a4,-184(s0) + 300d09e: 00f76763 bltu a4,a5,300d0ac + 300d0a2: fcc42783 lw a5,-52(s0) + 300d0a6: fef42623 sw a5,-20(s0) + 300d0aa: a209 j 300d1ac + 300d0ac: f0040793 addi a5,s0,-256 + 300d0b0: f9840713 addi a4,s0,-104 + 300d0b4: 03800693 li a3,56 + 300d0b8: 8636 mv a2,a3 + 300d0ba: 85ba mv a1,a4 + 300d0bc: 853e mv a0,a5 + 300d0be: 06d010ef jal ra,300e92a + 300d0c2: f5440713 addi a4,s0,-172 + 300d0c6: f5840693 addi a3,s0,-168 + 300d0ca: f0040793 addi a5,s0,-256 + 300d0ce: f4842603 lw a2,-184(s0) + 300d0d2: 459d li a1,7 + 300d0d4: 853e mv a0,a5 + 300d0d6: 3d75 jal ra,300cf92 + 300d0d8: f5842703 lw a4,-168(s0) + 300d0dc: f5442783 lw a5,-172(s0) + 300d0e0: 00f71e63 bne a4,a5,300d0fc + 300d0e4: f5842783 lw a5,-168(s0) + 300d0e8: 07c1 addi a5,a5,16 + 300d0ea: 078a slli a5,a5,0x2 + 300d0ec: ff040713 addi a4,s0,-16 + 300d0f0: 97ba add a5,a5,a4 + 300d0f2: f847a783 lw a5,-124(a5) + 300d0f6: fef42623 sw a5,-20(s0) + 300d0fa: a84d j 300d1ac + 300d0fc: f5842783 lw a5,-168(s0) + 300d100: 07b1 addi a5,a5,12 + 300d102: 078a slli a5,a5,0x2 + 300d104: ff040713 addi a4,s0,-16 + 300d108: 97ba add a5,a5,a4 + 300d10a: f787a783 lw a5,-136(a5) + 300d10e: fef42223 sw a5,-28(s0) + 300d112: f5442783 lw a5,-172(s0) + 300d116: 07b1 addi a5,a5,12 + 300d118: 078a slli a5,a5,0x2 + 300d11a: ff040713 addi a4,s0,-16 + 300d11e: 97ba add a5,a5,a4 + 300d120: f787a783 lw a5,-136(a5) + 300d124: fef42023 sw a5,-32(s0) + 300d128: f5842783 lw a5,-168(s0) + 300d12c: 07c1 addi a5,a5,16 + 300d12e: 078a slli a5,a5,0x2 + 300d130: ff040713 addi a4,s0,-16 + 300d134: 97ba add a5,a5,a4 + 300d136: f847a783 lw a5,-124(a5) + 300d13a: fcf42e23 sw a5,-36(s0) + 300d13e: f5442783 lw a5,-172(s0) + 300d142: 07c1 addi a5,a5,16 + 300d144: 078a slli a5,a5,0x2 + 300d146: ff040713 addi a4,s0,-16 + 300d14a: 97ba add a5,a5,a4 + 300d14c: f847a783 lw a5,-124(a5) + 300d150: fcf42c23 sw a5,-40(s0) + 300d154: fe042703 lw a4,-32(s0) + 300d158: fe442783 lw a5,-28(s0) + 300d15c: 04f70463 beq a4,a5,300d1a4 + 300d160: fdc42703 lw a4,-36(s0) + 300d164: fd842783 lw a5,-40(s0) + 300d168: 8f1d sub a4,a4,a5 + 300d16a: fe042683 lw a3,-32(s0) + 300d16e: fe442783 lw a5,-28(s0) + 300d172: 40f687b3 sub a5,a3,a5 + 300d176: 83a1 srli a5,a5,0x8 + 300d178: 02f757b3 divu a5,a4,a5 + 300d17c: fcf42a23 sw a5,-44(s0) + 300d180: fe042703 lw a4,-32(s0) + 300d184: f4842783 lw a5,-184(s0) + 300d188: 40f707b3 sub a5,a4,a5 + 300d18c: 0087d713 srli a4,a5,0x8 + 300d190: fd442783 lw a5,-44(s0) + 300d194: 02f707b3 mul a5,a4,a5 + 300d198: fd842703 lw a4,-40(s0) + 300d19c: 97ba add a5,a5,a4 + 300d19e: fef42623 sw a5,-20(s0) + 300d1a2: a029 j 300d1ac + 300d1a4: fdc42783 lw a5,-36(s0) + 300d1a8: fef42623 sw a5,-20(s0) + 300d1ac: fec42783 lw a5,-20(s0) + 300d1b0: 0107d713 srli a4,a5,0x10 + 300d1b4: f4442783 lw a5,-188(s0) + 300d1b8: c398 sw a4,0(a5) + 300d1ba: feb40783 lb a5,-21(s0) + 300d1be: 853e mv a0,a5 + 300d1c0: 50fe lw ra,252(sp) + 300d1c2: 546e lw s0,248(sp) + 300d1c4: 6111 addi sp,sp,256 + 300d1c6: 8082 ret + +0300d1c8 : + 300d1c8: 7155 addi sp,sp,-208 + 300d1ca: c786 sw ra,204(sp) + 300d1cc: c5a2 sw s0,200(sp) + 300d1ce: 0980 addi s0,sp,208 + 300d1d0: f2a42e23 sw a0,-196(s0) + 300d1d4: f2b42c23 sw a1,-200(s0) + 300d1d8: f2c42a23 sw a2,-204(s0) + 300d1dc: 32000793 li a5,800 + 300d1e0: fcf42423 sw a5,-56(s0) + 300d1e4: 25800793 li a5,600 + 300d1e8: fcf42223 sw a5,-60(s0) + 300d1ec: 001907b7 lui a5,0x190 + 300d1f0: fcf42023 sw a5,-64(s0) + 300d1f4: 6785 lui a5,0x1 + 300d1f6: 25c78793 addi a5,a5,604 # 125c + 300d1fa: faf42e23 sw a5,-68(s0) + 300d1fe: 028f87b7 lui a5,0x28f8 + 300d202: 7ae78793 addi a5,a5,1966 # 28f87ae + 300d206: faf42c23 sw a5,-72(s0) + 300d20a: 67bd lui a5,0xf + 300d20c: faf42a23 sw a5,-76(s0) + 300d210: f0000737 lui a4,0xf0000 + 300d214: fc442783 lw a5,-60(s0) + 300d218: 02f757b3 divu a5,a4,a5 + 300d21c: faf42823 sw a5,-80(s0) + 300d220: 0006a7b7 lui a5,0x6a + 300d224: 99a78793 addi a5,a5,-1638 # 6999a + 300d228: faf42623 sw a5,-84(s0) + 300d22c: 67a1 lui a5,0x8 + 300d22e: faf42423 sw a5,-88(s0) + 300d232: 003207b7 lui a5,0x320 + 300d236: faf42223 sw a5,-92(s0) + 300d23a: 67700793 li a5,1655 + 300d23e: faf42023 sw a5,-96(s0) + 300d242: f8040fa3 sb zero,-97(s0) + 300d246: f3c42783 lw a5,-196(s0) + 300d24a: 4f9c lw a5,24(a5) + 300d24c: f4f42423 sw a5,-184(s0) + 300d250: f3842783 lw a5,-200(s0) + 300d254: 4b98 lw a4,16(a5) + 300d256: 3e800793 li a5,1000 + 300d25a: 02f707b3 mul a5,a4,a5 + 300d25e: 83c1 srli a5,a5,0x10 + 300d260: f8f42c23 sw a5,-104(s0) + 300d264: f4440793 addi a5,s0,-188 + 300d268: 863e mv a2,a5 + 300d26a: f3842583 lw a1,-200(s0) + 300d26e: f3c42503 lw a0,-196(s0) + 300d272: 31c1 jal ra,300cf32 + 300d274: 87aa mv a5,a0 + 300d276: f8f40fa3 sb a5,-97(s0) + 300d27a: f4840793 addi a5,s0,-184 + 300d27e: 863e mv a2,a5 + 300d280: f3842583 lw a1,-200(s0) + 300d284: f3c42503 lw a0,-196(s0) + 300d288: 3135 jal ra,300ceb4 + 300d28a: 87aa mv a5,a0 + 300d28c: f8f40fa3 sb a5,-97(s0) + 300d290: f4442703 lw a4,-188(s0) + 300d294: 3e800793 li a5,1000 + 300d298: 02f707b3 mul a5,a4,a5 + 300d29c: f8f42a23 sw a5,-108(s0) + 300d2a0: f9442703 lw a4,-108(s0) + 300d2a4: 67a1 lui a5,0x8 + 300d2a6: 97ba add a5,a5,a4 + 300d2a8: 83c1 srli a5,a5,0x10 + 300d2aa: f8f42a23 sw a5,-108(s0) + 300d2ae: f4842703 lw a4,-184(s0) + 300d2b2: 3e800793 li a5,1000 + 300d2b6: 02f707b3 mul a5,a4,a5 + 300d2ba: fcf42823 sw a5,-48(s0) + 300d2be: fd042703 lw a4,-48(s0) + 300d2c2: fa442783 lw a5,-92(s0) + 300d2c6: 00e7f663 bgeu a5,a4,300d2d2 + 300d2ca: fa442783 lw a5,-92(s0) + 300d2ce: fcf42823 sw a5,-48(s0) + 300d2d2: f9f40783 lb a5,-97(s0) + 300d2d6: 0e079e63 bnez a5,300d3d2 + 300d2da: f3c42783 lw a5,-196(s0) + 300d2de: 1087a783 lw a5,264(a5) # 8108 + 300d2e2: fef42423 sw a5,-24(s0) + 300d2e6: f3c42783 lw a5,-196(s0) + 300d2ea: 10c7c783 lbu a5,268(a5) + 300d2ee: f8f409a3 sb a5,-109(s0) + 300d2f2: f9344783 lbu a5,-109(s0) + 300d2f6: 863e mv a2,a5 + 300d2f8: fe842583 lw a1,-24(s0) + 300d2fc: f3c42503 lw a0,-196(s0) + 300d300: fc5fe0ef jal ra,300c2c4 + 300d304: f8a42623 sw a0,-116(s0) + 300d308: f3c42783 lw a5,-196(s0) + 300d30c: 1107a783 lw a5,272(a5) + 300d310: fef42223 sw a5,-28(s0) + 300d314: f3c42783 lw a5,-196(s0) + 300d318: 1147c783 lbu a5,276(a5) + 300d31c: f8f405a3 sb a5,-117(s0) + 300d320: f8b44783 lbu a5,-117(s0) + 300d324: 863e mv a2,a5 + 300d326: fe442583 lw a1,-28(s0) + 300d32a: f3c42503 lw a0,-196(s0) + 300d32e: f97fe0ef jal ra,300c2c4 + 300d332: f8a42223 sw a0,-124(s0) + 300d336: 478d li a5,3 + 300d338: fcf42623 sw a5,-52(s0) + 300d33c: f9344703 lbu a4,-109(s0) + 300d340: 47a1 li a5,8 + 300d342: 00f71563 bne a4,a5,300d34c + 300d346: 4789 li a5,2 + 300d348: fcf42623 sw a5,-52(s0) + 300d34c: f8442703 lw a4,-124(s0) + 300d350: f8c42783 lw a5,-116(s0) + 300d354: 973e add a4,a4,a5 + 300d356: fcc42783 lw a5,-52(s0) + 300d35a: 02f707b3 mul a5,a4,a5 + 300d35e: 07ae slli a5,a5,0xb + 300d360: f8f42023 sw a5,-128(s0) + 300d364: f8042783 lw a5,-128(s0) + 300d368: 1f478713 addi a4,a5,500 + 300d36c: 3e800793 li a5,1000 + 300d370: 02f757b3 divu a5,a4,a5 + 300d374: f8f42023 sw a5,-128(s0) + 300d378: f8042703 lw a4,-128(s0) + 300d37c: fa042783 lw a5,-96(s0) + 300d380: 02f707b3 mul a5,a4,a5 + 300d384: f8f42023 sw a5,-128(s0) + 300d388: f8042783 lw a5,-128(s0) + 300d38c: 1f478713 addi a4,a5,500 + 300d390: 3e800793 li a5,1000 + 300d394: 02f757b3 divu a5,a4,a5 + 300d398: f8f42023 sw a5,-128(s0) + 300d39c: f4442783 lw a5,-188(s0) + 300d3a0: 08078793 addi a5,a5,128 + 300d3a4: 83a1 srli a5,a5,0x8 + 300d3a6: f4f42223 sw a5,-188(s0) + 300d3aa: f4442783 lw a5,-188(s0) + 300d3ae: f8042703 lw a4,-128(s0) + 300d3b2: 02f707b3 mul a5,a4,a5 + 300d3b6: fef42623 sw a5,-20(s0) + 300d3ba: fec42783 lw a5,-20(s0) + 300d3be: 08078793 addi a5,a5,128 + 300d3c2: 83a1 srli a5,a5,0x8 + 300d3c4: fef42623 sw a5,-20(s0) + 300d3c8: f4442783 lw a5,-188(s0) + 300d3cc: 07a2 slli a5,a5,0x8 + 300d3ce: f4f42223 sw a5,-188(s0) + 300d3d2: f9f40783 lb a5,-97(s0) + 300d3d6: c781 beqz a5,300d3de + 300d3d8: f9f40783 lb a5,-97(s0) + 300d3dc: ae39 j 300d6fa + 300d3de: f9442783 lw a5,-108(s0) + 300d3e2: ef89 bnez a5,300d3fc + 300d3e4: f3442783 lw a5,-204(s0) + 300d3e8: fb842703 lw a4,-72(s0) + 300d3ec: c398 sw a4,0(a5) + 300d3ee: f3c42783 lw a5,-196(s0) + 300d3f2: fb842703 lw a4,-72(s0) + 300d3f6: 16e7a623 sw a4,364(a5) + 300d3fa: acf5 j 300d6f6 + 300d3fc: fec42783 lw a5,-20(s0) + 300d400: e781 bnez a5,300d408 + 300d402: 4785 li a5,1 + 300d404: fef42623 sw a5,-20(s0) + 300d408: fc842783 lw a5,-56(s0) + 300d40c: f6f42e23 sw a5,-132(s0) + 300d410: f9842783 lw a5,-104(s0) + 300d414: 01079713 slli a4,a5,0x10 + 300d418: f9442783 lw a5,-108(s0) + 300d41c: 02f757b3 divu a5,a4,a5 + 300d420: fef42023 sw a5,-32(s0) + 300d424: fe042703 lw a4,-32(s0) + 300d428: fb042783 lw a5,-80(s0) + 300d42c: 00e7f663 bgeu a5,a4,300d438 + 300d430: fb042783 lw a5,-80(s0) + 300d434: fef42023 sw a5,-32(s0) + 300d438: fe042703 lw a4,-32(s0) + 300d43c: fc442783 lw a5,-60(s0) + 300d440: 02f707b3 mul a5,a4,a5 + 300d444: fef42023 sw a5,-32(s0) + 300d448: fec42703 lw a4,-20(s0) + 300d44c: 47b1 li a5,12 + 300d44e: 02f707b3 mul a5,a4,a5 + 300d452: 853e mv a0,a5 + 300d454: 2c45 jal ra,300d704 + 300d456: 87aa mv a5,a0 + 300d458: 0786 slli a5,a5,0x1 + 300d45a: f6f42c23 sw a5,-136(s0) + 300d45e: f3842783 lw a5,-200(s0) + 300d462: 279e lhu a5,8(a5) + 300d464: 873e mv a4,a5 + 300d466: fac42783 lw a5,-84(s0) + 300d46a: 02e787b3 mul a5,a5,a4 + 300d46e: f6f42a23 sw a5,-140(s0) + 300d472: f9442783 lw a5,-108(s0) + 300d476: 01079713 slli a4,a5,0x10 + 300d47a: fd042783 lw a5,-48(s0) + 300d47e: 0786 slli a5,a5,0x1 + 300d480: 40f707b3 sub a5,a4,a5 + 300d484: 1f478713 addi a4,a5,500 + 300d488: 3e800793 li a5,1000 + 300d48c: 02f757b3 divu a5,a4,a5 + 300d490: f6f42823 sw a5,-144(s0) + 300d494: f9442783 lw a5,-108(s0) + 300d498: 07c2 slli a5,a5,0x10 + 300d49a: 1f478713 addi a4,a5,500 + 300d49e: 3e800793 li a5,1000 + 300d4a2: 02f757b3 divu a5,a4,a5 + 300d4a6: f6f42623 sw a5,-148(s0) + 300d4aa: f7042783 lw a5,-144(s0) + 300d4ae: 07a2 slli a5,a5,0x8 + 300d4b0: f6f42823 sw a5,-144(s0) + 300d4b4: f7042703 lw a4,-144(s0) + 300d4b8: f6c42783 lw a5,-148(s0) + 300d4bc: 02f757b3 divu a5,a4,a5 + 300d4c0: 853e mv a0,a5 + 300d4c2: 45e010ef jal ra,300e920 + 300d4c6: 87aa mv a5,a0 + 300d4c8: f6f42423 sw a5,-152(s0) + 300d4cc: f6842783 lw a5,-152(s0) + 300d4d0: 07a2 slli a5,a5,0x8 + 300d4d2: f6f42423 sw a5,-152(s0) + 300d4d6: f3842783 lw a5,-200(s0) + 300d4da: 2f9c lbu a5,24(a5) + 300d4dc: c789 beqz a5,300d4e6 + 300d4de: 67c1 lui a5,0x10 + 300d4e0: fcf42e23 sw a5,-36(s0) + 300d4e4: a0a5 j 300d54c + 300d4e6: f7442703 lw a4,-140(s0) + 300d4ea: fbc42783 lw a5,-68(s0) + 300d4ee: 02f757b3 divu a5,a4,a5 + 300d4f2: fcf42e23 sw a5,-36(s0) + 300d4f6: 6741 lui a4,0x10 + 300d4f8: f6842783 lw a5,-152(s0) + 300d4fc: 40f707b3 sub a5,a4,a5 + 300d500: fdc42703 lw a4,-36(s0) + 300d504: 02f707b3 mul a5,a4,a5 + 300d508: fcf42e23 sw a5,-36(s0) + 300d50c: fdc42703 lw a4,-36(s0) + 300d510: fa842783 lw a5,-88(s0) + 300d514: 97ba add a5,a5,a4 + 300d516: 83c1 srli a5,a5,0x10 + 300d518: fcf42e23 sw a5,-36(s0) + 300d51c: fdc42703 lw a4,-36(s0) + 300d520: 67c1 lui a5,0x10 + 300d522: 97ba add a5,a5,a4 + 300d524: fcf42e23 sw a5,-36(s0) + 300d528: fdc42783 lw a5,-36(s0) + 300d52c: 8385 srli a5,a5,0x1 + 300d52e: fcf42e23 sw a5,-36(s0) + 300d532: fdc42703 lw a4,-36(s0) + 300d536: fdc42783 lw a5,-36(s0) + 300d53a: 02f707b3 mul a5,a4,a5 + 300d53e: fcf42e23 sw a5,-36(s0) + 300d542: fdc42783 lw a5,-36(s0) + 300d546: 83b9 srli a5,a5,0xe + 300d548: fcf42e23 sw a5,-36(s0) + 300d54c: fdc42703 lw a4,-36(s0) + 300d550: f7c42783 lw a5,-132(s0) + 300d554: 02f707b3 mul a5,a4,a5 + 300d558: f6f42223 sw a5,-156(s0) + 300d55c: f6442703 lw a4,-156(s0) + 300d560: 67a1 lui a5,0x8 + 300d562: 97ba add a5,a5,a4 + 300d564: 83c1 srli a5,a5,0x10 + 300d566: f6f42223 sw a5,-156(s0) + 300d56a: f6442703 lw a4,-156(s0) + 300d56e: f6442783 lw a5,-156(s0) + 300d572: 02f707b3 mul a5,a4,a5 + 300d576: f6f42223 sw a5,-156(s0) + 300d57a: fe042783 lw a5,-32(s0) + 300d57e: f6f42023 sw a5,-160(s0) + 300d582: f6042703 lw a4,-160(s0) + 300d586: 67a1 lui a5,0x8 + 300d588: 97ba add a5,a5,a4 + 300d58a: 83c1 srli a5,a5,0x10 + 300d58c: f6f42023 sw a5,-160(s0) + 300d590: f6042703 lw a4,-160(s0) + 300d594: f6042783 lw a5,-160(s0) + 300d598: 02f707b3 mul a5,a4,a5 + 300d59c: f6f42023 sw a5,-160(s0) + 300d5a0: f6442703 lw a4,-156(s0) + 300d5a4: f6042783 lw a5,-160(s0) + 300d5a8: 97ba add a5,a5,a4 + 300d5aa: f4f42e23 sw a5,-164(s0) + 300d5ae: f5c42503 lw a0,-164(s0) + 300d5b2: 2a89 jal ra,300d704 + 300d5b4: f4a42c23 sw a0,-168(s0) + 300d5b8: f5842783 lw a5,-168(s0) + 300d5bc: 07c2 slli a5,a5,0x10 + 300d5be: f4f42c23 sw a5,-168(s0) + 300d5c2: f5842783 lw a5,-168(s0) + 300d5c6: 03278713 addi a4,a5,50 # 8032 + 300d5ca: 06400793 li a5,100 + 300d5ce: 02f75733 divu a4,a4,a5 + 300d5d2: f7842783 lw a5,-136(s0) + 300d5d6: 02f757b3 divu a5,a4,a5 + 300d5da: fcf42c23 sw a5,-40(s0) + 300d5de: fd842703 lw a4,-40(s0) + 300d5e2: 6785 lui a5,0x1 + 300d5e4: bb578793 addi a5,a5,-1099 # bb5 + 300d5e8: 02f707b3 mul a5,a4,a5 + 300d5ec: fcf42c23 sw a5,-40(s0) + 300d5f0: fd842703 lw a4,-40(s0) + 300d5f4: 6785 lui a5,0x1 + 300d5f6: 38878793 addi a5,a5,904 # 1388 + 300d5fa: 97ba add a5,a5,a4 + 300d5fc: fcf42c23 sw a5,-40(s0) + 300d600: fd842703 lw a4,-40(s0) + 300d604: 6789 lui a5,0x2 + 300d606: 71078793 addi a5,a5,1808 # 2710 + 300d60a: 02f757b3 divu a5,a4,a5 + 300d60e: fcf42c23 sw a5,-40(s0) + 300d612: fd842703 lw a4,-40(s0) + 300d616: fb442783 lw a5,-76(s0) + 300d61a: 00e7f663 bgeu a5,a4,300d626 + 300d61e: fb442783 lw a5,-76(s0) + 300d622: fcf42c23 sw a5,-40(s0) + 300d626: fe842703 lw a4,-24(s0) + 300d62a: fe442783 lw a5,-28(s0) + 300d62e: 97ba add a5,a5,a4 + 300d630: 1f478713 addi a4,a5,500 + 300d634: 3e800793 li a5,1000 + 300d638: 02f757b3 divu a5,a4,a5 + 300d63c: f4f42a23 sw a5,-172(s0) + 300d640: f5442783 lw a5,-172(s0) + 300d644: 0017d713 srli a4,a5,0x1 + 300d648: fc042783 lw a5,-64(s0) + 300d64c: 973e add a4,a4,a5 + 300d64e: f5442783 lw a5,-172(s0) + 300d652: 02f757b3 divu a5,a4,a5 + 300d656: 853e mv a0,a5 + 300d658: 2075 jal ra,300d704 + 300d65a: f4a42823 sw a0,-176(s0) + 300d65e: f5042783 lw a5,-176(s0) + 300d662: 07a2 slli a5,a5,0x8 + 300d664: f4f42823 sw a5,-176(s0) + 300d668: f5042783 lw a5,-176(s0) + 300d66c: 1f478713 addi a4,a5,500 + 300d670: 3e800793 li a5,1000 + 300d674: 02f757b3 divu a5,a4,a5 + 300d678: f4f42823 sw a5,-176(s0) + 300d67c: fd842703 lw a4,-40(s0) + 300d680: fd842783 lw a5,-40(s0) + 300d684: 02f707b3 mul a5,a4,a5 + 300d688: f6f42223 sw a5,-156(s0) + 300d68c: f5042703 lw a4,-176(s0) + 300d690: f5042783 lw a5,-176(s0) + 300d694: 02f707b3 mul a5,a4,a5 + 300d698: f6f42023 sw a5,-160(s0) + 300d69c: f6442703 lw a4,-156(s0) + 300d6a0: f6042783 lw a5,-160(s0) + 300d6a4: 97ba add a5,a5,a4 + 300d6a6: 853e mv a0,a5 + 300d6a8: 28b1 jal ra,300d704 + 300d6aa: f4a42623 sw a0,-180(s0) + 300d6ae: f4c42703 lw a4,-180(s0) + 300d6b2: 3e800793 li a5,1000 + 300d6b6: 02f707b3 mul a5,a4,a5 + 300d6ba: fcf42a23 sw a5,-44(s0) + 300d6be: f9442783 lw a5,-108(s0) + 300d6c2: cb91 beqz a5,300d6d6 + 300d6c4: fec42783 lw a5,-20(s0) + 300d6c8: c799 beqz a5,300d6d6 + 300d6ca: fd442703 lw a4,-44(s0) + 300d6ce: fb842783 lw a5,-72(s0) + 300d6d2: 00e7f663 bgeu a5,a4,300d6de + 300d6d6: fb842783 lw a5,-72(s0) + 300d6da: fcf42a23 sw a5,-44(s0) + 300d6de: f3442783 lw a5,-204(s0) + 300d6e2: fd442703 lw a4,-44(s0) + 300d6e6: c398 sw a4,0(a5) + 300d6e8: f3442783 lw a5,-204(s0) + 300d6ec: 4398 lw a4,0(a5) + 300d6ee: f3c42783 lw a5,-196(s0) + 300d6f2: 16e7a623 sw a4,364(a5) + 300d6f6: f9f40783 lb a5,-97(s0) + 300d6fa: 853e mv a0,a5 + 300d6fc: 40be lw ra,204(sp) + 300d6fe: 442e lw s0,200(sp) + 300d700: 6169 addi sp,sp,208 + 300d702: 8082 ret + +0300d704 : + 300d704: e7dfd06f j 300b580 + +0300d708 : + 300d708: 711d addi sp,sp,-96 + 300d70a: ce86 sw ra,92(sp) + 300d70c: cca2 sw s0,88(sp) + 300d70e: 1080 addi s0,sp,96 + 300d710: faa42e23 sw a0,-68(s0) + 300d714: fac42a23 sw a2,-76(s0) + 300d718: fae42823 sw a4,-80(s0) + 300d71c: faf42623 sw a5,-84(s0) + 300d720: 87ae mv a5,a1 + 300d722: faf40da3 sb a5,-69(s0) + 300d726: 87b6 mv a5,a3 + 300d728: faf41c23 sh a5,-72(s0) + 300d72c: fe0407a3 sb zero,-17(s0) + 300d730: fe0406a3 sb zero,-19(s0) + 300d734: fe040623 sb zero,-20(s0) + 300d738: fe0405a3 sb zero,-21(s0) + 300d73c: fc040da3 sb zero,-37(s0) + 300d740: fc040d23 sb zero,-38(s0) + 300d744: fc040ca3 sb zero,-39(s0) + 300d748: fc040c23 sb zero,-40(s0) + 300d74c: fe040123 sb zero,-30(s0) + 300d750: fc041323 sh zero,-58(s0) + 300d754: fc042023 sw zero,-64(s0) + 300d758: fbb44783 lbu a5,-69(s0) + 300d75c: 878d srai a5,a5,0x3 + 300d75e: 9f81 uxtb a5 + 300d760: 8bbd andi a5,a5,15 + 300d762: fef40123 sb a5,-30(s0) + 300d766: fe244783 lbu a5,-30(s0) + 300d76a: cf9d beqz a5,300d7a8 + 300d76c: fe244703 lbu a4,-30(s0) + 300d770: 4795 li a5,5 + 300d772: 02f70b63 beq a4,a5,300d7a8 + 300d776: fe244703 lbu a4,-30(s0) + 300d77a: 479d li a5,7 + 300d77c: 02f70663 beq a4,a5,300d7a8 + 300d780: fe244703 lbu a4,-30(s0) + 300d784: 47b1 li a5,12 + 300d786: 02f70163 beq a4,a5,300d7a8 + 300d78a: fe244703 lbu a4,-30(s0) + 300d78e: 47b5 li a5,13 + 300d790: 00f70c63 beq a4,a5,300d7a8 + 300d794: fe244703 lbu a4,-30(s0) + 300d798: 47b9 li a5,14 + 300d79a: 00f70763 beq a4,a5,300d7a8 + 300d79e: fe244703 lbu a4,-30(s0) + 300d7a2: 47bd li a5,15 + 300d7a4: 00f71663 bne a4,a5,300d7b0 + 300d7a8: 4785 li a5,1 + 300d7aa: fef40723 sb a5,-18(s0) + 300d7ae: a019 j 300d7b4 + 300d7b0: fe040723 sb zero,-18(s0) + 300d7b4: fef40783 lb a5,-17(s0) + 300d7b8: eb99 bnez a5,300d7ce + 300d7ba: fdb40793 addi a5,s0,-37 + 300d7be: 863e mv a2,a5 + 300d7c0: 4581 li a1,0 + 300d7c2: fbc42503 lw a0,-68(s0) + 300d7c6: 26b1 jal ra,300db12 + 300d7c8: 87aa mv a5,a0 + 300d7ca: fef407a3 sb a5,-17(s0) + 300d7ce: fdb44783 lbu a5,-37(s0) + 300d7d2: c3d9 beqz a5,300d858 + 300d7d4: fef40783 lb a5,-17(s0) + 300d7d8: e3c1 bnez a5,300d858 + 300d7da: fd440793 addi a5,s0,-44 + 300d7de: 863e mv a2,a5 + 300d7e0: fb042583 lw a1,-80(s0) + 300d7e4: fbc42503 lw a0,-68(s0) + 300d7e8: 32c5 jal ra,300d1c8 + 300d7ea: 87aa mv a5,a0 + 300d7ec: fef407a3 sb a5,-17(s0) + 300d7f0: fef40783 lb a5,-17(s0) + 300d7f4: ef91 bnez a5,300d810 + 300d7f6: fb042783 lw a5,-80(s0) + 300d7fa: 4b9c lw a5,16(a5) + 300d7fc: fc040713 addi a4,s0,-64 + 300d800: 863a mv a2,a4 + 300d802: 85be mv a1,a5 + 300d804: fbc42503 lw a0,-68(s0) + 300d808: 3091 jal ra,300d04c + 300d80a: 87aa mv a5,a0 + 300d80c: fef407a3 sb a5,-17(s0) + 300d810: fef40783 lb a5,-17(s0) + 300d814: eb89 bnez a5,300d826 + 300d816: fc042783 lw a5,-64(s0) + 300d81a: 01079713 slli a4,a5,0x10 + 300d81e: 8341 srli a4,a4,0x10 + 300d820: fb042783 lw a5,-80(s0) + 300d824: a7ba sh a4,10(a5) + 300d826: fef40783 lb a5,-17(s0) + 300d82a: e79d bnez a5,300d858 + 300d82c: fd040793 addi a5,s0,-48 + 300d830: 863e mv a2,a5 + 300d832: 4581 li a1,0 + 300d834: fbc42503 lw a0,-68(s0) + 300d838: 2cd9 jal ra,300db0e + 300d83a: 87aa mv a5,a0 + 300d83c: fef407a3 sb a5,-17(s0) + 300d840: fd042783 lw a5,-48(s0) + 300d844: cb91 beqz a5,300d858 + 300d846: fd442703 lw a4,-44(s0) + 300d84a: fd042783 lw a5,-48(s0) + 300d84e: 00e7f563 bgeu a5,a4,300d858 + 300d852: 4785 li a5,1 + 300d854: fef406a3 sb a5,-19(s0) + 300d858: fef40783 lb a5,-17(s0) + 300d85c: eb99 bnez a5,300d872 + 300d85e: fd940793 addi a5,s0,-39 + 300d862: 863e mv a2,a5 + 300d864: 4589 li a1,2 + 300d866: fbc42503 lw a0,-68(s0) + 300d86a: 2465 jal ra,300db12 + 300d86c: 87aa mv a5,a0 + 300d86e: fef407a3 sb a5,-17(s0) + 300d872: fd944783 lbu a5,-39(s0) + 300d876: cfd1 beqz a5,300d912 + 300d878: fef40783 lb a5,-17(s0) + 300d87c: ebd9 bnez a5,300d912 + 300d87e: fcc40793 addi a5,s0,-52 + 300d882: 863e mv a2,a5 + 300d884: 4589 li a1,2 + 300d886: fbc42503 lw a0,-68(s0) + 300d88a: 2451 jal ra,300db0e + 300d88c: 87aa mv a5,a0 + 300d88e: fef407a3 sb a5,-17(s0) + 300d892: fef40783 lb a5,-17(s0) + 300d896: eb99 bnez a5,300d8ac + 300d898: 4605 li a2,1 + 300d89a: 0ff00593 li a1,255 + 300d89e: fbc42503 lw a0,-68(s0) + 300d8a2: 3e3000ef jal ra,300e484 + 300d8a6: 87aa mv a5,a0 + 300d8a8: fef407a3 sb a5,-17(s0) + 300d8ac: fef40783 lb a5,-17(s0) + 300d8b0: ef89 bnez a5,300d8ca + 300d8b2: fc640793 addi a5,s0,-58 + 300d8b6: 863e mv a2,a5 + 300d8b8: 0b600593 li a1,182 + 300d8bc: fbc42503 lw a0,-68(s0) + 300d8c0: 579000ef jal ra,300e638 + 300d8c4: 87aa mv a5,a0 + 300d8c6: fef407a3 sb a5,-17(s0) + 300d8ca: fef40783 lb a5,-17(s0) + 300d8ce: eb99 bnez a5,300d8e4 + 300d8d0: 4601 li a2,0 + 300d8d2: 0ff00593 li a1,255 + 300d8d6: fbc42503 lw a0,-68(s0) + 300d8da: 3ab000ef jal ra,300e484 + 300d8de: 87aa mv a5,a0 + 300d8e0: fef407a3 sb a5,-17(s0) + 300d8e4: fc645783 lhu a5,-58(s0) + 300d8e8: 07a6 slli a5,a5,0x9 + 300d8ea: fcf42e23 sw a5,-36(s0) + 300d8ee: fbc42783 lw a5,-68(s0) + 300d8f2: fdc42703 lw a4,-36(s0) + 300d8f6: 16e7aa23 sw a4,372(a5) + 300d8fa: fcc42783 lw a5,-52(s0) + 300d8fe: cb91 beqz a5,300d912 + 300d900: fcc42783 lw a5,-52(s0) + 300d904: fdc42703 lw a4,-36(s0) + 300d908: 00e7f563 bgeu a5,a4,300d912 + 300d90c: 4785 li a5,1 + 300d90e: fef40623 sb a5,-20(s0) + 300d912: fef40783 lb a5,-17(s0) + 300d916: eb99 bnez a5,300d92c + 300d918: fd840793 addi a5,s0,-40 + 300d91c: 863e mv a2,a5 + 300d91e: 458d li a1,3 + 300d920: fbc42503 lw a0,-68(s0) + 300d924: 22fd jal ra,300db12 + 300d926: 87aa mv a5,a0 + 300d928: fef407a3 sb a5,-17(s0) + 300d92c: fd844783 lbu a5,-40(s0) + 300d930: cbb1 beqz a5,300d984 + 300d932: fef40783 lb a5,-17(s0) + 300d936: e7b9 bnez a5,300d984 + 300d938: fb845783 lhu a5,-72(s0) + 300d93c: e781 bnez a5,300d944 + 300d93e: fe042223 sw zero,-28(s0) + 300d942: a819 j 300d958 + 300d944: fb442783 lw a5,-76(s0) + 300d948: 00879713 slli a4,a5,0x8 + 300d94c: fb845783 lhu a5,-72(s0) + 300d950: 02f757b3 divu a5,a4,a5 + 300d954: fef42223 sw a5,-28(s0) + 300d958: fc840793 addi a5,s0,-56 + 300d95c: 863e mv a2,a5 + 300d95e: 458d li a1,3 + 300d960: fbc42503 lw a0,-68(s0) + 300d964: 226d jal ra,300db0e + 300d966: 87aa mv a5,a0 + 300d968: fef407a3 sb a5,-17(s0) + 300d96c: fc842783 lw a5,-56(s0) + 300d970: cb91 beqz a5,300d984 + 300d972: fc842783 lw a5,-56(s0) + 300d976: fe442703 lw a4,-28(s0) + 300d97a: 00f77563 bgeu a4,a5,300d984 + 300d97e: 4785 li a5,1 + 300d980: fef405a3 sb a5,-21(s0) + 300d984: fef40783 lb a5,-17(s0) + 300d988: efdd bnez a5,300da46 + 300d98a: fee44703 lbu a4,-18(s0) + 300d98e: 4785 li a5,1 + 300d990: 00f71763 bne a4,a5,300d99e + 300d994: fac42783 lw a5,-84(s0) + 300d998: 577d li a4,-1 + 300d99a: a398 sb a4,0(a5) + 300d99c: a06d j 300da46 + 300d99e: fe244703 lbu a4,-30(s0) + 300d9a2: 4785 li a5,1 + 300d9a4: 00f70c63 beq a4,a5,300d9bc + 300d9a8: fe244703 lbu a4,-30(s0) + 300d9ac: 4789 li a5,2 + 300d9ae: 00f70763 beq a4,a5,300d9bc + 300d9b2: fe244703 lbu a4,-30(s0) + 300d9b6: 478d li a5,3 + 300d9b8: 00f71763 bne a4,a5,300d9c6 + 300d9bc: fac42783 lw a5,-84(s0) + 300d9c0: 4715 li a4,5 + 300d9c2: a398 sb a4,0(a5) + 300d9c4: a049 j 300da46 + 300d9c6: fe244703 lbu a4,-30(s0) + 300d9ca: 4799 li a5,6 + 300d9cc: 00f70763 beq a4,a5,300d9da + 300d9d0: fe244703 lbu a4,-30(s0) + 300d9d4: 47a5 li a5,9 + 300d9d6: 00f71763 bne a4,a5,300d9e4 + 300d9da: fac42783 lw a5,-84(s0) + 300d9de: 4711 li a4,4 + 300d9e0: a398 sb a4,0(a5) + 300d9e2: a095 j 300da46 + 300d9e4: fe244703 lbu a4,-30(s0) + 300d9e8: 47a1 li a5,8 + 300d9ea: 00f70c63 beq a4,a5,300da02 + 300d9ee: fe244703 lbu a4,-30(s0) + 300d9f2: 47a9 li a5,10 + 300d9f4: 00f70763 beq a4,a5,300da02 + 300d9f8: fec44703 lbu a4,-20(s0) + 300d9fc: 4785 li a5,1 + 300d9fe: 00f71763 bne a4,a5,300da0c + 300da02: fac42783 lw a5,-84(s0) + 300da06: 470d li a4,3 + 300da08: a398 sb a4,0(a5) + 300da0a: a835 j 300da46 + 300da0c: fe244703 lbu a4,-30(s0) + 300da10: 4791 li a5,4 + 300da12: 00f70763 beq a4,a5,300da20 + 300da16: feb44703 lbu a4,-21(s0) + 300da1a: 4785 li a5,1 + 300da1c: 00f71763 bne a4,a5,300da2a + 300da20: fac42783 lw a5,-84(s0) + 300da24: 4709 li a4,2 + 300da26: a398 sb a4,0(a5) + 300da28: a839 j 300da46 + 300da2a: fed44703 lbu a4,-19(s0) + 300da2e: 4785 li a5,1 + 300da30: 00f71763 bne a4,a5,300da3e + 300da34: fac42783 lw a5,-84(s0) + 300da38: 4705 li a4,1 + 300da3a: a398 sb a4,0(a5) + 300da3c: a029 j 300da46 + 300da3e: fac42783 lw a5,-84(s0) + 300da42: 00078023 sb zero,0(a5) + 300da46: fda40793 addi a5,s0,-38 + 300da4a: 863e mv a2,a5 + 300da4c: 4585 li a1,1 + 300da4e: fbc42503 lw a0,-68(s0) + 300da52: 20c1 jal ra,300db12 + 300da54: 87aa mv a5,a0 + 300da56: fef407a3 sb a5,-17(s0) + 300da5a: fef40783 lb a5,-17(s0) + 300da5e: e3cd bnez a5,300db00 + 300da60: fdb44783 lbu a5,-37(s0) + 300da64: c791 beqz a5,300da70 + 300da66: fed44703 lbu a4,-19(s0) + 300da6a: 4785 li a5,1 + 300da6c: 00f71663 bne a4,a5,300da78 + 300da70: 4785 li a5,1 + 300da72: fef401a3 sb a5,-29(s0) + 300da76: a019 j 300da7c + 300da78: fe0401a3 sb zero,-29(s0) + 300da7c: fbc42783 lw a5,-68(s0) + 300da80: fe344703 lbu a4,-29(s0) + 300da84: 02e78323 sb a4,38(a5) + 300da88: fe244703 lbu a4,-30(s0) + 300da8c: 4791 li a5,4 + 300da8e: 00f70563 beq a4,a5,300da98 + 300da92: fda44783 lbu a5,-38(s0) + 300da96: e789 bnez a5,300daa0 + 300da98: 4785 li a5,1 + 300da9a: fef401a3 sb a5,-29(s0) + 300da9e: a019 j 300daa4 + 300daa0: fe0401a3 sb zero,-29(s0) + 300daa4: fbc42783 lw a5,-68(s0) + 300daa8: fe344703 lbu a4,-29(s0) + 300daac: 02e783a3 sb a4,39(a5) + 300dab0: fd944783 lbu a5,-39(s0) + 300dab4: c791 beqz a5,300dac0 + 300dab6: fec44703 lbu a4,-20(s0) + 300daba: 4785 li a5,1 + 300dabc: 00f71663 bne a4,a5,300dac8 + 300dac0: 4785 li a5,1 + 300dac2: fef401a3 sb a5,-29(s0) + 300dac6: a019 j 300dacc + 300dac8: fe0401a3 sb zero,-29(s0) + 300dacc: fbc42783 lw a5,-68(s0) + 300dad0: fe344703 lbu a4,-29(s0) + 300dad4: 02e78423 sb a4,40(a5) + 300dad8: fd844783 lbu a5,-40(s0) + 300dadc: c791 beqz a5,300dae8 + 300dade: feb44703 lbu a4,-21(s0) + 300dae2: 4785 li a5,1 + 300dae4: 00f71663 bne a4,a5,300daf0 + 300dae8: 4785 li a5,1 + 300daea: fef401a3 sb a5,-29(s0) + 300daee: a019 j 300daf4 + 300daf0: fe0401a3 sb zero,-29(s0) + 300daf4: fbc42783 lw a5,-68(s0) + 300daf8: fe344703 lbu a4,-29(s0) + 300dafc: 02e784a3 sb a4,41(a5) + 300db00: fef40783 lb a5,-17(s0) + 300db04: 853e mv a0,a5 + 300db06: 40f6 lw ra,92(sp) + 300db08: 4466 lw s0,88(sp) + 300db0a: 6125 addi sp,sp,96 + 300db0c: 8082 ret + +0300db0e : + 300db0e: ad9fb06f j 30095e6 + +0300db12 : + 300db12: 989fb06f j 300949a + +0300db16 : + 300db16: 7179 addi sp,sp,-48 + 300db18: d606 sw ra,44(sp) + 300db1a: d422 sw s0,40(sp) + 300db1c: 1800 addi s0,sp,48 + 300db1e: fca42e23 sw a0,-36(s0) + 300db22: 87ae mv a5,a1 + 300db24: fcf40da3 sb a5,-37(s0) + 300db28: fe041623 sh zero,-20(s0) + 300db2c: fec40793 addi a5,s0,-20 + 300db30: 863e mv a2,a5 + 300db32: 0c000593 li a1,192 + 300db36: fdc42503 lw a0,-36(s0) + 300db3a: 2ff000ef jal ra,300e638 + 300db3e: 87aa mv a5,a0 + 300db40: fef407a3 sb a5,-17(s0) + 300db44: fec45783 lhu a5,-20(s0) + 300db48: 873e mv a4,a5 + 300db4a: fef40783 lb a5,-17(s0) + 300db4e: 863e mv a2,a5 + 300db50: 85ba mv a1,a4 + 300db52: 0300f7b7 lui a5,0x300f + 300db56: 4a478513 addi a0,a5,1188 # 300f4a4 + 300db5a: 223d jal ra,300dc88 + 300db5c: fec45703 lhu a4,-20(s0) + 300db60: 67bd lui a5,0xf + 300db62: eaa78793 addi a5,a5,-342 # eeaa + 300db66: 00f70863 beq a4,a5,300db76 + 300db6a: 0300f7b7 lui a5,0x300f + 300db6e: 4c078513 addi a0,a5,1216 # 300f4c0 + 300db72: 2a19 jal ra,300dc88 + 300db74: a001 j 300db74 + 300db76: fdc42783 lw a5,-36(s0) + 300db7a: 1807c783 lbu a5,384(a5) + 300db7e: fdb44703 lbu a4,-37(s0) + 300db82: 02f70a63 beq a4,a5,300dbb6 + 300db86: fdb44783 lbu a5,-37(s0) + 300db8a: 0786 slli a5,a5,0x1 + 300db8c: 9f81 uxtb a5 + 300db8e: 85be mv a1,a5 + 300db90: fdc42503 lw a0,-36(s0) + 300db94: 963fa0ef jal ra,30084f6 + 300db98: fdc42783 lw a5,-36(s0) + 300db9c: fdb44703 lbu a4,-37(s0) + 300dba0: 18e78023 sb a4,384(a5) + 300dba4: fdb44783 lbu a5,-37(s0) + 300dba8: 85be mv a1,a5 + 300dbaa: 0300f7b7 lui a5,0x300f + 300dbae: 4dc78513 addi a0,a5,1244 # 300f4dc + 300dbb2: 28d9 jal ra,300dc88 + 300dbb4: a809 j 300dbc6 + 300dbb6: fdb44783 lbu a5,-37(s0) + 300dbba: 85be mv a1,a5 + 300dbbc: 0300f7b7 lui a5,0x300f + 300dbc0: 50c78513 addi a0,a5,1292 # 300f50c + 300dbc4: 20d1 jal ra,300dc88 + 300dbc6: 0001 nop + 300dbc8: 50b2 lw ra,44(sp) + 300dbca: 5422 lw s0,40(sp) + 300dbcc: 6145 addi sp,sp,48 + 300dbce: 8082 ret + +0300dbd0 : + 300dbd0: 7179 addi sp,sp,-48 + 300dbd2: d606 sw ra,44(sp) + 300dbd4: d422 sw s0,40(sp) + 300dbd6: 1800 addi s0,sp,48 + 300dbd8: fca42e23 sw a0,-36(s0) + 300dbdc: fdc42503 lw a0,-36(s0) + 300dbe0: 955fa0ef jal ra,3008534 + 300dbe4: fdc42503 lw a0,-36(s0) + 300dbe8: c95fa0ef jal ra,300887c + 300dbec: fe740713 addi a4,s0,-25 + 300dbf0: fe840793 addi a5,s0,-24 + 300dbf4: 863a mv a2,a4 + 300dbf6: 85be mv a1,a5 + 300dbf8: fdc42503 lw a0,-36(s0) + 300dbfc: 8ddfc0ef jal ra,300a4d8 + 300dc00: fee40713 addi a4,s0,-18 + 300dc04: fef40793 addi a5,s0,-17 + 300dc08: 863a mv a2,a4 + 300dc0a: 85be mv a1,a5 + 300dc0c: fdc42503 lw a0,-36(s0) + 300dc10: c1ffb0ef jal ra,300982e + 300dc14: 4585 li a1,1 + 300dc16: fdc42503 lw a0,-36(s0) + 300dc1a: 950fb0ef jal ra,3008d6a + 300dc1e: 67c1 lui a5,0x10 + 300dc20: 1d078593 addi a1,a5,464 # 101d0 + 300dc24: fdc42503 lw a0,-36(s0) + 300dc28: a06fb0ef jal ra,3008e2e + 300dc2c: 0001 nop + 300dc2e: 50b2 lw ra,44(sp) + 300dc30: 5422 lw s0,40(sp) + 300dc32: 6145 addi sp,sp,48 + 300dc34: 8082 ret + +0300dc36 : + 300dc36: 1141 addi sp,sp,-16 + 300dc38: c606 sw ra,12(sp) + 300dc3a: c422 sw s0,8(sp) + 300dc3c: 0800 addi s0,sp,16 + 300dc3e: 26f1 jal ra,300e00a + 300dc40: 02900593 li a1,41 + 300dc44: d9418513 addi a0,gp,-620 # 40003c8 + 300dc48: 35f9 jal ra,300db16 + 300dc4a: d9418513 addi a0,gp,-620 # 40003c8 + 300dc4e: 3749 jal ra,300dbd0 + 300dc50: 0300f7b7 lui a5,0x300f + 300dc54: 52878513 addi a0,a5,1320 # 300f528 + 300dc58: 2805 jal ra,300dc88 + 300dc5a: 0001 nop + 300dc5c: 40b2 lw ra,12(sp) + 300dc5e: 4422 lw s0,8(sp) + 300dc60: 0141 addi sp,sp,16 + 300dc62: 8082 ret + +0300dc64 : + 300dc64: 1141 addi sp,sp,-16 + 300dc66: c606 sw ra,12(sp) + 300dc68: c422 sw s0,8(sp) + 300dc6a: 0800 addi s0,sp,16 + 300dc6c: d9418513 addi a0,gp,-620 # 40003c8 + 300dc70: e53fb0ef jal ra,3009ac2 + 300dc74: 0300f7b7 lui a5,0x300f + 300dc78: 54478513 addi a0,a5,1348 # 300f544 + 300dc7c: 2031 jal ra,300dc88 + 300dc7e: 0001 nop + 300dc80: 40b2 lw ra,12(sp) + 300dc82: 4422 lw s0,8(sp) + 300dc84: 0141 addi sp,sp,16 + 300dc86: 8082 ret + +0300dc88 : + 300dc88: e69f506f j 3003af0 + +0300dc8c : + 300dc8c: 7179 addi sp,sp,-48 + 300dc8e: d606 sw ra,44(sp) + 300dc90: d422 sw s0,40(sp) + 300dc92: 1800 addi s0,sp,48 + 300dc94: fe0407a3 sb zero,-17(s0) + 300dc98: fef40793 addi a5,s0,-17 + 300dc9c: 85be mv a1,a5 + 300dc9e: d9418513 addi a0,gp,-620 # 40003c8 + 300dca2: fedfb0ef jal ra,3009c8e + 300dca6: fef44703 lbu a4,-17(s0) + 300dcaa: 4785 li a5,1 + 300dcac: 00f71c63 bne a4,a5,300dcc4 + 300dcb0: fd040793 addi a5,s0,-48 + 300dcb4: 85be mv a1,a5 + 300dcb6: d9418513 addi a0,gp,-620 # 40003c8 + 300dcba: 874fc0ef jal ra,3009d2e + 300dcbe: fd845783 lhu a5,-40(s0) + 300dcc2: a011 j 300dcc6 + 300dcc4: 4781 li a5,0 + 300dcc6: 853e mv a0,a5 + 300dcc8: 50b2 lw ra,44(sp) + 300dcca: 5422 lw s0,40(sp) + 300dccc: 6145 addi sp,sp,48 + 300dcce: 8082 ret + +0300dcd0 : + 300dcd0: 1141 addi sp,sp,-16 + 300dcd2: c606 sw ra,12(sp) + 300dcd4: c422 sw s0,8(sp) + 300dcd6: 0800 addi s0,sp,16 + 300dcd8: 4605 li a2,1 + 300dcda: 45c1 li a1,16 + 300dcdc: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dce0: 2e95 jal ra,300e054 + 300dce2: 4605 li a2,1 + 300dce4: 45c1 li a1,16 + 300dce6: 52418513 addi a0,gp,1316 # 4000b58 + 300dcea: 26ad jal ra,300e054 + 300dcec: 000f47b7 lui a5,0xf4 + 300dcf0: 24078593 addi a1,a5,576 # f4240 + 300dcf4: 4509 li a0,2 + 300dcf6: 2ea9 jal ra,300e050 + 300dcf8: 4601 li a2,0 + 300dcfa: 45c1 li a1,16 + 300dcfc: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd00: 2e91 jal ra,300e054 + 300dd02: 000f47b7 lui a5,0xf4 + 300dd06: 24078593 addi a1,a5,576 # f4240 + 300dd0a: 4509 li a0,2 + 300dd0c: 2691 jal ra,300e050 + 300dd0e: 4601 li a2,0 + 300dd10: 45c1 li a1,16 + 300dd12: 52418513 addi a0,gp,1316 # 4000b58 + 300dd16: 2e3d jal ra,300e054 + 300dd18: 0001 nop + 300dd1a: 40b2 lw ra,12(sp) + 300dd1c: 4422 lw s0,8(sp) + 300dd1e: 0141 addi sp,sp,16 + 300dd20: 8082 ret + +0300dd22 : + 300dd22: 1141 addi sp,sp,-16 + 300dd24: c606 sw ra,12(sp) + 300dd26: c422 sw s0,8(sp) + 300dd28: 0800 addi s0,sp,16 + 300dd2a: 4601 li a2,0 + 300dd2c: 45c1 li a1,16 + 300dd2e: 52418513 addi a0,gp,1316 # 4000b58 + 300dd32: 260d jal ra,300e054 + 300dd34: 4601 li a2,0 + 300dd36: 45c1 li a1,16 + 300dd38: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd3c: 2e21 jal ra,300e054 + 300dd3e: 000f47b7 lui a5,0xf4 + 300dd42: 24078593 addi a1,a5,576 # f4240 + 300dd46: 4509 li a0,2 + 300dd48: 2621 jal ra,300e050 + 300dd4a: 4605 li a2,1 + 300dd4c: 45c1 li a1,16 + 300dd4e: 52418513 addi a0,gp,1316 # 4000b58 + 300dd52: 2609 jal ra,300e054 + 300dd54: 000f47b7 lui a5,0xf4 + 300dd58: 24078593 addi a1,a5,576 # f4240 + 300dd5c: 4505 li a0,1 + 300dd5e: 2ccd jal ra,300e050 + 300dd60: 4605 li a2,1 + 300dd62: 45c1 li a1,16 + 300dd64: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd68: 24f5 jal ra,300e054 + 300dd6a: 000f47b7 lui a5,0xf4 + 300dd6e: 24078593 addi a1,a5,576 # f4240 + 300dd72: 4511 li a0,4 + 300dd74: 2cf1 jal ra,300e050 + 300dd76: 0001 nop + 300dd78: 40b2 lw ra,12(sp) + 300dd7a: 4422 lw s0,8(sp) + 300dd7c: 0141 addi sp,sp,16 + 300dd7e: 8082 ret + +0300dd80 : + 300dd80: 1101 addi sp,sp,-32 + 300dd82: ce06 sw ra,28(sp) + 300dd84: cc22 sw s0,24(sp) + 300dd86: 1000 addi s0,sp,32 + 300dd88: fe0407a3 sb zero,-17(s0) + 300dd8c: fe040723 sb zero,-18(s0) + 300dd90: 4601 li a2,0 + 300dd92: 45c1 li a1,16 + 300dd94: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd98: 24bd jal ra,300e006 + 300dd9a: 4605 li a2,1 + 300dd9c: 45c1 li a1,16 + 300dd9e: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dda2: 2c4d jal ra,300e054 + 300dda4: 000f47b7 lui a5,0xf4 + 300dda8: 24078593 addi a1,a5,576 # f4240 + 300ddac: 4505 li a0,1 + 300ddae: 244d jal ra,300e050 + 300ddb0: 4605 li a2,1 + 300ddb2: 45c1 li a1,16 + 300ddb4: 52418513 addi a0,gp,1316 # 4000b58 + 300ddb8: 2c71 jal ra,300e054 + 300ddba: 000f47b7 lui a5,0xf4 + 300ddbe: 24078593 addi a1,a5,576 # f4240 + 300ddc2: 4505 li a0,1 + 300ddc4: 2471 jal ra,300e050 + 300ddc6: a025 j 300ddee + 300ddc8: fef44783 lbu a5,-17(s0) + 300ddcc: 0785 addi a5,a5,1 + 300ddce: fef407a3 sb a5,-17(s0) + 300ddd2: fef44703 lbu a4,-17(s0) + 300ddd6: 0fa00793 li a5,250 + 300ddda: 00e7fa63 bgeu a5,a4,300ddee + 300ddde: 4605 li a2,1 + 300dde0: 45c1 li a1,16 + 300dde2: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dde6: 2405 jal ra,300e006 + 300dde8: 3f2d jal ra,300dd22 + 300ddea: 4785 li a5,1 + 300ddec: a025 j 300de14 + 300ddee: 45c1 li a1,16 + 300ddf0: 56c18513 addi a0,gp,1388 # 4000ba0 + 300ddf4: ebef60ef jal ra,30044b2 + 300ddf8: 87aa mv a5,a0 + 300ddfa: f7f9 bnez a5,300ddc8 + 300ddfc: 4605 li a2,1 + 300ddfe: 45c1 li a1,16 + 300de00: 56c18513 addi a0,gp,1388 # 4000ba0 + 300de04: 2409 jal ra,300e006 + 300de06: 4601 li a2,0 + 300de08: 45c1 li a1,16 + 300de0a: 52418513 addi a0,gp,1316 # 4000b58 + 300de0e: 2499 jal ra,300e054 + 300de10: fee44783 lbu a5,-18(s0) + 300de14: 853e mv a0,a5 + 300de16: 40f2 lw ra,28(sp) + 300de18: 4462 lw s0,24(sp) + 300de1a: 6105 addi sp,sp,32 + 300de1c: 8082 ret + +0300de1e : + 300de1e: 1141 addi sp,sp,-16 + 300de20: c606 sw ra,12(sp) + 300de22: c422 sw s0,8(sp) + 300de24: 0800 addi s0,sp,16 + 300de26: 4601 li a2,0 + 300de28: 45c1 li a1,16 + 300de2a: 52418513 addi a0,gp,1316 # 4000b58 + 300de2e: 241d jal ra,300e054 + 300de30: 4601 li a2,0 + 300de32: 45c1 li a1,16 + 300de34: 56c18513 addi a0,gp,1388 # 4000ba0 + 300de38: 2c31 jal ra,300e054 + 300de3a: 000f47b7 lui a5,0xf4 + 300de3e: 24078593 addi a1,a5,576 # f4240 + 300de42: 4509 li a0,2 + 300de44: 2431 jal ra,300e050 + 300de46: 4605 li a2,1 + 300de48: 45c1 li a1,16 + 300de4a: 52418513 addi a0,gp,1316 # 4000b58 + 300de4e: 2419 jal ra,300e054 + 300de50: 000f47b7 lui a5,0xf4 + 300de54: 24078593 addi a1,a5,576 # f4240 + 300de58: 4509 li a0,2 + 300de5a: 2add jal ra,300e050 + 300de5c: 4601 li a2,0 + 300de5e: 45c1 li a1,16 + 300de60: 52418513 addi a0,gp,1316 # 4000b58 + 300de64: 2ac5 jal ra,300e054 + 300de66: 0001 nop + 300de68: 40b2 lw ra,12(sp) + 300de6a: 4422 lw s0,8(sp) + 300de6c: 0141 addi sp,sp,16 + 300de6e: 8082 ret + +0300de70 : + 300de70: 1141 addi sp,sp,-16 + 300de72: c606 sw ra,12(sp) + 300de74: c422 sw s0,8(sp) + 300de76: 0800 addi s0,sp,16 + 300de78: 4601 li a2,0 + 300de7a: 45c1 li a1,16 + 300de7c: 52418513 addi a0,gp,1316 # 4000b58 + 300de80: 2ad1 jal ra,300e054 + 300de82: 4605 li a2,1 + 300de84: 45c1 li a1,16 + 300de86: 56c18513 addi a0,gp,1388 # 4000ba0 + 300de8a: 22e9 jal ra,300e054 + 300de8c: 000f47b7 lui a5,0xf4 + 300de90: 24078593 addi a1,a5,576 # f4240 + 300de94: 4509 li a0,2 + 300de96: 2a6d jal ra,300e050 + 300de98: 4605 li a2,1 + 300de9a: 45c1 li a1,16 + 300de9c: 52418513 addi a0,gp,1316 # 4000b58 + 300dea0: 2a55 jal ra,300e054 + 300dea2: 000f47b7 lui a5,0xf4 + 300dea6: 24078593 addi a1,a5,576 # f4240 + 300deaa: 4509 li a0,2 + 300deac: 2255 jal ra,300e050 + 300deae: 4601 li a2,0 + 300deb0: 45c1 li a1,16 + 300deb2: 52418513 addi a0,gp,1316 # 4000b58 + 300deb6: 2a79 jal ra,300e054 + 300deb8: 0001 nop + 300deba: 40b2 lw ra,12(sp) + 300debc: 4422 lw s0,8(sp) + 300debe: 0141 addi sp,sp,16 + 300dec0: 8082 ret + +0300dec2 : + 300dec2: 7179 addi sp,sp,-48 + 300dec4: d606 sw ra,44(sp) + 300dec6: d422 sw s0,40(sp) + 300dec8: 1800 addi s0,sp,48 + 300deca: 87aa mv a5,a0 + 300decc: fcf40fa3 sb a5,-33(s0) + 300ded0: 4601 li a2,0 + 300ded2: 45c1 li a1,16 + 300ded4: 52418513 addi a0,gp,1316 # 4000b58 + 300ded8: 2ab5 jal ra,300e054 + 300deda: fe0407a3 sb zero,-17(s0) + 300dede: a0b5 j 300df4a + 300dee0: fdf40783 lb a5,-33(s0) + 300dee4: 0007d863 bgez a5,300def4 + 300dee8: 4605 li a2,1 + 300deea: 45c1 li a1,16 + 300deec: 56c18513 addi a0,gp,1388 # 4000ba0 + 300def0: 2295 jal ra,300e054 + 300def2: a031 j 300defe + 300def4: 4601 li a2,0 + 300def6: 45c1 li a1,16 + 300def8: 56c18513 addi a0,gp,1388 # 4000ba0 + 300defc: 2aa1 jal ra,300e054 + 300defe: fdf44783 lbu a5,-33(s0) + 300df02: 0786 slli a5,a5,0x1 + 300df04: fcf40fa3 sb a5,-33(s0) + 300df08: 000f47b7 lui a5,0xf4 + 300df0c: 24078593 addi a1,a5,576 # f4240 + 300df10: 4509 li a0,2 + 300df12: 2a3d jal ra,300e050 + 300df14: 4605 li a2,1 + 300df16: 45c1 li a1,16 + 300df18: 52418513 addi a0,gp,1316 # 4000b58 + 300df1c: 2a25 jal ra,300e054 + 300df1e: 000f47b7 lui a5,0xf4 + 300df22: 24078593 addi a1,a5,576 # f4240 + 300df26: 4509 li a0,2 + 300df28: 2225 jal ra,300e050 + 300df2a: 4601 li a2,0 + 300df2c: 45c1 li a1,16 + 300df2e: 52418513 addi a0,gp,1316 # 4000b58 + 300df32: 220d jal ra,300e054 + 300df34: 000f47b7 lui a5,0xf4 + 300df38: 24078593 addi a1,a5,576 # f4240 + 300df3c: 4509 li a0,2 + 300df3e: 2a09 jal ra,300e050 + 300df40: fef44783 lbu a5,-17(s0) + 300df44: 0785 addi a5,a5,1 + 300df46: fef407a3 sb a5,-17(s0) + 300df4a: fef44703 lbu a4,-17(s0) + 300df4e: 479d li a5,7 + 300df50: f8e7f8e3 bgeu a5,a4,300dee0 + 300df54: 0001 nop + 300df56: 50b2 lw ra,44(sp) + 300df58: 5422 lw s0,40(sp) + 300df5a: 6145 addi sp,sp,48 + 300df5c: 8082 ret + +0300df5e : + 300df5e: 7179 addi sp,sp,-48 + 300df60: d606 sw ra,44(sp) + 300df62: d422 sw s0,40(sp) + 300df64: 1800 addi s0,sp,48 + 300df66: 87aa mv a5,a0 + 300df68: fcf40fa3 sb a5,-33(s0) + 300df6c: fe040723 sb zero,-18(s0) + 300df70: 4601 li a2,0 + 300df72: 45c1 li a1,16 + 300df74: 56c18513 addi a0,gp,1388 # 4000ba0 + 300df78: 2079 jal ra,300e006 + 300df7a: fe0407a3 sb zero,-17(s0) + 300df7e: a8a9 j 300dfd8 + 300df80: 4601 li a2,0 + 300df82: 45c1 li a1,16 + 300df84: 52418513 addi a0,gp,1316 # 4000b58 + 300df88: 20f1 jal ra,300e054 + 300df8a: 000f47b7 lui a5,0xf4 + 300df8e: 24078593 addi a1,a5,576 # f4240 + 300df92: 4509 li a0,2 + 300df94: 2875 jal ra,300e050 + 300df96: 4605 li a2,1 + 300df98: 45c1 li a1,16 + 300df9a: 52418513 addi a0,gp,1316 # 4000b58 + 300df9e: 285d jal ra,300e054 + 300dfa0: fee44783 lbu a5,-18(s0) + 300dfa4: 0786 slli a5,a5,0x1 + 300dfa6: fef40723 sb a5,-18(s0) + 300dfaa: 45c1 li a1,16 + 300dfac: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dfb0: d02f60ef jal ra,30044b2 + 300dfb4: 87aa mv a5,a0 + 300dfb6: c791 beqz a5,300dfc2 + 300dfb8: fee44783 lbu a5,-18(s0) + 300dfbc: 0785 addi a5,a5,1 + 300dfbe: fef40723 sb a5,-18(s0) + 300dfc2: 000f47b7 lui a5,0xf4 + 300dfc6: 24078593 addi a1,a5,576 # f4240 + 300dfca: 4509 li a0,2 + 300dfcc: 2051 jal ra,300e050 + 300dfce: fef44783 lbu a5,-17(s0) + 300dfd2: 0785 addi a5,a5,1 + 300dfd4: fef407a3 sb a5,-17(s0) + 300dfd8: fef44703 lbu a4,-17(s0) + 300dfdc: 479d li a5,7 + 300dfde: fae7f1e3 bgeu a5,a4,300df80 + 300dfe2: 4605 li a2,1 + 300dfe4: 45c1 li a1,16 + 300dfe6: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dfea: 2831 jal ra,300e006 + 300dfec: fdf44783 lbu a5,-33(s0) + 300dff0: e399 bnez a5,300dff6 + 300dff2: 3dbd jal ra,300de70 + 300dff4: a011 j 300dff8 + 300dff6: 3525 jal ra,300de1e + 300dff8: fee44783 lbu a5,-18(s0) + 300dffc: 853e mv a0,a5 + 300dffe: 50b2 lw ra,44(sp) + 300e000: 5422 lw s0,40(sp) + 300e002: 6145 addi sp,sp,48 + 300e004: 8082 ret + +0300e006 : + 300e006: ad6f606f j 30042dc + +0300e00a : + 300e00a: 1141 addi sp,sp,-16 + 300e00c: c606 sw ra,12(sp) + 300e00e: c422 sw s0,8(sp) + 300e010: 0800 addi s0,sp,16 + 300e012: 4601 li a2,0 + 300e014: 4591 li a1,4 + 300e016: 4dc18513 addi a0,gp,1244 # 4000b10 + 300e01a: 282d jal ra,300e054 + 300e01c: 000f47b7 lui a5,0xf4 + 300e020: 24078593 addi a1,a5,576 # f4240 + 300e024: 679d lui a5,0x7 + 300e026: 53078513 addi a0,a5,1328 # 7530 + 300e02a: 201d jal ra,300e050 + 300e02c: 4605 li a2,1 + 300e02e: 4591 li a1,4 + 300e030: 4dc18513 addi a0,gp,1244 # 4000b10 + 300e034: 2005 jal ra,300e054 + 300e036: 000f47b7 lui a5,0xf4 + 300e03a: 24078593 addi a1,a5,576 # f4240 + 300e03e: 679d lui a5,0x7 + 300e040: 53078513 addi a0,a5,1328 # 7530 + 300e044: 2031 jal ra,300e050 + 300e046: 0001 nop + 300e048: 40b2 lw ra,12(sp) + 300e04a: 4422 lw s0,8(sp) + 300e04c: 0141 addi sp,sp,16 + 300e04e: 8082 ret + +0300e050 : + 300e050: a94f306f j 30012e4 + +0300e054 : + 300e054: b70f606f j 30043c4 + +0300e058 : + 300e058: 7179 addi sp,sp,-48 + 300e05a: d606 sw ra,44(sp) + 300e05c: d422 sw s0,40(sp) + 300e05e: 1800 addi s0,sp,48 + 300e060: 87aa mv a5,a0 + 300e062: 872e mv a4,a1 + 300e064: fcc42c23 sw a2,-40(s0) + 300e068: fcd42a23 sw a3,-44(s0) + 300e06c: fcf40fa3 sb a5,-33(s0) + 300e070: 87ba mv a5,a4 + 300e072: fcf40f23 sb a5,-34(s0) + 300e076: fe042423 sw zero,-24(s0) + 300e07a: 3999 jal ra,300dcd0 + 300e07c: fdf44783 lbu a5,-33(s0) + 300e080: 0786 slli a5,a5,0x1 + 300e082: 9f81 uxtb a5 + 300e084: 853e mv a0,a5 + 300e086: 3d35 jal ra,300dec2 + 300e088: 39e5 jal ra,300dd80 + 300e08a: 87aa mv a5,a0 + 300e08c: 873e mv a4,a5 + 300e08e: 4785 li a5,1 + 300e090: 00f71563 bne a4,a5,300e09a + 300e094: 3179 jal ra,300dd22 + 300e096: 4785 li a5,1 + 300e098: a085 j 300e0f8 + 300e09a: fde44783 lbu a5,-34(s0) + 300e09e: 853e mv a0,a5 + 300e0a0: 350d jal ra,300dec2 + 300e0a2: 39f9 jal ra,300dd80 + 300e0a4: 87aa mv a5,a0 + 300e0a6: 873e mv a4,a5 + 300e0a8: 4785 li a5,1 + 300e0aa: 00f71563 bne a4,a5,300e0b4 + 300e0ae: 3995 jal ra,300dd22 + 300e0b0: 4785 li a5,1 + 300e0b2: a099 j 300e0f8 + 300e0b4: fe042623 sw zero,-20(s0) + 300e0b8: a03d j 300e0e6 + 300e0ba: fec42783 lw a5,-20(s0) + 300e0be: fd842703 lw a4,-40(s0) + 300e0c2: 97ba add a5,a5,a4 + 300e0c4: 239c lbu a5,0(a5) + 300e0c6: 853e mv a0,a5 + 300e0c8: 3bed jal ra,300dec2 + 300e0ca: 395d jal ra,300dd80 + 300e0cc: 87aa mv a5,a0 + 300e0ce: 873e mv a4,a5 + 300e0d0: 4785 li a5,1 + 300e0d2: 00f71563 bne a4,a5,300e0dc + 300e0d6: 31b1 jal ra,300dd22 + 300e0d8: 4785 li a5,1 + 300e0da: a839 j 300e0f8 + 300e0dc: fec42783 lw a5,-20(s0) + 300e0e0: 0785 addi a5,a5,1 + 300e0e2: fef42623 sw a5,-20(s0) + 300e0e6: fec42703 lw a4,-20(s0) + 300e0ea: fd442783 lw a5,-44(s0) + 300e0ee: fcf746e3 blt a4,a5,300e0ba + 300e0f2: 3905 jal ra,300dd22 + 300e0f4: fe842783 lw a5,-24(s0) + 300e0f8: 853e mv a0,a5 + 300e0fa: 50b2 lw ra,44(sp) + 300e0fc: 5422 lw s0,40(sp) + 300e0fe: 6145 addi sp,sp,48 + 300e100: 8082 ret + +0300e102 : + 300e102: 7179 addi sp,sp,-48 + 300e104: d606 sw ra,44(sp) + 300e106: d422 sw s0,40(sp) + 300e108: 1800 addi s0,sp,48 + 300e10a: 87aa mv a5,a0 + 300e10c: 872e mv a4,a1 + 300e10e: fcc42c23 sw a2,-40(s0) + 300e112: fcd42a23 sw a3,-44(s0) + 300e116: fcf40fa3 sb a5,-33(s0) + 300e11a: 87ba mv a5,a4 + 300e11c: fcf40f23 sb a5,-34(s0) + 300e120: fe042623 sw zero,-20(s0) + 300e124: 3675 jal ra,300dcd0 + 300e126: fdf44783 lbu a5,-33(s0) + 300e12a: 0786 slli a5,a5,0x1 + 300e12c: 9f81 uxtb a5 + 300e12e: 853e mv a0,a5 + 300e130: 3b49 jal ra,300dec2 + 300e132: 31b9 jal ra,300dd80 + 300e134: 87aa mv a5,a0 + 300e136: 873e mv a4,a5 + 300e138: 4785 li a5,1 + 300e13a: 00f71563 bne a4,a5,300e144 + 300e13e: 36d5 jal ra,300dd22 + 300e140: 4785 li a5,1 + 300e142: a059 j 300e1c8 + 300e144: fde44783 lbu a5,-34(s0) + 300e148: 853e mv a0,a5 + 300e14a: 3ba5 jal ra,300dec2 + 300e14c: 3915 jal ra,300dd80 + 300e14e: 87aa mv a5,a0 + 300e150: 873e mv a4,a5 + 300e152: 4785 li a5,1 + 300e154: 00f71563 bne a4,a5,300e15e + 300e158: 36e9 jal ra,300dd22 + 300e15a: 4785 li a5,1 + 300e15c: a0b5 j 300e1c8 + 300e15e: 36d1 jal ra,300dd22 + 300e160: 3e85 jal ra,300dcd0 + 300e162: fdf44783 lbu a5,-33(s0) + 300e166: 0786 slli a5,a5,0x1 + 300e168: 07e2 slli a5,a5,0x18 + 300e16a: 87e1 srai a5,a5,0x18 + 300e16c: 0017e793 ori a5,a5,1 + 300e170: 07e2 slli a5,a5,0x18 + 300e172: 87e1 srai a5,a5,0x18 + 300e174: 9f81 uxtb a5 + 300e176: 853e mv a0,a5 + 300e178: 33a9 jal ra,300dec2 + 300e17a: 3119 jal ra,300dd80 + 300e17c: 87aa mv a5,a0 + 300e17e: 873e mv a4,a5 + 300e180: 4785 li a5,1 + 300e182: 02f71d63 bne a4,a5,300e1bc + 300e186: 3e71 jal ra,300dd22 + 300e188: 4785 li a5,1 + 300e18a: a83d j 300e1c8 + 300e18c: fd442783 lw a5,-44(s0) + 300e190: 0027a793 slti a5,a5,2 + 300e194: 0017c793 xori a5,a5,1 + 300e198: 9f81 uxtb a5 + 300e19a: 853e mv a0,a5 + 300e19c: 33c9 jal ra,300df5e + 300e19e: 87aa mv a5,a0 + 300e1a0: 873e mv a4,a5 + 300e1a2: fd842783 lw a5,-40(s0) + 300e1a6: a398 sb a4,0(a5) + 300e1a8: fd442783 lw a5,-44(s0) + 300e1ac: 17fd addi a5,a5,-1 + 300e1ae: fcf42a23 sw a5,-44(s0) + 300e1b2: fd842783 lw a5,-40(s0) + 300e1b6: 0785 addi a5,a5,1 + 300e1b8: fcf42c23 sw a5,-40(s0) + 300e1bc: fd442783 lw a5,-44(s0) + 300e1c0: f7f1 bnez a5,300e18c + 300e1c2: 3685 jal ra,300dd22 + 300e1c4: fec42783 lw a5,-20(s0) + 300e1c8: 853e mv a0,a5 + 300e1ca: 50b2 lw ra,44(sp) + 300e1cc: 5422 lw s0,40(sp) + 300e1ce: 6145 addi sp,sp,48 + 300e1d0: 8082 ret + +0300e1d2 : + 300e1d2: 7179 addi sp,sp,-48 + 300e1d4: d606 sw ra,44(sp) + 300e1d6: d422 sw s0,40(sp) + 300e1d8: 1800 addi s0,sp,48 + 300e1da: 87aa mv a5,a0 + 300e1dc: 86ae mv a3,a1 + 300e1de: 8732 mv a4,a2 + 300e1e0: fcf40fa3 sb a5,-33(s0) + 300e1e4: 87b6 mv a5,a3 + 300e1e6: fcf40f23 sb a5,-34(s0) + 300e1ea: 87ba mv a5,a4 + 300e1ec: fcf40ea3 sb a5,-35(s0) + 300e1f0: fe042623 sw zero,-20(s0) + 300e1f4: 4785 li a5,1 + 300e1f6: fef42423 sw a5,-24(s0) + 300e1fa: fdd40613 addi a2,s0,-35 + 300e1fe: fde44703 lbu a4,-34(s0) + 300e202: fdf44783 lbu a5,-33(s0) + 300e206: fe842683 lw a3,-24(s0) + 300e20a: 85ba mv a1,a4 + 300e20c: 853e mv a0,a5 + 300e20e: 35a9 jal ra,300e058 + 300e210: fea42623 sw a0,-20(s0) + 300e214: fec42783 lw a5,-20(s0) + 300e218: 853e mv a0,a5 + 300e21a: 50b2 lw ra,44(sp) + 300e21c: 5422 lw s0,40(sp) + 300e21e: 6145 addi sp,sp,48 + 300e220: 8082 ret + +0300e222 : + 300e222: 7179 addi sp,sp,-48 + 300e224: d606 sw ra,44(sp) + 300e226: d422 sw s0,40(sp) + 300e228: 1800 addi s0,sp,48 + 300e22a: 87aa mv a5,a0 + 300e22c: 86ae mv a3,a1 + 300e22e: 8732 mv a4,a2 + 300e230: fcf40fa3 sb a5,-33(s0) + 300e234: 87b6 mv a5,a3 + 300e236: fcf40f23 sb a5,-34(s0) + 300e23a: 87ba mv a5,a4 + 300e23c: fcf41e23 sh a5,-36(s0) + 300e240: fe042623 sw zero,-20(s0) + 300e244: fdc45783 lhu a5,-36(s0) + 300e248: 83a1 srli a5,a5,0x8 + 300e24a: 9fa1 uxth a5 + 300e24c: 9f81 uxtb a5 + 300e24e: fef40423 sb a5,-24(s0) + 300e252: fdc45783 lhu a5,-36(s0) + 300e256: 9f81 uxtb a5 + 300e258: fef404a3 sb a5,-23(s0) + 300e25c: fe840613 addi a2,s0,-24 + 300e260: fde44703 lbu a4,-34(s0) + 300e264: fdf44783 lbu a5,-33(s0) + 300e268: 4689 li a3,2 + 300e26a: 85ba mv a1,a4 + 300e26c: 853e mv a0,a5 + 300e26e: 33ed jal ra,300e058 + 300e270: fea42623 sw a0,-20(s0) + 300e274: fec42783 lw a5,-20(s0) + 300e278: 853e mv a0,a5 + 300e27a: 50b2 lw ra,44(sp) + 300e27c: 5422 lw s0,40(sp) + 300e27e: 6145 addi sp,sp,48 + 300e280: 8082 ret + +0300e282 : + 300e282: 7179 addi sp,sp,-48 + 300e284: d606 sw ra,44(sp) + 300e286: d422 sw s0,40(sp) + 300e288: 1800 addi s0,sp,48 + 300e28a: 87aa mv a5,a0 + 300e28c: 872e mv a4,a1 + 300e28e: fcc42c23 sw a2,-40(s0) + 300e292: fcf40fa3 sb a5,-33(s0) + 300e296: 87ba mv a5,a4 + 300e298: fcf40f23 sb a5,-34(s0) + 300e29c: fe042623 sw zero,-20(s0) + 300e2a0: 4785 li a5,1 + 300e2a2: fef42423 sw a5,-24(s0) + 300e2a6: fde44703 lbu a4,-34(s0) + 300e2aa: fdf44783 lbu a5,-33(s0) + 300e2ae: fe842683 lw a3,-24(s0) + 300e2b2: fd842603 lw a2,-40(s0) + 300e2b6: 85ba mv a1,a4 + 300e2b8: 853e mv a0,a5 + 300e2ba: 35a1 jal ra,300e102 + 300e2bc: fea42623 sw a0,-20(s0) + 300e2c0: fec42783 lw a5,-20(s0) + 300e2c4: 853e mv a0,a5 + 300e2c6: 50b2 lw ra,44(sp) + 300e2c8: 5422 lw s0,40(sp) + 300e2ca: 6145 addi sp,sp,48 + 300e2cc: 8082 ret + +0300e2ce : + 300e2ce: 7179 addi sp,sp,-48 + 300e2d0: d606 sw ra,44(sp) + 300e2d2: d422 sw s0,40(sp) + 300e2d4: 1800 addi s0,sp,48 + 300e2d6: 87aa mv a5,a0 + 300e2d8: 872e mv a4,a1 + 300e2da: fcc42c23 sw a2,-40(s0) + 300e2de: fcf40fa3 sb a5,-33(s0) + 300e2e2: 87ba mv a5,a4 + 300e2e4: fcf40f23 sb a5,-34(s0) + 300e2e8: fe042623 sw zero,-20(s0) + 300e2ec: fe041423 sh zero,-24(s0) + 300e2f0: fe840613 addi a2,s0,-24 + 300e2f4: fde44703 lbu a4,-34(s0) + 300e2f8: fdf44783 lbu a5,-33(s0) + 300e2fc: 4689 li a3,2 + 300e2fe: 85ba mv a1,a4 + 300e300: 853e mv a0,a5 + 300e302: 3501 jal ra,300e102 + 300e304: fea42623 sw a0,-20(s0) + 300e308: fe844783 lbu a5,-24(s0) + 300e30c: 9fa1 uxth a5 + 300e30e: 07a2 slli a5,a5,0x8 + 300e310: 01079713 slli a4,a5,0x10 + 300e314: 8341 srli a4,a4,0x10 + 300e316: fe944783 lbu a5,-23(s0) + 300e31a: 9fa1 uxth a5 + 300e31c: 97ba add a5,a5,a4 + 300e31e: 01079713 slli a4,a5,0x10 + 300e322: 8341 srli a4,a4,0x10 + 300e324: fd842783 lw a5,-40(s0) + 300e328: a39a sh a4,0(a5) + 300e32a: fec42783 lw a5,-20(s0) + 300e32e: 853e mv a0,a5 + 300e330: 50b2 lw ra,44(sp) + 300e332: 5422 lw s0,40(sp) + 300e334: 6145 addi sp,sp,48 + 300e336: 8082 ret + +0300e338 : + 300e338: 7179 addi sp,sp,-48 + 300e33a: d606 sw ra,44(sp) + 300e33c: d422 sw s0,40(sp) + 300e33e: 1800 addi s0,sp,48 + 300e340: 87aa mv a5,a0 + 300e342: 872e mv a4,a1 + 300e344: fcc42c23 sw a2,-40(s0) + 300e348: fcf40fa3 sb a5,-33(s0) + 300e34c: 87ba mv a5,a4 + 300e34e: fcf40f23 sb a5,-34(s0) + 300e352: fe042623 sw zero,-20(s0) + 300e356: fe840613 addi a2,s0,-24 + 300e35a: fde44703 lbu a4,-34(s0) + 300e35e: fdf44783 lbu a5,-33(s0) + 300e362: 4691 li a3,4 + 300e364: 85ba mv a1,a4 + 300e366: 853e mv a0,a5 + 300e368: 3b69 jal ra,300e102 + 300e36a: fea42623 sw a0,-20(s0) + 300e36e: fe844783 lbu a5,-24(s0) + 300e372: 01879713 slli a4,a5,0x18 + 300e376: fe944783 lbu a5,-23(s0) + 300e37a: 07c2 slli a5,a5,0x10 + 300e37c: 973e add a4,a4,a5 + 300e37e: fea44783 lbu a5,-22(s0) + 300e382: 07a2 slli a5,a5,0x8 + 300e384: 97ba add a5,a5,a4 + 300e386: feb44703 lbu a4,-21(s0) + 300e38a: 973e add a4,a4,a5 + 300e38c: fd842783 lw a5,-40(s0) + 300e390: c398 sw a4,0(a5) + 300e392: fec42783 lw a5,-20(s0) + 300e396: 853e mv a0,a5 + 300e398: 50b2 lw ra,44(sp) + 300e39a: 5422 lw s0,40(sp) + 300e39c: 6145 addi sp,sp,48 + 300e39e: 8082 ret + +0300e3a0 : + 300e3a0: 7179 addi sp,sp,-48 + 300e3a2: d606 sw ra,44(sp) + 300e3a4: d422 sw s0,40(sp) + 300e3a6: 1800 addi s0,sp,48 + 300e3a8: fca42e23 sw a0,-36(s0) + 300e3ac: 87ae mv a5,a1 + 300e3ae: fcc42a23 sw a2,-44(s0) + 300e3b2: fcd42823 sw a3,-48(s0) + 300e3b6: fcf40da3 sb a5,-37(s0) + 300e3ba: fe0407a3 sb zero,-17(s0) + 300e3be: fe042423 sw zero,-24(s0) + 300e3c2: fd042703 lw a4,-48(s0) + 300e3c6: 03f00793 li a5,63 + 300e3ca: 00e7f563 bgeu a5,a4,300e3d4 + 300e3ce: 57f1 li a5,-4 + 300e3d0: fef407a3 sb a5,-17(s0) + 300e3d4: fdc42783 lw a5,-36(s0) + 300e3d8: 1807c783 lbu a5,384(a5) + 300e3dc: fef403a3 sb a5,-25(s0) + 300e3e0: fd042683 lw a3,-48(s0) + 300e3e4: fdb44703 lbu a4,-37(s0) + 300e3e8: fe744783 lbu a5,-25(s0) + 300e3ec: fd442603 lw a2,-44(s0) + 300e3f0: 85ba mv a1,a4 + 300e3f2: 853e mv a0,a5 + 300e3f4: 3195 jal ra,300e058 + 300e3f6: fea42423 sw a0,-24(s0) + 300e3fa: fe842783 lw a5,-24(s0) + 300e3fe: c781 beqz a5,300e406 + 300e400: 57b1 li a5,-20 + 300e402: fef407a3 sb a5,-17(s0) + 300e406: fef40783 lb a5,-17(s0) + 300e40a: 853e mv a0,a5 + 300e40c: 50b2 lw ra,44(sp) + 300e40e: 5422 lw s0,40(sp) + 300e410: 6145 addi sp,sp,48 + 300e412: 8082 ret + +0300e414 : + 300e414: 7179 addi sp,sp,-48 + 300e416: d606 sw ra,44(sp) + 300e418: d422 sw s0,40(sp) + 300e41a: 1800 addi s0,sp,48 + 300e41c: fca42e23 sw a0,-36(s0) + 300e420: 87ae mv a5,a1 + 300e422: fcc42a23 sw a2,-44(s0) + 300e426: fcd42823 sw a3,-48(s0) + 300e42a: fcf40da3 sb a5,-37(s0) + 300e42e: fe0407a3 sb zero,-17(s0) + 300e432: fd042703 lw a4,-48(s0) + 300e436: 03f00793 li a5,63 + 300e43a: 00e7f563 bgeu a5,a4,300e444 + 300e43e: 57f1 li a5,-4 + 300e440: fef407a3 sb a5,-17(s0) + 300e444: fdc42783 lw a5,-36(s0) + 300e448: 1807c783 lbu a5,384(a5) + 300e44c: fef40723 sb a5,-18(s0) + 300e450: fd042683 lw a3,-48(s0) + 300e454: fdb44703 lbu a4,-37(s0) + 300e458: fee44783 lbu a5,-18(s0) + 300e45c: fd442603 lw a2,-44(s0) + 300e460: 85ba mv a1,a4 + 300e462: 853e mv a0,a5 + 300e464: 3979 jal ra,300e102 + 300e466: fea42423 sw a0,-24(s0) + 300e46a: fe842783 lw a5,-24(s0) + 300e46e: c781 beqz a5,300e476 + 300e470: 57b1 li a5,-20 + 300e472: fef407a3 sb a5,-17(s0) + 300e476: fef40783 lb a5,-17(s0) + 300e47a: 853e mv a0,a5 + 300e47c: 50b2 lw ra,44(sp) + 300e47e: 5422 lw s0,40(sp) + 300e480: 6145 addi sp,sp,48 + 300e482: 8082 ret + +0300e484 : + 300e484: 7179 addi sp,sp,-48 + 300e486: d606 sw ra,44(sp) + 300e488: d422 sw s0,40(sp) + 300e48a: 1800 addi s0,sp,48 + 300e48c: fca42e23 sw a0,-36(s0) + 300e490: 87ae mv a5,a1 + 300e492: 8732 mv a4,a2 + 300e494: fcf40da3 sb a5,-37(s0) + 300e498: 87ba mv a5,a4 + 300e49a: fcf40d23 sb a5,-38(s0) + 300e49e: fe0407a3 sb zero,-17(s0) + 300e4a2: fdc42783 lw a5,-36(s0) + 300e4a6: 1807c783 lbu a5,384(a5) + 300e4aa: fef40723 sb a5,-18(s0) + 300e4ae: fda44683 lbu a3,-38(s0) + 300e4b2: fdb44703 lbu a4,-37(s0) + 300e4b6: fee44783 lbu a5,-18(s0) + 300e4ba: 8636 mv a2,a3 + 300e4bc: 85ba mv a1,a4 + 300e4be: 853e mv a0,a5 + 300e4c0: 3b09 jal ra,300e1d2 + 300e4c2: fea42423 sw a0,-24(s0) + 300e4c6: fe842783 lw a5,-24(s0) + 300e4ca: c781 beqz a5,300e4d2 + 300e4cc: 57b1 li a5,-20 + 300e4ce: fef407a3 sb a5,-17(s0) + 300e4d2: fef40783 lb a5,-17(s0) + 300e4d6: 853e mv a0,a5 + 300e4d8: 50b2 lw ra,44(sp) + 300e4da: 5422 lw s0,40(sp) + 300e4dc: 6145 addi sp,sp,48 + 300e4de: 8082 ret + +0300e4e0 : + 300e4e0: 7179 addi sp,sp,-48 + 300e4e2: d606 sw ra,44(sp) + 300e4e4: d422 sw s0,40(sp) + 300e4e6: 1800 addi s0,sp,48 + 300e4e8: fca42e23 sw a0,-36(s0) + 300e4ec: 87ae mv a5,a1 + 300e4ee: 8732 mv a4,a2 + 300e4f0: fcf40da3 sb a5,-37(s0) + 300e4f4: 87ba mv a5,a4 + 300e4f6: fcf41c23 sh a5,-40(s0) + 300e4fa: fe0407a3 sb zero,-17(s0) + 300e4fe: fdc42783 lw a5,-36(s0) + 300e502: 1807c783 lbu a5,384(a5) + 300e506: fef40723 sb a5,-18(s0) + 300e50a: fd845683 lhu a3,-40(s0) + 300e50e: fdb44703 lbu a4,-37(s0) + 300e512: fee44783 lbu a5,-18(s0) + 300e516: 8636 mv a2,a3 + 300e518: 85ba mv a1,a4 + 300e51a: 853e mv a0,a5 + 300e51c: 3319 jal ra,300e222 + 300e51e: fea42423 sw a0,-24(s0) + 300e522: fe842783 lw a5,-24(s0) + 300e526: c781 beqz a5,300e52e + 300e528: 57b1 li a5,-20 + 300e52a: fef407a3 sb a5,-17(s0) + 300e52e: fef40783 lb a5,-17(s0) + 300e532: 853e mv a0,a5 + 300e534: 50b2 lw ra,44(sp) + 300e536: 5422 lw s0,40(sp) + 300e538: 6145 addi sp,sp,48 + 300e53a: 8082 ret + +0300e53c : + 300e53c: 7179 addi sp,sp,-48 + 300e53e: d606 sw ra,44(sp) + 300e540: d422 sw s0,40(sp) + 300e542: 1800 addi s0,sp,48 + 300e544: fca42e23 sw a0,-36(s0) + 300e548: 87ae mv a5,a1 + 300e54a: 8736 mv a4,a3 + 300e54c: fcf40da3 sb a5,-37(s0) + 300e550: 87b2 mv a5,a2 + 300e552: fcf40d23 sb a5,-38(s0) + 300e556: 87ba mv a5,a4 + 300e558: fcf40ca3 sb a5,-39(s0) + 300e55c: fe0407a3 sb zero,-17(s0) + 300e560: fdc42783 lw a5,-36(s0) + 300e564: 1807c783 lbu a5,384(a5) + 300e568: fef40723 sb a5,-18(s0) + 300e56c: fe740693 addi a3,s0,-25 + 300e570: fdb44703 lbu a4,-37(s0) + 300e574: fee44783 lbu a5,-18(s0) + 300e578: 8636 mv a2,a3 + 300e57a: 85ba mv a1,a4 + 300e57c: 853e mv a0,a5 + 300e57e: 3311 jal ra,300e282 + 300e580: fea42423 sw a0,-24(s0) + 300e584: fe842783 lw a5,-24(s0) + 300e588: c781 beqz a5,300e590 + 300e58a: 57b1 li a5,-20 + 300e58c: fef407a3 sb a5,-17(s0) + 300e590: fef40783 lb a5,-17(s0) + 300e594: e3a1 bnez a5,300e5d4 + 300e596: fe744703 lbu a4,-25(s0) + 300e59a: fda44783 lbu a5,-38(s0) + 300e59e: 8ff9 and a5,a5,a4 + 300e5a0: 0ff7f713 andi a4,a5,255 + 300e5a4: fd944783 lbu a5,-39(s0) + 300e5a8: 8fd9 or a5,a5,a4 + 300e5aa: 9f81 uxtb a5 + 300e5ac: fef403a3 sb a5,-25(s0) + 300e5b0: fe744683 lbu a3,-25(s0) + 300e5b4: fdb44703 lbu a4,-37(s0) + 300e5b8: fee44783 lbu a5,-18(s0) + 300e5bc: 8636 mv a2,a3 + 300e5be: 85ba mv a1,a4 + 300e5c0: 853e mv a0,a5 + 300e5c2: 3901 jal ra,300e1d2 + 300e5c4: fea42423 sw a0,-24(s0) + 300e5c8: fe842783 lw a5,-24(s0) + 300e5cc: c781 beqz a5,300e5d4 + 300e5ce: 57b1 li a5,-20 + 300e5d0: fef407a3 sb a5,-17(s0) + 300e5d4: fef40783 lb a5,-17(s0) + 300e5d8: 853e mv a0,a5 + 300e5da: 50b2 lw ra,44(sp) + 300e5dc: 5422 lw s0,40(sp) + 300e5de: 6145 addi sp,sp,48 + 300e5e0: 8082 ret + +0300e5e2 : + 300e5e2: 7179 addi sp,sp,-48 + 300e5e4: d606 sw ra,44(sp) + 300e5e6: d422 sw s0,40(sp) + 300e5e8: 1800 addi s0,sp,48 + 300e5ea: fca42e23 sw a0,-36(s0) + 300e5ee: 87ae mv a5,a1 + 300e5f0: fcc42a23 sw a2,-44(s0) + 300e5f4: fcf40da3 sb a5,-37(s0) + 300e5f8: fe0407a3 sb zero,-17(s0) + 300e5fc: fdc42783 lw a5,-36(s0) + 300e600: 1807c783 lbu a5,384(a5) + 300e604: fef40723 sb a5,-18(s0) + 300e608: fdb44703 lbu a4,-37(s0) + 300e60c: fee44783 lbu a5,-18(s0) + 300e610: fd442603 lw a2,-44(s0) + 300e614: 85ba mv a1,a4 + 300e616: 853e mv a0,a5 + 300e618: 31ad jal ra,300e282 + 300e61a: fea42423 sw a0,-24(s0) + 300e61e: fe842783 lw a5,-24(s0) + 300e622: c781 beqz a5,300e62a + 300e624: 57b1 li a5,-20 + 300e626: fef407a3 sb a5,-17(s0) + 300e62a: fef40783 lb a5,-17(s0) + 300e62e: 853e mv a0,a5 + 300e630: 50b2 lw ra,44(sp) + 300e632: 5422 lw s0,40(sp) + 300e634: 6145 addi sp,sp,48 + 300e636: 8082 ret + +0300e638 : + 300e638: 7179 addi sp,sp,-48 + 300e63a: d606 sw ra,44(sp) + 300e63c: d422 sw s0,40(sp) + 300e63e: 1800 addi s0,sp,48 + 300e640: fca42e23 sw a0,-36(s0) + 300e644: 87ae mv a5,a1 + 300e646: fcc42a23 sw a2,-44(s0) + 300e64a: fcf40da3 sb a5,-37(s0) + 300e64e: fe0407a3 sb zero,-17(s0) + 300e652: fdc42783 lw a5,-36(s0) + 300e656: 1807c783 lbu a5,384(a5) + 300e65a: fef40723 sb a5,-18(s0) + 300e65e: fdb44703 lbu a4,-37(s0) + 300e662: fee44783 lbu a5,-18(s0) + 300e666: fd442603 lw a2,-44(s0) + 300e66a: 85ba mv a1,a4 + 300e66c: 853e mv a0,a5 + 300e66e: 3185 jal ra,300e2ce + 300e670: fea42423 sw a0,-24(s0) + 300e674: fe842783 lw a5,-24(s0) + 300e678: c781 beqz a5,300e680 + 300e67a: 57b1 li a5,-20 + 300e67c: fef407a3 sb a5,-17(s0) + 300e680: fef40783 lb a5,-17(s0) + 300e684: 853e mv a0,a5 + 300e686: 50b2 lw ra,44(sp) + 300e688: 5422 lw s0,40(sp) + 300e68a: 6145 addi sp,sp,48 + 300e68c: 8082 ret + +0300e68e : + 300e68e: 7179 addi sp,sp,-48 + 300e690: d606 sw ra,44(sp) + 300e692: d422 sw s0,40(sp) + 300e694: 1800 addi s0,sp,48 + 300e696: fca42e23 sw a0,-36(s0) + 300e69a: 87ae mv a5,a1 + 300e69c: fcc42a23 sw a2,-44(s0) + 300e6a0: fcf40da3 sb a5,-37(s0) + 300e6a4: fe0407a3 sb zero,-17(s0) + 300e6a8: fdc42783 lw a5,-36(s0) + 300e6ac: 1807c783 lbu a5,384(a5) + 300e6b0: fef40723 sb a5,-18(s0) + 300e6b4: fdb44703 lbu a4,-37(s0) + 300e6b8: fee44783 lbu a5,-18(s0) + 300e6bc: fd442603 lw a2,-44(s0) + 300e6c0: 85ba mv a1,a4 + 300e6c2: 853e mv a0,a5 + 300e6c4: 3995 jal ra,300e338 + 300e6c6: fea42423 sw a0,-24(s0) + 300e6ca: fe842783 lw a5,-24(s0) + 300e6ce: c781 beqz a5,300e6d6 + 300e6d0: 57b1 li a5,-20 + 300e6d2: fef407a3 sb a5,-17(s0) + 300e6d6: fef40783 lb a5,-17(s0) + 300e6da: 853e mv a0,a5 + 300e6dc: 50b2 lw ra,44(sp) + 300e6de: 5422 lw s0,40(sp) + 300e6e0: 6145 addi sp,sp,48 + 300e6e2: 8082 ret + +0300e6e4 : + 300e6e4: 7179 addi sp,sp,-48 + 300e6e6: d622 sw s0,44(sp) + 300e6e8: 1800 addi s0,sp,48 + 300e6ea: fca42e23 sw a0,-36(s0) + 300e6ee: fe0407a3 sb zero,-17(s0) + 300e6f2: fef40783 lb a5,-17(s0) + 300e6f6: 853e mv a0,a5 + 300e6f8: 5432 lw s0,44(sp) + 300e6fa: 6145 addi sp,sp,48 + 300e6fc: 8082 ret + +0300e6fe <__truncdfsf2>: + 300e6fe: 00202873 frrm a6 + 300e702: 001006b7 lui a3,0x100 + 300e706: 16fd addi a3,a3,-1 # fffff + 300e708: 8eed and a3,a3,a1 + 300e70a: 0145d893 srli a7,a1,0x14 + 300e70e: 00369793 slli a5,a3,0x3 + 300e712: 7ff8f893 andi a7,a7,2047 + 300e716: 01d55693 srli a3,a0,0x1d + 300e71a: 8edd or a3,a3,a5 + 300e71c: 00188793 addi a5,a7,1 + 300e720: 7ff7f793 andi a5,a5,2047 + 300e724: 4705 li a4,1 + 300e726: 81fd srli a1,a1,0x1f + 300e728: 00351613 slli a2,a0,0x3 + 300e72c: 16f75b63 bge a4,a5,300e8a2 <__truncdfsf2+0x1a4> + 300e730: c8088713 addi a4,a7,-896 + 300e734: 0fe00793 li a5,254 + 300e738: 0ae7d063 bge a5,a4,300e7d8 <__truncdfsf2+0xda> + 300e73c: 04080063 beqz a6,300e77c <__truncdfsf2+0x7e> + 300e740: 478d li a5,3 + 300e742: 02f81963 bne a6,a5,300e774 <__truncdfsf2+0x76> + 300e746: c99d beqz a1,300e77c <__truncdfsf2+0x7e> + 300e748: 57fd li a5,-1 + 300e74a: 0fe00713 li a4,254 + 300e74e: 4681 li a3,0 + 300e750: 4615 li a2,5 + 300e752: 4509 li a0,2 + 300e754: 00166613 ori a2,a2,1 + 300e758: 1aa80063 beq a6,a0,300e8f8 <__truncdfsf2+0x1fa> + 300e75c: 450d li a0,3 + 300e75e: 18a80a63 beq a6,a0,300e8f2 <__truncdfsf2+0x1f4> + 300e762: 12081763 bnez a6,300e890 <__truncdfsf2+0x192> + 300e766: 00f7f513 andi a0,a5,15 + 300e76a: 4891 li a7,4 + 300e76c: 13150263 beq a0,a7,300e890 <__truncdfsf2+0x192> + 300e770: 0791 addi a5,a5,4 + 300e772: aa39 j 300e890 <__truncdfsf2+0x192> + 300e774: 4789 li a5,2 + 300e776: fcf819e3 bne a6,a5,300e748 <__truncdfsf2+0x4a> + 300e77a: d5f9 beqz a1,300e748 <__truncdfsf2+0x4a> + 300e77c: 4781 li a5,0 + 300e77e: 0ff00713 li a4,255 + 300e782: 4615 li a2,5 + 300e784: 00579693 slli a3,a5,0x5 + 300e788: 0006db63 bgez a3,300e79e <__truncdfsf2+0xa0> + 300e78c: 0705 addi a4,a4,1 # 10001 + 300e78e: 0ff00693 li a3,255 + 300e792: 16d70563 beq a4,a3,300e8fc <__truncdfsf2+0x1fe> + 300e796: fc0006b7 lui a3,0xfc000 + 300e79a: 16fd addi a3,a3,-1 # fbffffff + 300e79c: 8ff5 and a5,a5,a3 + 300e79e: 0ff00693 li a3,255 + 300e7a2: 838d srli a5,a5,0x3 + 300e7a4: 00d71663 bne a4,a3,300e7b0 <__truncdfsf2+0xb2> + 300e7a8: c781 beqz a5,300e7b0 <__truncdfsf2+0xb2> + 300e7aa: 004007b7 lui a5,0x400 + 300e7ae: 4581 li a1,0 + 300e7b0: 008006b7 lui a3,0x800 + 300e7b4: 16fd addi a3,a3,-1 # 7fffff + 300e7b6: 8ff5 and a5,a5,a3 + 300e7b8: 808006b7 lui a3,0x80800 + 300e7bc: 0ff77713 andi a4,a4,255 + 300e7c0: 16fd addi a3,a3,-1 # 807fffff + 300e7c2: 075e slli a4,a4,0x17 + 300e7c4: 8ff5 and a5,a5,a3 + 300e7c6: 05fe slli a1,a1,0x1f + 300e7c8: 8fd9 or a5,a5,a4 + 300e7ca: 8fcd or a5,a5,a1 + 300e7cc: c219 beqz a2,300e7d2 <__truncdfsf2+0xd4> + 300e7ce: 00162073 csrs fflags,a2 + 300e7d2: f0078553 fmv.w.x fa0,a5 + 300e7d6: 8082 ret + 300e7d8: 08e04e63 bgtz a4,300e874 <__truncdfsf2+0x176> + 300e7dc: 57a5 li a5,-23 + 300e7de: 0ef74d63 blt a4,a5,300e8d8 <__truncdfsf2+0x1da> + 300e7e2: 008007b7 lui a5,0x800 + 300e7e6: 4379 li t1,30 + 300e7e8: 8edd or a3,a3,a5 + 300e7ea: 40e30333 sub t1,t1,a4 + 300e7ee: 47fd li a5,31 + 300e7f0: 0467ce63 blt a5,t1,300e84c <__truncdfsf2+0x14e> + 300e7f4: c8288893 addi a7,a7,-894 + 300e7f8: 011617b3 sll a5,a2,a7 + 300e7fc: 00f037b3 snez a5,a5 + 300e800: 011696b3 sll a3,a3,a7 + 300e804: 00665333 srl t1,a2,t1 + 300e808: 8edd or a3,a3,a5 + 300e80a: 00d367b3 or a5,t1,a3 + 300e80e: 4701 li a4,0 + 300e810: cff9 beqz a5,300e8ee <__truncdfsf2+0x1f0> + 300e812: 00179713 slli a4,a5,0x1 + 300e816: 00777693 andi a3,a4,7 + 300e81a: 4601 li a2,0 + 300e81c: c28d beqz a3,300e83e <__truncdfsf2+0x140> + 300e81e: 4689 li a3,2 + 300e820: 0cd80263 beq a6,a3,300e8e4 <__truncdfsf2+0x1e6> + 300e824: 468d li a3,3 + 300e826: 0ad80b63 beq a6,a3,300e8dc <__truncdfsf2+0x1de> + 300e82a: 4605 li a2,1 + 300e82c: 00081963 bnez a6,300e83e <__truncdfsf2+0x140> + 300e830: 00f77693 andi a3,a4,15 + 300e834: 4511 li a0,4 + 300e836: 4605 li a2,1 + 300e838: 00a68363 beq a3,a0,300e83e <__truncdfsf2+0x140> + 300e83c: 0711 addi a4,a4,4 + 300e83e: 01b75693 srli a3,a4,0x1b + 300e842: 0016c693 xori a3,a3,1 + 300e846: 8a85 andi a3,a3,1 + 300e848: 4701 li a4,0 + 300e84a: a83d j 300e888 <__truncdfsf2+0x18a> + 300e84c: 57f9 li a5,-2 + 300e84e: 40e78733 sub a4,a5,a4 + 300e852: 02000793 li a5,32 + 300e856: 00e6d733 srl a4,a3,a4 + 300e85a: 4501 li a0,0 + 300e85c: 00f30663 beq t1,a5,300e868 <__truncdfsf2+0x16a> + 300e860: ca288893 addi a7,a7,-862 + 300e864: 01169533 sll a0,a3,a7 + 300e868: 00c567b3 or a5,a0,a2 + 300e86c: 00f037b3 snez a5,a5 + 300e870: 8fd9 or a5,a5,a4 + 300e872: bf71 j 300e80e <__truncdfsf2+0x110> + 300e874: 051a slli a0,a0,0x6 + 300e876: 00a037b3 snez a5,a0 + 300e87a: 068e slli a3,a3,0x3 + 300e87c: 8275 srli a2,a2,0x1d + 300e87e: 8edd or a3,a3,a5 + 300e880: 00c6e7b3 or a5,a3,a2 + 300e884: 4681 li a3,0 + 300e886: 4601 li a2,0 + 300e888: 0077f513 andi a0,a5,7 + 300e88c: ec0513e3 bnez a0,300e752 <__truncdfsf2+0x54> + 300e890: ee068ae3 beqz a3,300e784 <__truncdfsf2+0x86> + 300e894: 00167693 andi a3,a2,1 + 300e898: ee0686e3 beqz a3,300e784 <__truncdfsf2+0x86> + 300e89c: 00266613 ori a2,a2,2 + 300e8a0: b5d5 j 300e784 <__truncdfsf2+0x86> + 300e8a2: 00c6e7b3 or a5,a3,a2 + 300e8a6: 00089563 bnez a7,300e8b0 <__truncdfsf2+0x1b2> + 300e8aa: 00f037b3 snez a5,a5 + 300e8ae: b785 j 300e80e <__truncdfsf2+0x110> + 300e8b0: cf8d beqz a5,300e8ea <__truncdfsf2+0x1ec> + 300e8b2: 7ff00793 li a5,2047 + 300e8b6: 4601 li a2,0 + 300e8b8: 00f89863 bne a7,a5,300e8c8 <__truncdfsf2+0x1ca> + 300e8bc: 00400637 lui a2,0x400 + 300e8c0: 8e75 and a2,a2,a3 + 300e8c2: 00163613 seqz a2,a2 + 300e8c6: 0612 slli a2,a2,0x4 + 300e8c8: 068e slli a3,a3,0x3 + 300e8ca: 020007b7 lui a5,0x2000 + 300e8ce: 8fd5 or a5,a5,a3 + 300e8d0: 0ff00713 li a4,255 + 300e8d4: 4681 li a3,0 + 300e8d6: bf4d j 300e888 <__truncdfsf2+0x18a> + 300e8d8: 4785 li a5,1 + 300e8da: bf25 j 300e812 <__truncdfsf2+0x114> + 300e8dc: 4605 li a2,1 + 300e8de: f1a5 bnez a1,300e83e <__truncdfsf2+0x140> + 300e8e0: 0721 addi a4,a4,8 + 300e8e2: bfb1 j 300e83e <__truncdfsf2+0x140> + 300e8e4: 4605 li a2,1 + 300e8e6: dda1 beqz a1,300e83e <__truncdfsf2+0x140> + 300e8e8: bfe5 j 300e8e0 <__truncdfsf2+0x1e2> + 300e8ea: 0ff00713 li a4,255 + 300e8ee: 4601 li a2,0 + 300e8f0: bd51 j 300e784 <__truncdfsf2+0x86> + 300e8f2: fdd9 bnez a1,300e890 <__truncdfsf2+0x192> + 300e8f4: 07a1 addi a5,a5,8 # 2000008 + 300e8f6: bf69 j 300e890 <__truncdfsf2+0x192> + 300e8f8: ddc1 beqz a1,300e890 <__truncdfsf2+0x192> + 300e8fa: bfed j 300e8f4 <__truncdfsf2+0x1f6> + 300e8fc: 4781 li a5,0 + 300e8fe: 00080e63 beqz a6,300e91a <__truncdfsf2+0x21c> + 300e902: 468d li a3,3 + 300e904: 00d81763 bne a6,a3,300e912 <__truncdfsf2+0x214> + 300e908: c989 beqz a1,300e91a <__truncdfsf2+0x21c> + 300e90a: 57fd li a5,-1 + 300e90c: 0fe00713 li a4,254 + 300e910: a029 j 300e91a <__truncdfsf2+0x21c> + 300e912: 4689 li a3,2 + 300e914: fed81be3 bne a6,a3,300e90a <__truncdfsf2+0x20c> + 300e918: d9ed beqz a1,300e90a <__truncdfsf2+0x20c> + 300e91a: 00566613 ori a2,a2,5 + 300e91e: b541 j 300e79e <__truncdfsf2+0xa0> + +0300e920 : + 300e920: 41f55793 srai a5,a0,0x1f + 300e924: 8d3d xor a0,a0,a5 + 300e926: 8d1d sub a0,a0,a5 + 300e928: 8082 ret + +0300e92a : + 300e92a: 87aa mv a5,a0 + 300e92c: 0035f713 andi a4,a1,3 + 300e930: c319 beqz a4,300e936 + 300e932: 1a061a63 bnez a2,300eae6 + 300e936: 0037f693 andi a3,a5,3 + 300e93a: 24068563 beqz a3,300eb84 + 300e93e: 477d li a4,31 + 300e940: 0ac77363 bgeu a4,a2,300e9e6 + 300e944: 4889 li a7,2 + 300e946: 0005c703 lbu a4,0(a1) # 80000000 + 300e94a: 0005a803 lw a6,0(a1) + 300e94e: 25168163 beq a3,a7,300eb90 + 300e952: 488d li a7,3 + 300e954: 2b168e63 beq a3,a7,300ec10 + 300e958: 00e78023 sb a4,0(a5) + 300e95c: 0015c703 lbu a4,1(a1) + 300e960: 00358e13 addi t3,a1,3 + 300e964: 00378313 addi t1,a5,3 + 300e968: 00e780a3 sb a4,1(a5) + 300e96c: 0025c703 lbu a4,2(a1) + 300e970: ffd60893 addi a7,a2,-3 # 3ffffd + 300e974: 4ec1 li t4,16 + 300e976: 00e78123 sb a4,2(a5) + 300e97a: 8772 mv a4,t3 + 300e97c: 879a mv a5,t1 + 300e97e: 00172683 lw a3,1(a4) + 300e982: 01885813 srli a6,a6,0x18 + 300e986: 18c1 addi a7,a7,-16 + 300e988: 00869593 slli a1,a3,0x8 + 300e98c: 00b86833 or a6,a6,a1 + 300e990: 00572583 lw a1,5(a4) + 300e994: 0107a023 sw a6,0(a5) + 300e998: 82e1 srli a3,a3,0x18 + 300e99a: 00859813 slli a6,a1,0x8 + 300e99e: 0106e6b3 or a3,a3,a6 + 300e9a2: c3d4 sw a3,4(a5) + 300e9a4: 00972683 lw a3,9(a4) + 300e9a8: 81e1 srli a1,a1,0x18 + 300e9aa: 0741 addi a4,a4,16 + 300e9ac: 00869813 slli a6,a3,0x8 + 300e9b0: 0105e5b3 or a1,a1,a6 + 300e9b4: ffd72803 lw a6,-3(a4) + 300e9b8: c78c sw a1,8(a5) + 300e9ba: 82e1 srli a3,a3,0x18 + 300e9bc: 00881593 slli a1,a6,0x8 + 300e9c0: 8ecd or a3,a3,a1 + 300e9c2: c7d4 sw a3,12(a5) + 300e9c4: 07c1 addi a5,a5,16 + 300e9c6: fb1eece3 bltu t4,a7,300e97e + 300e9ca: fec60713 addi a4,a2,-20 + 300e9ce: 8311 srli a4,a4,0x4 + 300e9d0: 00170793 addi a5,a4,1 + 300e9d4: 0792 slli a5,a5,0x4 + 300e9d6: 00fe05b3 add a1,t3,a5 + 300e9da: 1635 addi a2,a2,-19 + 300e9dc: 979a add a5,a5,t1 + 300e9de: 56c1 li a3,-16 + 300e9e0: 02d70733 mul a4,a4,a3 + 300e9e4: 963a add a2,a2,a4 + 300e9e6: 01067713 andi a4,a2,16 + 300e9ea: c359 beqz a4,300ea70 + 300e9ec: 0005c703 lbu a4,0(a1) + 300e9f0: 07c1 addi a5,a5,16 + 300e9f2: 05c1 addi a1,a1,16 + 300e9f4: fee78823 sb a4,-16(a5) + 300e9f8: ff15c703 lbu a4,-15(a1) + 300e9fc: fee788a3 sb a4,-15(a5) + 300ea00: ff25c703 lbu a4,-14(a1) + 300ea04: fee78923 sb a4,-14(a5) + 300ea08: ff35c703 lbu a4,-13(a1) + 300ea0c: fee789a3 sb a4,-13(a5) + 300ea10: ff45c703 lbu a4,-12(a1) + 300ea14: fee78a23 sb a4,-12(a5) + 300ea18: ff55c703 lbu a4,-11(a1) + 300ea1c: fee78aa3 sb a4,-11(a5) + 300ea20: ff65c703 lbu a4,-10(a1) + 300ea24: fee78b23 sb a4,-10(a5) + 300ea28: ff75c703 lbu a4,-9(a1) + 300ea2c: fee78ba3 sb a4,-9(a5) + 300ea30: ff85c703 lbu a4,-8(a1) + 300ea34: fee78c23 sb a4,-8(a5) + 300ea38: ff95c703 lbu a4,-7(a1) + 300ea3c: fee78ca3 sb a4,-7(a5) + 300ea40: ffa5c703 lbu a4,-6(a1) + 300ea44: fee78d23 sb a4,-6(a5) + 300ea48: ffb5c703 lbu a4,-5(a1) + 300ea4c: fee78da3 sb a4,-5(a5) + 300ea50: ffc5c703 lbu a4,-4(a1) + 300ea54: fee78e23 sb a4,-4(a5) + 300ea58: ffd5c703 lbu a4,-3(a1) + 300ea5c: fee78ea3 sb a4,-3(a5) + 300ea60: ffe5c703 lbu a4,-2(a1) + 300ea64: fee78f23 sb a4,-2(a5) + 300ea68: fff5c703 lbu a4,-1(a1) + 300ea6c: fee78fa3 sb a4,-1(a5) + 300ea70: 00867713 andi a4,a2,8 + 300ea74: c339 beqz a4,300eaba + 300ea76: 0005c703 lbu a4,0(a1) + 300ea7a: 07a1 addi a5,a5,8 + 300ea7c: 05a1 addi a1,a1,8 + 300ea7e: fee78c23 sb a4,-8(a5) + 300ea82: ff95c703 lbu a4,-7(a1) + 300ea86: fee78ca3 sb a4,-7(a5) + 300ea8a: ffa5c703 lbu a4,-6(a1) + 300ea8e: fee78d23 sb a4,-6(a5) + 300ea92: ffb5c703 lbu a4,-5(a1) + 300ea96: fee78da3 sb a4,-5(a5) + 300ea9a: ffc5c703 lbu a4,-4(a1) + 300ea9e: fee78e23 sb a4,-4(a5) + 300eaa2: ffd5c703 lbu a4,-3(a1) + 300eaa6: fee78ea3 sb a4,-3(a5) + 300eaaa: ffe5c703 lbu a4,-2(a1) + 300eaae: fee78f23 sb a4,-2(a5) + 300eab2: fff5c703 lbu a4,-1(a1) + 300eab6: fee78fa3 sb a4,-1(a5) + 300eaba: 00467713 andi a4,a2,4 + 300eabe: cf59 beqz a4,300eb5c + 300eac0: 0005c703 lbu a4,0(a1) + 300eac4: 0791 addi a5,a5,4 + 300eac6: 0591 addi a1,a1,4 + 300eac8: fee78e23 sb a4,-4(a5) + 300eacc: ffd5c703 lbu a4,-3(a1) + 300ead0: fee78ea3 sb a4,-3(a5) + 300ead4: ffe5c703 lbu a4,-2(a1) + 300ead8: fee78f23 sb a4,-2(a5) + 300eadc: fff5c703 lbu a4,-1(a1) + 300eae0: fee78fa3 sb a4,-1(a5) + 300eae4: a8a5 j 300eb5c + 300eae6: 0585 addi a1,a1,1 + 300eae8: fff5c703 lbu a4,-1(a1) + 300eaec: 0785 addi a5,a5,1 + 300eaee: 167d addi a2,a2,-1 + 300eaf0: fee78fa3 sb a4,-1(a5) + 300eaf4: bd25 j 300e92c + 300eaf6: 00072883 lw a7,0(a4) + 300eafa: 06c1 addi a3,a3,16 + 300eafc: 0741 addi a4,a4,16 + 300eafe: ff16a823 sw a7,-16(a3) + 300eb02: ff472883 lw a7,-12(a4) + 300eb06: ff16aa23 sw a7,-12(a3) + 300eb0a: ff872883 lw a7,-8(a4) + 300eb0e: ff16ac23 sw a7,-8(a3) + 300eb12: ffc72883 lw a7,-4(a4) + 300eb16: ff16ae23 sw a7,-4(a3) + 300eb1a: 40e308b3 sub a7,t1,a4 + 300eb1e: fd186ce3 bltu a6,a7,300eaf6 + 300eb22: 00465713 srli a4,a2,0x4 + 300eb26: 56c1 li a3,-16 + 300eb28: 02d706b3 mul a3,a4,a3 + 300eb2c: 0712 slli a4,a4,0x4 + 300eb2e: 97ba add a5,a5,a4 + 300eb30: 95ba add a1,a1,a4 + 300eb32: 9636 add a2,a2,a3 + 300eb34: 00867713 andi a4,a2,8 + 300eb38: cb11 beqz a4,300eb4c + 300eb3a: 4198 lw a4,0(a1) + 300eb3c: 07a1 addi a5,a5,8 + 300eb3e: 05a1 addi a1,a1,8 + 300eb40: fee7ac23 sw a4,-8(a5) + 300eb44: ffc5a703 lw a4,-4(a1) + 300eb48: fee7ae23 sw a4,-4(a5) + 300eb4c: 00467713 andi a4,a2,4 + 300eb50: c711 beqz a4,300eb5c + 300eb52: 4198 lw a4,0(a1) + 300eb54: 0791 addi a5,a5,4 + 300eb56: 0591 addi a1,a1,4 + 300eb58: fee7ae23 sw a4,-4(a5) + 300eb5c: 00267713 andi a4,a2,2 + 300eb60: cb19 beqz a4,300eb76 + 300eb62: 0005c703 lbu a4,0(a1) + 300eb66: 0789 addi a5,a5,2 + 300eb68: 0589 addi a1,a1,2 + 300eb6a: fee78f23 sb a4,-2(a5) + 300eb6e: fff5c703 lbu a4,-1(a1) + 300eb72: fee78fa3 sb a4,-1(a5) + 300eb76: 8a05 andi a2,a2,1 + 300eb78: c609 beqz a2,300eb82 + 300eb7a: 0005c703 lbu a4,0(a1) + 300eb7e: 00e78023 sb a4,0(a5) + 300eb82: 8082 ret + 300eb84: 872e mv a4,a1 + 300eb86: 86be mv a3,a5 + 300eb88: 00c58333 add t1,a1,a2 + 300eb8c: 483d li a6,15 + 300eb8e: b771 j 300eb1a + 300eb90: 00e78023 sb a4,0(a5) + 300eb94: 0015c703 lbu a4,1(a1) + 300eb98: 00258e13 addi t3,a1,2 + 300eb9c: 00278313 addi t1,a5,2 + 300eba0: 00e780a3 sb a4,1(a5) + 300eba4: ffe60893 addi a7,a2,-2 + 300eba8: 8772 mv a4,t3 + 300ebaa: 879a mv a5,t1 + 300ebac: 4ec5 li t4,17 + 300ebae: 00272683 lw a3,2(a4) + 300ebb2: 01085813 srli a6,a6,0x10 + 300ebb6: 18c1 addi a7,a7,-16 + 300ebb8: 01069593 slli a1,a3,0x10 + 300ebbc: 00b86833 or a6,a6,a1 + 300ebc0: 00672583 lw a1,6(a4) + 300ebc4: 0107a023 sw a6,0(a5) + 300ebc8: 82c1 srli a3,a3,0x10 + 300ebca: 01059813 slli a6,a1,0x10 + 300ebce: 0106e6b3 or a3,a3,a6 + 300ebd2: c3d4 sw a3,4(a5) + 300ebd4: 00a72683 lw a3,10(a4) + 300ebd8: 81c1 srli a1,a1,0x10 + 300ebda: 0741 addi a4,a4,16 + 300ebdc: 01069813 slli a6,a3,0x10 + 300ebe0: 0105e5b3 or a1,a1,a6 + 300ebe4: ffe72803 lw a6,-2(a4) + 300ebe8: c78c sw a1,8(a5) + 300ebea: 82c1 srli a3,a3,0x10 + 300ebec: 01081593 slli a1,a6,0x10 + 300ebf0: 8ecd or a3,a3,a1 + 300ebf2: c7d4 sw a3,12(a5) + 300ebf4: 07c1 addi a5,a5,16 + 300ebf6: fb1eece3 bltu t4,a7,300ebae + 300ebfa: fec60713 addi a4,a2,-20 + 300ebfe: 8311 srli a4,a4,0x4 + 300ec00: 00170793 addi a5,a4,1 + 300ec04: 0792 slli a5,a5,0x4 + 300ec06: 00fe05b3 add a1,t3,a5 + 300ec0a: 1639 addi a2,a2,-18 + 300ec0c: 979a add a5,a5,t1 + 300ec0e: bbc1 j 300e9de + 300ec10: 0585 addi a1,a1,1 + 300ec12: 00178313 addi t1,a5,1 + 300ec16: 00e78023 sb a4,0(a5) + 300ec1a: fff60893 addi a7,a2,-1 + 300ec1e: 872e mv a4,a1 + 300ec20: 879a mv a5,t1 + 300ec22: 4e49 li t3,18 + 300ec24: 00372683 lw a3,3(a4) + 300ec28: 00885813 srli a6,a6,0x8 + 300ec2c: 18c1 addi a7,a7,-16 + 300ec2e: 01869e93 slli t4,a3,0x18 + 300ec32: 01d86833 or a6,a6,t4 + 300ec36: 0107a023 sw a6,0(a5) + 300ec3a: 00772803 lw a6,7(a4) + 300ec3e: 82a1 srli a3,a3,0x8 + 300ec40: 0741 addi a4,a4,16 + 300ec42: 01881e93 slli t4,a6,0x18 + 300ec46: 01d6e6b3 or a3,a3,t4 + 300ec4a: c3d4 sw a3,4(a5) + 300ec4c: ffb72683 lw a3,-5(a4) + 300ec50: 00885813 srli a6,a6,0x8 + 300ec54: 07c1 addi a5,a5,16 + 300ec56: 01869e93 slli t4,a3,0x18 + 300ec5a: 01d86833 or a6,a6,t4 + 300ec5e: ff07ac23 sw a6,-8(a5) + 300ec62: fff72803 lw a6,-1(a4) + 300ec66: 82a1 srli a3,a3,0x8 + 300ec68: 01881e93 slli t4,a6,0x18 + 300ec6c: 01d6e6b3 or a3,a3,t4 + 300ec70: fed7ae23 sw a3,-4(a5) + 300ec74: fb1e68e3 bltu t3,a7,300ec24 + 300ec78: fec60713 addi a4,a2,-20 + 300ec7c: 8311 srli a4,a4,0x4 + 300ec7e: 00170793 addi a5,a4,1 + 300ec82: 0792 slli a5,a5,0x4 + 300ec84: 95be add a1,a1,a5 + 300ec86: 163d addi a2,a2,-17 + 300ec88: 979a add a5,a5,t1 + 300ec8a: bb91 j 300e9de + +0300ec8c : + 300ec8c: c25d beqz a2,300ed32 + 300ec8e: 0ff5f793 andi a5,a1,255 + 300ec92: 00f50023 sb a5,0(a0) # 14100000 + 300ec96: 00c50733 add a4,a0,a2 + 300ec9a: fef70fa3 sb a5,-1(a4) + 300ec9e: 4689 li a3,2 + 300eca0: 08c6f963 bgeu a3,a2,300ed32 + 300eca4: 00f500a3 sb a5,1(a0) + 300eca8: 00f50123 sb a5,2(a0) + 300ecac: fef70f23 sb a5,-2(a4) + 300ecb0: fef70ea3 sb a5,-3(a4) + 300ecb4: 4699 li a3,6 + 300ecb6: 06c6fe63 bgeu a3,a2,300ed32 + 300ecba: 00f501a3 sb a5,3(a0) + 300ecbe: fef70e23 sb a5,-4(a4) + 300ecc2: 46a1 li a3,8 + 300ecc4: 06c6f763 bgeu a3,a2,300ed32 + 300ecc8: 40a007b3 neg a5,a0 + 300eccc: 8b8d andi a5,a5,3 + 300ecce: 00f50733 add a4,a0,a5 + 300ecd2: 8e1d sub a2,a2,a5 + 300ecd4: 010107b7 lui a5,0x1010 + 300ecd8: 10178793 addi a5,a5,257 # 1010101 + 300ecdc: 0ff5f593 andi a1,a1,255 + 300ece0: 02f585b3 mul a1,a1,a5 + 300ece4: 9a71 andi a2,a2,-4 + 300ece6: 00c707b3 add a5,a4,a2 + 300ecea: c30c sw a1,0(a4) + 300ecec: feb7ae23 sw a1,-4(a5) + 300ecf0: 04c6f163 bgeu a3,a2,300ed32 + 300ecf4: c34c sw a1,4(a4) + 300ecf6: c70c sw a1,8(a4) + 300ecf8: feb7aa23 sw a1,-12(a5) + 300ecfc: feb7ac23 sw a1,-8(a5) + 300ed00: 46e1 li a3,24 + 300ed02: 02c6f863 bgeu a3,a2,300ed32 + 300ed06: c74c sw a1,12(a4) + 300ed08: cb0c sw a1,16(a4) + 300ed0a: cb4c sw a1,20(a4) + 300ed0c: cf0c sw a1,24(a4) + 300ed0e: feb7a223 sw a1,-28(a5) + 300ed12: feb7a423 sw a1,-24(a5) + 300ed16: feb7a623 sw a1,-20(a5) + 300ed1a: feb7a823 sw a1,-16(a5) + 300ed1e: 00477793 andi a5,a4,4 + 300ed22: 07e1 addi a5,a5,24 + 300ed24: 97ba add a5,a5,a4 + 300ed26: 46fd li a3,31 + 300ed28: 9732 add a4,a4,a2 + 300ed2a: 40f70633 sub a2,a4,a5 + 300ed2e: 00c6e363 bltu a3,a2,300ed34 + 300ed32: 8082 ret + 300ed34: c38c sw a1,0(a5) + 300ed36: c3cc sw a1,4(a5) + 300ed38: c78c sw a1,8(a5) + 300ed3a: c7cc sw a1,12(a5) + 300ed3c: cb8c sw a1,16(a5) + 300ed3e: cbcc sw a1,20(a5) + 300ed40: cf8c sw a1,24(a5) + 300ed42: cfcc sw a1,28(a5) + 300ed44: 02078793 addi a5,a5,32 + 300ed48: b7cd j 300ed2a + +0300ed4a : + 300ed4a: 1141 addi sp,sp,-16 + 300ed4c: c422 sw s0,8(sp) + 300ed4e: c606 sw ra,12(sp) + 300ed50: 842a mv s0,a0 + 300ed52: 2825 jal ra,300ed8a <__stpcpy> + 300ed54: 8522 mv a0,s0 + 300ed56: 40b2 lw ra,12(sp) + 300ed58: 4422 lw s0,8(sp) + 300ed5a: 0141 addi sp,sp,16 + 300ed5c: 8082 ret + +0300ed5e : + 300ed5e: c605 beqz a2,300ed86 + 300ed60: 00150713 addi a4,a0,1 + 300ed64: 9532 add a0,a0,a2 + 300ed66: fff74783 lbu a5,-1(a4) + 300ed6a: 0005c683 lbu a3,0(a1) + 300ed6e: c799 beqz a5,300ed7c + 300ed70: c691 beqz a3,300ed7c + 300ed72: 00a70563 beq a4,a0,300ed7c + 300ed76: 0705 addi a4,a4,1 + 300ed78: 00d78563 beq a5,a3,300ed82 + 300ed7c: 40d78533 sub a0,a5,a3 + 300ed80: 8082 ret + 300ed82: 0585 addi a1,a1,1 + 300ed84: b7cd j 300ed66 + 300ed86: 4501 li a0,0 + 300ed88: 8082 ret + +0300ed8a <__stpcpy>: + 300ed8a: 00a5c7b3 xor a5,a1,a0 + 300ed8e: 8b8d andi a5,a5,3 + 300ed90: cf91 beqz a5,300edac <__stpcpy+0x22> + 300ed92: 0005c783 lbu a5,0(a1) + 300ed96: 00f50023 sb a5,0(a0) + 300ed9a: e3b1 bnez a5,300edde <__stpcpy+0x54> + 300ed9c: 8082 ret + 300ed9e: 0005c783 lbu a5,0(a1) + 300eda2: 00f50023 sb a5,0(a0) + 300eda6: dbfd beqz a5,300ed9c <__stpcpy+0x12> + 300eda8: 0585 addi a1,a1,1 + 300edaa: 0505 addi a0,a0,1 + 300edac: 0035f793 andi a5,a1,3 + 300edb0: f7fd bnez a5,300ed9e <__stpcpy+0x14> + 300edb2: feff0637 lui a2,0xfeff0 + 300edb6: 80808737 lui a4,0x80808 + 300edba: eff60613 addi a2,a2,-257 # fefefeff + 300edbe: 08070713 addi a4,a4,128 # 80808080 + 300edc2: 4194 lw a3,0(a1) + 300edc4: 00c687b3 add a5,a3,a2 + 300edc8: fff6c813 not a6,a3 + 300edcc: 0107f7b3 and a5,a5,a6 + 300edd0: 8ff9 and a5,a5,a4 + 300edd2: f3e1 bnez a5,300ed92 <__stpcpy+0x8> + 300edd4: 0511 addi a0,a0,4 + 300edd6: 0591 addi a1,a1,4 + 300edd8: fed52e23 sw a3,-4(a0) + 300eddc: b7dd j 300edc2 <__stpcpy+0x38> + 300edde: 0585 addi a1,a1,1 + 300ede0: 0505 addi a0,a0,1 + 300ede2: bf45 j 300ed92 <__stpcpy+0x8> + +0300ede4 <__rodata_start>: + 300ede4: 9680 pop {ra,s0-s6},384 + 300ede6: 4b18 lw a4,16(a4) + +0300ede8 : + 300ede8: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300edf8: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 300ee08: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 300ee18: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 300ee28: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 300ee38: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 300ee48: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 300ee58: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300ee68: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300ee78: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300ee88: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300ee98: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300eea8: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300eeb8: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300eec8: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300eed8: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300eee8: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300eef8: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 300ef08: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 300ef18: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 300ef28: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 300ef38: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 300ef48: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 300ef58: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300ef68: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300ef78: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300ef88: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300ef98: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300efa8: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300efb8: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300efc8: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300efd8: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300efe8: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300eff8: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 300f008: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 300f018: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 300f028: 7272 7075 2e74 0063 1634 0300 1686 0300 rrupt.c.4....... + 300f038: 16d8 0300 172a 0300 177c 0300 17ce 0300 ....*...|....... + 300f048: 1820 0300 1872 0300 1908 0300 195a 0300 ...r.......Z... + 300f058: 19ac 0300 19fe 0300 1a50 0300 1aa2 0300 ........P....... + 300f068: 1af4 0300 1b46 0300 2e2e 642f 6972 6576 ....F...../drive + 300f078: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 300f088: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 300f098: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 300f0a8: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 300f0b8: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 300f0c8: 25aa 0300 25b4 0300 25c8 0300 25aa 0300 .%...%...%...%.. + 300f0d8: 25e4 0300 25aa 0300 38e0 0300 394a 0300 .%...%...8..J9.. + 300f0e8: 394a 0300 394a 0300 394a 0300 394a 0300 J9..J9..J9..J9.. + 300f0f8: 394a 0300 394a 0300 394a 0300 394a 0300 J9..J9..J9..J9.. + 300f108: 394a 0300 3820 0300 3876 0300 394a 0300 J9.. 8..v8..J9.. + 300f118: 390a 0300 394a 0300 394a 0300 394a 0300 .9..J9..J9..J9.. + 300f128: 394a 0300 394a 0300 394a 0300 394a 0300 J9..J9..J9..J9.. + 300f138: 394a 0300 394a 0300 38e0 0300 394a 0300 J9..J9...8..J9.. + 300f148: 394a 0300 384a 0300 394a 0300 38a0 0300 J9..J8..J9...8.. + 300f158: 394a 0300 394a 0300 38e0 0300 2e2e 642f J9..J9...8..../d + 300f168: 6972 6576 7372 672f 6970 2f6f 6e69 2f63 rivers/gpio/inc/ + 300f178: 7067 6f69 695f 2e70 0068 0000 2e2e 642f gpio_ip.h...../d + 300f188: 6972 6576 7372 672f 6970 2f6f 7273 2f63 rivers/gpio/src/ + 300f198: 7067 6f69 632e 0000 2e2e 642f 6972 6576 gpio.c..../drive + 300f1a8: 7372 672f 7470 732f 6372 672f 7470 632e rs/gpt/src/gpt.c + 300f1b8: 0000 0000 2e2e 642f 6972 6576 7372 692f ....../drivers/i + 300f1c8: 6332 732f 6372 692f 6332 632e 0000 0000 2c/src/i2c.c.... + 300f1d8: 2e2e 642f 6972 6576 7372 692f 636f 676d ../drivers/iocmg + 300f1e8: 692f 636e 692f 636f 676d 695f 2e70 0068 /inc/iocmg_ip.h. + 300f1f8: 2e2e 642f 6972 6576 7372 692f 636f 676d ../drivers/iocmg + 300f208: 732f 6372 692f 636f 676d 632e 0000 0000 /src/iocmg.c.... + 300f218: 2e2e 642f 6972 6576 7372 742f 6d69 7265 ../drivers/timer + 300f228: 692f 636e 742f 6d69 7265 695f 2e70 0068 /inc/timer_ip.h. + 300f238: 2e2e 642f 6972 6576 7372 742f 6d69 7265 ../drivers/timer + 300f248: 732f 6372 742f 6d69 7265 632e 0000 0000 /src/timer.c.... + 300f258: 6474 0300 648a 0300 64a0 0300 64b6 0300 td...d...d...d.. + 300f268: 64cc 0300 2e2e 642f 6972 6576 7372 752f .d..../drivers/u + 300f278: 7261 2f74 7273 2f63 6175 7472 632e 0000 art/src/uart.c.. + 300f288: 6e8e 0300 6e9a 0300 6ea6 0300 6eb2 0300 .n...n...n...n.. + 300f298: 6ebe 0300 6eca 0300 6ed6 0300 6ee2 0300 .n...n...n...n.. + 300f2a8: 6eee 0300 7473 706f 7920 756f 7720 6c69 .n..stop you wil + 300f2b8: 206c 6968 2074 7469 2021 0a0d 0000 0000 l hit it! ...... + 300f2c8: 6f79 2075 6168 6576 6220 6565 206e 6f77 you have been wo + 300f2d8: 6b72 6e69 2067 6f66 2072 2e31 2035 6f68 rking for 1.5 ho + 300f2e8: 7275 2c73 6c70 6165 6573 7720 6c61 206b urs,please walk + 300f2f8: 7261 756f 646e 6120 646e 7220 6c65 7861 around and relax + 300f308: 7e20 0d20 000a 0000 6177 6e72 6e69 2c67 ~ .....warning, + 300f318: 7320 6d6f 6f65 656e 6820 7361 6920 766e someone has inv + 300f328: 6461 6465 7920 756f 2072 6f68 7375 2165 aded your house! + 300f338: 0d20 000a 7473 706f 0a0d 0000 6573 7674 ...stop....setv + 300f348: 0000 0000 6f63 656d 0000 0000 6162 6b63 ....come....back + 300f358: 0000 0000 7473 5f61 6361 0074 7473 7261 ....sta_act.star + 300f368: 0074 0000 7567 7261 0064 0000 7473 706f t...guard...stop + 300f378: 0000 0000 656c 7466 0000 0000 6972 6867 ....left....righ + 300f388: 0074 0000 6572 7274 6165 0074 6c63 006f t...retreat.clo. + 300f398: 6e61 0074 6564 6b73 0000 0000 7267 756f ant.desk....grou + 300f3a8: 646e 0000 c000 45a8 0000 4000 8d9a 0300 nd.....E...@.... + 300f3b8: 8d9a 0300 8da6 0300 8d9a 0300 8da6 0300 ................ + 300f3c8: 8da6 0300 8da6 0300 8da6 0300 8da6 0300 ................ + 300f3d8: 8da6 0300 8da6 0300 8da6 0300 8da6 0300 ................ + 300f3e8: 8da6 0300 8da6 0300 8da6 0300 8da6 0300 ................ + 300f3f8: 8da6 0300 8da6 0300 8da6 0300 8d9a 0300 ................ + 300f408: 8d9a 0300 8f44 0300 8f52 0300 8f60 0300 ....D...R...`... + 300f418: 8f6e 0300 8f7c 0300 8fae 0300 8fba 0300 n...|........... + 300f428: 8fc8 0300 8fd4 0300 8fe2 0300 909e 0300 ................ + 300f438: 90b4 0300 90ca 0300 90e0 0300 90f6 0300 ................ + 300f448: 93c4 0300 93d2 0300 93ee 0300 93fc 0300 ................ + 300f458: 940a 0300 9432 0300 9558 0300 9564 0300 ....2...X...d... + 300f468: 9580 0300 958c 0300 9598 0300 9598 0300 ................ + 300f478: 9620 0300 9630 0300 965e 0300 966e 0300 ...0...^...n... + 300f488: 967e 0300 967e 0300 a2b2 0300 a2b8 0300 ~...~........... + 300f498: a2c0 0300 a2c8 0300 a2d0 0300 4c56 3335 ............VL53 + 300f4a8: 304c 2058 4449 203a 6425 732c 6174 7574 L0X ID: %d,statu + 300f4b8: 3a73 2520 0d64 000a 4c56 3335 304c 2058 s: %d...VL53L0X + 300f4c8: 6544 6574 7463 4620 6961 656c 2164 0a0d Detect Failed!.. + 300f4d8: 0000 0000 6843 6e61 6567 4920 4349 6120 ....Change IIC a + 300f4e8: 6464 6572 7373 7320 6375 6563 7373 2021 ddress success! + 300f4f8: 4949 2043 6441 7264 7365 3a73 3020 2578 IIC Address: 0x% + 300f508: 0d78 000a 6544 6166 6c75 2074 4949 2043 x...Default IIC + 300f518: 6441 7264 7365 3a73 3020 2578 0d78 000a Address: 0x%x... + 300f528: 4c56 3335 304c 2058 6e69 7469 5320 6375 VL53L0X init Suc + 300f538: 6563 6464 6465 0d21 000a 0000 4c56 3335 cedded!.....VL53 + 300f548: 304c 2058 7473 7261 2074 6172 676e 6e69 L0X start rangin + 300f558: 2167 0a0d 0000 0000 4c56 3335 304c 2058 g!......VL53L0X + 300f568: 7473 706f 7220 6e61 6967 676e 0d21 000a stop ranging!... diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/cfg/funcptr.txt" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/cfg/funcptr.txt" new file mode 100644 index 00000000..15014ea5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/cfg/funcptr.txt" @@ -0,0 +1,81 @@ + +Miss_funcptr: InterruptEntry ... +Remarks_here: 0x3001356 InterruptEntry + +Miss_funcptr: HAL_CRG_GetIpFreq ... +Remarks_here: 0x3002526 HAL_CRG_GetIpFreq + +Miss_funcptr: CRG_GetAdcIpFreq ... +Remarks_here: 0x30026d2 CRG_GetAdcIpFreq + +Miss_funcptr: CRG_GetAdcIpFreq ... +Remarks_here: 0x30026d2 CRG_GetAdcIpFreq + +Miss_funcptr: HAL_CRG_IpEnableSet ... +Remarks_here: 0x3002604 HAL_CRG_IpEnableSet + +Miss_funcptr: UART_SetParityBit ... +Remarks_here: 0x300644c UART_SetParityBit + +Miss_funcptr: HAL_UART_RegisterCallBack ... +Remarks_here: 0x3006dfc HAL_UART_RegisterCallBack + +Miss_funcptr: IRQ_SetLocalPriority ... +Remarks_here: 0x30018ce IRQ_SetLocalPriority + +Miss_funcptr: SetLocalIntNumPri ... +Remarks_here: 0x3001604 SetLocalIntNumPri + +Miss_funcptr: ParseSpecifier ... +Remarks_here: 0x30037d0 ParseSpecifier + +Miss_funcptr: VL53L0X_GetLimitCheckValue ... +Remarks_here: 0x30095e6 VL53L0X_GetLimitCheckValue + +Miss_funcptr: sequence_step_enabled ... +Remarks_here: 0x300905a sequence_step_enabled + +Miss_funcptr: VL53L0X_SetLimitCheckEnable ... +Remarks_here: 0x3009338 VL53L0X_SetLimitCheckEnable + +Miss_funcptr: VL53L0X_SetLimitCheckValue ... +Remarks_here: 0x30094f4 VL53L0X_SetLimitCheckValue + +Miss_funcptr: VL53L0X_SetDeviceMode ... +Remarks_here: 0x3008d6a VL53L0X_SetDeviceMode + +Miss_funcptr: VL53L0X_SetGpioConfig ... +Remarks_here: 0x300a096 VL53L0X_SetGpioConfig + +Miss_funcptr: VL53L0X_SetSequenceStepEnable ... +Remarks_here: 0x3008ed6 VL53L0X_SetSequenceStepEnable + +Miss_funcptr: VL53L0X_SetSequenceStepEnable ... +Remarks_here: 0x3008ed6 VL53L0X_SetSequenceStepEnable + +Miss_funcptr: GPIO_ExcuteCallBack ... +Remarks_here: 0x30048bc GPIO_ExcuteCallBack + +Miss_funcptr: HAL_TIMER_IrqHandler ... +Remarks_here: 0x300608c HAL_TIMER_IrqHandler + +Miss_funcptr: HAL_TIMER_IrqHandler ... +Remarks_here: 0x300608c HAL_TIMER_IrqHandler + +Miss_funcptr: WriteITCallBack ... +Remarks_here: 0x30068a0 WriteITCallBack + +Miss_funcptr: ReadITCallBack ... +Remarks_here: 0x30069f2 ReadITCallBack + +Miss_funcptr: CharterMatchCallBack ... +Remarks_here: 0x3006400 CharterMatchCallBack + +Miss_funcptr: BaudDetectCallBack ... +Remarks_here: 0x3006324 BaudDetectCallBack + +Miss_funcptr: BaudDetectCallBack ... +Remarks_here: 0x3006324 BaudDetectCallBack + +Miss_funcptr: ErrorServiceCallback ... +Remarks_here: 0x3006b54 ErrorServiceCallback diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/funcstack.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/funcstack.json" new file mode 100644 index 00000000..e80806d8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/funcstack.json" @@ -0,0 +1,6879 @@ +{ + "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": [ + "0x30015d0" + ], + "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": [ + "0x30015b2" + ], + "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": [ + "0x3001356" + ], + "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": [] + }, + "0x30005b4": { + "funcname": "clear_sram_loop", + "funcaddr": "0x30005b4", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30005c0": { + "funcname": "start_coderom_code_copy", + "funcaddr": "0x30005c0", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30005dc": { + "funcname": "start_reserved_data_copy", + "funcaddr": "0x30005dc", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30005f0": { + "funcname": "start_coderom_data_copy", + "funcaddr": "0x30005f0", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30004e4" + ], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000604": { + "funcname": "pmp_init", + "funcaddr": "0x3000604", + "LocalCost": 0, + "MaxCost": 3840, + "called": [ + "0x30006f8", + "0x300709a" + ], + "Location": "startup.S:647", + "IsCalled": 0, + "IsRec": 0, + "depth": 35, + "ptrVarName": [] + }, + "0x30006ec": { + "funcname": "dead_loop", + "funcaddr": "0x30006ec", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x30006ec" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 1, + "depth": 0, + "ptrVarName": [] + }, + "0x30006f0": { + "funcname": "Chip_InitFail", + "funcaddr": "0x30006f0", + "LocalCost": 16, + "MaxCost": 32, + "called": [ + "30006f6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30006f8": { + "funcname": "Chip_Init", + "funcaddr": "0x30006f8", + "LocalCost": 32, + "MaxCost": 992, + "called": [ + "0x30073b0", + "0x30006f0", + "0x3000ea4", + "0x3000f68", + "0x3000d6c", + "0x3001392", + "0x3000d0e", + "0x3000cbc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x3000738": { + "funcname": "CalculateGain", + "funcaddr": "0x3000738", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000762": { + "funcname": "CHIP_GetInfo", + "funcaddr": "0x3000762", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x3000cb8", + "30007a2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30007ac": { + "funcname": "CHIP_AnalogTrim", + "funcaddr": "0x30007ac", + "LocalCost": 96, + "MaxCost": 352, + "called": [ + "0x3000cb8", + "0x3000738", + "0x300102a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000cb8": { + "funcname": "FOTP_InfoGet.trans.43", + "funcaddr": "0x3000cb8", + "LocalCost": 0, + "MaxCost": 160, + "called": [ + "0x300102a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3000cbc": { + "funcname": "ANATRIM_Entry", + "funcaddr": "0x3000cbc", + "LocalCost": 16, + "MaxCost": 384, + "called": [ + "0x3000762", + "0x3000d68", + "0x30007ac", + "3000d06" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3000d0e": { + "funcname": "ANAVREF_Init", + "funcaddr": "0x3000d0e", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x3000d68", + "0x30012e4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 11, + "ptrVarName": [] + }, + "0x3000d68": { + "funcname": "HAL_CRG_IpEnableSet.trans.18", + "funcaddr": "0x3000d68", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x3002604" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3000d6c": { + "funcname": "CRG_SetCoreClockSelect", + "funcaddr": "0x3000d6c", + "LocalCost": 80, + "MaxCost": 928, + "called": [ + "0x30012e4", + "0x300230e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 11, + "ptrVarName": [] + }, + "0x3000dae": { + "funcname": "SetFlashDiv", + "funcaddr": "0x3000dae", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3000e1e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3000e40": { + "funcname": "GetFlashFreq", + "funcaddr": "0x3000e40", + "LocalCost": 48, + "MaxCost": 320, + "called": [ + "3000e8a", + "3000e96", + "0x300242c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3000ea4": { + "funcname": "FLASH_ClockConfig", + "funcaddr": "0x3000ea4", + "LocalCost": 48, + "MaxCost": 416, + "called": [ + "0x3000e40", + "0x3000dae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3000f68": { + "funcname": "SYSTICK_Init", + "funcaddr": "0x3000f68", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3000f8a": { + "funcname": "SYSTICK_GetCRGHZ", + "funcaddr": "0x3000f8a", + "LocalCost": 16, + "MaxCost": 416, + "called": [ + "0x3002526" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3000fa6": { + "funcname": "FOTP_CheckReadStatus", + "funcaddr": "0x3000fa6", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3001022" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300102a": { + "funcname": "FOTP_InfoGet", + "funcaddr": "0x300102a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "3001182", + "3001098", + "0x3000fa6", + "300115e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300118c": { + "funcname": "GetCrgIpMatchInfo", + "funcaddr": "0x300118c", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30011da", + "30011e8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30011f0": { + "funcname": "AssertErrorLog", + "funcaddr": "0x30011f0", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001206": { + "funcname": "DCL_SYSTICK_GetTick", + "funcaddr": "0x3001206", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300121a": { + "funcname": "BASE_FUNC_DelayUs", + "funcaddr": "0x300121a", + "LocalCost": 48, + "MaxCost": 512, + "called": [ + "0x3001206", + "0x3000f8a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x3001274": { + "funcname": "BASE_FUNC_DelayMs", + "funcaddr": "0x3001274", + "LocalCost": 48, + "MaxCost": 608, + "called": [ + "3001296", + "0x300121a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 8, + "ptrVarName": [] + }, + "0x30012ac": { + "funcname": "BASE_FUNC_DelaySeconds", + "funcaddr": "0x30012ac", + "LocalCost": 48, + "MaxCost": 704, + "called": [ + "30012ce", + "0x3001274" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 9, + "ptrVarName": [] + }, + "0x30012e4": { + "funcname": "BASE_FUNC_Delay", + "funcaddr": "0x30012e4", + "LocalCost": 32, + "MaxCost": 768, + "called": [ + "300132c", + "0x30012ac", + "0x3001274", + "0x300121a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 10, + "ptrVarName": [] + }, + "0x3001336": { + "funcname": "IRQ_ClearN", + "funcaddr": "0x3001336", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001356": { + "funcname": "InterruptEntry", + "funcaddr": "0x3001356", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3001336" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001392": { + "funcname": "IRQ_Init", + "funcaddr": "0x3001392", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30013ce" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30013e2": { + "funcname": "IRQ_Register", + "funcaddr": "0x30013e2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30011f0", + "300140a", + "300145a", + "0x3001c38" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001464": { + "funcname": "IRQ_EnableN", + "funcaddr": "0x3001464", + "LocalCost": 64, + "MaxCost": 192, + "called": [ + "0x30011f0", + "3001588", + "3001586" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001592": { + "funcname": "SysErrPrint", + "funcaddr": "0x3001592", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30015a4": { + "funcname": "SysErrFinish", + "funcaddr": "0x30015a4", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30015b2": { + "funcname": "SysErrExcEntry", + "funcaddr": "0x30015b2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3001592", + "0x30015a4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30015d0": { + "funcname": "SysErrNmiEntry", + "funcaddr": "0x30015d0", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30011f0", + "30015f0", + "0x3001592", + "0x30015a4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001604": { + "funcname": "SetLocalIntNumPri", + "funcaddr": "0x3001604", + "LocalCost": 96, + "MaxCost": 192, + "called": [ + "30018c6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30018ce": { + "funcname": "IRQ_SetLocalPriority", + "funcaddr": "0x30018ce", + "LocalCost": 112, + "MaxCost": 416, + "called": [ + "3001ba8", + "0x3001604" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3001bb2": { + "funcname": "IRQ_SetPriority", + "funcaddr": "0x3001bb2", + "LocalCost": 32, + "MaxCost": 480, + "called": [ + "0x300204a", + "3001c1c", + "0x30018ce" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3001c26": { + "funcname": "IRQ_DummyHandler", + "funcaddr": "0x3001c26", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "interrupt.c:528", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001c38": { + "funcname": "IRQ_SetCallBack", + "funcaddr": "0x3001c38", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001c76": { + "funcname": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "funcaddr": "0x3001c76", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001c9e": { + "funcname": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "funcaddr": "0x3001c9e", + "LocalCost": 16, + "MaxCost": 32, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001cc8": { + "funcname": "IsCrgPllRefClkSelect", + "funcaddr": "0x3001cc8", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3001ce8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001cf4": { + "funcname": "IsCrgPllPreDiv", + "funcaddr": "0x3001cf4", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001d10": { + "funcname": "IsCrgPllPostDiv", + "funcaddr": "0x3001d10", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001d2c": { + "funcname": "IsCrgPllPostDiv2", + "funcaddr": "0x3001d2c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001d48": { + "funcname": "IsCrgPllFbDiv", + "funcaddr": "0x3001d48", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001d64": { + "funcname": "IsCrgCoreCkSel", + "funcaddr": "0x3001d64", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3001d8e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001d9a": { + "funcname": "IsCrg1MCkSel", + "funcaddr": "0x3001d9a", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3001dba" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001dc6": { + "funcname": "IsCrg1MCkDiv", + "funcaddr": "0x3001dc6", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001de2": { + "funcname": "IsCrgValidPreDiv", + "funcaddr": "0x3001de2", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3001e34" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001e40": { + "funcname": "IsCrgValidFdDiv", + "funcaddr": "0x3001e40", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3001ec2", + "3001e94", + "3001ebe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001eca": { + "funcname": "IsCrgValidPostDiv", + "funcaddr": "0x3001eca", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001f12": { + "funcname": "IsCrgValidPostDiv2", + "funcaddr": "0x3001f12", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3001f5a": { + "funcname": "IsCrgAdcClkModeSelect", + "funcaddr": "0x3001f5a", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3001f8e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001f9a": { + "funcname": "IsCrgAdcClkDiv", + "funcaddr": "0x3001f9a", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3001fce" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3001fda": { + "funcname": "DCL_CRG_SetCoreClkSel", + "funcaddr": "0x3001fda", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x300204a", + "3002004", + "0x3001d64", + "3002042" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300204a": { + "funcname": "AssertErrorLog.trans.0", + "funcaddr": "0x300204a", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x30011f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300204e": { + "funcname": "HAL_CRG_Init", + "funcaddr": "0x300204e", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x300204a", + "300206e", + "300208c", + "0x3001cc8", + "3002304", + "0x3001cf4", + "0x3001d48", + "0x3001d10", + "0x3001d2c", + "0x3001d9a", + "0x3001dc6", + "0x3001d64", + "0x30027ec", + "0x3001c76", + "0x3001c9e", + "0x30028ae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300230e": { + "funcname": "HAL_CRG_SetCoreClockSelect", + "funcaddr": "0x300230e", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x300204a", + "300232e", + "300234c", + "0x3001d64", + "3002392", + "0x3001c76", + "0x3001fda", + "0x3001c9e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300239c": { + "funcname": "CRG_GetVcoFreq", + "funcaddr": "0x300239c", + "LocalCost": 32, + "MaxCost": 160, + "called": [ + "0x300204a", + "30023c6", + "0x3002900", + "0x300292a", + "0x3002958" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300242c": { + "funcname": "HAL_CRG_GetPllFreq", + "funcaddr": "0x300242c", + "LocalCost": 32, + "MaxCost": 224, + "called": [ + "0x300204a", + "3002456", + "0x300239c", + "0x300299a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3002494": { + "funcname": "HAL_CRG_GetCoreClkFreq", + "funcaddr": "0x3002494", + "LocalCost": 32, + "MaxCost": 288, + "called": [ + "0x300204a", + "30024be", + "300250c", + "3002518", + "0x300242c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3002526": { + "funcname": "HAL_CRG_GetIpFreq", + "funcaddr": "0x3002526", + "LocalCost": 48, + "MaxCost": 384, + "called": [ + "0x300204a", + "3002546", + "3002562", + "0x3002494", + "0x300118c", + "30025fa", + "30025e6", + "0x3002900", + "0x300239c", + "0x30026d2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3002604": { + "funcname": "HAL_CRG_IpEnableSet", + "funcaddr": "0x3002604", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300204a", + "3002628", + "3002644", + "30026c8", + "0x300118c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30026d2": { + "funcname": "CRG_GetAdcIpFreq", + "funcaddr": "0x30026d2", + "LocalCost": 64, + "MaxCost": 224, + "called": [ + "0x3002e0c", + "30026fa", + "3002710", + "30027e2", + "30027b8", + "0x300299a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30027ec": { + "funcname": "CRG_IsValidPllConfig", + "funcaddr": "0x30027ec", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x3002900", + "0x300292a", + "0x3001de2", + "30028a4", + "0x3001e40", + "0x3001eca", + "0x3001f12" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30028ae": { + "funcname": "CRG_IsValid1MHzConfig", + "funcaddr": "0x30028ae", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30028d2", + "30028f8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002900": { + "funcname": "CRG_GetPllRefIni", + "funcaddr": "0x3002900", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3002922" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300292a": { + "funcname": "CRG_GetPreDivValue", + "funcaddr": "0x300292a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300294c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002958": { + "funcname": "CRG_GetPllFbDivValue", + "funcaddr": "0x3002958", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300299a": { + "funcname": "CRG_GetPllPostDivValue", + "funcaddr": "0x300299a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30029c8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30029d4": { + "funcname": "CRG_IpWoClkSelEnableSet", + "funcaddr": "0x30029d4", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30029f8", + "3002a0e", + "3002b46" + ], + "Location": "crg.c:844", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002b5a": { + "funcname": "CRG_IpWoClkSelEnableGet", + "funcaddr": "0x3002b5a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002b7a", + "3002b90" + ], + "Location": "crg.c:868", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002bda": { + "funcname": "CRG_IpWoClkSelResetSet", + "funcaddr": "0x3002bda", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002bfe", + "3002c14", + "3002cc8" + ], + "Location": "crg.c:888", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002cdc": { + "funcname": "CRG_IpWoClkSelResetGet", + "funcaddr": "0x3002cdc", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002cfc", + "3002d12" + ], + "Location": "crg.c:910", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002d5e": { + "funcname": "CRG_AdcEnableSet", + "funcaddr": "0x3002d5e", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002d82", + "3002d98", + "3002df8" + ], + "Location": "crg.c:929", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002e0c": { + "funcname": "AssertErrorLog.trans.1", + "funcaddr": "0x3002e0c", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x30011f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3002e10": { + "funcname": "CRG_AdcEnableGet", + "funcaddr": "0x3002e10", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002e30", + "3002e46", + "3002e74" + ], + "Location": "crg.c:953", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002e86": { + "funcname": "CRG_AdcClkSelectSet", + "funcaddr": "0x3002e86", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002eaa", + "3002ec0", + "3002edc", + "0x3001f5a", + "3002f6c", + "0x3001c76", + "0x3001c9e" + ], + "Location": "crg.c:971", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002f74": { + "funcname": "CRG_AdcClkSelectGet", + "funcaddr": "0x3002f74", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002f94", + "3002faa", + "3002fec" + ], + "Location": "crg.c:995", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3002ff6": { + "funcname": "CRG_AdcDivSet", + "funcaddr": "0x3002ff6", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "300301a", + "3003030", + "0x3001f9a", + "30030be" + ], + "Location": "crg.c:1014", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30030c6": { + "funcname": "CRG_AdcDivGet", + "funcaddr": "0x30030c6", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30030e6", + "30030fc", + "300314a" + ], + "Location": "crg.c:1035", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003154": { + "funcname": "CRG_EfcEnableSet", + "funcaddr": "0x3003154", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3003178", + "300318e" + ], + "Location": "crg.c:1056", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30031cc": { + "funcname": "CRG_EfcEnableGet", + "funcaddr": "0x30031cc", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30031ec", + "3003202" + ], + "Location": "crg.c:1071", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003232": { + "funcname": "CRG_AnaEnableSet", + "funcaddr": "0x3003232", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3003256", + "300326c", + "300338e", + "3003320" + ], + "Location": "crg.c:1087", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003396": { + "funcname": "CRG_AnaEnableGet", + "funcaddr": "0x3003396", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30033b6", + "30033cc" + ], + "Location": "crg.c:1121", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300340c": { + "funcname": "DBG_PrintCh", + "funcaddr": "0x300340c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300344e": { + "funcname": "DBG_PrintStr", + "funcaddr": "0x300344e", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "3003480", + "0x300340c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003498": { + "funcname": "DBG_Pow", + "funcaddr": "0x3003498", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30034be" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30034d8": { + "funcname": "DBG_CountDigits", + "funcaddr": "0x30034d8", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3003538", + "3003522", + "3003530" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003540": { + "funcname": "DBG_PutUnsignedNum", + "funcaddr": "0x3003540", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "30035de", + "0x3003498", + "0x300340c", + "30035d4", + "30035e8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30035f2": { + "funcname": "DBG_PrintInt", + "funcaddr": "0x30035f2", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x300340c", + "3003646", + "0x30034d8", + "0x3003540" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3003650": { + "funcname": "DBG_PrintHex", + "funcaddr": "0x3003650", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x300340c", + "300368a", + "0x30034d8", + "0x3003540" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3003694": { + "funcname": "DBG_PrintFlt", + "funcaddr": "0x3003694", + "LocalCost": 64, + "MaxCost": 416, + "called": [ + "0x300340c", + "0x3003498", + "3003742", + "0x30035f2", + "0x30034d8", + "3003792", + "0x3003540" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30037d0": { + "funcname": "ParseSpecifier", + "funcaddr": "0x30037d0", + "LocalCost": 64, + "MaxCost": 544, + "called": [ + "0x300340c", + "300395e", + "0x300344e", + "0x30035f2", + "0x30034d8", + "0x3003540", + "0x3003650", + "0x300e6fe", + "0x3003694" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x300396c": { + "funcname": "DBG_PrintIntWithField", + "funcaddr": "0x300396c", + "LocalCost": 64, + "MaxCost": 320, + "called": [ + "0x300340c", + "3003a7c", + "0x30034d8", + "30039fa", + "3003a68", + "3003a5c", + "0x3003540" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3003a86": { + "funcname": "DBG_Atoi", + "funcaddr": "0x3003a86", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3003abe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003af0": { + "funcname": "DBG_UartPrintf", + "funcaddr": "0x3003af0", + "LocalCost": 96, + "MaxCost": 736, + "called": [ + "3003c3e", + "0x300340c", + "3003c34", + "0x3003a86", + "0x300396c", + "0x300e6fe", + "0x3003694", + "0x30037d0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3003c58": { + "funcname": "IsGpioValue", + "funcaddr": "0x3003c58", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3003c78" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003c84": { + "funcname": "IsGpioDirection", + "funcaddr": "0x3003c84", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3003ca4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003cb0": { + "funcname": "IsGpioPins", + "funcaddr": "0x3003cb0", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3003cd4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003ce0": { + "funcname": "IsGpioPin", + "funcaddr": "0x3003ce0", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3003d52" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003d5e": { + "funcname": "IsGpioITMode", + "funcaddr": "0x3003d5e", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3003da6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3003db2": { + "funcname": "DCL_GPIO_SetValue", + "funcaddr": "0x3003db2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30044ae", + "3003e1c", + "0x3003cb0", + "3003e7e", + "0x3003c58", + "3003e70" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003e86": { + "funcname": "DCL_GPIO_SetDirection", + "funcaddr": "0x3003e86", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30044ae", + "3003ef0", + "0x3003cb0", + "3003f74", + "0x3003c84" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3003f7c": { + "funcname": "DCL_GPIO_ClearIrq", + "funcaddr": "0x3003f7c", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30044ae", + "3003fe2", + "0x3003cb0", + "300401a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004022": { + "funcname": "DCL_GPIO_EnableIrq", + "funcaddr": "0x3004022", + "LocalCost": 32, + "MaxCost": 192, + "called": [ + "0x30044ae", + "3004088", + "0x3003cb0", + "30040ca", + "0x3003f7c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30040d2": { + "funcname": "DCL_GPIO_DisableIrq", + "funcaddr": "0x30040d2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30044ae", + "3004138", + "0x3003cb0", + "3004174" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300417c": { + "funcname": "DCL_GPIO_GetMIS", + "funcaddr": "0x300417c", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30044ae", + "30041de" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30041f6": { + "funcname": "HAL_GPIO_Init", + "funcaddr": "0x30041f6", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30044ae", + "3004216", + "300427a", + "0x3003cb0", + "30042d4", + "30042ca" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30042dc": { + "funcname": "HAL_GPIO_SetDirection", + "funcaddr": "0x30042dc", + "LocalCost": 32, + "MaxCost": 192, + "called": [ + "0x30044ae", + "3004304", + "3004368", + "0x3003cb0", + "30043bc", + "0x3003c84", + "0x3003e86" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30043c4": { + "funcname": "HAL_GPIO_SetValue", + "funcaddr": "0x30043c4", + "LocalCost": 32, + "MaxCost": 192, + "called": [ + "0x30044ae", + "30043ec", + "3004450", + "0x3003cb0", + "30044a6", + "0x3003c58", + "0x3003db2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30044ae": { + "funcname": "AssertErrorLog.trans.2", + "funcaddr": "0x30044ae", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x30011f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30044b2": { + "funcname": "HAL_GPIO_GetPinValue", + "funcaddr": "0x30044b2", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30044ae", + "30044d6", + "300453a", + "0x3003ce0", + "300455c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300457e": { + "funcname": "GPIO_SetLevelIrqType", + "funcaddr": "0x300457e", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300460c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004614": { + "funcname": "GPIO_SetEdgeIrqType", + "funcaddr": "0x3004614", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30046a6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30046ae": { + "funcname": "HAL_GPIO_SetIrqType", + "funcaddr": "0x30046ae", + "LocalCost": 32, + "MaxCost": 256, + "called": [ + "0x30044ae", + "30046d6", + "300473a", + "0x3003cb0", + "30048b2", + "0x3003d5e", + "0x30040d2", + "0x300457e", + "30048a0", + "0x3004614", + "0x3004022" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30048bc": { + "funcname": "GPIO_ExcuteCallBack", + "funcaddr": "0x30048bc", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30044ae", + "30048e0", + "3004944", + "0x3003cb0", + "30049bc", + "30049b2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30049c4": { + "funcname": "HAL_GPIO_IrqHandler", + "funcaddr": "0x30049c4", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x30044ae", + "30049ec", + "3004a50", + "0x300417c", + "3004ab6", + "0x3003f7c", + "0x30048bc" + ], + "Location": "gpio.c:293", + "IsCalled": 0, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004ace": { + "funcname": "HAL_GPIO_RegisterCallBack", + "funcaddr": "0x3004ace", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30044ae", + "3004af6", + "3004b5a", + "0x3003ce0", + "3004bc0", + "3004bb6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004bc8": { + "funcname": "IsGptPwmNum", + "funcaddr": "0x3004bc8", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3004be4": { + "funcname": "IsGptDiv", + "funcaddr": "0x3004be4", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3004c02": { + "funcname": "IsGptPeriod", + "funcaddr": "0x3004c02", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3004c26" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3004c32": { + "funcname": "IsGptRefDot", + "funcaddr": "0x3004c32", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3004c50": { + "funcname": "IsGptAction", + "funcaddr": "0x3004c50", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3004c6c": { + "funcname": "HAL_GPT_Init", + "funcaddr": "0x3004c6c", + "LocalCost": 32, + "MaxCost": 224, + "called": [ + "0x30051fa", + "3004c8c", + "3004cd4", + "0x3004d88", + "0x3004e14", + "3004cf0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3004cfa": { + "funcname": "HAL_GPT_Start", + "funcaddr": "0x3004cfa", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30051fa", + "3004d1a", + "3004d62" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004d88": { + "funcname": "HAL_GPT_Stop", + "funcaddr": "0x3004d88", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30051fa", + "3004da8", + "3004df0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3004e14": { + "funcname": "HAL_GPT_Config", + "funcaddr": "0x3004e14", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30051fa", + "3004e34", + "3004e7c", + "0x3004c02", + "3005116", + "0x3004be4", + "0x3004c32", + "0x3004c50", + "0x3004bc8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005120": { + "funcname": "HAL_GPT_GetReferCounterAndAction", + "funcaddr": "0x3005120", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x30051fa", + "3005144", + "300515a", + "30051a2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30051fa": { + "funcname": "AssertErrorLog.trans.3", + "funcaddr": "0x30051fa", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x30011f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30051fe": { + "funcname": "IsI2cFunctionMode", + "funcaddr": "0x30051fe", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005232" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300523e": { + "funcname": "IsI2cAddressMode", + "funcaddr": "0x300523e", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300525e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300526a": { + "funcname": "IsI2cSdaHoldTime", + "funcaddr": "0x300526a", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005288": { + "funcname": "IsI2cGeneralCallMode", + "funcaddr": "0x3005288", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30052a8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30052b4": { + "funcname": "IsI2cOwnAddressOrMask", + "funcaddr": "0x30052b4", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30052d0": { + "funcname": "IsXMBusAddressOrMask", + "funcaddr": "0x30052d0", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30052ec": { + "funcname": "IsXMBusAddressEnable", + "funcaddr": "0x30052ec", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300530c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005318": { + "funcname": "IsI2cSpikeFilterTime", + "funcaddr": "0x3005318", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005334": { + "funcname": "IsI2cFreq", + "funcaddr": "0x3005334", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005350": { + "funcname": "IsI2cIgnoreAckFlag", + "funcaddr": "0x3005350", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005370" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300537c": { + "funcname": "IsI2cTxWaterMark", + "funcaddr": "0x300537c", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005398": { + "funcname": "IsI2cRxWaterMark", + "funcaddr": "0x3005398", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30053b4": { + "funcname": "IsI2cSdaDelayTime", + "funcaddr": "0x30053b4", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30053d0": { + "funcname": "CheckAllInitParameters", + "funcaddr": "0x30053d0", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x30051fe", + "0x30051fa", + "3005612", + "0x300523e", + "0x300526a", + "0x3005334", + "0x3005350", + "0x300537c", + "0x3005398", + "0x3005318", + "0x30053b4", + "0x30052b4", + "0x3005288", + "0x30052ec", + "0x30052d0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300561c": { + "funcname": "HAL_I2C_Init", + "funcaddr": "0x300561c", + "LocalCost": 64, + "MaxCost": 512, + "called": [ + "0x30051fa", + "300563c", + "3005668", + "0x3002526", + "0x30053d0", + "30058f4", + "300578c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x30058fe": { + "funcname": "DCL_IOCMG_SetRegValue", + "funcaddr": "0x30058fe", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "300592c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005942": { + "funcname": "DCL_IOCMG_SetDriveRate", + "funcaddr": "0x3005942", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "3005970", + "30059a8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30059b0": { + "funcname": "DCL_IOCMG_SetPullMode", + "funcaddr": "0x30059b0", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "30059de", + "3005a34" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005a3c": { + "funcname": "DCL_IOCMG_SetLevelShiftRate", + "funcaddr": "0x3005a3c", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "3005a6a", + "3005aa2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005aaa": { + "funcname": "DCL_IOCMG_SetSchmidtMode", + "funcaddr": "0x3005aaa", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "3005ad8", + "3005b10" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3005b18": { + "funcname": "IOCMG_GetRegAddr", + "funcaddr": "0x3005b18", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3005b62" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005b6a": { + "funcname": "HAL_IOCMG_SetPinAltFuncMode", + "funcaddr": "0x3005b6a", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3005b18", + "0x30058fe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3005ba4": { + "funcname": "HAL_IOCMG_SetPinPullMode", + "funcaddr": "0x3005ba4", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3006006", + "3005be6", + "0x3005b18", + "0x30059b0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3005bf0": { + "funcname": "HAL_IOCMG_SetPinSchmidtMode", + "funcaddr": "0x3005bf0", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3006006", + "3005c32", + "0x3005b18", + "0x3005aaa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3005c3c": { + "funcname": "HAL_IOCMG_SetPinLevelShiftRate", + "funcaddr": "0x3005c3c", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3006006", + "3005c7e", + "0x3005b18", + "0x3005a3c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3005c88": { + "funcname": "HAL_IOCMG_SetPinDriveRate", + "funcaddr": "0x3005c88", + "LocalCost": 48, + "MaxCost": 224, + "called": [ + "0x3006006", + "3005cca", + "0x3005b18", + "0x3005942" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3005cd4": { + "funcname": "IsTimerMode", + "funcaddr": "0x3005cd4", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005cfe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005d0a": { + "funcname": "IsTimerInterruptType", + "funcaddr": "0x3005d0a", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005d2a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005d36": { + "funcname": "IsTimerSize", + "funcaddr": "0x3005d36", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005d56" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005d62": { + "funcname": "IsTimerPeriod", + "funcaddr": "0x3005d62", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3005d7e": { + "funcname": "IsTimerDiv", + "funcaddr": "0x3005d7e", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3005da8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3005db4": { + "funcname": "HAL_TIMER_Init", + "funcaddr": "0x3005db4", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "3005dd4", + "3005e1c", + "0x3005d62", + "3005ffc", + "0x3005cd4", + "0x3005d36", + "0x3005d7e", + "3005fb4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3006006": { + "funcname": "AssertErrorLog.trans.4", + "funcaddr": "0x3006006", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x30011f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300600a": { + "funcname": "HAL_TIMER_Start", + "funcaddr": "0x300600a", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "300602a", + "3006072" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300608c": { + "funcname": "HAL_TIMER_IrqHandler", + "funcaddr": "0x300608c", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3006006", + "30060ac", + "30060fc" + ], + "Location": "timer.c:215", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3006174": { + "funcname": "HAL_TIMER_RegisterCallback", + "funcaddr": "0x3006174", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006006", + "300619c", + "30061b2", + "0x3005d0a", + "30061d2", + "30061fc", + "30061fe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3006208": { + "funcname": "IsUartDatalength", + "funcaddr": "0x3006208", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006224": { + "funcname": "IsUartStopbits", + "funcaddr": "0x3006224", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3006244" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3006250": { + "funcname": "IsUartParitymode", + "funcaddr": "0x3006250", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "300626a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3006272": { + "funcname": "IsUartTransmode", + "funcaddr": "0x3006272", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30062a6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30062ae": { + "funcname": "IsUartFIFOThreshold", + "funcaddr": "0x30062ae", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30062ca": { + "funcname": "IsUartOversampleMultiple", + "funcaddr": "0x30062ca", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30062e6": { + "funcname": "DivClosest", + "funcaddr": "0x30062e6", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300631c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3006324": { + "funcname": "BaudDetectCallBack", + "funcaddr": "0x3006324", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30063f6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3006400": { + "funcname": "CharterMatchCallBack", + "funcaddr": "0x3006400", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300644c": { + "funcname": "UART_SetParityBit", + "funcaddr": "0x300644c", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "30064dc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30064e2": { + "funcname": "HAL_UART_Init", + "funcaddr": "0x30064e2", + "LocalCost": 48, + "MaxCost": 480, + "called": [ + "0x3006006", + "3006502", + "300654a", + "3006896", + "0x3006208", + "0x3006224", + "0x3006250", + "0x3006272", + "0x30062ae", + "0x30062ca", + "0x3002526", + "0x30062e6", + "0x300644c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x30068a0": { + "funcname": "WriteITCallBack", + "funcaddr": "0x30068a0", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006f0a", + "30068c0", + "3006908", + "3006920", + "3006986", + "3006992" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30069f2": { + "funcname": "ReadITCallBack", + "funcaddr": "0x30069f2", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3006f0a", + "3006a12", + "3006a2a", + "3006a72", + "3006afe", + "3006b0c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3006b54": { + "funcname": "ErrorServiceCallback", + "funcaddr": "0x3006b54", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3006c62" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3006c9e": { + "funcname": "HAL_UART_IrqHandler", + "funcaddr": "0x3006c9e", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x3006f0a", + "3006cbe", + "3006d0e", + "0x30068a0", + "0x30069f2", + "0x3006400", + "0x3006324", + "0x3006b54" + ], + "Location": "uart.c:731", + "IsCalled": 0, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3006dfc": { + "funcname": "HAL_UART_RegisterCallBack", + "funcaddr": "0x3006dfc", + "LocalCost": 32, + "MaxCost": 128, + "called": [ + "0x3006f0a", + "3006e24", + "3006e6c", + "3006efe", + "3006f00" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x3006f0a": { + "funcname": "AssertErrorLog.trans.5", + "funcaddr": "0x3006f0a", + "LocalCost": 0, + "MaxCost": 64, + "called": [ + "0x30011f0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3006f0e": { + "funcname": "UART0ReadInterruptCallback", + "funcaddr": "0x3006f0e", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "main.c:80", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006f30": { + "funcname": "TIMER0_InterruptProcess", + "funcaddr": "0x3006f30", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "main.c:89", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006fa0": { + "funcname": "GPIO1_1_CallbackFunc", + "funcaddr": "0x3006fa0", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "main.c:108", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006fc6": { + "funcname": "GPIO1_4_CallbackFunc", + "funcaddr": "0x3006fc6", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "main.c:119", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3006fec": { + "funcname": "UART0_InterruptTxInit", + "funcaddr": "0x3006fec", + "LocalCost": 32, + "MaxCost": 64, + "called": [ + "3007042" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300704a": { + "funcname": "GetNumFromStr", + "funcaddr": "0x300704a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300707e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300709a": { + "funcname": "main", + "funcaddr": "0x300709a", + "LocalCost": 16, + "MaxCost": 3840, + "called": [ + "0x3007e96", + "0x3006fec", + "0x300dc36", + "0x300600a", + "0x300dc64", + "0x300dc8c", + "0x30073a8", + "3007144", + "3007194", + "0x30073a4", + "0x3008006", + "0x30073ac", + "0x300704a", + "3007392", + "0x3008436", + "0x3008464", + "0x300830c", + "0x300834c", + "0x300838c", + "0x30083be", + "0x30083f8", + "0x300ec8c", + "30070c0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 34, + "ptrVarName": [] + }, + "0x30073a4": { + "funcname": "CarWorkStatus.trans.51", + "funcaddr": "0x30073a4", + "LocalCost": 0, + "MaxCost": 832, + "called": [ + "0x300829e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x30073a8": { + "funcname": "DBG_UartPrintf.trans.32", + "funcaddr": "0x30073a8", + "LocalCost": 0, + "MaxCost": 736, + "called": [ + "0x3003af0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x30073ac": { + "funcname": "strncmp.trans.28", + "funcaddr": "0x30073ac", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x300ed5e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30073b0": { + "funcname": "CRG_Config", + "funcaddr": "0x30073b0", + "LocalCost": 80, + "MaxCost": 448, + "called": [ + "0x300204e", + "3007410" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x300741a": { + "funcname": "GPIO_Init", + "funcaddr": "0x300741a", + "LocalCost": 16, + "MaxCost": 512, + "called": [ + "0x30078ce", + "0x3007636", + "0x300763a", + "0x300763e", + "0x3007632", + "0x3004ace", + "0x30079bc", + "0x30079b8", + "0x30079b4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3007632": { + "funcname": "HAL_GPIO_SetIrqType.trans.44", + "funcaddr": "0x3007632", + "LocalCost": 0, + "MaxCost": 256, + "called": [ + "0x30046ae" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3007636": { + "funcname": "HAL_GPIO_Init.trans.36", + "funcaddr": "0x3007636", + "LocalCost": 0, + "MaxCost": 160, + "called": [ + "0x30041f6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300763a": { + "funcname": "HAL_GPIO_SetDirection.trans.30", + "funcaddr": "0x300763a", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30042dc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x300763e": { + "funcname": "HAL_GPIO_SetValue.trans.11", + "funcaddr": "0x300763e", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30043c4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007642": { + "funcname": "GPT1_Init", + "funcaddr": "0x3007642", + "LocalCost": 16, + "MaxCost": 256, + "called": [ + "0x30078ce", + "0x30077fe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x30076d4": { + "funcname": "GPT2_Init", + "funcaddr": "0x30076d4", + "LocalCost": 16, + "MaxCost": 256, + "called": [ + "0x30078ce", + "0x30077fe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3007766": { + "funcname": "GPT3_Init", + "funcaddr": "0x3007766", + "LocalCost": 16, + "MaxCost": 256, + "called": [ + "0x30078ce", + "0x30077fe" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x30077fe": { + "funcname": "HAL_GPT_Init.trans.55", + "funcaddr": "0x30077fe", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3004c6c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007802": { + "funcname": "TIMER0_Init", + "funcaddr": "0x3007802", + "LocalCost": 32, + "MaxCost": 544, + "called": [ + "0x30078ce", + "0x3002526", + "0x3005db4", + "0x30079bc", + "0x3006174", + "0x30079b8", + "0x30079b4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x30078ce": { + "funcname": "HAL_CRG_IpEnableSet.trans.19", + "funcaddr": "0x30078ce", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x3002604" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x30078d2": { + "funcname": "UART0WriteInterruptCallback", + "funcaddr": "0x30078d2", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "system_init.c:223", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30078e4": { + "funcname": "UART0_Init", + "funcaddr": "0x30078e4", + "LocalCost": 16, + "MaxCost": 512, + "called": [ + "0x30078ce", + "0x30064e2", + "0x3006dfc", + "0x30079bc", + "0x30079b8", + "0x30079b4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x30079b4": { + "funcname": "IRQ_EnableN.trans.54", + "funcaddr": "0x30079b4", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x3001464" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30079b8": { + "funcname": "IRQ_SetPriority.trans.53", + "funcaddr": "0x30079b8", + "LocalCost": 0, + "MaxCost": 480, + "called": [ + "0x3001bb2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x30079bc": { + "funcname": "IRQ_Register.trans.52", + "funcaddr": "0x30079bc", + "LocalCost": 0, + "MaxCost": 128, + "called": [ + "0x30013e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x30079c0": { + "funcname": "I2C0_Init", + "funcaddr": "0x30079c0", + "LocalCost": 16, + "MaxCost": 544, + "called": [ + "0x30078ce", + "0x300561c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x3007a46": { + "funcname": "IOConfig", + "funcaddr": "0x3007a46", + "LocalCost": 16, + "MaxCost": 256, + "called": [ + "0x3007e92", + "0x3007e8e", + "0x3007e8a", + "0x3007e86", + "0x3007e82" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3007e82": { + "funcname": "HAL_IOCMG_SetPinDriveRate.trans.24", + "funcaddr": "0x3007e82", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3005c88" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007e86": { + "funcname": "HAL_IOCMG_SetPinLevelShiftRate.trans.23", + "funcaddr": "0x3007e86", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3005c3c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007e8a": { + "funcname": "HAL_IOCMG_SetPinSchmidtMode.trans.22", + "funcaddr": "0x3007e8a", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3005bf0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007e8e": { + "funcname": "HAL_IOCMG_SetPinPullMode.trans.21", + "funcaddr": "0x3007e8e", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3005ba4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007e92": { + "funcname": "HAL_IOCMG_SetPinAltFuncMode.trans.20", + "funcaddr": "0x3007e92", + "LocalCost": 0, + "MaxCost": 224, + "called": [ + "0x3005b6a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007e96": { + "funcname": "SystemInit", + "funcaddr": "0x3007e96", + "LocalCost": 16, + "MaxCost": 576, + "called": [ + "0x3007a46", + "0x30078e4", + "0x30079c0", + "0x3007642", + "0x30076d4", + "0x3007766", + "0x3007802", + "0x300741a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 8, + "ptrVarName": [] + }, + "0x3007ebc": { + "funcname": "MotorStatus", + "funcaddr": "0x3007ebc", + "LocalCost": 32, + "MaxCost": 256, + "called": [ + "0x3007f70", + "3007f66" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x3007f70": { + "funcname": "HAL_GPIO_SetValue.trans.12", + "funcaddr": "0x3007f70", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30043c4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3007f74": { + "funcname": "ChangeCarApt", + "funcaddr": "0x3007f74", + "LocalCost": 64, + "MaxCost": 288, + "called": [ + "0x300829a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x3008006": { + "funcname": "SynTwoMotorSpeed", + "funcaddr": "0x3008006", + "LocalCost": 64, + "MaxCost": 416, + "called": [ + "0x3007f74" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 5, + "ptrVarName": [] + }, + "0x30081e0": { + "funcname": "SetCarAptAndStart", + "funcaddr": "0x30081e0", + "LocalCost": 80, + "MaxCost": 320, + "called": [ + "0x300829a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x300829a": { + "funcname": "HAL_GPT_GetReferCounterAndAction.trans.45", + "funcaddr": "0x300829a", + "LocalCost": 0, + "MaxCost": 160, + "called": [ + "0x3005120" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300829e": { + "funcname": "CarWorkStatus", + "funcaddr": "0x300829e", + "LocalCost": 32, + "MaxCost": 832, + "called": [ + "0x3007ebc", + "0x30084be", + "0x3008432", + "3008302", + "0x3004d88" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300830c": { + "funcname": "TurnLeft", + "funcaddr": "0x300830c", + "LocalCost": 16, + "MaxCost": 864, + "called": [ + "0x3007ebc", + "0x30081e0", + "0x30084be", + "0x300829e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x300834c": { + "funcname": "TurnRight", + "funcaddr": "0x300834c", + "LocalCost": 16, + "MaxCost": 864, + "called": [ + "0x3007ebc", + "0x30081e0", + "0x30084be", + "0x300829e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x300838c": { + "funcname": "Retreat", + "funcaddr": "0x300838c", + "LocalCost": 16, + "MaxCost": 288, + "called": [ + "0x3007ebc", + "0x3008432" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x30083be": { + "funcname": "ClockwiseMotor", + "funcaddr": "0x30083be", + "LocalCost": 16, + "MaxCost": 288, + "called": [ + "0x3007ebc", + "0x3008432" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x30083f8": { + "funcname": "AnticlockwiseMotor", + "funcaddr": "0x30083f8", + "LocalCost": 16, + "MaxCost": 288, + "called": [ + "0x3007ebc", + "0x3008432" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 6, + "ptrVarName": [] + }, + "0x3008432": { + "funcname": "HAL_GPT_Start.trans.35", + "funcaddr": "0x3008432", + "LocalCost": 0, + "MaxCost": 160, + "called": [ + "0x3004cfa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x3008436": { + "funcname": "Come", + "funcaddr": "0x3008436", + "LocalCost": 16, + "MaxCost": 864, + "called": [ + "0x3007ebc", + "0x30081e0", + "0x30084be", + "0x300829e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x3008464": { + "funcname": "AsGuard", + "funcaddr": "0x3008464", + "LocalCost": 32, + "MaxCost": 2976, + "called": [ + "0x3007ebc", + "0x30081e0", + "0x300dc8c", + "300847e", + "0x300834c", + "0x30084be", + "0x300830c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 29, + "ptrVarName": [] + }, + "0x30084be": { + "funcname": "BASE_FUNC_Delay.trans.14", + "funcaddr": "0x30084be", + "LocalCost": 0, + "MaxCost": 768, + "called": [ + "0x30012e4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 11, + "ptrVarName": [] + }, + "0x30084c2": { + "funcname": "VL53L0X_GetOffsetCalibrationDataMicroMeter", + "funcaddr": "0x30084c2", + "LocalCost": 48, + "MaxCost": 1376, + "called": [ + "0x300a512" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x30084f6": { + "funcname": "VL53L0X_SetDeviceAddress", + "funcaddr": "0x30084f6", + "LocalCost": 48, + "MaxCost": 1248, + "called": [ + "0x3008ba4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x3008534": { + "funcname": "VL53L0X_DataInit", + "funcaddr": "0x3008534", + "LocalCost": 176, + "MaxCost": 2240, + "called": [ + "0x3008ba4", + "0x3008ba8", + "0x300e92a", + "0x300e5e2", + "300876a", + "0x3008878", + "3008778", + "0x3008874" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 25, + "ptrVarName": [] + }, + "0x3008874": { + "funcname": "VL53L0X_SetLimitCheckValue.trans.46", + "funcaddr": "0x3008874", + "LocalCost": 0, + "MaxCost": 1248, + "called": [ + "0x30094f4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x3008878": { + "funcname": "VL53L0X_SetLimitCheckEnable.trans.39", + "funcaddr": "0x3008878", + "LocalCost": 0, + "MaxCost": 1280, + "called": [ + "0x3009338" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300887c": { + "funcname": "VL53L0X_StaticInit", + "funcaddr": "0x300887c", + "LocalCost": 192, + "MaxCost": 3680, + "called": [ + "0x300ec8c", + "0x300b6be", + "0x300aa20", + "3008946", + "0x300aee6", + "300897c", + "0x300cc12", + "0x300a096", + "0x3008ba4", + "0x300e638", + "0x3008ba8", + "0x3008de2", + "0x300e92a", + "0x300e5e2", + "0x3008ed6", + "0x3008e96", + "0x300c39c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 31, + "ptrVarName": [] + }, + "0x3008ba4": { + "funcname": "VL53L0X_WrByte.trans.6", + "funcaddr": "0x3008ba4", + "LocalCost": 0, + "MaxCost": 1152, + "called": [ + "0x300e484" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x3008ba8": { + "funcname": "VL53L0X_GetDeviceParameters", + "funcaddr": "0x3008ba8", + "LocalCost": 48, + "MaxCost": 1888, + "called": [ + "0x3008db8", + "0x3009200", + "0x30092b0", + "0x30084c2", + "3008cb2", + "0x30095e6", + "0x300949a", + "3008cc4", + "0x3009740", + "0x3008e62", + "3008d52" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 24, + "ptrVarName": [] + }, + "0x3008d6a": { + "funcname": "VL53L0X_SetDeviceMode", + "funcaddr": "0x3008d6a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "3008dac" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x3008db8": { + "funcname": "VL53L0X_GetDeviceMode", + "funcaddr": "0x3008db8", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x3008de2": { + "funcname": "VL53L0X_GetFractionEnable", + "funcaddr": "0x3008de2", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x30091fc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x3008e2e": { + "funcname": "VL53L0X_SetMeasurementTimingBudgetMicroSeconds", + "funcaddr": "0x3008e2e", + "LocalCost": 48, + "MaxCost": 1792, + "called": [ + "0x300c858" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 22, + "ptrVarName": [] + }, + "0x3008e62": { + "funcname": "VL53L0X_GetMeasurementTimingBudgetMicroSeconds", + "funcaddr": "0x3008e62", + "LocalCost": 48, + "MaxCost": 1792, + "called": [ + "0x300ca6e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 23, + "ptrVarName": [] + }, + "0x3008e96": { + "funcname": "VL53L0X_GetVcselPulsePeriod", + "funcaddr": "0x3008e96", + "LocalCost": 48, + "MaxCost": 1376, + "called": [ + "0x300c7ce" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x3008ed6": { + "funcname": "VL53L0X_SetSequenceStepEnable", + "funcaddr": "0x3008ed6", + "LocalCost": 48, + "MaxCost": 1888, + "called": [ + "0x30091fc", + "3008ffa", + "0x3008ba4", + "0x3008e2e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 23, + "ptrVarName": [] + }, + "0x300905a": { + "funcname": "sequence_step_enabled", + "funcaddr": "0x300905a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300910e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300911a": { + "funcname": "VL53L0X_GetSequenceStepEnables", + "funcaddr": "0x300911a", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x30091fc", + "0x300905a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x30091fc": { + "funcname": "VL53L0X_RdByte.trans.16", + "funcaddr": "0x30091fc", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300e5e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x3009200": { + "funcname": "VL53L0X_GetInterMeasurementPeriodMilliSeconds", + "funcaddr": "0x3009200", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300973c", + "0x300e68e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300927e": { + "funcname": "VL53L0X_GetXTalkCompensationEnable", + "funcaddr": "0x300927e", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x30092b0": { + "funcname": "VL53L0X_GetXTalkCompensationRateMegaCps", + "funcaddr": "0x30092b0", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300973c", + "300932a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x3009338": { + "funcname": "VL53L0X_SetLimitCheckEnable", + "funcaddr": "0x3009338", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "3009460", + "30093a8", + "0x30095e2", + "0x300e53c", + "300948c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300949a": { + "funcname": "VL53L0X_GetLimitCheckEnable", + "funcaddr": "0x300949a", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "30094e8" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x30094f4": { + "funcname": "VL53L0X_SetLimitCheckValue", + "funcaddr": "0x30094f4", + "LocalCost": 48, + "MaxCost": 1248, + "called": [ + "30095d4", + "30095ba", + "0x30095e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x30095e2": { + "funcname": "VL53L0X_WrWord.trans.42", + "funcaddr": "0x30095e2", + "LocalCost": 0, + "MaxCost": 1152, + "called": [ + "0x300e4e0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x30095e6": { + "funcname": "VL53L0X_GetLimitCheckValue", + "funcaddr": "0x30095e6", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "30096b0", + "0x300973c", + "300972e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300973c": { + "funcname": "VL53L0X_RdWord.trans.25", + "funcaddr": "0x300973c", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300e638" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x3009740": { + "funcname": "VL53L0X_GetWrapAroundCheckEnable", + "funcaddr": "0x3009740", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x30091fc", + "3009798" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x30097ba": { + "funcname": "VL53L0X_PerformSingleMeasurement", + "funcaddr": "0x30097ba", + "LocalCost": 48, + "MaxCost": 1568, + "called": [ + "0x3008db8", + "0x3009ac2", + "0x300b4de" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 22, + "ptrVarName": [] + }, + "0x300982e": { + "funcname": "VL53L0X_PerformRefCalibration", + "funcaddr": "0x300982e", + "LocalCost": 48, + "MaxCost": 1856, + "called": [ + "0x300b440" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 23, + "ptrVarName": [] + }, + "0x300986c": { + "funcname": "VL53L0X_CheckAndLoadInterruptSettings", + "funcaddr": "0x300986c", + "LocalCost": 48, + "MaxCost": 1376, + "called": [ + "0x3009aba", + "0x3009abe", + "3009aa2", + "0x3009c8a", + "3009aa6", + "3009aaa", + "3009aac" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 20, + "ptrVarName": [] + }, + "0x3009aba": { + "funcname": "VL53L0X_GetInterruptThresholds.trans.56", + "funcaddr": "0x3009aba", + "LocalCost": 0, + "MaxCost": 1280, + "called": [ + "0x300a364" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x3009abe": { + "funcname": "VL53L0X_load_tuning_settings.trans.47", + "funcaddr": "0x3009abe", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300cc12" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x3009ac2": { + "funcname": "VL53L0X_StartMeasurement", + "funcaddr": "0x3009ac2", + "LocalCost": 48, + "MaxCost": 1472, + "called": [ + "0x3008db8", + "0x3009c8a", + "0x300e5e2", + "3009c72", + "0x300986c", + "3009c76", + "3009c7a", + "3009c7c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 21, + "ptrVarName": [] + }, + "0x3009c8a": { + "funcname": "VL53L0X_WrByte.trans.7", + "funcaddr": "0x3009c8a", + "LocalCost": 0, + "MaxCost": 1152, + "called": [ + "0x300e484" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x3009c8e": { + "funcname": "VL53L0X_GetMeasurementDataReady", + "funcaddr": "0x3009c8e", + "LocalCost": 48, + "MaxCost": 1376, + "called": [ + "0x300a484", + "3009d20", + "0x300e5e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x3009d2e": { + "funcname": "VL53L0X_GetRangingMeasurementData", + "funcaddr": "0x3009d2e", + "LocalCost": 112, + "MaxCost": 2816, + "called": [ + "0x300e414", + "3009eca", + "3009f10", + "0x300d708" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 27, + "ptrVarName": [] + }, + "0x300a026": { + "funcname": "VL53L0X_PerformSingleRangingMeasurement", + "funcaddr": "0x300a026", + "LocalCost": 48, + "MaxCost": 2912, + "called": [ + "0x3008d6a", + "0x30097ba", + "0x3009d2e", + "0x300a3e6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 28, + "ptrVarName": [] + }, + "0x300a096": { + "funcname": "VL53L0X_SetGpioConfig", + "funcaddr": "0x300a096", + "LocalCost": 48, + "MaxCost": 1376, + "called": [ + "300a356", + "300a0ea", + "0x3009c8a", + "300a2e2", + "300a314", + "0x300e53c", + "0x300a3e6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300a364": { + "funcname": "VL53L0X_GetInterruptThresholds", + "funcaddr": "0x300a364", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300aa18" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300a3e6": { + "funcname": "VL53L0X_ClearInterruptMask", + "funcaddr": "0x300a3e6", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300aa1c", + "0x300e5e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300a484": { + "funcname": "VL53L0X_GetInterruptMaskStatus", + "funcaddr": "0x300a484", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300e5e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300a4d8": { + "funcname": "VL53L0X_PerformRefSpadManagement", + "funcaddr": "0x300a4d8", + "LocalCost": 48, + "MaxCost": 3392, + "called": [ + "0x300aa20" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 31, + "ptrVarName": [] + }, + "0x300a512": { + "funcname": "VL53L0X_get_offset_calibration_data_micro_meter", + "funcaddr": "0x300a512", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300aa18", + "300a5aa" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300a5b8": { + "funcname": "get_next_good_spad", + "funcaddr": "0x300a5b8", + "LocalCost": 64, + "MaxCost": 128, + "called": [ + "300a698", + "300a682", + "300a68e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300a6b2": { + "funcname": "is_aperture", + "funcaddr": "0x300a6b2", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300a6ec": { + "funcname": "enable_spad_bit", + "funcaddr": "0x300a6ec", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300a776" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300a782": { + "funcname": "set_ref_spad_map", + "funcaddr": "0x300a782", + "LocalCost": 48, + "MaxCost": 1152, + "called": [ + "0x300e3a0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300a7b8": { + "funcname": "get_ref_spad_map", + "funcaddr": "0x300a7b8", + "LocalCost": 48, + "MaxCost": 1184, + "called": [ + "0x300e414" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300a7ee": { + "funcname": "enable_ref_spads", + "funcaddr": "0x300a7ee", + "LocalCost": 80, + "MaxCost": 1344, + "called": [ + "300a8aa", + "0x300a5b8", + "300a8b6", + "0x300a6b2", + "0x300a6ec", + "0x300a782", + "0x300a7b8", + "300a924", + "300a930" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300a93e": { + "funcname": "perform_ref_signal_measurement", + "funcaddr": "0x300a93e", + "LocalCost": 64, + "MaxCost": 3040, + "called": [ + "0x300aa1c", + "0x300a026", + "0x300aa18" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 29, + "ptrVarName": [] + }, + "0x300aa18": { + "funcname": "VL53L0X_RdWord.trans.26", + "funcaddr": "0x300aa18", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300e638" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300aa1c": { + "funcname": "VL53L0X_WrByte.trans.8", + "funcaddr": "0x300aa1c", + "LocalCost": 0, + "MaxCost": 1152, + "called": [ + "0x300e484" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300aa20": { + "funcname": "VL53L0X_perform_ref_spad_management", + "funcaddr": "0x300aa20", + "LocalCost": 128, + "MaxCost": 3296, + "called": [ + "300aab8", + "0x300aa1c", + "0x300b440", + "0x300a7ee", + "0x300a93e", + "300ac1a", + "300ac32", + "0x300a6b2", + "300acda", + "300acdc", + "0x300aee2", + "0x300e920", + "300ae80", + "0x300a5b8", + "300ae90", + "0x300a6ec", + "0x300a782" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 30, + "ptrVarName": [] + }, + "0x300aee2": { + "funcname": "memcpy.trans.37", + "funcaddr": "0x300aee2", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "0x300e92a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300aee6": { + "funcname": "VL53L0X_set_reference_spads", + "funcaddr": "0x300aee6", + "LocalCost": 80, + "MaxCost": 1504, + "called": [ + "0x300aa1c", + "300afb0", + "300afce", + "0x300a6b2", + "0x300a7ee" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300b062": { + "funcname": "VL53L0X_perform_single_ref_calibration", + "funcaddr": "0x300b062", + "LocalCost": 48, + "MaxCost": 1568, + "called": [ + "0x300aa1c", + "0x300b4de", + "0x300a3e6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 20, + "ptrVarName": [] + }, + "0x300b0e4": { + "funcname": "VL53L0X_ref_calibration_io", + "funcaddr": "0x300b0e4", + "LocalCost": 64, + "MaxCost": 1312, + "called": [ + "0x300aa1c", + "0x300b6ba", + "0x300b6b6", + "300b210", + "0x300e53c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300b27a": { + "funcname": "VL53L0X_perform_vhv_calibration", + "funcaddr": "0x300b27a", + "LocalCost": 48, + "MaxCost": 1664, + "called": [ + "0x300b6ba", + "0x300b062", + "0x300b0e4", + "300b320" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 21, + "ptrVarName": [] + }, + "0x300b360": { + "funcname": "VL53L0X_perform_phase_calibration", + "funcaddr": "0x300b360", + "LocalCost": 48, + "MaxCost": 1664, + "called": [ + "0x300b6ba", + "0x300b062", + "0x300b0e4", + "300b400" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 21, + "ptrVarName": [] + }, + "0x300b440": { + "funcname": "VL53L0X_perform_ref_calibration", + "funcaddr": "0x300b440", + "LocalCost": 48, + "MaxCost": 1760, + "called": [ + "0x300b27a", + "0x300b360", + "0x300b6ba" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 22, + "ptrVarName": [] + }, + "0x300b4de": { + "funcname": "VL53L0X_measurement_poll_for_completion", + "funcaddr": "0x300b4de", + "LocalCost": 48, + "MaxCost": 1472, + "called": [ + "0x3009c8e", + "300b548", + "0x300e6e4", + "300b4f6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300b556": { + "funcname": "VL53L0X_decode_vcsel_period", + "funcaddr": "0x300b556", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300b580": { + "funcname": "VL53L0X_isqrt", + "funcaddr": "0x300b580", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300b5a2", + "300b5fe", + "300b5f4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300b610": { + "funcname": "VL53L0X_device_read_strobe", + "funcaddr": "0x300b610", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "0x300b6ba", + "0x300b6b6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 18, + "ptrVarName": [] + }, + "0x300b6b6": { + "funcname": "VL53L0X_RdByte.trans.17", + "funcaddr": "0x300b6b6", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300e5e2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300b6ba": { + "funcname": "VL53L0X_WrByte.trans.9", + "funcaddr": "0x300b6ba", + "LocalCost": 0, + "MaxCost": 1152, + "called": [ + "0x300e484" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300b6be": { + "funcname": "VL53L0X_get_info_from_device", + "funcaddr": "0x300b6be", + "LocalCost": 128, + "MaxCost": 1536, + "called": [ + "0x300b6ba", + "0x300b6b6", + "0x300e6e4", + "0x300b610", + "0x300e68e", + "0x300c1ca", + "0x300c1c6", + "0x300c1ce", + "0x300e5e2", + "300c0ce", + "0x300ed4a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 20, + "ptrVarName": [] + }, + "0x300c1c6": { + "funcname": "VL53L0X_device_read_strobe.trans.38", + "funcaddr": "0x300c1c6", + "LocalCost": 0, + "MaxCost": 1280, + "called": [ + "0x300b610" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300c1ca": { + "funcname": "VL53L0X_RdDWord.trans.29", + "funcaddr": "0x300c1ca", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300e68e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300c1ce": { + "funcname": "VL53L0X_WrByte.trans.10", + "funcaddr": "0x300c1ce", + "LocalCost": 0, + "MaxCost": 1152, + "called": [ + "0x300e484" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300c1d2": { + "funcname": "VL53L0X_calc_macro_period_ps", + "funcaddr": "0x300c1d2", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300c21e": { + "funcname": "VL53L0X_encode_timeout", + "funcaddr": "0x300c21e", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300c25a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300c28e": { + "funcname": "VL53L0X_decode_timeout", + "funcaddr": "0x300c28e", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300c2c4": { + "funcname": "VL53L0X_calc_timeout_mclks", + "funcaddr": "0x300c2c4", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300c1d2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300c330": { + "funcname": "VL53L0X_calc_timeout_us", + "funcaddr": "0x300c330", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300c1d2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300c39c": { + "funcname": "get_sequence_step_timeout", + "funcaddr": "0x300c39c", + "LocalCost": 64, + "MaxCost": 1504, + "called": [ + "0x300c7c6", + "0x300e5e2", + "0x300c28e", + "0x300c330", + "300c57e", + "0x300c7ca", + "0x300ca6a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 20, + "ptrVarName": [] + }, + "0x300c596": { + "funcname": "set_sequence_step_timeout", + "funcaddr": "0x300c596", + "LocalCost": 64, + "MaxCost": 1504, + "called": [ + "0x300c7c6", + "0x300c2c4", + "300c61a", + "0x300c1ce", + "300c7b8", + "0x300c21e", + "0x300e4e0", + "0x300ca6a", + "0x300c7ca", + "0x300c28e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 20, + "ptrVarName": [] + }, + "0x300c7c6": { + "funcname": "VL53L0X_GetVcselPulsePeriod.trans.34", + "funcaddr": "0x300c7c6", + "LocalCost": 0, + "MaxCost": 1376, + "called": [ + "0x3008e96" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300c7ca": { + "funcname": "VL53L0X_RdWord.trans.27", + "funcaddr": "0x300c7ca", + "LocalCost": 0, + "MaxCost": 1184, + "called": [ + "0x300e638" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300c7ce": { + "funcname": "VL53L0X_get_vcsel_pulse_period", + "funcaddr": "0x300c7ce", + "LocalCost": 48, + "MaxCost": 1280, + "called": [ + "300c82a", + "0x300e5e2", + "300c830", + "0x300b556" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 17, + "ptrVarName": [] + }, + "0x300c858": { + "funcname": "VL53L0X_set_measurement_timing_budget_micro_seconds", + "funcaddr": "0x300c858", + "LocalCost": 96, + "MaxCost": 1696, + "called": [ + "0x300ca6a", + "0x300c39c", + "300ca60", + "300c94c", + "300c9cc", + "300ca24", + "0x300c596" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 21, + "ptrVarName": [] + }, + "0x300ca6a": { + "funcname": "VL53L0X_GetSequenceStepEnables.trans.49", + "funcaddr": "0x300ca6a", + "LocalCost": 0, + "MaxCost": 1280, + "called": [ + "0x300911a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300ca6e": { + "funcname": "VL53L0X_get_measurement_timing_budget_micro_seconds", + "funcaddr": "0x300ca6e", + "LocalCost": 96, + "MaxCost": 1696, + "called": [ + "0x300ca6a", + "300cc04", + "0x300cc0e", + "300cb7e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 22, + "ptrVarName": [] + }, + "0x300cc0e": { + "funcname": "get_sequence_step_timeout.trans.40", + "funcaddr": "0x300cc0e", + "LocalCost": 0, + "MaxCost": 1504, + "called": [ + "0x300c39c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 21, + "ptrVarName": [] + }, + "0x300cc12": { + "funcname": "VL53L0X_load_tuning_settings", + "funcaddr": "0x300cc12", + "LocalCost": 64, + "MaxCost": 1184, + "called": [ + "300ce90", + "300cdfe", + "300ce5e", + "0x300e3a0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300ceb4": { + "funcname": "VL53L0X_get_total_xtalk_rate", + "funcaddr": "0x300ceb4", + "LocalCost": 48, + "MaxCost": 192, + "called": [ + "0x300927e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300cf32": { + "funcname": "VL53L0X_get_total_signal_rate", + "funcaddr": "0x300cf32", + "LocalCost": 48, + "MaxCost": 288, + "called": [ + "0x300ceb4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300cf92": { + "funcname": "get_dmax_lut_points", + "funcaddr": "0x300cf92", + "LocalCost": 48, + "MaxCost": 96, + "called": [ + "300cfe8", + "300cff4", + "300d02a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300d04c": { + "funcname": "VL53L0X_calc_dmax", + "funcaddr": "0x300d04c", + "LocalCost": 256, + "MaxCost": 2400, + "called": [ + "0x3008ba8", + "300d1ac", + "0x300e92a", + "0x300cf92" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 25, + "ptrVarName": [] + }, + "0x300d1c8": { + "funcname": "VL53L0X_calc_sigma_estimate", + "funcaddr": "0x300d1c8", + "LocalCost": 208, + "MaxCost": 704, + "called": [ + "0x300cf32", + "0x300ceb4", + "0x300c2c4", + "300d6fa", + "300d6f6", + "0x300d704", + "0x300e920", + "300d54c" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + "0x300d704": { + "funcname": "VL53L0X_isqrt.trans.50", + "funcaddr": "0x300d704", + "LocalCost": 0, + "MaxCost": 96, + "called": [ + "0x300b580" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300d708": { + "funcname": "VL53L0X_get_pal_range_status", + "funcaddr": "0x300d708", + "LocalCost": 96, + "MaxCost": 2592, + "called": [ + "300d7b4", + "0x300db12", + "0x300d1c8", + "0x300d04c", + "0x300db0e", + "0x300e484", + "0x300e638", + "300d958", + "300da46", + "300da7c", + "300daa4", + "300dacc", + "300daf4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 26, + "ptrVarName": [] + }, + "0x300db0e": { + "funcname": "VL53L0X_GetLimitCheckValue.trans.48", + "funcaddr": "0x300db0e", + "LocalCost": 0, + "MaxCost": 1280, + "called": [ + "0x30095e6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300db12": { + "funcname": "VL53L0X_GetLimitCheckEnable.trans.41", + "funcaddr": "0x300db12", + "LocalCost": 0, + "MaxCost": 96, + "called": [ + "0x300949a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300db16": { + "funcname": "device_detect", + "funcaddr": "0x300db16", + "LocalCost": 48, + "MaxCost": 1344, + "called": [ + "0x300e638", + "0x300dc88", + "300db74", + "0x30084f6", + "300dbc6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 19, + "ptrVarName": [] + }, + "0x300dbd0": { + "funcname": "device_init", + "funcaddr": "0x300dbd0", + "LocalCost": 48, + "MaxCost": 3776, + "called": [ + "0x3008534", + "0x300887c", + "0x300a4d8", + "0x300982e", + "0x3008d6a", + "0x3008e2e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 32, + "ptrVarName": [] + }, + "0x300dc36": { + "funcname": "Vl53l0xInit", + "funcaddr": "0x300dc36", + "LocalCost": 16, + "MaxCost": 3808, + "called": [ + "0x300e00a", + "0x300db16", + "0x300dbd0", + "0x300dc88" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 33, + "ptrVarName": [] + }, + "0x300dc64": { + "funcname": "Vl53l0xStart", + "funcaddr": "0x300dc64", + "LocalCost": 16, + "MaxCost": 1504, + "called": [ + "0x3009ac2", + "0x300dc88" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 22, + "ptrVarName": [] + }, + "0x300dc88": { + "funcname": "DBG_UartPrintf.trans.33", + "funcaddr": "0x300dc88", + "LocalCost": 0, + "MaxCost": 736, + "called": [ + "0x3003af0" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 7, + "ptrVarName": [] + }, + "0x300dc8c": { + "funcname": "GetDistance", + "funcaddr": "0x300dc8c", + "LocalCost": 48, + "MaxCost": 2912, + "called": [ + "0x3009c8e", + "0x3009d2e", + "300dcc6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 28, + "ptrVarName": [] + }, + "0x300dcd0": { + "funcname": "vl53l0x_iic_start", + "funcaddr": "0x300dcd0", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x300e054", + "0x300e050" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300dd22": { + "funcname": "vl53l0x_iic_stop", + "funcaddr": "0x300dd22", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x300e054", + "0x300e050" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300dd80": { + "funcname": "vl53l0x_iic_wait_ack", + "funcaddr": "0x300dd80", + "LocalCost": 32, + "MaxCost": 864, + "called": [ + "0x300e006", + "0x300e054", + "0x300e050", + "300ddee", + "0x300dd22", + "300de14", + "0x30044b2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x300de1e": { + "funcname": "vl53l0x_iic_ack", + "funcaddr": "0x300de1e", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x300e054", + "0x300e050" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300de70": { + "funcname": "vl53l0x_iic_nack", + "funcaddr": "0x300de70", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x300e054", + "0x300e050" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300dec2": { + "funcname": "vl53l0x_iic_send_byte", + "funcaddr": "0x300dec2", + "LocalCost": 48, + "MaxCost": 864, + "called": [ + "0x300e054", + "300df4a", + "300defe", + "0x300e050" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300df5e": { + "funcname": "vl53l0x_iic_read_byte", + "funcaddr": "0x300df5e", + "LocalCost": 48, + "MaxCost": 896, + "called": [ + "0x300e006", + "300dfd8", + "0x300e054", + "0x300e050", + "0x30044b2", + "0x300de70", + "300dff8", + "0x300de1e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 13, + "ptrVarName": [] + }, + "0x300e006": { + "funcname": "HAL_GPIO_SetDirection.trans.31", + "funcaddr": "0x300e006", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30042dc" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x300e00a": { + "funcname": "vl53l0x_hw_reset", + "funcaddr": "0x300e00a", + "LocalCost": 16, + "MaxCost": 800, + "called": [ + "0x300e054", + "0x300e050" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 12, + "ptrVarName": [] + }, + "0x300e050": { + "funcname": "BASE_FUNC_Delay.trans.15", + "funcaddr": "0x300e050", + "LocalCost": 0, + "MaxCost": 768, + "called": [ + "0x30012e4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 11, + "ptrVarName": [] + }, + "0x300e054": { + "funcname": "HAL_GPIO_SetValue.trans.13", + "funcaddr": "0x300e054", + "LocalCost": 0, + "MaxCost": 192, + "called": [ + "0x30043c4" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 4, + "ptrVarName": [] + }, + "0x300e058": { + "funcname": "VL53L0X_write_multi", + "funcaddr": "0x300e058", + "LocalCost": 48, + "MaxCost": 960, + "called": [ + "0x300dcd0", + "0x300dec2", + "0x300dd80", + "0x300dd22", + "300e0f8", + "300e0e6" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 14, + "ptrVarName": [] + }, + "0x300e102": { + "funcname": "VL53L0X_read_multi", + "funcaddr": "0x300e102", + "LocalCost": 48, + "MaxCost": 992, + "called": [ + "0x300dcd0", + "0x300dec2", + "0x300dd80", + "0x300dd22", + "300e1c8", + "0x300df5e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 14, + "ptrVarName": [] + }, + "0x300e1d2": { + "funcname": "VL53L0X_write_byte", + "funcaddr": "0x300e1d2", + "LocalCost": 48, + "MaxCost": 1056, + "called": [ + "0x300e058" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e222": { + "funcname": "VL53L0X_write_word", + "funcaddr": "0x300e222", + "LocalCost": 48, + "MaxCost": 1056, + "called": [ + "0x300e058" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e282": { + "funcname": "VL53L0X_read_byte", + "funcaddr": "0x300e282", + "LocalCost": 48, + "MaxCost": 1088, + "called": [ + "0x300e102" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e2ce": { + "funcname": "VL53L0X_read_word", + "funcaddr": "0x300e2ce", + "LocalCost": 48, + "MaxCost": 1088, + "called": [ + "0x300e102" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e338": { + "funcname": "VL53L0X_read_dword", + "funcaddr": "0x300e338", + "LocalCost": 48, + "MaxCost": 1088, + "called": [ + "0x300e102" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e3a0": { + "funcname": "VL53L0X_WriteMulti", + "funcaddr": "0x300e3a0", + "LocalCost": 48, + "MaxCost": 1056, + "called": [ + "0x300e058" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e414": { + "funcname": "VL53L0X_ReadMulti", + "funcaddr": "0x300e414", + "LocalCost": 48, + "MaxCost": 1088, + "called": [ + "0x300e102" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 15, + "ptrVarName": [] + }, + "0x300e484": { + "funcname": "VL53L0X_WrByte", + "funcaddr": "0x300e484", + "LocalCost": 48, + "MaxCost": 1152, + "called": [ + "0x300e1d2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300e4e0": { + "funcname": "VL53L0X_WrWord", + "funcaddr": "0x300e4e0", + "LocalCost": 48, + "MaxCost": 1152, + "called": [ + "0x300e222" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300e53c": { + "funcname": "VL53L0X_UpdateByte", + "funcaddr": "0x300e53c", + "LocalCost": 48, + "MaxCost": 1184, + "called": [ + "0x300e282", + "0x300e1d2" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300e5e2": { + "funcname": "VL53L0X_RdByte", + "funcaddr": "0x300e5e2", + "LocalCost": 48, + "MaxCost": 1184, + "called": [ + "0x300e282" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300e638": { + "funcname": "VL53L0X_RdWord", + "funcaddr": "0x300e638", + "LocalCost": 48, + "MaxCost": 1184, + "called": [ + "0x300e2ce" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300e68e": { + "funcname": "VL53L0X_RdDWord", + "funcaddr": "0x300e68e", + "LocalCost": 48, + "MaxCost": 1184, + "called": [ + "0x300e338" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 16, + "ptrVarName": [] + }, + "0x300e6e4": { + "funcname": "VL53L0X_PollingDelay", + "funcaddr": "0x300e6e4", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300e6fe": { + "funcname": "__truncdfsf2", + "funcaddr": "0x300e6fe", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "300e890", + "300e888", + "300e80e", + "300e784", + "300e812", + "300e83e", + "300e8e0", + "300e8f4", + "300e91a", + "300e79e" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300e920": { + "funcname": "abs", + "funcaddr": "0x300e920", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300e92a": { + "funcname": "memcpy", + "funcaddr": "0x300e92a", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "300eb5c", + "300e92c", + "300eb1a", + "300e9de" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300ec8c": { + "funcname": "memset", + "funcaddr": "0x300ec8c", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "300ed2a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300ed4a": { + "funcname": "strcpy", + "funcaddr": "0x300ed4a", + "LocalCost": 16, + "MaxCost": 32, + "called": [ + "0x300ed8a" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + "0x300ed5e": { + "funcname": "strncmp", + "funcaddr": "0x300ed5e", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "300ed66" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300ed8a": { + "funcname": "__stpcpy", + "funcaddr": "0x300ed8a", + "LocalCost": 0, + "MaxCost": 0, + "called": [ + "300edc2", + "300ed92" + ], + "Location": "", + "IsCalled": 1, + "IsRec": 0, + "depth": 1, + "ptrVarName": [] + }, + "0x300ede4": { + "funcname": "__rodata_start", + "funcaddr": "0x300ede4", + "LocalCost": 0, + "MaxCost": 0, + "called": [], + "Location": "", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + "0x300ede8": { + "funcname": "g_crgIpMatch", + "funcaddr": "0x300ede8", + "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": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\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": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\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": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\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": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../chip/3061m/startup.S:381", + "IsRec": 0 + }, + { + "id": "0x3000604", + "pId": "", + "name": "pmp_init", + "Depth": 35, + "MaxCost": 3840, + "LocalCost": 0, + "Location": "", + "Loaction": "startup.S:647", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../chip/3061m/startup.S:647", + "IsRec": 0 + }, + { + "id": "0x3001c26", + "pId": "", + "name": "IRQ_DummyHandler", + "Depth": 0, + "MaxCost": 64, + "LocalCost": 32, + "Location": "", + "Loaction": "interrupt.c:528", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/base/src/interrupt.c:528", + "IsRec": 0 + }, + { + "id": "0x30029d4", + "pId": "", + "name": "CRG_IpWoClkSelEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:844", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:844", + "IsRec": 0 + }, + { + "id": "0x3002b5a", + "pId": "", + "name": "CRG_IpWoClkSelEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:868", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:868", + "IsRec": 0 + }, + { + "id": "0x3002bda", + "pId": "", + "name": "CRG_IpWoClkSelResetSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:888", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:888", + "IsRec": 0 + }, + { + "id": "0x3002cdc", + "pId": "", + "name": "CRG_IpWoClkSelResetGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:910", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:910", + "IsRec": 0 + }, + { + "id": "0x3002d5e", + "pId": "", + "name": "CRG_AdcEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:929", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:929", + "IsRec": 0 + }, + { + "id": "0x3002e10", + "pId": "", + "name": "CRG_AdcEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:953", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:953", + "IsRec": 0 + }, + { + "id": "0x3002e86", + "pId": "", + "name": "CRG_AdcClkSelectSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:971", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:971", + "IsRec": 0 + }, + { + "id": "0x3002f74", + "pId": "", + "name": "CRG_AdcClkSelectGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:995", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:995", + "IsRec": 0 + }, + { + "id": "0x3002ff6", + "pId": "", + "name": "CRG_AdcDivSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1014", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:1014", + "IsRec": 0 + }, + { + "id": "0x30030c6", + "pId": "", + "name": "CRG_AdcDivGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1035", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:1035", + "IsRec": 0 + }, + { + "id": "0x3003154", + "pId": "", + "name": "CRG_EfcEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1056", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:1056", + "IsRec": 0 + }, + { + "id": "0x30031cc", + "pId": "", + "name": "CRG_EfcEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1071", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:1071", + "IsRec": 0 + }, + { + "id": "0x3003232", + "pId": "", + "name": "CRG_AnaEnableSet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1087", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:1087", + "IsRec": 0 + }, + { + "id": "0x3003396", + "pId": "", + "name": "CRG_AnaEnableGet", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "crg.c:1121", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/crg/src/crg.c:1121", + "IsRec": 0 + }, + { + "id": "0x30049c4", + "pId": "", + "name": "HAL_GPIO_IrqHandler", + "Depth": 3, + "MaxCost": 256, + "LocalCost": 48, + "Location": "", + "Loaction": "gpio.c:293", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/gpio/src/gpio.c:293", + "IsRec": 0 + }, + { + "id": "0x300608c", + "pId": "", + "name": "HAL_TIMER_IrqHandler", + "Depth": 2, + "MaxCost": 160, + "LocalCost": 48, + "Location": "", + "Loaction": "timer.c:215", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/timer/src/timer.c:215", + "IsRec": 0 + }, + { + "id": "0x3006c9e", + "pId": "", + "name": "HAL_UART_IrqHandler", + "Depth": 3, + "MaxCost": 256, + "LocalCost": 48, + "Location": "", + "Loaction": "uart.c:731", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../drivers/uart/src/uart.c:731", + "IsRec": 0 + }, + { + "id": "0x3006f0e", + "pId": "", + "name": "UART0ReadInterruptCallback", + "Depth": 0, + "MaxCost": 64, + "LocalCost": 32, + "Location": "", + "Loaction": "main.c:80", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../user/main.c:80", + "IsRec": 0 + }, + { + "id": "0x3006f30", + "pId": "", + "name": "TIMER0_InterruptProcess", + "Depth": 0, + "MaxCost": 64, + "LocalCost": 32, + "Location": "", + "Loaction": "main.c:89", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../user/main.c:89", + "IsRec": 0 + }, + { + "id": "0x3006fa0", + "pId": "", + "name": "GPIO1_1_CallbackFunc", + "Depth": 0, + "MaxCost": 96, + "LocalCost": 48, + "Location": "", + "Loaction": "main.c:108", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../user/main.c:108", + "IsRec": 0 + }, + { + "id": "0x3006fc6", + "pId": "", + "name": "GPIO1_4_CallbackFunc", + "Depth": 0, + "MaxCost": 96, + "LocalCost": 48, + "Location": "", + "Loaction": "main.c:119", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../user/main.c:119", + "IsRec": 0 + }, + { + "id": "0x30078d2", + "pId": "", + "name": "UART0WriteInterruptCallback", + "Depth": 0, + "MaxCost": 64, + "LocalCost": 32, + "Location": "", + "Loaction": "system_init.c:223", + "FilePath": "h:\\git\\open_intellect\\code\\op_inte\\open_inte\\out/../user/generatecode/system_init.c:223", + "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": [ + "0x30015d0" + ], + "Location": "startup.S:329", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "TrapEntry", + "funcaddr": "0x3000262", + "LocalCost": 112, + "MaxCost": 352, + "called": [ + "0x30015b2" + ], + "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": [ + "0x3001356" + ], + "Location": "startup.S:381", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "pmp_init", + "funcaddr": "0x3000604", + "LocalCost": 0, + "MaxCost": 3840, + "called": [ + "0x30006f8", + "0x300709a" + ], + "Location": "startup.S:647", + "IsCalled": 0, + "IsRec": 0, + "depth": 35, + "ptrVarName": [] + }, + { + "funcname": "IRQ_DummyHandler", + "funcaddr": "0x3001c26", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "interrupt.c:528", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelEnableSet", + "funcaddr": "0x30029d4", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30029f8", + "3002a0e", + "3002b46" + ], + "Location": "crg.c:844", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelEnableGet", + "funcaddr": "0x3002b5a", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002b7a", + "3002b90" + ], + "Location": "crg.c:868", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelResetSet", + "funcaddr": "0x3002bda", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002bfe", + "3002c14", + "3002cc8" + ], + "Location": "crg.c:888", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_IpWoClkSelResetGet", + "funcaddr": "0x3002cdc", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002cfc", + "3002d12" + ], + "Location": "crg.c:910", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcEnableSet", + "funcaddr": "0x3002d5e", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002d82", + "3002d98", + "3002df8" + ], + "Location": "crg.c:929", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcEnableGet", + "funcaddr": "0x3002e10", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002e30", + "3002e46", + "3002e74" + ], + "Location": "crg.c:953", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcClkSelectSet", + "funcaddr": "0x3002e86", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002eaa", + "3002ec0", + "3002edc", + "0x3001f5a", + "3002f6c", + "0x3001c76", + "0x3001c9e" + ], + "Location": "crg.c:971", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcClkSelectGet", + "funcaddr": "0x3002f74", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3002f94", + "3002faa", + "3002fec" + ], + "Location": "crg.c:995", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcDivSet", + "funcaddr": "0x3002ff6", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "300301a", + "3003030", + "0x3001f9a", + "30030be" + ], + "Location": "crg.c:1014", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AdcDivGet", + "funcaddr": "0x30030c6", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30030e6", + "30030fc", + "300314a" + ], + "Location": "crg.c:1035", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_EfcEnableSet", + "funcaddr": "0x3003154", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3003178", + "300318e" + ], + "Location": "crg.c:1056", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_EfcEnableGet", + "funcaddr": "0x30031cc", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30031ec", + "3003202" + ], + "Location": "crg.c:1071", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AnaEnableSet", + "funcaddr": "0x3003232", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "3003256", + "300326c", + "300338e", + "3003320" + ], + "Location": "crg.c:1087", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "CRG_AnaEnableGet", + "funcaddr": "0x3003396", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3002e0c", + "30033b6", + "30033cc" + ], + "Location": "crg.c:1121", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "HAL_GPIO_IrqHandler", + "funcaddr": "0x30049c4", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x30044ae", + "30049ec", + "3004a50", + "0x300417c", + "3004ab6", + "0x3003f7c", + "0x30048bc" + ], + "Location": "gpio.c:293", + "IsCalled": 0, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + { + "funcname": "HAL_TIMER_IrqHandler", + "funcaddr": "0x300608c", + "LocalCost": 48, + "MaxCost": 160, + "called": [ + "0x3006006", + "30060ac", + "30060fc" + ], + "Location": "timer.c:215", + "IsCalled": 0, + "IsRec": 0, + "depth": 2, + "ptrVarName": [] + }, + { + "funcname": "HAL_UART_IrqHandler", + "funcaddr": "0x3006c9e", + "LocalCost": 48, + "MaxCost": 256, + "called": [ + "0x3006f0a", + "3006cbe", + "3006d0e", + "0x30068a0", + "0x30069f2", + "0x3006400", + "0x3006324", + "0x3006b54" + ], + "Location": "uart.c:731", + "IsCalled": 0, + "IsRec": 0, + "depth": 3, + "ptrVarName": [] + }, + { + "funcname": "UART0ReadInterruptCallback", + "funcaddr": "0x3006f0e", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "main.c:80", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + { + "funcname": "TIMER0_InterruptProcess", + "funcaddr": "0x3006f30", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "main.c:89", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + { + "funcname": "GPIO1_1_CallbackFunc", + "funcaddr": "0x3006fa0", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "main.c:108", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + { + "funcname": "GPIO1_4_CallbackFunc", + "funcaddr": "0x3006fc6", + "LocalCost": 48, + "MaxCost": 96, + "called": [], + "Location": "main.c:119", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + }, + { + "funcname": "UART0WriteInterruptCallback", + "funcaddr": "0x30078d2", + "LocalCost": 32, + "MaxCost": 64, + "called": [], + "Location": "system_init.c:223", + "IsCalled": 0, + "IsRec": 0, + "depth": 0, + "ptrVarName": [] + } + ] +} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/memoryDetails.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/memoryDetails.json" new file mode 100644 index 00000000..59d1325e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/analyzerJson/memoryDetails.json" @@ -0,0 +1,46340 @@ +{ + "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": "3112 B", + "usage": "15.23%", + "free": "17320 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": "64160 B", + "usage": "48.95%", + "free": "66908 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": "64160 B", + "usage": "48.95%", + "free": "66908 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": "1772 B", + "sizeOri": "0x000006ec" + }, + { + "name": ".text", + "id": ".text", + "level": 1, + "IPARENTID": null, + "open": false, + "sort": 0, + "children": [ + { + "name": "Chip_InitFail", + "runAddr": "0x030006f0", + "loadAddr": "0x30006f0", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "Chip_InitFail", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CalculateGain", + "runAddr": "0x03000738", + "loadAddr": "0x3000738", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "CalculateGain", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CHIP_GetInfo", + "runAddr": "0x03000762", + "loadAddr": "0x3000762", + "size": "74 B", + "sizeOri": "0x0000004a", + "location": "", + "type": "F", + "level": 2, + "id": "CHIP_GetInfo", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CHIP_AnalogTrim", + "runAddr": "0x030007ac", + "loadAddr": "0x30007ac", + "size": "1292 B", + "sizeOri": "0x0000050c", + "location": "", + "type": "F", + "level": 2, + "id": "CHIP_AnalogTrim", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SetFlashDiv", + "runAddr": "0x03000dae", + "loadAddr": "0x3000dae", + "size": "146 B", + "sizeOri": "0x00000092", + "location": "", + "type": "F", + "level": 2, + "id": "SetFlashDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetFlashFreq", + "runAddr": "0x03000e40", + "loadAddr": "0x3000e40", + "size": "100 B", + "sizeOri": "0x00000064", + "location": "", + "type": "F", + "level": 2, + "id": "GetFlashFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FOTP_CheckReadStatus", + "runAddr": "0x03000fa6", + "loadAddr": "0x3000fa6", + "size": "132 B", + "sizeOri": "0x00000084", + "location": "", + "type": "F", + "level": 2, + "id": "FOTP_CheckReadStatus", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "g_crgIpMatch", + "runAddr": "0x0300ede8", + "loadAddr": "0x300ede8", + "size": "552 B", + "sizeOri": "0x00000228", + "location": "", + "type": "O", + "level": 2, + "id": "g_crgIpMatch", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_SYSTICK_GetTick", + "runAddr": "0x03001206", + "loadAddr": "0x3001206", + "size": "20 B", + "sizeOri": "0x00000014", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_SYSTICK_GetTick", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_ClearN", + "runAddr": "0x03001336", + "loadAddr": "0x3001336", + "size": "32 B", + "sizeOri": "0x00000020", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_ClearN", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_DummyHandler", + "runAddr": "0x03001c26", + "loadAddr": "0x3001c26", + "size": "18 B", + "sizeOri": "0x00000012", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_DummyHandler", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetCallBack", + "runAddr": "0x03001c38", + "loadAddr": "0x3001c38", + "size": "62 B", + "sizeOri": "0x0000003e", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrFinish", + "runAddr": "0x030015a4", + "loadAddr": "0x30015a4", + "size": "14 B", + "sizeOri": "0x0000000e", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrFinish", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SetLocalIntNumPri", + "runAddr": "0x03001604", + "loadAddr": "0x3001604", + "size": "714 B", + "sizeOri": "0x000002ca", + "location": "", + "type": "F", + "level": 2, + "id": "SetLocalIntNumPri", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetLocalPriority", + "runAddr": "0x030018ce", + "loadAddr": "0x30018ce", + "size": "740 B", + "sizeOri": "0x000002e4", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetLocalPriority", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "runAddr": "0x03001c76", + "loadAddr": "0x3001c76", + "size": "40 B", + "sizeOri": "0x00000028", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "runAddr": "0x03001c9e", + "loadAddr": "0x3001c9e", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllRefClkSelect", + "runAddr": "0x03001cc8", + "loadAddr": "0x3001cc8", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllRefClkSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllPreDiv", + "runAddr": "0x03001cf4", + "loadAddr": "0x3001cf4", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllPreDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllPostDiv", + "runAddr": "0x03001d10", + "loadAddr": "0x3001d10", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllPostDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllPostDiv2", + "runAddr": "0x03001d2c", + "loadAddr": "0x3001d2c", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllPostDiv2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgPllFbDiv", + "runAddr": "0x03001d48", + "loadAddr": "0x3001d48", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgPllFbDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgCoreCkSel", + "runAddr": "0x03001d64", + "loadAddr": "0x3001d64", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgCoreCkSel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrg1MCkSel", + "runAddr": "0x03001d9a", + "loadAddr": "0x3001d9a", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrg1MCkSel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrg1MCkDiv", + "runAddr": "0x03001dc6", + "loadAddr": "0x3001dc6", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrg1MCkDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidPreDiv", + "runAddr": "0x03001de2", + "loadAddr": "0x3001de2", + "size": "94 B", + "sizeOri": "0x0000005e", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidPreDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidFdDiv", + "runAddr": "0x03001e40", + "loadAddr": "0x3001e40", + "size": "138 B", + "sizeOri": "0x0000008a", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidFdDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidPostDiv", + "runAddr": "0x03001eca", + "loadAddr": "0x3001eca", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidPostDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgValidPostDiv2", + "runAddr": "0x03001f12", + "loadAddr": "0x3001f12", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgValidPostDiv2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgAdcClkModeSelect", + "runAddr": "0x03001f5a", + "loadAddr": "0x3001f5a", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgAdcClkModeSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsCrgAdcClkDiv", + "runAddr": "0x03001f9a", + "loadAddr": "0x3001f9a", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "IsCrgAdcClkDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_CRG_SetCoreClkSel", + "runAddr": "0x03001fda", + "loadAddr": "0x3001fda", + "size": "112 B", + "sizeOri": "0x00000070", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_CRG_SetCoreClkSel", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelResetSet", + "runAddr": "0x03002bda", + "loadAddr": "0x3002bda", + "size": "258 B", + "sizeOri": "0x00000102", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelResetSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelEnableSet", + "runAddr": "0x030029d4", + "loadAddr": "0x30029d4", + "size": "390 B", + "sizeOri": "0x00000186", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelResetGet", + "runAddr": "0x03002cdc", + "loadAddr": "0x3002cdc", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelResetGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IpWoClkSelEnableGet", + "runAddr": "0x03002b5a", + "loadAddr": "0x3002b5a", + "size": "128 B", + "sizeOri": "0x00000080", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IpWoClkSelEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcEnableSet", + "runAddr": "0x03002d5e", + "loadAddr": "0x3002d5e", + "size": "174 B", + "sizeOri": "0x000000ae", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcClkSelectSet", + "runAddr": "0x03002e86", + "loadAddr": "0x3002e86", + "size": "238 B", + "sizeOri": "0x000000ee", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcClkSelectSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcDivSet", + "runAddr": "0x03002ff6", + "loadAddr": "0x3002ff6", + "size": "208 B", + "sizeOri": "0x000000d0", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcDivSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcEnableGet", + "runAddr": "0x03002e10", + "loadAddr": "0x3002e10", + "size": "118 B", + "sizeOri": "0x00000076", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcClkSelectGet", + "runAddr": "0x03002f74", + "loadAddr": "0x3002f74", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcClkSelectGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AdcDivGet", + "runAddr": "0x030030c6", + "loadAddr": "0x30030c6", + "size": "142 B", + "sizeOri": "0x0000008e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AdcDivGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_EfcEnableSet", + "runAddr": "0x03003154", + "loadAddr": "0x3003154", + "size": "120 B", + "sizeOri": "0x00000078", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_EfcEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_EfcEnableGet", + "runAddr": "0x030031cc", + "loadAddr": "0x30031cc", + "size": "102 B", + "sizeOri": "0x00000066", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_EfcEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AnaEnableSet", + "runAddr": "0x03003232", + "loadAddr": "0x3003232", + "size": "356 B", + "sizeOri": "0x00000164", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AnaEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_AnaEnableGet", + "runAddr": "0x03003396", + "loadAddr": "0x3003396", + "size": "118 B", + "sizeOri": "0x00000076", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_AnaEnableGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IsValidPllConfig", + "runAddr": "0x030027ec", + "loadAddr": "0x30027ec", + "size": "194 B", + "sizeOri": "0x000000c2", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IsValidPllConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_IsValid1MHzConfig", + "runAddr": "0x030028ae", + "loadAddr": "0x30028ae", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_IsValid1MHzConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetVcoFreq", + "runAddr": "0x0300239c", + "loadAddr": "0x300239c", + "size": "144 B", + "sizeOri": "0x00000090", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetVcoFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPllRefIni", + "runAddr": "0x03002900", + "loadAddr": "0x3002900", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPllRefIni", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPreDivValue", + "runAddr": "0x0300292a", + "loadAddr": "0x300292a", + "size": "46 B", + "sizeOri": "0x0000002e", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPreDivValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPllFbDivValue", + "runAddr": "0x03002958", + "loadAddr": "0x3002958", + "size": "66 B", + "sizeOri": "0x00000042", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPllFbDivValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetPllPostDivValue", + "runAddr": "0x0300299a", + "loadAddr": "0x300299a", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetPllPostDivValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_GetAdcIpFreq", + "runAddr": "0x030026d2", + "loadAddr": "0x30026d2", + "size": "282 B", + "sizeOri": "0x0000011a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_GetAdcIpFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintCh", + "runAddr": "0x0300340c", + "loadAddr": "0x300340c", + "size": "66 B", + "sizeOri": "0x00000042", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintCh", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintStr", + "runAddr": "0x0300344e", + "loadAddr": "0x300344e", + "size": "74 B", + "sizeOri": "0x0000004a", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintStr", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_Pow", + "runAddr": "0x03003498", + "loadAddr": "0x3003498", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_Pow", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_CountDigits", + "runAddr": "0x030034d8", + "loadAddr": "0x30034d8", + "size": "104 B", + "sizeOri": "0x00000068", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_CountDigits", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PutUnsignedNum", + "runAddr": "0x03003540", + "loadAddr": "0x3003540", + "size": "178 B", + "sizeOri": "0x000000b2", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PutUnsignedNum", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintInt", + "runAddr": "0x030035f2", + "loadAddr": "0x30035f2", + "size": "94 B", + "sizeOri": "0x0000005e", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintInt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintHex", + "runAddr": "0x03003650", + "loadAddr": "0x3003650", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintHex", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintFlt", + "runAddr": "0x03003694", + "loadAddr": "0x3003694", + "size": "316 B", + "sizeOri": "0x0000013c", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintFlt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ParseSpecifier", + "runAddr": "0x030037d0", + "loadAddr": "0x30037d0", + "size": "412 B", + "sizeOri": "0x0000019c", + "location": "", + "type": "F", + "level": 2, + "id": "ParseSpecifier", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_PrintIntWithField", + "runAddr": "0x0300396c", + "loadAddr": "0x300396c", + "size": "282 B", + "sizeOri": "0x0000011a", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_PrintIntWithField", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_Atoi", + "runAddr": "0x03003a86", + "loadAddr": "0x3003a86", + "size": "106 B", + "sizeOri": "0x0000006a", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_Atoi", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGpioValue", + "runAddr": "0x03003c58", + "loadAddr": "0x3003c58", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsGpioValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGpioDirection", + "runAddr": "0x03003c84", + "loadAddr": "0x3003c84", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsGpioDirection", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGpioPins", + "runAddr": "0x03003cb0", + "loadAddr": "0x3003cb0", + "size": "48 B", + "sizeOri": "0x00000030", + "location": "", + "type": "F", + "level": 2, + "id": "IsGpioPins", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGpioPin", + "runAddr": "0x03003ce0", + "loadAddr": "0x3003ce0", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "IsGpioPin", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGpioITMode", + "runAddr": "0x03003d5e", + "loadAddr": "0x3003d5e", + "size": "84 B", + "sizeOri": "0x00000054", + "location": "", + "type": "F", + "level": 2, + "id": "IsGpioITMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_GPIO_SetValue", + "runAddr": "0x03003db2", + "loadAddr": "0x3003db2", + "size": "212 B", + "sizeOri": "0x000000d4", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_GPIO_SetValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_GPIO_SetDirection", + "runAddr": "0x03003e86", + "loadAddr": "0x3003e86", + "size": "246 B", + "sizeOri": "0x000000f6", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_GPIO_SetDirection", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_GPIO_ClearIrq", + "runAddr": "0x03003f7c", + "loadAddr": "0x3003f7c", + "size": "166 B", + "sizeOri": "0x000000a6", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_GPIO_ClearIrq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_GPIO_EnableIrq", + "runAddr": "0x03004022", + "loadAddr": "0x3004022", + "size": "176 B", + "sizeOri": "0x000000b0", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_GPIO_EnableIrq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_GPIO_DisableIrq", + "runAddr": "0x030040d2", + "loadAddr": "0x30040d2", + "size": "170 B", + "sizeOri": "0x000000aa", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_GPIO_DisableIrq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_GPIO_GetMIS", + "runAddr": "0x0300417c", + "loadAddr": "0x300417c", + "size": "122 B", + "sizeOri": "0x0000007a", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_GPIO_GetMIS", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPIO_SetLevelIrqType", + "runAddr": "0x0300457e", + "loadAddr": "0x300457e", + "size": "150 B", + "sizeOri": "0x00000096", + "location": "", + "type": "F", + "level": 2, + "id": "GPIO_SetLevelIrqType", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPIO_SetEdgeIrqType", + "runAddr": "0x03004614", + "loadAddr": "0x3004614", + "size": "154 B", + "sizeOri": "0x0000009a", + "location": "", + "type": "F", + "level": 2, + "id": "GPIO_SetEdgeIrqType", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPIO_ExcuteCallBack", + "runAddr": "0x030048bc", + "loadAddr": "0x30048bc", + "size": "264 B", + "sizeOri": "0x00000108", + "location": "", + "type": "F", + "level": 2, + "id": "GPIO_ExcuteCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGptPwmNum", + "runAddr": "0x03004bc8", + "loadAddr": "0x3004bc8", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsGptPwmNum", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGptDiv", + "runAddr": "0x03004be4", + "loadAddr": "0x3004be4", + "size": "30 B", + "sizeOri": "0x0000001e", + "location": "", + "type": "F", + "level": 2, + "id": "IsGptDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGptPeriod", + "runAddr": "0x03004c02", + "loadAddr": "0x3004c02", + "size": "48 B", + "sizeOri": "0x00000030", + "location": "", + "type": "F", + "level": 2, + "id": "IsGptPeriod", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGptRefDot", + "runAddr": "0x03004c32", + "loadAddr": "0x3004c32", + "size": "30 B", + "sizeOri": "0x0000001e", + "location": "", + "type": "F", + "level": 2, + "id": "IsGptRefDot", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsGptAction", + "runAddr": "0x03004c50", + "loadAddr": "0x3004c50", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsGptAction", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cFunctionMode", + "runAddr": "0x030051fe", + "loadAddr": "0x30051fe", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cFunctionMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cAddressMode", + "runAddr": "0x0300523e", + "loadAddr": "0x300523e", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cAddressMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cSdaHoldTime", + "runAddr": "0x0300526a", + "loadAddr": "0x300526a", + "size": "30 B", + "sizeOri": "0x0000001e", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cSdaHoldTime", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cGeneralCallMode", + "runAddr": "0x03005288", + "loadAddr": "0x3005288", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cGeneralCallMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cOwnAddressOrMask", + "runAddr": "0x030052b4", + "loadAddr": "0x30052b4", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cOwnAddressOrMask", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsXMBusAddressOrMask", + "runAddr": "0x030052d0", + "loadAddr": "0x30052d0", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsXMBusAddressOrMask", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsXMBusAddressEnable", + "runAddr": "0x030052ec", + "loadAddr": "0x30052ec", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsXMBusAddressEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cSpikeFilterTime", + "runAddr": "0x03005318", + "loadAddr": "0x3005318", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cSpikeFilterTime", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cFreq", + "runAddr": "0x03005334", + "loadAddr": "0x3005334", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cIgnoreAckFlag", + "runAddr": "0x03005350", + "loadAddr": "0x3005350", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cIgnoreAckFlag", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cTxWaterMark", + "runAddr": "0x0300537c", + "loadAddr": "0x300537c", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cTxWaterMark", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cRxWaterMark", + "runAddr": "0x03005398", + "loadAddr": "0x3005398", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cRxWaterMark", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsI2cSdaDelayTime", + "runAddr": "0x030053b4", + "loadAddr": "0x30053b4", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsI2cSdaDelayTime", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CheckAllInitParameters", + "runAddr": "0x030053d0", + "loadAddr": "0x30053d0", + "size": "588 B", + "sizeOri": "0x0000024c", + "location": "", + "type": "F", + "level": 2, + "id": "CheckAllInitParameters", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetRegValue", + "runAddr": "0x030058fe", + "loadAddr": "0x30058fe", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetRegValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetDriveRate", + "runAddr": "0x03005942", + "loadAddr": "0x3005942", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetDriveRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetPullMode", + "runAddr": "0x030059b0", + "loadAddr": "0x30059b0", + "size": "140 B", + "sizeOri": "0x0000008c", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetPullMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetLevelShiftRate", + "runAddr": "0x03005a3c", + "loadAddr": "0x3005a3c", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetLevelShiftRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DCL_IOCMG_SetSchmidtMode", + "runAddr": "0x03005aaa", + "loadAddr": "0x3005aaa", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "DCL_IOCMG_SetSchmidtMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IOCMG_GetRegAddr", + "runAddr": "0x03005b18", + "loadAddr": "0x3005b18", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "IOCMG_GetRegAddr", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerMode", + "runAddr": "0x03005cd4", + "loadAddr": "0x3005cd4", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerInterruptType", + "runAddr": "0x03005d0a", + "loadAddr": "0x3005d0a", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerInterruptType", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerSize", + "runAddr": "0x03005d36", + "loadAddr": "0x3005d36", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerSize", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerPeriod", + "runAddr": "0x03005d62", + "loadAddr": "0x3005d62", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerPeriod", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsTimerDiv", + "runAddr": "0x03005d7e", + "loadAddr": "0x3005d7e", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "IsTimerDiv", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartDatalength", + "runAddr": "0x03006208", + "loadAddr": "0x3006208", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartDatalength", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartStopbits", + "runAddr": "0x03006224", + "loadAddr": "0x3006224", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartStopbits", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartParitymode", + "runAddr": "0x03006250", + "loadAddr": "0x3006250", + "size": "34 B", + "sizeOri": "0x00000022", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartParitymode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartTransmode", + "runAddr": "0x03006272", + "loadAddr": "0x3006272", + "size": "60 B", + "sizeOri": "0x0000003c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartTransmode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartFIFOThreshold", + "runAddr": "0x030062ae", + "loadAddr": "0x30062ae", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartFIFOThreshold", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IsUartOversampleMultiple", + "runAddr": "0x030062ca", + "loadAddr": "0x30062ca", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "IsUartOversampleMultiple", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DivClosest", + "runAddr": "0x030062e6", + "loadAddr": "0x30062e6", + "size": "62 B", + "sizeOri": "0x0000003e", + "location": "", + "type": "F", + "level": 2, + "id": "DivClosest", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BaudDetectCallBack", + "runAddr": "0x03006324", + "loadAddr": "0x3006324", + "size": "220 B", + "sizeOri": "0x000000dc", + "location": "", + "type": "F", + "level": 2, + "id": "BaudDetectCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CharterMatchCallBack", + "runAddr": "0x03006400", + "loadAddr": "0x3006400", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "CharterMatchCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART_SetParityBit", + "runAddr": "0x0300644c", + "loadAddr": "0x300644c", + "size": "150 B", + "sizeOri": "0x00000096", + "location": "", + "type": "F", + "level": 2, + "id": "UART_SetParityBit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "WriteITCallBack", + "runAddr": "0x030068a0", + "loadAddr": "0x30068a0", + "size": "338 B", + "sizeOri": "0x00000152", + "location": "", + "type": "F", + "level": 2, + "id": "WriteITCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ReadITCallBack", + "runAddr": "0x030069f2", + "loadAddr": "0x30069f2", + "size": "354 B", + "sizeOri": "0x00000162", + "location": "", + "type": "F", + "level": 2, + "id": "ReadITCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ErrorServiceCallback", + "runAddr": "0x03006b54", + "loadAddr": "0x3006b54", + "size": "330 B", + "sizeOri": "0x0000014a", + "location": "", + "type": "F", + "level": 2, + "id": "ErrorServiceCallback", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART0_InterruptTxInit", + "runAddr": "0x03006fec", + "loadAddr": "0x3006fec", + "size": "94 B", + "sizeOri": "0x0000005e", + "location": "", + "type": "F", + "level": 2, + "id": "UART0_InterruptTxInit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetNumFromStr", + "runAddr": "0x0300704a", + "loadAddr": "0x300704a", + "size": "80 B", + "sizeOri": "0x00000050", + "location": "", + "type": "F", + "level": 2, + "id": "GetNumFromStr", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPIO_Init", + "runAddr": "0x0300741a", + "loadAddr": "0x300741a", + "size": "536 B", + "sizeOri": "0x00000218", + "location": "", + "type": "F", + "level": 2, + "id": "GPIO_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPT1_Init", + "runAddr": "0x03007642", + "loadAddr": "0x3007642", + "size": "146 B", + "sizeOri": "0x00000092", + "location": "", + "type": "F", + "level": 2, + "id": "GPT1_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPT2_Init", + "runAddr": "0x030076d4", + "loadAddr": "0x30076d4", + "size": "146 B", + "sizeOri": "0x00000092", + "location": "", + "type": "F", + "level": 2, + "id": "GPT2_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPT3_Init", + "runAddr": "0x03007766", + "loadAddr": "0x3007766", + "size": "152 B", + "sizeOri": "0x00000098", + "location": "", + "type": "F", + "level": 2, + "id": "GPT3_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "TIMER0_Init", + "runAddr": "0x03007802", + "loadAddr": "0x3007802", + "size": "204 B", + "sizeOri": "0x000000cc", + "location": "", + "type": "F", + "level": 2, + "id": "TIMER0_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART0_Init", + "runAddr": "0x030078e4", + "loadAddr": "0x30078e4", + "size": "208 B", + "sizeOri": "0x000000d0", + "location": "", + "type": "F", + "level": 2, + "id": "UART0_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "I2C0_Init", + "runAddr": "0x030079c0", + "loadAddr": "0x30079c0", + "size": "134 B", + "sizeOri": "0x00000086", + "location": "", + "type": "F", + "level": 2, + "id": "I2C0_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IOConfig", + "runAddr": "0x03007a46", + "loadAddr": "0x3007a46", + "size": "1084 B", + "sizeOri": "0x0000043c", + "location": "", + "type": "F", + "level": 2, + "id": "IOConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "device_detect", + "runAddr": "0x0300db16", + "loadAddr": "0x300db16", + "size": "186 B", + "sizeOri": "0x000000ba", + "location": "", + "type": "F", + "level": 2, + "id": "device_detect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "device_init", + "runAddr": "0x0300dbd0", + "loadAddr": "0x300dbd0", + "size": "102 B", + "sizeOri": "0x00000066", + "location": "", + "type": "F", + "level": 2, + "id": "device_init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "stpcpy", + "runAddr": "0x0300ed8a", + "loadAddr": "0x300ed8a", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "stpcpy", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetDirection.trans.31", + "runAddr": "0x0300e006", + "loadAddr": "0x300e006", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetDirection.trans.31", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "strcpy", + "runAddr": "0x0300ed4a", + "loadAddr": "0x300ed4a", + "size": "20 B", + "sizeOri": "0x00000014", + "location": "", + "type": "F", + "level": 2, + "id": "strcpy", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_perform_single_ref_calibration", + "runAddr": "0x0300b062", + "loadAddr": "0x300b062", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_perform_single_ref_calibration", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_Delay.trans.15", + "runAddr": "0x0300e050", + "loadAddr": "0x300e050", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_Delay.trans.15", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdDWord", + "runAddr": "0x0300e68e", + "loadAddr": "0x300e68e", + "size": "86 B", + "sizeOri": "0x00000056", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdDWord", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinAltFuncMode", + "runAddr": "0x03005b6a", + "loadAddr": "0x3005b6a", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinAltFuncMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdByte.trans.16", + "runAddr": "0x030091fc", + "loadAddr": "0x30091fc", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdByte.trans.16", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetGpioConfig", + "runAddr": "0x0300a096", + "loadAddr": "0x300a096", + "size": "718 B", + "sizeOri": "0x000002ce", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetGpioConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CarWorkStatus", + "runAddr": "0x0300829e", + "loadAddr": "0x300829e", + "size": "110 B", + "sizeOri": "0x0000006e", + "location": "", + "type": "F", + "level": 2, + "id": "CarWorkStatus", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CarWorkStatus.trans.51", + "runAddr": "0x030073a4", + "loadAddr": "0x30073a4", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "CarWorkStatus.trans.51", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_Register.trans.52", + "runAddr": "0x030079bc", + "loadAddr": "0x30079bc", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_Register.trans.52", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_UartPrintf.trans.33", + "runAddr": "0x0300dc88", + "loadAddr": "0x300dc88", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_UartPrintf.trans.33", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrWord.trans.42", + "runAddr": "0x030095e2", + "loadAddr": "0x30095e2", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrWord.trans.42", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FLASH_ClockConfig", + "runAddr": "0x03000ea4", + "loadAddr": "0x3000ea4", + "size": "196 B", + "sizeOri": "0x000000c4", + "location": "", + "type": "F", + "level": 2, + "id": "FLASH_ClockConfig", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_Start", + "runAddr": "0x0300600a", + "loadAddr": "0x300600a", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_Start", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_Init.trans.55", + "runAddr": "0x030077fe", + "loadAddr": "0x30077fe", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_Init.trans.55", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinSchmidtMode.trans.22", + "runAddr": "0x03007e8a", + "loadAddr": "0x3007e8a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinSchmidtMode.trans.22", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_total_xtalk_rate", + "runAddr": "0x0300ceb4", + "loadAddr": "0x300ceb4", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_total_xtalk_rate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_read_multi", + "runAddr": "0x0300e102", + "loadAddr": "0x300e102", + "size": "208 B", + "sizeOri": "0x000000d0", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_read_multi", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "strncmp.trans.28", + "runAddr": "0x030073ac", + "loadAddr": "0x30073ac", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "strncmp.trans.28", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetValue", + "runAddr": "0x030043c4", + "loadAddr": "0x30043c4", + "size": "234 B", + "sizeOri": "0x000000ea", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_StaticInit", + "runAddr": "0x0300887c", + "loadAddr": "0x300887c", + "size": "808 B", + "sizeOri": "0x00000328", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_StaticInit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_Config", + "runAddr": "0x03004e14", + "loadAddr": "0x3004e14", + "size": "780 B", + "sizeOri": "0x0000030c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_Config", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_CheckAndLoadInterruptSettings", + "runAddr": "0x0300986c", + "loadAddr": "0x300986c", + "size": "590 B", + "sizeOri": "0x0000024e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_CheckAndLoadInterruptSettings", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetFractionEnable", + "runAddr": "0x03008de2", + "loadAddr": "0x3008de2", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetFractionEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_decode_timeout", + "runAddr": "0x0300c28e", + "loadAddr": "0x300c28e", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_decode_timeout", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_Init", + "runAddr": "0x03001392", + "loadAddr": "0x3001392", + "size": "80 B", + "sizeOri": "0x00000050", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetRangingMeasurementData", + "runAddr": "0x03009d2e", + "loadAddr": "0x3009d2e", + "size": "760 B", + "sizeOri": "0x000002f8", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetRangingMeasurementData", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_I2C_Init", + "runAddr": "0x0300561c", + "loadAddr": "0x300561c", + "size": "738 B", + "sizeOri": "0x000002e2", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_I2C_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_pal_range_status", + "runAddr": "0x0300d708", + "loadAddr": "0x300d708", + "size": "1030 B", + "sizeOri": "0x00000406", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_pal_range_status", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_encode_timeout", + "runAddr": "0x0300c21e", + "loadAddr": "0x300c21e", + "size": "112 B", + "sizeOri": "0x00000070", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_encode_timeout", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_SetCoreClockSelect", + "runAddr": "0x0300230e", + "loadAddr": "0x300230e", + "size": "142 B", + "sizeOri": "0x0000008e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_SetCoreClockSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetInterruptThresholds", + "runAddr": "0x0300a364", + "loadAddr": "0x300a364", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetInterruptThresholds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_GetPllFreq", + "runAddr": "0x0300242c", + "loadAddr": "0x300242c", + "size": "104 B", + "sizeOri": "0x00000068", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_GetPllFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdDWord.trans.29", + "runAddr": "0x0300c1ca", + "loadAddr": "0x300c1ca", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdDWord.trans.29", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetValue.trans.12", + "runAddr": "0x03007f70", + "loadAddr": "0x3007f70", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetValue.trans.12", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetLimitCheckValue", + "runAddr": "0x030094f4", + "loadAddr": "0x30094f4", + "size": "238 B", + "sizeOri": "0x000000ee", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetLimitCheckValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_Init", + "runAddr": "0x03004c6c", + "loadAddr": "0x3004c6c", + "size": "142 B", + "sizeOri": "0x0000008e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "TurnRight", + "runAddr": "0x0300834c", + "loadAddr": "0x300834c", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "TurnRight", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_EnableN.trans.54", + "runAddr": "0x030079b4", + "loadAddr": "0x30079b4", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_EnableN.trans.54", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetIrqType.trans.44", + "runAddr": "0x03007632", + "loadAddr": "0x3007632", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetIrqType.trans.44", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetWrapAroundCheckEnable", + "runAddr": "0x03009740", + "loadAddr": "0x3009740", + "size": "122 B", + "sizeOri": "0x0000007a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetWrapAroundCheckEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_Init", + "runAddr": "0x0300204e", + "loadAddr": "0x300204e", + "size": "704 B", + "sizeOri": "0x000002c0", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_Init", + "runAddr": "0x030041f6", + "loadAddr": "0x30041f6", + "size": "230 B", + "sizeOri": "0x000000e6", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinLevelShiftRate", + "runAddr": "0x03005c3c", + "loadAddr": "0x3005c3c", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinLevelShiftRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog", + "runAddr": "0x030011f0", + "loadAddr": "0x30011f0", + "size": "22 B", + "sizeOri": "0x00000016", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_Start.trans.35", + "runAddr": "0x03008432", + "loadAddr": "0x3008432", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_Start.trans.35", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_EnableN", + "runAddr": "0x03001464", + "loadAddr": "0x3001464", + "size": "302 B", + "sizeOri": "0x0000012e", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_EnableN", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.4", + "runAddr": "0x03006006", + "loadAddr": "0x3006006", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.4", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_ClearInterruptMask", + "runAddr": "0x0300a3e6", + "loadAddr": "0x300a3e6", + "size": "158 B", + "sizeOri": "0x0000009e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_ClearInterruptMask", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "memcpy", + "runAddr": "0x0300e92a", + "loadAddr": "0x300e92a", + "size": "866 B", + "sizeOri": "0x00000362", + "location": "", + "type": "F", + "level": 2, + "id": "memcpy", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "get_sequence_step_timeout", + "runAddr": "0x0300c39c", + "loadAddr": "0x300c39c", + "size": "506 B", + "sizeOri": "0x000001fa", + "location": "", + "type": "F", + "level": 2, + "id": "get_sequence_step_timeout", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetLimitCheckEnable", + "runAddr": "0x03009338", + "loadAddr": "0x3009338", + "size": "354 B", + "sizeOri": "0x00000162", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetLimitCheckEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_PerformSingleMeasurement", + "runAddr": "0x030097ba", + "loadAddr": "0x30097ba", + "size": "116 B", + "sizeOri": "0x00000074", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_PerformSingleMeasurement", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpEnableSet", + "runAddr": "0x03002604", + "loadAddr": "0x3002604", + "size": "206 B", + "sizeOri": "0x000000ce", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpEnableSet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "Come", + "runAddr": "0x03008436", + "loadAddr": "0x3008436", + "size": "46 B", + "sizeOri": "0x0000002e", + "location": "", + "type": "F", + "level": 2, + "id": "Come", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrByte.trans.10", + "runAddr": "0x0300c1ce", + "loadAddr": "0x300c1ce", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrByte.trans.10", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_read_word", + "runAddr": "0x0300e2ce", + "loadAddr": "0x300e2ce", + "size": "106 B", + "sizeOri": "0x0000006a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_read_word", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_Register", + "runAddr": "0x030013e2", + "loadAddr": "0x30013e2", + "size": "130 B", + "sizeOri": "0x00000082", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_Register", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "set_ref_spad_map", + "runAddr": "0x0300a782", + "loadAddr": "0x300a782", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "set_ref_spad_map", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetInterruptMaskStatus", + "runAddr": "0x0300a484", + "loadAddr": "0x300a484", + "size": "84 B", + "sizeOri": "0x00000054", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetInterruptMaskStatus", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_SetCoreClockSelect", + "runAddr": "0x03000d6c", + "loadAddr": "0x3000d6c", + "size": "66 B", + "sizeOri": "0x00000042", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_SetCoreClockSelect", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_stop", + "runAddr": "0x0300dd22", + "loadAddr": "0x300dd22", + "size": "94 B", + "sizeOri": "0x0000005e", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_stop", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetInterruptThresholds.trans.56", + "runAddr": "0x03009aba", + "loadAddr": "0x3009aba", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetInterruptThresholds.trans.56", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetLimitCheckValue", + "runAddr": "0x030095e6", + "loadAddr": "0x30095e6", + "size": "342 B", + "sizeOri": "0x00000156", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetLimitCheckValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrByte.trans.6", + "runAddr": "0x03008ba4", + "loadAddr": "0x3008ba4", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrByte.trans.6", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_ref_calibration_io", + "runAddr": "0x0300b0e4", + "loadAddr": "0x300b0e4", + "size": "406 B", + "sizeOri": "0x00000196", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_ref_calibration_io", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_set_reference_spads", + "runAddr": "0x0300aee6", + "loadAddr": "0x300aee6", + "size": "380 B", + "sizeOri": "0x0000017c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_set_reference_spads", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_write_byte", + "runAddr": "0x0300e1d2", + "loadAddr": "0x300e1d2", + "size": "80 B", + "sizeOri": "0x00000050", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_write_byte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetPriority", + "runAddr": "0x03001bb2", + "loadAddr": "0x3001bb2", + "size": "116 B", + "sizeOri": "0x00000074", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetPriority", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_DataInit", + "runAddr": "0x03008534", + "loadAddr": "0x3008534", + "size": "832 B", + "sizeOri": "0x00000340", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_DataInit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_UartPrintf.trans.32", + "runAddr": "0x030073a8", + "loadAddr": "0x30073a8", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_UartPrintf.trans.32", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_PerformRefCalibration", + "runAddr": "0x0300982e", + "loadAddr": "0x300982e", + "size": "62 B", + "sizeOri": "0x0000003e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_PerformRefCalibration", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrByte", + "runAddr": "0x0300e484", + "loadAddr": "0x300e484", + "size": "92 B", + "sizeOri": "0x0000005c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrByte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_start", + "runAddr": "0x0300dcd0", + "loadAddr": "0x300dcd0", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_start", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_device_read_strobe.trans.38", + "runAddr": "0x0300c1c6", + "loadAddr": "0x300c1c6", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_device_read_strobe.trans.38", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrWord", + "runAddr": "0x0300e4e0", + "loadAddr": "0x300e4e0", + "size": "92 B", + "sizeOri": "0x0000005c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrWord", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetMeasurementDataReady", + "runAddr": "0x03009c8e", + "loadAddr": "0x3009c8e", + "size": "160 B", + "sizeOri": "0x000000a0", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetMeasurementDataReady", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdWord", + "runAddr": "0x0300e638", + "loadAddr": "0x300e638", + "size": "86 B", + "sizeOri": "0x00000056", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdWord", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AsGuard", + "runAddr": "0x03008464", + "loadAddr": "0x3008464", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "AsGuard", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_UART_IrqHandler", + "runAddr": "0x03006c9e", + "loadAddr": "0x3006c9e", + "size": "350 B", + "sizeOri": "0x0000015e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_UART_IrqHandler", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "perform_ref_signal_measurement", + "runAddr": "0x0300a93e", + "loadAddr": "0x300a93e", + "size": "218 B", + "sizeOri": "0x000000da", + "location": "", + "type": "F", + "level": 2, + "id": "perform_ref_signal_measurement", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "is_aperture", + "runAddr": "0x0300a6b2", + "loadAddr": "0x300a6b2", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "is_aperture", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpEnableSet.trans.19", + "runAddr": "0x030078ce", + "loadAddr": "0x30078ce", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpEnableSet.trans.19", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrByte.trans.8", + "runAddr": "0x0300aa1c", + "loadAddr": "0x300aa1c", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrByte.trans.8", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_PollingDelay", + "runAddr": "0x0300e6e4", + "loadAddr": "0x300e6e4", + "size": "26 B", + "sizeOri": "0x0000001a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_PollingDelay", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_read_byte", + "runAddr": "0x0300e282", + "loadAddr": "0x300e282", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_read_byte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetDirection.trans.30", + "runAddr": "0x0300763a", + "loadAddr": "0x300763a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetDirection.trans.30", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_wait_ack", + "runAddr": "0x0300dd80", + "loadAddr": "0x300dd80", + "size": "158 B", + "sizeOri": "0x0000009e", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_wait_ack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "TurnLeft", + "runAddr": "0x0300830c", + "loadAddr": "0x300830c", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "TurnLeft", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FOTP_InfoGet", + "runAddr": "0x0300102a", + "loadAddr": "0x300102a", + "size": "354 B", + "sizeOri": "0x00000162", + "location": "", + "type": "F", + "level": 2, + "id": "FOTP_InfoGet", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_device_read_strobe", + "runAddr": "0x0300b610", + "loadAddr": "0x300b610", + "size": "166 B", + "sizeOri": "0x000000a6", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_device_read_strobe", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrNmiEntry", + "runAddr": "0x030015d0", + "loadAddr": "0x30015d0", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrNmiEntry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ANATRIM_Entry", + "runAddr": "0x03000cbc", + "loadAddr": "0x3000cbc", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "ANATRIM_Entry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_perform_vhv_calibration", + "runAddr": "0x0300b27a", + "loadAddr": "0x300b27a", + "size": "230 B", + "sizeOri": "0x000000e6", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_perform_vhv_calibration", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_set_measurement_timing_budget_micro_seconds", + "runAddr": "0x0300c858", + "loadAddr": "0x300c858", + "size": "530 B", + "sizeOri": "0x00000212", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_set_measurement_timing_budget_micro_seconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetLimitCheckValue.trans.46", + "runAddr": "0x03008874", + "loadAddr": "0x3008874", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetLimitCheckValue.trans.46", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetIrqType", + "runAddr": "0x030046ae", + "loadAddr": "0x30046ae", + "size": "526 B", + "sizeOri": "0x0000020e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetIrqType", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_Delay.trans.14", + "runAddr": "0x030084be", + "loadAddr": "0x30084be", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_Delay.trans.14", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "set_sequence_step_timeout", + "runAddr": "0x0300c596", + "loadAddr": "0x300c596", + "size": "560 B", + "sizeOri": "0x00000230", + "location": "", + "type": "F", + "level": 2, + "id": "set_sequence_step_timeout", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_offset_calibration_data_micro_meter", + "runAddr": "0x0300a512", + "loadAddr": "0x300a512", + "size": "166 B", + "sizeOri": "0x000000a6", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_offset_calibration_data_micro_meter", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_calc_timeout_mclks", + "runAddr": "0x0300c2c4", + "loadAddr": "0x300c2c4", + "size": "108 B", + "sizeOri": "0x0000006c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_calc_timeout_mclks", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrByte.trans.9", + "runAddr": "0x0300b6ba", + "loadAddr": "0x300b6ba", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrByte.trans.9", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPIO1_4_CallbackFunc", + "runAddr": "0x03006fc6", + "loadAddr": "0x3006fc6", + "size": "38 B", + "sizeOri": "0x00000026", + "location": "", + "type": "F", + "level": 2, + "id": "GPIO1_4_CallbackFunc", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_calc_timeout_us", + "runAddr": "0x0300c330", + "loadAddr": "0x300c330", + "size": "108 B", + "sizeOri": "0x0000006c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_calc_timeout_us", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdWord.trans.25", + "runAddr": "0x0300973c", + "loadAddr": "0x300973c", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdWord.trans.25", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "get_ref_spad_map", + "runAddr": "0x0300a7b8", + "loadAddr": "0x300a7b8", + "size": "54 B", + "sizeOri": "0x00000036", + "location": "", + "type": "F", + "level": 2, + "id": "get_ref_spad_map", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "__stpcpy", + "runAddr": "0x0300ed8a", + "loadAddr": "0x300ed8a", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "__stpcpy", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SetCarAptAndStart", + "runAddr": "0x030081e0", + "loadAddr": "0x30081e0", + "size": "186 B", + "sizeOri": "0x000000ba", + "location": "", + "type": "F", + "level": 2, + "id": "SetCarAptAndStart", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ANAVREF_Init", + "runAddr": "0x03000d0e", + "loadAddr": "0x3000d0e", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "ANAVREF_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinSchmidtMode", + "runAddr": "0x03005bf0", + "loadAddr": "0x3005bf0", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinSchmidtMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetMeasurementTimingBudgetMicroSeconds", + "runAddr": "0x03008e2e", + "loadAddr": "0x3008e2e", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetMeasurementTimingBudgetMicroSeconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "CRG_Config", + "runAddr": "0x030073b0", + "loadAddr": "0x30073b0", + "size": "106 B", + "sizeOri": "0x0000006a", + "location": "", + "type": "F", + "level": 2, + "id": "CRG_Config", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetDeviceMode", + "runAddr": "0x03008db8", + "loadAddr": "0x3008db8", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetDeviceMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_measurement_timing_budget_micro_seconds", + "runAddr": "0x0300ca6e", + "loadAddr": "0x300ca6e", + "size": "416 B", + "sizeOri": "0x000001a0", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_measurement_timing_budget_micro_seconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinDriveRate.trans.24", + "runAddr": "0x03007e82", + "loadAddr": "0x3007e82", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinDriveRate.trans.24", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART0WriteInterruptCallback", + "runAddr": "0x030078d2", + "loadAddr": "0x30078d2", + "size": "18 B", + "sizeOri": "0x00000012", + "location": "", + "type": "F", + "level": 2, + "id": "UART0WriteInterruptCallback", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "Chip_Init", + "runAddr": "0x030006f8", + "loadAddr": "0x30006f8", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "Chip_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetLimitCheckEnable.trans.39", + "runAddr": "0x03008878", + "loadAddr": "0x3008878", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetLimitCheckEnable.trans.39", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetDeviceParameters", + "runAddr": "0x03008ba8", + "loadAddr": "0x3008ba8", + "size": "450 B", + "sizeOri": "0x000001c2", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetDeviceParameters", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "get_sequence_step_timeout.trans.40", + "runAddr": "0x0300cc0e", + "loadAddr": "0x300cc0e", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "get_sequence_step_timeout.trans.40", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_perform_ref_calibration", + "runAddr": "0x0300b440", + "loadAddr": "0x300b440", + "size": "158 B", + "sizeOri": "0x0000009e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_perform_ref_calibration", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_Start", + "runAddr": "0x03004cfa", + "loadAddr": "0x3004cfa", + "size": "142 B", + "sizeOri": "0x0000008e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_Start", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetMeasurementTimingBudgetMicroSeconds", + "runAddr": "0x03008e62", + "loadAddr": "0x3008e62", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetMeasurementTimingBudgetMicroSeconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.1", + "runAddr": "0x03002e0c", + "loadAddr": "0x3002e0c", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.1", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_write_word", + "runAddr": "0x0300e222", + "loadAddr": "0x300e222", + "size": "96 B", + "sizeOri": "0x00000060", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_write_word", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_isqrt", + "runAddr": "0x0300b580", + "loadAddr": "0x300b580", + "size": "144 B", + "sizeOri": "0x00000090", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_isqrt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetSequenceStepEnables", + "runAddr": "0x0300911a", + "loadAddr": "0x300911a", + "size": "226 B", + "sizeOri": "0x000000e2", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetSequenceStepEnables", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_send_byte", + "runAddr": "0x0300dec2", + "loadAddr": "0x300dec2", + "size": "156 B", + "sizeOri": "0x0000009c", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_send_byte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.3", + "runAddr": "0x030051fa", + "loadAddr": "0x30051fa", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.3", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_PerformSingleRangingMeasurement", + "runAddr": "0x0300a026", + "loadAddr": "0x300a026", + "size": "112 B", + "sizeOri": "0x00000070", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_PerformSingleRangingMeasurement", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "strncmp", + "runAddr": "0x0300ed5e", + "loadAddr": "0x300ed5e", + "size": "44 B", + "sizeOri": "0x0000002c", + "location": "", + "type": "F", + "level": 2, + "id": "strncmp", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_RegisterCallBack", + "runAddr": "0x03004ace", + "loadAddr": "0x3004ace", + "size": "250 B", + "sizeOri": "0x000000fa", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_RegisterCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_GetCoreClkFreq", + "runAddr": "0x03002494", + "loadAddr": "0x3002494", + "size": "146 B", + "sizeOri": "0x00000092", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_GetCoreClkFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_UpdateByte", + "runAddr": "0x0300e53c", + "loadAddr": "0x300e53c", + "size": "166 B", + "sizeOri": "0x000000a6", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_UpdateByte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AnticlockwiseMotor", + "runAddr": "0x030083f8", + "loadAddr": "0x30083f8", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "AnticlockwiseMotor", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_decode_vcsel_period", + "runAddr": "0x0300b556", + "loadAddr": "0x300b556", + "size": "42 B", + "sizeOri": "0x0000002a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_decode_vcsel_period", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_GetIpFreq", + "runAddr": "0x03002526", + "loadAddr": "0x3002526", + "size": "222 B", + "sizeOri": "0x000000de", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_GetIpFreq", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GPIO1_1_CallbackFunc", + "runAddr": "0x03006fa0", + "loadAddr": "0x3006fa0", + "size": "38 B", + "sizeOri": "0x00000026", + "location": "", + "type": "F", + "level": 2, + "id": "GPIO1_1_CallbackFunc", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetXTalkCompensationRateMegaCps", + "runAddr": "0x030092b0", + "loadAddr": "0x30092b0", + "size": "136 B", + "sizeOri": "0x00000088", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetXTalkCompensationRateMegaCps", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "UART0ReadInterruptCallback", + "runAddr": "0x03006f0e", + "loadAddr": "0x3006f0e", + "size": "34 B", + "sizeOri": "0x00000022", + "location": "", + "type": "F", + "level": 2, + "id": "UART0ReadInterruptCallback", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "sequence_step_enabled", + "runAddr": "0x0300905a", + "loadAddr": "0x300905a", + "size": "192 B", + "sizeOri": "0x000000c0", + "location": "", + "type": "F", + "level": 2, + "id": "sequence_step_enabled", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_Init.trans.36", + "runAddr": "0x03007636", + "loadAddr": "0x3007636", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_Init.trans.36", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SYSTICK_GetCRGHZ", + "runAddr": "0x03000f8a", + "loadAddr": "0x3000f8a", + "size": "28 B", + "sizeOri": "0x0000001c", + "location": "", + "type": "F", + "level": 2, + "id": "SYSTICK_GetCRGHZ", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_RegisterCallback", + "runAddr": "0x03006174", + "loadAddr": "0x3006174", + "size": "148 B", + "sizeOri": "0x00000094", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_RegisterCallback", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_total_signal_rate", + "runAddr": "0x0300cf32", + "loadAddr": "0x300cf32", + "size": "96 B", + "sizeOri": "0x00000060", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_total_signal_rate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_perform_phase_calibration", + "runAddr": "0x0300b360", + "loadAddr": "0x300b360", + "size": "224 B", + "sizeOri": "0x000000e0", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_perform_phase_calibration", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_ReadMulti", + "runAddr": "0x0300e414", + "loadAddr": "0x300e414", + "size": "112 B", + "sizeOri": "0x00000070", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_ReadMulti", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinPullMode", + "runAddr": "0x03005ba4", + "loadAddr": "0x3005ba4", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinPullMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SynTwoMotorSpeed", + "runAddr": "0x03008006", + "loadAddr": "0x3008006", + "size": "474 B", + "sizeOri": "0x000001da", + "location": "", + "type": "F", + "level": 2, + "id": "SynTwoMotorSpeed", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "memcpy.trans.37", + "runAddr": "0x0300aee2", + "loadAddr": "0x300aee2", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "memcpy.trans.37", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetCrgIpMatchInfo", + "runAddr": "0x0300118c", + "loadAddr": "0x300118c", + "size": "100 B", + "sizeOri": "0x00000064", + "location": "", + "type": "F", + "level": 2, + "id": "GetCrgIpMatchInfo", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ClockwiseMotor", + "runAddr": "0x030083be", + "loadAddr": "0x30083be", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "ClockwiseMotor", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_ack", + "runAddr": "0x0300de1e", + "loadAddr": "0x300de1e", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_ack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrExcEntry", + "runAddr": "0x030015b2", + "loadAddr": "0x30015b2", + "size": "30 B", + "sizeOri": "0x0000001e", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrExcEntry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "memset", + "runAddr": "0x0300ec8c", + "loadAddr": "0x300ec8c", + "size": "190 B", + "sizeOri": "0x000000be", + "location": "", + "type": "F", + "level": 2, + "id": "memset", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "main", + "runAddr": "0x0300709a", + "loadAddr": "0x300709a", + "size": "778 B", + "sizeOri": "0x0000030a", + "location": "", + "type": "F", + "level": 2, + "id": "main", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_GetReferCounterAndAction.trans.45", + "runAddr": "0x0300829a", + "loadAddr": "0x300829a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_GetReferCounterAndAction.trans.45", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "Vl53l0xStart", + "runAddr": "0x0300dc64", + "loadAddr": "0x300dc64", + "size": "36 B", + "sizeOri": "0x00000024", + "location": "", + "type": "F", + "level": 2, + "id": "Vl53l0xStart", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "MotorStatus", + "runAddr": "0x03007ebc", + "loadAddr": "0x3007ebc", + "size": "180 B", + "sizeOri": "0x000000b4", + "location": "", + "type": "F", + "level": 2, + "id": "MotorStatus", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_hw_reset", + "runAddr": "0x0300e00a", + "loadAddr": "0x300e00a", + "size": "70 B", + "sizeOri": "0x00000046", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_hw_reset", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetLimitCheckEnable", + "runAddr": "0x0300949a", + "loadAddr": "0x300949a", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetLimitCheckEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "Vl53l0xInit", + "runAddr": "0x0300dc36", + "loadAddr": "0x300dc36", + "size": "46 B", + "sizeOri": "0x0000002e", + "location": "", + "type": "F", + "level": 2, + "id": "Vl53l0xInit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_read_byte", + "runAddr": "0x0300df5e", + "loadAddr": "0x300df5e", + "size": "168 B", + "sizeOri": "0x000000a8", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_read_byte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "__truncdfsf2", + "runAddr": "0x0300e6fe", + "loadAddr": "0x300e6fe", + "size": "546 B", + "sizeOri": "0x00000222", + "location": "", + "type": "F", + "level": 2, + "id": "__truncdfsf2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_calc_macro_period_ps", + "runAddr": "0x0300c1d2", + "loadAddr": "0x300c1d2", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_calc_macro_period_ps", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_GetPinValue", + "runAddr": "0x030044b2", + "loadAddr": "0x30044b2", + "size": "204 B", + "sizeOri": "0x000000cc", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_GetPinValue", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WrByte.trans.7", + "runAddr": "0x03009c8a", + "loadAddr": "0x3009c8a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WrByte.trans.7", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_info_from_device", + "runAddr": "0x0300b6be", + "loadAddr": "0x300b6be", + "size": "2824 B", + "sizeOri": "0x00000b08", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_info_from_device", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SystemInit", + "runAddr": "0x03007e96", + "loadAddr": "0x3007e96", + "size": "38 B", + "sizeOri": "0x00000026", + "location": "", + "type": "F", + "level": 2, + "id": "SystemInit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "get_dmax_lut_points", + "runAddr": "0x0300cf92", + "loadAddr": "0x300cf92", + "size": "186 B", + "sizeOri": "0x000000ba", + "location": "", + "type": "F", + "level": 2, + "id": "get_dmax_lut_points", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_read_dword", + "runAddr": "0x0300e338", + "loadAddr": "0x300e338", + "size": "104 B", + "sizeOri": "0x00000068", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_read_dword", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_UART_RegisterCallBack", + "runAddr": "0x03006dfc", + "loadAddr": "0x3006dfc", + "size": "270 B", + "sizeOri": "0x0000010e", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_UART_RegisterCallBack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "enable_ref_spads", + "runAddr": "0x0300a7ee", + "loadAddr": "0x300a7ee", + "size": "336 B", + "sizeOri": "0x00000150", + "location": "", + "type": "F", + "level": 2, + "id": "enable_ref_spads", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetSequenceStepEnable", + "runAddr": "0x03008ed6", + "loadAddr": "0x3008ed6", + "size": "388 B", + "sizeOri": "0x00000184", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetSequenceStepEnable", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_DelaySeconds", + "runAddr": "0x030012ac", + "loadAddr": "0x30012ac", + "size": "56 B", + "sizeOri": "0x00000038", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_DelaySeconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.0", + "runAddr": "0x0300204a", + "loadAddr": "0x300204a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.0", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_Init", + "runAddr": "0x03005db4", + "loadAddr": "0x3005db4", + "size": "594 B", + "sizeOri": "0x00000252", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "TIMER0_InterruptProcess", + "runAddr": "0x03006f30", + "loadAddr": "0x3006f30", + "size": "112 B", + "sizeOri": "0x00000070", + "location": "", + "type": "F", + "level": 2, + "id": "TIMER0_InterruptProcess", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinLevelShiftRate.trans.23", + "runAddr": "0x03007e86", + "loadAddr": "0x3007e86", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinLevelShiftRate.trans.23", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "ChangeCarApt", + "runAddr": "0x03007f74", + "loadAddr": "0x3007f74", + "size": "146 B", + "sizeOri": "0x00000092", + "location": "", + "type": "F", + "level": 2, + "id": "ChangeCarApt", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetVcselPulsePeriod", + "runAddr": "0x03008e96", + "loadAddr": "0x3008e96", + "size": "64 B", + "sizeOri": "0x00000040", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetVcselPulsePeriod", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_Delay", + "runAddr": "0x030012e4", + "loadAddr": "0x30012e4", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_Delay", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_GetReferCounterAndAction", + "runAddr": "0x03005120", + "loadAddr": "0x3005120", + "size": "218 B", + "sizeOri": "0x000000da", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_GetReferCounterAndAction", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_DelayMs", + "runAddr": "0x03001274", + "loadAddr": "0x3001274", + "size": "56 B", + "sizeOri": "0x00000038", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_DelayMs", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetValue.trans.13", + "runAddr": "0x0300e054", + "loadAddr": "0x300e054", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetValue.trans.13", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetDirection", + "runAddr": "0x030042dc", + "loadAddr": "0x30042dc", + "size": "232 B", + "sizeOri": "0x000000e8", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetDirection", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetSequenceStepEnables.trans.49", + "runAddr": "0x0300ca6a", + "loadAddr": "0x300ca6a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetSequenceStepEnables.trans.49", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinPullMode.trans.21", + "runAddr": "0x03007e8e", + "loadAddr": "0x3007e8e", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinPullMode.trans.21", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "InterruptEntry", + "runAddr": "0x03001356", + "loadAddr": "0x3001356", + "size": "60 B", + "sizeOri": "0x0000003c", + "location": "", + "type": "F", + "level": 2, + "id": "InterruptEntry", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_PerformRefSpadManagement", + "runAddr": "0x0300a4d8", + "loadAddr": "0x300a4d8", + "size": "58 B", + "sizeOri": "0x0000003a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_PerformRefSpadManagement", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdByte.trans.17", + "runAddr": "0x0300b6b6", + "loadAddr": "0x300b6b6", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdByte.trans.17", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_calc_dmax", + "runAddr": "0x0300d04c", + "loadAddr": "0x300d04c", + "size": "380 B", + "sizeOri": "0x0000017c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_calc_dmax", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "Retreat", + "runAddr": "0x0300838c", + "loadAddr": "0x300838c", + "size": "50 B", + "sizeOri": "0x00000032", + "location": "", + "type": "F", + "level": 2, + "id": "Retreat", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "DBG_UartPrintf", + "runAddr": "0x03003af0", + "loadAddr": "0x3003af0", + "size": "360 B", + "sizeOri": "0x00000168", + "location": "", + "type": "F", + "level": 2, + "id": "DBG_UartPrintf", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetDeviceAddress", + "runAddr": "0x030084f6", + "loadAddr": "0x30084f6", + "size": "62 B", + "sizeOri": "0x0000003e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetDeviceAddress", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "GetDistance", + "runAddr": "0x0300dc8c", + "loadAddr": "0x300dc8c", + "size": "68 B", + "sizeOri": "0x00000044", + "location": "", + "type": "F", + "level": 2, + "id": "GetDistance", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_SetDeviceMode", + "runAddr": "0x03008d6a", + "loadAddr": "0x3008d6a", + "size": "78 B", + "sizeOri": "0x0000004e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_SetDeviceMode", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "enable_spad_bit", + "runAddr": "0x0300a6ec", + "loadAddr": "0x300a6ec", + "size": "150 B", + "sizeOri": "0x00000096", + "location": "", + "type": "F", + "level": 2, + "id": "enable_spad_bit", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "vl53l0x_iic_nack", + "runAddr": "0x0300de70", + "loadAddr": "0x300de70", + "size": "82 B", + "sizeOri": "0x00000052", + "location": "", + "type": "F", + "level": 2, + "id": "vl53l0x_iic_nack", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetOffsetCalibrationDataMicroMeter", + "runAddr": "0x030084c2", + "loadAddr": "0x30084c2", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetOffsetCalibrationDataMicroMeter", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPT_Stop", + "runAddr": "0x03004d88", + "loadAddr": "0x3004d88", + "size": "140 B", + "sizeOri": "0x0000008c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPT_Stop", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_SetValue.trans.11", + "runAddr": "0x0300763e", + "loadAddr": "0x300763e", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_SetValue.trans.11", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.2", + "runAddr": "0x030044ae", + "loadAddr": "0x30044ae", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.2", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_get_vcsel_pulse_period", + "runAddr": "0x0300c7ce", + "loadAddr": "0x300c7ce", + "size": "138 B", + "sizeOri": "0x0000008a", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_get_vcsel_pulse_period", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdWord.trans.27", + "runAddr": "0x0300c7ca", + "loadAddr": "0x300c7ca", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdWord.trans.27", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdByte", + "runAddr": "0x0300e5e2", + "loadAddr": "0x300e5e2", + "size": "86 B", + "sizeOri": "0x00000056", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdByte", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_isqrt.trans.50", + "runAddr": "0x0300d704", + "loadAddr": "0x300d704", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_isqrt.trans.50", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_GPIO_IrqHandler", + "runAddr": "0x030049c4", + "loadAddr": "0x30049c4", + "size": "266 B", + "sizeOri": "0x0000010a", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_GPIO_IrqHandler", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinAltFuncMode.trans.20", + "runAddr": "0x03007e92", + "loadAddr": "0x3007e92", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinAltFuncMode.trans.20", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "BASE_FUNC_DelayUs", + "runAddr": "0x0300121a", + "loadAddr": "0x300121a", + "size": "90 B", + "sizeOri": "0x0000005a", + "location": "", + "type": "F", + "level": 2, + "id": "BASE_FUNC_DelayUs", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_write_multi", + "runAddr": "0x0300e058", + "loadAddr": "0x300e058", + "size": "170 B", + "sizeOri": "0x000000aa", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_write_multi", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetLimitCheckValue.trans.48", + "runAddr": "0x0300db0e", + "loadAddr": "0x300db0e", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetLimitCheckValue.trans.48", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_load_tuning_settings", + "runAddr": "0x0300cc12", + "loadAddr": "0x300cc12", + "size": "674 B", + "sizeOri": "0x000002a2", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_load_tuning_settings", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_UART_Init", + "runAddr": "0x030064e2", + "loadAddr": "0x30064e2", + "size": "958 B", + "sizeOri": "0x000003be", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_UART_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "FOTP_InfoGet.trans.43", + "runAddr": "0x03000cb8", + "loadAddr": "0x3000cb8", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "FOTP_InfoGet.trans.43", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "abs", + "runAddr": "0x0300e920", + "loadAddr": "0x300e920", + "size": "10 B", + "sizeOri": "0x0000000a", + "location": "", + "type": "F", + "level": 2, + "id": "abs", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SYSTICK_Init", + "runAddr": "0x03000f68", + "loadAddr": "0x3000f68", + "size": "34 B", + "sizeOri": "0x00000022", + "location": "", + "type": "F", + "level": 2, + "id": "SYSTICK_Init", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_WriteMulti", + "runAddr": "0x0300e3a0", + "loadAddr": "0x300e3a0", + "size": "116 B", + "sizeOri": "0x00000074", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_WriteMulti", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetLimitCheckEnable.trans.41", + "runAddr": "0x0300db12", + "loadAddr": "0x300db12", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetLimitCheckEnable.trans.41", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_StartMeasurement", + "runAddr": "0x03009ac2", + "loadAddr": "0x3009ac2", + "size": "456 B", + "sizeOri": "0x000001c8", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_StartMeasurement", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetVcselPulsePeriod.trans.34", + "runAddr": "0x0300c7c6", + "loadAddr": "0x300c7c6", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetVcselPulsePeriod.trans.34", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_CRG_IpEnableSet.trans.18", + "runAddr": "0x03000d68", + "loadAddr": "0x3000d68", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_CRG_IpEnableSet.trans.18", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_perform_ref_spad_management", + "runAddr": "0x0300aa20", + "loadAddr": "0x300aa20", + "size": "1218 B", + "sizeOri": "0x000004c2", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_perform_ref_spad_management", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_load_tuning_settings.trans.47", + "runAddr": "0x03009abe", + "loadAddr": "0x3009abe", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_load_tuning_settings.trans.47", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "IRQ_SetPriority.trans.53", + "runAddr": "0x030079b8", + "loadAddr": "0x30079b8", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "IRQ_SetPriority.trans.53", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_TIMER_IrqHandler", + "runAddr": "0x0300608c", + "loadAddr": "0x300608c", + "size": "232 B", + "sizeOri": "0x000000e8", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_TIMER_IrqHandler", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_measurement_poll_for_completion", + "runAddr": "0x0300b4de", + "loadAddr": "0x300b4de", + "size": "120 B", + "sizeOri": "0x00000078", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_measurement_poll_for_completion", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "get_next_good_spad", + "runAddr": "0x0300a5b8", + "loadAddr": "0x300a5b8", + "size": "250 B", + "sizeOri": "0x000000fa", + "location": "", + "type": "F", + "level": 2, + "id": "get_next_good_spad", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetInterMeasurementPeriodMilliSeconds", + "runAddr": "0x03009200", + "loadAddr": "0x3009200", + "size": "126 B", + "sizeOri": "0x0000007e", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetInterMeasurementPeriodMilliSeconds", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_calc_sigma_estimate", + "runAddr": "0x0300d1c8", + "loadAddr": "0x300d1c8", + "size": "1340 B", + "sizeOri": "0x0000053c", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_calc_sigma_estimate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "SysErrPrint", + "runAddr": "0x03001592", + "loadAddr": "0x3001592", + "size": "18 B", + "sizeOri": "0x00000012", + "location": "", + "type": "F", + "level": 2, + "id": "SysErrPrint", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "HAL_IOCMG_SetPinDriveRate", + "runAddr": "0x03005c88", + "loadAddr": "0x3005c88", + "size": "76 B", + "sizeOri": "0x0000004c", + "location": "", + "type": "F", + "level": 2, + "id": "HAL_IOCMG_SetPinDriveRate", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_RdWord.trans.26", + "runAddr": "0x0300aa18", + "loadAddr": "0x300aa18", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_RdWord.trans.26", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "AssertErrorLog.trans.5", + "runAddr": "0x03006f0a", + "loadAddr": "0x3006f0a", + "size": "8 B", + "sizeOri": "0x00000008", + "location": "", + "type": "F", + "level": 2, + "id": "AssertErrorLog.trans.5", + "IPARENTID": ".text", + "sort": 0 + }, + { + "name": "VL53L0X_GetXTalkCompensationEnable", + "runAddr": "0x0300927e", + "loadAddr": "0x300927e", + "size": "50 B", + "sizeOri": "0x00000032", + "location": "", + "type": "F", + "level": 2, + "id": "VL53L0X_GetXTalkCompensationEnable", + "IPARENTID": ".text", + "sort": 0 + } + ], + "regionName": [ + "FLASH_CODE" + ], + "runAddr": "0x030006f0", + "loadAddr": "0x030006f0", + "size": "61064 B", + "sizeOri": "0x0000ee88" + }, + { + "name": ".data", + "id": ".data", + "level": 1, + "IPARENTID": null, + "open": false, + "sort": 0, + "children": [ + { + "name": "g_ipClkProc", + "runAddr": "0x04000024", + "loadAddr": "0x300f57c", + "size": "216 B", + "sizeOri": "0x000000d8", + "location": "", + "type": "O", + "level": 2, + "id": "g_ipClkProc", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "demo_dev", + "runAddr": "0x040003c8", + "loadAddr": "0x300f920", + "size": "388 B", + "sizeOri": "0x00000184", + "location": "", + "type": "O", + "level": 2, + "id": "demo_dev", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "KD", + "runAddr": "0x04000108", + "loadAddr": "0x300f660", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "KD", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "refArrayQuadrants", + "runAddr": "0x040003b8", + "loadAddr": "0x300f910", + "size": "16 B", + "sizeOri": "0x00000010", + "location": "", + "type": "O", + "level": 2, + "id": "refArrayQuadrants", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "KP", + "runAddr": "0x04000100", + "loadAddr": "0x300f658", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "KP", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "g_tsensorGain", + "runAddr": "0x04000020", + "loadAddr": "0x300f578", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "g_tsensorGain", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "targetSpeed", + "runAddr": "0x040000fc", + "loadAddr": "0x300f654", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "targetSpeed", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "InterruptThresholdSettings", + "runAddr": "0x04000200", + "loadAddr": "0x300f758", + "size": "438 B", + "sizeOri": "0x000001b6", + "location": "", + "type": "O", + "level": 2, + "id": "InterruptThresholdSettings", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "KI", + "runAddr": "0x04000104", + "loadAddr": "0x300f65c", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "KI", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "DefaultTuningSettings", + "runAddr": "0x0400010c", + "loadAddr": "0x300f664", + "size": "243 B", + "sizeOri": "0x000000f3", + "location": "", + "type": "O", + "level": 2, + "id": "DefaultTuningSettings", + "IPARENTID": ".data", + "sort": 0 + } + ], + "regionName": [ + "RAM_DATA", + "FLASH_CODE" + ], + "runAddr": "0x04000020", + "loadAddr": "0x0300f578", + "size": "1324 B", + "sizeOri": "0x0000052c" + } + ] + }, + { + "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": "3112 B", + "usage": "15.23%", + "free": "17320 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": "0x300f57c", + "size": "216 B", + "sizeOri": "0x000000d8", + "location": "", + "type": "O", + "level": 2, + "id": "g_ipClkProc", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "demo_dev", + "runAddr": "0x040003c8", + "loadAddr": "0x300f920", + "size": "388 B", + "sizeOri": "0x00000184", + "location": "", + "type": "O", + "level": 2, + "id": "demo_dev", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "KD", + "runAddr": "0x04000108", + "loadAddr": "0x300f660", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "KD", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "refArrayQuadrants", + "runAddr": "0x040003b8", + "loadAddr": "0x300f910", + "size": "16 B", + "sizeOri": "0x00000010", + "location": "", + "type": "O", + "level": 2, + "id": "refArrayQuadrants", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "KP", + "runAddr": "0x04000100", + "loadAddr": "0x300f658", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "KP", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "g_tsensorGain", + "runAddr": "0x04000020", + "loadAddr": "0x300f578", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "g_tsensorGain", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "targetSpeed", + "runAddr": "0x040000fc", + "loadAddr": "0x300f654", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "targetSpeed", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "InterruptThresholdSettings", + "runAddr": "0x04000200", + "loadAddr": "0x300f758", + "size": "438 B", + "sizeOri": "0x000001b6", + "location": "", + "type": "O", + "level": 2, + "id": "InterruptThresholdSettings", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "KI", + "runAddr": "0x04000104", + "loadAddr": "0x300f65c", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "KI", + "IPARENTID": ".data", + "sort": 0 + }, + { + "name": "DefaultTuningSettings", + "runAddr": "0x0400010c", + "loadAddr": "0x300f664", + "size": "243 B", + "sizeOri": "0x000000f3", + "location": "", + "type": "O", + "level": 2, + "id": "DefaultTuningSettings", + "IPARENTID": ".data", + "sort": 0 + } + ], + "regionName": [ + "RAM_DATA", + "FLASH_CODE" + ], + "runAddr": "0x04000020", + "loadAddr": "0x0300f578", + "size": "1324 B", + "sizeOri": "0x0000052c" + }, + { + "name": ".bss", + "id": ".bss", + "level": 1, + "IPARENTID": null, + "open": false, + "sort": 0, + "children": [ + { + "name": "g_crgBaseAddr", + "runAddr": "0x040008e4", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "g_crgBaseAddr", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_anaEnableFlag", + "runAddr": "0x040008e8", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "g_anaEnableFlag", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "readData", + "runAddr": "0x040008ec", + "loadAddr": "", + "size": "20 B", + "sizeOri": "0x00000014", + "location": "", + "type": "O", + "level": 2, + "id": "readData", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_uartReceiveFlag", + "runAddr": "0x04000900", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "g_uartReceiveFlag", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "f_250ms", + "runAddr": "0x04000901", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "f_250ms", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "f_1s", + "runAddr": "0x04000902", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "f_1s", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "f_10s", + "runAddr": "0x04000903", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "f_10s", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "v_num_left", + "runAddr": "0x04000904", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "v_num_left", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "v_num_right", + "runAddr": "0x04000908", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "v_num_right", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "workStatus", + "runAddr": "0x0400090c", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "workStatus", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "f_sedentary", + "runAddr": "0x04000910", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "f_sedentary", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "f_guard", + "runAddr": "0x04000911", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "f_guard", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "time_num", + "runAddr": "0x04000914", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "time_num", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "time_sedentary_num", + "runAddr": "0x04000918", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "time_sedentary_num", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_timer0", + "runAddr": "0x040009b8", + "loadAddr": "", + "size": "40 B", + "sizeOri": "0x00000028", + "location": "", + "type": "O", + "level": 2, + "id": "g_timer0", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_i2c0", + "runAddr": "0x04000a60", + "loadAddr": "", + "size": "104 B", + "sizeOri": "0x00000068", + "location": "", + "type": "O", + "level": 2, + "id": "g_i2c0", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "preLeftError", + "runAddr": "0x04000c30", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "preLeftError", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "ppreRightError", + "runAddr": "0x04000c3c", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "ppreRightError", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpio1", + "runAddr": "0x04000ac8", + "loadAddr": "", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpio1", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpio2", + "runAddr": "0x04000b10", + "loadAddr": "", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpio2", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "ppreLeftError", + "runAddr": "0x04000c34", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "ppreLeftError", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "preRightError", + "runAddr": "0x04000c38", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "preRightError", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "USART_RX_STA", + "runAddr": "0x040008e9", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "USART_RX_STA", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpio5", + "runAddr": "0x04000be8", + "loadAddr": "", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpio5", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_uart0", + "runAddr": "0x040009e0", + "loadAddr": "", + "size": "128 B", + "sizeOri": "0x00000080", + "location": "", + "type": "O", + "level": 2, + "id": "g_uart0", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "Right_ESC_Output_PWM", + "runAddr": "0x04000c44", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "Right_ESC_Output_PWM", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "Left_ESC_Output_PWM", + "runAddr": "0x04000c40", + "loadAddr": "", + "size": "4 B", + "sizeOri": "0x00000004", + "location": "", + "type": "O", + "level": 2, + "id": "Left_ESC_Output_PWM", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_irqCallbackFunc", + "runAddr": "0x0400054c", + "loadAddr": "", + "size": "920 B", + "sizeOri": "0x00000398", + "location": "", + "type": "O", + "level": 2, + "id": "g_irqCallbackFunc", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpt1", + "runAddr": "0x0400091c", + "loadAddr": "", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpt1", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_carStart", + "runAddr": "0x040008ea", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "g_carStart", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "s_distance", + "runAddr": "0x0400090e", + "loadAddr": "", + "size": "2 B", + "sizeOri": "0x00000002", + "location": "", + "type": "O", + "level": 2, + "id": "s_distance", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpio4", + "runAddr": "0x04000ba0", + "loadAddr": "", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpio4", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpt3", + "runAddr": "0x04000984", + "loadAddr": "", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpt3", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_carStop", + "runAddr": "0x040008eb", + "loadAddr": "", + "size": "1 B", + "sizeOri": "0x00000001", + "location": "", + "type": "O", + "level": 2, + "id": "g_carStop", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpio3", + "runAddr": "0x04000b58", + "loadAddr": "", + "size": "72 B", + "sizeOri": "0x00000048", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpio3", + "IPARENTID": ".bss", + "sort": 0 + }, + { + "name": "g_gpt2", + "runAddr": "0x04000950", + "loadAddr": "", + "size": "52 B", + "sizeOri": "0x00000034", + "location": "", + "type": "O", + "level": 2, + "id": "g_gpt2", + "IPARENTID": ".bss", + "sort": 0 + } + ], + "regionName": [ + "RAM_DATA" + ], + "runAddr": "0x0400054c", + "loadAddr": "", + "size": "1788 B", + "sizeOri": "0x000006fc" + } + ] + }, + { + "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": 1776, + "moduleName": "startup.o", + "componentName": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": 1776 + }, + "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": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": 0 + }, + "0x0000000004005000": { + "objName": "__nmi_stack_bottom", + "parent": "startup.o", + "isSymbol": true, + "lib": "", + "moduleName": "startup.o", + "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": "0x0000000004005000", + "id": "__nmi_stack_bottom", + "dec": 0, + "romSize": 0, + "sumSize": 0 + }, + "0x0000000004007c00": { + "objName": "__irq_stack_top", + "parent": "startup.o", + "isSymbol": true, + "lib": "", + "moduleName": "startup.o", + "componentName": "", + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004007c00", + "id": "__irq_stack_top", + "dec": 0, + "romSize": 0, + "sumSize": 1772 + }, + "0x0000000004005400": { + "objName": "__init_stack_top", + "parent": "startup.o", + "isSymbol": true, + "lib": "", + "moduleName": "startup.o", + "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": "0x0000000004005400", + "id": "__init_stack_top", + "dec": 0, + "romSize": 0, + "sumSize": 0 + }, + "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": 16587, + ".comment": 0, + ".debug_line": 12446, + ".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 + }, + "0x00000000030006f0": { + "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": "0x00000000030006f0", + "id": "Chip_InitFail", + "dec": 0, + "sumSize": 8 + }, + "0x00000000030006f8": { + "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": "0x00000000030006f8", + "id": "Chip_Init", + "dec": 0, + "sumSize": 64 + }, + "anatrim.o": { + "objName": "anatrim.o", + "parent": "", + "path": "obj\\chip\\3061m\\chipinit\\anatrim", + "romSize": 1494, + "moduleName": "anatrim.o", + "componentName": "", + ".text": 1494, + ".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": 1498 + }, + "0x0000000003000738": { + "objName": "CalculateGain", + "parent": "anatrim.o", + "path": "", + "romSize": 42, + "moduleName": "anatrim.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": "0x0000000003000738", + "id": "CalculateGain", + "dec": 0, + "sumSize": 42 + }, + "0x0000000003000762": { + "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": "0x0000000003000762", + "id": "CHIP_GetInfo", + "dec": 0, + "sumSize": 74 + }, + "0x00000000030007ac": { + "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": "0x00000000030007ac", + "id": "CHIP_AnalogTrim", + "dec": 0, + "sumSize": 1292 + }, + "0x0000000003000cbc": { + "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": "0x0000000003000cbc", + "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 + }, + "0x0000000003000d0e": { + "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": "0x0000000003000d0e", + "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 + }, + "0x0000000003000d6c": { + "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": "0x0000000003000d6c", + "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": 7661, + ".debug_info": 0, + ".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 + }, + "0x0000000003000dae": { + "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": "0x0000000003000dae", + "id": "SetFlashDiv", + "dec": 0, + "sumSize": 146 + }, + "0x0000000003000e40": { + "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": "0x0000000003000e40", + "id": "GetFlashFreq", + "dec": 0, + "sumSize": 100 + }, + "0x0000000003000ea4": { + "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": "0x0000000003000ea4", + "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": 1190, + ".debug_info": 0, + ".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 + }, + "0x0000000003000f68": { + "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": "0x0000000003000f68", + "id": "SYSTICK_Init", + "dec": 0, + "sumSize": 34 + }, + "0x0000000003000f8a": { + "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": "0x0000000003000f8a", + "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": 5704, + ".debug_info": 0, + ".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 + }, + "0x0000000003000fa6": { + "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": "0x0000000003000fa6", + "id": "FOTP_CheckReadStatus", + "dec": 0, + "sumSize": 132 + }, + "0x000000000300102a": { + "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": "0x000000000300102a", + "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": 1059, + ".debug_info": 0, + ".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 + }, + "0x000000000300118c": { + "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": "0x000000000300118c", + "id": "GetCrgIpMatchInfo", + "dec": 0, + "sumSize": 100 + }, + "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": 504, + ".debug_info": 0, + ".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 + }, + "0x00000000030011f0": { + "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": "0x00000000030011f0", + "id": "AssertErrorLog", + "dec": 0, + "sumSize": 22 + }, + "clock.o": { + "objName": "clock.o", + "parent": "", + "path": "obj\\drivers\\base\\src", + "romSize": 304, + "moduleName": "clock.o", + "componentName": "", + ".text": 304, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2125, + ".debug_info": 0, + ".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": 304 + }, + "0x0000000003001206": { + "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": "0x0000000003001206", + "id": "DCL_SYSTICK_GetTick", + "dec": 0, + "sumSize": 20 + }, + "0x000000000300121a": { + "objName": "BASE_FUNC_DelayUs", + "parent": "clock.o", + "path": "", + "romSize": 90, + "moduleName": "clock.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": "0x000000000300121a", + "id": "BASE_FUNC_DelayUs", + "dec": 0, + "sumSize": 90 + }, + "0x0000000003001274": { + "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": "0x0000000003001274", + "id": "BASE_FUNC_DelayMs", + "dec": 0, + "sumSize": 56 + }, + "0x00000000030012ac": { + "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": "0x00000000030012ac", + "id": "BASE_FUNC_DelaySeconds", + "dec": 0, + "sumSize": 56 + }, + "0x00000000030012e4": { + "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": "0x00000000030012e4", + "id": "BASE_FUNC_Delay", + "dec": 0, + "sumSize": 82 + }, + "interrupt.o": { + "objName": "interrupt.o", + "parent": "", + "path": "obj\\drivers\\base\\src", + "romSize": 2464, + "moduleName": "interrupt.o", + "componentName": "", + ".text": 2464, + ".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": 8528, + ".debug_info": 0, + ".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": 2464 + }, + "0x0000000003001336": { + "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": "0x0000000003001336", + "id": "IRQ_ClearN", + "dec": 0, + "sumSize": 32 + }, + "0x0000000003001356": { + "objName": "InterruptEntry", + "parent": "interrupt.o", + "path": "", + "romSize": 60, + "moduleName": "interrupt.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": "0x0000000003001356", + "id": "InterruptEntry", + "dec": 0, + "sumSize": 60 + }, + "0x0000000003001392": { + "objName": "IRQ_Init", + "parent": "interrupt.o", + "path": "", + "romSize": 80, + "moduleName": "interrupt.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": "0x0000000003001392", + "id": "IRQ_Init", + "dec": 0, + "sumSize": 80 + }, + "0x00000000030013e2": { + "objName": "IRQ_Register", + "parent": "interrupt.o", + "path": "", + "romSize": 130, + "moduleName": "interrupt.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": "0x00000000030013e2", + "id": "IRQ_Register", + "dec": 0, + "sumSize": 130 + }, + "0x0000000003001464": { + "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": "0x0000000003001464", + "id": "IRQ_EnableN", + "dec": 0, + "sumSize": 302 + }, + "0x0000000003001592": { + "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": "0x0000000003001592", + "id": "SysErrPrint", + "dec": 0, + "sumSize": 18 + }, + "0x00000000030015a4": { + "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": "0x00000000030015a4", + "id": "SysErrFinish", + "dec": 0, + "sumSize": 14 + }, + "0x00000000030015b2": { + "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": "0x00000000030015b2", + "id": "SysErrExcEntry", + "dec": 0, + "sumSize": 30 + }, + "0x00000000030015d0": { + "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": "0x00000000030015d0", + "id": "SysErrNmiEntry", + "dec": 0, + "sumSize": 52 + }, + "0x0000000003001604": { + "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": "0x0000000003001604", + "id": "SetLocalIntNumPri", + "dec": 0, + "sumSize": 714 + }, + "0x00000000030018ce": { + "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": "0x00000000030018ce", + "id": "IRQ_SetLocalPriority", + "dec": 0, + "sumSize": 740 + }, + "0x0000000003001bb2": { + "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": "0x0000000003001bb2", + "id": "IRQ_SetPriority", + "dec": 0, + "sumSize": 116 + }, + "0x0000000003001c26": { + "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": "0x0000000003001c26", + "id": "IRQ_DummyHandler", + "dec": 0, + "sumSize": 18 + }, + "0x0000000003001c38": { + "objName": "IRQ_SetCallBack", + "parent": "interrupt.o", + "path": "", + "romSize": 62, + "moduleName": "interrupt.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": "0x0000000003001c38", + "id": "IRQ_SetCallBack", + "dec": 0, + "sumSize": 62 + }, + "crg.o": { + "objName": "crg.o", + "parent": "", + "path": "obj\\drivers\\crg\\src", + "romSize": 6142, + "moduleName": "crg.o", + "componentName": "", + ".text": 6142, + ".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": 29928, + ".debug_info": 0, + ".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": 6358 + }, + "0x0000000003001c76": { + "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": "0x0000000003001c76", + "id": "DCL_SYSCTRL_CrgWriteProtectionDisable", + "dec": 0, + "sumSize": 40 + }, + "0x0000000003001c9e": { + "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": "0x0000000003001c9e", + "id": "DCL_SYSCTRL_CrgWriteProtectionEnable", + "dec": 0, + "sumSize": 42 + }, + "0x0000000003001cc8": { + "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": "0x0000000003001cc8", + "id": "IsCrgPllRefClkSelect", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003001cf4": { + "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": "0x0000000003001cf4", + "id": "IsCrgPllPreDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001d10": { + "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": "0x0000000003001d10", + "id": "IsCrgPllPostDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001d2c": { + "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": "0x0000000003001d2c", + "id": "IsCrgPllPostDiv2", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001d48": { + "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": "0x0000000003001d48", + "id": "IsCrgPllFbDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001d64": { + "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": "0x0000000003001d64", + "id": "IsCrgCoreCkSel", + "dec": 0, + "sumSize": 54 + }, + "0x0000000003001d9a": { + "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": "0x0000000003001d9a", + "id": "IsCrg1MCkSel", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003001dc6": { + "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": "0x0000000003001dc6", + "id": "IsCrg1MCkDiv", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003001de2": { + "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": "0x0000000003001de2", + "id": "IsCrgValidPreDiv", + "dec": 0, + "sumSize": 94 + }, + "0x0000000003001e40": { + "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": "0x0000000003001e40", + "id": "IsCrgValidFdDiv", + "dec": 0, + "sumSize": 138 + }, + "0x0000000003001eca": { + "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": "0x0000000003001eca", + "id": "IsCrgValidPostDiv", + "dec": 0, + "sumSize": 72 + }, + "0x0000000003001f12": { + "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": "0x0000000003001f12", + "id": "IsCrgValidPostDiv2", + "dec": 0, + "sumSize": 72 + }, + "0x0000000003001f5a": { + "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": "0x0000000003001f5a", + "id": "IsCrgAdcClkModeSelect", + "dec": 0, + "sumSize": 64 + }, + "0x0000000003001f9a": { + "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": "0x0000000003001f9a", + "id": "IsCrgAdcClkDiv", + "dec": 0, + "sumSize": 64 + }, + "0x0000000003001fda": { + "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": "0x0000000003001fda", + "id": "DCL_CRG_SetCoreClkSel", + "dec": 0, + "sumSize": 112 + }, + "0x000000000300204e": { + "objName": "HAL_CRG_Init", + "parent": "crg.o", + "path": "", + "romSize": 704, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 704, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300204e", + "id": "HAL_CRG_Init", + "dec": 0, + "sumSize": 704 + }, + "0x000000000300230e": { + "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": "0x000000000300230e", + "id": "HAL_CRG_SetCoreClockSelect", + "dec": 0, + "sumSize": 142 + }, + "0x000000000300239c": { + "objName": "CRG_GetVcoFreq", + "parent": "crg.o", + "path": "", + "romSize": 144, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 144, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300239c", + "id": "CRG_GetVcoFreq", + "dec": 0, + "sumSize": 144 + }, + "0x000000000300242c": { + "objName": "HAL_CRG_GetPllFreq", + "parent": "crg.o", + "path": "", + "romSize": 104, + "moduleName": "crg.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": "0x000000000300242c", + "id": "HAL_CRG_GetPllFreq", + "dec": 0, + "sumSize": 104 + }, + "0x0000000003002494": { + "objName": "HAL_CRG_GetCoreClkFreq", + "parent": "crg.o", + "path": "", + "romSize": 146, + "moduleName": "crg.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": "0x0000000003002494", + "id": "HAL_CRG_GetCoreClkFreq", + "dec": 0, + "sumSize": 146 + }, + "0x0000000003002526": { + "objName": "HAL_CRG_GetIpFreq", + "parent": "crg.o", + "path": "", + "romSize": 222, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".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": "0x0000000003002526", + "id": "HAL_CRG_GetIpFreq", + "dec": 0, + "sumSize": 222 + }, + "0x0000000003002604": { + "objName": "HAL_CRG_IpEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 206, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 206, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003002604", + "id": "HAL_CRG_IpEnableSet", + "dec": 0, + "sumSize": 206 + }, + "0x00000000030026d2": { + "objName": "CRG_GetAdcIpFreq", + "parent": "crg.o", + "path": "", + "romSize": 282, + "moduleName": "crg.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": "0x00000000030026d2", + "id": "CRG_GetAdcIpFreq", + "dec": 0, + "sumSize": 282 + }, + "0x00000000030027ec": { + "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": "0x00000000030027ec", + "id": "CRG_IsValidPllConfig", + "dec": 0, + "sumSize": 194 + }, + "0x00000000030028ae": { + "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": "0x00000000030028ae", + "id": "CRG_IsValid1MHzConfig", + "dec": 0, + "sumSize": 82 + }, + "0x0000000003002900": { + "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": "0x0000000003002900", + "id": "CRG_GetPllRefIni", + "dec": 0, + "sumSize": 42 + }, + "0x000000000300292a": { + "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": "0x000000000300292a", + "id": "CRG_GetPreDivValue", + "dec": 0, + "sumSize": 46 + }, + "0x0000000003002958": { + "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": "0x0000000003002958", + "id": "CRG_GetPllFbDivValue", + "dec": 0, + "sumSize": 66 + }, + "0x000000000300299a": { + "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": "0x000000000300299a", + "id": "CRG_GetPllPostDivValue", + "dec": 0, + "sumSize": 58 + }, + "0x00000000030029d4": { + "objName": "CRG_IpWoClkSelEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 390, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 390, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030029d4", + "id": "CRG_IpWoClkSelEnableSet", + "dec": 0, + "sumSize": 390 + }, + "0x0000000003002b5a": { + "objName": "CRG_IpWoClkSelEnableGet", + "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": "0x0000000003002b5a", + "id": "CRG_IpWoClkSelEnableGet", + "dec": 0, + "sumSize": 128 + }, + "0x0000000003002bda": { + "objName": "CRG_IpWoClkSelResetSet", + "parent": "crg.o", + "path": "", + "romSize": 258, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 258, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003002bda", + "id": "CRG_IpWoClkSelResetSet", + "dec": 0, + "sumSize": 258 + }, + "0x0000000003002cdc": { + "objName": "CRG_IpWoClkSelResetGet", + "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": "0x0000000003002cdc", + "id": "CRG_IpWoClkSelResetGet", + "dec": 0, + "sumSize": 130 + }, + "0x0000000003002d5e": { + "objName": "CRG_AdcEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 174, + "moduleName": "crg.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": "0x0000000003002d5e", + "id": "CRG_AdcEnableSet", + "dec": 0, + "sumSize": 174 + }, + "0x0000000003002e10": { + "objName": "CRG_AdcEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 118, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 118, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003002e10", + "id": "CRG_AdcEnableGet", + "dec": 0, + "sumSize": 118 + }, + "0x0000000003002e86": { + "objName": "CRG_AdcClkSelectSet", + "parent": "crg.o", + "path": "", + "romSize": 238, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 238, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003002e86", + "id": "CRG_AdcClkSelectSet", + "dec": 0, + "sumSize": 238 + }, + "0x0000000003002f74": { + "objName": "CRG_AdcClkSelectGet", + "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": "0x0000000003002f74", + "id": "CRG_AdcClkSelectGet", + "dec": 0, + "sumSize": 130 + }, + "0x0000000003002ff6": { + "objName": "CRG_AdcDivSet", + "parent": "crg.o", + "path": "", + "romSize": 208, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 208, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003002ff6", + "id": "CRG_AdcDivSet", + "dec": 0, + "sumSize": 208 + }, + "0x00000000030030c6": { + "objName": "CRG_AdcDivGet", + "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": "0x00000000030030c6", + "id": "CRG_AdcDivGet", + "dec": 0, + "sumSize": 142 + }, + "0x0000000003003154": { + "objName": "CRG_EfcEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 120, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 120, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003154", + "id": "CRG_EfcEnableSet", + "dec": 0, + "sumSize": 120 + }, + "0x00000000030031cc": { + "objName": "CRG_EfcEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 102, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 102, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030031cc", + "id": "CRG_EfcEnableGet", + "dec": 0, + "sumSize": 102 + }, + "0x0000000003003232": { + "objName": "CRG_AnaEnableSet", + "parent": "crg.o", + "path": "", + "romSize": 356, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 356, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003232", + "id": "CRG_AnaEnableSet", + "dec": 0, + "sumSize": 356 + }, + "0x0000000003003396": { + "objName": "CRG_AnaEnableGet", + "parent": "crg.o", + "path": "", + "romSize": 118, + "moduleName": "crg.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 118, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003396", + "id": "CRG_AnaEnableGet", + "dec": 0, + "sumSize": 118 + }, + "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": 20168, + ".debug_info": 0, + ".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 + }, + "0x000000000300340c": { + "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": "0x000000000300340c", + "id": "DBG_PrintCh", + "dec": 0, + "sumSize": 66 + }, + "0x000000000300344e": { + "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": "0x000000000300344e", + "id": "DBG_PrintStr", + "dec": 0, + "sumSize": 74 + }, + "0x0000000003003498": { + "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": "0x0000000003003498", + "id": "DBG_Pow", + "dec": 0, + "sumSize": 64 + }, + "0x00000000030034d8": { + "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": "0x00000000030034d8", + "id": "DBG_CountDigits", + "dec": 0, + "sumSize": 104 + }, + "0x0000000003003540": { + "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": "0x0000000003003540", + "id": "DBG_PutUnsignedNum", + "dec": 0, + "sumSize": 178 + }, + "0x00000000030035f2": { + "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": "0x00000000030035f2", + "id": "DBG_PrintInt", + "dec": 0, + "sumSize": 94 + }, + "0x0000000003003650": { + "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": "0x0000000003003650", + "id": "DBG_PrintHex", + "dec": 0, + "sumSize": 68 + }, + "0x0000000003003694": { + "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": "0x0000000003003694", + "id": "DBG_PrintFlt", + "dec": 0, + "sumSize": 316 + }, + "0x00000000030037d0": { + "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": "0x00000000030037d0", + "id": "ParseSpecifier", + "dec": 0, + "sumSize": 412 + }, + "0x000000000300396c": { + "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": "0x000000000300396c", + "id": "DBG_PrintIntWithField", + "dec": 0, + "sumSize": 282 + }, + "0x0000000003003a86": { + "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": "0x0000000003003a86", + "id": "DBG_Atoi", + "dec": 0, + "sumSize": 106 + }, + "0x0000000003003af0": { + "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": "0x0000000003003af0", + "id": "DBG_UartPrintf", + "dec": 0, + "sumSize": 360 + }, + "gpio.o": { + "objName": "gpio.o", + "parent": "", + "path": "obj\\drivers\\gpio\\src", + "romSize": 4007, + "moduleName": "gpio.o", + "componentName": "", + ".text": 4007, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7584, + ".debug_info": 4102, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "gpio.o", + "id": "gpio.o", + "dec": 0, + "sumSize": 4007 + }, + "0x0000000003003c58": { + "objName": "IsGpioValue", + "parent": "gpio.o", + "path": "", + "romSize": 44, + "moduleName": "gpio.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": "0x0000000003003c58", + "id": "IsGpioValue", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003003c84": { + "objName": "IsGpioDirection", + "parent": "gpio.o", + "path": "", + "romSize": 44, + "moduleName": "gpio.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": "0x0000000003003c84", + "id": "IsGpioDirection", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003003cb0": { + "objName": "IsGpioPins", + "parent": "gpio.o", + "path": "", + "romSize": 48, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 48, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003cb0", + "id": "IsGpioPins", + "dec": 0, + "sumSize": 48 + }, + "0x0000000003003ce0": { + "objName": "IsGpioPin", + "parent": "gpio.o", + "path": "", + "romSize": 126, + "moduleName": "gpio.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": "0x0000000003003ce0", + "id": "IsGpioPin", + "dec": 0, + "sumSize": 126 + }, + "0x0000000003003d5e": { + "objName": "IsGpioITMode", + "parent": "gpio.o", + "path": "", + "romSize": 84, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 84, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003d5e", + "id": "IsGpioITMode", + "dec": 0, + "sumSize": 84 + }, + "0x0000000003003db2": { + "objName": "DCL_GPIO_SetValue", + "parent": "gpio.o", + "path": "", + "romSize": 212, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 212, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003db2", + "id": "DCL_GPIO_SetValue", + "dec": 0, + "sumSize": 212 + }, + "0x0000000003003e86": { + "objName": "DCL_GPIO_SetDirection", + "parent": "gpio.o", + "path": "", + "romSize": 246, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 246, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003003e86", + "id": "DCL_GPIO_SetDirection", + "dec": 0, + "sumSize": 246 + }, + "0x0000000003003f7c": { + "objName": "DCL_GPIO_ClearIrq", + "parent": "gpio.o", + "path": "", + "romSize": 166, + "moduleName": "gpio.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": "0x0000000003003f7c", + "id": "DCL_GPIO_ClearIrq", + "dec": 0, + "sumSize": 166 + }, + "0x0000000003004022": { + "objName": "DCL_GPIO_EnableIrq", + "parent": "gpio.o", + "path": "", + "romSize": 176, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 176, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003004022", + "id": "DCL_GPIO_EnableIrq", + "dec": 0, + "sumSize": 176 + }, + "0x00000000030040d2": { + "objName": "DCL_GPIO_DisableIrq", + "parent": "gpio.o", + "path": "", + "romSize": 170, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 170, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030040d2", + "id": "DCL_GPIO_DisableIrq", + "dec": 0, + "sumSize": 170 + }, + "0x000000000300417c": { + "objName": "DCL_GPIO_GetMIS", + "parent": "gpio.o", + "path": "", + "romSize": 122, + "moduleName": "gpio.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": "0x000000000300417c", + "id": "DCL_GPIO_GetMIS", + "dec": 0, + "sumSize": 122 + }, + "0x00000000030041f6": { + "objName": "HAL_GPIO_Init", + "parent": "gpio.o", + "path": "", + "romSize": 230, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 230, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030041f6", + "id": "HAL_GPIO_Init", + "dec": 0, + "sumSize": 230 + }, + "0x00000000030042dc": { + "objName": "HAL_GPIO_SetDirection", + "parent": "gpio.o", + "path": "", + "romSize": 232, + "moduleName": "gpio.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": "0x00000000030042dc", + "id": "HAL_GPIO_SetDirection", + "dec": 0, + "sumSize": 232 + }, + "0x00000000030043c4": { + "objName": "HAL_GPIO_SetValue", + "parent": "gpio.o", + "path": "", + "romSize": 234, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 234, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030043c4", + "id": "HAL_GPIO_SetValue", + "dec": 0, + "sumSize": 234 + }, + "0x00000000030044b2": { + "objName": "HAL_GPIO_GetPinValue", + "parent": "gpio.o", + "path": "", + "romSize": 204, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 204, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030044b2", + "id": "HAL_GPIO_GetPinValue", + "dec": 0, + "sumSize": 204 + }, + "0x000000000300457e": { + "objName": "GPIO_SetLevelIrqType", + "parent": "gpio.o", + "path": "", + "romSize": 150, + "moduleName": "gpio.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": "0x000000000300457e", + "id": "GPIO_SetLevelIrqType", + "dec": 0, + "sumSize": 150 + }, + "0x0000000003004614": { + "objName": "GPIO_SetEdgeIrqType", + "parent": "gpio.o", + "path": "", + "romSize": 154, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 154, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003004614", + "id": "GPIO_SetEdgeIrqType", + "dec": 0, + "sumSize": 154 + }, + "0x00000000030046ae": { + "objName": "HAL_GPIO_SetIrqType", + "parent": "gpio.o", + "path": "", + "romSize": 526, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 526, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030046ae", + "id": "HAL_GPIO_SetIrqType", + "dec": 0, + "sumSize": 526 + }, + "0x00000000030048bc": { + "objName": "GPIO_ExcuteCallBack", + "parent": "gpio.o", + "path": "", + "romSize": 264, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 264, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030048bc", + "id": "GPIO_ExcuteCallBack", + "dec": 0, + "sumSize": 264 + }, + "0x00000000030049c4": { + "objName": "HAL_GPIO_IrqHandler", + "parent": "gpio.o", + "path": "", + "romSize": 266, + "moduleName": "gpio.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": "0x00000000030049c4", + "id": "HAL_GPIO_IrqHandler", + "dec": 0, + "sumSize": 266 + }, + "0x0000000003004ace": { + "objName": "HAL_GPIO_RegisterCallBack", + "parent": "gpio.o", + "path": "", + "romSize": 250, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 250, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003004ace", + "id": "HAL_GPIO_RegisterCallBack", + "dec": 0, + "sumSize": 250 + }, + "gpt.o": { + "objName": "gpt.o", + "parent": "", + "path": "obj\\drivers\\gpt\\src", + "romSize": 1611, + "moduleName": "gpt.o", + "componentName": "", + ".text": 1611, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7343, + ".debug_info": 4503, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "gpt.o", + "id": "gpt.o", + "dec": 0, + "sumSize": 1611 + }, + "0x0000000003004bc8": { + "objName": "IsGptPwmNum", + "parent": "gpt.o", + "path": "", + "romSize": 28, + "moduleName": "gpt.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": "0x0000000003004bc8", + "id": "IsGptPwmNum", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003004be4": { + "objName": "IsGptDiv", + "parent": "gpt.o", + "path": "", + "romSize": 30, + "moduleName": "gpt.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": "0x0000000003004be4", + "id": "IsGptDiv", + "dec": 0, + "sumSize": 30 + }, + "0x0000000003004c02": { + "objName": "IsGptPeriod", + "parent": "gpt.o", + "path": "", + "romSize": 48, + "moduleName": "gpt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 48, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003004c02", + "id": "IsGptPeriod", + "dec": 0, + "sumSize": 48 + }, + "0x0000000003004c32": { + "objName": "IsGptRefDot", + "parent": "gpt.o", + "path": "", + "romSize": 30, + "moduleName": "gpt.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": "0x0000000003004c32", + "id": "IsGptRefDot", + "dec": 0, + "sumSize": 30 + }, + "0x0000000003004c50": { + "objName": "IsGptAction", + "parent": "gpt.o", + "path": "", + "romSize": 28, + "moduleName": "gpt.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": "0x0000000003004c50", + "id": "IsGptAction", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003004c6c": { + "objName": "HAL_GPT_Init", + "parent": "gpt.o", + "path": "", + "romSize": 142, + "moduleName": "gpt.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": "0x0000000003004c6c", + "id": "HAL_GPT_Init", + "dec": 0, + "sumSize": 142 + }, + "0x0000000003004cfa": { + "objName": "HAL_GPT_Start", + "parent": "gpt.o", + "path": "", + "romSize": 142, + "moduleName": "gpt.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": "0x0000000003004cfa", + "id": "HAL_GPT_Start", + "dec": 0, + "sumSize": 142 + }, + "0x0000000003004d88": { + "objName": "HAL_GPT_Stop", + "parent": "gpt.o", + "path": "", + "romSize": 140, + "moduleName": "gpt.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": "0x0000000003004d88", + "id": "HAL_GPT_Stop", + "dec": 0, + "sumSize": 140 + }, + "0x0000000003004e14": { + "objName": "HAL_GPT_Config", + "parent": "gpt.o", + "path": "", + "romSize": 780, + "moduleName": "gpt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 780, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003004e14", + "id": "HAL_GPT_Config", + "dec": 0, + "sumSize": 780 + }, + "0x0000000003005120": { + "objName": "HAL_GPT_GetReferCounterAndAction", + "parent": "gpt.o", + "path": "", + "romSize": 218, + "moduleName": "gpt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 218, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003005120", + "id": "HAL_GPT_GetReferCounterAndAction", + "dec": 0, + "sumSize": 218 + }, + "i2c.o": { + "objName": "i2c.o", + "parent": "", + "path": "obj\\drivers\\i2c\\src", + "romSize": 1817, + "moduleName": "i2c.o", + "componentName": "", + ".text": 1817, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 20050, + ".debug_info": 14474, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "i2c.o", + "id": "i2c.o", + "dec": 0, + "sumSize": 1817 + }, + "0x00000000030051fe": { + "objName": "IsI2cFunctionMode", + "parent": "i2c.o", + "path": "", + "romSize": 64, + "moduleName": "i2c.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": "0x00000000030051fe", + "id": "IsI2cFunctionMode", + "dec": 0, + "sumSize": 64 + }, + "0x000000000300523e": { + "objName": "IsI2cAddressMode", + "parent": "i2c.o", + "path": "", + "romSize": 44, + "moduleName": "i2c.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": "0x000000000300523e", + "id": "IsI2cAddressMode", + "dec": 0, + "sumSize": 44 + }, + "0x000000000300526a": { + "objName": "IsI2cSdaHoldTime", + "parent": "i2c.o", + "path": "", + "romSize": 30, + "moduleName": "i2c.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": "0x000000000300526a", + "id": "IsI2cSdaHoldTime", + "dec": 0, + "sumSize": 30 + }, + "0x0000000003005288": { + "objName": "IsI2cGeneralCallMode", + "parent": "i2c.o", + "path": "", + "romSize": 44, + "moduleName": "i2c.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": "0x0000000003005288", + "id": "IsI2cGeneralCallMode", + "dec": 0, + "sumSize": 44 + }, + "0x00000000030052b4": { + "objName": "IsI2cOwnAddressOrMask", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x00000000030052b4", + "id": "IsI2cOwnAddressOrMask", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030052d0": { + "objName": "IsXMBusAddressOrMask", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x00000000030052d0", + "id": "IsXMBusAddressOrMask", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030052ec": { + "objName": "IsXMBusAddressEnable", + "parent": "i2c.o", + "path": "", + "romSize": 44, + "moduleName": "i2c.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": "0x00000000030052ec", + "id": "IsXMBusAddressEnable", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003005318": { + "objName": "IsI2cSpikeFilterTime", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x0000000003005318", + "id": "IsI2cSpikeFilterTime", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003005334": { + "objName": "IsI2cFreq", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x0000000003005334", + "id": "IsI2cFreq", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003005350": { + "objName": "IsI2cIgnoreAckFlag", + "parent": "i2c.o", + "path": "", + "romSize": 44, + "moduleName": "i2c.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": "0x0000000003005350", + "id": "IsI2cIgnoreAckFlag", + "dec": 0, + "sumSize": 44 + }, + "0x000000000300537c": { + "objName": "IsI2cTxWaterMark", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x000000000300537c", + "id": "IsI2cTxWaterMark", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003005398": { + "objName": "IsI2cRxWaterMark", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x0000000003005398", + "id": "IsI2cRxWaterMark", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030053b4": { + "objName": "IsI2cSdaDelayTime", + "parent": "i2c.o", + "path": "", + "romSize": 28, + "moduleName": "i2c.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": "0x00000000030053b4", + "id": "IsI2cSdaDelayTime", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030053d0": { + "objName": "CheckAllInitParameters", + "parent": "i2c.o", + "path": "", + "romSize": 588, + "moduleName": "i2c.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 588, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030053d0", + "id": "CheckAllInitParameters", + "dec": 0, + "sumSize": 588 + }, + "0x000000000300561c": { + "objName": "HAL_I2C_Init", + "parent": "i2c.o", + "path": "", + "romSize": 738, + "moduleName": "i2c.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 738, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300561c", + "id": "HAL_I2C_Init", + "dec": 0, + "sumSize": 738 + }, + "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 + }, + "0x00000000030058fe": { + "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": "0x00000000030058fe", + "id": "DCL_IOCMG_SetRegValue", + "dec": 0, + "sumSize": 68 + }, + "0x0000000003005942": { + "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": "0x0000000003005942", + "id": "DCL_IOCMG_SetDriveRate", + "dec": 0, + "sumSize": 110 + }, + "0x00000000030059b0": { + "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": "0x00000000030059b0", + "id": "DCL_IOCMG_SetPullMode", + "dec": 0, + "sumSize": 140 + }, + "0x0000000003005a3c": { + "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": "0x0000000003005a3c", + "id": "DCL_IOCMG_SetLevelShiftRate", + "dec": 0, + "sumSize": 110 + }, + "0x0000000003005aaa": { + "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": "0x0000000003005aaa", + "id": "DCL_IOCMG_SetSchmidtMode", + "dec": 0, + "sumSize": 110 + }, + "0x0000000003005b18": { + "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": "0x0000000003005b18", + "id": "IOCMG_GetRegAddr", + "dec": 0, + "sumSize": 82 + }, + "0x0000000003005b6a": { + "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": "0x0000000003005b6a", + "id": "HAL_IOCMG_SetPinAltFuncMode", + "dec": 0, + "sumSize": 58 + }, + "0x0000000003005ba4": { + "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": "0x0000000003005ba4", + "id": "HAL_IOCMG_SetPinPullMode", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003005bf0": { + "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": "0x0000000003005bf0", + "id": "HAL_IOCMG_SetPinSchmidtMode", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003005c3c": { + "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": "0x0000000003005c3c", + "id": "HAL_IOCMG_SetPinLevelShiftRate", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003005c88": { + "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": "0x0000000003005c88", + "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": 5104, + ".debug_info": 2060, + ".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 + }, + "0x0000000003005cd4": { + "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": "0x0000000003005cd4", + "id": "IsTimerMode", + "dec": 0, + "sumSize": 54 + }, + "0x0000000003005d0a": { + "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": "0x0000000003005d0a", + "id": "IsTimerInterruptType", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003005d36": { + "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": "0x0000000003005d36", + "id": "IsTimerSize", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003005d62": { + "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": "0x0000000003005d62", + "id": "IsTimerPeriod", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003005d7e": { + "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": "0x0000000003005d7e", + "id": "IsTimerDiv", + "dec": 0, + "sumSize": 54 + }, + "0x0000000003005db4": { + "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": "0x0000000003005db4", + "id": "HAL_TIMER_Init", + "dec": 0, + "sumSize": 594 + }, + "0x000000000300600a": { + "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": "0x000000000300600a", + "id": "HAL_TIMER_Start", + "dec": 0, + "sumSize": 130 + }, + "0x000000000300608c": { + "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": "0x000000000300608c", + "id": "HAL_TIMER_IrqHandler", + "dec": 0, + "sumSize": 232 + }, + "0x0000000003006174": { + "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": "0x0000000003006174", + "id": "HAL_TIMER_RegisterCallback", + "dec": 0, + "sumSize": 148 + }, + "uart.o": { + "objName": "uart.o", + "parent": "", + "path": "obj\\drivers\\uart\\src", + "romSize": 3413, + "moduleName": "uart.o", + "componentName": "", + ".text": 3413, + ".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": 10087, + ".debug_info": 11856, + ".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": 3413 + }, + "0x0000000003006208": { + "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": "0x0000000003006208", + "id": "IsUartDatalength", + "dec": 0, + "sumSize": 28 + }, + "0x0000000003006224": { + "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": "0x0000000003006224", + "id": "IsUartStopbits", + "dec": 0, + "sumSize": 44 + }, + "0x0000000003006250": { + "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": "0x0000000003006250", + "id": "IsUartParitymode", + "dec": 0, + "sumSize": 34 + }, + "0x0000000003006272": { + "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": "0x0000000003006272", + "id": "IsUartTransmode", + "dec": 0, + "sumSize": 60 + }, + "0x00000000030062ae": { + "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": "0x00000000030062ae", + "id": "IsUartFIFOThreshold", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030062ca": { + "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": "0x00000000030062ca", + "id": "IsUartOversampleMultiple", + "dec": 0, + "sumSize": 28 + }, + "0x00000000030062e6": { + "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": "0x00000000030062e6", + "id": "DivClosest", + "dec": 0, + "sumSize": 62 + }, + "0x0000000003006324": { + "objName": "BaudDetectCallBack", + "parent": "uart.o", + "path": "", + "romSize": 220, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 220, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003006324", + "id": "BaudDetectCallBack", + "dec": 0, + "sumSize": 220 + }, + "0x0000000003006400": { + "objName": "CharterMatchCallBack", + "parent": "uart.o", + "path": "", + "romSize": 76, + "moduleName": "uart.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": "0x0000000003006400", + "id": "CharterMatchCallBack", + "dec": 0, + "sumSize": 76 + }, + "0x000000000300644c": { + "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": "0x000000000300644c", + "id": "UART_SetParityBit", + "dec": 0, + "sumSize": 150 + }, + "0x00000000030064e2": { + "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": "0x00000000030064e2", + "id": "HAL_UART_Init", + "dec": 0, + "sumSize": 958 + }, + "0x00000000030068a0": { + "objName": "WriteITCallBack", + "parent": "uart.o", + "path": "", + "romSize": 338, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 338, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030068a0", + "id": "WriteITCallBack", + "dec": 0, + "sumSize": 338 + }, + "0x00000000030069f2": { + "objName": "ReadITCallBack", + "parent": "uart.o", + "path": "", + "romSize": 354, + "moduleName": "uart.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": "0x00000000030069f2", + "id": "ReadITCallBack", + "dec": 0, + "sumSize": 354 + }, + "0x0000000003006b54": { + "objName": "ErrorServiceCallback", + "parent": "uart.o", + "path": "", + "romSize": 330, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 330, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003006b54", + "id": "ErrorServiceCallback", + "dec": 0, + "sumSize": 330 + }, + "0x0000000003006c9e": { + "objName": "HAL_UART_IrqHandler", + "parent": "uart.o", + "path": "", + "romSize": 350, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 350, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003006c9e", + "id": "HAL_UART_IrqHandler", + "dec": 0, + "sumSize": 350 + }, + "0x0000000003006dfc": { + "objName": "HAL_UART_RegisterCallBack", + "parent": "uart.o", + "path": "", + "romSize": 270, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 270, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003006dfc", + "id": "HAL_UART_RegisterCallBack", + "dec": 0, + "sumSize": 270 + }, + "main.o": { + "objName": "main.o", + "parent": "", + "path": "obj\\user", + "romSize": 1434, + "moduleName": "main.o", + "componentName": "", + ".text": 1434, + ".data": 4, + ".bss": 835, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2929, + ".debug_info": 20587, + ".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": 1438 + }, + "0x0000000003006f0e": { + "objName": "UART0ReadInterruptCallback", + "parent": "main.o", + "path": "", + "romSize": 34, + "moduleName": "main.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": "0x0000000003006f0e", + "id": "UART0ReadInterruptCallback", + "dec": 0, + "sumSize": 34 + }, + "0x0000000003006f30": { + "objName": "TIMER0_InterruptProcess", + "parent": "main.o", + "path": "", + "romSize": 112, + "moduleName": "main.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": "0x0000000003006f30", + "id": "TIMER0_InterruptProcess", + "dec": 0, + "sumSize": 112 + }, + "0x0000000003006fa0": { + "objName": "GPIO1_1_CallbackFunc", + "parent": "main.o", + "path": "", + "romSize": 38, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 38, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003006fa0", + "id": "GPIO1_1_CallbackFunc", + "dec": 0, + "sumSize": 38 + }, + "0x0000000003006fc6": { + "objName": "GPIO1_4_CallbackFunc", + "parent": "main.o", + "path": "", + "romSize": 38, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 38, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003006fc6", + "id": "GPIO1_4_CallbackFunc", + "dec": 0, + "sumSize": 38 + }, + "0x0000000003006fec": { + "objName": "UART0_InterruptTxInit", + "parent": "main.o", + "path": "", + "romSize": 94, + "moduleName": "main.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": "0x0000000003006fec", + "id": "UART0_InterruptTxInit", + "dec": 0, + "sumSize": 94 + }, + "0x000000000300704a": { + "objName": "GetNumFromStr", + "parent": "main.o", + "path": "", + "romSize": 80, + "moduleName": "main.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": "0x000000000300704a", + "id": "GetNumFromStr", + "dec": 0, + "sumSize": 80 + }, + "0x000000000300709a": { + "objName": "main", + "parent": "main.o", + "path": "", + "romSize": 778, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 778, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300709a", + "id": "main", + "dec": 0, + "sumSize": 778 + }, + "system_init.o": { + "objName": "system_init.o", + "parent": "", + "path": "obj\\user\\generatecode", + "romSize": 2772, + "moduleName": "system_init.o", + "componentName": "", + ".text": 2772, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4066, + ".debug_info": 32940, + ".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": 2772 + }, + "0x00000000030073b0": { + "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": "0x00000000030073b0", + "id": "CRG_Config", + "dec": 0, + "sumSize": 106 + }, + "0x000000000300741a": { + "objName": "GPIO_Init", + "parent": "system_init.o", + "path": "", + "romSize": 536, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 536, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300741a", + "id": "GPIO_Init", + "dec": 0, + "sumSize": 536 + }, + "0x0000000003007642": { + "objName": "GPT1_Init", + "parent": "system_init.o", + "path": "", + "romSize": 146, + "moduleName": "system_init.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": "0x0000000003007642", + "id": "GPT1_Init", + "dec": 0, + "sumSize": 146 + }, + "0x00000000030076d4": { + "objName": "GPT2_Init", + "parent": "system_init.o", + "path": "", + "romSize": 146, + "moduleName": "system_init.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": "0x00000000030076d4", + "id": "GPT2_Init", + "dec": 0, + "sumSize": 146 + }, + "0x0000000003007766": { + "objName": "GPT3_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": "0x0000000003007766", + "id": "GPT3_Init", + "dec": 0, + "sumSize": 152 + }, + "0x0000000003007802": { + "objName": "TIMER0_Init", + "parent": "system_init.o", + "path": "", + "romSize": 204, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 204, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003007802", + "id": "TIMER0_Init", + "dec": 0, + "sumSize": 204 + }, + "0x00000000030078d2": { + "objName": "UART0WriteInterruptCallback", + "parent": "system_init.o", + "path": "", + "romSize": 18, + "moduleName": "system_init.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": "0x00000000030078d2", + "id": "UART0WriteInterruptCallback", + "dec": 0, + "sumSize": 18 + }, + "0x00000000030078e4": { + "objName": "UART0_Init", + "parent": "system_init.o", + "path": "", + "romSize": 208, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 208, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030078e4", + "id": "UART0_Init", + "dec": 0, + "sumSize": 208 + }, + "0x00000000030079c0": { + "objName": "I2C0_Init", + "parent": "system_init.o", + "path": "", + "romSize": 134, + "moduleName": "system_init.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": "0x00000000030079c0", + "id": "I2C0_Init", + "dec": 0, + "sumSize": 134 + }, + "0x0000000003007a46": { + "objName": "IOConfig", + "parent": "system_init.o", + "path": "", + "romSize": 1084, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 1084, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003007a46", + "id": "IOConfig", + "dec": 0, + "sumSize": 1084 + }, + "0x0000000003007e96": { + "objName": "SystemInit", + "parent": "system_init.o", + "path": "", + "romSize": 38, + "moduleName": "system_init.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 38, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003007e96", + "id": "SystemInit", + "dec": 0, + "sumSize": 38 + }, + "mycar_control.o": { + "objName": "mycar_control.o", + "parent": "", + "path": "obj\\user\\mycar\\src", + "romSize": 1530, + "moduleName": "mycar_control.o", + "componentName": "", + ".text": 1530, + ".data": 12, + ".bss": 24, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3413, + ".debug_info": 20670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "mycar_control.o", + "id": "mycar_control.o", + "dec": 0, + "sumSize": 1542 + }, + "0x0000000003007ebc": { + "objName": "MotorStatus", + "parent": "mycar_control.o", + "path": "", + "romSize": 180, + "moduleName": "mycar_control.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 180, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003007ebc", + "id": "MotorStatus", + "dec": 0, + "sumSize": 180 + }, + "0x0000000003007f74": { + "objName": "ChangeCarApt", + "parent": "mycar_control.o", + "path": "", + "romSize": 146, + "moduleName": "mycar_control.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": "0x0000000003007f74", + "id": "ChangeCarApt", + "dec": 0, + "sumSize": 146 + }, + "0x0000000003008006": { + "objName": "SynTwoMotorSpeed", + "parent": "mycar_control.o", + "path": "", + "romSize": 474, + "moduleName": "mycar_control.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 474, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003008006", + "id": "SynTwoMotorSpeed", + "dec": 0, + "sumSize": 474 + }, + "0x00000000030081e0": { + "objName": "SetCarAptAndStart", + "parent": "mycar_control.o", + "path": "", + "romSize": 186, + "moduleName": "mycar_control.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 186, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030081e0", + "id": "SetCarAptAndStart", + "dec": 0, + "sumSize": 186 + }, + "0x000000000300829e": { + "objName": "CarWorkStatus", + "parent": "mycar_control.o", + "path": "", + "romSize": 110, + "moduleName": "mycar_control.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": "0x000000000300829e", + "id": "CarWorkStatus", + "dec": 0, + "sumSize": 110 + }, + "0x000000000300830c": { + "objName": "TurnLeft", + "parent": "mycar_control.o", + "path": "", + "romSize": 64, + "moduleName": "mycar_control.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": "0x000000000300830c", + "id": "TurnLeft", + "dec": 0, + "sumSize": 64 + }, + "0x000000000300834c": { + "objName": "TurnRight", + "parent": "mycar_control.o", + "path": "", + "romSize": 64, + "moduleName": "mycar_control.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": "0x000000000300834c", + "id": "TurnRight", + "dec": 0, + "sumSize": 64 + }, + "0x000000000300838c": { + "objName": "Retreat", + "parent": "mycar_control.o", + "path": "", + "romSize": 50, + "moduleName": "mycar_control.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 50, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300838c", + "id": "Retreat", + "dec": 0, + "sumSize": 50 + }, + "0x00000000030083be": { + "objName": "ClockwiseMotor", + "parent": "mycar_control.o", + "path": "", + "romSize": 58, + "moduleName": "mycar_control.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": "0x00000000030083be", + "id": "ClockwiseMotor", + "dec": 0, + "sumSize": 58 + }, + "0x00000000030083f8": { + "objName": "AnticlockwiseMotor", + "parent": "mycar_control.o", + "path": "", + "romSize": 58, + "moduleName": "mycar_control.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": "0x00000000030083f8", + "id": "AnticlockwiseMotor", + "dec": 0, + "sumSize": 58 + }, + "0x0000000003008436": { + "objName": "Come", + "parent": "mycar_control.o", + "path": "", + "romSize": 46, + "moduleName": "mycar_control.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": "0x0000000003008436", + "id": "Come", + "dec": 0, + "sumSize": 46 + }, + "0x0000000003008464": { + "objName": "AsGuard", + "parent": "mycar_control.o", + "path": "", + "romSize": 90, + "moduleName": "mycar_control.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": "0x0000000003008464", + "id": "AsGuard", + "dec": 0, + "sumSize": 90 + }, + "vl53l0x_api.o": { + "objName": "vl53l0x_api.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\core\\src", + "romSize": 8476, + "moduleName": "vl53l0x_api.o", + "componentName": "", + ".text": 8476, + ".data": 681, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 22225, + ".debug_info": 30629, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x_api.o", + "id": "vl53l0x_api.o", + "dec": 0, + "sumSize": 9157 + }, + "0x00000000030084c2": { + "objName": "VL53L0X_GetOffsetCalibrationDataMicroMeter", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 52, + "moduleName": "vl53l0x_api.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": "0x00000000030084c2", + "id": "VL53L0X_GetOffsetCalibrationDataMicroMeter", + "dec": 0, + "sumSize": 52 + }, + "0x00000000030084f6": { + "objName": "VL53L0X_SetDeviceAddress", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 62, + "moduleName": "vl53l0x_api.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": "0x00000000030084f6", + "id": "VL53L0X_SetDeviceAddress", + "dec": 0, + "sumSize": 62 + }, + "0x0000000003008534": { + "objName": "VL53L0X_DataInit", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 832, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 832, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003008534", + "id": "VL53L0X_DataInit", + "dec": 0, + "sumSize": 832 + }, + "0x000000000300887c": { + "objName": "VL53L0X_StaticInit", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 808, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 808, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300887c", + "id": "VL53L0X_StaticInit", + "dec": 0, + "sumSize": 808 + }, + "0x0000000003008ba8": { + "objName": "VL53L0X_GetDeviceParameters", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 450, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 450, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003008ba8", + "id": "VL53L0X_GetDeviceParameters", + "dec": 0, + "sumSize": 450 + }, + "0x0000000003008d6a": { + "objName": "VL53L0X_SetDeviceMode", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 78, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 78, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003008d6a", + "id": "VL53L0X_SetDeviceMode", + "dec": 0, + "sumSize": 78 + }, + "0x0000000003008db8": { + "objName": "VL53L0X_GetDeviceMode", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 42, + "moduleName": "vl53l0x_api.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": "0x0000000003008db8", + "id": "VL53L0X_GetDeviceMode", + "dec": 0, + "sumSize": 42 + }, + "0x0000000003008de2": { + "objName": "VL53L0X_GetFractionEnable", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 76, + "moduleName": "vl53l0x_api.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": "0x0000000003008de2", + "id": "VL53L0X_GetFractionEnable", + "dec": 0, + "sumSize": 76 + }, + "0x0000000003008e2e": { + "objName": "VL53L0X_SetMeasurementTimingBudgetMicroSeconds", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 52, + "moduleName": "vl53l0x_api.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": "0x0000000003008e2e", + "id": "VL53L0X_SetMeasurementTimingBudgetMicroSeconds", + "dec": 0, + "sumSize": 52 + }, + "0x0000000003008e62": { + "objName": "VL53L0X_GetMeasurementTimingBudgetMicroSeconds", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 52, + "moduleName": "vl53l0x_api.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": "0x0000000003008e62", + "id": "VL53L0X_GetMeasurementTimingBudgetMicroSeconds", + "dec": 0, + "sumSize": 52 + }, + "0x0000000003008e96": { + "objName": "VL53L0X_GetVcselPulsePeriod", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 64, + "moduleName": "vl53l0x_api.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": "0x0000000003008e96", + "id": "VL53L0X_GetVcselPulsePeriod", + "dec": 0, + "sumSize": 64 + }, + "0x0000000003008ed6": { + "objName": "VL53L0X_SetSequenceStepEnable", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 388, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 388, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003008ed6", + "id": "VL53L0X_SetSequenceStepEnable", + "dec": 0, + "sumSize": 388 + }, + "0x000000000300905a": { + "objName": "sequence_step_enabled", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 192, + "moduleName": "vl53l0x_api.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": "0x000000000300905a", + "id": "sequence_step_enabled", + "dec": 0, + "sumSize": 192 + }, + "0x000000000300911a": { + "objName": "VL53L0X_GetSequenceStepEnables", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 226, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 226, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300911a", + "id": "VL53L0X_GetSequenceStepEnables", + "dec": 0, + "sumSize": 226 + }, + "0x0000000003009200": { + "objName": "VL53L0X_GetInterMeasurementPeriodMilliSeconds", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 126, + "moduleName": "vl53l0x_api.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": "0x0000000003009200", + "id": "VL53L0X_GetInterMeasurementPeriodMilliSeconds", + "dec": 0, + "sumSize": 126 + }, + "0x000000000300927e": { + "objName": "VL53L0X_GetXTalkCompensationEnable", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 50, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 50, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300927e", + "id": "VL53L0X_GetXTalkCompensationEnable", + "dec": 0, + "sumSize": 50 + }, + "0x00000000030092b0": { + "objName": "VL53L0X_GetXTalkCompensationRateMegaCps", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 136, + "moduleName": "vl53l0x_api.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": "0x00000000030092b0", + "id": "VL53L0X_GetXTalkCompensationRateMegaCps", + "dec": 0, + "sumSize": 136 + }, + "0x0000000003009338": { + "objName": "VL53L0X_SetLimitCheckEnable", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 354, + "moduleName": "vl53l0x_api.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": "0x0000000003009338", + "id": "VL53L0X_SetLimitCheckEnable", + "dec": 0, + "sumSize": 354 + }, + "0x000000000300949a": { + "objName": "VL53L0X_GetLimitCheckEnable", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 90, + "moduleName": "vl53l0x_api.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": "0x000000000300949a", + "id": "VL53L0X_GetLimitCheckEnable", + "dec": 0, + "sumSize": 90 + }, + "0x00000000030094f4": { + "objName": "VL53L0X_SetLimitCheckValue", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 238, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 238, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030094f4", + "id": "VL53L0X_SetLimitCheckValue", + "dec": 0, + "sumSize": 238 + }, + "0x00000000030095e6": { + "objName": "VL53L0X_GetLimitCheckValue", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 342, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 342, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000030095e6", + "id": "VL53L0X_GetLimitCheckValue", + "dec": 0, + "sumSize": 342 + }, + "0x0000000003009740": { + "objName": "VL53L0X_GetWrapAroundCheckEnable", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 122, + "moduleName": "vl53l0x_api.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": "0x0000000003009740", + "id": "VL53L0X_GetWrapAroundCheckEnable", + "dec": 0, + "sumSize": 122 + }, + "0x00000000030097ba": { + "objName": "VL53L0X_PerformSingleMeasurement", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 116, + "moduleName": "vl53l0x_api.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": "0x00000000030097ba", + "id": "VL53L0X_PerformSingleMeasurement", + "dec": 0, + "sumSize": 116 + }, + "0x000000000300982e": { + "objName": "VL53L0X_PerformRefCalibration", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 62, + "moduleName": "vl53l0x_api.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": "0x000000000300982e", + "id": "VL53L0X_PerformRefCalibration", + "dec": 0, + "sumSize": 62 + }, + "0x000000000300986c": { + "objName": "VL53L0X_CheckAndLoadInterruptSettings", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 590, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 590, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300986c", + "id": "VL53L0X_CheckAndLoadInterruptSettings", + "dec": 0, + "sumSize": 590 + }, + "0x0000000003009ac2": { + "objName": "VL53L0X_StartMeasurement", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 456, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 456, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003009ac2", + "id": "VL53L0X_StartMeasurement", + "dec": 0, + "sumSize": 456 + }, + "0x0000000003009c8e": { + "objName": "VL53L0X_GetMeasurementDataReady", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 160, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 160, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003009c8e", + "id": "VL53L0X_GetMeasurementDataReady", + "dec": 0, + "sumSize": 160 + }, + "0x0000000003009d2e": { + "objName": "VL53L0X_GetRangingMeasurementData", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 760, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 760, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000003009d2e", + "id": "VL53L0X_GetRangingMeasurementData", + "dec": 0, + "sumSize": 760 + }, + "0x000000000300a026": { + "objName": "VL53L0X_PerformSingleRangingMeasurement", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 112, + "moduleName": "vl53l0x_api.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": "0x000000000300a026", + "id": "VL53L0X_PerformSingleRangingMeasurement", + "dec": 0, + "sumSize": 112 + }, + "0x000000000300a096": { + "objName": "VL53L0X_SetGpioConfig", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 718, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 718, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300a096", + "id": "VL53L0X_SetGpioConfig", + "dec": 0, + "sumSize": 718 + }, + "0x000000000300a364": { + "objName": "VL53L0X_GetInterruptThresholds", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 130, + "moduleName": "vl53l0x_api.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": "0x000000000300a364", + "id": "VL53L0X_GetInterruptThresholds", + "dec": 0, + "sumSize": 130 + }, + "0x000000000300a3e6": { + "objName": "VL53L0X_ClearInterruptMask", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 158, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 158, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300a3e6", + "id": "VL53L0X_ClearInterruptMask", + "dec": 0, + "sumSize": 158 + }, + "0x000000000300a484": { + "objName": "VL53L0X_GetInterruptMaskStatus", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 84, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 84, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300a484", + "id": "VL53L0X_GetInterruptMaskStatus", + "dec": 0, + "sumSize": 84 + }, + "0x000000000300a4d8": { + "objName": "VL53L0X_PerformRefSpadManagement", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 58, + "moduleName": "vl53l0x_api.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": "0x000000000300a4d8", + "id": "VL53L0X_PerformRefSpadManagement", + "dec": 0, + "sumSize": 58 + }, + "vl53l0x_api_calibration.o": { + "objName": "vl53l0x_api_calibration.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\core\\src", + "romSize": 4032, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + ".text": 4032, + ".data": 16, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8851, + ".debug_info": 25069, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x_api_calibration.o", + "id": "vl53l0x_api_calibration.o", + "dec": 0, + "sumSize": 4048 + }, + "0x000000000300a512": { + "objName": "VL53L0X_get_offset_calibration_data_micro_meter", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 166, + "moduleName": "vl53l0x_api_calibration.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": "0x000000000300a512", + "id": "VL53L0X_get_offset_calibration_data_micro_meter", + "dec": 0, + "sumSize": 166 + }, + "0x000000000300a5b8": { + "objName": "get_next_good_spad", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 250, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 250, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300a5b8", + "id": "get_next_good_spad", + "dec": 0, + "sumSize": 250 + }, + "0x000000000300a6b2": { + "objName": "is_aperture", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 58, + "moduleName": "vl53l0x_api_calibration.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": "0x000000000300a6b2", + "id": "is_aperture", + "dec": 0, + "sumSize": 58 + }, + "0x000000000300a6ec": { + "objName": "enable_spad_bit", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 150, + "moduleName": "vl53l0x_api_calibration.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": "0x000000000300a6ec", + "id": "enable_spad_bit", + "dec": 0, + "sumSize": 150 + }, + "0x000000000300a782": { + "objName": "set_ref_spad_map", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 54, + "moduleName": "vl53l0x_api_calibration.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": "0x000000000300a782", + "id": "set_ref_spad_map", + "dec": 0, + "sumSize": 54 + }, + "0x000000000300a7b8": { + "objName": "get_ref_spad_map", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 54, + "moduleName": "vl53l0x_api_calibration.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": "0x000000000300a7b8", + "id": "get_ref_spad_map", + "dec": 0, + "sumSize": 54 + }, + "0x000000000300a7ee": { + "objName": "enable_ref_spads", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 336, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 336, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300a7ee", + "id": "enable_ref_spads", + "dec": 0, + "sumSize": 336 + }, + "0x000000000300a93e": { + "objName": "perform_ref_signal_measurement", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 218, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 218, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300a93e", + "id": "perform_ref_signal_measurement", + "dec": 0, + "sumSize": 218 + }, + "0x000000000300aa20": { + "objName": "VL53L0X_perform_ref_spad_management", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 1218, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 1218, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300aa20", + "id": "VL53L0X_perform_ref_spad_management", + "dec": 0, + "sumSize": 1218 + }, + "0x000000000300aee6": { + "objName": "VL53L0X_set_reference_spads", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 380, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 380, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300aee6", + "id": "VL53L0X_set_reference_spads", + "dec": 0, + "sumSize": 380 + }, + "0x000000000300b062": { + "objName": "VL53L0X_perform_single_ref_calibration", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 130, + "moduleName": "vl53l0x_api_calibration.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": "0x000000000300b062", + "id": "VL53L0X_perform_single_ref_calibration", + "dec": 0, + "sumSize": 130 + }, + "0x000000000300b0e4": { + "objName": "VL53L0X_ref_calibration_io", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 406, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 406, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b0e4", + "id": "VL53L0X_ref_calibration_io", + "dec": 0, + "sumSize": 406 + }, + "0x000000000300b27a": { + "objName": "VL53L0X_perform_vhv_calibration", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 230, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 230, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b27a", + "id": "VL53L0X_perform_vhv_calibration", + "dec": 0, + "sumSize": 230 + }, + "0x000000000300b360": { + "objName": "VL53L0X_perform_phase_calibration", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 224, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 224, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b360", + "id": "VL53L0X_perform_phase_calibration", + "dec": 0, + "sumSize": 224 + }, + "0x000000000300b440": { + "objName": "VL53L0X_perform_ref_calibration", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 158, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 158, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b440", + "id": "VL53L0X_perform_ref_calibration", + "dec": 0, + "sumSize": 158 + }, + "vl53l0x_api_core.o": { + "objName": "vl53l0x_api_core.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\core\\src", + "romSize": 9736, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + ".text": 9736, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 12611, + ".debug_info": 26165, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x_api_core.o", + "id": "vl53l0x_api_core.o", + "dec": 0, + "sumSize": 9736 + }, + "0x000000000300b4de": { + "objName": "VL53L0X_measurement_poll_for_completion", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 120, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 120, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b4de", + "id": "VL53L0X_measurement_poll_for_completion", + "dec": 0, + "sumSize": 120 + }, + "0x000000000300b556": { + "objName": "VL53L0X_decode_vcsel_period", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 42, + "moduleName": "vl53l0x_api_core.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": "0x000000000300b556", + "id": "VL53L0X_decode_vcsel_period", + "dec": 0, + "sumSize": 42 + }, + "0x000000000300b580": { + "objName": "VL53L0X_isqrt", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 144, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 144, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b580", + "id": "VL53L0X_isqrt", + "dec": 0, + "sumSize": 144 + }, + "0x000000000300b610": { + "objName": "VL53L0X_device_read_strobe", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 166, + "moduleName": "vl53l0x_api_core.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": "0x000000000300b610", + "id": "VL53L0X_device_read_strobe", + "dec": 0, + "sumSize": 166 + }, + "0x000000000300b6be": { + "objName": "VL53L0X_get_info_from_device", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 2824, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 2824, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300b6be", + "id": "VL53L0X_get_info_from_device", + "dec": 0, + "sumSize": 2824 + }, + "0x000000000300c1d2": { + "objName": "VL53L0X_calc_macro_period_ps", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 76, + "moduleName": "vl53l0x_api_core.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": "0x000000000300c1d2", + "id": "VL53L0X_calc_macro_period_ps", + "dec": 0, + "sumSize": 76 + }, + "0x000000000300c21e": { + "objName": "VL53L0X_encode_timeout", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 112, + "moduleName": "vl53l0x_api_core.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": "0x000000000300c21e", + "id": "VL53L0X_encode_timeout", + "dec": 0, + "sumSize": 112 + }, + "0x000000000300c28e": { + "objName": "VL53L0X_decode_timeout", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 54, + "moduleName": "vl53l0x_api_core.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": "0x000000000300c28e", + "id": "VL53L0X_decode_timeout", + "dec": 0, + "sumSize": 54 + }, + "0x000000000300c2c4": { + "objName": "VL53L0X_calc_timeout_mclks", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 108, + "moduleName": "vl53l0x_api_core.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": "0x000000000300c2c4", + "id": "VL53L0X_calc_timeout_mclks", + "dec": 0, + "sumSize": 108 + }, + "0x000000000300c330": { + "objName": "VL53L0X_calc_timeout_us", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 108, + "moduleName": "vl53l0x_api_core.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": "0x000000000300c330", + "id": "VL53L0X_calc_timeout_us", + "dec": 0, + "sumSize": 108 + }, + "0x000000000300c39c": { + "objName": "get_sequence_step_timeout", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 506, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 506, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300c39c", + "id": "get_sequence_step_timeout", + "dec": 0, + "sumSize": 506 + }, + "0x000000000300c596": { + "objName": "set_sequence_step_timeout", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 560, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 560, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300c596", + "id": "set_sequence_step_timeout", + "dec": 0, + "sumSize": 560 + }, + "0x000000000300c7ce": { + "objName": "VL53L0X_get_vcsel_pulse_period", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 138, + "moduleName": "vl53l0x_api_core.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": "0x000000000300c7ce", + "id": "VL53L0X_get_vcsel_pulse_period", + "dec": 0, + "sumSize": 138 + }, + "0x000000000300c858": { + "objName": "VL53L0X_set_measurement_timing_budget_micro_seconds", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 530, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 530, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300c858", + "id": "VL53L0X_set_measurement_timing_budget_micro_seconds", + "dec": 0, + "sumSize": 530 + }, + "0x000000000300ca6e": { + "objName": "VL53L0X_get_measurement_timing_budget_micro_seconds", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 416, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 416, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300ca6e", + "id": "VL53L0X_get_measurement_timing_budget_micro_seconds", + "dec": 0, + "sumSize": 416 + }, + "0x000000000300cc12": { + "objName": "VL53L0X_load_tuning_settings", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 674, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 674, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300cc12", + "id": "VL53L0X_load_tuning_settings", + "dec": 0, + "sumSize": 674 + }, + "0x000000000300ceb4": { + "objName": "VL53L0X_get_total_xtalk_rate", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 126, + "moduleName": "vl53l0x_api_core.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": "0x000000000300ceb4", + "id": "VL53L0X_get_total_xtalk_rate", + "dec": 0, + "sumSize": 126 + }, + "0x000000000300cf32": { + "objName": "VL53L0X_get_total_signal_rate", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 96, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 96, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300cf32", + "id": "VL53L0X_get_total_signal_rate", + "dec": 0, + "sumSize": 96 + }, + "0x000000000300cf92": { + "objName": "get_dmax_lut_points", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 186, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 186, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300cf92", + "id": "get_dmax_lut_points", + "dec": 0, + "sumSize": 186 + }, + "0x000000000300d04c": { + "objName": "VL53L0X_calc_dmax", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 380, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 380, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300d04c", + "id": "VL53L0X_calc_dmax", + "dec": 0, + "sumSize": 380 + }, + "0x000000000300d1c8": { + "objName": "VL53L0X_calc_sigma_estimate", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 1340, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 1340, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300d1c8", + "id": "VL53L0X_calc_sigma_estimate", + "dec": 0, + "sumSize": 1340 + }, + "0x000000000300d708": { + "objName": "VL53L0X_get_pal_range_status", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 1030, + "moduleName": "vl53l0x_api_core.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 1030, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300d708", + "id": "VL53L0X_get_pal_range_status", + "dec": 0, + "sumSize": 1030 + }, + "vl53l0x.o": { + "objName": "vl53l0x.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\mine\\src", + "romSize": 650, + "moduleName": "vl53l0x.o", + "componentName": "", + ".text": 650, + ".data": 388, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2632, + ".debug_info": 21665, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x.o", + "id": "vl53l0x.o", + "dec": 0, + "sumSize": 1038 + }, + "0x000000000300db16": { + "objName": "device_detect", + "parent": "vl53l0x.o", + "path": "", + "romSize": 186, + "moduleName": "vl53l0x.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 186, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300db16", + "id": "device_detect", + "dec": 0, + "sumSize": 186 + }, + "0x000000000300dbd0": { + "objName": "device_init", + "parent": "vl53l0x.o", + "path": "", + "romSize": 102, + "moduleName": "vl53l0x.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 102, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300dbd0", + "id": "device_init", + "dec": 0, + "sumSize": 102 + }, + "0x000000000300dc36": { + "objName": "Vl53l0xInit", + "parent": "vl53l0x.o", + "path": "", + "romSize": 46, + "moduleName": "vl53l0x.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": "0x000000000300dc36", + "id": "Vl53l0xInit", + "dec": 0, + "sumSize": 46 + }, + "0x000000000300dc64": { + "objName": "Vl53l0xStart", + "parent": "vl53l0x.o", + "path": "", + "romSize": 36, + "moduleName": "vl53l0x.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 36, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300dc64", + "id": "Vl53l0xStart", + "dec": 0, + "sumSize": 36 + }, + "0x000000000300dc8c": { + "objName": "GetDistance", + "parent": "vl53l0x.o", + "path": "", + "romSize": 68, + "moduleName": "vl53l0x.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": "0x000000000300dc8c", + "id": "GetDistance", + "dec": 0, + "sumSize": 68 + }, + "vl53l0x_iic.o": { + "objName": "vl53l0x_iic.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\mine\\src", + "romSize": 892, + "moduleName": "vl53l0x_iic.o", + "componentName": "", + ".text": 892, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2827, + ".debug_info": 20246, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x_iic.o", + "id": "vl53l0x_iic.o", + "dec": 0, + "sumSize": 892 + }, + "0x000000000300dcd0": { + "objName": "vl53l0x_iic_start", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 82, + "moduleName": "vl53l0x_iic.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": "0x000000000300dcd0", + "id": "vl53l0x_iic_start", + "dec": 0, + "sumSize": 82 + }, + "0x000000000300dd22": { + "objName": "vl53l0x_iic_stop", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 94, + "moduleName": "vl53l0x_iic.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": "0x000000000300dd22", + "id": "vl53l0x_iic_stop", + "dec": 0, + "sumSize": 94 + }, + "0x000000000300dd80": { + "objName": "vl53l0x_iic_wait_ack", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 158, + "moduleName": "vl53l0x_iic.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 158, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300dd80", + "id": "vl53l0x_iic_wait_ack", + "dec": 0, + "sumSize": 158 + }, + "0x000000000300de1e": { + "objName": "vl53l0x_iic_ack", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 82, + "moduleName": "vl53l0x_iic.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": "0x000000000300de1e", + "id": "vl53l0x_iic_ack", + "dec": 0, + "sumSize": 82 + }, + "0x000000000300de70": { + "objName": "vl53l0x_iic_nack", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 82, + "moduleName": "vl53l0x_iic.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": "0x000000000300de70", + "id": "vl53l0x_iic_nack", + "dec": 0, + "sumSize": 82 + }, + "0x000000000300dec2": { + "objName": "vl53l0x_iic_send_byte", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 156, + "moduleName": "vl53l0x_iic.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 156, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300dec2", + "id": "vl53l0x_iic_send_byte", + "dec": 0, + "sumSize": 156 + }, + "0x000000000300df5e": { + "objName": "vl53l0x_iic_read_byte", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 168, + "moduleName": "vl53l0x_iic.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 168, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300df5e", + "id": "vl53l0x_iic_read_byte", + "dec": 0, + "sumSize": 168 + }, + "0x000000000300e00a": { + "objName": "vl53l0x_hw_reset", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 70, + "moduleName": "vl53l0x_iic.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": "0x000000000300e00a", + "id": "vl53l0x_hw_reset", + "dec": 0, + "sumSize": 70 + }, + "vl53l0x_i2c_platform.o": { + "objName": "vl53l0x_i2c_platform.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\platform\\src", + "romSize": 840, + "moduleName": "vl53l0x_i2c_platform.o", + "componentName": "", + ".text": 840, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3167, + ".debug_info": 20970, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x_i2c_platform.o", + "id": "vl53l0x_i2c_platform.o", + "dec": 0, + "sumSize": 840 + }, + "0x000000000300e058": { + "objName": "VL53L0X_write_multi", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 170, + "moduleName": "vl53l0x_i2c_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 170, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e058", + "id": "VL53L0X_write_multi", + "dec": 0, + "sumSize": 170 + }, + "0x000000000300e102": { + "objName": "VL53L0X_read_multi", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 208, + "moduleName": "vl53l0x_i2c_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 208, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e102", + "id": "VL53L0X_read_multi", + "dec": 0, + "sumSize": 208 + }, + "0x000000000300e1d2": { + "objName": "VL53L0X_write_byte", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 80, + "moduleName": "vl53l0x_i2c_platform.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": "0x000000000300e1d2", + "id": "VL53L0X_write_byte", + "dec": 0, + "sumSize": 80 + }, + "0x000000000300e222": { + "objName": "VL53L0X_write_word", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 96, + "moduleName": "vl53l0x_i2c_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 96, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e222", + "id": "VL53L0X_write_word", + "dec": 0, + "sumSize": 96 + }, + "0x000000000300e282": { + "objName": "VL53L0X_read_byte", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 76, + "moduleName": "vl53l0x_i2c_platform.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": "0x000000000300e282", + "id": "VL53L0X_read_byte", + "dec": 0, + "sumSize": 76 + }, + "0x000000000300e2ce": { + "objName": "VL53L0X_read_word", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 106, + "moduleName": "vl53l0x_i2c_platform.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": "0x000000000300e2ce", + "id": "VL53L0X_read_word", + "dec": 0, + "sumSize": 106 + }, + "0x000000000300e338": { + "objName": "VL53L0X_read_dword", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 104, + "moduleName": "vl53l0x_i2c_platform.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": "0x000000000300e338", + "id": "VL53L0X_read_dword", + "dec": 0, + "sumSize": 104 + }, + "vl53l0x_platform.o": { + "objName": "vl53l0x_platform.o", + "parent": "", + "path": "obj\\user\\vl53l0x\\platform\\src", + "romSize": 862, + "moduleName": "vl53l0x_platform.o", + "componentName": "", + ".text": 862, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3469, + ".debug_info": 22576, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "vl53l0x_platform.o", + "id": "vl53l0x_platform.o", + "dec": 0, + "sumSize": 862 + }, + "0x000000000300e3a0": { + "objName": "VL53L0X_WriteMulti", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 116, + "moduleName": "vl53l0x_platform.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": "0x000000000300e3a0", + "id": "VL53L0X_WriteMulti", + "dec": 0, + "sumSize": 116 + }, + "0x000000000300e414": { + "objName": "VL53L0X_ReadMulti", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 112, + "moduleName": "vl53l0x_platform.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": "0x000000000300e414", + "id": "VL53L0X_ReadMulti", + "dec": 0, + "sumSize": 112 + }, + "0x000000000300e484": { + "objName": "VL53L0X_WrByte", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 92, + "moduleName": "vl53l0x_platform.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": "0x000000000300e484", + "id": "VL53L0X_WrByte", + "dec": 0, + "sumSize": 92 + }, + "0x000000000300e4e0": { + "objName": "VL53L0X_WrWord", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 92, + "moduleName": "vl53l0x_platform.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": "0x000000000300e4e0", + "id": "VL53L0X_WrWord", + "dec": 0, + "sumSize": 92 + }, + "0x000000000300e53c": { + "objName": "VL53L0X_UpdateByte", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 166, + "moduleName": "vl53l0x_platform.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": "0x000000000300e53c", + "id": "VL53L0X_UpdateByte", + "dec": 0, + "sumSize": 166 + }, + "0x000000000300e5e2": { + "objName": "VL53L0X_RdByte", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 86, + "moduleName": "vl53l0x_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 86, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e5e2", + "id": "VL53L0X_RdByte", + "dec": 0, + "sumSize": 86 + }, + "0x000000000300e638": { + "objName": "VL53L0X_RdWord", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 86, + "moduleName": "vl53l0x_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 86, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e638", + "id": "VL53L0X_RdWord", + "dec": 0, + "sumSize": 86 + }, + "0x000000000300e68e": { + "objName": "VL53L0X_RdDWord", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 86, + "moduleName": "vl53l0x_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 86, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e68e", + "id": "VL53L0X_RdDWord", + "dec": 0, + "sumSize": 86 + }, + "0x000000000300e6e4": { + "objName": "VL53L0X_PollingDelay", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 26, + "moduleName": "vl53l0x_platform.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 26, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e6e4", + "id": "VL53L0X_PollingDelay", + "dec": 0, + "sumSize": 26 + }, + "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": 1474, + ".comment": 0, + ".debug_line": 2388, + ".debug_info": 715, + ".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 + }, + "libgcc.a": { + "objName": "libgcc.a", + "parent": "", + "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": 1474, + ".comment": 0, + ".debug_line": 2388, + ".debug_info": 715, + ".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": 546 + }, + "0x000000000300e6fe": { + "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": "0x000000000300e6fe", + "id": "__truncdfsf2", + "dec": 0, + "romSize": 0, + "sumSize": 546 + }, + "abs.o": { + "objName": "abs.o", + "parent": "libc.a", + "path": "", + "romSize": 10, + "moduleName": "abs.o", + "componentName": "lib-libc", + ".text": 10, + ".data": 0, + ".bss": 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": "abs.o", + "id": "abs.o", + "dec": 0, + "sumSize": 10 + }, + "libc.a": { + "objName": "libc.a", + "parent": "", + "path": "", + "romSize": 1220, + "moduleName": "abs.o", + "componentName": "lib-libc", + ".text": 1220, + ".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": 300, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "libc.a", + "id": "libc.a", + "dec": 0, + "sumSize": 1220 + }, + "0x000000000300e920": { + "objName": "abs", + "parent": "abs.o", + "path": "", + "romSize": 10, + "moduleName": "abs.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.a", + ".text": 10, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e920", + "id": "abs", + "dec": 0, + "sumSize": 10 + }, + "memcpy.o": { + "objName": "memcpy.o", + "parent": "libc.a", + "path": "", + "romSize": 866, + "moduleName": "libc", + "componentName": "lib-libc", + ".text": 866, + ".data": 0, + ".bss": 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": "memcpy.o", + "id": "memcpy.o", + "dec": 0, + "sumSize": 866 + }, + "0x000000000300e92a": { + "objName": "memcpy", + "parent": "memcpy.o", + "path": "", + "romSize": 866, + "moduleName": "libc", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.a", + ".text": 866, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300e92a", + "id": "memcpy", + "dec": 0, + "sumSize": 866 + }, + "memset.o": { + "objName": "memset.o", + "parent": "libc.a", + "path": "", + "romSize": 190, + "moduleName": "libc", + "componentName": "lib-libc", + ".text": 190, + ".data": 0, + ".bss": 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": "memset.o", + "id": "memset.o", + "dec": 0, + "sumSize": 190 + }, + "0x000000000300ec8c": { + "objName": "memset", + "parent": "memset.o", + "path": "", + "romSize": 190, + "moduleName": "libc", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.a", + ".text": 190, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300ec8c", + "id": "memset", + "dec": 0, + "sumSize": 190 + }, + "strcpy.o": { + "objName": "strcpy.o", + "parent": "libc.a", + "path": "", + "romSize": 20, + "moduleName": "strcpy.o", + "componentName": "lib-libc", + ".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": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "strcpy.o", + "id": "strcpy.o", + "dec": 0, + "sumSize": 20 + }, + "0x000000000300ed4a": { + "objName": "strcpy", + "parent": "strcpy.o", + "path": "", + "romSize": 20, + "moduleName": "strcpy.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.a", + ".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": "0x000000000300ed4a", + "id": "strcpy", + "dec": 0, + "sumSize": 20 + }, + "strncmp.o": { + "objName": "strncmp.o", + "parent": "libc.a", + "path": "", + "romSize": 44, + "moduleName": "strncmp.o", + "componentName": "lib-libc", + ".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": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "strncmp.o", + "id": "strncmp.o", + "dec": 0, + "sumSize": 44 + }, + "0x000000000300ed5e": { + "objName": "strncmp", + "parent": "strncmp.o", + "path": "", + "romSize": 44, + "moduleName": "strncmp.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.a", + ".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": "0x000000000300ed5e", + "id": "strncmp", + "dec": 0, + "sumSize": 44 + }, + "stpcpy.o": { + "objName": "stpcpy.o", + "parent": "libc.a", + "path": "", + "romSize": 90, + "moduleName": "stpcpy.o", + "componentName": "lib-libc", + ".text": 90, + ".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": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "stpcpy.o", + "id": "stpcpy.o", + "dec": 0, + "sumSize": 90 + }, + "0x000000000300ed8a": { + "objName": "__stpcpy", + "parent": "stpcpy.o", + "path": "", + "romSize": 90, + "moduleName": "stpcpy.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.a", + ".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": "0x000000000300ed8a", + "id": "__stpcpy", + "dec": 0, + "sumSize": 90 + }, + "0x000000000300ede4": { + "objName": "0x000000000300ede4", + "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": "0x000000000300ede4", + "id": "0x000000000300ede4", + "dec": 0, + "sumSize": 4 + }, + "0x000000000300ede8": { + "objName": "0x000000000300ede8", + "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": "0x000000000300ede8", + "id": "0x000000000300ede8", + "dec": 0, + "sumSize": 552 + }, + "0x000000000300f010": { + "objName": "0x000000000300f010", + "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": "0x000000000300f010", + "id": "0x000000000300f010", + "dec": 0, + "sumSize": 32 + }, + "0x000000000300f030": { + "objName": "0x000000000300f030", + "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": "0x000000000300f030", + "id": "0x000000000300f030", + "dec": 0, + "sumSize": 32 + }, + "0x000000000300f050": { + "objName": "0x000000000300f050", + "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": "0x000000000300f050", + "id": "0x000000000300f050", + "dec": 0, + "sumSize": 32 + }, + "0x000000000300f070": { + "objName": "0x000000000300f070", + "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": "0x000000000300f070", + "id": "0x000000000300f070", + "dec": 0, + "sumSize": 88 + }, + "0x000000000300f0c8": { + "objName": "0x000000000300f0c8", + "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": "0x000000000300f0c8", + "id": "0x000000000300f0c8", + "dec": 0, + "sumSize": 24 + }, + "0x000000000300f0e0": { + "objName": "0x000000000300f0e0", + "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": "0x000000000300f0e0", + "id": "0x000000000300f0e0", + "dec": 0, + "sumSize": 132 + }, + "0x000000000300f164": { + "objName": "0x000000000300f164", + "parent": "gpio.o", + "path": "", + "romSize": 59, + "moduleName": "gpio.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 59, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300f164", + "id": "0x000000000300f164", + "dec": 0, + "sumSize": 59 + }, + "0x000000000300f1a0": { + "objName": "0x000000000300f1a0", + "parent": "gpt.o", + "path": "", + "romSize": 25, + "moduleName": "gpt.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 25, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300f1a0", + "id": "0x000000000300f1a0", + "dec": 0, + "sumSize": 25 + }, + "0x000000000300f1bc": { + "objName": "0x000000000300f1bc", + "parent": "i2c.o", + "path": "", + "romSize": 25, + "moduleName": "i2c.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 25, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300f1bc", + "id": "0x000000000300f1bc", + "dec": 0, + "sumSize": 25 + }, + "0x000000000300f1d8": { + "objName": "0x000000000300f1d8", + "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": "0x000000000300f1d8", + "id": "0x000000000300f1d8", + "dec": 0, + "sumSize": 61 + }, + "0x000000000300f218": { + "objName": "0x000000000300f218", + "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": "0x000000000300f218", + "id": "0x000000000300f218", + "dec": 0, + "sumSize": 61 + }, + "0x000000000300f258": { + "objName": "0x000000000300f258", + "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": "0x000000000300f258", + "id": "0x000000000300f258", + "dec": 0, + "sumSize": 20 + }, + "0x000000000300f26c": { + "objName": "0x000000000300f26c", + "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": "0x000000000300f26c", + "id": "0x000000000300f26c", + "dec": 0, + "sumSize": 27 + }, + "0x000000000300f288": { + "objName": "0x000000000300f288", + "parent": "uart.o", + "path": "", + "romSize": 36, + "moduleName": "uart.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 36, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300f288", + "id": "0x000000000300f288", + "dec": 0, + "sumSize": 36 + }, + "0x000000000300f2ac": { + "objName": "0x000000000300f2ac", + "parent": "main.o", + "path": "", + "romSize": 260, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 260, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300f2ac", + "id": "0x000000000300f2ac", + "dec": 0, + "sumSize": 260 + }, + "0x000000000300f3b0": { + "objName": "0x000000000300f3b0", + "parent": "mycar_control.o", + "path": "", + "romSize": 4, + "moduleName": "mycar_control.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": "0x000000000300f3b0", + "id": "0x000000000300f3b0", + "dec": 0, + "sumSize": 4 + }, + "0x000000000300f3b4": { + "objName": "0x000000000300f3b4", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 88, + "moduleName": "vl53l0x_api.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": "0x000000000300f3b4", + "id": "0x000000000300f3b4", + "dec": 0, + "sumSize": 88 + }, + "0x000000000300f40c": { + "objName": "0x000000000300f40c", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 40, + "moduleName": "vl53l0x_api.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": "0x000000000300f40c", + "id": "0x000000000300f40c", + "dec": 0, + "sumSize": 40 + }, + "0x000000000300f434": { + "objName": "0x000000000300f434", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 20, + "moduleName": "vl53l0x_api.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": "0x000000000300f434", + "id": "0x000000000300f434", + "dec": 0, + "sumSize": 20 + }, + "0x000000000300f448": { + "objName": "0x000000000300f448", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 24, + "moduleName": "vl53l0x_api.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": "0x000000000300f448", + "id": "0x000000000300f448", + "dec": 0, + "sumSize": 24 + }, + "0x000000000300f460": { + "objName": "0x000000000300f460", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 24, + "moduleName": "vl53l0x_api.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": "0x000000000300f460", + "id": "0x000000000300f460", + "dec": 0, + "sumSize": 24 + }, + "0x000000000300f478": { + "objName": "0x000000000300f478", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 24, + "moduleName": "vl53l0x_api.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": "0x000000000300f478", + "id": "0x000000000300f478", + "dec": 0, + "sumSize": 24 + }, + "0x000000000300f490": { + "objName": "0x000000000300f490", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 20, + "moduleName": "vl53l0x_api.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": "0x000000000300f490", + "id": "0x000000000300f490", + "dec": 0, + "sumSize": 20 + }, + "0x000000000300f4a4": { + "objName": "0x000000000300f4a4", + "parent": "vl53l0x.o", + "path": "", + "romSize": 212, + "moduleName": "vl53l0x.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 212, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000300f4a4", + "id": "0x000000000300f4a4", + "dec": 0, + "sumSize": 212 + }, + "load address 0x000000000300f578": { + "objName": "load address 0x000000000300f578", + "parent": "", + "path": "", + "romSize": 0, + "moduleName": "load address 0x000000000300f578", + "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 0x000000000300f578", + "id": "load address 0x000000000300f578", + "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": "targetSpeed", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x00000000040000fc", + "id": "targetSpeed", + "dec": 0, + "sumSize": 4 + }, + "0x0000000004000100": { + "objName": "KP", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000100", + "id": "KP", + "dec": 0, + "sumSize": 4 + }, + "0x0000000004000104": { + "objName": "KI", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000104", + "id": "KI", + "dec": 0, + "sumSize": 4 + }, + "0x0000000004000108": { + "objName": "KD", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000108", + "id": "KD", + "dec": 0, + "sumSize": 4 + }, + "0x000000000400010c": { + "objName": "DefaultTuningSettings", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 243, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000400010c", + "id": "DefaultTuningSettings", + "dec": 0, + "sumSize": 243 + }, + "0x0000000004000200": { + "objName": "InterruptThresholdSettings", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 438, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000200", + "id": "InterruptThresholdSettings", + "dec": 0, + "sumSize": 438 + }, + "0x00000000040003b8": { + "objName": "refArrayQuadrants", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 16, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000040003b8", + "id": "refArrayQuadrants", + "dec": 0, + "sumSize": 16 + }, + "0x00000000040003c8": { + "objName": "demo_dev", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 388, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000040003c8", + "id": "demo_dev", + "dec": 0, + "sumSize": 388 + }, + "0x000000000400054c": { + "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": "0x000000000400054c", + "id": "g_irqCallbackFunc", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040008e4": { + "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": "0x00000000040008e4", + "id": "g_crgBaseAddr", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040008e8": { + "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": "0x00000000040008e8", + "id": "g_anaEnableFlag", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040008e9": { + "objName": "USART_RX_STA", + "parent": "uart.o", + "path": "", + "romSize": 0, + "moduleName": "uart.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": "0x00000000040008e9", + "id": "USART_RX_STA", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040008ea": { + "objName": "g_carStart", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x00000000040008ea", + "id": "g_carStart", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040008eb": { + "objName": "g_carStop", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x00000000040008eb", + "id": "g_carStop", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040008ec": { + "objName": "readData", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 20, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x00000000040008ec", + "id": "readData", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000900": { + "objName": "g_uartReceiveFlag", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000900", + "id": "g_uartReceiveFlag", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000901": { + "objName": "f_250ms", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000901", + "id": "f_250ms", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000902": { + "objName": "f_1s", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000902", + "id": "f_1s", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000903": { + "objName": "f_10s", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000903", + "id": "f_10s", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000904": { + "objName": "v_num_left", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000904", + "id": "v_num_left", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000908": { + "objName": "v_num_right", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000908", + "id": "v_num_right", + "dec": 0, + "sumSize": 0 + }, + "0x000000000400090c": { + "objName": "workStatus", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x000000000400090c", + "id": "workStatus", + "dec": 0, + "sumSize": 0 + }, + "0x000000000400090e": { + "objName": "s_distance", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 2, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000400090e", + "id": "s_distance", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000910": { + "objName": "f_sedentary", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000910", + "id": "f_sedentary", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000911": { + "objName": "f_guard", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000911", + "id": "f_guard", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000914": { + "objName": "time_num", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000914", + "id": "time_num", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000918": { + "objName": "time_sedentary_num", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.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": "0x0000000004000918", + "id": "time_sedentary_num", + "dec": 0, + "sumSize": 0 + }, + "0x000000000400091c": { + "objName": "g_gpt1", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 52, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x000000000400091c", + "id": "g_gpt1", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000950": { + "objName": "g_gpt2", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 52, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000950", + "id": "g_gpt2", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000984": { + "objName": "g_gpt3", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 52, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000984", + "id": "g_gpt3", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040009b8": { + "objName": "g_timer0", + "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": "0x00000000040009b8", + "id": "g_timer0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000040009e0": { + "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": "0x00000000040009e0", + "id": "g_uart0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000a60": { + "objName": "g_i2c0", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 104, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000a60", + "id": "g_i2c0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000ac8": { + "objName": "g_gpio1", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000ac8", + "id": "g_gpio1", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000b10": { + "objName": "g_gpio2", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000b10", + "id": "g_gpio2", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000b58": { + "objName": "g_gpio3", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000b58", + "id": "g_gpio3", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000ba0": { + "objName": "g_gpio4", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000ba0", + "id": "g_gpio4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000be8": { + "objName": "g_gpio5", + "parent": "main.o", + "path": "", + "romSize": 0, + "moduleName": "main.o", + "componentName": "", + "isSymbol": true, + "lib": "", + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": "0x0000000004000be8", + "id": "g_gpio5", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000c30": { + "objName": "preLeftError", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000c30", + "id": "preLeftError", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000c34": { + "objName": "ppreLeftError", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000c34", + "id": "ppreLeftError", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000c38": { + "objName": "preRightError", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000c38", + "id": "preRightError", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000c3c": { + "objName": "ppreRightError", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000c3c", + "id": "ppreRightError", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000c40": { + "objName": "Left_ESC_Output_PWM", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000c40", + "id": "Left_ESC_Output_PWM", + "dec": 0, + "sumSize": 0 + }, + "0x0000000004000c44": { + "objName": "Right_ESC_Output_PWM", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000004000c44", + "id": "Right_ESC_Output_PWM", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000000": { + "objName": "0x0000000000000000", + "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": 1474, + ".comment": 0, + ".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": "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": "0x00000000000001c1", + "id": "0x00000000000001c1", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001f3": { + "objName": "0x00000000000001f3", + "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": "0x00000000000001f3", + "id": "0x00000000000001f3", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000225": { + "objName": "0x0000000000000225", + "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": "0x0000000000000225", + "id": "0x0000000000000225", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000025b": { + "objName": "0x000000000000025b", + "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": "0x000000000000025b", + "id": "0x000000000000025b", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000028d": { + "objName": "0x000000000000028d", + "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": "0x000000000000028d", + "id": "0x000000000000028d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002bf": { + "objName": "0x00000000000002bf", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": "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": "0x0000000000000355", + "id": "0x0000000000000355", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000387": { + "objName": "0x0000000000000387", + "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": "0x0000000000000387", + "id": "0x0000000000000387", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000003b9": { + "objName": "0x00000000000003b9", + "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": "0x00000000000003b9", + "id": "0x00000000000003b9", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000003eb": { + "objName": "0x00000000000003eb", + "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": "0x00000000000003eb", + "id": "0x00000000000003eb", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000041d": { + "objName": "0x000000000000041d", + "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": "0x000000000000041d", + "id": "0x000000000000041d", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000044f": { + "objName": "0x000000000000044f", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x000000000000044f", + "id": "0x000000000000044f", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000481": { + "objName": "0x0000000000000481", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": "0x0000000000000481", + "id": "0x0000000000000481", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000004b3": { + "objName": "0x00000000000004b3", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": "0x00000000000004b3", + "id": "0x00000000000004b3", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000004e5": { + "objName": "0x00000000000004e5", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": "0x00000000000004e5", + "id": "0x00000000000004e5", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000517": { + "objName": "0x0000000000000517", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": "0x0000000000000517", + "id": "0x0000000000000517", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000549": { + "objName": "0x0000000000000549", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": "0x0000000000000549", + "id": "0x0000000000000549", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000057b": { + "objName": "0x000000000000057b", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": "0x000000000000057b", + "id": "0x000000000000057b", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000005ad": { + "objName": "0x00000000000005ad", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": "0x00000000000005ad", + "id": "0x00000000000005ad", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000005df": { + "objName": "0x00000000000005df", + "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": "0x00000000000005df", + "id": "0x00000000000005df", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000615": { + "objName": "0x0000000000000615", + "parent": "abs.o", + "path": "", + "romSize": 0, + "moduleName": "abs.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "0x0000000000000615", + "id": "0x0000000000000615", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000647": { + "objName": "0x0000000000000647", + "parent": "memcpy.o", + "path": "", + "romSize": 0, + "moduleName": "libc", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "0x0000000000000647", + "id": "0x0000000000000647", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000679": { + "objName": "0x0000000000000679", + "parent": "memset.o", + "path": "", + "romSize": 0, + "moduleName": "libc", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "0x0000000000000679", + "id": "0x0000000000000679", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000006ab": { + "objName": "0x00000000000006ab", + "parent": "strcpy.o", + "path": "", + "romSize": 0, + "moduleName": "strcpy.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "0x00000000000006ab", + "id": "0x00000000000006ab", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000006dd": { + "objName": "0x00000000000006dd", + "parent": "strncmp.o", + "path": "", + "romSize": 0, + "moduleName": "strncmp.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "0x00000000000006dd", + "id": "0x00000000000006dd", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000070f": { + "objName": "0x000000000000070f", + "parent": "stpcpy.o", + "path": "", + "romSize": 0, + "moduleName": "stpcpy.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "0x000000000000070f", + "id": "0x000000000000070f", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000029": { + "objName": "0x0000000000000029", + "parent": "stpcpy.o", + "path": "", + "romSize": 0, + "moduleName": "stpcpy.o", + "componentName": "lib-libc", + "isSymbol": true, + "lib": "libc.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": "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": "0x000000000000140b", + "id": "0x000000000000140b", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000145e": { + "objName": "0x000000000000145e", + "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": "0x000000000000145e", + "id": "0x000000000000145e", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000161d": { + "objName": "0x000000000000161d", + "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": "0x000000000000161d", + "id": "0x000000000000161d", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001d1c": { + "objName": "0x0000000000001d1c", + "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": "0x0000000000001d1c", + "id": "0x0000000000001d1c", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000036a0": { + "objName": "0x00000000000036a0", + "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": "0x00000000000036a0", + "id": "0x00000000000036a0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003d74": { + "objName": "0x0000000000003d74", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 4076, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003d74", + "id": "0x0000000000003d74", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004d60": { + "objName": "0x0000000000004d60", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": 3178, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000004d60", + "id": "0x0000000000004d60", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000059ca": { + "objName": "0x00000000000059ca", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 10031, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000059ca", + "id": "0x00000000000059ca", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000080f9": { + "objName": "0x00000000000080f9", + "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": "0x00000000000080f9", + "id": "0x00000000000080f9", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000088ae": { + "objName": "0x00000000000088ae", + "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": "0x00000000000088ae", + "id": "0x00000000000088ae", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000091b2": { + "objName": "0x00000000000091b2", + "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": 6158, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000091b2", + "id": "0x00000000000091b2", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000a9c0": { + "objName": "0x000000000000a9c0", + "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": 1381, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000a9c0", + "id": "0x000000000000a9c0", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000af25": { + "objName": "0x000000000000af25", + "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": 2479, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000af25", + "id": "0x000000000000af25", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000b8d4": { + "objName": "0x000000000000b8d4", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": 1558, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000b8d4", + "id": "0x000000000000b8d4", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000beea": { + "objName": "0x000000000000beea", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 9912, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000beea", + "id": "0x000000000000beea", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000e5a2": { + "objName": "0x000000000000e5a2", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": 4905, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000e5a2", + "id": "0x000000000000e5a2", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000f8cb": { + "objName": "0x000000000000f8cb", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 7266, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000f8cb", + "id": "0x000000000000f8cb", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001152d": { + "objName": "0x000000000001152d", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": 1382, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001152d", + "id": "0x000000000001152d", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000011a93": { + "objName": "0x0000000000011a93", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": 1485, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000011a93", + "id": "0x0000000000011a93", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000012060": { + "objName": "0x0000000000012060", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": 1644, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000012060", + "id": "0x0000000000012060", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000126cc": { + "objName": "0x00000000000126cc", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": 1755, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000126cc", + "id": "0x00000000000126cc", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000012da7": { + "objName": "0x0000000000012da7", + "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": "0x0000000000012da7", + "id": "0x0000000000012da7", + "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": 4382, + ".debug_info": 0, + ".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": 414, + ".debug_info": 0, + ".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": 4434, + ".debug_info": 0, + ".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": 304, + ".debug_info": 0, + ".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": "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": 129, + ".debug_info": 0, + ".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 + }, + "0x000000000000dccc": { + "objName": "0x000000000000dccc", + "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": 721, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000dccc", + "id": "0x000000000000dccc", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000df9d": { + "objName": "0x000000000000df9d", + "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": 3648, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000df9d", + "id": "0x000000000000df9d", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000eddd": { + "objName": "0x000000000000eddd", + "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": 16804, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000eddd", + "id": "0x000000000000eddd", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000012f81": { + "objName": "0x0000000000012f81", + "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": 10268, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000012f81", + "id": "0x0000000000012f81", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001579d": { + "objName": "0x000000000001579d", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 4102, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001579d", + "id": "0x000000000001579d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000167a3": { + "objName": "0x00000000000167a3", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": 4503, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000167a3", + "id": "0x00000000000167a3", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001793a": { + "objName": "0x000000000001793a", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 14474, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001793a", + "id": "0x000000000001793a", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001b1c4": { + "objName": "0x000000000001b1c4", + "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": "0x000000000001b1c4", + "id": "0x000000000001b1c4", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001c4c3": { + "objName": "0x000000000001c4c3", + "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": "0x000000000001c4c3", + "id": "0x000000000001c4c3", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001cccf": { + "objName": "0x000000000001cccf", + "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": 11856, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001cccf", + "id": "0x000000000001cccf", + "dec": 0, + "sumSize": 0 + }, + "0x000000000001fb1f": { + "objName": "0x000000000001fb1f", + "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": 20587, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000001fb1f", + "id": "0x000000000001fb1f", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000024b8a": { + "objName": "0x0000000000024b8a", + "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": 32940, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000024b8a", + "id": "0x0000000000024b8a", + "dec": 0, + "sumSize": 0 + }, + "0x000000000002cc36": { + "objName": "0x000000000002cc36", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": 20670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000002cc36", + "id": "0x000000000002cc36", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000031cf4": { + "objName": "0x0000000000031cf4", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 30629, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000031cf4", + "id": "0x0000000000031cf4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000039499": { + "objName": "0x0000000000039499", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": 25069, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000039499", + "id": "0x0000000000039499", + "dec": 0, + "sumSize": 0 + }, + "0x000000000003f686": { + "objName": "0x000000000003f686", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 26165, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000003f686", + "id": "0x000000000003f686", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000045cbb": { + "objName": "0x0000000000045cbb", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": 21665, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000045cbb", + "id": "0x0000000000045cbb", + "dec": 0, + "sumSize": 0 + }, + "0x000000000004b15c": { + "objName": "0x000000000004b15c", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": 20246, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000004b15c", + "id": "0x000000000004b15c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000050072": { + "objName": "0x0000000000050072", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": 20970, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000050072", + "id": "0x0000000000050072", + "dec": 0, + "sumSize": 0 + }, + "0x000000000005525c": { + "objName": "0x000000000005525c", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": 22576, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000005525c", + "id": "0x000000000005525c", + "dec": 0, + "sumSize": 0 + }, + "0x000000000005aa8c": { + "objName": "0x000000000005aa8c", + "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": "0x000000000005aa8c", + "id": "0x000000000005aa8c", + "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": "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": 217, + ".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": "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": "0x0000000000000b19", + "id": "0x0000000000000b19", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000b75": { + "objName": "0x0000000000000b75", + "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": "0x0000000000000b75", + "id": "0x0000000000000b75", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000cd0": { + "objName": "0x0000000000000cd0", + "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": "0x0000000000000cd0", + "id": "0x0000000000000cd0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000f45": { + "objName": "0x0000000000000f45", + "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": "0x0000000000000f45", + "id": "0x0000000000000f45", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000011ff": { + "objName": "0x00000000000011ff", + "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": "0x00000000000011ff", + "id": "0x00000000000011ff", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000151c": { + "objName": "0x000000000000151c", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 710, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000151c", + "id": "0x000000000000151c", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000017e2": { + "objName": "0x00000000000017e2", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": 595, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000017e2", + "id": "0x00000000000017e2", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001a35": { + "objName": "0x0000000000001a35", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 786, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001a35", + "id": "0x0000000000001a35", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001d47": { + "objName": "0x0000000000001d47", + "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": "0x0000000000001d47", + "id": "0x0000000000001d47", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002005": { + "objName": "0x0000000000002005", + "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": "0x0000000000002005", + "id": "0x0000000000002005", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000021f5": { + "objName": "0x00000000000021f5", + "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": 831, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000021f5", + "id": "0x00000000000021f5", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002534": { + "objName": "0x0000000000002534", + "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": 693, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002534", + "id": "0x0000000000002534", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000027e9": { + "objName": "0x00000000000027e9", + "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": 711, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000027e9", + "id": "0x00000000000027e9", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002ab0": { + "objName": "0x0000000000002ab0", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": 668, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002ab0", + "id": "0x0000000000002ab0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002d4c": { + "objName": "0x0000000000002d4c", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 775, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002d4c", + "id": "0x0000000000002d4c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003053": { + "objName": "0x0000000000003053", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": 738, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003053", + "id": "0x0000000000003053", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003335": { + "objName": "0x0000000000003335", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 764, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003335", + "id": "0x0000000000003335", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003631": { + "objName": "0x0000000000003631", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": 664, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003631", + "id": "0x0000000000003631", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000038c9": { + "objName": "0x00000000000038c9", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": 625, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000038c9", + "id": "0x00000000000038c9", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003b3a": { + "objName": "0x0000000000003b3a", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": 618, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003b3a", + "id": "0x0000000000003b3a", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003da4": { + "objName": "0x0000000000003da4", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": 691, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003da4", + "id": "0x0000000000003da4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004057": { + "objName": "0x0000000000004057", + "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": "0x0000000000004057", + "id": "0x0000000000004057", + "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": "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": "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": "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": "0x0000000000000178", + "id": "0x0000000000000178", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000198": { + "objName": "0x0000000000000198", + "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": "0x0000000000000198", + "id": "0x0000000000000198", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001e0": { + "objName": "0x00000000000001e0", + "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": "0x00000000000001e0", + "id": "0x00000000000001e0", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000002a8": { + "objName": "0x00000000000002a8", + "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": "0x00000000000002a8", + "id": "0x00000000000002a8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000490": { + "objName": "0x0000000000000490", + "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": "0x0000000000000490", + "id": "0x0000000000000490", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000518": { + "objName": "0x0000000000000518", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 240, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000518", + "id": "0x0000000000000518", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000608": { + "objName": "0x0000000000000608", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": 224, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000608", + "id": "0x0000000000000608", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000006e8": { + "objName": "0x00000000000006e8", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 552, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000006e8", + "id": "0x00000000000006e8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000910": { + "objName": "0x0000000000000910", + "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": "0x0000000000000910", + "id": "0x0000000000000910", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000a38": { + "objName": "0x0000000000000a38", + "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": "0x0000000000000a38", + "id": "0x0000000000000a38", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ad0": { + "objName": "0x0000000000000ad0", + "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": "0x0000000000000ad0", + "id": "0x0000000000000ad0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000bf0": { + "objName": "0x0000000000000bf0", + "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": 80, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000bf0", + "id": "0x0000000000000bf0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000c40": { + "objName": "0x0000000000000c40", + "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": 120, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000c40", + "id": "0x0000000000000c40", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000cb8": { + "objName": "0x0000000000000cb8", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": "0x0000000000000cb8", + "id": "0x0000000000000cb8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000d30": { + "objName": "0x0000000000000d30", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 800, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000d30", + "id": "0x0000000000000d30", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001050": { + "objName": "0x0000000000001050", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": "0x0000000000001050", + "id": "0x0000000000001050", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001120": { + "objName": "0x0000000000001120", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 232, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001120", + "id": "0x0000000000001120", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001208": { + "objName": "0x0000000000001208", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": "0x0000000000001208", + "id": "0x0000000000001208", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001250": { + "objName": "0x0000000000001250", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": "0x0000000000001250", + "id": "0x0000000000001250", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000012a8": { + "objName": "0x00000000000012a8", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": 104, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000012a8", + "id": "0x00000000000012a8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001310": { + "objName": "0x0000000000001310", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": "0x0000000000001310", + "id": "0x0000000000001310", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001388": { + "objName": "0x0000000000001388", + "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": "0x0000000000001388", + "id": "0x0000000000001388", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000055": { + "objName": "0x0000000000000055", + "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": 12099, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000055", + "id": "0x0000000000000055", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002f98": { + "objName": "0x0000000000002f98", + "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": "0x0000000000002f98", + "id": "0x0000000000002f98", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000035d5": { + "objName": "0x00000000000035d5", + "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": "0x00000000000035d5", + "id": "0x00000000000035d5", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003662": { + "objName": "0x0000000000003662", + "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": "0x0000000000003662", + "id": "0x0000000000003662", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004646": { + "objName": "0x0000000000004646", + "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": "0x0000000000004646", + "id": "0x0000000000004646", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004f50": { + "objName": "0x0000000000004f50", + "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": "0x0000000000004f50", + "id": "0x0000000000004f50", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000005018": { + "objName": "0x0000000000005018", + "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": "0x0000000000005018", + "id": "0x0000000000005018", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000050cd": { + "objName": "0x00000000000050cd", + "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": "0x00000000000050cd", + "id": "0x00000000000050cd", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000051b8": { + "objName": "0x00000000000051b8", + "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": "0x00000000000051b8", + "id": "0x00000000000051b8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000051ee": { + "objName": "0x00000000000051ee", + "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": 204, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000051ee", + "id": "0x00000000000051ee", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000052ba": { + "objName": "0x00000000000052ba", + "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": "0x00000000000052ba", + "id": "0x00000000000052ba", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000005788": { + "objName": "0x0000000000005788", + "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": 2824, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000005788", + "id": "0x0000000000005788", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000006290": { + "objName": "0x0000000000006290", + "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": 6529, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000006290", + "id": "0x0000000000006290", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000007c11": { + "objName": "0x0000000000007c11", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 1292, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000007c11", + "id": "0x0000000000007c11", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000811d": { + "objName": "0x000000000000811d", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": 2188, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000811d", + "id": "0x000000000000811d", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000089a9": { + "objName": "0x00000000000089a9", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 5691, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000089a9", + "id": "0x00000000000089a9", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000009fe4": { + "objName": "0x0000000000009fe4", + "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": "0x0000000000009fe4", + "id": "0x0000000000009fe4", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000ad1a": { + "objName": "0x000000000000ad1a", + "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": 1378, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000ad1a", + "id": "0x000000000000ad1a", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000b27c": { + "objName": "0x000000000000b27c", + "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": 1280, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000b27c", + "id": "0x000000000000b27c", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000b77c": { + "objName": "0x000000000000b77c", + "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": 425, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000b77c", + "id": "0x000000000000b77c", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000b925": { + "objName": "0x000000000000b925", + "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": 146, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000b925", + "id": "0x000000000000b925", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000b9b7": { + "objName": "0x000000000000b9b7", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": 437, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000b9b7", + "id": "0x000000000000b9b7", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000bb6c": { + "objName": "0x000000000000bb6c", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 6452, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000bb6c", + "id": "0x000000000000bb6c", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000d4a0": { + "objName": "0x000000000000d4a0", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": 1902, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000d4a0", + "id": "0x000000000000d4a0", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000dc0e": { + "objName": "0x000000000000dc0e", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 3119, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000dc0e", + "id": "0x000000000000dc0e", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000e83d": { + "objName": "0x000000000000e83d", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": 176, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000e83d", + "id": "0x000000000000e83d", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000e8ed": { + "objName": "0x000000000000e8ed", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": 203, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000e8ed", + "id": "0x000000000000e8ed", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000e9b8": { + "objName": "0x000000000000e9b8", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": 283, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000e9b8", + "id": "0x000000000000e9b8", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000ead3": { + "objName": "0x000000000000ead3", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": 313, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000ead3", + "id": "0x000000000000ead3", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000ec0c": { + "objName": "0x000000000000ec0c", + "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": 771, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000ec0c", + "id": "0x000000000000ec0c", + "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 + }, + "0x00000000000000e8": { + "objName": "0x00000000000000e8", + "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": "0x00000000000000e8", + "id": "0x00000000000000e8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000120": { + "objName": "0x0000000000000120", + "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": "0x0000000000000120", + "id": "0x0000000000000120", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000001d8": { + "objName": "0x00000000000001d8", + "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": "0x00000000000001d8", + "id": "0x00000000000001d8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000003b0": { + "objName": "0x00000000000003b0", + "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": "0x00000000000003b0", + "id": "0x00000000000003b0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000428": { + "objName": "0x0000000000000428", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 224, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000428", + "id": "0x0000000000000428", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000508": { + "objName": "0x0000000000000508", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": "0x0000000000000508", + "id": "0x0000000000000508", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000005d8": { + "objName": "0x00000000000005d8", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 536, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000005d8", + "id": "0x00000000000005d8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000007f0": { + "objName": "0x00000000000007f0", + "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": "0x00000000000007f0", + "id": "0x00000000000007f0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000908": { + "objName": "0x0000000000000908", + "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": "0x0000000000000908", + "id": "0x0000000000000908", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000990": { + "objName": "0x0000000000000990", + "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": "0x0000000000000990", + "id": "0x0000000000000990", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000aa0": { + "objName": "0x0000000000000aa0", + "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": 64, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000aa0", + "id": "0x0000000000000aa0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ae0": { + "objName": "0x0000000000000ae0", + "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": 104, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000ae0", + "id": "0x0000000000000ae0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000b48": { + "objName": "0x0000000000000b48", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": 128, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000b48", + "id": "0x0000000000000b48", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000bc8": { + "objName": "0x0000000000000bc8", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 784, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000bc8", + "id": "0x0000000000000bc8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000ed8": { + "objName": "0x0000000000000ed8", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": "0x0000000000000ed8", + "id": "0x0000000000000ed8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000f98": { + "objName": "0x0000000000000f98", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 216, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000000f98", + "id": "0x0000000000000f98", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001070": { + "objName": "0x0000000000001070", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": "0x0000000000001070", + "id": "0x0000000000001070", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000010a8": { + "objName": "0x00000000000010a8", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": "0x00000000000010a8", + "id": "0x00000000000010a8", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000010f0": { + "objName": "0x00000000000010f0", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": "0x00000000000010f0", + "id": "0x00000000000010f0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001148": { + "objName": "0x0000000000001148", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": 104, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001148", + "id": "0x0000000000001148", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000011b0": { + "objName": "0x00000000000011b0", + "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": "0x00000000000011b0", + "id": "0x00000000000011b0", + "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": "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": "0x0000000000000310", + "id": "0x0000000000000310", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000340": { + "objName": "0x0000000000000340", + "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": "0x0000000000000340", + "id": "0x0000000000000340", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000424": { + "objName": "0x0000000000000424", + "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": "0x0000000000000424", + "id": "0x0000000000000424", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000073c": { + "objName": "0x000000000000073c", + "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": "0x000000000000073c", + "id": "0x000000000000073c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000000f48": { + "objName": "0x0000000000000f48", + "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": "0x0000000000000f48", + "id": "0x0000000000000f48", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001150": { + "objName": "0x0000000000001150", + "parent": "gpio.o", + "path": "", + "romSize": 0, + "moduleName": "gpio.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": 992, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001150", + "id": "0x0000000000001150", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000001530": { + "objName": "0x0000000000001530", + "parent": "gpt.o", + "path": "", + "romSize": 0, + "moduleName": "gpt.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": 900, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000001530", + "id": "0x0000000000001530", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000018b4": { + "objName": "0x00000000000018b4", + "parent": "i2c.o", + "path": "", + "romSize": 0, + "moduleName": "i2c.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": 2404, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000018b4", + "id": "0x00000000000018b4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002218": { + "objName": "0x0000000000002218", + "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": "0x0000000000002218", + "id": "0x0000000000002218", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000026e4": { + "objName": "0x00000000000026e4", + "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": "0x00000000000026e4", + "id": "0x00000000000026e4", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000292c": { + "objName": "0x000000000000292c", + "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": "0x000000000000292c", + "id": "0x000000000000292c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002de4": { + "objName": "0x0000000000002de4", + "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": 236, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002de4", + "id": "0x0000000000002de4", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000002ed0": { + "objName": "0x0000000000002ed0", + "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": 456, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000002ed0", + "id": "0x0000000000002ed0", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003098": { + "objName": "0x0000000000003098", + "parent": "mycar_control.o", + "path": "", + "romSize": 0, + "moduleName": "mycar_control.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": 452, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003098", + "id": "0x0000000000003098", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000325c": { + "objName": "0x000000000000325c", + "parent": "vl53l0x_api.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api.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": 3452, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000325c", + "id": "0x000000000000325c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000003fd8": { + "objName": "0x0000000000003fd8", + "parent": "vl53l0x_api_calibration.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_calibration.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": 856, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000003fd8", + "id": "0x0000000000003fd8", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004330": { + "objName": "0x0000000000004330", + "parent": "vl53l0x_api_core.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_api_core.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": 964, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000004330", + "id": "0x0000000000004330", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000046f4": { + "objName": "0x00000000000046f4", + "parent": "vl53l0x.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x.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": 232, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x00000000000046f4", + "id": "0x00000000000046f4", + "dec": 0, + "sumSize": 0 + }, + "0x00000000000047dc": { + "objName": "0x00000000000047dc", + "parent": "vl53l0x_iic.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_iic.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": "0x00000000000047dc", + "id": "0x00000000000047dc", + "dec": 0, + "sumSize": 0 + }, + "0x000000000000490c": { + "objName": "0x000000000000490c", + "parent": "vl53l0x_i2c_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_i2c_platform.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": 380, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x000000000000490c", + "id": "0x000000000000490c", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004a88": { + "objName": "0x0000000000004a88", + "parent": "vl53l0x_platform.o", + "path": "", + "romSize": 0, + "moduleName": "vl53l0x_platform.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": 436, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "runAddr": "0x0000000000004a88", + "id": "0x0000000000004a88", + "dec": 0, + "sumSize": 0 + }, + "0x0000000000004c3c": { + "objName": "0x0000000000004c3c", + "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": "0x0000000000004c3c", + "id": "0x0000000000004c3c", + "dec": 0, + "sumSize": 0 + } + }, + "moduleSizeTree": { + "startup.o": { + "objName": "startup.o", + "parent": "", + "romSize": 1776, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": 1776 + }, + "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": 16587, + ".comment": 0, + ".debug_line": 12446, + ".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": 1494, + ".text": 1494, + ".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": 1498 + }, + "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": 7661, + ".debug_info": 0, + ".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": 1190, + ".debug_info": 0, + ".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": 5704, + ".debug_info": 0, + ".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": 1059, + ".debug_info": 0, + ".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 + }, + "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": 504, + ".debug_info": 0, + ".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": 304, + ".text": 304, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2125, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "clock.o", + "sumSize": 304 + }, + "interrupt.o": { + "objName": "interrupt.o", + "parent": "", + "romSize": 2464, + ".text": 2464, + ".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": 8528, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "interrupt.o", + "sumSize": 2464 + }, + "crg.o": { + "objName": "crg.o", + "parent": "", + "romSize": 6142, + ".text": 6142, + ".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": 29928, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "crg.o", + "sumSize": 6358 + }, + "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": 20168, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "debug.o", + "sumSize": 2256 + }, + "gpio.o": { + "objName": "gpio.o", + "parent": "", + "romSize": 4007, + ".text": 4007, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7584, + ".debug_info": 4102, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "gpio.o", + "sumSize": 4007 + }, + "gpt.o": { + "objName": "gpt.o", + "parent": "", + "romSize": 1611, + ".text": 1611, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7343, + ".debug_info": 4503, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "gpt.o", + "sumSize": 1611 + }, + "i2c.o": { + "objName": "i2c.o", + "parent": "", + "romSize": 1817, + ".text": 1817, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 20050, + ".debug_info": 14474, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "i2c.o", + "sumSize": 1817 + }, + "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": 5104, + ".debug_info": 2060, + ".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": 3413, + ".text": 3413, + ".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": 10087, + ".debug_info": 11856, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "uart.o", + "sumSize": 3413 + }, + "main.o": { + "objName": "main.o", + "parent": "", + "romSize": 1434, + ".text": 1434, + ".data": 4, + ".bss": 835, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2929, + ".debug_info": 20587, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "main.o", + "sumSize": 1438 + }, + "system_init.o": { + "objName": "system_init.o", + "parent": "", + "romSize": 2772, + ".text": 2772, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4066, + ".debug_info": 32940, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "system_init.o", + "sumSize": 2772 + }, + "mycar_control.o": { + "objName": "mycar_control.o", + "parent": "", + "romSize": 1530, + ".text": 1530, + ".data": 12, + ".bss": 24, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3413, + ".debug_info": 20670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "mycar_control.o", + "sumSize": 1542 + }, + "vl53l0x_api.o": { + "objName": "vl53l0x_api.o", + "parent": "", + "romSize": 8476, + ".text": 8476, + ".data": 681, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 22225, + ".debug_info": 30629, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x_api.o", + "sumSize": 9157 + }, + "vl53l0x_api_calibration.o": { + "objName": "vl53l0x_api_calibration.o", + "parent": "", + "romSize": 4032, + ".text": 4032, + ".data": 16, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8851, + ".debug_info": 25069, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x_api_calibration.o", + "sumSize": 4048 + }, + "vl53l0x_api_core.o": { + "objName": "vl53l0x_api_core.o", + "parent": "", + "romSize": 9736, + ".text": 9736, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 12611, + ".debug_info": 26165, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x_api_core.o", + "sumSize": 9736 + }, + "vl53l0x.o": { + "objName": "vl53l0x.o", + "parent": "", + "romSize": 650, + ".text": 650, + ".data": 388, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2632, + ".debug_info": 21665, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x.o", + "sumSize": 1038 + }, + "vl53l0x_iic.o": { + "objName": "vl53l0x_iic.o", + "parent": "", + "romSize": 892, + ".text": 892, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2827, + ".debug_info": 20246, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x_iic.o", + "sumSize": 892 + }, + "vl53l0x_i2c_platform.o": { + "objName": "vl53l0x_i2c_platform.o", + "parent": "", + "romSize": 840, + ".text": 840, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3167, + ".debug_info": 20970, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x_i2c_platform.o", + "sumSize": 840 + }, + "vl53l0x_platform.o": { + "objName": "vl53l0x_platform.o", + "parent": "", + "romSize": 862, + ".text": 862, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3469, + ".debug_info": 22576, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "vl53l0x_platform.o", + "sumSize": 862 + }, + "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": 1474, + ".comment": 0, + ".debug_line": 2388, + ".debug_info": 715, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "truncdfsf2.o", + "sumSize": 546 + }, + "lib-gcc": { + "objName": "lib-gcc", + "parent": "", + "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": 1474, + ".comment": 0, + ".debug_line": 2388, + ".debug_info": 715, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "lib-gcc", + "sumSize": 546 + }, + "abs.o": { + "objName": "abs.o", + "parent": "lib-libc", + "romSize": 10, + ".text": 10, + ".data": 0, + ".bss": 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, + "id": "abs.o", + "sumSize": 10 + }, + "lib-libc": { + "objName": "lib-libc", + "parent": "", + "romSize": 1220, + ".text": 1220, + ".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": 300, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "lib-libc", + "sumSize": 1220 + }, + "libc": { + "objName": "libc", + "parent": "lib-libc", + "romSize": 1056, + ".text": 1056, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 100, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "libc", + "sumSize": 1056 + }, + "strcpy.o": { + "objName": "strcpy.o", + "parent": "lib-libc", + "romSize": 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": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "strcpy.o", + "sumSize": 20 + }, + "strncmp.o": { + "objName": "strncmp.o", + "parent": "lib-libc", + "romSize": 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": 50, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "id": "strncmp.o", + "sumSize": 44 + }, + "stpcpy.o": { + "objName": "stpcpy.o", + "parent": "lib-libc", + "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": 42, + ".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, + "id": "stpcpy.o", + "sumSize": 90 + }, + "load address 0x000000000300f578": { + "objName": "load address 0x000000000300f578", + "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 0x000000000300f578", + "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": 62153, + ".text": 59056, + ".data": 1321, + ".bss": 1785, + ".data.magic": 4, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16635, + ".comment": 0, + ".debug_line": 252893, + ".debug_info": 283375, + ".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": 5144, + "children": [ + { + "key": "\\obj\\chip\\3061m\\startup.o", + "treeName": "-obj-chip\\3061m-startup.o", + "objName": "startup.o", + "sumSize": 1776, + "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": 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 + }, + { + "key": "\\obj\\chip\\3061m\\startup.o\\0x0000000004005000", + "treeName": "-obj-chip\\3061m-startup.o-0x0000000004005000", + "objName": "__nmi_stack_bottom", + "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": 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\\0x0000000004007c00", + "treeName": "-obj-chip\\3061m-startup.o-0x0000000004007c00", + "objName": "__irq_stack_top", + "sumSize": 1772, + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004005400", + "treeName": "-obj-chip\\3061m-startup.o-0x0000000004005400", + "objName": "__init_stack_top", + "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": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 0, + ".data": 0, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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": 2230, + "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\\0x00000000030006f0", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x00000000030006f0", + "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\\0x00000000030006f8", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x00000000030006f8", + "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 + }, + { + "key": "\\obj\\chip\\3061m\\chipinit\\chipinit.o\\0x0000000000000055", + "treeName": "-obj-chip\\3061m-chipinit-chipinit.o-0x0000000000000055", + "objName": "0x0000000000000055", + "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": 12099, + ".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": 16587, + ".comment": 0, + ".debug_line": 12446, + ".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": 1498, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o", + "objName": "anatrim.o", + "sumSize": 1498, + "children": [ + { + "key": "\\obj\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000003000738", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000738", + "objName": "CalculateGain", + "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\\chip\\3061m\\chipinit\\anatrim\\anatrim.o\\0x0000000003000762", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000762", + "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\\0x00000000030007ac", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000030007ac", + "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\\0x0000000003000cbc", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000cbc", + "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\\0x000000000300ede4", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x000000000300ede4", + "objName": "0x000000000300ede4", + "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\\0x0000000000002f98", + "treeName": "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000000002f98", + "objName": "0x0000000000002f98", + "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": 1494, + ".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": 1494, + ".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\\0x0000000003000d0e", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x0000000003000d0e", + "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\\0x00000000000035d5", + "treeName": "-obj-chip\\3061m-chipinit-anavrefinit-anavrefinit.o-0x00000000000035d5", + "objName": "0x00000000000035d5", + "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\\0x0000000003000d6c", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000003000d6c", + "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\\0x0000000000003662", + "treeName": "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000000003662", + "objName": "0x0000000000003662", + "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\\0x0000000003000dae", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000dae", + "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\\0x0000000003000e40", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000e40", + "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\\0x0000000003000ea4", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000ea4", + "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": 4382, + ".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\\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\\0x0000000000004646", + "treeName": "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000000004646", + "objName": "0x0000000000004646", + "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": 7661, + ".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": 7661, + ".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", + "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\\0x0000000003000f68", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000f68", + "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\\0x0000000003000f8a", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000f8a", + "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": 414, + ".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\\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\\0x0000000000004f50", + "treeName": "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000000004f50", + "objName": "0x0000000000004f50", + "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": 1190, + ".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": 1190, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2226, + ".data": 4, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16635, + ".comment": 0, + ".debug_line": 60608, + ".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", + "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\\0x0000000003000fa6", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000003000fa6", + "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\\0x000000000300102a", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000300102a", + "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": 4434, + ".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\\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\\0x0000000000005018", + "treeName": "-obj-chip\\3061m-fotp-fotp_info_read.o-0x0000000000005018", + "objName": "0x0000000000005018", + "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": 5704, + ".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": 5704, + ".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", + "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\\0x000000000300118c", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000300118c", + "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\\0x000000000300ede8", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000300ede8", + "objName": "0x000000000300ede8", + "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": 304, + ".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\\0x0000000000000a40", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.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": 217, + ".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\\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\\0x00000000000050cd", + "treeName": "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000050cd", + "objName": "0x00000000000050cd", + "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": 1059, + ".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": 1059, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 3364, + ".data": 4, + ".bss": 0, + ".data.magic": 4, + ".text.entry": 1772, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 16635, + ".comment": 0, + ".debug_line": 67371, + ".debug_info": 0, + ".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": 24684, + ".text": 24468, + ".data": 216, + ".bss": 926, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 119332, + ".debug_info": 41858, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "children": [ + { + "key": "\\obj\\drivers\\base\\src", + "treeName": "-obj-drivers-base\\src", + "objName": "base\\src", + "sumSize": 2790, + "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\\0x00000000030011f0", + "treeName": "-obj-drivers-base\\src-assert.o-0x00000000030011f0", + "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\\0x00000000000001c1", + "treeName": "-obj-drivers-base\\src-assert.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\\base\\src\\assert.o\\0x000000000000140b", + "treeName": "-obj-drivers-base\\src-assert.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": 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\\0x000000000000dc4b", + "treeName": "-obj-drivers-base\\src-assert.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": 129, + ".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\\0x0000000000000b19", + "treeName": "-obj-drivers-base\\src-assert.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": 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\\0x00000000000000d8", + "treeName": "-obj-drivers-base\\src-assert.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": 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\\0x0000000000000178", + "treeName": "-obj-drivers-base\\src-assert.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": 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\\0x00000000000051b8", + "treeName": "-obj-drivers-base\\src-assert.o-0x00000000000051b8", + "objName": "0x00000000000051b8", + "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\\0x0000000000000310", + "treeName": "-obj-drivers-base\\src-assert.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": 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": 504, + ".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", + "treeName": "-obj-drivers-base\\src-clock.o", + "objName": "clock.o", + "sumSize": 304, + "children": [ + { + "key": "\\obj\\drivers\\base\\src\\clock.o\\0x0000000003001206", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001206", + "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\\0x000000000300121a", + "treeName": "-obj-drivers-base\\src-clock.o-0x000000000300121a", + "objName": "BASE_FUNC_DelayUs", + "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\\drivers\\base\\src\\clock.o\\0x0000000003001274", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000003001274", + "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\\0x00000000030012ac", + "treeName": "-obj-drivers-base\\src-clock.o-0x00000000030012ac", + "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\\0x00000000030012e4", + "treeName": "-obj-drivers-base\\src-clock.o-0x00000000030012e4", + "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\\0x00000000000001f3", + "treeName": "-obj-drivers-base\\src-clock.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\\clock.o\\0x000000000000145e", + "treeName": "-obj-drivers-base\\src-clock.o-0x000000000000145e", + "objName": "0x000000000000145e", + "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\\0x000000000000dccc", + "treeName": "-obj-drivers-base\\src-clock.o-0x000000000000dccc", + "objName": "0x000000000000dccc", + "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": 721, + ".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\\0x0000000000000b75", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000000b75", + "objName": "0x0000000000000b75", + "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\\0x0000000000000198", + "treeName": "-obj-drivers-base\\src-clock.o-0x0000000000000198", + "objName": "0x0000000000000198", + "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\\0x00000000000051ee", + "treeName": "-obj-drivers-base\\src-clock.o-0x00000000000051ee", + "objName": "0x00000000000051ee", + "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": 204, + ".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\\0x00000000000000e8", + "treeName": "-obj-drivers-base\\src-clock.o-0x00000000000000e8", + "objName": "0x00000000000000e8", + "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\\0x0000000000000340", + "treeName": "-obj-drivers-base\\src-clock.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": 228, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 304, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2125, + ".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", + "treeName": "-obj-drivers-base\\src-interrupt.o", + "objName": "interrupt.o", + "sumSize": 2464, + "children": [ + { + "key": "\\obj\\drivers\\base\\src\\interrupt.o\\0x0000000003001336", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001336", + "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\\0x0000000003001356", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001356", + "objName": "InterruptEntry", + "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\\base\\src\\interrupt.o\\0x0000000003001392", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001392", + "objName": "IRQ_Init", + "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\\base\\src\\interrupt.o\\0x00000000030013e2", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030013e2", + "objName": "IRQ_Register", + "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\\base\\src\\interrupt.o\\0x0000000003001464", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001464", + "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\\0x0000000003001592", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001592", + "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\\0x00000000030015a4", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030015a4", + "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\\0x00000000030015b2", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030015b2", + "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\\0x00000000030015d0", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030015d0", + "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\\0x0000000003001604", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001604", + "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\\0x00000000030018ce", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000030018ce", + "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\\0x0000000003001bb2", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001bb2", + "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\\0x0000000003001c26", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001c26", + "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\\0x0000000003001c38", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000003001c38", + "objName": "IRQ_SetCallBack", + "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\\base\\src\\interrupt.o\\0x000000000300f010", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000300f010", + "objName": "0x000000000300f010", + "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\\0x000000000300f030", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000300f030", + "objName": "0x000000000300f030", + "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\\0x000000000300f050", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000300f050", + "objName": "0x000000000300f050", + "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\\0x000000000400054c", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000400054c", + "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\\0x0000000000000225", + "treeName": "-obj-drivers-base\\src-interrupt.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": 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\\0x000000000000161d", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000000161d", + "objName": "0x000000000000161d", + "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\\0x000000000000df9d", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x000000000000df9d", + "objName": "0x000000000000df9d", + "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": 3648, + ".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\\0x0000000000000cd0", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000000cd0", + "objName": "0x0000000000000cd0", + "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\\0x00000000000001e0", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000000001e0", + "objName": "0x00000000000001e0", + "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\\0x00000000000052ba", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x00000000000052ba", + "objName": "0x00000000000052ba", + "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\\0x0000000000000120", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000000120", + "objName": "0x0000000000000120", + "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\\0x0000000000000424", + "treeName": "-obj-drivers-base\\src-interrupt.o-0x0000000000000424", + "objName": "0x0000000000000424", + "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": 2464, + ".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": 8528, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2790, + ".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": 11157, + ".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", + "treeName": "-obj-drivers-crg\\src", + "objName": "crg\\src", + "sumSize": 6358, + "children": [ + { + "key": "\\obj\\drivers\\crg\\src\\crg.o", + "treeName": "-obj-drivers-crg\\src-crg.o", + "objName": "crg.o", + "sumSize": 6358, + "children": [ + { + "key": "\\obj\\drivers\\crg\\src\\crg.o\\0x0000000003001c76", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001c76", + "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\\0x0000000003001c9e", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001c9e", + "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\\0x0000000003001cc8", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001cc8", + "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\\0x0000000003001cf4", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001cf4", + "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\\0x0000000003001d10", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001d10", + "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\\0x0000000003001d2c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001d2c", + "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\\0x0000000003001d48", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001d48", + "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\\0x0000000003001d64", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001d64", + "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\\0x0000000003001d9a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001d9a", + "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\\0x0000000003001dc6", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001dc6", + "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\\0x0000000003001de2", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001de2", + "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\\0x0000000003001e40", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001e40", + "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\\0x0000000003001eca", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001eca", + "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\\0x0000000003001f12", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001f12", + "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\\0x0000000003001f5a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001f5a", + "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\\0x0000000003001f9a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001f9a", + "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\\0x0000000003001fda", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003001fda", + "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\\0x000000000300204e", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300204e", + "objName": "HAL_CRG_Init", + "sumSize": 704, + ".text": 704, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x000000000300230e", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300230e", + "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\\0x000000000300239c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300239c", + "objName": "CRG_GetVcoFreq", + "sumSize": 144, + ".text": 144, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x000000000300242c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300242c", + "objName": "HAL_CRG_GetPllFreq", + "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\\crg\\src\\crg.o\\0x0000000003002494", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002494", + "objName": "HAL_CRG_GetCoreClkFreq", + "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\\drivers\\crg\\src\\crg.o\\0x0000000003002526", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002526", + "objName": "HAL_CRG_GetIpFreq", + "sumSize": 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": 0, + ".comment": 0, + ".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\\0x0000000003002604", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002604", + "objName": "HAL_CRG_IpEnableSet", + "sumSize": 206, + ".text": 206, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000030026d2", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030026d2", + "objName": "CRG_GetAdcIpFreq", + "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\\crg\\src\\crg.o\\0x00000000030027ec", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030027ec", + "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\\0x00000000030028ae", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030028ae", + "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\\0x0000000003002900", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002900", + "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\\0x000000000300292a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300292a", + "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\\0x0000000003002958", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002958", + "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\\0x000000000300299a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300299a", + "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\\0x00000000030029d4", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030029d4", + "objName": "CRG_IpWoClkSelEnableSet", + "sumSize": 390, + ".text": 390, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003002b5a", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002b5a", + "objName": "CRG_IpWoClkSelEnableGet", + "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\\0x0000000003002bda", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002bda", + "objName": "CRG_IpWoClkSelResetSet", + "sumSize": 258, + ".text": 258, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003002cdc", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002cdc", + "objName": "CRG_IpWoClkSelResetGet", + "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\\0x0000000003002d5e", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002d5e", + "objName": "CRG_AdcEnableSet", + "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\\crg\\src\\crg.o\\0x0000000003002e10", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002e10", + "objName": "CRG_AdcEnableGet", + "sumSize": 118, + ".text": 118, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003002e86", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002e86", + "objName": "CRG_AdcClkSelectSet", + "sumSize": 238, + ".text": 238, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003002f74", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002f74", + "objName": "CRG_AdcClkSelectGet", + "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\\0x0000000003002ff6", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003002ff6", + "objName": "CRG_AdcDivSet", + "sumSize": 208, + ".text": 208, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000030030c6", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030030c6", + "objName": "CRG_AdcDivGet", + "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\\0x0000000003003154", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003154", + "objName": "CRG_EfcEnableSet", + "sumSize": 120, + ".text": 120, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000030031cc", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000030031cc", + "objName": "CRG_EfcEnableGet", + "sumSize": 102, + ".text": 102, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003003232", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003232", + "objName": "CRG_AnaEnableSet", + "sumSize": 356, + ".text": 356, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003003396", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000003003396", + "objName": "CRG_AnaEnableGet", + "sumSize": 118, + ".text": 118, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x000000000300f070", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300f070", + "objName": "0x000000000300f070", + "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\\0x000000000300f0c8", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000300f0c8", + "objName": "0x000000000300f0c8", + "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\\0x00000000040008e4", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000040008e4", + "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\\0x00000000040008e8", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000040008e8", + "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\\0x000000000000025b", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000000025b", + "objName": "0x000000000000025b", + "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\\0x0000000000001d1c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000001d1c", + "objName": "0x0000000000001d1c", + "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\\0x000000000000eddd", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000000eddd", + "objName": "0x000000000000eddd", + "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": 16804, + ".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\\0x0000000000000f45", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000000f45", + "objName": "0x0000000000000f45", + "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\\0x00000000000002a8", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000000002a8", + "objName": "0x00000000000002a8", + "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\\0x0000000000005788", + "treeName": "-obj-drivers-crg\\src-crg.o-0x0000000000005788", + "objName": "0x0000000000005788", + "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": 2824, + ".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\\0x00000000000001d8", + "treeName": "-obj-drivers-crg\\src-crg.o-0x00000000000001d8", + "objName": "0x00000000000001d8", + "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\\0x000000000000073c", + "treeName": "-obj-drivers-crg\\src-crg.o-0x000000000000073c", + "objName": "0x000000000000073c", + "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": 6142, + ".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": 29928, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 6142, + ".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": 29928, + ".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", + "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\\0x000000000300340c", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000300340c", + "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\\0x000000000300344e", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000300344e", + "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\\0x0000000003003498", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003003498", + "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\\0x00000000030034d8", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030034d8", + "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\\0x0000000003003540", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003003540", + "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\\0x00000000030035f2", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030035f2", + "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\\0x0000000003003650", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003003650", + "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\\0x0000000003003694", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003003694", + "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\\0x00000000030037d0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000030037d0", + "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\\0x000000000300396c", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000300396c", + "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\\0x0000000003003a86", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003003a86", + "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\\0x0000000003003af0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000003003af0", + "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\\0x000000000300f0e0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x000000000300f0e0", + "objName": "0x000000000300f0e0", + "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\\0x000000000000028d", + "treeName": "-obj-drivers-debug\\src-debug.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\\debug\\src\\debug.o\\0x00000000000036a0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000036a0", + "objName": "0x00000000000036a0", + "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\\0x0000000000012f81", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000012f81", + "objName": "0x0000000000012f81", + "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": 10268, + ".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\\0x00000000000011ff", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000011ff", + "objName": "0x00000000000011ff", + "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\\0x0000000000000490", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000000490", + "objName": "0x0000000000000490", + "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\\0x0000000000006290", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000006290", + "objName": "0x0000000000006290", + "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": 6529, + ".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\\0x00000000000003b0", + "treeName": "-obj-drivers-debug\\src-debug.o-0x00000000000003b0", + "objName": "0x00000000000003b0", + "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\\0x0000000000000f48", + "treeName": "-obj-drivers-debug\\src-debug.o-0x0000000000000f48", + "objName": "0x0000000000000f48", + "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": 20168, + ".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": 20168, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src", + "treeName": "-obj-drivers-gpio\\src", + "objName": "gpio\\src", + "sumSize": 4007, + "children": [ + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o", + "treeName": "-obj-drivers-gpio\\src-gpio.o", + "objName": "gpio.o", + "sumSize": 4007, + "children": [ + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x0000000003003c58", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003c58", + "objName": "IsGpioValue", + "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\\gpio\\src\\gpio.o\\0x0000000003003c84", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003c84", + "objName": "IsGpioDirection", + "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\\gpio\\src\\gpio.o\\0x0000000003003cb0", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003cb0", + "objName": "IsGpioPins", + "sumSize": 48, + ".text": 48, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x0000000003003ce0", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003ce0", + "objName": "IsGpioPin", + "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\\gpio\\src\\gpio.o\\0x0000000003003d5e", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003d5e", + "objName": "IsGpioITMode", + "sumSize": 84, + ".text": 84, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x0000000003003db2", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003db2", + "objName": "DCL_GPIO_SetValue", + "sumSize": 212, + ".text": 212, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x0000000003003e86", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003e86", + "objName": "DCL_GPIO_SetDirection", + "sumSize": 246, + ".text": 246, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x0000000003003f7c", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003003f7c", + "objName": "DCL_GPIO_ClearIrq", + "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\\gpio\\src\\gpio.o\\0x0000000003004022", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003004022", + "objName": "DCL_GPIO_EnableIrq", + "sumSize": 176, + ".text": 176, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000030040d2", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030040d2", + "objName": "DCL_GPIO_DisableIrq", + "sumSize": 170, + ".text": 170, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x000000000300417c", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x000000000300417c", + "objName": "DCL_GPIO_GetMIS", + "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\\gpio\\src\\gpio.o\\0x00000000030041f6", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030041f6", + "objName": "HAL_GPIO_Init", + "sumSize": 230, + ".text": 230, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000030042dc", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030042dc", + "objName": "HAL_GPIO_SetDirection", + "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\\gpio\\src\\gpio.o\\0x00000000030043c4", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030043c4", + "objName": "HAL_GPIO_SetValue", + "sumSize": 234, + ".text": 234, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000030044b2", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030044b2", + "objName": "HAL_GPIO_GetPinValue", + "sumSize": 204, + ".text": 204, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x000000000300457e", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x000000000300457e", + "objName": "GPIO_SetLevelIrqType", + "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\\gpio\\src\\gpio.o\\0x0000000003004614", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003004614", + "objName": "GPIO_SetEdgeIrqType", + "sumSize": 154, + ".text": 154, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000030046ae", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030046ae", + "objName": "HAL_GPIO_SetIrqType", + "sumSize": 526, + ".text": 526, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000030048bc", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030048bc", + "objName": "GPIO_ExcuteCallBack", + "sumSize": 264, + ".text": 264, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000030049c4", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x00000000030049c4", + "objName": "HAL_GPIO_IrqHandler", + "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\\gpio\\src\\gpio.o\\0x0000000003004ace", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000003004ace", + "objName": "HAL_GPIO_RegisterCallBack", + "sumSize": 250, + ".text": 250, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x000000000300f164", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x000000000300f164", + "objName": "0x000000000300f164", + "sumSize": 59, + ".text": 59, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpio\\src\\gpio.o\\0x00000000000002bf", + "treeName": "-obj-drivers-gpio\\src-gpio.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\\gpio\\src\\gpio.o\\0x0000000000003d74", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000000003d74", + "objName": "0x0000000000003d74", + "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": 4076, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x000000000001579d", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x000000000001579d", + "objName": "0x000000000001579d", + "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": 4102, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x000000000000151c", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x000000000000151c", + "objName": "0x000000000000151c", + "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": 710, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x0000000000000518", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000000000518", + "objName": "0x0000000000000518", + "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": 240, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x0000000000007c11", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000000007c11", + "objName": "0x0000000000007c11", + "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": 1292, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x0000000000000428", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000000000428", + "objName": "0x0000000000000428", + "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": 224, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpio\\src\\gpio.o\\0x0000000000001150", + "treeName": "-obj-drivers-gpio\\src-gpio.o-0x0000000000001150", + "objName": "0x0000000000001150", + "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": 992, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 4007, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7584, + ".debug_info": 4102, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 4007, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7584, + ".debug_info": 4102, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpt\\src", + "treeName": "-obj-drivers-gpt\\src", + "objName": "gpt\\src", + "sumSize": 1611, + "children": [ + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o", + "treeName": "-obj-drivers-gpt\\src-gpt.o", + "objName": "gpt.o", + "sumSize": 1611, + "children": [ + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o\\0x0000000003004bc8", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004bc8", + "objName": "IsGptPwmNum", + "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\\gpt\\src\\gpt.o\\0x0000000003004be4", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004be4", + "objName": "IsGptDiv", + "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\\gpt\\src\\gpt.o\\0x0000000003004c02", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c02", + "objName": "IsGptPeriod", + "sumSize": 48, + ".text": 48, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpt\\src\\gpt.o\\0x0000000003004c32", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c32", + "objName": "IsGptRefDot", + "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\\gpt\\src\\gpt.o\\0x0000000003004c50", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c50", + "objName": "IsGptAction", + "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\\gpt\\src\\gpt.o\\0x0000000003004c6c", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c6c", + "objName": "HAL_GPT_Init", + "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\\gpt\\src\\gpt.o\\0x0000000003004cfa", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004cfa", + "objName": "HAL_GPT_Start", + "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\\gpt\\src\\gpt.o\\0x0000000003004d88", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004d88", + "objName": "HAL_GPT_Stop", + "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\\gpt\\src\\gpt.o\\0x0000000003004e14", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003004e14", + "objName": "HAL_GPT_Config", + "sumSize": 780, + ".text": 780, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpt\\src\\gpt.o\\0x0000000003005120", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000003005120", + "objName": "HAL_GPT_GetReferCounterAndAction", + "sumSize": 218, + ".text": 218, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpt\\src\\gpt.o\\0x000000000300f1a0", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x000000000300f1a0", + "objName": "0x000000000300f1a0", + "sumSize": 25, + ".text": 25, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\gpt\\src\\gpt.o\\0x00000000000002f1", + "treeName": "-obj-drivers-gpt\\src-gpt.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\\gpt\\src\\gpt.o\\0x0000000000004d60", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000000004d60", + "objName": "0x0000000000004d60", + "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": 3178, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o\\0x00000000000167a3", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x00000000000167a3", + "objName": "0x00000000000167a3", + "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": 4503, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o\\0x00000000000017e2", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x00000000000017e2", + "objName": "0x00000000000017e2", + "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": 595, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o\\0x0000000000000608", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000000000608", + "objName": "0x0000000000000608", + "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": 224, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o\\0x000000000000811d", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x000000000000811d", + "objName": "0x000000000000811d", + "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": 2188, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\gpt\\src\\gpt.o\\0x0000000000000508", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000000000508", + "objName": "0x0000000000000508", + "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\\drivers\\gpt\\src\\gpt.o\\0x0000000000001530", + "treeName": "-obj-drivers-gpt\\src-gpt.o-0x0000000000001530", + "objName": "0x0000000000001530", + "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": 900, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1611, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7343, + ".debug_info": 4503, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1611, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 7343, + ".debug_info": 4503, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src", + "treeName": "-obj-drivers-i2c\\src", + "objName": "i2c\\src", + "sumSize": 1817, + "children": [ + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o", + "treeName": "-obj-drivers-i2c\\src-i2c.o", + "objName": "i2c.o", + "sumSize": 1817, + "children": [ + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x00000000030051fe", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000030051fe", + "objName": "IsI2cFunctionMode", + "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\\i2c\\src\\i2c.o\\0x000000000300523e", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x000000000300523e", + "objName": "IsI2cAddressMode", + "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\\i2c\\src\\i2c.o\\0x000000000300526a", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x000000000300526a", + "objName": "IsI2cSdaHoldTime", + "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\\i2c\\src\\i2c.o\\0x0000000003005288", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x0000000003005288", + "objName": "IsI2cGeneralCallMode", + "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\\i2c\\src\\i2c.o\\0x00000000030052b4", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000030052b4", + "objName": "IsI2cOwnAddressOrMask", + "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\\i2c\\src\\i2c.o\\0x00000000030052d0", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000030052d0", + "objName": "IsXMBusAddressOrMask", + "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\\i2c\\src\\i2c.o\\0x00000000030052ec", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000030052ec", + "objName": "IsXMBusAddressEnable", + "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\\i2c\\src\\i2c.o\\0x0000000003005318", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x0000000003005318", + "objName": "IsI2cSpikeFilterTime", + "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\\i2c\\src\\i2c.o\\0x0000000003005334", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x0000000003005334", + "objName": "IsI2cFreq", + "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\\i2c\\src\\i2c.o\\0x0000000003005350", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x0000000003005350", + "objName": "IsI2cIgnoreAckFlag", + "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\\i2c\\src\\i2c.o\\0x000000000300537c", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x000000000300537c", + "objName": "IsI2cTxWaterMark", + "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\\i2c\\src\\i2c.o\\0x0000000003005398", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x0000000003005398", + "objName": "IsI2cRxWaterMark", + "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\\i2c\\src\\i2c.o\\0x00000000030053b4", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000030053b4", + "objName": "IsI2cSdaDelayTime", + "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\\i2c\\src\\i2c.o\\0x00000000030053d0", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000030053d0", + "objName": "CheckAllInitParameters", + "sumSize": 588, + ".text": 588, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\i2c\\src\\i2c.o\\0x000000000300561c", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x000000000300561c", + "objName": "HAL_I2C_Init", + "sumSize": 738, + ".text": 738, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\i2c\\src\\i2c.o\\0x000000000300f1bc", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x000000000300f1bc", + "objName": "0x000000000300f1bc", + "sumSize": 25, + ".text": 25, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\i2c\\src\\i2c.o\\0x0000000000000323", + "treeName": "-obj-drivers-i2c\\src-i2c.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\\i2c\\src\\i2c.o\\0x00000000000059ca", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000000059ca", + "objName": "0x00000000000059ca", + "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": 10031, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x000000000001793a", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x000000000001793a", + "objName": "0x000000000001793a", + "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": 14474, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x0000000000001a35", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x0000000000001a35", + "objName": "0x0000000000001a35", + "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": 786, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x00000000000006e8", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000000006e8", + "objName": "0x00000000000006e8", + "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": 552, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x00000000000089a9", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000000089a9", + "objName": "0x00000000000089a9", + "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": 5691, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x00000000000005d8", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000000005d8", + "objName": "0x00000000000005d8", + "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": 536, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\drivers\\i2c\\src\\i2c.o\\0x00000000000018b4", + "treeName": "-obj-drivers-i2c\\src-i2c.o-0x00000000000018b4", + "objName": "0x00000000000018b4", + "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": 2404, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1817, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 20050, + ".debug_info": 14474, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1817, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 20050, + ".debug_info": 14474, + ".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\\0x00000000030058fe", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000030058fe", + "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\\0x0000000003005942", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005942", + "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\\0x00000000030059b0", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000030059b0", + "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\\0x0000000003005a3c", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005a3c", + "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\\0x0000000003005aaa", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005aaa", + "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\\0x0000000003005b18", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005b18", + "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\\0x0000000003005b6a", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005b6a", + "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\\0x0000000003005ba4", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005ba4", + "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\\0x0000000003005bf0", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005bf0", + "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\\0x0000000003005c3c", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005c3c", + "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\\0x0000000003005c88", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005c88", + "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\\0x000000000300f1d8", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x000000000300f1d8", + "objName": "0x000000000300f1d8", + "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\\0x0000000000000355", + "treeName": "-obj-drivers-iocmg\\src-iocmg.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\\iocmg\\src\\iocmg.o\\0x00000000000080f9", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000080f9", + "objName": "0x00000000000080f9", + "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\\0x000000000001b1c4", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x000000000001b1c4", + "objName": "0x000000000001b1c4", + "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\\0x0000000000001d47", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000001d47", + "objName": "0x0000000000001d47", + "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\\0x0000000000000910", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000000910", + "objName": "0x0000000000000910", + "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\\0x0000000000009fe4", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000009fe4", + "objName": "0x0000000000009fe4", + "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\\0x00000000000007f0", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000007f0", + "objName": "0x00000000000007f0", + "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\\0x0000000000002218", + "treeName": "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000002218", + "objName": "0x0000000000002218", + "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\\0x0000000003005cd4", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005cd4", + "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\\0x0000000003005d0a", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005d0a", + "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\\0x0000000003005d36", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005d36", + "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\\0x0000000003005d62", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005d62", + "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\\0x0000000003005d7e", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005d7e", + "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\\0x0000000003005db4", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003005db4", + "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\\0x000000000300600a", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000300600a", + "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\\0x000000000300608c", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000300608c", + "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\\0x0000000003006174", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000003006174", + "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\\0x000000000300f218", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000300f218", + "objName": "0x000000000300f218", + "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\\0x0000000000000387", + "treeName": "-obj-drivers-timer\\src-timer.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\\drivers\\timer\\src\\timer.o\\0x00000000000088ae", + "treeName": "-obj-drivers-timer\\src-timer.o-0x00000000000088ae", + "objName": "0x00000000000088ae", + "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\\0x000000000001c4c3", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000001c4c3", + "objName": "0x000000000001c4c3", + "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\\0x0000000000002005", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000002005", + "objName": "0x0000000000002005", + "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\\0x0000000000000a38", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000000a38", + "objName": "0x0000000000000a38", + "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\\0x000000000000ad1a", + "treeName": "-obj-drivers-timer\\src-timer.o-0x000000000000ad1a", + "objName": "0x000000000000ad1a", + "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": 1378, + ".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\\0x0000000000000908", + "treeName": "-obj-drivers-timer\\src-timer.o-0x0000000000000908", + "objName": "0x0000000000000908", + "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\\0x00000000000026e4", + "treeName": "-obj-drivers-timer\\src-timer.o-0x00000000000026e4", + "objName": "0x00000000000026e4", + "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": 5104, + ".debug_info": 2060, + ".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": 5104, + ".debug_info": 2060, + ".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": 3413, + "children": [ + { + "key": "\\obj\\drivers\\uart\\src\\uart.o", + "treeName": "-obj-drivers-uart\\src-uart.o", + "objName": "uart.o", + "sumSize": 3413, + "children": [ + { + "key": "\\obj\\drivers\\uart\\src\\uart.o\\0x0000000003006208", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006208", + "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\\0x0000000003006224", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006224", + "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\\0x0000000003006250", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006250", + "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\\0x0000000003006272", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006272", + "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\\0x00000000030062ae", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030062ae", + "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\\0x00000000030062ca", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030062ca", + "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\\0x00000000030062e6", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030062e6", + "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\\0x0000000003006324", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006324", + "objName": "BaudDetectCallBack", + "sumSize": 220, + ".text": 220, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003006400", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006400", + "objName": "CharterMatchCallBack", + "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\\uart\\src\\uart.o\\0x000000000300644c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300644c", + "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\\0x00000000030064e2", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030064e2", + "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\\0x00000000030068a0", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030068a0", + "objName": "WriteITCallBack", + "sumSize": 338, + ".text": 338, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000030069f2", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000030069f2", + "objName": "ReadITCallBack", + "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\\drivers\\uart\\src\\uart.o\\0x0000000003006b54", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006b54", + "objName": "ErrorServiceCallback", + "sumSize": 330, + ".text": 330, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003006c9e", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006c9e", + "objName": "HAL_UART_IrqHandler", + "sumSize": 350, + ".text": 350, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003006dfc", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000003006dfc", + "objName": "HAL_UART_RegisterCallBack", + "sumSize": 270, + ".text": 270, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x000000000300f258", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300f258", + "objName": "0x000000000300f258", + "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\\0x000000000300f26c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300f26c", + "objName": "0x000000000300f26c", + "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\\0x000000000300f288", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000300f288", + "objName": "0x000000000300f288", + "sumSize": 36, + ".text": 36, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000040008e9", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000040008e9", + "objName": "USART_RX_STA", + "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\\uart\\src\\uart.o\\0x00000000000003b9", + "treeName": "-obj-drivers-uart\\src-uart.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\\drivers\\uart\\src\\uart.o\\0x00000000000091b2", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000000091b2", + "objName": "0x00000000000091b2", + "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": 6158, + ".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\\0x000000000001cccf", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000001cccf", + "objName": "0x000000000001cccf", + "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": 11856, + ".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\\0x00000000000021f5", + "treeName": "-obj-drivers-uart\\src-uart.o-0x00000000000021f5", + "objName": "0x00000000000021f5", + "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": 831, + ".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\\0x0000000000000ad0", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000000000ad0", + "objName": "0x0000000000000ad0", + "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\\0x000000000000b27c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000000b27c", + "objName": "0x000000000000b27c", + "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": 1280, + ".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\\0x0000000000000990", + "treeName": "-obj-drivers-uart\\src-uart.o-0x0000000000000990", + "objName": "0x0000000000000990", + "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\\0x000000000000292c", + "treeName": "-obj-drivers-uart\\src-uart.o-0x000000000000292c", + "objName": "0x000000000000292c", + "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": 3413, + ".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": 10087, + ".debug_info": 11856, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 3413, + ".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": 10087, + ".debug_info": 11856, + ".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": 32325, + "children": [ + { + "key": "\\obj\\user\\main.o", + "treeName": "-obj-user-main.o", + "objName": "main.o", + "sumSize": 1438, + "children": [ + { + "key": "\\obj\\user\\main.o\\0x0000000003006f0e", + "treeName": "-obj-user-main.o-0x0000000003006f0e", + "objName": "UART0ReadInterruptCallback", + "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\\user\\main.o\\0x0000000003006f30", + "treeName": "-obj-user-main.o-0x0000000003006f30", + "objName": "TIMER0_InterruptProcess", + "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\\user\\main.o\\0x0000000003006fa0", + "treeName": "-obj-user-main.o-0x0000000003006fa0", + "objName": "GPIO1_1_CallbackFunc", + "sumSize": 38, + ".text": 38, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003006fc6", + "treeName": "-obj-user-main.o-0x0000000003006fc6", + "objName": "GPIO1_4_CallbackFunc", + "sumSize": 38, + ".text": 38, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003006fec", + "treeName": "-obj-user-main.o-0x0000000003006fec", + "objName": "UART0_InterruptTxInit", + "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\\user\\main.o\\0x000000000300704a", + "treeName": "-obj-user-main.o-0x000000000300704a", + "objName": "GetNumFromStr", + "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\\user\\main.o\\0x000000000300709a", + "treeName": "-obj-user-main.o-0x000000000300709a", + "objName": "main", + "sumSize": 778, + ".text": 778, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x000000000300f2ac", + "treeName": "-obj-user-main.o-0x000000000300f2ac", + "objName": "0x000000000300f2ac", + "sumSize": 260, + ".text": 260, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000040000fc", + "treeName": "-obj-user-main.o-0x00000000040000fc", + "objName": "targetSpeed", + "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\\user\\main.o\\0x00000000040008ea", + "treeName": "-obj-user-main.o-0x00000000040008ea", + "objName": "g_carStart", + "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\\user\\main.o\\0x00000000040008eb", + "treeName": "-obj-user-main.o-0x00000000040008eb", + "objName": "g_carStop", + "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\\user\\main.o\\0x00000000040008ec", + "treeName": "-obj-user-main.o-0x00000000040008ec", + "objName": "readData", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 20, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000900", + "treeName": "-obj-user-main.o-0x0000000004000900", + "objName": "g_uartReceiveFlag", + "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\\user\\main.o\\0x0000000004000901", + "treeName": "-obj-user-main.o-0x0000000004000901", + "objName": "f_250ms", + "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\\user\\main.o\\0x0000000004000902", + "treeName": "-obj-user-main.o-0x0000000004000902", + "objName": "f_1s", + "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\\user\\main.o\\0x0000000004000903", + "treeName": "-obj-user-main.o-0x0000000004000903", + "objName": "f_10s", + "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\\user\\main.o\\0x0000000004000904", + "treeName": "-obj-user-main.o-0x0000000004000904", + "objName": "v_num_left", + "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\\main.o\\0x0000000004000908", + "treeName": "-obj-user-main.o-0x0000000004000908", + "objName": "v_num_right", + "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\\main.o\\0x000000000400090c", + "treeName": "-obj-user-main.o-0x000000000400090c", + "objName": "workStatus", + "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\\user\\main.o\\0x000000000400090e", + "treeName": "-obj-user-main.o-0x000000000400090e", + "objName": "s_distance", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 2, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000910", + "treeName": "-obj-user-main.o-0x0000000004000910", + "objName": "f_sedentary", + "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\\user\\main.o\\0x0000000004000911", + "treeName": "-obj-user-main.o-0x0000000004000911", + "objName": "f_guard", + "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\\user\\main.o\\0x0000000004000914", + "treeName": "-obj-user-main.o-0x0000000004000914", + "objName": "time_num", + "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\\main.o\\0x0000000004000918", + "treeName": "-obj-user-main.o-0x0000000004000918", + "objName": "time_sedentary_num", + "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\\main.o\\0x000000000400091c", + "treeName": "-obj-user-main.o-0x000000000400091c", + "objName": "g_gpt1", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 52, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000950", + "treeName": "-obj-user-main.o-0x0000000004000950", + "objName": "g_gpt2", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 52, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000984", + "treeName": "-obj-user-main.o-0x0000000004000984", + "objName": "g_gpt3", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 52, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000040009b8", + "treeName": "-obj-user-main.o-0x00000000040009b8", + "objName": "g_timer0", + "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\\0x00000000040009e0", + "treeName": "-obj-user-main.o-0x00000000040009e0", + "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\\0x0000000004000a60", + "treeName": "-obj-user-main.o-0x0000000004000a60", + "objName": "g_i2c0", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 104, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000ac8", + "treeName": "-obj-user-main.o-0x0000000004000ac8", + "objName": "g_gpio1", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000b10", + "treeName": "-obj-user-main.o-0x0000000004000b10", + "objName": "g_gpio2", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000b58", + "treeName": "-obj-user-main.o-0x0000000004000b58", + "objName": "g_gpio3", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000ba0", + "treeName": "-obj-user-main.o-0x0000000004000ba0", + "objName": "g_gpio4", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000004000be8", + "treeName": "-obj-user-main.o-0x0000000004000be8", + "objName": "g_gpio5", + "sumSize": 0, + ".text": 0, + ".data": 0, + ".bss": 72, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000000003eb", + "treeName": "-obj-user-main.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\\main.o\\0x000000000000a9c0", + "treeName": "-obj-user-main.o-0x000000000000a9c0", + "objName": "0x000000000000a9c0", + "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": 1381, + ".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\\0x000000000001fb1f", + "treeName": "-obj-user-main.o-0x000000000001fb1f", + "objName": "0x000000000001fb1f", + "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": 20587, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\main.o\\0x0000000000002534", + "treeName": "-obj-user-main.o-0x0000000000002534", + "objName": "0x0000000000002534", + "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": 693, + ".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\\0x0000000000000bf0", + "treeName": "-obj-user-main.o-0x0000000000000bf0", + "objName": "0x0000000000000bf0", + "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": 80, + ".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\\0x000000000000b77c", + "treeName": "-obj-user-main.o-0x000000000000b77c", + "objName": "0x000000000000b77c", + "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": 425, + ".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\\0x0000000000000aa0", + "treeName": "-obj-user-main.o-0x0000000000000aa0", + "objName": "0x0000000000000aa0", + "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": 64, + ".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\\0x0000000000002de4", + "treeName": "-obj-user-main.o-0x0000000000002de4", + "objName": "0x0000000000002de4", + "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": 236, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1434, + ".data": 4, + ".bss": 835, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2929, + ".debug_info": 20587, + ".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": 2772, + "children": [ + { + "key": "\\obj\\user\\generatecode\\system_init.o", + "treeName": "-obj-user-generatecode-system_init.o", + "objName": "system_init.o", + "sumSize": 2772, + "children": [ + { + "key": "\\obj\\user\\generatecode\\system_init.o\\0x00000000030073b0", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000030073b0", + "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\\0x000000000300741a", + "treeName": "-obj-user-generatecode-system_init.o-0x000000000300741a", + "objName": "GPIO_Init", + "sumSize": 536, + ".text": 536, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003007642", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003007642", + "objName": "GPT1_Init", + "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\\user\\generatecode\\system_init.o\\0x00000000030076d4", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000030076d4", + "objName": "GPT2_Init", + "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\\user\\generatecode\\system_init.o\\0x0000000003007766", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003007766", + "objName": "GPT3_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\\0x0000000003007802", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003007802", + "objName": "TIMER0_Init", + "sumSize": 204, + ".text": 204, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000030078d2", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000030078d2", + "objName": "UART0WriteInterruptCallback", + "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\\user\\generatecode\\system_init.o\\0x00000000030078e4", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000030078e4", + "objName": "UART0_Init", + "sumSize": 208, + ".text": 208, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x00000000030079c0", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000030079c0", + "objName": "I2C0_Init", + "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\\user\\generatecode\\system_init.o\\0x0000000003007a46", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003007a46", + "objName": "IOConfig", + "sumSize": 1084, + ".text": 1084, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x0000000003007e96", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000003007e96", + "objName": "SystemInit", + "sumSize": 38, + ".text": 38, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\0x000000000000041d", + "treeName": "-obj-user-generatecode-system_init.o-0x000000000000041d", + "objName": "0x000000000000041d", + "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\\0x000000000000af25", + "treeName": "-obj-user-generatecode-system_init.o-0x000000000000af25", + "objName": "0x000000000000af25", + "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": 2479, + ".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\\0x0000000000024b8a", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000024b8a", + "objName": "0x0000000000024b8a", + "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": 32940, + ".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\\0x00000000000027e9", + "treeName": "-obj-user-generatecode-system_init.o-0x00000000000027e9", + "objName": "0x00000000000027e9", + "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": 711, + ".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\\0x0000000000000c40", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000000c40", + "objName": "0x0000000000000c40", + "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\\user\\generatecode\\system_init.o\\0x000000000000b925", + "treeName": "-obj-user-generatecode-system_init.o-0x000000000000b925", + "objName": "0x000000000000b925", + "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": 146, + ".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\\0x0000000000000ae0", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000000ae0", + "objName": "0x0000000000000ae0", + "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": 104, + ".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\\0x0000000000002ed0", + "treeName": "-obj-user-generatecode-system_init.o-0x0000000000002ed0", + "objName": "0x0000000000002ed0", + "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 + } + ], + ".text": 2772, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4066, + ".debug_info": 32940, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 2772, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 4066, + ".debug_info": 32940, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\mycar\\src", + "treeName": "-obj-user-mycar\\src", + "objName": "mycar\\src", + "sumSize": 1542, + "children": [ + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o", + "treeName": "-obj-user-mycar\\src-mycar_control.o", + "objName": "mycar_control.o", + "sumSize": 1542, + "children": [ + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o\\0x0000000003007ebc", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000003007ebc", + "objName": "MotorStatus", + "sumSize": 180, + ".text": 180, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\mycar\\src\\mycar_control.o\\0x0000000003007f74", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000003007f74", + "objName": "ChangeCarApt", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000003008006", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000003008006", + "objName": "SynTwoMotorSpeed", + "sumSize": 474, + ".text": 474, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\mycar\\src\\mycar_control.o\\0x00000000030081e0", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x00000000030081e0", + "objName": "SetCarAptAndStart", + "sumSize": 186, + ".text": 186, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\mycar\\src\\mycar_control.o\\0x000000000300829e", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000300829e", + "objName": "CarWorkStatus", + "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\\user\\mycar\\src\\mycar_control.o\\0x000000000300830c", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000300830c", + "objName": "TurnLeft", + "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\\mycar\\src\\mycar_control.o\\0x000000000300834c", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000300834c", + "objName": "TurnRight", + "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\\mycar\\src\\mycar_control.o\\0x000000000300838c", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000300838c", + "objName": "Retreat", + "sumSize": 50, + ".text": 50, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\mycar\\src\\mycar_control.o\\0x00000000030083be", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x00000000030083be", + "objName": "ClockwiseMotor", + "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\\user\\mycar\\src\\mycar_control.o\\0x00000000030083f8", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x00000000030083f8", + "objName": "AnticlockwiseMotor", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000003008436", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000003008436", + "objName": "Come", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000003008464", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000003008464", + "objName": "AsGuard", + "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\\user\\mycar\\src\\mycar_control.o\\0x000000000300f3b0", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000300f3b0", + "objName": "0x000000000300f3b0", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000004000100", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000100", + "objName": "KP", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000004000104", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000104", + "objName": "KI", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000004000108", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000108", + "objName": "KD", + "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\\user\\mycar\\src\\mycar_control.o\\0x0000000004000c30", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c30", + "objName": "preLeftError", + "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\\mycar\\src\\mycar_control.o\\0x0000000004000c34", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c34", + "objName": "ppreLeftError", + "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\\mycar\\src\\mycar_control.o\\0x0000000004000c38", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c38", + "objName": "preRightError", + "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\\mycar\\src\\mycar_control.o\\0x0000000004000c3c", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c3c", + "objName": "ppreRightError", + "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\\mycar\\src\\mycar_control.o\\0x0000000004000c40", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c40", + "objName": "Left_ESC_Output_PWM", + "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\\mycar\\src\\mycar_control.o\\0x0000000004000c44", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c44", + "objName": "Right_ESC_Output_PWM", + "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\\mycar\\src\\mycar_control.o\\0x000000000000044f", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000000044f", + "objName": "0x000000000000044f", + "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\\mycar\\src\\mycar_control.o\\0x000000000000b8d4", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000000b8d4", + "objName": "0x000000000000b8d4", + "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": 1558, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o\\0x000000000002cc36", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000002cc36", + "objName": "0x000000000002cc36", + "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": 20670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o\\0x0000000000002ab0", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000000002ab0", + "objName": "0x0000000000002ab0", + "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": 668, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o\\0x0000000000000cb8", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000000000cb8", + "objName": "0x0000000000000cb8", + "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\\user\\mycar\\src\\mycar_control.o\\0x000000000000b9b7", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x000000000000b9b7", + "objName": "0x000000000000b9b7", + "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": 437, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o\\0x0000000000000b48", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000000000b48", + "objName": "0x0000000000000b48", + "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": 128, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\mycar\\src\\mycar_control.o\\0x0000000000003098", + "treeName": "-obj-user-mycar\\src-mycar_control.o-0x0000000000003098", + "objName": "0x0000000000003098", + "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": 452, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1530, + ".data": 12, + ".bss": 24, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3413, + ".debug_info": 20670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1530, + ".data": 12, + ".bss": 24, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3413, + ".debug_info": 20670, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x", + "treeName": "-obj-user-vl53l0x", + "objName": "vl53l0x", + "sumSize": 26573, + ".text": 25488, + ".data": 1085, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 55782, + ".debug_info": 167320, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\core\\src", + "treeName": "-obj-user-vl53l0x-core\\src", + "objName": "core\\src", + "sumSize": 22941, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o", + "objName": "vl53l0x_api.o", + "sumSize": 9157, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x00000000030084c2", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030084c2", + "objName": "VL53L0X_GetOffsetCalibrationDataMicroMeter", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x00000000030084f6", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030084f6", + "objName": "VL53L0X_SetDeviceAddress", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008534", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008534", + "objName": "VL53L0X_DataInit", + "sumSize": 832, + ".text": 832, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300887c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300887c", + "objName": "VL53L0X_StaticInit", + "sumSize": 808, + ".text": 808, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008ba8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008ba8", + "objName": "VL53L0X_GetDeviceParameters", + "sumSize": 450, + ".text": 450, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008d6a", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008d6a", + "objName": "VL53L0X_SetDeviceMode", + "sumSize": 78, + ".text": 78, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008db8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008db8", + "objName": "VL53L0X_GetDeviceMode", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008de2", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008de2", + "objName": "VL53L0X_GetFractionEnable", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008e2e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008e2e", + "objName": "VL53L0X_SetMeasurementTimingBudgetMicroSeconds", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008e62", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008e62", + "objName": "VL53L0X_GetMeasurementTimingBudgetMicroSeconds", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008e96", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008e96", + "objName": "VL53L0X_GetVcselPulsePeriod", + "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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003008ed6", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008ed6", + "objName": "VL53L0X_SetSequenceStepEnable", + "sumSize": 388, + ".text": 388, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300905a", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300905a", + "objName": "sequence_step_enabled", + "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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300911a", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300911a", + "objName": "VL53L0X_GetSequenceStepEnables", + "sumSize": 226, + ".text": 226, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003009200", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009200", + "objName": "VL53L0X_GetInterMeasurementPeriodMilliSeconds", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300927e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300927e", + "objName": "VL53L0X_GetXTalkCompensationEnable", + "sumSize": 50, + ".text": 50, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x00000000030092b0", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030092b0", + "objName": "VL53L0X_GetXTalkCompensationRateMegaCps", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003009338", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009338", + "objName": "VL53L0X_SetLimitCheckEnable", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300949a", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300949a", + "objName": "VL53L0X_GetLimitCheckEnable", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x00000000030094f4", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030094f4", + "objName": "VL53L0X_SetLimitCheckValue", + "sumSize": 238, + ".text": 238, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x00000000030095e6", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030095e6", + "objName": "VL53L0X_GetLimitCheckValue", + "sumSize": 342, + ".text": 342, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003009740", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009740", + "objName": "VL53L0X_GetWrapAroundCheckEnable", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x00000000030097ba", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030097ba", + "objName": "VL53L0X_PerformSingleMeasurement", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300982e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300982e", + "objName": "VL53L0X_PerformRefCalibration", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300986c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300986c", + "objName": "VL53L0X_CheckAndLoadInterruptSettings", + "sumSize": 590, + ".text": 590, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003009ac2", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009ac2", + "objName": "VL53L0X_StartMeasurement", + "sumSize": 456, + ".text": 456, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003009c8e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009c8e", + "objName": "VL53L0X_GetMeasurementDataReady", + "sumSize": 160, + ".text": 160, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000003009d2e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009d2e", + "objName": "VL53L0X_GetRangingMeasurementData", + "sumSize": 760, + ".text": 760, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300a026", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a026", + "objName": "VL53L0X_PerformSingleRangingMeasurement", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300a096", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a096", + "objName": "VL53L0X_SetGpioConfig", + "sumSize": 718, + ".text": 718, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300a364", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a364", + "objName": "VL53L0X_GetInterruptThresholds", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300a3e6", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a3e6", + "objName": "VL53L0X_ClearInterruptMask", + "sumSize": 158, + ".text": 158, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300a484", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a484", + "objName": "VL53L0X_GetInterruptMaskStatus", + "sumSize": 84, + ".text": 84, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300a4d8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a4d8", + "objName": "VL53L0X_PerformRefSpadManagement", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f3b4", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f3b4", + "objName": "0x000000000300f3b4", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f40c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f40c", + "objName": "0x000000000300f40c", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f434", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f434", + "objName": "0x000000000300f434", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f448", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f448", + "objName": "0x000000000300f448", + "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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f460", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f460", + "objName": "0x000000000300f460", + "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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f478", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f478", + "objName": "0x000000000300f478", + "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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000300f490", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f490", + "objName": "0x000000000300f490", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000400010c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000400010c", + "objName": "DefaultTuningSettings", + "sumSize": 243, + ".text": 0, + ".data": 243, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000004000200", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000004000200", + "objName": "InterruptThresholdSettings", + "sumSize": 438, + ".text": 0, + ".data": 438, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000000000481", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000000481", + "objName": "0x0000000000000481", + "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\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000000beea", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000000beea", + "objName": "0x000000000000beea", + "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": 9912, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000000031cf4", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000031cf4", + "objName": "0x0000000000031cf4", + "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": 30629, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000000002d4c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000002d4c", + "objName": "0x0000000000002d4c", + "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": 775, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000000000d30", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000000d30", + "objName": "0x0000000000000d30", + "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": 800, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000000bb6c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000000bb6c", + "objName": "0x000000000000bb6c", + "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": 6452, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x0000000000000bc8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000000bc8", + "objName": "0x0000000000000bc8", + "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": 784, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api.o\\0x000000000000325c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000000325c", + "objName": "0x000000000000325c", + "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": 3452, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 8476, + ".data": 681, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 22225, + ".debug_info": 30629, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o", + "objName": "vl53l0x_api_calibration.o", + "sumSize": 4048, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a512", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a512", + "objName": "VL53L0X_get_offset_calibration_data_micro_meter", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a5b8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a5b8", + "objName": "get_next_good_spad", + "sumSize": 250, + ".text": 250, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a6b2", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a6b2", + "objName": "is_aperture", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a6ec", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a6ec", + "objName": "enable_spad_bit", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a782", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a782", + "objName": "set_ref_spad_map", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a7b8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a7b8", + "objName": "get_ref_spad_map", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a7ee", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a7ee", + "objName": "enable_ref_spads", + "sumSize": 336, + ".text": 336, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300a93e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a93e", + "objName": "perform_ref_signal_measurement", + "sumSize": 218, + ".text": 218, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300aa20", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300aa20", + "objName": "VL53L0X_perform_ref_spad_management", + "sumSize": 1218, + ".text": 1218, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300aee6", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300aee6", + "objName": "VL53L0X_set_reference_spads", + "sumSize": 380, + ".text": 380, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300b062", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b062", + "objName": "VL53L0X_perform_single_ref_calibration", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300b0e4", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b0e4", + "objName": "VL53L0X_ref_calibration_io", + "sumSize": 406, + ".text": 406, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300b27a", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b27a", + "objName": "VL53L0X_perform_vhv_calibration", + "sumSize": 230, + ".text": 230, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300b360", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b360", + "objName": "VL53L0X_perform_phase_calibration", + "sumSize": 224, + ".text": 224, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000300b440", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b440", + "objName": "VL53L0X_perform_ref_calibration", + "sumSize": 158, + ".text": 158, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x00000000040003b8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x00000000040003b8", + "objName": "refArrayQuadrants", + "sumSize": 16, + ".text": 0, + ".data": 16, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x00000000000004b3", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x00000000000004b3", + "objName": "0x00000000000004b3", + "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\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000000e5a2", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000000e5a2", + "objName": "0x000000000000e5a2", + "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": 4905, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x0000000000039499", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000039499", + "objName": "0x0000000000039499", + "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": 25069, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x0000000000003053", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000003053", + "objName": "0x0000000000003053", + "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": 738, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x0000000000001050", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000001050", + "objName": "0x0000000000001050", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x000000000000d4a0", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000000d4a0", + "objName": "0x000000000000d4a0", + "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": 1902, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x0000000000000ed8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000000ed8", + "objName": "0x0000000000000ed8", + "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 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_calibration.o\\0x0000000000003fd8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000003fd8", + "objName": "0x0000000000003fd8", + "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": 856, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 4032, + ".data": 16, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 8851, + ".debug_info": 25069, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o", + "objName": "vl53l0x_api_core.o", + "sumSize": 9736, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300b4de", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b4de", + "objName": "VL53L0X_measurement_poll_for_completion", + "sumSize": 120, + ".text": 120, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300b556", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b556", + "objName": "VL53L0X_decode_vcsel_period", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300b580", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b580", + "objName": "VL53L0X_isqrt", + "sumSize": 144, + ".text": 144, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300b610", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b610", + "objName": "VL53L0X_device_read_strobe", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300b6be", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b6be", + "objName": "VL53L0X_get_info_from_device", + "sumSize": 2824, + ".text": 2824, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c1d2", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c1d2", + "objName": "VL53L0X_calc_macro_period_ps", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c21e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c21e", + "objName": "VL53L0X_encode_timeout", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c28e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c28e", + "objName": "VL53L0X_decode_timeout", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c2c4", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c2c4", + "objName": "VL53L0X_calc_timeout_mclks", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c330", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c330", + "objName": "VL53L0X_calc_timeout_us", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c39c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c39c", + "objName": "get_sequence_step_timeout", + "sumSize": 506, + ".text": 506, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c596", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c596", + "objName": "set_sequence_step_timeout", + "sumSize": 560, + ".text": 560, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c7ce", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c7ce", + "objName": "VL53L0X_get_vcsel_pulse_period", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300c858", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c858", + "objName": "VL53L0X_set_measurement_timing_budget_micro_seconds", + "sumSize": 530, + ".text": 530, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300ca6e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300ca6e", + "objName": "VL53L0X_get_measurement_timing_budget_micro_seconds", + "sumSize": 416, + ".text": 416, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300cc12", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300cc12", + "objName": "VL53L0X_load_tuning_settings", + "sumSize": 674, + ".text": 674, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300ceb4", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300ceb4", + "objName": "VL53L0X_get_total_xtalk_rate", + "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\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300cf32", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300cf32", + "objName": "VL53L0X_get_total_signal_rate", + "sumSize": 96, + ".text": 96, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300cf92", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300cf92", + "objName": "get_dmax_lut_points", + "sumSize": 186, + ".text": 186, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300d04c", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300d04c", + "objName": "VL53L0X_calc_dmax", + "sumSize": 380, + ".text": 380, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300d1c8", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300d1c8", + "objName": "VL53L0X_calc_sigma_estimate", + "sumSize": 1340, + ".text": 1340, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000300d708", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300d708", + "objName": "VL53L0X_get_pal_range_status", + "sumSize": 1030, + ".text": 1030, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x00000000000004e5", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x00000000000004e5", + "objName": "0x00000000000004e5", + "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\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000000f8cb", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000000f8cb", + "objName": "0x000000000000f8cb", + "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": 7266, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000003f686", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000003f686", + "objName": "0x000000000003f686", + "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": 26165, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x0000000000003335", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000003335", + "objName": "0x0000000000003335", + "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": 764, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x0000000000001120", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000001120", + "objName": "0x0000000000001120", + "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": 232, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x000000000000dc0e", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000000dc0e", + "objName": "0x000000000000dc0e", + "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": 3119, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x0000000000000f98", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000000f98", + "objName": "0x0000000000000f98", + "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": 216, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\core\\src\\vl53l0x_api_core.o\\0x0000000000004330", + "treeName": "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000004330", + "objName": "0x0000000000004330", + "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": 964, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 9736, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 12611, + ".debug_info": 26165, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 22244, + ".data": 697, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 43687, + ".debug_info": 81863, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src", + "treeName": "-obj-user-vl53l0x-mine\\src", + "objName": "mine\\src", + "sumSize": 1930, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x.o", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o", + "objName": "vl53l0x.o", + "sumSize": 1038, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000300db16", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300db16", + "objName": "device_detect", + "sumSize": 186, + ".text": 186, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000300dbd0", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dbd0", + "objName": "device_init", + "sumSize": 102, + ".text": 102, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000300dc36", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dc36", + "objName": "Vl53l0xInit", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000300dc64", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dc64", + "objName": "Vl53l0xStart", + "sumSize": 36, + ".text": 36, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000300dc8c", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dc8c", + "objName": "GetDistance", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000300f4a4", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300f4a4", + "objName": "0x000000000300f4a4", + "sumSize": 212, + ".text": 212, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x00000000040003c8", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x00000000040003c8", + "objName": "demo_dev", + "sumSize": 388, + ".text": 0, + ".data": 388, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x0000000000000517", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000000517", + "objName": "0x0000000000000517", + "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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000001152d", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000001152d", + "objName": "0x000000000001152d", + "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": 1382, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x0000000000045cbb", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000045cbb", + "objName": "0x0000000000045cbb", + "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": 21665, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x0000000000003631", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000003631", + "objName": "0x0000000000003631", + "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": 664, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x0000000000001208", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000001208", + "objName": "0x0000000000001208", + "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\\vl53l0x\\mine\\src\\vl53l0x.o\\0x000000000000e83d", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000000e83d", + "objName": "0x000000000000e83d", + "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": 176, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x0000000000001070", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000001070", + "objName": "0x0000000000001070", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x.o\\0x00000000000046f4", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x00000000000046f4", + "objName": "0x00000000000046f4", + "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": 232, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 650, + ".data": 388, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2632, + ".debug_info": 21665, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o", + "objName": "vl53l0x_iic.o", + "sumSize": 892, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300dcd0", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dcd0", + "objName": "vl53l0x_iic_start", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300dd22", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dd22", + "objName": "vl53l0x_iic_stop", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300dd80", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dd80", + "objName": "vl53l0x_iic_wait_ack", + "sumSize": 158, + ".text": 158, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300de1e", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300de1e", + "objName": "vl53l0x_iic_ack", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300de70", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300de70", + "objName": "vl53l0x_iic_nack", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300dec2", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dec2", + "objName": "vl53l0x_iic_send_byte", + "sumSize": 156, + ".text": 156, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300df5e", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300df5e", + "objName": "vl53l0x_iic_read_byte", + "sumSize": 168, + ".text": 168, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000300e00a", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300e00a", + "objName": "vl53l0x_hw_reset", + "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\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x0000000000000549", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x0000000000000549", + "objName": "0x0000000000000549", + "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\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x0000000000011a93", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x0000000000011a93", + "objName": "0x0000000000011a93", + "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": 1485, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000004b15c", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000004b15c", + "objName": "0x000000000004b15c", + "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": 20246, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x00000000000038c9", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x00000000000038c9", + "objName": "0x00000000000038c9", + "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": 625, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x0000000000001250", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x0000000000001250", + "objName": "0x0000000000001250", + "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\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x000000000000e8ed", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000000e8ed", + "objName": "0x000000000000e8ed", + "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": 203, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x00000000000010a8", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x00000000000010a8", + "objName": "0x00000000000010a8", + "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\\vl53l0x\\mine\\src\\vl53l0x_iic.o\\0x00000000000047dc", + "treeName": "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x00000000000047dc", + "objName": "0x00000000000047dc", + "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": 892, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 2827, + ".debug_info": 20246, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1542, + ".data": 388, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 5459, + ".debug_info": 41911, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src", + "treeName": "-obj-user-vl53l0x-platform\\src", + "objName": "platform\\src", + "sumSize": 1702, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o", + "objName": "vl53l0x_i2c_platform.o", + "sumSize": 840, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e058", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e058", + "objName": "VL53L0X_write_multi", + "sumSize": 170, + ".text": 170, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e102", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e102", + "objName": "VL53L0X_read_multi", + "sumSize": 208, + ".text": 208, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e1d2", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e1d2", + "objName": "VL53L0X_write_byte", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e222", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e222", + "objName": "VL53L0X_write_word", + "sumSize": 96, + ".text": 96, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e282", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e282", + "objName": "VL53L0X_read_byte", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e2ce", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e2ce", + "objName": "VL53L0X_read_word", + "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\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000300e338", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e338", + "objName": "VL53L0X_read_dword", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000000057b", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000000057b", + "objName": "0x000000000000057b", + "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\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x0000000000012060", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x0000000000012060", + "objName": "0x0000000000012060", + "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": 1644, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x0000000000050072", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x0000000000050072", + "objName": "0x0000000000050072", + "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": 20970, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x0000000000003b3a", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x0000000000003b3a", + "objName": "0x0000000000003b3a", + "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": 618, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x00000000000012a8", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x00000000000012a8", + "objName": "0x00000000000012a8", + "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": 104, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000000e9b8", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000000e9b8", + "objName": "0x000000000000e9b8", + "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": 283, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x00000000000010f0", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x00000000000010f0", + "objName": "0x00000000000010f0", + "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\\vl53l0x\\platform\\src\\vl53l0x_i2c_platform.o\\0x000000000000490c", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000000490c", + "objName": "0x000000000000490c", + "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": 380, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 840, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3167, + ".debug_info": 20970, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o", + "objName": "vl53l0x_platform.o", + "sumSize": 862, + "children": [ + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e3a0", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e3a0", + "objName": "VL53L0X_WriteMulti", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e414", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e414", + "objName": "VL53L0X_ReadMulti", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e484", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e484", + "objName": "VL53L0X_WrByte", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e4e0", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e4e0", + "objName": "VL53L0X_WrWord", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e53c", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e53c", + "objName": "VL53L0X_UpdateByte", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e5e2", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e5e2", + "objName": "VL53L0X_RdByte", + "sumSize": 86, + ".text": 86, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e638", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e638", + "objName": "VL53L0X_RdWord", + "sumSize": 86, + ".text": 86, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e68e", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e68e", + "objName": "VL53L0X_RdDWord", + "sumSize": 86, + ".text": 86, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000300e6e4", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e6e4", + "objName": "VL53L0X_PollingDelay", + "sumSize": 26, + ".text": 26, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".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\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x00000000000005ad", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x00000000000005ad", + "objName": "0x00000000000005ad", + "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\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x00000000000126cc", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x00000000000126cc", + "objName": "0x00000000000126cc", + "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": 1755, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000005525c", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000005525c", + "objName": "0x000000000005525c", + "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": 22576, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x0000000000003da4", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000003da4", + "objName": "0x0000000000003da4", + "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": 691, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x0000000000001310", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000001310", + "objName": "0x0000000000001310", + "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\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x000000000000ead3", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000000ead3", + "objName": "0x000000000000ead3", + "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": 313, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x0000000000001148", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000001148", + "objName": "0x0000000000001148", + "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": 104, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + }, + { + "key": "\\obj\\user\\vl53l0x\\platform\\src\\vl53l0x_platform.o\\0x0000000000004a88", + "treeName": "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000004a88", + "objName": "0x0000000000004a88", + "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": 436, + ".debug_info": 0, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 862, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 3469, + ".debug_info": 22576, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ], + ".text": 1702, + ".data": 0, + ".bss": 0, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 6636, + ".debug_info": 43546, + ".debug_abbrev": 0, + ".debug_aranges": 0, + ".debug_str": 0, + ".debug_ranges": 0, + ".debug_frame": 0, + ".debug_loc": 0 + } + ] + } + ], + ".text": 31224, + ".data": 1101, + ".bss": 859, + ".data.magic": 0, + ".text.entry": 0, + ".stacks": 0, + ".text.sram": 0, + ".reserved.data": 0, + ".stackBound": 0, + ".riscv.attributes": 0, + ".comment": 0, + ".debug_line": 66190, + ".debug_info": 241517, + ".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-0x0000000004005000", + "-obj-chip\\3061m-startup.o-0x0000000004007c00", + "-obj-chip\\3061m-startup.o-0x0000000004005400", + "-obj-chip\\3061m-chipinit", + "-obj-chip\\3061m-chipinit-chipinit.o", + "-obj-chip\\3061m-chipinit-chipinit.o-0x00000000030006f0", + "-obj-chip\\3061m-chipinit-chipinit.o-0x00000000030006f8", + "-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-chipinit.o-0x0000000000000055", + "-obj-chip\\3061m-chipinit-anatrim", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000738", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000762", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x00000000030007ac", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x0000000003000cbc", + "-obj-chip\\3061m-chipinit-anatrim-anatrim.o-0x000000000300ede4", + "-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-0x0000000000002f98", + "-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-0x0000000003000d0e", + "-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-0x00000000000035d5", + "-obj-chip\\3061m-chipinit-crginit", + "-obj-chip\\3061m-chipinit-crginit-crginit.o", + "-obj-chip\\3061m-chipinit-crginit-crginit.o-0x0000000003000d6c", + "-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-0x0000000000003662", + "-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-0x0000000003000dae", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000e40", + "-obj-chip\\3061m-chipinit-flashinit-flashinit.o-0x0000000003000ea4", + "-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-0x0000000000004646", + "-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-0x0000000003000f68", + "-obj-chip\\3061m-chipinit-systickinit-systickinit.o-0x0000000003000f8a", + "-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-0x0000000000004f50", + "-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-0x0000000003000fa6", + "-obj-chip\\3061m-fotp-fotp_info_read.o-0x000000000300102a", + "-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-0x0000000000005018", + "-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-0x000000000300118c", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x000000000300ede8", + "-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-0x0000000000000a40", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x0000000000000158", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000050cd", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000000c8", + "-obj-chip\\3061m-ip_crg-ip_crg_common.o-0x00000000000002e0", + "-obj-drivers", + "-obj-drivers-base\\src", + "-obj-drivers-base\\src-assert.o", + "-obj-drivers-base\\src-assert.o-0x00000000030011f0", + "-obj-drivers-base\\src-assert.o-0x00000000000001c1", + "-obj-drivers-base\\src-assert.o-0x000000000000140b", + "-obj-drivers-base\\src-assert.o-0x000000000000dc4b", + "-obj-drivers-base\\src-assert.o-0x0000000000000b19", + "-obj-drivers-base\\src-assert.o-0x00000000000000d8", + "-obj-drivers-base\\src-assert.o-0x0000000000000178", + "-obj-drivers-base\\src-assert.o-0x00000000000051b8", + "-obj-drivers-base\\src-assert.o-0x0000000000000310", + "-obj-drivers-base\\src-clock.o", + "-obj-drivers-base\\src-clock.o-0x0000000003001206", + "-obj-drivers-base\\src-clock.o-0x000000000300121a", + "-obj-drivers-base\\src-clock.o-0x0000000003001274", + "-obj-drivers-base\\src-clock.o-0x00000000030012ac", + "-obj-drivers-base\\src-clock.o-0x00000000030012e4", + "-obj-drivers-base\\src-clock.o-0x00000000000001f3", + "-obj-drivers-base\\src-clock.o-0x000000000000145e", + "-obj-drivers-base\\src-clock.o-0x000000000000dccc", + "-obj-drivers-base\\src-clock.o-0x0000000000000b75", + "-obj-drivers-base\\src-clock.o-0x0000000000000198", + "-obj-drivers-base\\src-clock.o-0x00000000000051ee", + "-obj-drivers-base\\src-clock.o-0x00000000000000e8", + "-obj-drivers-base\\src-clock.o-0x0000000000000340", + "-obj-drivers-base\\src-interrupt.o", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001336", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001356", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001392", + "-obj-drivers-base\\src-interrupt.o-0x00000000030013e2", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001464", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001592", + "-obj-drivers-base\\src-interrupt.o-0x00000000030015a4", + "-obj-drivers-base\\src-interrupt.o-0x00000000030015b2", + "-obj-drivers-base\\src-interrupt.o-0x00000000030015d0", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001604", + "-obj-drivers-base\\src-interrupt.o-0x00000000030018ce", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001bb2", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001c26", + "-obj-drivers-base\\src-interrupt.o-0x0000000003001c38", + "-obj-drivers-base\\src-interrupt.o-0x000000000300f010", + "-obj-drivers-base\\src-interrupt.o-0x000000000300f030", + "-obj-drivers-base\\src-interrupt.o-0x000000000300f050", + "-obj-drivers-base\\src-interrupt.o-0x000000000400054c", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000225", + "-obj-drivers-base\\src-interrupt.o-0x000000000000161d", + "-obj-drivers-base\\src-interrupt.o-0x000000000000df9d", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000cd0", + "-obj-drivers-base\\src-interrupt.o-0x00000000000001e0", + "-obj-drivers-base\\src-interrupt.o-0x00000000000052ba", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000120", + "-obj-drivers-base\\src-interrupt.o-0x0000000000000424", + "-obj-drivers-crg\\src", + "-obj-drivers-crg\\src-crg.o", + "-obj-drivers-crg\\src-crg.o-0x0000000003001c76", + "-obj-drivers-crg\\src-crg.o-0x0000000003001c9e", + "-obj-drivers-crg\\src-crg.o-0x0000000003001cc8", + "-obj-drivers-crg\\src-crg.o-0x0000000003001cf4", + "-obj-drivers-crg\\src-crg.o-0x0000000003001d10", + "-obj-drivers-crg\\src-crg.o-0x0000000003001d2c", + "-obj-drivers-crg\\src-crg.o-0x0000000003001d48", + "-obj-drivers-crg\\src-crg.o-0x0000000003001d64", + "-obj-drivers-crg\\src-crg.o-0x0000000003001d9a", + "-obj-drivers-crg\\src-crg.o-0x0000000003001dc6", + "-obj-drivers-crg\\src-crg.o-0x0000000003001de2", + "-obj-drivers-crg\\src-crg.o-0x0000000003001e40", + "-obj-drivers-crg\\src-crg.o-0x0000000003001eca", + "-obj-drivers-crg\\src-crg.o-0x0000000003001f12", + "-obj-drivers-crg\\src-crg.o-0x0000000003001f5a", + "-obj-drivers-crg\\src-crg.o-0x0000000003001f9a", + "-obj-drivers-crg\\src-crg.o-0x0000000003001fda", + "-obj-drivers-crg\\src-crg.o-0x000000000300204e", + "-obj-drivers-crg\\src-crg.o-0x000000000300230e", + "-obj-drivers-crg\\src-crg.o-0x000000000300239c", + "-obj-drivers-crg\\src-crg.o-0x000000000300242c", + "-obj-drivers-crg\\src-crg.o-0x0000000003002494", + "-obj-drivers-crg\\src-crg.o-0x0000000003002526", + "-obj-drivers-crg\\src-crg.o-0x0000000003002604", + "-obj-drivers-crg\\src-crg.o-0x00000000030026d2", + "-obj-drivers-crg\\src-crg.o-0x00000000030027ec", + "-obj-drivers-crg\\src-crg.o-0x00000000030028ae", + "-obj-drivers-crg\\src-crg.o-0x0000000003002900", + "-obj-drivers-crg\\src-crg.o-0x000000000300292a", + "-obj-drivers-crg\\src-crg.o-0x0000000003002958", + "-obj-drivers-crg\\src-crg.o-0x000000000300299a", + "-obj-drivers-crg\\src-crg.o-0x00000000030029d4", + "-obj-drivers-crg\\src-crg.o-0x0000000003002b5a", + "-obj-drivers-crg\\src-crg.o-0x0000000003002bda", + "-obj-drivers-crg\\src-crg.o-0x0000000003002cdc", + "-obj-drivers-crg\\src-crg.o-0x0000000003002d5e", + "-obj-drivers-crg\\src-crg.o-0x0000000003002e10", + "-obj-drivers-crg\\src-crg.o-0x0000000003002e86", + "-obj-drivers-crg\\src-crg.o-0x0000000003002f74", + "-obj-drivers-crg\\src-crg.o-0x0000000003002ff6", + "-obj-drivers-crg\\src-crg.o-0x00000000030030c6", + "-obj-drivers-crg\\src-crg.o-0x0000000003003154", + "-obj-drivers-crg\\src-crg.o-0x00000000030031cc", + "-obj-drivers-crg\\src-crg.o-0x0000000003003232", + "-obj-drivers-crg\\src-crg.o-0x0000000003003396", + "-obj-drivers-crg\\src-crg.o-0x000000000300f070", + "-obj-drivers-crg\\src-crg.o-0x000000000300f0c8", + "-obj-drivers-crg\\src-crg.o-0x0000000004000024", + "-obj-drivers-crg\\src-crg.o-0x00000000040008e4", + "-obj-drivers-crg\\src-crg.o-0x00000000040008e8", + "-obj-drivers-crg\\src-crg.o-0x000000000000025b", + "-obj-drivers-crg\\src-crg.o-0x0000000000001d1c", + "-obj-drivers-crg\\src-crg.o-0x000000000000eddd", + "-obj-drivers-crg\\src-crg.o-0x0000000000000f45", + "-obj-drivers-crg\\src-crg.o-0x00000000000002a8", + "-obj-drivers-crg\\src-crg.o-0x0000000000005788", + "-obj-drivers-crg\\src-crg.o-0x00000000000001d8", + "-obj-drivers-crg\\src-crg.o-0x000000000000073c", + "-obj-drivers-debug\\src", + "-obj-drivers-debug\\src-debug.o", + "-obj-drivers-debug\\src-debug.o-0x000000000300340c", + "-obj-drivers-debug\\src-debug.o-0x000000000300344e", + "-obj-drivers-debug\\src-debug.o-0x0000000003003498", + "-obj-drivers-debug\\src-debug.o-0x00000000030034d8", + "-obj-drivers-debug\\src-debug.o-0x0000000003003540", + "-obj-drivers-debug\\src-debug.o-0x00000000030035f2", + "-obj-drivers-debug\\src-debug.o-0x0000000003003650", + "-obj-drivers-debug\\src-debug.o-0x0000000003003694", + "-obj-drivers-debug\\src-debug.o-0x00000000030037d0", + "-obj-drivers-debug\\src-debug.o-0x000000000300396c", + "-obj-drivers-debug\\src-debug.o-0x0000000003003a86", + "-obj-drivers-debug\\src-debug.o-0x0000000003003af0", + "-obj-drivers-debug\\src-debug.o-0x000000000300f0e0", + "-obj-drivers-debug\\src-debug.o-0x000000000000028d", + "-obj-drivers-debug\\src-debug.o-0x00000000000036a0", + "-obj-drivers-debug\\src-debug.o-0x0000000000012f81", + "-obj-drivers-debug\\src-debug.o-0x00000000000011ff", + "-obj-drivers-debug\\src-debug.o-0x0000000000000490", + "-obj-drivers-debug\\src-debug.o-0x0000000000006290", + "-obj-drivers-debug\\src-debug.o-0x00000000000003b0", + "-obj-drivers-debug\\src-debug.o-0x0000000000000f48", + "-obj-drivers-gpio\\src", + "-obj-drivers-gpio\\src-gpio.o", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003c58", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003c84", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003cb0", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003ce0", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003d5e", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003db2", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003e86", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003003f7c", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003004022", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030040d2", + "-obj-drivers-gpio\\src-gpio.o-0x000000000300417c", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030041f6", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030042dc", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030043c4", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030044b2", + "-obj-drivers-gpio\\src-gpio.o-0x000000000300457e", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003004614", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030046ae", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030048bc", + "-obj-drivers-gpio\\src-gpio.o-0x00000000030049c4", + "-obj-drivers-gpio\\src-gpio.o-0x0000000003004ace", + "-obj-drivers-gpio\\src-gpio.o-0x000000000300f164", + "-obj-drivers-gpio\\src-gpio.o-0x00000000000002bf", + "-obj-drivers-gpio\\src-gpio.o-0x0000000000003d74", + "-obj-drivers-gpio\\src-gpio.o-0x000000000001579d", + "-obj-drivers-gpio\\src-gpio.o-0x000000000000151c", + "-obj-drivers-gpio\\src-gpio.o-0x0000000000000518", + "-obj-drivers-gpio\\src-gpio.o-0x0000000000007c11", + "-obj-drivers-gpio\\src-gpio.o-0x0000000000000428", + "-obj-drivers-gpio\\src-gpio.o-0x0000000000001150", + "-obj-drivers-gpt\\src", + "-obj-drivers-gpt\\src-gpt.o", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004bc8", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004be4", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c02", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c32", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c50", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004c6c", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004cfa", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004d88", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003004e14", + "-obj-drivers-gpt\\src-gpt.o-0x0000000003005120", + "-obj-drivers-gpt\\src-gpt.o-0x000000000300f1a0", + "-obj-drivers-gpt\\src-gpt.o-0x00000000000002f1", + "-obj-drivers-gpt\\src-gpt.o-0x0000000000004d60", + "-obj-drivers-gpt\\src-gpt.o-0x00000000000167a3", + "-obj-drivers-gpt\\src-gpt.o-0x00000000000017e2", + "-obj-drivers-gpt\\src-gpt.o-0x0000000000000608", + "-obj-drivers-gpt\\src-gpt.o-0x000000000000811d", + "-obj-drivers-gpt\\src-gpt.o-0x0000000000000508", + "-obj-drivers-gpt\\src-gpt.o-0x0000000000001530", + "-obj-drivers-i2c\\src", + "-obj-drivers-i2c\\src-i2c.o", + "-obj-drivers-i2c\\src-i2c.o-0x00000000030051fe", + "-obj-drivers-i2c\\src-i2c.o-0x000000000300523e", + "-obj-drivers-i2c\\src-i2c.o-0x000000000300526a", + "-obj-drivers-i2c\\src-i2c.o-0x0000000003005288", + "-obj-drivers-i2c\\src-i2c.o-0x00000000030052b4", + "-obj-drivers-i2c\\src-i2c.o-0x00000000030052d0", + "-obj-drivers-i2c\\src-i2c.o-0x00000000030052ec", + "-obj-drivers-i2c\\src-i2c.o-0x0000000003005318", + "-obj-drivers-i2c\\src-i2c.o-0x0000000003005334", + "-obj-drivers-i2c\\src-i2c.o-0x0000000003005350", + "-obj-drivers-i2c\\src-i2c.o-0x000000000300537c", + "-obj-drivers-i2c\\src-i2c.o-0x0000000003005398", + "-obj-drivers-i2c\\src-i2c.o-0x00000000030053b4", + "-obj-drivers-i2c\\src-i2c.o-0x00000000030053d0", + "-obj-drivers-i2c\\src-i2c.o-0x000000000300561c", + "-obj-drivers-i2c\\src-i2c.o-0x000000000300f1bc", + "-obj-drivers-i2c\\src-i2c.o-0x0000000000000323", + "-obj-drivers-i2c\\src-i2c.o-0x00000000000059ca", + "-obj-drivers-i2c\\src-i2c.o-0x000000000001793a", + "-obj-drivers-i2c\\src-i2c.o-0x0000000000001a35", + "-obj-drivers-i2c\\src-i2c.o-0x00000000000006e8", + "-obj-drivers-i2c\\src-i2c.o-0x00000000000089a9", + "-obj-drivers-i2c\\src-i2c.o-0x00000000000005d8", + "-obj-drivers-i2c\\src-i2c.o-0x00000000000018b4", + "-obj-drivers-iocmg\\src", + "-obj-drivers-iocmg\\src-iocmg.o", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000030058fe", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005942", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000030059b0", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005a3c", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005aaa", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005b18", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005b6a", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005ba4", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005bf0", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005c3c", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000003005c88", + "-obj-drivers-iocmg\\src-iocmg.o-0x000000000300f1d8", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000000355", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000080f9", + "-obj-drivers-iocmg\\src-iocmg.o-0x000000000001b1c4", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000001d47", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000000910", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000009fe4", + "-obj-drivers-iocmg\\src-iocmg.o-0x00000000000007f0", + "-obj-drivers-iocmg\\src-iocmg.o-0x0000000000002218", + "-obj-drivers-timer\\src", + "-obj-drivers-timer\\src-timer.o", + "-obj-drivers-timer\\src-timer.o-0x0000000003005cd4", + "-obj-drivers-timer\\src-timer.o-0x0000000003005d0a", + "-obj-drivers-timer\\src-timer.o-0x0000000003005d36", + "-obj-drivers-timer\\src-timer.o-0x0000000003005d62", + "-obj-drivers-timer\\src-timer.o-0x0000000003005d7e", + "-obj-drivers-timer\\src-timer.o-0x0000000003005db4", + "-obj-drivers-timer\\src-timer.o-0x000000000300600a", + "-obj-drivers-timer\\src-timer.o-0x000000000300608c", + "-obj-drivers-timer\\src-timer.o-0x0000000003006174", + "-obj-drivers-timer\\src-timer.o-0x000000000300f218", + "-obj-drivers-timer\\src-timer.o-0x0000000000000387", + "-obj-drivers-timer\\src-timer.o-0x00000000000088ae", + "-obj-drivers-timer\\src-timer.o-0x000000000001c4c3", + "-obj-drivers-timer\\src-timer.o-0x0000000000002005", + "-obj-drivers-timer\\src-timer.o-0x0000000000000a38", + "-obj-drivers-timer\\src-timer.o-0x000000000000ad1a", + "-obj-drivers-timer\\src-timer.o-0x0000000000000908", + "-obj-drivers-timer\\src-timer.o-0x00000000000026e4", + "-obj-drivers-uart\\src", + "-obj-drivers-uart\\src-uart.o", + "-obj-drivers-uart\\src-uart.o-0x0000000003006208", + "-obj-drivers-uart\\src-uart.o-0x0000000003006224", + "-obj-drivers-uart\\src-uart.o-0x0000000003006250", + "-obj-drivers-uart\\src-uart.o-0x0000000003006272", + "-obj-drivers-uart\\src-uart.o-0x00000000030062ae", + "-obj-drivers-uart\\src-uart.o-0x00000000030062ca", + "-obj-drivers-uart\\src-uart.o-0x00000000030062e6", + "-obj-drivers-uart\\src-uart.o-0x0000000003006324", + "-obj-drivers-uart\\src-uart.o-0x0000000003006400", + "-obj-drivers-uart\\src-uart.o-0x000000000300644c", + "-obj-drivers-uart\\src-uart.o-0x00000000030064e2", + "-obj-drivers-uart\\src-uart.o-0x00000000030068a0", + "-obj-drivers-uart\\src-uart.o-0x00000000030069f2", + "-obj-drivers-uart\\src-uart.o-0x0000000003006b54", + "-obj-drivers-uart\\src-uart.o-0x0000000003006c9e", + "-obj-drivers-uart\\src-uart.o-0x0000000003006dfc", + "-obj-drivers-uart\\src-uart.o-0x000000000300f258", + "-obj-drivers-uart\\src-uart.o-0x000000000300f26c", + "-obj-drivers-uart\\src-uart.o-0x000000000300f288", + "-obj-drivers-uart\\src-uart.o-0x00000000040008e9", + "-obj-drivers-uart\\src-uart.o-0x00000000000003b9", + "-obj-drivers-uart\\src-uart.o-0x00000000000091b2", + "-obj-drivers-uart\\src-uart.o-0x000000000001cccf", + "-obj-drivers-uart\\src-uart.o-0x00000000000021f5", + "-obj-drivers-uart\\src-uart.o-0x0000000000000ad0", + "-obj-drivers-uart\\src-uart.o-0x000000000000b27c", + "-obj-drivers-uart\\src-uart.o-0x0000000000000990", + "-obj-drivers-uart\\src-uart.o-0x000000000000292c", + "-obj-user", + "-obj-user-main.o", + "-obj-user-main.o-0x0000000003006f0e", + "-obj-user-main.o-0x0000000003006f30", + "-obj-user-main.o-0x0000000003006fa0", + "-obj-user-main.o-0x0000000003006fc6", + "-obj-user-main.o-0x0000000003006fec", + "-obj-user-main.o-0x000000000300704a", + "-obj-user-main.o-0x000000000300709a", + "-obj-user-main.o-0x000000000300f2ac", + "-obj-user-main.o-0x00000000040000fc", + "-obj-user-main.o-0x00000000040008ea", + "-obj-user-main.o-0x00000000040008eb", + "-obj-user-main.o-0x00000000040008ec", + "-obj-user-main.o-0x0000000004000900", + "-obj-user-main.o-0x0000000004000901", + "-obj-user-main.o-0x0000000004000902", + "-obj-user-main.o-0x0000000004000903", + "-obj-user-main.o-0x0000000004000904", + "-obj-user-main.o-0x0000000004000908", + "-obj-user-main.o-0x000000000400090c", + "-obj-user-main.o-0x000000000400090e", + "-obj-user-main.o-0x0000000004000910", + "-obj-user-main.o-0x0000000004000911", + "-obj-user-main.o-0x0000000004000914", + "-obj-user-main.o-0x0000000004000918", + "-obj-user-main.o-0x000000000400091c", + "-obj-user-main.o-0x0000000004000950", + "-obj-user-main.o-0x0000000004000984", + "-obj-user-main.o-0x00000000040009b8", + "-obj-user-main.o-0x00000000040009e0", + "-obj-user-main.o-0x0000000004000a60", + "-obj-user-main.o-0x0000000004000ac8", + "-obj-user-main.o-0x0000000004000b10", + "-obj-user-main.o-0x0000000004000b58", + "-obj-user-main.o-0x0000000004000ba0", + "-obj-user-main.o-0x0000000004000be8", + "-obj-user-main.o-0x00000000000003eb", + "-obj-user-main.o-0x000000000000a9c0", + "-obj-user-main.o-0x000000000001fb1f", + "-obj-user-main.o-0x0000000000002534", + "-obj-user-main.o-0x0000000000000bf0", + "-obj-user-main.o-0x000000000000b77c", + "-obj-user-main.o-0x0000000000000aa0", + "-obj-user-main.o-0x0000000000002de4", + "-obj-user-generatecode", + "-obj-user-generatecode-system_init.o", + "-obj-user-generatecode-system_init.o-0x00000000030073b0", + "-obj-user-generatecode-system_init.o-0x000000000300741a", + "-obj-user-generatecode-system_init.o-0x0000000003007642", + "-obj-user-generatecode-system_init.o-0x00000000030076d4", + "-obj-user-generatecode-system_init.o-0x0000000003007766", + "-obj-user-generatecode-system_init.o-0x0000000003007802", + "-obj-user-generatecode-system_init.o-0x00000000030078d2", + "-obj-user-generatecode-system_init.o-0x00000000030078e4", + "-obj-user-generatecode-system_init.o-0x00000000030079c0", + "-obj-user-generatecode-system_init.o-0x0000000003007a46", + "-obj-user-generatecode-system_init.o-0x0000000003007e96", + "-obj-user-generatecode-system_init.o-0x000000000000041d", + "-obj-user-generatecode-system_init.o-0x000000000000af25", + "-obj-user-generatecode-system_init.o-0x0000000000024b8a", + "-obj-user-generatecode-system_init.o-0x00000000000027e9", + "-obj-user-generatecode-system_init.o-0x0000000000000c40", + "-obj-user-generatecode-system_init.o-0x000000000000b925", + "-obj-user-generatecode-system_init.o-0x0000000000000ae0", + "-obj-user-generatecode-system_init.o-0x0000000000002ed0", + "-obj-user-mycar\\src", + "-obj-user-mycar\\src-mycar_control.o", + "-obj-user-mycar\\src-mycar_control.o-0x0000000003007ebc", + "-obj-user-mycar\\src-mycar_control.o-0x0000000003007f74", + "-obj-user-mycar\\src-mycar_control.o-0x0000000003008006", + "-obj-user-mycar\\src-mycar_control.o-0x00000000030081e0", + "-obj-user-mycar\\src-mycar_control.o-0x000000000300829e", + "-obj-user-mycar\\src-mycar_control.o-0x000000000300830c", + "-obj-user-mycar\\src-mycar_control.o-0x000000000300834c", + "-obj-user-mycar\\src-mycar_control.o-0x000000000300838c", + "-obj-user-mycar\\src-mycar_control.o-0x00000000030083be", + "-obj-user-mycar\\src-mycar_control.o-0x00000000030083f8", + "-obj-user-mycar\\src-mycar_control.o-0x0000000003008436", + "-obj-user-mycar\\src-mycar_control.o-0x0000000003008464", + "-obj-user-mycar\\src-mycar_control.o-0x000000000300f3b0", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000100", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000104", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000108", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c30", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c34", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c38", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c3c", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c40", + "-obj-user-mycar\\src-mycar_control.o-0x0000000004000c44", + "-obj-user-mycar\\src-mycar_control.o-0x000000000000044f", + "-obj-user-mycar\\src-mycar_control.o-0x000000000000b8d4", + "-obj-user-mycar\\src-mycar_control.o-0x000000000002cc36", + "-obj-user-mycar\\src-mycar_control.o-0x0000000000002ab0", + "-obj-user-mycar\\src-mycar_control.o-0x0000000000000cb8", + "-obj-user-mycar\\src-mycar_control.o-0x000000000000b9b7", + "-obj-user-mycar\\src-mycar_control.o-0x0000000000000b48", + "-obj-user-mycar\\src-mycar_control.o-0x0000000000003098", + "-obj-user-vl53l0x", + "-obj-user-vl53l0x-core\\src", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030084c2", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030084f6", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008534", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300887c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008ba8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008d6a", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008db8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008de2", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008e2e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008e62", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008e96", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003008ed6", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300905a", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300911a", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009200", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300927e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030092b0", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009338", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300949a", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030094f4", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030095e6", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009740", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x00000000030097ba", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300982e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300986c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009ac2", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009c8e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000003009d2e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a026", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a096", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a364", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a3e6", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a484", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300a4d8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f3b4", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f40c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f434", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f448", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f460", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f478", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000300f490", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000400010c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000004000200", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000000481", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000000beea", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000031cf4", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000002d4c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000000d30", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000000bb6c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x0000000000000bc8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api.o-0x000000000000325c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a512", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a5b8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a6b2", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a6ec", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a782", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a7b8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a7ee", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300a93e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300aa20", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300aee6", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b062", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b0e4", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b27a", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b360", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000300b440", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x00000000040003b8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x00000000000004b3", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000000e5a2", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000039499", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000003053", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000001050", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x000000000000d4a0", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000000ed8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_calibration.o-0x0000000000003fd8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b4de", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b556", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b580", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b610", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300b6be", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c1d2", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c21e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c28e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c2c4", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c330", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c39c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c596", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c7ce", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300c858", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300ca6e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300cc12", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300ceb4", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300cf32", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300cf92", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300d04c", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300d1c8", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000300d708", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x00000000000004e5", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000000f8cb", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000003f686", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000003335", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000001120", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x000000000000dc0e", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000000f98", + "-obj-user-vl53l0x-core\\src-vl53l0x_api_core.o-0x0000000000004330", + "-obj-user-vl53l0x-mine\\src", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300db16", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dbd0", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dc36", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dc64", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300dc8c", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000300f4a4", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x00000000040003c8", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000000517", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000001152d", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000045cbb", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000003631", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000001208", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x000000000000e83d", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x0000000000001070", + "-obj-user-vl53l0x-mine\\src-vl53l0x.o-0x00000000000046f4", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dcd0", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dd22", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dd80", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300de1e", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300de70", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300dec2", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300df5e", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000300e00a", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x0000000000000549", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x0000000000011a93", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000004b15c", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x00000000000038c9", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x0000000000001250", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x000000000000e8ed", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x00000000000010a8", + "-obj-user-vl53l0x-mine\\src-vl53l0x_iic.o-0x00000000000047dc", + "-obj-user-vl53l0x-platform\\src", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e058", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e102", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e1d2", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e222", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e282", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e2ce", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000300e338", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000000057b", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x0000000000012060", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x0000000000050072", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x0000000000003b3a", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x00000000000012a8", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000000e9b8", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x00000000000010f0", + "-obj-user-vl53l0x-platform\\src-vl53l0x_i2c_platform.o-0x000000000000490c", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e3a0", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e414", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e484", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e4e0", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e53c", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e5e2", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e638", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e68e", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000300e6e4", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x00000000000005ad", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x00000000000126cc", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000005525c", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000003da4", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000001310", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x000000000000ead3", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000001148", + "-obj-user-vl53l0x-platform\\src-vl53l0x_platform.o-0x0000000000004a88" + ], + "textSize": 0, + "dataSize": 0, + "rodotatSize": 0 +} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/board.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/board.json" new file mode 100644 index 00000000..1975ae16 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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.000","clk_cs":"/25","clk_gpt0":"150.000","clk_gpt1":"150.000","clk_gpt2":"150.000","clk_adc":"100.000","clk_adc_div0":"100","clk_adc_div1":"150.000","clk_tcxo":"30","clk_hosc":"25","clk_pst1_sw_sel":"clk_pst1","clk_pst2_sw_sel":"clk_pst2","clk_spi0":"150.000","clk_spi1":"150.000","clk_timer0":"150.000","clk_timer1":"150.000","clk_timer2":"150.000","clk_timer3":"150.000","clk_uart0":"150.000","clk_uart1":"150.000","clk_uart2":"150.000","clk_uart3":"150.000","clk_iwdg":"32","clk_wwdg":"150.000","clk_can":"25","pll_div":"X48","pll_postdiv1":"/2","pll_postdiv2":"/3","pll_prediv":"/4","pll_ref_cksel":"HOSC","clk_cmm":"150.000","clk_dma":"150.000","clk_qdm1":"150.000","clk_qdm0":"150.000","clk_crc":"150.000","clk_capm2":"150.000","clk_capm1":"150.000","clk_capm0":"150.000","clk_apt3":"150.000","clk_apt2":"150.000","clk_apt1":"150.000","clk_apt0":"150.000","clk_gpt3":"150.000","clk_gpio3":"150.000","clk_gpio2":"150.000","clk_gpio1":"150.000","clk_gpio0":"150.000","clk_eflash":"150.000","clk_gpio5":"150.000","clk_gpio4":"150.000","clk_i2c0":"150.000","clk_i2c1":"150.000","clk_pst1":"150","clk_pst2":"100","clk_adc_cksel0":"/1","clk_adc_cksel1":"/1"},"SAMPLE Settings":{"Blank Main":{"Name":"Blank Main","Type":"Default","SampleDir":"","SampleDirName":"blank_main","SampleFunction":"SystemInit()","SampleHead":"","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":{"JTAG":{"JTAG_TCK":{"Pin Name":"PIN36"},"JTAG_TMS":{"Pin Name":"PIN37"}},"GPT1":{"GPT1_PWM":{"Pin Name":"PIN47"}},"GPT2":{"GPT2_PWM":{"Pin Name":"PIN6"}},"GPT3":{"GPT3_PWM":{"Pin Name":"PIN7"}},"UART0":{"UART0_TXD":{"Pin Name":"PIN39"},"UART0_RXD":{"Pin Name":"PIN40"}},"GPIO":{"GPIO1_1":{"Pin Name":"PIN28"},"GPIO1_4":{"Pin Name":"PIN18"}}},"pinName":["PIN36","PIN37","PIN47","PIN6","PIN7","PIN39","PIN40","PIN28","PIN18"],"PLIC Settings":{"IRQ_GPIO1":{"Name":"IRQ_GPIO1","Module":"GPIO","Priority":"1","Enable":"enable","key":44,"IsDisplay":{"path":"all,GPIO Settings","value":"GPIO1_0","type":"inObj"}},"IRQ_TIMER0":{"Name":"IRQ_TIMER0","dependence":"","Module":"TIMER0","Priority":"1","Enable":"enable","key":16,"IsDisplay":{"path":"enabled","value":"TIMER0","type":"include"},"dataListDependence":{"IRQ_TIMER0":{"checkItem":[{"check":"part:TIMER0:TIMER0 Configuration:Timer Interrupt:Enable","tips":["INTERRUPT:IRQ_TIMER0:Enable","TIMER0:Timer Interrupt"]}]}}}},"DMA Settings":{},"GPIO Settings":{"GPIO1_1":{"Name":"GPIO1_1","PinName":"PIN28","GpioName":"GPIO_PIN_1","register":"GPIO1","Level":"low","Direction":"input","InterruptMode":"rise_edge","InterruptCallback":"GPIO1_1_CallbackFunc","CustomPinName":"","Enable":"enable","key":9},"GPIO1_4":{"Name":"GPIO1_4","PinName":"PIN18","GpioName":"GPIO_PIN_4","register":"GPIO1","Level":"low","Direction":"input","InterruptMode":"rise_edge","InterruptCallback":"GPIO1_4_CallbackFunc","CustomPinName":"","Enable":"enable","key":12}}},"enabled":["SYSTEM","JTAG","GPT1","GPT2","GPT3","UART0","GPIO","TIMER0"],"info":{"board":"","chipName":"3061MNPICA","clockName":"clock3061mrpicb","seriesName":"3061m","package":"LQFP48","package path":"h:\\git\\haisi_mcu\\test\\open_mcu\\src","package version":"SolarA2_1.0.1.2","part":"","needSDK":true},"part":{"JTAG":{"JTAG Configuration":{"Interface Type":"SWD","JTAG_TCK":"PIN36","JTAG_TMS":"PIN37","JTAG_TDO":"Disable","JTAG_TDI":"Disable","JTAG_TRSTN":"Disable"},"pins":{"JTAG_TCK":{"Pin Name":"PIN36","dependence":true},"JTAG_TMS":{"Pin Name":"PIN37","dependence":true},"JTAG_TDO":{},"JTAG_TDI":{},"JTAG_TRSTN":{}}},"GPT1":{"GPT1 Configuration":{"Frequency Divisor":10,"clk_gpt_in":"clk_gpt1 ( 150.000 MHz )","Pin Name":"PIN47","Counting Period":999,"PWM Wave Frequency":"15000 Hz","Value of Point A":1,"Action of Point A":"High","Value of Point B":499,"Action of Point B":"Low","Buffer Load":"Enable","PWM Keep":"Enable","PWM Output Number":1000,"Output Finish Interrupt":"Disable","Period Output Finish Interrupt":"Disable","PWM Output Finish Trigger":"Disable","PWM Period Output Finish Trigger":"Disable","Pwm Output Finish Triggle":"Disable","Handle Name":"g_gpt1","PWM Output Finish CallBack":"GPT1PWMOutputFinishCallBack","PWM Period Output Finish CallBack":"GPT1PWMPeriodOutputFinishCallBack"},"advancedSetting":{"PLIC Settings":{"IRQ_GPT1_INT":{"Name":"IRQ_GPT1_INT","dependence":"","Module":"GPT1","Priority":"1","Enable":"disable","key":"0"},"IRQ_GPT1_PRD_INT":{"Name":"IRQ_GPT1_PRD_INT","dependence":"","Module":"GPT1","Priority":"1","Enable":"disable","key":"1"}},"DMA Settings":{"GPT1":{"SrcPeriph":"GPT1","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":"GPT1"}}},"pins":{"GPT1_PWM":{"Pin Name":"PIN47","dependence":true}}},"GPT2":{"GPT2 Configuration":{"Frequency Divisor":10,"clk_gpt_in":"clk_gpt2 ( 150.000 MHz )","Pin Name":"PIN6","Counting Period":999,"PWM Wave Frequency":"15000 Hz","Value of Point A":700,"Action of Point A":"High","Value of Point B":900,"Action of Point B":"Low","Buffer Load":"Enable","PWM Keep":"Enable","PWM Output Number":1000,"Output Finish Interrupt":"Disable","Period Output Finish Interrupt":"Disable","PWM Output Finish Trigger":"Disable","PWM Period Output Finish Trigger":"Disable","Pwm Output Finish Triggle":"Disable","Handle Name":"g_gpt2","PWM Output Finish CallBack":"GPT2PWMOutputFinishCallBack","PWM Period Output Finish CallBack":"GPT2PWMPeriodOutputFinishCallBack"},"advancedSetting":{"PLIC Settings":{"IRQ_GPT2_INT":{"Name":"IRQ_GPT2_INT","dependence":"","Module":"GPT2","Priority":"1","Enable":"disable","key":"0"},"IRQ_GPT2_PRD_INT":{"Name":"IRQ_GPT2_PRD_INT","dependence":"","Module":"GPT2","Priority":"1","Enable":"disable","key":"1"}},"DMA Settings":{"GPT2":{"SrcPeriph":"GPT2","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":"GPT2"}}},"pins":{"GPT2_PWM":{"Pin Name":"PIN6","dependence":true}}},"GPT3":{"GPT3 Configuration":{"Frequency Divisor":10,"clk_gpt_in":"clk_gpt3 ( 150.000 MHz )","Pin Name":"PIN7","Counting Period":999,"PWM Wave Frequency":"15000 Hz","Value of Point A":700,"Action of Point A":"High","Value of Point B":900,"Action of Point B":"Low","Buffer Load":"Enable","PWM Keep":"Enable","PWM Output Number":1000,"Output Finish Interrupt":"Disable","Period Output Finish Interrupt":"Disable","PWM Output Finish Trigger":"Disable","PWM Period Output Finish Trigger":"Disable","Pwm Output Finish Triggle":"Disable","Handle Name":"g_gpt3","PWM Output Finish CallBack":"GPT3PWMOutputFinishCallBack","PWM Period Output Finish CallBack":"GPT3PWMPeriodOutputFinishCallBack"},"advancedSetting":{"PLIC Settings":{"IRQ_GPT3_INT":{"Name":"IRQ_GPT3_INT","dependence":"","Module":"GPT3","Priority":"1","Enable":"disable","key":"0"},"IRQ_GPT3_PRD_INT":{"Name":"IRQ_GPT3_PRD_INT","dependence":"","Module":"GPT3","Priority":"1","Enable":"disable","key":"1"}},"DMA Settings":{"GPT3":{"SrcPeriph":"GPT3","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":"GPT3"}}},"pins":{"GPT3_PWM":{"Pin Name":"PIN7","dependence":true}}},"UART0":{"UART0 Configuration":{"Send Mode":"INTERRUPT","Receive Mode":"INTERRUPT","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":{}}},"TIMER0":{"TIMER0 Configuration":{"Running Mode":"periodic mode","Period(us)":1000,"Real Time Value":"28633115.30","Working clock":"clk_timer0 ( 150.000 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_timer0","TIMER interrupt CallBack":"TIMER0_InterruptProcess","Timer DMA OverFlow Callback":"TIMER0_DMAOverFlow_InterruptProcess"},"advancedSetting":{"PLIC Settings":{"IRQ_TIMER0":{"Name":"IRQ_TIMER0","dependence":"","Module":"TIMER0","Priority":"1","Enable":"enable","key":16,"IsDisplay":{"path":"enabled","value":"TIMER0","type":"include"},"dataListDependence":{"IRQ_TIMER0":{"checkItem":[{"check":"part:TIMER0:TIMER0 Configuration:Timer Interrupt:Enable","tips":["INTERRUPT:IRQ_TIMER0:Enable","TIMER0:Timer Interrupt"]}]}}}},"DMA Settings":{"TIMER0":{"SrcPeriph":"TIMER0","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":"TIMER0"}}}}},"globalCheckResult":{"JTAG":{"status":"STATUS_OK","tips":""},"GPT1":{"status":"STATUS_OK","tips":""},"GPT2":{"status":"STATUS_OK","tips":""},"GPT3":{"status":"STATUS_OK","tips":""},"UART0":{"status":"STATUS_OK","tips":""},"TIMER0":{"status":"STATUS_OK","tips":""},"PLIC":{"status":"STATUS_OK","tips":""}},"globalCheckItem":{"JTAG":[{"check":"all:gpio:JTAG:JTAG_TCK","tips":[]},{"check":"all:gpio:JTAG:JTAG_TMS","tips":[]}],"GPT1":[{"check":"all:gpio:GPT1:GPT1_PWM","tips":[]}],"GPT2":[{"check":"all:gpio:GPT2:GPT2_PWM","tips":[]}],"GPT3":[{"check":"all:gpio:GPT3:GPT3_PWM","tips":[]}],"UART0":[{"check":"all:gpio:UART0:UART0_TXD","tips":[]},{"check":"all:gpio:UART0:UART0_RXD","tips":[]}],"TIMER0":[{"check":"all:PLIC Settings:IRQ_TIMER0:Enable:enable","tips":["TIMER0:Timer Interrupt","INTERRUPT:IRQ_TIMER0:Enable"]}],"PLIC":[{"check":"part:TIMER0:TIMER0 Configuration:Timer Interrupt:Enable","tips":["INTERRUPT:IRQ_TIMER0:Enable","TIMER0:Timer Interrupt"]}]},"selectPinName":{},"configType":"menu","deleteType":"moduleDelete"} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/.gn" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/.gn" new file mode 100644 index 00000000..823030a8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/BUILD.gn" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/BUILD.gn" new file mode 100644 index 00000000..d978bd35 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/BUILD.gn" @@ -0,0 +1,352 @@ +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\mycar\src\mycar_control.c", + "//user\vl53l0x\core\src\vl53l0x_api.c", + "//user\vl53l0x\core\src\vl53l0x_api_calibration.c", + "//user\vl53l0x\core\src\vl53l0x_api_core.c", + "//user\vl53l0x\core\src\vl53l0x_api_ranging.c", + "//user\vl53l0x\core\src\vl53l0x_api_strings.c", + "//user\vl53l0x\mine\src\vl53l0x.c", + "//user\vl53l0x\mine\src\vl53l0x_iic.c", + "//user\vl53l0x\platform\src\vl53l0x_i2c_platform.c", + "//user\vl53l0x\platform\src\vl53l0x_platform.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", + "//user\mycar\inc", + "//user\vl53l0x\core\inc", + "//user\vl53l0x\mine\inc", + "//user\vl53l0x\platform\inc", + ] + deps = [ + ] +} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/build.py" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/build.py" new file mode 100644 index 00000000..2bb80f16 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/build_gn.py" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/build_gn.py" new file mode 100644 index 00000000..b3ac601d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config.ini" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config.ini" new file mode 100644 index 00000000..01f98190 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/BUILDCONFIG.gn" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/BUILDCONFIG.gn" new file mode 100644 index 00000000..db7374fe --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/hcc/userconfig.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/hcc/userconfig.json" new file mode 100644 index 00000000..ec926c9b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/hcc_fpu/userconfig.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/config/hcc_fpu/userconfig.json" new file mode 100644 index 00000000..c7feccf3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_dfx_xml.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_dfx_xml.json" new file mode 100644 index 00000000..c1f941be --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_prim_xml_step1.py" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_prim_xml_step1.py" new file mode 100644 index 00000000..1e44025b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_prim_xml_step2.py" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mk_prim_xml_step2.py" new file mode 100644 index 00000000..21043567 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db.xml" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db.xml" new file mode 100644 index 00000000..8bb3efcf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db.xml" @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/log.xml" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/log.xml" new file mode 100644 index 00000000..56354dfb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/log.xml" @@ -0,0 +1,8 @@ + + + + + + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/xml_cfg/mcu_xml.cfg" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/xml_cfg/mcu_xml.cfg" new file mode 100644 index 00000000..aa5bffca --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/dfx_db/xml_cfg/mcu_xml.cfg" @@ -0,0 +1 @@ + { _PRIM_ST_, _PRIM_PRI_ = 1, _PRIM_MSG_ = "version info is : %x\n", _PRIM_LINE_ = 266, _PRIM_FILE_ID_ = 2001, _PRIM_MOD_ID_ = 12, _PRIM_END_ }; \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/modules/mcu_xml/dfx_log.i" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/modules/mcu_xml/dfx_log.i" new file mode 100644 index 00000000..a726eaf5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/createxml/mss_prim_db/modules/mcu_xml/dfx_log.i" @@ -0,0 +1,2389 @@ +typedef unsigned int size_t; +typedef int ssize_t; +typedef long long off_t; +typedef struct _IO_FILE FILE; +typedef __builtin_va_list va_list; +typedef __builtin_va_list __isoc_va_list; +typedef union _G_fpos64_t { + char __opaque[16]; + long long __lldata; + double __align; +} fpos_t; +extern FILE *const stdin; +extern FILE *const stdout; +extern FILE *const stderr; +FILE *fopen(const char *restrict, const char *restrict); +FILE *freopen(const char *restrict, const char *restrict, FILE *restrict); +int fclose(FILE *); +int remove(const char *); +int rename(const char *, const char *); +int feof(FILE *); +int ferror(FILE *); +int fflush(FILE *); +void clearerr(FILE *); +int fseek(FILE *, long, int); +long ftell(FILE *); +void rewind(FILE *); +int fgetpos(FILE *restrict, fpos_t *restrict); +int fsetpos(FILE *, const fpos_t *); +size_t fread(void *restrict, size_t, size_t, FILE *restrict); +size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict); +int fgetc(FILE *); +int getc(FILE *); +int getchar(void); +int ungetc(int, FILE *); +int fputc(int, FILE *); +int putc(int, FILE *); +int putchar(int); +char *fgets(char *restrict, int, FILE *restrict); +int fputs(const char *restrict, FILE *restrict); +int puts(const char *); +int printf(const char *restrict, ...); +int fprintf(FILE *restrict, const char *restrict, ...); +int sprintf(char *restrict, const char *restrict, ...); +int snprintf(char *restrict, size_t, const char *restrict, ...); +int vprintf(const char *restrict, __isoc_va_list); +int vfprintf(FILE *restrict, const char *restrict, __isoc_va_list); +int vsprintf(char *restrict, const char *restrict, __isoc_va_list); +int vsnprintf(char *restrict, size_t, const char *restrict, __isoc_va_list); +int scanf(const char *restrict, ...); +int fscanf(FILE *restrict, const char *restrict, ...); +int sscanf(const char *restrict, const char *restrict, ...); +int vscanf(const char *restrict, __isoc_va_list); +int vfscanf(FILE *restrict, const char *restrict, __isoc_va_list); +int vsscanf(const char *restrict, const char *restrict, __isoc_va_list); +void perror(const char *); +int setvbuf(FILE *restrict, char *restrict, int, size_t); +void setbuf(FILE *restrict, char *restrict); +char *tmpnam(char *); +FILE *tmpfile(void); +FILE *fmemopen(void *restrict, size_t, const char *restrict); +FILE *open_memstream(char **, size_t *); +FILE *fdopen(int, const char *); +FILE *popen(const char *, const char *); +int pclose(FILE *); +int fileno(FILE *); +int fseeko(FILE *, off_t, int); +off_t ftello(FILE *); +int dprintf(int, const char *restrict, ...); +int vdprintf(int, const char *restrict, __isoc_va_list); +void flockfile(FILE *); +int ftrylockfile(FILE *); +void funlockfile(FILE *); +int getc_unlocked(FILE *); +int getchar_unlocked(void); +int putc_unlocked(int, FILE *); +int putchar_unlocked(int); +ssize_t getdelim(char **restrict, size_t *restrict, int, FILE *restrict); +ssize_t getline(char **restrict, size_t *restrict, FILE *restrict); +int renameat(int, const char *, int, const char *); +char *ctermid(char *); +char *tempnam(const char *, const char *); +char *cuserid(char *); +void setlinebuf(FILE *); +void setbuffer(FILE *, char *, size_t); +int fgetc_unlocked(FILE *); +int fputc_unlocked(int, FILE *); +int fflush_unlocked(FILE *); +size_t fread_unlocked(void *, size_t, size_t, FILE *); +size_t fwrite_unlocked(const void *, size_t, size_t, FILE *); +void clearerr_unlocked(FILE *); +int feof_unlocked(FILE *); +int ferror_unlocked(FILE *); +int fileno_unlocked(FILE *); +int getw(FILE *); +int putw(int, FILE *); +char *fgetln(FILE *, size_t *); +int asprintf(char **, const char *, ...); +int vasprintf(char **, const char *, __isoc_va_list); +typedef struct __locale_struct * locale_t; +void *memcpy (void *restrict, const void *restrict, size_t); +void *memmove (void *, const void *, size_t); +void *memset (void *, int, size_t); +int memcmp (const void *, const void *, size_t); +void *memchr (const void *, int, size_t); +char *strcpy (char *restrict, const char *restrict); +char *strncpy (char *restrict, const char *restrict, size_t); +char *strcat (char *restrict, const char *restrict); +char *strncat (char *restrict, const char *restrict, size_t); +int strcmp (const char *, const char *); +int strncmp (const char *, const char *, size_t); +int strcoll (const char *, const char *); +size_t strxfrm (char *restrict, const char *restrict, size_t); +char *strchr (const char *, int); +char *strrchr (const char *, int); +size_t strcspn (const char *, const char *); +size_t strspn (const char *, const char *); +char *strpbrk (const char *, const char *); +char *strstr (const char *, const char *); +char *strtok (char *restrict, const char *restrict); +size_t strlen (const char *); +char *strerror (int); +int bcmp (const void *, const void *, size_t); +void bcopy (const void *, void *, size_t); +void bzero (void *, size_t); +char *index (const char *, int); +char *rindex (const char *, int); +int ffs (int); +int ffsl (long); +int ffsll (long long); +int strcasecmp (const char *, const char *); +int strncasecmp (const char *, const char *, size_t); +int strcasecmp_l (const char *, const char *, locale_t); +int strncasecmp_l (const char *, const char *, size_t, locale_t); +char *strtok_r (char *restrict, const char *restrict, char **restrict); +int strerror_r (int, char *, size_t); +char *stpcpy(char *restrict, const char *restrict); +char *stpncpy(char *restrict, const char *restrict, size_t); +size_t strnlen (const char *, size_t); +char *strdup (const char *); +char *strndup (const char *, size_t); +char *strsignal(int); +char *strerror_l (int, locale_t); +int strcoll_l (const char *, const char *, locale_t); +size_t strxfrm_l (char *restrict, const char *restrict, size_t, locale_t); +void *memccpy (void *restrict, const void *restrict, int, size_t); +char *strsep(char **, const char *); +size_t strlcat (char *, const char *, size_t); +size_t strlcpy (char *, const char *, size_t); +void explicit_bzero (void *, size_t); +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; +typedef enum { + EXT_SUCCESS = 0x0, + EXT_ERR_USER_BUSY = 0x01060002, + EXT_INVALID = 0xFFFFFFFE, + EXT_FAILURE = 0xFFFFFFFF, +} EXT_MCU_ERRNO; +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 +}; +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; +typedef enum { + IRQ_SOFTWARE = 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, +} IRQ_ID; +typedef int intptr_t; +typedef unsigned int uintptr_t; +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; +typedef enum { + BASE_FSM_START, + BASE_DEFINE_FSM_END +} BASE_FSM_Status; +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; +typedef enum { + SYSCTRL_FUNC_JTAG_CORESIGHT = 0x00000000U, + SYSCTRL_FUNC_JYAG_EFLASH = 0x00000001U +} SYSCTRL_FUNC_JTAG_Status; +typedef union { + unsigned int reg; + struct { + unsigned int softresreq : 1; + unsigned int reserved : 31; + } BIT; +} volatile SC_SYS_RES_REG; +typedef union { + unsigned int reg; + struct { + unsigned int soft_rst_cnt : 16; + unsigned int ext_rst_cnt : 16; + } BIT; +} volatile SC_RST_CNT0_REG; +typedef union { + unsigned int reg; + struct { + unsigned int wdg_rst_cnt : 16; + unsigned int iwdg_rst_cnt : 16; + } BIT; +} volatile SC_RST_CNT1_REG; +typedef union { + unsigned int reg; + struct { + unsigned int update_mode_clear : 1; + unsigned int reserved0 : 3; + unsigned int update_mode : 1; + unsigned int reserved1 : 27; + } BIT; +} volatile SC_SYS_STAT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int software_int : 1; + unsigned int reserved : 31; + } BIT; +} volatile SC_SOFT_INT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int swint_evt_id : 32; + } BIT; +} volatile SC_SOFT_EVT_ID_REG; +typedef union { + unsigned int reg; + struct { + unsigned int crg_cfg_lock : 1; + unsigned int sc_cfg_lock : 1; + unsigned int reserved : 30; + } BIT; +} volatile SC_LOCKEN_REG; +typedef union { + unsigned int reg; + struct { + unsigned int sc_hrst_reg0 : 32; + } BIT; +} volatile SC_HRST_REG0_REG; +typedef union { + unsigned int reg; + struct { + unsigned int user_hrst_reg0 : 32; + } BIT; +} volatile USER_HRST_REG0_REG; +typedef union { + unsigned int reg; + struct { + unsigned int user_hrst_reg1 : 32; + } BIT; +} volatile USER_HRST_REG1_REG; +typedef union { + unsigned int reg; + struct { + unsigned int user_por_reg0 : 32; + } BIT; +} volatile USER_POR_REG0_REG; +typedef union { + unsigned int reg; + struct { + unsigned int user_por_reg1 : 32; + } BIT; +} volatile USER_POR_REG1_REG; +typedef union { + unsigned int reg; + struct { + unsigned int user_reg0 : 32; + } BIT; +} volatile USER_REG0_REG; +typedef union { + unsigned int reg; + struct { + unsigned int user_reg1 : 32; + } BIT; +} volatile USER_REG1_REG; +typedef struct _SYSCTRL0_Regstruct { + char space0[4]; + SC_SYS_RES_REG SC_SYS_RES; + SC_RST_CNT0_REG SC_RST_CNT0; + SC_RST_CNT1_REG SC_RST_CNT1; + char space1[8]; + SC_SYS_STAT_REG SC_SYS_STAT; + char space2[4]; + SC_SOFT_INT_REG SC_SOFT_INT; + SC_SOFT_EVT_ID_REG SC_SOFT_EVT_ID; + char space3[28]; + SC_LOCKEN_REG SC_LOCKEN; + char space4[440]; + SC_HRST_REG0_REG SC_HRST_REG0; + char space5[3068]; + USER_POR_REG0_REG USER_POR_REG0; + USER_POR_REG1_REG USER_POR_REG1; + char space6[56]; + USER_HRST_REG0_REG USER_HRST_REG0; + USER_HRST_REG1_REG USER_HRST_REG1; + char space7[56]; + USER_REG0_REG USER_REG0; + USER_REG1_REG USER_REG1; +} volatile SYSCTRL0_RegStruct; +typedef union { + unsigned int reg; + struct { + unsigned int apt0_run : 1; + unsigned int apt1_run : 1; + unsigned int apt2_run : 1; + unsigned int apt3_run : 1; + unsigned int reserved : 28; + } BIT; +} volatile APT_RUN_REG; +typedef union { + unsigned int reg; + struct { + unsigned int poe0_filter_level : 8; + unsigned int poe1_filter_level : 8; + unsigned int poe2_filter_level : 8; + unsigned int poe0_filter_en : 1; + unsigned int poe1_filter_en : 1; + unsigned int poe2_filter_en : 1; + unsigned int reserved : 5; + } BIT; +} volatile APT_POE_FILTER_REG; +typedef union { + unsigned int reg; + struct { + unsigned int apt_evtio4_filter_level : 8; + unsigned int apt_evtio5_filter_level : 8; + unsigned int reserved0 : 8; + unsigned int apt_evtio4_filter_en : 1; + unsigned int apt_evtio5_filter_en : 1; + unsigned int reserved1 : 6; + } BIT; +} volatile APT_EVTIO_FILTER_REG; +typedef union { + unsigned int reg; + struct { + unsigned int apt_evtmp4_filter_level : 8; + unsigned int apt_evtmp5_filter_level : 8; + unsigned int apt_evtmp6_filter_level : 8; + unsigned int apt_evtmp4_filter_en : 1; + unsigned int apt_evtmp5_filter_en : 1; + unsigned int apt_evtmp6_filter_en : 1; + unsigned int reserved : 5; + } BIT; +} volatile APT_EVTMP_FILTER_REG; +typedef union { + unsigned int reg; + struct { + unsigned int osc_ds : 4; + unsigned int ose_e : 1; + unsigned int osc_ie : 1; + unsigned int reserved : 26; + } BIT; +} volatile XTAL_CFG_REG; +typedef union { + unsigned int reg; + struct { + unsigned int sysram_parity_err_clr : 1; + unsigned int sysram0_parity_err : 1; + unsigned int sysram1_parity_err : 1; + unsigned int reserved : 29; + } BIT; +} volatile SYSRAM_ERR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int sysram_split : 3; + unsigned int reserved : 29; + } BIT; +} volatile SYSRAM_MAP_REG; +typedef union { + unsigned int reg; + struct { + unsigned int pvd_en : 1; + unsigned int pvd_rise_thd : 3; + unsigned int pvd_fall_thd : 3; + unsigned int reserved : 25; + } BIT; +} volatile PVD_CFG_REG; +typedef union { + unsigned int reg; + struct { + unsigned int pvd_toggle : 1; + unsigned int reserved : 31; + } BIT; +} volatile PVD_STATUS_REG; +typedef union { + unsigned int reg; + struct { + unsigned int cpu_in_nmi_hdlr : 1; + unsigned int cpu_ra_wr_en : 1; + unsigned int cpu_lockup_mode : 1; + unsigned int cpu_hard_fault_mode : 1; + unsigned int cpu_debug_mode : 1; + unsigned int cpu_sleep_mode : 1; + unsigned int reserved : 25; + unsigned int cpu_pc_valid : 1; + } BIT; +} volatile CPU_STATUS_REG; +typedef struct _SYSCTRL1_RegStruct { + char space0[0x8000]; + APT_RUN_REG APT_RUN; + char space1[12]; + APT_POE_FILTER_REG APT_POE_FILTER; + APT_EVTIO_FILTER_REG APT_EVTIO_FILTER; + APT_EVTMP_FILTER_REG APT_EVTMP_FILTER; + char space2[228]; + XTAL_CFG_REG XTAL_CFG; + char space3[508]; + SYSRAM_ERR_REG SYSRAM_ERR; + SYSRAM_MAP_REG SYS_MAP; + char space4[248]; + PVD_CFG_REG PVD_CFG; + PVD_STATUS_REG PVD_STATUS; + char space5[3064]; + CPU_STATUS_REG CPU_STATUS; +} volatile SYSCTRL1_RegStruct; +static inline void DCL_SYSCTRL_SoftReset(void) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_SYS_RES.BIT.softresreq = 1; +} +static inline unsigned short DCL_SYSCTRL_GetSoftResetConut(void) +{ + return ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_RST_CNT0.BIT.soft_rst_cnt; +} +static inline unsigned short DCL_SYSCTRL_GetPinResetConut(void) +{ + return ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_RST_CNT0.BIT.ext_rst_cnt; +} +static inline unsigned short DCL_SYSCTRL_GetWdgResetConut(void) +{ + return ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_RST_CNT1.BIT.wdg_rst_cnt; +} +static inline unsigned short DCL_SYSCTRL_GetIWdgResetConut(void) +{ + return ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_RST_CNT1.BIT.iwdg_rst_cnt; +} +static inline void DCL_SYSCTRL_ScWriteProtectionDisable(void) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg = (((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg & 0x0000FFFDU) + 0xEA510000U; +} +static inline void DCL_SYSCTRL_ScWriteProtectionEnable(void) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg = ((((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg & 0x0000FFFFU) | 0x00000002U) + + 0xEA510000U; +} +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg = (((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg & 0x0000FFFEU) + 0xEA510000U; +} +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg = ((((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_LOCKEN.reg & 0x0000FFFFU) | 0x00000001U) + + 0xEA510000U; +} +static inline void DCL_SYSCTRL_GenerateSoftInterrupt(void) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_SOFT_INT.BIT.software_int = 1; +} +static inline void DCL_SYSCTRL_SetSoftInterruptEventId(unsigned int id) +{ + ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_SOFT_EVT_ID.BIT.swint_evt_id = id; +} +static inline unsigned int DCL_SYSCTRL_GetSoftInterruptEventId(void) +{ + return ((SYSCTRL0_RegStruct *)(void *)0x10100000)->SC_SOFT_EVT_ID.BIT.swint_evt_id; +} +static inline unsigned int DCL_SYSCTRL_GetSysramParityErrorStatus(void) +{ + return ((SYSCTRL1_RegStruct *)(void *)0x10100000)->SYSRAM_ERR.BIT.sysram0_parity_err; +} +static inline void DCL_SYSCTRL_ClearSysramParityError(void) +{ + ((SYSCTRL1_RegStruct *)(void *)0x10100000)->SYSRAM_ERR.BIT.sysram_parity_err_clr = 1; +} +static inline _Bool DCL_SYSCTRL_CheckCpuStatus(SYSCTRL_CPU_Status offset) +{ + return ((((SYSCTRL1_RegStruct *)(void *)0x10100000)->CPU_STATUS.reg) & (1 << offset)) == 0 ? 0 : 1; +} +void SYSTICK_Init(void); +unsigned int SYSTICK_GetCRGHZ(void); +typedef union { + unsigned int reg; + struct { + unsigned int enable : 1; + unsigned int clksrc : 1; + unsigned int stop_tmr_en : 2; + unsigned int reserved : 28; + } BIT; +} TIMER_CTRL_REG; +typedef union { + unsigned int reg; + struct { + unsigned int div : 10; + unsigned int reserved : 22; + } BIT; +} TIMER_DIV_REG; +typedef struct { + TIMER_CTRL_REG TIMER_CTRL; + TIMER_DIV_REG TIMER_DIV; + unsigned int MTIME; + unsigned int MTIME_H; + unsigned int MTIMECMP; + unsigned int MTIMECMP_H; +} volatile SYSTICK_RegStruct; +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + return ((SYSTICK_RegStruct *)(void *)0x14380000)->MTIME; +} +typedef enum { + CHIP_IP_CLK_LOSC = 32000U, + CHIP_IP_CLK_CAN = 25000000U, + CHIP_IP_CLK_LS = 25000000U, + CHIP_IP_CLK_HS = 25000000U, +} CHIP_IpRate; +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; +typedef struct { + void *ipBaseAddr; + CHIP_CrgIpType type; + unsigned short regOffset; + unsigned char bitOffset; +} CHIP_CrgIpMatchInfo; +unsigned int CHIP_GetIpFreqHz(const void *ipBaseAddr); +CHIP_CrgIpMatchInfo *GetCrgIpMatchInfo(const void *baseAddr); +extern unsigned int HAL_CRG_GetIpFreq(const void *baseAddress); +void AssertErrorLog(char *file, unsigned int line); +typedef enum { + BASE_DEFINE_DELAY_SECS = 1, + BASE_DEFINE_DELAY_MILLISECS = 1000, + BASE_DEFINE_DELAY_MICROSECS = 1000000 +} BASE_DelayUnit; +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); +typedef enum { + BASE_STATUS_UNLOCKED = 0, + BASE_STATUS_LOCKED = 1 +} BASE_LockStatus; +_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); +typedef struct { + unsigned int cnt; + float *buf; + unsigned int size; + unsigned int at; + unsigned int calNum; + float total; +} BASE_AverageHandle; +typedef BASE_FSM_Status (*FunType)(void); +typedef struct { + FunType funList[BASE_DEFINE_FSM_END + 1]; + BASE_FSM_Status nextFun; +} BASE_FSM_Handle; +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); +typedef struct { + int sin : 16; + int cos : 16; +} BASE_MathTypeSinCos; +typedef struct { + int q : 16; + int d : 16; +} BASE_MathTypeQD; +typedef struct { + int a : 16; + int b : 16; +} BASE_MathTypeAB; +typedef struct { + int alpha : 16; + int beta : 16; +} BASE_MathTypeAlphaBeta; +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); +void BASE_FUNC_SoftReset(void); +static inline void IRQ_ClearN(unsigned int irqNum) +{ + asm volatile("fence"); + do { if (__builtin_constant_p(irqNum)) { asm volatile("li t0," "%0" : : "i"(irqNum)); } else { asm volatile("mv t0," "%0" : : "r"(irqNum)); } asm volatile("csrw %0, t0" :: "i"(0xBF0)); } while (0); +} +typedef void (* IRQ_PROC_FUNC)(void *arg); +typedef struct { + IRQ_PROC_FUNC pfnHandler; + void *param; +} IRQ_ARG_FUNC; +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; +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); +typedef enum { + UART_OVERSAMPLING_16X = 0x00000000U, + UART_OVERSAMPLING_15X = 0x00000001U, + UART_OVERSAMPLING_14X = 0x00000002U, + UART_OVERSAMPLING_13X = 0x00000003U, + UART_OVERSAMPLING_12X = 0x00000004U, +} UART_OversampleMultiple; +typedef struct { + UART_OversampleMultiple overSampleMultiple; + _Bool msbFirst; +} UART_ExtendHandle; +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; +typedef struct { + void (* WriteItFinishCallBack)(void *handle); + void (* ReadItFinishCallBack)(void *handle); + void (* WriteDmaFinishCallBack)(void *handle); + void (* ReadDmaFinishCallBack)(void *handle); + void (* TransmitItErrorCallBack)(void *handle); + void (* TransmitDmaErrorCallBack)(void *handle); + void (* BaudDetectSuccessCallBack)(void *handle); + void (* BaudDetectErrorCallBack)(void *handle); + void (* CharacterMatchCallBack)(void *handle); +}UART_UserCallBack; +typedef enum { + UART_ERROR_FRAME = 0x00000080U, + UART_ERROR_PARITY = 0x00000100U, + UART_ERROR_BREAK = 0x00000200U, + UART_ERROR_OVERFLOW = 0x00000400U +} UART_Error_Type; +typedef enum { + UART_DATALENGTH_5BIT = 0x00000000U, + UART_DATALENGTH_6BIT = 0x00000001U, + UART_DATALENGTH_7BIT = 0x00000002U, + UART_DATALENGTH_8BIT = 0x00000003U +} UART_DataLength; +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; +typedef enum { + UART_STOPBITS_ONE = 0x00000000U, + UART_STOPBITS_TWO = 0x00000001U +} UART_StopBits; +typedef enum { + UART_MODE_BLOCKING = 0x00000000U, + UART_MODE_INTERRUPT = 0x00000001U, + UART_MODE_DMA = 0x00000002U, + UART_MODE_DISABLE = 0x00000003U +} UART_Transmit_Mode; +typedef enum { + UART_HW_FLOWCTR_DISABLE = 0x00000000U, + UART_HW_FLOWCTR_ENABLE = 0x00000001U +} UART_HW_FlowCtr; +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; +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; +typedef enum { + UART_SEQUENCE_START_LSB = 0x00000000U, + UART_SEQUENCE_START_MSB = 0x00000001U, +} UART_SequenceMode; +typedef union { + unsigned int reg; + struct { + unsigned int data : 8; + unsigned int fe : 1; + unsigned int pe : 1; + unsigned int be : 1; + unsigned int oe : 1; + unsigned int reserved0 : 20; + } BIT; +} volatile UART_DR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int fe : 1; + unsigned int pe : 1; + unsigned int be : 1; + unsigned int oe : 1; + unsigned int reserved0 : 28; + } BIT; +} volatile UART_RSR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int cts : 1; + unsigned int reserved0 : 2; + unsigned int busy : 1; + unsigned int rxfe : 1; + unsigned int txff : 1; + unsigned int rxff : 1; + unsigned int txfe : 1; + unsigned int reserved1 : 24; + } BIT; +} volatile UART_FR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int bauddivint : 16; + unsigned int reserved0 : 16; + } BIT; +} volatile UART_IBRD_REG; +typedef union { + unsigned int reg; + struct { + unsigned int bauddivfrac : 6; + unsigned int reserved0 : 26; + } BIT; +} volatile UART_FBRD_REG; +typedef union { + unsigned int reg; + struct { + unsigned int brk : 1; + unsigned int pen : 1; + unsigned int eps : 1; + unsigned int stp2 : 1; + unsigned int fen : 1; + unsigned int wlen : 2; + unsigned int sps : 1; + unsigned int reserved0 : 24; + } BIT; +} volatile UART_LCR_H_REG; +typedef union { + unsigned int reg; + struct { + unsigned int uarten : 1; + unsigned int reserved0 : 6; + unsigned int lbe : 1; + unsigned int txe : 1; + unsigned int rxe : 1; + unsigned int dtr : 1; + unsigned int rts : 1; + unsigned int reserved1 : 2; + unsigned int rtsen : 1; + unsigned int ctsen : 1; + unsigned int reserved2 : 16; + } BIT; +} volatile UART_CR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int txiflsel : 4; + unsigned int reserved0 : 4; + unsigned int rxiflsel : 4; + unsigned int reserved1 : 20; + } BIT; +} volatile UART_IFLS_REG; +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmim : 1; + unsigned int reserved1 : 2; + unsigned int rxim : 1; + unsigned int txim : 1; + unsigned int rtim : 1; + unsigned int feim : 1; + unsigned int peim : 1; + unsigned int beim : 1; + unsigned int oeim : 1; + unsigned int reserved2 : 1; + unsigned int txfeim : 1; + unsigned int txfneim : 1; + unsigned int txtcim : 1; + unsigned int reserved3 : 1; + unsigned int rxfeim : 1; + unsigned int rxfneim : 1; + unsigned int rxffim : 1; + unsigned int abdcim : 1; + unsigned int abdeim : 1; + unsigned int cmim : 1; + unsigned int reserved4 : 10; + } BIT; +} volatile UART_IMSC_REG; +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmis : 1; + unsigned int reserved1 : 2; + unsigned int rxris : 1; + unsigned int txris : 1; + unsigned int rtris : 1; + unsigned int feris : 1; + unsigned int peris : 1; + unsigned int beris : 1; + unsigned int oeris : 1; + unsigned int reserved2 : 1; + unsigned int txferis : 1; + unsigned int txfneris : 1; + unsigned int txtcris : 1; + unsigned int reserved3 : 1; + unsigned int rxferis : 1; + unsigned int rxfneris : 1; + unsigned int rxffris : 1; + unsigned int abdcris : 1; + unsigned int abderis : 1; + unsigned int cmris : 1; + unsigned int reserved4 : 10; + } BIT; +} volatile UART_RIS_REG; +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmmis : 1; + unsigned int reserved1 : 2; + unsigned int rxmis : 1; + unsigned int txmis : 1; + unsigned int rtmis : 1; + unsigned int femis : 1; + unsigned int pemis : 1; + unsigned int bemis : 1; + unsigned int oemis : 1; + unsigned int reserved2 : 1; + unsigned int txfeis : 1; + unsigned int txfneis : 1; + unsigned int txtcis : 1; + unsigned int reserved3 : 1; + unsigned int rxfeis : 1; + unsigned int rxfneis : 1; + unsigned int rxffis : 1; + unsigned int abdcis : 1; + unsigned int abdeis : 1; + unsigned int cmis : 1; + unsigned int reserved4 : 10; + } BIT; +} volatile UART_MIS_REG; +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 1; + unsigned int ctsmic : 1; + unsigned int reserved1 : 2; + unsigned int rxic : 1; + unsigned int txic : 1; + unsigned int rtic : 1; + unsigned int feic : 1; + unsigned int peic : 1; + unsigned int beic : 1; + unsigned int oeic : 1; + unsigned int reserved2 : 1; + unsigned int txfeic : 1; + unsigned int txfneic : 1; + unsigned int txtcic : 1; + unsigned int reserved3 : 1; + unsigned int rxfeic : 1; + unsigned int rxfneic : 1; + unsigned int rxffic : 1; + unsigned int abdcic : 1; + unsigned int abdeic : 1; + unsigned int cmic : 1; + unsigned int reserved4 : 10; + } BIT; +} volatile UART_ICR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int rxdmae : 1; + unsigned int txdmae : 1; + unsigned int dmaonerr : 1; + unsigned int rxlastsreq_en : 1; + unsigned int reserved0 : 28; + } BIT; +} volatile UART_DMACR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int msbfirst : 1; + unsigned int reserved0 : 31; + } BIT; +} volatile UART_DS_REG; +typedef union { + unsigned int reg; + struct { + unsigned int rtcfg : 24; + unsigned int reserved0 : 8; + } BIT; +} volatile UART_RTCFG_REG; +typedef union { + unsigned int reg; + struct { + unsigned int spcfg : 4; + unsigned int reserved0 : 28; + } BIT; +} volatile UART_SPCFG_REG; +typedef union { + unsigned int reg; + struct { + unsigned int abden : 1; + unsigned int reserved0 : 3; + unsigned int abdbusy : 1; + unsigned int abdenvld : 1; + unsigned int reserved1 : 26; + } BIT; +} volatile UART_ABDEN_REG; +typedef union { + unsigned int reg; + struct { + unsigned int chamat : 8; + unsigned int reserved0 : 23; + unsigned int cmen : 1; + } BIT; +} volatile UART_CHARMATCH_REG; +typedef struct { + UART_DR_REG UART_DR; + UART_RSR_REG UART_RSR; + unsigned char space0[16]; + UART_FR_REG UART_FR; + unsigned char space1[8]; + UART_IBRD_REG UART_IBRD; + UART_FBRD_REG UART_FBRD; + UART_LCR_H_REG UART_LCR_H; + UART_CR_REG UART_CR; + UART_IFLS_REG UART_IFLS; + UART_IMSC_REG UART_IMSC; + UART_RIS_REG UART_RIS; + UART_MIS_REG UART_MIS; + UART_ICR_REG UART_ICR; + UART_DMACR_REG UART_DMACR; + unsigned char space2[4]; + UART_DS_REG UART_DS; + UART_RTCFG_REG UART_RTCFG; + UART_SPCFG_REG UART_SPCFG; + UART_ABDEN_REG UART_ABDEN; + UART_CHARMATCH_REG UART_CHARMATCH; +} volatile UART_RegStruct; +static inline _Bool IsUartDatalength(UART_DataLength datalength) +{ + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); +} +static inline _Bool IsUartStopbits(UART_StopBits stopbits) +{ + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); +} +static inline _Bool IsUartParitymode(UART_Parity_Mode paritymode) +{ + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + return 1; + } + return 0; +} +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 1; + } + return 0; +} +static inline _Bool IsUartFIFOThreshold(UART_FIFO_Threshold fifoThreshold) +{ + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); +} +static inline _Bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); +} +static inline _Bool IsUartSequenceMode(UART_SequenceMode mode) +{ + return (mode == UART_SEQUENCE_START_LSB) || (mode == UART_SEQUENCE_START_MSB); +} +static inline void DCL_UART_WriteData(UART_RegStruct * const uartx, unsigned char data) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 694); while (1) { }; } } while (0); + uartx->UART_DR.BIT.data = data; +} +static inline unsigned char DCL_UART_ReadData(const UART_RegStruct *uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 705); while (1) { }; } } while (0); + return uartx->UART_DR.BIT.data; +} +static inline void DCL_UART_WriteEnable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 716); while (1) { }; } } while (0); + uartx->UART_CR.BIT.txe = 0x01; +} +static inline void DCL_UART_WriteDisable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 727); while (1) { }; } } while (0); + uartx->UART_CR.BIT.txe = 0x00; +} +static inline void DCL_UART_ReadEnable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 738); while (1) { }; } } while (0); + uartx->UART_CR.BIT.rxe = 0x01; +} +static inline void DCL_UART_ReadDisable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 749); while (1) { }; } } while (0); + uartx->UART_CR.BIT.rxe = 0x00; +} +static inline void DCL_UART_DMA_WriteEnable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 760); while (1) { }; } } while (0); + uartx->UART_DMACR.BIT.txdmae = 0x01; +} +static inline void DCL_UART_DMA_WriteDisable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 771); while (1) { }; } } while (0); + uartx->UART_DMACR.BIT.txdmae = 0x00; +} +static inline void DCL_UART_DMA_ReadEnable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 782); while (1) { }; } } while (0); + uartx->UART_DMACR.BIT.rxdmae = 0x01; +} +static inline void DCL_UART_DMA_ReadDisable(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 793); while (1) { }; } } while (0); + uartx->UART_DMACR.BIT.rxdmae = 0x00; +} +static inline void DCL_UART_SetDataLength(UART_RegStruct * const uartx, UART_DataLength dataLength) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 805); while (1) { }; } } while (0); + do { if (!(IsUartDatalength(dataLength))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 806); return; } } while (0); + uartx->UART_LCR_H.BIT.wlen = dataLength; +} +static inline unsigned int DCL_UART_GetDataLength(const UART_RegStruct * uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 817); while (1) { }; } } while (0); + return uartx->UART_LCR_H.BIT.wlen; +} +static inline void DCL_UART_SetParityOdd(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 828); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.eps = 0x00; + uartx->UART_LCR_H.BIT.pen = 0x01; +} +static inline void DCL_UART_SetParityEven(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 840); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.eps = 0x01; + uartx->UART_LCR_H.BIT.pen = 0x01; +} +static inline void DCL_UART_SetParityNone(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 852); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.pen = 0x00; +} +static inline unsigned int DCL_UART_GetParityCheck(const UART_RegStruct * uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 863); while (1) { }; } } while (0); + 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; + } +} +static inline void DCL_UART_SetStopBits(UART_RegStruct * const uartx, UART_StopBits bit) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 883); while (1) { }; } } while (0); + do { if (!(IsUartStopbits(bit))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 884); return; } } while (0); + uartx->UART_LCR_H.BIT.stp2 = bit; +} +static inline unsigned int DCL_UART_GetStopBits(const UART_RegStruct *uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 895); while (1) { }; } } while (0); + return uartx->UART_LCR_H.BIT.stp2; +} +static inline void DCL_UART_Enable_HwFlowCtr(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 906); while (1) { }; } } while (0); + uartx->UART_CR.BIT.ctsen = 0x01; + uartx->UART_CR.BIT.rtsen = 0x01; +} +static inline void DCL_UART_Disable_HwFlowCtr(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 918); while (1) { }; } } while (0); + uartx->UART_CR.BIT.ctsen = 0x00; + uartx->UART_CR.BIT.rtsen = 0x00; +} +static inline void DCL_UART_DisableStickParity(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 930); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.sps = 0x00; +} +static inline void DCL_UART_EnableStickParity_Zero(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 941); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.pen = 0x01; + uartx->UART_LCR_H.BIT.eps = 0x01; + uartx->UART_LCR_H.BIT.sps = 0x01; +} +static inline void DCL_UART_EnableStickParity_One(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 954); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.pen = 0x01; + uartx->UART_LCR_H.BIT.eps = 0x00; + uartx->UART_LCR_H.BIT.sps = 0x01; +} +static inline void DCL_UART_EnableCTSInt(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 967); while (1) { }; } } while (0); + uartx->UART_LCR_H.BIT.pen = 0x01; +} +static inline void DCL_UART_ClearCTSInt(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 978); while (1) { }; } } while (0); + uartx->UART_ICR.BIT.ctsmic = 0x01; + uartx->UART_IMSC.BIT.ctsmim = 0x00; +} +static inline unsigned int DCL_UART_GetCTSIntStatus(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 990); while (1) { }; } } while (0); + return uartx->UART_MIS.BIT.ctsmmis; +} +static inline void DCL_UART_SetDataLSB(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1001); while (1) { }; } } while (0); + uartx->UART_DS.BIT.msbfirst = 0; +} +static inline void DCL_UART_SetDataMSB(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1012); while (1) { }; } } while (0); + uartx->UART_DS.BIT.msbfirst = 1; +} +static inline void DCL_UART_SetDataSequences(UART_RegStruct * const uartx, _Bool dataSequence) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1024); while (1) { }; } } while (0); + uartx->UART_DS.BIT.msbfirst = dataSequence; +} +static inline void DCL_UART_SetRxTimeOut(UART_RegStruct * const uartx, unsigned int timeOfBits) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1037); while (1) { }; } } while (0); + do { if (!(timeOfBits <= 0xFFFFFF)) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1038); return; } } while (0); + uartx->UART_RTCFG.reg = timeOfBits; +} +static inline void DCL_UART_EnableBaudRateDetection(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1049); while (1) { }; } } while (0); + uartx->UART_ABDEN.BIT.abden = 0x01; +} +static inline void DCL_UART_DisableBaudRateDetection(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1060); while (1) { }; } } while (0); + uartx->UART_ABDEN.BIT.abden = 0x00; +} +static inline void DCL_UART_EnableMatchCharater(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1071); while (1) { }; } } while (0); + uartx->UART_CHARMATCH.BIT.cmen = 0x01; +} +static inline void DCL_UART_DisableMatchCharater(UART_RegStruct * const uartx) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1082); while (1) { }; } } while (0); + uartx->UART_CHARMATCH.BIT.cmen = 0x00; +} +static inline void DCL_UART_SetMatchCharater(UART_RegStruct * const uartx, unsigned int ascii) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1094); while (1) { }; } } while (0); + do { if (!(ascii <= 0xFF)) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1095); return; } } while (0); + uartx->UART_CHARMATCH.BIT.chamat = ascii; +} +static inline void DCL_UART_OversampleMultiple(UART_RegStruct * const uartx, UART_OversampleMultiple multiple) +{ + do { if (!((((uartx) == ((UART_RegStruct *)(void *)0x14000000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14001000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14002000)) || ((uartx) == ((UART_RegStruct *)(void *)0x14003000))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1107); while (1) { }; } } while (0); + do { if (!(IsUartOversampleMultiple(multiple))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\uart\\inc/uart_ip.h", 1108); return; } } while (0); + uartx->UART_SPCFG.BIT.spcfg = multiple; +} +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; +typedef enum { + DMA_TRANSWIDTH_BYTE = 0x00000000U, + DMA_TRANSWIDTH_HALFWORD = 0x00000001U, + DMA_TRANSWIDTH_WORD = 0x00000002U +} DMA_TransmisWidth; +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; +typedef enum { + DMA_CHANNEL_FINISH = 0x00000000U, + DMA_CHANNEL_ERROR = 0x00000001U +} DMA_CallbackFun_Type; +typedef enum { + DMA_PRIORITY_LOW = 0x00000000U, + DMA_PRIORITY_MEDIUM = 0x00000001U, + DMA_PRIORITY_HIGH = 0x00000002U, + DMA_PRIORITY_HIGHEST = 0x00000003U, +} DMA_ChannelPriority; +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; +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; +typedef enum { + DMA_SYSCTRLSET_0 = 0x00000000U, + DMA_SYSCTRLSET_1 = 0x00000001U, + DMA_SYSCTRLSET_2 = 0x00000002U +} DMA_SysctrlSet; +typedef enum { + DMA_BYTEORDER_SMALLENDIAN = 0x00000000U, + DMA_BYTEORDER_BIGENDIAN = 0x00000001U +} DMA_ByteOrder; +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; +typedef enum { + DMA_ADDR_UNALTERED = 0x00000000U, + DMA_ADDR_INCREASE = 0x00000001U +} DMA_AddrIncMode; +typedef struct _DMA_ExtendHandle { +} DMA_ExtendHandle; +typedef struct { + struct { + void (* ChannelFinishCallBack)(void *handle); + void (* ChannelErrorCallBack)(void *handle); + } DMA_CallbackFuns[6]; +} DMA_UserCallBack; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_stat : 1; + unsigned int ch1_int_stat : 1; + unsigned int ch2_int_stat : 1; + unsigned int ch3_int_stat : 1; + unsigned int ch4_int_stat : 1; + unsigned int ch5_int_stat : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_STAT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_tc_stat : 1; + unsigned int ch1_int_tc_stat : 1; + unsigned int ch2_int_tc_stat : 1; + unsigned int ch3_int_tc_stat : 1; + unsigned int ch4_int_tc_stat : 1; + unsigned int ch5_int_tc_stat : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_TC_STAT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_tc_clr : 1; + unsigned int ch1_int_tc_clr : 1; + unsigned int ch2_int_tc_clr : 1; + unsigned int ch3_int_tc_clr : 1; + unsigned int ch4_int_tc_clr : 1; + unsigned int ch5_int_tc_clr : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_TC_CLR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_err_stat : 1; + unsigned int ch1_int_err_stat : 1; + unsigned int ch2_int_err_stat : 1; + unsigned int ch3_int_err_stat : 1; + unsigned int ch4_int_err_stat : 1; + unsigned int ch5_int_err_stat : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_ERR_STAT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_int_err_clr : 1; + unsigned int ch1_int_err_clr : 1; + unsigned int ch2_int_err_clr : 1; + unsigned int ch3_int_err_clr : 1; + unsigned int ch4_int_err_clr : 1; + unsigned int ch5_int_err_clr : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_INT_ERR_CLR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_raw_int_tc : 1; + unsigned int ch1_raw_int_tc : 1; + unsigned int ch2_raw_int_tc : 1; + unsigned int ch3_raw_int_tc : 1; + unsigned int ch4_raw_int_tc : 1; + unsigned int ch5_raw_int_tc : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_RAW_INT_TC_STAT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_raw_int_err : 1; + unsigned int ch1_raw_int_err : 1; + unsigned int ch2_raw_int_err : 1; + unsigned int ch3_raw_int_err : 1; + unsigned int ch4_raw_int_err : 1; + unsigned int ch5_raw_int_err : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_RAW_INT_ERR_STAT_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch0_enabled : 1; + unsigned int ch1_enabled : 1; + unsigned int ch2_enabled : 1; + unsigned int ch3_enabled : 1; + unsigned int ch4_enabled : 1; + unsigned int ch5_enabled : 1; + unsigned int reserved0 : 26; + } BIT; +} volatile DMA_ENABLED_CHNS_REG; +typedef union { + unsigned int reg; + struct { + unsigned int dma_enable : 1; + unsigned int reserved0 : 31; + } BIT; +} volatile DMA_CONFIG_REG; +typedef union { + unsigned int reg; + struct { + unsigned int dma_sync_disable : 32; + } BIT; +} volatile DMA_SYNC_REG; +typedef union { + unsigned int reg; + struct { + unsigned int src_addr : 32; + } BIT; +} volatile DMA_Cn_SRC_ADDR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int dest_addr : 32; + } BIT; +} volatile DMA_Cn_DEST_ADDR_REG; +typedef union { + unsigned int reg; + struct { + unsigned int reserved0 : 2; + unsigned int ll_item : 30; + } BIT; +} volatile DMA_Cn_LLI_REG; +typedef union { + unsigned int reg; + struct { + unsigned int trans_size : 12; + unsigned int sbsize : 3; + unsigned int dbsize : 3; + unsigned int swidth : 3; + unsigned int dwidth : 3; + unsigned int reserved0 : 2; + unsigned int src_incr : 1; + unsigned int dest_incr : 1; + unsigned int reserved1 : 3; + unsigned int int_tc_enable : 1; + } BIT; +} volatile DMA_Cn_CONTROL_REG; +typedef union { + unsigned int reg; + struct { + unsigned int ch_en : 1; + unsigned int src_periph : 5; + unsigned int dest_periph : 5; + unsigned int flow_ctrl : 3; + unsigned int err_int_msk : 1; + unsigned int tc_int_msk : 1; + unsigned int ch_lock : 1; + unsigned int ch_active : 1; + unsigned int ch_halt : 1; + unsigned int reserved0 : 5; + unsigned int ch_priority : 2; + unsigned int reserved1 : 6; + } BIT; +} volatile DMA_Cn_CONFIG_REG; +typedef struct { + DMA_INT_STAT_REG DMA_INT_STAT; + DMA_INT_TC_STAT_REG DMA_INT_TC_STAT; + DMA_INT_TC_CLR_REG DMA_INT_TC_CLR; + DMA_INT_ERR_STAT_REG DMA_INT_ERR_STAT; + DMA_INT_ERR_CLR_REG DMA_INT_ERR_CLR; + DMA_RAW_INT_TC_STAT_REG DMA_RAW_INT_TC_STAT; + DMA_RAW_INT_ERR_STAT_REG DMA_RAW_INT_ERR_STAT; + DMA_ENABLED_CHNS_REG DMA_ENABLED_CHNS; + unsigned char space0[16]; + DMA_CONFIG_REG DMA_CONFIG; + DMA_SYNC_REG DMA_SYNC; + unsigned char space1[200]; + DMA_Cn_SRC_ADDR_REG DMA_C0_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_C0_DEST_ADDR; + DMA_Cn_LLI_REG DMA_C0_LLI; + DMA_Cn_CONTROL_REG DMA_C0_CONTROL; + DMA_Cn_CONFIG_REG DMA_C0_CONFIG; + unsigned char space2[12]; + DMA_Cn_SRC_ADDR_REG DMA_C1_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_C1_DEST_ADDR; + DMA_Cn_LLI_REG DMA_C1_LLI; + DMA_Cn_CONTROL_REG DMA_C1_CONTROL; + DMA_Cn_CONFIG_REG DMA_C1_CONFIG; + unsigned char space3[12]; + DMA_Cn_SRC_ADDR_REG DMA_C2_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_C2_DEST_ADDR; + DMA_Cn_LLI_REG DMA_C2_LLI; + DMA_Cn_CONTROL_REG DMA_C2_CONTROL; + DMA_Cn_CONFIG_REG DMA_C2_CONFIG; + unsigned char space4[12]; + DMA_Cn_SRC_ADDR_REG DMA_C3_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_C3_DEST_ADDR; + DMA_Cn_LLI_REG DMA_C3_LLI; + DMA_Cn_CONTROL_REG DMA_C3_CONTROL; + DMA_Cn_CONFIG_REG DMA_C3_CONFIG; + unsigned char space5[12]; + DMA_Cn_SRC_ADDR_REG DMA_C4_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_C4_DEST_ADDR; + DMA_Cn_LLI_REG DMA_C4_LLI; + DMA_Cn_CONTROL_REG DMA_C4_CONTROL; + DMA_Cn_CONFIG_REG DMA_C4_CONFIG; + unsigned char space6[12]; + DMA_Cn_SRC_ADDR_REG DMA_C5_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_C5_DEST_ADDR; + DMA_Cn_LLI_REG DMA_C5_LLI; + DMA_Cn_CONTROL_REG DMA_C5_CONTROL; + DMA_Cn_CONFIG_REG DMA_C5_CONFIG; +} volatile DMA_RegStruct; +typedef struct { + DMA_Cn_SRC_ADDR_REG DMA_Cn_SRC_ADDR; + DMA_Cn_DEST_ADDR_REG DMA_Cn_DEST_ADDR; + DMA_Cn_LLI_REG DMA_Cn_LLI; + DMA_Cn_CONTROL_REG DMA_Cn_CONTROL; + DMA_Cn_CONFIG_REG DMA_Cn_CONFIG; +} volatile DMA_ChannelRegStruct; +typedef struct _DMA_LinkList { + unsigned int srcAddr; + unsigned int destAddr; + struct _DMA_LinkList *lliNext; + DMA_Cn_CONTROL_REG control; +} DMA_LinkList; +typedef struct { + unsigned int srcAddr; + unsigned int destAddr; + unsigned int srcIn; + unsigned int destIn; + unsigned int chnParam; + unsigned int totalSize; +} DMA_SplitParam; +static inline _Bool IsDmaChannelNum(DMA_ChannelNum channel) +{ + 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 1; + } + return 0; +} +static inline _Bool IsDmaWidth(DMA_TransmisWidth width) +{ + if ((width == DMA_TRANSWIDTH_BYTE) || + (width == DMA_TRANSWIDTH_HALFWORD) || + (width == DMA_TRANSWIDTH_WORD)) { + return 1; + } + return 0; +} +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 1; + } + return 0; +} +static inline _Bool IsDmaAddrMode(DMA_AddrIncMode addrMode) +{ + return (addrMode == DMA_ADDR_UNALTERED) || (addrMode == DMA_ADDR_INCREASE); +} +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 1; + } + return 0; +} +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 1; + } + return 0; +} +static inline _Bool IsDmaReqPeriph(DMA_RequestLineNum reqPeriph) +{ + return (reqPeriph >= DMA_REQUEST_I2C0_RX) && (reqPeriph <= DMA_REQUEST_MEM); +} +static inline _Bool IsDmaValidAddress(unsigned int address) +{ + return (address >= 0x4000000 && address <= 0x4007FFF) || (address >= 0x10000000 && address <= 0x1C000FFF); +} +static inline void DCL_DMA_SetDirection(DMA_ChannelRegStruct * const dmaChannelx, DMA_TransDirection direction) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 755); while (1) { }; } } while (0); + do { if (!(IsDmaDirection(direction))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 756); return; } } while (0); + dmaChannelx->DMA_Cn_CONFIG.BIT.flow_ctrl = direction; +} +static inline void DCL_DMA_SetSrcAddr(DMA_ChannelRegStruct * const dmaChannelx, unsigned int srcAddr) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 767); while (1) { }; } } while (0); + do { if (!(srcAddr > 0)) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 768); return; } } while (0); + dmaChannelx->DMA_Cn_SRC_ADDR.BIT.src_addr = srcAddr; +} +static inline void DCL_DMA_SetDestAddr(DMA_ChannelRegStruct * const dmaChannelx, unsigned int destAddr) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 779); while (1) { }; } } while (0); + do { if (!(destAddr > 0)) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 780); return; } } while (0); + dmaChannelx->DMA_Cn_DEST_ADDR.BIT.dest_addr = destAddr; +} +static inline void DCL_DMA_SetSrcAddrMode(DMA_ChannelRegStruct * const dmaChannelx, DMA_AddrIncMode srcAddrInc) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 791); while (1) { }; } } while (0); + do { if (!(IsDmaAddrMode(srcAddrInc))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 792); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.src_incr = srcAddrInc; +} +static inline void DCL_DMA_SetDestAddrMode(DMA_ChannelRegStruct * const dmaChannelx, DMA_AddrIncMode destAddrInc) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 803); while (1) { }; } } while (0); + do { if (!(IsDmaAddrMode(destAddrInc))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 804); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.dest_incr = destAddrInc; +} +static inline void DCL_DMA_SetSrcWidth(DMA_ChannelRegStruct * const dmaChannelx, DMA_TransmisWidth srcWidth) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 815); while (1) { }; } } while (0); + do { if (!(IsDmaWidth(srcWidth))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 816); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.swidth = srcWidth; +} +static inline void DCL_DMA_SetDestWidth(DMA_ChannelRegStruct * const dmaChannelx, DMA_TransmisWidth destWidth) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 827); while (1) { }; } } while (0); + do { if (!(IsDmaWidth(destWidth))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 828); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.dwidth = destWidth; +} +static inline void DCL_DMA_SetSrcBurst(DMA_ChannelRegStruct * const dmaChannelx, DMA_BurstLength srcBurst) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 839); while (1) { }; } } while (0); + do { if (!(IsDmaBurstLength(srcBurst))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 840); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.sbsize = srcBurst; +} +static inline void DCL_DMA_SetDestBurst(DMA_ChannelRegStruct * const dmaChannelx, DMA_BurstLength destBurst) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 851); while (1) { }; } } while (0); + do { if (!(IsDmaBurstLength(destBurst))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 852); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.dbsize = destBurst; +} +static inline void DCL_DMA_SetTransferSize(DMA_ChannelRegStruct * const dmaChannelx, unsigned int dataLength) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 863); while (1) { }; } } while (0); + do { if (!(dataLength <= 0xFFF)) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 864); return; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.trans_size = dataLength; +} +static inline void DCL_DMA_EnableIT(DMA_ChannelRegStruct * const dmaChannelx) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 875); while (1) { }; } } while (0); + dmaChannelx->DMA_Cn_CONTROL.BIT.int_tc_enable = 0x01; + dmaChannelx->DMA_Cn_CONFIG.BIT.tc_int_msk = 0x01; +} +static inline void DCL_DMA_DisableIT(DMA_ChannelRegStruct * const dmaChannelx) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 887); while (1) { }; } } while (0); + dmaChannelx->DMA_Cn_CONFIG.BIT.tc_int_msk = 0x00; +} +static inline void DCL_DMA_EnableChannel(DMA_ChannelRegStruct * const dmaChannelx) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 898); while (1) { }; } } while (0); + dmaChannelx->DMA_Cn_CONFIG.BIT.ch_en = 0x01; +} +static inline void DCL_DMA_DisableChannel(DMA_ChannelRegStruct * const dmaChannelx) +{ + do { if (!((((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000100)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000120)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000140)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000160)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C000180)) || ((dmaChannelx) == ((DMA_ChannelRegStruct *)(void *)0x1C0001A0))))) { AssertErrorLog("h:\\git\\haisi_mcu\\open_mcu\\open_mcu\\vendor\\yibaina_3061M\\demo\\\\intelligent_assistant\\drivers\\dma\\inc/dma_ip.h", 909); while (1) { }; } } while (0); + dmaChannelx->DMA_Cn_CONFIG.BIT.ch_en = 0x00; +} +typedef struct _DMA_Handle { + DMA_RegStruct *baseAddress; + struct { + DMA_ChannelRegStruct *channelAddr; + DMA_TransDirection direction; + DMA_RequestLineNum srcPeriph; + DMA_RequestLineNum destPeriph; + DMA_AddrIncMode srcAddrInc; + DMA_AddrIncMode destAddrInc; + DMA_BurstLength srcBurst; + DMA_BurstLength destBurst; + DMA_TransmisWidth srcWidth; + DMA_TransmisWidth destWidth; + void *pHandle; + unsigned int srcAddr; + unsigned int destAddr; + unsigned int controlVal; + unsigned int configVal; + } DMA_Channels[6]; + DMA_UserCallBack userCallBack; + DMA_ExtendHandle handleEx; +} DMA_Handle; +typedef struct { + DMA_RequestLineNum srcPeriph; + DMA_RequestLineNum destPeriph; + DMA_TransDirection direction; + DMA_AddrIncMode srcAddrInc; + DMA_AddrIncMode destAddrInc; + DMA_BurstLength srcBurst; + DMA_BurstLength destBurst; + DMA_TransmisWidth srcWidth; + DMA_TransmisWidth destWidth; + void *pHandle; +} DMA_ChannelParam; +typedef void (* DMA_CallbackType)(void *handle); +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); +void HAL_DMA_QuickStart(DMA_Handle *dmaHandle, unsigned int channel); +typedef struct _UART_Handle { + UART_RegStruct *baseAddress; + unsigned int baudRate; + UART_DataLength dataLength; + UART_StopBits stopBits; + UART_Parity_Mode parity; + UART_Transmit_Mode txMode; + UART_Transmit_Mode rxMode; + volatile unsigned char *txbuff; + volatile unsigned char *rxbuff; + volatile unsigned int txBuffSize; + volatile unsigned int rxBuffSize; + _Bool fifoMode; + UART_FIFO_Threshold fifoTxThr; + UART_FIFO_Threshold fifoRxThr; + UART_HW_FlowCtr hwFlowCtr; + DMA_Handle *dmaHandle; + unsigned int uartDmaTxChn; + unsigned int uartDmaRxChn; + volatile UART_State_Type txState; + volatile UART_State_Type rxState; + UART_Error_Type errorType; + UART_UserCallBack userCallBack; + UART_ExtendHandle handleEx; +} UART_Handle; +typedef void (* UART_CallbackType)(void *handle); +BASE_StatusType HAL_UART_Init(UART_Handle *uartHandle); +BASE_StatusType HAL_UART_DeInit(UART_Handle *uartHandle); +UART_State_Type HAL_UART_GetState(UART_Handle *uartHandle); +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); +void HAL_UART_IrqHandler(void *handle); +BASE_StatusType HAL_UART_RegisterCallBack(UART_Handle *uartHandle, UART_CallbackFun_Type typeID, + UART_CallbackType pCallback); +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); +int ConsoleGetQuery(void); +int ConsoleGetc(void); +int ConsolePuts(const char *str); +void ConsolePutc(const char c); +int UartPrintf(const char *format, ...); +void ConsoleInit(UART_Handle uart); +typedef enum { + FILE_ID_LOG_C = 2001, +} file_id_enum; +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, +}; +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); +int ExtDrvLogSetLogLevel(enum ExtModule modId, enum ExtLogLevel level); +int ExtDrvLogOutFmt(enum ExtLogLevel level, enum ExtModule id, const char *fmt, ...); +struct MemoryLog { + unsigned char enable; + unsigned char mmzBuf[1024]; + 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; +}; +struct SysLogCtx *GetLogCtx(void); +void LogCtxInit(struct SysLogCtx *ctx); +void InitMemoryData(struct MemoryLog *memData); +struct SysDebugSwitch *GetDebugSwitch(void); +struct MemoryLog *GetMemoryData(void); +void DfxCmdRegister(void); +int CmdGetVersionInfo(void); +int ExtSetLogLevel(enum ExtModule id, enum ExtLogLevel logLevel); +typedef int wchar_t; +int atoi (const char *); +long atol (const char *); +long long atoll (const char *); +double atof (const char *); +float strtof (const char *restrict, char **restrict); +double strtod (const char *restrict, char **restrict); +long double strtold (const char *restrict, char **restrict); +long strtol (const char *restrict, char **restrict, int); +unsigned long strtoul (const char *restrict, char **restrict, int); +long long strtoll (const char *restrict, char **restrict, int); +unsigned long long strtoull (const char *restrict, char **restrict, int); +int rand (void); +void srand (unsigned); +void *malloc (size_t); +void *calloc (size_t, size_t); +void *realloc (void *, size_t); +void free (void *); +void *aligned_alloc(size_t, size_t); +_Noreturn void abort (void); +int atexit (void (*) (void)); +_Noreturn void exit (int); +_Noreturn void _Exit (int); +int at_quick_exit (void (*) (void)); +_Noreturn void quick_exit (int); +char *getenv (const char *); +int system (const char *); +void *bsearch (const void *, const void *, size_t, size_t, int (*)(const void *, const void *)); +void qsort (void *, size_t, size_t, int (*)(const void *, const void *)); +int abs (int); +long labs (long); +long long llabs (long long); +typedef struct { int quot, rem; } div_t; +typedef struct { long quot, rem; } ldiv_t; +typedef struct { long long quot, rem; } lldiv_t; +div_t div (int, int); +ldiv_t ldiv (long, long); +lldiv_t lldiv (long long, long long); +int mblen (const char *, size_t); +int mbtowc (wchar_t *restrict, const char *restrict, size_t); +int wctomb (char *, wchar_t); +size_t mbstowcs (wchar_t *restrict, const char *restrict, size_t); +size_t wcstombs (char *restrict, const wchar_t *restrict, size_t); +size_t __ctype_get_mb_cur_max(void); +int posix_memalign (void **, size_t, size_t); +int setenv (const char *, const char *, int); +int unsetenv (const char *); +int mkstemp (char *); +int mkostemp (char *, int); +char *mkdtemp (char *); +int getsubopt (char **, char *const *, char **); +int rand_r (unsigned *); +char *realpath (const char *restrict, char *restrict); +long int random (void); +void srandom (unsigned int); +char *initstate (unsigned int, char *, size_t); +char *setstate (char *); +int putenv (char *); +int posix_openpt (int); +int grantpt (int); +int unlockpt (int); +char *ptsname (int); +char *l64a (long); +long a64l (const char *); +void setkey (const char *); +double drand48 (void); +double erand48 (unsigned short [3]); +long int lrand48 (void); +long int nrand48 (unsigned short [3]); +long mrand48 (void); +long jrand48 (unsigned short [3]); +void srand48 (long); +unsigned short *seed48 (unsigned short [3]); +void lcong48 (unsigned short [7]); +void *alloca(size_t); +char *mktemp (char *); +int mkstemps (char *, int); +int mkostemps (char *, int, int); +void *valloc (size_t); +void *memalign(size_t, size_t); +int getloadavg(double *, int); +int clearenv(void); +void *reallocarray (void *, size_t, size_t); +void qsort_r (void *, size_t, size_t, int (*)(const void *, const void *, void *), void *); +typedef int ptrdiff_t; +typedef unsigned int size_t; +typedef int wchar_t; +typedef struct { + long long __max_align_ll __attribute__((__aligned__(__alignof__(long long)))); + long double __max_align_ld __attribute__((__aligned__(__alignof__(long double)))); +} max_align_t; +typedef int errno_t; +extern const char *GetHwSecureCVersion(unsigned short *verNumber); +extern errno_t memset_s(void *dest, size_t destMax, int c, size_t count); +extern errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count); +extern errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count); +extern errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc); +extern errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count); +extern errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc); +extern errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count); +extern int vsprintf_s(char *strDest, size_t destMax, const char *format, + va_list argList) ; +extern int sprintf_s(char *strDest, size_t destMax, const char *format, ...) ; +extern int vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format, + va_list argList) ; +extern int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format, + ...) ; +extern int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format, + va_list argList) ; +extern int snprintf_truncated_s(char *strDest, size_t destMax, + const char *format, ...) ; +extern int scanf_s(const char *format, ...); +extern int vscanf_s(const char *format, va_list argList); +extern int sscanf_s(const char *buffer, const char *format, ...); +extern int vsscanf_s(const char *buffer, const char *format, va_list argList); +extern int fscanf_s(FILE *stream, const char *format, ...); +extern int vfscanf_s(FILE *stream, const char *format, va_list argList); +extern char *strtok_s(char *strToken, const char *strDelimit, char **context); +extern char *gets_s(char *buffer, size_t destMax); +extern errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count); +extern errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count); +extern errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc); +extern errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count); +extern errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc); +extern errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count); +extern wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context); +extern int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList); +extern int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...); +extern int fwscanf_s(FILE *stream, const wchar_t *format, ...); +extern int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList); +extern int wscanf_s(const wchar_t *format, ...); +extern int vwscanf_s(const wchar_t *format, va_list argList); +extern int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...); +extern int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList); +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); +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); +static struct MemoryLog g_memoryLog = {0}; +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", +}; +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 }; +struct SysLogCtx *GetLogCtx(void) +{ + return &g_logCtx; +} +static struct SysDebugSwitch g_debugSwitch = {.enable = 1}; +struct SysDebugSwitch *GetDebugSwitch(void) +{ + return &g_debugSwitch; +} +void InitMemoryData(struct MemoryLog *memData) +{ + memData->enable = 1; + memData->logLen = 0; + memData->writePos = 0; +} +struct MemoryLog *GetMemoryData(void) +{ + return &g_memoryLog; +} +void LogCtxInit(struct SysLogCtx *ctx) +{ + ctx->modStr = moduleStr; + for (unsigned char i = 0; i < EXT_MODULE_BUTT; i++) { + ctx->logLevel[i] = EXT_LOG_LEVEL_ERROR; + } + ctx->init = 1; +} +static void PutLogToMem(struct MemoryLog *memLog, const char *src, unsigned char cnt) +{ + unsigned char len = cnt; + if (cnt > 1024 - memLog->writePos) { + len = 1024 - memLog->writePos; + if (memcpy_s(memLog->mmzBuf + memLog->writePos, 1024 - memLog->writePos, src, len) != + EXT_SUCCESS) { + UartPrintf("put log to memory memcpy err\n"); + return; + } + memLog->writePos = 0; + src += len; + len = cnt - len; + } + if (memcpy_s(memLog->mmzBuf + memLog->writePos, 1024 - memLog->writePos, src, len) != EXT_SUCCESS) { + UartPrintf("put log to memory memcpy err\n"); + return; + } + memLog->writePos += len; + memLog->logLen += cnt; + if (memLog->logLen > 1024) { + memLog->logLen = 1024; + } +} +static int CountNumberLen(unsigned int num) +{ + int count = 0; + do { + count += 1; + num = num/10; + } while (num != 0); + return count; +} +static unsigned int IsLogOutBufLegal(enum ExtLogLevel level, struct SysDebugSwitch *debugSwitch, + enum ExtModule modId, struct SysLogCtx *ctx) +{ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + if (((!debugSwitch->enable) && (level != EXT_LOG_LEVEL_ERROR)) || (level > ctx->logLevel[modId])) { + return EXT_SUCCESS; + } + return EXT_FAILURE; +} +int ExtDrvLogOutBuf(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, const unsigned int* logBuf, + unsigned short logBufLen) +{ + if (logBuf == ((void *)0)) + return EXT_FAILURE; + char buf[512] = { 0 }; + int cnt = 0; + int len = 0; + int count = 0; + struct SysLogCtx *ctx = GetLogCtx(); + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if (!ctx->init) { LogCtxInit(ctx); } + if (!(IsLogOutBufLegal(level, debugSwitch, modId, ctx))) { return EXT_SUCCESS; } + cnt = sprintf_s(buf, 512, "%u", id); + if (cnt < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + len += cnt; + unsigned short i = 0; + for (; i < logBufLen; ++i) { + count = CountNumberLen(logBuf[i]); + if ((count + len + 1) >= 512) { return EXT_FAILURE; } + cnt = sprintf_s(buf + len, 512 - len, " %u", logBuf[i]); + if (cnt < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + len += cnt; + } + cnt = sprintf_s(buf + len, 512 - len, "\n"); + len += cnt; + if (cnt < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } else if (!ctx->memLog.enable) { + UartPrintf("%s", buf); + return EXT_SUCCESS; + } + PutLogToMem(&ctx->memLog, buf, len); + return EXT_SUCCESS; +} +int CmdGetVersionInfo(void) +{ + int versionInfo; + versionInfo = (*(volatile unsigned int *)(0x4000000)); + { _PRIM_ST_, _PRIM_PRI_ = 1, _PRIM_MSG_ = "version info is : %x\n", _PRIM_LINE_ = 266, _PRIM_FILE_ID_ = 2001, _PRIM_MOD_ID_ = 12, _PRIM_END_ }; + return EXT_SUCCESS; +} +static int DealLogBuf(int len, enum ExtLogLevel level, enum ExtModule modId, const char buf[]) +{ + struct SysLogCtx *ctx = GetLogCtx(); + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if (!debugSwitch->enable) { + if (level != EXT_LOG_LEVEL_ERROR) { + return EXT_SUCCESS; + } + } + if (!ctx->init) { LogCtxInit(ctx); } + if (level > ctx->logLevel[modId]) { return EXT_SUCCESS; } + if (len < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + if (!ctx->memLog.enable) { + UartPrintf("%s", buf); + return EXT_SUCCESS; + } + PutLogToMem(&ctx->memLog, buf, len); + return EXT_SUCCESS; +} +int ExtDrvLogOut0(enum ExtLogLevel level, enum ExtModule modId, unsigned int id) +{ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[512] = { 0 }; + int len = 0; + len = sprintf_s(buf, 512, "%u\n", id); + if (len < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + return (DealLogBuf(len, level, modId, buf)); +} +int ExtDrvLogOut1(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, unsigned int d0) +{ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[512] = { 0 }; + int len = 0; + len = sprintf_s(buf, 512, "%u %u\n", id, d0); + if (len < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + return (DealLogBuf(len, level, modId, buf)); +} +int ExtDrvLogOut2(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, unsigned int d0, unsigned int d1) +{ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[512] = { 0 }; + int len = 0; + len = sprintf_s(buf, 512, "%u %u %u\n", id, d0, d1); + if (len < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + return (DealLogBuf(len, level, modId, buf)); +} +int ExtDrvLogOut3(enum ExtLogLevel level, enum ExtModule modId, unsigned int id, unsigned int d0, unsigned int d1, + unsigned int d2) +{ + if (level > EXT_LOG_LEVEL_BUTT || modId > EXT_MODULE_BUTT) + return EXT_FAILURE; + char buf[512] = { 0 }; + int len = 0; + len = sprintf_s(buf, 512, "%u %u %u %u\n", id, d0, d1, d2); + if (len < 0) { + UartPrintf("sprintf err\n"); + return EXT_FAILURE; + } + return (DealLogBuf(len, level, modId, buf)); +} +int ExtDrvLogSetLogLevel(enum ExtModule id, enum ExtLogLevel level) +{ + if (level >= EXT_LOG_LEVEL_BUTT || id >= EXT_MODULE_BUTT) { + UartPrintf("module or level unsupport\n"); + return EXT_FAILURE; + } + struct SysLogCtx *ctx = GetLogCtx(); + if (!ctx->init) { + LogCtxInit(ctx); + } + ctx->logLevel[id] = level; + return EXT_SUCCESS; +} +int ExtDrvLogOutFmt(enum ExtLogLevel level, enum ExtModule id, const char *fmt, ...) +{ + va_list args; + struct SysDebugSwitch *debugSwitch = GetDebugSwitch(); + if ((!debugSwitch->enable) && (level != EXT_LOG_LEVEL_ERROR)) { + return EXT_SUCCESS; + } + if (level >= EXT_LOG_LEVEL_BUTT || id >= EXT_MODULE_BUTT) { + UartPrintf("level %d or module %d err\n", level, id); + return EXT_FAILURE; + } + char *tag = "FEWIDB"; + struct SysLogCtx *ctx = GetLogCtx(); + if (!ctx->init) { + LogCtxInit(ctx); + } + if (level > ctx->logLevel[id]) { + return EXT_SUCCESS; + } + UartPrintf("%c-%s:", *(tag + level), ctx->modStr[id]); + __builtin_va_start(args,fmt); + UartPrintf(fmt, args); + __builtin_va_end(args); + UartPrintf("\r\n"); + return EXT_SUCCESS; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/ide_entry.py" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/ide_entry.py" new file mode 100644 index 00000000..163938d9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/packet_create.py" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/packet_create.py" new file mode 100644 index 00000000..73add298 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/toolchain/BUILD.gn" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/toolchain/BUILD.gn" new file mode 100644 index 00000000..282da139 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/toolchain/config.gni" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/build/toolchain/config.gni" new file mode 100644 index 00000000..2fb29c75 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/anavref.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/anavref.h" new file mode 100644 index 00000000..47f74aa4 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/baseaddr.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/baseaddr.h" new file mode 100644 index 00000000..961f0725 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinc.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinc.h" new file mode 100644 index 00000000..3994c661 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anatrim/anatrim.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anatrim/anatrim.c" new file mode 100644 index 00000000..00b3ca0b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anatrim/anatrim.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anatrim/anatrim.h" new file mode 100644 index 00000000..b5eef3e8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anavrefinit/anavrefinit.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anavrefinit/anavrefinit.c" new file mode 100644 index 00000000..ee6a5ab8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anavrefinit/anavrefinit.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/anavrefinit/anavrefinit.h" new file mode 100644 index 00000000..56396fe1 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/chipinit.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/chipinit.c" new file mode 100644 index 00000000..3cea5d59 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/chipinit.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/chipinit.h" new file mode 100644 index 00000000..07a7fd20 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/crginit/crginit.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/crginit/crginit.c" new file mode 100644 index 00000000..ab884e9a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/crginit/crginit.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/crginit/crginit.h" new file mode 100644 index 00000000..82ea33c9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/flashinit/flashinit.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/flashinit/flashinit.c" new file mode 100644 index 00000000..38a9be2d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/flashinit/flashinit.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/flashinit/flashinit.h" new file mode 100644 index 00000000..a5bd9508 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/systickinit/systickinit.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/systickinit/systickinit.c" new file mode 100644 index 00000000..2d787dc2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/systickinit/systickinit.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/chipinit/systickinit/systickinit.h" new file mode 100644 index 00000000..7a8710ad --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/codecopy.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/codecopy.json" new file mode 100644 index 00000000..e482c901 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/flash.lds" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/flash.lds" new file mode 100644 index 00000000..655283e9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp.h" new file mode 100644 index 00000000..10f4979f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp_info_read.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp_info_read.c" new file mode 100644 index 00000000..0f46d5dd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp_info_read.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/fotp/fotp_info_read.h" new file mode 100644 index 00000000..2a78077f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/info.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/info.h" new file mode 100644 index 00000000..fde26d30 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/interrupt_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/interrupt_ip.h" new file mode 100644 index 00000000..07bdf6b0 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ioconfig.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ioconfig.h" new file mode 100644 index 00000000..7e5a9eaf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/iomap/iomap.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/iomap/iomap.h" new file mode 100644 index 00000000..e9c6f92d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ip_crg/ip_crg_common.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ip_crg/ip_crg_common.c" new file mode 100644 index 00000000..79bb68ea --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ip_crg/ip_crg_common.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/ip_crg/ip_crg_common.h" new file mode 100644 index 00000000..9ed469fa --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/locktype.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/locktype.h" new file mode 100644 index 00000000..08b87ff3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/startup.S" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/startup.S" new file mode 100644 index 00000000..8aedfa8f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/sysctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/sysctrl.h" new file mode 100644 index 00000000..b23f23aa --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/systick.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/3061m/systick.h" new file mode 100644 index 00000000..8e4f42eb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/target/userconfig.json" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/chip/target/userconfig.json" new file mode 100644 index 00000000..855b1d10 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/common/inc/acmp.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/common/inc/acmp.h" new file mode 100644 index 00000000..6f894dcf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/inc/acmp_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/inc/acmp_ex.h" new file mode 100644 index 00000000..8291c189 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/inc/acmp_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/inc/acmp_ip.h" new file mode 100644 index 00000000..16c8de94 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/src/acmp.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/src/acmp.c" new file mode 100644 index 00000000..4112f18c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/src/acmp_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/acmp/src/acmp_ex.c" new file mode 100644 index 00000000..3ccc008a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/common/inc/adc.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/common/inc/adc.h" new file mode 100644 index 00000000..c32b8cae --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/inc/adc_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/inc/adc_ex.h" new file mode 100644 index 00000000..afe25932 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/inc/adc_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/inc/adc_ip.h" new file mode 100644 index 00000000..80882def --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/src/adc.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/src/adc.c" new file mode 100644 index 00000000..fd90dde4 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/src/adc_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/adc/src/adc_ex.c" new file mode 100644 index 00000000..adf8fd52 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/common/inc/apt.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/common/inc/apt.h" new file mode 100644 index 00000000..331709f5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/inc/apt_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/inc/apt_ip.h" new file mode 100644 index 00000000..dfba8271 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/src/apt.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/apt/src/apt.c" new file mode 100644 index 00000000..e0ac4efd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/common/inc/baseinc.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/common/inc/baseinc.h" new file mode 100644 index 00000000..2f9c37a8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/assert.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/assert.h" new file mode 100644 index 00000000..4d17a1c8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/base_math.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/base_math.h" new file mode 100644 index 00000000..defe9cb0 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/clock.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/clock.h" new file mode 100644 index 00000000..0f5df18e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/generalfunc.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/generalfunc.h" new file mode 100644 index 00000000..06ef81bb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/interrupt.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/interrupt.h" new file mode 100644 index 00000000..1fa09615 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/lock.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/lock.h" new file mode 100644 index 00000000..451ca83f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/reset.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/reset.h" new file mode 100644 index 00000000..ffc14408 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/typedefs.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/inc/typedefs.h" new file mode 100644 index 00000000..2af04be5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/assert.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/assert.c" new file mode 100644 index 00000000..b99ca6ca --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/base_math.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/base_math.c" new file mode 100644 index 00000000..05a2063e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/clock.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/clock.c" new file mode 100644 index 00000000..5a364125 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/generalfunc.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/generalfunc.c" new file mode 100644 index 00000000..91c2d2fc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/interrupt.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/interrupt.c" new file mode 100644 index 00000000..c85e5fc1 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/lock.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/lock.c" new file mode 100644 index 00000000..764a7cf2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/reset.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/base/src/reset.c" new file mode 100644 index 00000000..c7c4e085 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/common/inc/can.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/common/inc/can.h" new file mode 100644 index 00000000..b9f2e930 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/inc/can_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/inc/can_ip.h" new file mode 100644 index 00000000..f25c3836 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/src/can.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/can/src/can.c" new file mode 100644 index 00000000..13a403ce --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/common/inc/capm.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/common/inc/capm.h" new file mode 100644 index 00000000..eae8fb20 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/inc/capm_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/inc/capm_ip.h" new file mode 100644 index 00000000..7fa19345 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/src/capm.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/capm/src/capm.c" new file mode 100644 index 00000000..0372e391 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/common/inc/cfd.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/common/inc/cfd.h" new file mode 100644 index 00000000..c697a72f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/inc/cfd_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/inc/cfd_ip.h" new file mode 100644 index 00000000..8af19157 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/src/cfd.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cfd/src/cfd.c" new file mode 100644 index 00000000..76f51e03 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/common/inc/cmm.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/common/inc/cmm.h" new file mode 100644 index 00000000..fedc5f36 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/inc/cmm_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/inc/cmm_ip.h" new file mode 100644 index 00000000..129916eb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/src/cmm.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/cmm/src/cmm.c" new file mode 100644 index 00000000..fbc8e26b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/common/inc/crc.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/common/inc/crc.h" new file mode 100644 index 00000000..4e73620c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/inc/crc_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/inc/crc_ip.h" new file mode 100644 index 00000000..3eb7502f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/src/crc.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crc/src/crc.c" new file mode 100644 index 00000000..5b010ead --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/common/inc/crg.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/common/inc/crg.h" new file mode 100644 index 00000000..ed10ef58 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/inc/crg_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/inc/crg_ip.h" new file mode 100644 index 00000000..3ee147c2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/src/crg.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/crg/src/crg.c" new file mode 100644 index 00000000..9dd7c7af --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/common/inc/dac.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/common/inc/dac.h" new file mode 100644 index 00000000..4849c092 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/inc/dac_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/inc/dac_ip.h" new file mode 100644 index 00000000..f5139125 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/src/dac.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dac/src/dac.c" new file mode 100644 index 00000000..7dbd89f6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/inc/debug.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/inc/debug.h" new file mode 100644 index 00000000..ce2a1aa5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/cmd.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/cmd.h" new file mode 100644 index 00000000..ae00b8e9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/cmd_common.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/cmd_common.h" new file mode 100644 index 00000000..909206c8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/command.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/command.h" new file mode 100644 index 00000000..4732fafa --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/common.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/common.h" new file mode 100644 index 00000000..0e13687c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/config.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/config.h" new file mode 100644 index 00000000..573eaa74 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/console.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/console.h" new file mode 100644 index 00000000..d870fd98 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/dfx_debug.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/dfx_debug.h" new file mode 100644 index 00000000..69d44fb9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/dfx_log.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/dfx_log.h" new file mode 100644 index 00000000..bbb51567 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/errno.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/errno.h" new file mode 100644 index 00000000..df88fbf3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/event.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/event.h" new file mode 100644 index 00000000..7d7482e4 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/ext_log.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/ext_log.h" new file mode 100644 index 00000000..1a211d0d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/file_id_defs.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/file_id_defs.h" new file mode 100644 index 00000000..b1005a51 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/log.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/log.h" new file mode 100644 index 00000000..70653a31 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/module.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/module.h" new file mode 100644 index 00000000..ca565e1f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/type.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/inc/type.h" new file mode 100644 index 00000000..2e4fdbfd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/app_command.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/app_command.c" new file mode 100644 index 00000000..a512fcae --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/cmd.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/cmd.c" new file mode 100644 index 00000000..06a08d9c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/cmd_common.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/cmd_common.c" new file mode 100644 index 00000000..b20ef5e7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/config.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/config.c" new file mode 100644 index 00000000..2cdb30cd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/console.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/console.c" new file mode 100644 index 00000000..2c31c248 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_debug.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_debug.c" new file mode 100644 index 00000000..3084eb4c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_log.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_log.c" new file mode 100644 index 00000000..b0cba421 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_log_proc.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/dfx_log_proc.c" new file mode 100644 index 00000000..03e80edc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/event.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/event.c" new file mode 100644 index 00000000..0f8eb7a6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/ext_command.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/log/src/ext_command.c" new file mode 100644 index 00000000..7bbf842c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/src/debug.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/debug/src/debug.c" new file mode 100644 index 00000000..d7cb26bc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/common/inc/dma.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/common/inc/dma.h" new file mode 100644 index 00000000..acd7381b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/inc/dma_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/inc/dma_ex.h" new file mode 100644 index 00000000..1cf910d3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/inc/dma_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/inc/dma_ip.h" new file mode 100644 index 00000000..156b280f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/src/dma.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/src/dma.c" new file mode 100644 index 00000000..860a9ad7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/src/dma_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/dma/src/dma_ex.c" new file mode 100644 index 00000000..d70c792c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/common/inc/flash.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/common/inc/flash.h" new file mode 100644 index 00000000..ede119d3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/inc/flash_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/inc/flash_ip.h" new file mode 100644 index 00000000..1492bacf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/src/flash.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/flash/src/flash.c" new file mode 100644 index 00000000..aff56ee9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/common/inc/gpio.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/common/inc/gpio.h" new file mode 100644 index 00000000..21cb00f3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/inc/gpio_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/inc/gpio_ip.h" new file mode 100644 index 00000000..ebf8d09e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/src/gpio.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpio/src/gpio.c" new file mode 100644 index 00000000..1a3e1a20 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/common/inc/gpt.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/common/inc/gpt.h" new file mode 100644 index 00000000..bebbc326 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/inc/gpt_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/inc/gpt_ex.h" new file mode 100644 index 00000000..0247b76d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/inc/gpt_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/inc/gpt_ip.h" new file mode 100644 index 00000000..cd963ee6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/src/gpt.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/src/gpt.c" new file mode 100644 index 00000000..0ad8dad3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/src/gpt_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/gpt/src/gpt_ex.c" new file mode 100644 index 00000000..44aaff7b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/common/inc/i2c.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/common/inc/i2c.h" new file mode 100644 index 00000000..decd4f3b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/inc/i2c_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/inc/i2c_ex.h" new file mode 100644 index 00000000..5cc50448 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/inc/i2c_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/inc/i2c_ip.h" new file mode 100644 index 00000000..dcd04953 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/src/i2c.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/src/i2c.c" new file mode 100644 index 00000000..8d3e8d6c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/src/i2c_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/i2c/src/i2c_ex.c" new file mode 100644 index 00000000..29e584d5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/common/iocmg.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/common/iocmg.h" new file mode 100644 index 00000000..5127d7a6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/inc/iocmg_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/inc/iocmg_ip.h" new file mode 100644 index 00000000..050b4cec --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/src/iocmg.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iocmg/src/iocmg.c" new file mode 100644 index 00000000..f9d0d94e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/common/inc/iwdg.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/common/inc/iwdg.h" new file mode 100644 index 00000000..48dc1086 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/inc/iwdg_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/inc/iwdg_ex.h" new file mode 100644 index 00000000..3467382a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/inc/iwdg_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/inc/iwdg_ip.h" new file mode 100644 index 00000000..470629db --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/src/iwdg.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/src/iwdg.c" new file mode 100644 index 00000000..ff418108 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/src/iwdg_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/iwdg/src/iwdg_ex.c" new file mode 100644 index 00000000..92a11f83 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/common/inc/pga.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/common/inc/pga.h" new file mode 100644 index 00000000..4507a9f2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/inc/pga_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/inc/pga_ip.h" new file mode 100644 index 00000000..f2fad2ee --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/src/pga.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pga/src/pga.c" new file mode 100644 index 00000000..ebc94a1f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/common/inc/pmc.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/common/inc/pmc.h" new file mode 100644 index 00000000..d05b6635 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/inc/pmc_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/inc/pmc_ip.h" new file mode 100644 index 00000000..d3a4b234 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/src/pmc.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/pmc/src/pmc.c" new file mode 100644 index 00000000..34ecd074 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/common/inc/qdm.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/common/inc/qdm.h" new file mode 100644 index 00000000..b890338e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/inc/qdm_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/inc/qdm_ip.h" new file mode 100644 index 00000000..e19e6caf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/src/qdm.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/qdm/src/qdm.c" new file mode 100644 index 00000000..5c0083d4 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/common/inc/spi.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/common/inc/spi.h" new file mode 100644 index 00000000..f6c8ef2f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/inc/spi_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/inc/spi_ex.h" new file mode 100644 index 00000000..22684be7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/inc/spi_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/inc/spi_ip.h" new file mode 100644 index 00000000..b51a0a11 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/src/spi.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/src/spi.c" new file mode 100644 index 00000000..59a37f14 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/src/spi_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/spi/src/spi_ex.c" new file mode 100644 index 00000000..c13bb352 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/common/inc/timer.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/common/inc/timer.h" new file mode 100644 index 00000000..edd902cd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/inc/timer_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/inc/timer_ex.h" new file mode 100644 index 00000000..0b04725c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/inc/timer_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/inc/timer_ip.h" new file mode 100644 index 00000000..877b9ffb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/src/timer.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/src/timer.c" new file mode 100644 index 00000000..2c74e91b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/src/timer_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/timer/src/timer_ex.c" new file mode 100644 index 00000000..b74d4bfe --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/common/inc/tsensor.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/common/inc/tsensor.h" new file mode 100644 index 00000000..754e7791 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/inc/tsensor_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/inc/tsensor_ip.h" new file mode 100644 index 00000000..2b6c7e49 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/src/tsensor.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/tsensor/src/tsensor.c" new file mode 100644 index 00000000..65966092 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/common/inc/uart.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/common/inc/uart.h" new file mode 100644 index 00000000..a80401c9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/inc/uart_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/inc/uart_ex.h" new file mode 100644 index 00000000..12219f09 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/inc/uart_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/inc/uart_ip.h" new file mode 100644 index 00000000..006cdaf3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart.c" new file mode 100644 index 00000000..3b339a36 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart.c" @@ -0,0 +1,894 @@ +/** + * @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. + */ +unsigned char USART_RX_STA=0; //接收状态标记 0表示开始接收,1表示接收到0d, 2表示接收完毕 +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 (USART_RX_STA!=2) { + if (uartHandle->baseAddress->UART_FR.BIT.rxfe == 0x01) { /* True when the RX FIFO is empty */ + break; + } + tmp = uartHandle->baseAddress->UART_DR.reg; + if(USART_RX_STA==1)//接收到了0x0d + { + if((tmp & 0xFF)!=0x0a)tmp=0;//接收错误,重新开始 + else USART_RX_STA = 2; //接收完成了 + } + else //还没收到0X0D + { + if((tmp & 0xFF)==0x0d)USART_RX_STA = 1; + else + { + *(uartHandle->rxbuff)=(tmp & 0xFF); + uartHandle->rxbuff++; + //长度校验实现 + } + } + } + uartHandle->baseAddress->UART_ICR.reg |= 0x20050; /* Clear rxic, rtic and rxfneic */ + if (uartHandle->userCallBack.ReadItFinishCallBack != NULL && USART_RX_STA==2) { + USART_RX_STA = 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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/uart/src/uart_ex.c" new file mode 100644 index 00000000..dd93b7c2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/common/inc/wwdg.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/common/inc/wwdg.h" new file mode 100644 index 00000000..ecef6112 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/inc/wwdg_ex.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/inc/wwdg_ex.h" new file mode 100644 index 00000000..6f520c3b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/inc/wwdg_ip.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/inc/wwdg_ip.h" new file mode 100644 index 00000000..35bf7ac5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/src/wwdg.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/src/wwdg.c" new file mode 100644 index 00000000..aa00350d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/src/wwdg_ex.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/drivers/wwdg/src/wwdg_ex.c" new file mode 100644 index 00000000..36a32b1c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/adc_calibra/mcs_adcCalibr.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/adc_calibra/mcs_adcCalibr.c" new file mode 100644 index 00000000..a4fdeb63 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/adc_calibra/mcs_adcCalibr.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/adc_calibra/mcs_adcCalibr.h" new file mode 100644 index 00000000..87a21c00 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/brake/mcs_brake.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/brake/mcs_brake.c" new file mode 100644 index 00000000..357cce8d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/brake/mcs_brake.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/brake/mcs_brake.h" new file mode 100644 index 00000000..26a867ae --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_filter.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_filter.c" new file mode 100644 index 00000000..1aadd97a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_filter.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_filter.h" new file mode 100644 index 00000000..7fee90fc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_lpfRk4.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_lpfRk4.c" new file mode 100644 index 00000000..47f495aa --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_lpfRk4.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_lpfRk4.h" new file mode 100644 index 00000000..3cf8b2a7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_pll.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_pll.c" new file mode 100644 index 00000000..8eba6cca --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_pll.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/filter/mcs_pll.h" new file mode 100644 index 00000000..7a0228b8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.c" new file mode 100644 index 00000000..17ecb6ee --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.h" new file mode 100644 index 00000000..0fe6b555 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.c" new file mode 100644 index 00000000..84ae2854 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.h" new file mode 100644 index 00000000..ba15e15b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.c" new file mode 100644 index 00000000..3100ef65 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.h" new file mode 100644 index 00000000..78ca1185 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.c" new file mode 100644 index 00000000..7db97eb0 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.h" new file mode 100644 index 00000000..cd32b5c7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.c" new file mode 100644 index 00000000..1e892263 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.h" new file mode 100644 index 00000000..999dd359 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.c" new file mode 100644 index 00000000..5f88e833 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.h" new file mode 100644 index 00000000..5767f3a2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_startup.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_startup.c" new file mode 100644 index 00000000..3bc2138d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_startup.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/foc_loop_ctrl/mcs_startup.h" new file mode 100644 index 00000000..725cdd99 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math.c" new file mode 100644 index 00000000..d1e932f0 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math.h" new file mode 100644 index 00000000..0992dc10 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math_const.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/math/mcs_math_const.h" new file mode 100644 index 00000000..6a605bd9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_r1_svpwm.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_r1_svpwm.c" new file mode 100644 index 00000000..911f6702 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_r1_svpwm.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_r1_svpwm.h" new file mode 100644 index 00000000..3bc19901 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_svpwm.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_svpwm.c" new file mode 100644 index 00000000..71b595ec --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_svpwm.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/modulation/mcs_svpwm.h" new file mode 100644 index 00000000..fe636fa5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/observer/mcs_fosmo.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/observer/mcs_fosmo.c" new file mode 100644 index 00000000..690bbb95 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/observer/mcs_fosmo.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/observer/mcs_fosmo.h" new file mode 100644 index 00000000..350842e2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_curr_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_curr_ctrl.c" new file mode 100644 index 00000000..3eda2abd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_curr_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_curr_ctrl.h" new file mode 100644 index 00000000..d7ed3d9f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_volt_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_volt_ctrl.c" new file mode 100644 index 00000000..1fdf5dfd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_volt_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pfc/pfc_volt_ctrl.h" new file mode 100644 index 00000000..b1f6e94d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pid_controller/mcs_pid_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pid_controller/mcs_pid_ctrl.c" new file mode 100644 index 00000000..f780fd62 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pid_controller/mcs_pid_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/pid_controller/mcs_pid_ctrl.h" new file mode 100644 index 00000000..65185097 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/power/mcs_power_mgmt.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/power/mcs_power_mgmt.c" new file mode 100644 index 00000000..a15b3f66 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/power/mcs_power_mgmt.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/power/mcs_power_mgmt.h" new file mode 100644 index 00000000..1133c06b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_openphs_det.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_openphs_det.c" new file mode 100644 index 00000000..2c195eba --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_openphs_det.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_openphs_det.h" new file mode 100644 index 00000000..771953d8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_stall_det.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_stall_det.c" new file mode 100644 index 00000000..be54fab4 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_stall_det.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_stall_det.h" new file mode 100644 index 00000000..67055498 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_unbalance_det.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_unbalance_det.c" new file mode 100644 index 00000000..b7f24d89 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_unbalance_det.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/protection/mcs_unbalance_det.h" new file mode 100644 index 00000000..ac94519e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/ramp/mcs_ramp_mgmt.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/ramp/mcs_ramp_mgmt.c" new file mode 100644 index 00000000..eaf9a301 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/ramp/mcs_ramp_mgmt.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/ramp/mcs_ramp_mgmt.h" new file mode 100644 index 00000000..fecbbe48 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_assert.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_assert.h" new file mode 100644 index 00000000..c61b1275 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_mtr_param.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_mtr_param.c" new file mode 100644 index 00000000..29eaffbf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_mtr_param.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_mtr_param.h" new file mode 100644 index 00000000..678d58a3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_sys_status.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_sys_status.h" new file mode 100644 index 00000000..c26301fc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_typedef.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/utilities/mcs_typedef.h" new file mode 100644 index 00000000..9a9fb890 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/vf/mcs_vf_ctrl.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/vf/mcs_vf_ctrl.c" new file mode 100644 index 00000000..ea2457a1 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/vf/mcs_vf_ctrl.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/control_library/vf/mcs_vf_ctrl.h" new file mode 100644 index 00000000..5de22b3a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/LICENSE" new file mode 100644 index 00000000..42f2a836 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/Makefile" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/Makefile" new file mode 100644 index 00000000..bdeee085 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/README.en.md" new file mode 100644 index 00000000..60c477fe --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/README.md" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/README.md" new file mode 100644 index 00000000..c16cbb17 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/include/securec.h" new file mode 100644 index 00000000..b1dea967 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/include/securectype.h" new file mode 100644 index 00000000..69e79c2f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.c" new file mode 100644 index 00000000..d3c7f06c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.c" new file mode 100644 index 00000000..bd0f12a9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.c" new file mode 100644 index 00000000..d12495aa --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/input.inl" new file mode 100644 index 00000000..41d401cf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.c" new file mode 100644 index 00000000..a7fd4874 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.c" new file mode 100644 index 00000000..f231f05d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.c" new file mode 100644 index 00000000..d9a657fd --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/output.inl" new file mode 100644 index 00000000..9392efaa --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.c" new file mode 100644 index 00000000..fa5470b8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secinput.h" new file mode 100644 index 00000000..176ee05d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.c" new file mode 100644 index 00000000..0053a72c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.h" new file mode 100644 index 00000000..7e3bd691 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.c" new file mode 100644 index 00000000..e79868f4 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.c" new file mode 100644 index 00000000..12c9ef81 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput.h" new file mode 100644 index 00000000..dc483f58 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.c" new file mode 100644 index 00000000..b2b4b6a6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.c" new file mode 100644 index 00000000..672c0184 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.c" new file mode 100644 index 00000000..e9b94f37 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.c" new file mode 100644 index 00000000..0cf3fca9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.c" new file mode 100644 index 00000000..b441329e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.c" new file mode 100644 index 00000000..f835e7bc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.c" new file mode 100644 index 00000000..ca1b2ddb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.c" new file mode 100644 index 00000000..6686d299 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.c" new file mode 100644 index 00000000..5f4c5b70 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.c" new file mode 100644 index 00000000..cd5dcd2c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.c" new file mode 100644 index 00000000..09d77a2f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.c" new file mode 100644 index 00000000..e5b8bbfc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.c" new file mode 100644 index 00000000..214ee6a2 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.c" new file mode 100644 index 00000000..1ab9c3cb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.c" new file mode 100644 index 00000000..61480a69 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.c" new file mode 100644 index 00000000..35caaa22 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.c" new file mode 100644 index 00000000..f50fa4a9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.c" new file mode 100644 index 00000000..a19abe2b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.c" new file mode 100644 index 00000000..29715fc6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.c" new file mode 100644 index 00000000..bab53a3e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.c" new file mode 100644 index 00000000..b39f9bc7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.c" new file mode 100644 index 00000000..fa7d847c --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.c" new file mode 100644 index 00000000..8c4a4af8 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.c" new file mode 100644 index 00000000..33e53a32 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.c" new file mode 100644 index 00000000..463f90e1 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.c" new file mode 100644 index 00000000..063ca691 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.c" new file mode 100644 index 00000000..2f2b4a33 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.c" new file mode 100644 index 00000000..88bb97b9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.c" new file mode 100644 index 00000000..badb04ef --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/include/mcs_smo_4th.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/include/mcs_smo_4th.h" new file mode 100644 index 00000000..5fb9a507 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/include/nos_task.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/include/nos_task.h" new file mode 100644 index 00000000..78ff8127 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/lib/libmcs_smo_4th.a" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/lib/libnostask.a" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/middleware/thirdparty/sysroot/lib/libnostask.a" new file mode 100644 index 0000000000000000000000000000000000000000..2dd6fe666747eb1f9fcf764a7fa5b2c5130cdde3 GIT binary patch literal 54870 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 DqtIY= literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/.ninja_log" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/.ninja_log" new file mode 100644 index 00000000..c66139af --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/.ninja_log" @@ -0,0 +1,281 @@ +# ninja log v6 +518 3644 7525604578094942 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o db0f74188169141d +10850 14225 7525604681419721 obj/drivers/debug/log/src/dfx_log_proc.o 6203f1d8c791638c +1842 5017 7525604591341103 obj/chip/3061m/fotp/fotp_info_read.o 610a23641277aade +2127 5330 7525604594183187 obj/chip/3061m/ip_crg/ip_crg_common.o 34501e9f90eea0b1 +8830 12203 7525604661214144 obj/drivers/debug/log/src/cmd.o fbfa74c6511c4468 +1178 4277 7525604584691796 obj/chip/3061m/chipinit/flashinit/flashinit.o 1131601ccbd75600 +58 2742 7525604573494553 obj/chip/3061m/startup.o f5b008968cd23111 +322 3331 7525604576130196 obj/chip/3061m/chipinit/anatrim/anatrim.o 2ecae0513fb5597e +1509 4647 7525604588003761 obj/chip/3061m/chipinit/systickinit/systickinit.o 28317a73b2ecad06 +33463 36700 7525604907545880 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o c2c16dde9d3cebb3 +21817 24948 7525604791094387 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o 30c1e63e48cb0466 +840 3979 7525604581326299 obj/chip/3061m/chipinit/crginit/crginit.o e1eb6b9cfecfa9ae +16608 19915 7525604738995389 obj/drivers/qdm/src/qdm.o 5004c7c405376fcb +20893 24016 7525604781847218 obj/middleware/control_library/filter/mcs_lpfRk4.o 8c523b08b18129ff +178 3062 7525604574701324 obj/chip/3061m/chipinit/chipinit.o f6c2d7f4d23d5669 +2426 5702 7525604597175181 obj/drivers/acmp/src/acmp.o 926a58cef9d3127 +29341 32689 7525604866333127 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o 50732f4645a5fa1f +14949 18233 7525604722413050 obj/drivers/iocmg/src/iocmg.o 933c26a46f9e11ad +17262 20545 7525604745528590 obj/drivers/spi/src/spi_ex.o e890a9a33c5c694b +2743 6027 7525604600344279 obj/drivers/acmp/src/acmp_ex.o 7865e95fb963e513 +3979 7229 7525604612714044 obj/drivers/base/src/assert.o d1c9cc0705a0ba3d +6291 9497 7525604635821339 obj/drivers/can/src/can.o 1e36f79221ed3490 +5017 8207 7525604623085655 obj/drivers/base/src/generalfunc.o 6532c3a2b57d6f4a +5331 8504 7525604626227343 obj/drivers/base/src/interrupt.o 48cc5645f224bde5 +4277 7538 7525604615686093 obj/drivers/base/src/base_math.o 6476a35a76f7bfac +10198 13556 7525604674900863 obj/drivers/debug/log/src/dfx_debug.o bfe884249801089 +3331 6594 7525604606225425 obj/drivers/adc/src/adc_ex.o e0150b11c7fb40e7 +4655 7868 7525604619466670 obj/drivers/base/src/clock.o bed8b72e3e015587 +19915 23075 7525604772067796 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o e3ea4366cf38bb7f +5703 8830 7525604629946762 obj/drivers/base/src/lock.o c64fd2f8f90106da +15271 18541 7525604725624462 obj/drivers/iwdg/src/iwdg.o 544455bb05cdaf94 +29974 33463 7525604872661851 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o 4994e3c63259b839 +11482 14949 7525604687741368 obj/drivers/debug/log/src/ext_command.o 45a58062b66df899 +3062 6290 7525604603542603 obj/drivers/adc/src/adc.o 2fe041705a3c7b9b +3644 6929 7525604609363006 obj/drivers/apt/src/apt.o c1a81efb35a30c8c +40915 45323 7525604982063312 obj/user/main.o 991f27384dccc7f0 +17907 21208 7525604751978939 obj/drivers/timer/src/timer_ex.o 914fcc552a63085 +6929 10198 7525604642206759 obj/drivers/cfd/src/cfd.o 1d5abec459f15641 +6027 9142 7525604633178399 obj/drivers/base/src/reset.o acf011c37d5b20b9 +15954 19232 7525604732452896 obj/drivers/pga/src/pga.o 1511141b2a111126 +11855 15270 7525604691464590 obj/drivers/debug/src/debug.o 30e76cddba032d8 +7538 10850 7525604648296578 obj/drivers/crc/src/crc.o 763337e65e16a37c +18233 21483 7525604755240215 obj/drivers/tsensor/src/tsensor.o f5778ae3d790da27 +7230 10512 7525604645208724 obj/drivers/cmm/src/cmm.o c036661957e1954e +8207 11482 7525604654984256 obj/drivers/dac/src/dac.o d1905b2404d42def +6594 9873 7525604638850890 obj/drivers/capm/src/capm.o 7c4e7f80e4aa1fa4 +15592 18897 7525604728832566 obj/drivers/iwdg/src/iwdg_ex.o 5f46e141ad28d561 +7868 11167 7525604651604206 obj/drivers/crg/src/crg.o 15652deee26e03c9 +37056 40257 7525604943477931 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o a8772155dbd2357a +8504 11854 7525604657962838 obj/drivers/debug/log/src/app_command.o 69e8ca71a73a1e80 +9142 12536 7525604664338082 obj/drivers/debug/log/src/cmd_common.o d8fae7fdafde7d79 +11171 14601 7525604684629714 obj/drivers/debug/log/src/event.o 2724dc1d030e739f +9873 13255 7525604671651620 obj/drivers/debug/log/src/console.o 9e762fd0888b30c +18897 22142 7525604761884122 obj/drivers/uart/src/uart_ex.o e52a0ac8cce12949 +19546 22754 7525604768372945 obj/drivers/wwdg/src/wwdg_ex.o 15f23e54f99b837d +9497 12872 7525604667882030 obj/drivers/debug/log/src/config.o 4641e66b6c64e6cf +10512 13905 7525604678035398 obj/drivers/debug/log/src/dfx_log.o 716c8325293778e3 +12536 15954 7525604698279493 obj/drivers/dma/src/dma_ex.o 3ee23d706658200b +13905 17261 7525604711971287 obj/drivers/gpt/src/gpt_ex.o 455a5c6784f87b8 +13556 16956 7525604708477907 obj/drivers/gpt/src/gpt.o d9ef8cd4c8ffd72b +12203 15592 7525604694948418 obj/drivers/dma/src/dma.o ed036230d560ffd8 +14601 17907 7525604718925077 obj/drivers/i2c/src/i2c_ex.o 20184029ca289cbc +13255 16608 7525604705466692 obj/drivers/gpio/src/gpio.o de0554da3b2a21d9 +17581 20893 7525604748720904 obj/drivers/timer/src/timer.o 10287ba5a47d82fc +12872 16292 7525604701636897 obj/drivers/flash/src/flash.o 7534ca6e7d15d3a0 +14225 17580 7525604715162746 obj/drivers/i2c/src/i2c.o 887007d7461a3ccf +16293 19546 7525604735843823 obj/drivers/pmc/src/pmc.o 9b5e3364d508f5fd +16956 20243 7525604742476748 obj/drivers/spi/src/spi.o ac428b9ed8bba929 +19232 22428 7525604765235175 obj/drivers/wwdg/src/wwdg.o c422f402c24ae3c7 +20244 23357 7525604775349025 obj/middleware/control_library/brake/mcs_brake.o f08a8acc22d48703 +18541 21817 7525604758333617 obj/drivers/uart/src/uart.o 65a39f2567b402bf +20545 23667 7525604778369513 obj/middleware/control_library/filter/mcs_filter.o 367a514e934072c8 +22142 25260 7525604794334924 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o 797de26f8b7b4a3a +21483 24622 7525604787747584 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o ba36711981099813 +21208 24319 7525604784998792 obj/middleware/control_library/filter/mcs_pll.o 4e3f1677f19372d6 +23357 26513 7525604806483848 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o 1e6a7977ef1e5280 +22428 25564 7525604797197330 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o dade8cc2a4dec878 +23075 26219 7525604803667797 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o ac8792057b66ca6c +24016 27177 7525604813085548 obj/middleware/control_library/modulation/mcs_r1_svpwm.o f0889705a90e4d44 +23667 26847 7525604809584792 obj/middleware/control_library/math/mcs_math.o b1165f3311952bd4 +22755 25911 7525604800466228 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o 3cf24db7b289abd4 +24319 27451 7525604816107467 obj/middleware/control_library/modulation/mcs_svpwm.o f5bafbae4f1662f4 +25260 28387 7525604825521077 obj/middleware/control_library/pfc/pfc_volt_ctrl.o 8bc03f62bcbbdf46 +24948 28102 7525604822399426 obj/middleware/control_library/pfc/pfc_curr_ctrl.o 2d3d3527e04c340a +24622 27781 7525604819135596 obj/middleware/control_library/observer/mcs_fosmo.o fa3936c75f736a33 +25911 29029 7525604832023364 obj/middleware/control_library/power/mcs_power_mgmt.o 30e5df34509d0cda +25565 28670 7525604828563681 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o 7c24133e42e574c3 +26219 29341 7525604835105133 obj/middleware/control_library/protection/mcs_openphs_det.o 64d07cd1e5cb31c +26513 29619 7525604838043738 obj/middleware/control_library/protection/mcs_stall_det.o 2428643f14bc8ac1 +27177 30298 7525604844678859 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o 4be49e3686b130c8 +26847 29974 7525604841384811 obj/middleware/control_library/protection/mcs_unbalance_det.o df0519adaa8b05d8 +27451 30621 7525604847431499 obj/middleware/control_library/utilities/mcs_mtr_param.o 14ee83963ea9dfd5 +28387 31624 7525604856786683 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o 2c193cbef6bc492 +28102 31327 7525604853942134 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o 41f5a9fbc7651442 +27781 31012 7525604850720659 obj/middleware/control_library/vf/mcs_vf_ctrl.o cc095a85bbcebb96 +28670 31984 7525604859615390 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o bfd044b9da16719c +29030 32334 7525604863211475 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o 254c06c5cd68a20b +43937 46040 7525605012283037 obj/user/vl53l0x/mine/src/vl53l0x_iic.o ad58d7aa9b92379c +30298 33770 7525604875893226 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o d79fe4b8cfac8b9c +29619 33105 7525604869104000 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o 187c0176e51e9333 +39919 43239 7525604972114293 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o 305b59817ba1bb49 +30621 34129 7525604879134083 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o d3e4bc5d1cef17c +32335 35684 7525604896266176 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o f0ab6aef0d09cb37 +31012 34423 7525604883034094 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o 12c84518c47d1e6d +31984 35380 7525604892755564 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o cc18b315a21d7619 +31327 34721 7525604886185666 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o cf0c44b2c368a430 +33770 37056 7525604910621551 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o 78c44ca8e7b46755 +36406 39573 7525604936978438 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o d291f36bd36a449d +32689 36025 7525604899812995 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o 840804de2320c2a7 +31624 35078 7525604889156331 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o 73df4c2ad114758b +33107 36406 7525604903985397 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o 49a69b06efedb09b +34129 37340 7525604914208709 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o 1bd0e2586777e804 +34721 37975 7525604920122364 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o 71b01ede2587790d +39574 42879 7525604968654336 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o 55414951bb07a2d0 +35078 38284 7525604923703491 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o 11c08bc38e9d45c0 +34424 37626 7525604917150845 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o bedf16793262db07 +35380 38609 7525604926725410 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o 9cfde848bfd0f66f +36025 39270 7525604933158643 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o dd0add4bc5fc7929 +35684 38965 7525604929753943 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o aef5da3b1caefc6b +36700 39919 7525604939917667 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o c5b7aa1c95ce0f12 +37340 40582 7525604946320328 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o 61ad29f95d8395a5 +37626 40914 7525604949178750 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o 86bf19c4336e6bbf +37975 41236 7525604952666371 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o 77ac5026bfb1214c +38284 41528 7525604955758109 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o acee05fc440d243f +38610 41834 7525604959015415 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o 521ab1702cada774 +40257 43566 7525604975495245 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o 4fb044601e5493b8 +39270 42520 7525604965624216 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o 8bfefafa916aa7e7 +38966 42204 7525604962572366 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o e9d42acf207fff9a +40582 43937 7525604978735207 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o e085959a4f0a50ce +41236 44298 7525604985274721 obj/user/generatecode/system_init.o 53177d9aac8bd860 +46576 47389 7525605038673059 bin/target.elf dd36636a45503209 +42879 44624 7525605001702712 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o af9a6b6dd379a6b4 +43566 45754 7525605008582378 obj/user/vl53l0x/mine/src/vl53l0x.o 5d7f605192586c34 +42204 45536 7525604994958196 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o 7b409e2f05d541e7 +43239 45295 7525605005313060 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o 45fc8147a7dd2c3a +42520 45821 7525604998116761 obj/user/vl53l0x/core/src/vl53l0x_api_core.o 911c74de2c89cdd8 +41528 45376 7525604988196910 obj/user/mycar/src/mycar_control.o 1cfd8d89cf20be8e +41834 46090 7525604991258714 obj/user/vl53l0x/core/src/vl53l0x_api.o c9a378c72e5ffbc2 +44298 46232 7525605015893387 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o 8bd9dc01afcd297a +44625 46576 7525605019161968 obj/user/vl53l0x/platform/src/vl53l0x_platform.o 28a97eccc5c0f7c0 +46 3723 7526043216823723 obj/chip/3061m/startup.o f5b008968cd23111 +230 4063 7526043218674733 obj/chip/3061m/chipinit/chipinit.o f6c2d7f4d23d5669 +509 4458 7526043221453244 obj/chip/3061m/chipinit/anatrim/anatrim.o 2ecae0513fb5597e +807 4856 7526043224440108 obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o db0f74188169141d +1083 5219 7526043227196023 obj/chip/3061m/chipinit/crginit/crginit.o e1eb6b9cfecfa9ae +1604 5663 7526043232407862 obj/chip/3061m/chipinit/flashinit/flashinit.o 1131601ccbd75600 +2041 6107 7526043236776180 obj/chip/3061m/chipinit/systickinit/systickinit.o 28317a73b2ecad06 +2460 6546 7526043240964981 obj/chip/3061m/fotp/fotp_info_read.o 610a23641277aade +2854 6858 7526043244904448 obj/chip/3061m/ip_crg/ip_crg_common.o 34501e9f90eea0b1 +3298 7513 7526043249344177 obj/drivers/acmp/src/acmp.o 926a58cef9d3127 +3724 8080 7526043253600923 obj/drivers/acmp/src/acmp_ex.o 7865e95fb963e513 +4064 8522 7526043257002066 obj/drivers/adc/src/adc.o 2fe041705a3c7b9b +4458 8929 7526043260947654 obj/drivers/adc/src/adc_ex.o e0150b11c7fb40e7 +4856 9333 7526043264921252 obj/drivers/apt/src/apt.o c1a81efb35a30c8c +5219 9782 7526043268554628 obj/drivers/base/src/assert.o d1c9cc0705a0ba3d +5663 10210 7526043272992745 obj/drivers/base/src/base_math.o 6476a35a76f7bfac +6107 10703 7526043277437462 obj/drivers/base/src/clock.o bed8b72e3e015587 +6546 11201 7526043281830667 obj/drivers/base/src/generalfunc.o 6532c3a2b57d6f4a +6858 11791 7526043284950764 obj/drivers/base/src/interrupt.o 48cc5645f224bde5 +7514 12222 7526043291497785 obj/drivers/base/src/lock.o c64fd2f8f90106da +8080 12649 7526043297163363 obj/drivers/base/src/reset.o acf011c37d5b20b9 +8522 13096 7526043301583225 obj/drivers/can/src/can.o 1e36f79221ed3490 +8929 13592 7526043305654905 obj/drivers/capm/src/capm.o 7c4e7f80e4aa1fa4 +9333 14014 7526043309700653 obj/drivers/cfd/src/cfd.o 1d5abec459f15641 +9782 14434 7526043314183333 obj/drivers/cmm/src/cmm.o c036661957e1954e +10210 14850 7526043318470887 obj/drivers/crc/src/crc.o 763337e65e16a37c +10703 15204 7526043323403192 obj/drivers/crg/src/crg.o 15652deee26e03c9 +11201 15607 7526043328374691 obj/drivers/dac/src/dac.o d1905b2404d42def +11791 15998 7526043334275643 obj/drivers/debug/log/src/app_command.o 69e8ca71a73a1e80 +12222 16431 7526043338591396 obj/drivers/debug/log/src/cmd.o fbfa74c6511c4468 +12649 16862 7526043342854008 obj/drivers/debug/log/src/cmd_common.o d8fae7fdafde7d79 +13096 17279 7526043347328231 obj/drivers/debug/log/src/config.o 4641e66b6c64e6cf +13592 17894 7526043352287702 obj/drivers/debug/log/src/console.o 9e762fd0888b30c +14014 18301 7526043356506887 obj/drivers/debug/log/src/dfx_debug.o bfe884249801089 +14434 18713 7526043360708004 obj/drivers/debug/log/src/dfx_log.o 716c8325293778e3 +14851 19095 7526043364875696 obj/drivers/debug/log/src/dfx_log_proc.o 6203f1d8c791638c +15204 19495 7526043368407776 obj/drivers/debug/log/src/event.o 2724dc1d030e739f +15608 19958 7526043372458358 obj/drivers/debug/log/src/ext_command.o 45a58062b66df899 +15998 20332 7526043376347958 obj/drivers/debug/src/debug.o 30e76cddba032d8 +16431 20710 7526043380678817 obj/drivers/dma/src/dma.o ed036230d560ffd8 +16862 21143 7526043384989789 obj/drivers/dma/src/dma_ex.o 3ee23d706658200b +17279 21539 7526043389165407 obj/drivers/flash/src/flash.o 7534ca6e7d15d3a0 +17894 21938 7526043395303199 obj/drivers/gpio/src/gpio.o de0554da3b2a21d9 +18302 22337 7526043399379305 obj/drivers/gpt/src/gpt.o d9ef8cd4c8ffd72b +18714 22718 7526043403504348 obj/drivers/gpt/src/gpt_ex.o 455a5c6784f87b8 +19095 23091 7526043407320217 obj/drivers/i2c/src/i2c.o 887007d7461a3ccf +19495 23469 7526043411323159 obj/drivers/i2c/src/i2c_ex.o 20184029ca289cbc +19959 23903 7526043415958725 obj/drivers/iocmg/src/iocmg.o 933c26a46f9e11ad +20332 24286 7526043419691427 obj/drivers/iwdg/src/iwdg.o 544455bb05cdaf94 +20710 24694 7526043423461359 obj/drivers/iwdg/src/iwdg_ex.o 5f46e141ad28d561 +21143 25100 7526043427795762 obj/drivers/pga/src/pga.o 1511141b2a111126 +21539 25508 7526043431762958 obj/drivers/pmc/src/pmc.o 9b5e3364d508f5fd +21938 25886 7526043435754973 obj/drivers/qdm/src/qdm.o 5004c7c405376fcb +22337 26279 7526043439738376 obj/drivers/spi/src/spi.o ac428b9ed8bba929 +22718 26710 7526043443550314 obj/drivers/spi/src/spi_ex.o e890a9a33c5c694b +23092 27174 7526043447290081 obj/drivers/timer/src/timer.o 10287ba5a47d82fc +23469 27579 7526043451060087 obj/drivers/timer/src/timer_ex.o 914fcc552a63085 +23903 27957 7526043455398488 obj/drivers/tsensor/src/tsensor.o f5778ae3d790da27 +24286 28328 7526043459228239 obj/drivers/uart/src/uart.o 65a39f2567b402bf +24695 28705 7526043463308200 obj/drivers/uart/src/uart_ex.o e52a0ac8cce12949 +25100 29104 7526043467367347 obj/drivers/wwdg/src/wwdg.o c422f402c24ae3c7 +25508 29514 7526043471451765 obj/drivers/wwdg/src/wwdg_ex.o 15f23e54f99b837d +25886 29884 7526043475224408 obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o e3ea4366cf38bb7f +26279 30254 7526043479155368 obj/middleware/control_library/brake/mcs_brake.o f08a8acc22d48703 +26710 30618 7526043483462631 obj/middleware/control_library/filter/mcs_filter.o 367a514e934072c8 +27174 30986 7526043488107349 obj/middleware/control_library/filter/mcs_lpfRk4.o 8c523b08b18129ff +27579 31355 7526043492156519 obj/middleware/control_library/filter/mcs_pll.o 4e3f1677f19372d6 +27957 31737 7526043495940249 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o ba36711981099813 +28328 32083 7526043499643419 obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o 30c1e63e48cb0466 +28705 32517 7526043503412944 obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o 797de26f8b7b4a3a +29104 32924 7526043507412250 obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o dade8cc2a4dec878 +29514 33316 7526043511505808 obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o 3cf24db7b289abd4 +29884 33703 7526043515203402 obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o ac8792057b66ca6c +30254 34050 7526043518901965 obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o 1e6a7977ef1e5280 +30618 34430 7526043522542224 obj/middleware/control_library/math/mcs_math.o b1165f3311952bd4 +30986 34800 7526043526228311 obj/middleware/control_library/modulation/mcs_r1_svpwm.o f0889705a90e4d44 +31355 35164 7526043529923689 obj/middleware/control_library/modulation/mcs_svpwm.o f5bafbae4f1662f4 +31737 35589 7526043533741532 obj/middleware/control_library/observer/mcs_fosmo.o fa3936c75f736a33 +32083 36036 7526043537201829 obj/middleware/control_library/pfc/pfc_curr_ctrl.o 2d3d3527e04c340a +32518 36420 7526043541538920 obj/middleware/control_library/pfc/pfc_volt_ctrl.o 8bc03f62bcbbdf46 +32925 36822 7526043545614592 obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o 7c24133e42e574c3 +33317 37235 7526043549535823 obj/middleware/control_library/power/mcs_power_mgmt.o 30e5df34509d0cda +33704 37662 7526043553405484 obj/middleware/control_library/protection/mcs_openphs_det.o 64d07cd1e5cb31c +34050 38098 7526043556871671 obj/middleware/control_library/protection/mcs_stall_det.o 2428643f14bc8ac1 +34430 38526 7526043560664570 obj/middleware/control_library/protection/mcs_unbalance_det.o df0519adaa8b05d8 +34800 38938 7526043564364672 obj/middleware/control_library/ramp/mcs_ramp_mgmt.o 4be49e3686b130c8 +35164 39356 7526043568005005 obj/middleware/control_library/utilities/mcs_mtr_param.o 14ee83963ea9dfd5 +35589 39775 7526043572253258 obj/middleware/control_library/vf/mcs_vf_ctrl.o cc095a85bbcebb96 +36036 40148 7526043576720586 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o 41f5a9fbc7651442 +36420 40571 7526043580565825 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o 2c193cbef6bc492 +36822 41011 7526043584583848 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o bfd044b9da16719c +37235 41473 7526043588713074 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o 254c06c5cd68a20b +37662 42156 7526043592991627 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o 50732f4645a5fa1f +38099 42637 7526043597349974 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o 187c0176e51e9333 +38526 43125 7526043601625666 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o 4994e3c63259b839 +38938 43552 7526043605744194 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o d79fe4b8cfac8b9c +39356 43933 7526043609921253 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o d3e4bc5d1cef17c +39775 44326 7526043614121957 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o 12c84518c47d1e6d +40149 44738 7526043617850216 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o cf0c44b2c368a430 +40571 45127 7526043622078073 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o 73df4c2ad114758b +41011 45592 7526043626477044 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o cc18b315a21d7619 +41473 45957 7526043631094054 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o f0ab6aef0d09cb37 +42156 46330 7526043637934224 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o 840804de2320c2a7 +42637 46702 7526043642738732 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o 49a69b06efedb09b +43125 47047 7526043647624073 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o c2c16dde9d3cebb3 +43552 47503 7526043651889180 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o 78c44ca8e7b46755 +43933 47873 7526043655695364 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o 1bd0e2586777e804 +44326 48276 7526043659626097 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o bedf16793262db07 +44738 48705 7526043663740535 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o 71b01ede2587790d +45127 49083 7526043667638481 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o 11c08bc38e9d45c0 +45593 49485 7526043672295126 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o 9cfde848bfd0f66f +45957 49905 7526043675937239 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o aef5da3b1caefc6b +46330 50462 7526043679668567 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o dd0add4bc5fc7929 +46702 50939 7526043683389317 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o d291f36bd36a449d +47047 51506 7526043686840565 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o c5b7aa1c95ce0f12 +47503 52035 7526043691399699 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o a8772155dbd2357a +47873 52487 7526043695097208 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o 61ad29f95d8395a5 +48277 52844 7526043699136411 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o 86bf19c4336e6bbf +48705 53311 7526043703425054 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o 77ac5026bfb1214c +49083 54076 7526043707195592 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o acee05fc440d243f +49485 54806 7526043711218451 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o 521ab1702cada774 +49905 55349 7526043715417256 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o e9d42acf207fff9a +50462 55846 7526043720992365 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o 8bfefafa916aa7e7 +50939 56547 7526043725756406 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o 55414951bb07a2d0 +51506 57415 7526043731429146 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o 305b59817ba1bb49 +52035 58061 7526043736715499 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o 4fb044601e5493b8 +52487 58677 7526043741239043 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o e085959a4f0a50ce +53311 59143 7526043749479917 obj/user/generatecode/system_init.o 53177d9aac8bd860 +54077 60225 7526043757131217 obj/user/mycar/src/mycar_control.o 1cfd8d89cf20be8e +52846 60865 7526043744829178 obj/user/main.o 991f27384dccc7f0 +55349 60868 7526043769858320 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o 7b409e2f05d541e7 +56548 60870 7526043781847439 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o af9a6b6dd379a6b4 +55847 60878 7526043774832014 obj/user/vl53l0x/core/src/vl53l0x_api_core.o 911c74de2c89cdd8 +54806 61022 7526043764428690 obj/user/vl53l0x/core/src/vl53l0x_api.o c9a378c72e5ffbc2 +58061 61051 7526043796977773 obj/user/vl53l0x/mine/src/vl53l0x.o 5d7f605192586c34 +57415 61121 7526043790527123 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o 45fc8147a7dd2c3a +58677 61645 7526043803136209 obj/user/vl53l0x/mine/src/vl53l0x_iic.o ad58d7aa9b92379c +59143 62335 7526043807800244 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o 8bd9dc01afcd297a +60225 62419 7526043818617136 obj/user/vl53l0x/platform/src/vl53l0x_platform.o 28a97eccc5c0f7c0 +62419 64509 7526043840552338 bin/target.elf dd36636a45503209 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/args.gn" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/args.gn" new file mode 100644 index 00000000..9fe8d9de --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/args.gn" @@ -0,0 +1,2 @@ +build_type = "debug" +build_compiler_specified = "hcc_fpu" diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.bin" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.bin" new file mode 100644 index 0000000000000000000000000000000000000000..acb69c144c9f1e8c38fe9e39e020cb155dc7e250 GIT binary patch literal 64164 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%0DS>n+VA=WVjuRDqR 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≷1zHW;(DoP$mU1Gf3QWD~e@?HQ*bgw4 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 jejfkz9W{Q*l: + + .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: 378010ef jal ra,30015d0 + +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: 2e4010ef jal ra,30015b2 + +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: 7ab000ef jal ra,3001356 + + 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: 01000197 auipc gp,0x1000 + 3000554: 0e418193 addi gp,gp,228 # 4000634 <__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: 9cc18293 addi t0,gp,-1588 # 4000000 + la t1, SRAM_END + 30005a8: 01008317 auipc t1,0x1008 + 30005ac: a5830313 addi t1,t1,-1448 # 4008000 + li t2, 0 + 30005b0: 00000393 li t2,0 + +030005b4 : + +clear_sram_loop: + sw t2, (t0) /* clear all sram */ + 30005b4: 0072a023 sw t2,0(t0) + addi t0, t0, 4 /* increment clear index pointer */ + 30005b8: 00428293 addi t0,t0,4 + blt t0, t1, clear_sram_loop /* are we at the end yet, if not , contiue till the end */ + 30005bc: fe62cce3 blt t0,t1,30005b4 + +030005c0 : + +start_coderom_code_copy: + la t0, __sram_code_start_addr /* SRAM addr */ + 30005c0: ff000297 auipc t0,0xff000 + 30005c4: a4028293 addi t0,t0,-1472 # 2000000 + la t1, __sram_code_load_addr /* ROM addr */ + 30005c8: 00000317 auipc t1,0x0 + 30005cc: 12830313 addi t1,t1,296 # 30006f0 + la t2, __sram_code_end_addr + 30005d0: ff000397 auipc t2,0xff000 + 30005d4: a3038393 addi t2,t2,-1488 # 2000000 + jal mem_cpy + 30005d8: f0dff0ef jal ra,30004e4 + +030005dc : + +start_reserved_data_copy: + la t0, __reserved_code_start_addr /* SRAM addr */ + 30005dc: 9cc18293 addi t0,gp,-1588 # 4000000 + la t1, __reserved_code_load_addr /* ROM addr */ + 30005e0: 00000317 auipc t1,0x0 + 30005e4: 11030313 addi t1,t1,272 # 30006f0 + la t2, __reserved_code_end_addr + 30005e8: 9cc18393 addi t2,gp,-1588 # 4000000 + jal mem_cpy + 30005ec: ef9ff0ef jal ra,30004e4 + +030005f0 : + +start_coderom_data_copy: + la t0, __data_start /* SRAM addr */ + 30005f0: 9ec18293 addi t0,gp,-1556 # 4000020 + la t1, __data_load /* ROM addr */ + 30005f4: 0000f317 auipc t1,0xf + 30005f8: f8430313 addi t1,t1,-124 # 300f578 <__data_load> + la t2, __data_end + 30005fc: f1818393 addi t2,gp,-232 # 400054c + jal mem_cpy + 3000600: ee5ff0ef jal ra,30004e4 + +03000604 : + +pmp_init: + li t0, 0xB00 + 3000604: 000012b7 lui t0,0x1 + 3000608: b0028293 addi t0,t0,-1280 # b00 + csrw pmpaddr0, t0 + 300060c: 3b029073 csrw pmpaddr0,t0 + li t0, 0x400400 /* 0x2C00~0x1000FFF, BOOTROM, enable R+X */ + 3000610: 004002b7 lui t0,0x400 + 3000614: 40028293 addi t0,t0,1024 # 400400 + csrw pmpaddr1, t0 + 3000618: 3b129073 csrw pmpaddr1,t0 + li t0, 0x800000 /* 0x1001000~0x1FFFFFF, Reserved: diable R+X+W */ + 300061c: 008002b7 lui t0,0x800 + csrw pmpaddr2, t0 + 3000620: 3b229073 csrw pmpaddr2,t0 + li t0, 0x802000 /* 0x2000000~0x2007FFF, SYSRAM_ITCM */ + 3000624: 008022b7 lui t0,0x802 + csrw pmpaddr3, t0 + 3000628: 3b329073 csrw pmpaddr3,t0 + li t0, 0xC00000 /* 0x2008000 ~ 0x2FFFFFF, Reserved: disable R+X+W */ + 300062c: 00c002b7 lui t0,0xc00 + csrw pmpaddr4, t0 + 3000630: 3b429073 csrw pmpaddr4,t0 + li t0, 0x1000000 /* 0x3000000 ~ 0x03FFFFFF: EFLASH: enable R+X */ + 3000634: 010002b7 lui t0,0x1000 + csrw pmpaddr5, t0 + 3000638: 3b529073 csrw pmpaddr5,t0 + li t0, 0x1002000 /* 0x4000000 ~ 0x04007FFF: SYSTEM_DTCM enable R+W */ + 300063c: 010022b7 lui t0,0x1002 + csrw pmpaddr6, t0 + 3000640: 3b629073 csrw pmpaddr6,t0 + li t0,0x7000400 /* 0x4008000 ~ 0x01C000FFF: REGISTER R+W */ + 3000644: 070002b7 lui t0,0x7000 + 3000648: 40028293 addi t0,t0,1024 # 7000400 + csrw pmpaddr7, t0 + 300064c: 3b729073 csrw pmpaddr7,t0 + + li t0,0xf3333333 /* register TOR-R-W */ + 3000650: f33332b7 lui t0,0xf3333 + 3000654: 33328293 addi t0,t0,819 # f3333333 + csrw 0x7d8,t0 + 3000658: 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 */ + 300065c: 8d8892b7 lui t0,0x8d889 + 3000660: d8b28293 addi t0,t0,-629 # 8d888d8b + csrw pmpcfg0,t0 + 3000664: 3a029073 csrw pmpcfg0,t0 + li t0,0x8b8b8d88 + 3000668: 8b8b92b7 lui t0,0x8b8b9 + 300066c: d8828293 addi t0,t0,-632 # 8b8b8d88 + csrw pmpcfg1,t0 + 3000670: 3a129073 csrw pmpcfg1,t0 +#endif + +/* disable Icache */ + csrwi 0x7C0, 0x0 /* disable ICACHE */ + 3000674: 7c005073 csrwi 0x7c0,0 + fence + 3000678: 0ff0000f fence + +/* disable Dcache */ + csrwi 0x7C1, 0x0 /* disable DCACHE */ + 300067c: 7c105073 csrwi 0x7c1,0 + fence + 3000680: 0ff0000f fence + +/* support float and mie */ + li t0,0x2008 + 3000684: 000022b7 lui t0,0x2 + 3000688: 00828293 addi t0,t0,8 # 2008 + csrs mstatus,t0 + 300068c: 3002a073 csrs mstatus,t0 + li t0,0x20 + 3000690: 02000293 li t0,32 + csrs misa,t0 + 3000694: 3012a073 csrs misa,t0 + +/* Interrupt set default priority = 1*/ + li t0, 0x11111111 + 3000698: 111112b7 lui t0,0x11111 + 300069c: 11128293 addi t0,t0,273 # 11111111 + csrw locipri0, t0 + 30006a0: bc029073 csrw 0xbc0,t0 + csrw locipri1, t0 + 30006a4: bc129073 csrw 0xbc1,t0 + csrw locipri2, t0 + 30006a8: bc229073 csrw 0xbc2,t0 + csrw locipri3, t0 + 30006ac: bc329073 csrw 0xbc3,t0 + csrw locipri4, t0 + 30006b0: bc429073 csrw 0xbc4,t0 + csrw locipri5, t0 + 30006b4: bc529073 csrw 0xbc5,t0 + csrw locipri6, t0 + 30006b8: bc629073 csrw 0xbc6,t0 + csrw locipri7, t0 + 30006bc: bc729073 csrw 0xbc7,t0 + csrw locipri8, t0 + 30006c0: bc829073 csrw 0xbc8,t0 + csrw locipri9, t0 + 30006c4: bc929073 csrw 0xbc9,t0 + csrw locipri10, t0 + 30006c8: bca29073 csrw 0xbca,t0 + csrw locipri11, t0 + 30006cc: bcb29073 csrw 0xbcb,t0 + csrw locipri12, t0 + 30006d0: bcc29073 csrw 0xbcc,t0 + csrw locipri13, t0 + 30006d4: bcd29073 csrw 0xbcd,t0 + csrw locipri14, t0 + 30006d8: bce29073 csrw 0xbce,t0 + csrw locipri15, t0 + 30006dc: bcf29073 csrw 0xbcf,t0 + + ecall + 30006e0: 00000073 ecall + jal Chip_Init + 30006e4: 014000ef jal ra,30006f8 + +/* jump to C func. */ + jal main + 30006e8: 1b3060ef jal ra,300709a
+ +030006ec : + +dead_loop: + j dead_loop + 30006ec: 0000006f j 30006ec + +Disassembly of section .text: + +030006f0 : + * @brief Chip Init Fail Process, deadloop if Chip Init fail + * @param None + * @retval None + */ +static inline void Chip_InitFail(void) +{ + 30006f0: 1141 addi sp,sp,-16 + 30006f2: c622 sw s0,12(sp) + 30006f4: 0800 addi s0,sp,16 + while (1) { + 30006f6: a001 j 30006f6 + +030006f8 : + * @brief Chip Init + * @param None + * @retval None + */ +void Chip_Init(void) +{ + 30006f8: 1101 addi sp,sp,-32 + 30006fa: ce06 sw ra,28(sp) + 30006fc: cc22 sw s0,24(sp) + 30006fe: 1000 addi s0,sp,32 + CRG_CoreClkSelect coreClkSelect; + /* Config CRG */ + if (CRG_Config(&coreClkSelect) != BASE_STATUS_OK) { + 3000700: fec40793 addi a5,s0,-20 + 3000704: 853e mv a0,a5 + 3000706: 4ab060ef jal ra,30073b0 + 300070a: 87aa mv a5,a0 + 300070c: c391 beqz a5,3000710 + Chip_InitFail(); + 300070e: 37cd jal ra,30006f0 + } + + /* Config FLASH Clock */ + FLASH_ClockConfig(coreClkSelect); + 3000710: fec42783 lw a5,-20(s0) + 3000714: 853e mv a0,a5 + 3000716: 78e000ef jal ra,3000ea4 + SYSTICK_Init(); + 300071a: 04f000ef jal ra,3000f68 + /* Set CoreClock Select after FLASH Config Done */ + CRG_SetCoreClockSelect(coreClkSelect); + 300071e: fec42783 lw a5,-20(s0) + 3000722: 853e mv a0,a5 + 3000724: 25a1 jal ra,3000d6c + + IRQ_Init(); + 3000726: 46d000ef jal ra,3001392 + ANAVREF_Init(); + 300072a: 23d5 jal ra,3000d0e + ANATRIM_Entry(); + 300072c: 2b41 jal ra,3000cbc + /* User Add Code Here */ + 300072e: 0001 nop + 3000730: 40f2 lw ra,28(sp) + 3000732: 4462 lw s0,24(sp) + 3000734: 6105 addi sp,sp,32 + 3000736: 8082 ret + +03000738 : + * @brief Calculate the conversion gain of the tsensor. + * @param data, original data. + * @retval None + */ +static void CalculateGain(unsigned int data) +{ + 3000738: 1101 addi sp,sp,-32 + 300073a: ce22 sw s0,28(sp) + 300073c: 1000 addi s0,sp,32 + 300073e: fea42623 sw a0,-20(s0) + g_tsensorGain = ((float)(data) / 10000000.0f); + 3000742: fec42783 lw a5,-20(s0) + 3000746: d017f753 fcvt.s.wu fa4,a5 + 300074a: 0300f7b7 lui a5,0x300f + 300074e: de47a787 flw fa5,-540(a5) # 300ede4 <__rodata_start> + 3000752: 18f777d3 fdiv.s fa5,fa4,fa5 + 3000756: 9ef1a627 fsw fa5,-1556(gp) # 4000020 +} + 300075a: 0001 nop + 300075c: 4472 lw s0,28(sp) + 300075e: 6105 addi sp,sp,32 + 3000760: 8082 ret + +03000762 : + * @brief Obtains the chip ID. + * @param None + * @retval None + */ +static bool CHIP_GetInfo(void) +{ + 3000762: 7179 addi sp,sp,-48 + 3000764: d606 sw ra,44(sp) + 3000766: d422 sw s0,40(sp) + 3000768: 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 */ + 300076a: fe040793 addi a5,s0,-32 + 300076e: 863e mv a2,a5 + 3000770: 4591 li a1,4 + 3000772: 4501 li a0,0 + 3000774: 2391 jal ra,3000cb8 + FOTP_InfoGet(FOTP_INFO_RNG0, 2U, (void *)&idData.comData); /* 2 is the number of idData in otp */ + 3000776: fd040793 addi a5,s0,-48 + 300077a: 863e mv a2,a5 + 300077c: 4589 li a1,2 + 300077e: 4501 li a0,0 + 3000780: 2b25 jal ra,3000cb8 + if (emptyData.REG.fotp_empty_flag != 0x5AA59669 || idData.REG.chip_id == 0xFFFFFFFF) { + 3000782: fe042703 lw a4,-32(s0) + 3000786: 5aa597b7 lui a5,0x5aa59 + 300078a: 66978793 addi a5,a5,1641 # 5aa59669 + 300078e: 00f71763 bne a4,a5,300079c + 3000792: fd042703 lw a4,-48(s0) + 3000796: 57fd li a5,-1 + 3000798: 00f71463 bne a4,a5,30007a0 + return false; + 300079c: 4781 li a5,0 + 300079e: a011 j 30007a2 + } + return true; + 30007a0: 4785 li a5,1 +} + 30007a2: 853e mv a0,a5 + 30007a4: 50b2 lw ra,44(sp) + 30007a6: 5422 lw s0,40(sp) + 30007a8: 6145 addi sp,sp,48 + 30007aa: 8082 ret + +030007ac : + * @brief Analog module trim. + * @param None + * @retval None + */ +static void CHIP_AnalogTrim(void) +{ + 30007ac: 711d addi sp,sp,-96 + 30007ae: ce86 sw ra,92(sp) + 30007b0: cca2 sw s0,88(sp) + 30007b2: 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 */ + 30007b4: fdc40793 addi a5,s0,-36 + 30007b8: 863e mv a2,a5 + 30007ba: 45d1 li a1,20 + 30007bc: 4501 li a0,0 + 30007be: 29ed jal ra,3000cb8 + /* VREF */ + VREF->VREF_TRIM0.BIT.da_iref_trim = trimData20.REG.data0.da_iref_trim; + 30007c0: 18100737 lui a4,0x18100 + 30007c4: fdc42783 lw a5,-36(s0) + 30007c8: 83c1 srli a5,a5,0x10 + 30007ca: 9bfd andi a5,a5,-1 + 30007cc: 0ff7f693 andi a3,a5,255 + 30007d0: 433c lw a5,64(a4) + 30007d2: 0ff6f693 andi a3,a3,255 + 30007d6: f007f793 andi a5,a5,-256 + 30007da: 8fd5 or a5,a5,a3 + 30007dc: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vref_trim = trimData20.REG.data0.da_ref_vref_trim; + 30007de: 18100737 lui a4,0x18100 + 30007e2: fdc42783 lw a5,-36(s0) + 30007e6: 83a1 srli a5,a5,0x8 + 30007e8: 9bfd andi a5,a5,-1 + 30007ea: 0ff7f693 andi a3,a5,255 + 30007ee: 433c lw a5,64(a4) + 30007f0: 0ff6f693 andi a3,a3,255 + 30007f4: 06a2 slli a3,a3,0x8 + 30007f6: 7641 lui a2,0xffff0 + 30007f8: 0ff60613 addi a2,a2,255 # ffff00ff + 30007fc: 8ff1 and a5,a5,a2 + 30007fe: 8fd5 or a5,a5,a3 + 3000800: c33c sw a5,64(a4) + VREF->VREF_TRIM0.BIT.da_ref_vbg_trim = trimData20.REG.data0.da_ref_vbg_trim; + 3000802: 18100737 lui a4,0x18100 + 3000806: fdc42783 lw a5,-36(s0) + 300080a: 0ff7f693 andi a3,a5,255 + 300080e: 433c lw a5,64(a4) + 3000810: 0ff6f693 andi a3,a3,255 + 3000814: 06c2 slli a3,a3,0x10 + 3000816: ff010637 lui a2,0xff010 + 300081a: 167d addi a2,a2,-1 # ff00ffff + 300081c: 8ff1 and a5,a5,a2 + 300081e: 8fd5 or a5,a5,a3 + 3000820: c33c sw a5,64(a4) + unsigned int value = trimData20.REG.data1.da_ref_temp_trim3; + 3000822: fe042783 lw a5,-32(s0) + 3000826: 83c1 srli a5,a5,0x10 + 3000828: 9bfd andi a5,a5,-1 + 300082a: 9f81 uxtb a5 + 300082c: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim2 << 8U); /* Shift left by 8 bits */ + 3000830: fe042783 lw a5,-32(s0) + 3000834: 83a1 srli a5,a5,0x8 + 3000836: 9bfd andi a5,a5,-1 + 3000838: 9f81 uxtb a5 + 300083a: 07a2 slli a5,a5,0x8 + 300083c: 873e mv a4,a5 + 300083e: fec42783 lw a5,-20(s0) + 3000842: 8fd9 or a5,a5,a4 + 3000844: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data1.da_ref_temp_trim1 << 16U); /* Shift left by 16 bits */ + 3000848: fe042783 lw a5,-32(s0) + 300084c: 9f81 uxtb a5 + 300084e: 07c2 slli a5,a5,0x10 + 3000850: 873e mv a4,a5 + 3000852: fec42783 lw a5,-20(s0) + 3000856: 8fd9 or a5,a5,a4 + 3000858: fef42623 sw a5,-20(s0) + value |= (trimData20.REG.data0.da_ref_temp_trim0 << 24U); /* Shift left by 24 bits */ + 300085c: fdc42783 lw a5,-36(s0) + 3000860: 83e1 srli a5,a5,0x18 + 3000862: 9f81 uxtb a5 + 3000864: 07e2 slli a5,a5,0x18 + 3000866: 873e mv a4,a5 + 3000868: fec42783 lw a5,-20(s0) + 300086c: 8fd9 or a5,a5,a4 + 300086e: fef42623 sw a5,-20(s0) + VREF->VREF_TRIM1.reg = value; + 3000872: 181007b7 lui a5,0x18100 + 3000876: fec42703 lw a4,-20(s0) + 300087a: 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 */ + 300087c: fcc40793 addi a5,s0,-52 + 3000880: 863e mv a2,a5 + 3000882: 45d5 li a1,21 + 3000884: 4501 li a0,0 + 3000886: 290d jal ra,3000cb8 + /* ADC */ + ADC0->ADC_OEGE_TRIM.BIT.cfg_gain_cali_trim = trimData21.REG.data1.saradc_gain; + 3000888: 18000737 lui a4,0x18000 + 300088c: fd042783 lw a5,-48(s0) + 3000890: 86be mv a3,a5 + 3000892: 6789 lui a5,0x2 + 3000894: 17fd addi a5,a5,-1 # 1fff + 3000896: 8ff5 and a5,a5,a3 + 3000898: 01079613 slli a2,a5,0x10 + 300089c: 8241 srli a2,a2,0x10 + 300089e: 6785 lui a5,0x1 + 30008a0: 973e add a4,a4,a5 + 30008a2: 80872783 lw a5,-2040(a4) # 17fff808 + 30008a6: 6689 lui a3,0x2 + 30008a8: 16fd addi a3,a3,-1 # 1fff + 30008aa: 8ef1 and a3,a3,a2 + 30008ac: 06c2 slli a3,a3,0x10 + 30008ae: e0010637 lui a2,0xe0010 + 30008b2: 167d addi a2,a2,-1 # e000ffff + 30008b4: 8ff1 and a5,a5,a2 + 30008b6: 8fd5 or a5,a5,a3 + 30008b8: 80f72423 sw a5,-2040(a4) + ADC0->ADC_OEGE_TRIM.BIT.cfg_ofst_cali_trim = trimData21.REG.data1.saradc_offset; + 30008bc: 18000737 lui a4,0x18000 + 30008c0: fd042783 lw a5,-48(s0) + 30008c4: 83c1 srli a5,a5,0x10 + 30008c6: 86be mv a3,a5 + 30008c8: 6785 lui a5,0x1 + 30008ca: 17fd addi a5,a5,-1 # fff + 30008cc: 8ff5 and a5,a5,a3 + 30008ce: 01079613 slli a2,a5,0x10 + 30008d2: 8241 srli a2,a2,0x10 + 30008d4: 6785 lui a5,0x1 + 30008d6: 973e add a4,a4,a5 + 30008d8: 80872783 lw a5,-2040(a4) # 17fff808 + 30008dc: 6685 lui a3,0x1 + 30008de: 16fd addi a3,a3,-1 # fff + 30008e0: 8ef1 and a3,a3,a2 + 30008e2: 767d lui a2,0xfffff + 30008e4: 8ff1 and a5,a5,a2 + 30008e6: 8fd5 or a5,a5,a3 + 30008e8: 80f72423 sw a5,-2040(a4) + + /* TSENSOR */ + TSENSOR->TSENSOR_TRIM.reg = trimData20.REG.data1.da_ref_vptat_trim; + 30008ec: fe042783 lw a5,-32(s0) + 30008f0: 83e1 srli a5,a5,0x18 + 30008f2: 0ff7f713 andi a4,a5,255 + 30008f6: 185007b7 lui a5,0x18500 + 30008fa: cb98 sw a4,16(a5) + ADC0->ADC_TSENSOR_TRIM.BIT.cfg_tsensor_ofst_trim = trimData21.REG.data2.ts_offset; + 30008fc: 18000737 lui a4,0x18000 + 3000900: fd442783 lw a5,-44(s0) + 3000904: 86be mv a3,a5 + 3000906: 6785 lui a5,0x1 + 3000908: 17fd addi a5,a5,-1 # fff + 300090a: 8ff5 and a5,a5,a3 + 300090c: 01079613 slli a2,a5,0x10 + 3000910: 8241 srli a2,a2,0x10 + 3000912: 6785 lui a5,0x1 + 3000914: 973e add a4,a4,a5 + 3000916: 80472783 lw a5,-2044(a4) # 17fff804 + 300091a: 6685 lui a3,0x1 + 300091c: 16fd addi a3,a3,-1 # fff + 300091e: 8ef1 and a3,a3,a2 + 3000920: 767d lui a2,0xfffff + 3000922: 8ff1 and a5,a5,a2 + 3000924: 8fd5 or a5,a5,a3 + 3000926: 80f72223 sw a5,-2044(a4) + CalculateGain(trimData21.REG.data3.ts_gain); + 300092a: fd842783 lw a5,-40(s0) + 300092e: 83a5 srli a5,a5,0x9 + 3000930: 853e mv a0,a5 + 3000932: 3519 jal ra,3000738 + + /* PGA */ + PGA0->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga0_vos_trim; + 3000934: 18200737 lui a4,0x18200 + 3000938: fcc42783 lw a5,-52(s0) + 300093c: 1ff7f793 andi a5,a5,511 + 3000940: 01079693 slli a3,a5,0x10 + 3000944: 82c1 srli a3,a3,0x10 + 3000946: 531c lw a5,32(a4) + 3000948: 1ff6f693 andi a3,a3,511 + 300094c: e007f793 andi a5,a5,-512 + 3000950: 8fd5 or a5,a5,a3 + 3000952: d31c sw a5,32(a4) + PGA1->PGA_TRIM.BIT.da_pga_vos_trim = trimData21.REG.data0.da_pga1_vos_trim; + 3000954: 18201737 lui a4,0x18201 + 3000958: fcc42783 lw a5,-52(s0) + 300095c: 83c1 srli a5,a5,0x10 + 300095e: 1ff7f793 andi a5,a5,511 + 3000962: 01079693 slli a3,a5,0x10 + 3000966: 82c1 srli a3,a3,0x10 + 3000968: 531c lw a5,32(a4) + 300096a: 1ff6f693 andi a3,a3,511 + 300096e: e007f793 andi a5,a5,-512 + 3000972: 8fd5 or a5,a5,a3 + 3000974: 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 */ + 3000976: fbc40793 addi a5,s0,-68 + 300097a: 863e mv a2,a5 + 300097c: 45d9 li a1,22 + 300097e: 4501 li a0,0 + 3000980: 256d jal ra,300102a + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_gain_trim2 = trimData22.REG.data0.pga0_gain2; + 3000982: 18000737 lui a4,0x18000 + 3000986: fbc42783 lw a5,-68(s0) + 300098a: 86be mv a3,a5 + 300098c: 6789 lui a5,0x2 + 300098e: 17fd addi a5,a5,-1 # 1fff + 3000990: 8ff5 and a5,a5,a3 + 3000992: 01079613 slli a2,a5,0x10 + 3000996: 8241 srli a2,a2,0x10 + 3000998: 6785 lui a5,0x1 + 300099a: 973e add a4,a4,a5 + 300099c: 81472783 lw a5,-2028(a4) # 17fff814 + 30009a0: 6689 lui a3,0x2 + 30009a2: 16fd addi a3,a3,-1 # 1fff + 30009a4: 8ef1 and a3,a3,a2 + 30009a6: 06c2 slli a3,a3,0x10 + 30009a8: e0010637 lui a2,0xe0010 + 30009ac: 167d addi a2,a2,-1 # e000ffff + 30009ae: 8ff1 and a5,a5,a2 + 30009b0: 8fd5 or a5,a5,a3 + 30009b2: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM0.BIT.cfg_pga0_ofst_trim2 = trimData22.REG.data0.pga0_offset2; + 30009b6: 18000737 lui a4,0x18000 + 30009ba: fbc42783 lw a5,-68(s0) + 30009be: 83c1 srli a5,a5,0x10 + 30009c0: 86be mv a3,a5 + 30009c2: 6785 lui a5,0x1 + 30009c4: 17fd addi a5,a5,-1 # fff + 30009c6: 8ff5 and a5,a5,a3 + 30009c8: 01079613 slli a2,a5,0x10 + 30009cc: 8241 srli a2,a2,0x10 + 30009ce: 6785 lui a5,0x1 + 30009d0: 973e add a4,a4,a5 + 30009d2: 81472783 lw a5,-2028(a4) # 17fff814 + 30009d6: 6685 lui a3,0x1 + 30009d8: 16fd addi a3,a3,-1 # fff + 30009da: 8ef1 and a3,a3,a2 + 30009dc: 767d lui a2,0xfffff + 30009de: 8ff1 and a5,a5,a2 + 30009e0: 8fd5 or a5,a5,a3 + 30009e2: 80f72a23 sw a5,-2028(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_gain_trim4 = trimData22.REG.data1.pga0_gain4; + 30009e6: 18000737 lui a4,0x18000 + 30009ea: fc042783 lw a5,-64(s0) + 30009ee: 86be mv a3,a5 + 30009f0: 6789 lui a5,0x2 + 30009f2: 17fd addi a5,a5,-1 # 1fff + 30009f4: 8ff5 and a5,a5,a3 + 30009f6: 01079613 slli a2,a5,0x10 + 30009fa: 8241 srli a2,a2,0x10 + 30009fc: 6785 lui a5,0x1 + 30009fe: 973e add a4,a4,a5 + 3000a00: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a04: 6689 lui a3,0x2 + 3000a06: 16fd addi a3,a3,-1 # 1fff + 3000a08: 8ef1 and a3,a3,a2 + 3000a0a: 06c2 slli a3,a3,0x10 + 3000a0c: e0010637 lui a2,0xe0010 + 3000a10: 167d addi a2,a2,-1 # e000ffff + 3000a12: 8ff1 and a5,a5,a2 + 3000a14: 8fd5 or a5,a5,a3 + 3000a16: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM1.BIT.cfg_pga0_ofst_trim4 = trimData22.REG.data1.pga0_offset4; + 3000a1a: 18000737 lui a4,0x18000 + 3000a1e: fc042783 lw a5,-64(s0) + 3000a22: 83c1 srli a5,a5,0x10 + 3000a24: 86be mv a3,a5 + 3000a26: 6785 lui a5,0x1 + 3000a28: 17fd addi a5,a5,-1 # fff + 3000a2a: 8ff5 and a5,a5,a3 + 3000a2c: 01079613 slli a2,a5,0x10 + 3000a30: 8241 srli a2,a2,0x10 + 3000a32: 6785 lui a5,0x1 + 3000a34: 973e add a4,a4,a5 + 3000a36: 81872783 lw a5,-2024(a4) # 17fff818 + 3000a3a: 6685 lui a3,0x1 + 3000a3c: 16fd addi a3,a3,-1 # fff + 3000a3e: 8ef1 and a3,a3,a2 + 3000a40: 767d lui a2,0xfffff + 3000a42: 8ff1 and a5,a5,a2 + 3000a44: 8fd5 or a5,a5,a3 + 3000a46: 80f72c23 sw a5,-2024(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_gain_trim8 = trimData22.REG.data2.pga0_gain8; + 3000a4a: 18000737 lui a4,0x18000 + 3000a4e: fc442783 lw a5,-60(s0) + 3000a52: 86be mv a3,a5 + 3000a54: 6789 lui a5,0x2 + 3000a56: 17fd addi a5,a5,-1 # 1fff + 3000a58: 8ff5 and a5,a5,a3 + 3000a5a: 01079613 slli a2,a5,0x10 + 3000a5e: 8241 srli a2,a2,0x10 + 3000a60: 6785 lui a5,0x1 + 3000a62: 973e add a4,a4,a5 + 3000a64: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a68: 6689 lui a3,0x2 + 3000a6a: 16fd addi a3,a3,-1 # 1fff + 3000a6c: 8ef1 and a3,a3,a2 + 3000a6e: 06c2 slli a3,a3,0x10 + 3000a70: e0010637 lui a2,0xe0010 + 3000a74: 167d addi a2,a2,-1 # e000ffff + 3000a76: 8ff1 and a5,a5,a2 + 3000a78: 8fd5 or a5,a5,a3 + 3000a7a: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM2.BIT.cfg_pga0_ofst_trim8 = trimData22.REG.data2.pga0_offset8; + 3000a7e: 18000737 lui a4,0x18000 + 3000a82: fc442783 lw a5,-60(s0) + 3000a86: 83c1 srli a5,a5,0x10 + 3000a88: 86be mv a3,a5 + 3000a8a: 6785 lui a5,0x1 + 3000a8c: 17fd addi a5,a5,-1 # fff + 3000a8e: 8ff5 and a5,a5,a3 + 3000a90: 01079613 slli a2,a5,0x10 + 3000a94: 8241 srli a2,a2,0x10 + 3000a96: 6785 lui a5,0x1 + 3000a98: 973e add a4,a4,a5 + 3000a9a: 81c72783 lw a5,-2020(a4) # 17fff81c + 3000a9e: 6685 lui a3,0x1 + 3000aa0: 16fd addi a3,a3,-1 # fff + 3000aa2: 8ef1 and a3,a3,a2 + 3000aa4: 767d lui a2,0xfffff + 3000aa6: 8ff1 and a5,a5,a2 + 3000aa8: 8fd5 or a5,a5,a3 + 3000aaa: 80f72e23 sw a5,-2020(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_gain_trim16 = trimData22.REG.data3.pga0_gain16; + 3000aae: 18000737 lui a4,0x18000 + 3000ab2: fc842783 lw a5,-56(s0) + 3000ab6: 86be mv a3,a5 + 3000ab8: 6789 lui a5,0x2 + 3000aba: 17fd addi a5,a5,-1 # 1fff + 3000abc: 8ff5 and a5,a5,a3 + 3000abe: 01079613 slli a2,a5,0x10 + 3000ac2: 8241 srli a2,a2,0x10 + 3000ac4: 6785 lui a5,0x1 + 3000ac6: 973e add a4,a4,a5 + 3000ac8: 82072783 lw a5,-2016(a4) # 17fff820 + 3000acc: 6689 lui a3,0x2 + 3000ace: 16fd addi a3,a3,-1 # 1fff + 3000ad0: 8ef1 and a3,a3,a2 + 3000ad2: 06c2 slli a3,a3,0x10 + 3000ad4: e0010637 lui a2,0xe0010 + 3000ad8: 167d addi a2,a2,-1 # e000ffff + 3000ada: 8ff1 and a5,a5,a2 + 3000adc: 8fd5 or a5,a5,a3 + 3000ade: 82f72023 sw a5,-2016(a4) + ADC0->ADC_PGA0_OEGE_TRIM3.BIT.cfg_pga0_ofst_trim16 = trimData22.REG.data3.pga0_offset16; + 3000ae2: 18000737 lui a4,0x18000 + 3000ae6: fc842783 lw a5,-56(s0) + 3000aea: 83c1 srli a5,a5,0x10 + 3000aec: 86be mv a3,a5 + 3000aee: 6785 lui a5,0x1 + 3000af0: 17fd addi a5,a5,-1 # fff + 3000af2: 8ff5 and a5,a5,a3 + 3000af4: 01079613 slli a2,a5,0x10 + 3000af8: 8241 srli a2,a2,0x10 + 3000afa: 6785 lui a5,0x1 + 3000afc: 973e add a4,a4,a5 + 3000afe: 82072783 lw a5,-2016(a4) # 17fff820 + 3000b02: 6685 lui a3,0x1 + 3000b04: 16fd addi a3,a3,-1 # fff + 3000b06: 8ef1 and a3,a3,a2 + 3000b08: 767d lui a2,0xfffff + 3000b0a: 8ff1 and a5,a5,a2 + 3000b0c: 8fd5 or a5,a5,a3 + 3000b0e: 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 */ + 3000b12: fac40793 addi a5,s0,-84 + 3000b16: 863e mv a2,a5 + 3000b18: 45dd li a1,23 + 3000b1a: 4501 li a0,0 + 3000b1c: 2339 jal ra,300102a + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_gain_trim2 = trimData23.REG.data0.pga1_gain2; + 3000b1e: 18000737 lui a4,0x18000 + 3000b22: fac42783 lw a5,-84(s0) + 3000b26: 86be mv a3,a5 + 3000b28: 6789 lui a5,0x2 + 3000b2a: 17fd addi a5,a5,-1 # 1fff + 3000b2c: 8ff5 and a5,a5,a3 + 3000b2e: 01079613 slli a2,a5,0x10 + 3000b32: 8241 srli a2,a2,0x10 + 3000b34: 6785 lui a5,0x1 + 3000b36: 973e add a4,a4,a5 + 3000b38: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b3c: 6689 lui a3,0x2 + 3000b3e: 16fd addi a3,a3,-1 # 1fff + 3000b40: 8ef1 and a3,a3,a2 + 3000b42: 06c2 slli a3,a3,0x10 + 3000b44: e0010637 lui a2,0xe0010 + 3000b48: 167d addi a2,a2,-1 # e000ffff + 3000b4a: 8ff1 and a5,a5,a2 + 3000b4c: 8fd5 or a5,a5,a3 + 3000b4e: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM0.BIT.cfg_pga1_ofst_trim2 = trimData23.REG.data0.pga1_offset2; + 3000b52: 18000737 lui a4,0x18000 + 3000b56: fac42783 lw a5,-84(s0) + 3000b5a: 83c1 srli a5,a5,0x10 + 3000b5c: 86be mv a3,a5 + 3000b5e: 6785 lui a5,0x1 + 3000b60: 17fd addi a5,a5,-1 # fff + 3000b62: 8ff5 and a5,a5,a3 + 3000b64: 01079613 slli a2,a5,0x10 + 3000b68: 8241 srli a2,a2,0x10 + 3000b6a: 6785 lui a5,0x1 + 3000b6c: 973e add a4,a4,a5 + 3000b6e: 82472783 lw a5,-2012(a4) # 17fff824 + 3000b72: 6685 lui a3,0x1 + 3000b74: 16fd addi a3,a3,-1 # fff + 3000b76: 8ef1 and a3,a3,a2 + 3000b78: 767d lui a2,0xfffff + 3000b7a: 8ff1 and a5,a5,a2 + 3000b7c: 8fd5 or a5,a5,a3 + 3000b7e: 82f72223 sw a5,-2012(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_gain_trim4 = trimData23.REG.data1.pga1_gain4; + 3000b82: 18000737 lui a4,0x18000 + 3000b86: fb042783 lw a5,-80(s0) + 3000b8a: 86be mv a3,a5 + 3000b8c: 6789 lui a5,0x2 + 3000b8e: 17fd addi a5,a5,-1 # 1fff + 3000b90: 8ff5 and a5,a5,a3 + 3000b92: 01079613 slli a2,a5,0x10 + 3000b96: 8241 srli a2,a2,0x10 + 3000b98: 6785 lui a5,0x1 + 3000b9a: 973e add a4,a4,a5 + 3000b9c: 82872783 lw a5,-2008(a4) # 17fff828 + 3000ba0: 6689 lui a3,0x2 + 3000ba2: 16fd addi a3,a3,-1 # 1fff + 3000ba4: 8ef1 and a3,a3,a2 + 3000ba6: 06c2 slli a3,a3,0x10 + 3000ba8: e0010637 lui a2,0xe0010 + 3000bac: 167d addi a2,a2,-1 # e000ffff + 3000bae: 8ff1 and a5,a5,a2 + 3000bb0: 8fd5 or a5,a5,a3 + 3000bb2: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM1.BIT.cfg_pga1_ofst_trim4 = trimData23.REG.data1.pga1_offset4; + 3000bb6: 18000737 lui a4,0x18000 + 3000bba: fb042783 lw a5,-80(s0) + 3000bbe: 83c1 srli a5,a5,0x10 + 3000bc0: 86be mv a3,a5 + 3000bc2: 6785 lui a5,0x1 + 3000bc4: 17fd addi a5,a5,-1 # fff + 3000bc6: 8ff5 and a5,a5,a3 + 3000bc8: 01079613 slli a2,a5,0x10 + 3000bcc: 8241 srli a2,a2,0x10 + 3000bce: 6785 lui a5,0x1 + 3000bd0: 973e add a4,a4,a5 + 3000bd2: 82872783 lw a5,-2008(a4) # 17fff828 + 3000bd6: 6685 lui a3,0x1 + 3000bd8: 16fd addi a3,a3,-1 # fff + 3000bda: 8ef1 and a3,a3,a2 + 3000bdc: 767d lui a2,0xfffff + 3000bde: 8ff1 and a5,a5,a2 + 3000be0: 8fd5 or a5,a5,a3 + 3000be2: 82f72423 sw a5,-2008(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_gain_trim8 = trimData23.REG.data2.pga1_gain8; + 3000be6: 18000737 lui a4,0x18000 + 3000bea: fb442783 lw a5,-76(s0) + 3000bee: 86be mv a3,a5 + 3000bf0: 6789 lui a5,0x2 + 3000bf2: 17fd addi a5,a5,-1 # 1fff + 3000bf4: 8ff5 and a5,a5,a3 + 3000bf6: 01079613 slli a2,a5,0x10 + 3000bfa: 8241 srli a2,a2,0x10 + 3000bfc: 6785 lui a5,0x1 + 3000bfe: 973e add a4,a4,a5 + 3000c00: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c04: 6689 lui a3,0x2 + 3000c06: 16fd addi a3,a3,-1 # 1fff + 3000c08: 8ef1 and a3,a3,a2 + 3000c0a: 06c2 slli a3,a3,0x10 + 3000c0c: e0010637 lui a2,0xe0010 + 3000c10: 167d addi a2,a2,-1 # e000ffff + 3000c12: 8ff1 and a5,a5,a2 + 3000c14: 8fd5 or a5,a5,a3 + 3000c16: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM2.BIT.cfg_pga1_ofst_trim8 = trimData23.REG.data2.pga1_offset8; + 3000c1a: 18000737 lui a4,0x18000 + 3000c1e: fb442783 lw a5,-76(s0) + 3000c22: 83c1 srli a5,a5,0x10 + 3000c24: 86be mv a3,a5 + 3000c26: 6785 lui a5,0x1 + 3000c28: 17fd addi a5,a5,-1 # fff + 3000c2a: 8ff5 and a5,a5,a3 + 3000c2c: 01079613 slli a2,a5,0x10 + 3000c30: 8241 srli a2,a2,0x10 + 3000c32: 6785 lui a5,0x1 + 3000c34: 973e add a4,a4,a5 + 3000c36: 82c72783 lw a5,-2004(a4) # 17fff82c + 3000c3a: 6685 lui a3,0x1 + 3000c3c: 16fd addi a3,a3,-1 # fff + 3000c3e: 8ef1 and a3,a3,a2 + 3000c40: 767d lui a2,0xfffff + 3000c42: 8ff1 and a5,a5,a2 + 3000c44: 8fd5 or a5,a5,a3 + 3000c46: 82f72623 sw a5,-2004(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_gain_trim16 = trimData23.REG.data3.pga1_gain16; + 3000c4a: 18000737 lui a4,0x18000 + 3000c4e: fb842783 lw a5,-72(s0) + 3000c52: 86be mv a3,a5 + 3000c54: 6789 lui a5,0x2 + 3000c56: 17fd addi a5,a5,-1 # 1fff + 3000c58: 8ff5 and a5,a5,a3 + 3000c5a: 01079613 slli a2,a5,0x10 + 3000c5e: 8241 srli a2,a2,0x10 + 3000c60: 6785 lui a5,0x1 + 3000c62: 973e add a4,a4,a5 + 3000c64: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c68: 6689 lui a3,0x2 + 3000c6a: 16fd addi a3,a3,-1 # 1fff + 3000c6c: 8ef1 and a3,a3,a2 + 3000c6e: 06c2 slli a3,a3,0x10 + 3000c70: e0010637 lui a2,0xe0010 + 3000c74: 167d addi a2,a2,-1 # e000ffff + 3000c76: 8ff1 and a5,a5,a2 + 3000c78: 8fd5 or a5,a5,a3 + 3000c7a: 82f72823 sw a5,-2000(a4) + ADC0->ADC_PGA1_OEGE_TRIM3.BIT.cfg_pga1_ofst_trim16 = trimData23.REG.data3.pga1_offset16; + 3000c7e: 18000737 lui a4,0x18000 + 3000c82: fb842783 lw a5,-72(s0) + 3000c86: 83c1 srli a5,a5,0x10 + 3000c88: 86be mv a3,a5 + 3000c8a: 6785 lui a5,0x1 + 3000c8c: 17fd addi a5,a5,-1 # fff + 3000c8e: 8ff5 and a5,a5,a3 + 3000c90: 01079613 slli a2,a5,0x10 + 3000c94: 8241 srli a2,a2,0x10 + 3000c96: 6785 lui a5,0x1 + 3000c98: 973e add a4,a4,a5 + 3000c9a: 83072783 lw a5,-2000(a4) # 17fff830 + 3000c9e: 6685 lui a3,0x1 + 3000ca0: 16fd addi a3,a3,-1 # fff + 3000ca2: 8ef1 and a3,a3,a2 + 3000ca4: 767d lui a2,0xfffff + 3000ca6: 8ff1 and a5,a5,a2 + 3000ca8: 8fd5 or a5,a5,a3 + 3000caa: 82f72823 sw a5,-2000(a4) +} + 3000cae: 0001 nop + 3000cb0: 40f6 lw ra,92(sp) + 3000cb2: 4466 lw s0,88(sp) + 3000cb4: 6125 addi sp,sp,96 + 3000cb6: 8082 ret + +03000cb8 : + 3000cb8: 3720006f j 300102a + +03000cbc : + * @brief Parameter calibration entry of the analog module. + * @param None + * @retval None + */ +void ANATRIM_Entry(void) +{ + 3000cbc: 1141 addi sp,sp,-16 + 3000cbe: c606 sw ra,12(sp) + 3000cc0: c422 sw s0,8(sp) + 3000cc2: 0800 addi s0,sp,16 + if (CHIP_GetInfo() == false) { /* If the chip information is incorrect, calibration is not performed */ + 3000cc4: 3c79 jal ra,3000762 + 3000cc6: 87aa mv a5,a0 + 3000cc8: 0017c793 xori a5,a5,1 + 3000ccc: 9f81 uxtb a5 + 3000cce: eb9d bnez a5,3000d04 + return; + } + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_ENABLE); /* Enable the clock for calibration */ + 3000cd0: 4585 li a1,1 + 3000cd2: 18000537 lui a0,0x18000 + 3000cd6: 2849 jal ra,3000d68 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_ENABLE); + 3000cd8: 4585 li a1,1 + 3000cda: 18200537 lui a0,0x18200 + 3000cde: 2069 jal ra,3000d68 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_ENABLE); + 3000ce0: 4585 li a1,1 + 3000ce2: 18201537 lui a0,0x18201 + 3000ce6: 2049 jal ra,3000d68 + CHIP_AnalogTrim(); + 3000ce8: 34d1 jal ra,30007ac + HAL_CRG_IpEnableSet((void *)ADC0, IP_CLK_DISABLE); /* The clock is disabled after calibration */ + 3000cea: 4581 li a1,0 + 3000cec: 18000537 lui a0,0x18000 + 3000cf0: 28a5 jal ra,3000d68 + HAL_CRG_IpEnableSet((void *)PGA0, IP_CLK_DISABLE); + 3000cf2: 4581 li a1,0 + 3000cf4: 18200537 lui a0,0x18200 + 3000cf8: 2885 jal ra,3000d68 + HAL_CRG_IpEnableSet((void *)PGA1, IP_CLK_DISABLE); + 3000cfa: 4581 li a1,0 + 3000cfc: 18201537 lui a0,0x18201 + 3000d00: 20a5 jal ra,3000d68 + 3000d02: a011 j 3000d06 + return; + 3000d04: 0001 nop + 3000d06: 40b2 lw ra,12(sp) + 3000d08: 4422 lw s0,8(sp) + 3000d0a: 0141 addi sp,sp,16 + 3000d0c: 8082 ret + +03000d0e : + * @brief Set Crg Core clock select + * @param None + * @retval None + */ +void ANAVREF_Init(void) +{ + 3000d0e: 1141 addi sp,sp,-16 + 3000d10: c606 sw ra,12(sp) + 3000d12: c422 sw s0,8(sp) + 3000d14: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(VREF_BASE, IP_CLK_ENABLE); + 3000d16: 4585 li a1,1 + 3000d18: 18100537 lui a0,0x18100 + 3000d1c: 20b1 jal ra,3000d68 + VREF->VREF_CTRL1.BIT.da_ref_temp_trim_enh = 0x1; + 3000d1e: 18100737 lui a4,0x18100 + 3000d22: 531c lw a5,32(a4) + 3000d24: 66c1 lui a3,0x10 + 3000d26: 8fd5 or a5,a5,a3 + 3000d28: d31c sw a5,32(a4) + VREF->VREF_CTRL0.BIT.da_ref_enh = BASE_CFG_ENABLE; + 3000d2a: 18100737 lui a4,0x18100 + 3000d2e: 431c lw a5,0(a4) + 3000d30: 0017e793 ori a5,a5,1 + 3000d34: c31c sw a5,0(a4) + BASE_FUNC_DELAY_US(200); /* delay 200us */ + 3000d36: 000f47b7 lui a5,0xf4 + 3000d3a: 24078593 addi a1,a5,576 # f4240 + 3000d3e: 0c800513 li a0,200 + 3000d42: 234d jal ra,30012e4 + VREF->VREF_CTRL1.BIT.da_ref_chop_enh = BASE_CFG_ENABLE; + 3000d44: 18100737 lui a4,0x18100 + 3000d48: 531c lw a5,32(a4) + 3000d4a: 0017e793 ori a5,a5,1 + 3000d4e: d31c sw a5,32(a4) + BASE_FUNC_DELAY_US(40); /* delay 40us */ + 3000d50: 000f47b7 lui a5,0xf4 + 3000d54: 24078593 addi a1,a5,576 # f4240 + 3000d58: 02800513 li a0,40 + 3000d5c: 2361 jal ra,30012e4 + 3000d5e: 0001 nop + 3000d60: 40b2 lw ra,12(sp) + 3000d62: 4422 lw s0,8(sp) + 3000d64: 0141 addi sp,sp,16 + 3000d66: 8082 ret + +03000d68 : + 3000d68: 09d0106f j 3002604 + +03000d6c : + * @brief Set Crg Core clock select + * @param coreClkSelect Input core clock select value + * @retval None + */ +void CRG_SetCoreClockSelect(CRG_CoreClkSelect coreClkSelect) +{ + 3000d6c: 715d addi sp,sp,-80 + 3000d6e: c686 sw ra,76(sp) + 3000d70: c4a2 sw s0,72(sp) + 3000d72: 0880 addi s0,sp,80 + 3000d74: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 3000d78: 100007b7 lui a5,0x10000 + 3000d7c: fcf42423 sw a5,-56(s0) + crg.coreClkSelect = coreClkSelect; + 3000d80: fbc42783 lw a5,-68(s0) + 3000d84: fef42023 sw a5,-32(s0) + if (crg.coreClkSelect == CRG_CORE_CLK_SELECT_TCXO) { /* If an external crystal oscillator is selected. */ + 3000d88: fe042703 lw a4,-32(s0) + 3000d8c: 4785 li a5,1 + 3000d8e: 00f71663 bne a4,a5,3000d9a + BASE_FUNC_DELAY_MS(10); /* 10: delay 10ms, wait clokc stable. */ + 3000d92: 3e800593 li a1,1000 + 3000d96: 4529 li a0,10 + 3000d98: 23b1 jal ra,30012e4 + } + HAL_CRG_SetCoreClockSelect(&crg); + 3000d9a: fc840793 addi a5,s0,-56 + 3000d9e: 853e mv a0,a5 + 3000da0: 56e010ef jal ra,300230e + 3000da4: 0001 nop + 3000da6: 40b6 lw ra,76(sp) + 3000da8: 4426 lw s0,72(sp) + 3000daa: 6161 addi sp,sp,80 + 3000dac: 8082 ret + +03000dae : + * @param frequence frequnce + * @param div Output Divison + * @retval None + */ +static void SetFlashDiv(unsigned int frequency, unsigned int *nreadDiv) +{ + 3000dae: 7179 addi sp,sp,-48 + 3000db0: d622 sw s0,44(sp) + 3000db2: 1800 addi s0,sp,48 + 3000db4: fca42e23 sw a0,-36(s0) + 3000db8: fcb42c23 sw a1,-40(s0) + unsigned int div; + unsigned int freq = frequency; + 3000dbc: fdc42783 lw a5,-36(s0) + 3000dc0: fef42423 sw a5,-24(s0) + /* Get frequency divider of flash. */ + if (freq < FLASH_BASE_FREQ) { + 3000dc4: fe842703 lw a4,-24(s0) + 3000dc8: 023c37b7 lui a5,0x23c3 + 3000dcc: 45f78793 addi a5,a5,1119 # 23c345f + 3000dd0: 00e7e863 bltu a5,a4,3000de0 + freq = FLASH_BASE_FREQ; + 3000dd4: 023c37b7 lui a5,0x23c3 + 3000dd8: 46078793 addi a5,a5,1120 # 23c3460 + 3000ddc: fef42423 sw a5,-24(s0) + } + /* Get the flash frequency division based on the frequency. */ + if ((freq % FLASH_BASE_FREQ) == 0) { + 3000de0: fe842703 lw a4,-24(s0) + 3000de4: 023c37b7 lui a5,0x23c3 + 3000de8: 46078793 addi a5,a5,1120 # 23c3460 + 3000dec: 02f777b3 remu a5,a4,a5 + 3000df0: ef81 bnez a5,3000e08 + div = freq / FLASH_BASE_FREQ; + 3000df2: fe842703 lw a4,-24(s0) + 3000df6: 023c37b7 lui a5,0x23c3 + 3000dfa: 46078793 addi a5,a5,1120 # 23c3460 + 3000dfe: 02f757b3 divu a5,a4,a5 + 3000e02: fef42623 sw a5,-20(s0) + 3000e06: a821 j 3000e1e + } else { + div = (freq / FLASH_BASE_FREQ) + 1; + 3000e08: fe842703 lw a4,-24(s0) + 3000e0c: 023c37b7 lui a5,0x23c3 + 3000e10: 46078793 addi a5,a5,1120 # 23c3460 + 3000e14: 02f757b3 divu a5,a4,a5 + 3000e18: 0785 addi a5,a5,1 + 3000e1a: fef42623 sw a5,-20(s0) + } + /* Ensure the flash frequency division is valid. */ + if (div > FLASH_MAX_DIV) { + 3000e1e: fec42703 lw a4,-20(s0) + 3000e22: 4791 li a5,4 + 3000e24: 00e7f563 bgeu a5,a4,3000e2e + div = FLASH_MAX_DIV; + 3000e28: 4791 li a5,4 + 3000e2a: fef42623 sw a5,-20(s0) + } + *nreadDiv = div; + 3000e2e: fd842783 lw a5,-40(s0) + 3000e32: fec42703 lw a4,-20(s0) + 3000e36: c398 sw a4,0(a5) +} + 3000e38: 0001 nop + 3000e3a: 5432 lw s0,44(sp) + 3000e3c: 6145 addi sp,sp,48 + 3000e3e: 8082 ret + +03000e40 : + * @brief Get the Rounding up value + * @param coreClkSelect Core Clock select + * @retval Frequency of Flash + */ +static unsigned int GetFlashFreq(CRG_CoreClkSelect coreClkSelect) +{ + 3000e40: 7179 addi sp,sp,-48 + 3000e42: d606 sw ra,44(sp) + 3000e44: d422 sw s0,40(sp) + 3000e46: 1800 addi s0,sp,48 + 3000e48: fca42e23 sw a0,-36(s0) + unsigned int hclk; + /* Get frequency of flash. */ + switch (coreClkSelect) { + 3000e4c: fdc42783 lw a5,-36(s0) + 3000e50: 4705 li a4,1 + 3000e52: 02e78063 beq a5,a4,3000e72 + 3000e56: 4705 li a4,1 + 3000e58: 00e7e663 bltu a5,a4,3000e64 + 3000e5c: 4709 li a4,2 + 3000e5e: 02e78163 beq a5,a4,3000e80 + 3000e62: a025 j 3000e8a + case CRG_CORE_CLK_SELECT_HOSC: + hclk = HOSC_FREQ; + 3000e64: 017d87b7 lui a5,0x17d8 + 3000e68: 84078793 addi a5,a5,-1984 # 17d7840 + 3000e6c: fef42623 sw a5,-20(s0) + break; + 3000e70: a01d j 3000e96 + case CRG_CORE_CLK_SELECT_TCXO: + hclk = XTRAIL_FREQ; + 3000e72: 01c9c7b7 lui a5,0x1c9c + 3000e76: 38078793 addi a5,a5,896 # 1c9c380 + 3000e7a: fef42623 sw a5,-20(s0) + break; + 3000e7e: a821 j 3000e96 + case CRG_CORE_CLK_SELECT_PLL: + hclk = HAL_CRG_GetPllFreq(); + 3000e80: 5ac010ef jal ra,300242c + 3000e84: fea42623 sw a0,-20(s0) + break; + 3000e88: a039 j 3000e96 + default: + hclk = LOSC_FREQ; + 3000e8a: 67a1 lui a5,0x8 + 3000e8c: d0078793 addi a5,a5,-768 # 7d00 + 3000e90: fef42623 sw a5,-20(s0) + break; + 3000e94: 0001 nop + } + return hclk; + 3000e96: fec42783 lw a5,-20(s0) +} + 3000e9a: 853e mv a0,a5 + 3000e9c: 50b2 lw ra,44(sp) + 3000e9e: 5422 lw s0,40(sp) + 3000ea0: 6145 addi sp,sp,48 + 3000ea2: 8082 ret + +03000ea4 : + * @brief Set flash clock frequence base on hclk + * @param coreClkSelect core clock select + * @retval None + */ +void FLASH_ClockConfig(CRG_CoreClkSelect coreClkSelect) +{ + 3000ea4: 7179 addi sp,sp,-48 + 3000ea6: d606 sw ra,44(sp) + 3000ea8: d422 sw s0,40(sp) + 3000eaa: 1800 addi s0,sp,48 + 3000eac: fca42e23 sw a0,-36(s0) + EFC_RegStruct *efc = EFC; + 3000eb0: 147107b7 lui a5,0x14710 + 3000eb4: fef42623 sw a5,-20(s0) + EFLASH_CLK_CFG_REG cfg; + unsigned int hclk; + unsigned int nreadDiv; + + /* Step 1: Set nread_div */ + hclk = GetFlashFreq(coreClkSelect); + 3000eb8: fdc42503 lw a0,-36(s0) + 3000ebc: 3751 jal ra,3000e40 + 3000ebe: fea42423 sw a0,-24(s0) + cfg.reg = efc->EFLASH_CLK_CFG.reg; + 3000ec2: fec42703 lw a4,-20(s0) + 3000ec6: 6785 lui a5,0x1 + 3000ec8: 97ba add a5,a5,a4 + 3000eca: 9407a783 lw a5,-1728(a5) # 940 + 3000ece: fef42223 sw a5,-28(s0) + SetFlashDiv(hclk, &nreadDiv); + 3000ed2: fe040793 addi a5,s0,-32 + 3000ed6: 85be mv a1,a5 + 3000ed8: fe842503 lw a0,-24(s0) + 3000edc: 3dc9 jal ra,3000dae + cfg.BIT.nread_div = nreadDiv; + 3000ede: fe042783 lw a5,-32(s0) + 3000ee2: 8bbd andi a5,a5,15 + 3000ee4: 0ff7f713 andi a4,a5,255 + 3000ee8: fe442783 lw a5,-28(s0) + 3000eec: 8b3d andi a4,a4,15 + 3000eee: 0712 slli a4,a4,0x4 + 3000ef0: f0f7f793 andi a5,a5,-241 + 3000ef4: 8fd9 or a5,a5,a4 + 3000ef6: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000efa: fe442783 lw a5,-28(s0) + 3000efe: 00100737 lui a4,0x100 + 3000f02: 8fd9 or a5,a5,a4 + 3000f04: fef42223 sw a5,-28(s0) + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f08: fe442783 lw a5,-28(s0) + 3000f0c: 00400737 lui a4,0x400 + 3000f10: 8fd9 or a5,a5,a4 + 3000f12: fef42223 sw a5,-28(s0) + + /* Step 2: Wait Busclk_sw_req */ + cfg.BIT.cur_read_vref_cal = BASE_CFG_SET; + 3000f16: fe442783 lw a5,-28(s0) + 3000f1a: 00400737 lui a4,0x400 + 3000f1e: 8fd9 or a5,a5,a4 + 3000f20: fef42223 sw a5,-28(s0) + cfg.BIT.busclk_sw_req = BASE_CFG_SET; + 3000f24: fe442783 lw a5,-28(s0) + 3000f28: 00100737 lui a4,0x100 + 3000f2c: 8fd9 or a5,a5,a4 + 3000f2e: fef42223 sw a5,-28(s0) + efc->EFLASH_CLK_CFG.reg = cfg.reg; + 3000f32: fe442703 lw a4,-28(s0) + 3000f36: fec42683 lw a3,-20(s0) + 3000f3a: 6785 lui a5,0x1 + 3000f3c: 97b6 add a5,a5,a3 + 3000f3e: 94e7a023 sw a4,-1728(a5) # 940 + while (efc->EFLASH_CLK_CFG.BIT.busclk_sw_req == BASE_CFG_SET) { + 3000f42: 0001 nop + 3000f44: fec42703 lw a4,-20(s0) + 3000f48: 6785 lui a5,0x1 + 3000f4a: 97ba add a5,a5,a4 + 3000f4c: 9407a783 lw a5,-1728(a5) # 940 + 3000f50: 83d1 srli a5,a5,0x14 + 3000f52: 8b85 andi a5,a5,1 + 3000f54: 0ff7f713 andi a4,a5,255 + 3000f58: 4785 li a5,1 + 3000f5a: fef705e3 beq a4,a5,3000f44 + ; + } + 3000f5e: 0001 nop + 3000f60: 50b2 lw ra,44(sp) + 3000f62: 5422 lw s0,40(sp) + 3000f64: 6145 addi sp,sp,48 + 3000f66: 8082 ret + +03000f68 : + * @brief Init the systick + * @param None + * @retval None + */ +void SYSTICK_Init(void) +{ + 3000f68: 1141 addi sp,sp,-16 + 3000f6a: c622 sw s0,12(sp) + 3000f6c: 0800 addi s0,sp,16 + SYSTICK->TIMER_CTRL.reg = 0; + 3000f6e: 143807b7 lui a5,0x14380 + 3000f72: 0007a023 sw zero,0(a5) # 14380000 + SYSTICK->TIMER_CTRL.BIT.enable = 1; + 3000f76: 14380737 lui a4,0x14380 + 3000f7a: 431c lw a5,0(a4) + 3000f7c: 0017e793 ori a5,a5,1 + 3000f80: c31c sw a5,0(a4) +} + 3000f82: 0001 nop + 3000f84: 4432 lw s0,12(sp) + 3000f86: 0141 addi sp,sp,16 + 3000f88: 8082 ret + +03000f8a : + * @brief Get the Systick frep(Hz) + * @param None + * @retval Clock frep of systick(Hz) + */ +unsigned int SYSTICK_GetCRGHZ(void) +{ + 3000f8a: 1141 addi sp,sp,-16 + 3000f8c: c606 sw ra,12(sp) + 3000f8e: c422 sw s0,8(sp) + 3000f90: 0800 addi s0,sp,16 + /* Get the Systick IP */ + return HAL_CRG_GetIpFreq(SYSTICK_BASE); + 3000f92: 14380537 lui a0,0x14380 + 3000f96: 590010ef jal ra,3002526 + 3000f9a: 87aa mv a5,a0 + 3000f9c: 853e mv a0,a5 + 3000f9e: 40b2 lw ra,12(sp) + 3000fa0: 4422 lw s0,8(sp) + 3000fa2: 0141 addi sp,sp,16 + 3000fa4: 8082 ret + +03000fa6 : + * @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) +{ + 3000fa6: 1101 addi sp,sp,-32 + 3000fa8: ce22 sw s0,28(sp) + 3000faa: 1000 addi s0,sp,32 + 3000fac: fea42623 sw a0,-20(s0) + /* Check for errors in the flash reading process. */ + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fb0: fec42783 lw a5,-20(s0) + 3000fb4: 1007a783 lw a5,256(a5) + 3000fb8: 83c1 srli a5,a5,0x10 + 3000fba: 8b85 andi a5,a5,1 + 3000fbc: 9f81 uxtb a5 + 3000fbe: e38d bnez a5,3000fe0 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fc0: fec42783 lw a5,-20(s0) + 3000fc4: 1007a783 lw a5,256(a5) + 3000fc8: 83cd srli a5,a5,0x13 + 3000fca: 8b85 andi a5,a5,1 + 3000fcc: 9f81 uxtb a5 + if (efc->INT_RAW_STATUS.BIT.int_raw_err_illegal || + 3000fce: eb89 bnez a5,3000fe0 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_chk) { + 3000fd0: fec42783 lw a5,-20(s0) + 3000fd4: 1007a783 lw a5,256(a5) + 3000fd8: 83d1 srli a5,a5,0x14 + 3000fda: 8b85 andi a5,a5,1 + 3000fdc: 9f81 uxtb a5 + efc->INT_RAW_STATUS.BIT.int_raw_err_ecc_corr || + 3000fde: c3a9 beqz a5,3001020 + efc->INT_CLEAR.BIT.int_clr_err_ecc_corr = BASE_CFG_SET; + 3000fe0: fec42703 lw a4,-20(s0) + 3000fe4: 10c72783 lw a5,268(a4) # 1438010c + 3000fe8: 000806b7 lui a3,0x80 + 3000fec: 8fd5 or a5,a5,a3 + 3000fee: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_illegal = BASE_CFG_SET; + 3000ff2: fec42703 lw a4,-20(s0) + 3000ff6: 10c72783 lw a5,268(a4) + 3000ffa: 66c1 lui a3,0x10 + 3000ffc: 8fd5 or a5,a5,a3 + 3000ffe: 10f72623 sw a5,268(a4) + efc->INT_CLEAR.BIT.int_clr_err_ecc_chk = BASE_CFG_SET; + 3001002: fec42703 lw a4,-20(s0) + 3001006: 10c72783 lw a5,268(a4) + 300100a: 001006b7 lui a3,0x100 + 300100e: 8fd5 or a5,a5,a3 + 3001010: 10f72623 sw a5,268(a4) + efc->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001014: fec42783 lw a5,-20(s0) + 3001018: 2007a023 sw zero,512(a5) + return BASE_STATUS_ERROR; + 300101c: 4785 li a5,1 + 300101e: a011 j 3001022 + } + return BASE_STATUS_OK; + 3001020: 4781 li a5,0 +} + 3001022: 853e mv a0,a5 + 3001024: 4472 lw s0,28(sp) + 3001026: 6105 addi sp,sp,32 + 3001028: 8082 ret + +0300102a : + * @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) +{ + 300102a: 7179 addi sp,sp,-48 + 300102c: d606 sw ra,44(sp) + 300102e: d422 sw s0,40(sp) + 3001030: 1800 addi s0,sp,48 + 3001032: fca42e23 sw a0,-36(s0) + 3001036: fcb42c23 sw a1,-40(s0) + 300103a: fcc42a23 sw a2,-44(s0) + EFC_RegStruct *p = EFC; + 300103e: 147107b7 lui a5,0x14710 + 3001042: fef42423 sw a5,-24(s0) + unsigned int addr; + + if (buf == NULL) { + 3001046: fd442783 lw a5,-44(s0) + 300104a: e399 bnez a5,3001050 + return BASE_STATUS_ERROR; + 300104c: 4785 li a5,1 + 300104e: aa15 j 3001182 + } + + if ((type >= FOTP_INFO_MAXTYPE) || (index > FOTP_INFO_REG_MAX_ID)) { + 3001050: fdc42703 lw a4,-36(s0) + 3001054: 4785 li a5,1 + 3001056: 00e7e763 bltu a5,a4,3001064 + 300105a: fd842703 lw a4,-40(s0) + 300105e: 47e5 li a5,25 + 3001060: 00e7f463 bgeu a5,a4,3001068 + return BASE_STATUS_ERROR; + 3001064: 4785 li a5,1 + 3001066: aa31 j 3001182 + } + + /* If there is a read command, return */ + if (p->EFLASH_CMD.BIT.cmd_start) { + 3001068: fe842783 lw a5,-24(s0) + 300106c: 439c lw a5,0(a5) + 300106e: 8b85 andi a5,a5,1 + 3001070: 9f81 uxtb a5 + 3001072: c399 beqz a5,3001078 + return BASE_STATUS_ERROR; + 3001074: 4785 li a5,1 + 3001076: a231 j 3001182 + } + + p->MAGIC_LOCK = FLASH_KEY_REGISTER_UNLOCK_VALUE; + 3001078: fe842783 lw a5,-24(s0) + 300107c: fedcc737 lui a4,0xfedcc + 3001080: a9870713 addi a4,a4,-1384 # fedcba98 + 3001084: 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; + 3001088: fdc42783 lw a5,-36(s0) + 300108c: e781 bnez a5,3001094 + 300108e: 008007b7 lui a5,0x800 + 3001092: a019 j 3001098 + 3001094: 008017b7 lui a5,0x801 + 3001098: fef42223 sw a5,-28(s0) + addr += index * REG_WORDS_NUM; + 300109c: fd842783 lw a5,-40(s0) + 30010a0: 0792 slli a5,a5,0x4 + 30010a2: fe442703 lw a4,-28(s0) + 30010a6: 97ba add a5,a5,a4 + 30010a8: fef42223 sw a5,-28(s0) + p->EFLASH_ADDR.BIT.cmd_addr = addr >> 2; /* Right shift 2 bit change to word */ + 30010ac: fe442783 lw a5,-28(s0) + 30010b0: 0027d713 srli a4,a5,0x2 + 30010b4: 004007b7 lui a5,0x400 + 30010b8: 17fd addi a5,a5,-1 # 3fffff + 30010ba: 00f77633 and a2,a4,a5 + 30010be: fe842703 lw a4,-24(s0) + 30010c2: 435c lw a5,4(a4) + 30010c4: 004006b7 lui a3,0x400 + 30010c8: 16fd addi a3,a3,-1 # 3fffff + 30010ca: 8ef1 and a3,a3,a2 + 30010cc: 068a slli a3,a3,0x2 + 30010ce: ff000637 lui a2,0xff000 + 30010d2: 060d addi a2,a2,3 # ff000003 + 30010d4: 8ff1 and a5,a5,a2 + 30010d6: 8fd5 or a5,a5,a3 + 30010d8: c35c sw a5,4(a4) + p->EFLASH_CMD.BIT.cmd_code = FLASH_OPERATION_READ; + 30010da: fe842703 lw a4,-24(s0) + 30010de: 431c lw a5,0(a4) + 30010e0: 8ff7f793 andi a5,a5,-1793 + 30010e4: 1007e793 ori a5,a5,256 + 30010e8: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_read_size = FLASH_READ_128BIT; + 30010ea: fe842703 lw a4,-24(s0) + 30010ee: 431c lw a5,0(a4) + 30010f0: d00006b7 lui a3,0xd0000 + 30010f4: 16fd addi a3,a3,-1 # cfffffff + 30010f6: 8efd and a3,a3,a5 + 30010f8: 100007b7 lui a5,0x10000 + 30010fc: 8fd5 or a5,a5,a3 + 30010fe: c31c sw a5,0(a4) + p->EFLASH_CMD.BIT.cmd_start = BASE_CFG_SET; + 3001100: fe842703 lw a4,-24(s0) + 3001104: 431c lw a5,0(a4) + 3001106: 0017e793 ori a5,a5,1 + 300110a: c31c sw a5,0(a4) + + while (p->EFLASH_CMD.BIT.cmd_start) { + 300110c: 0001 nop + 300110e: fe842783 lw a5,-24(s0) + 3001112: 439c lw a5,0(a5) + 3001114: 8b85 andi a5,a5,1 + 3001116: 9f81 uxtb a5 + 3001118: fbfd bnez a5,300110e + ; + } + while (p->EFLASH_CMD.BIT.exec_state) { + 300111a: 0001 nop + 300111c: fe842783 lw a5,-24(s0) + 3001120: 439c lw a5,0(a5) + 3001122: 8399 srli a5,a5,0x6 + 3001124: 8b8d andi a5,a5,3 + 3001126: 9f81 uxtb a5 + 3001128: fbf5 bnez a5,300111c + ; + } + /* read error, clear interrupt and return */ + if (FOTP_CheckReadStatus(p) != BASE_STATUS_OK) { + 300112a: fe842503 lw a0,-24(s0) + 300112e: 3da5 jal ra,3000fa6 + 3001130: 87aa mv a5,a0 + 3001132: c399 beqz a5,3001138 + return BASE_STATUS_ERROR; + 3001134: 4785 li a5,1 + 3001136: a0b1 j 3001182 + } + /* Read data from FIFO to buffer */ + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001138: fe042623 sw zero,-20(s0) + 300113c: a00d j 300115e + buf->data[i] = p->FLASH_RDATA; + 300113e: fe842783 lw a5,-24(s0) + 3001142: 6007a703 lw a4,1536(a5) # 10000600 + 3001146: fd442683 lw a3,-44(s0) + 300114a: fec42783 lw a5,-20(s0) + 300114e: 078a slli a5,a5,0x2 + 3001150: 97b6 add a5,a5,a3 + 3001152: c398 sw a4,0(a5) + for (unsigned int i = 0; i < sizeof(buf->data) / sizeof(buf->data[0]); ++i) { + 3001154: fec42783 lw a5,-20(s0) + 3001158: 0785 addi a5,a5,1 + 300115a: fef42623 sw a5,-20(s0) + 300115e: fec42703 lw a4,-20(s0) + 3001162: 478d li a5,3 + 3001164: fce7fde3 bgeu a5,a4,300113e + } + p->INT_CLEAR.BIT.int_clr_finish = BASE_CFG_SET; + 3001168: fe842703 lw a4,-24(s0) + 300116c: 10c72783 lw a5,268(a4) + 3001170: 0107e793 ori a5,a5,16 + 3001174: 10f72623 sw a5,268(a4) + p->MAGIC_LOCK = FLASH_KEY_REGISTER_LOCK_VALUE; + 3001178: fe842783 lw a5,-24(s0) + 300117c: 2007a023 sw zero,512(a5) + return BASE_STATUS_OK; + 3001180: 4781 li a5,0 + 3001182: 853e mv a0,a5 + 3001184: 50b2 lw ra,44(sp) + 3001186: 5422 lw s0,40(sp) + 3001188: 6145 addi sp,sp,48 + 300118a: 8082 ret + +0300118c : + * @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) +{ + 300118c: 7179 addi sp,sp,-48 + 300118e: d622 sw s0,44(sp) + 3001190: 1800 addi s0,sp,48 + 3001192: fca42e23 sw a0,-36(s0) + unsigned int i; + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 3001196: fe042623 sw zero,-20(s0) + 300119a: a081 j 30011da + if (baseAddr == g_crgIpMatch[i].ipBaseAddr) { + 300119c: 0300f7b7 lui a5,0x300f + 30011a0: de878713 addi a4,a5,-536 # 300ede8 + 30011a4: fec42683 lw a3,-20(s0) + 30011a8: 47b1 li a5,12 + 30011aa: 02f687b3 mul a5,a3,a5 + 30011ae: 97ba add a5,a5,a4 + 30011b0: 439c lw a5,0(a5) + 30011b2: fdc42703 lw a4,-36(s0) + 30011b6: 00f71d63 bne a4,a5,30011d0 + return (CHIP_CrgIpMatchInfo *)&g_crgIpMatch[i]; + 30011ba: fec42703 lw a4,-20(s0) + 30011be: 47b1 li a5,12 + 30011c0: 02f70733 mul a4,a4,a5 + 30011c4: 0300f7b7 lui a5,0x300f + 30011c8: de878793 addi a5,a5,-536 # 300ede8 + 30011cc: 97ba add a5,a5,a4 + 30011ce: a829 j 30011e8 + for (i = 0; i < sizeof(g_crgIpMatch) / sizeof(g_crgIpMatch[0]); ++i) { + 30011d0: fec42783 lw a5,-20(s0) + 30011d4: 0785 addi a5,a5,1 + 30011d6: fef42623 sw a5,-20(s0) + 30011da: fec42703 lw a4,-20(s0) + 30011de: 02d00793 li a5,45 + 30011e2: fae7fde3 bgeu a5,a4,300119c + } + } + return (CHIP_CrgIpMatchInfo *)0; /* The base address does not match, return 0. */ + 30011e6: 4781 li a5,0 +} + 30011e8: 853e mv a0,a5 + 30011ea: 5432 lw s0,44(sp) + 30011ec: 6145 addi sp,sp,48 + 30011ee: 8082 ret + +030011f0 : + * @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) +{ + 30011f0: 1101 addi sp,sp,-32 + 30011f2: ce22 sw s0,28(sp) + 30011f4: 1000 addi s0,sp,32 + 30011f6: fea42623 sw a0,-20(s0) + 30011fa: feb42423 sw a1,-24(s0) + /* Use only if the user apllication is not defined. */ + BASE_FUNC_UNUSED(file); + BASE_FUNC_UNUSED(line); + 30011fe: 0001 nop + 3001200: 4472 lw s0,28(sp) + 3001202: 6105 addi sp,sp,32 + 3001204: 8082 ret + +03001206 : + * @brief Get the systick + * @param None + * @retval The SysTick Value + */ +static inline unsigned int DCL_SYSTICK_GetTick(void) +{ + 3001206: 1141 addi sp,sp,-16 + 3001208: c622 sw s0,12(sp) + 300120a: 0800 addi s0,sp,16 + return SYSTICK->MTIME; /* Systick value(Lower 32bit register) */ + 300120c: 143807b7 lui a5,0x14380 + 3001210: 479c lw a5,8(a5) +} + 3001212: 853e mv a0,a5 + 3001214: 4432 lw s0,12(sp) + 3001216: 0141 addi sp,sp,16 + 3001218: 8082 ret + +0300121a : + * @brief Delay number of us. + * @param us The number of us to delay. + * @retval None. + */ +void BASE_FUNC_DelayUs(unsigned int us) +{ + 300121a: 7179 addi sp,sp,-48 + 300121c: d606 sw ra,44(sp) + 300121e: d422 sw s0,40(sp) + 3001220: 1800 addi s0,sp,48 + 3001222: fca42e23 sw a0,-36(s0) + unsigned int preTick = DCL_SYSTICK_GetTick(); + 3001226: 37c5 jal ra,3001206 + 3001228: fea42623 sw a0,-20(s0) + unsigned int tickInUs = (SYSTICK_GetCRGHZ() / CRG_FREQ_1MHz) * us; + 300122c: 3bb9 jal ra,3000f8a + 300122e: 872a mv a4,a0 + 3001230: 000f47b7 lui a5,0xf4 + 3001234: 24078793 addi a5,a5,576 # f4240 + 3001238: 02f757b3 divu a5,a4,a5 + 300123c: fdc42703 lw a4,-36(s0) + 3001240: 02f707b3 mul a5,a4,a5 + 3001244: fef42423 sw a5,-24(s0) + unsigned int curTick; + unsigned int delta; + + /* Wait until the delta is greater than tickInUs */ + do { + curTick = DCL_SYSTICK_GetTick(); + 3001248: 3f7d jal ra,3001206 + 300124a: fea42223 sw a0,-28(s0) + delta = (curTick >= preTick) ? curTick - preTick : SYSTICK_MAX_VALUE - preTick + curTick + 1; + 300124e: fe442703 lw a4,-28(s0) + 3001252: fec42783 lw a5,-20(s0) + 3001256: 40f707b3 sub a5,a4,a5 + 300125a: fef42023 sw a5,-32(s0) + } while (delta < tickInUs); + 300125e: fe042703 lw a4,-32(s0) + 3001262: fe842783 lw a5,-24(s0) + 3001266: fef761e3 bltu a4,a5,3001248 +} + 300126a: 0001 nop + 300126c: 50b2 lw ra,44(sp) + 300126e: 5422 lw s0,40(sp) + 3001270: 6145 addi sp,sp,48 + 3001272: 8082 ret + +03001274 : + * @brief Delay number of ms. + * @param ms The number of ms to delay. + * @retval None. + */ +void BASE_FUNC_DelayMs(unsigned int ms) +{ + 3001274: 7179 addi sp,sp,-48 + 3001276: d606 sw ra,44(sp) + 3001278: d422 sw s0,40(sp) + 300127a: 1800 addi s0,sp,48 + 300127c: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < ms; ++i) { + 3001280: fe042623 sw zero,-20(s0) + 3001284: a809 j 3001296 + BASE_FUNC_DelayUs(BASE_DEFINE_DELAY_US_IN_MS); + 3001286: 3e800513 li a0,1000 + 300128a: 3f41 jal ra,300121a + for (unsigned int i = 0; i < ms; ++i) { + 300128c: fec42783 lw a5,-20(s0) + 3001290: 0785 addi a5,a5,1 + 3001292: fef42623 sw a5,-20(s0) + 3001296: fec42703 lw a4,-20(s0) + 300129a: fdc42783 lw a5,-36(s0) + 300129e: fef764e3 bltu a4,a5,3001286 + } +} + 30012a2: 0001 nop + 30012a4: 50b2 lw ra,44(sp) + 30012a6: 5422 lw s0,40(sp) + 30012a8: 6145 addi sp,sp,48 + 30012aa: 8082 ret + +030012ac : + * @brief Delay number of seconds. + * @param seconds The number of seconds to delay. + * @retval None. + */ +void BASE_FUNC_DelaySeconds(unsigned int seconds) +{ + 30012ac: 7179 addi sp,sp,-48 + 30012ae: d606 sw ra,44(sp) + 30012b0: d422 sw s0,40(sp) + 30012b2: 1800 addi s0,sp,48 + 30012b4: fca42e23 sw a0,-36(s0) + for (unsigned int i = 0; i < seconds; ++i) { + 30012b8: fe042623 sw zero,-20(s0) + 30012bc: a809 j 30012ce + BASE_FUNC_DelayMs(BASE_DEFINE_DELAY_MS_IN_SEC); + 30012be: 3e800513 li a0,1000 + 30012c2: 3f4d jal ra,3001274 + for (unsigned int i = 0; i < seconds; ++i) { + 30012c4: fec42783 lw a5,-20(s0) + 30012c8: 0785 addi a5,a5,1 + 30012ca: fef42623 sw a5,-20(s0) + 30012ce: fec42703 lw a4,-20(s0) + 30012d2: fdc42783 lw a5,-36(s0) + 30012d6: fef764e3 bltu a4,a5,30012be + } +} + 30012da: 0001 nop + 30012dc: 50b2 lw ra,44(sp) + 30012de: 5422 lw s0,40(sp) + 30012e0: 6145 addi sp,sp,48 + 30012e2: 8082 ret + +030012e4 : + * @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) +{ + 30012e4: 1101 addi sp,sp,-32 + 30012e6: ce06 sw ra,28(sp) + 30012e8: cc22 sw s0,24(sp) + 30012ea: 1000 addi s0,sp,32 + 30012ec: fea42623 sw a0,-20(s0) + 30012f0: feb42423 sw a1,-24(s0) + switch (units) { + 30012f4: fe842783 lw a5,-24(s0) + 30012f8: 3e800713 li a4,1000 + 30012fc: 02e78063 beq a5,a4,300131c + 3001300: 000f4737 lui a4,0xf4 + 3001304: 24070713 addi a4,a4,576 # f4240 + 3001308: 00e78e63 beq a5,a4,3001324 + 300130c: 4705 li a4,1 + 300130e: 00e78363 beq a5,a4,3001314 + break; + case BASE_DEFINE_DELAY_MICROSECS: + BASE_FUNC_DelayUs(delay); + break; + default: + break; + 3001312: a829 j 300132c + BASE_FUNC_DelaySeconds(delay); + 3001314: fec42503 lw a0,-20(s0) + 3001318: 3f51 jal ra,30012ac + break; + 300131a: a809 j 300132c + BASE_FUNC_DelayMs(delay); + 300131c: fec42503 lw a0,-20(s0) + 3001320: 3f91 jal ra,3001274 + break; + 3001322: a029 j 300132c + BASE_FUNC_DelayUs(delay); + 3001324: fec42503 lw a0,-20(s0) + 3001328: 3dcd jal ra,300121a + break; + 300132a: 0001 nop + } + return; + 300132c: 0001 nop + 300132e: 40f2 lw ra,28(sp) + 3001330: 4462 lw s0,24(sp) + 3001332: 6105 addi sp,sp,32 + 3001334: 8082 ret + +03001336 : + * @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) +{ + 3001336: 1101 addi sp,sp,-32 + 3001338: ce22 sw s0,28(sp) + 300133a: 1000 addi s0,sp,32 + 300133c: fea42623 sw a0,-20(s0) + asm volatile("fence"); + 3001340: 0ff0000f fence + WRITE_CUSTOM_CSR_VAL(LOCIPCLR, irqNum); + 3001344: fec42783 lw a5,-20(s0) + 3001348: 82be mv t0,a5 + 300134a: bf029073 csrw 0xbf0,t0 +} + 300134e: 0001 nop + 3001350: 4472 lw s0,28(sp) + 3001352: 6105 addi sp,sp,32 + 3001354: 8082 ret + +03001356 : + * @brief Exception/Interrupt Handler Entry. + * @param irqNum external interrupt number. + * @retval None + */ +void InterruptEntry(unsigned int irqNum) +{ + 3001356: 1101 addi sp,sp,-32 + 3001358: ce06 sw ra,28(sp) + 300135a: cc22 sw s0,24(sp) + 300135c: 1000 addi s0,sp,32 + 300135e: fea42623 sw a0,-20(s0) + g_irqCallbackFunc[irqNum].pfnHandler(g_irqCallbackFunc[irqNum].param); + 3001362: f1818713 addi a4,gp,-232 # 400054c + 3001366: fec42783 lw a5,-20(s0) + 300136a: 078e slli a5,a5,0x3 + 300136c: 97ba add a5,a5,a4 + 300136e: 4394 lw a3,0(a5) + 3001370: f1818713 addi a4,gp,-232 # 400054c + 3001374: fec42783 lw a5,-20(s0) + 3001378: 078e slli a5,a5,0x3 + 300137a: 97ba add a5,a5,a4 + 300137c: 43dc lw a5,4(a5) + 300137e: 853e mv a0,a5 + 3001380: 9682 jalr a3 + IRQ_ClearN(irqNum); + 3001382: fec42503 lw a0,-20(s0) + 3001386: 3f45 jal ra,3001336 +} + 3001388: 0001 nop + 300138a: 40f2 lw ra,28(sp) + 300138c: 4462 lw s0,24(sp) + 300138e: 6105 addi sp,sp,32 + 3001390: 8082 ret + +03001392 : + * @brief Irq initialization. + * @param none. + * @retval None + */ +void IRQ_Init(void) +{ + 3001392: 1101 addi sp,sp,-32 + 3001394: ce22 sw s0,28(sp) + 3001396: 1000 addi s0,sp,32 + unsigned int index; + + for (index = 0; index < IRQ_MAX; index++) { + 3001398: fe042623 sw zero,-20(s0) + 300139c: a80d j 30013ce + g_irqCallbackFunc[index].pfnHandler = IRQ_DummyHandler; + 300139e: f1818713 addi a4,gp,-232 # 400054c + 30013a2: fec42783 lw a5,-20(s0) + 30013a6: 078e slli a5,a5,0x3 + 30013a8: 97ba add a5,a5,a4 + 30013aa: 03002737 lui a4,0x3002 + 30013ae: c2670713 addi a4,a4,-986 # 3001c26 + 30013b2: c398 sw a4,0(a5) + g_irqCallbackFunc[index].param = NULL; + 30013b4: f1818713 addi a4,gp,-232 # 400054c + 30013b8: fec42783 lw a5,-20(s0) + 30013bc: 078e slli a5,a5,0x3 + 30013be: 97ba add a5,a5,a4 + 30013c0: 0007a223 sw zero,4(a5) + for (index = 0; index < IRQ_MAX; index++) { + 30013c4: fec42783 lw a5,-20(s0) + 30013c8: 0785 addi a5,a5,1 + 30013ca: fef42623 sw a5,-20(s0) + 30013ce: fec42703 lw a4,-20(s0) + 30013d2: 07200793 li a5,114 + 30013d6: fce7f4e3 bgeu a5,a4,300139e + } +} + 30013da: 0001 nop + 30013dc: 4472 lw s0,28(sp) + 30013de: 6105 addi sp,sp,32 + 30013e0: 8082 ret + +030013e2 : + * @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) +{ + 30013e2: 1101 addi sp,sp,-32 + 30013e4: ce06 sw ra,28(sp) + 30013e6: cc22 sw s0,24(sp) + 30013e8: 1000 addi s0,sp,32 + 30013ea: fea42623 sw a0,-20(s0) + 30013ee: feb42423 sw a1,-24(s0) + 30013f2: fec42223 sw a2,-28(s0) + INTERRUPT_ASSERT_PARAM(func != NULL); + 30013f6: fe842783 lw a5,-24(s0) + 30013fa: eb89 bnez a5,300140c + 30013fc: 06300593 li a1,99 + 3001400: 0300f7b7 lui a5,0x300f + 3001404: 01078513 addi a0,a5,16 # 300f010 + 3001408: 33e5 jal ra,30011f0 + 300140a: a001 j 300140a + INTERRUPT_PARAM_CHECK_WITH_RET(irqNum < IRQ_MAX, IRQ_ERRNO_NUM_INVALID); + 300140c: fec42703 lw a4,-20(s0) + 3001410: 07200793 li a5,114 + 3001414: 00e7fb63 bgeu a5,a4,300142a + 3001418: 06400593 li a1,100 + 300141c: 0300f7b7 lui a5,0x300f + 3001420: 01078513 addi a0,a5,16 # 300f010 + 3001424: 33f1 jal ra,30011f0 + 3001426: 4789 li a5,2 + 3001428: a80d j 300145a + + if (g_irqCallbackFunc[irqNum].pfnHandler != IRQ_DummyHandler) { + 300142a: f1818713 addi a4,gp,-232 # 400054c + 300142e: fec42783 lw a5,-20(s0) + 3001432: 078e slli a5,a5,0x3 + 3001434: 97ba add a5,a5,a4 + 3001436: 4398 lw a4,0(a5) + 3001438: 030027b7 lui a5,0x3002 + 300143c: c2678793 addi a5,a5,-986 # 3001c26 + 3001440: 00f70463 beq a4,a5,3001448 + return IRQ_ERRNO_ALREADY_CREATED; + 3001444: 478d li a5,3 + 3001446: a811 j 300145a + } + IRQ_SetCallBack(irqNum, func, arg); + 3001448: fe442603 lw a2,-28(s0) + 300144c: fe842583 lw a1,-24(s0) + 3001450: fec42503 lw a0,-20(s0) + 3001454: 7e4000ef jal ra,3001c38 + return BASE_STATUS_OK; + 3001458: 4781 li a5,0 +} + 300145a: 853e mv a0,a5 + 300145c: 40f2 lw ra,28(sp) + 300145e: 4462 lw s0,24(sp) + 3001460: 6105 addi sp,sp,32 + 3001462: 8082 ret + +03001464 : + * @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) +{ + 3001464: 7139 addi sp,sp,-64 + 3001466: de06 sw ra,60(sp) + 3001468: dc22 sw s0,56(sp) + 300146a: 0080 addi s0,sp,64 + 300146c: 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); + 3001470: fcc42703 lw a4,-52(s0) + 3001474: 47e5 li a5,25 + 3001476: 00e7f863 bgeu a5,a4,3001486 + 300147a: fcc42703 lw a4,-52(s0) + 300147e: 07200793 li a5,114 + 3001482: 00e7fb63 bgeu a5,a4,3001498 + 3001486: 0c300593 li a1,195 + 300148a: 0300f7b7 lui a5,0x300f + 300148e: 01078513 addi a0,a5,16 # 300f010 + 3001492: 3bb9 jal ra,30011f0 + 3001494: 4789 li a5,2 + 3001496: a8cd j 3001588 + /* 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) { + 3001498: fcc42703 lw a4,-52(s0) + 300149c: 47fd li a5,31 + 300149e: 02e7e063 bltu a5,a4,30014be + irqOrder = 1U << irqNum; + 30014a2: 4705 li a4,1 + 30014a4: fcc42783 lw a5,-52(s0) + 30014a8: 00f717b3 sll a5,a4,a5 + 30014ac: fef42623 sw a5,-20(s0) + SET_CSR(mie, irqOrder); + 30014b0: fec42783 lw a5,-20(s0) + 30014b4: 3047a7f3 csrrs a5,mie,a5 + 30014b8: fcf42c23 sw a5,-40(s0) + 30014bc: a0e9 j 3001586 + } else if (irqNum < IRQ_LOCIEN1_OFFSET) { + 30014be: fcc42703 lw a4,-52(s0) + 30014c2: 03f00793 li a5,63 + 30014c6: 02e7ef63 bltu a5,a4,3001504 + irqOrder = irqNum - IRQ_MIE_TOTAL_CNT; + 30014ca: fcc42783 lw a5,-52(s0) + 30014ce: 1781 addi a5,a5,-32 + 30014d0: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN0); + 30014d4: be0027f3 csrr a5,0xbe0 + 30014d8: fcf42e23 sw a5,-36(s0) + 30014dc: fdc42783 lw a5,-36(s0) + 30014e0: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 30014e4: 4705 li a4,1 + 30014e6: fec42783 lw a5,-20(s0) + 30014ea: 00f717b3 sll a5,a4,a5 + 30014ee: fe442703 lw a4,-28(s0) + 30014f2: 8fd9 or a5,a5,a4 + 30014f4: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN0, locienVal); + 30014f8: fe442783 lw a5,-28(s0) + 30014fc: 82be mv t0,a5 + 30014fe: be029073 csrw 0xbe0,t0 + 3001502: a051 j 3001586 + } else if (irqNum < IRQ_LOCIEN2_OFFSET) { + 3001504: fcc42703 lw a4,-52(s0) + 3001508: 05f00793 li a5,95 + 300150c: 04e7e063 bltu a5,a4,300154c + irqOrder = irqNum - IRQ_LOCIEN1_OFFSET; + 3001510: fcc42783 lw a5,-52(s0) + 3001514: fc078793 addi a5,a5,-64 + 3001518: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN1); + 300151c: be1027f3 csrr a5,0xbe1 + 3001520: fef42023 sw a5,-32(s0) + 3001524: fe042783 lw a5,-32(s0) + 3001528: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 300152c: 4705 li a4,1 + 300152e: fec42783 lw a5,-20(s0) + 3001532: 00f717b3 sll a5,a4,a5 + 3001536: fe442703 lw a4,-28(s0) + 300153a: 8fd9 or a5,a5,a4 + 300153c: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN1, locienVal); + 3001540: fe442783 lw a5,-28(s0) + 3001544: 82be mv t0,a5 + 3001546: be129073 csrw 0xbe1,t0 + 300154a: a835 j 3001586 + } else { + irqOrder = irqNum - IRQ_LOCIEN2_OFFSET; + 300154c: fcc42783 lw a5,-52(s0) + 3001550: fa078793 addi a5,a5,-96 + 3001554: fef42623 sw a5,-20(s0) + locienVal = READ_CUSTOM_CSR(LOCIEN2); + 3001558: be2027f3 csrr a5,0xbe2 + 300155c: fef42423 sw a5,-24(s0) + 3001560: fe842783 lw a5,-24(s0) + 3001564: fef42223 sw a5,-28(s0) + locienVal |= (1U << irqOrder); + 3001568: 4705 li a4,1 + 300156a: fec42783 lw a5,-20(s0) + 300156e: 00f717b3 sll a5,a4,a5 + 3001572: fe442703 lw a4,-28(s0) + 3001576: 8fd9 or a5,a5,a4 + 3001578: fef42223 sw a5,-28(s0) + WRITE_CUSTOM_CSR_VAL(LOCIEN2, locienVal); + 300157c: fe442783 lw a5,-28(s0) + 3001580: 82be mv t0,a5 + 3001582: be229073 csrw 0xbe2,t0 + } + + RISCV_PRIV_MODE_SWITCH(priv); + + return BASE_STATUS_OK; + 3001586: 4781 li a5,0 +} + 3001588: 853e mv a0,a5 + 300158a: 50f2 lw ra,60(sp) + 300158c: 5462 lw s0,56(sp) + 300158e: 6121 addi sp,sp,64 + 3001590: 8082 ret + +03001592 : + * @param context. + * @note The actual code is generated by IDE + * @retval None. + */ +__weak void SysErrPrint(const SyserrContext *context) +{ + 3001592: 1101 addi sp,sp,-32 + 3001594: ce22 sw s0,28(sp) + 3001596: 1000 addi s0,sp,32 + 3001598: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(context); +} + 300159c: 0001 nop + 300159e: 4472 lw s0,28(sp) + 30015a0: 6105 addi sp,sp,32 + 30015a2: 8082 ret + +030015a4 : + * @brief System error completion processing + * @param None. + * @retval None. + */ +static void SysErrFinish(void) +{ + 30015a4: 1141 addi sp,sp,-16 + 30015a6: c622 sw s0,12(sp) + 30015a8: 0800 addi s0,sp,16 +} + 30015aa: 0001 nop + 30015ac: 4432 lw s0,12(sp) + 30015ae: 0141 addi sp,sp,16 + 30015b0: 8082 ret + +030015b2 : + * @brief Exception Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrExcEntry(const SyserrContext *context) +{ + 30015b2: 1101 addi sp,sp,-32 + 30015b4: ce06 sw ra,28(sp) + 30015b6: cc22 sw s0,24(sp) + 30015b8: 1000 addi s0,sp,32 + 30015ba: fea42623 sw a0,-20(s0) + SysErrPrint(context); + 30015be: fec42503 lw a0,-20(s0) + 30015c2: 3fc1 jal ra,3001592 + SysErrFinish(); + 30015c4: 37c5 jal ra,30015a4 +} + 30015c6: 0001 nop + 30015c8: 40f2 lw ra,28(sp) + 30015ca: 4462 lw s0,24(sp) + 30015cc: 6105 addi sp,sp,32 + 30015ce: 8082 ret + +030015d0 : + * @brief NMI Interrupt Handler Entry. + * @param context error context. + * @retval None. + */ +void SysErrNmiEntry(const SyserrContext *context) +{ + 30015d0: 1101 addi sp,sp,-32 + 30015d2: ce06 sw ra,28(sp) + 30015d4: cc22 sw s0,24(sp) + 30015d6: 1000 addi s0,sp,32 + 30015d8: fea42623 sw a0,-20(s0) + INTERRUPT_ASSERT_PARAM(context != NULL); + 30015dc: fec42783 lw a5,-20(s0) + 30015e0: eb89 bnez a5,30015f2 + 30015e2: 12d00593 li a1,301 + 30015e6: 0300f7b7 lui a5,0x300f + 30015ea: 01078513 addi a0,a5,16 # 300f010 + 30015ee: 3109 jal ra,30011f0 + 30015f0: a001 j 30015f0 + SysErrPrint(context); + 30015f2: fec42503 lw a0,-20(s0) + 30015f6: 3f71 jal ra,3001592 + SysErrFinish(); + 30015f8: 3775 jal ra,30015a4 +} + 30015fa: 0001 nop + 30015fc: 40f2 lw ra,28(sp) + 30015fe: 4462 lw s0,24(sp) + 3001600: 6105 addi sp,sp,32 + 3001602: 8082 ret + +03001604 : + * @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) +{ + 3001604: 711d addi sp,sp,-96 + 3001606: cea2 sw s0,92(sp) + 3001608: 1080 addi s0,sp,96 + 300160a: faa42623 sw a0,-84(s0) + 300160e: fab42423 sw a1,-88(s0) + 3001612: fac42223 sw a2,-92(s0) + switch (intNum) { + 3001616: fac42783 lw a5,-84(s0) + 300161a: 17e1 addi a5,a5,-8 + 300161c: 471d li a4,7 + 300161e: 2af76363 bltu a4,a5,30018c4 + 3001622: 00279713 slli a4,a5,0x2 + 3001626: 0300f7b7 lui a5,0x300f + 300162a: 03078793 addi a5,a5,48 # 300f030 + 300162e: 97ba add a5,a5,a4 + 3001630: 439c lw a5,0(a5) + 3001632: 8782 jr a5 + case 8: /* GROUP8 */ + SET_LOCAL_INTER_NUM_PRI(8, interPriNum, prior); + 3001634: bc8027f3 csrr a5,0xbc8 + 3001638: faf42a23 sw a5,-76(s0) + 300163c: fb442783 lw a5,-76(s0) + 3001640: faf42823 sw a5,-80(s0) + 3001644: fa842783 lw a5,-88(s0) + 3001648: 078a slli a5,a5,0x2 + 300164a: 8bf1 andi a5,a5,28 + 300164c: 473d li a4,15 + 300164e: 00f717b3 sll a5,a4,a5 + 3001652: fff7c793 not a5,a5 + 3001656: fb042703 lw a4,-80(s0) + 300165a: 8ff9 and a5,a5,a4 + 300165c: faf42823 sw a5,-80(s0) + 3001660: fa842783 lw a5,-88(s0) + 3001664: 078a slli a5,a5,0x2 + 3001666: 8bf1 andi a5,a5,28 + 3001668: fa442703 lw a4,-92(s0) + 300166c: 00f717b3 sll a5,a4,a5 + 3001670: fb042703 lw a4,-80(s0) + 3001674: 8fd9 or a5,a5,a4 + 3001676: faf42823 sw a5,-80(s0) + 300167a: fb042783 lw a5,-80(s0) + 300167e: 82be mv t0,a5 + 3001680: bc829073 csrw 0xbc8,t0 + break; + 3001684: a489 j 30018c6 + case 9: /* GROUP9 */ + SET_LOCAL_INTER_NUM_PRI(9, interPriNum, prior); + 3001686: bc9027f3 csrr a5,0xbc9 + 300168a: faf42e23 sw a5,-68(s0) + 300168e: fbc42783 lw a5,-68(s0) + 3001692: faf42c23 sw a5,-72(s0) + 3001696: fa842783 lw a5,-88(s0) + 300169a: 078a slli a5,a5,0x2 + 300169c: 8bf1 andi a5,a5,28 + 300169e: 473d li a4,15 + 30016a0: 00f717b3 sll a5,a4,a5 + 30016a4: fff7c793 not a5,a5 + 30016a8: fb842703 lw a4,-72(s0) + 30016ac: 8ff9 and a5,a5,a4 + 30016ae: faf42c23 sw a5,-72(s0) + 30016b2: fa842783 lw a5,-88(s0) + 30016b6: 078a slli a5,a5,0x2 + 30016b8: 8bf1 andi a5,a5,28 + 30016ba: fa442703 lw a4,-92(s0) + 30016be: 00f717b3 sll a5,a4,a5 + 30016c2: fb842703 lw a4,-72(s0) + 30016c6: 8fd9 or a5,a5,a4 + 30016c8: faf42c23 sw a5,-72(s0) + 30016cc: fb842783 lw a5,-72(s0) + 30016d0: 82be mv t0,a5 + 30016d2: bc929073 csrw 0xbc9,t0 + break; + 30016d6: aac5 j 30018c6 + case 10: /* GROUP10 */ + SET_LOCAL_INTER_NUM_PRI(10, interPriNum, prior); + 30016d8: bca027f3 csrr a5,0xbca + 30016dc: fcf42223 sw a5,-60(s0) + 30016e0: fc442783 lw a5,-60(s0) + 30016e4: fcf42023 sw a5,-64(s0) + 30016e8: fa842783 lw a5,-88(s0) + 30016ec: 078a slli a5,a5,0x2 + 30016ee: 8bf1 andi a5,a5,28 + 30016f0: 473d li a4,15 + 30016f2: 00f717b3 sll a5,a4,a5 + 30016f6: fff7c793 not a5,a5 + 30016fa: fc042703 lw a4,-64(s0) + 30016fe: 8ff9 and a5,a5,a4 + 3001700: fcf42023 sw a5,-64(s0) + 3001704: fa842783 lw a5,-88(s0) + 3001708: 078a slli a5,a5,0x2 + 300170a: 8bf1 andi a5,a5,28 + 300170c: fa442703 lw a4,-92(s0) + 3001710: 00f717b3 sll a5,a4,a5 + 3001714: fc042703 lw a4,-64(s0) + 3001718: 8fd9 or a5,a5,a4 + 300171a: fcf42023 sw a5,-64(s0) + 300171e: fc042783 lw a5,-64(s0) + 3001722: 82be mv t0,a5 + 3001724: bca29073 csrw 0xbca,t0 + break; + 3001728: aa79 j 30018c6 + case 11: /* GROUP11 */ + SET_LOCAL_INTER_NUM_PRI(11, interPriNum, prior); + 300172a: bcb027f3 csrr a5,0xbcb + 300172e: fcf42623 sw a5,-52(s0) + 3001732: fcc42783 lw a5,-52(s0) + 3001736: fcf42423 sw a5,-56(s0) + 300173a: fa842783 lw a5,-88(s0) + 300173e: 078a slli a5,a5,0x2 + 3001740: 8bf1 andi a5,a5,28 + 3001742: 473d li a4,15 + 3001744: 00f717b3 sll a5,a4,a5 + 3001748: fff7c793 not a5,a5 + 300174c: fc842703 lw a4,-56(s0) + 3001750: 8ff9 and a5,a5,a4 + 3001752: fcf42423 sw a5,-56(s0) + 3001756: fa842783 lw a5,-88(s0) + 300175a: 078a slli a5,a5,0x2 + 300175c: 8bf1 andi a5,a5,28 + 300175e: fa442703 lw a4,-92(s0) + 3001762: 00f717b3 sll a5,a4,a5 + 3001766: fc842703 lw a4,-56(s0) + 300176a: 8fd9 or a5,a5,a4 + 300176c: fcf42423 sw a5,-56(s0) + 3001770: fc842783 lw a5,-56(s0) + 3001774: 82be mv t0,a5 + 3001776: bcb29073 csrw 0xbcb,t0 + break; + 300177a: a2b1 j 30018c6 + case 12: /* GROUP12 */ + SET_LOCAL_INTER_NUM_PRI(12, interPriNum, prior); + 300177c: bcc027f3 csrr a5,0xbcc + 3001780: fcf42a23 sw a5,-44(s0) + 3001784: fd442783 lw a5,-44(s0) + 3001788: fcf42823 sw a5,-48(s0) + 300178c: fa842783 lw a5,-88(s0) + 3001790: 078a slli a5,a5,0x2 + 3001792: 8bf1 andi a5,a5,28 + 3001794: 473d li a4,15 + 3001796: 00f717b3 sll a5,a4,a5 + 300179a: fff7c793 not a5,a5 + 300179e: fd042703 lw a4,-48(s0) + 30017a2: 8ff9 and a5,a5,a4 + 30017a4: fcf42823 sw a5,-48(s0) + 30017a8: fa842783 lw a5,-88(s0) + 30017ac: 078a slli a5,a5,0x2 + 30017ae: 8bf1 andi a5,a5,28 + 30017b0: fa442703 lw a4,-92(s0) + 30017b4: 00f717b3 sll a5,a4,a5 + 30017b8: fd042703 lw a4,-48(s0) + 30017bc: 8fd9 or a5,a5,a4 + 30017be: fcf42823 sw a5,-48(s0) + 30017c2: fd042783 lw a5,-48(s0) + 30017c6: 82be mv t0,a5 + 30017c8: bcc29073 csrw 0xbcc,t0 + break; + 30017cc: a8ed j 30018c6 + case 13: /* GROUP13 */ + SET_LOCAL_INTER_NUM_PRI(13, interPriNum, prior); + 30017ce: bcd027f3 csrr a5,0xbcd + 30017d2: fcf42e23 sw a5,-36(s0) + 30017d6: fdc42783 lw a5,-36(s0) + 30017da: fcf42c23 sw a5,-40(s0) + 30017de: fa842783 lw a5,-88(s0) + 30017e2: 078a slli a5,a5,0x2 + 30017e4: 8bf1 andi a5,a5,28 + 30017e6: 473d li a4,15 + 30017e8: 00f717b3 sll a5,a4,a5 + 30017ec: fff7c793 not a5,a5 + 30017f0: fd842703 lw a4,-40(s0) + 30017f4: 8ff9 and a5,a5,a4 + 30017f6: fcf42c23 sw a5,-40(s0) + 30017fa: fa842783 lw a5,-88(s0) + 30017fe: 078a slli a5,a5,0x2 + 3001800: 8bf1 andi a5,a5,28 + 3001802: fa442703 lw a4,-92(s0) + 3001806: 00f717b3 sll a5,a4,a5 + 300180a: fd842703 lw a4,-40(s0) + 300180e: 8fd9 or a5,a5,a4 + 3001810: fcf42c23 sw a5,-40(s0) + 3001814: fd842783 lw a5,-40(s0) + 3001818: 82be mv t0,a5 + 300181a: bcd29073 csrw 0xbcd,t0 + break; + 300181e: a065 j 30018c6 + case 14: /* GROUP14 */ + SET_LOCAL_INTER_NUM_PRI(14, interPriNum, prior); + 3001820: bce027f3 csrr a5,0xbce + 3001824: fef42223 sw a5,-28(s0) + 3001828: fe442783 lw a5,-28(s0) + 300182c: fef42023 sw a5,-32(s0) + 3001830: fa842783 lw a5,-88(s0) + 3001834: 078a slli a5,a5,0x2 + 3001836: 8bf1 andi a5,a5,28 + 3001838: 473d li a4,15 + 300183a: 00f717b3 sll a5,a4,a5 + 300183e: fff7c793 not a5,a5 + 3001842: fe042703 lw a4,-32(s0) + 3001846: 8ff9 and a5,a5,a4 + 3001848: fef42023 sw a5,-32(s0) + 300184c: fa842783 lw a5,-88(s0) + 3001850: 078a slli a5,a5,0x2 + 3001852: 8bf1 andi a5,a5,28 + 3001854: fa442703 lw a4,-92(s0) + 3001858: 00f717b3 sll a5,a4,a5 + 300185c: fe042703 lw a4,-32(s0) + 3001860: 8fd9 or a5,a5,a4 + 3001862: fef42023 sw a5,-32(s0) + 3001866: fe042783 lw a5,-32(s0) + 300186a: 82be mv t0,a5 + 300186c: bce29073 csrw 0xbce,t0 + break; + 3001870: a899 j 30018c6 + case 15: /* GROUP15 */ + SET_LOCAL_INTER_NUM_PRI(15, interPriNum, prior); + 3001872: bcf027f3 csrr a5,0xbcf + 3001876: fef42623 sw a5,-20(s0) + 300187a: fec42783 lw a5,-20(s0) + 300187e: fef42423 sw a5,-24(s0) + 3001882: fa842783 lw a5,-88(s0) + 3001886: 078a slli a5,a5,0x2 + 3001888: 8bf1 andi a5,a5,28 + 300188a: 473d li a4,15 + 300188c: 00f717b3 sll a5,a4,a5 + 3001890: fff7c793 not a5,a5 + 3001894: fe842703 lw a4,-24(s0) + 3001898: 8ff9 and a5,a5,a4 + 300189a: fef42423 sw a5,-24(s0) + 300189e: fa842783 lw a5,-88(s0) + 30018a2: 078a slli a5,a5,0x2 + 30018a4: 8bf1 andi a5,a5,28 + 30018a6: fa442703 lw a4,-92(s0) + 30018aa: 00f717b3 sll a5,a4,a5 + 30018ae: fe842703 lw a4,-24(s0) + 30018b2: 8fd9 or a5,a5,a4 + 30018b4: fef42423 sw a5,-24(s0) + 30018b8: fe842783 lw a5,-24(s0) + 30018bc: 82be mv t0,a5 + 30018be: bcf29073 csrw 0xbcf,t0 + break; + 30018c2: a011 j 30018c6 + default: + break; + 30018c4: 0001 nop + } +} + 30018c6: 0001 nop + 30018c8: 4476 lw s0,92(sp) + 30018ca: 6125 addi sp,sp,96 + 30018cc: 8082 ret + +030018ce : + * @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) +{ + 30018ce: 7159 addi sp,sp,-112 + 30018d0: d686 sw ra,108(sp) + 30018d2: d4a2 sw s0,104(sp) + 30018d4: 1880 addi s0,sp,112 + 30018d6: f8a42e23 sw a0,-100(s0) + 30018da: 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); + 30018de: f9c42783 lw a5,-100(s0) + 30018e2: 838d srli a5,a5,0x3 + 30018e4: fef42623 sw a5,-20(s0) + switch (intNum) { + 30018e8: fec42703 lw a4,-20(s0) + 30018ec: 479d li a5,7 + 30018ee: 2ae7e563 bltu a5,a4,3001b98 + 30018f2: fec42783 lw a5,-20(s0) + 30018f6: 00279713 slli a4,a5,0x2 + 30018fa: 0300f7b7 lui a5,0x300f + 30018fe: 05078793 addi a5,a5,80 # 300f050 + 3001902: 97ba add a5,a5,a4 + 3001904: 439c lw a5,0(a5) + 3001906: 8782 jr a5 + case 0: /* GROUP0 */ + SET_LOCAL_INTER_NUM_PRI(0, interPriNum, prior); + 3001908: bc0027f3 csrr a5,0xbc0 + 300190c: faf42823 sw a5,-80(s0) + 3001910: fb042783 lw a5,-80(s0) + 3001914: faf42623 sw a5,-84(s0) + 3001918: f9c42783 lw a5,-100(s0) + 300191c: 078a slli a5,a5,0x2 + 300191e: 8bf1 andi a5,a5,28 + 3001920: 473d li a4,15 + 3001922: 00f717b3 sll a5,a4,a5 + 3001926: fff7c793 not a5,a5 + 300192a: fac42703 lw a4,-84(s0) + 300192e: 8ff9 and a5,a5,a4 + 3001930: faf42623 sw a5,-84(s0) + 3001934: f9c42783 lw a5,-100(s0) + 3001938: 078a slli a5,a5,0x2 + 300193a: 8bf1 andi a5,a5,28 + 300193c: f9842703 lw a4,-104(s0) + 3001940: 00f717b3 sll a5,a4,a5 + 3001944: fac42703 lw a4,-84(s0) + 3001948: 8fd9 or a5,a5,a4 + 300194a: faf42623 sw a5,-84(s0) + 300194e: fac42783 lw a5,-84(s0) + 3001952: 82be mv t0,a5 + 3001954: bc029073 csrw 0xbc0,t0 + break; + 3001958: ac81 j 3001ba8 + case 1: /* GROUP1 */ + SET_LOCAL_INTER_NUM_PRI(1, interPriNum, prior); + 300195a: bc1027f3 csrr a5,0xbc1 + 300195e: faf42c23 sw a5,-72(s0) + 3001962: fb842783 lw a5,-72(s0) + 3001966: faf42a23 sw a5,-76(s0) + 300196a: f9c42783 lw a5,-100(s0) + 300196e: 078a slli a5,a5,0x2 + 3001970: 8bf1 andi a5,a5,28 + 3001972: 473d li a4,15 + 3001974: 00f717b3 sll a5,a4,a5 + 3001978: fff7c793 not a5,a5 + 300197c: fb442703 lw a4,-76(s0) + 3001980: 8ff9 and a5,a5,a4 + 3001982: faf42a23 sw a5,-76(s0) + 3001986: f9c42783 lw a5,-100(s0) + 300198a: 078a slli a5,a5,0x2 + 300198c: 8bf1 andi a5,a5,28 + 300198e: f9842703 lw a4,-104(s0) + 3001992: 00f717b3 sll a5,a4,a5 + 3001996: fb442703 lw a4,-76(s0) + 300199a: 8fd9 or a5,a5,a4 + 300199c: faf42a23 sw a5,-76(s0) + 30019a0: fb442783 lw a5,-76(s0) + 30019a4: 82be mv t0,a5 + 30019a6: bc129073 csrw 0xbc1,t0 + break; + 30019aa: aafd j 3001ba8 + case 2: /* GROUP2 */ + SET_LOCAL_INTER_NUM_PRI(2, interPriNum, prior); + 30019ac: bc2027f3 csrr a5,0xbc2 + 30019b0: fcf42023 sw a5,-64(s0) + 30019b4: fc042783 lw a5,-64(s0) + 30019b8: faf42e23 sw a5,-68(s0) + 30019bc: f9c42783 lw a5,-100(s0) + 30019c0: 078a slli a5,a5,0x2 + 30019c2: 8bf1 andi a5,a5,28 + 30019c4: 473d li a4,15 + 30019c6: 00f717b3 sll a5,a4,a5 + 30019ca: fff7c793 not a5,a5 + 30019ce: fbc42703 lw a4,-68(s0) + 30019d2: 8ff9 and a5,a5,a4 + 30019d4: faf42e23 sw a5,-68(s0) + 30019d8: f9c42783 lw a5,-100(s0) + 30019dc: 078a slli a5,a5,0x2 + 30019de: 8bf1 andi a5,a5,28 + 30019e0: f9842703 lw a4,-104(s0) + 30019e4: 00f717b3 sll a5,a4,a5 + 30019e8: fbc42703 lw a4,-68(s0) + 30019ec: 8fd9 or a5,a5,a4 + 30019ee: faf42e23 sw a5,-68(s0) + 30019f2: fbc42783 lw a5,-68(s0) + 30019f6: 82be mv t0,a5 + 30019f8: bc229073 csrw 0xbc2,t0 + break; + 30019fc: a275 j 3001ba8 + case 3: /* GROUP3 */ + SET_LOCAL_INTER_NUM_PRI(3, interPriNum, prior); + 30019fe: bc3027f3 csrr a5,0xbc3 + 3001a02: fcf42423 sw a5,-56(s0) + 3001a06: fc842783 lw a5,-56(s0) + 3001a0a: fcf42223 sw a5,-60(s0) + 3001a0e: f9c42783 lw a5,-100(s0) + 3001a12: 078a slli a5,a5,0x2 + 3001a14: 8bf1 andi a5,a5,28 + 3001a16: 473d li a4,15 + 3001a18: 00f717b3 sll a5,a4,a5 + 3001a1c: fff7c793 not a5,a5 + 3001a20: fc442703 lw a4,-60(s0) + 3001a24: 8ff9 and a5,a5,a4 + 3001a26: fcf42223 sw a5,-60(s0) + 3001a2a: f9c42783 lw a5,-100(s0) + 3001a2e: 078a slli a5,a5,0x2 + 3001a30: 8bf1 andi a5,a5,28 + 3001a32: f9842703 lw a4,-104(s0) + 3001a36: 00f717b3 sll a5,a4,a5 + 3001a3a: fc442703 lw a4,-60(s0) + 3001a3e: 8fd9 or a5,a5,a4 + 3001a40: fcf42223 sw a5,-60(s0) + 3001a44: fc442783 lw a5,-60(s0) + 3001a48: 82be mv t0,a5 + 3001a4a: bc329073 csrw 0xbc3,t0 + break; + 3001a4e: aaa9 j 3001ba8 + case 4: /* GROUP4 */ + SET_LOCAL_INTER_NUM_PRI(4, interPriNum, prior); + 3001a50: bc4027f3 csrr a5,0xbc4 + 3001a54: fcf42823 sw a5,-48(s0) + 3001a58: fd042783 lw a5,-48(s0) + 3001a5c: fcf42623 sw a5,-52(s0) + 3001a60: f9c42783 lw a5,-100(s0) + 3001a64: 078a slli a5,a5,0x2 + 3001a66: 8bf1 andi a5,a5,28 + 3001a68: 473d li a4,15 + 3001a6a: 00f717b3 sll a5,a4,a5 + 3001a6e: fff7c793 not a5,a5 + 3001a72: fcc42703 lw a4,-52(s0) + 3001a76: 8ff9 and a5,a5,a4 + 3001a78: fcf42623 sw a5,-52(s0) + 3001a7c: f9c42783 lw a5,-100(s0) + 3001a80: 078a slli a5,a5,0x2 + 3001a82: 8bf1 andi a5,a5,28 + 3001a84: f9842703 lw a4,-104(s0) + 3001a88: 00f717b3 sll a5,a4,a5 + 3001a8c: fcc42703 lw a4,-52(s0) + 3001a90: 8fd9 or a5,a5,a4 + 3001a92: fcf42623 sw a5,-52(s0) + 3001a96: fcc42783 lw a5,-52(s0) + 3001a9a: 82be mv t0,a5 + 3001a9c: bc429073 csrw 0xbc4,t0 + break; + 3001aa0: a221 j 3001ba8 + case 5: /* GROUP5 */ + SET_LOCAL_INTER_NUM_PRI(5, interPriNum, prior); + 3001aa2: bc5027f3 csrr a5,0xbc5 + 3001aa6: fcf42c23 sw a5,-40(s0) + 3001aaa: fd842783 lw a5,-40(s0) + 3001aae: fcf42a23 sw a5,-44(s0) + 3001ab2: f9c42783 lw a5,-100(s0) + 3001ab6: 078a slli a5,a5,0x2 + 3001ab8: 8bf1 andi a5,a5,28 + 3001aba: 473d li a4,15 + 3001abc: 00f717b3 sll a5,a4,a5 + 3001ac0: fff7c793 not a5,a5 + 3001ac4: fd442703 lw a4,-44(s0) + 3001ac8: 8ff9 and a5,a5,a4 + 3001aca: fcf42a23 sw a5,-44(s0) + 3001ace: f9c42783 lw a5,-100(s0) + 3001ad2: 078a slli a5,a5,0x2 + 3001ad4: 8bf1 andi a5,a5,28 + 3001ad6: f9842703 lw a4,-104(s0) + 3001ada: 00f717b3 sll a5,a4,a5 + 3001ade: fd442703 lw a4,-44(s0) + 3001ae2: 8fd9 or a5,a5,a4 + 3001ae4: fcf42a23 sw a5,-44(s0) + 3001ae8: fd442783 lw a5,-44(s0) + 3001aec: 82be mv t0,a5 + 3001aee: bc529073 csrw 0xbc5,t0 + break; + 3001af2: a85d j 3001ba8 + case 6: /* GROUP6 */ + SET_LOCAL_INTER_NUM_PRI(6, interPriNum, prior); + 3001af4: bc6027f3 csrr a5,0xbc6 + 3001af8: fef42023 sw a5,-32(s0) + 3001afc: fe042783 lw a5,-32(s0) + 3001b00: fcf42e23 sw a5,-36(s0) + 3001b04: f9c42783 lw a5,-100(s0) + 3001b08: 078a slli a5,a5,0x2 + 3001b0a: 8bf1 andi a5,a5,28 + 3001b0c: 473d li a4,15 + 3001b0e: 00f717b3 sll a5,a4,a5 + 3001b12: fff7c793 not a5,a5 + 3001b16: fdc42703 lw a4,-36(s0) + 3001b1a: 8ff9 and a5,a5,a4 + 3001b1c: fcf42e23 sw a5,-36(s0) + 3001b20: f9c42783 lw a5,-100(s0) + 3001b24: 078a slli a5,a5,0x2 + 3001b26: 8bf1 andi a5,a5,28 + 3001b28: f9842703 lw a4,-104(s0) + 3001b2c: 00f717b3 sll a5,a4,a5 + 3001b30: fdc42703 lw a4,-36(s0) + 3001b34: 8fd9 or a5,a5,a4 + 3001b36: fcf42e23 sw a5,-36(s0) + 3001b3a: fdc42783 lw a5,-36(s0) + 3001b3e: 82be mv t0,a5 + 3001b40: bc629073 csrw 0xbc6,t0 + break; + 3001b44: a095 j 3001ba8 + case 7: /* GROUP7 */ + SET_LOCAL_INTER_NUM_PRI(7, interPriNum, prior); + 3001b46: bc7027f3 csrr a5,0xbc7 + 3001b4a: fef42423 sw a5,-24(s0) + 3001b4e: fe842783 lw a5,-24(s0) + 3001b52: fef42223 sw a5,-28(s0) + 3001b56: f9c42783 lw a5,-100(s0) + 3001b5a: 078a slli a5,a5,0x2 + 3001b5c: 8bf1 andi a5,a5,28 + 3001b5e: 473d li a4,15 + 3001b60: 00f717b3 sll a5,a4,a5 + 3001b64: fff7c793 not a5,a5 + 3001b68: fe442703 lw a4,-28(s0) + 3001b6c: 8ff9 and a5,a5,a4 + 3001b6e: fef42223 sw a5,-28(s0) + 3001b72: f9c42783 lw a5,-100(s0) + 3001b76: 078a slli a5,a5,0x2 + 3001b78: 8bf1 andi a5,a5,28 + 3001b7a: f9842703 lw a4,-104(s0) + 3001b7e: 00f717b3 sll a5,a4,a5 + 3001b82: fe442703 lw a4,-28(s0) + 3001b86: 8fd9 or a5,a5,a4 + 3001b88: fef42223 sw a5,-28(s0) + 3001b8c: fe442783 lw a5,-28(s0) + 3001b90: 82be mv t0,a5 + 3001b92: bc729073 csrw 0xbc7,t0 + break; + 3001b96: a809 j 3001ba8 + default: + SetLocalIntNumPri(intNum, interPriNum, prior); + 3001b98: f9842603 lw a2,-104(s0) + 3001b9c: f9c42583 lw a1,-100(s0) + 3001ba0: fec42503 lw a0,-20(s0) + 3001ba4: 3485 jal ra,3001604 + break; + 3001ba6: 0001 nop + } + RISCV_PRIV_MODE_SWITCH(priv); +} + 3001ba8: 0001 nop + 3001baa: 50b6 lw ra,108(sp) + 3001bac: 5426 lw s0,104(sp) + 3001bae: 6165 addi sp,sp,112 + 3001bb0: 8082 ret + +03001bb2 : + * @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) +{ + 3001bb2: 1101 addi sp,sp,-32 + 3001bb4: ce06 sw ra,28(sp) + 3001bb6: cc22 sw s0,24(sp) + 3001bb8: 1000 addi s0,sp,32 + 3001bba: fea42623 sw a0,-20(s0) + 3001bbe: feb42423 sw a1,-24(s0) + INTERRUPT_PARAM_CHECK_WITH_RET((irqNum >= IRQ_VECTOR_CNT && irqNum < IRQ_MAX), IRQ_ERRNO_NUM_INVALID); + 3001bc2: fec42703 lw a4,-20(s0) + 3001bc6: 47e5 li a5,25 + 3001bc8: 00e7f863 bgeu a5,a4,3001bd8 + 3001bcc: fec42703 lw a4,-20(s0) + 3001bd0: 07200793 li a5,114 + 3001bd4: 00e7fb63 bgeu a5,a4,3001bea + 3001bd8: 18c00593 li a1,396 + 3001bdc: 0300f7b7 lui a5,0x300f + 3001be0: 01078513 addi a0,a5,16 # 300f010 + 3001be4: 219d jal ra,300204a + 3001be6: 4789 li a5,2 + 3001be8: a815 j 3001c1c + INTERRUPT_PARAM_CHECK_WITH_RET((priority >= IRQ_PRIO_LOWEST && priority <= IRQ_PRIO_HIGHEST), \ + 3001bea: fe842783 lw a5,-24(s0) + 3001bee: c791 beqz a5,3001bfa + 3001bf0: fe842703 lw a4,-24(s0) + 3001bf4: 47bd li a5,15 + 3001bf6: 00e7fb63 bgeu a5,a4,3001c0c + 3001bfa: 18d00593 li a1,397 + 3001bfe: 0300f7b7 lui a5,0x300f + 3001c02: 01078513 addi a0,a5,16 # 300f010 + 3001c06: 2191 jal ra,300204a + 3001c08: 4795 li a5,5 + 3001c0a: a809 j 3001c1c + 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); + 3001c0c: fec42783 lw a5,-20(s0) + 3001c10: 1799 addi a5,a5,-26 + 3001c12: fe842583 lw a1,-24(s0) + 3001c16: 853e mv a0,a5 + 3001c18: 395d jal ra,30018ce + + return BASE_STATUS_OK; + 3001c1a: 4781 li a5,0 +} + 3001c1c: 853e mv a0,a5 + 3001c1e: 40f2 lw ra,28(sp) + 3001c20: 4462 lw s0,24(sp) + 3001c22: 6105 addi sp,sp,32 + 3001c24: 8082 ret + +03001c26 : + * @brief Interrupt dummy handler + * @param arg Not used + * @retval None. + */ +static void IRQ_DummyHandler(void *arg) +{ + 3001c26: 1101 addi sp,sp,-32 + 3001c28: ce22 sw s0,28(sp) + 3001c2a: 1000 addi s0,sp,32 + 3001c2c: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(arg); +} + 3001c30: 0001 nop + 3001c32: 4472 lw s0,28(sp) + 3001c34: 6105 addi sp,sp,32 + 3001c36: 8082 ret + +03001c38 : + * @param func callback function + * @param arg callback arg + * @retval None. + */ +static inline void IRQ_SetCallBack(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) +{ + 3001c38: 1101 addi sp,sp,-32 + 3001c3a: ce22 sw s0,28(sp) + 3001c3c: 1000 addi s0,sp,32 + 3001c3e: fea42623 sw a0,-20(s0) + 3001c42: feb42423 sw a1,-24(s0) + 3001c46: fec42223 sw a2,-28(s0) + g_irqCallbackFunc[irqNum].param = arg; + 3001c4a: f1818713 addi a4,gp,-232 # 400054c + 3001c4e: fec42783 lw a5,-20(s0) + 3001c52: 078e slli a5,a5,0x3 + 3001c54: 97ba add a5,a5,a4 + 3001c56: fe442703 lw a4,-28(s0) + 3001c5a: c3d8 sw a4,4(a5) + g_irqCallbackFunc[irqNum].pfnHandler = func; + 3001c5c: f1818713 addi a4,gp,-232 # 400054c + 3001c60: fec42783 lw a5,-20(s0) + 3001c64: 078e slli a5,a5,0x3 + 3001c66: 97ba add a5,a5,a4 + 3001c68: fe842703 lw a4,-24(s0) + 3001c6c: c398 sw a4,0(a5) +} + 3001c6e: 0001 nop + 3001c70: 4472 lw s0,28(sp) + 3001c72: 6105 addi sp,sp,32 + 3001c74: 8082 ret + +03001c76 : + * @brief Set the write protection for CRG-related registers disable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionDisable(void) +{ + 3001c76: 1141 addi sp,sp,-16 + 3001c78: c622 sw s0,12(sp) + 3001c7a: 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; + 3001c7c: 101007b7 lui a5,0x10100 + 3001c80: 43f8 lw a4,68(a5) + 3001c82: 67c1 lui a5,0x10 + 3001c84: 17f9 addi a5,a5,-2 # fffe + 3001c86: 00f776b3 and a3,a4,a5 + 3001c8a: 101007b7 lui a5,0x10100 + 3001c8e: ea510737 lui a4,0xea510 + 3001c92: 9736 add a4,a4,a3 + 3001c94: c3f8 sw a4,68(a5) +} + 3001c96: 0001 nop + 3001c98: 4432 lw s0,12(sp) + 3001c9a: 0141 addi sp,sp,16 + 3001c9c: 8082 ret + +03001c9e : + * @brief Set the Set the write protection for CRG-related registers enable. + * @param None + * @retval None. + */ +static inline void DCL_SYSCTRL_CrgWriteProtectionEnable(void) +{ + 3001c9e: 1141 addi sp,sp,-16 + 3001ca0: c622 sw s0,12(sp) + 3001ca2: 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) + + 3001ca4: 101007b7 lui a5,0x10100 + 3001ca8: 43f8 lw a4,68(a5) + 3001caa: 67c1 lui a5,0x10 + 3001cac: 17fd addi a5,a5,-1 # ffff + 3001cae: 8ff9 and a5,a5,a4 + 3001cb0: 0017e693 ori a3,a5,1 + 3001cb4: 101007b7 lui a5,0x10100 + 3001cb8: ea510737 lui a4,0xea510 + 3001cbc: 9736 add a4,a4,a3 + 3001cbe: c3f8 sw a4,68(a5) + SC_LOCKEN_VALID_HIGH_BIT; +} + 3001cc0: 0001 nop + 3001cc2: 4432 lw s0,12(sp) + 3001cc4: 0141 addi sp,sp,16 + 3001cc6: 8082 ret + +03001cc8 : + * @param clkSelect pll_ref_cksel + * @retval true + * @retval false + */ +static inline bool IsCrgPllRefClkSelect(CRG_PllRefClkSelect clkSelect) +{ + 3001cc8: 1101 addi sp,sp,-32 + 3001cca: ce22 sw s0,28(sp) + 3001ccc: 1000 addi s0,sp,32 + 3001cce: fea42623 sw a0,-20(s0) + return ((clkSelect == CRG_PLL_REF_CLK_SELECT_HOSC) || + 3001cd2: fec42783 lw a5,-20(s0) + 3001cd6: c791 beqz a5,3001ce2 + 3001cd8: fec42703 lw a4,-20(s0) + 3001cdc: 4785 li a5,1 + 3001cde: 00f71463 bne a4,a5,3001ce6 + 3001ce2: 4785 li a5,1 + 3001ce4: a011 j 3001ce8 + 3001ce6: 4781 li a5,0 + 3001ce8: 8b85 andi a5,a5,1 + 3001cea: 9f81 uxtb a5 + (clkSelect == CRG_PLL_REF_CLK_SELECT_XTAL)); +} + 3001cec: 853e mv a0,a5 + 3001cee: 4472 lw s0,28(sp) + 3001cf0: 6105 addi sp,sp,32 + 3001cf2: 8082 ret + +03001cf4 : + * @param preDiv pll prediv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPreDiv(CRG_PllPreDiv preDiv) +{ + 3001cf4: 1101 addi sp,sp,-32 + 3001cf6: ce22 sw s0,28(sp) + 3001cf8: 1000 addi s0,sp,32 + 3001cfa: fea42623 sw a0,-20(s0) + return ((preDiv >= CRG_PLL_PREDIV_1) && + 3001cfe: fec42783 lw a5,-20(s0) + 3001d02: 0087b793 sltiu a5,a5,8 + 3001d06: 9f81 uxtb a5 + (preDiv <= CRG_PLL_PREDIV_8)); +} + 3001d08: 853e mv a0,a5 + 3001d0a: 4472 lw s0,28(sp) + 3001d0c: 6105 addi sp,sp,32 + 3001d0e: 8082 ret + +03001d10 : + * @param postDiv pll_postdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv(CRG_PllPostDiv postDiv) +{ + 3001d10: 1101 addi sp,sp,-32 + 3001d12: ce22 sw s0,28(sp) + 3001d14: 1000 addi s0,sp,32 + 3001d16: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV_1) && + 3001d1a: fec42783 lw a5,-20(s0) + 3001d1e: 0087b793 sltiu a5,a5,8 + 3001d22: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV_8)); +} + 3001d24: 853e mv a0,a5 + 3001d26: 4472 lw s0,28(sp) + 3001d28: 6105 addi sp,sp,32 + 3001d2a: 8082 ret + +03001d2c : + * @param postDiv pll_postdiv2 value + * @retval true + * @retval false + */ +static inline bool IsCrgPllPostDiv2(CRG_PllPostDiv2 postDiv) +{ + 3001d2c: 1101 addi sp,sp,-32 + 3001d2e: ce22 sw s0,28(sp) + 3001d30: 1000 addi s0,sp,32 + 3001d32: fea42623 sw a0,-20(s0) + return ((postDiv >= CRG_PLL_POSTDIV2_1) && + 3001d36: fec42783 lw a5,-20(s0) + 3001d3a: 0087b793 sltiu a5,a5,8 + 3001d3e: 9f81 uxtb a5 + (postDiv <= CRG_PLL_POSTDIV2_8_MAX)); +} + 3001d40: 853e mv a0,a5 + 3001d42: 4472 lw s0,28(sp) + 3001d44: 6105 addi sp,sp,32 + 3001d46: 8082 ret + +03001d48 : + * @param fbDiv pll fbdiv value + * @retval true + * @retval false + */ +static inline bool IsCrgPllFbDiv(unsigned int fbDiv) +{ + 3001d48: 1101 addi sp,sp,-32 + 3001d4a: ce22 sw s0,28(sp) + 3001d4c: 1000 addi s0,sp,32 + 3001d4e: fea42623 sw a0,-20(s0) + return (fbDiv <= CRG_PLL_FBDIV_MAX); + 3001d52: fec42783 lw a5,-20(s0) + 3001d56: 0807b793 sltiu a5,a5,128 + 3001d5a: 9f81 uxtb a5 +} + 3001d5c: 853e mv a0,a5 + 3001d5e: 4472 lw s0,28(sp) + 3001d60: 6105 addi sp,sp,32 + 3001d62: 8082 ret + +03001d64 : + * @param select core_cksel value + * @retval true + * @retval false + */ +static inline bool IsCrgCoreCkSel(CRG_CoreClkSelect select) +{ + 3001d64: 1101 addi sp,sp,-32 + 3001d66: ce22 sw s0,28(sp) + 3001d68: 1000 addi s0,sp,32 + 3001d6a: fea42623 sw a0,-20(s0) + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3001d6e: fec42783 lw a5,-20(s0) + 3001d72: cb99 beqz a5,3001d88 + return ((select == CRG_CORE_CLK_SELECT_HOSC) || + 3001d74: fec42703 lw a4,-20(s0) + 3001d78: 4785 li a5,1 + 3001d7a: 00f70763 beq a4,a5,3001d88 + (select == CRG_CORE_CLK_SELECT_TCXO) || + 3001d7e: fec42703 lw a4,-20(s0) + 3001d82: 4789 li a5,2 + 3001d84: 00f71463 bne a4,a5,3001d8c + 3001d88: 4785 li a5,1 + 3001d8a: a011 j 3001d8e + 3001d8c: 4781 li a5,0 + 3001d8e: 8b85 andi a5,a5,1 + 3001d90: 9f81 uxtb a5 + (select == CRG_CORE_CLK_SELECT_PLL)); +} + 3001d92: 853e mv a0,a5 + 3001d94: 4472 lw s0,28(sp) + 3001d96: 6105 addi sp,sp,32 + 3001d98: 8082 ret + +03001d9a : + * @param select 1M clock selection + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkSel(CRG_1MClkSelect select) +{ + 3001d9a: 1101 addi sp,sp,-32 + 3001d9c: ce22 sw s0,28(sp) + 3001d9e: 1000 addi s0,sp,32 + 3001da0: fea42623 sw a0,-20(s0) + return ((select == CRG_1M_CLK_SELECT_HOSC) || + 3001da4: fec42783 lw a5,-20(s0) + 3001da8: c791 beqz a5,3001db4 + 3001daa: fec42703 lw a4,-20(s0) + 3001dae: 4785 li a5,1 + 3001db0: 00f71463 bne a4,a5,3001db8 + 3001db4: 4785 li a5,1 + 3001db6: a011 j 3001dba + 3001db8: 4781 li a5,0 + 3001dba: 8b85 andi a5,a5,1 + 3001dbc: 9f81 uxtb a5 + (select == CRG_1M_CLK_SELECT_TCXO)); +} + 3001dbe: 853e mv a0,a5 + 3001dc0: 4472 lw s0,28(sp) + 3001dc2: 6105 addi sp,sp,32 + 3001dc4: 8082 ret + +03001dc6 : + * @param div 1M clock ratio + * @retval true + * @retval false + */ +static inline bool IsCrg1MCkDiv(unsigned int div) +{ + 3001dc6: 1101 addi sp,sp,-32 + 3001dc8: ce22 sw s0,28(sp) + 3001dca: 1000 addi s0,sp,32 + 3001dcc: fea42623 sw a0,-20(s0) + return (div <= CRG_1MHZ_CLK_MAX_DIV); + 3001dd0: fec42783 lw a5,-20(s0) + 3001dd4: 0407b793 sltiu a5,a5,64 + 3001dd8: 9f81 uxtb a5 +} + 3001dda: 853e mv a0,a5 + 3001ddc: 4472 lw s0,28(sp) + 3001dde: 6105 addi sp,sp,32 + 3001de0: 8082 ret + +03001de2 : + * @param preDiv PLL Previous Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPreDiv(unsigned int pllRefFreq, unsigned int preDiv) +{ + 3001de2: 7179 addi sp,sp,-48 + 3001de4: d622 sw s0,44(sp) + 3001de6: 1800 addi s0,sp,48 + 3001de8: fca42e23 sw a0,-36(s0) + 3001dec: fcb42c23 sw a1,-40(s0) + unsigned int freq = pllRefFreq; + 3001df0: fdc42783 lw a5,-36(s0) + 3001df4: fef42623 sw a5,-20(s0) + if (preDiv != 0) { + 3001df8: fd842783 lw a5,-40(s0) + 3001dfc: cb89 beqz a5,3001e0e + freq /= preDiv; + 3001dfe: fec42703 lw a4,-20(s0) + 3001e02: fd842783 lw a5,-40(s0) + 3001e06: 02f757b3 divu a5,a4,a5 + 3001e0a: fef42623 sw a5,-20(s0) + } + return (freq >= CRG_CLK_PFD_MIN_FREQ) && (freq <= CRG_CLK_PFD_MAX_FREQ); + 3001e0e: fec42703 lw a4,-20(s0) + 3001e12: 003d17b7 lui a5,0x3d1 + 3001e16: 8ff78793 addi a5,a5,-1793 # 3d08ff + 3001e1a: 00e7fc63 bgeu a5,a4,3001e32 + 3001e1e: fec42703 lw a4,-20(s0) + 3001e22: 007277b7 lui a5,0x727 + 3001e26: 0e078793 addi a5,a5,224 # 7270e0 + 3001e2a: 00e7e463 bltu a5,a4,3001e32 + 3001e2e: 4785 li a5,1 + 3001e30: a011 j 3001e34 + 3001e32: 4781 li a5,0 + 3001e34: 8b85 andi a5,a5,1 + 3001e36: 9f81 uxtb a5 +} + 3001e38: 853e mv a0,a5 + 3001e3a: 5432 lw s0,44(sp) + 3001e3c: 6145 addi sp,sp,48 + 3001e3e: 8082 ret + +03001e40 : + * @param fdDiv PLL FD Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidFdDiv(unsigned int clkPfdFreq, unsigned int fdDiv) +{ + 3001e40: 7179 addi sp,sp,-48 + 3001e42: d622 sw s0,44(sp) + 3001e44: 1800 addi s0,sp,48 + 3001e46: fca42e23 sw a0,-36(s0) + 3001e4a: fcb42c23 sw a1,-40(s0) + if (clkPfdFreq > 30000000U) { /* The maximum speed of the external clock source is 30000000U. */ + 3001e4e: fdc42703 lw a4,-36(s0) + 3001e52: 01c9c7b7 lui a5,0x1c9c + 3001e56: 38078793 addi a5,a5,896 # 1c9c380 + 3001e5a: 00e7f463 bgeu a5,a4,3001e62 + return false; + 3001e5e: 4781 li a5,0 + 3001e60: a08d j 3001ec2 + } else if (fdDiv > CRG_PLL_FBDIV_MAX) { + 3001e62: fd842703 lw a4,-40(s0) + 3001e66: 07f00793 li a5,127 + 3001e6a: 00e7f463 bgeu a5,a4,3001e72 + return false; + 3001e6e: 4781 li a5,0 + 3001e70: a889 j 3001ec2 + } + + unsigned int freq = (fdDiv > 0x6) ? (clkPfdFreq * fdDiv) : (clkPfdFreq * 0x6); /* 0x0-0x6: divided by 0x6 */ + 3001e72: fd842703 lw a4,-40(s0) + 3001e76: 4799 li a5,6 + 3001e78: 00e7f963 bgeu a5,a4,3001e8a + 3001e7c: fdc42703 lw a4,-36(s0) + 3001e80: fd842783 lw a5,-40(s0) + 3001e84: 02f707b3 mul a5,a4,a5 + 3001e88: a031 j 3001e94 + 3001e8a: fdc42703 lw a4,-36(s0) + 3001e8e: 4799 li a5,6 + 3001e90: 02f707b3 mul a5,a4,a5 + 3001e94: fef42623 sw a5,-20(s0) + return (freq >= CRG_CLK_VCO_MIN_FREQ) && (freq <= CRG_CLK_VCO_MAX_FREQ); + 3001e98: fec42703 lw a4,-20(s0) + 3001e9c: 05f5e7b7 lui a5,0x5f5e + 3001ea0: 0ff78793 addi a5,a5,255 # 5f5e0ff + 3001ea4: 00e7fc63 bgeu a5,a4,3001ebc + 3001ea8: fec42703 lw a4,-20(s0) + 3001eac: 11e1a7b7 lui a5,0x11e1a + 3001eb0: 30078793 addi a5,a5,768 # 11e1a300 + 3001eb4: 00e7e463 bltu a5,a4,3001ebc + 3001eb8: 4785 li a5,1 + 3001eba: a011 j 3001ebe + 3001ebc: 4781 li a5,0 + 3001ebe: 8b85 andi a5,a5,1 + 3001ec0: 9f81 uxtb a5 +} + 3001ec2: 853e mv a0,a5 + 3001ec4: 5432 lw s0,44(sp) + 3001ec6: 6145 addi sp,sp,48 + 3001ec8: 8082 ret + +03001eca : + * @param postDiv PLL Post Divsion + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv(unsigned int clkVcoFreq, unsigned int postDiv) +{ + 3001eca: 7179 addi sp,sp,-48 + 3001ecc: d622 sw s0,44(sp) + 3001ece: 1800 addi s0,sp,48 + 3001ed0: fca42e23 sw a0,-36(s0) + 3001ed4: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3001ed8: fdc42783 lw a5,-36(s0) + 3001edc: fef42623 sw a5,-20(s0) + if (postDiv != 0) { + 3001ee0: fd842783 lw a5,-40(s0) + 3001ee4: cb91 beqz a5,3001ef8 + freq /= (postDiv + 1); + 3001ee6: fd842783 lw a5,-40(s0) + 3001eea: 0785 addi a5,a5,1 + 3001eec: fec42703 lw a4,-20(s0) + 3001ef0: 02f757b3 divu a5,a4,a5 + 3001ef4: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_TARGET_MAX_FREQ); + 3001ef8: fec42703 lw a4,-20(s0) + 3001efc: 08f0d7b7 lui a5,0x8f0d + 3001f00: 18178793 addi a5,a5,385 # 8f0d181 + 3001f04: 00f737b3 sltu a5,a4,a5 + 3001f08: 9f81 uxtb a5 +} + 3001f0a: 853e mv a0,a5 + 3001f0c: 5432 lw s0,44(sp) + 3001f0e: 6145 addi sp,sp,48 + 3001f10: 8082 ret + +03001f12 : + * @param postDiv2 PLL Post Divsion2 + * @retval true + * @retval false + */ +static inline bool IsCrgValidPostDiv2(unsigned int clkVcoFreq, unsigned int postDiv2) +{ + 3001f12: 7179 addi sp,sp,-48 + 3001f14: d622 sw s0,44(sp) + 3001f16: 1800 addi s0,sp,48 + 3001f18: fca42e23 sw a0,-36(s0) + 3001f1c: fcb42c23 sw a1,-40(s0) + unsigned int freq = clkVcoFreq; + 3001f20: fdc42783 lw a5,-36(s0) + 3001f24: fef42623 sw a5,-20(s0) + if (postDiv2 != 0) { + 3001f28: fd842783 lw a5,-40(s0) + 3001f2c: cb91 beqz a5,3001f40 + freq /= (postDiv2 + 1); + 3001f2e: fd842783 lw a5,-40(s0) + 3001f32: 0785 addi a5,a5,1 + 3001f34: fec42703 lw a4,-20(s0) + 3001f38: 02f757b3 divu a5,a4,a5 + 3001f3c: fef42623 sw a5,-20(s0) + } + return (freq <= CRG_CLK_PST2_MAX_FREQ); + 3001f40: fec42703 lw a4,-20(s0) + 3001f44: 05f5e7b7 lui a5,0x5f5e + 3001f48: 10178793 addi a5,a5,257 # 5f5e101 + 3001f4c: 00f737b3 sltu a5,a4,a5 + 3001f50: 9f81 uxtb a5 +} + 3001f52: 853e mv a0,a5 + 3001f54: 5432 lw s0,44(sp) + 3001f56: 6145 addi sp,sp,48 + 3001f58: 8082 ret + +03001f5a : + * @param adcClkSelect the value of adc clock select + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkModeSelect(CRG_AdcClkSelect adcClkSelect) +{ + 3001f5a: 1101 addi sp,sp,-32 + 3001f5c: ce22 sw s0,28(sp) + 3001f5e: 1000 addi s0,sp,32 + 3001f60: 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 || \ + 3001f64: fec42783 lw a5,-20(s0) + 3001f68: c385 beqz a5,3001f88 + return (adcClkSelect == CRG_ADC_CLK_ASYN_HOSC || \ + 3001f6a: fec42703 lw a4,-20(s0) + 3001f6e: 4785 li a5,1 + 3001f70: 00f70c63 beq a4,a5,3001f88 + adcClkSelect == CRG_ADC_CLK_ASYN_TCXO || \ + 3001f74: fec42703 lw a4,-20(s0) + 3001f78: 4789 li a5,2 + 3001f7a: 00f70763 beq a4,a5,3001f88 + adcClkSelect == CRG_ADC_CLK_ASYN_PLL_DIV || \ + 3001f7e: fec42703 lw a4,-20(s0) + 3001f82: 478d li a5,3 + 3001f84: 00f71463 bne a4,a5,3001f8c + 3001f88: 4785 li a5,1 + 3001f8a: a011 j 3001f8e + 3001f8c: 4781 li a5,0 + 3001f8e: 8b85 andi a5,a5,1 + 3001f90: 9f81 uxtb a5 + adcClkSelect == CRG_ADC_CLK_SYN_CORE); +} + 3001f92: 853e mv a0,a5 + 3001f94: 4472 lw s0,28(sp) + 3001f96: 6105 addi sp,sp,32 + 3001f98: 8082 ret + +03001f9a : + * @param div the value of adc clock div + * @retval true + * @retval false + */ +static inline bool IsCrgAdcClkDiv(CRG_AdcDiv div) +{ + 3001f9a: 1101 addi sp,sp,-32 + 3001f9c: ce22 sw s0,28(sp) + 3001f9e: 1000 addi s0,sp,32 + 3001fa0: fea42623 sw a0,-20(s0) + return (div == CRG_ADC_DIV_1 || \ + div == CRG_ADC_DIV_2 || \ + div == CRG_ADC_DIV_3 || \ + 3001fa4: fec42783 lw a5,-20(s0) + 3001fa8: c385 beqz a5,3001fc8 + return (div == CRG_ADC_DIV_1 || \ + 3001faa: fec42703 lw a4,-20(s0) + 3001fae: 4785 li a5,1 + 3001fb0: 00f70c63 beq a4,a5,3001fc8 + div == CRG_ADC_DIV_2 || \ + 3001fb4: fec42703 lw a4,-20(s0) + 3001fb8: 4789 li a5,2 + 3001fba: 00f70763 beq a4,a5,3001fc8 + div == CRG_ADC_DIV_3 || \ + 3001fbe: fec42703 lw a4,-20(s0) + 3001fc2: 478d li a5,3 + 3001fc4: 00f71463 bne a4,a5,3001fcc + 3001fc8: 4785 li a5,1 + 3001fca: a011 j 3001fce + 3001fcc: 4781 li a5,0 + 3001fce: 8b85 andi a5,a5,1 + 3001fd0: 9f81 uxtb a5 + div == CRG_ADC_DIV_4); +} + 3001fd2: 853e mv a0,a5 + 3001fd4: 4472 lw s0,28(sp) + 3001fd6: 6105 addi sp,sp,32 + 3001fd8: 8082 ret + +03001fda : + * @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) +{ + 3001fda: 1101 addi sp,sp,-32 + 3001fdc: ce06 sw ra,28(sp) + 3001fde: cc22 sw s0,24(sp) + 3001fe0: 1000 addi s0,sp,32 + 3001fe2: fea42623 sw a0,-20(s0) + 3001fe6: feb42423 sw a1,-24(s0) + CRG_ASSERT_PARAM(IsCRGInstance(clk)); + 3001fea: fec42703 lw a4,-20(s0) + 3001fee: 100007b7 lui a5,0x10000 + 3001ff2: 00f70a63 beq a4,a5,3002006 + 3001ff6: 64b00593 li a1,1611 + 3001ffa: 0300f7b7 lui a5,0x300f + 3001ffe: 07078513 addi a0,a5,112 # 300f070 + 3002002: 20a1 jal ra,300204a + 3002004: a001 j 3002004 + CRG_PARAM_CHECK_NO_RET(IsCrgCoreCkSel(select)); + 3002006: fe842503 lw a0,-24(s0) + 300200a: 3ba9 jal ra,3001d64 + 300200c: 87aa mv a5,a0 + 300200e: 0017c793 xori a5,a5,1 + 3002012: 9f81 uxtb a5 + 3002014: cb89 beqz a5,3002026 + 3002016: 64c00593 li a1,1612 + 300201a: 0300f7b7 lui a5,0x300f + 300201e: 07078513 addi a0,a5,112 # 300f070 + 3002022: 2025 jal ra,300204a + 3002024: a839 j 3002042 + clk->PERI_CRG64.BIT.clk_pst1_sw_sel = select; + 3002026: fe842783 lw a5,-24(s0) + 300202a: 8b8d andi a5,a5,3 + 300202c: 0ff7f693 andi a3,a5,255 + 3002030: fec42703 lw a4,-20(s0) + 3002034: 10072783 lw a5,256(a4) # ea510100 + 3002038: 8a8d andi a3,a3,3 + 300203a: 9bf1 andi a5,a5,-4 + 300203c: 8fd5 or a5,a5,a3 + 300203e: 10f72023 sw a5,256(a4) +} + 3002042: 40f2 lw ra,28(sp) + 3002044: 4462 lw s0,24(sp) + 3002046: 6105 addi sp,sp,32 + 3002048: 8082 ret + +0300204a : + 300204a: 9a6ff06f j 30011f0 + +0300204e : + * @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) +{ + 300204e: 7179 addi sp,sp,-48 + 3002050: d606 sw ra,44(sp) + 3002052: d422 sw s0,40(sp) + 3002054: 1800 addi s0,sp,48 + 3002056: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != NULL); + 300205a: fdc42783 lw a5,-36(s0) + 300205e: eb89 bnez a5,3002070 + 3002060: 07100593 li a1,113 + 3002064: 0300f7b7 lui a5,0x300f + 3002068: 08c78513 addi a0,a5,140 # 300f08c + 300206c: 3ff9 jal ra,300204a + 300206e: a001 j 300206e + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002070: fdc42783 lw a5,-36(s0) + 3002074: 4398 lw a4,0(a5) + 3002076: 100007b7 lui a5,0x10000 + 300207a: 00f70a63 beq a4,a5,300208e + 300207e: 07200593 li a1,114 + 3002082: 0300f7b7 lui a5,0x300f + 3002086: 08c78513 addi a0,a5,140 # 300f08c + 300208a: 37c1 jal ra,300204a + 300208c: a001 j 300208c + /* Check the validity of PLL-related parameters. */ + CRG_PARAM_CHECK_WITH_RET(IsCrgPllRefClkSelect(handle->pllRefClkSelect), BASE_STATUS_ERROR); + 300208e: fdc42783 lw a5,-36(s0) + 3002092: 43dc lw a5,4(a5) + 3002094: 853e mv a0,a5 + 3002096: 390d jal ra,3001cc8 + 3002098: 87aa mv a5,a0 + 300209a: 0017c793 xori a5,a5,1 + 300209e: 9f81 uxtb a5 + 30020a0: cb91 beqz a5,30020b4 + 30020a2: 07400593 li a1,116 + 30020a6: 0300f7b7 lui a5,0x300f + 30020aa: 08c78513 addi a0,a5,140 # 300f08c + 30020ae: 3f71 jal ra,300204a + 30020b0: 4785 li a5,1 + 30020b2: ac89 j 3002304 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPreDiv(handle->pllPreDiv), BASE_STATUS_ERROR); + 30020b4: fdc42783 lw a5,-36(s0) + 30020b8: 479c lw a5,8(a5) + 30020ba: 853e mv a0,a5 + 30020bc: 3925 jal ra,3001cf4 + 30020be: 87aa mv a5,a0 + 30020c0: 0017c793 xori a5,a5,1 + 30020c4: 9f81 uxtb a5 + 30020c6: cb91 beqz a5,30020da + 30020c8: 07500593 li a1,117 + 30020cc: 0300f7b7 lui a5,0x300f + 30020d0: 08c78513 addi a0,a5,140 # 300f08c + 30020d4: 3f9d jal ra,300204a + 30020d6: 4785 li a5,1 + 30020d8: a435 j 3002304 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllFbDiv(handle->pllFbDiv), BASE_STATUS_ERROR); + 30020da: fdc42783 lw a5,-36(s0) + 30020de: 47dc lw a5,12(a5) + 30020e0: 853e mv a0,a5 + 30020e2: 319d jal ra,3001d48 + 30020e4: 87aa mv a5,a0 + 30020e6: 0017c793 xori a5,a5,1 + 30020ea: 9f81 uxtb a5 + 30020ec: cb91 beqz a5,3002100 + 30020ee: 07600593 li a1,118 + 30020f2: 0300f7b7 lui a5,0x300f + 30020f6: 08c78513 addi a0,a5,140 # 300f08c + 30020fa: 3f81 jal ra,300204a + 30020fc: 4785 li a5,1 + 30020fe: a419 j 3002304 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv(handle->pllPostDiv), BASE_STATUS_ERROR); + 3002100: fdc42783 lw a5,-36(s0) + 3002104: 4b9c lw a5,16(a5) + 3002106: 853e mv a0,a5 + 3002108: 3121 jal ra,3001d10 + 300210a: 87aa mv a5,a0 + 300210c: 0017c793 xori a5,a5,1 + 3002110: 9f81 uxtb a5 + 3002112: cb91 beqz a5,3002126 + 3002114: 07700593 li a1,119 + 3002118: 0300f7b7 lui a5,0x300f + 300211c: 08c78513 addi a0,a5,140 # 300f08c + 3002120: 372d jal ra,300204a + 3002122: 4785 li a5,1 + 3002124: a2c5 j 3002304 + CRG_PARAM_CHECK_WITH_RET(IsCrgPllPostDiv2(handle->handleEx.pllPostDiv2), BASE_STATUS_ERROR); + 3002126: fdc42783 lw a5,-36(s0) + 300212a: 4fdc lw a5,28(a5) + 300212c: 853e mv a0,a5 + 300212e: 3efd jal ra,3001d2c + 3002130: 87aa mv a5,a0 + 3002132: 0017c793 xori a5,a5,1 + 3002136: 9f81 uxtb a5 + 3002138: cb91 beqz a5,300214c + 300213a: 07800593 li a1,120 + 300213e: 0300f7b7 lui a5,0x300f + 3002142: 08c78513 addi a0,a5,140 # 300f08c + 3002146: 3711 jal ra,300204a + 3002148: 4785 li a5,1 + 300214a: aa6d j 3002304 + /* Check the Clock Source and Frequency Divider of the 1 MHz Clock. */ + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkSel(handle->handleEx.clk1MSelect), BASE_STATUS_ERROR); + 300214c: fdc42783 lw a5,-36(s0) + 3002150: 539c lw a5,32(a5) + 3002152: 853e mv a0,a5 + 3002154: 3199 jal ra,3001d9a + 3002156: 87aa mv a5,a0 + 3002158: 0017c793 xori a5,a5,1 + 300215c: 9f81 uxtb a5 + 300215e: cb91 beqz a5,3002172 + 3002160: 07a00593 li a1,122 + 3002164: 0300f7b7 lui a5,0x300f + 3002168: 08c78513 addi a0,a5,140 # 300f08c + 300216c: 3df9 jal ra,300204a + 300216e: 4785 li a5,1 + 3002170: aa51 j 3002304 + CRG_PARAM_CHECK_WITH_RET(IsCrg1MCkDiv(handle->handleEx.clk1MDiv), BASE_STATUS_ERROR); + 3002172: fdc42783 lw a5,-36(s0) + 3002176: 53dc lw a5,36(a5) + 3002178: 853e mv a0,a5 + 300217a: 31b1 jal ra,3001dc6 + 300217c: 87aa mv a5,a0 + 300217e: 0017c793 xori a5,a5,1 + 3002182: 9f81 uxtb a5 + 3002184: cb91 beqz a5,3002198 + 3002186: 07b00593 li a1,123 + 300218a: 0300f7b7 lui a5,0x300f + 300218e: 08c78513 addi a0,a5,140 # 300f08c + 3002192: 3d65 jal ra,300204a + 3002194: 4785 li a5,1 + 3002196: a2bd j 3002304 + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 3002198: fdc42783 lw a5,-36(s0) + 300219c: 4f9c lw a5,24(a5) + 300219e: 853e mv a0,a5 + 30021a0: 36d1 jal ra,3001d64 + 30021a2: 87aa mv a5,a0 + 30021a4: 0017c793 xori a5,a5,1 + 30021a8: 9f81 uxtb a5 + 30021aa: cb91 beqz a5,30021be + 30021ac: 07c00593 li a1,124 + 30021b0: 0300f7b7 lui a5,0x300f + 30021b4: 08c78513 addi a0,a5,140 # 300f08c + 30021b8: 3d49 jal ra,300204a + 30021ba: 4785 li a5,1 + 30021bc: a2a1 j 3002304 + + *(unsigned int *)CRG_HOSC_CTRL2_ADDR = 0x306E; /* Optimized HOSC temperature drift performance parameter. */ + 30021be: 100017b7 lui a5,0x10001 + 30021c2: f0478793 addi a5,a5,-252 # 10000f04 + 30021c6: 670d lui a4,0x3 + 30021c8: 06e70713 addi a4,a4,110 # 306e + 30021cc: c398 sw a4,0(a5) + + CRG_RegStruct *reg = handle->baseAddress; + 30021ce: fdc42783 lw a5,-36(s0) + 30021d2: 439c lw a5,0(a5) + 30021d4: fef42623 sw a5,-20(s0) + g_crgBaseAddr = (void *)reg; + 30021d8: fec42703 lw a4,-20(s0) + 30021dc: 2ae1a823 sw a4,688(gp) # 40008e4 + /* Check the validity of the PLL parameter configuration. */ + if (CRG_IsValidPllConfig(handle) != BASE_STATUS_OK) { + 30021e0: fdc42503 lw a0,-36(s0) + 30021e4: 2521 jal ra,30027ec + 30021e6: 87aa mv a5,a0 + 30021e8: c399 beqz a5,30021ee + return BASE_STATUS_ERROR; + 30021ea: 4785 li a5,1 + 30021ec: aa21 j 3002304 + } + /* Disable the write protection function of the CRG register. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 30021ee: 3461 jal ra,3001c76 + + reg->PERI_CRG0.BIT.pll_ref_cksel = handle->pllRefClkSelect; + 30021f0: fdc42783 lw a5,-36(s0) + 30021f4: 43dc lw a5,4(a5) + 30021f6: 8b85 andi a5,a5,1 + 30021f8: 0ff7f693 andi a3,a5,255 + 30021fc: fec42703 lw a4,-20(s0) + 3002200: 431c lw a5,0(a4) + 3002202: 8a85 andi a3,a3,1 + 3002204: 9bf9 andi a5,a5,-2 + 3002206: 8fd5 or a5,a5,a3 + 3002208: c31c sw a5,0(a4) + reg->PERI_CRG1.BIT.pll_prediv = handle->pllPreDiv; + 300220a: fdc42783 lw a5,-36(s0) + 300220e: 479c lw a5,8(a5) + 3002210: 8bbd andi a5,a5,15 + 3002212: 0ff7f693 andi a3,a5,255 + 3002216: fec42703 lw a4,-20(s0) + 300221a: 435c lw a5,4(a4) + 300221c: 8abd andi a3,a3,15 + 300221e: 9bc1 andi a5,a5,-16 + 3002220: 8fd5 or a5,a5,a3 + 3002222: c35c sw a5,4(a4) + reg->PERI_CRG2.BIT.pll_fbdiv = handle->pllFbDiv; + 3002224: fdc42783 lw a5,-36(s0) + 3002228: 47dc lw a5,12(a5) + 300222a: 0ff7f693 andi a3,a5,255 + 300222e: fec42703 lw a4,-20(s0) + 3002232: 471c lw a5,8(a4) + 3002234: 0ff6f693 andi a3,a3,255 + 3002238: f007f793 andi a5,a5,-256 + 300223c: 8fd5 or a5,a5,a3 + 300223e: c71c sw a5,8(a4) + reg->PERI_CRG3.BIT.pll_postdiv1 = handle->pllPostDiv; + 3002240: fdc42783 lw a5,-36(s0) + 3002244: 4b9c lw a5,16(a5) + 3002246: 8bbd andi a5,a5,15 + 3002248: 0ff7f693 andi a3,a5,255 + 300224c: fec42703 lw a4,-20(s0) + 3002250: 475c lw a5,12(a4) + 3002252: 8abd andi a3,a3,15 + 3002254: 9bc1 andi a5,a5,-16 + 3002256: 8fd5 or a5,a5,a3 + 3002258: c75c sw a5,12(a4) + reg->PERI_CRG3.BIT.pll_postdiv2 = handle->handleEx.pllPostDiv2; + 300225a: fdc42783 lw a5,-36(s0) + 300225e: 4fdc lw a5,28(a5) + 3002260: 8bbd andi a5,a5,15 + 3002262: 0ff7f693 andi a3,a5,255 + 3002266: fec42703 lw a4,-20(s0) + 300226a: 475c lw a5,12(a4) + 300226c: 8abd andi a3,a3,15 + 300226e: 0692 slli a3,a3,0x4 + 3002270: f0f7f793 andi a5,a5,-241 + 3002274: 8fd5 or a5,a5,a3 + 3002276: c75c sw a5,12(a4) + reg->PERI_CRG4.BIT.pll_pd = BASE_CFG_UNSET; + 3002278: fec42703 lw a4,-20(s0) + 300227c: 4b1c lw a5,16(a4) + 300227e: 9bf9 andi a5,a5,-2 + 3002280: cb1c sw a5,16(a4) + + while (reg->PERI_CRG7.BIT.pll_lock != BASE_CFG_SET) { + 3002282: 0001 nop + 3002284: fec42783 lw a5,-20(s0) + 3002288: 4fdc lw a5,28(a5) + 300228a: 8b85 andi a5,a5,1 + 300228c: 0ff7f713 andi a4,a5,255 + 3002290: 4785 li a5,1 + 3002292: fef719e3 bne a4,a5,3002284 + ; /* Wait for PLL to lock */ + } + + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002296: 3421 jal ra,3001c9e + /* Check the 1MHz clock parameter configuration. */ + if (CRG_IsValid1MHzConfig(handle) != BASE_STATUS_OK) { + 3002298: fdc42503 lw a0,-36(s0) + 300229c: 2d09 jal ra,30028ae + 300229e: 87aa mv a5,a0 + 30022a0: c399 beqz a5,30022a6 + return BASE_STATUS_ERROR; + 30022a2: 4785 li a5,1 + 30022a4: a085 j 3002304 + } + while (reg->HOSC_LOCK.BIT.hosc_lock != BASE_CFG_SET) { + 30022a6: 0001 nop + 30022a8: fec42703 lw a4,-20(s0) + 30022ac: 6785 lui a5,0x1 + 30022ae: 97ba add a5,a5,a4 + 30022b0: f107a783 lw a5,-240(a5) # f10 + 30022b4: 8b85 andi a5,a5,1 + 30022b6: 0ff7f713 andi a4,a5,255 + 30022ba: 4785 li a5,1 + 30022bc: fef716e3 bne a4,a5,30022a8 + ; /* 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; + 30022c0: fdc42783 lw a5,-36(s0) + 30022c4: 53dc lw a5,36(a5) + 30022c6: 03f7f793 andi a5,a5,63 + 30022ca: 0ff7f693 andi a3,a5,255 + 30022ce: fec42703 lw a4,-20(s0) + 30022d2: 10c72783 lw a5,268(a4) + 30022d6: 03f6f693 andi a3,a3,63 + 30022da: fc07f793 andi a5,a5,-64 + 30022de: 8fd5 or a5,a5,a3 + 30022e0: 10f72623 sw a5,268(a4) + reg->PERI_CRG66.BIT.clk_1m_ini_cksel = handle->handleEx.clk1MSelect; + 30022e4: fdc42783 lw a5,-36(s0) + 30022e8: 539c lw a5,32(a5) + 30022ea: 8b85 andi a5,a5,1 + 30022ec: 0ff7f693 andi a3,a5,255 + 30022f0: fec42703 lw a4,-20(s0) + 30022f4: 10872783 lw a5,264(a4) + 30022f8: 8a85 andi a3,a3,1 + 30022fa: 9bf9 andi a5,a5,-2 + 30022fc: 8fd5 or a5,a5,a3 + 30022fe: 10f72423 sw a5,264(a4) + return BASE_STATUS_OK; + 3002302: 4781 li a5,0 +} + 3002304: 853e mv a0,a5 + 3002306: 50b2 lw ra,44(sp) + 3002308: 5422 lw s0,40(sp) + 300230a: 6145 addi sp,sp,48 + 300230c: 8082 ret + +0300230e : + * @param handle CRG Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_CRG_SetCoreClockSelect(CRG_Handle *handle) +{ + 300230e: 7179 addi sp,sp,-48 + 3002310: d606 sw ra,44(sp) + 3002312: d422 sw s0,40(sp) + 3002314: 1800 addi s0,sp,48 + 3002316: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(handle != 0); + 300231a: fdc42783 lw a5,-36(s0) + 300231e: eb89 bnez a5,3002330 + 3002320: 10a00593 li a1,266 + 3002324: 0300f7b7 lui a5,0x300f + 3002328: 08c78513 addi a0,a5,140 # 300f08c + 300232c: 3b39 jal ra,300204a + 300232e: a001 j 300232e + CRG_ASSERT_PARAM(IsCRGInstance(handle->baseAddress)); + 3002330: fdc42783 lw a5,-36(s0) + 3002334: 4398 lw a4,0(a5) + 3002336: 100007b7 lui a5,0x10000 + 300233a: 00f70a63 beq a4,a5,300234e + 300233e: 10b00593 li a1,267 + 3002342: 0300f7b7 lui a5,0x300f + 3002346: 08c78513 addi a0,a5,140 # 300f08c + 300234a: 3301 jal ra,300204a + 300234c: a001 j 300234c + CRG_PARAM_CHECK_WITH_RET(IsCrgCoreCkSel(handle->coreClkSelect), BASE_STATUS_ERROR); + 300234e: fdc42783 lw a5,-36(s0) + 3002352: 4f9c lw a5,24(a5) + 3002354: 853e mv a0,a5 + 3002356: 3439 jal ra,3001d64 + 3002358: 87aa mv a5,a0 + 300235a: 0017c793 xori a5,a5,1 + 300235e: 9f81 uxtb a5 + 3002360: cb91 beqz a5,3002374 + 3002362: 10c00593 li a1,268 + 3002366: 0300f7b7 lui a5,0x300f + 300236a: 08c78513 addi a0,a5,140 # 300f08c + 300236e: 39f1 jal ra,300204a + 3002370: 4785 li a5,1 + 3002372: a005 j 3002392 + + CRG_RegStruct *reg = handle->baseAddress; + 3002374: fdc42783 lw a5,-36(s0) + 3002378: 439c lw a5,0(a5) + 300237a: fef42623 sw a5,-20(s0) + /* The write protection of the CRG register needs to be disabled. */ + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 300237e: 38e5 jal ra,3001c76 + DCL_CRG_SetCoreClkSel(reg, handle->coreClkSelect); + 3002380: fdc42783 lw a5,-36(s0) + 3002384: 4f9c lw a5,24(a5) + 3002386: 85be mv a1,a5 + 3002388: fec42503 lw a0,-20(s0) + 300238c: 31b9 jal ra,3001fda + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 300238e: 3a01 jal ra,3001c9e + + return BASE_STATUS_OK; + 3002390: 4781 li a5,0 +} + 3002392: 853e mv a0,a5 + 3002394: 50b2 lw ra,44(sp) + 3002396: 5422 lw s0,40(sp) + 3002398: 6145 addi sp,sp,48 + 300239a: 8082 ret + +0300239c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +static inline unsigned int CRG_GetVcoFreq(void) +{ + 300239c: 1101 addi sp,sp,-32 + 300239e: ce06 sw ra,28(sp) + 30023a0: cc22 sw s0,24(sp) + 30023a2: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int regFbdiv; + CRG_RegStruct *crg = g_crgBaseAddr; + 30023a4: 2b01a783 lw a5,688(gp) # 40008e4 + 30023a8: fef42623 sw a5,-20(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30023ac: fec42703 lw a4,-20(s0) + 30023b0: 100007b7 lui a5,0x10000 + 30023b4: 00f70a63 beq a4,a5,30023c8 + 30023b8: 12200593 li a1,290 + 30023bc: 0300f7b7 lui a5,0x300f + 30023c0: 08c78513 addi a0,a5,140 # 300f08c + 30023c4: 3159 jal ra,300204a + 30023c6: a001 j 30023c6 + 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); + 30023c8: fec42783 lw a5,-20(s0) + 30023cc: 439c lw a5,0(a5) + 30023ce: 8b85 andi a5,a5,1 + 30023d0: 9f81 uxtb a5 + 30023d2: 853e mv a0,a5 + 30023d4: 2335 jal ra,3002900 + 30023d6: fea42423 sw a0,-24(s0) + freq /= CRG_GetPreDivValue(crg->PERI_CRG1.BIT.pll_prediv); + 30023da: fec42783 lw a5,-20(s0) + 30023de: 43dc lw a5,4(a5) + 30023e0: 8bbd andi a5,a5,15 + 30023e2: 9f81 uxtb a5 + 30023e4: 853e mv a0,a5 + 30023e6: 2391 jal ra,300292a + 30023e8: 872a mv a4,a0 + 30023ea: fe842783 lw a5,-24(s0) + 30023ee: 02e7d7b3 divu a5,a5,a4 + 30023f2: fef42423 sw a5,-24(s0) + regFbdiv = CRG_GetPllFbDivValue(crg->PERI_CRG2.BIT.pll_fbdiv); /* Get the value of the fbdiv register. */ + 30023f6: fec42783 lw a5,-20(s0) + 30023fa: 479c lw a5,8(a5) + 30023fc: 9f81 uxtb a5 + 30023fe: 853e mv a0,a5 + 3002400: 2ba1 jal ra,3002958 + 3002402: fea42223 sw a0,-28(s0) + freq *= (regFbdiv >= 0x06) ? regFbdiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 3002406: fe442783 lw a5,-28(s0) + 300240a: 4719 li a4,6 + 300240c: 00e7f363 bgeu a5,a4,3002412 + 3002410: 4799 li a5,6 + 3002412: fe842703 lw a4,-24(s0) + 3002416: 02f707b3 mul a5,a4,a5 + 300241a: fef42423 sw a5,-24(s0) + return freq; + 300241e: fe842783 lw a5,-24(s0) +} + 3002422: 853e mv a0,a5 + 3002424: 40f2 lw ra,28(sp) + 3002426: 4462 lw s0,24(sp) + 3002428: 6105 addi sp,sp,32 + 300242a: 8082 ret + +0300242c : + * @brief Get PLL Clock Frequence + * @param None + * @retval unsigned int PLL clock frequency + */ +unsigned int HAL_CRG_GetPllFreq(void) +{ + 300242c: 1101 addi sp,sp,-32 + 300242e: ce06 sw ra,28(sp) + 3002430: cc22 sw s0,24(sp) + 3002432: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int pllPostDivValue; + CRG_RegStruct *crg = g_crgBaseAddr; + 3002434: 2b01a783 lw a5,688(gp) # 40008e4 + 3002438: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 300243c: fe842703 lw a4,-24(s0) + 3002440: 100007b7 lui a5,0x10000 + 3002444: 00f70a63 beq a4,a5,3002458 + 3002448: 13700593 li a1,311 + 300244c: 0300f7b7 lui a5,0x300f + 3002450: 08c78513 addi a0,a5,140 # 300f08c + 3002454: 3edd jal ra,300204a + 3002456: a001 j 3002456 + freq = CRG_GetVcoFreq(); + 3002458: 3791 jal ra,300239c + 300245a: fea42623 sw a0,-20(s0) + pllPostDivValue = CRG_GetPllPostDivValue((CRG_PllPostDiv)crg->PERI_CRG3.BIT.pll_postdiv1); + 300245e: fe842783 lw a5,-24(s0) + 3002462: 47dc lw a5,12(a5) + 3002464: 8bbd andi a5,a5,15 + 3002466: 9f81 uxtb a5 + 3002468: 853e mv a0,a5 + 300246a: 2b05 jal ra,300299a + 300246c: fea42223 sw a0,-28(s0) + /* Calculate the PLL output clock frequency based on the VCO clock frequency and post-division coefficient. */ + if (pllPostDivValue != 0) { + 3002470: fe442783 lw a5,-28(s0) + 3002474: cb89 beqz a5,3002486 + freq /= pllPostDivValue; + 3002476: fec42703 lw a4,-20(s0) + 300247a: fe442783 lw a5,-28(s0) + 300247e: 02f757b3 divu a5,a4,a5 + 3002482: fef42623 sw a5,-20(s0) + } + return freq; + 3002486: fec42783 lw a5,-20(s0) +} + 300248a: 853e mv a0,a5 + 300248c: 40f2 lw ra,28(sp) + 300248e: 4462 lw s0,24(sp) + 3002490: 6105 addi sp,sp,32 + 3002492: 8082 ret + +03002494 : + * @brief Get Core Clock Frequence + * @param None + * @retval unsigned int Core clock frequency + */ +unsigned int HAL_CRG_GetCoreClkFreq(void) +{ + 3002494: 1101 addi sp,sp,-32 + 3002496: ce06 sw ra,28(sp) + 3002498: cc22 sw s0,24(sp) + 300249a: 1000 addi s0,sp,32 + unsigned int freq; + unsigned int coreClkSelect; + CRG_RegStruct *crg = g_crgBaseAddr; + 300249c: 2b01a783 lw a5,688(gp) # 40008e4 + 30024a0: fef42423 sw a5,-24(s0) + + CRG_ASSERT_PARAM(IsCRGInstance(crg)); + 30024a4: fe842703 lw a4,-24(s0) + 30024a8: 100007b7 lui a5,0x10000 + 30024ac: 00f70a63 beq a4,a5,30024c0 + 30024b0: 14c00593 li a1,332 + 30024b4: 0300f7b7 lui a5,0x300f + 30024b8: 08c78513 addi a0,a5,140 # 300f08c + 30024bc: 3679 jal ra,300204a + 30024be: a001 j 30024be + coreClkSelect = crg->PERI_CRG64.BIT.clk_pst1_sw_sel; + 30024c0: fe842783 lw a5,-24(s0) + 30024c4: 1007a783 lw a5,256(a5) + 30024c8: 8b8d andi a5,a5,3 + 30024ca: 9f81 uxtb a5 + 30024cc: fef42223 sw a5,-28(s0) + switch (coreClkSelect) { + 30024d0: fe442783 lw a5,-28(s0) + 30024d4: 4705 li a4,1 + 30024d6: 02e78063 beq a5,a4,30024f6 + 30024da: 4705 li a4,1 + 30024dc: 00e7e663 bltu a5,a4,30024e8 + 30024e0: 4709 li a4,2 + 30024e2: 02e78163 beq a5,a4,3002504 + 30024e6: a01d j 300250c + case CRG_CORE_CLK_SELECT_HOSC: /* The clock source is an internal high-speed clock. */ + freq = HOSC_FREQ; + 30024e8: 017d87b7 lui a5,0x17d8 + 30024ec: 84078793 addi a5,a5,-1984 # 17d7840 + 30024f0: fef42623 sw a5,-20(s0) + break; + 30024f4: a015 j 3002518 + + case CRG_CORE_CLK_SELECT_TCXO: /* The clock source is the external crystal oscillator clock. */ + freq = XTRAIL_FREQ; + 30024f6: 01c9c7b7 lui a5,0x1c9c + 30024fa: 38078793 addi a5,a5,896 # 1c9c380 + 30024fe: fef42623 sw a5,-20(s0) + break; + 3002502: a819 j 3002518 + + case CRG_CORE_CLK_SELECT_PLL: /* The clock source is the PLL. */ + freq = HAL_CRG_GetPllFreq(); + 3002504: 3725 jal ra,300242c + 3002506: fea42623 sw a0,-20(s0) + break; + 300250a: a039 j 3002518 + + default: + freq = LOSC_FREQ; + 300250c: 67a1 lui a5,0x8 + 300250e: d0078793 addi a5,a5,-768 # 7d00 + 3002512: fef42623 sw a5,-20(s0) + break; + 3002516: 0001 nop + } + return freq; + 3002518: fec42783 lw a5,-20(s0) +} + 300251c: 853e mv a0,a5 + 300251e: 40f2 lw ra,28(sp) + 3002520: 4462 lw s0,24(sp) + 3002522: 6105 addi sp,sp,32 + 3002524: 8082 ret + +03002526 : + * @brief Get Clock Frequence + * @param handle CRG Handle + * @retval Frequece of IP + */ +unsigned int HAL_CRG_GetIpFreq(const void *baseAddress) +{ + 3002526: 7179 addi sp,sp,-48 + 3002528: d606 sw ra,44(sp) + 300252a: d422 sw s0,40(sp) + 300252c: 1800 addi s0,sp,48 + 300252e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3002532: fdc42783 lw a5,-36(s0) + 3002536: eb89 bnez a5,3002548 + 3002538: 16900593 li a1,361 + 300253c: 0300f7b7 lui a5,0x300f + 3002540: 08c78513 addi a0,a5,140 # 300f08c + 3002544: 3619 jal ra,300204a + 3002546: a001 j 3002546 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3002548: 2b01a703 lw a4,688(gp) # 40008e4 + 300254c: 100007b7 lui a5,0x10000 + 3002550: 00f70a63 beq a4,a5,3002564 + 3002554: 16a00593 li a1,362 + 3002558: 0300f7b7 lui a5,0x300f + 300255c: 08c78513 addi a0,a5,140 # 300f08c + 3002560: 34ed jal ra,300204a + 3002562: a001 j 3002562 +#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(); + 3002564: 3f05 jal ra,3002494 + 3002566: fea42423 sw a0,-24(s0) + unsigned int freq = LOSC_FREQ; + 300256a: 67a1 lui a5,0x8 + 300256c: d0078793 addi a5,a5,-768 # 7d00 + 3002570: fef42623 sw a5,-20(s0) + unsigned int coreClkFreq; + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3002574: fdc42503 lw a0,-36(s0) + 3002578: c15fe0ef jal ra,300118c + 300257c: fea42223 sw a0,-28(s0) + if (p == NULL) { + 3002580: fe442783 lw a5,-28(s0) + 3002584: e781 bnez a5,300258c + return freq; + 3002586: fec42783 lw a5,-20(s0) + 300258a: a885 j 30025fa + } + switch (p->type) { + 300258c: fe442783 lw a5,-28(s0) + 3002590: 43dc lw a5,4(a5) + 3002592: 4715 li a4,5 + 3002594: 04f76863 bltu a4,a5,30025e4 + 3002598: 00279713 slli a4,a5,0x2 + 300259c: 0300f7b7 lui a5,0x300f + 30025a0: 0c878793 addi a5,a5,200 # 300f0c8 + 30025a4: 97ba add a5,a5,a4 + 30025a6: 439c lw a5,0(a5) + 30025a8: 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. */ + 30025aa: fe842783 lw a5,-24(s0) + 30025ae: fef42623 sw a5,-20(s0) + break; + 30025b2: a815 j 30025e6 + + case CRG_IP_CAN: + freq = CRG_GetPllRefIni(g_crgBaseAddr->PERI_CRG0.BIT.pll_ref_cksel); + 30025b4: 2b01a783 lw a5,688(gp) # 40008e4 + 30025b8: 439c lw a5,0(a5) + 30025ba: 8b85 andi a5,a5,1 + 30025bc: 9f81 uxtb a5 + 30025be: 853e mv a0,a5 + 30025c0: 2681 jal ra,3002900 + 30025c2: fea42623 sw a0,-20(s0) + break; + 30025c6: a005 j 30025e6 + + case CRG_IP_ADC: + /* Get core clock frequence for calculating the ADC clock frequency. */ + coreClkFreq = HAL_CRG_GetCoreClkFreq(); + 30025c8: 35f1 jal ra,3002494 + 30025ca: fea42023 sw a0,-32(s0) + freq = CRG_GetAdcIpFreq(p, CRG_GetVcoFreq(), coreClkFreq); + 30025ce: 33f9 jal ra,300239c + 30025d0: 87aa mv a5,a0 + 30025d2: fe042603 lw a2,-32(s0) + 30025d6: 85be mv a1,a5 + 30025d8: fe442503 lw a0,-28(s0) + 30025dc: 28dd jal ra,30026d2 + 30025de: fea42623 sw a0,-20(s0) + break; + 30025e2: a011 j 30025e6 + + case CRG_IP_IWDG: /* The IWDG clock frequency is an internal low-speed clock. */ + default: + break; + 30025e4: 0001 nop + } + if (freq == 0) { + 30025e6: fec42783 lw a5,-20(s0) + 30025ea: e791 bnez a5,30025f6 + freq = LOSC_FREQ; + 30025ec: 67a1 lui a5,0x8 + 30025ee: d0078793 addi a5,a5,-768 # 7d00 + 30025f2: fef42623 sw a5,-20(s0) + } + return freq; + 30025f6: fec42783 lw a5,-20(s0) +#endif +} + 30025fa: 853e mv a0,a5 + 30025fc: 50b2 lw ra,44(sp) + 30025fe: 5422 lw s0,40(sp) + 3002600: 6145 addi sp,sp,48 + 3002602: 8082 ret + +03002604 : + * @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) +{ + 3002604: 7179 addi sp,sp,-48 + 3002606: d606 sw ra,44(sp) + 3002608: d422 sw s0,40(sp) + 300260a: 1800 addi s0,sp,48 + 300260c: fca42e23 sw a0,-36(s0) + 3002610: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(baseAddress != NULL); + 3002614: fdc42783 lw a5,-36(s0) + 3002618: eb89 bnez a5,300262a + 300261a: 19c00593 li a1,412 + 300261e: 0300f7b7 lui a5,0x300f + 3002622: 08c78513 addi a0,a5,140 # 300f08c + 3002626: 3415 jal ra,300204a + 3002628: a001 j 3002628 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 300262a: 2b01a703 lw a4,688(gp) # 40008e4 + 300262e: 100007b7 lui a5,0x10000 + 3002632: 00f70a63 beq a4,a5,3002646 + 3002636: 19d00593 li a1,413 + 300263a: 0300f7b7 lui a5,0x300f + 300263e: 08c78513 addi a0,a5,140 # 300f08c + 3002642: 3421 jal ra,300204a + 3002644: a001 j 3002644 + /* Check the validity of the input parameters. */ + CRG_PARAM_CHECK_WITH_RET((enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE), BASE_STATUS_ERROR); + 3002646: fd842703 lw a4,-40(s0) + 300264a: 4785 li a5,1 + 300264c: 00f70e63 beq a4,a5,3002668 + 3002650: fd842783 lw a5,-40(s0) + 3002654: cb91 beqz a5,3002668 + 3002656: 19f00593 li a1,415 + 300265a: 0300f7b7 lui a5,0x300f + 300265e: 08c78513 addi a0,a5,140 # 300f08c + 3002662: 32e5 jal ra,300204a + 3002664: 4785 li a5,1 + 3002666: a08d j 30026c8 + /* Get the CRG type of the target IP. */ + CHIP_CrgIpMatchInfo *p = GetCrgIpMatchInfo(baseAddress); + 3002668: fdc42503 lw a0,-36(s0) + 300266c: b21fe0ef jal ra,300118c + 3002670: fea42623 sw a0,-20(s0) + if ((p == NULL) || (p->type >= CRG_IP_MAX_TYPE)) { + 3002674: fec42783 lw a5,-20(s0) + 3002678: c799 beqz a5,3002686 + 300267a: fec42783 lw a5,-20(s0) + 300267e: 43d8 lw a4,4(a5) + 3002680: 4795 li a5,5 + 3002682: 00e7f463 bgeu a5,a4,300268a + return BASE_STATUS_ERROR; + 3002686: 4785 li a5,1 + 3002688: a081 j 30026c8 + } + if (g_ipClkProc[p->type].enableSet == NULL) { + 300268a: fec42783 lw a5,-20(s0) + 300268e: 43d4 lw a3,4(a5) + 3002690: 9f018713 addi a4,gp,-1552 # 4000024 + 3002694: 02400793 li a5,36 + 3002698: 02f687b3 mul a5,a3,a5 + 300269c: 97ba add a5,a5,a4 + 300269e: 479c lw a5,8(a5) + 30026a0: e399 bnez a5,30026a6 + return BASE_STATUS_ERROR; + 30026a2: 4785 li a5,1 + 30026a4: a015 j 30026c8 + } + g_ipClkProc[p->type].enableSet(p, enable); + 30026a6: fec42783 lw a5,-20(s0) + 30026aa: 43d4 lw a3,4(a5) + 30026ac: 9f018713 addi a4,gp,-1552 # 4000024 + 30026b0: 02400793 li a5,36 + 30026b4: 02f687b3 mul a5,a3,a5 + 30026b8: 97ba add a5,a5,a4 + 30026ba: 479c lw a5,8(a5) + 30026bc: fd842583 lw a1,-40(s0) + 30026c0: fec42503 lw a0,-20(s0) + 30026c4: 9782 jalr a5 + return BASE_STATUS_OK; + 30026c6: 4781 li a5,0 +} + 30026c8: 853e mv a0,a5 + 30026ca: 50b2 lw ra,44(sp) + 30026cc: 5422 lw s0,40(sp) + 30026ce: 6145 addi sp,sp,48 + 30026d0: 8082 ret + +030026d2 : + * @param coreClkFreq core clock rate + * @retval Ip Frequence + */ +static unsigned int CRG_GetAdcIpFreq(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int baseClkRate, + unsigned int coreClkFreq) +{ + 30026d2: 7139 addi sp,sp,-64 + 30026d4: de06 sw ra,60(sp) + 30026d6: dc22 sw s0,56(sp) + 30026d8: 0080 addi s0,sp,64 + 30026da: fca42623 sw a0,-52(s0) + 30026de: fcb42423 sw a1,-56(s0) + 30026e2: fcc42223 sw a2,-60(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30026e6: fcc42783 lw a5,-52(s0) + 30026ea: eb89 bnez a5,30026fc + 30026ec: 2af00593 li a1,687 + 30026f0: 0300f7b7 lui a5,0x300f + 30026f4: 08c78513 addi a0,a5,140 # 300f08c + 30026f8: 2f11 jal ra,3002e0c + 30026fa: a001 j 30026fa + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30026fc: 2b01a783 lw a5,688(gp) # 40008e4 + 3002700: eb89 bnez a5,3002712 + 3002702: 2b000593 li a1,688 + 3002706: 0300f7b7 lui a5,0x300f + 300270a: 08c78513 addi a0,a5,140 # 300f08c + 300270e: 2dfd jal ra,3002e0c + 3002710: a001 j 3002710 + + unsigned int clkSel; + unsigned int clkDiv; + unsigned int pst2Div; + unsigned int freq = 0; + 3002712: fe042623 sw zero,-20(s0) + + /* Obtains the clock source selection of the ADC. */ + const CRG_IpProc *proc = &g_ipClkProc[matchInfo->type]; + 3002716: fcc42783 lw a5,-52(s0) + 300271a: 43d8 lw a4,4(a5) + 300271c: 02400793 li a5,36 + 3002720: 02f70733 mul a4,a4,a5 + 3002724: 9f018793 addi a5,gp,-1552 # 4000024 + 3002728: 97ba add a5,a5,a4 + 300272a: fef42423 sw a5,-24(s0) + if (proc->clkSelGet == NULL) { + 300272e: fe842783 lw a5,-24(s0) + 3002732: 4fdc lw a5,28(a5) + 3002734: e399 bnez a5,300273a + return 0; + 3002736: 4781 li a5,0 + 3002738: a06d j 30027e2 + } + clkSel = proc->clkSelGet(matchInfo); + 300273a: fe842783 lw a5,-24(s0) + 300273e: 4fdc lw a5,28(a5) + 3002740: fcc42503 lw a0,-52(s0) + 3002744: 9782 jalr a5 + 3002746: fea42223 sw a0,-28(s0) + /* Calculate the frequency from the ADC's clock source. */ + if (clkSel == CRG_ADC_CLK_SYN_CORE) { + 300274a: fe442703 lw a4,-28(s0) + 300274e: 478d li a5,3 + 3002750: 00f71763 bne a4,a5,300275e + freq = coreClkFreq; + 3002754: fc442783 lw a5,-60(s0) + 3002758: fef42623 sw a5,-20(s0) + 300275c: a8b1 j 30027b8 + } else if (clkSel == CRG_ADC_CLK_ASYN_HOSC) { + 300275e: fe442783 lw a5,-28(s0) + 3002762: eb81 bnez a5,3002772 + freq = HOSC_FREQ; + 3002764: 017d87b7 lui a5,0x17d8 + 3002768: 84078793 addi a5,a5,-1984 # 17d7840 + 300276c: fef42623 sw a5,-20(s0) + 3002770: a0a1 j 30027b8 + } else if (clkSel == CRG_ADC_CLK_ASYN_TCXO) { + 3002772: fe442703 lw a4,-28(s0) + 3002776: 4785 li a5,1 + 3002778: 00f71963 bne a4,a5,300278a + /* The maximum speed of the external clock source is 30000000U. */ + freq = (XTRAIL_FREQ > 30000000U) ? 0 : XTRAIL_FREQ; + 300277c: 01c9c7b7 lui a5,0x1c9c + 3002780: 38078793 addi a5,a5,896 # 1c9c380 + 3002784: fef42623 sw a5,-20(s0) + 3002788: a805 j 30027b8 + } else if (clkSel == CRG_ADC_CLK_ASYN_PLL_DIV) { + 300278a: fe442703 lw a4,-28(s0) + 300278e: 4789 li a5,2 + 3002790: 02f71463 bne a4,a5,30027b8 + pst2Div = CRG_GetPllPostDivValue((CRG_PllPostDiv)g_crgBaseAddr->PERI_CRG3.BIT.pll_postdiv2); + 3002794: 2b01a783 lw a5,688(gp) # 40008e4 + 3002798: 47dc lw a5,12(a5) + 300279a: 8391 srli a5,a5,0x4 + 300279c: 8bbd andi a5,a5,15 + 300279e: 9f81 uxtb a5 + 30027a0: 853e mv a0,a5 + 30027a2: 2ae5 jal ra,300299a + 30027a4: fea42023 sw a0,-32(s0) + freq = baseClkRate / pst2Div; + 30027a8: fc842703 lw a4,-56(s0) + 30027ac: fe042783 lw a5,-32(s0) + 30027b0: 02f757b3 divu a5,a4,a5 + 30027b4: fef42623 sw a5,-20(s0) + } + + /* Obtain the frequency divider based on the ADC clock source. */ + if (proc->clkDivGet == NULL) { + 30027b8: fe842783 lw a5,-24(s0) + 30027bc: 539c lw a5,32(a5) + 30027be: e399 bnez a5,30027c4 + return 0; + 30027c0: 4781 li a5,0 + 30027c2: a005 j 30027e2 + } + clkDiv = proc->clkDivGet(matchInfo); + 30027c4: fe842783 lw a5,-24(s0) + 30027c8: 539c lw a5,32(a5) + 30027ca: fcc42503 lw a0,-52(s0) + 30027ce: 9782 jalr a5 + 30027d0: fca42e23 sw a0,-36(s0) + /* Calculate the clock frequency of the ADC. */ + return (freq / (clkDiv + 1)); + 30027d4: fdc42783 lw a5,-36(s0) + 30027d8: 0785 addi a5,a5,1 + 30027da: fec42703 lw a4,-20(s0) + 30027de: 02f757b3 divu a5,a4,a5 +} + 30027e2: 853e mv a0,a5 + 30027e4: 50f2 lw ra,60(sp) + 30027e6: 5462 lw s0,56(sp) + 30027e8: 6121 addi sp,sp,64 + 30027ea: 8082 ret + +030027ec : + * @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) +{ + 30027ec: 7179 addi sp,sp,-48 + 30027ee: d606 sw ra,44(sp) + 30027f0: d422 sw s0,40(sp) + 30027f2: 1800 addi s0,sp,48 + 30027f4: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + unsigned int freq; + + freq = CRG_GetPllRefIni(handle->pllRefClkSelect); + 30027f8: fdc42783 lw a5,-36(s0) + 30027fc: 43dc lw a5,4(a5) + 30027fe: 853e mv a0,a5 + 3002800: 2201 jal ra,3002900 + 3002802: fea42623 sw a0,-20(s0) + preDiv = CRG_GetPreDivValue(handle->pllPreDiv); + 3002806: fdc42783 lw a5,-36(s0) + 300280a: 479c lw a5,8(a5) + 300280c: 853e mv a0,a5 + 300280e: 2a31 jal ra,300292a + 3002810: fea42423 sw a0,-24(s0) + /* Check the validity of the prescaled clock frequency. */ + if (!IsCrgValidPreDiv(freq, preDiv)) { + 3002814: fe842583 lw a1,-24(s0) + 3002818: fec42503 lw a0,-20(s0) + 300281c: dc6ff0ef jal ra,3001de2 + 3002820: 87aa mv a5,a0 + 3002822: 0017c793 xori a5,a5,1 + 3002826: 9f81 uxtb a5 + 3002828: c399 beqz a5,300282e + return BASE_STATUS_ERROR; + 300282a: 4785 li a5,1 + 300282c: a8a5 j 30028a4 + } + freq /= preDiv; + 300282e: fec42703 lw a4,-20(s0) + 3002832: fe842783 lw a5,-24(s0) + 3002836: 02f757b3 divu a5,a4,a5 + 300283a: fef42623 sw a5,-20(s0) + /* Check the validity of the clock frequency after frequency multiplication. */ + if (!IsCrgValidFdDiv(freq, handle->pllFbDiv)) { + 300283e: fdc42783 lw a5,-36(s0) + 3002842: 47dc lw a5,12(a5) + 3002844: 85be mv a1,a5 + 3002846: fec42503 lw a0,-20(s0) + 300284a: df6ff0ef jal ra,3001e40 + 300284e: 87aa mv a5,a0 + 3002850: 0017c793 xori a5,a5,1 + 3002854: 9f81 uxtb a5 + 3002856: c399 beqz a5,300285c + return BASE_STATUS_ERROR; + 3002858: 4785 li a5,1 + 300285a: a0a9 j 30028a4 + } + freq *= (handle->pllFbDiv > 0x06) ? handle->pllFbDiv : 0x06; /* 0x0-0x6: divided by 0x6 */ + 300285c: fdc42783 lw a5,-36(s0) + 3002860: 47dc lw a5,12(a5) + 3002862: 4719 li a4,6 + 3002864: 00e7f363 bgeu a5,a4,300286a + 3002868: 4799 li a5,6 + 300286a: fec42703 lw a4,-20(s0) + 300286e: 02f707b3 mul a5,a4,a5 + 3002872: fef42623 sw a5,-20(s0) + /* Check whether the PLL output frequency is valid. */ + if (IsCrgValidPostDiv(freq, handle->pllPostDiv) && IsCrgValidPostDiv2(freq, handle->handleEx.pllPostDiv2)) { + 3002876: fdc42783 lw a5,-36(s0) + 300287a: 4b9c lw a5,16(a5) + 300287c: 85be mv a1,a5 + 300287e: fec42503 lw a0,-20(s0) + 3002882: e48ff0ef jal ra,3001eca + 3002886: 87aa mv a5,a0 + 3002888: cf89 beqz a5,30028a2 + 300288a: fdc42783 lw a5,-36(s0) + 300288e: 4fdc lw a5,28(a5) + 3002890: 85be mv a1,a5 + 3002892: fec42503 lw a0,-20(s0) + 3002896: e7cff0ef jal ra,3001f12 + 300289a: 87aa mv a5,a0 + 300289c: c399 beqz a5,30028a2 + return BASE_STATUS_OK; + 300289e: 4781 li a5,0 + 30028a0: a011 j 30028a4 + } + return BASE_STATUS_ERROR; + 30028a2: 4785 li a5,1 +} + 30028a4: 853e mv a0,a5 + 30028a6: 50b2 lw ra,44(sp) + 30028a8: 5422 lw s0,40(sp) + 30028aa: 6145 addi sp,sp,48 + 30028ac: 8082 ret + +030028ae : + * @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) +{ + 30028ae: 7179 addi sp,sp,-48 + 30028b0: d622 sw s0,44(sp) + 30028b2: 1800 addi s0,sp,48 + 30028b4: 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; + 30028b8: fdc42783 lw a5,-36(s0) + 30028bc: 539c lw a5,32(a5) + 30028be: e791 bnez a5,30028ca + 30028c0: 017d87b7 lui a5,0x17d8 + 30028c4: 84078793 addi a5,a5,-1984 # 17d7840 + 30028c8: a029 j 30028d2 + 30028ca: 01c9c7b7 lui a5,0x1c9c + 30028ce: 38078793 addi a5,a5,896 # 1c9c380 + 30028d2: fef42623 sw a5,-20(s0) + /* Check whether the 1MHz output frequency is valid. */ + if ((freq / (handle->handleEx.clk1MDiv + 1)) == CRG_FREQ_1MHz) { + 30028d6: fdc42783 lw a5,-36(s0) + 30028da: 53dc lw a5,36(a5) + 30028dc: 0785 addi a5,a5,1 + 30028de: fec42703 lw a4,-20(s0) + 30028e2: 02f75733 divu a4,a4,a5 + 30028e6: 000f47b7 lui a5,0xf4 + 30028ea: 24078793 addi a5,a5,576 # f4240 + 30028ee: 00f71463 bne a4,a5,30028f6 + return BASE_STATUS_OK; + 30028f2: 4781 li a5,0 + 30028f4: a011 j 30028f8 + } + return BASE_STATUS_ERROR; + 30028f6: 4785 li a5,1 +} + 30028f8: 853e mv a0,a5 + 30028fa: 5432 lw s0,44(sp) + 30028fc: 6145 addi sp,sp,48 + 30028fe: 8082 ret + +03002900 : + * @brief Get clock frequence + * @param crg CRG_RegStruct + * @retval The frequence fo clock + */ +static inline unsigned int CRG_GetPllRefIni(CRG_PllRefClkSelect pllRefClkSelect) +{ + 3002900: 1101 addi sp,sp,-32 + 3002902: ce22 sw s0,28(sp) + 3002904: 1000 addi s0,sp,32 + 3002906: 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; + 300290a: fec42783 lw a5,-20(s0) + 300290e: e791 bnez a5,300291a + 3002910: 017d87b7 lui a5,0x17d8 + 3002914: 84078793 addi a5,a5,-1984 # 17d7840 + 3002918: a029 j 3002922 + 300291a: 01c9c7b7 lui a5,0x1c9c + 300291e: 38078793 addi a5,a5,896 # 1c9c380 +} + 3002922: 853e mv a0,a5 + 3002924: 4472 lw s0,28(sp) + 3002926: 6105 addi sp,sp,32 + 3002928: 8082 ret + +0300292a : + * @brief Get previous division Value before PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPreDivValue(CRG_PllPreDiv pllPredDiv) +{ + 300292a: 7179 addi sp,sp,-48 + 300292c: d622 sw s0,44(sp) + 300292e: 1800 addi s0,sp,48 + 3002930: fca42e23 sw a0,-36(s0) + unsigned int preDiv; + if (pllPredDiv <= CRG_PLL_PREDIV_1) { /* 0 or 1 returns PLL_PREDIV_OUT_1. */ + 3002934: fdc42783 lw a5,-36(s0) + 3002938: e789 bnez a5,3002942 + preDiv = PLL_PREDIV_OUT_1; + 300293a: 4785 li a5,1 + 300293c: fef42623 sw a5,-20(s0) + 3002940: a031 j 300294c + } else { + preDiv = pllPredDiv + 1; + 3002942: fdc42783 lw a5,-36(s0) + 3002946: 0785 addi a5,a5,1 + 3002948: fef42623 sw a5,-20(s0) + } + return preDiv; + 300294c: fec42783 lw a5,-20(s0) +} + 3002950: 853e mv a0,a5 + 3002952: 5432 lw s0,44(sp) + 3002954: 6145 addi sp,sp,48 + 3002956: 8082 ret + +03002958 : + * @brief Get PLL loop divider ratio + * @param crg CRG_RegStruct + * @retval PLL loop divider ratio + */ +static inline unsigned int CRG_GetPllFbDivValue(unsigned int pllFbDiv) +{ + 3002958: 7179 addi sp,sp,-48 + 300295a: d622 sw s0,44(sp) + 300295c: 1800 addi s0,sp,48 + 300295e: fca42e23 sw a0,-36(s0) + unsigned int div = pllFbDiv; + 3002962: fdc42783 lw a5,-36(s0) + 3002966: fef42623 sw a5,-20(s0) + /* Check the validity of the minimum frequency multiplication parameter. */ + if (div < CRG_PLL_FBDIV_MIN) { + 300296a: fec42703 lw a4,-20(s0) + 300296e: 4795 li a5,5 + 3002970: 00e7e563 bltu a5,a4,300297a + div = CRG_PLL_FBDIV_MIN; + 3002974: 4799 li a5,6 + 3002976: fef42623 sw a5,-20(s0) + } + /* Check the validity of the maximum frequency multiplication parameter. */ + if (div > CRG_PLL_FBDIV_MAX) { + 300297a: fec42703 lw a4,-20(s0) + 300297e: 07f00793 li a5,127 + 3002982: 00e7f663 bgeu a5,a4,300298e + div = CRG_PLL_FBDIV_MAX; + 3002986: 07f00793 li a5,127 + 300298a: fef42623 sw a5,-20(s0) + } + return div; + 300298e: fec42783 lw a5,-20(s0) +} + 3002992: 853e mv a0,a5 + 3002994: 5432 lw s0,44(sp) + 3002996: 6145 addi sp,sp,48 + 3002998: 8082 ret + +0300299a : + * @brief Get post division Value after PLL + * @param crg CRG_RegStruct + * @retval Previous Div value + */ +static inline unsigned int CRG_GetPllPostDivValue(unsigned int pllPostDiv) +{ + 300299a: 7179 addi sp,sp,-48 + 300299c: d622 sw s0,44(sp) + 300299e: 1800 addi s0,sp,48 + 30029a0: fca42e23 sw a0,-36(s0) + unsigned int div = pllPostDiv; + 30029a4: fdc42783 lw a5,-36(s0) + 30029a8: fef42623 sw a5,-20(s0) + if (div > CRG_PLL_POSTDIV_8) { + 30029ac: fec42703 lw a4,-20(s0) + 30029b0: 479d li a5,7 + 30029b2: 00e7f663 bgeu a5,a4,30029be + div = (CRG_PLL_POSTDIV_8 + 1); /* If the postdiv is greater than 8, set this postdiv to 8. */ + 30029b6: 47a1 li a5,8 + 30029b8: fef42623 sw a5,-20(s0) + 30029bc: a031 j 30029c8 + } else { + div += 1; + 30029be: fec42783 lw a5,-20(s0) + 30029c2: 0785 addi a5,a5,1 + 30029c4: fef42623 sw a5,-20(s0) + } + return div; + 30029c8: fec42783 lw a5,-20(s0) +} + 30029cc: 853e mv a0,a5 + 30029ce: 5432 lw s0,44(sp) + 30029d0: 6145 addi sp,sp,48 + 30029d2: 8082 ret + +030029d4 : + * @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) +{ + 30029d4: 7179 addi sp,sp,-48 + 30029d6: d606 sw ra,44(sp) + 30029d8: d422 sw s0,40(sp) + 30029da: 1800 addi s0,sp,48 + 30029dc: fca42e23 sw a0,-36(s0) + 30029e0: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30029e4: fdc42783 lw a5,-36(s0) + 30029e8: eb89 bnez a5,30029fa + 30029ea: 34d00593 li a1,845 + 30029ee: 0300f7b7 lui a5,0x300f + 30029f2: 08c78513 addi a0,a5,140 # 300f08c + 30029f6: 2919 jal ra,3002e0c + 30029f8: a001 j 30029f8 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30029fa: 2b01a783 lw a5,688(gp) # 40008e4 + 30029fe: eb89 bnez a5,3002a10 + 3002a00: 34e00593 li a1,846 + 3002a04: 0300f7b7 lui a5,0x300f + 3002a08: 08c78513 addi a0,a5,140 # 300f08c + 3002a0c: 2101 jal ra,3002e0c + 3002a0e: a001 j 3002a0e + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002a10: 2b01a783 lw a5,688(gp) # 40008e4 + 3002a14: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3002a18: fdc42783 lw a5,-36(s0) + 3002a1c: 279e lhu a5,8(a5) + 3002a1e: 873e mv a4,a5 + 3002a20: fec42783 lw a5,-20(s0) + 3002a24: 97ba add a5,a5,a4 + 3002a26: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3002a2a: fe842783 lw a5,-24(s0) + 3002a2e: 439c lw a5,0(a5) + 3002a30: fef42223 sw a5,-28(s0) + if (enable & IP_CLK_ENABLE) { /* Set enable of target ip. */ + 3002a34: fd842783 lw a5,-40(s0) + 3002a38: 8b85 andi a5,a5,1 + 3002a3a: c7c1 beqz a5,3002ac2 + cfg.BIT.clkEnMask |= 1 << matchInfo->bitOffset; + 3002a3c: fe442783 lw a5,-28(s0) + 3002a40: 9fa1 uxth a5 + 3002a42: 01079713 slli a4,a5,0x10 + 3002a46: 8741 srai a4,a4,0x10 + 3002a48: fdc42783 lw a5,-36(s0) + 3002a4c: 27bc lbu a5,10(a5) + 3002a4e: 86be mv a3,a5 + 3002a50: 4785 li a5,1 + 3002a52: 00d797b3 sll a5,a5,a3 + 3002a56: 07c2 slli a5,a5,0x10 + 3002a58: 87c1 srai a5,a5,0x10 + 3002a5a: 8fd9 or a5,a5,a4 + 3002a5c: 07c2 slli a5,a5,0x10 + 3002a5e: 87c1 srai a5,a5,0x10 + 3002a60: 01079693 slli a3,a5,0x10 + 3002a64: 82c1 srli a3,a3,0x10 + 3002a66: fe442783 lw a5,-28(s0) + 3002a6a: 6741 lui a4,0x10 + 3002a6c: 177d addi a4,a4,-1 # ffff + 3002a6e: 8f75 and a4,a4,a3 + 3002a70: 76c1 lui a3,0xffff0 + 3002a72: 8ff5 and a5,a5,a3 + 3002a74: 8fd9 or a5,a5,a4 + 3002a76: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); + 3002a7a: fe442783 lw a5,-28(s0) + 3002a7e: 83c1 srli a5,a5,0x10 + 3002a80: 9fa1 uxth a5 + 3002a82: 01079713 slli a4,a5,0x10 + 3002a86: 8741 srai a4,a4,0x10 + 3002a88: fdc42783 lw a5,-36(s0) + 3002a8c: 27bc lbu a5,10(a5) + 3002a8e: 86be mv a3,a5 + 3002a90: 4785 li a5,1 + 3002a92: 00d797b3 sll a5,a5,a3 + 3002a96: 07c2 slli a5,a5,0x10 + 3002a98: 87c1 srai a5,a5,0x10 + 3002a9a: fff7c793 not a5,a5 + 3002a9e: 07c2 slli a5,a5,0x10 + 3002aa0: 87c1 srai a5,a5,0x10 + 3002aa2: 8ff9 and a5,a5,a4 + 3002aa4: 07c2 slli a5,a5,0x10 + 3002aa6: 87c1 srai a5,a5,0x10 + 3002aa8: 01079713 slli a4,a5,0x10 + 3002aac: 8341 srli a4,a4,0x10 + 3002aae: fe442783 lw a5,-28(s0) + 3002ab2: 0742 slli a4,a4,0x10 + 3002ab4: 66c1 lui a3,0x10 + 3002ab6: 16fd addi a3,a3,-1 # ffff + 3002ab8: 8ff5 and a5,a5,a3 + 3002aba: 8fd9 or a5,a5,a4 + 3002abc: fef42223 sw a5,-28(s0) + 3002ac0: a059 j 3002b46 + } else { + cfg.BIT.clkEnMask &= ~(1 << matchInfo->bitOffset); /* Disable of target ip. */ + 3002ac2: fe442783 lw a5,-28(s0) + 3002ac6: 9fa1 uxth a5 + 3002ac8: 01079713 slli a4,a5,0x10 + 3002acc: 8741 srai a4,a4,0x10 + 3002ace: fdc42783 lw a5,-36(s0) + 3002ad2: 27bc lbu a5,10(a5) + 3002ad4: 86be mv a3,a5 + 3002ad6: 4785 li a5,1 + 3002ad8: 00d797b3 sll a5,a5,a3 + 3002adc: 07c2 slli a5,a5,0x10 + 3002ade: 87c1 srai a5,a5,0x10 + 3002ae0: fff7c793 not a5,a5 + 3002ae4: 07c2 slli a5,a5,0x10 + 3002ae6: 87c1 srai a5,a5,0x10 + 3002ae8: 8ff9 and a5,a5,a4 + 3002aea: 07c2 slli a5,a5,0x10 + 3002aec: 87c1 srai a5,a5,0x10 + 3002aee: 01079693 slli a3,a5,0x10 + 3002af2: 82c1 srli a3,a3,0x10 + 3002af4: fe442783 lw a5,-28(s0) + 3002af8: 6741 lui a4,0x10 + 3002afa: 177d addi a4,a4,-1 # ffff + 3002afc: 8f75 and a4,a4,a3 + 3002afe: 76c1 lui a3,0xffff0 + 3002b00: 8ff5 and a5,a5,a3 + 3002b02: 8fd9 or a5,a5,a4 + 3002b04: fef42223 sw a5,-28(s0) + cfg.BIT.softResetReq |= (1 << matchInfo->bitOffset); + 3002b08: fe442783 lw a5,-28(s0) + 3002b0c: 83c1 srli a5,a5,0x10 + 3002b0e: 9fa1 uxth a5 + 3002b10: 01079713 slli a4,a5,0x10 + 3002b14: 8741 srai a4,a4,0x10 + 3002b16: fdc42783 lw a5,-36(s0) + 3002b1a: 27bc lbu a5,10(a5) + 3002b1c: 86be mv a3,a5 + 3002b1e: 4785 li a5,1 + 3002b20: 00d797b3 sll a5,a5,a3 + 3002b24: 07c2 slli a5,a5,0x10 + 3002b26: 87c1 srai a5,a5,0x10 + 3002b28: 8fd9 or a5,a5,a4 + 3002b2a: 07c2 slli a5,a5,0x10 + 3002b2c: 87c1 srai a5,a5,0x10 + 3002b2e: 01079713 slli a4,a5,0x10 + 3002b32: 8341 srli a4,a4,0x10 + 3002b34: fe442783 lw a5,-28(s0) + 3002b38: 0742 slli a4,a4,0x10 + 3002b3a: 66c1 lui a3,0x10 + 3002b3c: 16fd addi a3,a3,-1 # ffff + 3002b3e: 8ff5 and a5,a5,a3 + 3002b40: 8fd9 or a5,a5,a4 + 3002b42: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3002b46: fe442703 lw a4,-28(s0) + 3002b4a: fe842783 lw a5,-24(s0) + 3002b4e: c398 sw a4,0(a5) +} + 3002b50: 0001 nop + 3002b52: 50b2 lw ra,44(sp) + 3002b54: 5422 lw s0,40(sp) + 3002b56: 6145 addi sp,sp,48 + 3002b58: 8082 ret + +03002b5a : + * @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) +{ + 3002b5a: 7179 addi sp,sp,-48 + 3002b5c: d606 sw ra,44(sp) + 3002b5e: d422 sw s0,40(sp) + 3002b60: 1800 addi s0,sp,48 + 3002b62: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002b66: fdc42783 lw a5,-36(s0) + 3002b6a: eb89 bnez a5,3002b7c + 3002b6c: 36500593 li a1,869 + 3002b70: 0300f7b7 lui a5,0x300f + 3002b74: 08c78513 addi a0,a5,140 # 300f08c + 3002b78: 2c51 jal ra,3002e0c + 3002b7a: a001 j 3002b7a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002b7c: 2b01a783 lw a5,688(gp) # 40008e4 + 3002b80: eb89 bnez a5,3002b92 + 3002b82: 36600593 li a1,870 + 3002b86: 0300f7b7 lui a5,0x300f + 3002b8a: 08c78513 addi a0,a5,140 # 300f08c + 3002b8e: 2cbd jal ra,3002e0c + 3002b90: a001 j 3002b90 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002b92: 2b01a783 lw a5,688(gp) # 40008e4 + 3002b96: fef42623 sw a5,-20(s0) + /* Get enable status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3002b9a: fdc42783 lw a5,-36(s0) + 3002b9e: 279e lhu a5,8(a5) + 3002ba0: 873e mv a4,a5 + 3002ba2: fec42783 lw a5,-20(s0) + 3002ba6: 97ba add a5,a5,a4 + 3002ba8: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + + cfg.value = p->value; + 3002bac: fe842783 lw a5,-24(s0) + 3002bb0: 439c lw a5,0(a5) + 3002bb2: fef42223 sw a5,-28(s0) + return (cfg.BIT.clkEnMask & (1 << matchInfo->bitOffset)) == 0 ? false : true; + 3002bb6: fe442783 lw a5,-28(s0) + 3002bba: 9fa1 uxth a5 + 3002bbc: 873e mv a4,a5 + 3002bbe: fdc42783 lw a5,-36(s0) + 3002bc2: 27bc lbu a5,10(a5) + 3002bc4: 40f757b3 sra a5,a4,a5 + 3002bc8: 8b85 andi a5,a5,1 + 3002bca: 00f037b3 snez a5,a5 + 3002bce: 9f81 uxtb a5 +} + 3002bd0: 853e mv a0,a5 + 3002bd2: 50b2 lw ra,44(sp) + 3002bd4: 5422 lw s0,40(sp) + 3002bd6: 6145 addi sp,sp,48 + 3002bd8: 8082 ret + +03002bda : + * @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) +{ + 3002bda: 7179 addi sp,sp,-48 + 3002bdc: d606 sw ra,44(sp) + 3002bde: d422 sw s0,40(sp) + 3002be0: 1800 addi s0,sp,48 + 3002be2: fca42e23 sw a0,-36(s0) + 3002be6: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002bea: fdc42783 lw a5,-36(s0) + 3002bee: eb89 bnez a5,3002c00 + 3002bf0: 37900593 li a1,889 + 3002bf4: 0300f7b7 lui a5,0x300f + 3002bf8: 08c78513 addi a0,a5,140 # 300f08c + 3002bfc: 2c01 jal ra,3002e0c + 3002bfe: a001 j 3002bfe + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002c00: 2b01a783 lw a5,688(gp) # 40008e4 + 3002c04: eb89 bnez a5,3002c16 + 3002c06: 37a00593 li a1,890 + 3002c0a: 0300f7b7 lui a5,0x300f + 3002c0e: 08c78513 addi a0,a5,140 # 300f08c + 3002c12: 2aed jal ra,3002e0c + 3002c14: a001 j 3002c14 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002c16: 2b01a783 lw a5,688(gp) # 40008e4 + 3002c1a: fef42623 sw a5,-20(s0) + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3002c1e: fdc42783 lw a5,-36(s0) + 3002c22: 279e lhu a5,8(a5) + 3002c24: 873e mv a4,a5 + 3002c26: fec42783 lw a5,-20(s0) + 3002c2a: 97ba add a5,a5,a4 + 3002c2c: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3002c30: fe842783 lw a5,-24(s0) + 3002c34: 439c lw a5,0(a5) + 3002c36: fef42223 sw a5,-28(s0) + if (reset & BASE_CFG_SET) { + 3002c3a: fd842783 lw a5,-40(s0) + 3002c3e: 8b85 andi a5,a5,1 + 3002c40: c3a9 beqz a5,3002c82 + cfg.BIT.softResetReq |= 1 << matchInfo->bitOffset; /* reset of target ip. */ + 3002c42: fe442783 lw a5,-28(s0) + 3002c46: 83c1 srli a5,a5,0x10 + 3002c48: 9fa1 uxth a5 + 3002c4a: 01079713 slli a4,a5,0x10 + 3002c4e: 8741 srai a4,a4,0x10 + 3002c50: fdc42783 lw a5,-36(s0) + 3002c54: 27bc lbu a5,10(a5) + 3002c56: 86be mv a3,a5 + 3002c58: 4785 li a5,1 + 3002c5a: 00d797b3 sll a5,a5,a3 + 3002c5e: 07c2 slli a5,a5,0x10 + 3002c60: 87c1 srai a5,a5,0x10 + 3002c62: 8fd9 or a5,a5,a4 + 3002c64: 07c2 slli a5,a5,0x10 + 3002c66: 87c1 srai a5,a5,0x10 + 3002c68: 01079713 slli a4,a5,0x10 + 3002c6c: 8341 srli a4,a4,0x10 + 3002c6e: fe442783 lw a5,-28(s0) + 3002c72: 0742 slli a4,a4,0x10 + 3002c74: 66c1 lui a3,0x10 + 3002c76: 16fd addi a3,a3,-1 # ffff + 3002c78: 8ff5 and a5,a5,a3 + 3002c7a: 8fd9 or a5,a5,a4 + 3002c7c: fef42223 sw a5,-28(s0) + 3002c80: a0a1 j 3002cc8 + } else { + cfg.BIT.softResetReq &= ~(1 << matchInfo->bitOffset); /* Undo reset of target ip. */ + 3002c82: fe442783 lw a5,-28(s0) + 3002c86: 83c1 srli a5,a5,0x10 + 3002c88: 9fa1 uxth a5 + 3002c8a: 01079713 slli a4,a5,0x10 + 3002c8e: 8741 srai a4,a4,0x10 + 3002c90: fdc42783 lw a5,-36(s0) + 3002c94: 27bc lbu a5,10(a5) + 3002c96: 86be mv a3,a5 + 3002c98: 4785 li a5,1 + 3002c9a: 00d797b3 sll a5,a5,a3 + 3002c9e: 07c2 slli a5,a5,0x10 + 3002ca0: 87c1 srai a5,a5,0x10 + 3002ca2: fff7c793 not a5,a5 + 3002ca6: 07c2 slli a5,a5,0x10 + 3002ca8: 87c1 srai a5,a5,0x10 + 3002caa: 8ff9 and a5,a5,a4 + 3002cac: 07c2 slli a5,a5,0x10 + 3002cae: 87c1 srai a5,a5,0x10 + 3002cb0: 01079713 slli a4,a5,0x10 + 3002cb4: 8341 srli a4,a4,0x10 + 3002cb6: fe442783 lw a5,-28(s0) + 3002cba: 0742 slli a4,a4,0x10 + 3002cbc: 66c1 lui a3,0x10 + 3002cbe: 16fd addi a3,a3,-1 # ffff + 3002cc0: 8ff5 and a5,a5,a3 + 3002cc2: 8fd9 or a5,a5,a4 + 3002cc4: fef42223 sw a5,-28(s0) + } + p->value = cfg.value; + 3002cc8: fe442703 lw a4,-28(s0) + 3002ccc: fe842783 lw a5,-24(s0) + 3002cd0: c398 sw a4,0(a5) +} + 3002cd2: 0001 nop + 3002cd4: 50b2 lw ra,44(sp) + 3002cd6: 5422 lw s0,40(sp) + 3002cd8: 6145 addi sp,sp,48 + 3002cda: 8082 ret + +03002cdc : + * @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) +{ + 3002cdc: 7179 addi sp,sp,-48 + 3002cde: d606 sw ra,44(sp) + 3002ce0: d422 sw s0,40(sp) + 3002ce2: 1800 addi s0,sp,48 + 3002ce4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002ce8: fdc42783 lw a5,-36(s0) + 3002cec: eb89 bnez a5,3002cfe + 3002cee: 38f00593 li a1,911 + 3002cf2: 0300f7b7 lui a5,0x300f + 3002cf6: 08c78513 addi a0,a5,140 # 300f08c + 3002cfa: 2a09 jal ra,3002e0c + 3002cfc: a001 j 3002cfc + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002cfe: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d02: eb89 bnez a5,3002d14 + 3002d04: 39000593 li a1,912 + 3002d08: 0300f7b7 lui a5,0x300f + 3002d0c: 08c78513 addi a0,a5,140 # 300f08c + 3002d10: 28f5 jal ra,3002e0c + 3002d12: a001 j 3002d12 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002d14: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d18: fef42623 sw a5,-20(s0) + /* Get the reset status of target ip. */ + CRG_IpWoClkSelectCfg *p = (CRG_IpWoClkSelectCfg *)(void *)(base + matchInfo->regOffset); + 3002d1c: fdc42783 lw a5,-36(s0) + 3002d20: 279e lhu a5,8(a5) + 3002d22: 873e mv a4,a5 + 3002d24: fec42783 lw a5,-20(s0) + 3002d28: 97ba add a5,a5,a4 + 3002d2a: fef42423 sw a5,-24(s0) + CRG_IpWoClkSelectCfg cfg; + cfg.value = p->value; + 3002d2e: fe842783 lw a5,-24(s0) + 3002d32: 439c lw a5,0(a5) + 3002d34: fef42223 sw a5,-28(s0) + return (cfg.BIT.softResetReq & (1 << matchInfo->bitOffset)) ? BASE_CFG_SET : BASE_CFG_UNSET; + 3002d38: fe442783 lw a5,-28(s0) + 3002d3c: 83c1 srli a5,a5,0x10 + 3002d3e: 9fa1 uxth a5 + 3002d40: 873e mv a4,a5 + 3002d42: fdc42783 lw a5,-36(s0) + 3002d46: 27bc lbu a5,10(a5) + 3002d48: 40f757b3 sra a5,a4,a5 + 3002d4c: 8b85 andi a5,a5,1 + 3002d4e: 00f037b3 snez a5,a5 + 3002d52: 9f81 uxtb a5 +} + 3002d54: 853e mv a0,a5 + 3002d56: 50b2 lw ra,44(sp) + 3002d58: 5422 lw s0,40(sp) + 3002d5a: 6145 addi sp,sp,48 + 3002d5c: 8082 ret + +03002d5e : + * @param matchInfo ADC match info + * @param enable IP_CLK_ENABLE + * @retval None + */ +static void CRG_AdcEnableSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int enable) +{ + 3002d5e: 7179 addi sp,sp,-48 + 3002d60: d606 sw ra,44(sp) + 3002d62: d422 sw s0,40(sp) + 3002d64: 1800 addi s0,sp,48 + 3002d66: fca42e23 sw a0,-36(s0) + 3002d6a: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002d6e: fdc42783 lw a5,-36(s0) + 3002d72: eb89 bnez a5,3002d84 + 3002d74: 3a200593 li a1,930 + 3002d78: 0300f7b7 lui a5,0x300f + 3002d7c: 08c78513 addi a0,a5,140 # 300f08c + 3002d80: 2071 jal ra,3002e0c + 3002d82: a001 j 3002d82 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002d84: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d88: eb89 bnez a5,3002d9a + 3002d8a: 3a300593 li a1,931 + 3002d8e: 0300f7b7 lui a5,0x300f + 3002d92: 08c78513 addi a0,a5,140 # 300f08c + 3002d96: 289d jal ra,3002e0c + 3002d98: a001 j 3002d98 + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002d9a: 2b01a783 lw a5,688(gp) # 40008e4 + 3002d9e: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3002da2: fdc42783 lw a5,-36(s0) + 3002da6: 279e lhu a5,8(a5) + 3002da8: 873e mv a4,a5 + 3002daa: fec42783 lw a5,-20(s0) + 3002dae: 97ba add a5,a5,a4 + 3002db0: fef42423 sw a5,-24(s0) + CRG_AdcIpCfg cfg; + cfg.value[1] = p->value[1]; + 3002db4: fe842783 lw a5,-24(s0) + 3002db8: 43dc lw a5,4(a5) + 3002dba: fef42223 sw a5,-28(s0) + if (enable) { /* Enables and Deassert reset the ADC clock. */ + 3002dbe: fd842783 lw a5,-40(s0) + 3002dc2: cf99 beqz a5,3002de0 + cfg.BIT.clk_adc_cken = BASE_CFG_SET; + 3002dc4: fe442783 lw a5,-28(s0) + 3002dc8: 0017e793 ori a5,a5,1 + 3002dcc: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3002dd0: fe442783 lw a5,-28(s0) + 3002dd4: 7741 lui a4,0xffff0 + 3002dd6: 177d addi a4,a4,-1 # fffeffff + 3002dd8: 8ff9 and a5,a5,a4 + 3002dda: fef42223 sw a5,-28(s0) + 3002dde: a829 j 3002df8 + } else { /* Disable and reset the ADC clock. */ + cfg.BIT.clk_adc_cken = BASE_CFG_UNSET; + 3002de0: fe442783 lw a5,-28(s0) + 3002de4: 9bf9 andi a5,a5,-2 + 3002de6: fef42223 sw a5,-28(s0) + cfg.BIT.adc_srst_req = BASE_CFG_UNSET; + 3002dea: fe442783 lw a5,-28(s0) + 3002dee: 7741 lui a4,0xffff0 + 3002df0: 177d addi a4,a4,-1 # fffeffff + 3002df2: 8ff9 and a5,a5,a4 + 3002df4: fef42223 sw a5,-28(s0) + } + p->value[1] = cfg.value[1]; + 3002df8: fe442703 lw a4,-28(s0) + 3002dfc: fe842783 lw a5,-24(s0) + 3002e00: c3d8 sw a4,4(a5) +} + 3002e02: 0001 nop + 3002e04: 50b2 lw ra,44(sp) + 3002e06: 5422 lw s0,40(sp) + 3002e08: 6145 addi sp,sp,48 + 3002e0a: 8082 ret + +03002e0c : + 3002e0c: be4fe06f j 30011f0 + +03002e10 : + * @brief Get Enable status of ADC + * @param matchInfo ADC match info + * @retval Cken of ADC + */ +static unsigned int CRG_AdcEnableGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 3002e10: 7179 addi sp,sp,-48 + 3002e12: d606 sw ra,44(sp) + 3002e14: d422 sw s0,40(sp) + 3002e16: 1800 addi s0,sp,48 + 3002e18: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002e1c: fdc42783 lw a5,-36(s0) + 3002e20: eb89 bnez a5,3002e32 + 3002e22: 3ba00593 li a1,954 + 3002e26: 0300f7b7 lui a5,0x300f + 3002e2a: 08c78513 addi a0,a5,140 # 300f08c + 3002e2e: 3ff9 jal ra,3002e0c + 3002e30: a001 j 3002e30 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002e32: 2b01a783 lw a5,688(gp) # 40008e4 + 3002e36: eb89 bnez a5,3002e48 + 3002e38: 3bb00593 li a1,955 + 3002e3c: 0300f7b7 lui a5,0x300f + 3002e40: 08c78513 addi a0,a5,140 # 300f08c + 3002e44: 37e1 jal ra,3002e0c + 3002e46: a001 j 3002e46 + unsigned int enable; + /* Get the enable status of the ADC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002e48: 2b01a783 lw a5,688(gp) # 40008e4 + 3002e4c: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3002e50: fdc42783 lw a5,-36(s0) + 3002e54: 279e lhu a5,8(a5) + 3002e56: 873e mv a4,a5 + 3002e58: fec42783 lw a5,-20(s0) + 3002e5c: 97ba add a5,a5,a4 + 3002e5e: fef42423 sw a5,-24(s0) + enable = ((p->BIT.clk_adc_cken != 0)) ? IP_CLK_ENABLE : IP_CLK_DISABLE; + 3002e62: fe842783 lw a5,-24(s0) + 3002e66: 43dc lw a5,4(a5) + 3002e68: 8b85 andi a5,a5,1 + 3002e6a: 9f81 uxtb a5 + 3002e6c: c399 beqz a5,3002e72 + 3002e6e: 4785 li a5,1 + 3002e70: a011 j 3002e74 + 3002e72: 4781 li a5,0 + 3002e74: fef42223 sw a5,-28(s0) + return enable; + 3002e78: fe442783 lw a5,-28(s0) +} + 3002e7c: 853e mv a0,a5 + 3002e7e: 50b2 lw ra,44(sp) + 3002e80: 5422 lw s0,40(sp) + 3002e82: 6145 addi sp,sp,48 + 3002e84: 8082 ret + +03002e86 : + * @param matchInfo ADC match info + * @param clkSelect @see CRG_AdcClkSelect + * @retval None + */ +static void CRG_AdcClkSelectSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int clkSelect) +{ + 3002e86: 7179 addi sp,sp,-48 + 3002e88: d606 sw ra,44(sp) + 3002e8a: d422 sw s0,40(sp) + 3002e8c: 1800 addi s0,sp,48 + 3002e8e: fca42e23 sw a0,-36(s0) + 3002e92: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002e96: fdc42783 lw a5,-36(s0) + 3002e9a: eb89 bnez a5,3002eac + 3002e9c: 3cc00593 li a1,972 + 3002ea0: 0300f7b7 lui a5,0x300f + 3002ea4: 08c78513 addi a0,a5,140 # 300f08c + 3002ea8: 3795 jal ra,3002e0c + 3002eaa: a001 j 3002eaa + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002eac: 2b01a783 lw a5,688(gp) # 40008e4 + 3002eb0: eb89 bnez a5,3002ec2 + 3002eb2: 3cd00593 li a1,973 + 3002eb6: 0300f7b7 lui a5,0x300f + 3002eba: 08c78513 addi a0,a5,140 # 300f08c + 3002ebe: 37b9 jal ra,3002e0c + 3002ec0: a001 j 3002ec0 + CRG_ASSERT_PARAM(IsCRGInstance(g_crgBaseAddr)); + 3002ec2: 2b01a703 lw a4,688(gp) # 40008e4 + 3002ec6: 100007b7 lui a5,0x10000 + 3002eca: 00f70a63 beq a4,a5,3002ede + 3002ece: 3ce00593 li a1,974 + 3002ed2: 0300f7b7 lui a5,0x300f + 3002ed6: 08c78513 addi a0,a5,140 # 300f08c + 3002eda: 3f0d jal ra,3002e0c + 3002edc: a001 j 3002edc + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkModeSelect(clkSelect)); + 3002ede: fd842503 lw a0,-40(s0) + 3002ee2: 878ff0ef jal ra,3001f5a + 3002ee6: 87aa mv a5,a0 + 3002ee8: 0017c793 xori a5,a5,1 + 3002eec: 9f81 uxtb a5 + 3002eee: cb89 beqz a5,3002f00 + 3002ef0: 3cf00593 li a1,975 + 3002ef4: 0300f7b7 lui a5,0x300f + 3002ef8: 08c78513 addi a0,a5,140 # 300f08c + 3002efc: 3f01 jal ra,3002e0c + 3002efe: a0bd j 3002f6c + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002f00: 2b01a783 lw a5,688(gp) # 40008e4 + 3002f04: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3002f08: fdc42783 lw a5,-36(s0) + 3002f0c: 279e lhu a5,8(a5) + 3002f0e: 873e mv a4,a5 + 3002f10: fec42783 lw a5,-20(s0) + 3002f14: 97ba add a5,a5,a4 + 3002f16: fef42423 sw a5,-24(s0) + if (clkSelect == CRG_ADC_CLK_SYN_CORE) { + 3002f1a: fd842703 lw a4,-40(s0) + 3002f1e: 478d li a5,3 + 3002f20: 00f71a63 bne a4,a5,3002f34 + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_SET; /* use sync clock */ + 3002f24: fe842703 lw a4,-24(s0) + 3002f28: 435c lw a5,4(a4) + 3002f2a: 010006b7 lui a3,0x1000 + 3002f2e: 8fd5 or a5,a5,a3 + 3002f30: c35c sw a5,4(a4) + 3002f32: a82d j 3002f6c + } else { + DCL_SYSCTRL_CrgWriteProtectionDisable(); + 3002f34: d43fe0ef jal ra,3001c76 + g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel = clkSelect; /* write clock selection */ + 3002f38: 2b01a703 lw a4,688(gp) # 40008e4 + 3002f3c: fd842783 lw a5,-40(s0) + 3002f40: 8b8d andi a5,a5,3 + 3002f42: 0ff7f693 andi a3,a5,255 + 3002f46: 10072783 lw a5,256(a4) + 3002f4a: 8a8d andi a3,a3,3 + 3002f4c: 0692 slli a3,a3,0x4 + 3002f4e: fcf7f793 andi a5,a5,-49 + 3002f52: 8fd5 or a5,a5,a3 + 3002f54: 10f72023 sw a5,256(a4) + DCL_SYSCTRL_CrgWriteProtectionEnable(); + 3002f58: d47fe0ef jal ra,3001c9e + p->BIT.cfg_adc_ckmode_sel = BASE_CFG_UNSET; + 3002f5c: fe842703 lw a4,-24(s0) + 3002f60: 435c lw a5,4(a4) + 3002f62: ff0006b7 lui a3,0xff000 + 3002f66: 16fd addi a3,a3,-1 # feffffff + 3002f68: 8ff5 and a5,a5,a3 + 3002f6a: c35c sw a5,4(a4) + } +} + 3002f6c: 50b2 lw ra,44(sp) + 3002f6e: 5422 lw s0,40(sp) + 3002f70: 6145 addi sp,sp,48 + 3002f72: 8082 ret + +03002f74 : + * @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) +{ + 3002f74: 7179 addi sp,sp,-48 + 3002f76: d606 sw ra,44(sp) + 3002f78: d422 sw s0,40(sp) + 3002f7a: 1800 addi s0,sp,48 + 3002f7c: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3002f80: fdc42783 lw a5,-36(s0) + 3002f84: eb89 bnez a5,3002f96 + 3002f86: 3e400593 li a1,996 + 3002f8a: 0300f7b7 lui a5,0x300f + 3002f8e: 08c78513 addi a0,a5,140 # 300f08c + 3002f92: 3dad jal ra,3002e0c + 3002f94: a001 j 3002f94 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3002f96: 2b01a783 lw a5,688(gp) # 40008e4 + 3002f9a: eb89 bnez a5,3002fac + 3002f9c: 3e500593 li a1,997 + 3002fa0: 0300f7b7 lui a5,0x300f + 3002fa4: 08c78513 addi a0,a5,140 # 300f08c + 3002fa8: 3595 jal ra,3002e0c + 3002faa: a001 j 3002faa + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3002fac: 2b01a783 lw a5,688(gp) # 40008e4 + 3002fb0: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3002fb4: fdc42783 lw a5,-36(s0) + 3002fb8: 279e lhu a5,8(a5) + 3002fba: 873e mv a4,a5 + 3002fbc: fec42783 lw a5,-20(s0) + 3002fc0: 97ba add a5,a5,a4 + 3002fc2: fef42423 sw a5,-24(s0) + if (p->BIT.cfg_adc_ckmode_sel == BASE_CFG_SET) { + 3002fc6: fe842783 lw a5,-24(s0) + 3002fca: 43dc lw a5,4(a5) + 3002fcc: 83e1 srli a5,a5,0x18 + 3002fce: 8b85 andi a5,a5,1 + 3002fd0: 0ff7f713 andi a4,a5,255 + 3002fd4: 4785 li a5,1 + 3002fd6: 00f71463 bne a4,a5,3002fde + return CRG_ADC_CLK_SYN_CORE; /* Synchronous clock signal */ + 3002fda: 478d li a5,3 + 3002fdc: a801 j 3002fec + } + return g_crgBaseAddr->PERI_CRG64.BIT.clk_pst2_sw_sel; /* asynchronous clock signal */ + 3002fde: 2b01a783 lw a5,688(gp) # 40008e4 + 3002fe2: 1007a783 lw a5,256(a5) + 3002fe6: 8391 srli a5,a5,0x4 + 3002fe8: 8b8d andi a5,a5,3 + 3002fea: 9f81 uxtb a5 +} + 3002fec: 853e mv a0,a5 + 3002fee: 50b2 lw ra,44(sp) + 3002ff0: 5422 lw s0,40(sp) + 3002ff2: 6145 addi sp,sp,48 + 3002ff4: 8082 ret + +03002ff6 : + * @param matchInfo ADC match info + * @param div Adc clock division + * @retval None + */ +static void CRG_AdcDivSet(const CHIP_CrgIpMatchInfo *matchInfo, unsigned int div) +{ + 3002ff6: 7179 addi sp,sp,-48 + 3002ff8: d606 sw ra,44(sp) + 3002ffa: d422 sw s0,40(sp) + 3002ffc: 1800 addi s0,sp,48 + 3002ffe: fca42e23 sw a0,-36(s0) + 3003002: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003006: fdc42783 lw a5,-36(s0) + 300300a: eb89 bnez a5,300301c + 300300c: 3f700593 li a1,1015 + 3003010: 0300f7b7 lui a5,0x300f + 3003014: 08c78513 addi a0,a5,140 # 300f08c + 3003018: 3bd5 jal ra,3002e0c + 300301a: a001 j 300301a + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300301c: 2b01a783 lw a5,688(gp) # 40008e4 + 3003020: eb89 bnez a5,3003032 + 3003022: 3f800593 li a1,1016 + 3003026: 0300f7b7 lui a5,0x300f + 300302a: 08c78513 addi a0,a5,140 # 300f08c + 300302e: 3bf9 jal ra,3002e0c + 3003030: a001 j 3003030 + CRG_PARAM_CHECK_NO_RET(IsCrgAdcClkDiv(div)); + 3003032: fd842503 lw a0,-40(s0) + 3003036: f65fe0ef jal ra,3001f9a + 300303a: 87aa mv a5,a0 + 300303c: 0017c793 xori a5,a5,1 + 3003040: 9f81 uxtb a5 + 3003042: cb89 beqz a5,3003054 + 3003044: 3f900593 li a1,1017 + 3003048: 0300f7b7 lui a5,0x300f + 300304c: 08c78513 addi a0,a5,140 # 300f08c + 3003050: 3b75 jal ra,3002e0c + 3003052: a0b5 j 30030be + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003054: 2b01a783 lw a5,688(gp) # 40008e4 + 3003058: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 300305c: fdc42783 lw a5,-36(s0) + 3003060: 279e lhu a5,8(a5) + 3003062: 873e mv a4,a5 + 3003064: fec42783 lw a5,-20(s0) + 3003068: 97ba add a5,a5,a4 + 300306a: fef42423 sw a5,-24(s0) + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 300306e: fe842783 lw a5,-24(s0) + 3003072: 43dc lw a5,4(a5) + 3003074: 83e1 srli a5,a5,0x18 + 3003076: 8b85 andi a5,a5,1 + 3003078: 9f81 uxtb a5 + 300307a: fef42223 sw a5,-28(s0) + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 300307e: fe442703 lw a4,-28(s0) + 3003082: 4785 li a5,1 + 3003084: 02f71163 bne a4,a5,30030a6 + p->BIT.clk_adc_div1 = div; /* write div to I1 */ + 3003088: fd842783 lw a5,-40(s0) + 300308c: 8b8d andi a5,a5,3 + 300308e: 0ff7f693 andi a3,a5,255 + 3003092: fe842703 lw a4,-24(s0) + 3003096: 431c lw a5,0(a4) + 3003098: 8a8d andi a3,a3,3 + 300309a: 06a2 slli a3,a3,0x8 + 300309c: cff7f793 andi a5,a5,-769 + 30030a0: 8fd5 or a5,a5,a3 + 30030a2: c31c sw a5,0(a4) + 30030a4: a829 j 30030be + } else { + p->BIT.clk_adc_div0 = div; /* write div to I0 */ + 30030a6: fd842783 lw a5,-40(s0) + 30030aa: 8b8d andi a5,a5,3 + 30030ac: 0ff7f693 andi a3,a5,255 + 30030b0: fe842703 lw a4,-24(s0) + 30030b4: 431c lw a5,0(a4) + 30030b6: 8a8d andi a3,a3,3 + 30030b8: 9bf1 andi a5,a5,-4 + 30030ba: 8fd5 or a5,a5,a3 + 30030bc: c31c sw a5,0(a4) + } +} + 30030be: 50b2 lw ra,44(sp) + 30030c0: 5422 lw s0,40(sp) + 30030c2: 6145 addi sp,sp,48 + 30030c4: 8082 ret + +030030c6 : + * @brief Get ADC clock division + * @param matchInfo ADC match info + * @retval Adc clock division + */ +static unsigned int CRG_AdcDivGet(const CHIP_CrgIpMatchInfo *matchInfo) +{ + 30030c6: 7179 addi sp,sp,-48 + 30030c8: d606 sw ra,44(sp) + 30030ca: d422 sw s0,40(sp) + 30030cc: 1800 addi s0,sp,48 + 30030ce: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30030d2: fdc42783 lw a5,-36(s0) + 30030d6: eb89 bnez a5,30030e8 + 30030d8: 40c00593 li a1,1036 + 30030dc: 0300f7b7 lui a5,0x300f + 30030e0: 08c78513 addi a0,a5,140 # 300f08c + 30030e4: 3325 jal ra,3002e0c + 30030e6: a001 j 30030e6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30030e8: 2b01a783 lw a5,688(gp) # 40008e4 + 30030ec: eb89 bnez a5,30030fe + 30030ee: 40d00593 li a1,1037 + 30030f2: 0300f7b7 lui a5,0x300f + 30030f6: 08c78513 addi a0,a5,140 # 300f08c + 30030fa: 3b09 jal ra,3002e0c + 30030fc: a001 j 30030fc + + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30030fe: 2b01a783 lw a5,688(gp) # 40008e4 + 3003102: fef42623 sw a5,-20(s0) + CRG_AdcIpCfg *p = (CRG_AdcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003106: fdc42783 lw a5,-36(s0) + 300310a: 279e lhu a5,8(a5) + 300310c: 873e mv a4,a5 + 300310e: fec42783 lw a5,-20(s0) + 3003112: 97ba add a5,a5,a4 + 3003114: fef42423 sw a5,-24(s0) + + unsigned int clkMode = p->BIT.cfg_adc_ckmode_sel; + 3003118: fe842783 lw a5,-24(s0) + 300311c: 43dc lw a5,4(a5) + 300311e: 83e1 srli a5,a5,0x18 + 3003120: 8b85 andi a5,a5,1 + 3003122: 9f81 uxtb a5 + 3003124: fef42223 sw a5,-28(s0) + + if (clkMode == CRG_ADC_CLK_SYNCHRONOUS) { + 3003128: fe442703 lw a4,-28(s0) + 300312c: 4785 li a5,1 + 300312e: 00f71963 bne a4,a5,3003140 + return p->BIT.clk_adc_div1; /* return div value I1 */ + 3003132: fe842783 lw a5,-24(s0) + 3003136: 439c lw a5,0(a5) + 3003138: 83a1 srli a5,a5,0x8 + 300313a: 8b8d andi a5,a5,3 + 300313c: 9f81 uxtb a5 + 300313e: a031 j 300314a + } + return p->BIT.clk_adc_div0; /* return div valye I0 */ + 3003140: fe842783 lw a5,-24(s0) + 3003144: 439c lw a5,0(a5) + 3003146: 8b8d andi a5,a5,3 + 3003148: 9f81 uxtb a5 +} + 300314a: 853e mv a0,a5 + 300314c: 50b2 lw ra,44(sp) + 300314e: 5422 lw s0,40(sp) + 3003150: 6145 addi sp,sp,48 + 3003152: 8082 ret + +03003154 : + * @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) +{ + 3003154: 7179 addi sp,sp,-48 + 3003156: d606 sw ra,44(sp) + 3003158: d422 sw s0,40(sp) + 300315a: 1800 addi s0,sp,48 + 300315c: fca42e23 sw a0,-36(s0) + 3003160: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003164: fdc42783 lw a5,-36(s0) + 3003168: eb89 bnez a5,300317a + 300316a: 42100593 li a1,1057 + 300316e: 0300f7b7 lui a5,0x300f + 3003172: 08c78513 addi a0,a5,140 # 300f08c + 3003176: 3959 jal ra,3002e0c + 3003178: a001 j 3003178 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 300317a: 2b01a783 lw a5,688(gp) # 40008e4 + 300317e: eb89 bnez a5,3003190 + 3003180: 42200593 li a1,1058 + 3003184: 0300f7b7 lui a5,0x300f + 3003188: 08c78513 addi a0,a5,140 # 300f08c + 300318c: 3141 jal ra,3002e0c + 300318e: a001 j 300318e + /* Enables or disables EFC clock gating. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003190: 2b01a783 lw a5,688(gp) # 40008e4 + 3003194: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 3003198: fdc42783 lw a5,-36(s0) + 300319c: 279e lhu a5,8(a5) + 300319e: 873e mv a4,a5 + 30031a0: fec42783 lw a5,-20(s0) + 30031a4: 97ba add a5,a5,a4 + 30031a6: fef42423 sw a5,-24(s0) + p->BIT.eflash_cken = (enable & IP_CLK_ENABLE) ? BASE_CFG_SET : BASE_CFG_UNSET; + 30031aa: fd842783 lw a5,-40(s0) + 30031ae: 8b85 andi a5,a5,1 + 30031b0: 0ff7f693 andi a3,a5,255 + 30031b4: fe842703 lw a4,-24(s0) + 30031b8: 431c lw a5,0(a4) + 30031ba: 8a85 andi a3,a3,1 + 30031bc: 9bf9 andi a5,a5,-2 + 30031be: 8fd5 or a5,a5,a3 + 30031c0: c31c sw a5,0(a4) +} + 30031c2: 0001 nop + 30031c4: 50b2 lw ra,44(sp) + 30031c6: 5422 lw s0,40(sp) + 30031c8: 6145 addi sp,sp,48 + 30031ca: 8082 ret + +030031cc : + * @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) +{ + 30031cc: 7179 addi sp,sp,-48 + 30031ce: d606 sw ra,44(sp) + 30031d0: d422 sw s0,40(sp) + 30031d2: 1800 addi s0,sp,48 + 30031d4: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30031d8: fdc42783 lw a5,-36(s0) + 30031dc: eb89 bnez a5,30031ee + 30031de: 43000593 li a1,1072 + 30031e2: 0300f7b7 lui a5,0x300f + 30031e6: 08c78513 addi a0,a5,140 # 300f08c + 30031ea: 310d jal ra,3002e0c + 30031ec: a001 j 30031ec + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30031ee: 2b01a783 lw a5,688(gp) # 40008e4 + 30031f2: eb89 bnez a5,3003204 + 30031f4: 43100593 li a1,1073 + 30031f8: 0300f7b7 lui a5,0x300f + 30031fc: 08c78513 addi a0,a5,140 # 300f08c + 3003200: 3131 jal ra,3002e0c + 3003202: a001 j 3003202 + /* Get the value of the EFC register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 3003204: 2b01a783 lw a5,688(gp) # 40008e4 + 3003208: fef42623 sw a5,-20(s0) + CRG_EfcIpCfg *p = (CRG_EfcIpCfg *)(void *)(base + matchInfo->regOffset); + 300320c: fdc42783 lw a5,-36(s0) + 3003210: 279e lhu a5,8(a5) + 3003212: 873e mv a4,a5 + 3003214: fec42783 lw a5,-20(s0) + 3003218: 97ba add a5,a5,a4 + 300321a: fef42423 sw a5,-24(s0) + return p->BIT.eflash_cken; + 300321e: fe842783 lw a5,-24(s0) + 3003222: 439c lw a5,0(a5) + 3003224: 8b85 andi a5,a5,1 + 3003226: 9f81 uxtb a5 +} + 3003228: 853e mv a0,a5 + 300322a: 50b2 lw ra,44(sp) + 300322c: 5422 lw s0,40(sp) + 300322e: 6145 addi sp,sp,48 + 3003230: 8082 ret + +03003232 : + * @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) +{ + 3003232: 7179 addi sp,sp,-48 + 3003234: d606 sw ra,44(sp) + 3003236: d422 sw s0,40(sp) + 3003238: 1800 addi s0,sp,48 + 300323a: fca42e23 sw a0,-36(s0) + 300323e: fcb42c23 sw a1,-40(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 3003242: fdc42783 lw a5,-36(s0) + 3003246: eb89 bnez a5,3003258 + 3003248: 44000593 li a1,1088 + 300324c: 0300f7b7 lui a5,0x300f + 3003250: 08c78513 addi a0,a5,140 # 300f08c + 3003254: 3e65 jal ra,3002e0c + 3003256: a001 j 3003256 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 3003258: 2b01a783 lw a5,688(gp) # 40008e4 + 300325c: eb89 bnez a5,300326e + 300325e: 44100593 li a1,1089 + 3003262: 0300f7b7 lui a5,0x300f + 3003266: 08c78513 addi a0,a5,140 # 300f08c + 300326a: 364d jal ra,3002e0c + 300326c: a001 j 300326c + CRG_PARAM_CHECK_NO_RET(enable == IP_CLK_ENABLE || enable == IP_CLK_DISABLE); + 300326e: fd842703 lw a4,-40(s0) + 3003272: 4785 li a5,1 + 3003274: 00f70d63 beq a4,a5,300328e + 3003278: fd842783 lw a5,-40(s0) + 300327c: cb89 beqz a5,300328e + 300327e: 44200593 li a1,1090 + 3003282: 0300f7b7 lui a5,0x300f + 3003286: 08c78513 addi a0,a5,140 # 300f08c + 300328a: 3649 jal ra,3002e0c + 300328c: a209 j 300338e + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 300328e: 2b01a783 lw a5,688(gp) # 40008e4 + 3003292: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 3003296: fdc42783 lw a5,-36(s0) + 300329a: 279e lhu a5,8(a5) + 300329c: 873e mv a4,a5 + 300329e: fec42783 lw a5,-20(s0) + 30032a2: 97ba add a5,a5,a4 + 30032a4: fdc42703 lw a4,-36(s0) + 30032a8: 2738 lbu a4,10(a4) + 30032aa: 97ba add a5,a5,a4 + 30032ac: fef42423 sw a5,-24(s0) + + if ((enable == IP_CLK_ENABLE) && (p->BIT.ip_srst_req == BASE_CFG_SET)) { + 30032b0: fd842703 lw a4,-40(s0) + 30032b4: 4785 li a5,1 + 30032b6: 02f71b63 bne a4,a5,30032ec + 30032ba: fe842783 lw a5,-24(s0) + 30032be: 439c lw a5,0(a5) + 30032c0: 83c1 srli a5,a5,0x10 + 30032c2: 8b85 andi a5,a5,1 + 30032c4: 0ff7f713 andi a4,a5,255 + 30032c8: 4785 li a5,1 + 30032ca: 02f71163 bne a4,a5,30032ec + p->BIT.ip_srst_req = BASE_CFG_UNSET; + 30032ce: fe842703 lw a4,-24(s0) + 30032d2: 431c lw a5,0(a4) + 30032d4: 76c1 lui a3,0xffff0 + 30032d6: 16fd addi a3,a3,-1 # fffeffff + 30032d8: 8ff5 and a5,a5,a3 + 30032da: c31c sw a5,0(a4) + g_anaEnableFlag++; /* count enable analog IP number */ + 30032dc: 2b41c783 lbu a5,692(gp) # 40008e8 + 30032e0: 0785 addi a5,a5,1 + 30032e2: 0ff7f713 andi a4,a5,255 + 30032e6: 2ae18a23 sb a4,692(gp) # 40008e8 + 30032ea: a81d j 3003320 + } else if ((enable == IP_CLK_DISABLE) && (p->BIT.ip_srst_req == BASE_CFG_UNSET)) { + 30032ec: fd842783 lw a5,-40(s0) + 30032f0: eb85 bnez a5,3003320 + 30032f2: fe842783 lw a5,-24(s0) + 30032f6: 439c lw a5,0(a5) + 30032f8: 83c1 srli a5,a5,0x10 + 30032fa: 8b85 andi a5,a5,1 + 30032fc: 9f81 uxtb a5 + 30032fe: e38d bnez a5,3003320 + p->BIT.ip_srst_req = BASE_CFG_SET; + 3003300: fe842703 lw a4,-24(s0) + 3003304: 431c lw a5,0(a4) + 3003306: 66c1 lui a3,0x10 + 3003308: 8fd5 or a5,a5,a3 + 300330a: c31c sw a5,0(a4) + if (g_anaEnableFlag > 0) { + 300330c: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003310: cb81 beqz a5,3003320 + g_anaEnableFlag--; /* Decreasing the count to enable the analog IP number. */ + 3003312: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003316: 17fd addi a5,a5,-1 + 3003318: 0ff7f713 andi a4,a5,255 + 300331c: 2ae18a23 sb a4,692(gp) # 40008e8 + } + } + + if ((g_anaEnableFlag == 0) && (enable == IP_CLK_DISABLE)) { /* all analog clock disable */ + 3003320: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003324: eb85 bnez a5,3003354 + 3003326: fd842783 lw a5,-40(s0) + 300332a: e78d bnez a5,3003354 + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_UNSET; + 300332c: 10000737 lui a4,0x10000 + 3003330: 6785 lui a5,0x1 + 3003332: 973e add a4,a4,a5 + 3003334: a5072783 lw a5,-1456(a4) # ffffa50 + 3003338: 9bf9 andi a5,a5,-2 + 300333a: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_SET; + 300333e: 10000737 lui a4,0x10000 + 3003342: 6785 lui a5,0x1 + 3003344: 973e add a4,a4,a5 + 3003346: a5072783 lw a5,-1456(a4) # ffffa50 + 300334a: 66c1 lui a3,0x10 + 300334c: 8fd5 or a5,a5,a3 + 300334e: a4f72823 sw a5,-1456(a4) + 3003352: a835 j 300338e + } else if ((g_anaEnableFlag > 0) && (enable == IP_CLK_ENABLE)) { /* all analog clock enable */ + 3003354: 2b41c783 lbu a5,692(gp) # 40008e8 + 3003358: cb9d beqz a5,300338e + 300335a: fd842703 lw a4,-40(s0) + 300335e: 4785 li a5,1 + 3003360: 02f71763 bne a4,a5,300338e + CRG->PERI_CRG660.BIT.ana_srst_req = BASE_CFG_UNSET; + 3003364: 10000737 lui a4,0x10000 + 3003368: 6785 lui a5,0x1 + 300336a: 973e add a4,a4,a5 + 300336c: a5072783 lw a5,-1456(a4) # ffffa50 + 3003370: 76c1 lui a3,0xffff0 + 3003372: 16fd addi a3,a3,-1 # fffeffff + 3003374: 8ff5 and a5,a5,a3 + 3003376: a4f72823 sw a5,-1456(a4) + CRG->PERI_CRG660.BIT.clk_ana_cken = BASE_CFG_SET; + 300337a: 10000737 lui a4,0x10000 + 300337e: 6785 lui a5,0x1 + 3003380: 973e add a4,a4,a5 + 3003382: a5072783 lw a5,-1456(a4) # ffffa50 + 3003386: 0017e793 ori a5,a5,1 + 300338a: a4f72823 sw a5,-1456(a4) + } +} + 300338e: 50b2 lw ra,44(sp) + 3003390: 5422 lw s0,40(sp) + 3003392: 6145 addi sp,sp,48 + 3003394: 8082 ret + +03003396 : + * @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) +{ + 3003396: 7179 addi sp,sp,-48 + 3003398: d606 sw ra,44(sp) + 300339a: d422 sw s0,40(sp) + 300339c: 1800 addi s0,sp,48 + 300339e: fca42e23 sw a0,-36(s0) + CRG_ASSERT_PARAM(matchInfo != NULL); + 30033a2: fdc42783 lw a5,-36(s0) + 30033a6: eb89 bnez a5,30033b8 + 30033a8: 46200593 li a1,1122 + 30033ac: 0300f7b7 lui a5,0x300f + 30033b0: 08c78513 addi a0,a5,140 # 300f08c + 30033b4: 3ca1 jal ra,3002e0c + 30033b6: a001 j 30033b6 + CRG_ASSERT_PARAM(g_crgBaseAddr != NULL); + 30033b8: 2b01a783 lw a5,688(gp) # 40008e4 + 30033bc: eb89 bnez a5,30033ce + 30033be: 46300593 li a1,1123 + 30033c2: 0300f7b7 lui a5,0x300f + 30033c6: 08c78513 addi a0,a5,140 # 300f08c + 30033ca: 3489 jal ra,3002e0c + 30033cc: a001 j 30033cc + + /* Get the value of the ANA IP register in the CRG. */ + uintptr_t base = (uintptr_t)(void *)g_crgBaseAddr; + 30033ce: 2b01a783 lw a5,688(gp) # 40008e4 + 30033d2: fef42623 sw a5,-20(s0) + CRG_AnaIpCfg *p = (CRG_AnaIpCfg *)(void *)(base + matchInfo->regOffset + matchInfo->bitOffset); + 30033d6: fdc42783 lw a5,-36(s0) + 30033da: 279e lhu a5,8(a5) + 30033dc: 873e mv a4,a5 + 30033de: fec42783 lw a5,-20(s0) + 30033e2: 97ba add a5,a5,a4 + 30033e4: fdc42703 lw a4,-36(s0) + 30033e8: 2738 lbu a4,10(a4) + 30033ea: 97ba add a5,a5,a4 + 30033ec: 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; + 30033f0: fe842783 lw a5,-24(s0) + 30033f4: 439c lw a5,0(a5) + 30033f6: 83c1 srli a5,a5,0x10 + 30033f8: 8b85 andi a5,a5,1 + 30033fa: 9f81 uxtb a5 + 30033fc: 0017c793 xori a5,a5,1 + 3003400: 9f81 uxtb a5 +} + 3003402: 853e mv a0,a5 + 3003404: 50b2 lw ra,44(sp) + 3003406: 5422 lw s0,40(sp) + 3003408: 6145 addi sp,sp,48 + 300340a: 8082 ret + +0300340c : + * @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) +{ + 300340c: 1101 addi sp,sp,-32 + 300340e: ce22 sw s0,28(sp) + 3003410: 1000 addi s0,sp,32 + 3003412: fea42623 sw a0,-20(s0) + while (DBG_PRINTF_UART_PORT->UART_FR.BIT.txff == 1) { + 3003416: 0001 nop + 3003418: 140007b7 lui a5,0x14000 + 300341c: 4f9c lw a5,24(a5) + 300341e: 8395 srli a5,a5,0x5 + 3003420: 8b85 andi a5,a5,1 + 3003422: 0ff7f713 andi a4,a5,255 + 3003426: 4785 li a5,1 + 3003428: fef708e3 beq a4,a5,3003418 + ; + } + DBG_PRINTF_UART_PORT->UART_DR.BIT.data = (unsigned char)ch; + 300342c: 14000737 lui a4,0x14000 + 3003430: fec42783 lw a5,-20(s0) + 3003434: 0ff7f693 andi a3,a5,255 + 3003438: 431c lw a5,0(a4) + 300343a: 0ff6f693 andi a3,a3,255 + 300343e: f007f793 andi a5,a5,-256 + 3003442: 8fd5 or a5,a5,a3 + 3003444: c31c sw a5,0(a4) +} + 3003446: 0001 nop + 3003448: 4472 lw s0,28(sp) + 300344a: 6105 addi sp,sp,32 + 300344c: 8082 ret + +0300344e : + * @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) +{ + 300344e: 7179 addi sp,sp,-48 + 3003450: d606 sw ra,44(sp) + 3003452: d422 sw s0,40(sp) + 3003454: 1800 addi s0,sp,48 + 3003456: fca42e23 sw a0,-36(s0) + DEBUG_ASSERT_PARAM(str != NULL); + int cnt = 0; + 300345a: fe042623 sw zero,-20(s0) + while (*str != '\0') { + 300345e: a00d j 3003480 + DBG_PrintCh(*str); + 3003460: fdc42783 lw a5,-36(s0) + 3003464: 00078783 lb a5,0(a5) # 14000000 + 3003468: 853e mv a0,a5 + 300346a: 374d jal ra,300340c + str++; + 300346c: fdc42783 lw a5,-36(s0) + 3003470: 0785 addi a5,a5,1 + 3003472: fcf42e23 sw a5,-36(s0) + cnt++; + 3003476: fec42783 lw a5,-20(s0) + 300347a: 0785 addi a5,a5,1 + 300347c: fef42623 sw a5,-20(s0) + while (*str != '\0') { + 3003480: fdc42783 lw a5,-36(s0) + 3003484: 00078783 lb a5,0(a5) + 3003488: ffe1 bnez a5,3003460 + } + return cnt; + 300348a: fec42783 lw a5,-20(s0) +} + 300348e: 853e mv a0,a5 + 3003490: 50b2 lw ra,44(sp) + 3003492: 5422 lw s0,40(sp) + 3003494: 6145 addi sp,sp,48 + 3003496: 8082 ret + +03003498 : + * @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) +{ + 3003498: 7179 addi sp,sp,-48 + 300349a: d622 sw s0,44(sp) + 300349c: 1800 addi s0,sp,48 + 300349e: fca42e23 sw a0,-36(s0) + 30034a2: fcb42c23 sw a1,-40(s0) + unsigned long ret = 1; + 30034a6: 4785 li a5,1 + 30034a8: fef42623 sw a5,-20(s0) + while (exponent--) { + 30034ac: a809 j 30034be + ret *= base; + 30034ae: fec42703 lw a4,-20(s0) + 30034b2: fdc42783 lw a5,-36(s0) + 30034b6: 02f707b3 mul a5,a4,a5 + 30034ba: fef42623 sw a5,-20(s0) + while (exponent--) { + 30034be: fd842783 lw a5,-40(s0) + 30034c2: fff78713 addi a4,a5,-1 + 30034c6: fce42c23 sw a4,-40(s0) + 30034ca: f3f5 bnez a5,30034ae + } + return ret; /* ret = base ^ exponent */ + 30034cc: fec42783 lw a5,-20(s0) +} + 30034d0: 853e mv a0,a5 + 30034d2: 5432 lw s0,44(sp) + 30034d4: 6145 addi sp,sp,48 + 30034d6: 8082 ret + +030034d8 : + * @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) +{ + 30034d8: 7179 addi sp,sp,-48 + 30034da: d622 sw s0,44(sp) + 30034dc: 1800 addi s0,sp,48 + 30034de: fca42e23 sw a0,-36(s0) + 30034e2: fcb42c23 sw a1,-40(s0) + unsigned int cnt = 0; + 30034e6: fe042623 sw zero,-20(s0) + if (base == 0) { + 30034ea: fd842783 lw a5,-40(s0) + 30034ee: e78d bnez a5,3003518 + return 0; + 30034f0: 4781 li a5,0 + 30034f2: a099 j 3003538 + } + while (num != 0) { + cnt++; + 30034f4: fec42783 lw a5,-20(s0) + 30034f8: 0785 addi a5,a5,1 + 30034fa: fef42623 sw a5,-20(s0) + if (cnt > MAX_DIV_TIMES) { + 30034fe: fec42703 lw a4,-20(s0) + 3003502: 47fd li a5,31 + 3003504: 00e7ee63 bltu a5,a4,3003520 + break; + } + num /= base; + 3003508: fdc42703 lw a4,-36(s0) + 300350c: fd842783 lw a5,-40(s0) + 3003510: 02f757b3 divu a5,a4,a5 + 3003514: fcf42e23 sw a5,-36(s0) + while (num != 0) { + 3003518: fdc42783 lw a5,-36(s0) + 300351c: ffe1 bnez a5,30034f4 + 300351e: a011 j 3003522 + break; + 3003520: 0001 nop + } + cnt = (cnt == 0) ? 1 : cnt; + 3003522: fec42783 lw a5,-20(s0) + 3003526: c781 beqz a5,300352e + 3003528: fec42783 lw a5,-20(s0) + 300352c: a011 j 3003530 + 300352e: 4785 li a5,1 + 3003530: fef42623 sw a5,-20(s0) + return cnt; + 3003534: fec42783 lw a5,-20(s0) +} + 3003538: 853e mv a0,a5 + 300353a: 5432 lw s0,44(sp) + 300353c: 6145 addi sp,sp,48 + 300353e: 8082 ret + +03003540 : + * @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) +{ + 3003540: 7179 addi sp,sp,-48 + 3003542: d606 sw ra,44(sp) + 3003544: d422 sw s0,40(sp) + 3003546: 1800 addi s0,sp,48 + 3003548: fca42e23 sw a0,-36(s0) + 300354c: fcb42c23 sw a1,-40(s0) + 3003550: fcc42a23 sw a2,-44(s0) + unsigned char ch; + while (digits != 0) { + 3003554: a069 j 30035de + ch = num / DBG_Pow(base, digits - 1); + 3003556: fd442783 lw a5,-44(s0) + 300355a: 17fd addi a5,a5,-1 + 300355c: 85be mv a1,a5 + 300355e: fd842503 lw a0,-40(s0) + 3003562: 3f1d jal ra,3003498 + 3003564: 872a mv a4,a0 + 3003566: fdc42783 lw a5,-36(s0) + 300356a: 02e7d7b3 divu a5,a5,a4 + 300356e: fef407a3 sb a5,-17(s0) + num %= DBG_Pow(base, digits - 1); + 3003572: fd442783 lw a5,-44(s0) + 3003576: 17fd addi a5,a5,-1 + 3003578: 85be mv a1,a5 + 300357a: fd842503 lw a0,-40(s0) + 300357e: 3f29 jal ra,3003498 + 3003580: 872a mv a4,a0 + 3003582: fdc42783 lw a5,-36(s0) + 3003586: 02e7f7b3 remu a5,a5,a4 + 300358a: fcf42e23 sw a5,-36(s0) + if (base == DECIMAL) { + 300358e: fd842703 lw a4,-40(s0) + 3003592: 47a9 li a5,10 + 3003594: 00f71963 bne a4,a5,30035a6 + DBG_PrintCh(ch + '0'); + 3003598: fef44783 lbu a5,-17(s0) + 300359c: 03078793 addi a5,a5,48 + 30035a0: 853e mv a0,a5 + 30035a2: 35ad jal ra,300340c + 30035a4: a805 j 30035d4 + } else if (base == HEXADECIMAL) { + 30035a6: fd842703 lw a4,-40(s0) + 30035aa: 47c1 li a5,16 + 30035ac: 02f71d63 bne a4,a5,30035e6 + if (ch < DECIMAL_BASE) { + 30035b0: fef44703 lbu a4,-17(s0) + 30035b4: 47a5 li a5,9 + 30035b6: 00e7e963 bltu a5,a4,30035c8 + DBG_PrintCh(ch + '0'); + 30035ba: fef44783 lbu a5,-17(s0) + 30035be: 03078793 addi a5,a5,48 + 30035c2: 853e mv a0,a5 + 30035c4: 35a1 jal ra,300340c + 30035c6: a039 j 30035d4 + } else { + DBG_PrintCh(ch - DECIMAL_BASE + 'A'); + 30035c8: fef44783 lbu a5,-17(s0) + 30035cc: 03778793 addi a5,a5,55 + 30035d0: 853e mv a0,a5 + 30035d2: 3d2d jal ra,300340c + } + } else { + break; + } + digits--; + 30035d4: fd442783 lw a5,-44(s0) + 30035d8: 17fd addi a5,a5,-1 + 30035da: fcf42a23 sw a5,-44(s0) + while (digits != 0) { + 30035de: fd442783 lw a5,-44(s0) + 30035e2: fbb5 bnez a5,3003556 + } +} + 30035e4: a011 j 30035e8 + break; + 30035e6: 0001 nop +} + 30035e8: 0001 nop + 30035ea: 50b2 lw ra,44(sp) + 30035ec: 5422 lw s0,40(sp) + 30035ee: 6145 addi sp,sp,48 + 30035f0: 8082 ret + +030035f2 : + * @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) +{ + 30035f2: 7179 addi sp,sp,-48 + 30035f4: d606 sw ra,44(sp) + 30035f6: d422 sw s0,40(sp) + 30035f8: 1800 addi s0,sp,48 + 30035fa: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (intNum == 0) { + 30035fe: fdc42783 lw a5,-36(s0) + 3003602: e791 bnez a5,300360e + DBG_PrintCh('0'); + 3003604: 03000513 li a0,48 + 3003608: 3511 jal ra,300340c + return 1; + 300360a: 4785 li a5,1 + 300360c: a82d j 3003646 + } + if (intNum < 0) { + 300360e: fdc42783 lw a5,-36(s0) + 3003612: 0007db63 bgez a5,3003628 + DBG_PrintCh('-'); + 3003616: 02d00513 li a0,45 + 300361a: 3bcd jal ra,300340c + intNum = -intNum; + 300361c: fdc42783 lw a5,-36(s0) + 3003620: 40f007b3 neg a5,a5 + 3003624: fcf42e23 sw a5,-36(s0) + } + cnt = DBG_CountDigits(intNum, DECIMAL); + 3003628: 45a9 li a1,10 + 300362a: fdc42503 lw a0,-36(s0) + 300362e: 356d jal ra,30034d8 + 3003630: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(intNum, DECIMAL, cnt); + 3003634: fdc42783 lw a5,-36(s0) + 3003638: fec42603 lw a2,-20(s0) + 300363c: 45a9 li a1,10 + 300363e: 853e mv a0,a5 + 3003640: 3701 jal ra,3003540 + return cnt; + 3003642: fec42783 lw a5,-20(s0) +} + 3003646: 853e mv a0,a5 + 3003648: 50b2 lw ra,44(sp) + 300364a: 5422 lw s0,40(sp) + 300364c: 6145 addi sp,sp,48 + 300364e: 8082 ret + +03003650 : + * @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) +{ + 3003650: 7179 addi sp,sp,-48 + 3003652: d606 sw ra,44(sp) + 3003654: d422 sw s0,40(sp) + 3003656: 1800 addi s0,sp,48 + 3003658: fca42e23 sw a0,-36(s0) + unsigned int cnt; + if (hexNum == 0) { + 300365c: fdc42783 lw a5,-36(s0) + 3003660: e791 bnez a5,300366c + DBG_PrintCh('0'); + 3003662: 03000513 li a0,48 + 3003666: 335d jal ra,300340c + return 1; + 3003668: 4785 li a5,1 + 300366a: a005 j 300368a + } + cnt = DBG_CountDigits(hexNum, HEXADECIMAL); + 300366c: fdc42783 lw a5,-36(s0) + 3003670: 45c1 li a1,16 + 3003672: 853e mv a0,a5 + 3003674: 3595 jal ra,30034d8 + 3003676: fea42623 sw a0,-20(s0) + DBG_PutUnsignedNum(hexNum, HEXADECIMAL, cnt); + 300367a: fec42603 lw a2,-20(s0) + 300367e: 45c1 li a1,16 + 3003680: fdc42503 lw a0,-36(s0) + 3003684: 3d75 jal ra,3003540 + return cnt; + 3003686: fec42783 lw a5,-20(s0) +} + 300368a: 853e mv a0,a5 + 300368c: 50b2 lw ra,44(sp) + 300368e: 5422 lw s0,40(sp) + 3003690: 6145 addi sp,sp,48 + 3003692: 8082 ret + +03003694 : + * @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) +{ + 3003694: 7139 addi sp,sp,-64 + 3003696: de06 sw ra,60(sp) + 3003698: dc22 sw s0,56(sp) + 300369a: 0080 addi s0,sp,64 + 300369c: fca42627 fsw fa0,-52(s0) + 30036a0: fca42423 sw a0,-56(s0) + unsigned int cnt = 0; + 30036a4: fe042623 sw zero,-20(s0) + unsigned int floatScale; + + if (fltNum < 0) { + 30036a8: fcc42787 flw fa5,-52(s0) + 30036ac: f0000753 fmv.w.x fa4,zero + 30036b0: a0e797d3 flt.s a5,fa5,fa4 + 30036b4: cf99 beqz a5,30036d2 + DBG_PrintCh('-'); + 30036b6: 02d00513 li a0,45 + 30036ba: 3b89 jal ra,300340c + cnt += 1; + 30036bc: fec42783 lw a5,-20(s0) + 30036c0: 0785 addi a5,a5,1 + 30036c2: fef42623 sw a5,-20(s0) + fltNum = -fltNum; + 30036c6: fcc42787 flw fa5,-52(s0) + 30036ca: 20f797d3 fneg.s fa5,fa5 + 30036ce: fcf42627 fsw fa5,-52(s0) + } + int integerVal = (int)fltNum; + 30036d2: fcc42787 flw fa5,-52(s0) + 30036d6: c00797d3 fcvt.w.s a5,fa5,rtz + 30036da: fef42023 sw a5,-32(s0) + floatScale = DBG_Pow(10, (precision + 1)); /* 10: decimal */ + 30036de: fc842783 lw a5,-56(s0) + 30036e2: 0785 addi a5,a5,1 + 30036e4: 85be mv a1,a5 + 30036e6: 4529 li a0,10 + 30036e8: 3b45 jal ra,3003498 + 30036ea: fca42e23 sw a0,-36(s0) + int floatVal = (long)(floatScale * (fltNum - integerVal)); + 30036ee: fdc42783 lw a5,-36(s0) + 30036f2: d017f753 fcvt.s.wu fa4,a5 + 30036f6: fe042783 lw a5,-32(s0) + 30036fa: d007f7d3 fcvt.s.w fa5,a5 + 30036fe: fcc42687 flw fa3,-52(s0) + 3003702: 08f6f7d3 fsub.s fa5,fa3,fa5 + 3003706: 10f777d3 fmul.s fa5,fa4,fa5 + 300370a: c00797d3 fcvt.w.s a5,fa5,rtz + 300370e: fef42423 sw a5,-24(s0) + /* Half-adjust: round up or round down */ + if (floatVal % DECIMAL_BASE >= HALF_ADJUST_BOUNDARY) { + 3003712: fe842703 lw a4,-24(s0) + 3003716: 47a9 li a5,10 + 3003718: 02f77733 remu a4,a4,a5 + 300371c: 4791 li a5,4 + 300371e: 00e7fb63 bgeu a5,a4,3003734 + floatVal = floatVal / DECIMAL_BASE + 1; + 3003722: fe842703 lw a4,-24(s0) + 3003726: 47a9 li a5,10 + 3003728: 02f757b3 divu a5,a4,a5 + 300372c: 0785 addi a5,a5,1 + 300372e: fef42423 sw a5,-24(s0) + 3003732: a801 j 3003742 + } else { + floatVal = floatVal / DECIMAL_BASE; + 3003734: fe842703 lw a4,-24(s0) + 3003738: 47a9 li a5,10 + 300373a: 02f757b3 divu a5,a4,a5 + 300373e: fef42423 sw a5,-24(s0) + } + cnt += DBG_PrintInt(integerVal); + 3003742: fe042503 lw a0,-32(s0) + 3003746: 3575 jal ra,30035f2 + 3003748: 872a mv a4,a0 + 300374a: fec42783 lw a5,-20(s0) + 300374e: 97ba add a5,a5,a4 + 3003750: fef42623 sw a5,-20(s0) + DBG_PrintCh('.'); + 3003754: 02e00513 li a0,46 + 3003758: 3955 jal ra,300340c + cnt += 1; + 300375a: fec42783 lw a5,-20(s0) + 300375e: 0785 addi a5,a5,1 + 3003760: fef42623 sw a5,-20(s0) + /* Pad 0 in float part */ + unsigned int fltCnt = DBG_CountDigits(floatVal, DECIMAL); + 3003764: 45a9 li a1,10 + 3003766: fe842503 lw a0,-24(s0) + 300376a: 33bd jal ra,30034d8 + 300376c: fca42c23 sw a0,-40(s0) + if (precision > fltCnt) { + 3003770: fc842703 lw a4,-56(s0) + 3003774: fd842783 lw a5,-40(s0) + 3003778: 02e7f763 bgeu a5,a4,30037a6 + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 300377c: fe042223 sw zero,-28(s0) + 3003780: a809 j 3003792 + DBG_PrintCh('0'); /* add '0' */ + 3003782: 03000513 li a0,48 + 3003786: 3159 jal ra,300340c + for (unsigned int i = 0; i < precision - fltCnt; i++) { + 3003788: fe442783 lw a5,-28(s0) + 300378c: 0785 addi a5,a5,1 + 300378e: fef42223 sw a5,-28(s0) + 3003792: fc842703 lw a4,-56(s0) + 3003796: fd842783 lw a5,-40(s0) + 300379a: 40f707b3 sub a5,a4,a5 + 300379e: fe442703 lw a4,-28(s0) + 30037a2: fef760e3 bltu a4,a5,3003782 + } + } + DBG_PutUnsignedNum(floatVal, DECIMAL, fltCnt); /* print unsigned number */ + 30037a6: fe842783 lw a5,-24(s0) + 30037aa: fd842603 lw a2,-40(s0) + 30037ae: 45a9 li a1,10 + 30037b0: 853e mv a0,a5 + 30037b2: 3379 jal ra,3003540 + cnt += precision; + 30037b4: fec42703 lw a4,-20(s0) + 30037b8: fc842783 lw a5,-56(s0) + 30037bc: 97ba add a5,a5,a4 + 30037be: fef42623 sw a5,-20(s0) + return cnt; + 30037c2: fec42783 lw a5,-20(s0) +} + 30037c6: 853e mv a0,a5 + 30037c8: 50f2 lw ra,60(sp) + 30037ca: 5462 lw s0,56(sp) + 30037cc: 6121 addi sp,sp,64 + 30037ce: 8082 ret + +030037d0 : + * @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) +{ + 30037d0: 7139 addi sp,sp,-64 + 30037d2: de06 sw ra,60(sp) + 30037d4: dc22 sw s0,56(sp) + 30037d6: 0080 addi s0,sp,64 + 30037d8: 87aa mv a5,a0 + 30037da: fcb42423 sw a1,-56(s0) + 30037de: fcf407a3 sb a5,-49(s0) + unsigned int cnt = 0; + 30037e2: fe042623 sw zero,-20(s0) + unsigned int tmpCnt; + char chVal = 0; + 30037e6: fe0405a3 sb zero,-21(s0) + const char *strVal = NULL; + 30037ea: fe042223 sw zero,-28(s0) + int intVal = 0; + 30037ee: fe042023 sw zero,-32(s0) + unsigned int unsignedVal = 0; + 30037f2: fc042e23 sw zero,-36(s0) + unsigned int hexVal = 0; + 30037f6: fc042c23 sw zero,-40(s0) + float fltVal = 0; + 30037fa: fc042a23 sw zero,-44(s0) + switch (ch) { + 30037fe: fcf40783 lb a5,-49(s0) + 3003802: fa878793 addi a5,a5,-88 + 3003806: 02000713 li a4,32 + 300380a: 14f76063 bltu a4,a5,300394a + 300380e: 00279713 slli a4,a5,0x2 + 3003812: 0300f7b7 lui a5,0x300f + 3003816: 0e078793 addi a5,a5,224 # 300f0e0 + 300381a: 97ba add a5,a5,a4 + 300381c: 439c lw a5,0(a5) + 300381e: 8782 jr a5 + case 'c': /* Character format data. */ + chVal = VA_ARG(*paramList, int); /* Use type int because of byte alignment */ + 3003820: fc842783 lw a5,-56(s0) + 3003824: 439c lw a5,0(a5) + 3003826: 00478693 addi a3,a5,4 + 300382a: fc842703 lw a4,-56(s0) + 300382e: c314 sw a3,0(a4) + 3003830: 439c lw a5,0(a5) + 3003832: fef405a3 sb a5,-21(s0) + DBG_PrintCh(chVal); + 3003836: feb40783 lb a5,-21(s0) + 300383a: 853e mv a0,a5 + 300383c: 3ec1 jal ra,300340c + cnt += 1; + 300383e: fec42783 lw a5,-20(s0) + 3003842: 0785 addi a5,a5,1 + 3003844: fef42623 sw a5,-20(s0) + break; + 3003848: aa19 j 300395e + case 's': /* String format data. */ + strVal = VA_ARG(*paramList, const char *); + 300384a: fc842783 lw a5,-56(s0) + 300384e: 439c lw a5,0(a5) + 3003850: 00478693 addi a3,a5,4 + 3003854: fc842703 lw a4,-56(s0) + 3003858: c314 sw a3,0(a4) + 300385a: 439c lw a5,0(a5) + 300385c: fef42223 sw a5,-28(s0) + cnt += DBG_PrintStr(strVal); + 3003860: fe442503 lw a0,-28(s0) + 3003864: 36ed jal ra,300344e + 3003866: 87aa mv a5,a0 + 3003868: 873e mv a4,a5 + 300386a: fec42783 lw a5,-20(s0) + 300386e: 97ba add a5,a5,a4 + 3003870: fef42623 sw a5,-20(s0) + break; + 3003874: a0ed j 300395e + case 'd': /* Integer decimal data. */ + intVal = VA_ARG(*paramList, int); + 3003876: fc842783 lw a5,-56(s0) + 300387a: 439c lw a5,0(a5) + 300387c: 00478693 addi a3,a5,4 + 3003880: fc842703 lw a4,-56(s0) + 3003884: c314 sw a3,0(a4) + 3003886: 439c lw a5,0(a5) + 3003888: fef42023 sw a5,-32(s0) + cnt += DBG_PrintInt(intVal); + 300388c: fe042503 lw a0,-32(s0) + 3003890: 338d jal ra,30035f2 + 3003892: 872a mv a4,a0 + 3003894: fec42783 lw a5,-20(s0) + 3003898: 97ba add a5,a5,a4 + 300389a: fef42623 sw a5,-20(s0) + break; + 300389e: a0c1 j 300395e + case 'u': /* Unsigned decimal data. */ + unsignedVal = VA_ARG(*paramList, unsigned int); + 30038a0: fc842783 lw a5,-56(s0) + 30038a4: 439c lw a5,0(a5) + 30038a6: 00478693 addi a3,a5,4 + 30038aa: fc842703 lw a4,-56(s0) + 30038ae: c314 sw a3,0(a4) + 30038b0: 439c lw a5,0(a5) + 30038b2: fcf42e23 sw a5,-36(s0) + tmpCnt = DBG_CountDigits(unsignedVal, DECIMAL); + 30038b6: fdc42783 lw a5,-36(s0) + 30038ba: 45a9 li a1,10 + 30038bc: 853e mv a0,a5 + 30038be: 3929 jal ra,30034d8 + 30038c0: fca42823 sw a0,-48(s0) + DBG_PutUnsignedNum(unsignedVal, DECIMAL, tmpCnt); + 30038c4: fd042603 lw a2,-48(s0) + 30038c8: 45a9 li a1,10 + 30038ca: fdc42503 lw a0,-36(s0) + 30038ce: 398d jal ra,3003540 + cnt += tmpCnt; + 30038d0: fec42703 lw a4,-20(s0) + 30038d4: fd042783 lw a5,-48(s0) + 30038d8: 97ba add a5,a5,a4 + 30038da: fef42623 sw a5,-20(s0) + break; + 30038de: a041 j 300395e + case 'x': /* Hexadecimal data. */ + case 'X': + case 'p': /* Address data. */ + hexVal = VA_ARG(*paramList, unsigned int); + 30038e0: fc842783 lw a5,-56(s0) + 30038e4: 439c lw a5,0(a5) + 30038e6: 00478693 addi a3,a5,4 + 30038ea: fc842703 lw a4,-56(s0) + 30038ee: c314 sw a3,0(a4) + 30038f0: 439c lw a5,0(a5) + 30038f2: fcf42c23 sw a5,-40(s0) + cnt += DBG_PrintHex(hexVal); + 30038f6: fd842503 lw a0,-40(s0) + 30038fa: 3b99 jal ra,3003650 + 30038fc: 872a mv a4,a0 + 30038fe: fec42783 lw a5,-20(s0) + 3003902: 97ba add a5,a5,a4 + 3003904: fef42623 sw a5,-20(s0) + break; + 3003908: a899 j 300395e + case 'f': /* Floating-point data. */ + fltVal = VA_ARG(*paramList, double); + 300390a: fc842783 lw a5,-56(s0) + 300390e: 439c lw a5,0(a5) + 3003910: 079d addi a5,a5,7 + 3003912: 9be1 andi a5,a5,-8 + 3003914: 00878693 addi a3,a5,8 + 3003918: fc842703 lw a4,-56(s0) + 300391c: c314 sw a3,0(a4) + 300391e: 0047a803 lw a6,4(a5) + 3003922: 439c lw a5,0(a5) + 3003924: 853e mv a0,a5 + 3003926: 85c2 mv a1,a6 + 3003928: 5d70a0ef jal ra,300e6fe <__truncdfsf2> + 300392c: 20a507d3 fmv.s fa5,fa0 + 3003930: fcf42a27 fsw fa5,-44(s0) + cnt += DBG_PrintFlt(fltVal, 5); /* default precision: 5 */ + 3003934: 4515 li a0,5 + 3003936: fd442507 flw fa0,-44(s0) + 300393a: 3ba9 jal ra,3003694 + 300393c: 872a mv a4,a0 + 300393e: fec42783 lw a5,-20(s0) + 3003942: 97ba add a5,a5,a4 + 3003944: fef42623 sw a5,-20(s0) + break; + 3003948: a819 j 300395e + default: + DBG_PrintCh(ch); + 300394a: fcf40783 lb a5,-49(s0) + 300394e: 853e mv a0,a5 + 3003950: 3c75 jal ra,300340c + cnt += 1; + 3003952: fec42783 lw a5,-20(s0) + 3003956: 0785 addi a5,a5,1 + 3003958: fef42623 sw a5,-20(s0) + break; + 300395c: 0001 nop + } + return cnt; + 300395e: fec42783 lw a5,-20(s0) +} + 3003962: 853e mv a0,a5 + 3003964: 50f2 lw ra,60(sp) + 3003966: 5462 lw s0,56(sp) + 3003968: 6121 addi sp,sp,64 + 300396a: 8082 ret + +0300396c : + * @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) +{ + 300396c: 7139 addi sp,sp,-64 + 300396e: de06 sw ra,60(sp) + 3003970: dc22 sw s0,56(sp) + 3003972: 0080 addi s0,sp,64 + 3003974: fca42623 sw a0,-52(s0) + 3003978: fcb42423 sw a1,-56(s0) + int zeroCnt = 0; + 300397c: fc042e23 sw zero,-36(s0) + int digitsCnt = 0; + 3003980: fe042623 sw zero,-20(s0) + unsigned int cnt = 0; + 3003984: fe042423 sw zero,-24(s0) + + if (intNum == 0) { + 3003988: fcc42783 lw a5,-52(s0) + 300398c: e791 bnez a5,3003998 + DBG_PrintCh('0'); + 300398e: 03000513 li a0,48 + 3003992: 3cad jal ra,300340c + return 1; + 3003994: 4785 li a5,1 + 3003996: a0dd j 3003a7c + } + if (intNum < 0) { + 3003998: fcc42783 lw a5,-52(s0) + 300399c: 0607dd63 bgez a5,3003a16 + DBG_PrintCh('-'); /* add symbol */ + 30039a0: 02d00513 li a0,45 + 30039a4: 34a5 jal ra,300340c + cnt++; + 30039a6: fe842783 lw a5,-24(s0) + 30039aa: 0785 addi a5,a5,1 + 30039ac: fef42423 sw a5,-24(s0) + intNum = -intNum; + 30039b0: fcc42783 lw a5,-52(s0) + 30039b4: 40f007b3 neg a5,a5 + 30039b8: fcf42623 sw a5,-52(s0) + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 30039bc: 45a9 li a1,10 + 30039be: fcc42503 lw a0,-52(s0) + 30039c2: 3e19 jal ra,30034d8 + 30039c4: 87aa mv a5,a0 + 30039c6: fef42623 sw a5,-20(s0) + zeroCnt = fieldWidth - digitsCnt; + 30039ca: fc842703 lw a4,-56(s0) + 30039ce: fec42783 lw a5,-20(s0) + 30039d2: 40f707b3 sub a5,a4,a5 + 30039d6: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 30039da: fe042223 sw zero,-28(s0) + 30039de: a831 j 30039fa + DBG_PrintCh('0'); /* add '0' */ + 30039e0: 03000513 li a0,48 + 30039e4: 3425 jal ra,300340c + cnt++; + 30039e6: fe842783 lw a5,-24(s0) + 30039ea: 0785 addi a5,a5,1 + 30039ec: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 30039f0: fe442783 lw a5,-28(s0) + 30039f4: 0785 addi a5,a5,1 + 30039f6: fef42223 sw a5,-28(s0) + 30039fa: fe442703 lw a4,-28(s0) + 30039fe: fdc42783 lw a5,-36(s0) + 3003a02: fcf74fe3 blt a4,a5,30039e0 + } + cnt += digitsCnt; + 3003a06: fec42783 lw a5,-20(s0) + 3003a0a: fe842703 lw a4,-24(s0) + 3003a0e: 97ba add a5,a5,a4 + 3003a10: fef42423 sw a5,-24(s0) + 3003a14: a891 j 3003a68 + } else { + digitsCnt = DBG_CountDigits(intNum, DECIMAL); /* get int value's width */ + 3003a16: 45a9 li a1,10 + 3003a18: fcc42503 lw a0,-52(s0) + 3003a1c: 3c75 jal ra,30034d8 + 3003a1e: 87aa mv a5,a0 + 3003a20: fef42623 sw a5,-20(s0) + cnt = digitsCnt; + 3003a24: fec42783 lw a5,-20(s0) + 3003a28: fef42423 sw a5,-24(s0) + zeroCnt = fieldWidth - digitsCnt; + 3003a2c: fc842703 lw a4,-56(s0) + 3003a30: fec42783 lw a5,-20(s0) + 3003a34: 40f707b3 sub a5,a4,a5 + 3003a38: fcf42e23 sw a5,-36(s0) + for (int i = 0; i < zeroCnt; i++) { + 3003a3c: fe042023 sw zero,-32(s0) + 3003a40: a831 j 3003a5c + DBG_PrintCh('0'); /* add '0' */ + 3003a42: 03000513 li a0,48 + 3003a46: 32d9 jal ra,300340c + cnt++; + 3003a48: fe842783 lw a5,-24(s0) + 3003a4c: 0785 addi a5,a5,1 + 3003a4e: fef42423 sw a5,-24(s0) + for (int i = 0; i < zeroCnt; i++) { + 3003a52: fe042783 lw a5,-32(s0) + 3003a56: 0785 addi a5,a5,1 + 3003a58: fef42023 sw a5,-32(s0) + 3003a5c: fe042703 lw a4,-32(s0) + 3003a60: fdc42783 lw a5,-36(s0) + 3003a64: fcf74fe3 blt a4,a5,3003a42 + } + } + DBG_PutUnsignedNum(intNum, DECIMAL, digitsCnt); + 3003a68: fcc42783 lw a5,-52(s0) + 3003a6c: fec42703 lw a4,-20(s0) + 3003a70: 863a mv a2,a4 + 3003a72: 45a9 li a1,10 + 3003a74: 853e mv a0,a5 + 3003a76: 34e9 jal ra,3003540 + return cnt; + 3003a78: fe842783 lw a5,-24(s0) +} + 3003a7c: 853e mv a0,a5 + 3003a7e: 50f2 lw ra,60(sp) + 3003a80: 5462 lw s0,56(sp) + 3003a82: 6121 addi sp,sp,64 + 3003a84: 8082 ret + +03003a86 : + +static int DBG_Atoi(const char **s) +{ + 3003a86: 7179 addi sp,sp,-48 + 3003a88: d622 sw s0,44(sp) + 3003a8a: 1800 addi s0,sp,48 + 3003a8c: fca42e23 sw a0,-36(s0) + int i, c; + + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3003a90: fe042623 sw zero,-20(s0) + 3003a94: a02d j 3003abe + i = i * 10 + c - '0'; /* 10: decimal */ + 3003a96: fec42703 lw a4,-20(s0) + 3003a9a: 47a9 li a5,10 + 3003a9c: 02f70733 mul a4,a4,a5 + 3003aa0: fe842783 lw a5,-24(s0) + 3003aa4: 97ba add a5,a5,a4 + 3003aa6: fd078793 addi a5,a5,-48 + 3003aaa: fef42623 sw a5,-20(s0) + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) { + 3003aae: fdc42783 lw a5,-36(s0) + 3003ab2: 439c lw a5,0(a5) + 3003ab4: 00178713 addi a4,a5,1 + 3003ab8: fdc42783 lw a5,-36(s0) + 3003abc: c398 sw a4,0(a5) + 3003abe: fdc42783 lw a5,-36(s0) + 3003ac2: 439c lw a5,0(a5) + 3003ac4: 00078783 lb a5,0(a5) + 3003ac8: fef42423 sw a5,-24(s0) + 3003acc: fe842703 lw a4,-24(s0) + 3003ad0: 02f00793 li a5,47 + 3003ad4: 00e7d863 bge a5,a4,3003ae4 + 3003ad8: fe842703 lw a4,-24(s0) + 3003adc: 03900793 li a5,57 + 3003ae0: fae7dbe3 bge a5,a4,3003a96 + } + return i; + 3003ae4: fec42783 lw a5,-20(s0) +} + 3003ae8: 853e mv a0,a5 + 3003aea: 5432 lw s0,44(sp) + 3003aec: 6145 addi sp,sp,48 + 3003aee: 8082 ret + +03003af0 : + * @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, ...) +{ + 3003af0: 711d addi sp,sp,-96 + 3003af2: de06 sw ra,60(sp) + 3003af4: dc22 sw s0,56(sp) + 3003af6: 0080 addi s0,sp,64 + 3003af8: fca42623 sw a0,-52(s0) + 3003afc: c04c sw a1,4(s0) + 3003afe: c410 sw a2,8(s0) + 3003b00: c454 sw a3,12(s0) + 3003b02: c818 sw a4,16(s0) + 3003b04: c85c sw a5,20(s0) + 3003b06: 01042c23 sw a6,24(s0) + 3003b0a: 01142e23 sw a7,28(s0) + DEBUG_ASSERT_PARAM(format != NULL); + int cnt = 0; + 3003b0e: fe042623 sw zero,-20(s0) + int fieldWidth = 0; + 3003b12: fe042423 sw zero,-24(s0) + int floatPrecision = 0; + 3003b16: fe042223 sw zero,-28(s0) + float fltVal = 0; + 3003b1a: fe042023 sw zero,-32(s0) + int intVal = 0; + 3003b1e: fc042e23 sw zero,-36(s0) + va_list paramList; + VA_START(paramList, format); + 3003b22: 02040793 addi a5,s0,32 + 3003b26: 1791 addi a5,a5,-28 + 3003b28: fcf42c23 sw a5,-40(s0) + + while (*format != '\0') { + 3003b2c: aa09 j 3003c3e + if (*format != '%') { + 3003b2e: fcc42783 lw a5,-52(s0) + 3003b32: 00078703 lb a4,0(a5) + 3003b36: 02500793 li a5,37 + 3003b3a: 00f70e63 beq a4,a5,3003b56 + DBG_PrintCh(*format); + 3003b3e: fcc42783 lw a5,-52(s0) + 3003b42: 00078783 lb a5,0(a5) + 3003b46: 853e mv a0,a5 + 3003b48: 30d1 jal ra,300340c + cnt += 1; + 3003b4a: fec42783 lw a5,-20(s0) + 3003b4e: 0785 addi a5,a5,1 + 3003b50: fef42623 sw a5,-20(s0) + 3003b54: a0c5 j 3003c34 + } else { + format++; + 3003b56: fcc42783 lw a5,-52(s0) + 3003b5a: 0785 addi a5,a5,1 + 3003b5c: fcf42623 sw a5,-52(s0) + if (*format == '0') { + 3003b60: fcc42783 lw a5,-52(s0) + 3003b64: 00078703 lb a4,0(a5) + 3003b68: 03000793 li a5,48 + 3003b6c: 04f71263 bne a4,a5,3003bb0 + format++; + 3003b70: fcc42783 lw a5,-52(s0) + 3003b74: 0785 addi a5,a5,1 + 3003b76: fcf42623 sw a5,-52(s0) + fieldWidth = DBG_Atoi(&format); + 3003b7a: fcc40793 addi a5,s0,-52 + 3003b7e: 853e mv a0,a5 + 3003b80: 3719 jal ra,3003a86 + 3003b82: fea42423 sw a0,-24(s0) + intVal = VA_ARG(paramList, int); + 3003b86: fd842783 lw a5,-40(s0) + 3003b8a: 00478713 addi a4,a5,4 + 3003b8e: fce42c23 sw a4,-40(s0) + 3003b92: 439c lw a5,0(a5) + 3003b94: fcf42e23 sw a5,-36(s0) + cnt += DBG_PrintIntWithField(intVal, fieldWidth); + 3003b98: fe842583 lw a1,-24(s0) + 3003b9c: fdc42503 lw a0,-36(s0) + 3003ba0: 33f1 jal ra,300396c + 3003ba2: 872a mv a4,a0 + 3003ba4: fec42783 lw a5,-20(s0) + 3003ba8: 97ba add a5,a5,a4 + 3003baa: fef42623 sw a5,-20(s0) + 3003bae: a059 j 3003c34 + } else if (*format == '.') { + 3003bb0: fcc42783 lw a5,-52(s0) + 3003bb4: 00078703 lb a4,0(a5) + 3003bb8: 02e00793 li a5,46 + 3003bbc: 04f71d63 bne a4,a5,3003c16 + format++; + 3003bc0: fcc42783 lw a5,-52(s0) + 3003bc4: 0785 addi a5,a5,1 + 3003bc6: fcf42623 sw a5,-52(s0) + floatPrecision = DBG_Atoi(&format); + 3003bca: fcc40793 addi a5,s0,-52 + 3003bce: 853e mv a0,a5 + 3003bd0: 3d5d jal ra,3003a86 + 3003bd2: fea42223 sw a0,-28(s0) + fltVal = VA_ARG(paramList, double); + 3003bd6: fd842783 lw a5,-40(s0) + 3003bda: 079d addi a5,a5,7 + 3003bdc: 9be1 andi a5,a5,-8 + 3003bde: 00878713 addi a4,a5,8 + 3003be2: fce42c23 sw a4,-40(s0) + 3003be6: 0047a803 lw a6,4(a5) + 3003bea: 439c lw a5,0(a5) + 3003bec: 853e mv a0,a5 + 3003bee: 85c2 mv a1,a6 + 3003bf0: 30f0a0ef jal ra,300e6fe <__truncdfsf2> + 3003bf4: 20a507d3 fmv.s fa5,fa0 + 3003bf8: fef42027 fsw fa5,-32(s0) + cnt += DBG_PrintFlt(fltVal, floatPrecision); + 3003bfc: fe442783 lw a5,-28(s0) + 3003c00: 853e mv a0,a5 + 3003c02: fe042507 flw fa0,-32(s0) + 3003c06: 3479 jal ra,3003694 + 3003c08: 872a mv a4,a0 + 3003c0a: fec42783 lw a5,-20(s0) + 3003c0e: 97ba add a5,a5,a4 + 3003c10: fef42623 sw a5,-20(s0) + 3003c14: a005 j 3003c34 + } else { + cnt += ParseSpecifier(*format, ¶mList); + 3003c16: fcc42783 lw a5,-52(s0) + 3003c1a: 00078783 lb a5,0(a5) + 3003c1e: fd840713 addi a4,s0,-40 + 3003c22: 85ba mv a1,a4 + 3003c24: 853e mv a0,a5 + 3003c26: 366d jal ra,30037d0 + 3003c28: 872a mv a4,a0 + 3003c2a: fec42783 lw a5,-20(s0) + 3003c2e: 97ba add a5,a5,a4 + 3003c30: fef42623 sw a5,-20(s0) + } + } + format++; + 3003c34: fcc42783 lw a5,-52(s0) + 3003c38: 0785 addi a5,a5,1 + 3003c3a: fcf42623 sw a5,-52(s0) + while (*format != '\0') { + 3003c3e: fcc42783 lw a5,-52(s0) + 3003c42: 00078783 lb a5,0(a5) + 3003c46: ee0794e3 bnez a5,3003b2e + } + VA_END(paramList); + return cnt; + 3003c4a: fec42783 lw a5,-20(s0) +} + 3003c4e: 853e mv a0,a5 + 3003c50: 50f2 lw ra,60(sp) + 3003c52: 5462 lw s0,56(sp) + 3003c54: 6125 addi sp,sp,96 + 3003c56: 8082 ret + +03003c58 : + * @brief Check gpio value parameter. + * @param value Value of @ref GPIO_Value + * @retval Bool. + */ +static inline bool IsGpioValue(GPIO_Value value) +{ + 3003c58: 1101 addi sp,sp,-32 + 3003c5a: ce22 sw s0,28(sp) + 3003c5c: 1000 addi s0,sp,32 + 3003c5e: fea42623 sw a0,-20(s0) + return (value == GPIO_LOW_LEVEL || value == GPIO_HIGH_LEVEL); + 3003c62: fec42783 lw a5,-20(s0) + 3003c66: c791 beqz a5,3003c72 + 3003c68: fec42703 lw a4,-20(s0) + 3003c6c: 4785 li a5,1 + 3003c6e: 00f71463 bne a4,a5,3003c76 + 3003c72: 4785 li a5,1 + 3003c74: a011 j 3003c78 + 3003c76: 4781 li a5,0 + 3003c78: 8b85 andi a5,a5,1 + 3003c7a: 9f81 uxtb a5 +} + 3003c7c: 853e mv a0,a5 + 3003c7e: 4472 lw s0,28(sp) + 3003c80: 6105 addi sp,sp,32 + 3003c82: 8082 ret + +03003c84 : + * @brief Check gpio direction parameter. + * @param dir Value of @ref GPIO_Direction. + * @retval Bool. + */ +static inline bool IsGpioDirection(GPIO_Direction dir) +{ + 3003c84: 1101 addi sp,sp,-32 + 3003c86: ce22 sw s0,28(sp) + 3003c88: 1000 addi s0,sp,32 + 3003c8a: fea42623 sw a0,-20(s0) + return (dir == GPIO_INPUT_MODE || dir == GPIO_OUTPUT_MODE); + 3003c8e: fec42783 lw a5,-20(s0) + 3003c92: c791 beqz a5,3003c9e + 3003c94: fec42703 lw a4,-20(s0) + 3003c98: 4785 li a5,1 + 3003c9a: 00f71463 bne a4,a5,3003ca2 + 3003c9e: 4785 li a5,1 + 3003ca0: a011 j 3003ca4 + 3003ca2: 4781 li a5,0 + 3003ca4: 8b85 andi a5,a5,1 + 3003ca6: 9f81 uxtb a5 +} + 3003ca8: 853e mv a0,a5 + 3003caa: 4472 lw s0,28(sp) + 3003cac: 6105 addi sp,sp,32 + 3003cae: 8082 ret + +03003cb0 : + * @brief Check gpio pins parameter. + * @param pins OR logical combination of pin. + * @retval Bool. + */ +static inline bool IsGpioPins(unsigned int pins) +{ + 3003cb0: 1101 addi sp,sp,-32 + 3003cb2: ce22 sw s0,28(sp) + 3003cb4: 1000 addi s0,sp,32 + 3003cb6: fea42623 sw a0,-20(s0) + return ((pins & GPIO_PIN_MASK) != BASE_CFG_UNSET) && ((pins & ~GPIO_PIN_MASK) == BASE_CFG_UNSET); + 3003cba: fec42783 lw a5,-20(s0) + 3003cbe: 0ff7f793 andi a5,a5,255 + 3003cc2: cb81 beqz a5,3003cd2 + 3003cc4: fec42783 lw a5,-20(s0) + 3003cc8: f007f793 andi a5,a5,-256 + 3003ccc: e399 bnez a5,3003cd2 + 3003cce: 4785 li a5,1 + 3003cd0: a011 j 3003cd4 + 3003cd2: 4781 li a5,0 + 3003cd4: 8b85 andi a5,a5,1 + 3003cd6: 9f81 uxtb a5 +} + 3003cd8: 853e mv a0,a5 + 3003cda: 4472 lw s0,28(sp) + 3003cdc: 6105 addi sp,sp,32 + 3003cde: 8082 ret + +03003ce0 : + * @brief Check gpio pin parameter. + * @param pin Value of @ref GPIO_PIN. + * @retval Bool. + */ +static inline bool IsGpioPin(GPIO_PIN pin) +{ + 3003ce0: 1101 addi sp,sp,-32 + 3003ce2: ce22 sw s0,28(sp) + 3003ce4: 1000 addi s0,sp,32 + 3003ce6: fea42623 sw a0,-20(s0) + /* 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 || \ + 3003cea: fec42703 lw a4,-20(s0) + 3003cee: 4785 li a5,1 + 3003cf0: 04f70e63 beq a4,a5,3003d4c + return (pin == GPIO_PIN_0 || pin == GPIO_PIN_1 || \ + 3003cf4: fec42703 lw a4,-20(s0) + 3003cf8: 4789 li a5,2 + 3003cfa: 04f70963 beq a4,a5,3003d4c + 3003cfe: fec42703 lw a4,-20(s0) + 3003d02: 4791 li a5,4 + 3003d04: 04f70463 beq a4,a5,3003d4c + pin == GPIO_PIN_2 || pin == GPIO_PIN_3 || \ + 3003d08: fec42703 lw a4,-20(s0) + 3003d0c: 47a1 li a5,8 + 3003d0e: 02f70f63 beq a4,a5,3003d4c + 3003d12: fec42703 lw a4,-20(s0) + 3003d16: 47c1 li a5,16 + 3003d18: 02f70a63 beq a4,a5,3003d4c + pin == GPIO_PIN_4 || pin == GPIO_PIN_5 || \ + 3003d1c: fec42703 lw a4,-20(s0) + 3003d20: 02000793 li a5,32 + 3003d24: 02f70463 beq a4,a5,3003d4c + 3003d28: fec42703 lw a4,-20(s0) + 3003d2c: 04000793 li a5,64 + 3003d30: 00f70e63 beq a4,a5,3003d4c + pin == GPIO_PIN_6 || pin == GPIO_PIN_7 || \ + 3003d34: fec42703 lw a4,-20(s0) + 3003d38: 08000793 li a5,128 + 3003d3c: 00f70863 beq a4,a5,3003d4c + 3003d40: fec42703 lw a4,-20(s0) + 3003d44: 0ff00793 li a5,255 + 3003d48: 00f71463 bne a4,a5,3003d50 + 3003d4c: 4785 li a5,1 + 3003d4e: a011 j 3003d52 + 3003d50: 4781 li a5,0 + 3003d52: 8b85 andi a5,a5,1 + 3003d54: 9f81 uxtb a5 + pin == GPIO_PIN_ALL); +} + 3003d56: 853e mv a0,a5 + 3003d58: 4472 lw s0,28(sp) + 3003d5a: 6105 addi sp,sp,32 + 3003d5c: 8082 ret + +03003d5e : + * @brief Check gpio interrupt mode parameter. + * @param mode Value of @ref GPIO_InterruptMode. + * @retval Bool. + */ +static inline bool IsGpioITMode(GPIO_InterruptMode mode) +{ + 3003d5e: 1101 addi sp,sp,-32 + 3003d60: ce22 sw s0,28(sp) + 3003d62: 1000 addi s0,sp,32 + 3003d64: fea42623 sw a0,-20(s0) + /* 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 || \ + 3003d68: fec42703 lw a4,-20(s0) + 3003d6c: 478d li a5,3 + 3003d6e: 02f70963 beq a4,a5,3003da0 + return (mode == GPIO_INT_TYPE_HIGH_LEVEL || \ + 3003d72: fec42703 lw a4,-20(s0) + 3003d76: 4789 li a5,2 + 3003d78: 02f70463 beq a4,a5,3003da0 + mode == GPIO_INT_TYPE_LOW_LEVEL || \ + 3003d7c: fec42703 lw a4,-20(s0) + 3003d80: 4785 li a5,1 + 3003d82: 00f70f63 beq a4,a5,3003da0 + mode == GPIO_INT_TYPE_RISE_EDGE || \ + 3003d86: fec42783 lw a5,-20(s0) + 3003d8a: cb99 beqz a5,3003da0 + mode == GPIO_INT_TYPE_FALL_EDGE || \ + 3003d8c: fec42703 lw a4,-20(s0) + 3003d90: 4791 li a5,4 + 3003d92: 00f70763 beq a4,a5,3003da0 + mode == GPIO_INT_TYPE_BOTH_EDGE || \ + 3003d96: fec42703 lw a4,-20(s0) + 3003d9a: 4795 li a5,5 + 3003d9c: 00f71463 bne a4,a5,3003da4 + 3003da0: 4785 li a5,1 + 3003da2: a011 j 3003da6 + 3003da4: 4781 li a5,0 + 3003da6: 8b85 andi a5,a5,1 + 3003da8: 9f81 uxtb a5 + mode == GPIO_INT_TYPE_NONE); +} + 3003daa: 853e mv a0,a5 + 3003dac: 4472 lw s0,28(sp) + 3003dae: 6105 addi sp,sp,32 + 3003db0: 8082 ret + +03003db2 : + * @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) +{ + 3003db2: 1101 addi sp,sp,-32 + 3003db4: ce06 sw ra,28(sp) + 3003db6: cc22 sw s0,24(sp) + 3003db8: 1000 addi s0,sp,32 + 3003dba: fea42623 sw a0,-20(s0) + 3003dbe: feb42423 sw a1,-24(s0) + 3003dc2: fec42223 sw a2,-28(s0) + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + 3003dc6: fec42703 lw a4,-20(s0) + 3003dca: 145007b7 lui a5,0x14500 + 3003dce: 04f70863 beq a4,a5,3003e1e + 3003dd2: fec42703 lw a4,-20(s0) + 3003dd6: 145017b7 lui a5,0x14501 + 3003dda: 04f70263 beq a4,a5,3003e1e + 3003dde: fec42703 lw a4,-20(s0) + 3003de2: 145027b7 lui a5,0x14502 + 3003de6: 02f70c63 beq a4,a5,3003e1e + 3003dea: fec42703 lw a4,-20(s0) + 3003dee: 145037b7 lui a5,0x14503 + 3003df2: 02f70663 beq a4,a5,3003e1e + 3003df6: fec42703 lw a4,-20(s0) + 3003dfa: 145047b7 lui a5,0x14504 + 3003dfe: 02f70063 beq a4,a5,3003e1e + 3003e02: fec42703 lw a4,-20(s0) + 3003e06: 145057b7 lui a5,0x14505 + 3003e0a: 00f70a63 beq a4,a5,3003e1e + 3003e0e: 18e00593 li a1,398 + 3003e12: 0300f7b7 lui a5,0x300f + 3003e16: 16478513 addi a0,a5,356 # 300f164 + 3003e1a: 2d51 jal ra,30044ae + 3003e1c: a001 j 3003e1c + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 3003e1e: fe842503 lw a0,-24(s0) + 3003e22: 3579 jal ra,3003cb0 + 3003e24: 87aa mv a5,a0 + 3003e26: 0017c793 xori a5,a5,1 + 3003e2a: 9f81 uxtb a5 + 3003e2c: cb89 beqz a5,3003e3e + 3003e2e: 18f00593 li a1,399 + 3003e32: 0300f7b7 lui a5,0x300f + 3003e36: 16478513 addi a0,a5,356 # 300f164 + 3003e3a: 2d95 jal ra,30044ae + 3003e3c: a089 j 3003e7e + GPIO_PARAM_CHECK_NO_RET(IsGpioValue(value)); + 3003e3e: fe442503 lw a0,-28(s0) + 3003e42: 3d19 jal ra,3003c58 + 3003e44: 87aa mv a5,a0 + 3003e46: 0017c793 xori a5,a5,1 + 3003e4a: 9f81 uxtb a5 + 3003e4c: cb89 beqz a5,3003e5e + 3003e4e: 19000593 li a1,400 + 3003e52: 0300f7b7 lui a5,0x300f + 3003e56: 16478513 addi a0,a5,356 # 300f164 + 3003e5a: 2d91 jal ra,30044ae + 3003e5c: a00d j 3003e7e + gpiox->GPIO_DATA[pins].reg = (value == GPIO_HIGH_LEVEL ? pins : BASE_CFG_UNSET); /* Set GPIO pin level */ + 3003e5e: fe442703 lw a4,-28(s0) + 3003e62: 4785 li a5,1 + 3003e64: 00f71563 bne a4,a5,3003e6e + 3003e68: fe842783 lw a5,-24(s0) + 3003e6c: a011 j 3003e70 + 3003e6e: 4781 li a5,0 + 3003e70: fec42683 lw a3,-20(s0) + 3003e74: fe842703 lw a4,-24(s0) + 3003e78: 070a slli a4,a4,0x2 + 3003e7a: 9736 add a4,a4,a3 + 3003e7c: c31c sw a5,0(a4) +} + 3003e7e: 40f2 lw ra,28(sp) + 3003e80: 4462 lw s0,24(sp) + 3003e82: 6105 addi sp,sp,32 + 3003e84: 8082 ret + +03003e86 : + * @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) +{ + 3003e86: 1101 addi sp,sp,-32 + 3003e88: ce06 sw ra,28(sp) + 3003e8a: cc22 sw s0,24(sp) + 3003e8c: 1000 addi s0,sp,32 + 3003e8e: fea42623 sw a0,-20(s0) + 3003e92: feb42423 sw a1,-24(s0) + 3003e96: fec42223 sw a2,-28(s0) + /* param check */ + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + 3003e9a: fec42703 lw a4,-20(s0) + 3003e9e: 145007b7 lui a5,0x14500 + 3003ea2: 04f70863 beq a4,a5,3003ef2 + 3003ea6: fec42703 lw a4,-20(s0) + 3003eaa: 145017b7 lui a5,0x14501 + 3003eae: 04f70263 beq a4,a5,3003ef2 + 3003eb2: fec42703 lw a4,-20(s0) + 3003eb6: 145027b7 lui a5,0x14502 + 3003eba: 02f70c63 beq a4,a5,3003ef2 + 3003ebe: fec42703 lw a4,-20(s0) + 3003ec2: 145037b7 lui a5,0x14503 + 3003ec6: 02f70663 beq a4,a5,3003ef2 + 3003eca: fec42703 lw a4,-20(s0) + 3003ece: 145047b7 lui a5,0x14504 + 3003ed2: 02f70063 beq a4,a5,3003ef2 + 3003ed6: fec42703 lw a4,-20(s0) + 3003eda: 145057b7 lui a5,0x14505 + 3003ede: 00f70a63 beq a4,a5,3003ef2 + 3003ee2: 1b700593 li a1,439 + 3003ee6: 0300f7b7 lui a5,0x300f + 3003eea: 16478513 addi a0,a5,356 # 300f164 + 3003eee: 23c1 jal ra,30044ae + 3003ef0: a001 j 3003ef0 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 3003ef2: fe842503 lw a0,-24(s0) + 3003ef6: 3b6d jal ra,3003cb0 + 3003ef8: 87aa mv a5,a0 + 3003efa: 0017c793 xori a5,a5,1 + 3003efe: 9f81 uxtb a5 + 3003f00: cb89 beqz a5,3003f12 + 3003f02: 1b800593 li a1,440 + 3003f06: 0300f7b7 lui a5,0x300f + 3003f0a: 16478513 addi a0,a5,356 # 300f164 + 3003f0e: 2345 jal ra,30044ae + 3003f10: a095 j 3003f74 + GPIO_PARAM_CHECK_NO_RET(IsGpioDirection(dir)); + 3003f12: fe442503 lw a0,-28(s0) + 3003f16: 33bd jal ra,3003c84 + 3003f18: 87aa mv a5,a0 + 3003f1a: 0017c793 xori a5,a5,1 + 3003f1e: 9f81 uxtb a5 + 3003f20: cb89 beqz a5,3003f32 + 3003f22: 1b900593 li a1,441 + 3003f26: 0300f7b7 lui a5,0x300f + 3003f2a: 16478513 addi a0,a5,356 # 300f164 + 3003f2e: 2341 jal ra,30044ae + 3003f30: a091 j 3003f74 + if (dir == GPIO_INPUT_MODE) { /* Set GPIO pin direction */ + 3003f32: fe442783 lw a5,-28(s0) + 3003f36: ef99 bnez a5,3003f54 + gpiox->GPIO_DIR.reg &= ~pins; + 3003f38: fec42783 lw a5,-20(s0) + 3003f3c: 4007a703 lw a4,1024(a5) + 3003f40: fe842783 lw a5,-24(s0) + 3003f44: fff7c793 not a5,a5 + 3003f48: 8f7d and a4,a4,a5 + 3003f4a: fec42783 lw a5,-20(s0) + 3003f4e: 40e7a023 sw a4,1024(a5) + 3003f52: a00d j 3003f74 + } else if (dir == GPIO_OUTPUT_MODE) { + 3003f54: fe442703 lw a4,-28(s0) + 3003f58: 4785 li a5,1 + 3003f5a: 00f71d63 bne a4,a5,3003f74 + gpiox->GPIO_DIR.reg |= pins; + 3003f5e: fec42783 lw a5,-20(s0) + 3003f62: 4007a703 lw a4,1024(a5) + 3003f66: fe842783 lw a5,-24(s0) + 3003f6a: 8f5d or a4,a4,a5 + 3003f6c: fec42783 lw a5,-20(s0) + 3003f70: 40e7a023 sw a4,1024(a5) + } +} + 3003f74: 40f2 lw ra,28(sp) + 3003f76: 4462 lw s0,24(sp) + 3003f78: 6105 addi sp,sp,32 + 3003f7a: 8082 ret + +03003f7c : + * @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) +{ + 3003f7c: 1101 addi sp,sp,-32 + 3003f7e: ce06 sw ra,28(sp) + 3003f80: cc22 sw s0,24(sp) + 3003f82: 1000 addi s0,sp,32 + 3003f84: fea42623 sw a0,-20(s0) + 3003f88: feb42423 sw a1,-24(s0) + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + 3003f8c: fec42703 lw a4,-20(s0) + 3003f90: 145007b7 lui a5,0x14500 + 3003f94: 04f70863 beq a4,a5,3003fe4 + 3003f98: fec42703 lw a4,-20(s0) + 3003f9c: 145017b7 lui a5,0x14501 + 3003fa0: 04f70263 beq a4,a5,3003fe4 + 3003fa4: fec42703 lw a4,-20(s0) + 3003fa8: 145027b7 lui a5,0x14502 + 3003fac: 02f70c63 beq a4,a5,3003fe4 + 3003fb0: fec42703 lw a4,-20(s0) + 3003fb4: 145037b7 lui a5,0x14503 + 3003fb8: 02f70663 beq a4,a5,3003fe4 + 3003fbc: fec42703 lw a4,-20(s0) + 3003fc0: 145047b7 lui a5,0x14504 + 3003fc4: 02f70063 beq a4,a5,3003fe4 + 3003fc8: fec42703 lw a4,-20(s0) + 3003fcc: 145057b7 lui a5,0x14505 + 3003fd0: 00f70a63 beq a4,a5,3003fe4 + 3003fd4: 25c00593 li a1,604 + 3003fd8: 0300f7b7 lui a5,0x300f + 3003fdc: 16478513 addi a0,a5,356 # 300f164 + 3003fe0: 21f9 jal ra,30044ae + 3003fe2: a001 j 3003fe2 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 3003fe4: fe842503 lw a0,-24(s0) + 3003fe8: 31e1 jal ra,3003cb0 + 3003fea: 87aa mv a5,a0 + 3003fec: 0017c793 xori a5,a5,1 + 3003ff0: 9f81 uxtb a5 + 3003ff2: cb89 beqz a5,3004004 + 3003ff4: 25d00593 li a1,605 + 3003ff8: 0300f7b7 lui a5,0x300f + 3003ffc: 16478513 addi a0,a5,356 # 300f164 + 3004000: 217d jal ra,30044ae + 3004002: a821 j 300401a + gpiox->GPIO_IC.reg |= pins; + 3004004: fec42783 lw a5,-20(s0) + 3004008: 41c7a703 lw a4,1052(a5) + 300400c: fe842783 lw a5,-24(s0) + 3004010: 8f5d or a4,a4,a5 + 3004012: fec42783 lw a5,-20(s0) + 3004016: 40e7ae23 sw a4,1052(a5) +} + 300401a: 40f2 lw ra,28(sp) + 300401c: 4462 lw s0,24(sp) + 300401e: 6105 addi sp,sp,32 + 3004020: 8082 ret + +03004022 : + * @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) +{ + 3004022: 1101 addi sp,sp,-32 + 3004024: ce06 sw ra,28(sp) + 3004026: cc22 sw s0,24(sp) + 3004028: 1000 addi s0,sp,32 + 300402a: fea42623 sw a0,-20(s0) + 300402e: feb42423 sw a1,-24(s0) + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + 3004032: fec42703 lw a4,-20(s0) + 3004036: 145007b7 lui a5,0x14500 + 300403a: 04f70863 beq a4,a5,300408a + 300403e: fec42703 lw a4,-20(s0) + 3004042: 145017b7 lui a5,0x14501 + 3004046: 04f70263 beq a4,a5,300408a + 300404a: fec42703 lw a4,-20(s0) + 300404e: 145027b7 lui a5,0x14502 + 3004052: 02f70c63 beq a4,a5,300408a + 3004056: fec42703 lw a4,-20(s0) + 300405a: 145037b7 lui a5,0x14503 + 300405e: 02f70663 beq a4,a5,300408a + 3004062: fec42703 lw a4,-20(s0) + 3004066: 145047b7 lui a5,0x14504 + 300406a: 02f70063 beq a4,a5,300408a + 300406e: fec42703 lw a4,-20(s0) + 3004072: 145057b7 lui a5,0x14505 + 3004076: 00f70a63 beq a4,a5,300408a + 300407a: 26900593 li a1,617 + 300407e: 0300f7b7 lui a5,0x300f + 3004082: 16478513 addi a0,a5,356 # 300f164 + 3004086: 2125 jal ra,30044ae + 3004088: a001 j 3004088 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 300408a: fe842503 lw a0,-24(s0) + 300408e: 310d jal ra,3003cb0 + 3004090: 87aa mv a5,a0 + 3004092: 0017c793 xori a5,a5,1 + 3004096: 9f81 uxtb a5 + 3004098: cb89 beqz a5,30040aa + 300409a: 26a00593 li a1,618 + 300409e: 0300f7b7 lui a5,0x300f + 30040a2: 16478513 addi a0,a5,356 # 300f164 + 30040a6: 2121 jal ra,30044ae + 30040a8: a00d j 30040ca + /* must clear interrupt first, prevents interrupts triggered by previous output mode. */ + DCL_GPIO_ClearIrq(gpiox, pins); + 30040aa: fe842583 lw a1,-24(s0) + 30040ae: fec42503 lw a0,-20(s0) + 30040b2: 35e9 jal ra,3003f7c + gpiox->GPIO_IE.reg |= pins; + 30040b4: fec42783 lw a5,-20(s0) + 30040b8: 4107a703 lw a4,1040(a5) + 30040bc: fe842783 lw a5,-24(s0) + 30040c0: 8f5d or a4,a4,a5 + 30040c2: fec42783 lw a5,-20(s0) + 30040c6: 40e7a823 sw a4,1040(a5) +} + 30040ca: 40f2 lw ra,28(sp) + 30040cc: 4462 lw s0,24(sp) + 30040ce: 6105 addi sp,sp,32 + 30040d0: 8082 ret + +030040d2 : + * @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) +{ + 30040d2: 1101 addi sp,sp,-32 + 30040d4: ce06 sw ra,28(sp) + 30040d6: cc22 sw s0,24(sp) + 30040d8: 1000 addi s0,sp,32 + 30040da: fea42623 sw a0,-20(s0) + 30040de: feb42423 sw a1,-24(s0) + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + 30040e2: fec42703 lw a4,-20(s0) + 30040e6: 145007b7 lui a5,0x14500 + 30040ea: 04f70863 beq a4,a5,300413a + 30040ee: fec42703 lw a4,-20(s0) + 30040f2: 145017b7 lui a5,0x14501 + 30040f6: 04f70263 beq a4,a5,300413a + 30040fa: fec42703 lw a4,-20(s0) + 30040fe: 145027b7 lui a5,0x14502 + 3004102: 02f70c63 beq a4,a5,300413a + 3004106: fec42703 lw a4,-20(s0) + 300410a: 145037b7 lui a5,0x14503 + 300410e: 02f70663 beq a4,a5,300413a + 3004112: fec42703 lw a4,-20(s0) + 3004116: 145047b7 lui a5,0x14504 + 300411a: 02f70063 beq a4,a5,300413a + 300411e: fec42703 lw a4,-20(s0) + 3004122: 145057b7 lui a5,0x14505 + 3004126: 00f70a63 beq a4,a5,300413a + 300412a: 27800593 li a1,632 + 300412e: 0300f7b7 lui a5,0x300f + 3004132: 16478513 addi a0,a5,356 # 300f164 + 3004136: 2ea5 jal ra,30044ae + 3004138: a001 j 3004138 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 300413a: fe842503 lw a0,-24(s0) + 300413e: 3e8d jal ra,3003cb0 + 3004140: 87aa mv a5,a0 + 3004142: 0017c793 xori a5,a5,1 + 3004146: 9f81 uxtb a5 + 3004148: cb89 beqz a5,300415a + 300414a: 27900593 li a1,633 + 300414e: 0300f7b7 lui a5,0x300f + 3004152: 16478513 addi a0,a5,356 # 300f164 + 3004156: 2ea1 jal ra,30044ae + 3004158: a831 j 3004174 + gpiox->GPIO_IE.reg &= ~pins; + 300415a: fec42783 lw a5,-20(s0) + 300415e: 4107a703 lw a4,1040(a5) + 3004162: fe842783 lw a5,-24(s0) + 3004166: fff7c793 not a5,a5 + 300416a: 8f7d and a4,a4,a5 + 300416c: fec42783 lw a5,-20(s0) + 3004170: 40e7a823 sw a4,1040(a5) +} + 3004174: 40f2 lw ra,28(sp) + 3004176: 4462 lw s0,24(sp) + 3004178: 6105 addi sp,sp,32 + 300417a: 8082 ret + +0300417c : + * @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) +{ + 300417c: 1101 addi sp,sp,-32 + 300417e: ce06 sw ra,28(sp) + 3004180: cc22 sw s0,24(sp) + 3004182: 1000 addi s0,sp,32 + 3004184: fea42623 sw a0,-20(s0) + GPIO_ASSERT_PARAM(IsGPIOInstance(gpiox)); + 3004188: fec42703 lw a4,-20(s0) + 300418c: 145007b7 lui a5,0x14500 + 3004190: 04f70863 beq a4,a5,30041e0 + 3004194: fec42703 lw a4,-20(s0) + 3004198: 145017b7 lui a5,0x14501 + 300419c: 04f70263 beq a4,a5,30041e0 + 30041a0: fec42703 lw a4,-20(s0) + 30041a4: 145027b7 lui a5,0x14502 + 30041a8: 02f70c63 beq a4,a5,30041e0 + 30041ac: fec42703 lw a4,-20(s0) + 30041b0: 145037b7 lui a5,0x14503 + 30041b4: 02f70663 beq a4,a5,30041e0 + 30041b8: fec42703 lw a4,-20(s0) + 30041bc: 145047b7 lui a5,0x14504 + 30041c0: 02f70063 beq a4,a5,30041e0 + 30041c4: fec42703 lw a4,-20(s0) + 30041c8: 145057b7 lui a5,0x14505 + 30041cc: 00f70a63 beq a4,a5,30041e0 + 30041d0: 29a00593 li a1,666 + 30041d4: 0300f7b7 lui a5,0x300f + 30041d8: 16478513 addi a0,a5,356 # 300f164 + 30041dc: 2cc9 jal ra,30044ae + 30041de: a001 j 30041de + return gpiox->GPIO_MIS.reg & GPIO_PIN_MASK; + 30041e0: fec42783 lw a5,-20(s0) + 30041e4: 4187a783 lw a5,1048(a5) + 30041e8: 0ff7f793 andi a5,a5,255 +} + 30041ec: 853e mv a0,a5 + 30041ee: 40f2 lw ra,28(sp) + 30041f0: 4462 lw s0,24(sp) + 30041f2: 6105 addi sp,sp,32 + 30041f4: 8082 ret + +030041f6 : + * @brief Initializing GPIO register values. + * @param handle Value of @ref GPIO_Handle. + * @retval None. + */ +void HAL_GPIO_Init(GPIO_Handle *handle) +{ + 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) + GPIO_ASSERT_PARAM(handle != NULL); + 3004202: fdc42783 lw a5,-36(s0) + 3004206: eb89 bnez a5,3004218 + 3004208: 02b00593 li a1,43 + 300420c: 0300f7b7 lui a5,0x300f + 3004210: 18478513 addi a0,a5,388 # 300f184 + 3004214: 2c69 jal ra,30044ae + 3004216: a001 j 3004216 + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 3004218: fdc42783 lw a5,-36(s0) + 300421c: 4398 lw a4,0(a5) + 300421e: 145007b7 lui a5,0x14500 + 3004222: 04f70d63 beq a4,a5,300427c + 3004226: fdc42783 lw a5,-36(s0) + 300422a: 4398 lw a4,0(a5) + 300422c: 145017b7 lui a5,0x14501 + 3004230: 04f70663 beq a4,a5,300427c + 3004234: fdc42783 lw a5,-36(s0) + 3004238: 4398 lw a4,0(a5) + 300423a: 145027b7 lui a5,0x14502 + 300423e: 02f70f63 beq a4,a5,300427c + 3004242: fdc42783 lw a5,-36(s0) + 3004246: 4398 lw a4,0(a5) + 3004248: 145037b7 lui a5,0x14503 + 300424c: 02f70863 beq a4,a5,300427c + 3004250: fdc42783 lw a5,-36(s0) + 3004254: 4398 lw a4,0(a5) + 3004256: 145047b7 lui a5,0x14504 + 300425a: 02f70163 beq a4,a5,300427c + 300425e: fdc42783 lw a5,-36(s0) + 3004262: 4398 lw a4,0(a5) + 3004264: 145057b7 lui a5,0x14505 + 3004268: 00f70a63 beq a4,a5,300427c + 300426c: 02c00593 li a1,44 + 3004270: 0300f7b7 lui a5,0x300f + 3004274: 18478513 addi a0,a5,388 # 300f184 + 3004278: 2c1d jal ra,30044ae + 300427a: a001 j 300427a + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(handle->pins)); + 300427c: fdc42783 lw a5,-36(s0) + 3004280: 43dc lw a5,4(a5) + 3004282: 853e mv a0,a5 + 3004284: 3435 jal ra,3003cb0 + 3004286: 87aa mv a5,a0 + 3004288: 0017c793 xori a5,a5,1 + 300428c: 9f81 uxtb a5 + 300428e: cb89 beqz a5,30042a0 + 3004290: 02d00593 li a1,45 + 3004294: 0300f7b7 lui a5,0x300f + 3004298: 18478513 addi a0,a5,388 # 300f184 + 300429c: 2c09 jal ra,30044ae + 300429e: a81d j 30042d4 + + /* Register GPIO callback ID */ + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + 30042a0: fe042623 sw zero,-20(s0) + 30042a4: a01d j 30042ca + handle->userCallBack.GPIO_CallbackFuncs[i].pin = (1 << i); + 30042a6: 4705 li a4,1 + 30042a8: fec42783 lw a5,-20(s0) + 30042ac: 00f717b3 sll a5,a4,a5 + 30042b0: 86be mv a3,a5 + 30042b2: fdc42703 lw a4,-36(s0) + 30042b6: fec42783 lw a5,-20(s0) + 30042ba: 078e slli a5,a5,0x3 + 30042bc: 97ba add a5,a5,a4 + 30042be: c794 sw a3,8(a5) + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + 30042c0: fec42783 lw a5,-20(s0) + 30042c4: 0785 addi a5,a5,1 + 30042c6: fef42623 sw a5,-20(s0) + 30042ca: fec42703 lw a4,-20(s0) + 30042ce: 479d li a5,7 + 30042d0: fce7fbe3 bgeu a5,a4,30042a6 + } +} + 30042d4: 50b2 lw ra,44(sp) + 30042d6: 5422 lw s0,40(sp) + 30042d8: 6145 addi sp,sp,48 + 30042da: 8082 ret + +030042dc : + * @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) +{ + 30042dc: 1101 addi sp,sp,-32 + 30042de: ce06 sw ra,28(sp) + 30042e0: cc22 sw s0,24(sp) + 30042e2: 1000 addi s0,sp,32 + 30042e4: fea42623 sw a0,-20(s0) + 30042e8: feb42423 sw a1,-24(s0) + 30042ec: fec42223 sw a2,-28(s0) + GPIO_ASSERT_PARAM(handle != NULL); + 30042f0: fec42783 lw a5,-20(s0) + 30042f4: eb89 bnez a5,3004306 + 30042f6: 04f00593 li a1,79 + 30042fa: 0300f7b7 lui a5,0x300f + 30042fe: 18478513 addi a0,a5,388 # 300f184 + 3004302: 2275 jal ra,30044ae + 3004304: a001 j 3004304 + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 3004306: fec42783 lw a5,-20(s0) + 300430a: 4398 lw a4,0(a5) + 300430c: 145007b7 lui a5,0x14500 + 3004310: 04f70d63 beq a4,a5,300436a + 3004314: fec42783 lw a5,-20(s0) + 3004318: 4398 lw a4,0(a5) + 300431a: 145017b7 lui a5,0x14501 + 300431e: 04f70663 beq a4,a5,300436a + 3004322: fec42783 lw a5,-20(s0) + 3004326: 4398 lw a4,0(a5) + 3004328: 145027b7 lui a5,0x14502 + 300432c: 02f70f63 beq a4,a5,300436a + 3004330: fec42783 lw a5,-20(s0) + 3004334: 4398 lw a4,0(a5) + 3004336: 145037b7 lui a5,0x14503 + 300433a: 02f70863 beq a4,a5,300436a + 300433e: fec42783 lw a5,-20(s0) + 3004342: 4398 lw a4,0(a5) + 3004344: 145047b7 lui a5,0x14504 + 3004348: 02f70163 beq a4,a5,300436a + 300434c: fec42783 lw a5,-20(s0) + 3004350: 4398 lw a4,0(a5) + 3004352: 145057b7 lui a5,0x14505 + 3004356: 00f70a63 beq a4,a5,300436a + 300435a: 05000593 li a1,80 + 300435e: 0300f7b7 lui a5,0x300f + 3004362: 18478513 addi a0,a5,388 # 300f184 + 3004366: 22a1 jal ra,30044ae + 3004368: a001 j 3004368 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 300436a: fe842503 lw a0,-24(s0) + 300436e: 3289 jal ra,3003cb0 + 3004370: 87aa mv a5,a0 + 3004372: 0017c793 xori a5,a5,1 + 3004376: 9f81 uxtb a5 + 3004378: cb89 beqz a5,300438a + 300437a: 05100593 li a1,81 + 300437e: 0300f7b7 lui a5,0x300f + 3004382: 18478513 addi a0,a5,388 # 300f184 + 3004386: 2225 jal ra,30044ae + 3004388: a815 j 30043bc + GPIO_PARAM_CHECK_NO_RET(IsGpioDirection(dir)); + 300438a: fe442503 lw a0,-28(s0) + 300438e: 38dd jal ra,3003c84 + 3004390: 87aa mv a5,a0 + 3004392: 0017c793 xori a5,a5,1 + 3004396: 9f81 uxtb a5 + 3004398: cb89 beqz a5,30043aa + 300439a: 05200593 li a1,82 + 300439e: 0300f7b7 lui a5,0x300f + 30043a2: 18478513 addi a0,a5,388 # 300f184 + 30043a6: 2221 jal ra,30044ae + 30043a8: a811 j 30043bc + DCL_GPIO_SetDirection(handle->baseAddress, pins, dir); + 30043aa: fec42783 lw a5,-20(s0) + 30043ae: 439c lw a5,0(a5) + 30043b0: fe442603 lw a2,-28(s0) + 30043b4: fe842583 lw a1,-24(s0) + 30043b8: 853e mv a0,a5 + 30043ba: 34f1 jal ra,3003e86 +} + 30043bc: 40f2 lw ra,28(sp) + 30043be: 4462 lw s0,24(sp) + 30043c0: 6105 addi sp,sp,32 + 30043c2: 8082 ret + +030043c4 : + * @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) +{ + 30043c4: 1101 addi sp,sp,-32 + 30043c6: ce06 sw ra,28(sp) + 30043c8: cc22 sw s0,24(sp) + 30043ca: 1000 addi s0,sp,32 + 30043cc: fea42623 sw a0,-20(s0) + 30043d0: feb42423 sw a1,-24(s0) + 30043d4: fec42223 sw a2,-28(s0) + GPIO_ASSERT_PARAM(handle != NULL); + 30043d8: fec42783 lw a5,-20(s0) + 30043dc: eb89 bnez a5,30043ee + 30043de: 05f00593 li a1,95 + 30043e2: 0300f7b7 lui a5,0x300f + 30043e6: 18478513 addi a0,a5,388 # 300f184 + 30043ea: 20d1 jal ra,30044ae + 30043ec: a001 j 30043ec + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 30043ee: fec42783 lw a5,-20(s0) + 30043f2: 4398 lw a4,0(a5) + 30043f4: 145007b7 lui a5,0x14500 + 30043f8: 04f70d63 beq a4,a5,3004452 + 30043fc: fec42783 lw a5,-20(s0) + 3004400: 4398 lw a4,0(a5) + 3004402: 145017b7 lui a5,0x14501 + 3004406: 04f70663 beq a4,a5,3004452 + 300440a: fec42783 lw a5,-20(s0) + 300440e: 4398 lw a4,0(a5) + 3004410: 145027b7 lui a5,0x14502 + 3004414: 02f70f63 beq a4,a5,3004452 + 3004418: fec42783 lw a5,-20(s0) + 300441c: 4398 lw a4,0(a5) + 300441e: 145037b7 lui a5,0x14503 + 3004422: 02f70863 beq a4,a5,3004452 + 3004426: fec42783 lw a5,-20(s0) + 300442a: 4398 lw a4,0(a5) + 300442c: 145047b7 lui a5,0x14504 + 3004430: 02f70163 beq a4,a5,3004452 + 3004434: fec42783 lw a5,-20(s0) + 3004438: 4398 lw a4,0(a5) + 300443a: 145057b7 lui a5,0x14505 + 300443e: 00f70a63 beq a4,a5,3004452 + 3004442: 06000593 li a1,96 + 3004446: 0300f7b7 lui a5,0x300f + 300444a: 18478513 addi a0,a5,388 # 300f184 + 300444e: 2085 jal ra,30044ae + 3004450: a001 j 3004450 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pins)); + 3004452: fe842503 lw a0,-24(s0) + 3004456: 38a9 jal ra,3003cb0 + 3004458: 87aa mv a5,a0 + 300445a: 0017c793 xori a5,a5,1 + 300445e: 9f81 uxtb a5 + 3004460: cb89 beqz a5,3004472 + 3004462: 06100593 li a1,97 + 3004466: 0300f7b7 lui a5,0x300f + 300446a: 18478513 addi a0,a5,388 # 300f184 + 300446e: 2081 jal ra,30044ae + 3004470: a81d j 30044a6 + GPIO_PARAM_CHECK_NO_RET(IsGpioValue(value)); + 3004472: fe442503 lw a0,-28(s0) + 3004476: fe2ff0ef jal ra,3003c58 + 300447a: 87aa mv a5,a0 + 300447c: 0017c793 xori a5,a5,1 + 3004480: 9f81 uxtb a5 + 3004482: cb89 beqz a5,3004494 + 3004484: 06200593 li a1,98 + 3004488: 0300f7b7 lui a5,0x300f + 300448c: 18478513 addi a0,a5,388 # 300f184 + 3004490: 2839 jal ra,30044ae + 3004492: a811 j 30044a6 + DCL_GPIO_SetValue(handle->baseAddress, pins, value); + 3004494: fec42783 lw a5,-20(s0) + 3004498: 439c lw a5,0(a5) + 300449a: fe442603 lw a2,-28(s0) + 300449e: fe842583 lw a1,-24(s0) + 30044a2: 853e mv a0,a5 + 30044a4: 3239 jal ra,3003db2 +} + 30044a6: 40f2 lw ra,28(sp) + 30044a8: 4462 lw s0,24(sp) + 30044aa: 6105 addi sp,sp,32 + 30044ac: 8082 ret + +030044ae : + 30044ae: d43fc06f j 30011f0 + +030044b2 : + * @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) +{ + 30044b2: 1101 addi sp,sp,-32 + 30044b4: ce06 sw ra,28(sp) + 30044b6: cc22 sw s0,24(sp) + 30044b8: 1000 addi s0,sp,32 + 30044ba: fea42623 sw a0,-20(s0) + 30044be: feb42423 sw a1,-24(s0) + GPIO_ASSERT_PARAM(handle != NULL); + 30044c2: fec42783 lw a5,-20(s0) + 30044c6: eb89 bnez a5,30044d8 + 30044c8: 06e00593 li a1,110 + 30044cc: 0300f7b7 lui a5,0x300f + 30044d0: 18478513 addi a0,a5,388 # 300f184 + 30044d4: 3fe9 jal ra,30044ae + 30044d6: a001 j 30044d6 + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 30044d8: fec42783 lw a5,-20(s0) + 30044dc: 4398 lw a4,0(a5) + 30044de: 145007b7 lui a5,0x14500 + 30044e2: 04f70d63 beq a4,a5,300453c + 30044e6: fec42783 lw a5,-20(s0) + 30044ea: 4398 lw a4,0(a5) + 30044ec: 145017b7 lui a5,0x14501 + 30044f0: 04f70663 beq a4,a5,300453c + 30044f4: fec42783 lw a5,-20(s0) + 30044f8: 4398 lw a4,0(a5) + 30044fa: 145027b7 lui a5,0x14502 + 30044fe: 02f70f63 beq a4,a5,300453c + 3004502: fec42783 lw a5,-20(s0) + 3004506: 4398 lw a4,0(a5) + 3004508: 145037b7 lui a5,0x14503 + 300450c: 02f70863 beq a4,a5,300453c + 3004510: fec42783 lw a5,-20(s0) + 3004514: 4398 lw a4,0(a5) + 3004516: 145047b7 lui a5,0x14504 + 300451a: 02f70163 beq a4,a5,300453c + 300451e: fec42783 lw a5,-20(s0) + 3004522: 4398 lw a4,0(a5) + 3004524: 145057b7 lui a5,0x14505 + 3004528: 00f70a63 beq a4,a5,300453c + 300452c: 06f00593 li a1,111 + 3004530: 0300f7b7 lui a5,0x300f + 3004534: 18478513 addi a0,a5,388 # 300f184 + 3004538: 3f9d jal ra,30044ae + 300453a: a001 j 300453a + GPIO_ASSERT_PARAM(IsGpioPin(pin)); + 300453c: fe842503 lw a0,-24(s0) + 3004540: fa0ff0ef jal ra,3003ce0 + 3004544: 87aa mv a5,a0 + 3004546: 0017c793 xori a5,a5,1 + 300454a: 9f81 uxtb a5 + 300454c: cb89 beqz a5,300455e + 300454e: 07000593 li a1,112 + 3004552: 0300f7b7 lui a5,0x300f + 3004556: 18478513 addi a0,a5,388 # 300f184 + 300455a: 3f91 jal ra,30044ae + 300455c: a001 j 300455c + return (handle->baseAddress->GPIO_DATA[GPIO_PIN_MASK].reg & pin) == BASE_CFG_UNSET ? \ + 300455e: fec42783 lw a5,-20(s0) + 3004562: 439c lw a5,0(a5) + 3004564: 3fc7a703 lw a4,1020(a5) + 3004568: fe842783 lw a5,-24(s0) + 300456c: 8ff9 and a5,a5,a4 + GPIO_LOW_LEVEL : GPIO_HIGH_LEVEL; + 300456e: 00f037b3 snez a5,a5 + 3004572: 9f81 uxtb a5 +} + 3004574: 853e mv a0,a5 + 3004576: 40f2 lw ra,28(sp) + 3004578: 4462 lw s0,24(sp) + 300457a: 6105 addi sp,sp,32 + 300457c: 8082 ret + +0300457e : + * @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) +{ + 300457e: 1101 addi sp,sp,-32 + 3004580: ce22 sw s0,28(sp) + 3004582: 1000 addi s0,sp,32 + 3004584: fea42623 sw a0,-20(s0) + 3004588: feb42423 sw a1,-24(s0) + 300458c: fec42223 sw a2,-28(s0) + handle->baseAddress->GPIO_IBE.reg &= ~pins; /* Disable edge detection */ + 3004590: fec42783 lw a5,-20(s0) + 3004594: 439c lw a5,0(a5) + 3004596: 4087a683 lw a3,1032(a5) + 300459a: fe842783 lw a5,-24(s0) + 300459e: fff7c713 not a4,a5 + 30045a2: fec42783 lw a5,-20(s0) + 30045a6: 439c lw a5,0(a5) + 30045a8: 8f75 and a4,a4,a3 + 30045aa: 40e7a423 sw a4,1032(a5) + handle->baseAddress->GPIO_IS.reg |= pins; /* Enable level detection */ + 30045ae: fec42783 lw a5,-20(s0) + 30045b2: 439c lw a5,0(a5) + 30045b4: 4047a683 lw a3,1028(a5) + 30045b8: fec42783 lw a5,-20(s0) + 30045bc: 439c lw a5,0(a5) + 30045be: fe842703 lw a4,-24(s0) + 30045c2: 8f55 or a4,a4,a3 + 30045c4: 40e7a223 sw a4,1028(a5) + if (mode == GPIO_INT_TYPE_HIGH_LEVEL) { + 30045c8: fe442703 lw a4,-28(s0) + 30045cc: 478d li a5,3 + 30045ce: 02f71063 bne a4,a5,30045ee + handle->baseAddress->GPIO_IEV.reg |= pins; + 30045d2: fec42783 lw a5,-20(s0) + 30045d6: 439c lw a5,0(a5) + 30045d8: 40c7a683 lw a3,1036(a5) + 30045dc: fec42783 lw a5,-20(s0) + 30045e0: 439c lw a5,0(a5) + 30045e2: fe842703 lw a4,-24(s0) + 30045e6: 8f55 or a4,a4,a3 + 30045e8: 40e7a623 sw a4,1036(a5) + } else { + handle->baseAddress->GPIO_IEV.reg &= ~pins; + } +} + 30045ec: a005 j 300460c + handle->baseAddress->GPIO_IEV.reg &= ~pins; + 30045ee: fec42783 lw a5,-20(s0) + 30045f2: 439c lw a5,0(a5) + 30045f4: 40c7a683 lw a3,1036(a5) + 30045f8: fe842783 lw a5,-24(s0) + 30045fc: fff7c713 not a4,a5 + 3004600: fec42783 lw a5,-20(s0) + 3004604: 439c lw a5,0(a5) + 3004606: 8f75 and a4,a4,a3 + 3004608: 40e7a623 sw a4,1036(a5) +} + 300460c: 0001 nop + 300460e: 4472 lw s0,28(sp) + 3004610: 6105 addi sp,sp,32 + 3004612: 8082 ret + +03004614 : + * @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) +{ + 3004614: 1101 addi sp,sp,-32 + 3004616: ce22 sw s0,28(sp) + 3004618: 1000 addi s0,sp,32 + 300461a: fea42623 sw a0,-20(s0) + 300461e: feb42423 sw a1,-24(s0) + 3004622: fec42223 sw a2,-28(s0) + handle->baseAddress->GPIO_IS.reg &= ~pins; /* Disable level detection. */ + 3004626: fec42783 lw a5,-20(s0) + 300462a: 439c lw a5,0(a5) + 300462c: 4047a683 lw a3,1028(a5) + 3004630: fe842783 lw a5,-24(s0) + 3004634: fff7c713 not a4,a5 + 3004638: fec42783 lw a5,-20(s0) + 300463c: 439c lw a5,0(a5) + 300463e: 8f75 and a4,a4,a3 + 3004640: 40e7a223 sw a4,1028(a5) + handle->baseAddress->GPIO_IBE.reg &= ~pins; /* Clear detection on both edges. */ + 3004644: fec42783 lw a5,-20(s0) + 3004648: 439c lw a5,0(a5) + 300464a: 4087a683 lw a3,1032(a5) + 300464e: fe842783 lw a5,-24(s0) + 3004652: fff7c713 not a4,a5 + 3004656: fec42783 lw a5,-20(s0) + 300465a: 439c lw a5,0(a5) + 300465c: 8f75 and a4,a4,a3 + 300465e: 40e7a423 sw a4,1032(a5) + if (mode == GPIO_INT_TYPE_RISE_EDGE) { + 3004662: fe442703 lw a4,-28(s0) + 3004666: 4785 li a5,1 + 3004668: 02f71063 bne a4,a5,3004688 + handle->baseAddress->GPIO_IEV.reg |= pins; + 300466c: fec42783 lw a5,-20(s0) + 3004670: 439c lw a5,0(a5) + 3004672: 40c7a683 lw a3,1036(a5) + 3004676: fec42783 lw a5,-20(s0) + 300467a: 439c lw a5,0(a5) + 300467c: fe842703 lw a4,-24(s0) + 3004680: 8f55 or a4,a4,a3 + 3004682: 40e7a623 sw a4,1036(a5) + } else { + handle->baseAddress->GPIO_IEV.reg &= ~pins; + } +} + 3004686: a005 j 30046a6 + handle->baseAddress->GPIO_IEV.reg &= ~pins; + 3004688: fec42783 lw a5,-20(s0) + 300468c: 439c lw a5,0(a5) + 300468e: 40c7a683 lw a3,1036(a5) + 3004692: fe842783 lw a5,-24(s0) + 3004696: fff7c713 not a4,a5 + 300469a: fec42783 lw a5,-20(s0) + 300469e: 439c lw a5,0(a5) + 30046a0: 8f75 and a4,a4,a3 + 30046a2: 40e7a623 sw a4,1036(a5) +} + 30046a6: 0001 nop + 30046a8: 4472 lw s0,28(sp) + 30046aa: 6105 addi sp,sp,32 + 30046ac: 8082 ret + +030046ae : + * @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) +{ + 30046ae: 1101 addi sp,sp,-32 + 30046b0: ce06 sw ra,28(sp) + 30046b2: cc22 sw s0,24(sp) + 30046b4: 1000 addi s0,sp,32 + 30046b6: fea42623 sw a0,-20(s0) + 30046ba: feb42423 sw a1,-24(s0) + 30046be: fec42223 sw a2,-28(s0) + GPIO_ASSERT_PARAM(handle != NULL); + 30046c2: fec42783 lw a5,-20(s0) + 30046c6: eb89 bnez a5,30046d8 + 30046c8: 0ef00593 li a1,239 + 30046cc: 0300f7b7 lui a5,0x300f + 30046d0: 18478513 addi a0,a5,388 # 300f184 + 30046d4: 3be9 jal ra,30044ae + 30046d6: a001 j 30046d6 + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 30046d8: fec42783 lw a5,-20(s0) + 30046dc: 4398 lw a4,0(a5) + 30046de: 145007b7 lui a5,0x14500 + 30046e2: 04f70d63 beq a4,a5,300473c + 30046e6: fec42783 lw a5,-20(s0) + 30046ea: 4398 lw a4,0(a5) + 30046ec: 145017b7 lui a5,0x14501 + 30046f0: 04f70663 beq a4,a5,300473c + 30046f4: fec42783 lw a5,-20(s0) + 30046f8: 4398 lw a4,0(a5) + 30046fa: 145027b7 lui a5,0x14502 + 30046fe: 02f70f63 beq a4,a5,300473c + 3004702: fec42783 lw a5,-20(s0) + 3004706: 4398 lw a4,0(a5) + 3004708: 145037b7 lui a5,0x14503 + 300470c: 02f70863 beq a4,a5,300473c + 3004710: fec42783 lw a5,-20(s0) + 3004714: 4398 lw a4,0(a5) + 3004716: 145047b7 lui a5,0x14504 + 300471a: 02f70163 beq a4,a5,300473c + 300471e: fec42783 lw a5,-20(s0) + 3004722: 4398 lw a4,0(a5) + 3004724: 145057b7 lui a5,0x14505 + 3004728: 00f70a63 beq a4,a5,300473c + 300472c: 0f000593 li a1,240 + 3004730: 0300f7b7 lui a5,0x300f + 3004734: 18478513 addi a0,a5,388 # 300f184 + 3004738: 3b9d jal ra,30044ae + 300473a: a001 j 300473a + GPIO_PARAM_CHECK_WITH_RET(IsGpioPins(pins), BASE_STATUS_ERROR); + 300473c: fe842503 lw a0,-24(s0) + 3004740: d70ff0ef jal ra,3003cb0 + 3004744: 87aa mv a5,a0 + 3004746: 0017c793 xori a5,a5,1 + 300474a: 9f81 uxtb a5 + 300474c: cb91 beqz a5,3004760 + 300474e: 0f100593 li a1,241 + 3004752: 0300f7b7 lui a5,0x300f + 3004756: 18478513 addi a0,a5,388 # 300f184 + 300475a: 3b91 jal ra,30044ae + 300475c: 4785 li a5,1 + 300475e: aa91 j 30048b2 + GPIO_PARAM_CHECK_WITH_RET(IsGpioITMode(mode), BASE_STATUS_ERROR); + 3004760: fe442503 lw a0,-28(s0) + 3004764: dfaff0ef jal ra,3003d5e + 3004768: 87aa mv a5,a0 + 300476a: 0017c793 xori a5,a5,1 + 300476e: 9f81 uxtb a5 + 3004770: cb91 beqz a5,3004784 + 3004772: 0f200593 li a1,242 + 3004776: 0300f7b7 lui a5,0x300f + 300477a: 18478513 addi a0,a5,388 # 300f184 + 300477e: 3b05 jal ra,30044ae + 3004780: 4785 li a5,1 + 3004782: aa05 j 30048b2 + + /* It must be disabled to avoid triggering interrupts during configuration. */ + DCL_GPIO_DisableIrq(handle->baseAddress, pins); + 3004784: fec42783 lw a5,-20(s0) + 3004788: 439c lw a5,0(a5) + 300478a: fe842583 lw a1,-24(s0) + 300478e: 853e mv a0,a5 + 3004790: 3289 jal ra,30040d2 + + if ((mode == GPIO_INT_TYPE_HIGH_LEVEL) || (mode == GPIO_INT_TYPE_LOW_LEVEL)) { + 3004792: fe442703 lw a4,-28(s0) + 3004796: 478d li a5,3 + 3004798: 00f70763 beq a4,a5,30047a6 + 300479c: fe442703 lw a4,-28(s0) + 30047a0: 4789 li a5,2 + 30047a2: 00f71a63 bne a4,a5,30047b6 + GPIO_SetLevelIrqType(handle, pins, mode); + 30047a6: fe442603 lw a2,-28(s0) + 30047aa: fe842583 lw a1,-24(s0) + 30047ae: fec42503 lw a0,-20(s0) + 30047b2: 33f1 jal ra,300457e + 30047b4: a0f5 j 30048a0 + } else if (mode == GPIO_INT_TYPE_BOTH_EDGE) { + 30047b6: fe442703 lw a4,-28(s0) + 30047ba: 4791 li a5,4 + 30047bc: 04f71e63 bne a4,a5,3004818 + handle->baseAddress->GPIO_IEV.reg &= ~pins; + 30047c0: fec42783 lw a5,-20(s0) + 30047c4: 439c lw a5,0(a5) + 30047c6: 40c7a683 lw a3,1036(a5) + 30047ca: fe842783 lw a5,-24(s0) + 30047ce: fff7c713 not a4,a5 + 30047d2: fec42783 lw a5,-20(s0) + 30047d6: 439c lw a5,0(a5) + 30047d8: 8f75 and a4,a4,a3 + 30047da: 40e7a623 sw a4,1036(a5) + handle->baseAddress->GPIO_IS.reg &= ~pins; + 30047de: fec42783 lw a5,-20(s0) + 30047e2: 439c lw a5,0(a5) + 30047e4: 4047a683 lw a3,1028(a5) + 30047e8: fe842783 lw a5,-24(s0) + 30047ec: fff7c713 not a4,a5 + 30047f0: fec42783 lw a5,-20(s0) + 30047f4: 439c lw a5,0(a5) + 30047f6: 8f75 and a4,a4,a3 + 30047f8: 40e7a223 sw a4,1028(a5) + handle->baseAddress->GPIO_IBE.reg |= pins; + 30047fc: fec42783 lw a5,-20(s0) + 3004800: 439c lw a5,0(a5) + 3004802: 4087a683 lw a3,1032(a5) + 3004806: fec42783 lw a5,-20(s0) + 300480a: 439c lw a5,0(a5) + 300480c: fe842703 lw a4,-24(s0) + 3004810: 8f55 or a4,a4,a3 + 3004812: 40e7a423 sw a4,1032(a5) + 3004816: a069 j 30048a0 + } else if ((mode == GPIO_INT_TYPE_RISE_EDGE) || (mode == GPIO_INT_TYPE_FALL_EDGE)) { + 3004818: fe442703 lw a4,-28(s0) + 300481c: 4785 li a5,1 + 300481e: 00f70563 beq a4,a5,3004828 + 3004822: fe442783 lw a5,-28(s0) + 3004826: eb89 bnez a5,3004838 + GPIO_SetEdgeIrqType(handle, pins, mode); + 3004828: fe442603 lw a2,-28(s0) + 300482c: fe842583 lw a1,-24(s0) + 3004830: fec42503 lw a0,-20(s0) + 3004834: 33c5 jal ra,3004614 + 3004836: a0ad j 30048a0 + } else if (mode == GPIO_INT_TYPE_NONE) { + 3004838: fe442703 lw a4,-28(s0) + 300483c: 4795 li a5,5 + 300483e: 06f71163 bne a4,a5,30048a0 + /* No interruptMode: disable everything. */ + handle->baseAddress->GPIO_IEV.reg &= ~pins; + 3004842: fec42783 lw a5,-20(s0) + 3004846: 439c lw a5,0(a5) + 3004848: 40c7a683 lw a3,1036(a5) + 300484c: fe842783 lw a5,-24(s0) + 3004850: fff7c713 not a4,a5 + 3004854: fec42783 lw a5,-20(s0) + 3004858: 439c lw a5,0(a5) + 300485a: 8f75 and a4,a4,a3 + 300485c: 40e7a623 sw a4,1036(a5) + handle->baseAddress->GPIO_IS.reg &= ~pins; + 3004860: fec42783 lw a5,-20(s0) + 3004864: 439c lw a5,0(a5) + 3004866: 4047a683 lw a3,1028(a5) + 300486a: fe842783 lw a5,-24(s0) + 300486e: fff7c713 not a4,a5 + 3004872: fec42783 lw a5,-20(s0) + 3004876: 439c lw a5,0(a5) + 3004878: 8f75 and a4,a4,a3 + 300487a: 40e7a223 sw a4,1028(a5) + handle->baseAddress->GPIO_IBE.reg &= ~pins; + 300487e: fec42783 lw a5,-20(s0) + 3004882: 439c lw a5,0(a5) + 3004884: 4087a683 lw a3,1032(a5) + 3004888: fe842783 lw a5,-24(s0) + 300488c: fff7c713 not a4,a5 + 3004890: fec42783 lw a5,-20(s0) + 3004894: 439c lw a5,0(a5) + 3004896: 8f75 and a4,a4,a3 + 3004898: 40e7a423 sw a4,1032(a5) + return BASE_STATUS_ERROR; + 300489c: 4785 li a5,1 + 300489e: a811 j 30048b2 + } + + DCL_GPIO_EnableIrq(handle->baseAddress, pins); + 30048a0: fec42783 lw a5,-20(s0) + 30048a4: 439c lw a5,0(a5) + 30048a6: fe842583 lw a1,-24(s0) + 30048aa: 853e mv a0,a5 + 30048ac: f76ff0ef jal ra,3004022 + return BASE_STATUS_OK; + 30048b0: 4781 li a5,0 +} + 30048b2: 853e mv a0,a5 + 30048b4: 40f2 lw ra,28(sp) + 30048b6: 4462 lw s0,24(sp) + 30048b8: 6105 addi sp,sp,32 + 30048ba: 8082 ret + +030048bc : + * @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) +{ + 30048bc: 7179 addi sp,sp,-48 + 30048be: d606 sw ra,44(sp) + 30048c0: d422 sw s0,40(sp) + 30048c2: 1800 addi s0,sp,48 + 30048c4: fca42e23 sw a0,-36(s0) + 30048c8: fcb42c23 sw a1,-40(s0) + GPIO_ASSERT_PARAM(handle != NULL); + 30048cc: fdc42783 lw a5,-36(s0) + 30048d0: eb89 bnez a5,30048e2 + 30048d2: 11300593 li a1,275 + 30048d6: 0300f7b7 lui a5,0x300f + 30048da: 18478513 addi a0,a5,388 # 300f184 + 30048de: 3ec1 jal ra,30044ae + 30048e0: a001 j 30048e0 + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 30048e2: fdc42783 lw a5,-36(s0) + 30048e6: 4398 lw a4,0(a5) + 30048e8: 145007b7 lui a5,0x14500 + 30048ec: 04f70d63 beq a4,a5,3004946 + 30048f0: fdc42783 lw a5,-36(s0) + 30048f4: 4398 lw a4,0(a5) + 30048f6: 145017b7 lui a5,0x14501 + 30048fa: 04f70663 beq a4,a5,3004946 + 30048fe: fdc42783 lw a5,-36(s0) + 3004902: 4398 lw a4,0(a5) + 3004904: 145027b7 lui a5,0x14502 + 3004908: 02f70f63 beq a4,a5,3004946 + 300490c: fdc42783 lw a5,-36(s0) + 3004910: 4398 lw a4,0(a5) + 3004912: 145037b7 lui a5,0x14503 + 3004916: 02f70863 beq a4,a5,3004946 + 300491a: fdc42783 lw a5,-36(s0) + 300491e: 4398 lw a4,0(a5) + 3004920: 145047b7 lui a5,0x14504 + 3004924: 02f70163 beq a4,a5,3004946 + 3004928: fdc42783 lw a5,-36(s0) + 300492c: 4398 lw a4,0(a5) + 300492e: 145057b7 lui a5,0x14505 + 3004932: 00f70a63 beq a4,a5,3004946 + 3004936: 11400593 li a1,276 + 300493a: 0300f7b7 lui a5,0x300f + 300493e: 18478513 addi a0,a5,388 # 300f184 + 3004942: 36b5 jal ra,30044ae + 3004944: a001 j 3004944 + GPIO_PARAM_CHECK_NO_RET(IsGpioPins(pin)); + 3004946: fd842503 lw a0,-40(s0) + 300494a: b66ff0ef jal ra,3003cb0 + 300494e: 87aa mv a5,a0 + 3004950: 0017c793 xori a5,a5,1 + 3004954: 9f81 uxtb a5 + 3004956: cb89 beqz a5,3004968 + 3004958: 11500593 li a1,277 + 300495c: 0300f7b7 lui a5,0x300f + 3004960: 18478513 addi a0,a5,388 # 300f184 + 3004964: 36a9 jal ra,30044ae + 3004966: a899 j 30049bc + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + 3004968: fe042623 sw zero,-20(s0) + 300496c: a099 j 30049b2 + if (handle->userCallBack.GPIO_CallbackFuncs[i].pin == pin) { + 300496e: fdc42703 lw a4,-36(s0) + 3004972: fec42783 lw a5,-20(s0) + 3004976: 078e slli a5,a5,0x3 + 3004978: 97ba add a5,a5,a4 + 300497a: 479c lw a5,8(a5) + 300497c: fd842703 lw a4,-40(s0) + 3004980: 02f71463 bne a4,a5,30049a8 + if (handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc != NULL) { + 3004984: fdc42703 lw a4,-36(s0) + 3004988: fec42783 lw a5,-20(s0) + 300498c: 078e slli a5,a5,0x3 + 300498e: 97ba add a5,a5,a4 + 3004990: 47dc lw a5,12(a5) + 3004992: cb99 beqz a5,30049a8 + handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc(handle); + 3004994: fdc42703 lw a4,-36(s0) + 3004998: fec42783 lw a5,-20(s0) + 300499c: 078e slli a5,a5,0x3 + 300499e: 97ba add a5,a5,a4 + 30049a0: 47dc lw a5,12(a5) + 30049a2: fdc42503 lw a0,-36(s0) + 30049a6: 9782 jalr a5 + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + 30049a8: fec42783 lw a5,-20(s0) + 30049ac: 0785 addi a5,a5,1 + 30049ae: fef42623 sw a5,-20(s0) + 30049b2: fec42703 lw a4,-20(s0) + 30049b6: 479d li a5,7 + 30049b8: fae7fbe3 bgeu a5,a4,300496e + } + } + } +} + 30049bc: 50b2 lw ra,44(sp) + 30049be: 5422 lw s0,40(sp) + 30049c0: 6145 addi sp,sp,48 + 30049c2: 8082 ret + +030049c4 : + * @brief Handle GPIO interrupt request. + * @param handle Interrupt parameter. + * @retval None. + */ +void HAL_GPIO_IrqHandler(void *handle) +{ + 30049c4: 7179 addi sp,sp,-48 + 30049c6: d606 sw ra,44(sp) + 30049c8: d422 sw s0,40(sp) + 30049ca: 1800 addi s0,sp,48 + 30049cc: fca42e23 sw a0,-36(s0) + GPIO_Handle *gpioHandle = (GPIO_Handle *)handle; + 30049d0: fdc42783 lw a5,-36(s0) + 30049d4: fef42423 sw a5,-24(s0) + GPIO_ASSERT_PARAM(gpioHandle != NULL); + 30049d8: fe842783 lw a5,-24(s0) + 30049dc: eb89 bnez a5,30049ee + 30049de: 12700593 li a1,295 + 30049e2: 0300f7b7 lui a5,0x300f + 30049e6: 18478513 addi a0,a5,388 # 300f184 + 30049ea: 34d1 jal ra,30044ae + 30049ec: a001 j 30049ec + GPIO_ASSERT_PARAM(IsGPIOInstance(gpioHandle->baseAddress)); + 30049ee: fe842783 lw a5,-24(s0) + 30049f2: 4398 lw a4,0(a5) + 30049f4: 145007b7 lui a5,0x14500 + 30049f8: 04f70d63 beq a4,a5,3004a52 + 30049fc: fe842783 lw a5,-24(s0) + 3004a00: 4398 lw a4,0(a5) + 3004a02: 145017b7 lui a5,0x14501 + 3004a06: 04f70663 beq a4,a5,3004a52 + 3004a0a: fe842783 lw a5,-24(s0) + 3004a0e: 4398 lw a4,0(a5) + 3004a10: 145027b7 lui a5,0x14502 + 3004a14: 02f70f63 beq a4,a5,3004a52 + 3004a18: fe842783 lw a5,-24(s0) + 3004a1c: 4398 lw a4,0(a5) + 3004a1e: 145037b7 lui a5,0x14503 + 3004a22: 02f70863 beq a4,a5,3004a52 + 3004a26: fe842783 lw a5,-24(s0) + 3004a2a: 4398 lw a4,0(a5) + 3004a2c: 145047b7 lui a5,0x14504 + 3004a30: 02f70163 beq a4,a5,3004a52 + 3004a34: fe842783 lw a5,-24(s0) + 3004a38: 4398 lw a4,0(a5) + 3004a3a: 145057b7 lui a5,0x14505 + 3004a3e: 00f70a63 beq a4,a5,3004a52 + 3004a42: 12800593 li a1,296 + 3004a46: 0300f7b7 lui a5,0x300f + 3004a4a: 18478513 addi a0,a5,388 # 300f184 + 3004a4e: 3485 jal ra,30044ae + 3004a50: a001 j 3004a50 + unsigned int position = 0x00000000U; + 3004a52: fe042623 sw zero,-20(s0) + unsigned int pinCurrent = 0x00000000U; + 3004a56: fe042223 sw zero,-28(s0) + unsigned int mis = DCL_GPIO_GetMIS(gpioHandle->baseAddress); /* Queries the masked GPIO interrupt status. */ + 3004a5a: fe842783 lw a5,-24(s0) + 3004a5e: 439c lw a5,0(a5) + 3004a60: 853e mv a0,a5 + 3004a62: f1aff0ef jal ra,300417c + 3004a66: fea42023 sw a0,-32(s0) + + /* Determine which pin sets the callback function. */ + while ((mis >> position) != BASE_CFG_UNSET) { + 3004a6a: a0b1 j 3004ab6 + pinCurrent = mis & (1 << position); + 3004a6c: 4705 li a4,1 + 3004a6e: fec42783 lw a5,-20(s0) + 3004a72: 00f717b3 sll a5,a4,a5 + 3004a76: 873e mv a4,a5 + 3004a78: fe042783 lw a5,-32(s0) + 3004a7c: 8ff9 and a5,a5,a4 + 3004a7e: fef42223 sw a5,-28(s0) + if (pinCurrent) { + 3004a82: fe442783 lw a5,-28(s0) + 3004a86: c39d beqz a5,3004aac + gpioHandle->pins = pinCurrent; + 3004a88: fe842783 lw a5,-24(s0) + 3004a8c: fe442703 lw a4,-28(s0) + 3004a90: c3d8 sw a4,4(a5) + DCL_GPIO_ClearIrq(gpioHandle->baseAddress, pinCurrent); + 3004a92: fe842783 lw a5,-24(s0) + 3004a96: 439c lw a5,0(a5) + 3004a98: fe442583 lw a1,-28(s0) + 3004a9c: 853e mv a0,a5 + 3004a9e: cdeff0ef jal ra,3003f7c + GPIO_ExcuteCallBack(gpioHandle, pinCurrent); + 3004aa2: fe442583 lw a1,-28(s0) + 3004aa6: fe842503 lw a0,-24(s0) + 3004aaa: 3d09 jal ra,30048bc + } + position++; + 3004aac: fec42783 lw a5,-20(s0) + 3004ab0: 0785 addi a5,a5,1 + 3004ab2: fef42623 sw a5,-20(s0) + while ((mis >> position) != BASE_CFG_UNSET) { + 3004ab6: fe042703 lw a4,-32(s0) + 3004aba: fec42783 lw a5,-20(s0) + 3004abe: 00f757b3 srl a5,a4,a5 + 3004ac2: f7cd bnez a5,3004a6c + } +} + 3004ac4: 0001 nop + 3004ac6: 50b2 lw ra,44(sp) + 3004ac8: 5422 lw s0,40(sp) + 3004aca: 6145 addi sp,sp,48 + 3004acc: 8082 ret + +03004ace : + * @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) +{ + 3004ace: 7179 addi sp,sp,-48 + 3004ad0: d606 sw ra,44(sp) + 3004ad2: d422 sw s0,40(sp) + 3004ad4: 1800 addi s0,sp,48 + 3004ad6: fca42e23 sw a0,-36(s0) + 3004ada: fcb42c23 sw a1,-40(s0) + 3004ade: fcc42a23 sw a2,-44(s0) + GPIO_ASSERT_PARAM(handle != NULL); + 3004ae2: fdc42783 lw a5,-36(s0) + 3004ae6: eb89 bnez a5,3004af8 + 3004ae8: 14200593 li a1,322 + 3004aec: 0300f7b7 lui a5,0x300f + 3004af0: 18478513 addi a0,a5,388 # 300f184 + 3004af4: 3a6d jal ra,30044ae + 3004af6: a001 j 3004af6 + GPIO_ASSERT_PARAM(IsGPIOInstance(handle->baseAddress)); + 3004af8: fdc42783 lw a5,-36(s0) + 3004afc: 4398 lw a4,0(a5) + 3004afe: 145007b7 lui a5,0x14500 + 3004b02: 04f70d63 beq a4,a5,3004b5c + 3004b06: fdc42783 lw a5,-36(s0) + 3004b0a: 4398 lw a4,0(a5) + 3004b0c: 145017b7 lui a5,0x14501 + 3004b10: 04f70663 beq a4,a5,3004b5c + 3004b14: fdc42783 lw a5,-36(s0) + 3004b18: 4398 lw a4,0(a5) + 3004b1a: 145027b7 lui a5,0x14502 + 3004b1e: 02f70f63 beq a4,a5,3004b5c + 3004b22: fdc42783 lw a5,-36(s0) + 3004b26: 4398 lw a4,0(a5) + 3004b28: 145037b7 lui a5,0x14503 + 3004b2c: 02f70863 beq a4,a5,3004b5c + 3004b30: fdc42783 lw a5,-36(s0) + 3004b34: 4398 lw a4,0(a5) + 3004b36: 145047b7 lui a5,0x14504 + 3004b3a: 02f70163 beq a4,a5,3004b5c + 3004b3e: fdc42783 lw a5,-36(s0) + 3004b42: 4398 lw a4,0(a5) + 3004b44: 145057b7 lui a5,0x14505 + 3004b48: 00f70a63 beq a4,a5,3004b5c + 3004b4c: 14300593 li a1,323 + 3004b50: 0300f7b7 lui a5,0x300f + 3004b54: 18478513 addi a0,a5,388 # 300f184 + 3004b58: 3a99 jal ra,30044ae + 3004b5a: a001 j 3004b5a + GPIO_PARAM_CHECK_NO_RET(IsGpioPin(pin)); + 3004b5c: fd842503 lw a0,-40(s0) + 3004b60: 980ff0ef jal ra,3003ce0 + 3004b64: 87aa mv a5,a0 + 3004b66: 0017c793 xori a5,a5,1 + 3004b6a: 9f81 uxtb a5 + 3004b6c: cb89 beqz a5,3004b7e + 3004b6e: 14400593 li a1,324 + 3004b72: 0300f7b7 lui a5,0x300f + 3004b76: 18478513 addi a0,a5,388 # 300f184 + 3004b7a: 3a15 jal ra,30044ae + 3004b7c: a091 j 3004bc0 + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + 3004b7e: fe042623 sw zero,-20(s0) + 3004b82: a815 j 3004bb6 + if (handle->userCallBack.GPIO_CallbackFuncs[i].pin == pin) { + 3004b84: fdc42703 lw a4,-36(s0) + 3004b88: fec42783 lw a5,-20(s0) + 3004b8c: 078e slli a5,a5,0x3 + 3004b8e: 97ba add a5,a5,a4 + 3004b90: 479c lw a5,8(a5) + 3004b92: fd842703 lw a4,-40(s0) + 3004b96: 00f71b63 bne a4,a5,3004bac + handle->userCallBack.GPIO_CallbackFuncs[i].callbackFunc = pCallback; + 3004b9a: fdc42703 lw a4,-36(s0) + 3004b9e: fec42783 lw a5,-20(s0) + 3004ba2: 078e slli a5,a5,0x3 + 3004ba4: 97ba add a5,a5,a4 + 3004ba6: fd442703 lw a4,-44(s0) + 3004baa: c7d8 sw a4,12(a5) + for (unsigned int i = 0; i < GPIO_PIN_NUM; i++) { + 3004bac: fec42783 lw a5,-20(s0) + 3004bb0: 0785 addi a5,a5,1 + 3004bb2: fef42623 sw a5,-20(s0) + 3004bb6: fec42703 lw a4,-20(s0) + 3004bba: 479d li a5,7 + 3004bbc: fce7f4e3 bgeu a5,a4,3004b84 + } + } + 3004bc0: 50b2 lw ra,44(sp) + 3004bc2: 5422 lw s0,40(sp) + 3004bc4: 6145 addi sp,sp,48 + 3004bc6: 8082 ret + +03004bc8 : + * @param num Pwm number, only valid if keep equ 0 + * @retval true + * @retval false + */ +static inline bool IsGptPwmNum(unsigned int num) +{ + 3004bc8: 1101 addi sp,sp,-32 + 3004bca: ce22 sw s0,28(sp) + 3004bcc: 1000 addi s0,sp,32 + 3004bce: fea42623 sw a0,-20(s0) + return ((num) <= GPT_PWM_MAX_NUM); + 3004bd2: fec42783 lw a5,-20(s0) + 3004bd6: 4007b793 sltiu a5,a5,1024 + 3004bda: 9f81 uxtb a5 +} + 3004bdc: 853e mv a0,a5 + 3004bde: 4472 lw s0,28(sp) + 3004be0: 6105 addi sp,sp,32 + 3004be2: 8082 ret + +03004be4 : + * @param div division factor of GPT + * @retval true + * @retval false + */ +static inline bool IsGptDiv(unsigned int div) +{ + 3004be4: 1101 addi sp,sp,-32 + 3004be6: ce22 sw s0,28(sp) + 3004be8: 1000 addi s0,sp,32 + 3004bea: fea42623 sw a0,-20(s0) + return (div <= GPT_PWM_DIV_FACTOR_MAX_VALUE); + 3004bee: fec42703 lw a4,-20(s0) + 3004bf2: 6785 lui a5,0x1 + 3004bf4: 00f737b3 sltu a5,a4,a5 + 3004bf8: 9f81 uxtb a5 +} + 3004bfa: 853e mv a0,a5 + 3004bfc: 4472 lw s0,28(sp) + 3004bfe: 6105 addi sp,sp,32 + 3004c00: 8082 ret + +03004c02 : + * @param period Period of GPT + * @retval true + * @retval false + */ +static inline bool IsGptPeriod(unsigned int period) +{ + 3004c02: 1101 addi sp,sp,-32 + 3004c04: ce22 sw s0,28(sp) + 3004c06: 1000 addi s0,sp,32 + 3004c08: fea42623 sw a0,-20(s0) + return ((period >= GPT_PWM_PERIOD_MIN_VALUE) && (period <= GPT_PWM_PERIOD_MAX_VALUE)); + 3004c0c: fec42703 lw a4,-20(s0) + 3004c10: 4785 li a5,1 + 3004c12: 00e7f963 bgeu a5,a4,3004c24 + 3004c16: fec42703 lw a4,-20(s0) + 3004c1a: 67c1 lui a5,0x10 + 3004c1c: 00f77463 bgeu a4,a5,3004c24 + 3004c20: 4785 li a5,1 + 3004c22: a011 j 3004c26 + 3004c24: 4781 li a5,0 + 3004c26: 8b85 andi a5,a5,1 + 3004c28: 9f81 uxtb a5 +} + 3004c2a: 853e mv a0,a5 + 3004c2c: 4472 lw s0,28(sp) + 3004c2e: 6105 addi sp,sp,32 + 3004c30: 8082 ret + +03004c32 : + * @param value value of GPT ref dot + * @retval true + * @retval false + */ +static inline bool IsGptRefDot(unsigned int value) +{ + 3004c32: 1101 addi sp,sp,-32 + 3004c34: ce22 sw s0,28(sp) + 3004c36: 1000 addi s0,sp,32 + 3004c38: fea42623 sw a0,-20(s0) + return (value <= GPT_TC_PRD_MAX_VALUE); + 3004c3c: fec42703 lw a4,-20(s0) + 3004c40: 67c1 lui a5,0x10 + 3004c42: 00f737b3 sltu a5,a4,a5 + 3004c46: 9f81 uxtb a5 +} + 3004c48: 853e mv a0,a5 + 3004c4a: 4472 lw s0,28(sp) + 3004c4c: 6105 addi sp,sp,32 + 3004c4e: 8082 ret + +03004c50 : + * @param period Period of GPT + * @retval true + * @retval false + */ +static inline bool IsGptAction(unsigned int action) +{ + 3004c50: 1101 addi sp,sp,-32 + 3004c52: ce22 sw s0,28(sp) + 3004c54: 1000 addi s0,sp,32 + 3004c56: fea42623 sw a0,-20(s0) + return (action <= GPT_ACTION_OUTPUT_FLIP); + 3004c5a: fec42783 lw a5,-20(s0) + 3004c5e: 0047b793 sltiu a5,a5,4 + 3004c62: 9f81 uxtb a5 +} + 3004c64: 853e mv a0,a5 + 3004c66: 4472 lw s0,28(sp) + 3004c68: 6105 addi sp,sp,32 + 3004c6a: 8082 ret + +03004c6c : + * @param handle GPT Handle. + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR Paramter check fail + */ +BASE_StatusType HAL_GPT_Init(GPT_Handle *handle) +{ + 3004c6c: 1101 addi sp,sp,-32 + 3004c6e: ce06 sw ra,28(sp) + 3004c70: cc22 sw s0,24(sp) + 3004c72: 1000 addi s0,sp,32 + 3004c74: fea42623 sw a0,-20(s0) + GPT_ASSERT_PARAM(handle != NULL); + 3004c78: fec42783 lw a5,-20(s0) + 3004c7c: eb89 bnez a5,3004c8e + 3004c7e: 03500593 li a1,53 + 3004c82: 0300f7b7 lui a5,0x300f + 3004c86: 1a078513 addi a0,a5,416 # 300f1a0 + 3004c8a: 2b85 jal ra,30051fa + 3004c8c: a001 j 3004c8c + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + 3004c8e: fec42783 lw a5,-20(s0) + 3004c92: 4398 lw a4,0(a5) + 3004c94: 147007b7 lui a5,0x14700 + 3004c98: 02f70f63 beq a4,a5,3004cd6 + 3004c9c: fec42783 lw a5,-20(s0) + 3004ca0: 4398 lw a4,0(a5) + 3004ca2: 147017b7 lui a5,0x14701 + 3004ca6: 02f70863 beq a4,a5,3004cd6 + 3004caa: fec42783 lw a5,-20(s0) + 3004cae: 4398 lw a4,0(a5) + 3004cb0: 147027b7 lui a5,0x14702 + 3004cb4: 02f70163 beq a4,a5,3004cd6 + 3004cb8: fec42783 lw a5,-20(s0) + 3004cbc: 4398 lw a4,0(a5) + 3004cbe: 147037b7 lui a5,0x14703 + 3004cc2: 00f70a63 beq a4,a5,3004cd6 + 3004cc6: 03600593 li a1,54 + 3004cca: 0300f7b7 lui a5,0x300f + 3004cce: 1a078513 addi a0,a5,416 # 300f1a0 + 3004cd2: 2325 jal ra,30051fa + 3004cd4: a001 j 3004cd4 + + HAL_GPT_Stop(handle); + 3004cd6: fec42503 lw a0,-20(s0) + 3004cda: 207d jal ra,3004d88 + if (HAL_GPT_Config(handle) == BASE_STATUS_ERROR) { + 3004cdc: fec42503 lw a0,-20(s0) + 3004ce0: 2a15 jal ra,3004e14 + 3004ce2: 872a mv a4,a0 + 3004ce4: 4785 li a5,1 + 3004ce6: 00f71463 bne a4,a5,3004cee + return BASE_STATUS_ERROR; + 3004cea: 4785 li a5,1 + 3004cec: a011 j 3004cf0 + } + return BASE_STATUS_OK; + 3004cee: 4781 li a5,0 +} + 3004cf0: 853e mv a0,a5 + 3004cf2: 40f2 lw ra,28(sp) + 3004cf4: 4462 lw s0,24(sp) + 3004cf6: 6105 addi sp,sp,32 + 3004cf8: 8082 ret + +03004cfa : + * @brief Start GPT + * @param handle GPT Handle. + * @retval None + */ +void HAL_GPT_Start(GPT_Handle *handle) +{ + 3004cfa: 7179 addi sp,sp,-48 + 3004cfc: d606 sw ra,44(sp) + 3004cfe: d422 sw s0,40(sp) + 3004d00: 1800 addi s0,sp,48 + 3004d02: fca42e23 sw a0,-36(s0) + GPT_ASSERT_PARAM(handle != NULL); + 3004d06: fdc42783 lw a5,-36(s0) + 3004d0a: eb89 bnez a5,3004d1c + 3004d0c: 04600593 li a1,70 + 3004d10: 0300f7b7 lui a5,0x300f + 3004d14: 1a078513 addi a0,a5,416 # 300f1a0 + 3004d18: 21cd jal ra,30051fa + 3004d1a: a001 j 3004d1a + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + 3004d1c: fdc42783 lw a5,-36(s0) + 3004d20: 4398 lw a4,0(a5) + 3004d22: 147007b7 lui a5,0x14700 + 3004d26: 02f70f63 beq a4,a5,3004d64 + 3004d2a: fdc42783 lw a5,-36(s0) + 3004d2e: 4398 lw a4,0(a5) + 3004d30: 147017b7 lui a5,0x14701 + 3004d34: 02f70863 beq a4,a5,3004d64 + 3004d38: fdc42783 lw a5,-36(s0) + 3004d3c: 4398 lw a4,0(a5) + 3004d3e: 147027b7 lui a5,0x14702 + 3004d42: 02f70163 beq a4,a5,3004d64 + 3004d46: fdc42783 lw a5,-36(s0) + 3004d4a: 4398 lw a4,0(a5) + 3004d4c: 147037b7 lui a5,0x14703 + 3004d50: 00f70a63 beq a4,a5,3004d64 + 3004d54: 04700593 li a1,71 + 3004d58: 0300f7b7 lui a5,0x300f + 3004d5c: 1a078513 addi a0,a5,416 # 300f1a0 + 3004d60: 2969 jal ra,30051fa + 3004d62: a001 j 3004d62 + /* Enables the GPT to output PWM waves according to the configuration. */ + GPT_EN_REG gptEn; + gptEn.BIT.rg_gpt_en = BASE_CFG_SET; + 3004d64: fec42783 lw a5,-20(s0) + 3004d68: 0017e793 ori a5,a5,1 + 3004d6c: fef42623 sw a5,-20(s0) + handle->baseAddress->GPT_EN.reg = gptEn.reg; + 3004d70: fdc42783 lw a5,-36(s0) + 3004d74: 439c lw a5,0(a5) + 3004d76: fec42703 lw a4,-20(s0) + 3004d7a: 40e7a623 sw a4,1036(a5) +} + 3004d7e: 0001 nop + 3004d80: 50b2 lw ra,44(sp) + 3004d82: 5422 lw s0,40(sp) + 3004d84: 6145 addi sp,sp,48 + 3004d86: 8082 ret + +03004d88 : + * @brief Stop GPT + * @param handle GPT Handle. + * @retval None + */ +void HAL_GPT_Stop(GPT_Handle *handle) +{ + 3004d88: 7179 addi sp,sp,-48 + 3004d8a: d606 sw ra,44(sp) + 3004d8c: d422 sw s0,40(sp) + 3004d8e: 1800 addi s0,sp,48 + 3004d90: fca42e23 sw a0,-36(s0) + GPT_ASSERT_PARAM(handle != NULL); + 3004d94: fdc42783 lw a5,-36(s0) + 3004d98: eb89 bnez a5,3004daa + 3004d9a: 05500593 li a1,85 + 3004d9e: 0300f7b7 lui a5,0x300f + 3004da2: 1a078513 addi a0,a5,416 # 300f1a0 + 3004da6: 2991 jal ra,30051fa + 3004da8: a001 j 3004da8 + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + 3004daa: fdc42783 lw a5,-36(s0) + 3004dae: 4398 lw a4,0(a5) + 3004db0: 147007b7 lui a5,0x14700 + 3004db4: 02f70f63 beq a4,a5,3004df2 + 3004db8: fdc42783 lw a5,-36(s0) + 3004dbc: 4398 lw a4,0(a5) + 3004dbe: 147017b7 lui a5,0x14701 + 3004dc2: 02f70863 beq a4,a5,3004df2 + 3004dc6: fdc42783 lw a5,-36(s0) + 3004dca: 4398 lw a4,0(a5) + 3004dcc: 147027b7 lui a5,0x14702 + 3004dd0: 02f70163 beq a4,a5,3004df2 + 3004dd4: fdc42783 lw a5,-36(s0) + 3004dd8: 4398 lw a4,0(a5) + 3004dda: 147037b7 lui a5,0x14703 + 3004dde: 00f70a63 beq a4,a5,3004df2 + 3004de2: 05600593 li a1,86 + 3004de6: 0300f7b7 lui a5,0x300f + 3004dea: 1a078513 addi a0,a5,416 # 300f1a0 + 3004dee: 2131 jal ra,30051fa + 3004df0: a001 j 3004df0 + /* Disable the GPT to output PWM waves. */ + GPT_EN_REG gptEn; + gptEn.BIT.rg_gpt_en = BASE_CFG_UNSET; + 3004df2: fec42783 lw a5,-20(s0) + 3004df6: 9bf9 andi a5,a5,-2 + 3004df8: fef42623 sw a5,-20(s0) + handle->baseAddress->GPT_EN.reg = gptEn.reg; + 3004dfc: fdc42783 lw a5,-36(s0) + 3004e00: 439c lw a5,0(a5) + 3004e02: fec42703 lw a4,-20(s0) + 3004e06: 40e7a623 sw a4,1036(a5) +} + 3004e0a: 0001 nop + 3004e0c: 50b2 lw ra,44(sp) + 3004e0e: 5422 lw s0,40(sp) + 3004e10: 6145 addi sp,sp,48 + 3004e12: 8082 ret + +03004e14 : + * @param handle GPT Handle. + * @retval BASE_STATUS_OK + * @retval BASE_STATUS_ERROR + */ +BASE_StatusType HAL_GPT_Config(GPT_Handle *handle) +{ + 3004e14: 7179 addi sp,sp,-48 + 3004e16: d606 sw ra,44(sp) + 3004e18: d422 sw s0,40(sp) + 3004e1a: 1800 addi s0,sp,48 + 3004e1c: fca42e23 sw a0,-36(s0) + GPT_ASSERT_PARAM(handle != NULL); + 3004e20: fdc42783 lw a5,-36(s0) + 3004e24: eb89 bnez a5,3004e36 + 3004e26: 06500593 li a1,101 + 3004e2a: 0300f7b7 lui a5,0x300f + 3004e2e: 1a078513 addi a0,a5,416 # 300f1a0 + 3004e32: 26e1 jal ra,30051fa + 3004e34: a001 j 3004e34 + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + 3004e36: fdc42783 lw a5,-36(s0) + 3004e3a: 4398 lw a4,0(a5) + 3004e3c: 147007b7 lui a5,0x14700 + 3004e40: 02f70f63 beq a4,a5,3004e7e + 3004e44: fdc42783 lw a5,-36(s0) + 3004e48: 4398 lw a4,0(a5) + 3004e4a: 147017b7 lui a5,0x14701 + 3004e4e: 02f70863 beq a4,a5,3004e7e + 3004e52: fdc42783 lw a5,-36(s0) + 3004e56: 4398 lw a4,0(a5) + 3004e58: 147027b7 lui a5,0x14702 + 3004e5c: 02f70163 beq a4,a5,3004e7e + 3004e60: fdc42783 lw a5,-36(s0) + 3004e64: 4398 lw a4,0(a5) + 3004e66: 147037b7 lui a5,0x14703 + 3004e6a: 00f70a63 beq a4,a5,3004e7e + 3004e6e: 06600593 li a1,102 + 3004e72: 0300f7b7 lui a5,0x300f + 3004e76: 1a078513 addi a0,a5,416 # 300f1a0 + 3004e7a: 2641 jal ra,30051fa + 3004e7c: a001 j 3004e7c + GPT_PARAM_CHECK_WITH_RET(IsGptPeriod(handle->period), BASE_STATUS_ERROR); + 3004e7e: fdc42783 lw a5,-36(s0) + 3004e82: 4fdc lw a5,28(a5) + 3004e84: 853e mv a0,a5 + 3004e86: 3bb5 jal ra,3004c02 + 3004e88: 87aa mv a5,a0 + 3004e8a: 0017c793 xori a5,a5,1 + 3004e8e: 9f81 uxtb a5 + 3004e90: cb91 beqz a5,3004ea4 + 3004e92: 06700593 li a1,103 + 3004e96: 0300f7b7 lui a5,0x300f + 3004e9a: 1a078513 addi a0,a5,416 # 300f1a0 + 3004e9e: 2eb1 jal ra,30051fa + 3004ea0: 4785 li a5,1 + 3004ea2: ac95 j 3005116 + GPT_PARAM_CHECK_WITH_RET(IsGptDiv(handle->clockDiv), BASE_STATUS_ERROR); + 3004ea4: fdc42783 lw a5,-36(s0) + 3004ea8: 479c lw a5,8(a5) + 3004eaa: 853e mv a0,a5 + 3004eac: 3b25 jal ra,3004be4 + 3004eae: 87aa mv a5,a0 + 3004eb0: 0017c793 xori a5,a5,1 + 3004eb4: 9f81 uxtb a5 + 3004eb6: cb91 beqz a5,3004eca + 3004eb8: 06800593 li a1,104 + 3004ebc: 0300f7b7 lui a5,0x300f + 3004ec0: 1a078513 addi a0,a5,416 # 300f1a0 + 3004ec4: 2e1d jal ra,30051fa + 3004ec6: 4785 li a5,1 + 3004ec8: a4b9 j 3005116 + GPT_PARAM_CHECK_WITH_RET(IsGptRefDot(handle->refA0.refdot), BASE_STATUS_ERROR); + 3004eca: fdc42783 lw a5,-36(s0) + 3004ece: 47dc lw a5,12(a5) + 3004ed0: 853e mv a0,a5 + 3004ed2: 3385 jal ra,3004c32 + 3004ed4: 87aa mv a5,a0 + 3004ed6: 0017c793 xori a5,a5,1 + 3004eda: 9f81 uxtb a5 + 3004edc: cb91 beqz a5,3004ef0 + 3004ede: 06900593 li a1,105 + 3004ee2: 0300f7b7 lui a5,0x300f + 3004ee6: 1a078513 addi a0,a5,416 # 300f1a0 + 3004eea: 2e01 jal ra,30051fa + 3004eec: 4785 li a5,1 + 3004eee: a425 j 3005116 + GPT_PARAM_CHECK_WITH_RET(IsGptRefDot(handle->refB0.refdot), BASE_STATUS_ERROR); + 3004ef0: fdc42783 lw a5,-36(s0) + 3004ef4: 4bdc lw a5,20(a5) + 3004ef6: 853e mv a0,a5 + 3004ef8: 3b2d jal ra,3004c32 + 3004efa: 87aa mv a5,a0 + 3004efc: 0017c793 xori a5,a5,1 + 3004f00: 9f81 uxtb a5 + 3004f02: cb91 beqz a5,3004f16 + 3004f04: 06a00593 li a1,106 + 3004f08: 0300f7b7 lui a5,0x300f + 3004f0c: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f10: 24ed jal ra,30051fa + 3004f12: 4785 li a5,1 + 3004f14: a409 j 3005116 + GPT_PARAM_CHECK_WITH_RET(handle->refA0.refdot <= handle->refB0.refdot, BASE_STATUS_ERROR); + 3004f16: fdc42783 lw a5,-36(s0) + 3004f1a: 47d8 lw a4,12(a5) + 3004f1c: fdc42783 lw a5,-36(s0) + 3004f20: 4bdc lw a5,20(a5) + 3004f22: 00e7fb63 bgeu a5,a4,3004f38 + 3004f26: 06b00593 li a1,107 + 3004f2a: 0300f7b7 lui a5,0x300f + 3004f2e: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f32: 24e1 jal ra,30051fa + 3004f34: 4785 li a5,1 + 3004f36: a2c5 j 3005116 + GPT_PARAM_CHECK_WITH_RET(handle->refB0.refdot <= handle->period, BASE_STATUS_ERROR); + 3004f38: fdc42783 lw a5,-36(s0) + 3004f3c: 4bd8 lw a4,20(a5) + 3004f3e: fdc42783 lw a5,-36(s0) + 3004f42: 4fdc lw a5,28(a5) + 3004f44: 00e7fb63 bgeu a5,a4,3004f5a + 3004f48: 06c00593 li a1,108 + 3004f4c: 0300f7b7 lui a5,0x300f + 3004f50: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f54: 245d jal ra,30051fa + 3004f56: 4785 li a5,1 + 3004f58: aa7d j 3005116 + GPT_PARAM_CHECK_WITH_RET(IsGptAction(handle->refA0.refAction), BASE_STATUS_ERROR); + 3004f5a: fdc42783 lw a5,-36(s0) + 3004f5e: 4b9c lw a5,16(a5) + 3004f60: 853e mv a0,a5 + 3004f62: 31fd jal ra,3004c50 + 3004f64: 87aa mv a5,a0 + 3004f66: 0017c793 xori a5,a5,1 + 3004f6a: 9f81 uxtb a5 + 3004f6c: cb91 beqz a5,3004f80 + 3004f6e: 06d00593 li a1,109 + 3004f72: 0300f7b7 lui a5,0x300f + 3004f76: 1a078513 addi a0,a5,416 # 300f1a0 + 3004f7a: 2441 jal ra,30051fa + 3004f7c: 4785 li a5,1 + 3004f7e: aa61 j 3005116 + GPT_PARAM_CHECK_WITH_RET(IsGptAction(handle->refB0.refAction), BASE_STATUS_ERROR); + 3004f80: fdc42783 lw a5,-36(s0) + 3004f84: 4f9c lw a5,24(a5) + 3004f86: 853e mv a0,a5 + 3004f88: 31e1 jal ra,3004c50 + 3004f8a: 87aa mv a5,a0 + 3004f8c: 0017c793 xori a5,a5,1 + 3004f90: 9f81 uxtb a5 + 3004f92: cb91 beqz a5,3004fa6 + 3004f94: 06e00593 li a1,110 + 3004f98: 0300f7b7 lui a5,0x300f + 3004f9c: 1a078513 addi a0,a5,416 # 300f1a0 + 3004fa0: 2ca9 jal ra,30051fa + 3004fa2: 4785 li a5,1 + 3004fa4: aa8d j 3005116 + GPT_PARAM_CHECK_WITH_RET(IsGptPwmNum(handle->pwmNum), BASE_STATUS_ERROR); + 3004fa6: fdc42783 lw a5,-36(s0) + 3004faa: 539c lw a5,32(a5) + 3004fac: 853e mv a0,a5 + 3004fae: 3929 jal ra,3004bc8 + 3004fb0: 87aa mv a5,a0 + 3004fb2: 0017c793 xori a5,a5,1 + 3004fb6: 9f81 uxtb a5 + 3004fb8: cb91 beqz a5,3004fcc + 3004fba: 06f00593 li a1,111 + 3004fbe: 0300f7b7 lui a5,0x300f + 3004fc2: 1a078513 addi a0,a5,416 # 300f1a0 + 3004fc6: 2c15 jal ra,30051fa + 3004fc8: 4785 li a5,1 + 3004fca: a2b1 j 3005116 + + GPT_RegStruct *gptReg; + gptReg = handle->baseAddress; + 3004fcc: fdc42783 lw a5,-36(s0) + 3004fd0: 439c lw a5,0(a5) + 3004fd2: fef42623 sw a5,-20(s0) + /* Configure whether to enable cache loading. */ + gptReg->GPT_BUF_LOAD_EN.BIT.rg_buf_load_en = handle->bufLoad; + 3004fd6: fdc42783 lw a5,-36(s0) + 3004fda: 0257c683 lbu a3,37(a5) + 3004fde: fec42703 lw a4,-20(s0) + 3004fe2: 50072783 lw a5,1280(a4) # 14000500 + 3004fe6: 8a85 andi a3,a3,1 + 3004fe8: 9bf9 andi a5,a5,-2 + 3004fea: 8fd5 or a5,a5,a3 + 3004fec: 50f72023 sw a5,1280(a4) + + /* Configuring the Cycle and Frequency Divider */ + gptReg->GPT_TC_DIV.reg = handle->clockDiv; + 3004ff0: fdc42783 lw a5,-36(s0) + 3004ff4: 4798 lw a4,8(a5) + 3004ff6: fec42783 lw a5,-20(s0) + 3004ffa: cb98 sw a4,16(a5) + gptReg->GPT_TC_PRD.reg = handle->period; + 3004ffc: fdc42783 lw a5,-36(s0) + 3005000: 4fd8 lw a4,28(a5) + 3005002: fec42783 lw a5,-20(s0) + 3005006: cbd8 sw a4,20(a5) + /* Set the count reference point and the corresponding reference action. */ + gptReg->GPT_TC_REFA0.reg = handle->refA0.refdot; + 3005008: fdc42783 lw a5,-36(s0) + 300500c: 47d8 lw a4,12(a5) + 300500e: fec42783 lw a5,-20(s0) + 3005012: cf98 sw a4,24(a5) + gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refa0 = handle->refA0.refAction; + 3005014: fdc42783 lw a5,-36(s0) + 3005018: 4b9c lw a5,16(a5) + 300501a: 8b8d andi a5,a5,3 + 300501c: 0ff7f693 andi a3,a5,255 + 3005020: fec42703 lw a4,-20(s0) + 3005024: 10072783 lw a5,256(a4) + 3005028: 8a8d andi a3,a3,3 + 300502a: 9bf1 andi a5,a5,-4 + 300502c: 8fd5 or a5,a5,a3 + 300502e: 10f72023 sw a5,256(a4) + gptReg->GPT_TC_REFB0.reg = handle->refB0.refdot; + 3005032: fdc42783 lw a5,-36(s0) + 3005036: 4bd8 lw a4,20(a5) + 3005038: fec42783 lw a5,-20(s0) + 300503c: cfd8 sw a4,28(a5) + gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = handle->refB0.refAction; + 300503e: fdc42783 lw a5,-36(s0) + 3005042: 4f9c lw a5,24(a5) + 3005044: 8b8d andi a5,a5,3 + 3005046: 0ff7f693 andi a3,a5,255 + 300504a: fec42703 lw a4,-20(s0) + 300504e: 10072783 lw a5,256(a4) + 3005052: 8a8d andi a3,a3,3 + 3005054: 0692 slli a3,a3,0x4 + 3005056: fcf7f793 andi a5,a5,-49 + 300505a: 8fd5 or a5,a5,a3 + 300505c: 10f72023 sw a5,256(a4) + + /* Sets the PWM output mode: outputs infinite PWM waves and outputs fixed number PWM. */ + gptReg->GPT_PWM0_CFG.BIT.rg_pwm0_keep = handle->pwmKeep; + 3005060: fdc42783 lw a5,-36(s0) + 3005064: 0247c683 lbu a3,36(a5) + 3005068: fec42703 lw a4,-20(s0) + 300506c: 40072783 lw a5,1024(a4) + 3005070: 06fe slli a3,a3,0x1f + 3005072: 80000637 lui a2,0x80000 + 3005076: fff64613 not a2,a2 + 300507a: 8ff1 and a5,a5,a2 + 300507c: 8fd5 or a5,a5,a3 + 300507e: 40f72023 sw a5,1024(a4) + /* 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; + 3005082: fdc42783 lw a5,-36(s0) + 3005086: 539c lw a5,32(a5) + 3005088: 3ff7f793 andi a5,a5,1023 + 300508c: 01079693 slli a3,a5,0x10 + 3005090: 82c1 srli a3,a3,0x10 + 3005092: fec42703 lw a4,-20(s0) + 3005096: 40072783 lw a5,1024(a4) + 300509a: 3ff6f693 andi a3,a3,1023 + 300509e: c007f793 andi a5,a5,-1024 + 30050a2: 8fd5 or a5,a5,a3 + 30050a4: 40f72023 sw a5,1024(a4) + + /* Sets the GPT output completion interrupt and periodic interrupt. */ + gptReg->GPT_INT_EN.BIT.rg_prd_int_en = handle->handleEx.periodIntEnable; + 30050a8: fdc42783 lw a5,-36(s0) + 30050ac: 0307c683 lbu a3,48(a5) + 30050b0: fec42703 lw a4,-20(s0) + 30050b4: 20072783 lw a5,512(a4) + 30050b8: 8a85 andi a3,a3,1 + 30050ba: 9bf9 andi a5,a5,-2 + 30050bc: 8fd5 or a5,a5,a3 + 30050be: 20f72023 sw a5,512(a4) + gptReg->GPT_INT_EN.BIT.rg_pwm0_int_en = handle->handleEx.outputFinIntEnable; + 30050c2: fdc42783 lw a5,-36(s0) + 30050c6: 0317c683 lbu a3,49(a5) + 30050ca: fec42703 lw a4,-20(s0) + 30050ce: 20072783 lw a5,512(a4) + 30050d2: 8a85 andi a3,a3,1 + 30050d4: 0692 slli a3,a3,0x4 + 30050d6: 9bbd andi a5,a5,-17 + 30050d8: 8fd5 or a5,a5,a3 + 30050da: 20f72023 sw a5,512(a4) + + /* ADC Trigger Sampling Configuration */ + gptReg->GPT_SOCDR_EN.BIT.rg_soc_pwm0_en = handle->triggleAdcOutFinish; + 30050de: fdc42783 lw a5,-36(s0) + 30050e2: 0277c683 lbu a3,39(a5) + 30050e6: fec42703 lw a4,-20(s0) + 30050ea: 30072783 lw a5,768(a4) + 30050ee: 8a85 andi a3,a3,1 + 30050f0: 0686 slli a3,a3,0x1 + 30050f2: 9bf5 andi a5,a5,-3 + 30050f4: 8fd5 or a5,a5,a3 + 30050f6: 30f72023 sw a5,768(a4) + gptReg->GPT_SOCDR_EN.BIT.rg_soc_prd_en = handle->triggleAdcPeriod; + 30050fa: fdc42783 lw a5,-36(s0) + 30050fe: 0267c683 lbu a3,38(a5) + 3005102: fec42703 lw a4,-20(s0) + 3005106: 30072783 lw a5,768(a4) + 300510a: 8a85 andi a3,a3,1 + 300510c: 9bf9 andi a5,a5,-2 + 300510e: 8fd5 or a5,a5,a3 + 3005110: 30f72023 sw a5,768(a4) + return BASE_STATUS_OK; + 3005114: 4781 li a5,0 +} + 3005116: 853e mv a0,a5 + 3005118: 50b2 lw ra,44(sp) + 300511a: 5422 lw s0,40(sp) + 300511c: 6145 addi sp,sp,48 + 300511e: 8082 ret + +03005120 : + * @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) +{ + 3005120: 7179 addi sp,sp,-48 + 3005122: d606 sw ra,44(sp) + 3005124: d422 sw s0,40(sp) + 3005126: 1800 addi s0,sp,48 + 3005128: fca42e23 sw a0,-36(s0) + 300512c: fcb42c23 sw a1,-40(s0) + GPT_ASSERT_PARAM(handle != NULL); + 3005130: fdc42783 lw a5,-36(s0) + 3005134: eb89 bnez a5,3005146 + 3005136: 0d800593 li a1,216 + 300513a: 0300f7b7 lui a5,0x300f + 300513e: 1a078513 addi a0,a5,416 # 300f1a0 + 3005142: 2865 jal ra,30051fa + 3005144: a001 j 3005144 + GPT_ASSERT_PARAM(refer != NULL); + 3005146: fd842783 lw a5,-40(s0) + 300514a: eb89 bnez a5,300515c + 300514c: 0d900593 li a1,217 + 3005150: 0300f7b7 lui a5,0x300f + 3005154: 1a078513 addi a0,a5,416 # 300f1a0 + 3005158: 204d jal ra,30051fa + 300515a: a001 j 300515a + GPT_ASSERT_PARAM(IsGPTInstance(handle->baseAddress)); + 300515c: fdc42783 lw a5,-36(s0) + 3005160: 4398 lw a4,0(a5) + 3005162: 147007b7 lui a5,0x14700 + 3005166: 02f70f63 beq a4,a5,30051a4 + 300516a: fdc42783 lw a5,-36(s0) + 300516e: 4398 lw a4,0(a5) + 3005170: 147017b7 lui a5,0x14701 + 3005174: 02f70863 beq a4,a5,30051a4 + 3005178: fdc42783 lw a5,-36(s0) + 300517c: 4398 lw a4,0(a5) + 300517e: 147027b7 lui a5,0x14702 + 3005182: 02f70163 beq a4,a5,30051a4 + 3005186: fdc42783 lw a5,-36(s0) + 300518a: 4398 lw a4,0(a5) + 300518c: 147037b7 lui a5,0x14703 + 3005190: 00f70a63 beq a4,a5,30051a4 + 3005194: 0da00593 li a1,218 + 3005198: 0300f7b7 lui a5,0x300f + 300519c: 1a078513 addi a0,a5,416 # 300f1a0 + 30051a0: 28a9 jal ra,30051fa + 30051a2: a001 j 30051a2 + GPT_RegStruct *gptReg = handle->baseAddress; + 30051a4: fdc42783 lw a5,-36(s0) + 30051a8: 439c lw a5,0(a5) + 30051aa: fef42623 sw a5,-20(s0) + /* Obtain the reference value of PWM. */ + refer->refA0.refdot = gptReg->GPT_TC_REFA0.reg; + 30051ae: fec42783 lw a5,-20(s0) + 30051b2: 4f98 lw a4,24(a5) + 30051b4: fd842783 lw a5,-40(s0) + 30051b8: c398 sw a4,0(a5) + refer->refB0.refdot = gptReg->GPT_TC_REFB0.reg; + 30051ba: fec42783 lw a5,-20(s0) + 30051be: 4fd8 lw a4,28(a5) + 30051c0: fd842783 lw a5,-40(s0) + 30051c4: c798 sw a4,8(a5) + /* The action of obtaining a reference value. */ + refer->refA0.refAction = gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refa0; + 30051c6: fec42783 lw a5,-20(s0) + 30051ca: 1007a783 lw a5,256(a5) + 30051ce: 8b8d andi a5,a5,3 + 30051d0: 9f81 uxtb a5 + 30051d2: 873e mv a4,a5 + 30051d4: fd842783 lw a5,-40(s0) + 30051d8: c3d8 sw a4,4(a5) + refer->refB0.refAction = gptReg->GPT_PG_ACT0.BIT.rg_pg_act0_refb0; + 30051da: fec42783 lw a5,-20(s0) + 30051de: 1007a783 lw a5,256(a5) + 30051e2: 8391 srli a5,a5,0x4 + 30051e4: 8b8d andi a5,a5,3 + 30051e6: 9f81 uxtb a5 + 30051e8: 873e mv a4,a5 + 30051ea: fd842783 lw a5,-40(s0) + 30051ee: c7d8 sw a4,12(a5) +} + 30051f0: 0001 nop + 30051f2: 50b2 lw ra,44(sp) + 30051f4: 5422 lw s0,40(sp) + 30051f6: 6145 addi sp,sp,48 + 30051f8: 8082 ret + +030051fa : + 30051fa: ff7fb06f j 30011f0 + +030051fe : + * @param functionMode I2C function mode type. + * @retval true + * @retval false + */ +static inline bool IsI2cFunctionMode(I2C_ModeSelectType functionMode) +{ + 30051fe: 1101 addi sp,sp,-32 + 3005200: ce22 sw s0,28(sp) + 3005202: 1000 addi s0,sp,32 + 3005204: fea42623 sw a0,-20(s0) + return (functionMode == I2C_MODE_SELECT_NONE || + functionMode == I2C_MODE_SELECT_MASTER_ONLY || + functionMode == I2C_MODE_SELECT_SLAVE_ONLY || + 3005208: fec42783 lw a5,-20(s0) + 300520c: c385 beqz a5,300522c + return (functionMode == I2C_MODE_SELECT_NONE || + 300520e: fec42703 lw a4,-20(s0) + 3005212: 4785 li a5,1 + 3005214: 00f70c63 beq a4,a5,300522c + functionMode == I2C_MODE_SELECT_MASTER_ONLY || + 3005218: fec42703 lw a4,-20(s0) + 300521c: 4789 li a5,2 + 300521e: 00f70763 beq a4,a5,300522c + functionMode == I2C_MODE_SELECT_SLAVE_ONLY || + 3005222: fec42703 lw a4,-20(s0) + 3005226: 478d li a5,3 + 3005228: 00f71463 bne a4,a5,3005230 + 300522c: 4785 li a5,1 + 300522e: a011 j 3005232 + 3005230: 4781 li a5,0 + 3005232: 8b85 andi a5,a5,1 + 3005234: 9f81 uxtb a5 + functionMode == I2C_MODE_SELECT_MASTER_SLAVE); +} + 3005236: 853e mv a0,a5 + 3005238: 4472 lw s0,28(sp) + 300523a: 6105 addi sp,sp,32 + 300523c: 8082 ret + +0300523e : + * @param addrMode I2C instance + * @retval true + * @retval false + */ +static inline bool IsI2cAddressMode(I2C_AddressMode addrMode) +{ + 300523e: 1101 addi sp,sp,-32 + 3005240: ce22 sw s0,28(sp) + 3005242: 1000 addi s0,sp,32 + 3005244: fea42623 sw a0,-20(s0) + return (addrMode == I2C_7_BITS || + 3005248: fec42783 lw a5,-20(s0) + 300524c: c791 beqz a5,3005258 + 300524e: fec42703 lw a4,-20(s0) + 3005252: 4785 li a5,1 + 3005254: 00f71463 bne a4,a5,300525c + 3005258: 4785 li a5,1 + 300525a: a011 j 300525e + 300525c: 4781 li a5,0 + 300525e: 8b85 andi a5,a5,1 + 3005260: 9f81 uxtb a5 + addrMode == I2C_10_BITS); +} + 3005262: 853e mv a0,a5 + 3005264: 4472 lw s0,28(sp) + 3005266: 6105 addi sp,sp,32 + 3005268: 8082 ret + +0300526a : + * @param sdaHoldTime I2C instance + * @retval true + * @retval false + */ +static inline bool IsI2cSdaHoldTime(unsigned int sdaHoldTime) +{ + 300526a: 1101 addi sp,sp,-32 + 300526c: ce22 sw s0,28(sp) + 300526e: 1000 addi s0,sp,32 + 3005270: fea42623 sw a0,-20(s0) + return (sdaHoldTime <= 0xFFFF); /* SdaHoldTime value is 0 to 0xFFFF */ + 3005274: fec42703 lw a4,-20(s0) + 3005278: 67c1 lui a5,0x10 + 300527a: 00f737b3 sltu a5,a4,a5 + 300527e: 9f81 uxtb a5 +} + 3005280: 853e mv a0,a5 + 3005282: 4472 lw s0,28(sp) + 3005284: 6105 addi sp,sp,32 + 3005286: 8082 ret + +03005288 : + * @param generalCallMode I2C general call mode. + * @retval true + * @retval false + */ +static inline bool IsI2cGeneralCallMode(unsigned int generalCallMode) +{ + 3005288: 1101 addi sp,sp,-32 + 300528a: ce22 sw s0,28(sp) + 300528c: 1000 addi s0,sp,32 + 300528e: fea42623 sw a0,-20(s0) + return (generalCallMode == BASE_CFG_ENABLE || + 3005292: fec42703 lw a4,-20(s0) + 3005296: 4785 li a5,1 + 3005298: 00f70563 beq a4,a5,30052a2 + 300529c: fec42783 lw a5,-20(s0) + 30052a0: e399 bnez 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 + generalCallMode == BASE_CFG_DISABLE); +} + 30052ac: 853e mv a0,a5 + 30052ae: 4472 lw s0,28(sp) + 30052b0: 6105 addi sp,sp,32 + 30052b2: 8082 ret + +030052b4 : + * @param ownAddress I2C own address. + * @retval true + * @retval false + */ +static inline bool IsI2cOwnAddressOrMask(unsigned int ownAddress) +{ + 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 (ownAddress <= XMBUS_OWN_ADDRESS_MASK); /* Own address value is 0 to 0x3FF */ + 30052be: fec42783 lw a5,-20(s0) + 30052c2: 4007b793 sltiu a5,a5,1024 + 30052c6: 9f81 uxtb a5 +} + 30052c8: 853e mv a0,a5 + 30052ca: 4472 lw s0,28(sp) + 30052cc: 6105 addi sp,sp,32 + 30052ce: 8082 ret + +030052d0 : + * @param xmbusAddress XMBus address. + * @retval true + * @retval false + */ +static inline bool IsXMBusAddressOrMask(unsigned int xmbusAddress) +{ + 30052d0: 1101 addi sp,sp,-32 + 30052d2: ce22 sw s0,28(sp) + 30052d4: 1000 addi s0,sp,32 + 30052d6: fea42623 sw a0,-20(s0) + return (xmbusAddress <= XMBUS_OWN_ADDRESS_MASK); /* XMBus address value is 0 to 0x3FF */ + 30052da: fec42783 lw a5,-20(s0) + 30052de: 4007b793 sltiu a5,a5,1024 + 30052e2: 9f81 uxtb a5 +} + 30052e4: 853e mv a0,a5 + 30052e6: 4472 lw s0,28(sp) + 30052e8: 6105 addi sp,sp,32 + 30052ea: 8082 ret + +030052ec : + * @param xmbusAddress XMBus address. + * @retval true + * @retval false + */ +static inline bool IsXMBusAddressEnable(unsigned int slaveOwnXmbAddressEnable) +{ + 30052ec: 1101 addi sp,sp,-32 + 30052ee: ce22 sw s0,28(sp) + 30052f0: 1000 addi s0,sp,32 + 30052f2: fea42623 sw a0,-20(s0) + return (slaveOwnXmbAddressEnable == BASE_CFG_ENABLE || slaveOwnXmbAddressEnable == BASE_CFG_DISABLE); + 30052f6: fec42703 lw a4,-20(s0) + 30052fa: 4785 li a5,1 + 30052fc: 00f70563 beq a4,a5,3005306 + 3005300: fec42783 lw a5,-20(s0) + 3005304: e399 bnez a5,300530a + 3005306: 4785 li a5,1 + 3005308: a011 j 300530c + 300530a: 4781 li a5,0 + 300530c: 8b85 andi a5,a5,1 + 300530e: 9f81 uxtb a5 +} + 3005310: 853e mv a0,a5 + 3005312: 4472 lw s0,28(sp) + 3005314: 6105 addi sp,sp,32 + 3005316: 8082 ret + +03005318 : + * @param spikeFilterTime I2C SDA and SCL Glitch Filtering Time. + * @retval true + * @retval false + */ +static inline bool IsI2cSpikeFilterTime(unsigned int spikeFilterTime) +{ + 3005318: 1101 addi sp,sp,-32 + 300531a: ce22 sw s0,28(sp) + 300531c: 1000 addi s0,sp,32 + 300531e: fea42623 sw a0,-20(s0) + return (spikeFilterTime <= 0xF); /* The spikeFilterTime value is 0 to 0xF */ + 3005322: fec42783 lw a5,-20(s0) + 3005326: 0107b793 sltiu a5,a5,16 + 300532a: 9f81 uxtb a5 +} + 300532c: 853e mv a0,a5 + 300532e: 4472 lw s0,28(sp) + 3005330: 6105 addi sp,sp,32 + 3005332: 8082 ret + +03005334 : + * @param freq I2C freq + * @retval true + * @retval false + */ +static inline bool IsI2cFreq(unsigned int freq) +{ + 3005334: 1101 addi sp,sp,-32 + 3005336: ce22 sw s0,28(sp) + 3005338: 1000 addi s0,sp,32 + 300533a: fea42623 sw a0,-20(s0) + return (freq > 0); + 300533e: fec42783 lw a5,-20(s0) + 3005342: 00f037b3 snez a5,a5 + 3005346: 9f81 uxtb a5 +} + 3005348: 853e mv a0,a5 + 300534a: 4472 lw s0,28(sp) + 300534c: 6105 addi sp,sp,32 + 300534e: 8082 ret + +03005350 : + * @param ignoreAckFlag I2C ignore ack flag. + * @retval true + * @retval false + */ +static inline bool IsI2cIgnoreAckFlag(unsigned int ignoreAckFlag) +{ + 3005350: 1101 addi sp,sp,-32 + 3005352: ce22 sw s0,28(sp) + 3005354: 1000 addi s0,sp,32 + 3005356: fea42623 sw a0,-20(s0) + return (ignoreAckFlag == I2C_IGNORE_NAK_ENABLE || + 300535a: fec42703 lw a4,-20(s0) + 300535e: 4785 li a5,1 + 3005360: 00f70563 beq a4,a5,300536a + 3005364: fec42783 lw a5,-20(s0) + 3005368: e399 bnez a5,300536e + 300536a: 4785 li a5,1 + 300536c: a011 j 3005370 + 300536e: 4781 li a5,0 + 3005370: 8b85 andi a5,a5,1 + 3005372: 9f81 uxtb a5 + ignoreAckFlag == I2C_IGNORE_NAK_DISABLE); +} + 3005374: 853e mv a0,a5 + 3005376: 4472 lw s0,28(sp) + 3005378: 6105 addi sp,sp,32 + 300537a: 8082 ret + +0300537c : + * @param txWaterMark I2C tx water mark. + * @retval true + * @retval false + */ +static inline bool IsI2cTxWaterMark(unsigned int txWaterMark) +{ + 300537c: 1101 addi sp,sp,-32 + 300537e: ce22 sw s0,28(sp) + 3005380: 1000 addi s0,sp,32 + 3005382: fea42623 sw a0,-20(s0) + return (txWaterMark <= 0xF); /* The txWaterMark value is 0 to 0xF */ + 3005386: fec42783 lw a5,-20(s0) + 300538a: 0107b793 sltiu a5,a5,16 + 300538e: 9f81 uxtb a5 +} + 3005390: 853e mv a0,a5 + 3005392: 4472 lw s0,28(sp) + 3005394: 6105 addi sp,sp,32 + 3005396: 8082 ret + +03005398 : + * @param rxWaterMark I2C rx water mark. + * @retval true + * @retval false + */ +static inline bool IsI2cRxWaterMark(unsigned int rxWaterMark) +{ + 3005398: 1101 addi sp,sp,-32 + 300539a: ce22 sw s0,28(sp) + 300539c: 1000 addi s0,sp,32 + 300539e: fea42623 sw a0,-20(s0) + return (rxWaterMark <= 0xF); /* The rxWaterMark value is 0 to 0xF */ + 30053a2: fec42783 lw a5,-20(s0) + 30053a6: 0107b793 sltiu a5,a5,16 + 30053aa: 9f81 uxtb a5 +} + 30053ac: 853e mv a0,a5 + 30053ae: 4472 lw s0,28(sp) + 30053b0: 6105 addi sp,sp,32 + 30053b2: 8082 ret + +030053b4 : + * @param sdaDelayTime The value of SDA delay time. + * @retval true + * @retval false + */ +static inline bool IsI2cSdaDelayTime(unsigned int sdaDelayTime) +{ + 30053b4: 1101 addi sp,sp,-32 + 30053b6: ce22 sw s0,28(sp) + 30053b8: 1000 addi s0,sp,32 + 30053ba: fea42623 sw a0,-20(s0) + return (sdaDelayTime <= 0x0F); /* The SDA delay time upper limit is 0x0F. */ + 30053be: fec42783 lw a5,-20(s0) + 30053c2: 0107b793 sltiu a5,a5,16 + 30053c6: 9f81 uxtb a5 +} + 30053c8: 853e mv a0,a5 + 30053ca: 4472 lw s0,28(sp) + 30053cc: 6105 addi sp,sp,32 + 30053ce: 8082 ret + +030053d0 : + * @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) +{ + 30053d0: 1101 addi sp,sp,-32 + 30053d2: ce06 sw ra,28(sp) + 30053d4: cc22 sw s0,24(sp) + 30053d6: 1000 addi s0,sp,32 + 30053d8: fea42623 sw a0,-20(s0) + 30053dc: feb42423 sw a1,-24(s0) + /* Check the configuration of basic function parameters. */ + I2C_PARAM_CHECK_WITH_RET(IsI2cFunctionMode(handle->functionMode), BASE_STATUS_ERROR); + 30053e0: fec42783 lw a5,-20(s0) + 30053e4: 43dc lw a5,4(a5) + 30053e6: 853e mv a0,a5 + 30053e8: 3d19 jal ra,30051fe + 30053ea: 87aa mv a5,a0 + 30053ec: 0017c793 xori a5,a5,1 + 30053f0: 9f81 uxtb a5 + 30053f2: cb91 beqz a5,3005406 + 30053f4: 09000593 li a1,144 + 30053f8: 0300f7b7 lui a5,0x300f + 30053fc: 1bc78513 addi a0,a5,444 # 300f1bc + 3005400: 3bed jal ra,30051fa + 3005402: 4785 li a5,1 + 3005404: a439 j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cAddressMode(handle->addrMode), BASE_STATUS_ERROR); + 3005406: fec42783 lw a5,-20(s0) + 300540a: 479c lw a5,8(a5) + 300540c: 853e mv a0,a5 + 300540e: 3d05 jal ra,300523e + 3005410: 87aa mv a5,a0 + 3005412: 0017c793 xori a5,a5,1 + 3005416: 9f81 uxtb a5 + 3005418: cb91 beqz a5,300542c + 300541a: 09100593 li a1,145 + 300541e: 0300f7b7 lui a5,0x300f + 3005422: 1bc78513 addi a0,a5,444 # 300f1bc + 3005426: 3bd1 jal ra,30051fa + 3005428: 4785 li a5,1 + 300542a: a2e5 j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cSdaHoldTime(handle->sdaHoldTime), BASE_STATUS_ERROR); + 300542c: fec42783 lw a5,-20(s0) + 3005430: 4b9c lw a5,16(a5) + 3005432: 853e mv a0,a5 + 3005434: 3d1d jal ra,300526a + 3005436: 87aa mv a5,a0 + 3005438: 0017c793 xori a5,a5,1 + 300543c: 9f81 uxtb a5 + 300543e: cb91 beqz a5,3005452 + 3005440: 09200593 li a1,146 + 3005444: 0300f7b7 lui a5,0x300f + 3005448: 1bc78513 addi a0,a5,444 # 300f1bc + 300544c: 337d jal ra,30051fa + 300544e: 4785 li a5,1 + 3005450: a2c9 j 3005612 + /* Check whether the I2C freq is valid. */ + I2C_PARAM_CHECK_WITH_RET(IsI2cFreq(handle->freq), BASE_STATUS_ERROR); + 3005452: fec42783 lw a5,-20(s0) + 3005456: 4bdc lw a5,20(a5) + 3005458: 853e mv a0,a5 + 300545a: 3de9 jal ra,3005334 + 300545c: 87aa mv a5,a0 + 300545e: 0017c793 xori a5,a5,1 + 3005462: 9f81 uxtb a5 + 3005464: cb91 beqz a5,3005478 + 3005466: 09400593 li a1,148 + 300546a: 0300f7b7 lui a5,0x300f + 300546e: 1bc78513 addi a0,a5,444 # 300f1bc + 3005472: 3361 jal ra,30051fa + 3005474: 4785 li a5,1 + 3005476: aa71 j 3005612 + I2C_PARAM_CHECK_WITH_RET((clockFreq > 0), BASE_STATUS_ERROR); + 3005478: fe842783 lw a5,-24(s0) + 300547c: eb91 bnez a5,3005490 + 300547e: 09500593 li a1,149 + 3005482: 0300f7b7 lui a5,0x300f + 3005486: 1bc78513 addi a0,a5,444 # 300f1bc + 300548a: 3b85 jal ra,30051fa + 300548c: 4785 li a5,1 + 300548e: a251 j 3005612 + + if (handle->freq > clockFreq) { + 3005490: fec42783 lw a5,-20(s0) + 3005494: 4bdc lw a5,20(a5) + 3005496: fe842703 lw a4,-24(s0) + 300549a: 00f77463 bgeu a4,a5,30054a2 + return BASE_STATUS_ERROR; + 300549e: 4785 li a5,1 + 30054a0: aa8d j 3005612 + } + /* Check the configuration of basic function parameters. */ + I2C_PARAM_CHECK_WITH_RET(IsI2cIgnoreAckFlag(handle->ignoreAckFlag), BASE_STATUS_ERROR); + 30054a2: fec42783 lw a5,-20(s0) + 30054a6: 4f9c lw a5,24(a5) + 30054a8: 853e mv a0,a5 + 30054aa: 355d jal ra,3005350 + 30054ac: 87aa mv a5,a0 + 30054ae: 0017c793 xori a5,a5,1 + 30054b2: 9f81 uxtb a5 + 30054b4: cb91 beqz a5,30054c8 + 30054b6: 09b00593 li a1,155 + 30054ba: 0300f7b7 lui a5,0x300f + 30054be: 1bc78513 addi a0,a5,444 # 300f1bc + 30054c2: 3b25 jal ra,30051fa + 30054c4: 4785 li a5,1 + 30054c6: a2b1 j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cTxWaterMark(handle->txWaterMark), BASE_STATUS_ERROR); + 30054c8: fec42783 lw a5,-20(s0) + 30054cc: 5bdc lw a5,52(a5) + 30054ce: 853e mv a0,a5 + 30054d0: 3575 jal ra,300537c + 30054d2: 87aa mv a5,a0 + 30054d4: 0017c793 xori a5,a5,1 + 30054d8: 9f81 uxtb a5 + 30054da: cb91 beqz a5,30054ee + 30054dc: 09c00593 li a1,156 + 30054e0: 0300f7b7 lui a5,0x300f + 30054e4: 1bc78513 addi a0,a5,444 # 300f1bc + 30054e8: 3b09 jal ra,30051fa + 30054ea: 4785 li a5,1 + 30054ec: a21d j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cRxWaterMark(handle->rxWaterMark), BASE_STATUS_ERROR); + 30054ee: fec42783 lw a5,-20(s0) + 30054f2: 5b9c lw a5,48(a5) + 30054f4: 853e mv a0,a5 + 30054f6: 354d jal ra,3005398 + 30054f8: 87aa mv a5,a0 + 30054fa: 0017c793 xori a5,a5,1 + 30054fe: 9f81 uxtb a5 + 3005500: cb91 beqz a5,3005514 + 3005502: 09d00593 li a1,157 + 3005506: 0300f7b7 lui a5,0x300f + 300550a: 1bc78513 addi a0,a5,444 # 300f1bc + 300550e: 31f5 jal ra,30051fa + 3005510: 4785 li a5,1 + 3005512: a201 j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cSpikeFilterTime(handle->handleEx.spikeFilterTime), BASE_STATUS_ERROR); + 3005514: fec42783 lw a5,-20(s0) + 3005518: 4fbc lw a5,88(a5) + 300551a: 853e mv a0,a5 + 300551c: 3bf5 jal ra,3005318 + 300551e: 87aa mv a5,a0 + 3005520: 0017c793 xori a5,a5,1 + 3005524: 9f81 uxtb a5 + 3005526: cb91 beqz a5,300553a + 3005528: 09e00593 li a1,158 + 300552c: 0300f7b7 lui a5,0x300f + 3005530: 1bc78513 addi a0,a5,444 # 300f1bc + 3005534: 31d9 jal ra,30051fa + 3005536: 4785 li a5,1 + 3005538: a8e9 j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cSdaDelayTime(handle->handleEx.sdaDelayTime), BASE_STATUS_ERROR); + 300553a: fec42783 lw a5,-20(s0) + 300553e: 4ffc lw a5,92(a5) + 3005540: 853e mv a0,a5 + 3005542: 3d8d jal ra,30053b4 + 3005544: 87aa mv a5,a0 + 3005546: 0017c793 xori a5,a5,1 + 300554a: 9f81 uxtb a5 + 300554c: cb91 beqz a5,3005560 + 300554e: 09f00593 li a1,159 + 3005552: 0300f7b7 lui a5,0x300f + 3005556: 1bc78513 addi a0,a5,444 # 300f1bc + 300555a: 3145 jal ra,30051fa + 300555c: 4785 li a5,1 + 300555e: a855 j 3005612 + + /* 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) { + 3005560: fec42783 lw a5,-20(s0) + 3005564: 43d8 lw a4,4(a5) + 3005566: 4789 li a5,2 + 3005568: 00f70863 beq a4,a5,3005578 + 300556c: fec42783 lw a5,-20(s0) + 3005570: 43d8 lw a4,4(a5) + 3005572: 478d li a5,3 + 3005574: 08f71e63 bne a4,a5,3005610 + I2C_PARAM_CHECK_WITH_RET(IsI2cOwnAddressOrMask(handle->slaveOwnAddress), BASE_STATUS_ERROR); + 3005578: fec42783 lw a5,-20(s0) + 300557c: 47dc lw a5,12(a5) + 300557e: 853e mv a0,a5 + 3005580: 3b15 jal ra,30052b4 + 3005582: 87aa mv a5,a0 + 3005584: 0017c793 xori a5,a5,1 + 3005588: 9f81 uxtb a5 + 300558a: cb91 beqz a5,300559e + 300558c: 0a300593 li a1,163 + 3005590: 0300f7b7 lui a5,0x300f + 3005594: 1bc78513 addi a0,a5,444 # 300f1bc + 3005598: 318d jal ra,30051fa + 300559a: 4785 li a5,1 + 300559c: a89d j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsI2cGeneralCallMode(handle->generalCallMode), BASE_STATUS_ERROR); + 300559e: fec42783 lw a5,-20(s0) + 30055a2: 4fdc lw a5,28(a5) + 30055a4: 853e mv a0,a5 + 30055a6: 31cd jal ra,3005288 + 30055a8: 87aa mv a5,a0 + 30055aa: 0017c793 xori a5,a5,1 + 30055ae: 9f81 uxtb a5 + 30055b0: cb91 beqz a5,30055c4 + 30055b2: 0a400593 li a1,164 + 30055b6: 0300f7b7 lui a5,0x300f + 30055ba: 1bc78513 addi a0,a5,444 # 300f1bc + 30055be: 3935 jal ra,30051fa + 30055c0: 4785 li a5,1 + 30055c2: a881 j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsXMBusAddressEnable(handle->handleEx.slaveOwnXmbAddressEnable), BASE_STATUS_ERROR); + 30055c4: fec42783 lw a5,-20(s0) + 30055c8: 53bc lw a5,96(a5) + 30055ca: 853e mv a0,a5 + 30055cc: 3305 jal ra,30052ec + 30055ce: 87aa mv a5,a0 + 30055d0: 0017c793 xori a5,a5,1 + 30055d4: 9f81 uxtb a5 + 30055d6: cb91 beqz a5,30055ea + 30055d8: 0a500593 li a1,165 + 30055dc: 0300f7b7 lui a5,0x300f + 30055e0: 1bc78513 addi a0,a5,444 # 300f1bc + 30055e4: 3919 jal ra,30051fa + 30055e6: 4785 li a5,1 + 30055e8: a02d j 3005612 + I2C_PARAM_CHECK_WITH_RET(IsXMBusAddressOrMask(handle->handleEx.slaveOwnXmbAddress), BASE_STATUS_ERROR); + 30055ea: fec42783 lw a5,-20(s0) + 30055ee: 53fc lw a5,100(a5) + 30055f0: 853e mv a0,a5 + 30055f2: 39f9 jal ra,30052d0 + 30055f4: 87aa mv a5,a0 + 30055f6: 0017c793 xori a5,a5,1 + 30055fa: 9f81 uxtb a5 + 30055fc: cb91 beqz a5,3005610 + 30055fe: 0a600593 li a1,166 + 3005602: 0300f7b7 lui a5,0x300f + 3005606: 1bc78513 addi a0,a5,444 # 300f1bc + 300560a: 3ec5 jal ra,30051fa + 300560c: 4785 li a5,1 + 300560e: a011 j 3005612 + } + return BASE_STATUS_OK; + 3005610: 4781 li a5,0 +} + 3005612: 853e mv a0,a5 + 3005614: 40f2 lw ra,28(sp) + 3005616: 4462 lw s0,24(sp) + 3005618: 6105 addi sp,sp,32 + 300561a: 8082 ret + +0300561c : + * @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) +{ + 300561c: 7139 addi sp,sp,-64 + 300561e: de06 sw ra,60(sp) + 3005620: dc22 sw s0,56(sp) + 3005622: 0080 addi s0,sp,64 + 3005624: fca42623 sw a0,-52(s0) + unsigned int tempReg; + unsigned int temp; + unsigned int tempSclLowTime; + unsigned int tempSclHighTime; + + I2C_ASSERT_PARAM(handle != NULL); + 3005628: fcc42783 lw a5,-52(s0) + 300562c: eb89 bnez a5,300563e + 300562e: 4f400593 li a1,1268 + 3005632: 0300f7b7 lui a5,0x300f + 3005636: 1bc78513 addi a0,a5,444 # 300f1bc + 300563a: 36c1 jal ra,30051fa + 300563c: a001 j 300563c + I2C_ASSERT_PARAM(IsI2CInstance(handle->baseAddress)); + 300563e: fcc42783 lw a5,-52(s0) + 3005642: 4398 lw a4,0(a5) + 3005644: 141007b7 lui a5,0x14100 + 3005648: 02f70163 beq a4,a5,300566a + 300564c: fcc42783 lw a5,-52(s0) + 3005650: 4398 lw a4,0(a5) + 3005652: 141017b7 lui a5,0x14101 + 3005656: 00f70a63 beq a4,a5,300566a + 300565a: 4f500593 li a1,1269 + 300565e: 0300f7b7 lui a5,0x300f + 3005662: 1bc78513 addi a0,a5,444 # 300f1bc + 3005666: 3e51 jal ra,30051fa + 3005668: a001 j 3005668 + + clockFreq = HAL_CRG_GetIpFreq((void *)handle->baseAddress); + 300566a: fcc42783 lw a5,-52(s0) + 300566e: 439c lw a5,0(a5) + 3005670: 853e mv a0,a5 + 3005672: eb5fc0ef jal ra,3002526 + 3005676: fea42423 sw a0,-24(s0) + if (CheckAllInitParameters(handle, clockFreq) != BASE_STATUS_OK) { + 300567a: fe842583 lw a1,-24(s0) + 300567e: fcc42503 lw a0,-52(s0) + 3005682: 33b9 jal ra,30053d0 + 3005684: 87aa mv a5,a0 + 3005686: c399 beqz a5,300568c + return BASE_STATUS_ERROR; + 3005688: 4785 li a5,1 + 300568a: a4ad j 30058f4 + } + + handle->state = I2C_STATE_BUSY; + 300568c: fcc42783 lw a5,-52(s0) + 3005690: 4709 li a4,2 + 3005692: c3f8 sw a4,68(a5) + /* Clears interrupts and disables interrupt reporting to facilitate switching between different working modes. */ + handle->baseAddress->I2C_INTR_EN.reg = I2C_INTR_EN_ALL_DISABLE; + 3005694: fcc42783 lw a5,-52(s0) + 3005698: 439c lw a5,0(a5) + 300569a: 0e07a223 sw zero,228(a5) + handle->baseAddress->I2C_INTR_RAW.reg = I2C_INTR_RAW_ALL_ENABLE; + 300569e: fcc42783 lw a5,-52(s0) + 30056a2: 439c lw a5,0(a5) + 30056a4: 01000737 lui a4,0x1000 + 30056a8: 177d addi a4,a4,-1 # ffffff + 30056aa: 0ee7a023 sw a4,224(a5) + + /* Set SDA and SCL glitch filtering time. */ + handle->baseAddress->I2C_FILTER.BIT.spike_filter_time = handle->handleEx.spikeFilterTime; + 30056ae: fcc42783 lw a5,-52(s0) + 30056b2: 4fb4 lw a3,88(a5) + 30056b4: fcc42783 lw a5,-52(s0) + 30056b8: 4398 lw a4,0(a5) + 30056ba: 87b6 mv a5,a3 + 30056bc: 8bbd andi a5,a5,15 + 30056be: 0ff7f693 andi a3,a5,255 + 30056c2: 10c72783 lw a5,268(a4) + 30056c6: 8abd andi a3,a3,15 + 30056c8: 9bc1 andi a5,a5,-16 + 30056ca: 8fd5 or a5,a5,a3 + 30056cc: 10f72623 sw a5,268(a4) + /* Set SCL high and low duratiom time */ + tempSclLowTime = I2C_FREQ_LOW_PARAMTER + handle->handleEx.spikeFilterTime; + 30056d0: fcc42783 lw a5,-52(s0) + 30056d4: 4fbc lw a5,88(a5) + 30056d6: 07a5 addi a5,a5,9 + 30056d8: fef42223 sw a5,-28(s0) + tempSclHighTime = I2C_FREQ_HIGH_PARAMTER + handle->handleEx.spikeFilterTime; + 30056dc: fcc42783 lw a5,-52(s0) + 30056e0: 4fbc lw a5,88(a5) + 30056e2: 07a1 addi a5,a5,8 + 30056e4: fef42023 sw a5,-32(s0) + if (handle->freq <= I2C_STANDARD_FREQ_TH) { + 30056e8: fcc42783 lw a5,-52(s0) + 30056ec: 4bd8 lw a4,20(a5) + 30056ee: 67e1 lui a5,0x18 + 30056f0: 6a078793 addi a5,a5,1696 # 186a0 + 30056f4: 02e7ee63 bltu a5,a4,3005730 + /* 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. */ + 30056f8: fcc42783 lw a5,-52(s0) + 30056fc: 4bdc lw a5,20(a5) + 30056fe: 0786 slli a5,a5,0x1 + 3005700: fe842703 lw a4,-24(s0) + 3005704: 02f75733 divu a4,a4,a5 + 3005708: fe042783 lw a5,-32(s0) + 300570c: 40f707b3 sub a5,a4,a5 + 3005710: fef42623 sw a5,-20(s0) + /* 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); + 3005714: fec42783 lw a5,-20(s0) + 3005718: fff78713 addi a4,a5,-1 + 300571c: 67c1 lui a5,0x10 + 300571e: 17fd addi a5,a5,-1 # ffff + 3005720: 8f7d and a4,a4,a5 + 3005722: fec42783 lw a5,-20(s0) + 3005726: 07c2 slli a5,a5,0x10 + 3005728: 8fd9 or a5,a5,a4 + 300572a: fef42623 sw a5,-20(s0) + 300572e: a8b9 j 300578c + } 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; + 3005730: fe842703 lw a4,-24(s0) + 3005734: 06400793 li a5,100 + 3005738: 02f75733 divu a4,a4,a5 + 300573c: 02400793 li a5,36 + 3005740: 02f70733 mul a4,a4,a5 + 3005744: fcc42783 lw a5,-52(s0) + 3005748: 4bdc lw a5,20(a5) + 300574a: 02f75733 divu a4,a4,a5 + 300574e: fe042783 lw a5,-32(s0) + 3005752: 40f707b3 sub a5,a4,a5 + 3005756: 07c2 slli a5,a5,0x10 + 3005758: fef42623 sw a5,-20(s0) + /* 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); + 300575c: fe842703 lw a4,-24(s0) + 3005760: 06400793 li a5,100 + 3005764: 02f757b3 divu a5,a4,a5 + 3005768: 00679713 slli a4,a5,0x6 + 300576c: fcc42783 lw a5,-52(s0) + 3005770: 4bdc lw a5,20(a5) + 3005772: 02f75733 divu a4,a4,a5 + 3005776: fe442783 lw a5,-28(s0) + 300577a: 8f1d sub a4,a4,a5 + 300577c: 67c1 lui a5,0x10 + 300577e: 17fd addi a5,a5,-1 # ffff + 3005780: 8ff9 and a5,a5,a4 + 3005782: fec42703 lw a4,-20(s0) + 3005786: 8fd9 or a5,a5,a4 + 3005788: fef42623 sw a5,-20(s0) + } + handle->baseAddress->I2C_SCL_CFG.reg = val; + 300578c: fcc42783 lw a5,-52(s0) + 3005790: 439c lw a5,0(a5) + 3005792: fec42703 lw a4,-20(s0) + 3005796: c3d8 sw a4,4(a5) + + /* Set sda hold duration.The value is fixed to 0xa */ + temp = ((handle->sdaHoldTime & 0x0000FFFF) << I2C_SDA_HOLD_DURATION_POS); + 3005798: fcc42783 lw a5,-52(s0) + 300579c: 4b9c lw a5,16(a5) + 300579e: 07c2 slli a5,a5,0x10 + 30057a0: fcf42e23 sw a5,-36(s0) + tempReg = (handle->handleEx.sdaDelayTime & 0x0000000F) | temp; + 30057a4: fcc42783 lw a5,-52(s0) + 30057a8: 4ffc lw a5,92(a5) + 30057aa: 8bbd andi a5,a5,15 + 30057ac: fdc42703 lw a4,-36(s0) + 30057b0: 8fd9 or a5,a5,a4 + 30057b2: fcf42c23 sw a5,-40(s0) + handle->baseAddress->I2C_SDA_CFG.reg = tempReg; + 30057b6: fcc42783 lw a5,-52(s0) + 30057ba: 439c lw a5,0(a5) + 30057bc: fd842703 lw a4,-40(s0) + 30057c0: c798 sw a4,8(a5) + + /* Set I2C TX FIFO watermark */ + handle->baseAddress->I2C_TX_WATERMARK.BIT.tx_watermark = handle->txWaterMark; + 30057c2: fcc42783 lw a5,-52(s0) + 30057c6: 5bd4 lw a3,52(a5) + 30057c8: fcc42783 lw a5,-52(s0) + 30057cc: 4398 lw a4,0(a5) + 30057ce: 87b6 mv a5,a3 + 30057d0: 8bbd andi a5,a5,15 + 30057d2: 0ff7f693 andi a3,a5,255 + 30057d6: 0c872783 lw a5,200(a4) + 30057da: 8abd andi a3,a3,15 + 30057dc: 9bc1 andi a5,a5,-16 + 30057de: 8fd5 or a5,a5,a3 + 30057e0: 0cf72423 sw a5,200(a4) + /* Set I2C RX FIFO watermark */ + handle->baseAddress->I2C_RX_WATERMARK.BIT.rx_watermark = handle->rxWaterMark; + 30057e4: fcc42783 lw a5,-52(s0) + 30057e8: 5b94 lw a3,48(a5) + 30057ea: fcc42783 lw a5,-52(s0) + 30057ee: 4398 lw a4,0(a5) + 30057f0: 87b6 mv a5,a3 + 30057f2: 8bbd andi a5,a5,15 + 30057f4: 0ff7f693 andi a3,a5,255 + 30057f8: 0cc72783 lw a5,204(a4) + 30057fc: 8abd andi a3,a3,15 + 30057fe: 9bc1 andi a5,a5,-16 + 3005800: 8fd5 or a5,a5,a3 + 3005802: 0cf72623 sw a5,204(a4) + handle->baseAddress->I2C_MODE.BIT.mst_slv_function = handle->functionMode; + 3005806: fcc42783 lw a5,-52(s0) + 300580a: 43d4 lw a3,4(a5) + 300580c: fcc42783 lw a5,-52(s0) + 3005810: 4398 lw a4,0(a5) + 3005812: 87b6 mv a5,a3 + 3005814: 8b8d andi a5,a5,3 + 3005816: 0ff7f693 andi a3,a5,255 + 300581a: 431c lw a5,0(a4) + 300581c: 8a8d andi a3,a3,3 + 300581e: 9bf1 andi a5,a5,-4 + 3005820: 8fd5 or a5,a5,a3 + 3005822: c31c sw a5,0(a4) + handle->baseAddress->I2C_MODE.BIT.rack_mode = handle->ignoreAckFlag; + 3005824: fcc42783 lw a5,-52(s0) + 3005828: 4f94 lw a3,24(a5) + 300582a: fcc42783 lw a5,-52(s0) + 300582e: 4398 lw a4,0(a5) + 3005830: 87b6 mv a5,a3 + 3005832: 8b85 andi a5,a5,1 + 3005834: 0ff7f693 andi a3,a5,255 + 3005838: 431c lw a5,0(a4) + 300583a: 8a85 andi a3,a3,1 + 300583c: 0692 slli a3,a3,0x4 + 300583e: 9bbd andi a5,a5,-17 + 3005840: 8fd5 or a5,a5,a3 + 3005842: c31c sw a5,0(a4) + + if (handle->functionMode == I2C_MODE_SELECT_SLAVE_ONLY || handle->functionMode == I2C_MODE_SELECT_MASTER_SLAVE) { + 3005844: fcc42783 lw a5,-52(s0) + 3005848: 43d8 lw a4,4(a5) + 300584a: 4789 li a5,2 + 300584c: 00f70863 beq a4,a5,300585c + 3005850: fcc42783 lw a5,-52(s0) + 3005854: 43d8 lw a4,4(a5) + 3005856: 478d li a5,3 + 3005858: 08f71963 bne a4,a5,30058ea + /* Sets the first own address of the slave. */ + handle->baseAddress->I2C_OWN_ADDR.BIT.own_address = handle->slaveOwnAddress; + 300585c: fcc42783 lw a5,-52(s0) + 3005860: 47d4 lw a3,12(a5) + 3005862: fcc42783 lw a5,-52(s0) + 3005866: 4398 lw a4,0(a5) + 3005868: 87b6 mv a5,a3 + 300586a: 3ff7f793 andi a5,a5,1023 + 300586e: 01079693 slli a3,a5,0x10 + 3005872: 82c1 srli a3,a3,0x10 + 3005874: 475c lw a5,12(a4) + 3005876: 3ff6f693 andi a3,a3,1023 + 300587a: c007f793 andi a5,a5,-1024 + 300587e: 8fd5 or a5,a5,a3 + 3005880: c75c sw a5,12(a4) + handle->baseAddress->I2C_OWN_ADDR.BIT.i2c_general_call_en = handle->generalCallMode; + 3005882: fcc42783 lw a5,-52(s0) + 3005886: 4fd4 lw a3,28(a5) + 3005888: fcc42783 lw a5,-52(s0) + 300588c: 4398 lw a4,0(a5) + 300588e: 87b6 mv a5,a3 + 3005890: 8b85 andi a5,a5,1 + 3005892: 0ff7f693 andi a3,a5,255 + 3005896: 475c lw a5,12(a4) + 3005898: 8a85 andi a3,a3,1 + 300589a: 06e2 slli a3,a3,0x18 + 300589c: ff000637 lui a2,0xff000 + 30058a0: 167d addi a2,a2,-1 # feffffff + 30058a2: 8ff1 and a5,a5,a2 + 30058a4: 8fd5 or a5,a5,a3 + 30058a6: c75c sw a5,12(a4) + /* Sets the second own address of the slave. */ + if (handle->handleEx.slaveOwnXmbAddressEnable == BASE_CFG_ENABLE) { + 30058a8: fcc42783 lw a5,-52(s0) + 30058ac: 53b8 lw a4,96(a5) + 30058ae: 4785 li a5,1 + 30058b0: 02f71d63 bne a4,a5,30058ea + handle->baseAddress->XMB_DEV_ADDR.BIT.xmb_address_en = BASE_CFG_ENABLE; + 30058b4: fcc42783 lw a5,-52(s0) + 30058b8: 4398 lw a4,0(a5) + 30058ba: 4b1c lw a5,16(a4) + 30058bc: 004006b7 lui a3,0x400 + 30058c0: 8fd5 or a5,a5,a3 + 30058c2: cb1c sw a5,16(a4) + handle->baseAddress->XMB_DEV_ADDR.BIT.xmb_address = handle->handleEx.slaveOwnXmbAddress; + 30058c4: fcc42783 lw a5,-52(s0) + 30058c8: 53f4 lw a3,100(a5) + 30058ca: fcc42783 lw a5,-52(s0) + 30058ce: 4398 lw a4,0(a5) + 30058d0: 87b6 mv a5,a3 + 30058d2: 3ff7f793 andi a5,a5,1023 + 30058d6: 01079693 slli a3,a5,0x10 + 30058da: 82c1 srli a3,a3,0x10 + 30058dc: 4b1c lw a5,16(a4) + 30058de: 3ff6f693 andi a3,a3,1023 + 30058e2: c007f793 andi a5,a5,-1024 + 30058e6: 8fd5 or a5,a5,a3 + 30058e8: cb1c sw a5,16(a4) + } + } + handle->state = I2C_STATE_READY; + 30058ea: fcc42783 lw a5,-52(s0) + 30058ee: 4705 li a4,1 + 30058f0: c3f8 sw a4,68(a5) + return BASE_STATUS_OK; + 30058f2: 4781 li a5,0 +} + 30058f4: 853e mv a0,a5 + 30058f6: 50f2 lw ra,60(sp) + 30058f8: 5462 lw s0,56(sp) + 30058fa: 6121 addi sp,sp,64 + 30058fc: 8082 ret + +030058fe : + * @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) +{ + 30058fe: 1101 addi sp,sp,-32 + 3005900: ce06 sw ra,28(sp) + 3005902: cc22 sw s0,24(sp) + 3005904: 1000 addi s0,sp,32 + 3005906: fea42623 sw a0,-20(s0) + 300590a: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 300590e: fec42703 lw a4,-20(s0) + 3005912: 77c1 lui a5,0xffff0 + 3005914: 8f7d and a4,a4,a5 + 3005916: 147f07b7 lui a5,0x147f0 + 300591a: 00f70a63 beq a4,a5,300592e + 300591e: 08b00593 li a1,139 + 3005922: 0300f7b7 lui a5,0x300f + 3005926: 1d878513 addi a0,a5,472 # 300f1d8 + 300592a: 2df1 jal ra,3006006 + 300592c: a001 j 300592c + iocmgRegx->reg = regValue; + 300592e: fec42783 lw a5,-20(s0) + 3005932: fe842703 lw a4,-24(s0) + 3005936: c398 sw a4,0(a5) +} + 3005938: 0001 nop + 300593a: 40f2 lw ra,28(sp) + 300593c: 4462 lw s0,24(sp) + 300593e: 6105 addi sp,sp,32 + 3005940: 8082 ret + +03005942 : + * @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) +{ + 3005942: 1101 addi sp,sp,-32 + 3005944: ce06 sw ra,28(sp) + 3005946: cc22 sw s0,24(sp) + 3005948: 1000 addi s0,sp,32 + 300594a: fea42623 sw a0,-20(s0) + 300594e: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005952: fec42703 lw a4,-20(s0) + 3005956: 77c1 lui a5,0xffff0 + 3005958: 8f7d and a4,a4,a5 + 300595a: 147f07b7 lui a5,0x147f0 + 300595e: 00f70a63 beq a4,a5,3005972 + 3005962: 0ba00593 li a1,186 + 3005966: 0300f7b7 lui a5,0x300f + 300596a: 1d878513 addi a0,a5,472 # 300f1d8 + 300596e: 2d61 jal ra,3006006 + 3005970: a001 j 3005970 + IOCMG_PARAM_CHECK_NO_RET(driveRate < DRIVER_RATE_MAX && driveRate >= DRIVER_RATE_4); + 3005972: fe842703 lw a4,-24(s0) + 3005976: 478d li a5,3 + 3005978: 00e7fa63 bgeu a5,a4,300598c + 300597c: 0bb00593 li a1,187 + 3005980: 0300f7b7 lui a5,0x300f + 3005984: 1d878513 addi a0,a5,472 # 300f1d8 + 3005988: 2dbd jal ra,3006006 + 300598a: a839 j 30059a8 + iocmgRegx->BIT.ds = driveRate; + 300598c: fe842783 lw a5,-24(s0) + 3005990: 8b8d andi a5,a5,3 + 3005992: 0ff7f693 andi a3,a5,255 + 3005996: fec42703 lw a4,-20(s0) + 300599a: 431c lw a5,0(a4) + 300599c: 8a8d andi a3,a3,3 + 300599e: 0692 slli a3,a3,0x4 + 30059a0: fcf7f793 andi a5,a5,-49 + 30059a4: 8fd5 or a5,a5,a3 + 30059a6: c31c sw a5,0(a4) +} + 30059a8: 40f2 lw ra,28(sp) + 30059aa: 4462 lw s0,24(sp) + 30059ac: 6105 addi sp,sp,32 + 30059ae: 8082 ret + +030059b0 : + * @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) +{ + 30059b0: 1101 addi sp,sp,-32 + 30059b2: ce06 sw ra,28(sp) + 30059b4: cc22 sw s0,24(sp) + 30059b6: 1000 addi s0,sp,32 + 30059b8: fea42623 sw a0,-20(s0) + 30059bc: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 30059c0: fec42703 lw a4,-20(s0) + 30059c4: 77c1 lui a5,0xffff0 + 30059c6: 8f7d and a4,a4,a5 + 30059c8: 147f07b7 lui a5,0x147f0 + 30059cc: 00f70a63 beq a4,a5,30059e0 + 30059d0: 0d200593 li a1,210 + 30059d4: 0300f7b7 lui a5,0x300f + 30059d8: 1d878513 addi a0,a5,472 # 300f1d8 + 30059dc: 252d jal ra,3006006 + 30059de: a001 j 30059de + IOCMG_PARAM_CHECK_NO_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE); + 30059e0: fe842703 lw a4,-24(s0) + 30059e4: 478d li a5,3 + 30059e6: 00e7fa63 bgeu a5,a4,30059fa + 30059ea: 0d300593 li a1,211 + 30059ee: 0300f7b7 lui a5,0x300f + 30059f2: 1d878513 addi a0,a5,472 # 300f1d8 + 30059f6: 2d01 jal ra,3006006 + 30059f8: a835 j 3005a34 + iocmgRegx->BIT.pu = (pullMode & 0x02) >> 1; /* 10b: pull up mode */ + 30059fa: fe842783 lw a5,-24(s0) + 30059fe: 8385 srli a5,a5,0x1 + 3005a00: 8b85 andi a5,a5,1 + 3005a02: 0ff7f693 andi a3,a5,255 + 3005a06: fec42703 lw a4,-20(s0) + 3005a0a: 431c lw a5,0(a4) + 3005a0c: 8a85 andi a3,a3,1 + 3005a0e: 06a2 slli a3,a3,0x8 + 3005a10: eff7f793 andi a5,a5,-257 + 3005a14: 8fd5 or a5,a5,a3 + 3005a16: c31c sw a5,0(a4) + iocmgRegx->BIT.pd = pullMode & 0x01; /* 01b: pull down mode */ + 3005a18: fe842783 lw a5,-24(s0) + 3005a1c: 8b85 andi a5,a5,1 + 3005a1e: 0ff7f693 andi a3,a5,255 + 3005a22: fec42703 lw a4,-20(s0) + 3005a26: 431c lw a5,0(a4) + 3005a28: 8a85 andi a3,a3,1 + 3005a2a: 069e slli a3,a3,0x7 + 3005a2c: f7f7f793 andi a5,a5,-129 + 3005a30: 8fd5 or a5,a5,a3 + 3005a32: c31c sw a5,0(a4) +} + 3005a34: 40f2 lw ra,28(sp) + 3005a36: 4462 lw s0,24(sp) + 3005a38: 6105 addi sp,sp,32 + 3005a3a: 8082 ret + +03005a3c : + * @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) +{ + 3005a3c: 1101 addi sp,sp,-32 + 3005a3e: ce06 sw ra,28(sp) + 3005a40: cc22 sw s0,24(sp) + 3005a42: 1000 addi s0,sp,32 + 3005a44: fea42623 sw a0,-20(s0) + 3005a48: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005a4c: fec42703 lw a4,-20(s0) + 3005a50: 77c1 lui a5,0xffff0 + 3005a52: 8f7d and a4,a4,a5 + 3005a54: 147f07b7 lui a5,0x147f0 + 3005a58: 00f70a63 beq a4,a5,3005a6c + 3005a5c: 0ed00593 li a1,237 + 3005a60: 0300f7b7 lui a5,0x300f + 3005a64: 1d878513 addi a0,a5,472 # 300f1d8 + 3005a68: 2b79 jal ra,3006006 + 3005a6a: a001 j 3005a6a + IOCMG_PARAM_CHECK_NO_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX && levelShiftRate >= LEVEL_SHIFT_RATE_FAST); + 3005a6c: fe842703 lw a4,-24(s0) + 3005a70: 4785 li a5,1 + 3005a72: 00e7fa63 bgeu a5,a4,3005a86 + 3005a76: 0ee00593 li a1,238 + 3005a7a: 0300f7b7 lui a5,0x300f + 3005a7e: 1d878513 addi a0,a5,472 # 300f1d8 + 3005a82: 2351 jal ra,3006006 + 3005a84: a839 j 3005aa2 + iocmgRegx->BIT.sr = levelShiftRate; + 3005a86: fe842783 lw a5,-24(s0) + 3005a8a: 8b85 andi a5,a5,1 + 3005a8c: 0ff7f693 andi a3,a5,255 + 3005a90: fec42703 lw a4,-20(s0) + 3005a94: 431c lw a5,0(a4) + 3005a96: 8a85 andi a3,a3,1 + 3005a98: 06a6 slli a3,a3,0x9 + 3005a9a: dff7f793 andi a5,a5,-513 + 3005a9e: 8fd5 or a5,a5,a3 + 3005aa0: c31c sw a5,0(a4) +} + 3005aa2: 40f2 lw ra,28(sp) + 3005aa4: 4462 lw s0,24(sp) + 3005aa6: 6105 addi sp,sp,32 + 3005aa8: 8082 ret + +03005aaa : + * @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) +{ + 3005aaa: 1101 addi sp,sp,-32 + 3005aac: ce06 sw ra,28(sp) + 3005aae: cc22 sw s0,24(sp) + 3005ab0: 1000 addi s0,sp,32 + 3005ab2: fea42623 sw a0,-20(s0) + 3005ab6: feb42423 sw a1,-24(s0) + IOCMG_ASSERT_PARAM(IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegx & IOCMG_BASE_ADDR_MASK))); + 3005aba: fec42703 lw a4,-20(s0) + 3005abe: 77c1 lui a5,0xffff0 + 3005ac0: 8f7d and a4,a4,a5 + 3005ac2: 147f07b7 lui a5,0x147f0 + 3005ac6: 00f70a63 beq a4,a5,3005ada + 3005aca: 10500593 li a1,261 + 3005ace: 0300f7b7 lui a5,0x300f + 3005ad2: 1d878513 addi a0,a5,472 # 300f1d8 + 3005ad6: 2b05 jal ra,3006006 + 3005ad8: a001 j 3005ad8 + IOCMG_PARAM_CHECK_NO_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE); + 3005ada: fe842703 lw a4,-24(s0) + 3005ade: 4785 li a5,1 + 3005ae0: 00e7fa63 bgeu a5,a4,3005af4 + 3005ae4: 10600593 li a1,262 + 3005ae8: 0300f7b7 lui a5,0x300f + 3005aec: 1d878513 addi a0,a5,472 # 300f1d8 + 3005af0: 2b19 jal ra,3006006 + 3005af2: a839 j 3005b10 + iocmgRegx->BIT.se = schmidtMode; + 3005af4: fe842783 lw a5,-24(s0) + 3005af8: 8b85 andi a5,a5,1 + 3005afa: 0ff7f693 andi a3,a5,255 + 3005afe: fec42703 lw a4,-20(s0) + 3005b02: 431c lw a5,0(a4) + 3005b04: 8a85 andi a3,a3,1 + 3005b06: 06aa slli a3,a3,0xa + 3005b08: bff7f793 andi a5,a5,-1025 + 3005b0c: 8fd5 or a5,a5,a3 + 3005b0e: c31c sw a5,0(a4) +} + 3005b10: 40f2 lw ra,28(sp) + 3005b12: 4462 lw s0,24(sp) + 3005b14: 6105 addi sp,sp,32 + 3005b16: 8082 ret + +03005b18 : + * @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) +{ + 3005b18: 7179 addi sp,sp,-48 + 3005b1a: d622 sw s0,44(sp) + 3005b1c: 1800 addi s0,sp,48 + 3005b1e: 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; + 3005b22: 147f07b7 lui a5,0x147f0 + 3005b26: fef42623 sw a5,-20(s0) + unsigned int iocmgRegOffsetAddrValue = (pinTypedef >> 16) & 0x00000FFF; /* 16 : shift 16 bit */ + 3005b2a: fdc42783 lw a5,-36(s0) + 3005b2e: 0107d713 srli a4,a5,0x10 + 3005b32: 6785 lui a5,0x1 + 3005b34: 17fd addi a5,a5,-1 # fff + 3005b36: 8ff9 and a5,a5,a4 + 3005b38: fef42423 sw a5,-24(s0) + IOCMG_REG* iocmgRegxAddr = (IOCMG_REG*)(void*)(iocmgBaseAddrValue + iocmgRegOffsetAddrValue); + 3005b3c: fec42703 lw a4,-20(s0) + 3005b40: fe842783 lw a5,-24(s0) + 3005b44: 97ba add a5,a5,a4 + 3005b46: fef42223 sw a5,-28(s0) + if (!IsIOCMGInstance((void *)((uintptr_t)(void *)iocmgRegxAddr & IOCMG_BASE_ADDR_MASK))) { + 3005b4a: fe442703 lw a4,-28(s0) + 3005b4e: 77c1 lui a5,0xffff0 + 3005b50: 8f7d and a4,a4,a5 + 3005b52: 147f07b7 lui a5,0x147f0 + 3005b56: 00f70463 beq a4,a5,3005b5e + return NULL; + 3005b5a: 4781 li a5,0 + 3005b5c: a019 j 3005b62 + } + return iocmgRegxAddr; + 3005b5e: fe442783 lw a5,-28(s0) +} + 3005b62: 853e mv a0,a5 + 3005b64: 5432 lw s0,44(sp) + 3005b66: 6145 addi sp,sp,48 + 3005b68: 8082 ret + +03005b6a : + * @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) +{ + 3005b6a: 7179 addi sp,sp,-48 + 3005b6c: d606 sw ra,44(sp) + 3005b6e: d422 sw s0,40(sp) + 3005b70: 1800 addi s0,sp,48 + 3005b72: fca42e23 sw a0,-36(s0) + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005b76: fdc42503 lw a0,-36(s0) + 3005b7a: 3f79 jal ra,3005b18 + 3005b7c: fea42623 sw a0,-20(s0) + /* get iocmg reg default value */ + unsigned int regValue = pinTypedef & IOCMG_REG_VALUE_MASK; + 3005b80: fdc42703 lw a4,-36(s0) + 3005b84: 67c1 lui a5,0x10 + 3005b86: 17fd addi a5,a5,-1 # ffff + 3005b88: 8ff9 and a5,a5,a4 + 3005b8a: fef42423 sw a5,-24(s0) + DCL_IOCMG_SetRegValue(iocmgRegx, regValue); + 3005b8e: fe842583 lw a1,-24(s0) + 3005b92: fec42503 lw a0,-20(s0) + 3005b96: 33a5 jal ra,30058fe + return IOCMG_STATUS_OK; + 3005b98: 4781 li a5,0 +} + 3005b9a: 853e mv a0,a5 + 3005b9c: 50b2 lw ra,44(sp) + 3005b9e: 5422 lw s0,40(sp) + 3005ba0: 6145 addi sp,sp,48 + 3005ba2: 8082 ret + +03005ba4 : + * @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) +{ + 3005ba4: 7179 addi sp,sp,-48 + 3005ba6: d606 sw ra,44(sp) + 3005ba8: d422 sw s0,40(sp) + 3005baa: 1800 addi s0,sp,48 + 3005bac: fca42e23 sw a0,-36(s0) + 3005bb0: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(pullMode < PULL_MODE_MAX && pullMode >= PULL_NONE, IOCMG_PARAM_ERROR); + 3005bb4: fd842703 lw a4,-40(s0) + 3005bb8: 478d li a5,3 + 3005bba: 00e7fb63 bgeu a5,a4,3005bd0 + 3005bbe: 07800593 li a1,120 + 3005bc2: 0300f7b7 lui a5,0x300f + 3005bc6: 1f878513 addi a0,a5,504 # 300f1f8 + 3005bca: 2935 jal ra,3006006 + 3005bcc: 4791 li a5,4 + 3005bce: a821 j 3005be6 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005bd0: fdc42503 lw a0,-36(s0) + 3005bd4: 3791 jal ra,3005b18 + 3005bd6: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetPullMode(iocmgRegx, pullMode); + 3005bda: fd842583 lw a1,-40(s0) + 3005bde: fec42503 lw a0,-20(s0) + 3005be2: 33f9 jal ra,30059b0 + return IOCMG_STATUS_OK; + 3005be4: 4781 li a5,0 +} + 3005be6: 853e mv a0,a5 + 3005be8: 50b2 lw ra,44(sp) + 3005bea: 5422 lw s0,40(sp) + 3005bec: 6145 addi sp,sp,48 + 3005bee: 8082 ret + +03005bf0 : + * @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) +{ + 3005bf0: 7179 addi sp,sp,-48 + 3005bf2: d606 sw ra,44(sp) + 3005bf4: d422 sw s0,40(sp) + 3005bf6: 1800 addi s0,sp,48 + 3005bf8: fca42e23 sw a0,-36(s0) + 3005bfc: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(schmidtMode <= SCHMIDT_ENABLE && schmidtMode >= SCHMIDT_DISABLE, IOCMG_PARAM_ERROR); + 3005c00: fd842703 lw a4,-40(s0) + 3005c04: 4785 li a5,1 + 3005c06: 00e7fb63 bgeu a5,a4,3005c1c + 3005c0a: 09300593 li a1,147 + 3005c0e: 0300f7b7 lui a5,0x300f + 3005c12: 1f878513 addi a0,a5,504 # 300f1f8 + 3005c16: 2ec5 jal ra,3006006 + 3005c18: 4791 li a5,4 + 3005c1a: a821 j 3005c32 + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005c1c: fdc42503 lw a0,-36(s0) + 3005c20: 3de5 jal ra,3005b18 + 3005c22: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetSchmidtMode(iocmgRegx, schmidtMode); + 3005c26: fd842583 lw a1,-40(s0) + 3005c2a: fec42503 lw a0,-20(s0) + 3005c2e: 3db5 jal ra,3005aaa + return IOCMG_STATUS_OK; + 3005c30: 4781 li a5,0 +} + 3005c32: 853e mv a0,a5 + 3005c34: 50b2 lw ra,44(sp) + 3005c36: 5422 lw s0,40(sp) + 3005c38: 6145 addi sp,sp,48 + 3005c3a: 8082 ret + +03005c3c : + * @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) +{ + 3005c3c: 7179 addi sp,sp,-48 + 3005c3e: d606 sw ra,44(sp) + 3005c40: d422 sw s0,40(sp) + 3005c42: 1800 addi s0,sp,48 + 3005c44: fca42e23 sw a0,-36(s0) + 3005c48: fcb42c23 sw a1,-40(s0) + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate < LEVEL_SHIFT_RATE_MAX, IOCMG_PARAM_ERROR); + 3005c4c: fd842703 lw a4,-40(s0) + 3005c50: 4785 li a5,1 + 3005c52: 00e7fb63 bgeu a5,a4,3005c68 + 3005c56: 0ae00593 li a1,174 + 3005c5a: 0300f7b7 lui a5,0x300f + 3005c5e: 1f878513 addi a0,a5,504 # 300f1f8 + 3005c62: 2655 jal ra,3006006 + 3005c64: 4791 li a5,4 + 3005c66: a821 j 3005c7e + IOCMG_PARAM_CHECK_WITH_RET(levelShiftRate >= LEVEL_SHIFT_RATE_FAST, IOCMG_PARAM_ERROR); + /* get iocmg reg address */ + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005c68: fdc42503 lw a0,-36(s0) + 3005c6c: 3575 jal ra,3005b18 + 3005c6e: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetLevelShiftRate(iocmgRegx, levelShiftRate); + 3005c72: fd842583 lw a1,-40(s0) + 3005c76: fec42503 lw a0,-20(s0) + 3005c7a: 33c9 jal ra,3005a3c + return IOCMG_STATUS_OK; + 3005c7c: 4781 li a5,0 +} + 3005c7e: 853e mv a0,a5 + 3005c80: 50b2 lw ra,44(sp) + 3005c82: 5422 lw s0,40(sp) + 3005c84: 6145 addi sp,sp,48 + 3005c86: 8082 ret + +03005c88 : + * @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) +{ + 3005c88: 7179 addi sp,sp,-48 + 3005c8a: d606 sw ra,44(sp) + 3005c8c: d422 sw s0,40(sp) + 3005c8e: 1800 addi s0,sp,48 + 3005c90: fca42e23 sw a0,-36(s0) + 3005c94: 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); + 3005c98: fd842703 lw a4,-40(s0) + 3005c9c: 478d li a5,3 + 3005c9e: 00e7fb63 bgeu a5,a4,3005cb4 + 3005ca2: 0cb00593 li a1,203 + 3005ca6: 0300f7b7 lui a5,0x300f + 3005caa: 1f878513 addi a0,a5,504 # 300f1f8 + 3005cae: 2ea1 jal ra,3006006 + 3005cb0: 4791 li a5,4 + 3005cb2: a821 j 3005cca + IOCMG_REG* iocmgRegx = IOCMG_GetRegAddr(pinTypedef); + 3005cb4: fdc42503 lw a0,-36(s0) + 3005cb8: 3585 jal ra,3005b18 + 3005cba: fea42623 sw a0,-20(s0) + DCL_IOCMG_SetDriveRate(iocmgRegx, driveRate); + 3005cbe: fd842583 lw a1,-40(s0) + 3005cc2: fec42503 lw a0,-20(s0) + 3005cc6: 39b5 jal ra,3005942 + return IOCMG_STATUS_OK; + 3005cc8: 4781 li a5,0 +} + 3005cca: 853e mv a0,a5 + 3005ccc: 50b2 lw ra,44(sp) + 3005cce: 5422 lw s0,40(sp) + 3005cd0: 6145 addi sp,sp,48 + 3005cd2: 8082 ret + +03005cd4 : + * @param mode Timer Mode, @ref TIMER_Mode + * @retval true + * @retval false + */ +static inline bool IsTimerMode(TIMER_Mode mode) +{ + 3005cd4: 1101 addi sp,sp,-32 + 3005cd6: ce22 sw s0,28(sp) + 3005cd8: 1000 addi s0,sp,32 + 3005cda: fea42623 sw a0,-20(s0) + return (((mode) == TIMER_MODE_RUN_FREE) || + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005cde: fec42783 lw a5,-20(s0) + 3005ce2: cb99 beqz a5,3005cf8 + return (((mode) == TIMER_MODE_RUN_FREE) || + 3005ce4: fec42703 lw a4,-20(s0) + 3005ce8: 4785 li a5,1 + 3005cea: 00f70763 beq a4,a5,3005cf8 + ((mode) == TIMER_MODE_RUN_PERIODIC) || + 3005cee: fec42703 lw a4,-20(s0) + 3005cf2: 4789 li a5,2 + 3005cf4: 00f71463 bne a4,a5,3005cfc + 3005cf8: 4785 li a5,1 + 3005cfa: a011 j 3005cfe + 3005cfc: 4781 li a5,0 + 3005cfe: 8b85 andi a5,a5,1 + 3005d00: 9f81 uxtb a5 + ((mode) == TIMER_MODE_RUN_ONTSHOT)); +} + 3005d02: 853e mv a0,a5 + 3005d04: 4472 lw s0,28(sp) + 3005d06: 6105 addi sp,sp,32 + 3005d08: 8082 ret + +03005d0a : + * @param mode Timer Interrupt Type, @ref TIMER_InterruptType + * @retval true + * @retval false + */ +static inline bool IsTimerInterruptType(TIMER_InterruptType interruptType) +{ + 3005d0a: 1101 addi sp,sp,-32 + 3005d0c: ce22 sw s0,28(sp) + 3005d0e: 1000 addi s0,sp,32 + 3005d10: fea42623 sw a0,-20(s0) + return (((interruptType) == TIMER_PERIOD_FIN) || + 3005d14: fec42783 lw a5,-20(s0) + 3005d18: c791 beqz a5,3005d24 + 3005d1a: fec42703 lw a4,-20(s0) + 3005d1e: 4785 li a5,1 + 3005d20: 00f71463 bne a4,a5,3005d28 + 3005d24: 4785 li a5,1 + 3005d26: a011 j 3005d2a + 3005d28: 4781 li a5,0 + 3005d2a: 8b85 andi a5,a5,1 + 3005d2c: 9f81 uxtb a5 + ((interruptType) == TIMER_OVER_FLOW)); +} + 3005d2e: 853e mv a0,a5 + 3005d30: 4472 lw s0,28(sp) + 3005d32: 6105 addi sp,sp,32 + 3005d34: 8082 ret + +03005d36 : + * @param size Timer Size, @ref TIMER_Size + * @retval true + * @retval false + */ +static inline bool IsTimerSize(TIMER_Size size) +{ + 3005d36: 1101 addi sp,sp,-32 + 3005d38: ce22 sw s0,28(sp) + 3005d3a: 1000 addi s0,sp,32 + 3005d3c: fea42623 sw a0,-20(s0) + return (((size) == TIMER_SIZE_16BIT) || + 3005d40: fec42783 lw a5,-20(s0) + 3005d44: c791 beqz a5,3005d50 + 3005d46: fec42703 lw a4,-20(s0) + 3005d4a: 4785 li a5,1 + 3005d4c: 00f71463 bne a4,a5,3005d54 + 3005d50: 4785 li a5,1 + 3005d52: a011 j 3005d56 + 3005d54: 4781 li a5,0 + 3005d56: 8b85 andi a5,a5,1 + 3005d58: 9f81 uxtb a5 + ((size) == TIMER_SIZE_32BIT)); +} + 3005d5a: 853e mv a0,a5 + 3005d5c: 4472 lw s0,28(sp) + 3005d5e: 6105 addi sp,sp,32 + 3005d60: 8082 ret + +03005d62 : + * @param period + * @retval true + * @retval false + */ +static inline bool IsTimerPeriod(unsigned int period) +{ + 3005d62: 1101 addi sp,sp,-32 + 3005d64: ce22 sw s0,28(sp) + 3005d66: 1000 addi s0,sp,32 + 3005d68: fea42623 sw a0,-20(s0) + return ((period) >= PERIOD_MIN_VALUE); + 3005d6c: fec42783 lw a5,-20(s0) + 3005d70: 00f037b3 snez a5,a5 + 3005d74: 9f81 uxtb a5 +} + 3005d76: 853e mv a0,a5 + 3005d78: 4472 lw s0,28(sp) + 3005d7a: 6105 addi sp,sp,32 + 3005d7c: 8082 ret + +03005d7e : + * @param div @see TIMER_PrescalerFactor + * @retval true + * @retval false + */ +static inline bool IsTimerDiv(TIMER_PrescalerFactor div) +{ + 3005d7e: 1101 addi sp,sp,-32 + 3005d80: ce22 sw s0,28(sp) + 3005d82: 1000 addi s0,sp,32 + 3005d84: fea42623 sw a0,-20(s0) + return (((div) == TIMERPRESCALER_NO_DIV) || + ((div) == TIMERPRESCALER_DIV_16) || + 3005d88: fec42783 lw a5,-20(s0) + 3005d8c: cb99 beqz a5,3005da2 + return (((div) == TIMERPRESCALER_NO_DIV) || + 3005d8e: fec42703 lw a4,-20(s0) + 3005d92: 4785 li a5,1 + 3005d94: 00f70763 beq a4,a5,3005da2 + ((div) == TIMERPRESCALER_DIV_16) || + 3005d98: fec42703 lw a4,-20(s0) + 3005d9c: 4789 li a5,2 + 3005d9e: 00f71463 bne a4,a5,3005da6 + 3005da2: 4785 li a5,1 + 3005da4: a011 j 3005da8 + 3005da6: 4781 li a5,0 + 3005da8: 8b85 andi a5,a5,1 + 3005daa: 9f81 uxtb a5 + ((div) == TIMERPRESCALER_DIV_256)); +} + 3005dac: 853e mv a0,a5 + 3005dae: 4472 lw s0,28(sp) + 3005db0: 6105 addi sp,sp,32 + 3005db2: 8082 ret + +03005db4 : + * @param handle Timer Handle + * @retval BASE_STATUS_OK Success + * @retval BASE_STATUS_ERROR parameter check fail + */ +BASE_StatusType HAL_TIMER_Init(TIMER_Handle *handle) +{ + 3005db4: 1101 addi sp,sp,-32 + 3005db6: ce06 sw ra,28(sp) + 3005db8: cc22 sw s0,24(sp) + 3005dba: 1000 addi s0,sp,32 + 3005dbc: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3005dc0: fec42783 lw a5,-20(s0) + 3005dc4: eb89 bnez a5,3005dd6 + 3005dc6: 02800593 li a1,40 + 3005dca: 0300f7b7 lui a5,0x300f + 3005dce: 23878513 addi a0,a5,568 # 300f238 + 3005dd2: 2c15 jal ra,3006006 + 3005dd4: a001 j 3005dd4 + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 3005dd6: fec42783 lw a5,-20(s0) + 3005dda: 4398 lw a4,0(a5) + 3005ddc: 143007b7 lui a5,0x14300 + 3005de0: 02f70f63 beq a4,a5,3005e1e + 3005de4: fec42783 lw a5,-20(s0) + 3005de8: 4398 lw a4,0(a5) + 3005dea: 143017b7 lui a5,0x14301 + 3005dee: 02f70863 beq a4,a5,3005e1e + 3005df2: fec42783 lw a5,-20(s0) + 3005df6: 4398 lw a4,0(a5) + 3005df8: 143027b7 lui a5,0x14302 + 3005dfc: 02f70163 beq a4,a5,3005e1e + 3005e00: fec42783 lw a5,-20(s0) + 3005e04: 4398 lw a4,0(a5) + 3005e06: 143037b7 lui a5,0x14303 + 3005e0a: 00f70a63 beq a4,a5,3005e1e + 3005e0e: 02900593 li a1,41 + 3005e12: 0300f7b7 lui a5,0x300f + 3005e16: 23878513 addi a0,a5,568 # 300f238 + 3005e1a: 22f5 jal ra,3006006 + 3005e1c: a001 j 3005e1c + + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->load), BASE_STATUS_ERROR); + 3005e1e: fec42783 lw a5,-20(s0) + 3005e22: 4bdc lw a5,20(a5) + 3005e24: 853e mv a0,a5 + 3005e26: 3f35 jal ra,3005d62 + 3005e28: 87aa mv a5,a0 + 3005e2a: 0017c793 xori a5,a5,1 + 3005e2e: 9f81 uxtb a5 + 3005e30: cb91 beqz a5,3005e44 + 3005e32: 02b00593 li a1,43 + 3005e36: 0300f7b7 lui a5,0x300f + 3005e3a: 23878513 addi a0,a5,568 # 300f238 + 3005e3e: 22e1 jal ra,3006006 + 3005e40: 4785 li a5,1 + 3005e42: aa6d j 3005ffc + TIMER_PARAM_CHECK_WITH_RET(IsTimerPeriod(handle->bgLoad), BASE_STATUS_ERROR); + 3005e44: fec42783 lw a5,-20(s0) + 3005e48: 4f9c lw a5,24(a5) + 3005e4a: 853e mv a0,a5 + 3005e4c: 3f19 jal ra,3005d62 + 3005e4e: 87aa mv a5,a0 + 3005e50: 0017c793 xori a5,a5,1 + 3005e54: 9f81 uxtb a5 + 3005e56: cb91 beqz a5,3005e6a + 3005e58: 02c00593 li a1,44 + 3005e5c: 0300f7b7 lui a5,0x300f + 3005e60: 23878513 addi a0,a5,568 # 300f238 + 3005e64: 224d jal ra,3006006 + 3005e66: 4785 li a5,1 + 3005e68: aa51 j 3005ffc + TIMER_PARAM_CHECK_WITH_RET(IsTimerMode(handle->mode), BASE_STATUS_ERROR); + 3005e6a: fec42783 lw a5,-20(s0) + 3005e6e: 479c lw a5,8(a5) + 3005e70: 853e mv a0,a5 + 3005e72: 358d jal ra,3005cd4 + 3005e74: 87aa mv a5,a0 + 3005e76: 0017c793 xori a5,a5,1 + 3005e7a: 9f81 uxtb a5 + 3005e7c: cb91 beqz a5,3005e90 + 3005e7e: 02d00593 li a1,45 + 3005e82: 0300f7b7 lui a5,0x300f + 3005e86: 23878513 addi a0,a5,568 # 300f238 + 3005e8a: 2ab5 jal ra,3006006 + 3005e8c: 4785 li a5,1 + 3005e8e: a2bd j 3005ffc + TIMER_PARAM_CHECK_WITH_RET(IsTimerSize(handle->size), BASE_STATUS_ERROR); + 3005e90: fec42783 lw a5,-20(s0) + 3005e94: 4b9c lw a5,16(a5) + 3005e96: 853e mv a0,a5 + 3005e98: 3d79 jal ra,3005d36 + 3005e9a: 87aa mv a5,a0 + 3005e9c: 0017c793 xori a5,a5,1 + 3005ea0: 9f81 uxtb a5 + 3005ea2: cb91 beqz a5,3005eb6 + 3005ea4: 02e00593 li a1,46 + 3005ea8: 0300f7b7 lui a5,0x300f + 3005eac: 23878513 addi a0,a5,568 # 300f238 + 3005eb0: 2a99 jal ra,3006006 + 3005eb2: 4785 li a5,1 + 3005eb4: a2a1 j 3005ffc + TIMER_PARAM_CHECK_WITH_RET(IsTimerDiv(handle->prescaler), BASE_STATUS_ERROR); + 3005eb6: fec42783 lw a5,-20(s0) + 3005eba: 47dc lw a5,12(a5) + 3005ebc: 853e mv a0,a5 + 3005ebe: 35c1 jal ra,3005d7e + 3005ec0: 87aa mv a5,a0 + 3005ec2: 0017c793 xori a5,a5,1 + 3005ec6: 9f81 uxtb a5 + 3005ec8: cb91 beqz a5,3005edc + 3005eca: 02f00593 li a1,47 + 3005ece: 0300f7b7 lui a5,0x300f + 3005ed2: 23878513 addi a0,a5,568 # 300f238 + 3005ed6: 2a05 jal ra,3006006 + 3005ed8: 4785 li a5,1 + 3005eda: a20d j 3005ffc + + /* Initialize the configuration parameters of the timer */ + handle->baseAddress->timer_intclr = BASE_CFG_SET; /* Writing to this register clears interrupt output of timer */ + 3005edc: fec42783 lw a5,-20(s0) + 3005ee0: 439c lw a5,0(a5) + 3005ee2: 4705 li a4,1 + 3005ee4: c7d8 sw a4,12(a5) + handle->baseAddress->timer_load = handle->load; + 3005ee6: fec42783 lw a5,-20(s0) + 3005eea: 439c lw a5,0(a5) + 3005eec: fec42703 lw a4,-20(s0) + 3005ef0: 4b58 lw a4,20(a4) + 3005ef2: c398 sw a4,0(a5) + handle->baseAddress->timerbgload = handle->bgLoad; + 3005ef4: fec42783 lw a5,-20(s0) + 3005ef8: 439c lw a5,0(a5) + 3005efa: fec42703 lw a4,-20(s0) + 3005efe: 4f18 lw a4,24(a4) + 3005f00: cf98 sw a4,24(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_DISABLE; + 3005f02: fec42783 lw a5,-20(s0) + 3005f06: 4398 lw a4,0(a5) + 3005f08: 471c lw a5,8(a4) + 3005f0a: f7f7f793 andi a5,a5,-129 + 3005f0e: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timerintenable = handle->interruptEn; + 3005f10: fec42783 lw a5,-20(s0) + 3005f14: 4398 lw a4,0(a5) + 3005f16: fec42783 lw a5,-20(s0) + 3005f1a: 2fd4 lbu a3,28(a5) + 3005f1c: 471c lw a5,8(a4) + 3005f1e: 8a85 andi a3,a3,1 + 3005f20: 0696 slli a3,a3,0x5 + 3005f22: fdf7f793 andi a5,a5,-33 + 3005f26: 8fd5 or a5,a5,a3 + 3005f28: c71c sw a5,8(a4) + + /* Sets the frequency divider and size of the timer module. */ + handle->baseAddress->TIMERx_CONTROL.BIT.timerpre = handle->prescaler; + 3005f2a: fec42783 lw a5,-20(s0) + 3005f2e: 47d4 lw a3,12(a5) + 3005f30: fec42783 lw a5,-20(s0) + 3005f34: 4398 lw a4,0(a5) + 3005f36: 87b6 mv a5,a3 + 3005f38: 8b8d andi a5,a5,3 + 3005f3a: 0ff7f693 andi a3,a5,255 + 3005f3e: 471c lw a5,8(a4) + 3005f40: 8a8d andi a3,a3,3 + 3005f42: 068a slli a3,a3,0x2 + 3005f44: 9bcd andi a5,a5,-13 + 3005f46: 8fd5 or a5,a5,a3 + 3005f48: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timersize = handle->size; + 3005f4a: fec42783 lw a5,-20(s0) + 3005f4e: 4b94 lw a3,16(a5) + 3005f50: fec42783 lw a5,-20(s0) + 3005f54: 4398 lw a4,0(a5) + 3005f56: 87b6 mv a5,a3 + 3005f58: 8b85 andi a5,a5,1 + 3005f5a: 0ff7f693 andi a3,a5,255 + 3005f5e: 471c lw a5,8(a4) + 3005f60: 8a85 andi a3,a3,1 + 3005f62: 0686 slli a3,a3,0x1 + 3005f64: 9bf5 andi a5,a5,-3 + 3005f66: 8fd5 or a5,a5,a3 + 3005f68: c71c sw a5,8(a4) + + /* Sets the running mode of the timer. */ + if (handle->mode == TIMER_MODE_RUN_ONTSHOT) { + 3005f6a: fec42783 lw a5,-20(s0) + 3005f6e: 4798 lw a4,8(a5) + 3005f70: 4789 li a5,2 + 3005f72: 00f71a63 bne a4,a5,3005f86 + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_SET; + 3005f76: fec42783 lw a5,-20(s0) + 3005f7a: 4398 lw a4,0(a5) + 3005f7c: 471c lw a5,8(a4) + 3005f7e: 0017e793 ori a5,a5,1 + 3005f82: c71c sw a5,8(a4) + 3005f84: a805 j 3005fb4 + } else { + handle->baseAddress->TIMERx_CONTROL.BIT.oneshot = BASE_CFG_UNSET; + 3005f86: fec42783 lw a5,-20(s0) + 3005f8a: 4398 lw a4,0(a5) + 3005f8c: 471c lw a5,8(a4) + 3005f8e: 9bf9 andi a5,a5,-2 + 3005f90: c71c sw a5,8(a4) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005f92: fec42783 lw a5,-20(s0) + 3005f96: 479c lw a5,8(a5) + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005f98: fec42703 lw a4,-20(s0) + 3005f9c: 4318 lw a4,0(a4) + (handle->mode == TIMER_MODE_RUN_FREE) ? BASE_CFG_UNSET : BASE_CFG_SET; + 3005f9e: 00f037b3 snez a5,a5 + 3005fa2: 0ff7f693 andi a3,a5,255 + handle->baseAddress->TIMERx_CONTROL.BIT.timermode = + 3005fa6: 471c lw a5,8(a4) + 3005fa8: 8a85 andi a3,a3,1 + 3005faa: 069a slli a3,a3,0x6 + 3005fac: fbf7f793 andi a5,a5,-65 + 3005fb0: 8fd5 or a5,a5,a3 + 3005fb2: c71c sw a5,8(a4) + } + + /* Request for setting the DMA and ADC. */ + handle->baseAddress->TIMERx_CONTROLB.BIT.dmasreqen = handle->dmaReqEnable; + 3005fb4: fec42783 lw a5,-20(s0) + 3005fb8: 4398 lw a4,0(a5) + 3005fba: fec42783 lw a5,-20(s0) + 3005fbe: 2ff4 lbu a3,30(a5) + 3005fc0: 4f5c lw a5,28(a4) + 3005fc2: 8a85 andi a3,a3,1 + 3005fc4: 0686 slli a3,a3,0x1 + 3005fc6: 9bf5 andi a5,a5,-3 + 3005fc8: 8fd5 or a5,a5,a3 + 3005fca: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.dmabreqen = handle->dmaReqEnable; + 3005fcc: fec42783 lw a5,-20(s0) + 3005fd0: 4398 lw a4,0(a5) + 3005fd2: fec42783 lw a5,-20(s0) + 3005fd6: 2ff4 lbu a3,30(a5) + 3005fd8: 4f5c lw a5,28(a4) + 3005fda: 8a85 andi a3,a3,1 + 3005fdc: 9bf9 andi a5,a5,-2 + 3005fde: 8fd5 or a5,a5,a3 + 3005fe0: cf5c sw a5,28(a4) + handle->baseAddress->TIMERx_CONTROLB.BIT.socen = handle->adcSocReqEnable; + 3005fe2: fec42783 lw a5,-20(s0) + 3005fe6: 4398 lw a4,0(a5) + 3005fe8: fec42783 lw a5,-20(s0) + 3005fec: 3fd4 lbu a3,29(a5) + 3005fee: 4f5c lw a5,28(a4) + 3005ff0: 8a85 andi a3,a3,1 + 3005ff2: 068a slli a3,a3,0x2 + 3005ff4: 9bed andi a5,a5,-5 + 3005ff6: 8fd5 or a5,a5,a3 + 3005ff8: cf5c sw a5,28(a4) + return BASE_STATUS_OK; + 3005ffa: 4781 li a5,0 +} + 3005ffc: 853e mv a0,a5 + 3005ffe: 40f2 lw ra,28(sp) + 3006000: 4462 lw s0,24(sp) + 3006002: 6105 addi sp,sp,32 + 3006004: 8082 ret + +03006006 : + 3006006: 9eafb06f j 30011f0 + +0300600a : + * @brief Start timer. + * @param handle Timer Handle + * @retval None + */ +void HAL_TIMER_Start(TIMER_Handle *handle) +{ + 300600a: 1101 addi sp,sp,-32 + 300600c: ce06 sw ra,28(sp) + 300600e: cc22 sw s0,24(sp) + 3006010: 1000 addi s0,sp,32 + 3006012: fea42623 sw a0,-20(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3006016: fec42783 lw a5,-20(s0) + 300601a: eb89 bnez a5,300602c + 300601c: 0bc00593 li a1,188 + 3006020: 0300f7b7 lui a5,0x300f + 3006024: 23878513 addi a0,a5,568 # 300f238 + 3006028: 3ff9 jal ra,3006006 + 300602a: a001 j 300602a + TIMER_ASSERT_PARAM(IsTIMERInstance(handle->baseAddress)); + 300602c: fec42783 lw a5,-20(s0) + 3006030: 4398 lw a4,0(a5) + 3006032: 143007b7 lui a5,0x14300 + 3006036: 02f70f63 beq a4,a5,3006074 + 300603a: fec42783 lw a5,-20(s0) + 300603e: 4398 lw a4,0(a5) + 3006040: 143017b7 lui a5,0x14301 + 3006044: 02f70863 beq a4,a5,3006074 + 3006048: fec42783 lw a5,-20(s0) + 300604c: 4398 lw a4,0(a5) + 300604e: 143027b7 lui a5,0x14302 + 3006052: 02f70163 beq a4,a5,3006074 + 3006056: fec42783 lw a5,-20(s0) + 300605a: 4398 lw a4,0(a5) + 300605c: 143037b7 lui a5,0x14303 + 3006060: 00f70a63 beq a4,a5,3006074 + 3006064: 0bd00593 li a1,189 + 3006068: 0300f7b7 lui a5,0x300f + 300606c: 23878513 addi a0,a5,568 # 300f238 + 3006070: 3f59 jal ra,3006006 + 3006072: a001 j 3006072 + /* Enable timer */ + handle->baseAddress->TIMERx_CONTROL.BIT.timeren = BASE_CFG_SET; + 3006074: fec42783 lw a5,-20(s0) + 3006078: 4398 lw a4,0(a5) + 300607a: 471c lw a5,8(a4) + 300607c: 0807e793 ori a5,a5,128 + 3006080: c71c sw a5,8(a4) +} + 3006082: 0001 nop + 3006084: 40f2 lw ra,28(sp) + 3006086: 4462 lw s0,24(sp) + 3006088: 6105 addi sp,sp,32 + 300608a: 8082 ret + +0300608c : + * @brief GPT Interrupt service processing function. + * @param handle TIMER Handle + * @retval None + */ +void HAL_TIMER_IrqHandler(void *handle) +{ + 300608c: 7179 addi sp,sp,-48 + 300608e: d606 sw ra,44(sp) + 3006090: d422 sw s0,40(sp) + 3006092: 1800 addi s0,sp,48 + 3006094: fca42e23 sw a0,-36(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3006098: fdc42783 lw a5,-36(s0) + 300609c: eb89 bnez a5,30060ae + 300609e: 0d800593 li a1,216 + 30060a2: 0300f7b7 lui a5,0x300f + 30060a6: 23878513 addi a0,a5,568 # 300f238 + 30060aa: 3fb1 jal ra,3006006 + 30060ac: a001 j 30060ac + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + 30060ae: fdc42783 lw a5,-36(s0) + 30060b2: fef42623 sw a5,-20(s0) + TIMER_ASSERT_PARAM(IsTIMERInstance(timerHandle->baseAddress)); + 30060b6: fec42783 lw a5,-20(s0) + 30060ba: 4398 lw a4,0(a5) + 30060bc: 143007b7 lui a5,0x14300 + 30060c0: 02f70f63 beq a4,a5,30060fe + 30060c4: fec42783 lw a5,-20(s0) + 30060c8: 4398 lw a4,0(a5) + 30060ca: 143017b7 lui a5,0x14301 + 30060ce: 02f70863 beq a4,a5,30060fe + 30060d2: fec42783 lw a5,-20(s0) + 30060d6: 4398 lw a4,0(a5) + 30060d8: 143027b7 lui a5,0x14302 + 30060dc: 02f70163 beq a4,a5,30060fe + 30060e0: fec42783 lw a5,-20(s0) + 30060e4: 4398 lw a4,0(a5) + 30060e6: 143037b7 lui a5,0x14303 + 30060ea: 00f70a63 beq a4,a5,30060fe + 30060ee: 0da00593 li a1,218 + 30060f2: 0300f7b7 lui a5,0x300f + 30060f6: 23878513 addi a0,a5,568 # 300f238 + 30060fa: 3731 jal ra,3006006 + 30060fc: a001 j 30060fc + /* Check interrupt type */ + if (timerHandle->baseAddress->TIMERx_MIS.dmaovmis == BASE_CFG_ENABLE) { + 30060fe: fec42783 lw a5,-20(s0) + 3006102: 439c lw a5,0(a5) + 3006104: 4bdc lw a5,20(a5) + 3006106: 8385 srli a5,a5,0x1 + 3006108: 8b85 andi a5,a5,1 + 300610a: 0ff7f713 andi a4,a5,255 + 300610e: 4785 li a5,1 + 3006110: 02f71363 bne a4,a5,3006136 + /* DMA overflow interrupt */ + timerHandle->baseAddress->DMAOV_INTCLR.BIT.dmaov_intclr = BASE_CFG_ENABLE; + 3006114: fec42783 lw a5,-20(s0) + 3006118: 4398 lw a4,0(a5) + 300611a: 531c lw a5,32(a4) + 300611c: 0017e793 ori a5,a5,1 + 3006120: d31c sw a5,32(a4) + /* Call the timer DMA request overflow callback function of the user. */ + if (timerHandle->userCallBack.TimerOverFlowCallBack != NULL) { + 3006122: fec42783 lw a5,-20(s0) + 3006126: 53dc lw a5,36(a5) + 3006128: c799 beqz a5,3006136 + timerHandle->userCallBack.TimerOverFlowCallBack(timerHandle); + 300612a: fec42783 lw a5,-20(s0) + 300612e: 53dc lw a5,36(a5) + 3006130: fec42503 lw a0,-20(s0) + 3006134: 9782 jalr a5 + } + } + if (timerHandle->baseAddress->TIMERx_MIS.timermis == BASE_CFG_ENABLE) { + 3006136: fec42783 lw a5,-20(s0) + 300613a: 439c lw a5,0(a5) + 300613c: 4bdc lw a5,20(a5) + 300613e: 8b85 andi a5,a5,1 + 3006140: 0ff7f713 andi a4,a5,255 + 3006144: 4785 li a5,1 + 3006146: 02f71263 bne a4,a5,300616a + /* TIMER Interrupt */ + timerHandle->baseAddress->timer_intclr = BASE_CFG_ENABLE; + 300614a: fec42783 lw a5,-20(s0) + 300614e: 439c lw a5,0(a5) + 3006150: 4705 li a4,1 + 3006152: c7d8 sw a4,12(a5) + /* Call the period finish callback function of the user. */ + if (timerHandle->userCallBack.TimerPeriodFinCallBack != NULL) { + 3006154: fec42783 lw a5,-20(s0) + 3006158: 539c lw a5,32(a5) + 300615a: cb81 beqz a5,300616a + timerHandle->userCallBack.TimerPeriodFinCallBack(timerHandle); + 300615c: fec42783 lw a5,-20(s0) + 3006160: 539c lw a5,32(a5) + 3006162: fec42503 lw a0,-20(s0) + 3006166: 9782 jalr a5 + } + } + return; + 3006168: 0001 nop + 300616a: 0001 nop +} + 300616c: 50b2 lw ra,44(sp) + 300616e: 5422 lw s0,40(sp) + 3006170: 6145 addi sp,sp,48 + 3006172: 8082 ret + +03006174 : + * @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) +{ + 3006174: 1101 addi sp,sp,-32 + 3006176: ce06 sw ra,28(sp) + 3006178: cc22 sw s0,24(sp) + 300617a: 1000 addi s0,sp,32 + 300617c: fea42623 sw a0,-20(s0) + 3006180: feb42423 sw a1,-24(s0) + 3006184: fec42223 sw a2,-28(s0) + TIMER_ASSERT_PARAM(handle != NULL); + 3006188: fec42783 lw a5,-20(s0) + 300618c: eb89 bnez a5,300619e + 300618e: 0fa00593 li a1,250 + 3006192: 0300f7b7 lui a5,0x300f + 3006196: 23878513 addi a0,a5,568 # 300f238 + 300619a: 35b5 jal ra,3006006 + 300619c: a001 j 300619c + TIMER_ASSERT_PARAM(callBackFunc != NULL); + 300619e: fe442783 lw a5,-28(s0) + 30061a2: eb89 bnez a5,30061b4 + 30061a4: 0fb00593 li a1,251 + 30061a8: 0300f7b7 lui a5,0x300f + 30061ac: 23878513 addi a0,a5,568 # 300f238 + 30061b0: 3d99 jal ra,3006006 + 30061b2: a001 j 30061b2 + TIMER_ASSERT_PARAM(IsTimerInterruptType(typeID)); + 30061b4: fe842503 lw a0,-24(s0) + 30061b8: 3e89 jal ra,3005d0a + 30061ba: 87aa mv a5,a0 + 30061bc: 0017c793 xori a5,a5,1 + 30061c0: 9f81 uxtb a5 + 30061c2: cb89 beqz a5,30061d4 + 30061c4: 0fc00593 li a1,252 + 30061c8: 0300f7b7 lui a5,0x300f + 30061cc: 23878513 addi a0,a5,568 # 300f238 + 30061d0: 3d1d jal ra,3006006 + 30061d2: a001 j 30061d2 + + /* Registers the user callback function. */ + switch (typeID) { + 30061d4: fe842783 lw a5,-24(s0) + 30061d8: cb91 beqz a5,30061ec + 30061da: 4705 li a4,1 + 30061dc: 00e79e63 bne a5,a4,30061f8 + case TIMER_OVER_FLOW: + handle->userCallBack.TimerOverFlowCallBack = callBackFunc; /* User DMA request overflow function */ + 30061e0: fec42783 lw a5,-20(s0) + 30061e4: fe442703 lw a4,-28(s0) + 30061e8: d3d8 sw a4,36(a5) + break; + 30061ea: a809 j 30061fc + case TIMER_PERIOD_FIN: + handle->userCallBack.TimerPeriodFinCallBack = callBackFunc; /* User timer period finish call back. */ + 30061ec: fec42783 lw a5,-20(s0) + 30061f0: fe442703 lw a4,-28(s0) + 30061f4: d398 sw a4,32(a5) + break; + 30061f6: a019 j 30061fc + default: + return BASE_STATUS_ERROR; + 30061f8: 4785 li a5,1 + 30061fa: a011 j 30061fe + } + return BASE_STATUS_OK; + 30061fc: 4781 li a5,0 +} + 30061fe: 853e mv a0,a5 + 3006200: 40f2 lw ra,28(sp) + 3006202: 4462 lw s0,24(sp) + 3006204: 6105 addi sp,sp,32 + 3006206: 8082 ret + +03006208 : + * @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) +{ + 3006208: 1101 addi sp,sp,-32 + 300620a: ce22 sw s0,28(sp) + 300620c: 1000 addi s0,sp,32 + 300620e: fea42623 sw a0,-20(s0) + return (datalength >= UART_DATALENGTH_5BIT) && (datalength <= UART_DATALENGTH_8BIT); + 3006212: fec42783 lw a5,-20(s0) + 3006216: 0047b793 sltiu a5,a5,4 + 300621a: 9f81 uxtb a5 +} + 300621c: 853e mv a0,a5 + 300621e: 4472 lw s0,28(sp) + 3006220: 6105 addi sp,sp,32 + 3006222: 8082 ret + +03006224 : + * @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) +{ + 3006224: 1101 addi sp,sp,-32 + 3006226: ce22 sw s0,28(sp) + 3006228: 1000 addi s0,sp,32 + 300622a: fea42623 sw a0,-20(s0) + return (stopbits == UART_STOPBITS_ONE) || (stopbits == UART_STOPBITS_TWO); + 300622e: fec42783 lw a5,-20(s0) + 3006232: c791 beqz a5,300623e + 3006234: fec42703 lw a4,-20(s0) + 3006238: 4785 li a5,1 + 300623a: 00f71463 bne a4,a5,3006242 + 300623e: 4785 li a5,1 + 3006240: a011 j 3006244 + 3006242: 4781 li a5,0 + 3006244: 8b85 andi a5,a5,1 + 3006246: 9f81 uxtb a5 +} + 3006248: 853e mv a0,a5 + 300624a: 4472 lw s0,28(sp) + 300624c: 6105 addi sp,sp,32 + 300624e: 8082 ret + +03006250 : + * @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) +{ + 3006250: 1101 addi sp,sp,-32 + 3006252: ce22 sw s0,28(sp) + 3006254: 1000 addi s0,sp,32 + 3006256: fea42623 sw a0,-20(s0) + if ((paritymode >= UART_PARITY_ODD) && (paritymode <= UART_PARITY_NONE)) { + 300625a: fec42703 lw a4,-20(s0) + 300625e: 4791 li a5,4 + 3006260: 00e7e463 bltu a5,a4,3006268 + return true; + 3006264: 4785 li a5,1 + 3006266: a011 j 300626a + } + return false; + 3006268: 4781 li a5,0 +} + 300626a: 853e mv a0,a5 + 300626c: 4472 lw s0,28(sp) + 300626e: 6105 addi sp,sp,32 + 3006270: 8082 ret + +03006272 : + * @brief Check UART transmode parameter. + * @param transmode Transmit mode, @ref UART_Transmit_Mode + * @retval bool + */ +static inline bool IsUartTransmode(UART_Transmit_Mode transmode) +{ + 3006272: 1101 addi sp,sp,-32 + 3006274: ce22 sw s0,28(sp) + 3006276: 1000 addi s0,sp,32 + 3006278: fea42623 sw a0,-20(s0) + if ((transmode == UART_MODE_BLOCKING) || + 300627c: fec42783 lw a5,-20(s0) + 3006280: c385 beqz a5,30062a0 + 3006282: fec42703 lw a4,-20(s0) + 3006286: 4785 li a5,1 + 3006288: 00f70c63 beq a4,a5,30062a0 + (transmode == UART_MODE_INTERRUPT) || + 300628c: fec42703 lw a4,-20(s0) + 3006290: 4789 li a5,2 + 3006292: 00f70763 beq a4,a5,30062a0 + (transmode == UART_MODE_DMA) || + 3006296: fec42703 lw a4,-20(s0) + 300629a: 478d li a5,3 + 300629c: 00f71463 bne a4,a5,30062a4 + (transmode == UART_MODE_DISABLE)) { + return true; + 30062a0: 4785 li a5,1 + 30062a2: a011 j 30062a6 + } + return false; + 30062a4: 4781 li a5,0 +} + 30062a6: 853e mv a0,a5 + 30062a8: 4472 lw s0,28(sp) + 30062aa: 6105 addi sp,sp,32 + 30062ac: 8082 ret + +030062ae : + * @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) +{ + 30062ae: 1101 addi sp,sp,-32 + 30062b0: ce22 sw s0,28(sp) + 30062b2: 1000 addi s0,sp,32 + 30062b4: fea42623 sw a0,-20(s0) + return (fifoThreshold >= UART_FIFODEPTH_SIZE0) && (fifoThreshold <= UART_FIFODEPTH_SIZE15); + 30062b8: fec42783 lw a5,-20(s0) + 30062bc: 0107b793 sltiu a5,a5,16 + 30062c0: 9f81 uxtb a5 +} + 30062c2: 853e mv a0,a5 + 30062c4: 4472 lw s0,28(sp) + 30062c6: 6105 addi sp,sp,32 + 30062c8: 8082 ret + +030062ca : + * @brief Check UART Oversampling multiple. + * @param multiple Oversampling multiple, @ref UART_OversampleMultiple + * @retval bool + */ +static inline bool IsUartOversampleMultiple(UART_OversampleMultiple multiple) +{ + 30062ca: 1101 addi sp,sp,-32 + 30062cc: ce22 sw s0,28(sp) + 30062ce: 1000 addi s0,sp,32 + 30062d0: fea42623 sw a0,-20(s0) + return (multiple >= UART_OVERSAMPLING_16X) && (multiple <= UART_OVERSAMPLING_12X); + 30062d4: fec42783 lw a5,-20(s0) + 30062d8: 0057b793 sltiu a5,a5,5 + 30062dc: 9f81 uxtb a5 +} + 30062de: 853e mv a0,a5 + 30062e0: 4472 lw s0,28(sp) + 30062e2: 6105 addi sp,sp,32 + 30062e4: 8082 ret + +030062e6 : +#define PARITY_EVEN 0x6 +#define PARITY_MARK 0x82 +#define PARITY_SPACE 0x86 + +static unsigned int DivClosest(unsigned int x, unsigned int divisor) +{ + 30062e6: 7179 addi sp,sp,-48 + 30062e8: d622 sw s0,44(sp) + 30062ea: 1800 addi s0,sp,48 + 30062ec: fca42e23 sw a0,-36(s0) + 30062f0: fcb42c23 sw a1,-40(s0) + unsigned int ret; + if (divisor == 0) { + 30062f4: fd842783 lw a5,-40(s0) + 30062f8: e399 bnez a5,30062fe + return 0; + 30062fa: 4781 li a5,0 + 30062fc: a005 j 300631c + } + ret = (((x) + ((divisor) / 2)) / (divisor)); /* Round up the result, add 1/2 */ + 30062fe: fd842783 lw a5,-40(s0) + 3006302: 0017d713 srli a4,a5,0x1 + 3006306: fdc42783 lw a5,-36(s0) + 300630a: 973e add a4,a4,a5 + 300630c: fd842783 lw a5,-40(s0) + 3006310: 02f757b3 divu a5,a4,a5 + 3006314: fef42623 sw a5,-20(s0) + return ret; + 3006318: fec42783 lw a5,-20(s0) +} + 300631c: 853e mv a0,a5 + 300631e: 5432 lw s0,44(sp) + 3006320: 6145 addi sp,sp,48 + 3006322: 8082 ret + +03006324 : + * @brief Baud rate detection interrupt callback function. + * @param uartHandle UART handle. + * @retval None. + */ +static void BaudDetectCallBack(UART_Handle *uartHandle) +{ + 3006324: 1101 addi sp,sp,-32 + 3006326: ce06 sw ra,28(sp) + 3006328: cc22 sw s0,24(sp) + 300632a: 1000 addi s0,sp,32 + 300632c: fea42623 sw a0,-20(s0) + if (uartHandle->baseAddress->UART_MIS.BIT.abdcis == 0x01) { + 3006330: fec42783 lw a5,-20(s0) + 3006334: 439c lw a5,0(a5) + 3006336: 43bc lw a5,64(a5) + 3006338: 83cd srli a5,a5,0x13 + 300633a: 8b85 andi a5,a5,1 + 300633c: 0ff7f713 andi a4,a5,255 + 3006340: 4785 li a5,1 + 3006342: 06f71b63 bne a4,a5,30063b8 + uartHandle->baseAddress->UART_ABDEN.BIT.abden = BASE_CFG_DISABLE; + 3006346: fec42783 lw a5,-20(s0) + 300634a: 4398 lw a4,0(a5) + 300634c: 4f7c lw a5,92(a4) + 300634e: 9bf9 andi a5,a5,-2 + 3006350: cf7c sw a5,92(a4) + uartHandle->baseAddress->UART_IMSC.BIT.abdeim = BASE_CFG_DISABLE; + 3006352: fec42783 lw a5,-20(s0) + 3006356: 4398 lw a4,0(a5) + 3006358: 5f1c lw a5,56(a4) + 300635a: fff006b7 lui a3,0xfff00 + 300635e: 16fd addi a3,a3,-1 # ffefffff + 3006360: 8ff5 and a5,a5,a3 + 3006362: df1c sw a5,56(a4) + uartHandle->baseAddress->UART_IMSC.BIT.abdcim = BASE_CFG_DISABLE; + 3006364: fec42783 lw a5,-20(s0) + 3006368: 4398 lw a4,0(a5) + 300636a: 5f1c lw a5,56(a4) + 300636c: fff806b7 lui a3,0xfff80 + 3006370: 16fd addi a3,a3,-1 # fff7ffff + 3006372: 8ff5 and a5,a5,a3 + 3006374: df1c sw a5,56(a4) + uartHandle->baseAddress->UART_ICR.BIT.abdcic = BASE_CFG_ENABLE; + 3006376: fec42783 lw a5,-20(s0) + 300637a: 4398 lw a4,0(a5) + 300637c: 437c lw a5,68(a4) + 300637e: 000806b7 lui a3,0x80 + 3006382: 8fd5 or a5,a5,a3 + 3006384: c37c sw a5,68(a4) + /* After the baud rate automatic detection function is configured, enable UART. */ + uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; + 3006386: fec42783 lw a5,-20(s0) + 300638a: 4398 lw a4,0(a5) + 300638c: 5b1c lw a5,48(a4) + 300638e: 1007e793 ori a5,a5,256 + 3006392: db1c sw a5,48(a4) + uartHandle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; + 3006394: fec42783 lw a5,-20(s0) + 3006398: 4398 lw a4,0(a5) + 300639a: 5b1c lw a5,48(a4) + 300639c: 2007e793 ori a5,a5,512 + 30063a0: db1c sw a5,48(a4) + /* Call back user detect success function. */ + if (uartHandle->userCallBack.BaudDetectSuccessCallBack != NULL) { + 30063a2: fec42783 lw a5,-20(s0) + 30063a6: 57fc lw a5,108(a5) + 30063a8: c7b9 beqz a5,30063f6 + uartHandle->userCallBack.BaudDetectSuccessCallBack(uartHandle); + 30063aa: fec42783 lw a5,-20(s0) + 30063ae: 57fc lw a5,108(a5) + 30063b0: fec42503 lw a0,-20(s0) + 30063b4: 9782 jalr a5 + /* Call back user baud detect error function. */ + if (uartHandle->userCallBack.BaudDetectErrorCallBack != NULL) { + uartHandle->userCallBack.BaudDetectErrorCallBack(uartHandle); + } + } + return; + 30063b6: a081 j 30063f6 + while (uartHandle->baseAddress->UART_ABDEN.BIT.abdbusy == 0x01) { + 30063b8: 0001 nop + 30063ba: fec42783 lw a5,-20(s0) + 30063be: 439c lw a5,0(a5) + 30063c0: 4ffc lw a5,92(a5) + 30063c2: 8391 srli a5,a5,0x4 + 30063c4: 8b85 andi a5,a5,1 + 30063c6: 0ff7f713 andi a4,a5,255 + 30063ca: 4785 li a5,1 + 30063cc: fef707e3 beq a4,a5,30063ba + uartHandle->baseAddress->UART_ICR.BIT.abdeic = BASE_CFG_ENABLE; + 30063d0: fec42783 lw a5,-20(s0) + 30063d4: 4398 lw a4,0(a5) + 30063d6: 437c lw a5,68(a4) + 30063d8: 001006b7 lui a3,0x100 + 30063dc: 8fd5 or a5,a5,a3 + 30063de: c37c sw a5,68(a4) + if (uartHandle->userCallBack.BaudDetectErrorCallBack != NULL) { + 30063e0: fec42783 lw a5,-20(s0) + 30063e4: 5bbc lw a5,112(a5) + 30063e6: cb81 beqz a5,30063f6 + uartHandle->userCallBack.BaudDetectErrorCallBack(uartHandle); + 30063e8: fec42783 lw a5,-20(s0) + 30063ec: 5bbc lw a5,112(a5) + 30063ee: fec42503 lw a0,-20(s0) + 30063f2: 9782 jalr a5 + return; + 30063f4: 0001 nop + 30063f6: 0001 nop +} + 30063f8: 40f2 lw ra,28(sp) + 30063fa: 4462 lw s0,24(sp) + 30063fc: 6105 addi sp,sp,32 + 30063fe: 8082 ret + +03006400 : + * @brief Character detection interrupt callback function. + * @param uartHandle UART handle. + * @retval None. + */ +static void CharterMatchCallBack(UART_Handle *uartHandle) +{ + 3006400: 1101 addi sp,sp,-32 + 3006402: ce06 sw ra,28(sp) + 3006404: cc22 sw s0,24(sp) + 3006406: 1000 addi s0,sp,32 + 3006408: fea42623 sw a0,-20(s0) + uartHandle->baseAddress->UART_IMSC.BIT.cmim = BASE_CFG_DISABLE; + 300640c: fec42783 lw a5,-20(s0) + 3006410: 4398 lw a4,0(a5) + 3006412: 5f1c lw a5,56(a4) + 3006414: ffe006b7 lui a3,0xffe00 + 3006418: 16fd addi a3,a3,-1 # ffdfffff + 300641a: 8ff5 and a5,a5,a3 + 300641c: df1c sw a5,56(a4) + uartHandle->baseAddress->UART_ICR.BIT.cmic = BASE_CFG_ENABLE; + 300641e: fec42783 lw a5,-20(s0) + 3006422: 4398 lw a4,0(a5) + 3006424: 437c lw a5,68(a4) + 3006426: 002006b7 lui a3,0x200 + 300642a: 8fd5 or a5,a5,a3 + 300642c: c37c sw a5,68(a4) + if (uartHandle->userCallBack.CharacterMatchCallBack != NULL) { + 300642e: fec42783 lw a5,-20(s0) + 3006432: 5bfc lw a5,116(a5) + 3006434: c799 beqz a5,3006442 + uartHandle->userCallBack.CharacterMatchCallBack(uartHandle); + 3006436: fec42783 lw a5,-20(s0) + 300643a: 5bfc lw a5,116(a5) + 300643c: fec42503 lw a0,-20(s0) + 3006440: 9782 jalr a5 + } +} + 3006442: 0001 nop + 3006444: 40f2 lw ra,28(sp) + 3006446: 4462 lw s0,24(sp) + 3006448: 6105 addi sp,sp,32 + 300644a: 8082 ret + +0300644c : + * @brief Sets the parity bit of the UART. + * @param uartHandle UART handle. + * @retval None. + */ +static void UART_SetParityBit(UART_Handle *uartHandle) +{ + 300644c: 1101 addi sp,sp,-32 + 300644e: ce22 sw s0,28(sp) + 3006450: 1000 addi s0,sp,32 + 3006452: fea42623 sw a0,-20(s0) + /* Sets the UART check mode. */ + switch (uartHandle->parity) { + 3006456: fec42783 lw a5,-20(s0) + 300645a: 4b9c lw a5,16(a5) + 300645c: 4711 li a4,4 + 300645e: 06f76e63 bltu a4,a5,30064da + 3006462: 00279713 slli a4,a5,0x2 + 3006466: 0300f7b7 lui a5,0x300f + 300646a: 25878793 addi a5,a5,600 # 300f258 + 300646e: 97ba add a5,a5,a4 + 3006470: 439c lw a5,0(a5) + 3006472: 8782 jr a5 + case UART_PARITY_ODD: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_ODD; /* Odd parity. */ + 3006474: fec42783 lw a5,-20(s0) + 3006478: 439c lw a5,0(a5) + 300647a: 57d8 lw a4,44(a5) + 300647c: fec42783 lw a5,-20(s0) + 3006480: 439c lw a5,0(a5) + 3006482: 00276713 ori a4,a4,2 + 3006486: d7d8 sw a4,44(a5) + break; + 3006488: a891 j 30064dc + case UART_PARITY_EVEN: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_EVEN; /* Even parity. */ + 300648a: fec42783 lw a5,-20(s0) + 300648e: 439c lw a5,0(a5) + 3006490: 57d8 lw a4,44(a5) + 3006492: fec42783 lw a5,-20(s0) + 3006496: 439c lw a5,0(a5) + 3006498: 00676713 ori a4,a4,6 + 300649c: d7d8 sw a4,44(a5) + break; + 300649e: a83d j 30064dc + case UART_PARITY_MARK: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_MARK; /* Marking parity */ + 30064a0: fec42783 lw a5,-20(s0) + 30064a4: 439c lw a5,0(a5) + 30064a6: 57d8 lw a4,44(a5) + 30064a8: fec42783 lw a5,-20(s0) + 30064ac: 439c lw a5,0(a5) + 30064ae: 08276713 ori a4,a4,130 + 30064b2: d7d8 sw a4,44(a5) + break; + 30064b4: a025 j 30064dc + case UART_PARITY_SPACE: + uartHandle->baseAddress->UART_LCR_H.reg |= PARITY_SPACE; /* space parity */ + 30064b6: fec42783 lw a5,-20(s0) + 30064ba: 439c lw a5,0(a5) + 30064bc: 57d8 lw a4,44(a5) + 30064be: fec42783 lw a5,-20(s0) + 30064c2: 439c lw a5,0(a5) + 30064c4: 08676713 ori a4,a4,134 + 30064c8: d7d8 sw a4,44(a5) + break; + 30064ca: a809 j 30064dc + case UART_PARITY_NONE: + uartHandle->baseAddress->UART_LCR_H.BIT.pen = BASE_CFG_DISABLE; /* No parity */ + 30064cc: fec42783 lw a5,-20(s0) + 30064d0: 4398 lw a4,0(a5) + 30064d2: 575c lw a5,44(a4) + 30064d4: 9bf5 andi a5,a5,-3 + 30064d6: d75c sw a5,44(a4) + break; + 30064d8: a011 j 30064dc + default: + return; + 30064da: 0001 nop + } +} + 30064dc: 4472 lw s0,28(sp) + 30064de: 6105 addi sp,sp,32 + 30064e0: 8082 ret + +030064e2 : + * @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) +{ + 30064e2: 7179 addi sp,sp,-48 + 30064e4: d606 sw ra,44(sp) + 30064e6: d422 sw s0,40(sp) + 30064e8: 1800 addi s0,sp,48 + 30064ea: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 30064ee: fdc42783 lw a5,-36(s0) + 30064f2: eb89 bnez a5,3006504 + 30064f4: 09700593 li a1,151 + 30064f8: 0300f7b7 lui a5,0x300f + 30064fc: 26c78513 addi a0,a5,620 # 300f26c + 3006500: 3619 jal ra,3006006 + 3006502: a001 j 3006502 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3006504: fdc42783 lw a5,-36(s0) + 3006508: 4398 lw a4,0(a5) + 300650a: 140007b7 lui a5,0x14000 + 300650e: 02f70f63 beq a4,a5,300654c + 3006512: fdc42783 lw a5,-36(s0) + 3006516: 4398 lw a4,0(a5) + 3006518: 140017b7 lui a5,0x14001 + 300651c: 02f70863 beq a4,a5,300654c + 3006520: fdc42783 lw a5,-36(s0) + 3006524: 4398 lw a4,0(a5) + 3006526: 140027b7 lui a5,0x14002 + 300652a: 02f70163 beq a4,a5,300654c + 300652e: fdc42783 lw a5,-36(s0) + 3006532: 4398 lw a4,0(a5) + 3006534: 140037b7 lui a5,0x14003 + 3006538: 00f70a63 beq a4,a5,300654c + 300653c: 09800593 li a1,152 + 3006540: 0300f7b7 lui a5,0x300f + 3006544: 26c78513 addi a0,a5,620 # 300f26c + 3006548: 3c7d jal ra,3006006 + 300654a: a001 j 300654a + UART_PARAM_CHECK_WITH_RET(uartHandle->txState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 300654c: fdc42783 lw a5,-36(s0) + 3006550: 47bc lw a5,72(a5) + 3006552: cb91 beqz a5,3006566 + 3006554: 09900593 li a1,153 + 3006558: 0300f7b7 lui a5,0x300f + 300655c: 26c78513 addi a0,a5,620 # 300f26c + 3006560: 345d jal ra,3006006 + 3006562: 4785 li a5,1 + 3006564: ae0d j 3006896 + UART_PARAM_CHECK_WITH_RET(uartHandle->rxState == UART_STATE_NONE_INIT, BASE_STATUS_ERROR); + 3006566: fdc42783 lw a5,-36(s0) + 300656a: 47fc lw a5,76(a5) + 300656c: cb91 beqz a5,3006580 + 300656e: 09a00593 li a1,154 + 3006572: 0300f7b7 lui a5,0x300f + 3006576: 26c78513 addi a0,a5,620 # 300f26c + 300657a: 3471 jal ra,3006006 + 300657c: 4785 li a5,1 + 300657e: ae21 j 3006896 + unsigned int uartClock, quot; + UART_PARAM_CHECK_WITH_RET(IsUartDatalength(uartHandle->dataLength), BASE_STATUS_ERROR); + 3006580: fdc42783 lw a5,-36(s0) + 3006584: 479c lw a5,8(a5) + 3006586: 853e mv a0,a5 + 3006588: 3141 jal ra,3006208 + 300658a: 87aa mv a5,a0 + 300658c: 0017c793 xori a5,a5,1 + 3006590: 9f81 uxtb a5 + 3006592: cb91 beqz a5,30065a6 + 3006594: 09c00593 li a1,156 + 3006598: 0300f7b7 lui a5,0x300f + 300659c: 26c78513 addi a0,a5,620 # 300f26c + 30065a0: 349d jal ra,3006006 + 30065a2: 4785 li a5,1 + 30065a4: accd j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartStopbits(uartHandle->stopBits), BASE_STATUS_ERROR); + 30065a6: fdc42783 lw a5,-36(s0) + 30065aa: 47dc lw a5,12(a5) + 30065ac: 853e mv a0,a5 + 30065ae: 399d jal ra,3006224 + 30065b0: 87aa mv a5,a0 + 30065b2: 0017c793 xori a5,a5,1 + 30065b6: 9f81 uxtb a5 + 30065b8: cb91 beqz a5,30065cc + 30065ba: 09d00593 li a1,157 + 30065be: 0300f7b7 lui a5,0x300f + 30065c2: 26c78513 addi a0,a5,620 # 300f26c + 30065c6: 3481 jal ra,3006006 + 30065c8: 4785 li a5,1 + 30065ca: a4f1 j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartParitymode(uartHandle->parity), BASE_STATUS_ERROR); + 30065cc: fdc42783 lw a5,-36(s0) + 30065d0: 4b9c lw a5,16(a5) + 30065d2: 853e mv a0,a5 + 30065d4: 39b5 jal ra,3006250 + 30065d6: 87aa mv a5,a0 + 30065d8: 0017c793 xori a5,a5,1 + 30065dc: 9f81 uxtb a5 + 30065de: cb91 beqz a5,30065f2 + 30065e0: 09e00593 li a1,158 + 30065e4: 0300f7b7 lui a5,0x300f + 30065e8: 26c78513 addi a0,a5,620 # 300f26c + 30065ec: 3c29 jal ra,3006006 + 30065ee: 4785 li a5,1 + 30065f0: a45d j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->txMode), BASE_STATUS_ERROR); + 30065f2: fdc42783 lw a5,-36(s0) + 30065f6: 4bdc lw a5,20(a5) + 30065f8: 853e mv a0,a5 + 30065fa: 39a5 jal ra,3006272 + 30065fc: 87aa mv a5,a0 + 30065fe: 0017c793 xori a5,a5,1 + 3006602: 9f81 uxtb a5 + 3006604: cb91 beqz a5,3006618 + 3006606: 09f00593 li a1,159 + 300660a: 0300f7b7 lui a5,0x300f + 300660e: 26c78513 addi a0,a5,620 # 300f26c + 3006612: 3ad5 jal ra,3006006 + 3006614: 4785 li a5,1 + 3006616: a441 j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartTransmode(uartHandle->rxMode), BASE_STATUS_ERROR); + 3006618: fdc42783 lw a5,-36(s0) + 300661c: 4f9c lw a5,24(a5) + 300661e: 853e mv a0,a5 + 3006620: 3989 jal ra,3006272 + 3006622: 87aa mv a5,a0 + 3006624: 0017c793 xori a5,a5,1 + 3006628: 9f81 uxtb a5 + 300662a: cb91 beqz a5,300663e + 300662c: 0a000593 li a1,160 + 3006630: 0300f7b7 lui a5,0x300f + 3006634: 26c78513 addi a0,a5,620 # 300f26c + 3006638: 32f9 jal ra,3006006 + 300663a: 4785 li a5,1 + 300663c: aca9 j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoTxThr), BASE_STATUS_ERROR); + 300663e: fdc42783 lw a5,-36(s0) + 3006642: 5b9c lw a5,48(a5) + 3006644: 853e mv a0,a5 + 3006646: 31a5 jal ra,30062ae + 3006648: 87aa mv a5,a0 + 300664a: 0017c793 xori a5,a5,1 + 300664e: 9f81 uxtb a5 + 3006650: cb91 beqz a5,3006664 + 3006652: 0a100593 li a1,161 + 3006656: 0300f7b7 lui a5,0x300f + 300665a: 26c78513 addi a0,a5,620 # 300f26c + 300665e: 3265 jal ra,3006006 + 3006660: 4785 li a5,1 + 3006662: ac15 j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartFIFOThreshold(uartHandle->fifoRxThr), BASE_STATUS_ERROR); + 3006664: fdc42783 lw a5,-36(s0) + 3006668: 5bdc lw a5,52(a5) + 300666a: 853e mv a0,a5 + 300666c: 3189 jal ra,30062ae + 300666e: 87aa mv a5,a0 + 3006670: 0017c793 xori a5,a5,1 + 3006674: 9f81 uxtb a5 + 3006676: cb91 beqz a5,300668a + 3006678: 0a200593 li a1,162 + 300667c: 0300f7b7 lui a5,0x300f + 3006680: 26c78513 addi a0,a5,620 # 300f26c + 3006684: 3249 jal ra,3006006 + 3006686: 4785 li a5,1 + 3006688: a439 j 3006896 + UART_PARAM_CHECK_WITH_RET(IsUartOversampleMultiple(uartHandle->handleEx.overSampleMultiple), BASE_STATUS_ERROR); + 300668a: fdc42783 lw a5,-36(s0) + 300668e: 5fbc lw a5,120(a5) + 3006690: 853e mv a0,a5 + 3006692: 3925 jal ra,30062ca + 3006694: 87aa mv a5,a0 + 3006696: 0017c793 xori a5,a5,1 + 300669a: 9f81 uxtb a5 + 300669c: cb91 beqz a5,30066b0 + 300669e: 0a300593 li a1,163 + 30066a2: 0300f7b7 lui a5,0x300f + 30066a6: 26c78513 addi a0,a5,620 # 300f26c + 30066aa: 3ab1 jal ra,3006006 + 30066ac: 4785 li a5,1 + 30066ae: a2e5 j 3006896 + + uartHandle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + 30066b0: fdc42783 lw a5,-36(s0) + 30066b4: 4398 lw a4,0(a5) + 30066b6: 5b1c lw a5,48(a4) + 30066b8: 9bf9 andi a5,a5,-2 + 30066ba: db1c sw a5,48(a4) + while (uartHandle->baseAddress->UART_FR.BIT.busy == 0x01) { + 30066bc: 0001 nop + 30066be: fdc42783 lw a5,-36(s0) + 30066c2: 439c lw a5,0(a5) + 30066c4: 4f9c lw a5,24(a5) + 30066c6: 838d srli a5,a5,0x3 + 30066c8: 8b85 andi a5,a5,1 + 30066ca: 0ff7f713 andi a4,a5,255 + 30066ce: 4785 li a5,1 + 30066d0: fef707e3 beq a4,a5,30066be + ; + } + + uartClock = HAL_CRG_GetIpFreq((void *)uartHandle->baseAddress); + 30066d4: fdc42783 lw a5,-36(s0) + 30066d8: 439c lw a5,0(a5) + 30066da: 853e mv a0,a5 + 30066dc: e4bfb0ef jal ra,3002526 + 30066e0: fea42623 sw a0,-20(s0) + + /* DCL OverSample Multiple check */ + uartHandle->baseAddress->UART_SPCFG.BIT.spcfg = uartHandle->handleEx.overSampleMultiple; + 30066e4: fdc42783 lw a5,-36(s0) + 30066e8: 5fb4 lw a3,120(a5) + 30066ea: fdc42783 lw a5,-36(s0) + 30066ee: 4398 lw a4,0(a5) + 30066f0: 87b6 mv a5,a3 + 30066f2: 8bbd andi a5,a5,15 + 30066f4: 0ff7f693 andi a3,a5,255 + 30066f8: 4f3c lw a5,88(a4) + 30066fa: 8abd andi a3,a3,15 + 30066fc: 9bc1 andi a5,a5,-16 + 30066fe: 8fd5 or a5,a5,a3 + 3006700: cf3c sw a5,88(a4) + + /* DCL sequences setting */ + uartHandle->baseAddress->UART_DS.BIT.msbfirst = uartHandle->handleEx.msbFirst; + 3006702: fdc42783 lw a5,-36(s0) + 3006706: 4398 lw a4,0(a5) + 3006708: fdc42783 lw a5,-36(s0) + 300670c: 07c7c683 lbu a3,124(a5) + 3006710: 4b3c lw a5,80(a4) + 3006712: 8a85 andi a3,a3,1 + 3006714: 9bf9 andi a5,a5,-2 + 3006716: 8fd5 or a5,a5,a3 + 3006718: 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; + 300671a: fdc42783 lw a5,-36(s0) + 300671e: 439c lw a5,0(a5) + 3006720: 4fbc lw a5,88(a5) + 3006722: fef42423 sw a5,-24(s0) + if (uartHandle->baudRate > (uartClock / (OVERSAMPLING_PARAM - oversample))) { + 3006726: fdc42783 lw a5,-36(s0) + 300672a: 43d8 lw a4,4(a5) + 300672c: 46c1 li a3,16 + 300672e: fe842783 lw a5,-24(s0) + 3006732: 40f687b3 sub a5,a3,a5 + 3006736: fec42683 lw a3,-20(s0) + 300673a: 02f6d7b3 divu a5,a3,a5 + 300673e: 00e7f463 bgeu a5,a4,3006746 + return BASE_STATUS_ERROR; + 3006742: 4785 li a5,1 + 3006744: aa89 j 3006896 + } else { + unsigned int tmpClock = uartClock / (OVERSAMPLING_PARAM - oversample) * 64; /* 64 is for decimal parts */ + 3006746: 4741 li a4,16 + 3006748: fe842783 lw a5,-24(s0) + 300674c: 40f707b3 sub a5,a4,a5 + 3006750: fec42703 lw a4,-20(s0) + 3006754: 02f757b3 divu a5,a4,a5 + 3006758: 079a slli a5,a5,0x6 + 300675a: fef42223 sw a5,-28(s0) + quot = DivClosest(tmpClock, uartHandle->baudRate); + 300675e: fdc42783 lw a5,-36(s0) + 3006762: 43dc lw a5,4(a5) + 3006764: 85be mv a1,a5 + 3006766: fe442503 lw a0,-28(s0) + 300676a: 3eb5 jal ra,30062e6 + 300676c: fea42023 sw a0,-32(s0) + } + /* Clear the baud rate divider register */ + uartHandle->baseAddress->UART_FBRD.reg = 0; + 3006770: fdc42783 lw a5,-36(s0) + 3006774: 439c lw a5,0(a5) + 3006776: 0207a423 sw zero,40(a5) + uartHandle->baseAddress->UART_IBRD.reg = 0; + 300677a: fdc42783 lw a5,-36(s0) + 300677e: 439c lw a5,0(a5) + 3006780: 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); + 3006784: fdc42783 lw a5,-36(s0) + 3006788: 439c lw a5,0(a5) + 300678a: fe042703 lw a4,-32(s0) + 300678e: 03f77713 andi a4,a4,63 + 3006792: 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); + 3006794: fdc42783 lw a5,-36(s0) + 3006798: 439c lw a5,0(a5) + 300679a: fe042703 lw a4,-32(s0) + 300679e: 8319 srli a4,a4,0x6 + 30067a0: d3d8 sw a4,36(a5) + uartHandle->baseAddress->UART_LCR_H.reg = 0; + 30067a2: fdc42783 lw a5,-36(s0) + 30067a6: 439c lw a5,0(a5) + 30067a8: 0207a623 sw zero,44(a5) + uartHandle->baseAddress->UART_LCR_H.BIT.wlen = uartHandle->dataLength; /* Frame length seting */ + 30067ac: fdc42783 lw a5,-36(s0) + 30067b0: 4794 lw a3,8(a5) + 30067b2: fdc42783 lw a5,-36(s0) + 30067b6: 4398 lw a4,0(a5) + 30067b8: 87b6 mv a5,a3 + 30067ba: 8b8d andi a5,a5,3 + 30067bc: 0ff7f693 andi a3,a5,255 + 30067c0: 575c lw a5,44(a4) + 30067c2: 8a8d andi a3,a3,3 + 30067c4: 0696 slli a3,a3,0x5 + 30067c6: f9f7f793 andi a5,a5,-97 + 30067ca: 8fd5 or a5,a5,a3 + 30067cc: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_LCR_H.BIT.stp2 = uartHandle->stopBits; /* Stop bit seting */ + 30067ce: fdc42783 lw a5,-36(s0) + 30067d2: 47d4 lw a3,12(a5) + 30067d4: fdc42783 lw a5,-36(s0) + 30067d8: 4398 lw a4,0(a5) + 30067da: 87b6 mv a5,a3 + 30067dc: 8b85 andi a5,a5,1 + 30067de: 0ff7f693 andi a3,a5,255 + 30067e2: 575c lw a5,44(a4) + 30067e4: 8a85 andi a3,a3,1 + 30067e6: 068e slli a3,a3,0x3 + 30067e8: 9bdd andi a5,a5,-9 + 30067ea: 8fd5 or a5,a5,a3 + 30067ec: d75c sw a5,44(a4) + UART_SetParityBit(uartHandle); + 30067ee: fdc42503 lw a0,-36(s0) + 30067f2: 39a9 jal ra,300644c + if (uartHandle->fifoMode == true) { /* FIFO threshold setting */ + 30067f4: fdc42783 lw a5,-36(s0) + 30067f8: 02c7c783 lbu a5,44(a5) + 30067fc: cbb1 beqz a5,3006850 + uartHandle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_ENABLE; + 30067fe: fdc42783 lw a5,-36(s0) + 3006802: 4398 lw a4,0(a5) + 3006804: 575c lw a5,44(a4) + 3006806: 0107e793 ori a5,a5,16 + 300680a: d75c sw a5,44(a4) + uartHandle->baseAddress->UART_IFLS.BIT.rxiflsel = uartHandle->fifoRxThr; + 300680c: fdc42783 lw a5,-36(s0) + 3006810: 5bd4 lw a3,52(a5) + 3006812: fdc42783 lw a5,-36(s0) + 3006816: 4398 lw a4,0(a5) + 3006818: 87b6 mv a5,a3 + 300681a: 8bbd andi a5,a5,15 + 300681c: 0ff7f693 andi a3,a5,255 + 3006820: 5b5c lw a5,52(a4) + 3006822: 8abd andi a3,a3,15 + 3006824: 06a2 slli a3,a3,0x8 + 3006826: 767d lui a2,0xfffff + 3006828: 0ff60613 addi a2,a2,255 # fffff0ff + 300682c: 8ff1 and a5,a5,a2 + 300682e: 8fd5 or a5,a5,a3 + 3006830: db5c sw a5,52(a4) + uartHandle->baseAddress->UART_IFLS.BIT.txiflsel = uartHandle->fifoTxThr; + 3006832: fdc42783 lw a5,-36(s0) + 3006836: 5b94 lw a3,48(a5) + 3006838: fdc42783 lw a5,-36(s0) + 300683c: 4398 lw a4,0(a5) + 300683e: 87b6 mv a5,a3 + 3006840: 8bbd andi a5,a5,15 + 3006842: 0ff7f693 andi a3,a5,255 + 3006846: 5b5c lw a5,52(a4) + 3006848: 8abd andi a3,a3,15 + 300684a: 9bc1 andi a5,a5,-16 + 300684c: 8fd5 or a5,a5,a3 + 300684e: db5c sw a5,52(a4) + } + if (uartHandle->hwFlowCtr == UART_HW_FLOWCTR_ENABLE) { /* Hardwarer flow control setting */ + 3006850: fdc42783 lw a5,-36(s0) + 3006854: 5f98 lw a4,56(a5) + 3006856: 4785 li a5,1 + 3006858: 00f71c63 bne a4,a5,3006870 + uartHandle->baseAddress->UART_CR.reg |= 0xC000; + 300685c: fdc42783 lw a5,-36(s0) + 3006860: 439c lw a5,0(a5) + 3006862: 5b94 lw a3,48(a5) + 3006864: fdc42783 lw a5,-36(s0) + 3006868: 439c lw a5,0(a5) + 300686a: 6731 lui a4,0xc + 300686c: 8f55 or a4,a4,a3 + 300686e: db98 sw a4,48(a5) + } + uartHandle->baseAddress->UART_CR.reg |= 0x301; /* Enable bit use 0x301 is to set txe/rxe/uarten */ + 3006870: fdc42783 lw a5,-36(s0) + 3006874: 439c lw a5,0(a5) + 3006876: 5b98 lw a4,48(a5) + 3006878: fdc42783 lw a5,-36(s0) + 300687c: 439c lw a5,0(a5) + 300687e: 30176713 ori a4,a4,769 + 3006882: db98 sw a4,48(a5) + uartHandle->txState = UART_STATE_READY; + 3006884: fdc42783 lw a5,-36(s0) + 3006888: 4705 li a4,1 + 300688a: c7b8 sw a4,72(a5) + uartHandle->rxState = UART_STATE_READY; + 300688c: fdc42783 lw a5,-36(s0) + 3006890: 4705 li a4,1 + 3006892: c7f8 sw a4,76(a5) + return BASE_STATUS_OK; + 3006894: 4781 li a5,0 +} + 3006896: 853e mv a0,a5 + 3006898: 50b2 lw ra,44(sp) + 300689a: 5422 lw s0,40(sp) + 300689c: 6145 addi sp,sp,48 + 300689e: 8082 ret + +030068a0 : + * The hanler function is called when Tx interruption occurs. + * @param uartHandle UART handle. + * @retval None. + */ +static void WriteITCallBack(UART_Handle *uartHandle) +{ + 30068a0: 1101 addi sp,sp,-32 + 30068a2: ce06 sw ra,28(sp) + 30068a4: cc22 sw s0,24(sp) + 30068a6: 1000 addi s0,sp,32 + 30068a8: fea42623 sw a0,-20(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 30068ac: fec42783 lw a5,-20(s0) + 30068b0: eb89 bnez a5,30068c2 + 30068b2: 16200593 li a1,354 + 30068b6: 0300f7b7 lui a5,0x300f + 30068ba: 26c78513 addi a0,a5,620 # 300f26c + 30068be: 25b1 jal ra,3006f0a + 30068c0: a001 j 30068c0 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 30068c2: fec42783 lw a5,-20(s0) + 30068c6: 4398 lw a4,0(a5) + 30068c8: 140007b7 lui a5,0x14000 + 30068cc: 02f70f63 beq a4,a5,300690a + 30068d0: fec42783 lw a5,-20(s0) + 30068d4: 4398 lw a4,0(a5) + 30068d6: 140017b7 lui a5,0x14001 + 30068da: 02f70863 beq a4,a5,300690a + 30068de: fec42783 lw a5,-20(s0) + 30068e2: 4398 lw a4,0(a5) + 30068e4: 140027b7 lui a5,0x14002 + 30068e8: 02f70163 beq a4,a5,300690a + 30068ec: fec42783 lw a5,-20(s0) + 30068f0: 4398 lw a4,0(a5) + 30068f2: 140037b7 lui a5,0x14003 + 30068f6: 00f70a63 beq a4,a5,300690a + 30068fa: 16300593 li a1,355 + 30068fe: 0300f7b7 lui a5,0x300f + 3006902: 26c78513 addi a0,a5,620 # 300f26c + 3006906: 2511 jal ra,3006f0a + 3006908: a001 j 3006908 + UART_ASSERT_PARAM(uartHandle->txbuff != NULL); + 300690a: fec42783 lw a5,-20(s0) + 300690e: 4fdc lw a5,28(a5) + 3006910: eb89 bnez a5,3006922 + 3006912: 16400593 li a1,356 + 3006916: 0300f7b7 lui a5,0x300f + 300691a: 26c78513 addi a0,a5,620 # 300f26c + 300691e: 23f5 jal ra,3006f0a + 3006920: a001 j 3006920 + if (uartHandle->txState == UART_STATE_BUSY_TX) { + 3006922: fec42783 lw a5,-20(s0) + 3006926: 47b8 lw a4,72(a5) + 3006928: 478d li a5,3 + 300692a: 0af71f63 bne a4,a5,30069e8 + while (uartHandle->txBuffSize > 0) { + 300692e: a8a1 j 3006986 + if (uartHandle->baseAddress->UART_FR.BIT.txff == 1) { /* True when the TX FIFO is full */ + 3006930: fec42783 lw a5,-20(s0) + 3006934: 439c lw a5,0(a5) + 3006936: 4f9c lw a5,24(a5) + 3006938: 8395 srli a5,a5,0x5 + 300693a: 8b85 andi a5,a5,1 + 300693c: 0ff7f713 andi a4,a5,255 + 3006940: 4785 li a5,1 + 3006942: 04f70763 beq a4,a5,3006990 + break; + } + uartHandle->baseAddress->UART_DR.BIT.data = *(uartHandle->txbuff); + 3006946: fec42783 lw a5,-20(s0) + 300694a: 4fdc lw a5,28(a5) + 300694c: fec42703 lw a4,-20(s0) + 3006950: 4318 lw a4,0(a4) + 3006952: 239c lbu a5,0(a5) + 3006954: 0ff7f693 andi a3,a5,255 + 3006958: 431c lw a5,0(a4) + 300695a: 0ff6f693 andi a3,a3,255 + 300695e: f007f793 andi a5,a5,-256 + 3006962: 8fd5 or a5,a5,a3 + 3006964: c31c sw a5,0(a4) + (uartHandle->txbuff)++; + 3006966: fec42783 lw a5,-20(s0) + 300696a: 4fdc lw a5,28(a5) + 300696c: 00178713 addi a4,a5,1 + 3006970: fec42783 lw a5,-20(s0) + 3006974: cfd8 sw a4,28(a5) + uartHandle->txBuffSize -= 1; + 3006976: fec42783 lw a5,-20(s0) + 300697a: 53dc lw a5,36(a5) + 300697c: fff78713 addi a4,a5,-1 + 3006980: fec42783 lw a5,-20(s0) + 3006984: d3d8 sw a4,36(a5) + while (uartHandle->txBuffSize > 0) { + 3006986: fec42783 lw a5,-20(s0) + 300698a: 53dc lw a5,36(a5) + 300698c: f3d5 bnez a5,3006930 + 300698e: a011 j 3006992 + break; + 3006990: 0001 nop + } + if (uartHandle->txBuffSize == 0) { + 3006992: fec42783 lw a5,-20(s0) + 3006996: 53dc lw a5,36(a5) + 3006998: eba1 bnez a5,30069e8 + uartHandle->baseAddress->UART_IMSC.reg &= 0xFFFFEFDF; /* Disable txim and txfeim */ + 300699a: fec42783 lw a5,-20(s0) + 300699e: 439c lw a5,0(a5) + 30069a0: 5f94 lw a3,56(a5) + 30069a2: fec42783 lw a5,-20(s0) + 30069a6: 439c lw a5,0(a5) + 30069a8: 777d lui a4,0xfffff + 30069aa: fdf70713 addi a4,a4,-33 # ffffefdf + 30069ae: 8f75 and a4,a4,a3 + 30069b0: df98 sw a4,56(a5) + uartHandle->baseAddress->UART_ICR.reg |= 0x1020; /* Clear txic and txfeic */ + 30069b2: fec42783 lw a5,-20(s0) + 30069b6: 439c lw a5,0(a5) + 30069b8: 43f4 lw a3,68(a5) + 30069ba: fec42783 lw a5,-20(s0) + 30069be: 439c lw a5,0(a5) + 30069c0: 6705 lui a4,0x1 + 30069c2: 02070713 addi a4,a4,32 # 1020 + 30069c6: 8f55 or a4,a4,a3 + 30069c8: c3f8 sw a4,68(a5) + uartHandle->txState = UART_STATE_READY; + 30069ca: fec42783 lw a5,-20(s0) + 30069ce: 4705 li a4,1 + 30069d0: c7b8 sw a4,72(a5) + /* Call user call back function */ + if (uartHandle->userCallBack.WriteItFinishCallBack != NULL) { + 30069d2: fec42783 lw a5,-20(s0) + 30069d6: 4bfc lw a5,84(a5) + 30069d8: cb81 beqz a5,30069e8 + uartHandle->userCallBack.WriteItFinishCallBack(uartHandle); + 30069da: fec42783 lw a5,-20(s0) + 30069de: 4bfc lw a5,84(a5) + 30069e0: fec42503 lw a0,-20(s0) + 30069e4: 9782 jalr a5 + } + } + } + return; + 30069e6: 0001 nop + 30069e8: 0001 nop +} + 30069ea: 40f2 lw ra,28(sp) + 30069ec: 4462 lw s0,24(sp) + 30069ee: 6105 addi sp,sp,32 + 30069f0: 8082 ret + +030069f2 : + * @param uartHandle UART handle. + * @retval None. + */ +unsigned char USART_RX_STA=0; //接收状态标记 0表示开始接收,1表示接收到0d, 2表示接收完毕 +static void ReadITCallBack(UART_Handle *uartHandle) +{ + 30069f2: 7179 addi sp,sp,-48 + 30069f4: d606 sw ra,44(sp) + 30069f6: d422 sw s0,40(sp) + 30069f8: 1800 addi s0,sp,48 + 30069fa: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 30069fe: fdc42783 lw a5,-36(s0) + 3006a02: eb89 bnez a5,3006a14 + 3006a04: 1fe00593 li a1,510 + 3006a08: 0300f7b7 lui a5,0x300f + 3006a0c: 26c78513 addi a0,a5,620 # 300f26c + 3006a10: 29ed jal ra,3006f0a + 3006a12: a001 j 3006a12 + UART_ASSERT_PARAM(uartHandle->rxbuff != NULL); + 3006a14: fdc42783 lw a5,-36(s0) + 3006a18: 539c lw a5,32(a5) + 3006a1a: eb89 bnez a5,3006a2c + 3006a1c: 1ff00593 li a1,511 + 3006a20: 0300f7b7 lui a5,0x300f + 3006a24: 26c78513 addi a0,a5,620 # 300f26c + 3006a28: 21cd jal ra,3006f0a + 3006a2a: a001 j 3006a2a + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3006a2c: fdc42783 lw a5,-36(s0) + 3006a30: 4398 lw a4,0(a5) + 3006a32: 140007b7 lui a5,0x14000 + 3006a36: 02f70f63 beq a4,a5,3006a74 + 3006a3a: fdc42783 lw a5,-36(s0) + 3006a3e: 4398 lw a4,0(a5) + 3006a40: 140017b7 lui a5,0x14001 + 3006a44: 02f70863 beq a4,a5,3006a74 + 3006a48: fdc42783 lw a5,-36(s0) + 3006a4c: 4398 lw a4,0(a5) + 3006a4e: 140027b7 lui a5,0x14002 + 3006a52: 02f70163 beq a4,a5,3006a74 + 3006a56: fdc42783 lw a5,-36(s0) + 3006a5a: 4398 lw a4,0(a5) + 3006a5c: 140037b7 lui a5,0x14003 + 3006a60: 00f70a63 beq a4,a5,3006a74 + 3006a64: 20000593 li a1,512 + 3006a68: 0300f7b7 lui a5,0x300f + 3006a6c: 26c78513 addi a0,a5,620 # 300f26c + 3006a70: 2969 jal ra,3006f0a + 3006a72: a001 j 3006a72 + if (uartHandle->rxState == UART_STATE_BUSY_RX) { + 3006a74: fdc42783 lw a5,-36(s0) + 3006a78: 47f8 lw a4,76(a5) + 3006a7a: 4791 li a5,4 + 3006a7c: 0cf71763 bne a4,a5,3006b4a + unsigned int tmp; + while (USART_RX_STA!=2) { + 3006a80: a8bd j 3006afe + if (uartHandle->baseAddress->UART_FR.BIT.rxfe == 0x01) { /* True when the RX FIFO is empty */ + 3006a82: fdc42783 lw a5,-36(s0) + 3006a86: 439c lw a5,0(a5) + 3006a88: 4f9c lw a5,24(a5) + 3006a8a: 8391 srli a5,a5,0x4 + 3006a8c: 8b85 andi a5,a5,1 + 3006a8e: 0ff7f713 andi a4,a5,255 + 3006a92: 4785 li a5,1 + 3006a94: 06f70b63 beq a4,a5,3006b0a + break; + } + tmp = uartHandle->baseAddress->UART_DR.reg; + 3006a98: fdc42783 lw a5,-36(s0) + 3006a9c: 439c lw a5,0(a5) + 3006a9e: 439c lw a5,0(a5) + 3006aa0: fef42623 sw a5,-20(s0) + if(USART_RX_STA==1)//接收到了0x0d + 3006aa4: 2b51c703 lbu a4,693(gp) # 40008e9 + 3006aa8: 4785 li a5,1 + 3006aaa: 02f71063 bne a4,a5,3006aca + { + if((tmp & 0xFF)!=0x0a)tmp=0;//接收错误,重新开始 + 3006aae: fec42783 lw a5,-20(s0) + 3006ab2: 0ff7f713 andi a4,a5,255 + 3006ab6: 47a9 li a5,10 + 3006ab8: 00f70563 beq a4,a5,3006ac2 + 3006abc: fe042623 sw zero,-20(s0) + 3006ac0: a83d j 3006afe + else USART_RX_STA = 2; //接收完成了 + 3006ac2: 4709 li a4,2 + 3006ac4: 2ae18aa3 sb a4,693(gp) # 40008e9 + 3006ac8: a81d j 3006afe + } + else //还没收到0X0D + { + if((tmp & 0xFF)==0x0d)USART_RX_STA = 1; + 3006aca: fec42783 lw a5,-20(s0) + 3006ace: 0ff7f713 andi a4,a5,255 + 3006ad2: 47b5 li a5,13 + 3006ad4: 00f71663 bne a4,a5,3006ae0 + 3006ad8: 4705 li a4,1 + 3006ada: 2ae18aa3 sb a4,693(gp) # 40008e9 + 3006ade: a005 j 3006afe + else + { + *(uartHandle->rxbuff)=(tmp & 0xFF); + 3006ae0: fdc42783 lw a5,-36(s0) + 3006ae4: 539c lw a5,32(a5) + 3006ae6: fec42703 lw a4,-20(s0) + 3006aea: 9f01 uxtb a4 + 3006aec: a398 sb a4,0(a5) + uartHandle->rxbuff++; + 3006aee: fdc42783 lw a5,-36(s0) + 3006af2: 539c lw a5,32(a5) + 3006af4: 00178713 addi a4,a5,1 + 3006af8: fdc42783 lw a5,-36(s0) + 3006afc: d398 sw a4,32(a5) + while (USART_RX_STA!=2) { + 3006afe: 2b51c703 lbu a4,693(gp) # 40008e9 + 3006b02: 4789 li a5,2 + 3006b04: f6f71fe3 bne a4,a5,3006a82 + 3006b08: a011 j 3006b0c + break; + 3006b0a: 0001 nop + //长度校验实现 + } + } + } + uartHandle->baseAddress->UART_ICR.reg |= 0x20050; /* Clear rxic, rtic and rxfneic */ + 3006b0c: fdc42783 lw a5,-36(s0) + 3006b10: 439c lw a5,0(a5) + 3006b12: 43f4 lw a3,68(a5) + 3006b14: fdc42783 lw a5,-36(s0) + 3006b18: 439c lw a5,0(a5) + 3006b1a: 00020737 lui a4,0x20 + 3006b1e: 05070713 addi a4,a4,80 # 20050 + 3006b22: 8f55 or a4,a4,a3 + 3006b24: c3f8 sw a4,68(a5) + if (uartHandle->userCallBack.ReadItFinishCallBack != NULL && USART_RX_STA==2) { + 3006b26: fdc42783 lw a5,-36(s0) + 3006b2a: 4fbc lw a5,88(a5) + 3006b2c: cf99 beqz a5,3006b4a + 3006b2e: 2b51c703 lbu a4,693(gp) # 40008e9 + 3006b32: 4789 li a5,2 + 3006b34: 00f71b63 bne a4,a5,3006b4a + USART_RX_STA = 0; + 3006b38: 2a018aa3 sb zero,693(gp) # 40008e9 + uartHandle->userCallBack.ReadItFinishCallBack(uartHandle); + 3006b3c: fdc42783 lw a5,-36(s0) + 3006b40: 4fbc lw a5,88(a5) + 3006b42: fdc42503 lw a0,-36(s0) + 3006b46: 9782 jalr a5 + } + } + return; + 3006b48: 0001 nop + 3006b4a: 0001 nop +} + 3006b4c: 50b2 lw ra,44(sp) + 3006b4e: 5422 lw s0,40(sp) + 3006b50: 6145 addi sp,sp,48 + 3006b52: 8082 ret + +03006b54 : + * @brief Error handler function of receiving. + * @param uartHandle UART handle. + * @retval None. + */ +static void ErrorServiceCallback(UART_Handle *uartHandle) +{ + 3006b54: 7179 addi sp,sp,-48 + 3006b56: d606 sw ra,44(sp) + 3006b58: d422 sw s0,40(sp) + 3006b5a: 1800 addi s0,sp,48 + 3006b5c: fca42e23 sw a0,-36(s0) + unsigned int error = 0x00; + 3006b60: fe042623 sw zero,-20(s0) + if (uartHandle->baseAddress->UART_MIS.BIT.oemis == BASE_CFG_ENABLE) { /* Overflow error interrupt */ + 3006b64: fdc42783 lw a5,-36(s0) + 3006b68: 439c lw a5,0(a5) + 3006b6a: 43bc lw a5,64(a5) + 3006b6c: 83a9 srli a5,a5,0xa + 3006b6e: 8b85 andi a5,a5,1 + 3006b70: 0ff7f713 andi a4,a5,255 + 3006b74: 4785 li a5,1 + 3006b76: 02f71763 bne a4,a5,3006ba4 + error |= uartHandle->baseAddress->UART_MIS.BIT.oemis; + 3006b7a: fdc42783 lw a5,-36(s0) + 3006b7e: 439c lw a5,0(a5) + 3006b80: 43bc lw a5,64(a5) + 3006b82: 83a9 srli a5,a5,0xa + 3006b84: 8b85 andi a5,a5,1 + 3006b86: 9f81 uxtb a5 + 3006b88: 873e mv a4,a5 + 3006b8a: fec42783 lw a5,-20(s0) + 3006b8e: 8fd9 or a5,a5,a4 + 3006b90: fef42623 sw a5,-20(s0) + uartHandle->baseAddress->UART_ICR.BIT.oeic = BASE_CFG_ENABLE; + 3006b94: fdc42783 lw a5,-36(s0) + 3006b98: 4398 lw a4,0(a5) + 3006b9a: 437c lw a5,68(a4) + 3006b9c: 4007e793 ori a5,a5,1024 + 3006ba0: c37c sw a5,68(a4) + 3006ba2: a0c1 j 3006c62 + } else if (uartHandle->baseAddress->UART_MIS.BIT.bemis == BASE_CFG_ENABLE) { /* Break error interrupt */ + 3006ba4: fdc42783 lw a5,-36(s0) + 3006ba8: 439c lw a5,0(a5) + 3006baa: 43bc lw a5,64(a5) + 3006bac: 83a5 srli a5,a5,0x9 + 3006bae: 8b85 andi a5,a5,1 + 3006bb0: 0ff7f713 andi a4,a5,255 + 3006bb4: 4785 li a5,1 + 3006bb6: 02f71763 bne a4,a5,3006be4 + error |= uartHandle->baseAddress->UART_MIS.BIT.bemis; + 3006bba: fdc42783 lw a5,-36(s0) + 3006bbe: 439c lw a5,0(a5) + 3006bc0: 43bc lw a5,64(a5) + 3006bc2: 83a5 srli a5,a5,0x9 + 3006bc4: 8b85 andi a5,a5,1 + 3006bc6: 9f81 uxtb a5 + 3006bc8: 873e mv a4,a5 + 3006bca: fec42783 lw a5,-20(s0) + 3006bce: 8fd9 or a5,a5,a4 + 3006bd0: fef42623 sw a5,-20(s0) + uartHandle->baseAddress->UART_ICR.BIT.beic = BASE_CFG_ENABLE; + 3006bd4: fdc42783 lw a5,-36(s0) + 3006bd8: 4398 lw a4,0(a5) + 3006bda: 437c lw a5,68(a4) + 3006bdc: 2007e793 ori a5,a5,512 + 3006be0: c37c sw a5,68(a4) + 3006be2: a041 j 3006c62 + } else if (uartHandle->baseAddress->UART_MIS.BIT.pemis == BASE_CFG_ENABLE) { /* Check error interrupt */ + 3006be4: fdc42783 lw a5,-36(s0) + 3006be8: 439c lw a5,0(a5) + 3006bea: 43bc lw a5,64(a5) + 3006bec: 83a1 srli a5,a5,0x8 + 3006bee: 8b85 andi a5,a5,1 + 3006bf0: 0ff7f713 andi a4,a5,255 + 3006bf4: 4785 li a5,1 + 3006bf6: 02f71763 bne a4,a5,3006c24 + error |= uartHandle->baseAddress->UART_MIS.BIT.pemis; + 3006bfa: fdc42783 lw a5,-36(s0) + 3006bfe: 439c lw a5,0(a5) + 3006c00: 43bc lw a5,64(a5) + 3006c02: 83a1 srli a5,a5,0x8 + 3006c04: 8b85 andi a5,a5,1 + 3006c06: 9f81 uxtb a5 + 3006c08: 873e mv a4,a5 + 3006c0a: fec42783 lw a5,-20(s0) + 3006c0e: 8fd9 or a5,a5,a4 + 3006c10: fef42623 sw a5,-20(s0) + uartHandle->baseAddress->UART_ICR.BIT.peic = BASE_CFG_ENABLE; + 3006c14: fdc42783 lw a5,-36(s0) + 3006c18: 4398 lw a4,0(a5) + 3006c1a: 437c lw a5,68(a4) + 3006c1c: 1007e793 ori a5,a5,256 + 3006c20: c37c sw a5,68(a4) + 3006c22: a081 j 3006c62 + } else if (uartHandle->baseAddress->UART_MIS.BIT.femis == BASE_CFG_ENABLE) { /* Frame error interrupt */ + 3006c24: fdc42783 lw a5,-36(s0) + 3006c28: 439c lw a5,0(a5) + 3006c2a: 43bc lw a5,64(a5) + 3006c2c: 839d srli a5,a5,0x7 + 3006c2e: 8b85 andi a5,a5,1 + 3006c30: 0ff7f713 andi a4,a5,255 + 3006c34: 4785 li a5,1 + 3006c36: 02f71663 bne a4,a5,3006c62 + error |= uartHandle->baseAddress->UART_MIS.BIT.femis; + 3006c3a: fdc42783 lw a5,-36(s0) + 3006c3e: 439c lw a5,0(a5) + 3006c40: 43bc lw a5,64(a5) + 3006c42: 839d srli a5,a5,0x7 + 3006c44: 8b85 andi a5,a5,1 + 3006c46: 9f81 uxtb a5 + 3006c48: 873e mv a4,a5 + 3006c4a: fec42783 lw a5,-20(s0) + 3006c4e: 8fd9 or a5,a5,a4 + 3006c50: fef42623 sw a5,-20(s0) + uartHandle->baseAddress->UART_ICR.BIT.feic = BASE_CFG_ENABLE; + 3006c54: fdc42783 lw a5,-36(s0) + 3006c58: 4398 lw a4,0(a5) + 3006c5a: 437c lw a5,68(a4) + 3006c5c: 0807e793 ori a5,a5,128 + 3006c60: c37c sw a5,68(a4) + } + if (error != 0x00) { + 3006c62: fec42783 lw a5,-20(s0) + 3006c66: c79d beqz a5,3006c94 + uartHandle->errorType = error; + 3006c68: fdc42783 lw a5,-36(s0) + 3006c6c: fec42703 lw a4,-20(s0) + 3006c70: cbb8 sw a4,80(a5) + if (uartHandle->rxMode == UART_MODE_INTERRUPT && uartHandle->userCallBack.TransmitItErrorCallBack != NULL) { + 3006c72: fdc42783 lw a5,-36(s0) + 3006c76: 4f98 lw a4,24(a5) + 3006c78: 4785 li a5,1 + 3006c7a: 00f71d63 bne a4,a5,3006c94 + 3006c7e: fdc42783 lw a5,-36(s0) + 3006c82: 53fc lw a5,100(a5) + 3006c84: cb81 beqz a5,3006c94 + uartHandle->userCallBack.TransmitItErrorCallBack(uartHandle); + 3006c86: fdc42783 lw a5,-36(s0) + 3006c8a: 53fc lw a5,100(a5) + 3006c8c: fdc42503 lw a0,-36(s0) + 3006c90: 9782 jalr a5 + } + } + return; + 3006c92: 0001 nop + 3006c94: 0001 nop +} + 3006c96: 50b2 lw ra,44(sp) + 3006c98: 5422 lw s0,40(sp) + 3006c9a: 6145 addi sp,sp,48 + 3006c9c: 8082 ret + +03006c9e : + * @brief UART Interrupt service processing function. + * @param handle UART handle. + * @retval None. + */ +void HAL_UART_IrqHandler(void *handle) +{ + 3006c9e: 7179 addi sp,sp,-48 + 3006ca0: d606 sw ra,44(sp) + 3006ca2: d422 sw s0,40(sp) + 3006ca4: 1800 addi s0,sp,48 + 3006ca6: fca42e23 sw a0,-36(s0) + UART_ASSERT_PARAM(handle != NULL); + 3006caa: fdc42783 lw a5,-36(s0) + 3006cae: eb89 bnez a5,3006cc0 + 3006cb0: 2dc00593 li a1,732 + 3006cb4: 0300f7b7 lui a5,0x300f + 3006cb8: 26c78513 addi a0,a5,620 # 300f26c + 3006cbc: 24b9 jal ra,3006f0a + 3006cbe: a001 j 3006cbe + UART_Handle *uartHandle = (UART_Handle *)handle; + 3006cc0: fdc42783 lw a5,-36(s0) + 3006cc4: fef42623 sw a5,-20(s0) + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3006cc8: fec42783 lw a5,-20(s0) + 3006ccc: 4398 lw a4,0(a5) + 3006cce: 140007b7 lui a5,0x14000 + 3006cd2: 02f70f63 beq a4,a5,3006d10 + 3006cd6: fec42783 lw a5,-20(s0) + 3006cda: 4398 lw a4,0(a5) + 3006cdc: 140017b7 lui a5,0x14001 + 3006ce0: 02f70863 beq a4,a5,3006d10 + 3006ce4: fec42783 lw a5,-20(s0) + 3006ce8: 4398 lw a4,0(a5) + 3006cea: 140027b7 lui a5,0x14002 + 3006cee: 02f70163 beq a4,a5,3006d10 + 3006cf2: fec42783 lw a5,-20(s0) + 3006cf6: 4398 lw a4,0(a5) + 3006cf8: 140037b7 lui a5,0x14003 + 3006cfc: 00f70a63 beq a4,a5,3006d10 + 3006d00: 2de00593 li a1,734 + 3006d04: 0300f7b7 lui a5,0x300f + 3006d08: 26c78513 addi a0,a5,620 # 300f26c + 3006d0c: 2afd jal ra,3006f0a + 3006d0e: a001 j 3006d0e + /* when tx interrupt is generated */ + if ((uartHandle->baseAddress->UART_MIS.BIT.txmis == 0x01) || + 3006d10: fec42783 lw a5,-20(s0) + 3006d14: 439c lw a5,0(a5) + 3006d16: 43bc lw a5,64(a5) + 3006d18: 8395 srli a5,a5,0x5 + 3006d1a: 8b85 andi a5,a5,1 + 3006d1c: 0ff7f713 andi a4,a5,255 + 3006d20: 4785 li a5,1 + 3006d22: 00f70d63 beq a4,a5,3006d3c + (uartHandle->baseAddress->UART_MIS.BIT.txfeis == 0x01)) { + 3006d26: fec42783 lw a5,-20(s0) + 3006d2a: 439c lw a5,0(a5) + 3006d2c: 43bc lw a5,64(a5) + 3006d2e: 83b1 srli a5,a5,0xc + 3006d30: 8b85 andi a5,a5,1 + 3006d32: 0ff7f713 andi a4,a5,255 + if ((uartHandle->baseAddress->UART_MIS.BIT.txmis == 0x01) || + 3006d36: 4785 li a5,1 + 3006d38: 00f71563 bne a4,a5,3006d42 + WriteITCallBack(uartHandle); + 3006d3c: fec42503 lw a0,-20(s0) + 3006d40: 3685 jal ra,30068a0 + } + /* when rx interrupt is generated */ + if ((uartHandle->baseAddress->UART_MIS.BIT.rxmis == 0x01 || uartHandle->baseAddress->UART_MIS.BIT.rtmis == 0x01) || + 3006d42: fec42783 lw a5,-20(s0) + 3006d46: 439c lw a5,0(a5) + 3006d48: 43bc lw a5,64(a5) + 3006d4a: 8391 srli a5,a5,0x4 + 3006d4c: 8b85 andi a5,a5,1 + 3006d4e: 0ff7f713 andi a4,a5,255 + 3006d52: 4785 li a5,1 + 3006d54: 02f70863 beq a4,a5,3006d84 + 3006d58: fec42783 lw a5,-20(s0) + 3006d5c: 439c lw a5,0(a5) + 3006d5e: 43bc lw a5,64(a5) + 3006d60: 8399 srli a5,a5,0x6 + 3006d62: 8b85 andi a5,a5,1 + 3006d64: 0ff7f713 andi a4,a5,255 + 3006d68: 4785 li a5,1 + 3006d6a: 00f70d63 beq a4,a5,3006d84 + (uartHandle->baseAddress->UART_MIS.BIT.rxfneis == 0x1)) { + 3006d6e: fec42783 lw a5,-20(s0) + 3006d72: 439c lw a5,0(a5) + 3006d74: 43bc lw a5,64(a5) + 3006d76: 83c5 srli a5,a5,0x11 + 3006d78: 8b85 andi a5,a5,1 + 3006d7a: 0ff7f713 andi a4,a5,255 + if ((uartHandle->baseAddress->UART_MIS.BIT.rxmis == 0x01 || uartHandle->baseAddress->UART_MIS.BIT.rtmis == 0x01) || + 3006d7e: 4785 li a5,1 + 3006d80: 00f71563 bne a4,a5,3006d8a + ReadITCallBack(uartHandle); + 3006d84: fec42503 lw a0,-20(s0) + 3006d88: 31ad jal ra,30069f2 + } + /* when charter match interrupt is generated */ + if (uartHandle->baseAddress->UART_MIS.BIT.cmis == 0x01) { + 3006d8a: fec42783 lw a5,-20(s0) + 3006d8e: 439c lw a5,0(a5) + 3006d90: 43bc lw a5,64(a5) + 3006d92: 83d5 srli a5,a5,0x15 + 3006d94: 8b85 andi a5,a5,1 + 3006d96: 0ff7f713 andi a4,a5,255 + 3006d9a: 4785 li a5,1 + 3006d9c: 00f71663 bne a4,a5,3006da8 + CharterMatchCallBack(uartHandle); + 3006da0: fec42503 lw a0,-20(s0) + 3006da4: e5cff0ef jal ra,3006400 + } + /* when baud detect interrupt is generated */ + if (uartHandle->baseAddress->UART_MIS.BIT.abdcis == 0x01 || uartHandle->baseAddress->UART_MIS.BIT.abdeis == 0x01) { + 3006da8: fec42783 lw a5,-20(s0) + 3006dac: 439c lw a5,0(a5) + 3006dae: 43bc lw a5,64(a5) + 3006db0: 83cd srli a5,a5,0x13 + 3006db2: 8b85 andi a5,a5,1 + 3006db4: 0ff7f713 andi a4,a5,255 + 3006db8: 4785 li a5,1 + 3006dba: 00f70d63 beq a4,a5,3006dd4 + 3006dbe: fec42783 lw a5,-20(s0) + 3006dc2: 439c lw a5,0(a5) + 3006dc4: 43bc lw a5,64(a5) + 3006dc6: 83d1 srli a5,a5,0x14 + 3006dc8: 8b85 andi a5,a5,1 + 3006dca: 0ff7f713 andi a4,a5,255 + 3006dce: 4785 li a5,1 + 3006dd0: 00f71663 bne a4,a5,3006ddc + BaudDetectCallBack(uartHandle); + 3006dd4: fec42503 lw a0,-20(s0) + 3006dd8: d4cff0ef jal ra,3006324 + } + /* when error interrupt is generated */ + if ((uartHandle->baseAddress->UART_MIS.reg & 0x780) != 0) { + 3006ddc: fec42783 lw a5,-20(s0) + 3006de0: 439c lw a5,0(a5) + 3006de2: 43bc lw a5,64(a5) + 3006de4: 7807f793 andi a5,a5,1920 + 3006de8: c789 beqz a5,3006df2 + ErrorServiceCallback(uartHandle); + 3006dea: fec42503 lw a0,-20(s0) + 3006dee: 339d jal ra,3006b54 + } + return; + 3006df0: 0001 nop + 3006df2: 0001 nop +} + 3006df4: 50b2 lw ra,44(sp) + 3006df6: 5422 lw s0,40(sp) + 3006df8: 6145 addi sp,sp,48 + 3006dfa: 8082 ret + +03006dfc : + * @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) +{ + 3006dfc: 1101 addi sp,sp,-32 + 3006dfe: ce06 sw ra,28(sp) + 3006e00: cc22 sw s0,24(sp) + 3006e02: 1000 addi s0,sp,32 + 3006e04: fea42623 sw a0,-20(s0) + 3006e08: feb42423 sw a1,-24(s0) + 3006e0c: fec42223 sw a2,-28(s0) + UART_ASSERT_PARAM(uartHandle != NULL); + 3006e10: fec42783 lw a5,-20(s0) + 3006e14: eb89 bnez a5,3006e26 + 3006e16: 30200593 li a1,770 + 3006e1a: 0300f7b7 lui a5,0x300f + 3006e1e: 26c78513 addi a0,a5,620 # 300f26c + 3006e22: 20e5 jal ra,3006f0a + 3006e24: a001 j 3006e24 + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + 3006e26: fec42783 lw a5,-20(s0) + 3006e2a: 4398 lw a4,0(a5) + 3006e2c: 140007b7 lui a5,0x14000 + 3006e30: 02f70f63 beq a4,a5,3006e6e + 3006e34: fec42783 lw a5,-20(s0) + 3006e38: 4398 lw a4,0(a5) + 3006e3a: 140017b7 lui a5,0x14001 + 3006e3e: 02f70863 beq a4,a5,3006e6e + 3006e42: fec42783 lw a5,-20(s0) + 3006e46: 4398 lw a4,0(a5) + 3006e48: 140027b7 lui a5,0x14002 + 3006e4c: 02f70163 beq a4,a5,3006e6e + 3006e50: fec42783 lw a5,-20(s0) + 3006e54: 4398 lw a4,0(a5) + 3006e56: 140037b7 lui a5,0x14003 + 3006e5a: 00f70a63 beq a4,a5,3006e6e + 3006e5e: 30300593 li a1,771 + 3006e62: 0300f7b7 lui a5,0x300f + 3006e66: 26c78513 addi a0,a5,620 # 300f26c + 3006e6a: 2045 jal ra,3006f0a + 3006e6c: a001 j 3006e6c + switch (typeID) { + 3006e6e: fe842703 lw a4,-24(s0) + 3006e72: 47a1 li a5,8 + 3006e74: 08e7e363 bltu a5,a4,3006efa + 3006e78: fe842783 lw a5,-24(s0) + 3006e7c: 00279713 slli a4,a5,0x2 + 3006e80: 0300f7b7 lui a5,0x300f + 3006e84: 28878793 addi a5,a5,648 # 300f288 + 3006e88: 97ba add a5,a5,a4 + 3006e8a: 439c lw a5,0(a5) + 3006e8c: 8782 jr a5 + case UART_WRITE_IT_FINISH: + uartHandle->userCallBack.WriteItFinishCallBack = pCallback; /* Write INT finish callback register */ + 3006e8e: fec42783 lw a5,-20(s0) + 3006e92: fe442703 lw a4,-28(s0) + 3006e96: cbf8 sw a4,84(a5) + break; + 3006e98: a09d j 3006efe + case UART_READ_IT_FINISH: + uartHandle->userCallBack.ReadItFinishCallBack = pCallback; /* Read INT finish callback register */ + 3006e9a: fec42783 lw a5,-20(s0) + 3006e9e: fe442703 lw a4,-28(s0) + 3006ea2: cfb8 sw a4,88(a5) + break; + 3006ea4: a8a9 j 3006efe + case UART_WRITE_DMA_FINISH: + uartHandle->userCallBack.WriteDmaFinishCallBack = pCallback; /* DMA write finish callback register */ + 3006ea6: fec42783 lw a5,-20(s0) + 3006eaa: fe442703 lw a4,-28(s0) + 3006eae: cff8 sw a4,92(a5) + break; + 3006eb0: a0b9 j 3006efe + case UART_READ_DMA_FINISH: + uartHandle->userCallBack.ReadDmaFinishCallBack = pCallback; /* DMA read finish callback register */ + 3006eb2: fec42783 lw a5,-20(s0) + 3006eb6: fe442703 lw a4,-28(s0) + 3006eba: d3b8 sw a4,96(a5) + break; + 3006ebc: a089 j 3006efe + case UART_TRNS_IT_ERROR: + uartHandle->userCallBack.TransmitItErrorCallBack = pCallback; /* INT Trans error callback register */ + 3006ebe: fec42783 lw a5,-20(s0) + 3006ec2: fe442703 lw a4,-28(s0) + 3006ec6: d3f8 sw a4,100(a5) + break; + 3006ec8: a81d j 3006efe + case UART_TRNS_DMA_ERROR: + uartHandle->userCallBack.TransmitDmaErrorCallBack = pCallback; /* DMA Trans error callback register */ + 3006eca: fec42783 lw a5,-20(s0) + 3006ece: fe442703 lw a4,-28(s0) + 3006ed2: d7b8 sw a4,104(a5) + break; + 3006ed4: a02d j 3006efe + case UART_BAUD_DETECT_FINISH: + uartHandle->userCallBack.BaudDetectSuccessCallBack = pCallback; /* Baud detect finish callback register */ + 3006ed6: fec42783 lw a5,-20(s0) + 3006eda: fe442703 lw a4,-28(s0) + 3006ede: d7f8 sw a4,108(a5) + break; + 3006ee0: a839 j 3006efe + case UART_BAUD_DETECT_ERROR: + uartHandle->userCallBack.BaudDetectErrorCallBack = pCallback; /* Baud detect error callback register */ + 3006ee2: fec42783 lw a5,-20(s0) + 3006ee6: fe442703 lw a4,-28(s0) + 3006eea: dbb8 sw a4,112(a5) + break; + 3006eec: a809 j 3006efe + case UART_CHARACTER_MATCH: + uartHandle->userCallBack.CharacterMatchCallBack = pCallback; /* character match callback register */ + 3006eee: fec42783 lw a5,-20(s0) + 3006ef2: fe442703 lw a4,-28(s0) + 3006ef6: dbf8 sw a4,116(a5) + break; + 3006ef8: a019 j 3006efe + default: + return BASE_STATUS_ERROR; + 3006efa: 4785 li a5,1 + 3006efc: a011 j 3006f00 + } + return BASE_STATUS_OK; + 3006efe: 4781 li a5,0 +} + 3006f00: 853e mv a0,a5 + 3006f02: 40f2 lw ra,28(sp) + 3006f04: 4462 lw s0,24(sp) + 3006f06: 6105 addi sp,sp,32 + 3006f08: 8082 ret + +03006f0a : + 3006f0a: ae6fa06f j 30011f0 + +03006f0e : + +/** + * 串口读中断回调函数 +*/ +void UART0ReadInterruptCallback(void *handle) +{ + 3006f0e: 1101 addi sp,sp,-32 + 3006f10: ce22 sw s0,28(sp) + 3006f12: 1000 addi s0,sp,32 + 3006f14: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + // DBG_PRINTF("Read Finish: %s\r\n", readData); + g_uart0.rxbuff = readData;//这很重要,将接收数组的初始地址赋给该指针 + 3006f18: 3ac18793 addi a5,gp,940 # 40009e0 + 3006f1c: 2b818713 addi a4,gp,696 # 40008ec + 3006f20: d398 sw a4,32(a5) + g_uartReceiveFlag = true;//接收数据后,接收标志置为true + 3006f22: 4705 li a4,1 + 3006f24: 2ce18623 sb a4,716(gp) # 4000900 + return; + 3006f28: 0001 nop +} + 3006f2a: 4472 lw s0,28(sp) + 3006f2c: 6105 addi sp,sp,32 + 3006f2e: 8082 ret + +03006f30 : +//timer 定时器中断 +void TIMER0_InterruptProcess(void *handle) +{ + 3006f30: 1101 addi sp,sp,-32 + 3006f32: ce22 sw s0,28(sp) + 3006f34: 1000 addi s0,sp,32 + 3006f36: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + //1ms 定时器 + time_num++; + 3006f3a: 2e01a783 lw a5,736(gp) # 4000914 + 3006f3e: 00178713 addi a4,a5,1 + 3006f42: 2ee1a023 sw a4,736(gp) # 4000914 + + if(time_num%1000==0){ + 3006f46: 2e01a703 lw a4,736(gp) # 4000914 + 3006f4a: 3e800793 li a5,1000 + 3006f4e: 02f777b3 remu a5,a4,a5 + 3006f52: e781 bnez a5,3006f5a + f_1s = true; + 3006f54: 4705 li a4,1 + 3006f56: 2ce18723 sb a4,718(gp) # 4000902 + } + if(time_num%250==0){ + 3006f5a: 2e01a703 lw a4,736(gp) # 4000914 + 3006f5e: 0fa00793 li a5,250 + 3006f62: 02f777b3 remu a5,a4,a5 + 3006f66: e781 bnez a5,3006f6e + f_250ms = true; + 3006f68: 4705 li a4,1 + 3006f6a: 2ce186a3 sb a4,717(gp) # 4000901 + } + if(time_num%10000==0){ + 3006f6e: 2e01a703 lw a4,736(gp) # 4000914 + 3006f72: 6789 lui a5,0x2 + 3006f74: 71078793 addi a5,a5,1808 # 2710 + 3006f78: 02f777b3 remu a5,a4,a5 + 3006f7c: e781 bnez a5,3006f84 + f_10s = true; + 3006f7e: 4705 li a4,1 + 3006f80: 2ce187a3 sb a4,719(gp) # 4000903 + } + if(time_num == 1000*60*60*24) + 3006f84: 2e01a703 lw a4,736(gp) # 4000914 + 3006f88: 052667b7 lui a5,0x5266 + 3006f8c: c0078793 addi a5,a5,-1024 # 5265c00 + 3006f90: 00f71463 bne a4,a5,3006f98 + time_num = 0; + 3006f94: 2e01a023 sw zero,736(gp) # 4000914 +} + 3006f98: 0001 nop + 3006f9a: 4472 lw s0,28(sp) + 3006f9c: 6105 addi sp,sp,32 + 3006f9e: 8082 ret + +03006fa0 : +//right v 测量右轮速度 计数 +void GPIO1_1_CallbackFunc(void *param) +{ + 3006fa0: 7179 addi sp,sp,-48 + 3006fa2: d622 sw s0,44(sp) + 3006fa4: 1800 addi s0,sp,48 + 3006fa6: fca42e23 sw a0,-36(s0) + GPIO_Handle *handle = (GPIO_Handle *)param; + 3006faa: fdc42783 lw a5,-36(s0) + 3006fae: fef42623 sw a5,-20(s0) + BASE_FUNC_UNUSED(handle); + // GPIO_InterruptMode mode = HAL_GPIO_GetPinIrqType(handle, handle->pins); + // DBG_PRINTF("GPIO1_1 In intMode[%d]'s callback -- %d", mode,v_num_left); + + //计数 + v_num_right++; + 3006fb2: 2d41a783 lw a5,724(gp) # 4000908 + 3006fb6: 00178713 addi a4,a5,1 + 3006fba: 2ce1aa23 sw a4,724(gp) # 4000908 +} + 3006fbe: 0001 nop + 3006fc0: 5432 lw s0,44(sp) + 3006fc2: 6145 addi sp,sp,48 + 3006fc4: 8082 ret + +03006fc6 : +//left v 测量左轮速度 计数 + void GPIO1_4_CallbackFunc(void *param) +{ + 3006fc6: 7179 addi sp,sp,-48 + 3006fc8: d622 sw s0,44(sp) + 3006fca: 1800 addi s0,sp,48 + 3006fcc: fca42e23 sw a0,-36(s0) + GPIO_Handle *handle = (GPIO_Handle *)param; + 3006fd0: fdc42783 lw a5,-36(s0) + 3006fd4: fef42623 sw a5,-20(s0) + BASE_FUNC_UNUSED(handle); + + v_num_left++; + 3006fd8: 2d01a783 lw a5,720(gp) # 4000904 + 3006fdc: 00178713 addi a4,a5,1 + 3006fe0: 2ce1a823 sw a4,720(gp) # 4000904 +} + 3006fe4: 0001 nop + 3006fe6: 5432 lw s0,44(sp) + 3006fe8: 6145 addi sp,sp,48 + 3006fea: 8082 ret + +03006fec : + +/** + * 串口中断接收初始化,使能接收中断 +*/ +void UART0_InterruptTxInit(UART_Handle *uartHandle) +{ + 3006fec: 1101 addi sp,sp,-32 + 3006fee: ce22 sw s0,28(sp) + 3006ff0: 1000 addi s0,sp,32 + 3006ff2: fea42623 sw a0,-20(s0) + uartHandle->rxState = UART_STATE_BUSY_RX; + 3006ff6: fec42783 lw a5,-20(s0) + 3006ffa: 4711 li a4,4 + 3006ffc: c7f8 sw a4,76(a5) + uartHandle->rxbuff = readData; + 3006ffe: fec42783 lw a5,-20(s0) + 3007002: 2b818713 addi a4,gp,696 # 40008ec + 3007006: d398 sw a4,32(a5) + if (uartHandle->fifoMode == true) { + 3007008: fec42783 lw a5,-20(s0) + 300700c: 02c7c783 lbu a5,44(a5) + 3007010: cf81 beqz a5,3007028 + uartHandle->baseAddress->UART_IMSC.reg |= 0x7D0; /* Enable rx interrupt and rx timeout interrupt */ + 3007012: fec42783 lw a5,-20(s0) + 3007016: 439c lw a5,0(a5) + 3007018: 5f98 lw a4,56(a5) + 300701a: fec42783 lw a5,-20(s0) + 300701e: 439c lw a5,0(a5) + 3007020: 7d076713 ori a4,a4,2000 + 3007024: df98 sw a4,56(a5) + } else { + uartHandle->baseAddress->UART_IMSC.reg |= 0x20780; /* Enable rx not empty interrupt */ + } +} + 3007026: a831 j 3007042 + uartHandle->baseAddress->UART_IMSC.reg |= 0x20780; /* Enable rx not empty interrupt */ + 3007028: fec42783 lw a5,-20(s0) + 300702c: 439c lw a5,0(a5) + 300702e: 5f94 lw a3,56(a5) + 3007030: fec42783 lw a5,-20(s0) + 3007034: 439c lw a5,0(a5) + 3007036: 00020737 lui a4,0x20 + 300703a: 78070713 addi a4,a4,1920 # 20780 + 300703e: 8f55 or a4,a4,a3 + 3007040: df98 sw a4,56(a5) +} + 3007042: 0001 nop + 3007044: 4472 lw s0,28(sp) + 3007046: 6105 addi sp,sp,32 + 3007048: 8082 ret + +0300704a : +/** + * 从字符串中获取数值 + * 开头以数值开头,转换为无符号整型表示 + */ +unsigned int GetNumFromStr(unsigned char* str) +{ + 300704a: 7179 addi sp,sp,-48 + 300704c: d622 sw s0,44(sp) + 300704e: 1800 addi s0,sp,48 + 3007050: fca42e23 sw a0,-36(s0) + unsigned int i=0; + 3007054: fe042623 sw zero,-20(s0) + // 首先需要得到一个纯数字化的字符串 提供的字符串第一个字符为数值 + // 遍历字符串,直到遇到非数字字符 + while (isdigit(*str)) { + 3007058: a01d j 300707e + i = i * 10 + (*str - '0'); // 将字符转换为数字并构建数字值 + 300705a: fec42703 lw a4,-20(s0) + 300705e: 47a9 li a5,10 + 3007060: 02f707b3 mul a5,a4,a5 + 3007064: fdc42703 lw a4,-36(s0) + 3007068: 2318 lbu a4,0(a4) + 300706a: 97ba add a5,a5,a4 + 300706c: fd078793 addi a5,a5,-48 + 3007070: fef42623 sw a5,-20(s0) + str++; + 3007074: fdc42783 lw a5,-36(s0) + 3007078: 0785 addi a5,a5,1 + 300707a: fcf42e23 sw a5,-36(s0) + while (isdigit(*str)) { + 300707e: fdc42783 lw a5,-36(s0) + 3007082: 239c lbu a5,0(a5) + 3007084: fd078713 addi a4,a5,-48 + 3007088: 47a5 li a5,9 + 300708a: fce7f8e3 bgeu a5,a4,300705a + } + return i; + 300708e: fec42783 lw a5,-20(s0) +} + 3007092: 853e mv a0,a5 + 3007094: 5432 lw s0,44(sp) + 3007096: 6145 addi sp,sp,48 + 3007098: 8082 ret + +0300709a
: + + +/* USER CODE END 1 */ + +int main(void) +{ + 300709a: 1141 addi sp,sp,-16 + 300709c: c606 sw ra,12(sp) + 300709e: c422 sw s0,8(sp) + 30070a0: 0800 addi s0,sp,16 + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + 30070a2: 5f5000ef jal ra,3007e96 + /* USER CODE BEGIN 3 */ + // DBG_PRINTF("Init finish, please enter characters:\r\n"); + g_uartReceiveFlag = false; + 30070a6: 2c018623 sb zero,716(gp) # 4000900 + UART0_InterruptTxInit(&g_uart0); + 30070aa: 3ac18513 addi a0,gp,940 # 40009e0 + 30070ae: 3f3d jal ra,3006fec + /* 建议用户放置初始配置代码 */ + + // 配置vl53l0x初始化 感觉初始化之前最好不要开中断,可能会扰乱IIC通讯 + Vl53l0xInit(); + 30070b0: 387060ef jal ra,300dc36 + HAL_TIMER_Start(&g_timer0); + 30070b4: 38418513 addi a0,gp,900 # 40009b8 + 30070b8: f53fe0ef jal ra,300600a + //vl53l0x开始测量 + Vl53l0xStart(); + 30070bc: 3a9060ef jal ra,300dc64 + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + + // 获取测量结果 如果没有则为0 + s_distance = GetDistance(); + 30070c0: 3cd060ef jal ra,300dc8c + 30070c4: 87aa mv a5,a0 + 30070c6: 873e mv a4,a5 + 30070c8: 2ce19d23 sh a4,730(gp) # 400090e + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + // 避障实现 + if(s_distance!=0 && s_distance<120){ + 30070cc: 2da1d783 lhu a5,730(gp) # 400090e + 30070d0: c785 beqz a5,30070f8 + 30070d2: 2da1d703 lhu a4,730(gp) # 400090e + 30070d6: 07700793 li a5,119 + 30070da: 00e7ef63 bltu a5,a4,30070f8 + targetSpeed = 0; + 30070de: ac01a423 sw zero,-1336(gp) # 40000fc + if(!g_carStop){ + 30070e2: 2b71c783 lbu a5,695(gp) # 40008eb + 30070e6: eb89 bnez a5,30070f8 + g_carStop =true; + 30070e8: 4705 li a4,1 + 30070ea: 2ae18ba3 sb a4,695(gp) # 40008eb + DBG_PRINTF("stop you will hit it! \r\n"); + 30070ee: 0300f7b7 lui a5,0x300f + 30070f2: 2ac78513 addi a0,a5,684 # 300f2ac + 30070f6: 2c4d jal ra,30073a8 + } + } + + //工作不同模式下的实现 + if(workStatus == DESKTOP_MODE){ + 30070f8: 2d81c783 lbu a5,728(gp) # 400090c + 30070fc: ef81 bnez a5,3007114 + // 桌面模式下 + + // 久坐检测 + if(f_sedentary) //超过1.5小时就报警提示休息 + 30070fe: 2dc1c783 lbu a5,732(gp) # 4000910 + 3007102: c3a9 beqz a5,3007144 + { + f_sedentary = false; + 3007104: 2c018e23 sb zero,732(gp) # 4000910 + DBG_PRINTF("you have been working for 1.5 hours,please walk around and relax ~ \r\n"); + 3007108: 0300f7b7 lui a5,0x300f + 300710c: 2c878513 addi a0,a5,712 # 300f2c8 + 3007110: 2c61 jal ra,30073a8 + 3007112: a80d j 3007144 + } + + }else if(workStatus == GROUND_MODE){ + 3007114: 2d81c703 lbu a4,728(gp) # 400090c + 3007118: 4785 li a5,1 + 300711a: 02f71563 bne a4,a5,3007144 + // 地面模式下 + + // 门口检测 + if(f_guard){ + 300711e: 2dd1c783 lbu a5,733(gp) # 4000911 + 3007122: c38d beqz a5,3007144 + + if(s_distance!=0 && s_distance<500){ + 3007124: 2da1d783 lhu a5,730(gp) # 400090e + 3007128: cf91 beqz a5,3007144 + 300712a: 2da1d703 lhu a4,730(gp) # 400090e + 300712e: 1f300793 li a5,499 + 3007132: 00e7e963 bltu a5,a4,3007144 + DBG_PRINTF("warning, someone has invaded your house! \r\n"); + 3007136: 0300f7b7 lui a5,0x300f + 300713a: 31078513 addi a0,a5,784 # 300f310 + 300713e: 24ad jal ra,30073a8 + f_guard = 0; + 3007140: 2c018ea3 sb zero,733(gp) # 4000911 + } + } + } + + + if(f_10s){ + 3007144: 2cf1c783 lbu a5,719(gp) # 4000903 + 3007148: 9f81 uxtb a5 + 300714a: c7a9 beqz a5,3007194 + // 10s计算 计数任务 定时任务 + f_10s = false; + 300714c: 2c0187a3 sb zero,719(gp) # 4000903 + // DBG_PRINTF("10s--l:%d,r:%d time:%u\r\n",v_num_left,v_num_right,time_num); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + //打印用 + + // 久坐检测 + if(s_distance!=0 && s_distance<500){ + 3007150: 2da1d783 lhu a5,730(gp) # 400090e + 3007154: cf95 beqz a5,3007190 + 3007156: 2da1d703 lhu a4,730(gp) # 400090e + 300715a: 1f300793 li a5,499 + 300715e: 02e7e963 bltu a5,a4,3007190 + //说明有人 + time_sedentary_num++; + 3007162: 2e41a783 lw a5,740(gp) # 4000918 + 3007166: 00178713 addi a4,a5,1 + 300716a: 2ee1a223 sw a4,740(gp) # 4000918 + // DBG_PRINTF("long act time: %d\r\n",time_sedentary_num*10); + // if(time_sedentary_num >= 6*2) 调试用 + if(time_sedentary_num >= 10*6*60*1.5) //1.5h + 300716e: 2e41a783 lw a5,740(gp) # 4000918 + 3007172: d017f753 fcvt.s.wu fa4,a5 + 3007176: 0300f7b7 lui a5,0x300f + 300717a: 3ac7a787 flw fa5,940(a5) # 300f3ac + 300717e: a0e787d3 fle.s a5,fa5,fa4 + 3007182: cb89 beqz a5,3007194 + { + f_sedentary = true; + 3007184: 4705 li a4,1 + 3007186: 2ce18e23 sb a4,732(gp) # 4000910 + time_sedentary_num = 0; + 300718a: 2e01a223 sw zero,740(gp) # 4000918 + if(time_sedentary_num >= 10*6*60*1.5) //1.5h + 300718e: a019 j 3007194 + } + + }else{ + //无人,清零 + time_sedentary_num = 0; + 3007190: 2e01a223 sw zero,740(gp) # 4000918 + } + } + + if(f_1s){ + 3007194: 2ce1c783 lbu a5,718(gp) # 4000902 + 3007198: 9f81 uxtb a5 + 300719a: c795 beqz a5,30071c6 + f_1s = false; + 300719c: 2c018723 sb zero,718(gp) # 4000902 + // 输出测速 + // 先用M法吧 + // 输出转了多少圈,触发了多少次吧 + // DBG_PRINTF("left: %d, right: %d targetSpeed:%d\r\n",v_num_left,v_num_right,targetSpeed); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + if(g_carStart){ + 30071a0: 2b61c783 lbu a5,694(gp) # 40008ea + 30071a4: c38d beqz a5,30071c6 + // DBG_PRINTF("left: %d, right: %d targetSpeed:%d\r\n",v_num_left,v_num_right,targetSpeed); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + if(targetSpeed==0&&v_num_left==0&&v_num_right==0) + 30071a6: ac81a783 lw a5,-1336(gp) # 40000fc + 30071aa: ef91 bnez a5,30071c6 + 30071ac: 2d01a783 lw a5,720(gp) # 4000904 + 30071b0: eb99 bnez a5,30071c6 + 30071b2: 2d41a783 lw a5,724(gp) # 4000908 + 30071b6: eb81 bnez a5,30071c6 + { + CarWorkStatus(0); + 30071b8: 4501 li a0,0 + 30071ba: 22ed jal ra,30073a4 + DBG_PRINTF("stop\r\n"); + 30071bc: 0300f7b7 lui a5,0x300f + 30071c0: 33c78513 addi a0,a5,828 # 300f33c + 30071c4: 22d5 jal ra,30073a8 + } + } + + // v_num_left = v_num_right = 0; + } + if(f_250ms){ + 30071c6: 2cd1c783 lbu a5,717(gp) # 4000901 + 30071ca: 9f81 uxtb a5 + 30071cc: c3a1 beqz a5,300720c + //250ms 计数任务 定时任务 + f_250ms = false; + 30071ce: 2c0186a3 sb zero,717(gp) # 4000901 + // 输出转了多少圈,触发了多少次吧 作为测速结果 + // DBG_PRINTF("10s--l:%d,r:%d\r\n",v_num_left,v_num_right); + // syn_two_motor_vctr(v_num_left,v_num_right,targetSpeed,targetSpeed); + if(g_carStart){ + 30071d2: 2b61c783 lbu a5,694(gp) # 40008ea + 30071d6: c795 beqz a5,3007202 + //PID调速 + SynTwoMotorSpeed(v_num_left,v_num_right,targetSpeed,targetSpeed); + 30071d8: 2d01a783 lw a5,720(gp) # 4000904 + 30071dc: d017f7d3 fcvt.s.wu fa5,a5 + 30071e0: 2d41a783 lw a5,724(gp) # 4000908 + 30071e4: d017f753 fcvt.s.wu fa4,a5 + 30071e8: ac81a783 lw a5,-1336(gp) # 40000fc + 30071ec: 873e mv a4,a5 + 30071ee: ac81a783 lw a5,-1336(gp) # 40000fc + 30071f2: 85be mv a1,a5 + 30071f4: 853a mv a0,a4 + 30071f6: 20e705d3 fmv.s fa1,fa4 + 30071fa: 20f78553 fmv.s fa0,fa5 + 30071fe: 609000ef jal ra,3008006 + } + + v_num_left = v_num_right = 0; + 3007202: 4781 li a5,0 + 3007204: 2cf1aa23 sw a5,724(gp) # 4000908 + 3007208: 2cf1a823 sw a5,720(gp) # 4000904 + } + + if(g_uartReceiveFlag){ + 300720c: 2cc1c783 lbu a5,716(gp) # 4000900 + 3007210: 9f81 uxtb a5 + 3007212: ea0787e3 beqz a5,30070c0 + //接收到串口数据,进行处理动作 + if(!strncmp(readData,"setv",4)){ + 3007216: 4611 li a2,4 + 3007218: 0300f7b7 lui a5,0x300f + 300721c: 34478593 addi a1,a5,836 # 300f344 + 3007220: 2b818513 addi a0,gp,696 # 40008ec + 3007224: 2261 jal ra,30073ac + 3007226: 87aa mv a5,a0 + 3007228: eb91 bnez a5,300723c + //调整目标速度 + targetSpeed = GetNumFromStr(readData+4); + 300722a: 2bc18793 addi a5,gp,700 # 40008f0 + 300722e: 853e mv a0,a5 + 3007230: 3d29 jal ra,300704a + 3007232: 87aa mv a5,a0 + 3007234: 873e mv a4,a5 + 3007236: ace1a423 sw a4,-1336(gp) # 40000fc + 300723a: aaa1 j 3007392 + } + else if(!strncmp(readData,"come",4)){ + 300723c: 4611 li a2,4 + 300723e: 0300f7b7 lui a5,0x300f + 3007242: 34c78593 addi a1,a5,844 # 300f34c + 3007246: 2b818513 addi a0,gp,696 # 40008ec + 300724a: 228d jal ra,30073ac + 300724c: 87aa mv a5,a0 + 300724e: e781 bnez a5,3007256 + //唤来助手 + Come(); + 3007250: 1e6010ef jal ra,3008436 + 3007254: aa3d j 3007392 + } + else if(!strncmp(readData,"back",4)){ + 3007256: 4611 li a2,4 + 3007258: 0300f7b7 lui a5,0x300f + 300725c: 35478593 addi a1,a5,852 # 300f354 + 3007260: 2b818513 addi a0,gp,696 # 40008ec + 3007264: 22a1 jal ra,30073ac + 3007266: 87aa mv a5,a0 + 3007268: 12078563 beqz a5,3007392 + //唤退助手 + } + else if(!strncmp(readData,"sta_act",4)){ + 300726c: 4611 li a2,4 + 300726e: 0300f7b7 lui a5,0x300f + 3007272: 35c78593 addi a1,a5,860 # 300f35c + 3007276: 2b818513 addi a0,gp,696 # 40008ec + 300727a: 2a0d jal ra,30073ac + 300727c: 87aa mv a5,a0 + 300727e: 10078a63 beqz a5,3007392 + //开始动画 + // start_act(); + } + else if(!strncmp(readData,"start",5)){ + 3007282: 4615 li a2,5 + 3007284: 0300f7b7 lui a5,0x300f + 3007288: 36478593 addi a1,a5,868 # 300f364 + 300728c: 2b818513 addi a0,gp,696 # 40008ec + 3007290: 2a31 jal ra,30073ac + 3007292: 87aa mv a5,a0 + 3007294: e781 bnez a5,300729c + //电机start + CarWorkStatus(1); + 3007296: 4505 li a0,1 + 3007298: 2231 jal ra,30073a4 + 300729a: a8e5 j 3007392 + }else if(!strncmp(readData,"guard",5)){ + 300729c: 4615 li a2,5 + 300729e: 0300f7b7 lui a5,0x300f + 30072a2: 36c78593 addi a1,a5,876 # 300f36c + 30072a6: 2b818513 addi a0,gp,696 # 40008ec + 30072aa: 2209 jal ra,30073ac + 30072ac: 87aa mv a5,a0 + 30072ae: e799 bnez a5,30072bc + AsGuard(); + 30072b0: 1b4010ef jal ra,3008464 + f_guard = 1; + 30072b4: 4705 li a4,1 + 30072b6: 2ce18ea3 sb a4,733(gp) # 4000911 + 30072ba: a8e1 j 3007392 + }else if(!strncmp(readData,"stop",4)){ + 30072bc: 4611 li a2,4 + 30072be: 0300f7b7 lui a5,0x300f + 30072c2: 37478593 addi a1,a5,884 # 300f374 + 30072c6: 2b818513 addi a0,gp,696 # 40008ec + 30072ca: 20cd jal ra,30073ac + 30072cc: 87aa mv a5,a0 + 30072ce: e781 bnez a5,30072d6 + CarWorkStatus(0); + 30072d0: 4501 li a0,0 + 30072d2: 28c9 jal ra,30073a4 + 30072d4: a87d j 3007392 + }else if(!strncmp(readData,"left",4)){ + 30072d6: 4611 li a2,4 + 30072d8: 0300f7b7 lui a5,0x300f + 30072dc: 37c78593 addi a1,a5,892 # 300f37c + 30072e0: 2b818513 addi a0,gp,696 # 40008ec + 30072e4: 20e1 jal ra,30073ac + 30072e6: 87aa mv a5,a0 + 30072e8: e781 bnez a5,30072f0 + TurnLeft(); + 30072ea: 022010ef jal ra,300830c + 30072ee: a055 j 3007392 + }else if(!strncmp(readData,"right",5)){ + 30072f0: 4615 li a2,5 + 30072f2: 0300f7b7 lui a5,0x300f + 30072f6: 38478593 addi a1,a5,900 # 300f384 + 30072fa: 2b818513 addi a0,gp,696 # 40008ec + 30072fe: 207d jal ra,30073ac + 3007300: 87aa mv a5,a0 + 3007302: e781 bnez a5,300730a + TurnRight(); + 3007304: 048010ef jal ra,300834c + 3007308: a069 j 3007392 + }else if(!strncmp(readData,"retreat",4)){ + 300730a: 4611 li a2,4 + 300730c: 0300f7b7 lui a5,0x300f + 3007310: 38c78593 addi a1,a5,908 # 300f38c + 3007314: 2b818513 addi a0,gp,696 # 40008ec + 3007318: 2851 jal ra,30073ac + 300731a: 87aa mv a5,a0 + 300731c: e781 bnez a5,3007324 + Retreat(); + 300731e: 06e010ef jal ra,300838c + 3007322: a885 j 3007392 + // if(!strncmp(readData+3,"+",1)){ + // steering(1); + // }else{ + // steering(0); + // } + else if(!strncmp(readData,"clo",3)){ + 3007324: 460d li a2,3 + 3007326: 0300f7b7 lui a5,0x300f + 300732a: 39478593 addi a1,a5,916 # 300f394 + 300732e: 2b818513 addi a0,gp,696 # 40008ec + 3007332: 28ad jal ra,30073ac + 3007334: 87aa mv a5,a0 + 3007336: e781 bnez a5,300733e + ClockwiseMotor(); + 3007338: 086010ef jal ra,30083be + 300733c: a899 j 3007392 + + }else if(!strncmp(readData,"ant",3)){ + 300733e: 460d li a2,3 + 3007340: 0300f7b7 lui a5,0x300f + 3007344: 39878593 addi a1,a5,920 # 300f398 + 3007348: 2b818513 addi a0,gp,696 # 40008ec + 300734c: 2085 jal ra,30073ac + 300734e: 87aa mv a5,a0 + 3007350: e781 bnez a5,3007358 + AnticlockwiseMotor(); + 3007352: 0a6010ef jal ra,30083f8 + 3007356: a835 j 3007392 + + }else if(!strncmp(readData,"desk",4)){ + 3007358: 4611 li a2,4 + 300735a: 0300f7b7 lui a5,0x300f + 300735e: 39c78593 addi a1,a5,924 # 300f39c + 3007362: 2b818513 addi a0,gp,696 # 40008ec + 3007366: 2099 jal ra,30073ac + 3007368: 87aa mv a5,a0 + 300736a: e781 bnez a5,3007372 + // AnticlockwiseMotor(); + workStatus = DESKTOP_MODE; + 300736c: 2c018c23 sb zero,728(gp) # 400090c + 3007370: a00d j 3007392 + + }else if(!strncmp(readData,"ground",4)){ + 3007372: 4611 li a2,4 + 3007374: 0300f7b7 lui a5,0x300f + 3007378: 3a478593 addi a1,a5,932 # 300f3a4 + 300737c: 2b818513 addi a0,gp,696 # 40008ec + 3007380: 2035 jal ra,30073ac + 3007382: 87aa mv a5,a0 + 3007384: e799 bnez a5,3007392 + // AnticlockwiseMotor(); + workStatus = GROUND_MODE; + 3007386: 4705 li a4,1 + 3007388: 2ce18c23 sb a4,728(gp) # 400090c + f_guard = 1; + 300738c: 4705 li a4,1 + 300738e: 2ce18ea3 sb a4,733(gp) # 4000911 + } + //清空数组、标志 + g_uartReceiveFlag = false; + 3007392: 2c018623 sb zero,716(gp) # 4000900 + memset(readData,0,sizeof(readData)); + 3007396: 4651 li a2,20 + 3007398: 4581 li a1,0 + 300739a: 2b818513 addi a0,gp,696 # 40008ec + 300739e: 0ef070ef jal ra,300ec8c + s_distance = GetDistance(); + 30073a2: bb39 j 30070c0 + +030073a4 : + 30073a4: 6fb0006f j 300829e + +030073a8 : + 30073a8: f48fc06f j 3003af0 + +030073ac : + 30073ac: 1b30706f j 300ed5e + +030073b0 : +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + 30073b0: 715d addi sp,sp,-80 + 30073b2: c686 sw ra,76(sp) + 30073b4: c4a2 sw s0,72(sp) + 30073b6: 0880 addi s0,sp,80 + 30073b8: faa42e23 sw a0,-68(s0) + CRG_Handle crg; + crg.baseAddress = CRG; + 30073bc: 100007b7 lui a5,0x10000 + 30073c0: fcf42423 sw a5,-56(s0) + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + 30073c4: fc042623 sw zero,-52(s0) + crg.pllPreDiv = CRG_PLL_PREDIV_4; + 30073c8: 478d li a5,3 + 30073ca: fcf42823 sw a5,-48(s0) + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + 30073ce: 03000793 li a5,48 + 30073d2: fcf42a23 sw a5,-44(s0) + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + 30073d6: 4785 li a5,1 + 30073d8: fcf42c23 sw a5,-40(s0) + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + 30073dc: 4789 li a5,2 + 30073de: fef42023 sw a5,-32(s0) + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + 30073e2: 4789 li a5,2 + 30073e4: fef42223 sw a5,-28(s0) + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + 30073e8: 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. */ + 30073ec: 47e1 li a5,24 + 30073ee: fef42623 sw a5,-20(s0) + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + 30073f2: fc840793 addi a5,s0,-56 + 30073f6: 853e mv a0,a5 + 30073f8: c57fa0ef jal ra,300204e + 30073fc: 87aa mv a5,a0 + 30073fe: c399 beqz a5,3007404 + return BASE_STATUS_ERROR; + 3007400: 4785 li a5,1 + 3007402: a039 j 3007410 + } + *coreClkSelect = crg.coreClkSelect; + 3007404: fe042703 lw a4,-32(s0) + 3007408: fbc42783 lw a5,-68(s0) + 300740c: c398 sw a4,0(a5) + return BASE_STATUS_OK; + 300740e: 4781 li a5,0 +} + 3007410: 853e mv a0,a5 + 3007412: 40b6 lw ra,76(sp) + 3007414: 4426 lw s0,72(sp) + 3007416: 6161 addi sp,sp,80 + 3007418: 8082 ret + +0300741a : +// GPIO_Handle *handle = (GPIO_Handle *)param; +// BASE_FUNC_UNUSED(handle); +// } + +static void GPIO_Init(void) +{ + 300741a: 1141 addi sp,sp,-16 + 300741c: c606 sw ra,12(sp) + 300741e: c422 sw s0,8(sp) + 3007420: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(GPIO4_BASE, IP_CLK_ENABLE); + 3007422: 4585 li a1,1 + 3007424: 14504537 lui a0,0x14504 + 3007428: 215d jal ra,30078ce + g_gpio4.baseAddress = GPIO4; + 300742a: 56c18793 addi a5,gp,1388 # 4000ba0 + 300742e: 14504737 lui a4,0x14504 + 3007432: c398 sw a4,0(a5) + + g_gpio4.pins = GPIO_PIN_4; + 3007434: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007438: 4741 li a4,16 + 300743a: c3d8 sw a4,4(a5) + HAL_GPIO_Init(&g_gpio4); + 300743c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007440: 2add jal ra,3007636 + HAL_GPIO_SetDirection(&g_gpio4, g_gpio4.pins, GPIO_OUTPUT_MODE); + 3007442: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007446: 43dc lw a5,4(a5) + 3007448: 4605 li a2,1 + 300744a: 85be mv a1,a5 + 300744c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007450: 22ed jal ra,300763a + HAL_GPIO_SetValue(&g_gpio4, g_gpio4.pins, GPIO_LOW_LEVEL); + 3007452: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007456: 43dc lw a5,4(a5) + 3007458: 4601 li a2,0 + 300745a: 85be mv a1,a5 + 300745c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007460: 2af9 jal ra,300763e + HAL_GPIO_SetIrqType(&g_gpio4, g_gpio4.pins, GPIO_INT_TYPE_NONE); + 3007462: 56c18793 addi a5,gp,1388 # 4000ba0 + 3007466: 43dc lw a5,4(a5) + 3007468: 4615 li a2,5 + 300746a: 85be mv a1,a5 + 300746c: 56c18513 addi a0,gp,1388 # 4000ba0 + 3007470: 22c9 jal ra,3007632 + + HAL_CRG_IpEnableSet(GPIO3_BASE, IP_CLK_ENABLE); + 3007472: 4585 li a1,1 + 3007474: 14503537 lui a0,0x14503 + 3007478: 2999 jal ra,30078ce + g_gpio3.baseAddress = GPIO3; + 300747a: 52418793 addi a5,gp,1316 # 4000b58 + 300747e: 14503737 lui a4,0x14503 + 3007482: c398 sw a4,0(a5) + + g_gpio3.pins = GPIO_PIN_4; + 3007484: 52418793 addi a5,gp,1316 # 4000b58 + 3007488: 4741 li a4,16 + 300748a: c3d8 sw a4,4(a5) + HAL_GPIO_Init(&g_gpio3); + 300748c: 52418513 addi a0,gp,1316 # 4000b58 + 3007490: 225d jal ra,3007636 + HAL_GPIO_SetDirection(&g_gpio3, g_gpio3.pins, GPIO_OUTPUT_MODE); + 3007492: 52418793 addi a5,gp,1316 # 4000b58 + 3007496: 43dc lw a5,4(a5) + 3007498: 4605 li a2,1 + 300749a: 85be mv a1,a5 + 300749c: 52418513 addi a0,gp,1316 # 4000b58 + 30074a0: 2a69 jal ra,300763a + HAL_GPIO_SetValue(&g_gpio3, g_gpio3.pins, GPIO_LOW_LEVEL); + 30074a2: 52418793 addi a5,gp,1316 # 4000b58 + 30074a6: 43dc lw a5,4(a5) + 30074a8: 4601 li a2,0 + 30074aa: 85be mv a1,a5 + 30074ac: 52418513 addi a0,gp,1316 # 4000b58 + 30074b0: 2279 jal ra,300763e + HAL_GPIO_SetIrqType(&g_gpio3, g_gpio3.pins, GPIO_INT_TYPE_NONE); + 30074b2: 52418793 addi a5,gp,1316 # 4000b58 + 30074b6: 43dc lw a5,4(a5) + 30074b8: 4615 li a2,5 + 30074ba: 85be mv a1,a5 + 30074bc: 52418513 addi a0,gp,1316 # 4000b58 + 30074c0: 2a8d jal ra,3007632 + + HAL_CRG_IpEnableSet(GPIO2_BASE, IP_CLK_ENABLE); + 30074c2: 4585 li a1,1 + 30074c4: 14502537 lui a0,0x14502 + 30074c8: 2119 jal ra,30078ce + g_gpio2.baseAddress = GPIO2; + 30074ca: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074ce: 14502737 lui a4,0x14502 + 30074d2: c398 sw a4,0(a5) + + g_gpio2.pins = GPIO_PIN_2; + 30074d4: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074d8: 4711 li a4,4 + 30074da: c3d8 sw a4,4(a5) + HAL_GPIO_Init(&g_gpio2); + 30074dc: 4dc18513 addi a0,gp,1244 # 4000b10 + 30074e0: 2a99 jal ra,3007636 + HAL_GPIO_SetDirection(&g_gpio2, g_gpio2.pins, GPIO_OUTPUT_MODE); + 30074e2: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074e6: 43dc lw a5,4(a5) + 30074e8: 4605 li a2,1 + 30074ea: 85be mv a1,a5 + 30074ec: 4dc18513 addi a0,gp,1244 # 4000b10 + 30074f0: 22a9 jal ra,300763a + HAL_GPIO_SetValue(&g_gpio2, g_gpio2.pins, GPIO_HIGH_LEVEL); + 30074f2: 4dc18793 addi a5,gp,1244 # 4000b10 + 30074f6: 43dc lw a5,4(a5) + 30074f8: 4605 li a2,1 + 30074fa: 85be mv a1,a5 + 30074fc: 4dc18513 addi a0,gp,1244 # 4000b10 + 3007500: 2a3d jal ra,300763e + HAL_GPIO_SetIrqType(&g_gpio2, g_gpio2.pins, GPIO_INT_TYPE_NONE); + 3007502: 4dc18793 addi a5,gp,1244 # 4000b10 + 3007506: 43dc lw a5,4(a5) + 3007508: 4615 li a2,5 + 300750a: 85be mv a1,a5 + 300750c: 4dc18513 addi a0,gp,1244 # 4000b10 + 3007510: 220d jal ra,3007632 + + + + HAL_CRG_IpEnableSet(GPIO1_BASE, IP_CLK_ENABLE); + 3007512: 4585 li a1,1 + 3007514: 14501537 lui a0,0x14501 + 3007518: 2e5d jal ra,30078ce + g_gpio1.baseAddress = GPIO1; + 300751a: 49418793 addi a5,gp,1172 # 4000ac8 + 300751e: 14501737 lui a4,0x14501 + 3007522: c398 sw a4,0(a5) + + g_gpio1.pins = GPIO_PIN_1 | GPIO_PIN_4; + 3007524: 49418793 addi a5,gp,1172 # 4000ac8 + 3007528: 4749 li a4,18 + 300752a: c3d8 sw a4,4(a5) + HAL_GPIO_Init(&g_gpio1); + 300752c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007530: 2219 jal ra,3007636 + HAL_GPIO_SetDirection(&g_gpio1, g_gpio1.pins, GPIO_INPUT_MODE); + 3007532: 49418793 addi a5,gp,1172 # 4000ac8 + 3007536: 43dc lw a5,4(a5) + 3007538: 4601 li a2,0 + 300753a: 85be mv a1,a5 + 300753c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007540: 28ed jal ra,300763a + HAL_GPIO_SetValue(&g_gpio1, g_gpio1.pins, GPIO_LOW_LEVEL); + 3007542: 49418793 addi a5,gp,1172 # 4000ac8 + 3007546: 43dc lw a5,4(a5) + 3007548: 4601 li a2,0 + 300754a: 85be mv a1,a5 + 300754c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007550: 20fd jal ra,300763e + HAL_GPIO_SetIrqType(&g_gpio1, g_gpio1.pins, GPIO_INT_TYPE_BOTH_EDGE); + 3007552: 49418793 addi a5,gp,1172 # 4000ac8 + 3007556: 43dc lw a5,4(a5) + 3007558: 4611 li a2,4 + 300755a: 85be mv a1,a5 + 300755c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007560: 28c9 jal ra,3007632 + + HAL_GPIO_RegisterCallBack(&g_gpio1, GPIO_PIN_1, GPIO1_1_CallbackFunc); + 3007562: 030077b7 lui a5,0x3007 + 3007566: fa078613 addi a2,a5,-96 # 3006fa0 + 300756a: 4589 li a1,2 + 300756c: 49418513 addi a0,gp,1172 # 4000ac8 + 3007570: d5efd0ef jal ra,3004ace + HAL_GPIO_RegisterCallBack(&g_gpio1, GPIO_PIN_4, GPIO1_4_CallbackFunc); + 3007574: 030077b7 lui a5,0x3007 + 3007578: fc678613 addi a2,a5,-58 # 3006fc6 + 300757c: 45c1 li a1,16 + 300757e: 49418513 addi a0,gp,1172 # 4000ac8 + 3007582: d4cfd0ef jal ra,3004ace + IRQ_Register(IRQ_GPIO1, HAL_GPIO_IrqHandler, &g_gpio1); + 3007586: 49418613 addi a2,gp,1172 # 4000ac8 + 300758a: 030057b7 lui a5,0x3005 + 300758e: 9c478593 addi a1,a5,-1596 # 30049c4 + 3007592: 06e00513 li a0,110 + 3007596: 211d jal ra,30079bc + IRQ_SetPriority(IRQ_GPIO1, 2); /* set gpio1 interrupt priority to 1, 1~15. 1 is priority value */ + 3007598: 4589 li a1,2 + 300759a: 06e00513 li a0,110 + 300759e: 2929 jal ra,30079b8 + IRQ_EnableN(IRQ_GPIO1); /* gpio interrupt enable */ + 30075a0: 06e00513 li a0,110 + 30075a4: 2901 jal ra,30079b4 + + HAL_CRG_IpEnableSet(GPIO3_BASE, IP_CLK_ENABLE); + 30075a6: 4585 li a1,1 + 30075a8: 14503537 lui a0,0x14503 + 30075ac: 260d jal ra,30078ce + g_gpio3.baseAddress = GPIO3; + 30075ae: 52418793 addi a5,gp,1316 # 4000b58 + 30075b2: 14503737 lui a4,0x14503 + 30075b6: c398 sw a4,0(a5) + + g_gpio3.pins = GPIO_PIN_5 | GPIO_PIN_6; + 30075b8: 52418793 addi a5,gp,1316 # 4000b58 + 30075bc: 06000713 li a4,96 + 30075c0: c3d8 sw a4,4(a5) + HAL_GPIO_Init(&g_gpio3); + 30075c2: 52418513 addi a0,gp,1316 # 4000b58 + 30075c6: 2885 jal ra,3007636 + HAL_GPIO_SetDirection(&g_gpio3, g_gpio3.pins, GPIO_OUTPUT_MODE); + 30075c8: 52418793 addi a5,gp,1316 # 4000b58 + 30075cc: 43dc lw a5,4(a5) + 30075ce: 4605 li a2,1 + 30075d0: 85be mv a1,a5 + 30075d2: 52418513 addi a0,gp,1316 # 4000b58 + 30075d6: 2095 jal ra,300763a + HAL_GPIO_SetValue(&g_gpio3, g_gpio3.pins, GPIO_LOW_LEVEL); + 30075d8: 52418793 addi a5,gp,1316 # 4000b58 + 30075dc: 43dc lw a5,4(a5) + 30075de: 4601 li a2,0 + 30075e0: 85be mv a1,a5 + 30075e2: 52418513 addi a0,gp,1316 # 4000b58 + 30075e6: 28a1 jal ra,300763e + + + HAL_CRG_IpEnableSet(GPIO5_BASE, IP_CLK_ENABLE); + 30075e8: 4585 li a1,1 + 30075ea: 14505537 lui a0,0x14505 + 30075ee: 24c5 jal ra,30078ce + g_gpio5.baseAddress = GPIO5; + 30075f0: 5b418793 addi a5,gp,1460 # 4000be8 + 30075f4: 14505737 lui a4,0x14505 + 30075f8: c398 sw a4,0(a5) + + g_gpio5.pins = GPIO_PIN_3 | GPIO_PIN_1; + 30075fa: 5b418793 addi a5,gp,1460 # 4000be8 + 30075fe: 4729 li a4,10 + 3007600: c3d8 sw a4,4(a5) + HAL_GPIO_Init(&g_gpio5); + 3007602: 5b418513 addi a0,gp,1460 # 4000be8 + 3007606: 2805 jal ra,3007636 + HAL_GPIO_SetDirection(&g_gpio5, g_gpio5.pins, GPIO_OUTPUT_MODE); + 3007608: 5b418793 addi a5,gp,1460 # 4000be8 + 300760c: 43dc lw a5,4(a5) + 300760e: 4605 li a2,1 + 3007610: 85be mv a1,a5 + 3007612: 5b418513 addi a0,gp,1460 # 4000be8 + 3007616: 2015 jal ra,300763a + HAL_GPIO_SetValue(&g_gpio5, g_gpio5.pins, GPIO_LOW_LEVEL); + 3007618: 5b418793 addi a5,gp,1460 # 4000be8 + 300761c: 43dc lw a5,4(a5) + 300761e: 4601 li a2,0 + 3007620: 85be mv a1,a5 + 3007622: 5b418513 addi a0,gp,1460 # 4000be8 + 3007626: 2821 jal ra,300763e + + + return; + 3007628: 0001 nop +} + 300762a: 40b2 lw ra,12(sp) + 300762c: 4422 lw s0,8(sp) + 300762e: 0141 addi sp,sp,16 + 3007630: 8082 ret + +03007632 : + 3007632: 87cfd06f j 30046ae + +03007636 : + 3007636: bc1fc06f j 30041f6 + +0300763a : + 300763a: ca3fc06f j 30042dc + +0300763e : + 300763e: d87fc06f j 30043c4 + +03007642 : + +static void GPT1_Init(void) +{ + 3007642: 1141 addi sp,sp,-16 + 3007644: c606 sw ra,12(sp) + 3007646: c422 sw s0,8(sp) + 3007648: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(GPT1_BASE, IP_CLK_ENABLE); + 300764a: 4585 li a1,1 + 300764c: 14701537 lui a0,0x14701 + 3007650: 2cbd jal ra,30078ce + + g_gpt1.baseAddress = GPT1; + 3007652: 2e818793 addi a5,gp,744 # 400091c + 3007656: 14701737 lui a4,0x14701 + 300765a: c398 sw a4,0(a5) + g_gpt1.clockDiv = 10 - 1; /* 10 is the internal frequency division of GPT */ + 300765c: 2e818793 addi a5,gp,744 # 400091c + 3007660: 4725 li a4,9 + 3007662: c798 sw a4,8(a5) + g_gpt1.period = 999; /* 999 is the number of GPT counting cycles. */ + 3007664: 2e818793 addi a5,gp,744 # 400091c + 3007668: 3e700713 li a4,999 + 300766c: cfd8 sw a4,28(a5) + g_gpt1.refA0.refdot = 1; /* 1 is the value of PWM reference point A. */ + 300766e: 2e818793 addi a5,gp,744 # 400091c + 3007672: 4705 li a4,1 + 3007674: c7d8 sw a4,12(a5) + g_gpt1.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */ + 3007676: 2e818793 addi a5,gp,744 # 400091c + 300767a: 4709 li a4,2 + 300767c: cb98 sw a4,16(a5) + g_gpt1.refB0.refdot = 299; /* 499 is the value of PWM reference point B. */ + 300767e: 2e818793 addi a5,gp,744 # 400091c + 3007682: 12b00713 li a4,299 + 3007686: cbd8 sw a4,20(a5) + g_gpt1.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */ + 3007688: 2e818793 addi a5,gp,744 # 400091c + 300768c: 4705 li a4,1 + 300768e: cf98 sw a4,24(a5) + g_gpt1.bufLoad = BASE_CFG_ENABLE; + 3007690: 2e818793 addi a5,gp,744 # 400091c + 3007694: 4705 li a4,1 + 3007696: 02e782a3 sb a4,37(a5) + g_gpt1.pwmKeep = BASE_CFG_ENABLE; + 300769a: 2e818793 addi a5,gp,744 # 400091c + 300769e: 4705 li a4,1 + 30076a0: 02e78223 sb a4,36(a5) + g_gpt1.handleEx.periodIntEnable = BASE_CFG_DISABLE; + 30076a4: 2e818793 addi a5,gp,744 # 400091c + 30076a8: 02078823 sb zero,48(a5) + g_gpt1.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + 30076ac: 2e818793 addi a5,gp,744 # 400091c + 30076b0: 020788a3 sb zero,49(a5) + g_gpt1.triggleAdcOutFinish = BASE_CFG_DISABLE; + 30076b4: 2e818793 addi a5,gp,744 # 400091c + 30076b8: 020783a3 sb zero,39(a5) + g_gpt1.triggleAdcPeriod = BASE_CFG_DISABLE; + 30076bc: 2e818793 addi a5,gp,744 # 400091c + 30076c0: 02078323 sb zero,38(a5) + + HAL_GPT_Init(&g_gpt1); + 30076c4: 2e818513 addi a0,gp,744 # 400091c + 30076c8: 2a1d jal ra,30077fe + +} + 30076ca: 0001 nop + 30076cc: 40b2 lw ra,12(sp) + 30076ce: 4422 lw s0,8(sp) + 30076d0: 0141 addi sp,sp,16 + 30076d2: 8082 ret + +030076d4 : + +static void GPT2_Init(void) +{ + 30076d4: 1141 addi sp,sp,-16 + 30076d6: c606 sw ra,12(sp) + 30076d8: c422 sw s0,8(sp) + 30076da: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE); + 30076dc: 4585 li a1,1 + 30076de: 14702537 lui a0,0x14702 + 30076e2: 22f5 jal ra,30078ce + + g_gpt2.baseAddress = GPT2; + 30076e4: 31c18793 addi a5,gp,796 # 4000950 + 30076e8: 14702737 lui a4,0x14702 + 30076ec: c398 sw a4,0(a5) + g_gpt2.clockDiv = 10 - 1; /* 10 is the internal frequency division of GPT */ + 30076ee: 31c18793 addi a5,gp,796 # 4000950 + 30076f2: 4725 li a4,9 + 30076f4: c798 sw a4,8(a5) + g_gpt2.period = 999; /* 999 is the number of GPT counting cycles. */ + 30076f6: 31c18793 addi a5,gp,796 # 4000950 + 30076fa: 3e700713 li a4,999 + 30076fe: cfd8 sw a4,28(a5) + g_gpt2.refA0.refdot = 1; /* 700 is the value of PWM reference point A. */ + 3007700: 31c18793 addi a5,gp,796 # 4000950 + 3007704: 4705 li a4,1 + 3007706: c7d8 sw a4,12(a5) + g_gpt2.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */ + 3007708: 31c18793 addi a5,gp,796 # 4000950 + 300770c: 4709 li a4,2 + 300770e: cb98 sw a4,16(a5) + g_gpt2.refB0.refdot = 299; /* 900 is the value of PWM reference point B. */ + 3007710: 31c18793 addi a5,gp,796 # 4000950 + 3007714: 12b00713 li a4,299 + 3007718: cbd8 sw a4,20(a5) + g_gpt2.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */ + 300771a: 31c18793 addi a5,gp,796 # 4000950 + 300771e: 4705 li a4,1 + 3007720: cf98 sw a4,24(a5) + g_gpt2.bufLoad = BASE_CFG_ENABLE; + 3007722: 31c18793 addi a5,gp,796 # 4000950 + 3007726: 4705 li a4,1 + 3007728: 02e782a3 sb a4,37(a5) + g_gpt2.pwmKeep = BASE_CFG_ENABLE; + 300772c: 31c18793 addi a5,gp,796 # 4000950 + 3007730: 4705 li a4,1 + 3007732: 02e78223 sb a4,36(a5) + g_gpt2.handleEx.periodIntEnable = BASE_CFG_DISABLE; + 3007736: 31c18793 addi a5,gp,796 # 4000950 + 300773a: 02078823 sb zero,48(a5) + g_gpt2.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + 300773e: 31c18793 addi a5,gp,796 # 4000950 + 3007742: 020788a3 sb zero,49(a5) + g_gpt2.triggleAdcOutFinish = BASE_CFG_DISABLE; + 3007746: 31c18793 addi a5,gp,796 # 4000950 + 300774a: 020783a3 sb zero,39(a5) + g_gpt2.triggleAdcPeriod = BASE_CFG_DISABLE; + 300774e: 31c18793 addi a5,gp,796 # 4000950 + 3007752: 02078323 sb zero,38(a5) + + HAL_GPT_Init(&g_gpt2); + 3007756: 31c18513 addi a0,gp,796 # 4000950 + 300775a: 2055 jal ra,30077fe + +} + 300775c: 0001 nop + 300775e: 40b2 lw ra,12(sp) + 3007760: 4422 lw s0,8(sp) + 3007762: 0141 addi sp,sp,16 + 3007764: 8082 ret + +03007766 : + +static void GPT3_Init(void) +{ + 3007766: 1141 addi sp,sp,-16 + 3007768: c606 sw ra,12(sp) + 300776a: c422 sw s0,8(sp) + 300776c: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(GPT3_BASE, IP_CLK_ENABLE); + 300776e: 4585 li a1,1 + 3007770: 14703537 lui a0,0x14703 + 3007774: 2aa9 jal ra,30078ce +// 控制舵机 50hz信号 + g_gpt3.baseAddress = GPT3; + 3007776: 35018793 addi a5,gp,848 # 4000984 + 300777a: 14703737 lui a4,0x14703 + 300777e: c398 sw a4,0(a5) + g_gpt3.clockDiv = 300 - 1; /* 10 is the internal frequency division of GPT */ + 3007780: 35018793 addi a5,gp,848 # 4000984 + 3007784: 12b00713 li a4,299 + 3007788: c798 sw a4,8(a5) + g_gpt3.period = 10000 -1; /* 999 is the number of GPT counting cycles. */ + 300778a: 35018793 addi a5,gp,848 # 4000984 + 300778e: 6709 lui a4,0x2 + 3007790: 70f70713 addi a4,a4,1807 # 270f + 3007794: cfd8 sw a4,28(a5) + g_gpt3.refA0.refdot = 1; /* 700 is the value of PWM reference point A. */ + 3007796: 35018793 addi a5,gp,848 # 4000984 + 300779a: 4705 li a4,1 + 300779c: c7d8 sw a4,12(a5) + g_gpt3.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */ + 300779e: 35018793 addi a5,gp,848 # 4000984 + 30077a2: 4709 li a4,2 + 30077a4: cb98 sw a4,16(a5) + g_gpt3.refB0.refdot = 4999; /* 900 is the value of PWM reference point B. */ + 30077a6: 35018793 addi a5,gp,848 # 4000984 + 30077aa: 6705 lui a4,0x1 + 30077ac: 38770713 addi a4,a4,903 # 1387 + 30077b0: cbd8 sw a4,20(a5) + g_gpt3.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */ + 30077b2: 35018793 addi a5,gp,848 # 4000984 + 30077b6: 4705 li a4,1 + 30077b8: cf98 sw a4,24(a5) + g_gpt3.bufLoad = BASE_CFG_ENABLE; + 30077ba: 35018793 addi a5,gp,848 # 4000984 + 30077be: 4705 li a4,1 + 30077c0: 02e782a3 sb a4,37(a5) + g_gpt3.pwmKeep = BASE_CFG_ENABLE; + 30077c4: 35018793 addi a5,gp,848 # 4000984 + 30077c8: 4705 li a4,1 + 30077ca: 02e78223 sb a4,36(a5) + g_gpt3.handleEx.periodIntEnable = BASE_CFG_DISABLE; + 30077ce: 35018793 addi a5,gp,848 # 4000984 + 30077d2: 02078823 sb zero,48(a5) + g_gpt3.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + 30077d6: 35018793 addi a5,gp,848 # 4000984 + 30077da: 020788a3 sb zero,49(a5) + g_gpt3.triggleAdcOutFinish = BASE_CFG_DISABLE; + 30077de: 35018793 addi a5,gp,848 # 4000984 + 30077e2: 020783a3 sb zero,39(a5) + g_gpt3.triggleAdcPeriod = BASE_CFG_DISABLE; + 30077e6: 35018793 addi a5,gp,848 # 4000984 + 30077ea: 02078323 sb zero,38(a5) + + HAL_GPT_Init(&g_gpt3); + 30077ee: 35018513 addi a0,gp,848 # 4000984 + 30077f2: 2031 jal ra,30077fe + +} + 30077f4: 0001 nop + 30077f6: 40b2 lw ra,12(sp) + 30077f8: 4422 lw s0,8(sp) + 30077fa: 0141 addi sp,sp,16 + 30077fc: 8082 ret + +030077fe : + 30077fe: c6efd06f j 3004c6c + +03007802 : +// /* USER CODE BEGIN TIMER0_InterruptProcess */ +// /* USER CODE END TIMER0_InterruptProcess */ +// } + +static void TIMER0_Init(void) +{ + 3007802: 1101 addi sp,sp,-32 + 3007804: ce06 sw ra,28(sp) + 3007806: cc22 sw s0,24(sp) + 3007808: 1000 addi s0,sp,32 + HAL_CRG_IpEnableSet(TIMER0_BASE, IP_CLK_ENABLE); /* TIMER0 clock enable. */ + 300780a: 4585 li a1,1 + 300780c: 14300537 lui a0,0x14300 + 3007810: 287d jal ra,30078ce + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER0) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 1000; + 3007812: 14300537 lui a0,0x14300 + 3007816: d11fa0ef jal ra,3002526 + 300781a: 872a mv a4,a0 + 300781c: 000f47b7 lui a5,0xf4 + 3007820: 24078793 addi a5,a5,576 # f4240 + 3007824: 02f75733 divu a4,a4,a5 + 3007828: 3e800793 li a5,1000 + 300782c: 02f707b3 mul a5,a4,a5 + 3007830: fef42623 sw a5,-20(s0) + + g_timer0.baseAddress = TIMER0; + 3007834: 38418793 addi a5,gp,900 # 40009b8 + 3007838: 14300737 lui a4,0x14300 + 300783c: c398 sw a4,0(a5) + g_timer0.load = load - 1; /* Set timer value immediately */ + 300783e: fec42783 lw a5,-20(s0) + 3007842: fff78713 addi a4,a5,-1 + 3007846: 38418793 addi a5,gp,900 # 40009b8 + 300784a: cbd8 sw a4,20(a5) + g_timer0.bgLoad = load - 1; /* Set timer value */ + 300784c: fec42783 lw a5,-20(s0) + 3007850: fff78713 addi a4,a5,-1 + 3007854: 38418793 addi a5,gp,900 # 40009b8 + 3007858: cf98 sw a4,24(a5) + g_timer0.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + 300785a: 38418793 addi a5,gp,900 # 40009b8 + 300785e: 4705 li a4,1 + 3007860: c798 sw a4,8(a5) + g_timer0.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + 3007862: 38418793 addi a5,gp,900 # 40009b8 + 3007866: 0007a623 sw zero,12(a5) + g_timer0.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + 300786a: 38418793 addi a5,gp,900 # 40009b8 + 300786e: 4705 li a4,1 + 3007870: cb98 sw a4,16(a5) + g_timer0.interruptEn = BASE_CFG_ENABLE; + 3007872: 38418793 addi a5,gp,900 # 40009b8 + 3007876: 4705 li a4,1 + 3007878: afd8 sb a4,28(a5) + g_timer0.adcSocReqEnable = BASE_CFG_DISABLE; + 300787a: 38418793 addi a5,gp,900 # 40009b8 + 300787e: 00078ea3 sb zero,29(a5) + g_timer0.dmaReqEnable = BASE_CFG_DISABLE; + 3007882: 38418793 addi a5,gp,900 # 40009b8 + 3007886: 00078f23 sb zero,30(a5) + HAL_TIMER_Init(&g_timer0); + 300788a: 38418513 addi a0,gp,900 # 40009b8 + 300788e: d26fe0ef jal ra,3005db4 + IRQ_Register(IRQ_TIMER0, HAL_TIMER_IrqHandler, &g_timer0); + 3007892: 38418613 addi a2,gp,900 # 40009b8 + 3007896: 030067b7 lui a5,0x3006 + 300789a: 08c78593 addi a1,a5,140 # 300608c + 300789e: 02000513 li a0,32 + 30078a2: 2a29 jal ra,30079bc + + HAL_TIMER_RegisterCallback(&g_timer0, TIMER_PERIOD_FIN, TIMER0_InterruptProcess); + 30078a4: 030077b7 lui a5,0x3007 + 30078a8: f3078613 addi a2,a5,-208 # 3006f30 + 30078ac: 4581 li a1,0 + 30078ae: 38418513 addi a0,gp,900 # 40009b8 + 30078b2: 8c3fe0ef jal ra,3006174 + IRQ_SetPriority(IRQ_TIMER0, 1); /* 1 is priority value */ + 30078b6: 4585 li a1,1 + 30078b8: 02000513 li a0,32 + 30078bc: 28f5 jal ra,30079b8 + IRQ_EnableN(IRQ_TIMER0); + 30078be: 02000513 li a0,32 + 30078c2: 28cd jal ra,30079b4 +} + 30078c4: 0001 nop + 30078c6: 40f2 lw ra,28(sp) + 30078c8: 4462 lw s0,24(sp) + 30078ca: 6105 addi sp,sp,32 + 30078cc: 8082 ret + +030078ce : + 30078ce: d37fa06f j 3002604 + +030078d2 : + +__weak void UART0WriteInterruptCallback(void *handle) +{ + 30078d2: 1101 addi sp,sp,-32 + 30078d4: ce22 sw s0,28(sp) + 30078d6: 1000 addi s0,sp,32 + 30078d8: fea42623 sw a0,-20(s0) + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + 30078dc: 0001 nop + 30078de: 4472 lw s0,28(sp) + 30078e0: 6105 addi sp,sp,32 + 30078e2: 8082 ret + +030078e4 : + /* USER CODE BEGIN UART0_READ_IT_FINISH */ +// /* USER CODE END UART0_READ_IT_FINISH */ +} + +static void UART0_Init(void) +{ + 30078e4: 1141 addi sp,sp,-16 + 30078e6: c606 sw ra,12(sp) + 30078e8: c422 sw s0,8(sp) + 30078ea: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + 30078ec: 4585 li a1,1 + 30078ee: 14000537 lui a0,0x14000 + 30078f2: 3ff1 jal ra,30078ce + g_uart0.baseAddress = UART0; + 30078f4: 3ac18793 addi a5,gp,940 # 40009e0 + 30078f8: 14000737 lui a4,0x14000 + 30078fc: c398 sw a4,0(a5) + + g_uart0.baudRate = UART0_BAND_RATE; + 30078fe: 3ac18793 addi a5,gp,940 # 40009e0 + 3007902: 6771 lui a4,0x1c + 3007904: 20070713 addi a4,a4,512 # 1c200 + 3007908: c3d8 sw a4,4(a5) + g_uart0.dataLength = UART_DATALENGTH_8BIT; + 300790a: 3ac18793 addi a5,gp,940 # 40009e0 + 300790e: 470d li a4,3 + 3007910: c798 sw a4,8(a5) + g_uart0.stopBits = UART_STOPBITS_ONE; + 3007912: 3ac18793 addi a5,gp,940 # 40009e0 + 3007916: 0007a623 sw zero,12(a5) + g_uart0.parity = UART_PARITY_NONE; + 300791a: 3ac18793 addi a5,gp,940 # 40009e0 + 300791e: 4711 li a4,4 + 3007920: cb98 sw a4,16(a5) + g_uart0.txMode = UART_MODE_INTERRUPT; + 3007922: 3ac18793 addi a5,gp,940 # 40009e0 + 3007926: 4705 li a4,1 + 3007928: cbd8 sw a4,20(a5) + g_uart0.rxMode = UART_MODE_INTERRUPT; + 300792a: 3ac18793 addi a5,gp,940 # 40009e0 + 300792e: 4705 li a4,1 + 3007930: cf98 sw a4,24(a5) + g_uart0.fifoMode = BASE_CFG_ENABLE; + 3007932: 3ac18793 addi a5,gp,940 # 40009e0 + 3007936: 4705 li a4,1 + 3007938: 02e78623 sb a4,44(a5) + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + 300793c: 3ac18793 addi a5,gp,940 # 40009e0 + 3007940: 4721 li a4,8 + 3007942: db98 sw a4,48(a5) + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + 3007944: 3ac18793 addi a5,gp,940 # 40009e0 + 3007948: 4721 li a4,8 + 300794a: dbd8 sw a4,52(a5) + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + 300794c: 3ac18793 addi a5,gp,940 # 40009e0 + 3007950: 0207ac23 sw zero,56(a5) + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + 3007954: 3ac18793 addi a5,gp,940 # 40009e0 + 3007958: 0607ac23 sw zero,120(a5) + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + 300795c: 3ac18793 addi a5,gp,940 # 40009e0 + 3007960: 06078e23 sb zero,124(a5) + HAL_UART_Init(&g_uart0); + 3007964: 3ac18513 addi a0,gp,940 # 40009e0 + 3007968: b7bfe0ef jal ra,30064e2 + HAL_UART_RegisterCallBack(&g_uart0, UART_WRITE_IT_FINISH, (UART_CallbackType)UART0WriteInterruptCallback); + 300796c: 030087b7 lui a5,0x3008 + 3007970: 8d278613 addi a2,a5,-1838 # 30078d2 + 3007974: 4581 li a1,0 + 3007976: 3ac18513 addi a0,gp,940 # 40009e0 + 300797a: c82ff0ef jal ra,3006dfc + HAL_UART_RegisterCallBack(&g_uart0, UART_READ_IT_FINISH, (UART_CallbackType)UART0ReadInterruptCallback); + 300797e: 030077b7 lui a5,0x3007 + 3007982: f0e78613 addi a2,a5,-242 # 3006f0e + 3007986: 4585 li a1,1 + 3007988: 3ac18513 addi a0,gp,940 # 40009e0 + 300798c: c70ff0ef jal ra,3006dfc + + /* USER CODE BEGIN UART0_Init */ + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart0);//串口接收回调函数有修改,以回车换行符作为接收结束符 + 3007990: 3ac18613 addi a2,gp,940 # 40009e0 + 3007994: 030077b7 lui a5,0x3007 + 3007998: c9e78593 addi a1,a5,-866 # 3006c9e + 300799c: 4571 li a0,28 + 300799e: 2839 jal ra,30079bc + IRQ_SetPriority(IRQ_UART0, 3); /* 1 is priority value */ + 30079a0: 458d li a1,3 + 30079a2: 4571 li a0,28 + 30079a4: 2811 jal ra,30079b8 + IRQ_EnableN(IRQ_UART0); + 30079a6: 4571 li a0,28 + 30079a8: 2031 jal ra,30079b4 + /* USER CODE END UART0_Init */ + +} + 30079aa: 0001 nop + 30079ac: 40b2 lw ra,12(sp) + 30079ae: 4422 lw s0,8(sp) + 30079b0: 0141 addi sp,sp,16 + 30079b2: 8082 ret + +030079b4 : + 30079b4: ab1f906f j 3001464 + +030079b8 : + 30079b8: 9fafa06f j 3001bb2 + +030079bc : + 30079bc: a27f906f j 30013e2 + +030079c0 : + +static void I2C0_Init(void) +{ + 30079c0: 1141 addi sp,sp,-16 + 30079c2: c606 sw ra,12(sp) + 30079c4: c422 sw s0,8(sp) + 30079c6: 0800 addi s0,sp,16 + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); /* I2C0 clock enable. */ + 30079c8: 4585 li a1,1 + 30079ca: 14100537 lui a0,0x14100 + 30079ce: 3701 jal ra,30078ce + g_i2c0.baseAddress = I2C0; + 30079d0: 42c18793 addi a5,gp,1068 # 4000a60 + 30079d4: 14100737 lui a4,0x14100 + 30079d8: c398 sw a4,0(a5) + + g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; + 30079da: 42c18793 addi a5,gp,1068 # 4000a60 + 30079de: 4705 li a4,1 + 30079e0: c3d8 sw a4,4(a5) + g_i2c0.addrMode = I2C_7_BITS; + 30079e2: 42c18793 addi a5,gp,1068 # 4000a60 + 30079e6: 0007a423 sw zero,8(a5) + g_i2c0.sdaHoldTime = 10; /* 10 is sda Hold Time */ + 30079ea: 42c18793 addi a5,gp,1068 # 4000a60 + 30079ee: 4729 li a4,10 + 30079f0: cb98 sw a4,16(a5) + g_i2c0.freq = 400000; /* freqence is 100000 */ + 30079f2: 42c18793 addi a5,gp,1068 # 4000a60 + 30079f6: 00062737 lui a4,0x62 + 30079fa: a8070713 addi a4,a4,-1408 # 61a80 + 30079fe: cbd8 sw a4,20(a5) + g_i2c0.transferBuff = NULL; + 3007a00: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a04: 0207a023 sw zero,32(a5) + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + 3007a08: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a0c: 0007ac23 sw zero,24(a5) + g_i2c0.handleEx.spikeFilterTime = 0; + 3007a10: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a14: 0407ac23 sw zero,88(a5) + g_i2c0.handleEx.sdaDelayTime = 0; + 3007a18: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a1c: 0407ae23 sw zero,92(a5) + g_i2c0.timeout = 10000; /* 10000 is time out */ + 3007a20: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a24: 6709 lui a4,0x2 + 3007a26: 71070713 addi a4,a4,1808 # 2710 + 3007a2a: d7d8 sw a4,44(a5) + g_i2c0.state = I2C_STATE_RESET; + 3007a2c: 42c18793 addi a5,gp,1068 # 4000a60 + 3007a30: 0407a223 sw zero,68(a5) + HAL_I2C_Init(&g_i2c0); + 3007a34: 42c18513 addi a0,gp,1068 # 4000a60 + 3007a38: be5fd0ef jal ra,300561c +} + 3007a3c: 0001 nop + 3007a3e: 40b2 lw ra,12(sp) + 3007a40: 4422 lw s0,8(sp) + 3007a42: 0141 addi sp,sp,16 + 3007a44: 8082 ret + +03007a46 : + +static void IOConfig(void) +{ + 3007a46: 1141 addi sp,sp,-16 + 3007a48: c606 sw ra,12(sp) + 3007a4a: c422 sw s0,8(sp) + 3007a4c: 0800 addi s0,sp,16 + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + 3007a4e: 10100737 lui a4,0x10100 + 3007a52: 4f1c lw a5,24(a4) + 3007a54: 9bbd andi a5,a5,-17 + 3007a56: cf1c sw a5,24(a4) + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + 3007a58: 10100737 lui a4,0x10100 + 3007a5c: 4f1c lw a5,24(a4) + 3007a5e: 0017e793 ori a5,a5,1 + 3007a62: cf1c sw a5,24(a4) + /* Config PIN36 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_0_AS_JTAG_TCK); /* Check function selection */ + 3007a64: 018807b7 lui a5,0x1880 + 3007a68: 2b178513 addi a0,a5,689 # 18802b1 + 3007a6c: 211d jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO0_0_AS_JTAG_TCK, PULL_NONE); /* Pull-up and Pull-down */ + 3007a6e: 4581 li a1,0 + 3007a70: 018807b7 lui a5,0x1880 + 3007a74: 2b178513 addi a0,a5,689 # 18802b1 + 3007a78: 2919 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_0_AS_JTAG_TCK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007a7a: 4581 li a1,0 + 3007a7c: 018807b7 lui a5,0x1880 + 3007a80: 2b178513 addi a0,a5,689 # 18802b1 + 3007a84: 2119 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_0_AS_JTAG_TCK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007a86: 4585 li a1,1 + 3007a88: 018807b7 lui a5,0x1880 + 3007a8c: 2b178513 addi a0,a5,689 # 18802b1 + 3007a90: 2edd jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO0_0_AS_JTAG_TCK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007a92: 4589 li a1,2 + 3007a94: 018807b7 lui a5,0x1880 + 3007a98: 2b178513 addi a0,a5,689 # 18802b1 + 3007a9c: 26dd jal ra,3007e82 + /* Config PIN37 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_1_AS_JTAG_TMS); /* Check function selection */ + 3007a9e: 018c07b7 lui a5,0x18c0 + 3007aa2: 31178513 addi a0,a5,785 # 18c0311 + 3007aa6: 26f5 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO0_1_AS_JTAG_TMS, PULL_NONE); /* Pull-up and Pull-down */ + 3007aa8: 4581 li a1,0 + 3007aaa: 018c07b7 lui a5,0x18c0 + 3007aae: 31178513 addi a0,a5,785 # 18c0311 + 3007ab2: 2ef1 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_1_AS_JTAG_TMS, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007ab4: 4581 li a1,0 + 3007ab6: 018c07b7 lui a5,0x18c0 + 3007aba: 31178513 addi a0,a5,785 # 18c0311 + 3007abe: 26f1 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_1_AS_JTAG_TMS, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007ac0: 4585 li a1,1 + 3007ac2: 018c07b7 lui a5,0x18c0 + 3007ac6: 31178513 addi a0,a5,785 # 18c0311 + 3007aca: 2e75 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO0_1_AS_JTAG_TMS, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007acc: 4589 li a1,2 + 3007ace: 018c07b7 lui a5,0x18c0 + 3007ad2: 31178513 addi a0,a5,785 # 18c0311 + 3007ad6: 2675 jal ra,3007e82 + /* Config PIN47 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_5_AS_GPT1_PWM); /* Check function selection */ + 3007ad8: 01a007b7 lui a5,0x1a00 + 3007adc: 22278513 addi a0,a5,546 # 1a00222 + 3007ae0: 2e4d jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO0_5_AS_GPT1_PWM, PULL_NONE); /* Pull-up and Pull-down */ + 3007ae2: 4581 li a1,0 + 3007ae4: 01a007b7 lui a5,0x1a00 + 3007ae8: 22278513 addi a0,a5,546 # 1a00222 + 3007aec: 264d jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_5_AS_GPT1_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007aee: 4581 li a1,0 + 3007af0: 01a007b7 lui a5,0x1a00 + 3007af4: 22278513 addi a0,a5,546 # 1a00222 + 3007af8: 2e49 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_5_AS_GPT1_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007afa: 4585 li a1,1 + 3007afc: 01a007b7 lui a5,0x1a00 + 3007b00: 22278513 addi a0,a5,546 # 1a00222 + 3007b04: 2649 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO0_5_AS_GPT1_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007b06: 4589 li a1,2 + 3007b08: 01a007b7 lui a5,0x1a00 + 3007b0c: 22278513 addi a0,a5,546 # 1a00222 + 3007b10: 2e8d jal ra,3007e82 + /* Config PIN6 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */ + 3007b12: 011407b7 lui a5,0x1140 + 3007b16: 23178513 addi a0,a5,561 # 1140231 + 3007b1a: 2ea5 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and Pull-down */ + 3007b1c: 4581 li a1,0 + 3007b1e: 011407b7 lui a5,0x1140 + 3007b22: 23178513 addi a0,a5,561 # 1140231 + 3007b26: 26a5 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007b28: 4581 li a1,0 + 3007b2a: 011407b7 lui a5,0x1140 + 3007b2e: 23178513 addi a0,a5,561 # 1140231 + 3007b32: 2ea1 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007b34: 4585 li a1,1 + 3007b36: 011407b7 lui a5,0x1140 + 3007b3a: 23178513 addi a0,a5,561 # 1140231 + 3007b3e: 26a1 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007b40: 4589 li a1,2 + 3007b42: 011407b7 lui a5,0x1140 + 3007b46: 23178513 addi a0,a5,561 # 1140231 + 3007b4a: 2e25 jal ra,3007e82 + /* Config PIN7 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_7_AS_GPT3_PWM); /* Check function selection */ + 3007b4c: 011807b7 lui a5,0x1180 + 3007b50: 23178513 addi a0,a5,561 # 1180231 + 3007b54: 2e3d jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO3_7_AS_GPT3_PWM, PULL_NONE); /* Pull-up and Pull-down */ + 3007b56: 4581 li a1,0 + 3007b58: 011807b7 lui a5,0x1180 + 3007b5c: 23178513 addi a0,a5,561 # 1180231 + 3007b60: 263d jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO3_7_AS_GPT3_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007b62: 4581 li a1,0 + 3007b64: 011807b7 lui a5,0x1180 + 3007b68: 23178513 addi a0,a5,561 # 1180231 + 3007b6c: 2e39 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_7_AS_GPT3_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007b6e: 4585 li a1,1 + 3007b70: 011807b7 lui a5,0x1180 + 3007b74: 23178513 addi a0,a5,561 # 1180231 + 3007b78: 2639 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO3_7_AS_GPT3_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007b7a: 4589 li a1,2 + 3007b7c: 011807b7 lui a5,0x1180 + 3007b80: 23178513 addi a0,a5,561 # 1180231 + 3007b84: 2cfd jal ra,3007e82 + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + 3007b86: 019007b7 lui a5,0x1900 + 3007b8a: 23378513 addi a0,a5,563 # 1900233 + 3007b8e: 2611 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + 3007b90: 4581 li a1,0 + 3007b92: 019007b7 lui a5,0x1900 + 3007b96: 23378513 addi a0,a5,563 # 1900233 + 3007b9a: 2cd5 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007b9c: 4581 li a1,0 + 3007b9e: 019007b7 lui a5,0x1900 + 3007ba2: 23378513 addi a0,a5,563 # 1900233 + 3007ba6: 24d5 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007ba8: 4585 li a1,1 + 3007baa: 019007b7 lui a5,0x1900 + 3007bae: 23378513 addi a0,a5,563 # 1900233 + 3007bb2: 2cd1 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007bb4: 4589 li a1,2 + 3007bb6: 019007b7 lui a5,0x1900 + 3007bba: 23378513 addi a0,a5,563 # 1900233 + 3007bbe: 24d1 jal ra,3007e82 + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + 3007bc0: 019407b7 lui a5,0x1940 + 3007bc4: 23378513 addi a0,a5,563 # 1940233 + 3007bc8: 24e9 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + 3007bca: 4589 li a1,2 + 3007bcc: 019407b7 lui a5,0x1940 + 3007bd0: 23378513 addi a0,a5,563 # 1940233 + 3007bd4: 2c6d jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007bd6: 4581 li a1,0 + 3007bd8: 019407b7 lui a5,0x1940 + 3007bdc: 23378513 addi a0,a5,563 # 1940233 + 3007be0: 246d jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007be2: 4585 li a1,1 + 3007be4: 019407b7 lui a5,0x1940 + 3007be8: 23378513 addi a0,a5,563 # 1940233 + 3007bec: 2c69 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007bee: 4589 li a1,2 + 3007bf0: 019407b7 lui a5,0x1940 + 3007bf4: 23378513 addi a0,a5,563 # 1940233 + 3007bf8: 2469 jal ra,3007e82 + /* Config PIN28 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO1_1_AS_GPIO1_1); /* Check function selection */ + 3007bfa: 016c07b7 lui a5,0x16c0 + 3007bfe: 23078513 addi a0,a5,560 # 16c0230 + 3007c02: 2c41 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO1_1_AS_GPIO1_1, PULL_NONE); /* Pull-up and Pull-down */ + 3007c04: 4581 li a1,0 + 3007c06: 016c07b7 lui a5,0x16c0 + 3007c0a: 23078513 addi a0,a5,560 # 16c0230 + 3007c0e: 2441 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO1_1_AS_GPIO1_1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007c10: 4581 li a1,0 + 3007c12: 016c07b7 lui a5,0x16c0 + 3007c16: 23078513 addi a0,a5,560 # 16c0230 + 3007c1a: 2c85 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_1_AS_GPIO1_1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007c1c: 4585 li a1,1 + 3007c1e: 016c07b7 lui a5,0x16c0 + 3007c22: 23078513 addi a0,a5,560 # 16c0230 + 3007c26: 2485 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO1_1_AS_GPIO1_1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007c28: 4589 li a1,2 + 3007c2a: 016c07b7 lui a5,0x16c0 + 3007c2e: 23078513 addi a0,a5,560 # 16c0230 + 3007c32: 2c81 jal ra,3007e82 + /* Config PIN18 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_GPIO1_4); /* Check function selection */ + 3007c34: 014407b7 lui a5,0x1440 + 3007c38: 23078513 addi a0,a5,560 # 1440230 + 3007c3c: 2c99 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_GPIO1_4, PULL_NONE); /* Pull-up and Pull-down */ + 3007c3e: 4581 li a1,0 + 3007c40: 014407b7 lui a5,0x1440 + 3007c44: 23078513 addi a0,a5,560 # 1440230 + 3007c48: 2499 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_GPIO1_4, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007c4a: 4581 li a1,0 + 3007c4c: 014407b7 lui a5,0x1440 + 3007c50: 23078513 addi a0,a5,560 # 1440230 + 3007c54: 2c1d jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_GPIO1_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007c56: 4585 li a1,1 + 3007c58: 014407b7 lui a5,0x1440 + 3007c5c: 23078513 addi a0,a5,560 # 1440230 + 3007c60: 241d jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_GPIO1_4, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007c62: 4589 li a1,2 + 3007c64: 014407b7 lui a5,0x1440 + 3007c68: 23078513 addi a0,a5,560 # 1440230 + 3007c6c: 2c19 jal ra,3007e82 + + /* Config PIN9 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_5_AS_GPIO3_5); /* Check function selection */ + 3007c6e: 012007b7 lui a5,0x1200 + 3007c72: 23078513 addi a0,a5,560 # 1200230 + 3007c76: 2c31 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO3_5_AS_GPIO3_5, PULL_NONE); /* Pull-up and Pull-down */ + 3007c78: 4581 li a1,0 + 3007c7a: 012007b7 lui a5,0x1200 + 3007c7e: 23078513 addi a0,a5,560 # 1200230 + 3007c82: 2431 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO3_5_AS_GPIO3_5, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007c84: 4581 li a1,0 + 3007c86: 012007b7 lui a5,0x1200 + 3007c8a: 23078513 addi a0,a5,560 # 1200230 + 3007c8e: 2af5 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_5_AS_GPIO3_5, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007c90: 4585 li a1,1 + 3007c92: 012007b7 lui a5,0x1200 + 3007c96: 23078513 addi a0,a5,560 # 1200230 + 3007c9a: 22f5 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO3_5_AS_GPIO3_5, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007c9c: 4589 li a1,2 + 3007c9e: 012007b7 lui a5,0x1200 + 3007ca2: 23078513 addi a0,a5,560 # 1200230 + 3007ca6: 2af1 jal ra,3007e82 + /* Config PIN8 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_6_AS_GPIO3_6); /* Check function selection */ + 3007ca8: 011c07b7 lui a5,0x11c0 + 3007cac: 23078513 addi a0,a5,560 # 11c0230 + 3007cb0: 22cd jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO3_6_AS_GPIO3_6, PULL_NONE); /* Pull-up and Pull-down */ + 3007cb2: 4581 li a1,0 + 3007cb4: 011c07b7 lui a5,0x11c0 + 3007cb8: 23078513 addi a0,a5,560 # 11c0230 + 3007cbc: 2ac9 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO3_6_AS_GPIO3_6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007cbe: 4581 li a1,0 + 3007cc0: 011c07b7 lui a5,0x11c0 + 3007cc4: 23078513 addi a0,a5,560 # 11c0230 + 3007cc8: 22c9 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_6_AS_GPIO3_6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007cca: 4585 li a1,1 + 3007ccc: 011c07b7 lui a5,0x11c0 + 3007cd0: 23078513 addi a0,a5,560 # 11c0230 + 3007cd4: 2a4d jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO3_6_AS_GPIO3_6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007cd6: 4589 li a1,2 + 3007cd8: 011c07b7 lui a5,0x11c0 + 3007cdc: 23078513 addi a0,a5,560 # 11c0230 + 3007ce0: 224d jal ra,3007e82 + + /* Config PIN2 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_1_AS_GPIO5_1); /* Check function selection */ + 3007ce2: 010407b7 lui a5,0x1040 + 3007ce6: 23078513 addi a0,a5,560 # 1040230 + 3007cea: 2265 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO5_1_AS_GPIO5_1, PULL_NONE); /* Pull-up and Pull-down */ + 3007cec: 4581 li a1,0 + 3007cee: 010407b7 lui a5,0x1040 + 3007cf2: 23078513 addi a0,a5,560 # 1040230 + 3007cf6: 2a61 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO5_1_AS_GPIO5_1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007cf8: 4581 li a1,0 + 3007cfa: 010407b7 lui a5,0x1040 + 3007cfe: 23078513 addi a0,a5,560 # 1040230 + 3007d02: 2261 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_1_AS_GPIO5_1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007d04: 4585 li a1,1 + 3007d06: 010407b7 lui a5,0x1040 + 3007d0a: 23078513 addi a0,a5,560 # 1040230 + 3007d0e: 2aa5 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO5_1_AS_GPIO5_1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007d10: 4589 li a1,2 + 3007d12: 010407b7 lui a5,0x1040 + 3007d16: 23078513 addi a0,a5,560 # 1040230 + 3007d1a: 22a5 jal ra,3007e82 + /* Config PIN10 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_3_AS_GPIO5_3); /* Check function selection */ + 3007d1c: 012407b7 lui a5,0x1240 + 3007d20: 23078513 addi a0,a5,560 # 1240230 + 3007d24: 22bd jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO5_3_AS_GPIO5_3, PULL_NONE); /* Pull-up and Pull-down */ + 3007d26: 4581 li a1,0 + 3007d28: 012407b7 lui a5,0x1240 + 3007d2c: 23078513 addi a0,a5,560 # 1240230 + 3007d30: 2ab9 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO5_3_AS_GPIO5_3, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007d32: 4581 li a1,0 + 3007d34: 012407b7 lui a5,0x1240 + 3007d38: 23078513 addi a0,a5,560 # 1240230 + 3007d3c: 22b9 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_3_AS_GPIO5_3, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007d3e: 4585 li a1,1 + 3007d40: 012407b7 lui a5,0x1240 + 3007d44: 23078513 addi a0,a5,560 # 1240230 + 3007d48: 2a3d jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO5_3_AS_GPIO5_3, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007d4a: 4589 li a1,2 + 3007d4c: 012407b7 lui a5,0x1240 + 3007d50: 23078513 addi a0,a5,560 # 1240230 + 3007d54: 223d jal ra,3007e82 + + + /* Config PIN26 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_3_AS_I2C0_SDA); /* Check function selection */ + 3007d56: 016407b7 lui a5,0x1640 + 3007d5a: 23278513 addi a0,a5,562 # 1640232 + 3007d5e: 2a15 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO4_3_AS_I2C0_SDA, PULL_NONE); /* Pull-up and Pull-down */ + 3007d60: 4581 li a1,0 + 3007d62: 016407b7 lui a5,0x1640 + 3007d66: 23278513 addi a0,a5,562 # 1640232 + 3007d6a: 2215 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO4_3_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007d6c: 4581 li a1,0 + 3007d6e: 016407b7 lui a5,0x1640 + 3007d72: 23278513 addi a0,a5,562 # 1640232 + 3007d76: 2a11 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_3_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007d78: 4585 li a1,1 + 3007d7a: 016407b7 lui a5,0x1640 + 3007d7e: 23278513 addi a0,a5,562 # 1640232 + 3007d82: 2211 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO4_3_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007d84: 4589 li a1,2 + 3007d86: 016407b7 lui a5,0x1640 + 3007d8a: 23278513 addi a0,a5,562 # 1640232 + 3007d8e: 28d5 jal ra,3007e82 + /* Config PIN25 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_2_AS_I2C0_SCL); /* Check function selection */ + 3007d90: 016007b7 lui a5,0x1600 + 3007d94: 23278513 addi a0,a5,562 # 1600232 + 3007d98: 28ed jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO4_2_AS_I2C0_SCL, PULL_NONE); /* Pull-up and Pull-down */ + 3007d9a: 4581 li a1,0 + 3007d9c: 016007b7 lui a5,0x1600 + 3007da0: 23278513 addi a0,a5,562 # 1600232 + 3007da4: 20ed jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO4_2_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007da6: 4581 li a1,0 + 3007da8: 016007b7 lui a5,0x1600 + 3007dac: 23278513 addi a0,a5,562 # 1600232 + 3007db0: 28e9 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_2_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007db2: 4585 li a1,1 + 3007db4: 016007b7 lui a5,0x1600 + 3007db8: 23278513 addi a0,a5,562 # 1600232 + 3007dbc: 20e9 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO4_2_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007dbe: 4589 li a1,2 + 3007dc0: 016007b7 lui a5,0x1600 + 3007dc4: 23278513 addi a0,a5,562 # 1600232 + 3007dc8: 286d jal ra,3007e82 + + /* Config PIN30 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_4_AS_GPIO4_4); /* Check function selection */ + 3007dca: 017407b7 lui a5,0x1740 + 3007dce: 23078513 addi a0,a5,560 # 1740230 + 3007dd2: 20c1 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO4_4_AS_GPIO4_4, PULL_NONE); /* Pull-up and Pull-down */ + 3007dd4: 4581 li a1,0 + 3007dd6: 017407b7 lui a5,0x1740 + 3007dda: 23078513 addi a0,a5,560 # 1740230 + 3007dde: 2845 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO4_4_AS_GPIO4_4, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007de0: 4581 li a1,0 + 3007de2: 017407b7 lui a5,0x1740 + 3007de6: 23078513 addi a0,a5,560 # 1740230 + 3007dea: 2045 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_4_AS_GPIO4_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007dec: 4585 li a1,1 + 3007dee: 017407b7 lui a5,0x1740 + 3007df2: 23078513 addi a0,a5,560 # 1740230 + 3007df6: 2841 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO4_4_AS_GPIO4_4, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007df8: 4589 li a1,2 + 3007dfa: 017407b7 lui a5,0x1740 + 3007dfe: 23078513 addi a0,a5,560 # 1740230 + 3007e02: 2041 jal ra,3007e82 + /* Config PIN29 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_4_AS_GPIO3_4); /* Check function selection */ + 3007e04: 017007b7 lui a5,0x1700 + 3007e08: 23078513 addi a0,a5,560 # 1700230 + 3007e0c: 2059 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO3_4_AS_GPIO3_4, PULL_NONE); /* Pull-up and Pull-down */ + 3007e0e: 4581 li a1,0 + 3007e10: 017007b7 lui a5,0x1700 + 3007e14: 23078513 addi a0,a5,560 # 1700230 + 3007e18: 289d jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO3_4_AS_GPIO3_4, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007e1a: 4581 li a1,0 + 3007e1c: 017007b7 lui a5,0x1700 + 3007e20: 23078513 addi a0,a5,560 # 1700230 + 3007e24: 209d jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_4_AS_GPIO3_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007e26: 4585 li a1,1 + 3007e28: 017007b7 lui a5,0x1700 + 3007e2c: 23078513 addi a0,a5,560 # 1700230 + 3007e30: 2899 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO3_4_AS_GPIO3_4, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007e32: 4589 li a1,2 + 3007e34: 017007b7 lui a5,0x1700 + 3007e38: 23078513 addi a0,a5,560 # 1700230 + 3007e3c: 2099 jal ra,3007e82 + /* Config PIN34 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_GPIO2_2); /* Check function selection */ + 3007e3e: 018007b7 lui a5,0x1800 + 3007e42: 23078513 addi a0,a5,560 # 1800230 + 3007e46: 20b1 jal ra,3007e92 + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_GPIO2_2, PULL_NONE); /* Pull-up and Pull-down */ + 3007e48: 4581 li a1,0 + 3007e4a: 018007b7 lui a5,0x1800 + 3007e4e: 23078513 addi a0,a5,560 # 1800230 + 3007e52: 2835 jal ra,3007e8e + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_GPIO2_2, SCHMIDT_DISABLE); /* Schmitt input on/off */ + 3007e54: 4581 li a1,0 + 3007e56: 018007b7 lui a5,0x1800 + 3007e5a: 23078513 addi a0,a5,560 # 1800230 + 3007e5e: 2035 jal ra,3007e8a + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_GPIO2_2, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + 3007e60: 4585 li a1,1 + 3007e62: 018007b7 lui a5,0x1800 + 3007e66: 23078513 addi a0,a5,560 # 1800230 + 3007e6a: 2831 jal ra,3007e86 + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_GPIO2_2, DRIVER_RATE_2); /* Output signal edge fast/slow */ + 3007e6c: 4589 li a1,2 + 3007e6e: 018007b7 lui a5,0x1800 + 3007e72: 23078513 addi a0,a5,560 # 1800230 + 3007e76: 2031 jal ra,3007e82 + +} + 3007e78: 0001 nop + 3007e7a: 40b2 lw ra,12(sp) + 3007e7c: 4422 lw s0,8(sp) + 3007e7e: 0141 addi sp,sp,16 + 3007e80: 8082 ret + +03007e82 : + 3007e82: e07fd06f j 3005c88 + +03007e86 : + 3007e86: db7fd06f j 3005c3c + +03007e8a : + 3007e8a: d67fd06f j 3005bf0 + +03007e8e : + 3007e8e: d17fd06f j 3005ba4 + +03007e92 : + 3007e92: cd9fd06f j 3005b6a + +03007e96 : + +void SystemInit(void) +{ + 3007e96: 1141 addi sp,sp,-16 + 3007e98: c606 sw ra,12(sp) + 3007e9a: c422 sw s0,8(sp) + 3007e9c: 0800 addi s0,sp,16 + IOConfig(); + 3007e9e: 3665 jal ra,3007a46 + UART0_Init();//串口初始化中,接收回调函数有修改。 + 3007ea0: 3491 jal ra,30078e4 + I2C0_Init(); + 3007ea2: 3e39 jal ra,30079c0 + GPT1_Init(); + 3007ea4: f9eff0ef jal ra,3007642 + GPT2_Init(); + 3007ea8: 3035 jal ra,30076d4 + GPT3_Init(); + 3007eaa: 3875 jal ra,3007766 + TIMER0_Init(); + 3007eac: 3a99 jal ra,3007802 + GPIO_Init(); + 3007eae: d6cff0ef jal ra,300741a + + /* USER CODE BEGIN system_init */ + + /* USER CODE END system_init */ + 3007eb2: 0001 nop + 3007eb4: 40b2 lw ra,12(sp) + 3007eb6: 4422 lw s0,8(sp) + 3007eb8: 0141 addi sp,sp,16 + 3007eba: 8082 ret + +03007ebc : +#include "main.h" + + +//电机正反转设置 a确定左右 0,1 ,2(同步) b-in1 c-in2 b c 1 0是前进 0 1 是后退 +void MotorStatus(unsigned char a,unsigned char b,unsigned char c) +{ + 3007ebc: 1101 addi sp,sp,-32 + 3007ebe: ce06 sw ra,28(sp) + 3007ec0: cc22 sw s0,24(sp) + 3007ec2: 1000 addi s0,sp,32 + 3007ec4: 87aa mv a5,a0 + 3007ec6: 86ae mv a3,a1 + 3007ec8: 8732 mv a4,a2 + 3007eca: fef407a3 sb a5,-17(s0) + 3007ece: 87b6 mv a5,a3 + 3007ed0: fef40723 sb a5,-18(s0) + 3007ed4: 87ba mv a5,a4 + 3007ed6: fef406a3 sb a5,-19(s0) + if(a == 2){ + 3007eda: fef44703 lbu a4,-17(s0) + 3007ede: 4789 li a5,2 + 3007ee0: 04f71163 bne a4,a5,3007f22 + //同步设置 + left_in1(b);left_in2(c); + 3007ee4: fee44783 lbu a5,-18(s0) + 3007ee8: 863e mv a2,a5 + 3007eea: 02000593 li a1,32 + 3007eee: 52418513 addi a0,gp,1316 # 4000b58 + 3007ef2: 28bd jal ra,3007f70 + 3007ef4: fed44783 lbu a5,-19(s0) + 3007ef8: 863e mv a2,a5 + 3007efa: 04000593 li a1,64 + 3007efe: 52418513 addi a0,gp,1316 # 4000b58 + 3007f02: 20bd jal ra,3007f70 + right_in1(b);right_in2(c); + 3007f04: fee44783 lbu a5,-18(s0) + 3007f08: 863e mv a2,a5 + 3007f0a: 45a1 li a1,8 + 3007f0c: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f10: 2085 jal ra,3007f70 + 3007f12: fed44783 lbu a5,-19(s0) + 3007f16: 863e mv a2,a5 + 3007f18: 4589 li a1,2 + 3007f1a: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f1e: 2889 jal ra,3007f70 + }else if(a==0){ + left_in1(b);left_in2(c); + }else{ + right_in1(b);right_in2(c); + } +} + 3007f20: a099 j 3007f66 + }else if(a==0){ + 3007f22: fef44783 lbu a5,-17(s0) + 3007f26: e395 bnez a5,3007f4a + left_in1(b);left_in2(c); + 3007f28: fee44783 lbu a5,-18(s0) + 3007f2c: 863e mv a2,a5 + 3007f2e: 02000593 li a1,32 + 3007f32: 52418513 addi a0,gp,1316 # 4000b58 + 3007f36: 282d jal ra,3007f70 + 3007f38: fed44783 lbu a5,-19(s0) + 3007f3c: 863e mv a2,a5 + 3007f3e: 04000593 li a1,64 + 3007f42: 52418513 addi a0,gp,1316 # 4000b58 + 3007f46: 202d jal ra,3007f70 +} + 3007f48: a839 j 3007f66 + right_in1(b);right_in2(c); + 3007f4a: fee44783 lbu a5,-18(s0) + 3007f4e: 863e mv a2,a5 + 3007f50: 45a1 li a1,8 + 3007f52: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f56: 2829 jal ra,3007f70 + 3007f58: fed44783 lbu a5,-19(s0) + 3007f5c: 863e mv a2,a5 + 3007f5e: 4589 li a1,2 + 3007f60: 5b418513 addi a0,gp,1460 # 4000be8 + 3007f64: 2031 jal ra,3007f70 +} + 3007f66: 0001 nop + 3007f68: 40f2 lw ra,28(sp) + 3007f6a: 4462 lw s0,24(sp) + 3007f6c: 6105 addi sp,sp,32 + 3007f6e: 8082 ret + +03007f70 : + 3007f70: c54fc06f j 30043c4 + +03007f74 : + +/** + * APT0和1的 B点修改配置 +*/ +void ChangeCarApt(unsigned int Left_PWM, unsigned int Right_PWM) +{ + 3007f74: 7139 addi sp,sp,-64 + 3007f76: de06 sw ra,60(sp) + 3007f78: dc22 sw s0,56(sp) + 3007f7a: 0080 addi s0,sp,64 + 3007f7c: fca42623 sw a0,-52(s0) + 3007f80: fcb42423 sw a1,-56(s0) + GPT_ReferCfg PWMConfig1,PWMConfig2; + HAL_GPT_GetReferCounterAndAction(&g_gpt1,&PWMConfig1); + 3007f84: fe040793 addi a5,s0,-32 + 3007f88: 85be mv a1,a5 + 3007f8a: 2e818513 addi a0,gp,744 # 400091c + 3007f8e: 2631 jal ra,300829a + HAL_GPT_GetReferCounterAndAction(&g_gpt2,&PWMConfig2); + 3007f90: fd040793 addi a5,s0,-48 + 3007f94: 85be mv a1,a5 + 3007f96: 31c18513 addi a0,gp,796 # 4000950 + 3007f9a: 2601 jal ra,300829a + g_gpt1.baseAddress->GPT_TC_REFB0.reg = Right_PWM; + 3007f9c: 2e818793 addi a5,gp,744 # 400091c + 3007fa0: 439c lw a5,0(a5) + 3007fa2: fc842703 lw a4,-56(s0) + 3007fa6: cfd8 sw a4,28(a5) + g_gpt2.baseAddress->GPT_TC_REFB0.reg = Left_PWM; + 3007fa8: 31c18793 addi a5,gp,796 # 4000950 + 3007fac: 439c lw a5,0(a5) + 3007fae: fcc42703 lw a4,-52(s0) + 3007fb2: cfd8 sw a4,28(a5) + g_gpt1.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig1.refB0.refAction; + 3007fb4: fec42683 lw a3,-20(s0) + 3007fb8: 2e818793 addi a5,gp,744 # 400091c + 3007fbc: 4398 lw a4,0(a5) + 3007fbe: 87b6 mv a5,a3 + 3007fc0: 8b8d andi a5,a5,3 + 3007fc2: 0ff7f693 andi a3,a5,255 + 3007fc6: 10072783 lw a5,256(a4) # 10100100 + 3007fca: 8a8d andi a3,a3,3 + 3007fcc: 0692 slli a3,a3,0x4 + 3007fce: fcf7f793 andi a5,a5,-49 + 3007fd2: 8fd5 or a5,a5,a3 + 3007fd4: 10f72023 sw a5,256(a4) + g_gpt2.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig2.refB0.refAction; + 3007fd8: fdc42683 lw a3,-36(s0) + 3007fdc: 31c18793 addi a5,gp,796 # 4000950 + 3007fe0: 4398 lw a4,0(a5) + 3007fe2: 87b6 mv a5,a3 + 3007fe4: 8b8d andi a5,a5,3 + 3007fe6: 0ff7f693 andi a3,a5,255 + 3007fea: 10072783 lw a5,256(a4) + 3007fee: 8a8d andi a3,a3,3 + 3007ff0: 0692 slli a3,a3,0x4 + 3007ff2: fcf7f793 andi a5,a5,-49 + 3007ff6: 8fd5 or a5,a5,a3 + 3007ff8: 10f72023 sw a5,256(a4) +} + 3007ffc: 0001 nop + 3007ffe: 50f2 lw ra,60(sp) + 3008000: 5462 lw s0,56(sp) + 3008002: 6121 addi sp,sp,64 + 3008004: 8082 ret + +03008006 : +float preRightError = 0.0,ppreRightError = 0.0; +int Left_ESC_Output_PWM = 0,Right_ESC_Output_PWM = 0; + +void SynTwoMotorSpeed(float current_l_speed,float current_r_speed, + unsigned int target_l_speed,unsigned int target_r_speed) +{ + 3008006: 7139 addi sp,sp,-64 + 3008008: de06 sw ra,60(sp) + 300800a: dc22 sw s0,56(sp) + 300800c: 0080 addi s0,sp,64 + 300800e: fca42627 fsw fa0,-52(s0) + 3008012: fcb42427 fsw fa1,-56(s0) + 3008016: fca42223 sw a0,-60(s0) + 300801a: fcb42023 sw a1,-64(s0) + float L_Error = 0; + 300801e: fe042623 sw zero,-20(s0) + float R_Error = 0; + 3008022: fe042423 sw zero,-24(s0) + + float P_Error = 0; + 3008026: fe042223 sw zero,-28(s0) + float I_Error = 0; + 300802a: fe042023 sw zero,-32(s0) + float D_Error = 0; + 300802e: fc042e23 sw zero,-36(s0) + float addError = 0; + 3008032: fc042c23 sw zero,-40(s0) + + L_Error = target_l_speed - current_l_speed; //计算误差 + 3008036: fc442783 lw a5,-60(s0) + 300803a: d017f753 fcvt.s.wu fa4,a5 + 300803e: fcc42787 flw fa5,-52(s0) + 3008042: 08f777d3 fsub.s fa5,fa4,fa5 + 3008046: fef42627 fsw fa5,-20(s0) + P_Error = L_Error; //比例环节 + 300804a: fec42787 flw fa5,-20(s0) + 300804e: fef42227 fsw fa5,-28(s0) + I_Error = L_Error - preLeftError; //积分环节 + 3008052: 5fc1a787 flw fa5,1532(gp) # 4000c30 + 3008056: fec42707 flw fa4,-20(s0) + 300805a: 08f777d3 fsub.s fa5,fa4,fa5 + 300805e: fef42027 fsw fa5,-32(s0) + D_Error = L_Error - 2*preLeftError + ppreLeftError; //微分环节 + 3008062: 5fc1a787 flw fa5,1532(gp) # 4000c30 + 3008066: 00f7f7d3 fadd.s fa5,fa5,fa5 + 300806a: fec42707 flw fa4,-20(s0) + 300806e: 08f77753 fsub.s fa4,fa4,fa5 + 3008072: 6001a787 flw fa5,1536(gp) # 4000c34 + 3008076: 00f777d3 fadd.s fa5,fa4,fa5 + 300807a: fcf42e27 fsw fa5,-36(s0) + + addError = KP * P_Error + KI * I_Error + KD * D_Error +2; //左轮PID增加值 + 300807e: acc1a707 flw fa4,-1332(gp) # 4000100 + 3008082: fe442787 flw fa5,-28(s0) + 3008086: 10f77753 fmul.s fa4,fa4,fa5 + 300808a: ad01a687 flw fa3,-1328(gp) # 4000104 + 300808e: fe042787 flw fa5,-32(s0) + 3008092: 10f6f7d3 fmul.s fa5,fa3,fa5 + 3008096: 00f77753 fadd.s fa4,fa4,fa5 + 300809a: ad41a687 flw fa3,-1324(gp) # 4000108 + 300809e: fdc42787 flw fa5,-36(s0) + 30080a2: 10f6f7d3 fmul.s fa5,fa3,fa5 + 30080a6: 00f77753 fadd.s fa4,fa4,fa5 + 30080aa: 0300f7b7 lui a5,0x300f + 30080ae: 3b07a787 flw fa5,944(a5) # 300f3b0 + 30080b2: 00f777d3 fadd.s fa5,fa4,fa5 + 30080b6: fcf42c27 fsw fa5,-40(s0) + Left_ESC_Output_PWM += addError; //计算PWM输出值 + 30080ba: 60c1a783 lw a5,1548(gp) # 4000c40 + 30080be: d007f753 fcvt.s.w fa4,a5 + 30080c2: fd842787 flw fa5,-40(s0) + 30080c6: 00f777d3 fadd.s fa5,fa4,fa5 + 30080ca: c0079753 fcvt.w.s a4,fa5,rtz + 30080ce: 60e1a623 sw a4,1548(gp) # 4000c40 + + ppreLeftError = preLeftError; + 30080d2: 5fc1a787 flw fa5,1532(gp) # 4000c30 + 30080d6: 60f1a027 fsw fa5,1536(gp) # 4000c34 + preLeftError = L_Error; + 30080da: fec42787 flw fa5,-20(s0) + 30080de: 5ef1ae27 fsw fa5,1532(gp) # 4000c30 + + + R_Error = target_r_speed - current_r_speed; //计算误差 + 30080e2: fc042783 lw a5,-64(s0) + 30080e6: d017f753 fcvt.s.wu fa4,a5 + 30080ea: fc842787 flw fa5,-56(s0) + 30080ee: 08f777d3 fsub.s fa5,fa4,fa5 + 30080f2: fef42427 fsw fa5,-24(s0) + P_Error = R_Error; //比例环节 + 30080f6: fe842787 flw fa5,-24(s0) + 30080fa: fef42227 fsw fa5,-28(s0) + I_Error = R_Error - preRightError; //积分环节 + 30080fe: 6041a787 flw fa5,1540(gp) # 4000c38 + 3008102: fe842707 flw fa4,-24(s0) + 3008106: 08f777d3 fsub.s fa5,fa4,fa5 + 300810a: fef42027 fsw fa5,-32(s0) + D_Error = R_Error - 2*preRightError + ppreRightError; //微分环节 + 300810e: 6041a787 flw fa5,1540(gp) # 4000c38 + 3008112: 00f7f7d3 fadd.s fa5,fa5,fa5 + 3008116: fe842707 flw fa4,-24(s0) + 300811a: 08f77753 fsub.s fa4,fa4,fa5 + 300811e: 6081a787 flw fa5,1544(gp) # 4000c3c + 3008122: 00f777d3 fadd.s fa5,fa4,fa5 + 3008126: fcf42e27 fsw fa5,-36(s0) + + addError = KP * P_Error + KI * I_Error + KD * D_Error; //左轮PID增加值 + 300812a: acc1a707 flw fa4,-1332(gp) # 4000100 + 300812e: fe442787 flw fa5,-28(s0) + 3008132: 10f77753 fmul.s fa4,fa4,fa5 + 3008136: ad01a687 flw fa3,-1328(gp) # 4000104 + 300813a: fe042787 flw fa5,-32(s0) + 300813e: 10f6f7d3 fmul.s fa5,fa3,fa5 + 3008142: 00f77753 fadd.s fa4,fa4,fa5 + 3008146: ad41a687 flw fa3,-1324(gp) # 4000108 + 300814a: fdc42787 flw fa5,-36(s0) + 300814e: 10f6f7d3 fmul.s fa5,fa3,fa5 + 3008152: 00f777d3 fadd.s fa5,fa4,fa5 + 3008156: fcf42c27 fsw fa5,-40(s0) + // 根据实际情况进行校准 + Right_ESC_Output_PWM += addError; //计算PWM输出值 + 300815a: 6101a783 lw a5,1552(gp) # 4000c44 + 300815e: d007f753 fcvt.s.w fa4,a5 + 3008162: fd842787 flw fa5,-40(s0) + 3008166: 00f777d3 fadd.s fa5,fa4,fa5 + 300816a: c0079753 fcvt.w.s a4,fa5,rtz + 300816e: 60e1a823 sw a4,1552(gp) # 4000c44 + + ppreRightError = preRightError; + 3008172: 6041a787 flw fa5,1540(gp) # 4000c38 + 3008176: 60f1a427 fsw fa5,1544(gp) # 4000c3c + preRightError = R_Error; + 300817a: fe842787 flw fa5,-24(s0) + 300817e: 60f1a227 fsw fa5,1540(gp) # 4000c38 + + // threshold + if(Right_ESC_Output_PWM<1) Right_ESC_Output_PWM = 1; + 3008182: 6101a783 lw a5,1552(gp) # 4000c44 + 3008186: 00f04563 bgtz a5,3008190 + 300818a: 4705 li a4,1 + 300818c: 60e1a823 sw a4,1552(gp) # 4000c44 + if(Right_ESC_Output_PWM>799) Right_ESC_Output_PWM =799; + 3008190: 6101a703 lw a4,1552(gp) # 4000c44 + 3008194: 31f00793 li a5,799 + 3008198: 00e7d663 bge a5,a4,30081a4 + 300819c: 31f00713 li a4,799 + 30081a0: 60e1a823 sw a4,1552(gp) # 4000c44 + if(Left_ESC_Output_PWM<1) Left_ESC_Output_PWM = 1; + 30081a4: 60c1a783 lw a5,1548(gp) # 4000c40 + 30081a8: 00f04563 bgtz a5,30081b2 + 30081ac: 4705 li a4,1 + 30081ae: 60e1a623 sw a4,1548(gp) # 4000c40 + if(Left_ESC_Output_PWM>799) Left_ESC_Output_PWM = 799; + 30081b2: 60c1a703 lw a4,1548(gp) # 4000c40 + 30081b6: 31f00793 li a5,799 + 30081ba: 00e7d663 bge a5,a4,30081c6 + 30081be: 31f00713 li a4,799 + 30081c2: 60e1a623 sw a4,1548(gp) # 4000c40 + // if(Right_ESC_Output_PWM == 1 &&Left_ESC_Output_PWM == 1){ + // CarWorkStatus(0); + // } + + ChangeCarApt(Left_ESC_Output_PWM, Right_ESC_Output_PWM); //输出左右轮的PWM + 30081c6: 60c1a783 lw a5,1548(gp) # 4000c40 + 30081ca: 873e mv a4,a5 + 30081cc: 6101a783 lw a5,1552(gp) # 4000c44 + 30081d0: 85be mv a1,a5 + 30081d2: 853a mv a0,a4 + 30081d4: 3345 jal ra,3007f74 +} + 30081d6: 0001 nop + 30081d8: 50f2 lw ra,60(sp) + 30081da: 5462 lw s0,56(sp) + 30081dc: 6121 addi sp,sp,64 + 30081de: 8082 ret + +030081e0 : + + +void SetCarAptAndStart(unsigned int leftValue, unsigned int rightValue) +{ + 30081e0: 715d addi sp,sp,-80 + 30081e2: c686 sw ra,76(sp) + 30081e4: c4a2 sw s0,72(sp) + 30081e6: 0880 addi s0,sp,80 + 30081e8: faa42e23 sw a0,-68(s0) + 30081ec: fab42c23 sw a1,-72(s0) + GPT_EN_REG gptEn; + gptEn.BIT.rg_gpt_en = BASE_CFG_SET; + 30081f0: fec42783 lw a5,-20(s0) + 30081f4: 0017e793 ori a5,a5,1 + 30081f8: fef42623 sw a5,-20(s0) + g_gpt1.baseAddress->GPT_EN.reg = gptEn.reg; + 30081fc: 2e818793 addi a5,gp,744 # 400091c + 3008200: 439c lw a5,0(a5) + 3008202: fec42703 lw a4,-20(s0) + 3008206: 40e7a623 sw a4,1036(a5) + g_gpt2.baseAddress->GPT_EN.reg = gptEn.reg; + 300820a: 31c18793 addi a5,gp,796 # 4000950 + 300820e: 439c lw a5,0(a5) + 3008210: fec42703 lw a4,-20(s0) + 3008214: 40e7a623 sw a4,1036(a5) + + GPT_ReferCfg PWMConfig1,PWMConfig2; + HAL_GPT_GetReferCounterAndAction(&g_gpt1,&PWMConfig1); + 3008218: fdc40793 addi a5,s0,-36 + 300821c: 85be mv a1,a5 + 300821e: 2e818513 addi a0,gp,744 # 400091c + 3008222: 28a5 jal ra,300829a + HAL_GPT_GetReferCounterAndAction(&g_gpt2,&PWMConfig2); + 3008224: fcc40793 addi a5,s0,-52 + 3008228: 85be mv a1,a5 + 300822a: 31c18513 addi a0,gp,796 # 4000950 + 300822e: 20b5 jal ra,300829a + g_gpt1.baseAddress->GPT_TC_REFB0.reg = leftValue; + 3008230: 2e818793 addi a5,gp,744 # 400091c + 3008234: 439c lw a5,0(a5) + 3008236: fbc42703 lw a4,-68(s0) + 300823a: cfd8 sw a4,28(a5) + g_gpt2.baseAddress->GPT_TC_REFB0.reg = rightValue; + 300823c: 31c18793 addi a5,gp,796 # 4000950 + 3008240: 439c lw a5,0(a5) + 3008242: fb842703 lw a4,-72(s0) + 3008246: cfd8 sw a4,28(a5) + g_gpt1.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig1.refB0.refAction; + 3008248: fe842683 lw a3,-24(s0) + 300824c: 2e818793 addi a5,gp,744 # 400091c + 3008250: 4398 lw a4,0(a5) + 3008252: 87b6 mv a5,a3 + 3008254: 8b8d andi a5,a5,3 + 3008256: 0ff7f693 andi a3,a5,255 + 300825a: 10072783 lw a5,256(a4) + 300825e: 8a8d andi a3,a3,3 + 3008260: 0692 slli a3,a3,0x4 + 3008262: fcf7f793 andi a5,a5,-49 + 3008266: 8fd5 or a5,a5,a3 + 3008268: 10f72023 sw a5,256(a4) + g_gpt2.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig2.refB0.refAction; + 300826c: fd842683 lw a3,-40(s0) + 3008270: 31c18793 addi a5,gp,796 # 4000950 + 3008274: 4398 lw a4,0(a5) + 3008276: 87b6 mv a5,a3 + 3008278: 8b8d andi a5,a5,3 + 300827a: 0ff7f693 andi a3,a5,255 + 300827e: 10072783 lw a5,256(a4) + 3008282: 8a8d andi a3,a3,3 + 3008284: 0692 slli a3,a3,0x4 + 3008286: fcf7f793 andi a5,a5,-49 + 300828a: 8fd5 or a5,a5,a3 + 300828c: 10f72023 sw a5,256(a4) +} + 3008290: 0001 nop + 3008292: 40b6 lw ra,76(sp) + 3008294: 4426 lw s0,72(sp) + 3008296: 6161 addi sp,sp,80 + 3008298: 8082 ret + +0300829a : + 300829a: e87fc06f j 3005120 + +0300829e : + + +// 1 开始 0:停止 +void CarWorkStatus(unsigned char i){ + 300829e: 1101 addi sp,sp,-32 + 30082a0: ce06 sw ra,28(sp) + 30082a2: cc22 sw s0,24(sp) + 30082a4: 1000 addi s0,sp,32 + 30082a6: 87aa mv a5,a0 + 30082a8: fef407a3 sb a5,-17(s0) + if(i){ + 30082ac: fef44783 lbu a5,-17(s0) + 30082b0: cb85 beqz a5,30082e0 + // 开始工作 + MotorStatus(2,1,0); + 30082b2: 4601 li a2,0 + 30082b4: 4585 li a1,1 + 30082b6: 4509 li a0,2 + 30082b8: 3111 jal ra,3007ebc + BASE_FUNC_DELAY_MS(1); + 30082ba: 3e800593 li a1,1000 + 30082be: 4505 li a0,1 + 30082c0: 2afd jal ra,30084be + HAL_GPT_Start(&g_gpt1); + 30082c2: 2e818513 addi a0,gp,744 # 400091c + 30082c6: 22b5 jal ra,3008432 + HAL_GPT_Start(&g_gpt2); + 30082c8: 31c18513 addi a0,gp,796 # 4000950 + 30082cc: 229d jal ra,3008432 + targetSpeed =8; + 30082ce: 4721 li a4,8 + 30082d0: ace1a423 sw a4,-1336(gp) # 40000fc + g_carStart = true; + 30082d4: 4705 li a4,1 + 30082d6: 2ae18b23 sb a4,694(gp) # 40008ea + g_carStop = false;//避障提示 + 30082da: 2a018ba3 sb zero,695(gp) # 40008eb + MotorStatus(2,0,0); + g_carStart = false; + g_carStop = true; + // DBG_PRINTF("stop! --%d\r\n",time_num); + } +} + 30082de: a015 j 3008302 + HAL_GPT_Stop(&g_gpt1); + 30082e0: 2e818513 addi a0,gp,744 # 400091c + 30082e4: aa5fc0ef jal ra,3004d88 + HAL_GPT_Stop(&g_gpt2); + 30082e8: 31c18513 addi a0,gp,796 # 4000950 + 30082ec: a9dfc0ef jal ra,3004d88 + MotorStatus(2,0,0); + 30082f0: 4601 li a2,0 + 30082f2: 4581 li a1,0 + 30082f4: 4509 li a0,2 + 30082f6: 36d9 jal ra,3007ebc + g_carStart = false; + 30082f8: 2a018b23 sb zero,694(gp) # 40008ea + g_carStop = true; + 30082fc: 4705 li a4,1 + 30082fe: 2ae18ba3 sb a4,695(gp) # 40008eb +} + 3008302: 0001 nop + 3008304: 40f2 lw ra,28(sp) + 3008306: 4462 lw s0,24(sp) + 3008308: 6105 addi sp,sp,32 + 300830a: 8082 ret + +0300830c : + + +// 左转 右边电机往后 +void TurnLeft() +{ + 300830c: 1141 addi sp,sp,-16 + 300830e: c606 sw ra,12(sp) + 3008310: c422 sw s0,8(sp) + 3008312: 0800 addi s0,sp,16 + MotorStatus(1,0,1); + 3008314: 4605 li a2,1 + 3008316: 4581 li a1,0 + 3008318: 4505 li a0,1 + 300831a: 364d jal ra,3007ebc + MotorStatus(0,1,0); + 300831c: 4601 li a2,0 + 300831e: 4585 li a1,1 + 3008320: 4501 li a0,0 + 3008322: 3e69 jal ra,3007ebc + SetCarAptAndStart(369,369); + 3008324: 17100593 li a1,369 + 3008328: 17100513 li a0,369 + 300832c: 3d55 jal ra,30081e0 + g_carStart = true; + 300832e: 4705 li a4,1 + 3008330: 2ae18b23 sb a4,694(gp) # 40008ea + BASE_FUNC_DELAY_MS(1100); + 3008334: 3e800593 li a1,1000 + 3008338: 44c00513 li a0,1100 + 300833c: 2249 jal ra,30084be + CarWorkStatus(0); + 300833e: 4501 li a0,0 + 3008340: 3fb9 jal ra,300829e +} + 3008342: 0001 nop + 3008344: 40b2 lw ra,12(sp) + 3008346: 4422 lw s0,8(sp) + 3008348: 0141 addi sp,sp,16 + 300834a: 8082 ret + +0300834c : + +// 右转 +void TurnRight() +{ + 300834c: 1141 addi sp,sp,-16 + 300834e: c606 sw ra,12(sp) + 3008350: c422 sw s0,8(sp) + 3008352: 0800 addi s0,sp,16 + MotorStatus(0,0,1); + 3008354: 4605 li a2,1 + 3008356: 4581 li a1,0 + 3008358: 4501 li a0,0 + 300835a: 368d jal ra,3007ebc + MotorStatus(1,1,0); + 300835c: 4601 li a2,0 + 300835e: 4585 li a1,1 + 3008360: 4505 li a0,1 + 3008362: 3ea9 jal ra,3007ebc + SetCarAptAndStart(369,399); + 3008364: 18f00593 li a1,399 + 3008368: 17100513 li a0,369 + 300836c: 3d95 jal ra,30081e0 + g_carStart = true; + 300836e: 4705 li a4,1 + 3008370: 2ae18b23 sb a4,694(gp) # 40008ea + BASE_FUNC_DELAY_MS(1100); + 3008374: 3e800593 li a1,1000 + 3008378: 44c00513 li a0,1100 + 300837c: 2289 jal ra,30084be + CarWorkStatus(0); + 300837e: 4501 li a0,0 + 3008380: 3f39 jal ra,300829e +} + 3008382: 0001 nop + 3008384: 40b2 lw ra,12(sp) + 3008386: 4422 lw s0,8(sp) + 3008388: 0141 addi sp,sp,16 + 300838a: 8082 ret + +0300838c : + +// 后退 +void Retreat() +{ + 300838c: 1141 addi sp,sp,-16 + 300838e: c606 sw ra,12(sp) + 3008390: c422 sw s0,8(sp) + 3008392: 0800 addi s0,sp,16 + MotorStatus(2,0,1); + 3008394: 4605 li a2,1 + 3008396: 4581 li a1,0 + 3008398: 4509 li a0,2 + 300839a: 360d jal ra,3007ebc + HAL_GPT_Start(&g_gpt1); + 300839c: 2e818513 addi a0,gp,744 # 400091c + 30083a0: 2849 jal ra,3008432 + HAL_GPT_Start(&g_gpt2); + 30083a2: 31c18513 addi a0,gp,796 # 4000950 + 30083a6: 2071 jal ra,3008432 + targetSpeed = 8; + 30083a8: 4721 li a4,8 + 30083aa: ace1a423 sw a4,-1336(gp) # 40000fc + g_carStart = true; + 30083ae: 4705 li a4,1 + 30083b0: 2ae18b23 sb a4,694(gp) # 40008ea +} + 30083b4: 0001 nop + 30083b6: 40b2 lw ra,12(sp) + 30083b8: 4422 lw s0,8(sp) + 30083ba: 0141 addi sp,sp,16 + 30083bc: 8082 ret + +030083be : + + +// 顺时针转 +void ClockwiseMotor() +{ + 30083be: 1141 addi sp,sp,-16 + 30083c0: c606 sw ra,12(sp) + 30083c2: c422 sw s0,8(sp) + 30083c4: 0800 addi s0,sp,16 + MotorStatus(0,0,1); + 30083c6: 4605 li a2,1 + 30083c8: 4581 li a1,0 + 30083ca: 4501 li a0,0 + 30083cc: 3cc5 jal ra,3007ebc + MotorStatus(1,1,0); + 30083ce: 4601 li a2,0 + 30083d0: 4585 li a1,1 + 30083d2: 4505 li a0,1 + 30083d4: 34e5 jal ra,3007ebc + HAL_GPT_Start(&g_gpt1); + 30083d6: 2e818513 addi a0,gp,744 # 400091c + 30083da: 28a1 jal ra,3008432 + HAL_GPT_Start(&g_gpt2); + 30083dc: 31c18513 addi a0,gp,796 # 4000950 + 30083e0: 2889 jal ra,3008432 + targetSpeed =8; + 30083e2: 4721 li a4,8 + 30083e4: ace1a423 sw a4,-1336(gp) # 40000fc + g_carStart = true; + 30083e8: 4705 li a4,1 + 30083ea: 2ae18b23 sb a4,694(gp) # 40008ea + // DBG_PRINTF("clock! --%d\r\n",time_num); +} + 30083ee: 0001 nop + 30083f0: 40b2 lw ra,12(sp) + 30083f2: 4422 lw s0,8(sp) + 30083f4: 0141 addi sp,sp,16 + 30083f6: 8082 ret + +030083f8 : +// 逆时针转 +void AnticlockwiseMotor() +{ + 30083f8: 1141 addi sp,sp,-16 + 30083fa: c606 sw ra,12(sp) + 30083fc: c422 sw s0,8(sp) + 30083fe: 0800 addi s0,sp,16 + MotorStatus(1,0,1); + 3008400: 4605 li a2,1 + 3008402: 4581 li a1,0 + 3008404: 4505 li a0,1 + 3008406: 3c5d jal ra,3007ebc + MotorStatus(0,1,0); + 3008408: 4601 li a2,0 + 300840a: 4585 li a1,1 + 300840c: 4501 li a0,0 + 300840e: 347d jal ra,3007ebc + HAL_GPT_Start(&g_gpt1); + 3008410: 2e818513 addi a0,gp,744 # 400091c + 3008414: 2839 jal ra,3008432 + HAL_GPT_Start(&g_gpt2); + 3008416: 31c18513 addi a0,gp,796 # 4000950 + 300841a: 2821 jal ra,3008432 + targetSpeed =8; + 300841c: 4721 li a4,8 + 300841e: ace1a423 sw a4,-1336(gp) # 40000fc + g_carStart = true; + 3008422: 4705 li a4,1 + 3008424: 2ae18b23 sb a4,694(gp) # 40008ea + // DBG_PRINTF("anticlock! --%d\r\n",time_num); +} + 3008428: 0001 nop + 300842a: 40b2 lw ra,12(sp) + 300842c: 4422 lw s0,8(sp) + 300842e: 0141 addi sp,sp,16 + 3008430: 8082 ret + +03008432 : + 3008432: 8c9fc06f j 3004cfa + +03008436 : + +void Come() +{ + 3008436: 1141 addi sp,sp,-16 + 3008438: c606 sw ra,12(sp) + 300843a: c422 sw s0,8(sp) + 300843c: 0800 addi s0,sp,16 + MotorStatus(2,1,0); + 300843e: 4601 li a2,0 + 3008440: 4585 li a1,1 + 3008442: 4509 li a0,2 + 3008444: 3ca5 jal ra,3007ebc + SetCarAptAndStart(414,449); + 3008446: 1c100593 li a1,449 + 300844a: 19e00513 li a0,414 + 300844e: 3b49 jal ra,30081e0 + BASE_FUNC_DELAY_S(9); + 3008450: 4585 li a1,1 + 3008452: 4525 li a0,9 + 3008454: 20ad jal ra,30084be + CarWorkStatus(0); + 3008456: 4501 li a0,0 + 3008458: 3599 jal ra,300829e +} + 300845a: 0001 nop + 300845c: 40b2 lw ra,12(sp) + 300845e: 4422 lw s0,8(sp) + 3008460: 0141 addi sp,sp,16 + 3008462: 8082 ret + +03008464 : + +void AsGuard() +{ + 3008464: 1101 addi sp,sp,-32 + 3008466: ce06 sw ra,28(sp) + 3008468: cc22 sw s0,24(sp) + 300846a: 1000 addi s0,sp,32 + unsigned short distance; + MotorStatus(2,1,0); + 300846c: 4601 li a2,0 + 300846e: 4585 li a1,1 + 3008470: 4509 li a0,2 + 3008472: 34a9 jal ra,3007ebc + SetCarAptAndStart(414,449); + 3008474: 1c100593 li a1,449 + 3008478: 19e00513 li a0,414 + 300847c: 3395 jal ra,30081e0 + while(1){ + distance = GetDistance(); + 300847e: 00f050ef jal ra,300dc8c + 3008482: 87aa mv a5,a0 + 3008484: fef41723 sh a5,-18(s0) + if(distance<=750) + 3008488: fee45703 lhu a4,-18(s0) + 300848c: 2ee00793 li a5,750 + 3008490: 00e7f363 bgeu a5,a4,3008496 + while(1){ + 3008494: b7ed j 300847e + { + break; + 3008496: 0001 nop + } + } + TurnRight(); + 3008498: 3d55 jal ra,300834c + MotorStatus(2,1,0); + 300849a: 4601 li a2,0 + 300849c: 4585 li a1,1 + 300849e: 4509 li a0,2 + 30084a0: 3c31 jal ra,3007ebc + SetCarAptAndStart(414,449); + 30084a2: 1c100593 li a1,449 + 30084a6: 19e00513 li a0,414 + 30084aa: 3b1d jal ra,30081e0 + BASE_FUNC_DELAY_S(9); + 30084ac: 4585 li a1,1 + 30084ae: 4525 li a0,9 + 30084b0: 2039 jal ra,30084be + TurnLeft(); + 30084b2: 3da9 jal ra,300830c +} + 30084b4: 0001 nop + 30084b6: 40f2 lw ra,28(sp) + 30084b8: 4462 lw s0,24(sp) + 30084ba: 6105 addi sp,sp,32 + 30084bc: 8082 ret + +030084be : + 30084be: e27f806f j 30012e4 + +030084c2 : + return Status; +} + +VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter) +{ + 30084c2: 7179 addi sp,sp,-48 + 30084c4: d606 sw ra,44(sp) + 30084c6: d422 sw s0,40(sp) + 30084c8: 1800 addi s0,sp,48 + 30084ca: fca42e23 sw a0,-36(s0) + 30084ce: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 30084d2: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_offset_calibration_data_micro_meter(Dev, + 30084d6: fd842583 lw a1,-40(s0) + 30084da: fdc42503 lw a0,-36(s0) + 30084de: 034020ef jal ra,300a512 + 30084e2: 87aa mv a5,a0 + 30084e4: fef407a3 sb a5,-17(s0) + pOffsetCalibrationDataMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; + 30084e8: fef40783 lb a5,-17(s0) +} + 30084ec: 853e mv a0,a5 + 30084ee: 50b2 lw ra,44(sp) + 30084f0: 5422 lw s0,40(sp) + 30084f2: 6145 addi sp,sp,48 + 30084f4: 8082 ret + +030084f6 : + +/* End Group PAL General Functions */ + +/* Group PAL Init Functions */ +VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, uint8_t DeviceAddress) +{ + 30084f6: 7179 addi sp,sp,-48 + 30084f8: d606 sw ra,44(sp) + 30084fa: d422 sw s0,40(sp) + 30084fc: 1800 addi s0,sp,48 + 30084fe: fca42e23 sw a0,-36(s0) + 3008502: 87ae mv a5,a1 + 3008504: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008508: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, + 300850c: fdb44783 lbu a5,-37(s0) + 3008510: 8385 srli a5,a5,0x1 + 3008512: 9f81 uxtb a5 + 3008514: 863e mv a2,a5 + 3008516: 08a00593 li a1,138 + 300851a: fdc42503 lw a0,-36(s0) + 300851e: 2559 jal ra,3008ba4 + 3008520: 87aa mv a5,a0 + 3008522: fef407a3 sb a5,-17(s0) + DeviceAddress / 2); + + LOG_FUNCTION_END(Status); + return Status; + 3008526: fef40783 lb a5,-17(s0) +} + 300852a: 853e mv a0,a5 + 300852c: 50b2 lw ra,44(sp) + 300852e: 5422 lw s0,40(sp) + 3008530: 6145 addi sp,sp,48 + 3008532: 8082 ret + +03008534 : + +VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev) +{ + 3008534: 7171 addi sp,sp,-176 + 3008536: d706 sw ra,172(sp) + 3008538: d522 sw s0,168(sp) + 300853a: 1900 addi s0,sp,176 + 300853c: f4a42e23 sw a0,-164(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008540: fe0407a3 sb zero,-17(s0) + 0xFE, + 0x01); +#endif + + /* Set I2C standard mode */ + if (Status == VL53L0X_ERROR_NONE) + 3008544: fef40783 lb a5,-17(s0) + 3008548: eb91 bnez a5,300855c + Status = VL53L0X_WrByte(Dev, 0x88, 0x00); + 300854a: 4601 li a2,0 + 300854c: 08800593 li a1,136 + 3008550: f5c42503 lw a0,-164(s0) + 3008554: 2d81 jal ra,3008ba4 + 3008556: 87aa mv a5,a0 + 3008558: fef407a3 sb a5,-17(s0) + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, 0); + 300855c: f5c42783 lw a5,-164(s0) + 3008560: 10078e23 sb zero,284(a5) + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_apply_offset_adjustment(Dev); +#endif + + /* Default value is 1000 for Linearity Corrective Gain */ + PALDevDataSet(Dev, LinearityCorrectiveGain, 1000); + 3008564: f5c42783 lw a5,-164(s0) + 3008568: 3e800713 li a4,1000 + 300856c: 16e79f23 sh a4,382(a5) + + /* Set Default static parameters + *set first temporary values 9.44MHz * 65536 = 618660 + */ + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, 618660); + 3008570: f5c42783 lw a5,-164(s0) + 3008574: 00097737 lui a4,0x97 + 3008578: 0a470713 addi a4,a4,164 # 970a4 + 300857c: 10e7a023 sw a4,256(a5) + + /* Set Default XTalkCompensationRateMegaCps to 0 */ + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, 0); + 3008580: f5c42783 lw a5,-164(s0) + 3008584: 0007ac23 sw zero,24(a5) + + /* Get default parameters */ + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + 3008588: f7040793 addi a5,s0,-144 + 300858c: 85be mv a1,a5 + 300858e: f5c42503 lw a0,-164(s0) + 3008592: 2d19 jal ra,3008ba8 + 3008594: 87aa mv a5,a0 + 3008596: fef407a3 sb a5,-17(s0) + if (Status == VL53L0X_ERROR_NONE) { + 300859a: fef40783 lb a5,-17(s0) + 300859e: efc1 bnez a5,3008636 + /* initialize PAL values */ + CurrentParameters.DeviceMode = + 30085a0: f6040823 sb zero,-144(s0) + VL53L0X_DEVICEMODE_SINGLE_RANGING; + CurrentParameters.HistogramMode = + 30085a4: f60408a3 sb zero,-143(s0) + VL53L0X_HISTOGRAMMODE_DISABLED; + + /* Dmax lookup table */ + /* 0.0 */ + CurrentParameters.dmax_lut.ambRate_mcps[0] = (FixPoint1616_t)0x00000000; + 30085a8: fa042623 sw zero,-84(s0) + /* 1200 */ + CurrentParameters.dmax_lut.dmax_mm[0] = (FixPoint1616_t)0x04B00000; + 30085ac: 04b007b7 lui a5,0x4b00 + 30085b0: fcf42423 sw a5,-56(s0) + /* 0.7 */ + CurrentParameters.dmax_lut.ambRate_mcps[1] = (FixPoint1616_t)0x0000B333; + 30085b4: 67ad lui a5,0xb + 30085b6: 33378793 addi a5,a5,819 # b333 + 30085ba: faf42823 sw a5,-80(s0) + /* 1100 */ + CurrentParameters.dmax_lut.dmax_mm[1] = (FixPoint1616_t)0x044C0000; + 30085be: 044c07b7 lui a5,0x44c0 + 30085c2: fcf42623 sw a5,-52(s0) + /* 2 */ + CurrentParameters.dmax_lut.ambRate_mcps[2] = (FixPoint1616_t)0x00020000; + 30085c6: 000207b7 lui a5,0x20 + 30085ca: faf42a23 sw a5,-76(s0) + /* 900 */ + CurrentParameters.dmax_lut.dmax_mm[2] = (FixPoint1616_t)0x03840000; + 30085ce: 038407b7 lui a5,0x3840 + 30085d2: fcf42823 sw a5,-48(s0) + /* 3.8 */ + CurrentParameters.dmax_lut.ambRate_mcps[3] = (FixPoint1616_t)0x0003CCCC; + 30085d6: 0003d7b7 lui a5,0x3d + 30085da: ccc78793 addi a5,a5,-820 # 3cccc + 30085de: faf42c23 sw a5,-72(s0) + /* 750 */ + CurrentParameters.dmax_lut.dmax_mm[3] = (FixPoint1616_t)0x02EE0000; + 30085e2: 02ee07b7 lui a5,0x2ee0 + 30085e6: fcf42a23 sw a5,-44(s0) + /* 7.3 */ + CurrentParameters.dmax_lut.ambRate_mcps[4] = (FixPoint1616_t)0x00074CCC; + 30085ea: 000757b7 lui a5,0x75 + 30085ee: ccc78793 addi a5,a5,-820 # 74ccc + 30085f2: faf42e23 sw a5,-68(s0) + /* 550 */ + CurrentParameters.dmax_lut.dmax_mm[4] = (FixPoint1616_t)0x02260000; + 30085f6: 022607b7 lui a5,0x2260 + 30085fa: fcf42c23 sw a5,-40(s0) + /* 10 */ + CurrentParameters.dmax_lut.ambRate_mcps[5] = (FixPoint1616_t)0x000A0000; + 30085fe: 000a07b7 lui a5,0xa0 + 3008602: fcf42023 sw a5,-64(s0) + /* 500 */ + CurrentParameters.dmax_lut.dmax_mm[5] = (FixPoint1616_t)0x01F40000; + 3008606: 01f407b7 lui a5,0x1f40 + 300860a: fcf42e23 sw a5,-36(s0) + /* 15 */ + CurrentParameters.dmax_lut.ambRate_mcps[6] = (FixPoint1616_t)0x000F0000; + 300860e: 000f07b7 lui a5,0xf0 + 3008612: fcf42223 sw a5,-60(s0) + /* 400 */ + CurrentParameters.dmax_lut.dmax_mm[6] = (FixPoint1616_t)0x01900000; + 3008616: 019007b7 lui a5,0x1900 + 300861a: fef42023 sw a5,-32(s0) + + PALDevDataSet(Dev, CurrentParameters, CurrentParameters); + 300861e: f5c42783 lw a5,-164(s0) + 3008622: 07a1 addi a5,a5,8 # 1900008 + 3008624: f7040713 addi a4,s0,-144 + 3008628: 07800693 li a3,120 + 300862c: 8636 mv a2,a3 + 300862e: 85ba mv a1,a4 + 3008630: 853e mv a0,a5 + 3008632: 2f8060ef jal ra,300e92a + } + + /* Sigma estimator variable */ + PALDevDataSet(Dev, SigmaEstRefArray, 100); + 3008636: f5c42783 lw a5,-164(s0) + 300863a: 06400713 li a4,100 + 300863e: 16e79023 sh a4,352(a5) + PALDevDataSet(Dev, SigmaEstEffPulseWidth, 900); + 3008642: f5c42783 lw a5,-164(s0) + 3008646: 38400713 li a4,900 + 300864a: 16e79123 sh a4,354(a5) + PALDevDataSet(Dev, SigmaEstEffAmbWidth, 500); + 300864e: f5c42783 lw a5,-164(s0) + 3008652: 1f400713 li a4,500 + 3008656: 16e79223 sh a4,356(a5) + PALDevDataSet(Dev, targetRefRate, 0x0A00); /* 20 MCPS in 9:7 format */ + 300865a: f5c42783 lw a5,-164(s0) + 300865e: 6705 lui a4,0x1 + 3008660: a0070713 addi a4,a4,-1536 # a00 + 3008664: 16e79423 sh a4,360(a5) + + /* Use internal default settings */ + PALDevDataSet(Dev, UseInternalTuningSettings, 1); + 3008668: f5c42783 lw a5,-164(s0) + 300866c: 4705 li a4,1 + 300866e: 16e78e23 sb a4,380(a5) + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + 3008672: 4605 li a2,1 + 3008674: 08000593 li a1,128 + 3008678: f5c42503 lw a0,-164(s0) + 300867c: 2325 jal ra,3008ba4 + 300867e: 87aa mv a5,a0 + 3008680: 873e mv a4,a5 + 3008682: fef44783 lbu a5,-17(s0) + 3008686: 8fd9 or a5,a5,a4 + 3008688: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300868c: 4605 li a2,1 + 300868e: 0ff00593 li a1,255 + 3008692: f5c42503 lw a0,-164(s0) + 3008696: 2339 jal ra,3008ba4 + 3008698: 87aa mv a5,a0 + 300869a: 873e mv a4,a5 + 300869c: fef44783 lbu a5,-17(s0) + 30086a0: 8fd9 or a5,a5,a4 + 30086a2: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + 30086a6: 4601 li a2,0 + 30086a8: 4581 li a1,0 + 30086aa: f5c42503 lw a0,-164(s0) + 30086ae: 29dd jal ra,3008ba4 + 30086b0: 87aa mv a5,a0 + 30086b2: 873e mv a4,a5 + 30086b4: fef44783 lbu a5,-17(s0) + 30086b8: 8fd9 or a5,a5,a4 + 30086ba: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdByte(Dev, 0x91, &StopVariable); + 30086be: f6f40793 addi a5,s0,-145 + 30086c2: 863e mv a2,a5 + 30086c4: 09100593 li a1,145 + 30086c8: f5c42503 lw a0,-164(s0) + 30086cc: 717050ef jal ra,300e5e2 + 30086d0: 87aa mv a5,a0 + 30086d2: 873e mv a4,a5 + 30086d4: fef44783 lbu a5,-17(s0) + 30086d8: 8fd9 or a5,a5,a4 + 30086da: fef407a3 sb a5,-17(s0) + PALDevDataSet(Dev, StopVariable, StopVariable); + 30086de: f6f44703 lbu a4,-145(s0) + 30086e2: f5c42783 lw a5,-164(s0) + 30086e6: 16e78323 sb a4,358(a5) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + 30086ea: 4605 li a2,1 + 30086ec: 4581 li a1,0 + 30086ee: f5c42503 lw a0,-164(s0) + 30086f2: 294d jal ra,3008ba4 + 30086f4: 87aa mv a5,a0 + 30086f6: 873e mv a4,a5 + 30086f8: fef44783 lbu a5,-17(s0) + 30086fc: 8fd9 or a5,a5,a4 + 30086fe: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 3008702: 4601 li a2,0 + 3008704: 0ff00593 li a1,255 + 3008708: f5c42503 lw a0,-164(s0) + 300870c: 2961 jal ra,3008ba4 + 300870e: 87aa mv a5,a0 + 3008710: 873e mv a4,a5 + 3008712: fef44783 lbu a5,-17(s0) + 3008716: 8fd9 or a5,a5,a4 + 3008718: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + 300871c: 4601 li a2,0 + 300871e: 08000593 li a1,128 + 3008722: f5c42503 lw a0,-164(s0) + 3008726: 29bd jal ra,3008ba4 + 3008728: 87aa mv a5,a0 + 300872a: 873e mv a4,a5 + 300872c: fef44783 lbu a5,-17(s0) + 3008730: 8fd9 or a5,a5,a4 + 3008732: fef407a3 sb a5,-17(s0) + + /* Enable all check */ + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + 3008736: fe042423 sw zero,-24(s0) + 300873a: a805 j 300876a + if (Status == VL53L0X_ERROR_NONE) + 300873c: fef40783 lb a5,-17(s0) + 3008740: eb9d bnez a5,3008776 + Status |= VL53L0X_SetLimitCheckEnable(Dev, i, 1); + 3008742: fe842783 lw a5,-24(s0) + 3008746: 9fa1 uxth a5 + 3008748: 4605 li a2,1 + 300874a: 85be mv a1,a5 + 300874c: f5c42503 lw a0,-164(s0) + 3008750: 2225 jal ra,3008878 + 3008752: 87aa mv a5,a0 + 3008754: 873e mv a4,a5 + 3008756: fef44783 lbu a5,-17(s0) + 300875a: 8fd9 or a5,a5,a4 + 300875c: fef407a3 sb a5,-17(s0) + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + 3008760: fe842783 lw a5,-24(s0) + 3008764: 0785 addi a5,a5,1 + 3008766: fef42423 sw a5,-24(s0) + 300876a: fe842703 lw a4,-24(s0) + 300876e: 4795 li a5,5 + 3008770: fce7d6e3 bge a5,a4,300873c + 3008774: a011 j 3008778 + else + break; + 3008776: 0001 nop + + } + + /* Disable the following checks */ + if (Status == VL53L0X_ERROR_NONE) + 3008778: fef40783 lb a5,-17(s0) + 300877c: eb89 bnez a5,300878e + Status = VL53L0X_SetLimitCheckEnable(Dev, + 300877e: 4601 li a2,0 + 3008780: 4589 li a1,2 + 3008782: f5c42503 lw a0,-164(s0) + 3008786: 28cd jal ra,3008878 + 3008788: 87aa mv a5,a0 + 300878a: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0); + + if (Status == VL53L0X_ERROR_NONE) + 300878e: fef40783 lb a5,-17(s0) + 3008792: eb89 bnez a5,30087a4 + Status = VL53L0X_SetLimitCheckEnable(Dev, + 3008794: 4601 li a2,0 + 3008796: 458d li a1,3 + 3008798: f5c42503 lw a0,-164(s0) + 300879c: 28f1 jal ra,3008878 + 300879e: 87aa mv a5,a0 + 30087a0: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + + if (Status == VL53L0X_ERROR_NONE) + 30087a4: fef40783 lb a5,-17(s0) + 30087a8: eb89 bnez a5,30087ba + Status = VL53L0X_SetLimitCheckEnable(Dev, + 30087aa: 4601 li a2,0 + 30087ac: 4591 li a1,4 + 30087ae: f5c42503 lw a0,-164(s0) + 30087b2: 20d9 jal ra,3008878 + 30087b4: 87aa mv a5,a0 + 30087b6: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0); + + if (Status == VL53L0X_ERROR_NONE) + 30087ba: fef40783 lb a5,-17(s0) + 30087be: eb89 bnez a5,30087d0 + Status = VL53L0X_SetLimitCheckEnable(Dev, + 30087c0: 4601 li a2,0 + 30087c2: 4595 li a1,5 + 30087c4: f5c42503 lw a0,-164(s0) + 30087c8: 2845 jal ra,3008878 + 30087ca: 87aa mv a5,a0 + 30087cc: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0); + + /* Limit default values */ + if (Status == VL53L0X_ERROR_NONE) { + 30087d0: fef40783 lb a5,-17(s0) + 30087d4: eb91 bnez a5,30087e8 + Status = VL53L0X_SetLimitCheckValue(Dev, + 30087d6: 00120637 lui a2,0x120 + 30087da: 4581 li a1,0 + 30087dc: f5c42503 lw a0,-164(s0) + 30087e0: 2851 jal ra,3008874 + 30087e2: 87aa mv a5,a0 + 30087e4: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + (FixPoint1616_t)(18 * 65536)); + } + if (Status == VL53L0X_ERROR_NONE) { + 30087e8: fef40783 lb a5,-17(s0) + 30087ec: eb89 bnez a5,30087fe + Status = VL53L0X_SetLimitCheckValue(Dev, + 30087ee: 6611 lui a2,0x4 + 30087f0: 4585 li a1,1 + 30087f2: f5c42503 lw a0,-164(s0) + 30087f6: 28bd jal ra,3008874 + 30087f8: 87aa mv a5,a0 + 30087fa: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + (FixPoint1616_t)(25 * 65536 / 100)); + /* 0.25 * 65536 */ + } + + if (Status == VL53L0X_ERROR_NONE) { + 30087fe: fef40783 lb a5,-17(s0) + 3008802: eb91 bnez a5,3008816 + Status = VL53L0X_SetLimitCheckValue(Dev, + 3008804: 00230637 lui a2,0x230 + 3008808: 4589 li a1,2 + 300880a: f5c42503 lw a0,-164(s0) + 300880e: 209d jal ra,3008874 + 3008810: 87aa mv a5,a0 + 3008812: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + (FixPoint1616_t)(35 * 65536)); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008816: fef40783 lb a5,-17(s0) + 300881a: eb89 bnez a5,300882c + Status = VL53L0X_SetLimitCheckValue(Dev, + 300881c: 4601 li a2,0 + 300881e: 458d li a1,3 + 3008820: f5c42503 lw a0,-164(s0) + 3008824: 2881 jal ra,3008874 + 3008826: 87aa mv a5,a0 + 3008828: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + (FixPoint1616_t)(0 * 65536)); + } + + if (Status == VL53L0X_ERROR_NONE) { + 300882c: fef40783 lb a5,-17(s0) + 3008830: e785 bnez a5,3008858 + + PALDevDataSet(Dev, SequenceConfig, 0xFF); + 3008832: f5c42783 lw a5,-164(s0) + 3008836: 577d li a4,-1 + 3008838: 14e78e23 sb a4,348(a5) + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 300883c: 0ff00613 li a2,255 + 3008840: 4585 li a1,1 + 3008842: f5c42503 lw a0,-164(s0) + 3008846: 2eb9 jal ra,3008ba4 + 3008848: 87aa mv a5,a0 + 300884a: fef407a3 sb a5,-17(s0) + 0xFF); + + /* Set PAL state to tell that we are waiting for call to + * VL53L0X_StaticInit + */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_WAIT_STATICINIT); + 300884e: f5c42783 lw a5,-164(s0) + 3008852: 4705 li a4,1 + 3008854: 14e78f23 sb a4,350(a5) + } + + if (Status == VL53L0X_ERROR_NONE) + 3008858: fef40783 lb a5,-17(s0) + 300885c: e789 bnez a5,3008866 + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 0); + 300885e: f5c42783 lw a5,-164(s0) + 3008862: 140780a3 sb zero,321(a5) + + + LOG_FUNCTION_END(Status); + return Status; + 3008866: fef40783 lb a5,-17(s0) +} + 300886a: 853e mv a0,a5 + 300886c: 50ba lw ra,172(sp) + 300886e: 542a lw s0,168(sp) + 3008870: 614d addi sp,sp,176 + 3008872: 8082 ret + +03008874 : + 3008874: 4810006f j 30094f4 + +03008878 : + 3008878: 2c10006f j 3009338 + +0300887c : + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev) +{ + 300887c: 7131 addi sp,sp,-192 + 300887e: df06 sw ra,188(sp) + 3008880: dd22 sw s0,184(sp) + 3008882: 0180 addi s0,sp,192 + 3008884: f4a42623 sw a0,-180(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008888: fe0407a3 sb zero,-17(s0) + VL53L0X_DeviceParameters_t CurrentParameters = {0}; + 300888c: f6440793 addi a5,s0,-156 + 3008890: 07800713 li a4,120 + 3008894: 863a mv a2,a4 + 3008896: 4581 li a1,0 + 3008898: 853e mv a0,a5 + 300889a: 3f2060ef jal ra,300ec8c + uint8_t *pTuningSettingBuffer; + uint16_t tempword = 0; + 300889e: f6041123 sh zero,-158(s0) + uint8_t tempbyte = 0; + 30088a2: f60400a3 sb zero,-159(s0) + uint8_t UseInternalTuningSettings = 0; + 30088a6: fe0403a3 sb zero,-25(s0) + uint32_t count = 0; + 30088aa: fe042023 sw zero,-32(s0) + uint8_t isApertureSpads = 0; + 30088ae: f6040023 sb zero,-160(s0) + uint32_t refSpadCount = 0; + 30088b2: f4042e23 sw zero,-164(s0) + uint8_t ApertureSpads = 0; + 30088b6: fc040fa3 sb zero,-33(s0) + uint8_t vcselPulsePeriodPCLK; + uint32_t seqTimeoutMicroSecs; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_info_from_device(Dev, 1); + 30088ba: 4585 li a1,1 + 30088bc: f4c42503 lw a0,-180(s0) + 30088c0: 5ff020ef jal ra,300b6be + 30088c4: 87aa mv a5,a0 + 30088c6: fef407a3 sb a5,-17(s0) + + /* set the ref spad from NVM */ + count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + 30088ca: f4c42783 lw a5,-180(s0) + 30088ce: 13f7c783 lbu a5,319(a5) + 30088d2: fef42023 sw a5,-32(s0) + ReferenceSpadCount); + ApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + 30088d6: f4c42783 lw a5,-180(s0) + 30088da: 1407c783 lbu a5,320(a5) + 30088de: fcf40fa3 sb a5,-33(s0) + ReferenceSpadType); + + /* NVM value invalid */ + if ((ApertureSpads > 1) || + 30088e2: fdf44703 lbu a4,-33(s0) + 30088e6: 4785 li a5,1 + 30088e8: 02e7e563 bltu a5,a4,3008912 + 30088ec: fdf44703 lbu a4,-33(s0) + 30088f0: 4785 li a5,1 + 30088f2: 00f71863 bne a4,a5,3008902 + ((ApertureSpads == 1) && (count > 32)) || + 30088f6: fe042703 lw a4,-32(s0) + 30088fa: 02000793 li a5,32 + 30088fe: 00e7ea63 bltu a5,a4,3008912 + 3008902: fdf44783 lbu a5,-33(s0) + 3008906: e785 bnez a5,300892e + ((ApertureSpads == 0) && (count > 12))) + 3008908: fe042703 lw a4,-32(s0) + 300890c: 47b1 li a5,12 + 300890e: 02e7f063 bgeu a5,a4,300892e + Status = VL53L0X_perform_ref_spad_management(Dev, &refSpadCount, + 3008912: f6040713 addi a4,s0,-160 + 3008916: f5c40793 addi a5,s0,-164 + 300891a: 863a mv a2,a4 + 300891c: 85be mv a1,a5 + 300891e: f4c42503 lw a0,-180(s0) + 3008922: 0fe020ef jal ra,300aa20 + 3008926: 87aa mv a5,a0 + 3008928: fef407a3 sb a5,-17(s0) + 300892c: a829 j 3008946 + &isApertureSpads); + else + Status = VL53L0X_set_reference_spads(Dev, count, ApertureSpads); + 300892e: fdf44783 lbu a5,-33(s0) + 3008932: 863e mv a2,a5 + 3008934: fe042583 lw a1,-32(s0) + 3008938: f4c42503 lw a0,-180(s0) + 300893c: 5aa020ef jal ra,300aee6 + 3008940: 87aa mv a5,a0 + 3008942: fef407a3 sb a5,-17(s0) + + + /* Initialize tuning settings buffer to prevent compiler warning. */ + pTuningSettingBuffer = DefaultTuningSettings; + 3008946: ad818793 addi a5,gp,-1320 # 400010c + 300894a: fef42423 sw a5,-24(s0) + + if (Status == VL53L0X_ERROR_NONE) { + 300894e: fef40783 lb a5,-17(s0) + 3008952: e78d bnez a5,300897c + UseInternalTuningSettings = PALDevDataGet(Dev, + 3008954: f4c42783 lw a5,-180(s0) + 3008958: 17c7c783 lbu a5,380(a5) + 300895c: fef403a3 sb a5,-25(s0) + UseInternalTuningSettings); + + if (UseInternalTuningSettings == 0) + 3008960: fe744783 lbu a5,-25(s0) + 3008964: eb81 bnez a5,3008974 + pTuningSettingBuffer = PALDevDataGet(Dev, + 3008966: f4c42783 lw a5,-180(s0) + 300896a: 1787a783 lw a5,376(a5) + 300896e: fef42423 sw a5,-24(s0) + 3008972: a029 j 300897c + pTuningSettingsPointer); + else + pTuningSettingBuffer = DefaultTuningSettings; + 3008974: ad818793 addi a5,gp,-1320 # 400010c + 3008978: fef42423 sw a5,-24(s0) + + } + + if (Status == VL53L0X_ERROR_NONE) + 300897c: fef40783 lb a5,-17(s0) + 3008980: eb91 bnez a5,3008994 + Status = VL53L0X_load_tuning_settings(Dev, + 3008982: fe842583 lw a1,-24(s0) + 3008986: f4c42503 lw a0,-180(s0) + 300898a: 288040ef jal ra,300cc12 + 300898e: 87aa mv a5,a0 + 3008990: fef407a3 sb a5,-17(s0) + pTuningSettingBuffer); + + + /* Set interrupt config to new sample ready */ + if (Status == VL53L0X_ERROR_NONE) { + 3008994: fef40783 lb a5,-17(s0) + 3008998: ef81 bnez a5,30089b0 + Status = VL53L0X_SetGpioConfig(Dev, 0, 0, + 300899a: 4701 li a4,0 + 300899c: 4691 li a3,4 + 300899e: 4601 li a2,0 + 30089a0: 4581 li a1,0 + 30089a2: f4c42503 lw a0,-180(s0) + 30089a6: 6f0010ef jal ra,300a096 + 30089aa: 87aa mv a5,a0 + 30089ac: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, + VL53L0X_INTERRUPTPOLARITY_LOW); + } + + if (Status == VL53L0X_ERROR_NONE) { + 30089b0: fef40783 lb a5,-17(s0) + 30089b4: e7b9 bnez a5,3008a02 + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + 30089b6: 4605 li a2,1 + 30089b8: 0ff00593 li a1,255 + 30089bc: f4c42503 lw a0,-180(s0) + 30089c0: 22d5 jal ra,3008ba4 + 30089c2: 87aa mv a5,a0 + 30089c4: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdWord(Dev, 0x84, &tempword); + 30089c8: f6240793 addi a5,s0,-158 + 30089cc: 863e mv a2,a5 + 30089ce: 08400593 li a1,132 + 30089d2: f4c42503 lw a0,-180(s0) + 30089d6: 463050ef jal ra,300e638 + 30089da: 87aa mv a5,a0 + 30089dc: 873e mv a4,a5 + 30089de: fef44783 lbu a5,-17(s0) + 30089e2: 8fd9 or a5,a5,a4 + 30089e4: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 30089e8: 4601 li a2,0 + 30089ea: 0ff00593 li a1,255 + 30089ee: f4c42503 lw a0,-180(s0) + 30089f2: 2a4d jal ra,3008ba4 + 30089f4: 87aa mv a5,a0 + 30089f6: 873e mv a4,a5 + 30089f8: fef44783 lbu a5,-17(s0) + 30089fc: 8fd9 or a5,a5,a4 + 30089fe: fef407a3 sb a5,-17(s0) + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008a02: fef40783 lb a5,-17(s0) + 3008a06: eb89 bnez a5,3008a18 + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, + 3008a08: f6245783 lhu a5,-158(s0) + 3008a0c: 0792 slli a5,a5,0x4 + 3008a0e: 873e mv a4,a5 + 3008a10: f4c42783 lw a5,-180(s0) + 3008a14: 10e7a023 sw a4,256(a5) + } + + /* After static init, some device parameters may be changed, + * so update them + */ + if (Status == VL53L0X_ERROR_NONE) + 3008a18: fef40783 lb a5,-17(s0) + 3008a1c: eb91 bnez a5,3008a30 + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + 3008a1e: f6440793 addi a5,s0,-156 + 3008a22: 85be mv a1,a5 + 3008a24: f4c42503 lw a0,-180(s0) + 3008a28: 2241 jal ra,3008ba8 + 3008a2a: 87aa mv a5,a0 + 3008a2c: fef407a3 sb a5,-17(s0) + + + if (Status == VL53L0X_ERROR_NONE) { + 3008a30: fef40783 lb a5,-17(s0) + 3008a34: e39d bnez a5,3008a5a + Status = VL53L0X_GetFractionEnable(Dev, &tempbyte); + 3008a36: f6140793 addi a5,s0,-159 + 3008a3a: 85be mv a1,a5 + 3008a3c: f4c42503 lw a0,-180(s0) + 3008a40: 264d jal ra,3008de2 + 3008a42: 87aa mv a5,a0 + 3008a44: fef407a3 sb a5,-17(s0) + if (Status == VL53L0X_ERROR_NONE) + 3008a48: fef40783 lb a5,-17(s0) + 3008a4c: e799 bnez a5,3008a5a + PALDevDataSet(Dev, RangeFractionalEnable, tempbyte); + 3008a4e: f6144703 lbu a4,-159(s0) + 3008a52: f4c42783 lw a5,-180(s0) + 3008a56: 14e78ea3 sb a4,349(a5) + + } + + if (Status == VL53L0X_ERROR_NONE) + 3008a5a: fef40783 lb a5,-17(s0) + 3008a5e: ef89 bnez a5,3008a78 + PALDevDataSet(Dev, CurrentParameters, CurrentParameters); + 3008a60: f4c42783 lw a5,-180(s0) + 3008a64: 07a1 addi a5,a5,8 + 3008a66: f6440713 addi a4,s0,-156 + 3008a6a: 07800693 li a3,120 + 3008a6e: 8636 mv a2,a3 + 3008a70: 85ba mv a1,a4 + 3008a72: 853e mv a0,a5 + 3008a74: 6b7050ef jal ra,300e92a + + + /* read the sequence config and save it */ + if (Status == VL53L0X_ERROR_NONE) { + 3008a78: fef40783 lb a5,-17(s0) + 3008a7c: e78d bnez a5,3008aa6 + Status = VL53L0X_RdByte(Dev, + 3008a7e: f6140793 addi a5,s0,-159 + 3008a82: 863e mv a2,a5 + 3008a84: 4585 li a1,1 + 3008a86: f4c42503 lw a0,-180(s0) + 3008a8a: 359050ef jal ra,300e5e2 + 3008a8e: 87aa mv a5,a0 + 3008a90: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte); + if (Status == VL53L0X_ERROR_NONE) + 3008a94: fef40783 lb a5,-17(s0) + 3008a98: e799 bnez a5,3008aa6 + PALDevDataSet(Dev, SequenceConfig, tempbyte); + 3008a9a: f6144703 lbu a4,-159(s0) + 3008a9e: f4c42783 lw a5,-180(s0) + 3008aa2: 14e78e23 sb a4,348(a5) + + } + + /* Disable MSRC and TCC by default */ + if (Status == VL53L0X_ERROR_NONE) + 3008aa6: fef40783 lb a5,-17(s0) + 3008aaa: eb89 bnez a5,3008abc + Status = VL53L0X_SetSequenceStepEnable(Dev, + 3008aac: 4601 li a2,0 + 3008aae: 4581 li a1,0 + 3008ab0: f4c42503 lw a0,-180(s0) + 3008ab4: 210d jal ra,3008ed6 + 3008ab6: 87aa mv a5,a0 + 3008ab8: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_TCC, 0); + + + if (Status == VL53L0X_ERROR_NONE) + 3008abc: fef40783 lb a5,-17(s0) + 3008ac0: eb89 bnez a5,3008ad2 + Status = VL53L0X_SetSequenceStepEnable(Dev, + 3008ac2: 4601 li a2,0 + 3008ac4: 4589 li a1,2 + 3008ac6: f4c42503 lw a0,-180(s0) + 3008aca: 2131 jal ra,3008ed6 + 3008acc: 87aa mv a5,a0 + 3008ace: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_MSRC, 0); + + + /* Set PAL State to standby */ + if (Status == VL53L0X_ERROR_NONE) + 3008ad2: fef40783 lb a5,-17(s0) + 3008ad6: e791 bnez a5,3008ae2 + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + 3008ad8: f4c42783 lw a5,-180(s0) + 3008adc: 470d li a4,3 + 3008ade: 14e78f23 sb a4,350(a5) + + + + /* Store pre-range vcsel period */ + if (Status == VL53L0X_ERROR_NONE) { + 3008ae2: fef40783 lb a5,-17(s0) + 3008ae6: eb99 bnez a5,3008afc + Status = VL53L0X_GetVcselPulsePeriod( + 3008ae8: f5b40793 addi a5,s0,-165 + 3008aec: 863e mv a2,a5 + 3008aee: 4581 li a1,0 + 3008af0: f4c42503 lw a0,-180(s0) + 3008af4: 264d jal ra,3008e96 + 3008af6: 87aa mv a5,a0 + 3008af8: fef407a3 sb a5,-17(s0) + Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &vcselPulsePeriodPCLK); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008afc: fef40783 lb a5,-17(s0) + 3008b00: e799 bnez a5,3008b0e + VL53L0X_SETDEVICESPECIFICPARAMETER( + 3008b02: f5b44703 lbu a4,-165(s0) + 3008b06: f4c42783 lw a5,-180(s0) + 3008b0a: 10e78a23 sb a4,276(a5) + PreRangeVcselPulsePeriod, + vcselPulsePeriodPCLK); + } + + /* Store final-range vcsel period */ + if (Status == VL53L0X_ERROR_NONE) { + 3008b0e: fef40783 lb a5,-17(s0) + 3008b12: eb99 bnez a5,3008b28 + Status = VL53L0X_GetVcselPulsePeriod( + 3008b14: f5b40793 addi a5,s0,-165 + 3008b18: 863e mv a2,a5 + 3008b1a: 4585 li a1,1 + 3008b1c: f4c42503 lw a0,-180(s0) + 3008b20: 2e9d jal ra,3008e96 + 3008b22: 87aa mv a5,a0 + 3008b24: fef407a3 sb a5,-17(s0) + Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &vcselPulsePeriodPCLK); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008b28: fef40783 lb a5,-17(s0) + 3008b2c: e799 bnez a5,3008b3a + VL53L0X_SETDEVICESPECIFICPARAMETER( + 3008b2e: f5b44703 lbu a4,-165(s0) + 3008b32: f4c42783 lw a5,-180(s0) + 3008b36: 10e78623 sb a4,268(a5) + FinalRangeVcselPulsePeriod, + vcselPulsePeriodPCLK); + } + + /* Store pre-range timeout */ + if (Status == VL53L0X_ERROR_NONE) { + 3008b3a: fef40783 lb a5,-17(s0) + 3008b3e: ef81 bnez a5,3008b56 + Status = get_sequence_step_timeout( + 3008b40: f5440793 addi a5,s0,-172 + 3008b44: 863e mv a2,a5 + 3008b46: 458d li a1,3 + 3008b48: f4c42503 lw a0,-180(s0) + 3008b4c: 051030ef jal ra,300c39c + 3008b50: 87aa mv a5,a0 + 3008b52: fef407a3 sb a5,-17(s0) + Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &seqTimeoutMicroSecs); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008b56: fef40783 lb a5,-17(s0) + 3008b5a: e799 bnez a5,3008b68 + VL53L0X_SETDEVICESPECIFICPARAMETER( + 3008b5c: f5442703 lw a4,-172(s0) + 3008b60: f4c42783 lw a5,-180(s0) + 3008b64: 10e7a823 sw a4,272(a5) + PreRangeTimeoutMicroSecs, + seqTimeoutMicroSecs); + } + + /* Store final-range timeout */ + if (Status == VL53L0X_ERROR_NONE) { + 3008b68: fef40783 lb a5,-17(s0) + 3008b6c: ef81 bnez a5,3008b84 + Status = get_sequence_step_timeout( + 3008b6e: f5440793 addi a5,s0,-172 + 3008b72: 863e mv a2,a5 + 3008b74: 4591 li a1,4 + 3008b76: f4c42503 lw a0,-180(s0) + 3008b7a: 023030ef jal ra,300c39c + 3008b7e: 87aa mv a5,a0 + 3008b80: fef407a3 sb a5,-17(s0) + Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &seqTimeoutMicroSecs); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008b84: fef40783 lb a5,-17(s0) + 3008b88: e799 bnez a5,3008b96 + VL53L0X_SETDEVICESPECIFICPARAMETER( + 3008b8a: f5442703 lw a4,-172(s0) + 3008b8e: f4c42783 lw a5,-180(s0) + 3008b92: 10e7a423 sw a4,264(a5) + FinalRangeTimeoutMicroSecs, + seqTimeoutMicroSecs); + } + + LOG_FUNCTION_END(Status); + return Status; + 3008b96: fef40783 lb a5,-17(s0) +} + 3008b9a: 853e mv a0,a5 + 3008b9c: 50fa lw ra,188(sp) + 3008b9e: 546a lw s0,184(sp) + 3008ba0: 6129 addi sp,sp,192 + 3008ba2: 8082 ret + +03008ba4 : + 3008ba4: 0e10506f j 300e484 + +03008ba8 : + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, + VL53L0X_DeviceParameters_t *pDeviceParameters) +{ + 3008ba8: 7179 addi sp,sp,-48 + 3008baa: d606 sw ra,44(sp) + 3008bac: d422 sw s0,40(sp) + 3008bae: 1800 addi s0,sp,48 + 3008bb0: fca42e23 sw a0,-36(s0) + 3008bb4: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008bb8: fe0407a3 sb zero,-17(s0) + int i; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetDeviceMode(Dev, &(pDeviceParameters->DeviceMode)); + 3008bbc: fd842783 lw a5,-40(s0) + 3008bc0: 85be mv a1,a5 + 3008bc2: fdc42503 lw a0,-36(s0) + 3008bc6: 2acd jal ra,3008db8 + 3008bc8: 87aa mv a5,a0 + 3008bca: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 3008bce: fef40783 lb a5,-17(s0) + 3008bd2: eb99 bnez a5,3008be8 + Status = VL53L0X_GetInterMeasurementPeriodMilliSeconds(Dev, + 3008bd4: fd842783 lw a5,-40(s0) + 3008bd8: 07a1 addi a5,a5,8 + 3008bda: 85be mv a1,a5 + 3008bdc: fdc42503 lw a0,-36(s0) + 3008be0: 2505 jal ra,3009200 + 3008be2: 87aa mv a5,a0 + 3008be4: fef407a3 sb a5,-17(s0) + &(pDeviceParameters->InterMeasurementPeriodMilliSeconds)); + + + if (Status == VL53L0X_ERROR_NONE) + 3008be8: fef40783 lb a5,-17(s0) + 3008bec: e789 bnez a5,3008bf6 + pDeviceParameters->XTalkCompensationEnable = 0; + 3008bee: fd842783 lw a5,-40(s0) + 3008bf2: 00078623 sb zero,12(a5) + + if (Status == VL53L0X_ERROR_NONE) + 3008bf6: fef40783 lb a5,-17(s0) + 3008bfa: eb99 bnez a5,3008c10 + Status = VL53L0X_GetXTalkCompensationRateMegaCps(Dev, + 3008bfc: fd842783 lw a5,-40(s0) + 3008c00: 07c1 addi a5,a5,16 + 3008c02: 85be mv a1,a5 + 3008c04: fdc42503 lw a0,-36(s0) + 3008c08: 2565 jal ra,30092b0 + 3008c0a: 87aa mv a5,a0 + 3008c0c: fef407a3 sb a5,-17(s0) + &(pDeviceParameters->XTalkCompensationRateMegaCps)); + + + if (Status == VL53L0X_ERROR_NONE) + 3008c10: fef40783 lb a5,-17(s0) + 3008c14: eb99 bnez a5,3008c2a + Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, + 3008c16: fd842783 lw a5,-40(s0) + 3008c1a: 07d1 addi a5,a5,20 + 3008c1c: 85be mv a1,a5 + 3008c1e: fdc42503 lw a0,-36(s0) + 3008c22: 3045 jal ra,30084c2 + 3008c24: 87aa mv a5,a0 + 3008c26: fef407a3 sb a5,-17(s0) + &(pDeviceParameters->RangeOffsetMicroMeters)); + + + if (Status == VL53L0X_ERROR_NONE) { + 3008c2a: fef40783 lb a5,-17(s0) + 3008c2e: ebd9 bnez a5,3008cc4 + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + 3008c30: fe042423 sw zero,-24(s0) + 3008c34: a8bd j 3008cb2 + /* get first the values, then the enables. + * VL53L0X_GetLimitCheckValue will modify the enable + * flags + */ + if (Status == VL53L0X_ERROR_NONE) { + 3008c36: fef40783 lb a5,-17(s0) + 3008c3a: e3d1 bnez a5,3008cbe + Status |= VL53L0X_GetLimitCheckValue(Dev, i, + 3008c3c: fe842783 lw a5,-24(s0) + 3008c40: 01079693 slli a3,a5,0x10 + 3008c44: 82c1 srli a3,a3,0x10 + 3008c46: fe842783 lw a5,-24(s0) + 3008c4a: 07a1 addi a5,a5,8 + 3008c4c: 078a slli a5,a5,0x2 + 3008c4e: fd842703 lw a4,-40(s0) + 3008c52: 97ba add a5,a5,a4 + 3008c54: 0791 addi a5,a5,4 + 3008c56: 863e mv a2,a5 + 3008c58: 85b6 mv a1,a3 + 3008c5a: fdc42503 lw a0,-36(s0) + 3008c5e: 189000ef jal ra,30095e6 + 3008c62: 87aa mv a5,a0 + 3008c64: 873e mv a4,a5 + 3008c66: fef44783 lbu a5,-17(s0) + 3008c6a: 8fd9 or a5,a5,a4 + 3008c6c: fef407a3 sb a5,-17(s0) + &(pDeviceParameters->LimitChecksValue[i])); + } else { + break; + } + if (Status == VL53L0X_ERROR_NONE) { + 3008c70: fef40783 lb a5,-17(s0) + 3008c74: e7b9 bnez a5,3008cc2 + Status |= VL53L0X_GetLimitCheckEnable(Dev, i, + 3008c76: fe842783 lw a5,-24(s0) + 3008c7a: 01079693 slli a3,a5,0x10 + 3008c7e: 82c1 srli a3,a3,0x10 + &(pDeviceParameters->LimitChecksEnable[i])); + 3008c80: fe842783 lw a5,-24(s0) + 3008c84: 07c1 addi a5,a5,16 + 3008c86: fd842703 lw a4,-40(s0) + 3008c8a: 97ba add a5,a5,a4 + 3008c8c: 07a1 addi a5,a5,8 + Status |= VL53L0X_GetLimitCheckEnable(Dev, i, + 3008c8e: 863e mv a2,a5 + 3008c90: 85b6 mv a1,a3 + 3008c92: fdc42503 lw a0,-36(s0) + 3008c96: 005000ef jal ra,300949a + 3008c9a: 87aa mv a5,a0 + 3008c9c: 873e mv a4,a5 + 3008c9e: fef44783 lbu a5,-17(s0) + 3008ca2: 8fd9 or a5,a5,a4 + 3008ca4: fef407a3 sb a5,-17(s0) + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + 3008ca8: fe842783 lw a5,-24(s0) + 3008cac: 0785 addi a5,a5,1 + 3008cae: fef42423 sw a5,-24(s0) + 3008cb2: fe842703 lw a4,-24(s0) + 3008cb6: 4795 li a5,5 + 3008cb8: f6e7dfe3 bge a5,a4,3008c36 + 3008cbc: a021 j 3008cc4 + break; + 3008cbe: 0001 nop + 3008cc0: a011 j 3008cc4 + } else { + break; + 3008cc2: 0001 nop + } + } + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008cc4: fef40783 lb a5,-17(s0) + 3008cc8: ef89 bnez a5,3008ce2 + Status = VL53L0X_GetWrapAroundCheckEnable(Dev, + &(pDeviceParameters->WrapAroundCheckEnable)); + 3008cca: fd842783 lw a5,-40(s0) + 3008cce: 07478793 addi a5,a5,116 + Status = VL53L0X_GetWrapAroundCheckEnable(Dev, + 3008cd2: 85be mv a1,a5 + 3008cd4: fdc42503 lw a0,-36(s0) + 3008cd8: 269000ef jal ra,3009740 + 3008cdc: 87aa mv a5,a0 + 3008cde: fef407a3 sb a5,-17(s0) + } + + /* Need to be done at the end as it uses VCSELPulsePeriod */ + if (Status == VL53L0X_ERROR_NONE) { + 3008ce2: fef40783 lb a5,-17(s0) + 3008ce6: eb99 bnez a5,3008cfc + Status = VL53L0X_GetMeasurementTimingBudgetMicroSeconds(Dev, + 3008ce8: fd842783 lw a5,-40(s0) + 3008cec: 0791 addi a5,a5,4 + 3008cee: 85be mv a1,a5 + 3008cf0: fdc42503 lw a0,-36(s0) + 3008cf4: 22bd jal ra,3008e62 + 3008cf6: 87aa mv a5,a0 + 3008cf8: fef407a3 sb a5,-17(s0) + &(pDeviceParameters->MeasurementTimingBudgetMicroSeconds)); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3008cfc: fef40783 lb a5,-17(s0) + 3008d00: efb1 bnez a5,3008d5c + for (i = 0; i < VL53L0X_DMAX_LUT_SIZE; i++) { + 3008d02: fe042423 sw zero,-24(s0) + 3008d06: a0b1 j 3008d52 + pDeviceParameters->dmax_lut.ambRate_mcps[i] = + Dev->Data.CurrentParameters.dmax_lut.ambRate_mcps[i]; + 3008d08: fdc42703 lw a4,-36(s0) + 3008d0c: fe842783 lw a5,-24(s0) + 3008d10: 07b1 addi a5,a5,12 + 3008d12: 078a slli a5,a5,0x2 + 3008d14: 97ba add a5,a5,a4 + 3008d16: 4bd8 lw a4,20(a5) + pDeviceParameters->dmax_lut.ambRate_mcps[i] = + 3008d18: fd842683 lw a3,-40(s0) + 3008d1c: fe842783 lw a5,-24(s0) + 3008d20: 07b1 addi a5,a5,12 + 3008d22: 078a slli a5,a5,0x2 + 3008d24: 97b6 add a5,a5,a3 + 3008d26: c7d8 sw a4,12(a5) + pDeviceParameters->dmax_lut.dmax_mm[i] = + Dev->Data.CurrentParameters.dmax_lut.dmax_mm[i]; + 3008d28: fdc42703 lw a4,-36(s0) + 3008d2c: fe842783 lw a5,-24(s0) + 3008d30: 07c1 addi a5,a5,16 + 3008d32: 078a slli a5,a5,0x2 + 3008d34: 97ba add a5,a5,a4 + 3008d36: 5398 lw a4,32(a5) + pDeviceParameters->dmax_lut.dmax_mm[i] = + 3008d38: fd842683 lw a3,-40(s0) + 3008d3c: fe842783 lw a5,-24(s0) + 3008d40: 07c1 addi a5,a5,16 + 3008d42: 078a slli a5,a5,0x2 + 3008d44: 97b6 add a5,a5,a3 + 3008d46: cf98 sw a4,24(a5) + for (i = 0; i < VL53L0X_DMAX_LUT_SIZE; i++) { + 3008d48: fe842783 lw a5,-24(s0) + 3008d4c: 0785 addi a5,a5,1 + 3008d4e: fef42423 sw a5,-24(s0) + 3008d52: fe842703 lw a4,-24(s0) + 3008d56: 4799 li a5,6 + 3008d58: fae7d8e3 bge a5,a4,3008d08 + } + } + + LOG_FUNCTION_END(Status); + return Status; + 3008d5c: fef40783 lb a5,-17(s0) +} + 3008d60: 853e mv a0,a5 + 3008d62: 50b2 lw ra,44(sp) + 3008d64: 5422 lw s0,40(sp) + 3008d66: 6145 addi sp,sp,48 + 3008d68: 8082 ret + +03008d6a : + +VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode) +{ + 3008d6a: 7179 addi sp,sp,-48 + 3008d6c: d622 sw s0,44(sp) + 3008d6e: 1800 addi s0,sp,48 + 3008d70: fca42e23 sw a0,-36(s0) + 3008d74: 87ae mv a5,a1 + 3008d76: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008d7a: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START("%d", (int)DeviceMode); + + switch (DeviceMode) { + 3008d7e: fdb44783 lbu a5,-37(s0) + 3008d82: 4755 li a4,21 + 3008d84: 02f76163 bltu a4,a5,3008da6 + 3008d88: 00279713 slli a4,a5,0x2 + 3008d8c: 0300f7b7 lui a5,0x300f + 3008d90: 3b478793 addi a5,a5,948 # 300f3b4 + 3008d94: 97ba add a5,a5,a4 + 3008d96: 439c lw a5,0(a5) + 3008d98: 8782 jr a5 + case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: + case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: + case VL53L0X_DEVICEMODE_GPIO_DRIVE: + case VL53L0X_DEVICEMODE_GPIO_OSC: + /* Supported modes */ + VL53L0X_SETPARAMETERFIELD(Dev, DeviceMode, DeviceMode); + 3008d9a: fdc42783 lw a5,-36(s0) + 3008d9e: fdb44703 lbu a4,-37(s0) + 3008da2: a798 sb a4,8(a5) + break; + 3008da4: a021 j 3008dac + default: + /* Unsupported mode */ + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + 3008da6: 57e1 li a5,-8 + 3008da8: fef407a3 sb a5,-17(s0) + } + + LOG_FUNCTION_END(Status); + return Status; + 3008dac: fef40783 lb a5,-17(s0) +} + 3008db0: 853e mv a0,a5 + 3008db2: 5432 lw s0,44(sp) + 3008db4: 6145 addi sp,sp,48 + 3008db6: 8082 ret + +03008db8 : + +VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes *pDeviceMode) +{ + 3008db8: 7179 addi sp,sp,-48 + 3008dba: d622 sw s0,44(sp) + 3008dbc: 1800 addi s0,sp,48 + 3008dbe: fca42e23 sw a0,-36(s0) + 3008dc2: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008dc6: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, DeviceMode, *pDeviceMode); + 3008dca: fdc42783 lw a5,-36(s0) + 3008dce: 2798 lbu a4,8(a5) + 3008dd0: fd842783 lw a5,-40(s0) + 3008dd4: a398 sb a4,0(a5) + + LOG_FUNCTION_END(Status); + return Status; + 3008dd6: fef40783 lb a5,-17(s0) +} + 3008dda: 853e mv a0,a5 + 3008ddc: 5432 lw s0,44(sp) + 3008dde: 6145 addi sp,sp,48 + 3008de0: 8082 ret + +03008de2 : + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, uint8_t *pEnabled) +{ + 3008de2: 7179 addi sp,sp,-48 + 3008de4: d606 sw ra,44(sp) + 3008de6: d422 sw s0,40(sp) + 3008de8: 1800 addi s0,sp,48 + 3008dea: fca42e23 sw a0,-36(s0) + 3008dee: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008df2: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, pEnabled); + 3008df6: fd842603 lw a2,-40(s0) + 3008dfa: 45a5 li a1,9 + 3008dfc: fdc42503 lw a0,-36(s0) + 3008e00: 2ef5 jal ra,30091fc + 3008e02: 87aa mv a5,a0 + 3008e04: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 3008e08: fef40783 lb a5,-17(s0) + 3008e0c: eb91 bnez a5,3008e20 + *pEnabled = (*pEnabled & 1); + 3008e0e: fd842783 lw a5,-40(s0) + 3008e12: 239c lbu a5,0(a5) + 3008e14: 8b85 andi a5,a5,1 + 3008e16: 0ff7f713 andi a4,a5,255 + 3008e1a: fd842783 lw a5,-40(s0) + 3008e1e: a398 sb a4,0(a5) + + LOG_FUNCTION_END(Status); + return Status; + 3008e20: fef40783 lb a5,-17(s0) +} + 3008e24: 853e mv a0,a5 + 3008e26: 50b2 lw ra,44(sp) + 3008e28: 5422 lw s0,40(sp) + 3008e2a: 6145 addi sp,sp,48 + 3008e2c: 8082 ret + +03008e2e : + return Status; +} + +VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + 3008e2e: 7179 addi sp,sp,-48 + 3008e30: d606 sw ra,44(sp) + 3008e32: d422 sw s0,40(sp) + 3008e34: 1800 addi s0,sp,48 + 3008e36: fca42e23 sw a0,-36(s0) + 3008e3a: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008e3e: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_measurement_timing_budget_micro_seconds(Dev, + 3008e42: fd842583 lw a1,-40(s0) + 3008e46: fdc42503 lw a0,-36(s0) + 3008e4a: 20f030ef jal ra,300c858 + 3008e4e: 87aa mv a5,a0 + 3008e50: fef407a3 sb a5,-17(s0) + MeasurementTimingBudgetMicroSeconds); + + LOG_FUNCTION_END(Status); + + return Status; + 3008e54: fef40783 lb a5,-17(s0) +} + 3008e58: 853e mv a0,a5 + 3008e5a: 50b2 lw ra,44(sp) + 3008e5c: 5422 lw s0,40(sp) + 3008e5e: 6145 addi sp,sp,48 + 3008e60: 8082 ret + +03008e62 : + +VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + 3008e62: 7179 addi sp,sp,-48 + 3008e64: d606 sw ra,44(sp) + 3008e66: d422 sw s0,40(sp) + 3008e68: 1800 addi s0,sp,48 + 3008e6a: fca42e23 sw a0,-36(s0) + 3008e6e: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008e72: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_measurement_timing_budget_micro_seconds(Dev, + 3008e76: fd842583 lw a1,-40(s0) + 3008e7a: fdc42503 lw a0,-36(s0) + 3008e7e: 3f1030ef jal ra,300ca6e + 3008e82: 87aa mv a5,a0 + 3008e84: fef407a3 sb a5,-17(s0) + pMeasurementTimingBudgetMicroSeconds); + + LOG_FUNCTION_END(Status); + return Status; + 3008e88: fef40783 lb a5,-17(s0) +} + 3008e8c: 853e mv a0,a5 + 3008e8e: 50b2 lw ra,44(sp) + 3008e90: 5422 lw s0,40(sp) + 3008e92: 6145 addi sp,sp,48 + 3008e94: 8082 ret + +03008e96 : + return Status; +} + +VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) +{ + 3008e96: 7179 addi sp,sp,-48 + 3008e98: d606 sw ra,44(sp) + 3008e9a: d422 sw s0,40(sp) + 3008e9c: 1800 addi s0,sp,48 + 3008e9e: fca42e23 sw a0,-36(s0) + 3008ea2: 87ae mv a5,a1 + 3008ea4: fcc42a23 sw a2,-44(s0) + 3008ea8: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008eac: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_vcsel_pulse_period(Dev, VcselPeriodType, + 3008eb0: fdb44783 lbu a5,-37(s0) + 3008eb4: fd442603 lw a2,-44(s0) + 3008eb8: 85be mv a1,a5 + 3008eba: fdc42503 lw a0,-36(s0) + 3008ebe: 111030ef jal ra,300c7ce + 3008ec2: 87aa mv a5,a0 + 3008ec4: fef407a3 sb a5,-17(s0) + pVCSELPulsePeriodPCLK); + + LOG_FUNCTION_END(Status); + return Status; + 3008ec8: fef40783 lb a5,-17(s0) +} + 3008ecc: 853e mv a0,a5 + 3008ece: 50b2 lw ra,44(sp) + 3008ed0: 5422 lw s0,40(sp) + 3008ed2: 6145 addi sp,sp,48 + 3008ed4: 8082 ret + +03008ed6 : + +VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled) +{ + 3008ed6: 7179 addi sp,sp,-48 + 3008ed8: d606 sw ra,44(sp) + 3008eda: d422 sw s0,40(sp) + 3008edc: 1800 addi s0,sp,48 + 3008ede: fca42e23 sw a0,-36(s0) + 3008ee2: 87ae mv a5,a1 + 3008ee4: 8732 mv a4,a2 + 3008ee6: fcf40da3 sb a5,-37(s0) + 3008eea: 87ba mv a5,a4 + 3008eec: fcf40d23 sb a5,-38(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3008ef0: fe0407a3 sb zero,-17(s0) + uint8_t SequenceConfig = 0; + 3008ef4: fe0403a3 sb zero,-25(s0) + uint8_t SequenceConfigNew = 0; + 3008ef8: fe040723 sb zero,-18(s0) + uint32_t MeasurementTimingBudgetMicroSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 3008efc: fe740793 addi a5,s0,-25 + 3008f00: 863e mv a2,a5 + 3008f02: 4585 li a1,1 + 3008f04: fdc42503 lw a0,-36(s0) + 3008f08: 2cd5 jal ra,30091fc + 3008f0a: 87aa mv a5,a0 + 3008f0c: fef407a3 sb a5,-17(s0) + &SequenceConfig); + + SequenceConfigNew = SequenceConfig; + 3008f10: fe744783 lbu a5,-25(s0) + 3008f14: fef40723 sb a5,-18(s0) + + if (Status == VL53L0X_ERROR_NONE) { + 3008f18: fef40783 lb a5,-17(s0) + 3008f1c: eff1 bnez a5,3008ff8 + if (SequenceStepEnabled == 1) { + 3008f1e: fda44703 lbu a4,-38(s0) + 3008f22: 4785 li a5,1 + 3008f24: 06f71763 bne a4,a5,3008f92 + + /* Enable requested sequence step + */ + switch (SequenceStepId) { + 3008f28: fdb44783 lbu a5,-37(s0) + 3008f2c: 4711 li a4,4 + 3008f2e: 04f76e63 bltu a4,a5,3008f8a + 3008f32: 00279713 slli a4,a5,0x2 + 3008f36: 0300f7b7 lui a5,0x300f + 3008f3a: 40c78793 addi a5,a5,1036 # 300f40c + 3008f3e: 97ba add a5,a5,a4 + 3008f40: 439c lw a5,0(a5) + 3008f42: 8782 jr a5 + case VL53L0X_SEQUENCESTEP_TCC: + SequenceConfigNew |= 0x10; + 3008f44: fee44783 lbu a5,-18(s0) + 3008f48: 0107e793 ori a5,a5,16 + 3008f4c: fef40723 sb a5,-18(s0) + break; + 3008f50: a06d j 3008ffa + case VL53L0X_SEQUENCESTEP_DSS: + SequenceConfigNew |= 0x28; + 3008f52: fee44783 lbu a5,-18(s0) + 3008f56: 0287e793 ori a5,a5,40 + 3008f5a: fef40723 sb a5,-18(s0) + break; + 3008f5e: a871 j 3008ffa + case VL53L0X_SEQUENCESTEP_MSRC: + SequenceConfigNew |= 0x04; + 3008f60: fee44783 lbu a5,-18(s0) + 3008f64: 0047e793 ori a5,a5,4 + 3008f68: fef40723 sb a5,-18(s0) + break; + 3008f6c: a079 j 3008ffa + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + SequenceConfigNew |= 0x40; + 3008f6e: fee44783 lbu a5,-18(s0) + 3008f72: 0407e793 ori a5,a5,64 + 3008f76: fef40723 sb a5,-18(s0) + break; + 3008f7a: a041 j 3008ffa + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + SequenceConfigNew |= 0x80; + 3008f7c: fee44783 lbu a5,-18(s0) + 3008f80: f807e793 ori a5,a5,-128 + 3008f84: fef40723 sb a5,-18(s0) + break; + 3008f88: a88d j 3008ffa + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 3008f8a: 57f1 li a5,-4 + 3008f8c: fef407a3 sb a5,-17(s0) + 3008f90: a0ad j 3008ffa + } + } else { + /* Disable requested sequence step + */ + switch (SequenceStepId) { + 3008f92: fdb44783 lbu a5,-37(s0) + 3008f96: 4711 li a4,4 + 3008f98: 04f76c63 bltu a4,a5,3008ff0 + 3008f9c: 00279713 slli a4,a5,0x2 + 3008fa0: 0300f7b7 lui a5,0x300f + 3008fa4: 42078793 addi a5,a5,1056 # 300f420 + 3008fa8: 97ba add a5,a5,a4 + 3008faa: 439c lw a5,0(a5) + 3008fac: 8782 jr a5 + case VL53L0X_SEQUENCESTEP_TCC: + SequenceConfigNew &= 0xef; + 3008fae: fee44783 lbu a5,-18(s0) + 3008fb2: 9bbd andi a5,a5,-17 + 3008fb4: fef40723 sb a5,-18(s0) + break; + 3008fb8: a089 j 3008ffa + case VL53L0X_SEQUENCESTEP_DSS: + SequenceConfigNew &= 0xd7; + 3008fba: fee44783 lbu a5,-18(s0) + 3008fbe: fd77f793 andi a5,a5,-41 + 3008fc2: fef40723 sb a5,-18(s0) + break; + 3008fc6: a815 j 3008ffa + case VL53L0X_SEQUENCESTEP_MSRC: + SequenceConfigNew &= 0xfb; + 3008fc8: fee44783 lbu a5,-18(s0) + 3008fcc: 9bed andi a5,a5,-5 + 3008fce: fef40723 sb a5,-18(s0) + break; + 3008fd2: a025 j 3008ffa + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + SequenceConfigNew &= 0xbf; + 3008fd4: fee44783 lbu a5,-18(s0) + 3008fd8: fbf7f793 andi a5,a5,-65 + 3008fdc: fef40723 sb a5,-18(s0) + break; + 3008fe0: a829 j 3008ffa + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + SequenceConfigNew &= 0x7f; + 3008fe2: fee44783 lbu a5,-18(s0) + 3008fe6: 07f7f793 andi a5,a5,127 + 3008fea: fef40723 sb a5,-18(s0) + break; + 3008fee: a031 j 3008ffa + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 3008ff0: 57f1 li a5,-4 + 3008ff2: fef407a3 sb a5,-17(s0) + 3008ff6: a011 j 3008ffa + } + } + 3008ff8: 0001 nop + } + + if (SequenceConfigNew != SequenceConfig) { + 3008ffa: fe744783 lbu a5,-25(s0) + 3008ffe: fee44703 lbu a4,-18(s0) + 3009002: 04f70563 beq a4,a5,300904c + /* Apply New Setting */ + if (Status == VL53L0X_ERROR_NONE) { + 3009006: fef40783 lb a5,-17(s0) + 300900a: eb99 bnez a5,3009020 + Status = VL53L0X_WrByte(Dev, + 300900c: fee44783 lbu a5,-18(s0) + 3009010: 863e mv a2,a5 + 3009012: 4585 li a1,1 + 3009014: fdc42503 lw a0,-36(s0) + 3009018: 3671 jal ra,3008ba4 + 300901a: 87aa mv a5,a0 + 300901c: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, SequenceConfigNew); + } + if (Status == VL53L0X_ERROR_NONE) + 3009020: fef40783 lb a5,-17(s0) + 3009024: e799 bnez a5,3009032 + PALDevDataSet(Dev, SequenceConfig, SequenceConfigNew); + 3009026: fdc42783 lw a5,-36(s0) + 300902a: fee44703 lbu a4,-18(s0) + 300902e: 14e78e23 sb a4,348(a5) + + + /* Recalculate timing budget */ + if (Status == VL53L0X_ERROR_NONE) { + 3009032: fef40783 lb a5,-17(s0) + 3009036: eb99 bnez a5,300904c + VL53L0X_GETPARAMETERFIELD(Dev, + 3009038: fdc42783 lw a5,-36(s0) + 300903c: 47dc lw a5,12(a5) + 300903e: fef42423 sw a5,-24(s0) + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + 3009042: fe842583 lw a1,-24(s0) + 3009046: fdc42503 lw a0,-36(s0) + 300904a: 33d5 jal ra,3008e2e + } + } + + LOG_FUNCTION_END(Status); + + return Status; + 300904c: fef40783 lb a5,-17(s0) +} + 3009050: 853e mv a0,a5 + 3009052: 50b2 lw ra,44(sp) + 3009054: 5422 lw s0,40(sp) + 3009056: 6145 addi sp,sp,48 + 3009058: 8082 ret + +0300905a : + +VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceConfig, + uint8_t *pSequenceStepEnabled) +{ + 300905a: 7179 addi sp,sp,-48 + 300905c: d622 sw s0,44(sp) + 300905e: 1800 addi s0,sp,48 + 3009060: fca42e23 sw a0,-36(s0) + 3009064: 87ae mv a5,a1 + 3009066: 8732 mv a4,a2 + 3009068: fcd42a23 sw a3,-44(s0) + 300906c: fcf40da3 sb a5,-37(s0) + 3009070: 87ba mv a5,a4 + 3009072: fcf40d23 sb a5,-38(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009076: fe0407a3 sb zero,-17(s0) + *pSequenceStepEnabled = 0; + 300907a: fd442783 lw a5,-44(s0) + 300907e: 00078023 sb zero,0(a5) + LOG_FUNCTION_START(""); + + switch (SequenceStepId) { + 3009082: fdb44783 lbu a5,-37(s0) + 3009086: 4711 li a4,4 + 3009088: 08f76063 bltu a4,a5,3009108 + 300908c: 00279713 slli a4,a5,0x2 + 3009090: 0300f7b7 lui a5,0x300f + 3009094: 43478793 addi a5,a5,1076 # 300f434 + 3009098: 97ba add a5,a5,a4 + 300909a: 439c lw a5,0(a5) + 300909c: 8782 jr a5 + case VL53L0X_SEQUENCESTEP_TCC: + *pSequenceStepEnabled = (SequenceConfig & 0x10) >> 4; + 300909e: fda44783 lbu a5,-38(s0) + 30090a2: 8791 srai a5,a5,0x4 + 30090a4: 9f81 uxtb a5 + 30090a6: 8b85 andi a5,a5,1 + 30090a8: 0ff7f713 andi a4,a5,255 + 30090ac: fd442783 lw a5,-44(s0) + 30090b0: a398 sb a4,0(a5) + break; + 30090b2: a8b1 j 300910e + case VL53L0X_SEQUENCESTEP_DSS: + *pSequenceStepEnabled = (SequenceConfig & 0x08) >> 3; + 30090b4: fda44783 lbu a5,-38(s0) + 30090b8: 878d srai a5,a5,0x3 + 30090ba: 9f81 uxtb a5 + 30090bc: 8b85 andi a5,a5,1 + 30090be: 0ff7f713 andi a4,a5,255 + 30090c2: fd442783 lw a5,-44(s0) + 30090c6: a398 sb a4,0(a5) + break; + 30090c8: a099 j 300910e + case VL53L0X_SEQUENCESTEP_MSRC: + *pSequenceStepEnabled = (SequenceConfig & 0x04) >> 2; + 30090ca: fda44783 lbu a5,-38(s0) + 30090ce: 8789 srai a5,a5,0x2 + 30090d0: 9f81 uxtb a5 + 30090d2: 8b85 andi a5,a5,1 + 30090d4: 0ff7f713 andi a4,a5,255 + 30090d8: fd442783 lw a5,-44(s0) + 30090dc: a398 sb a4,0(a5) + break; + 30090de: a805 j 300910e + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + *pSequenceStepEnabled = (SequenceConfig & 0x40) >> 6; + 30090e0: fda44783 lbu a5,-38(s0) + 30090e4: 8799 srai a5,a5,0x6 + 30090e6: 9f81 uxtb a5 + 30090e8: 8b85 andi a5,a5,1 + 30090ea: 0ff7f713 andi a4,a5,255 + 30090ee: fd442783 lw a5,-44(s0) + 30090f2: a398 sb a4,0(a5) + break; + 30090f4: a829 j 300910e + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + *pSequenceStepEnabled = (SequenceConfig & 0x80) >> 7; + 30090f6: fda44783 lbu a5,-38(s0) + 30090fa: 839d srli a5,a5,0x7 + 30090fc: 0ff7f713 andi a4,a5,255 + 3009100: fd442783 lw a5,-44(s0) + 3009104: a398 sb a4,0(a5) + break; + 3009106: a021 j 300910e + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 3009108: 57f1 li a5,-4 + 300910a: fef407a3 sb a5,-17(s0) + } + + LOG_FUNCTION_END(Status); + return Status; + 300910e: fef40783 lb a5,-17(s0) +} + 3009112: 853e mv a0,a5 + 3009114: 5432 lw s0,44(sp) + 3009116: 6145 addi sp,sp,48 + 3009118: 8082 ret + +0300911a : + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, + VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps) +{ + 300911a: 7179 addi sp,sp,-48 + 300911c: d606 sw ra,44(sp) + 300911e: d422 sw s0,40(sp) + 3009120: 1800 addi s0,sp,48 + 3009122: fca42e23 sw a0,-36(s0) + 3009126: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300912a: fe0407a3 sb zero,-17(s0) + uint8_t SequenceConfig = 0; + 300912e: fe040723 sb zero,-18(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 3009132: fee40793 addi a5,s0,-18 + 3009136: 863e mv a2,a5 + 3009138: 4585 li a1,1 + 300913a: fdc42503 lw a0,-36(s0) + 300913e: 287d jal ra,30091fc + 3009140: 87aa mv a5,a0 + 3009142: fef407a3 sb a5,-17(s0) + &SequenceConfig); + + if (Status == VL53L0X_ERROR_NONE) { + 3009146: fef40783 lb a5,-17(s0) + 300914a: ef91 bnez a5,3009166 + Status = sequence_step_enabled(Dev, + 300914c: fee44783 lbu a5,-18(s0) + VL53L0X_SEQUENCESTEP_TCC, SequenceConfig, + &pSchedulerSequenceSteps->TccOn); + 3009150: fd842703 lw a4,-40(s0) + Status = sequence_step_enabled(Dev, + 3009154: 86ba mv a3,a4 + 3009156: 863e mv a2,a5 + 3009158: 4581 li a1,0 + 300915a: fdc42503 lw a0,-36(s0) + 300915e: 3df5 jal ra,300905a + 3009160: 87aa mv a5,a0 + 3009162: fef407a3 sb a5,-17(s0) + } + if (Status == VL53L0X_ERROR_NONE) { + 3009166: fef40783 lb a5,-17(s0) + 300916a: ef99 bnez a5,3009188 + Status = sequence_step_enabled(Dev, + 300916c: fee44703 lbu a4,-18(s0) + VL53L0X_SEQUENCESTEP_DSS, SequenceConfig, + &pSchedulerSequenceSteps->DssOn); + 3009170: fd842783 lw a5,-40(s0) + 3009174: 0789 addi a5,a5,2 + Status = sequence_step_enabled(Dev, + 3009176: 86be mv a3,a5 + 3009178: 863a mv a2,a4 + 300917a: 4585 li a1,1 + 300917c: fdc42503 lw a0,-36(s0) + 3009180: 3de9 jal ra,300905a + 3009182: 87aa mv a5,a0 + 3009184: fef407a3 sb a5,-17(s0) + } + if (Status == VL53L0X_ERROR_NONE) { + 3009188: fef40783 lb a5,-17(s0) + 300918c: ef99 bnez a5,30091aa + Status = sequence_step_enabled(Dev, + 300918e: fee44703 lbu a4,-18(s0) + VL53L0X_SEQUENCESTEP_MSRC, SequenceConfig, + &pSchedulerSequenceSteps->MsrcOn); + 3009192: fd842783 lw a5,-40(s0) + 3009196: 0785 addi a5,a5,1 + Status = sequence_step_enabled(Dev, + 3009198: 86be mv a3,a5 + 300919a: 863a mv a2,a4 + 300919c: 4589 li a1,2 + 300919e: fdc42503 lw a0,-36(s0) + 30091a2: 3d65 jal ra,300905a + 30091a4: 87aa mv a5,a0 + 30091a6: fef407a3 sb a5,-17(s0) + } + if (Status == VL53L0X_ERROR_NONE) { + 30091aa: fef40783 lb a5,-17(s0) + 30091ae: ef99 bnez a5,30091cc + Status = sequence_step_enabled(Dev, + 30091b0: fee44703 lbu a4,-18(s0) + VL53L0X_SEQUENCESTEP_PRE_RANGE, SequenceConfig, + &pSchedulerSequenceSteps->PreRangeOn); + 30091b4: fd842783 lw a5,-40(s0) + 30091b8: 078d addi a5,a5,3 + Status = sequence_step_enabled(Dev, + 30091ba: 86be mv a3,a5 + 30091bc: 863a mv a2,a4 + 30091be: 458d li a1,3 + 30091c0: fdc42503 lw a0,-36(s0) + 30091c4: 3d59 jal ra,300905a + 30091c6: 87aa mv a5,a0 + 30091c8: fef407a3 sb a5,-17(s0) + } + if (Status == VL53L0X_ERROR_NONE) { + 30091cc: fef40783 lb a5,-17(s0) + 30091d0: ef99 bnez a5,30091ee + Status = sequence_step_enabled(Dev, + 30091d2: fee44703 lbu a4,-18(s0) + VL53L0X_SEQUENCESTEP_FINAL_RANGE, SequenceConfig, + &pSchedulerSequenceSteps->FinalRangeOn); + 30091d6: fd842783 lw a5,-40(s0) + 30091da: 0791 addi a5,a5,4 + Status = sequence_step_enabled(Dev, + 30091dc: 86be mv a3,a5 + 30091de: 863a mv a2,a4 + 30091e0: 4591 li a1,4 + 30091e2: fdc42503 lw a0,-36(s0) + 30091e6: 3d95 jal ra,300905a + 30091e8: 87aa mv a5,a0 + 30091ea: fef407a3 sb a5,-17(s0) + } + + LOG_FUNCTION_END(Status); + return Status; + 30091ee: fef40783 lb a5,-17(s0) +} + 30091f2: 853e mv a0,a5 + 30091f4: 50b2 lw ra,44(sp) + 30091f6: 5422 lw s0,40(sp) + 30091f8: 6145 addi sp,sp,48 + 30091fa: 8082 ret + +030091fc : + 30091fc: 3e60506f j 300e5e2 + +03009200 : + return Status; +} + +VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, + uint32_t *pInterMeasurementPeriodMilliSeconds) +{ + 3009200: 7179 addi sp,sp,-48 + 3009202: d606 sw ra,44(sp) + 3009204: d422 sw s0,40(sp) + 3009206: 1800 addi s0,sp,48 + 3009208: fca42e23 sw a0,-36(s0) + 300920c: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009210: fe0407a3 sb zero,-17(s0) + uint16_t osc_calibrate_val; + uint32_t IMPeriodMilliSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, + 3009214: fec40793 addi a5,s0,-20 + 3009218: 863e mv a2,a5 + 300921a: 0f800593 li a1,248 + 300921e: fdc42503 lw a0,-36(s0) + 3009222: 2b29 jal ra,300973c + 3009224: 87aa mv a5,a0 + 3009226: fef407a3 sb a5,-17(s0) + &osc_calibrate_val); + + if (Status == VL53L0X_ERROR_NONE) { + 300922a: fef40783 lb a5,-17(s0) + 300922e: ef81 bnez a5,3009246 + Status = VL53L0X_RdDWord(Dev, + 3009230: fe840793 addi a5,s0,-24 + 3009234: 863e mv a2,a5 + 3009236: 4591 li a1,4 + 3009238: fdc42503 lw a0,-36(s0) + 300923c: 452050ef jal ra,300e68e + 3009240: 87aa mv a5,a0 + 3009242: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, + &IMPeriodMilliSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + 3009246: fef40783 lb a5,-17(s0) + 300924a: e39d bnez a5,3009270 + if (osc_calibrate_val != 0) { + 300924c: fec45783 lhu a5,-20(s0) + 3009250: cb91 beqz a5,3009264 + *pInterMeasurementPeriodMilliSeconds = + IMPeriodMilliSeconds / osc_calibrate_val; + 3009252: fe842783 lw a5,-24(s0) + 3009256: fec45703 lhu a4,-20(s0) + 300925a: 02e7d733 divu a4,a5,a4 + *pInterMeasurementPeriodMilliSeconds = + 300925e: fd842783 lw a5,-40(s0) + 3009262: c398 sw a4,0(a5) + } + VL53L0X_SETPARAMETERFIELD(Dev, + 3009264: fd842783 lw a5,-40(s0) + 3009268: 4398 lw a4,0(a5) + 300926a: fdc42783 lw a5,-36(s0) + 300926e: cb98 sw a4,16(a5) + InterMeasurementPeriodMilliSeconds, + *pInterMeasurementPeriodMilliSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; + 3009270: fef40783 lb a5,-17(s0) +} + 3009274: 853e mv a0,a5 + 3009276: 50b2 lw ra,44(sp) + 3009278: 5422 lw s0,40(sp) + 300927a: 6145 addi sp,sp,48 + 300927c: 8082 ret + +0300927e : + return Status; +} + +VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t *pXTalkCompensationEnable) +{ + 300927e: 7179 addi sp,sp,-48 + 3009280: d622 sw s0,44(sp) + 3009282: 1800 addi s0,sp,48 + 3009284: fca42e23 sw a0,-36(s0) + 3009288: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300928c: fe0407a3 sb zero,-17(s0) + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); + 3009290: fdc42783 lw a5,-36(s0) + 3009294: 2bdc lbu a5,20(a5) + 3009296: fef40723 sb a5,-18(s0) + *pXTalkCompensationEnable = Temp8; + 300929a: fd842783 lw a5,-40(s0) + 300929e: fee44703 lbu a4,-18(s0) + 30092a2: a398 sb a4,0(a5) + + LOG_FUNCTION_END(Status); + return Status; + 30092a4: fef40783 lb a5,-17(s0) +} + 30092a8: 853e mv a0,a5 + 30092aa: 5432 lw s0,44(sp) + 30092ac: 6145 addi sp,sp,48 + 30092ae: 8082 ret + +030092b0 : + return Status; +} + +VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + 30092b0: 7179 addi sp,sp,-48 + 30092b2: d606 sw ra,44(sp) + 30092b4: d422 sw s0,40(sp) + 30092b6: 1800 addi s0,sp,48 + 30092b8: fca42e23 sw a0,-36(s0) + 30092bc: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 30092c0: fe0407a3 sb zero,-17(s0) + uint16_t Value; + FixPoint1616_t TempFix1616; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, + 30092c4: fe640793 addi a5,s0,-26 + 30092c8: 863e mv a2,a5 + 30092ca: 02000593 li a1,32 + 30092ce: fdc42503 lw a0,-36(s0) + 30092d2: 21ad jal ra,300973c + 30092d4: 87aa mv a5,a0 + 30092d6: fef407a3 sb a5,-17(s0) + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, (uint16_t *)&Value); + if (Status == VL53L0X_ERROR_NONE) { + 30092da: fef40783 lb a5,-17(s0) + 30092de: e7b1 bnez a5,300932a + if (Value == 0) { + 30092e0: fe645783 lhu a5,-26(s0) + 30092e4: e385 bnez a5,3009304 + /* the Xtalk is disabled return value from memory */ + VL53L0X_GETPARAMETERFIELD(Dev, + 30092e6: fdc42783 lw a5,-36(s0) + 30092ea: 4f9c lw a5,24(a5) + 30092ec: fef42423 sw a5,-24(s0) + XTalkCompensationRateMegaCps, TempFix1616); + *pXTalkCompensationRateMegaCps = TempFix1616; + 30092f0: fd842783 lw a5,-40(s0) + 30092f4: fe842703 lw a4,-24(s0) + 30092f8: c398 sw a4,0(a5) + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 30092fa: fdc42783 lw a5,-36(s0) + 30092fe: 00078a23 sb zero,20(a5) + 3009302: a025 j 300932a + 0); + } else { + TempFix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616(Value); + 3009304: fe645783 lhu a5,-26(s0) + 3009308: 078e slli a5,a5,0x3 + 300930a: fef42423 sw a5,-24(s0) + *pXTalkCompensationRateMegaCps = TempFix1616; + 300930e: fd842783 lw a5,-40(s0) + 3009312: fe842703 lw a4,-24(s0) + 3009316: c398 sw a4,0(a5) + VL53L0X_SETPARAMETERFIELD(Dev, + 3009318: fdc42783 lw a5,-36(s0) + 300931c: fe842703 lw a4,-24(s0) + 3009320: cf98 sw a4,24(a5) + XTalkCompensationRateMegaCps, TempFix1616); + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 3009322: fdc42783 lw a5,-36(s0) + 3009326: 4705 li a4,1 + 3009328: abd8 sb a4,20(a5) + 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; + 300932a: fef40783 lb a5,-17(s0) +} + 300932e: 853e mv a0,a5 + 3009330: 50b2 lw ra,44(sp) + 3009332: 5422 lw s0,40(sp) + 3009334: 6145 addi sp,sp,48 + 3009336: 8082 ret + +03009338 : +} + +VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t LimitCheckEnable) +{ + 3009338: 7179 addi sp,sp,-48 + 300933a: d606 sw ra,44(sp) + 300933c: d422 sw s0,40(sp) + 300933e: 1800 addi s0,sp,48 + 3009340: fca42e23 sw a0,-36(s0) + 3009344: 87ae mv a5,a1 + 3009346: 8732 mv a4,a2 + 3009348: fcf41d23 sh a5,-38(s0) + 300934c: 87ba mv a5,a4 + 300934e: fcf40ca3 sb a5,-39(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009352: fe0407a3 sb zero,-17(s0) + FixPoint1616_t TempFix1616 = 0; + 3009356: fe042423 sw zero,-24(s0) + uint8_t LimitCheckEnableInt = 0; + 300935a: fe0403a3 sb zero,-25(s0) + uint8_t LimitCheckDisable = 0; + 300935e: fe040323 sb zero,-26(s0) + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + 3009362: fda45703 lhu a4,-38(s0) + 3009366: 4795 li a5,5 + 3009368: 00e7f663 bgeu a5,a4,3009374 + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300936c: 57f1 li a5,-4 + 300936e: fef407a3 sb a5,-17(s0) + 3009372: a0fd j 3009460 + } else { + if (LimitCheckEnable == 0) { + 3009374: fd944783 lbu a5,-39(s0) + 3009378: eb89 bnez a5,300938a + TempFix1616 = 0; + 300937a: fe042423 sw zero,-24(s0) + LimitCheckEnableInt = 0; + 300937e: fe0403a3 sb zero,-25(s0) + LimitCheckDisable = 1; + 3009382: 4785 li a5,1 + 3009384: fef40323 sb a5,-26(s0) + 3009388: a005 j 30093a8 + + } else { + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 300938a: fda45783 lhu a5,-38(s0) + 300938e: fdc42703 lw a4,-36(s0) + 3009392: 07a1 addi a5,a5,8 + 3009394: 078a slli a5,a5,0x2 + 3009396: 97ba add a5,a5,a4 + 3009398: 47dc lw a5,12(a5) + 300939a: fef42423 sw a5,-24(s0) + LimitCheckId, TempFix1616); + LimitCheckDisable = 0; + 300939e: fe040323 sb zero,-26(s0) + /* this to be sure to have either 0 or 1 */ + LimitCheckEnableInt = 1; + 30093a2: 4785 li a5,1 + 30093a4: fef403a3 sb a5,-25(s0) + } + + switch (LimitCheckId) { + 30093a8: fda45783 lhu a5,-38(s0) + 30093ac: 4715 li a4,5 + 30093ae: 0af76663 bltu a4,a5,300945a + 30093b2: 00279713 slli a4,a5,0x2 + 30093b6: 0300f7b7 lui a5,0x300f + 30093ba: 44878793 addi a5,a5,1096 # 300f448 + 30093be: 97ba add a5,a5,a4 + 30093c0: 439c lw a5,0(a5) + 30093c2: 8782 jr a5 + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + 30093c4: fdc42783 lw a5,-36(s0) + 30093c8: fe744703 lbu a4,-25(s0) + 30093cc: 02e78023 sb a4,32(a5) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + LimitCheckEnableInt); + + break; + 30093d0: a841 j 3009460 + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97(TempFix1616)); + 30093d2: fe842783 lw a5,-24(s0) + 30093d6: 83a5 srli a5,a5,0x9 + Status = VL53L0X_WrWord(Dev, + 30093d8: 9fa1 uxth a5 + 30093da: 863e mv a2,a5 + 30093dc: 04400593 li a1,68 + 30093e0: fdc42503 lw a0,-36(s0) + 30093e4: 2afd jal ra,30095e2 + 30093e6: 87aa mv a5,a0 + 30093e8: fef407a3 sb a5,-17(s0) + + break; + 30093ec: a895 j 3009460 + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + 30093ee: fdc42783 lw a5,-36(s0) + 30093f2: fe744703 lbu a4,-25(s0) + 30093f6: 02e78123 sb a4,34(a5) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + LimitCheckEnableInt); + + break; + 30093fa: a09d j 3009460 + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + 30093fc: fdc42783 lw a5,-36(s0) + 3009400: fe744703 lbu a4,-25(s0) + 3009404: 02e781a3 sb a4,35(a5) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + LimitCheckEnableInt); + + break; + 3009408: a8a1 j 3009460 + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + + Temp8 = (uint8_t)(LimitCheckDisable << 1); + 300940a: fe644783 lbu a5,-26(s0) + 300940e: 0786 slli a5,a5,0x1 + 3009410: fef402a3 sb a5,-27(s0) + Status = VL53L0X_UpdateByte(Dev, + 3009414: fe544783 lbu a5,-27(s0) + 3009418: 86be mv a3,a5 + 300941a: 0fe00613 li a2,254 + 300941e: 06000593 li a1,96 + 3009422: fdc42503 lw a0,-36(s0) + 3009426: 116050ef jal ra,300e53c + 300942a: 87aa mv a5,a0 + 300942c: fef407a3 sb a5,-17(s0) + VL53L0X_REG_MSRC_CONFIG_CONTROL, + 0xFE, Temp8); + + break; + 3009430: a805 j 3009460 + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + + Temp8 = (uint8_t)(LimitCheckDisable << 4); + 3009432: fe644783 lbu a5,-26(s0) + 3009436: 0792 slli a5,a5,0x4 + 3009438: fef402a3 sb a5,-27(s0) + Status = VL53L0X_UpdateByte(Dev, + 300943c: fe544783 lbu a5,-27(s0) + 3009440: 86be mv a3,a5 + 3009442: 0ef00613 li a2,239 + 3009446: 06000593 li a1,96 + 300944a: fdc42503 lw a0,-36(s0) + 300944e: 0ee050ef jal ra,300e53c + 3009452: 87aa mv a5,a0 + 3009454: fef407a3 sb a5,-17(s0) + VL53L0X_REG_MSRC_CONFIG_CONTROL, + 0xEF, Temp8); + + break; + 3009458: a021 j 3009460 + + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300945a: 57f1 li a5,-4 + 300945c: fef407a3 sb a5,-17(s0) + + } + + } + + if (Status == VL53L0X_ERROR_NONE) { + 3009460: fef40783 lb a5,-17(s0) + 3009464: e785 bnez a5,300948c + if (LimitCheckEnable == 0) { + 3009466: fd944783 lbu a5,-39(s0) + 300946a: eb89 bnez a5,300947c + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + 300946c: fda45783 lhu a5,-38(s0) + 3009470: fdc42703 lw a4,-36(s0) + 3009474: 97ba add a5,a5,a4 + 3009476: 02078023 sb zero,32(a5) + 300947a: a809 j 300948c + LimitCheckId, 0); + } else { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + 300947c: fda45783 lhu a5,-38(s0) + 3009480: fdc42703 lw a4,-36(s0) + 3009484: 97ba add a5,a5,a4 + 3009486: 4705 li a4,1 + 3009488: 02e78023 sb a4,32(a5) + LimitCheckId, 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; + 300948c: fef40783 lb a5,-17(s0) +} + 3009490: 853e mv a0,a5 + 3009492: 50b2 lw ra,44(sp) + 3009494: 5422 lw s0,40(sp) + 3009496: 6145 addi sp,sp,48 + 3009498: 8082 ret + +0300949a : + +VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t *pLimitCheckEnable) +{ + 300949a: 7179 addi sp,sp,-48 + 300949c: d622 sw s0,44(sp) + 300949e: 1800 addi s0,sp,48 + 30094a0: fca42e23 sw a0,-36(s0) + 30094a4: 87ae mv a5,a1 + 30094a6: fcc42a23 sw a2,-44(s0) + 30094aa: fcf41d23 sh a5,-38(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 30094ae: fe0407a3 sb zero,-17(s0) + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + 30094b2: fda45703 lhu a4,-38(s0) + 30094b6: 4795 li a5,5 + 30094b8: 00e7fa63 bgeu a5,a4,30094cc + Status = VL53L0X_ERROR_INVALID_PARAMS; + 30094bc: 57f1 li a5,-4 + 30094be: fef407a3 sb a5,-17(s0) + *pLimitCheckEnable = 0; + 30094c2: fd442783 lw a5,-44(s0) + 30094c6: 00078023 sb zero,0(a5) + 30094ca: a839 j 30094e8 + } else { + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + 30094cc: fda45783 lhu a5,-38(s0) + 30094d0: fdc42703 lw a4,-36(s0) + 30094d4: 97ba add a5,a5,a4 + 30094d6: 0207c783 lbu a5,32(a5) + 30094da: fef40723 sb a5,-18(s0) + LimitCheckId, Temp8); + *pLimitCheckEnable = Temp8; + 30094de: fd442783 lw a5,-44(s0) + 30094e2: fee44703 lbu a4,-18(s0) + 30094e6: a398 sb a4,0(a5) + } + + LOG_FUNCTION_END(Status); + return Status; + 30094e8: fef40783 lb a5,-17(s0) +} + 30094ec: 853e mv a0,a5 + 30094ee: 5432 lw s0,44(sp) + 30094f0: 6145 addi sp,sp,48 + 30094f2: 8082 ret + +030094f4 : + +VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, + FixPoint1616_t LimitCheckValue) +{ + 30094f4: 7179 addi sp,sp,-48 + 30094f6: d606 sw ra,44(sp) + 30094f8: d422 sw s0,40(sp) + 30094fa: 1800 addi s0,sp,48 + 30094fc: fca42e23 sw a0,-36(s0) + 3009500: 87ae mv a5,a1 + 3009502: fcc42a23 sw a2,-44(s0) + 3009506: fcf41d23 sh a5,-38(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300950a: fe0407a3 sb zero,-17(s0) + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, LimitCheckId, + 300950e: fda45783 lhu a5,-38(s0) + 3009512: fdc42703 lw a4,-36(s0) + 3009516: 97ba add a5,a5,a4 + 3009518: 0207c783 lbu a5,32(a5) + 300951c: fef40723 sb a5,-18(s0) + Temp8); + + if (Temp8 == 0) { /* disabled write only internal value */ + 3009520: fee44783 lbu a5,-18(s0) + 3009524: ef81 bnez a5,300953c + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 3009526: fda45783 lhu a5,-38(s0) + 300952a: fdc42703 lw a4,-36(s0) + 300952e: 07a1 addi a5,a5,8 + 3009530: 078a slli a5,a5,0x2 + 3009532: 97ba add a5,a5,a4 + 3009534: fd442703 lw a4,-44(s0) + 3009538: c7d8 sw a4,12(a5) + 300953a: a869 j 30095d4 + LimitCheckId, LimitCheckValue); + } else { + + switch (LimitCheckId) { + 300953c: fda45783 lhu a5,-38(s0) + 3009540: 4715 li a4,5 + 3009542: 06f76963 bltu a4,a5,30095b4 + 3009546: 00279713 slli a4,a5,0x2 + 300954a: 0300f7b7 lui a5,0x300f + 300954e: 46078793 addi a5,a5,1120 # 300f460 + 3009552: 97ba add a5,a5,a4 + 3009554: 439c lw a5,0(a5) + 3009556: 8782 jr a5 + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 3009558: fdc42783 lw a5,-36(s0) + 300955c: fd442703 lw a4,-44(s0) + 3009560: d7d8 sw a4,44(a5) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + LimitCheckValue); + break; + 3009562: a8a1 j 30095ba + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97( + 3009564: fd442783 lw a5,-44(s0) + 3009568: 83a5 srli a5,a5,0x9 + Status = VL53L0X_WrWord(Dev, + 300956a: 9fa1 uxth a5 + 300956c: 863e mv a2,a5 + 300956e: 04400593 li a1,68 + 3009572: fdc42503 lw a0,-36(s0) + 3009576: 20b5 jal ra,30095e2 + 3009578: 87aa mv a5,a0 + 300957a: fef407a3 sb a5,-17(s0) + LimitCheckValue)); + + break; + 300957e: a835 j 30095ba + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 3009580: fdc42783 lw a5,-36(s0) + 3009584: fd442703 lw a4,-44(s0) + 3009588: dbd8 sw a4,52(a5) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + LimitCheckValue); + + break; + 300958a: a805 j 30095ba + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 300958c: fdc42783 lw a5,-36(s0) + 3009590: fd442703 lw a4,-44(s0) + 3009594: df98 sw a4,56(a5) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + LimitCheckValue); + + break; + 3009596: a015 j 30095ba + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97( + 3009598: fd442783 lw a5,-44(s0) + 300959c: 83a5 srli a5,a5,0x9 + Status = VL53L0X_WrWord(Dev, + 300959e: 9fa1 uxth a5 + 30095a0: 863e mv a2,a5 + 30095a2: 06400593 li a1,100 + 30095a6: fdc42503 lw a0,-36(s0) + 30095aa: 2825 jal ra,30095e2 + 30095ac: 87aa mv a5,a0 + 30095ae: fef407a3 sb a5,-17(s0) + LimitCheckValue)); + + break; + 30095b2: a021 j 30095ba + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 30095b4: 57f1 li a5,-4 + 30095b6: fef407a3 sb a5,-17(s0) + + } + + if (Status == VL53L0X_ERROR_NONE) { + 30095ba: fef40783 lb a5,-17(s0) + 30095be: eb99 bnez a5,30095d4 + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 30095c0: fda45783 lhu a5,-38(s0) + 30095c4: fdc42703 lw a4,-36(s0) + 30095c8: 07a1 addi a5,a5,8 + 30095ca: 078a slli a5,a5,0x2 + 30095cc: 97ba add a5,a5,a4 + 30095ce: fd442703 lw a4,-44(s0) + 30095d2: c7d8 sw a4,12(a5) + LimitCheckId, LimitCheckValue); + } + } + + LOG_FUNCTION_END(Status); + return Status; + 30095d4: fef40783 lb a5,-17(s0) +} + 30095d8: 853e mv a0,a5 + 30095da: 50b2 lw ra,44(sp) + 30095dc: 5422 lw s0,40(sp) + 30095de: 6145 addi sp,sp,48 + 30095e0: 8082 ret + +030095e2 : + 30095e2: 6ff0406f j 300e4e0 + +030095e6 : + +VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckValue) +{ + 30095e6: 7179 addi sp,sp,-48 + 30095e8: d606 sw ra,44(sp) + 30095ea: d422 sw s0,40(sp) + 30095ec: 1800 addi s0,sp,48 + 30095ee: fca42e23 sw a0,-36(s0) + 30095f2: 87ae mv a5,a1 + 30095f4: fcc42a23 sw a2,-44(s0) + 30095f8: fcf41d23 sh a5,-38(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 30095fc: fe0407a3 sb zero,-17(s0) + uint8_t EnableZeroValue = 0; + 3009600: fe040723 sb zero,-18(s0) + uint16_t Temp16; + FixPoint1616_t TempFix1616; + + LOG_FUNCTION_START(""); + + switch (LimitCheckId) { + 3009604: fda45783 lhu a5,-38(s0) + 3009608: 4715 li a4,5 + 300960a: 0af76063 bltu a4,a5,30096aa + 300960e: 00279713 slli a4,a5,0x2 + 3009612: 0300f7b7 lui a5,0x300f + 3009616: 47878793 addi a5,a5,1144 # 300f478 + 300961a: 97ba add a5,a5,a4 + 300961c: 439c lw a5,0(a5) + 300961e: 8782 jr a5 + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 3009620: fdc42783 lw a5,-36(s0) + 3009624: 57dc lw a5,44(a5) + 3009626: fef42423 sw a5,-24(s0) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, TempFix1616); + EnableZeroValue = 0; + 300962a: fe040723 sb zero,-18(s0) + break; + 300962e: a049 j 30096b0 + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + Status = VL53L0X_RdWord(Dev, + 3009630: fe640793 addi a5,s0,-26 + 3009634: 863e mv a2,a5 + 3009636: 04400593 li a1,68 + 300963a: fdc42503 lw a0,-36(s0) + 300963e: 28fd jal ra,300973c + 3009640: 87aa mv a5,a0 + 3009642: fef407a3 sb a5,-17(s0) + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + &Temp16); + if (Status == VL53L0X_ERROR_NONE) + 3009646: fef40783 lb a5,-17(s0) + 300964a: e791 bnez a5,3009656 + TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); + 300964c: fe645783 lhu a5,-26(s0) + 3009650: 07a6 slli a5,a5,0x9 + 3009652: fef42423 sw a5,-24(s0) + + + EnableZeroValue = 1; + 3009656: 4785 li a5,1 + 3009658: fef40723 sb a5,-18(s0) + break; + 300965c: a891 j 30096b0 + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 300965e: fdc42783 lw a5,-36(s0) + 3009662: 5bdc lw a5,52(a5) + 3009664: fef42423 sw a5,-24(s0) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, TempFix1616); + EnableZeroValue = 0; + 3009668: fe040723 sb zero,-18(s0) + break; + 300966c: a091 j 30096b0 + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + 300966e: fdc42783 lw a5,-36(s0) + 3009672: 5f9c lw a5,56(a5) + 3009674: fef42423 sw a5,-24(s0) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + TempFix1616); + EnableZeroValue = 0; + 3009678: fe040723 sb zero,-18(s0) + break; + 300967c: a815 j 30096b0 + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + Status = VL53L0X_RdWord(Dev, + 300967e: fe640793 addi a5,s0,-26 + 3009682: 863e mv a2,a5 + 3009684: 06400593 li a1,100 + 3009688: fdc42503 lw a0,-36(s0) + 300968c: 2845 jal ra,300973c + 300968e: 87aa mv a5,a0 + 3009690: fef407a3 sb a5,-17(s0) + VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, + &Temp16); + if (Status == VL53L0X_ERROR_NONE) + 3009694: fef40783 lb a5,-17(s0) + 3009698: e791 bnez a5,30096a4 + TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); + 300969a: fe645783 lhu a5,-26(s0) + 300969e: 07a6 slli a5,a5,0x9 + 30096a0: fef42423 sw a5,-24(s0) + + + EnableZeroValue = 0; + 30096a4: fe040723 sb zero,-18(s0) + break; + 30096a8: a021 j 30096b0 + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 30096aa: 57f1 li a5,-4 + 30096ac: fef407a3 sb a5,-17(s0) + + } + + if (Status == VL53L0X_ERROR_NONE) { + 30096b0: fef40783 lb a5,-17(s0) + 30096b4: efad bnez a5,300972e + + if (EnableZeroValue == 1) { + 30096b6: fee44703 lbu a4,-18(s0) + 30096ba: 4785 li a5,1 + 30096bc: 06f71463 bne a4,a5,3009724 + + if (TempFix1616 == 0) { + 30096c0: fe842783 lw a5,-24(s0) + 30096c4: eb85 bnez a5,30096f4 + /* disabled: return value from memory */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, + 30096c6: fda45783 lhu a5,-38(s0) + 30096ca: fdc42703 lw a4,-36(s0) + 30096ce: 07a1 addi a5,a5,8 + 30096d0: 078a slli a5,a5,0x2 + 30096d2: 97ba add a5,a5,a4 + 30096d4: 47dc lw a5,12(a5) + 30096d6: fef42423 sw a5,-24(s0) + LimitChecksValue, LimitCheckId, + TempFix1616); + *pLimitCheckValue = TempFix1616; + 30096da: fd442783 lw a5,-44(s0) + 30096de: fe842703 lw a4,-24(s0) + 30096e2: c398 sw a4,0(a5) + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + 30096e4: fda45783 lhu a5,-38(s0) + 30096e8: fdc42703 lw a4,-36(s0) + 30096ec: 97ba add a5,a5,a4 + 30096ee: 02078023 sb zero,32(a5) + 30096f2: a835 j 300972e + LimitChecksEnable, LimitCheckId, 0); + } else { + *pLimitCheckValue = TempFix1616; + 30096f4: fd442783 lw a5,-44(s0) + 30096f8: fe842703 lw a4,-24(s0) + 30096fc: c398 sw a4,0(a5) + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + 30096fe: fda45783 lhu a5,-38(s0) + 3009702: fdc42703 lw a4,-36(s0) + 3009706: 07a1 addi a5,a5,8 + 3009708: 078a slli a5,a5,0x2 + 300970a: 97ba add a5,a5,a4 + 300970c: fe842703 lw a4,-24(s0) + 3009710: c7d8 sw a4,12(a5) + LimitChecksValue, LimitCheckId, + TempFix1616); + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + 3009712: fda45783 lhu a5,-38(s0) + 3009716: fdc42703 lw a4,-36(s0) + 300971a: 97ba add a5,a5,a4 + 300971c: 4705 li a4,1 + 300971e: 02e78023 sb a4,32(a5) + 3009722: a031 j 300972e + LimitChecksEnable, LimitCheckId, 1); + } + } else { + *pLimitCheckValue = TempFix1616; + 3009724: fd442783 lw a5,-44(s0) + 3009728: fe842703 lw a4,-24(s0) + 300972c: c398 sw a4,0(a5) + } + } + + LOG_FUNCTION_END(Status); + return Status; + 300972e: fef40783 lb a5,-17(s0) + +} + 3009732: 853e mv a0,a5 + 3009734: 50b2 lw ra,44(sp) + 3009736: 5422 lw s0,40(sp) + 3009738: 6145 addi sp,sp,48 + 300973a: 8082 ret + +0300973c : + 300973c: 6fd0406f j 300e638 + +03009740 : + return Status; +} + +VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t *pWrapAroundCheckEnable) +{ + 3009740: 7179 addi sp,sp,-48 + 3009742: d606 sw ra,44(sp) + 3009744: d422 sw s0,40(sp) + 3009746: 1800 addi s0,sp,48 + 3009748: fca42e23 sw a0,-36(s0) + 300974c: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009750: fe0407a3 sb zero,-17(s0) + uint8_t data; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data); + 3009754: fee40793 addi a5,s0,-18 + 3009758: 863e mv a2,a5 + 300975a: 4585 li a1,1 + 300975c: fdc42503 lw a0,-36(s0) + 3009760: 3c71 jal ra,30091fc + 3009762: 87aa mv a5,a0 + 3009764: fef407a3 sb a5,-17(s0) + if (Status == VL53L0X_ERROR_NONE) { + 3009768: fef40783 lb a5,-17(s0) + 300976c: e795 bnez a5,3009798 + PALDevDataSet(Dev, SequenceConfig, data); + 300976e: fee44703 lbu a4,-18(s0) + 3009772: fdc42783 lw a5,-36(s0) + 3009776: 14e78e23 sb a4,348(a5) + if (data & (0x01 << 7)) + 300977a: fee44783 lbu a5,-18(s0) + 300977e: 07e2 slli a5,a5,0x18 + 3009780: 87e1 srai a5,a5,0x18 + 3009782: 0007d763 bgez a5,3009790 + *pWrapAroundCheckEnable = 0x01; + 3009786: fd842783 lw a5,-40(s0) + 300978a: 4705 li a4,1 + 300978c: a398 sb a4,0(a5) + 300978e: a029 j 3009798 + else + *pWrapAroundCheckEnable = 0x00; + 3009790: fd842783 lw a5,-40(s0) + 3009794: 00078023 sb zero,0(a5) + } + if (Status == VL53L0X_ERROR_NONE) { + 3009798: fef40783 lb a5,-17(s0) + 300979c: eb81 bnez a5,30097ac + VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, + 300979e: fd842783 lw a5,-40(s0) + 30097a2: 2398 lbu a4,0(a5) + 30097a4: fdc42783 lw a5,-36(s0) + 30097a8: 06e78e23 sb a4,124(a5) + *pWrapAroundCheckEnable); + } + + LOG_FUNCTION_END(Status); + return Status; + 30097ac: fef40783 lb a5,-17(s0) +} + 30097b0: 853e mv a0,a5 + 30097b2: 50b2 lw ra,44(sp) + 30097b4: 5422 lw s0,40(sp) + 30097b6: 6145 addi sp,sp,48 + 30097b8: 8082 ret + +030097ba : + +/* End Group PAL Parameters Functions */ + +/* Group PAL Measurement Functions */ +VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev) +{ + 30097ba: 7179 addi sp,sp,-48 + 30097bc: d606 sw ra,44(sp) + 30097be: d422 sw s0,40(sp) + 30097c0: 1800 addi s0,sp,48 + 30097c2: fca42e23 sw a0,-36(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 30097c6: fe0407a3 sb zero,-17(s0) + VL53L0X_DeviceModes DeviceMode; + + LOG_FUNCTION_START(""); + + /* Get Current DeviceMode */ + Status = VL53L0X_GetDeviceMode(Dev, &DeviceMode); + 30097ca: fee40793 addi a5,s0,-18 + 30097ce: 85be mv a1,a5 + 30097d0: fdc42503 lw a0,-36(s0) + 30097d4: de4ff0ef jal ra,3008db8 + 30097d8: 87aa mv a5,a0 + 30097da: fef407a3 sb a5,-17(s0) + + /* Start immediately to run a single ranging measurement in case of + * single ranging or single histogram + */ + if (Status == VL53L0X_ERROR_NONE + 30097de: fef40783 lb a5,-17(s0) + 30097e2: eb91 bnez a5,30097f6 + && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) + 30097e4: fee44783 lbu a5,-18(s0) + 30097e8: e799 bnez a5,30097f6 + Status = VL53L0X_StartMeasurement(Dev); + 30097ea: fdc42503 lw a0,-36(s0) + 30097ee: 2cd1 jal ra,3009ac2 + 30097f0: 87aa mv a5,a0 + 30097f2: fef407a3 sb a5,-17(s0) + + + if (Status == VL53L0X_ERROR_NONE) + 30097f6: fef40783 lb a5,-17(s0) + 30097fa: eb81 bnez a5,300980a + Status = VL53L0X_measurement_poll_for_completion(Dev); + 30097fc: fdc42503 lw a0,-36(s0) + 3009800: 4df010ef jal ra,300b4de + 3009804: 87aa mv a5,a0 + 3009806: fef407a3 sb a5,-17(s0) + + + /* Change PAL State in case of single ranging or single histogram */ + if (Status == VL53L0X_ERROR_NONE + 300980a: fef40783 lb a5,-17(s0) + 300980e: eb89 bnez a5,3009820 + && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) + 3009810: fee44783 lbu a5,-18(s0) + 3009814: e791 bnez a5,3009820 + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + 3009816: fdc42783 lw a5,-36(s0) + 300981a: 470d li a4,3 + 300981c: 14e78f23 sb a4,350(a5) + + + LOG_FUNCTION_END(Status); + return Status; + 3009820: fef40783 lb a5,-17(s0) +} + 3009824: 853e mv a0,a5 + 3009826: 50b2 lw ra,44(sp) + 3009828: 5422 lw s0,40(sp) + 300982a: 6145 addi sp,sp,48 + 300982c: 8082 ret + +0300982e : +} + +VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, + uint8_t *pPhaseCal) +{ + 300982e: 7179 addi sp,sp,-48 + 3009830: d606 sw ra,44(sp) + 3009832: d422 sw s0,40(sp) + 3009834: 1800 addi s0,sp,48 + 3009836: fca42e23 sw a0,-36(s0) + 300983a: fcb42c23 sw a1,-40(s0) + 300983e: fcc42a23 sw a2,-44(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009842: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_ref_calibration(Dev, pVhvSettings, + 3009846: 4685 li a3,1 + 3009848: fd442603 lw a2,-44(s0) + 300984c: fd842583 lw a1,-40(s0) + 3009850: fdc42503 lw a0,-36(s0) + 3009854: 3ed010ef jal ra,300b440 + 3009858: 87aa mv a5,a0 + 300985a: fef407a3 sb a5,-17(s0) + pPhaseCal, 1); + + LOG_FUNCTION_END(Status); + return Status; + 300985e: fef40783 lb a5,-17(s0) +} + 3009862: 853e mv a0,a5 + 3009864: 50b2 lw ra,44(sp) + 3009866: 5422 lw s0,40(sp) + 3009868: 6145 addi sp,sp,48 + 300986a: 8082 ret + +0300986c : + return Status; +} + +VL53L0X_Error VL53L0X_CheckAndLoadInterruptSettings(VL53L0X_DEV Dev, + uint8_t StartNotStopFlag) +{ + 300986c: 7179 addi sp,sp,-48 + 300986e: d606 sw ra,44(sp) + 3009870: d422 sw s0,40(sp) + 3009872: 1800 addi s0,sp,48 + 3009874: fca42e23 sw a0,-36(s0) + 3009878: 87ae mv a5,a1 + 300987a: fcf40da3 sb a5,-37(s0) + uint8_t InterruptConfig; + FixPoint1616_t ThresholdLow; + FixPoint1616_t ThresholdHigh; + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300987e: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + 3009882: fdc42783 lw a5,-36(s0) + 3009886: 1067c783 lbu a5,262(a5) + 300988a: fef40723 sb a5,-18(s0) + Pin0GpioFunctionality); + + switch (InterruptConfig) { + 300988e: fee44783 lbu a5,-18(s0) + 3009892: 4709 li a4,2 + 3009894: 0ce78063 beq a5,a4,3009954 + 3009898: 470d li a4,3 + 300989a: 16e78363 beq a5,a4,3009a00 + 300989e: 4705 li a4,1 + 30098a0: 20e79663 bne a5,a4,3009aac + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: + Status = VL53L0X_GetInterruptThresholds(Dev, + 30098a4: fe440713 addi a4,s0,-28 + 30098a8: fe840793 addi a5,s0,-24 + 30098ac: 86ba mv a3,a4 + 30098ae: 863e mv a2,a5 + 30098b0: 4585 li a1,1 + 30098b2: fdc42503 lw a0,-36(s0) + 30098b6: 2411 jal ra,3009aba + 30098b8: 87aa mv a5,a0 + 30098ba: fef407a3 sb a5,-17(s0) + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if ((ThresholdLow > 255*65536) && + 30098be: fe842703 lw a4,-24(s0) + 30098c2: 00ff07b7 lui a5,0xff0 + 30098c6: 1ce7fe63 bgeu a5,a4,3009aa2 + 30098ca: fef40783 lb a5,-17(s0) + 30098ce: 1c079a63 bnez a5,3009aa2 + (Status == VL53L0X_ERROR_NONE)) { + + if (StartNotStopFlag != 0) { + 30098d2: fdb44783 lbu a5,-37(s0) + 30098d6: cb91 beqz a5,30098ea + Status = VL53L0X_load_tuning_settings(Dev, + 30098d8: bcc18593 addi a1,gp,-1076 # 4000200 + 30098dc: fdc42503 lw a0,-36(s0) + 30098e0: 2af9 jal ra,3009abe + 30098e2: 87aa mv a5,a0 + 30098e4: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + 30098e8: aa6d j 3009aa2 + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + 30098ea: 4611 li a2,4 + 30098ec: 0ff00593 li a1,255 + 30098f0: fdc42503 lw a0,-36(s0) + 30098f4: 2e59 jal ra,3009c8a + 30098f6: 87aa mv a5,a0 + 30098f8: 873e mv a4,a5 + 30098fa: fef44783 lbu a5,-17(s0) + 30098fe: 8fd9 or a5,a5,a4 + 3009900: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + 3009904: 4601 li a2,0 + 3009906: 07000593 li a1,112 + 300990a: fdc42503 lw a0,-36(s0) + 300990e: 2eb5 jal ra,3009c8a + 3009910: 87aa mv a5,a0 + 3009912: 873e mv a4,a5 + 3009914: fef44783 lbu a5,-17(s0) + 3009918: 8fd9 or a5,a5,a4 + 300991a: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300991e: 4601 li a2,0 + 3009920: 0ff00593 li a1,255 + 3009924: fdc42503 lw a0,-36(s0) + 3009928: 268d jal ra,3009c8a + 300992a: 87aa mv a5,a0 + 300992c: 873e mv a4,a5 + 300992e: fef44783 lbu a5,-17(s0) + 3009932: 8fd9 or a5,a5,a4 + 3009934: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + 3009938: 4601 li a2,0 + 300993a: 08000593 li a1,128 + 300993e: fdc42503 lw a0,-36(s0) + 3009942: 26a1 jal ra,3009c8a + 3009944: 87aa mv a5,a0 + 3009946: 873e mv a4,a5 + 3009948: fef44783 lbu a5,-17(s0) + 300994c: 8fd9 or a5,a5,a4 + 300994e: fef407a3 sb a5,-17(s0) + break; + 3009952: aa81 j 3009aa2 + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: + Status = VL53L0X_GetInterruptThresholds(Dev, + 3009954: fe440713 addi a4,s0,-28 + 3009958: fe840793 addi a5,s0,-24 + 300995c: 86ba mv a3,a4 + 300995e: 863e mv a2,a5 + 3009960: 4585 li a1,1 + 3009962: fdc42503 lw a0,-36(s0) + 3009966: 2a91 jal ra,3009aba + 3009968: 87aa mv a5,a0 + 300996a: fef407a3 sb a5,-17(s0) + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if ((ThresholdHigh > 0) && + 300996e: fe442783 lw a5,-28(s0) + 3009972: 12078a63 beqz a5,3009aa6 + 3009976: fef40783 lb a5,-17(s0) + 300997a: 12079663 bnez a5,3009aa6 + (Status == VL53L0X_ERROR_NONE)) { + + if (StartNotStopFlag != 0) { + 300997e: fdb44783 lbu a5,-37(s0) + 3009982: cb91 beqz a5,3009996 + Status = VL53L0X_load_tuning_settings(Dev, + 3009984: bcc18593 addi a1,gp,-1076 # 4000200 + 3009988: fdc42503 lw a0,-36(s0) + 300998c: 2a0d jal ra,3009abe + 300998e: 87aa mv a5,a0 + 3009990: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + 3009994: aa09 j 3009aa6 + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + 3009996: 4611 li a2,4 + 3009998: 0ff00593 li a1,255 + 300999c: fdc42503 lw a0,-36(s0) + 30099a0: 24ed jal ra,3009c8a + 30099a2: 87aa mv a5,a0 + 30099a4: 873e mv a4,a5 + 30099a6: fef44783 lbu a5,-17(s0) + 30099aa: 8fd9 or a5,a5,a4 + 30099ac: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + 30099b0: 4601 li a2,0 + 30099b2: 07000593 li a1,112 + 30099b6: fdc42503 lw a0,-36(s0) + 30099ba: 2cc1 jal ra,3009c8a + 30099bc: 87aa mv a5,a0 + 30099be: 873e mv a4,a5 + 30099c0: fef44783 lbu a5,-17(s0) + 30099c4: 8fd9 or a5,a5,a4 + 30099c6: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 30099ca: 4601 li a2,0 + 30099cc: 0ff00593 li a1,255 + 30099d0: fdc42503 lw a0,-36(s0) + 30099d4: 2c5d jal ra,3009c8a + 30099d6: 87aa mv a5,a0 + 30099d8: 873e mv a4,a5 + 30099da: fef44783 lbu a5,-17(s0) + 30099de: 8fd9 or a5,a5,a4 + 30099e0: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + 30099e4: 4601 li a2,0 + 30099e6: 08000593 li a1,128 + 30099ea: fdc42503 lw a0,-36(s0) + 30099ee: 2c71 jal ra,3009c8a + 30099f0: 87aa mv a5,a0 + 30099f2: 873e mv a4,a5 + 30099f4: fef44783 lbu a5,-17(s0) + 30099f8: 8fd9 or a5,a5,a4 + 30099fa: fef407a3 sb a5,-17(s0) + break; + 30099fe: a065 j 3009aa6 + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: + Status = VL53L0X_GetInterruptThresholds(Dev, + 3009a00: fe440713 addi a4,s0,-28 + 3009a04: fe840793 addi a5,s0,-24 + 3009a08: 86ba mv a3,a4 + 3009a0a: 863e mv a2,a5 + 3009a0c: 4585 li a1,1 + 3009a0e: fdc42503 lw a0,-36(s0) + 3009a12: 2065 jal ra,3009aba + 3009a14: 87aa mv a5,a0 + 3009a16: fef407a3 sb a5,-17(s0) + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if (Status == VL53L0X_ERROR_NONE) { + 3009a1a: fef40783 lb a5,-17(s0) + 3009a1e: e7d1 bnez a5,3009aaa + if (StartNotStopFlag != 0) { + 3009a20: fdb44783 lbu a5,-37(s0) + 3009a24: cb91 beqz a5,3009a38 + Status = VL53L0X_load_tuning_settings(Dev, + 3009a26: bcc18593 addi a1,gp,-1076 # 4000200 + 3009a2a: fdc42503 lw a0,-36(s0) + 3009a2e: 2841 jal ra,3009abe + 3009a30: 87aa mv a5,a0 + 3009a32: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + 3009a36: a895 j 3009aaa + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + 3009a38: 4611 li a2,4 + 3009a3a: 0ff00593 li a1,255 + 3009a3e: fdc42503 lw a0,-36(s0) + 3009a42: 24a1 jal ra,3009c8a + 3009a44: 87aa mv a5,a0 + 3009a46: 873e mv a4,a5 + 3009a48: fef44783 lbu a5,-17(s0) + 3009a4c: 8fd9 or a5,a5,a4 + 3009a4e: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + 3009a52: 4601 li a2,0 + 3009a54: 07000593 li a1,112 + 3009a58: fdc42503 lw a0,-36(s0) + 3009a5c: 243d jal ra,3009c8a + 3009a5e: 87aa mv a5,a0 + 3009a60: 873e mv a4,a5 + 3009a62: fef44783 lbu a5,-17(s0) + 3009a66: 8fd9 or a5,a5,a4 + 3009a68: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 3009a6c: 4601 li a2,0 + 3009a6e: 0ff00593 li a1,255 + 3009a72: fdc42503 lw a0,-36(s0) + 3009a76: 2c11 jal ra,3009c8a + 3009a78: 87aa mv a5,a0 + 3009a7a: 873e mv a4,a5 + 3009a7c: fef44783 lbu a5,-17(s0) + 3009a80: 8fd9 or a5,a5,a4 + 3009a82: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + 3009a86: 4601 li a2,0 + 3009a88: 08000593 li a1,128 + 3009a8c: fdc42503 lw a0,-36(s0) + 3009a90: 2aed jal ra,3009c8a + 3009a92: 87aa mv a5,a0 + 3009a94: 873e mv a4,a5 + 3009a96: fef44783 lbu a5,-17(s0) + 3009a9a: 8fd9 or a5,a5,a4 + 3009a9c: fef407a3 sb a5,-17(s0) + break; + 3009aa0: a029 j 3009aaa + break; + 3009aa2: 0001 nop + 3009aa4: a021 j 3009aac + break; + 3009aa6: 0001 nop + 3009aa8: a011 j 3009aac + break; + 3009aaa: 0001 nop + } + + LOG_FUNCTION_END(Status); + return Status; + 3009aac: fef40783 lb a5,-17(s0) +} + 3009ab0: 853e mv a0,a5 + 3009ab2: 50b2 lw ra,44(sp) + 3009ab4: 5422 lw s0,40(sp) + 3009ab6: 6145 addi sp,sp,48 + 3009ab8: 8082 ret + +03009aba : + 3009aba: 0ab0006f j 300a364 + +03009abe : + 3009abe: 1540306f j 300cc12 + +03009ac2 : + + +VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev) +{ + 3009ac2: 7179 addi sp,sp,-48 + 3009ac4: d606 sw ra,44(sp) + 3009ac6: d422 sw s0,40(sp) + 3009ac8: 1800 addi s0,sp,48 + 3009aca: fca42e23 sw a0,-36(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009ace: fe0407a3 sb zero,-17(s0) + VL53L0X_DeviceModes DeviceMode; + uint8_t Byte; + uint8_t StartStopByte = VL53L0X_REG_SYSRANGE_MODE_START_STOP; + 3009ad2: 4785 li a5,1 + 3009ad4: fef403a3 sb a5,-25(s0) + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + /* Get Current DeviceMode */ + VL53L0X_GetDeviceMode(Dev, &DeviceMode); + 3009ad8: fe640793 addi a5,s0,-26 + 3009adc: 85be mv a1,a5 + 3009ade: fdc42503 lw a0,-36(s0) + 3009ae2: ad6ff0ef jal ra,3008db8 + + Status = VL53L0X_WrByte(Dev, 0x80, 0x01); + 3009ae6: 4605 li a2,1 + 3009ae8: 08000593 li a1,128 + 3009aec: fdc42503 lw a0,-36(s0) + 3009af0: 2a69 jal ra,3009c8a + 3009af2: 87aa mv a5,a0 + 3009af4: fef407a3 sb a5,-17(s0) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + 3009af8: 4605 li a2,1 + 3009afa: 0ff00593 li a1,255 + 3009afe: fdc42503 lw a0,-36(s0) + 3009b02: 2261 jal ra,3009c8a + 3009b04: 87aa mv a5,a0 + 3009b06: fef407a3 sb a5,-17(s0) + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + 3009b0a: 4601 li a2,0 + 3009b0c: 4581 li a1,0 + 3009b0e: fdc42503 lw a0,-36(s0) + 3009b12: 2aa5 jal ra,3009c8a + 3009b14: 87aa mv a5,a0 + 3009b16: fef407a3 sb a5,-17(s0) + Status = VL53L0X_WrByte(Dev, 0x91, PALDevDataGet(Dev, StopVariable)); + 3009b1a: fdc42783 lw a5,-36(s0) + 3009b1e: 1667c783 lbu a5,358(a5) # ff0166 + 3009b22: 863e mv a2,a5 + 3009b24: 09100593 li a1,145 + 3009b28: fdc42503 lw a0,-36(s0) + 3009b2c: 2ab9 jal ra,3009c8a + 3009b2e: 87aa mv a5,a0 + 3009b30: fef407a3 sb a5,-17(s0) + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + 3009b34: 4605 li a2,1 + 3009b36: 4581 li a1,0 + 3009b38: fdc42503 lw a0,-36(s0) + 3009b3c: 22b9 jal ra,3009c8a + 3009b3e: 87aa mv a5,a0 + 3009b40: fef407a3 sb a5,-17(s0) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + 3009b44: 4601 li a2,0 + 3009b46: 0ff00593 li a1,255 + 3009b4a: fdc42503 lw a0,-36(s0) + 3009b4e: 2a35 jal ra,3009c8a + 3009b50: 87aa mv a5,a0 + 3009b52: fef407a3 sb a5,-17(s0) + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + 3009b56: 4601 li a2,0 + 3009b58: 08000593 li a1,128 + 3009b5c: fdc42503 lw a0,-36(s0) + 3009b60: 222d jal ra,3009c8a + 3009b62: 87aa mv a5,a0 + 3009b64: fef407a3 sb a5,-17(s0) + + switch (DeviceMode) { + 3009b68: fe644783 lbu a5,-26(s0) + 3009b6c: 4705 li a4,1 + 3009b6e: 08e78863 beq a5,a4,3009bfe + 3009b72: 470d li a4,3 + 3009b74: 0ce78063 beq a5,a4,3009c34 + 3009b78: 0e079963 bnez a5,3009c6a + case VL53L0X_DEVICEMODE_SINGLE_RANGING: + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x01); + 3009b7c: 4605 li a2,1 + 3009b7e: 4581 li a1,0 + 3009b80: fdc42503 lw a0,-36(s0) + 3009b84: 2219 jal ra,3009c8a + 3009b86: 87aa mv a5,a0 + 3009b88: fef407a3 sb a5,-17(s0) + + Byte = StartStopByte; + 3009b8c: fe744783 lbu a5,-25(s0) + 3009b90: fef402a3 sb a5,-27(s0) + if (Status == VL53L0X_ERROR_NONE) { + 3009b94: fef40783 lb a5,-17(s0) + 3009b98: efe9 bnez a5,3009c72 + /* Wait until start bit has been cleared */ + LoopNb = 0; + 3009b9a: fe042423 sw zero,-24(s0) + do { + if (LoopNb > 0) + 3009b9e: fe842783 lw a5,-24(s0) + 3009ba2: cf81 beqz a5,3009bba + Status = VL53L0X_RdByte(Dev, + 3009ba4: fe540793 addi a5,s0,-27 + 3009ba8: 863e mv a2,a5 + 3009baa: 4581 li a1,0 + 3009bac: fdc42503 lw a0,-36(s0) + 3009bb0: 233040ef jal ra,300e5e2 + 3009bb4: 87aa mv a5,a0 + 3009bb6: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSRANGE_START, &Byte); + LoopNb = LoopNb + 1; + 3009bba: fe842783 lw a5,-24(s0) + 3009bbe: 0785 addi a5,a5,1 + 3009bc0: fef42423 sw a5,-24(s0) + } while (((Byte & StartStopByte) == StartStopByte) + 3009bc4: fe544703 lbu a4,-27(s0) + 3009bc8: fe744783 lbu a5,-25(s0) + 3009bcc: 8ff9 and a5,a5,a4 + 3009bce: 9f81 uxtb a5 + && (Status == VL53L0X_ERROR_NONE) + && (LoopNb < VL53L0X_DEFAULT_MAX_LOOP)); + 3009bd0: fe744703 lbu a4,-25(s0) + 3009bd4: 00f71b63 bne a4,a5,3009bea + && (Status == VL53L0X_ERROR_NONE) + 3009bd8: fef40783 lb a5,-17(s0) + 3009bdc: e799 bnez a5,3009bea + && (LoopNb < VL53L0X_DEFAULT_MAX_LOOP)); + 3009bde: fe842703 lw a4,-24(s0) + 3009be2: 7cf00793 li a5,1999 + 3009be6: fae7fce3 bgeu a5,a4,3009b9e + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) + 3009bea: fe842703 lw a4,-24(s0) + 3009bee: 7cf00793 li a5,1999 + 3009bf2: 08e7f063 bgeu a5,a4,3009c72 + Status = VL53L0X_ERROR_TIME_OUT; + 3009bf6: 57e5 li a5,-7 + 3009bf8: fef407a3 sb a5,-17(s0) + + } + + break; + 3009bfc: a89d j 3009c72 + case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: + /* Back-to-back mode */ + + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + 3009bfe: fef40783 lb a5,-17(s0) + 3009c02: eb81 bnez a5,3009c12 + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); + 3009c04: 4585 li a1,1 + 3009c06: fdc42503 lw a0,-36(s0) + 3009c0a: 318d jal ra,300986c + 3009c0c: 87aa mv a5,a0 + 3009c0e: fef407a3 sb a5,-17(s0) + + Status = VL53L0X_WrByte(Dev, + 3009c12: 4609 li a2,2 + 3009c14: 4581 li a1,0 + 3009c16: fdc42503 lw a0,-36(s0) + 3009c1a: 2885 jal ra,3009c8a + 3009c1c: 87aa mv a5,a0 + 3009c1e: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK); + if (Status == VL53L0X_ERROR_NONE) { + 3009c22: fef40783 lb a5,-17(s0) + 3009c26: eba1 bnez a5,3009c76 + /* Set PAL State to Running */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); + 3009c28: fdc42783 lw a5,-36(s0) + 3009c2c: 4711 li a4,4 + 3009c2e: 14e78f23 sb a4,350(a5) + } + break; + 3009c32: a091 j 3009c76 + case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: + /* Continuous mode */ + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + 3009c34: fef40783 lb a5,-17(s0) + 3009c38: eb81 bnez a5,3009c48 + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); + 3009c3a: 4585 li a1,1 + 3009c3c: fdc42503 lw a0,-36(s0) + 3009c40: 3135 jal ra,300986c + 3009c42: 87aa mv a5,a0 + 3009c44: fef407a3 sb a5,-17(s0) + + Status = VL53L0X_WrByte(Dev, + 3009c48: 4611 li a2,4 + 3009c4a: 4581 li a1,0 + 3009c4c: fdc42503 lw a0,-36(s0) + 3009c50: 282d jal ra,3009c8a + 3009c52: 87aa mv a5,a0 + 3009c54: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_TIMED); + + if (Status == VL53L0X_ERROR_NONE) { + 3009c58: fef40783 lb a5,-17(s0) + 3009c5c: ef99 bnez a5,3009c7a + /* Set PAL State to Running */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); + 3009c5e: fdc42783 lw a5,-36(s0) + 3009c62: 4711 li a4,4 + 3009c64: 14e78f23 sb a4,350(a5) + } + break; + 3009c68: a809 j 3009c7a + default: + /* Selected mode not supported */ + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + 3009c6a: 57e1 li a5,-8 + 3009c6c: fef407a3 sb a5,-17(s0) + 3009c70: a031 j 3009c7c + break; + 3009c72: 0001 nop + 3009c74: a021 j 3009c7c + break; + 3009c76: 0001 nop + 3009c78: a011 j 3009c7c + break; + 3009c7a: 0001 nop + } + + + LOG_FUNCTION_END(Status); + return Status; + 3009c7c: fef40783 lb a5,-17(s0) +} + 3009c80: 853e mv a0,a5 + 3009c82: 50b2 lw ra,44(sp) + 3009c84: 5422 lw s0,40(sp) + 3009c86: 6145 addi sp,sp,48 + 3009c88: 8082 ret + +03009c8a : + 3009c8a: 7fa0406f j 300e484 + +03009c8e : + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, + uint8_t *pMeasurementDataReady) +{ + 3009c8e: 7179 addi sp,sp,-48 + 3009c90: d606 sw ra,44(sp) + 3009c92: d422 sw s0,40(sp) + 3009c94: 1800 addi s0,sp,48 + 3009c96: fca42e23 sw a0,-36(s0) + 3009c9a: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009c9e: fe0407a3 sb zero,-17(s0) + uint8_t InterruptConfig; + uint32_t InterruptMask; + + LOG_FUNCTION_START(""); + + InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + 3009ca2: fdc42783 lw a5,-36(s0) + 3009ca6: 1067c783 lbu a5,262(a5) + 3009caa: fef40723 sb a5,-18(s0) + Pin0GpioFunctionality); + + if (InterruptConfig == + 3009cae: fee44703 lbu a4,-18(s0) + 3009cb2: 4791 li a5,4 + 3009cb4: 02f71b63 bne a4,a5,3009cea + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) { + Status = VL53L0X_GetInterruptMaskStatus(Dev, &InterruptMask); + 3009cb8: fe840793 addi a5,s0,-24 + 3009cbc: 85be mv a1,a5 + 3009cbe: fdc42503 lw a0,-36(s0) + 3009cc2: 7c2000ef jal ra,300a484 + 3009cc6: 87aa mv a5,a0 + 3009cc8: fef407a3 sb a5,-17(s0) + if (InterruptMask == + 3009ccc: fe842703 lw a4,-24(s0) + 3009cd0: 4791 li a5,4 + 3009cd2: 00f71763 bne a4,a5,3009ce0 + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) + *pMeasurementDataReady = 1; + 3009cd6: fd842783 lw a5,-40(s0) + 3009cda: 4705 li a4,1 + 3009cdc: a398 sb a4,0(a5) + 3009cde: a089 j 3009d20 + else + *pMeasurementDataReady = 0; + 3009ce0: fd842783 lw a5,-40(s0) + 3009ce4: 00078023 sb zero,0(a5) + 3009ce8: a825 j 3009d20 + } else { + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, + 3009cea: fed40793 addi a5,s0,-19 + 3009cee: 863e mv a2,a5 + 3009cf0: 45d1 li a1,20 + 3009cf2: fdc42503 lw a0,-36(s0) + 3009cf6: 0ed040ef jal ra,300e5e2 + 3009cfa: 87aa mv a5,a0 + 3009cfc: fef407a3 sb a5,-17(s0) + &SysRangeStatusRegister); + if (Status == VL53L0X_ERROR_NONE) { + 3009d00: fef40783 lb a5,-17(s0) + 3009d04: ef91 bnez a5,3009d20 + if (SysRangeStatusRegister & 0x01) + 3009d06: fed44783 lbu a5,-19(s0) + 3009d0a: 8b85 andi a5,a5,1 + 3009d0c: c791 beqz a5,3009d18 + *pMeasurementDataReady = 1; + 3009d0e: fd842783 lw a5,-40(s0) + 3009d12: 4705 li a4,1 + 3009d14: a398 sb a4,0(a5) + 3009d16: a029 j 3009d20 + else + *pMeasurementDataReady = 0; + 3009d18: fd842783 lw a5,-40(s0) + 3009d1c: 00078023 sb zero,0(a5) + } + } + + LOG_FUNCTION_END(Status); + return Status; + 3009d20: fef40783 lb a5,-17(s0) +} + 3009d24: 853e mv a0,a5 + 3009d26: 50b2 lw ra,44(sp) + 3009d28: 5422 lw s0,40(sp) + 3009d2a: 6145 addi sp,sp,48 + 3009d2c: 8082 ret + +03009d2e : +} + + +VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) +{ + 3009d2e: 7159 addi sp,sp,-112 + 3009d30: d686 sw ra,108(sp) + 3009d32: d4a2 sw s0,104(sp) + 3009d34: 1880 addi s0,sp,112 + 3009d36: f8a42e23 sw a0,-100(s0) + 3009d3a: f8b42c23 sw a1,-104(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 3009d3e: fe0407a3 sb zero,-17(s0) + * use multi read even if some registers are not useful, result will + * be more efficient + * start reading at 0x14 dec20 + * end reading at 0x21 dec33 total 14 bytes to read + */ + Status = VL53L0X_ReadMulti(Dev, 0x14, localBuffer, 12); + 3009d42: fc840793 addi a5,s0,-56 + 3009d46: 46b1 li a3,12 + 3009d48: 863e mv a2,a5 + 3009d4a: 45d1 li a1,20 + 3009d4c: f9c42503 lw a0,-100(s0) + 3009d50: 6c4040ef jal ra,300e414 + 3009d54: 87aa mv a5,a0 + 3009d56: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) { + 3009d5a: fef40783 lb a5,-17(s0) + 3009d5e: 1e079663 bnez a5,3009f4a + + pRangingMeasurementData->ZoneId = 0; /* Only one zone */ + 3009d62: f9842783 lw a5,-104(s0) + 3009d66: 00078b23 sb zero,22(a5) + pRangingMeasurementData->TimeStamp = 0; /* Not Implemented */ + 3009d6a: f9842783 lw a5,-104(s0) + 3009d6e: 0007a023 sw zero,0(a5) + + tmpuint16 = VL53L0X_MAKEUINT16(localBuffer[11], + 3009d72: fd244783 lbu a5,-46(s0) + 3009d76: 9fa1 uxth a5 + 3009d78: 07a2 slli a5,a5,0x8 + 3009d7a: 01079713 slli a4,a5,0x10 + 3009d7e: 8341 srli a4,a4,0x10 + 3009d80: fd344783 lbu a5,-45(s0) + 3009d84: 9fa1 uxth a5 + 3009d86: 97ba add a5,a5,a4 + 3009d88: fef41623 sh a5,-20(s0) + localBuffer[10]); + /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional + *(format 11.2) else no fractional + */ + + pRangingMeasurementData->MeasurementTimeUsec = 0; + 3009d8c: f9842783 lw a5,-104(s0) + 3009d90: 0007a223 sw zero,4(a5) + + + SignalRate = VL53L0X_FIXPOINT97TOFIXPOINT1616( + 3009d94: fce44783 lbu a5,-50(s0) + 3009d98: 9fa1 uxth a5 + 3009d9a: 07a2 slli a5,a5,0x8 + 3009d9c: 01079713 slli a4,a5,0x10 + 3009da0: 8341 srli a4,a4,0x10 + 3009da2: fcf44783 lbu a5,-49(s0) + 3009da6: 9fa1 uxth a5 + 3009da8: 97ba add a5,a5,a4 + 3009daa: 9fa1 uxth a5 + 3009dac: 07a6 slli a5,a5,0x9 + 3009dae: fef42223 sw a5,-28(s0) + VL53L0X_MAKEUINT16(localBuffer[7], localBuffer[6])); + /* peak_signal_count_rate_rtn_mcps */ + pRangingMeasurementData->SignalRateRtnMegaCps = SignalRate; + 3009db2: f9842783 lw a5,-104(s0) + 3009db6: fe442703 lw a4,-28(s0) + 3009dba: c7d8 sw a4,12(a5) + + AmbientRate = VL53L0X_MAKEUINT16(localBuffer[9], + 3009dbc: fd044783 lbu a5,-48(s0) + 3009dc0: 9fa1 uxth a5 + 3009dc2: 07a2 slli a5,a5,0x8 + 3009dc4: 01079713 slli a4,a5,0x10 + 3009dc8: 8341 srli a4,a4,0x10 + 3009dca: fd144783 lbu a5,-47(s0) + 3009dce: 9fa1 uxth a5 + 3009dd0: 97ba add a5,a5,a4 + 3009dd2: fef41123 sh a5,-30(s0) + localBuffer[8]); + pRangingMeasurementData->AmbientRateRtnMegaCps = + VL53L0X_FIXPOINT97TOFIXPOINT1616(AmbientRate); + 3009dd6: fe245783 lhu a5,-30(s0) + 3009dda: 07a6 slli a5,a5,0x9 + 3009ddc: 873e mv a4,a5 + pRangingMeasurementData->AmbientRateRtnMegaCps = + 3009dde: f9842783 lw a5,-104(s0) + 3009de2: cb98 sw a4,16(a5) + + EffectiveSpadRtnCount = VL53L0X_MAKEUINT16(localBuffer[3], + 3009de4: fca44783 lbu a5,-54(s0) + 3009de8: 9fa1 uxth a5 + 3009dea: 07a2 slli a5,a5,0x8 + 3009dec: 01079713 slli a4,a5,0x10 + 3009df0: 8341 srli a4,a4,0x10 + 3009df2: fcb44783 lbu a5,-53(s0) + 3009df6: 9fa1 uxth a5 + 3009df8: 97ba add a5,a5,a4 + 3009dfa: fef41023 sh a5,-32(s0) + localBuffer[2]); + /* EffectiveSpadRtnCount is 8.8 format */ + pRangingMeasurementData->EffectiveSpadRtnCount = + 3009dfe: f9842783 lw a5,-104(s0) + 3009e02: fe045703 lhu a4,-32(s0) + 3009e06: abda sh a4,20(a5) + EffectiveSpadRtnCount; + + DeviceRangeStatus = localBuffer[0]; + 3009e08: fc844783 lbu a5,-56(s0) + 3009e0c: fcf40fa3 sb a5,-33(s0) + + /* Get Linearity Corrective Gain */ + LinearityCorrectiveGain = PALDevDataGet(Dev, + 3009e10: f9c42783 lw a5,-100(s0) + 3009e14: 17e7d783 lhu a5,382(a5) + 3009e18: fcf41e23 sh a5,-36(s0) + LinearityCorrectiveGain); + + /* Get ranging configuration */ + RangeFractionalEnable = PALDevDataGet(Dev, + 3009e1c: f9c42783 lw a5,-100(s0) + 3009e20: 15d7c783 lbu a5,349(a5) + 3009e24: fcf40da3 sb a5,-37(s0) + RangeFractionalEnable); + + if (LinearityCorrectiveGain != 1000) { + 3009e28: fdc45703 lhu a4,-36(s0) + 3009e2c: 3e800793 li a5,1000 + 3009e30: 0af70163 beq a4,a5,3009ed2 + + tmpuint16 = (uint16_t)((LinearityCorrectiveGain + * tmpuint16 + 500) / 1000); + 3009e34: fdc45703 lhu a4,-36(s0) + 3009e38: fec45783 lhu a5,-20(s0) + 3009e3c: 02f707b3 mul a5,a4,a5 + 3009e40: 1f478713 addi a4,a5,500 + 3009e44: 3e800793 li a5,1000 + 3009e48: 02f747b3 div a5,a4,a5 + tmpuint16 = (uint16_t)((LinearityCorrectiveGain + 3009e4c: fef41623 sh a5,-20(s0) + + /* Implement Xtalk */ + VL53L0X_GETPARAMETERFIELD(Dev, + 3009e50: f9c42783 lw a5,-100(s0) + 3009e54: 4f9c lw a5,24(a5) + 3009e56: fcf41c23 sh a5,-40(s0) + XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 3009e5a: f9c42783 lw a5,-100(s0) + 3009e5e: 2bdc lbu a5,20(a5) + 3009e60: fcf40ba3 sb a5,-41(s0) + XTalkCompensationEnable); + + if (XTalkCompensationEnable) { + 3009e64: fd744783 lbu a5,-41(s0) + 3009e68: c7ad beqz a5,3009ed2 + + if ((SignalRate + - ((XTalkCompensationRateMegaCps + * EffectiveSpadRtnCount) >> 8)) + 3009e6a: fd845703 lhu a4,-40(s0) + 3009e6e: fe045783 lhu a5,-32(s0) + 3009e72: 02f707b3 mul a5,a4,a5 + 3009e76: 87a1 srai a5,a5,0x8 + 3009e78: 873e mv a4,a5 + if ((SignalRate + 3009e7a: fe442783 lw a5,-28(s0) + 3009e7e: 02e79163 bne a5,a4,3009ea0 + <= 0) { + if (RangeFractionalEnable) + 3009e82: fdb44783 lbu a5,-37(s0) + 3009e86: c799 beqz a5,3009e94 + XtalkRangeMilliMeter = 8888; + 3009e88: 6789 lui a5,0x2 + 3009e8a: 2b878793 addi a5,a5,696 # 22b8 + 3009e8e: fef41523 sh a5,-22(s0) + 3009e92: a825 j 3009eca + else + XtalkRangeMilliMeter = 8888 + 3009e94: 77e5 lui a5,0xffff9 + 3009e96: ae078793 addi a5,a5,-1312 # ffff8ae0 + 3009e9a: fef41523 sh a5,-22(s0) + 3009e9e: a035 j 3009eca + << 2; + } else { + XtalkRangeMilliMeter = + (tmpuint16 * SignalRate) + 3009ea0: fec45703 lhu a4,-20(s0) + 3009ea4: fe442783 lw a5,-28(s0) + 3009ea8: 02f70733 mul a4,a4,a5 + / (SignalRate + - ((XTalkCompensationRateMegaCps + * EffectiveSpadRtnCount) + 3009eac: fd845683 lhu a3,-40(s0) + 3009eb0: fe045783 lhu a5,-32(s0) + 3009eb4: 02f687b3 mul a5,a3,a5 + >> 8)); + 3009eb8: 87a1 srai a5,a5,0x8 + 3009eba: 86be mv a3,a5 + - ((XTalkCompensationRateMegaCps + 3009ebc: fe442783 lw a5,-28(s0) + 3009ec0: 8f95 sub a5,a5,a3 + / (SignalRate + 3009ec2: 02f757b3 divu a5,a4,a5 + XtalkRangeMilliMeter = + 3009ec6: fef41523 sh a5,-22(s0) + } + + tmpuint16 = XtalkRangeMilliMeter; + 3009eca: fea45783 lhu a5,-22(s0) + 3009ece: fef41623 sh a5,-20(s0) + } + + } + + if (RangeFractionalEnable) { + 3009ed2: fdb44783 lbu a5,-37(s0) + 3009ed6: c785 beqz a5,3009efe + pRangingMeasurementData->RangeMilliMeter = + (uint16_t)((tmpuint16) >> 2); + 3009ed8: fec45783 lhu a5,-20(s0) + 3009edc: 8389 srli a5,a5,0x2 + 3009ede: 01079713 slli a4,a5,0x10 + 3009ee2: 8341 srli a4,a4,0x10 + pRangingMeasurementData->RangeMilliMeter = + 3009ee4: f9842783 lw a5,-104(s0) + 3009ee8: a79a sh a4,8(a5) + pRangingMeasurementData->RangeFractionalPart = + (uint8_t)((tmpuint16 & 0x03) << 6); + 3009eea: fec45783 lhu a5,-20(s0) + 3009eee: 9f81 uxtb a5 + 3009ef0: 079a slli a5,a5,0x6 + 3009ef2: 0ff7f713 andi a4,a5,255 + pRangingMeasurementData->RangeFractionalPart = + 3009ef6: f9842783 lw a5,-104(s0) + 3009efa: bbf8 sb a4,23(a5) + 3009efc: a811 j 3009f10 + } else { + pRangingMeasurementData->RangeMilliMeter = tmpuint16; + 3009efe: f9842783 lw a5,-104(s0) + 3009f02: fec45703 lhu a4,-20(s0) + 3009f06: a79a sh a4,8(a5) + pRangingMeasurementData->RangeFractionalPart = 0; + 3009f08: f9842783 lw a5,-104(s0) + 3009f0c: 00078ba3 sb zero,23(a5) + * For a standard definition of RangeStatus, this should + * return 0 in case of good result after a ranging + * The range status depends on the device so call a device + * specific function to obtain the right Status. + */ + Status |= VL53L0X_get_pal_range_status(Dev, DeviceRangeStatus, + 3009f10: fd640793 addi a5,s0,-42 + 3009f14: fe045683 lhu a3,-32(s0) + 3009f18: fdf44583 lbu a1,-33(s0) + 3009f1c: f9842703 lw a4,-104(s0) + 3009f20: fe442603 lw a2,-28(s0) + 3009f24: f9c42503 lw a0,-100(s0) + 3009f28: 7e0030ef jal ra,300d708 + 3009f2c: 87aa mv a5,a0 + 3009f2e: 873e mv a4,a5 + 3009f30: fef44783 lbu a5,-17(s0) + 3009f34: 8fd9 or a5,a5,a4 + 3009f36: fef407a3 sb a5,-17(s0) + SignalRate, EffectiveSpadRtnCount, + pRangingMeasurementData, &PalRangeStatus); + + if (Status == VL53L0X_ERROR_NONE) + 3009f3a: fef40783 lb a5,-17(s0) + 3009f3e: e791 bnez a5,3009f4a + pRangingMeasurementData->RangeStatus = PalRangeStatus; + 3009f40: fd644703 lbu a4,-42(s0) + 3009f44: f9842783 lw a5,-104(s0) + 3009f48: af98 sb a4,24(a5) + + } + + if (Status == VL53L0X_ERROR_NONE) { + 3009f4a: fef40783 lb a5,-17(s0) + 3009f4e: e7e9 bnez a5,300a018 + /* Copy last read data into Dev buffer */ + LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); + 3009f50: f9c42783 lw a5,-100(s0) + 3009f54: 0807a803 lw a6,128(a5) + 3009f58: 0847a503 lw a0,132(a5) + 3009f5c: 0887a583 lw a1,136(a5) + 3009f60: 08c7a603 lw a2,140(a5) + 3009f64: 0907a683 lw a3,144(a5) + 3009f68: 0947a703 lw a4,148(a5) + 3009f6c: 0987a783 lw a5,152(a5) + 3009f70: fb042623 sw a6,-84(s0) + 3009f74: faa42823 sw a0,-80(s0) + 3009f78: fab42a23 sw a1,-76(s0) + 3009f7c: fac42c23 sw a2,-72(s0) + 3009f80: fad42e23 sw a3,-68(s0) + 3009f84: fce42023 sw a4,-64(s0) + 3009f88: fcf42223 sw a5,-60(s0) + + LastRangeDataBuffer.RangeMilliMeter = + pRangingMeasurementData->RangeMilliMeter; + 3009f8c: f9842783 lw a5,-104(s0) + 3009f90: 279e lhu a5,8(a5) + LastRangeDataBuffer.RangeMilliMeter = + 3009f92: faf41a23 sh a5,-76(s0) + LastRangeDataBuffer.RangeFractionalPart = + pRangingMeasurementData->RangeFractionalPart; + 3009f96: f9842783 lw a5,-104(s0) + 3009f9a: 3bfc lbu a5,23(a5) + LastRangeDataBuffer.RangeFractionalPart = + 3009f9c: fcf401a3 sb a5,-61(s0) + LastRangeDataBuffer.RangeDMaxMilliMeter = + pRangingMeasurementData->RangeDMaxMilliMeter; + 3009fa0: f9842783 lw a5,-104(s0) + 3009fa4: 27be lhu a5,10(a5) + LastRangeDataBuffer.RangeDMaxMilliMeter = + 3009fa6: faf41b23 sh a5,-74(s0) + LastRangeDataBuffer.MeasurementTimeUsec = + pRangingMeasurementData->MeasurementTimeUsec; + 3009faa: f9842783 lw a5,-104(s0) + 3009fae: 43dc lw a5,4(a5) + LastRangeDataBuffer.MeasurementTimeUsec = + 3009fb0: faf42823 sw a5,-80(s0) + LastRangeDataBuffer.SignalRateRtnMegaCps = + pRangingMeasurementData->SignalRateRtnMegaCps; + 3009fb4: f9842783 lw a5,-104(s0) + 3009fb8: 47dc lw a5,12(a5) + LastRangeDataBuffer.SignalRateRtnMegaCps = + 3009fba: faf42c23 sw a5,-72(s0) + LastRangeDataBuffer.AmbientRateRtnMegaCps = + pRangingMeasurementData->AmbientRateRtnMegaCps; + 3009fbe: f9842783 lw a5,-104(s0) + 3009fc2: 4b9c lw a5,16(a5) + LastRangeDataBuffer.AmbientRateRtnMegaCps = + 3009fc4: faf42e23 sw a5,-68(s0) + LastRangeDataBuffer.EffectiveSpadRtnCount = + pRangingMeasurementData->EffectiveSpadRtnCount; + 3009fc8: f9842783 lw a5,-104(s0) + 3009fcc: 2bde lhu a5,20(a5) + LastRangeDataBuffer.EffectiveSpadRtnCount = + 3009fce: fcf41023 sh a5,-64(s0) + LastRangeDataBuffer.RangeStatus = + pRangingMeasurementData->RangeStatus; + 3009fd2: f9842783 lw a5,-104(s0) + 3009fd6: 2f9c lbu a5,24(a5) + LastRangeDataBuffer.RangeStatus = + 3009fd8: fcf40223 sb a5,-60(s0) + + PALDevDataSet(Dev, LastRangeMeasure, LastRangeDataBuffer); + 3009fdc: f9c42783 lw a5,-100(s0) + 3009fe0: fac42883 lw a7,-84(s0) + 3009fe4: fb042803 lw a6,-80(s0) + 3009fe8: fb442503 lw a0,-76(s0) + 3009fec: fb842583 lw a1,-72(s0) + 3009ff0: fbc42603 lw a2,-68(s0) + 3009ff4: fc042683 lw a3,-64(s0) + 3009ff8: fc442703 lw a4,-60(s0) + 3009ffc: 0917a023 sw a7,128(a5) + 300a000: 0907a223 sw a6,132(a5) + 300a004: 08a7a423 sw a0,136(a5) + 300a008: 08b7a623 sw a1,140(a5) + 300a00c: 08c7a823 sw a2,144(a5) + 300a010: 08d7aa23 sw a3,148(a5) + 300a014: 08e7ac23 sw a4,152(a5) + } + + LOG_FUNCTION_END(Status); + return Status; + 300a018: fef40783 lb a5,-17(s0) +} + 300a01c: 853e mv a0,a5 + 300a01e: 50b6 lw ra,108(sp) + 300a020: 5426 lw s0,104(sp) + 300a022: 6165 addi sp,sp,112 + 300a024: 8082 ret + +0300a026 : + return Status; +} + +VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) +{ + 300a026: 7179 addi sp,sp,-48 + 300a028: d606 sw ra,44(sp) + 300a02a: d422 sw s0,40(sp) + 300a02c: 1800 addi s0,sp,48 + 300a02e: fca42e23 sw a0,-36(s0) + 300a032: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a036: fe0407a3 sb zero,-17(s0) + LOG_FUNCTION_START(""); + + /* This function will do a complete single ranging + * Here we fix the mode! + */ + Status = VL53L0X_SetDeviceMode(Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING); + 300a03a: 4581 li a1,0 + 300a03c: fdc42503 lw a0,-36(s0) + 300a040: d2bfe0ef jal ra,3008d6a + 300a044: 87aa mv a5,a0 + 300a046: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300a04a: fef40783 lb a5,-17(s0) + 300a04e: eb81 bnez a5,300a05e + Status = VL53L0X_PerformSingleMeasurement(Dev); + 300a050: fdc42503 lw a0,-36(s0) + 300a054: f66ff0ef jal ra,30097ba + 300a058: 87aa mv a5,a0 + 300a05a: fef407a3 sb a5,-17(s0) + + + if (Status == VL53L0X_ERROR_NONE) + 300a05e: fef40783 lb a5,-17(s0) + 300a062: eb89 bnez a5,300a074 + Status = VL53L0X_GetRangingMeasurementData(Dev, + 300a064: fd842583 lw a1,-40(s0) + 300a068: fdc42503 lw a0,-36(s0) + 300a06c: 31c9 jal ra,3009d2e + 300a06e: 87aa mv a5,a0 + 300a070: fef407a3 sb a5,-17(s0) + pRangingMeasurementData); + + + if (Status == VL53L0X_ERROR_NONE) + 300a074: fef40783 lb a5,-17(s0) + 300a078: eb81 bnez a5,300a088 + Status = VL53L0X_ClearInterruptMask(Dev, 0); + 300a07a: 4581 li a1,0 + 300a07c: fdc42503 lw a0,-36(s0) + 300a080: 269d jal ra,300a3e6 + 300a082: 87aa mv a5,a0 + 300a084: fef407a3 sb a5,-17(s0) + + + LOG_FUNCTION_END(Status); + return Status; + 300a088: fef40783 lb a5,-17(s0) +} + 300a08c: 853e mv a0,a5 + 300a08e: 50b2 lw ra,44(sp) + 300a090: 5422 lw s0,40(sp) + 300a092: 6145 addi sp,sp,48 + 300a094: 8082 ret + +0300a096 : +/* End Group PAL Measurement Functions */ + +VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity) +{ + 300a096: 7179 addi sp,sp,-48 + 300a098: d606 sw ra,44(sp) + 300a09a: d422 sw s0,40(sp) + 300a09c: 1800 addi s0,sp,48 + 300a09e: fca42e23 sw a0,-36(s0) + 300a0a2: 87ae mv a5,a1 + 300a0a4: fcf40da3 sb a5,-37(s0) + 300a0a8: 87b2 mv a5,a2 + 300a0aa: fcf40d23 sb a5,-38(s0) + 300a0ae: 87b6 mv a5,a3 + 300a0b0: fcf40ca3 sb a5,-39(s0) + 300a0b4: 87ba mv a5,a4 + 300a0b6: fcf40c23 sb a5,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a0ba: fe0407a3 sb zero,-17(s0) + uint8_t data; + + LOG_FUNCTION_START(""); + + if (Pin != 0) { + 300a0be: fdb44783 lbu a5,-37(s0) + 300a0c2: c789 beqz a5,300a0cc + Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; + 300a0c4: 57d9 li a5,-10 + 300a0c6: fef407a3 sb a5,-17(s0) + 300a0ca: a471 j 300a356 + } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_DRIVE) { + 300a0cc: fda44703 lbu a4,-38(s0) + 300a0d0: 47d1 li a5,20 + 300a0d2: 02f71863 bne a4,a5,300a102 + if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) + 300a0d6: fd844783 lbu a5,-40(s0) + 300a0da: e789 bnez a5,300a0e4 + data = 0x10; + 300a0dc: 47c1 li a5,16 + 300a0de: fef40723 sb a5,-18(s0) + 300a0e2: a021 j 300a0ea + else + data = 1; + 300a0e4: 4785 li a5,1 + 300a0e6: fef40723 sb a5,-18(s0) + + Status = VL53L0X_WrByte(Dev, + 300a0ea: fee44783 lbu a5,-18(s0) + 300a0ee: 863e mv a2,a5 + 300a0f0: 08400593 li a1,132 + 300a0f4: fdc42503 lw a0,-36(s0) + 300a0f8: 3e49 jal ra,3009c8a + 300a0fa: 87aa mv a5,a0 + 300a0fc: fef407a3 sb a5,-17(s0) + 300a100: ac99 j 300a356 + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data); + + } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_OSC) { + 300a102: fda44703 lbu a4,-38(s0) + 300a106: 47d5 li a5,21 + 300a108: 18f71463 bne a4,a5,300a290 + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + 300a10c: 4605 li a2,1 + 300a10e: 0ff00593 li a1,255 + 300a112: fdc42503 lw a0,-36(s0) + 300a116: 3e95 jal ra,3009c8a + 300a118: 87aa mv a5,a0 + 300a11a: 873e mv a4,a5 + 300a11c: fef44783 lbu a5,-17(s0) + 300a120: 8fd9 or a5,a5,a4 + 300a122: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + 300a126: 4601 li a2,0 + 300a128: 4581 li a1,0 + 300a12a: fdc42503 lw a0,-36(s0) + 300a12e: 3eb1 jal ra,3009c8a + 300a130: 87aa mv a5,a0 + 300a132: 873e mv a4,a5 + 300a134: fef44783 lbu a5,-17(s0) + 300a138: 8fd9 or a5,a5,a4 + 300a13a: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + 300a13e: 4601 li a2,0 + 300a140: 0ff00593 li a1,255 + 300a144: fdc42503 lw a0,-36(s0) + 300a148: 3689 jal ra,3009c8a + 300a14a: 87aa mv a5,a0 + 300a14c: 873e mv a4,a5 + 300a14e: fef44783 lbu a5,-17(s0) + 300a152: 8fd9 or a5,a5,a4 + 300a154: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + 300a158: 4605 li a2,1 + 300a15a: 08000593 li a1,128 + 300a15e: fdc42503 lw a0,-36(s0) + 300a162: 3625 jal ra,3009c8a + 300a164: 87aa mv a5,a0 + 300a166: 873e mv a4,a5 + 300a168: fef44783 lbu a5,-17(s0) + 300a16c: 8fd9 or a5,a5,a4 + 300a16e: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x85, 0x02); + 300a172: 4609 li a2,2 + 300a174: 08500593 li a1,133 + 300a178: fdc42503 lw a0,-36(s0) + 300a17c: 3639 jal ra,3009c8a + 300a17e: 87aa mv a5,a0 + 300a180: 873e mv a4,a5 + 300a182: fef44783 lbu a5,-17(s0) + 300a186: 8fd9 or a5,a5,a4 + 300a188: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x04); + 300a18c: 4611 li a2,4 + 300a18e: 0ff00593 li a1,255 + 300a192: fdc42503 lw a0,-36(s0) + 300a196: 3cd5 jal ra,3009c8a + 300a198: 87aa mv a5,a0 + 300a19a: 873e mv a4,a5 + 300a19c: fef44783 lbu a5,-17(s0) + 300a1a0: 8fd9 or a5,a5,a4 + 300a1a2: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xcd, 0x00); + 300a1a6: 4601 li a2,0 + 300a1a8: 0cd00593 li a1,205 + 300a1ac: fdc42503 lw a0,-36(s0) + 300a1b0: 3ce9 jal ra,3009c8a + 300a1b2: 87aa mv a5,a0 + 300a1b4: 873e mv a4,a5 + 300a1b6: fef44783 lbu a5,-17(s0) + 300a1ba: 8fd9 or a5,a5,a4 + 300a1bc: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xcc, 0x11); + 300a1c0: 4645 li a2,17 + 300a1c2: 0cc00593 li a1,204 + 300a1c6: fdc42503 lw a0,-36(s0) + 300a1ca: 34c1 jal ra,3009c8a + 300a1cc: 87aa mv a5,a0 + 300a1ce: 873e mv a4,a5 + 300a1d0: fef44783 lbu a5,-17(s0) + 300a1d4: 8fd9 or a5,a5,a4 + 300a1d6: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x07); + 300a1da: 461d li a2,7 + 300a1dc: 0ff00593 li a1,255 + 300a1e0: fdc42503 lw a0,-36(s0) + 300a1e4: 345d jal ra,3009c8a + 300a1e6: 87aa mv a5,a0 + 300a1e8: 873e mv a4,a5 + 300a1ea: fef44783 lbu a5,-17(s0) + 300a1ee: 8fd9 or a5,a5,a4 + 300a1f0: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xbe, 0x00); + 300a1f4: 4601 li a2,0 + 300a1f6: 0be00593 li a1,190 + 300a1fa: fdc42503 lw a0,-36(s0) + 300a1fe: 3471 jal ra,3009c8a + 300a200: 87aa mv a5,a0 + 300a202: 873e mv a4,a5 + 300a204: fef44783 lbu a5,-17(s0) + 300a208: 8fd9 or a5,a5,a4 + 300a20a: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x06); + 300a20e: 4619 li a2,6 + 300a210: 0ff00593 li a1,255 + 300a214: fdc42503 lw a0,-36(s0) + 300a218: 3c8d jal ra,3009c8a + 300a21a: 87aa mv a5,a0 + 300a21c: 873e mv a4,a5 + 300a21e: fef44783 lbu a5,-17(s0) + 300a222: 8fd9 or a5,a5,a4 + 300a224: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xcc, 0x09); + 300a228: 4625 li a2,9 + 300a22a: 0cc00593 li a1,204 + 300a22e: fdc42503 lw a0,-36(s0) + 300a232: 3ca1 jal ra,3009c8a + 300a234: 87aa mv a5,a0 + 300a236: 873e mv a4,a5 + 300a238: fef44783 lbu a5,-17(s0) + 300a23c: 8fd9 or a5,a5,a4 + 300a23e: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + 300a242: 4601 li a2,0 + 300a244: 0ff00593 li a1,255 + 300a248: fdc42503 lw a0,-36(s0) + 300a24c: 3c3d jal ra,3009c8a + 300a24e: 87aa mv a5,a0 + 300a250: 873e mv a4,a5 + 300a252: fef44783 lbu a5,-17(s0) + 300a256: 8fd9 or a5,a5,a4 + 300a258: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + 300a25c: 4605 li a2,1 + 300a25e: 0ff00593 li a1,255 + 300a262: fdc42503 lw a0,-36(s0) + 300a266: 3415 jal ra,3009c8a + 300a268: 87aa mv a5,a0 + 300a26a: 873e mv a4,a5 + 300a26c: fef44783 lbu a5,-17(s0) + 300a270: 8fd9 or a5,a5,a4 + 300a272: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + 300a276: 4601 li a2,0 + 300a278: 4581 li a1,0 + 300a27a: fdc42503 lw a0,-36(s0) + 300a27e: 3431 jal ra,3009c8a + 300a280: 87aa mv a5,a0 + 300a282: 873e mv a4,a5 + 300a284: fef44783 lbu a5,-17(s0) + 300a288: 8fd9 or a5,a5,a4 + 300a28a: fef407a3 sb a5,-17(s0) + 300a28e: a0e1 j 300a356 + + } else { + + if (Status == VL53L0X_ERROR_NONE) { + 300a290: fef40783 lb a5,-17(s0) + 300a294: e7b1 bnez a5,300a2e0 + switch (Functionality) { + 300a296: fd944783 lbu a5,-39(s0) + 300a29a: 4711 li a4,4 + 300a29c: 02f76e63 bltu a4,a5,300a2d8 + 300a2a0: 00279713 slli a4,a5,0x2 + 300a2a4: 0300f7b7 lui a5,0x300f + 300a2a8: 49078793 addi a5,a5,1168 # 300f490 + 300a2ac: 97ba add a5,a5,a4 + 300a2ae: 439c lw a5,0(a5) + 300a2b0: 8782 jr a5 + case VL53L0X_GPIOFUNCTIONALITY_OFF: + data = 0x00; + 300a2b2: fe040723 sb zero,-18(s0) + break; + 300a2b6: a035 j 300a2e2 + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: + data = 0x01; + 300a2b8: 4785 li a5,1 + 300a2ba: fef40723 sb a5,-18(s0) + break; + 300a2be: a015 j 300a2e2 + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: + data = 0x02; + 300a2c0: 4789 li a5,2 + 300a2c2: fef40723 sb a5,-18(s0) + break; + 300a2c6: a831 j 300a2e2 + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: + data = 0x03; + 300a2c8: 478d li a5,3 + 300a2ca: fef40723 sb a5,-18(s0) + break; + 300a2ce: a811 j 300a2e2 + case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY: + data = 0x04; + 300a2d0: 4791 li a5,4 + 300a2d2: fef40723 sb a5,-18(s0) + break; + 300a2d6: a031 j 300a2e2 + default: + Status = + 300a2d8: 57d5 li a5,-11 + 300a2da: fef407a3 sb a5,-17(s0) + 300a2de: a011 j 300a2e2 + VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; + } + } + 300a2e0: 0001 nop + + if (Status == VL53L0X_ERROR_NONE) + 300a2e2: fef40783 lb a5,-17(s0) + 300a2e6: eb99 bnez a5,300a2fc + Status = VL53L0X_WrByte(Dev, + 300a2e8: fee44783 lbu a5,-18(s0) + 300a2ec: 863e mv a2,a5 + 300a2ee: 45a9 li a1,10 + 300a2f0: fdc42503 lw a0,-36(s0) + 300a2f4: 3a59 jal ra,3009c8a + 300a2f6: 87aa mv a5,a0 + 300a2f8: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data); + + if (Status == VL53L0X_ERROR_NONE) { + 300a2fc: fef40783 lb a5,-17(s0) + 300a300: eb85 bnez a5,300a330 + if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) + 300a302: fd844783 lbu a5,-40(s0) + 300a306: e781 bnez a5,300a30e + data = 0; + 300a308: fe040723 sb zero,-18(s0) + 300a30c: a021 j 300a314 + else + data = (uint8_t)(1 << 4); + 300a30e: 47c1 li a5,16 + 300a310: fef40723 sb a5,-18(s0) + + Status = VL53L0X_UpdateByte(Dev, + 300a314: fee44783 lbu a5,-18(s0) + 300a318: 86be mv a3,a5 + 300a31a: 0ef00613 li a2,239 + 300a31e: 08400593 li a1,132 + 300a322: fdc42503 lw a0,-36(s0) + 300a326: 216040ef jal ra,300e53c + 300a32a: 87aa mv a5,a0 + 300a32c: fef407a3 sb a5,-17(s0) + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data); + } + + if (Status == VL53L0X_ERROR_NONE) + 300a330: fef40783 lb a5,-17(s0) + 300a334: e799 bnez a5,300a342 + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300a336: fdc42783 lw a5,-36(s0) + 300a33a: fd944703 lbu a4,-39(s0) + 300a33e: 10e78323 sb a4,262(a5) + Pin0GpioFunctionality, Functionality); + + if (Status == VL53L0X_ERROR_NONE) + 300a342: fef40783 lb a5,-17(s0) + 300a346: eb81 bnez a5,300a356 + Status = VL53L0X_ClearInterruptMask(Dev, 0); + 300a348: 4581 li a1,0 + 300a34a: fdc42503 lw a0,-36(s0) + 300a34e: 2861 jal ra,300a3e6 + 300a350: 87aa mv a5,a0 + 300a352: fef407a3 sb a5,-17(s0) + + } + + LOG_FUNCTION_END(Status); + return Status; + 300a356: fef40783 lb a5,-17(s0) +} + 300a35a: 853e mv a0,a5 + 300a35c: 50b2 lw ra,44(sp) + 300a35e: 5422 lw s0,40(sp) + 300a360: 6145 addi sp,sp,48 + 300a362: 8082 ret + +0300a364 : +} + +VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh) +{ + 300a364: 7179 addi sp,sp,-48 + 300a366: d606 sw ra,44(sp) + 300a368: d422 sw s0,40(sp) + 300a36a: 1800 addi s0,sp,48 + 300a36c: fca42e23 sw a0,-36(s0) + 300a370: 87ae mv a5,a1 + 300a372: fcc42a23 sw a2,-44(s0) + 300a376: fcd42823 sw a3,-48(s0) + 300a37a: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a37e: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + /* no dependency on DeviceMode for Ewok */ + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, + 300a382: fec40793 addi a5,s0,-20 + 300a386: 863e mv a2,a5 + 300a388: 45b9 li a1,14 + 300a38a: fdc42503 lw a0,-36(s0) + 300a38e: 2569 jal ra,300aa18 + 300a390: 87aa mv a5,a0 + 300a392: fef407a3 sb a5,-17(s0) + &Threshold16); + /* Need to multiply by 2 because the FW will apply a x2 */ + *pThresholdLow = (FixPoint1616_t)((0x00fff & Threshold16) << 17); + 300a396: fec45783 lhu a5,-20(s0) + 300a39a: 07c6 slli a5,a5,0x11 + 300a39c: 873e mv a4,a5 + 300a39e: 1ffe07b7 lui a5,0x1ffe0 + 300a3a2: 8f7d and a4,a4,a5 + 300a3a4: fd442783 lw a5,-44(s0) + 300a3a8: c398 sw a4,0(a5) + + if (Status == VL53L0X_ERROR_NONE) { + 300a3aa: fef40783 lb a5,-17(s0) + 300a3ae: e78d bnez a5,300a3d8 + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, + 300a3b0: fec40793 addi a5,s0,-20 + 300a3b4: 863e mv a2,a5 + 300a3b6: 45b1 li a1,12 + 300a3b8: fdc42503 lw a0,-36(s0) + 300a3bc: 2db1 jal ra,300aa18 + 300a3be: 87aa mv a5,a0 + 300a3c0: fef407a3 sb a5,-17(s0) + &Threshold16); + /* Need to multiply by 2 because the FW will apply a x2 */ + *pThresholdHigh = + (FixPoint1616_t)((0x00fff & Threshold16) << 17); + 300a3c4: fec45783 lhu a5,-20(s0) + 300a3c8: 07c6 slli a5,a5,0x11 + 300a3ca: 873e mv a4,a5 + 300a3cc: 1ffe07b7 lui a5,0x1ffe0 + 300a3d0: 8f7d and a4,a4,a5 + *pThresholdHigh = + 300a3d2: fd042783 lw a5,-48(s0) + 300a3d6: c398 sw a4,0(a5) + } + + LOG_FUNCTION_END(Status); + return Status; + 300a3d8: fef40783 lb a5,-17(s0) +} + 300a3dc: 853e mv a0,a5 + 300a3de: 50b2 lw ra,44(sp) + 300a3e0: 5422 lw s0,40(sp) + 300a3e2: 6145 addi sp,sp,48 + 300a3e4: 8082 ret + +0300a3e6 : +} + +/* Group PAL Interrupt Functions */ +VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask) +{ + 300a3e6: 7179 addi sp,sp,-48 + 300a3e8: d606 sw ra,44(sp) + 300a3ea: d422 sw s0,40(sp) + 300a3ec: 1800 addi s0,sp,48 + 300a3ee: fca42e23 sw a0,-36(s0) + 300a3f2: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a3f6: fe0407a3 sb zero,-17(s0) + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* clear bit 0 range interrupt, bit 1 error interrupt */ + LoopCount = 0; + 300a3fa: fe040723 sb zero,-18(s0) + do { + Status = VL53L0X_WrByte(Dev, + 300a3fe: 4605 li a2,1 + 300a400: 45ad li a1,11 + 300a402: fdc42503 lw a0,-36(s0) + 300a406: 2d19 jal ra,300aa1c + 300a408: 87aa mv a5,a0 + 300a40a: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01); + Status |= VL53L0X_WrByte(Dev, + 300a40e: 4601 li a2,0 + 300a410: 45ad li a1,11 + 300a412: fdc42503 lw a0,-36(s0) + 300a416: 2519 jal ra,300aa1c + 300a418: 87aa mv a5,a0 + 300a41a: 873e mv a4,a5 + 300a41c: fef44783 lbu a5,-17(s0) + 300a420: 8fd9 or a5,a5,a4 + 300a422: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00); + Status |= VL53L0X_RdByte(Dev, + 300a426: fed40793 addi a5,s0,-19 + 300a42a: 863e mv a2,a5 + 300a42c: 45cd li a1,19 + 300a42e: fdc42503 lw a0,-36(s0) + 300a432: 1b0040ef jal ra,300e5e2 + 300a436: 87aa mv a5,a0 + 300a438: 873e mv a4,a5 + 300a43a: fef44783 lbu a5,-17(s0) + 300a43e: 8fd9 or a5,a5,a4 + 300a440: fef407a3 sb a5,-17(s0) + VL53L0X_REG_RESULT_INTERRUPT_STATUS, &Byte); + LoopCount++; + 300a444: fee44783 lbu a5,-18(s0) + 300a448: 0785 addi a5,a5,1 # 1ffe0001 + 300a44a: fef40723 sb a5,-18(s0) + } while (((Byte & 0x07) != 0x00) + 300a44e: fed44783 lbu a5,-19(s0) + 300a452: 8b9d andi a5,a5,7 + && (LoopCount < 3) + && (Status == VL53L0X_ERROR_NONE)); + 300a454: cb89 beqz a5,300a466 + && (LoopCount < 3) + 300a456: fee44703 lbu a4,-18(s0) + 300a45a: 4789 li a5,2 + 300a45c: 00e7e563 bltu a5,a4,300a466 + && (Status == VL53L0X_ERROR_NONE)); + 300a460: fef40783 lb a5,-17(s0) + 300a464: dfc9 beqz a5,300a3fe + + + if (LoopCount >= 3) + 300a466: fee44703 lbu a4,-18(s0) + 300a46a: 4789 li a5,2 + 300a46c: 00e7f563 bgeu a5,a4,300a476 + Status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED; + 300a470: 57d1 li a5,-12 + 300a472: fef407a3 sb a5,-17(s0) + + LOG_FUNCTION_END(Status); + return Status; + 300a476: fef40783 lb a5,-17(s0) +} + 300a47a: 853e mv a0,a5 + 300a47c: 50b2 lw ra,44(sp) + 300a47e: 5422 lw s0,40(sp) + 300a480: 6145 addi sp,sp,48 + 300a482: 8082 ret + +0300a484 : + +VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, + uint32_t *pInterruptMaskStatus) +{ + 300a484: 7179 addi sp,sp,-48 + 300a486: d606 sw ra,44(sp) + 300a488: d422 sw s0,40(sp) + 300a48a: 1800 addi s0,sp,48 + 300a48c: fca42e23 sw a0,-36(s0) + 300a490: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a494: fe0407a3 sb zero,-17(s0) + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, + 300a498: fee40793 addi a5,s0,-18 + 300a49c: 863e mv a2,a5 + 300a49e: 45cd li a1,19 + 300a4a0: fdc42503 lw a0,-36(s0) + 300a4a4: 13e040ef jal ra,300e5e2 + 300a4a8: 87aa mv a5,a0 + 300a4aa: fef407a3 sb a5,-17(s0) + &Byte); + *pInterruptMaskStatus = Byte & 0x07; + 300a4ae: fee44783 lbu a5,-18(s0) + 300a4b2: 0077f713 andi a4,a5,7 + 300a4b6: fd842783 lw a5,-40(s0) + 300a4ba: c398 sw a4,0(a5) + + if (Byte & 0x18) + 300a4bc: fee44783 lbu a5,-18(s0) + 300a4c0: 8be1 andi a5,a5,24 + 300a4c2: c781 beqz a5,300a4ca + Status = VL53L0X_ERROR_RANGE_ERROR; + 300a4c4: 57e9 li a5,-6 + 300a4c6: fef407a3 sb a5,-17(s0) + + LOG_FUNCTION_END(Status); + return Status; + 300a4ca: fef40783 lb a5,-17(s0) +} + 300a4ce: 853e mv a0,a5 + 300a4d0: 50b2 lw ra,44(sp) + 300a4d2: 5422 lw s0,40(sp) + 300a4d4: 6145 addi sp,sp,48 + 300a4d6: 8082 ret + +0300a4d8 : + return Status; +} + +VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads) +{ + 300a4d8: 7179 addi sp,sp,-48 + 300a4da: d606 sw ra,44(sp) + 300a4dc: d422 sw s0,40(sp) + 300a4de: 1800 addi s0,sp,48 + 300a4e0: fca42e23 sw a0,-36(s0) + 300a4e4: fcb42c23 sw a1,-40(s0) + 300a4e8: fcc42a23 sw a2,-44(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a4ec: fe0407a3 sb zero,-17(s0) + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_ref_spad_management(Dev, refSpadCount, + 300a4f0: fd442603 lw a2,-44(s0) + 300a4f4: fd842583 lw a1,-40(s0) + 300a4f8: fdc42503 lw a0,-36(s0) + 300a4fc: 2315 jal ra,300aa20 + 300a4fe: 87aa mv a5,a0 + 300a500: fef407a3 sb a5,-17(s0) + isApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; + 300a504: fef40783 lb a5,-17(s0) +} + 300a508: 853e mv a0,a5 + 300a50a: 50b2 lw ra,44(sp) + 300a50c: 5422 lw s0,40(sp) + 300a50e: 6145 addi sp,sp,48 + 300a510: 8082 ret + +0300a512 : + return Status; +} + +VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter) +{ + 300a512: 7179 addi sp,sp,-48 + 300a514: d606 sw ra,44(sp) + 300a516: d422 sw s0,40(sp) + 300a518: 1800 addi s0,sp,48 + 300a51a: fca42e23 sw a0,-36(s0) + 300a51e: fcb42c23 sw a1,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300a522: fe0407a3 sb zero,-17(s0) + uint16_t RangeOffsetRegister; + int16_t cMaxOffset = 2047; + 300a526: 7ff00793 li a5,2047 + 300a52a: fef41623 sh a5,-20(s0) + int16_t cOffsetRange = 4096; + 300a52e: 6785 lui a5,0x1 + 300a530: fef41523 sh a5,-22(s0) + + /* Note that offset has 10.2 format */ + + Status = VL53L0X_RdWord(Dev, + 300a534: fe840793 addi a5,s0,-24 + 300a538: 863e mv a2,a5 + 300a53a: 02800593 li a1,40 + 300a53e: fdc42503 lw a0,-36(s0) + 300a542: 29d9 jal ra,300aa18 + 300a544: 87aa mv a5,a0 + 300a546: fef407a3 sb a5,-17(s0) + VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, + &RangeOffsetRegister); + + if (Status == VL53L0X_ERROR_NONE) { + 300a54a: fef40783 lb a5,-17(s0) + 300a54e: efb1 bnez a5,300a5aa + RangeOffsetRegister = (RangeOffsetRegister & 0x0fff); + 300a550: fe845703 lhu a4,-24(s0) + 300a554: 6785 lui a5,0x1 + 300a556: 17fd addi a5,a5,-1 # fff + 300a558: 8ff9 and a5,a5,a4 + 300a55a: 9fa1 uxth a5 + 300a55c: fef41423 sh a5,-24(s0) + + /* Apply 12 bit 2's compliment conversion */ + if (RangeOffsetRegister > cMaxOffset) + 300a560: fe845783 lhu a5,-24(s0) + 300a564: 873e mv a4,a5 + 300a566: fec41783 lh a5,-20(s0) + 300a56a: 02e7d463 bge a5,a4,300a592 + *pOffsetCalibrationDataMicroMeter = + (int16_t)(RangeOffsetRegister - cOffsetRange) + 300a56e: fe845703 lhu a4,-24(s0) + 300a572: fea45783 lhu a5,-22(s0) + 300a576: 40f707b3 sub a5,a4,a5 + 300a57a: 9fa1 uxth a5 + 300a57c: 07c2 slli a5,a5,0x10 + 300a57e: 87c1 srai a5,a5,0x10 + 300a580: 873e mv a4,a5 + * 250; + 300a582: 0fa00793 li a5,250 + 300a586: 02f70733 mul a4,a4,a5 + *pOffsetCalibrationDataMicroMeter = + 300a58a: fd842783 lw a5,-40(s0) + 300a58e: c398 sw a4,0(a5) + 300a590: a829 j 300a5aa + else + *pOffsetCalibrationDataMicroMeter = + (int16_t)RangeOffsetRegister * 250; + 300a592: fe845783 lhu a5,-24(s0) + 300a596: 07c2 slli a5,a5,0x10 + 300a598: 87c1 srai a5,a5,0x10 + 300a59a: 873e mv a4,a5 + 300a59c: 0fa00793 li a5,250 + 300a5a0: 02f70733 mul a4,a4,a5 + *pOffsetCalibrationDataMicroMeter = + 300a5a4: fd842783 lw a5,-40(s0) + 300a5a8: c398 sw a4,0(a5) + + } + + return Status; + 300a5aa: fef40783 lb a5,-17(s0) +} + 300a5ae: 853e mv a0,a5 + 300a5b0: 50b2 lw ra,44(sp) + 300a5b2: 5422 lw s0,40(sp) + 300a5b4: 6145 addi sp,sp,48 + 300a5b6: 8082 ret + +0300a5b8 : + return Status; +} + +void get_next_good_spad(uint8_t goodSpadArray[], uint32_t size, + uint32_t curr, int32_t *next) +{ + 300a5b8: 7139 addi sp,sp,-64 + 300a5ba: de22 sw s0,60(sp) + 300a5bc: 0080 addi s0,sp,64 + 300a5be: fca42623 sw a0,-52(s0) + 300a5c2: fcb42423 sw a1,-56(s0) + 300a5c6: fcc42223 sw a2,-60(s0) + 300a5ca: fcd42023 sw a3,-64(s0) + uint32_t startIndex; + uint32_t fineOffset; + uint32_t cSpadsPerByte = 8; + 300a5ce: 47a1 li a5,8 + 300a5d0: fef42023 sw a5,-32(s0) + uint32_t coarseIndex; + uint32_t fineIndex; + uint8_t dataByte; + uint8_t success = 0; + 300a5d4: fe040323 sb zero,-26(s0) + * + * The coarse index is the byte index of the array and the fine index is + * the index of the bit within each byte. + */ + + *next = -1; + 300a5d8: fc042783 lw a5,-64(s0) + 300a5dc: 577d li a4,-1 + 300a5de: c398 sw a4,0(a5) + + startIndex = curr / cSpadsPerByte; + 300a5e0: fc442703 lw a4,-60(s0) + 300a5e4: fe042783 lw a5,-32(s0) + 300a5e8: 02f757b3 divu a5,a4,a5 + 300a5ec: fcf42e23 sw a5,-36(s0) + fineOffset = curr % cSpadsPerByte; + 300a5f0: fc442703 lw a4,-60(s0) + 300a5f4: fe042783 lw a5,-32(s0) + 300a5f8: 02f777b3 remu a5,a4,a5 + 300a5fc: fcf42c23 sw a5,-40(s0) + + for (coarseIndex = startIndex; ((coarseIndex < size) && !success); + 300a600: fdc42783 lw a5,-36(s0) + 300a604: fef42623 sw a5,-20(s0) + 300a608: a841 j 300a698 + coarseIndex++) { + fineIndex = 0; + 300a60a: fe042423 sw zero,-24(s0) + dataByte = goodSpadArray[coarseIndex]; + 300a60e: fcc42703 lw a4,-52(s0) + 300a612: fec42783 lw a5,-20(s0) + 300a616: 97ba add a5,a5,a4 + 300a618: 239c lbu a5,0(a5) + 300a61a: fef403a3 sb a5,-25(s0) + + if (coarseIndex == startIndex) { + 300a61e: fec42703 lw a4,-20(s0) + 300a622: fdc42783 lw a5,-36(s0) + 300a626: 04f71e63 bne a4,a5,300a682 + /* locate the bit position of the provided current + * spad bit before iterating + */ + dataByte >>= fineOffset; + 300a62a: fe744703 lbu a4,-25(s0) + 300a62e: fd842783 lw a5,-40(s0) + 300a632: 40f757b3 sra a5,a4,a5 + 300a636: fef403a3 sb a5,-25(s0) + fineIndex = fineOffset; + 300a63a: fd842783 lw a5,-40(s0) + 300a63e: fef42423 sw a5,-24(s0) + } + + while (fineIndex < cSpadsPerByte) { + 300a642: a081 j 300a682 + if ((dataByte & 0x1) == 1) { + 300a644: fe744783 lbu a5,-25(s0) + 300a648: 8b85 andi a5,a5,1 + 300a64a: c395 beqz a5,300a66e + success = 1; + 300a64c: 4785 li a5,1 + 300a64e: fef40323 sb a5,-26(s0) + *next = coarseIndex * cSpadsPerByte + fineIndex; + 300a652: fec42703 lw a4,-20(s0) + 300a656: fe042783 lw a5,-32(s0) + 300a65a: 02f70733 mul a4,a4,a5 + 300a65e: fe842783 lw a5,-24(s0) + 300a662: 97ba add a5,a5,a4 + 300a664: 873e mv a4,a5 + 300a666: fc042783 lw a5,-64(s0) + 300a66a: c398 sw a4,0(a5) + break; + 300a66c: a00d j 300a68e + } + dataByte >>= 1; + 300a66e: fe744783 lbu a5,-25(s0) + 300a672: 8385 srli a5,a5,0x1 + 300a674: fef403a3 sb a5,-25(s0) + fineIndex++; + 300a678: fe842783 lw a5,-24(s0) + 300a67c: 0785 addi a5,a5,1 + 300a67e: fef42423 sw a5,-24(s0) + while (fineIndex < cSpadsPerByte) { + 300a682: fe842703 lw a4,-24(s0) + 300a686: fe042783 lw a5,-32(s0) + 300a68a: faf76de3 bltu a4,a5,300a644 + coarseIndex++) { + 300a68e: fec42783 lw a5,-20(s0) + 300a692: 0785 addi a5,a5,1 + 300a694: fef42623 sw a5,-20(s0) + for (coarseIndex = startIndex; ((coarseIndex < size) && !success); + 300a698: fec42703 lw a4,-20(s0) + 300a69c: fc842783 lw a5,-56(s0) + 300a6a0: 00f77563 bgeu a4,a5,300a6aa + 300a6a4: fe644783 lbu a5,-26(s0) + 300a6a8: d3ad beqz a5,300a60a + } + } +} + 300a6aa: 0001 nop + 300a6ac: 5472 lw s0,60(sp) + 300a6ae: 6121 addi sp,sp,64 + 300a6b0: 8082 ret + +0300a6b2 : + + +uint8_t is_aperture(uint32_t spadIndex) +{ + 300a6b2: 7179 addi sp,sp,-48 + 300a6b4: d622 sw s0,44(sp) + 300a6b6: 1800 addi s0,sp,48 + 300a6b8: fca42e23 sw a0,-36(s0) + /* + * This function reports if a given spad index is an aperture SPAD by + * deriving the quadrant. + */ + uint32_t quadrant; + uint8_t isAperture = 1; + 300a6bc: 4785 li a5,1 + 300a6be: fef407a3 sb a5,-17(s0) + + quadrant = spadIndex >> 6; + 300a6c2: fdc42783 lw a5,-36(s0) + 300a6c6: 8399 srli a5,a5,0x6 + 300a6c8: fef42423 sw a5,-24(s0) + if (refArrayQuadrants[quadrant] == REF_ARRAY_SPAD_0) + 300a6cc: d8418713 addi a4,gp,-636 # 40003b8 + 300a6d0: fe842783 lw a5,-24(s0) + 300a6d4: 078a slli a5,a5,0x2 + 300a6d6: 97ba add a5,a5,a4 + 300a6d8: 439c lw a5,0(a5) + 300a6da: e399 bnez a5,300a6e0 + isAperture = 0; + 300a6dc: fe0407a3 sb zero,-17(s0) + + return isAperture; + 300a6e0: fef44783 lbu a5,-17(s0) +} + 300a6e4: 853e mv a0,a5 + 300a6e6: 5432 lw s0,44(sp) + 300a6e8: 6145 addi sp,sp,48 + 300a6ea: 8082 ret + +0300a6ec : + + +VL53L0X_Error enable_spad_bit(uint8_t spadArray[], uint32_t size, + uint32_t spadIndex) +{ + 300a6ec: 7179 addi sp,sp,-48 + 300a6ee: d622 sw s0,44(sp) + 300a6f0: 1800 addi s0,sp,48 + 300a6f2: fca42e23 sw a0,-36(s0) + 300a6f6: fcb42c23 sw a1,-40(s0) + 300a6fa: fcc42a23 sw a2,-44(s0) + VL53L0X_Error status = VL53L0X_ERROR_NONE; + 300a6fe: fe0407a3 sb zero,-17(s0) + uint32_t cSpadsPerByte = 8; + 300a702: 47a1 li a5,8 + 300a704: fef42423 sw a5,-24(s0) + uint32_t coarseIndex; + uint32_t fineIndex; + + coarseIndex = spadIndex / cSpadsPerByte; + 300a708: fd442703 lw a4,-44(s0) + 300a70c: fe842783 lw a5,-24(s0) + 300a710: 02f757b3 divu a5,a4,a5 + 300a714: fef42223 sw a5,-28(s0) + fineIndex = spadIndex % cSpadsPerByte; + 300a718: fd442703 lw a4,-44(s0) + 300a71c: fe842783 lw a5,-24(s0) + 300a720: 02f777b3 remu a5,a4,a5 + 300a724: fef42023 sw a5,-32(s0) + if (coarseIndex >= size) + 300a728: fe442703 lw a4,-28(s0) + 300a72c: fd842783 lw a5,-40(s0) + 300a730: 00f76763 bltu a4,a5,300a73e + status = VL53L0X_ERROR_REF_SPAD_INIT; + 300a734: fce00793 li a5,-50 + 300a738: fef407a3 sb a5,-17(s0) + 300a73c: a82d j 300a776 + else + spadArray[coarseIndex] |= (1 << fineIndex); + 300a73e: fdc42703 lw a4,-36(s0) + 300a742: fe442783 lw a5,-28(s0) + 300a746: 97ba add a5,a5,a4 + 300a748: 239c lbu a5,0(a5) + 300a74a: 01879713 slli a4,a5,0x18 + 300a74e: 8761 srai a4,a4,0x18 + 300a750: 4685 li a3,1 + 300a752: fe042783 lw a5,-32(s0) + 300a756: 00f697b3 sll a5,a3,a5 + 300a75a: 07e2 slli a5,a5,0x18 + 300a75c: 87e1 srai a5,a5,0x18 + 300a75e: 8fd9 or a5,a5,a4 + 300a760: 01879693 slli a3,a5,0x18 + 300a764: 86e1 srai a3,a3,0x18 + 300a766: fdc42703 lw a4,-36(s0) + 300a76a: fe442783 lw a5,-28(s0) + 300a76e: 97ba add a5,a5,a4 + 300a770: 0ff6f713 andi a4,a3,255 + 300a774: a398 sb a4,0(a5) + + return status; + 300a776: fef40783 lb a5,-17(s0) +} + 300a77a: 853e mv a0,a5 + 300a77c: 5432 lw s0,44(sp) + 300a77e: 6145 addi sp,sp,48 + 300a780: 8082 ret + +0300a782 : + + return status; +} + +VL53L0X_Error set_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) +{ + 300a782: 7179 addi sp,sp,-48 + 300a784: d606 sw ra,44(sp) + 300a786: d422 sw s0,40(sp) + 300a788: 1800 addi s0,sp,48 + 300a78a: fca42e23 sw a0,-36(s0) + 300a78e: fcb42c23 sw a1,-40(s0) + VL53L0X_Error status = VL53L0X_WriteMulti(Dev, + 300a792: 4699 li a3,6 + 300a794: fd842603 lw a2,-40(s0) + 300a798: 0b000593 li a1,176 + 300a79c: fdc42503 lw a0,-36(s0) + 300a7a0: 401030ef jal ra,300e3a0 + 300a7a4: 87aa mv a5,a0 + 300a7a6: fef407a3 sb a5,-17(s0) + VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, + refSpadArray, 6); + return status; + 300a7aa: fef40783 lb a5,-17(s0) +} + 300a7ae: 853e mv a0,a5 + 300a7b0: 50b2 lw ra,44(sp) + 300a7b2: 5422 lw s0,40(sp) + 300a7b4: 6145 addi sp,sp,48 + 300a7b6: 8082 ret + +0300a7b8 : + +VL53L0X_Error get_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) +{ + 300a7b8: 7179 addi sp,sp,-48 + 300a7ba: d606 sw ra,44(sp) + 300a7bc: d422 sw s0,40(sp) + 300a7be: 1800 addi s0,sp,48 + 300a7c0: fca42e23 sw a0,-36(s0) + 300a7c4: fcb42c23 sw a1,-40(s0) + VL53L0X_Error status = VL53L0X_ReadMulti(Dev, + 300a7c8: 4699 li a3,6 + 300a7ca: fd842603 lw a2,-40(s0) + 300a7ce: 0b000593 li a1,176 + 300a7d2: fdc42503 lw a0,-36(s0) + 300a7d6: 43f030ef jal ra,300e414 + 300a7da: 87aa mv a5,a0 + 300a7dc: fef407a3 sb a5,-17(s0) + VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, + refSpadArray, + 6); + return status; + 300a7e0: fef40783 lb a5,-17(s0) +} + 300a7e4: 853e mv a0,a5 + 300a7e6: 50b2 lw ra,44(sp) + 300a7e8: 5422 lw s0,40(sp) + 300a7ea: 6145 addi sp,sp,48 + 300a7ec: 8082 ret + +0300a7ee : + uint32_t size, + uint32_t start, + uint32_t offset, + uint32_t spadCount, + uint32_t *lastSpad) +{ + 300a7ee: 715d addi sp,sp,-80 + 300a7f0: c686 sw ra,76(sp) + 300a7f2: c4a2 sw s0,72(sp) + 300a7f4: 0880 addi s0,sp,80 + 300a7f6: fca42623 sw a0,-52(s0) + 300a7fa: fcc42223 sw a2,-60(s0) + 300a7fe: fcd42023 sw a3,-64(s0) + 300a802: fae42e23 sw a4,-68(s0) + 300a806: faf42c23 sw a5,-72(s0) + 300a80a: fb042a23 sw a6,-76(s0) + 300a80e: fb142823 sw a7,-80(s0) + 300a812: 87ae mv a5,a1 + 300a814: fcf405a3 sb a5,-53(s0) + VL53L0X_Error status = VL53L0X_ERROR_NONE; + 300a818: fe0407a3 sb zero,-17(s0) + uint32_t index; + uint32_t i; + int32_t nextGoodSpad = offset; + 300a81c: fb442783 lw a5,-76(s0) + 300a820: fcf42e23 sw a5,-36(s0) + * + * This function applies to only aperture or only non-aperture spads. + * Checks are performed to ensure this. + */ + + currentSpad = offset; + 300a824: fb442783 lw a5,-76(s0) + 300a828: fef42023 sw a5,-32(s0) + for (index = 0; index < spadCount; index++) { + 300a82c: fe042423 sw zero,-24(s0) + 300a830: a8ad j 300a8aa + get_next_good_spad(goodSpadArray, size, currentSpad, + 300a832: fdc40793 addi a5,s0,-36 + 300a836: 86be mv a3,a5 + 300a838: fe042603 lw a2,-32(s0) + 300a83c: fbc42583 lw a1,-68(s0) + 300a840: fc442503 lw a0,-60(s0) + 300a844: 3b95 jal ra,300a5b8 + &nextGoodSpad); + + if (nextGoodSpad == -1) { + 300a846: fdc42703 lw a4,-36(s0) + 300a84a: 57fd li a5,-1 + 300a84c: 00f71763 bne a4,a5,300a85a + status = VL53L0X_ERROR_REF_SPAD_INIT; + 300a850: fce00793 li a5,-50 + 300a854: fef407a3 sb a5,-17(s0) + break; + 300a858: a8b9 j 300a8b6 + } + + /* Confirm that the next good SPAD is non-aperture */ + if (is_aperture(start + nextGoodSpad) != apertureSpads) { + 300a85a: fdc42783 lw a5,-36(s0) + 300a85e: 873e mv a4,a5 + 300a860: fb842783 lw a5,-72(s0) + 300a864: 97ba add a5,a5,a4 + 300a866: 853e mv a0,a5 + 300a868: 35a9 jal ra,300a6b2 + 300a86a: 87aa mv a5,a0 + 300a86c: 873e mv a4,a5 + 300a86e: fcb44783 lbu a5,-53(s0) + 300a872: 00e78763 beq a5,a4,300a880 + /* if we can't get the required number of good aperture + * spads from the current quadrant then this is an error + */ + status = VL53L0X_ERROR_REF_SPAD_INIT; + 300a876: fce00793 li a5,-50 + 300a87a: fef407a3 sb a5,-17(s0) + break; + 300a87e: a825 j 300a8b6 + } + currentSpad = (uint32_t)nextGoodSpad; + 300a880: fdc42783 lw a5,-36(s0) + 300a884: fef42023 sw a5,-32(s0) + enable_spad_bit(spadArray, size, currentSpad); + 300a888: fe042603 lw a2,-32(s0) + 300a88c: fbc42583 lw a1,-68(s0) + 300a890: fc042503 lw a0,-64(s0) + 300a894: 3da1 jal ra,300a6ec + currentSpad++; + 300a896: fe042783 lw a5,-32(s0) + 300a89a: 0785 addi a5,a5,1 + 300a89c: fef42023 sw a5,-32(s0) + for (index = 0; index < spadCount; index++) { + 300a8a0: fe842783 lw a5,-24(s0) + 300a8a4: 0785 addi a5,a5,1 + 300a8a6: fef42423 sw a5,-24(s0) + 300a8aa: fe842703 lw a4,-24(s0) + 300a8ae: fb042783 lw a5,-80(s0) + 300a8b2: f8f760e3 bltu a4,a5,300a832 + } + *lastSpad = currentSpad; + 300a8b6: 401c lw a5,0(s0) + 300a8b8: fe042703 lw a4,-32(s0) + 300a8bc: c398 sw a4,0(a5) + + if (status == VL53L0X_ERROR_NONE) + 300a8be: fef40783 lb a5,-17(s0) + 300a8c2: eb89 bnez a5,300a8d4 + status = set_ref_spad_map(Dev, spadArray); + 300a8c4: fc042583 lw a1,-64(s0) + 300a8c8: fcc42503 lw a0,-52(s0) + 300a8cc: 3d5d jal ra,300a782 + 300a8ce: 87aa mv a5,a0 + 300a8d0: fef407a3 sb a5,-17(s0) + + + if (status == VL53L0X_ERROR_NONE) { + 300a8d4: fef40783 lb a5,-17(s0) + 300a8d8: efa1 bnez a5,300a930 + status = get_ref_spad_map(Dev, checkSpadArray); + 300a8da: fd440793 addi a5,s0,-44 + 300a8de: 85be mv a1,a5 + 300a8e0: fcc42503 lw a0,-52(s0) + 300a8e4: 3dd1 jal ra,300a7b8 + 300a8e6: 87aa mv a5,a0 + 300a8e8: fef407a3 sb a5,-17(s0) + + i = 0; + 300a8ec: fe042223 sw zero,-28(s0) + + /* Compare spad maps. If not equal report error. */ + while (i < size) { + 300a8f0: a815 j 300a924 + if (spadArray[i] != checkSpadArray[i]) { + 300a8f2: fc042703 lw a4,-64(s0) + 300a8f6: fe442783 lw a5,-28(s0) + 300a8fa: 97ba add a5,a5,a4 + 300a8fc: 2398 lbu a4,0(a5) + 300a8fe: fe442783 lw a5,-28(s0) + 300a902: ff040693 addi a3,s0,-16 + 300a906: 97b6 add a5,a5,a3 + 300a908: fe47c783 lbu a5,-28(a5) + 300a90c: 00f70763 beq a4,a5,300a91a + status = VL53L0X_ERROR_REF_SPAD_INIT; + 300a910: fce00793 li a5,-50 + 300a914: fef407a3 sb a5,-17(s0) + break; + 300a918: a821 j 300a930 + } + i++; + 300a91a: fe442783 lw a5,-28(s0) + 300a91e: 0785 addi a5,a5,1 + 300a920: fef42223 sw a5,-28(s0) + while (i < size) { + 300a924: fe442703 lw a4,-28(s0) + 300a928: fbc42783 lw a5,-68(s0) + 300a92c: fcf763e3 bltu a4,a5,300a8f2 + } + } + return status; + 300a930: fef40783 lb a5,-17(s0) +} + 300a934: 853e mv a0,a5 + 300a936: 40b6 lw ra,76(sp) + 300a938: 4426 lw s0,72(sp) + 300a93a: 6161 addi sp,sp,80 + 300a93c: 8082 ret + +0300a93e : + + +VL53L0X_Error perform_ref_signal_measurement(VL53L0X_DEV Dev, + uint16_t *refSignalRate) +{ + 300a93e: 7139 addi sp,sp,-64 + 300a940: de06 sw ra,60(sp) + 300a942: dc22 sw s0,56(sp) + 300a944: 0080 addi s0,sp,64 + 300a946: fca42623 sw a0,-52(s0) + 300a94a: fcb42423 sw a1,-56(s0) + VL53L0X_Error status = VL53L0X_ERROR_NONE; + 300a94e: fe0407a3 sb zero,-17(s0) + VL53L0X_RangingMeasurementData_t rangingMeasurementData; + + uint8_t SequenceConfig = 0; + 300a952: fe040723 sb zero,-18(s0) + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + 300a956: fcc42783 lw a5,-52(s0) + 300a95a: 15c7c783 lbu a5,348(a5) + 300a95e: fef40723 sb a5,-18(s0) + + /* + * This function performs a reference signal rate measurement. + */ + if (status == VL53L0X_ERROR_NONE) + 300a962: fef40783 lb a5,-17(s0) + 300a966: eb91 bnez a5,300a97a + status = VL53L0X_WrByte(Dev, + 300a968: 0c000613 li a2,192 + 300a96c: 4585 li a1,1 + 300a96e: fcc42503 lw a0,-52(s0) + 300a972: 206d jal ra,300aa1c + 300a974: 87aa mv a5,a0 + 300a976: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0xC0); + + if (status == VL53L0X_ERROR_NONE) + 300a97a: fef40783 lb a5,-17(s0) + 300a97e: eb99 bnez a5,300a994 + status = VL53L0X_PerformSingleRangingMeasurement(Dev, + 300a980: fd040793 addi a5,s0,-48 + 300a984: 85be mv a1,a5 + 300a986: fcc42503 lw a0,-52(s0) + 300a98a: e9cff0ef jal ra,300a026 + 300a98e: 87aa mv a5,a0 + 300a990: fef407a3 sb a5,-17(s0) + &rangingMeasurementData); + + if (status == VL53L0X_ERROR_NONE) + 300a994: fef40783 lb a5,-17(s0) + 300a998: eb91 bnez a5,300a9ac + status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300a99a: 4605 li a2,1 + 300a99c: 0ff00593 li a1,255 + 300a9a0: fcc42503 lw a0,-52(s0) + 300a9a4: 28a5 jal ra,300aa1c + 300a9a6: 87aa mv a5,a0 + 300a9a8: fef407a3 sb a5,-17(s0) + + if (status == VL53L0X_ERROR_NONE) + 300a9ac: fef40783 lb a5,-17(s0) + 300a9b0: eb99 bnez a5,300a9c6 + status = VL53L0X_RdWord(Dev, + 300a9b2: fc842603 lw a2,-56(s0) + 300a9b6: 0b600593 li a1,182 + 300a9ba: fcc42503 lw a0,-52(s0) + 300a9be: 28a9 jal ra,300aa18 + 300a9c0: 87aa mv a5,a0 + 300a9c2: fef407a3 sb a5,-17(s0) + VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, + refSignalRate); + + if (status == VL53L0X_ERROR_NONE) + 300a9c6: fef40783 lb a5,-17(s0) + 300a9ca: eb91 bnez a5,300a9de + status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300a9cc: 4601 li a2,0 + 300a9ce: 0ff00593 li a1,255 + 300a9d2: fcc42503 lw a0,-52(s0) + 300a9d6: 2099 jal ra,300aa1c + 300a9d8: 87aa mv a5,a0 + 300a9da: fef407a3 sb a5,-17(s0) + + if (status == VL53L0X_ERROR_NONE) { + 300a9de: fef40783 lb a5,-17(s0) + 300a9e2: e785 bnez a5,300aa0a + /* restore the previous Sequence Config */ + status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 300a9e4: fee44783 lbu a5,-18(s0) + 300a9e8: 863e mv a2,a5 + 300a9ea: 4585 li a1,1 + 300a9ec: fcc42503 lw a0,-52(s0) + 300a9f0: 2035 jal ra,300aa1c + 300a9f2: 87aa mv a5,a0 + 300a9f4: fef407a3 sb a5,-17(s0) + SequenceConfig); + if (status == VL53L0X_ERROR_NONE) + 300a9f8: fef40783 lb a5,-17(s0) + 300a9fc: e799 bnez a5,300aa0a + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + 300a9fe: fcc42783 lw a5,-52(s0) + 300aa02: fee44703 lbu a4,-18(s0) + 300aa06: 14e78e23 sb a4,348(a5) + } + + return status; + 300aa0a: fef40783 lb a5,-17(s0) +} + 300aa0e: 853e mv a0,a5 + 300aa10: 50f2 lw ra,60(sp) + 300aa12: 5462 lw s0,56(sp) + 300aa14: 6121 addi sp,sp,64 + 300aa16: 8082 ret + +0300aa18 : + 300aa18: 4210306f j 300e638 + +0300aa1c : + 300aa1c: 2690306f j 300e484 + +0300aa20 : + +VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, + uint32_t *refSpadCount, + uint8_t *isApertureSpads) +{ + 300aa20: 7119 addi sp,sp,-128 + 300aa22: de86 sw ra,124(sp) + 300aa24: dca2 sw s0,120(sp) + 300aa26: 0100 addi s0,sp,128 + 300aa28: f8a42e23 sw a0,-100(s0) + 300aa2c: f8b42c23 sw a1,-104(s0) + 300aa30: f8c42a23 sw a2,-108(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300aa34: fe0407a3 sb zero,-17(s0) + uint8_t lastSpadArray[6]; + uint8_t startSelect = 0xB4; + 300aa38: fb400793 li a5,-76 + 300aa3c: fcf40923 sb a5,-46(s0) + uint32_t minimumSpadCount = 3; + 300aa40: 478d li a5,3 + 300aa42: fcf42623 sw a5,-52(s0) + uint32_t maxSpadCount = 44; + 300aa46: 02c00793 li a5,44 + 300aa4a: fcf42423 sw a5,-56(s0) + uint32_t currentSpadIndex = 0; + 300aa4e: fe042423 sw zero,-24(s0) + uint32_t lastSpadIndex = 0; + 300aa52: fa042823 sw zero,-80(s0) + int32_t nextGoodSpad = 0; + 300aa56: fa042623 sw zero,-84(s0) + uint16_t targetRefRate = 0x0A00; /* 20 MCPS in 9:7 format */ + 300aa5a: 6785 lui a5,0x1 + 300aa5c: a0078793 addi a5,a5,-1536 # a00 + 300aa60: fcf41323 sh a5,-58(s0) + uint16_t peakSignalRateRef; + uint32_t needAptSpads = 0; + 300aa64: fe042223 sw zero,-28(s0) + uint32_t index = 0; + 300aa68: fe042023 sw zero,-32(s0) + uint32_t spadArraySize = 6; + 300aa6c: 4799 li a5,6 + 300aa6e: fcf42023 sw a5,-64(s0) + uint32_t signalRateDiff = 0; + 300aa72: fa042e23 sw zero,-68(s0) + uint32_t lastSignalRateDiff = 0; + 300aa76: fc042e23 sw zero,-36(s0) + uint8_t complete = 0; + 300aa7a: fc040da3 sb zero,-37(s0) + uint8_t VhvSettings = 0; + 300aa7e: fa0404a3 sb zero,-87(s0) + uint8_t PhaseCal = 0; + 300aa82: fa040423 sb zero,-88(s0) + uint32_t refSpadCount_int = 0; + 300aa86: fc042a23 sw zero,-44(s0) + uint8_t isApertureSpads_int = 0; + 300aa8a: fc0409a3 sb zero,-45(s0) + * of the non-aperture quadrant and runs in to the adjacent aperture + * quadrant. + */ + + + targetRefRate = PALDevDataGet(Dev, targetRefRate); + 300aa8e: f9c42783 lw a5,-100(s0) + 300aa92: 1687d783 lhu a5,360(a5) + 300aa96: fcf41323 sh a5,-58(s0) + * This is a short term implementation. The good spad map will be + * provided as an input. + * Note that there are 6 bytes. Only the first 44 bits will be used to + * represent spads. + */ + for (index = 0; index < spadArraySize; index++) + 300aa9a: fe042023 sw zero,-32(s0) + 300aa9e: a829 j 300aab8 + Dev->Data.SpadData.RefSpadEnables[index] = 0; + 300aaa0: f9c42703 lw a4,-100(s0) + 300aaa4: fe042783 lw a5,-32(s0) + 300aaa8: 97ba add a5,a5,a4 + 300aaaa: 14078823 sb zero,336(a5) + for (index = 0; index < spadArraySize; index++) + 300aaae: fe042783 lw a5,-32(s0) + 300aab2: 0785 addi a5,a5,1 + 300aab4: fef42023 sw a5,-32(s0) + 300aab8: fe042703 lw a4,-32(s0) + 300aabc: fc042783 lw a5,-64(s0) + 300aac0: fef760e3 bltu a4,a5,300aaa0 + + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300aac4: 4605 li a2,1 + 300aac6: 0ff00593 li a1,255 + 300aaca: f9c42503 lw a0,-100(s0) + 300aace: 37b9 jal ra,300aa1c + 300aad0: 87aa mv a5,a0 + 300aad2: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300aad6: fef40783 lb a5,-17(s0) + 300aada: eb91 bnez a5,300aaee + Status = VL53L0X_WrByte(Dev, + 300aadc: 4601 li a2,0 + 300aade: 04f00593 li a1,79 + 300aae2: f9c42503 lw a0,-100(s0) + 300aae6: 3f1d jal ra,300aa1c + 300aae8: 87aa mv a5,a0 + 300aaea: fef407a3 sb a5,-17(s0) + VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + 300aaee: fef40783 lb a5,-17(s0) + 300aaf2: eb99 bnez a5,300ab08 + Status = VL53L0X_WrByte(Dev, + 300aaf4: 02c00613 li a2,44 + 300aaf8: 04e00593 li a1,78 + 300aafc: f9c42503 lw a0,-100(s0) + 300ab00: 3f31 jal ra,300aa1c + 300ab02: 87aa mv a5,a0 + 300ab04: fef407a3 sb a5,-17(s0) + VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + + if (Status == VL53L0X_ERROR_NONE) + 300ab08: fef40783 lb a5,-17(s0) + 300ab0c: eb91 bnez a5,300ab20 + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300ab0e: 4601 li a2,0 + 300ab10: 0ff00593 li a1,255 + 300ab14: f9c42503 lw a0,-100(s0) + 300ab18: 3711 jal ra,300aa1c + 300ab1a: 87aa mv a5,a0 + 300ab1c: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300ab20: fef40783 lb a5,-17(s0) + 300ab24: ef81 bnez a5,300ab3c + Status = VL53L0X_WrByte(Dev, + 300ab26: fd244783 lbu a5,-46(s0) + 300ab2a: 863e mv a2,a5 + 300ab2c: 0b600593 li a1,182 + 300ab30: f9c42503 lw a0,-100(s0) + 300ab34: 35e5 jal ra,300aa1c + 300ab36: 87aa mv a5,a0 + 300ab38: fef407a3 sb a5,-17(s0) + VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, + startSelect); + + + if (Status == VL53L0X_ERROR_NONE) + 300ab3c: fef40783 lb a5,-17(s0) + 300ab40: eb91 bnez a5,300ab54 + Status = VL53L0X_WrByte(Dev, + 300ab42: 4601 li a2,0 + 300ab44: 08000593 li a1,128 + 300ab48: f9c42503 lw a0,-100(s0) + 300ab4c: 3dc1 jal ra,300aa1c + 300ab4e: 87aa mv a5,a0 + 300ab50: fef407a3 sb a5,-17(s0) + VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE, 0); + + /* Perform ref calibration */ + if (Status == VL53L0X_ERROR_NONE) + 300ab54: fef40783 lb a5,-17(s0) + 300ab58: ef99 bnez a5,300ab76 + Status = VL53L0X_perform_ref_calibration(Dev, &VhvSettings, + 300ab5a: fa840713 addi a4,s0,-88 + 300ab5e: fa940793 addi a5,s0,-87 + 300ab62: 4681 li a3,0 + 300ab64: 863a mv a2,a4 + 300ab66: 85be mv a1,a5 + 300ab68: f9c42503 lw a0,-100(s0) + 300ab6c: 0d5000ef jal ra,300b440 + 300ab70: 87aa mv a5,a0 + 300ab72: fef407a3 sb a5,-17(s0) + &PhaseCal, 0); + + if (Status == VL53L0X_ERROR_NONE) { + 300ab76: fef40783 lb a5,-17(s0) + 300ab7a: e7b9 bnez a5,300abc8 + /* Enable Minimum NON-APERTURE Spads */ + currentSpadIndex = 0; + 300ab7c: fe042423 sw zero,-24(s0) + lastSpadIndex = currentSpadIndex; + 300ab80: fe842783 lw a5,-24(s0) + 300ab84: faf42823 sw a5,-80(s0) + needAptSpads = 0; + 300ab88: fe042223 sw zero,-28(s0) + Status = enable_ref_spads(Dev, + 300ab8c: fe442783 lw a5,-28(s0) + 300ab90: 0ff7f593 andi a1,a5,255 + needAptSpads, + Dev->Data.SpadData.RefGoodSpadMap, + 300ab94: f9c42783 lw a5,-100(s0) + 300ab98: 15678613 addi a2,a5,342 + Dev->Data.SpadData.RefSpadEnables, + 300ab9c: f9c42783 lw a5,-100(s0) + 300aba0: 15078693 addi a3,a5,336 + Status = enable_ref_spads(Dev, + 300aba4: fd244703 lbu a4,-46(s0) + 300aba8: fb040793 addi a5,s0,-80 + 300abac: c03e sw a5,0(sp) + 300abae: fcc42883 lw a7,-52(s0) + 300abb2: fe842803 lw a6,-24(s0) + 300abb6: 87ba mv a5,a4 + 300abb8: fc042703 lw a4,-64(s0) + 300abbc: f9c42503 lw a0,-100(s0) + 300abc0: 313d jal ra,300a7ee + 300abc2: 87aa mv a5,a0 + 300abc4: fef407a3 sb a5,-17(s0) + currentSpadIndex, + minimumSpadCount, + &lastSpadIndex); + } + + if (Status == VL53L0X_ERROR_NONE) { + 300abc8: fef40783 lb a5,-17(s0) + 300abcc: 10079863 bnez a5,300acdc + currentSpadIndex = lastSpadIndex; + 300abd0: fb042783 lw a5,-80(s0) + 300abd4: fef42423 sw a5,-24(s0) + + Status = perform_ref_signal_measurement(Dev, + 300abd8: faa40793 addi a5,s0,-86 + 300abdc: 85be mv a1,a5 + 300abde: f9c42503 lw a0,-100(s0) + 300abe2: 3bb1 jal ra,300a93e + 300abe4: 87aa mv a5,a0 + 300abe6: fef407a3 sb a5,-17(s0) + &peakSignalRateRef); + if ((Status == VL53L0X_ERROR_NONE) && + 300abea: fef40783 lb a5,-17(s0) + 300abee: e3fd bnez a5,300acd4 + (peakSignalRateRef > targetRefRate)) { + 300abf0: faa45783 lhu a5,-86(s0) + if ((Status == VL53L0X_ERROR_NONE) && + 300abf4: fc645703 lhu a4,-58(s0) + 300abf8: 0cf77e63 bgeu a4,a5,300acd4 + /* Signal rate measurement too high, + * switch to APERTURE SPADs + */ + + for (index = 0; index < spadArraySize; index++) + 300abfc: fe042023 sw zero,-32(s0) + 300ac00: a829 j 300ac1a + Dev->Data.SpadData.RefSpadEnables[index] = 0; + 300ac02: f9c42703 lw a4,-100(s0) + 300ac06: fe042783 lw a5,-32(s0) + 300ac0a: 97ba add a5,a5,a4 + 300ac0c: 14078823 sb zero,336(a5) + for (index = 0; index < spadArraySize; index++) + 300ac10: fe042783 lw a5,-32(s0) + 300ac14: 0785 addi a5,a5,1 + 300ac16: fef42023 sw a5,-32(s0) + 300ac1a: fe042703 lw a4,-32(s0) + 300ac1e: fc042783 lw a5,-64(s0) + 300ac22: fef760e3 bltu a4,a5,300ac02 + + + /* Increment to the first APERTURE spad */ + while ((is_aperture(startSelect + currentSpadIndex) + 300ac26: a031 j 300ac32 + == 0) && (currentSpadIndex < maxSpadCount)) { + currentSpadIndex++; + 300ac28: fe842783 lw a5,-24(s0) + 300ac2c: 0785 addi a5,a5,1 + 300ac2e: fef42423 sw a5,-24(s0) + while ((is_aperture(startSelect + currentSpadIndex) + 300ac32: fd244703 lbu a4,-46(s0) + 300ac36: fe842783 lw a5,-24(s0) + 300ac3a: 97ba add a5,a5,a4 + 300ac3c: 853e mv a0,a5 + 300ac3e: 3c95 jal ra,300a6b2 + 300ac40: 87aa mv a5,a0 + 300ac42: e799 bnez a5,300ac50 + == 0) && (currentSpadIndex < maxSpadCount)) { + 300ac44: fe842703 lw a4,-24(s0) + 300ac48: fc842783 lw a5,-56(s0) + 300ac4c: fcf76ee3 bltu a4,a5,300ac28 + } + + needAptSpads = 1; + 300ac50: 4785 li a5,1 + 300ac52: fef42223 sw a5,-28(s0) + + Status = enable_ref_spads(Dev, + 300ac56: fe442783 lw a5,-28(s0) + 300ac5a: 0ff7f593 andi a1,a5,255 + needAptSpads, + Dev->Data.SpadData.RefGoodSpadMap, + 300ac5e: f9c42783 lw a5,-100(s0) + 300ac62: 15678613 addi a2,a5,342 + Dev->Data.SpadData.RefSpadEnables, + 300ac66: f9c42783 lw a5,-100(s0) + 300ac6a: 15078693 addi a3,a5,336 + Status = enable_ref_spads(Dev, + 300ac6e: fd244703 lbu a4,-46(s0) + 300ac72: fb040793 addi a5,s0,-80 + 300ac76: c03e sw a5,0(sp) + 300ac78: fcc42883 lw a7,-52(s0) + 300ac7c: fe842803 lw a6,-24(s0) + 300ac80: 87ba mv a5,a4 + 300ac82: fc042703 lw a4,-64(s0) + 300ac86: f9c42503 lw a0,-100(s0) + 300ac8a: 3695 jal ra,300a7ee + 300ac8c: 87aa mv a5,a0 + 300ac8e: fef407a3 sb a5,-17(s0) + startSelect, + currentSpadIndex, + minimumSpadCount, + &lastSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + 300ac92: fef40783 lb a5,-17(s0) + 300ac96: e3b1 bnez a5,300acda + currentSpadIndex = lastSpadIndex; + 300ac98: fb042783 lw a5,-80(s0) + 300ac9c: fef42423 sw a5,-24(s0) + Status = perform_ref_signal_measurement(Dev, + 300aca0: faa40793 addi a5,s0,-86 + 300aca4: 85be mv a1,a5 + 300aca6: f9c42503 lw a0,-100(s0) + 300acaa: 3951 jal ra,300a93e + 300acac: 87aa mv a5,a0 + 300acae: fef407a3 sb a5,-17(s0) + &peakSignalRateRef); + + if ((Status == VL53L0X_ERROR_NONE) && + 300acb2: fef40783 lb a5,-17(s0) + 300acb6: e395 bnez a5,300acda + (peakSignalRateRef > targetRefRate)) { + 300acb8: faa45783 lhu a5,-86(s0) + if ((Status == VL53L0X_ERROR_NONE) && + 300acbc: fc645703 lhu a4,-58(s0) + 300acc0: 00f77d63 bgeu a4,a5,300acda + * setting the minimum number of + * APERTURE spads. Can do no more + * therefore set the min number of + * aperture spads as the result. + */ + isApertureSpads_int = 1; + 300acc4: 4785 li a5,1 + 300acc6: fcf409a3 sb a5,-45(s0) + refSpadCount_int = minimumSpadCount; + 300acca: fcc42783 lw a5,-52(s0) + 300acce: fcf42a23 sw a5,-44(s0) + if (Status == VL53L0X_ERROR_NONE) { + 300acd2: a021 j 300acda + } + } + } else { + needAptSpads = 0; + 300acd4: fe042223 sw zero,-28(s0) + 300acd8: a011 j 300acdc + if (Status == VL53L0X_ERROR_NONE) { + 300acda: 0001 nop + } + } + + if ((Status == VL53L0X_ERROR_NONE) && + 300acdc: fef40783 lb a5,-17(s0) + 300ace0: 1a079863 bnez a5,300ae90 + (peakSignalRateRef < targetRefRate)) { + 300ace4: faa45783 lhu a5,-86(s0) + if ((Status == VL53L0X_ERROR_NONE) && + 300ace8: fc645703 lhu a4,-58(s0) + 300acec: 1ae7f263 bgeu a5,a4,300ae90 + /* At this point, the minimum number of either aperture + * or non-aperture spads have been set. Proceed to add + * spads and perform measurements until the target + * reference is reached. + */ + isApertureSpads_int = needAptSpads; + 300acf0: fe442783 lw a5,-28(s0) + 300acf4: fcf409a3 sb a5,-45(s0) + refSpadCount_int = minimumSpadCount; + 300acf8: fcc42783 lw a5,-52(s0) + 300acfc: fcf42a23 sw a5,-44(s0) + + memcpy(lastSpadArray, Dev->Data.SpadData.RefSpadEnables, + 300ad00: f9c42783 lw a5,-100(s0) + 300ad04: 15078713 addi a4,a5,336 + 300ad08: fb440793 addi a5,s0,-76 + 300ad0c: fc042603 lw a2,-64(s0) + 300ad10: 85ba mv a1,a4 + 300ad12: 853e mv a0,a5 + 300ad14: 22f9 jal ra,300aee2 + spadArraySize); + lastSignalRateDiff = abs(peakSignalRateRef - + 300ad16: faa45783 lhu a5,-86(s0) + 300ad1a: 873e mv a4,a5 + 300ad1c: fc645783 lhu a5,-58(s0) + 300ad20: 40f707b3 sub a5,a4,a5 + 300ad24: 853e mv a0,a5 + 300ad26: 3fb030ef jal ra,300e920 + 300ad2a: 87aa mv a5,a0 + 300ad2c: fcf42e23 sw a5,-36(s0) + targetRefRate); + complete = 0; + 300ad30: fc040da3 sb zero,-37(s0) + + while (!complete) { + 300ad34: a2b1 j 300ae80 + get_next_good_spad( + Dev->Data.SpadData.RefGoodSpadMap, + 300ad36: f9c42783 lw a5,-100(s0) + 300ad3a: 15678793 addi a5,a5,342 + get_next_good_spad( + 300ad3e: fac40713 addi a4,s0,-84 + 300ad42: 86ba mv a3,a4 + 300ad44: fe842603 lw a2,-24(s0) + 300ad48: fc042583 lw a1,-64(s0) + 300ad4c: 853e mv a0,a5 + 300ad4e: 30ad jal ra,300a5b8 + spadArraySize, currentSpadIndex, + &nextGoodSpad); + + if (nextGoodSpad == -1) { + 300ad50: fac42703 lw a4,-84(s0) + 300ad54: 57fd li a5,-1 + 300ad56: 00f71763 bne a4,a5,300ad64 + Status = VL53L0X_ERROR_REF_SPAD_INIT; + 300ad5a: fce00793 li a5,-50 + 300ad5e: fef407a3 sb a5,-17(s0) + break; + 300ad62: a23d j 300ae90 + } + + /* Cannot combine Aperture and Non-Aperture spads, so + * ensure the current spad is of the correct type. + */ + if (is_aperture((uint32_t)startSelect + nextGoodSpad) != + 300ad64: fd244783 lbu a5,-46(s0) + 300ad68: fac42703 lw a4,-84(s0) + 300ad6c: 97ba add a5,a5,a4 + 300ad6e: 853e mv a0,a5 + 300ad70: 3289 jal ra,300a6b2 + 300ad72: 87aa mv a5,a0 + 300ad74: 873e mv a4,a5 + 300ad76: fe442783 lw a5,-28(s0) + 300ad7a: 00e78663 beq a5,a4,300ad86 + needAptSpads) { + /* At this point we have enabled the maximum + * number of Aperture spads. + */ + complete = 1; + 300ad7e: 4785 li a5,1 + 300ad80: fcf40da3 sb a5,-37(s0) + break; + 300ad84: a231 j 300ae90 + } + + (refSpadCount_int)++; + 300ad86: fd442783 lw a5,-44(s0) + 300ad8a: 0785 addi a5,a5,1 + 300ad8c: fcf42a23 sw a5,-44(s0) + + currentSpadIndex = nextGoodSpad; + 300ad90: fac42783 lw a5,-84(s0) + 300ad94: fef42423 sw a5,-24(s0) + Status = enable_spad_bit( + Dev->Data.SpadData.RefSpadEnables, + 300ad98: f9c42783 lw a5,-100(s0) + 300ad9c: 15078793 addi a5,a5,336 + Status = enable_spad_bit( + 300ada0: fe842603 lw a2,-24(s0) + 300ada4: fc042583 lw a1,-64(s0) + 300ada8: 853e mv a0,a5 + 300adaa: 3289 jal ra,300a6ec + 300adac: 87aa mv a5,a0 + 300adae: fef407a3 sb a5,-17(s0) + spadArraySize, currentSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + 300adb2: fef40783 lb a5,-17(s0) + 300adb6: e38d bnez a5,300add8 + currentSpadIndex++; + 300adb8: fe842783 lw a5,-24(s0) + 300adbc: 0785 addi a5,a5,1 + 300adbe: fef42423 sw a5,-24(s0) + /* Proceed to apply the additional spad and + * perform measurement. + */ + Status = set_ref_spad_map(Dev, + Dev->Data.SpadData.RefSpadEnables); + 300adc2: f9c42783 lw a5,-100(s0) + 300adc6: 15078793 addi a5,a5,336 + Status = set_ref_spad_map(Dev, + 300adca: 85be mv a1,a5 + 300adcc: f9c42503 lw a0,-100(s0) + 300add0: 3a4d jal ra,300a782 + 300add2: 87aa mv a5,a0 + 300add4: fef407a3 sb a5,-17(s0) + } + + if (Status != VL53L0X_ERROR_NONE) + 300add8: fef40783 lb a5,-17(s0) + 300addc: e7dd bnez a5,300ae8a + break; + + Status = perform_ref_signal_measurement(Dev, + 300adde: faa40793 addi a5,s0,-86 + 300ade2: 85be mv a1,a5 + 300ade4: f9c42503 lw a0,-100(s0) + 300ade8: 3e99 jal ra,300a93e + 300adea: 87aa mv a5,a0 + 300adec: fef407a3 sb a5,-17(s0) + &peakSignalRateRef); + + if (Status != VL53L0X_ERROR_NONE) + 300adf0: fef40783 lb a5,-17(s0) + 300adf4: efc9 bnez a5,300ae8e + break; + + signalRateDiff = abs(peakSignalRateRef - targetRefRate); + 300adf6: faa45783 lhu a5,-86(s0) + 300adfa: 873e mv a4,a5 + 300adfc: fc645783 lhu a5,-58(s0) + 300ae00: 40f707b3 sub a5,a4,a5 + 300ae04: 853e mv a0,a5 + 300ae06: 31b030ef jal ra,300e920 + 300ae0a: 87aa mv a5,a0 + 300ae0c: faf42e23 sw a5,-68(s0) + + if (peakSignalRateRef > targetRefRate) { + 300ae10: faa45783 lhu a5,-86(s0) + 300ae14: fc645703 lhu a4,-58(s0) + 300ae18: 04f77563 bgeu a4,a5,300ae62 + /* Select the spad map that provides the + * measurement closest to the target rate, + * either above or below it. + */ + if (signalRateDiff > lastSignalRateDiff) { + 300ae1c: fbc42703 lw a4,-68(s0) + 300ae20: fdc42783 lw a5,-36(s0) + 300ae24: 02e7fb63 bgeu a5,a4,300ae5a + /* Previous spad map produced a closer + * measurement, so choose this. + */ + Status = set_ref_spad_map(Dev, + 300ae28: fb440793 addi a5,s0,-76 + 300ae2c: 85be mv a1,a5 + 300ae2e: f9c42503 lw a0,-100(s0) + 300ae32: 3a81 jal ra,300a782 + 300ae34: 87aa mv a5,a0 + 300ae36: fef407a3 sb a5,-17(s0) + lastSpadArray); + memcpy( + Dev->Data.SpadData.RefSpadEnables, + 300ae3a: f9c42783 lw a5,-100(s0) + 300ae3e: 15078793 addi a5,a5,336 + memcpy( + 300ae42: fb440713 addi a4,s0,-76 + 300ae46: fc042603 lw a2,-64(s0) + 300ae4a: 85ba mv a1,a4 + 300ae4c: 853e mv a0,a5 + 300ae4e: 2851 jal ra,300aee2 + lastSpadArray, spadArraySize); + + (refSpadCount_int)--; + 300ae50: fd442783 lw a5,-44(s0) + 300ae54: 17fd addi a5,a5,-1 + 300ae56: fcf42a23 sw a5,-44(s0) + } + complete = 1; + 300ae5a: 4785 li a5,1 + 300ae5c: fcf40da3 sb a5,-37(s0) + 300ae60: a005 j 300ae80 + } else { + /* Continue to add spads */ + lastSignalRateDiff = signalRateDiff; + 300ae62: fbc42783 lw a5,-68(s0) + 300ae66: fcf42e23 sw a5,-36(s0) + memcpy(lastSpadArray, + Dev->Data.SpadData.RefSpadEnables, + 300ae6a: f9c42783 lw a5,-100(s0) + 300ae6e: 15078713 addi a4,a5,336 + memcpy(lastSpadArray, + 300ae72: fb440793 addi a5,s0,-76 + 300ae76: fc042603 lw a2,-64(s0) + 300ae7a: 85ba mv a1,a4 + 300ae7c: 853e mv a0,a5 + 300ae7e: 2095 jal ra,300aee2 + while (!complete) { + 300ae80: fdb44783 lbu a5,-37(s0) + 300ae84: ea0789e3 beqz a5,300ad36 + 300ae88: a021 j 300ae90 + break; + 300ae8a: 0001 nop + 300ae8c: a011 j 300ae90 + break; + 300ae8e: 0001 nop + } + + } /* while */ + } + + if (Status == VL53L0X_ERROR_NONE) { + 300ae90: fef40783 lb a5,-17(s0) + 300ae94: e3a1 bnez a5,300aed4 + *refSpadCount = refSpadCount_int; + 300ae96: f9842783 lw a5,-104(s0) + 300ae9a: fd442703 lw a4,-44(s0) + 300ae9e: c398 sw a4,0(a5) + *isApertureSpads = isApertureSpads_int; + 300aea0: f9442783 lw a5,-108(s0) + 300aea4: fd344703 lbu a4,-45(s0) + 300aea8: a398 sb a4,0(a5) + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); + 300aeaa: f9c42783 lw a5,-100(s0) + 300aeae: 4705 li a4,1 + 300aeb0: 14e780a3 sb a4,321(a5) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300aeb4: f9842783 lw a5,-104(s0) + 300aeb8: 439c lw a5,0(a5) + 300aeba: 0ff7f713 andi a4,a5,255 + 300aebe: f9c42783 lw a5,-100(s0) + 300aec2: 12e78fa3 sb a4,319(a5) + ReferenceSpadCount, (uint8_t)(*refSpadCount)); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300aec6: f9442783 lw a5,-108(s0) + 300aeca: 2398 lbu a4,0(a5) + 300aecc: f9c42783 lw a5,-100(s0) + 300aed0: 14e78023 sb a4,320(a5) + ReferenceSpadType, *isApertureSpads); + } + + return Status; + 300aed4: fef40783 lb a5,-17(s0) +} + 300aed8: 853e mv a0,a5 + 300aeda: 50f6 lw ra,124(sp) + 300aedc: 5466 lw s0,120(sp) + 300aede: 6109 addi sp,sp,128 + 300aee0: 8082 ret + +0300aee2 : + 300aee2: 2490306f j 300e92a + +0300aee6 : + +VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, + uint32_t count, uint8_t isApertureSpads) +{ + 300aee6: 715d addi sp,sp,-80 + 300aee8: c686 sw ra,76(sp) + 300aeea: c4a2 sw s0,72(sp) + 300aeec: 0880 addi s0,sp,80 + 300aeee: fca42623 sw a0,-52(s0) + 300aef2: fcb42423 sw a1,-56(s0) + 300aef6: 87b2 mv a5,a2 + 300aef8: fcf403a3 sb a5,-57(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300aefc: fe0407a3 sb zero,-17(s0) + uint32_t currentSpadIndex = 0; + 300af00: fe042423 sw zero,-24(s0) + uint8_t startSelect = 0xB4; + 300af04: fb400793 li a5,-76 + 300af08: fef401a3 sb a5,-29(s0) + uint32_t spadArraySize = 6; + 300af0c: 4799 li a5,6 + 300af0e: fcf42e23 sw a5,-36(s0) + uint32_t maxSpadCount = 44; + 300af12: 02c00793 li a5,44 + 300af16: fcf42c23 sw a5,-40(s0) + * aperture or + * non-aperture, as requested. + * The good spad map will be applied. + */ + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300af1a: 4605 li a2,1 + 300af1c: 0ff00593 li a1,255 + 300af20: fcc42503 lw a0,-52(s0) + 300af24: 3ce5 jal ra,300aa1c + 300af26: 87aa mv a5,a0 + 300af28: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300af2c: fef40783 lb a5,-17(s0) + 300af30: eb91 bnez a5,300af44 + Status = VL53L0X_WrByte(Dev, + 300af32: 4601 li a2,0 + 300af34: 04f00593 li a1,79 + 300af38: fcc42503 lw a0,-52(s0) + 300af3c: 34c5 jal ra,300aa1c + 300af3e: 87aa mv a5,a0 + 300af40: fef407a3 sb a5,-17(s0) + VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + 300af44: fef40783 lb a5,-17(s0) + 300af48: eb99 bnez a5,300af5e + Status = VL53L0X_WrByte(Dev, + 300af4a: 02c00613 li a2,44 + 300af4e: 04e00593 li a1,78 + 300af52: fcc42503 lw a0,-52(s0) + 300af56: 34d9 jal ra,300aa1c + 300af58: 87aa mv a5,a0 + 300af5a: fef407a3 sb a5,-17(s0) + VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + + if (Status == VL53L0X_ERROR_NONE) + 300af5e: fef40783 lb a5,-17(s0) + 300af62: eb91 bnez a5,300af76 + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300af64: 4601 li a2,0 + 300af66: 0ff00593 li a1,255 + 300af6a: fcc42503 lw a0,-52(s0) + 300af6e: 347d jal ra,300aa1c + 300af70: 87aa mv a5,a0 + 300af72: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300af76: fef40783 lb a5,-17(s0) + 300af7a: ef81 bnez a5,300af92 + Status = VL53L0X_WrByte(Dev, + 300af7c: fe344783 lbu a5,-29(s0) + 300af80: 863e mv a2,a5 + 300af82: 0b600593 li a1,182 + 300af86: fcc42503 lw a0,-52(s0) + 300af8a: 3c49 jal ra,300aa1c + 300af8c: 87aa mv a5,a0 + 300af8e: fef407a3 sb a5,-17(s0) + VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, + startSelect); + + for (index = 0; index < spadArraySize; index++) + 300af92: fe042223 sw zero,-28(s0) + 300af96: a829 j 300afb0 + Dev->Data.SpadData.RefSpadEnables[index] = 0; + 300af98: fcc42703 lw a4,-52(s0) + 300af9c: fe442783 lw a5,-28(s0) + 300afa0: 97ba add a5,a5,a4 + 300afa2: 14078823 sb zero,336(a5) + for (index = 0; index < spadArraySize; index++) + 300afa6: fe442783 lw a5,-28(s0) + 300afaa: 0785 addi a5,a5,1 + 300afac: fef42223 sw a5,-28(s0) + 300afb0: fe442703 lw a4,-28(s0) + 300afb4: fdc42783 lw a5,-36(s0) + 300afb8: fef760e3 bltu a4,a5,300af98 + + if (isApertureSpads) { + 300afbc: fc744783 lbu a5,-57(s0) + 300afc0: c79d beqz a5,300afee + /* Increment to the first APERTURE spad */ + while ((is_aperture(startSelect + currentSpadIndex) == 0) && + 300afc2: a031 j 300afce + (currentSpadIndex < maxSpadCount)) { + currentSpadIndex++; + 300afc4: fe842783 lw a5,-24(s0) + 300afc8: 0785 addi a5,a5,1 + 300afca: fef42423 sw a5,-24(s0) + while ((is_aperture(startSelect + currentSpadIndex) == 0) && + 300afce: fe344703 lbu a4,-29(s0) + 300afd2: fe842783 lw a5,-24(s0) + 300afd6: 97ba add a5,a5,a4 + 300afd8: 853e mv a0,a5 + 300afda: ed8ff0ef jal ra,300a6b2 + 300afde: 87aa mv a5,a0 + 300afe0: e799 bnez a5,300afee + 300afe2: fe842703 lw a4,-24(s0) + 300afe6: fd842783 lw a5,-40(s0) + 300afea: fcf76de3 bltu a4,a5,300afc4 + } + } + Status = enable_ref_spads(Dev, + isApertureSpads, + Dev->Data.SpadData.RefGoodSpadMap, + 300afee: fcc42783 lw a5,-52(s0) + 300aff2: 15678613 addi a2,a5,342 + Dev->Data.SpadData.RefSpadEnables, + 300aff6: fcc42783 lw a5,-52(s0) + 300affa: 15078693 addi a3,a5,336 + Status = enable_ref_spads(Dev, + 300affe: fe344703 lbu a4,-29(s0) + 300b002: fc744583 lbu a1,-57(s0) + 300b006: fd440793 addi a5,s0,-44 + 300b00a: c03e sw a5,0(sp) + 300b00c: fc842883 lw a7,-56(s0) + 300b010: fe842803 lw a6,-24(s0) + 300b014: 87ba mv a5,a4 + 300b016: fdc42703 lw a4,-36(s0) + 300b01a: fcc42503 lw a0,-52(s0) + 300b01e: fd0ff0ef jal ra,300a7ee + 300b022: 87aa mv a5,a0 + 300b024: fef407a3 sb a5,-17(s0) + startSelect, + currentSpadIndex, + count, + &lastSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + 300b028: fef40783 lb a5,-17(s0) + 300b02c: e785 bnez a5,300b054 + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); + 300b02e: fcc42783 lw a5,-52(s0) + 300b032: 4705 li a4,1 + 300b034: 14e780a3 sb a4,321(a5) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300b038: fc842783 lw a5,-56(s0) + 300b03c: 0ff7f713 andi a4,a5,255 + 300b040: fcc42783 lw a5,-52(s0) + 300b044: 12e78fa3 sb a4,319(a5) + ReferenceSpadCount, (uint8_t)(count)); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300b048: fcc42783 lw a5,-52(s0) + 300b04c: fc744703 lbu a4,-57(s0) + 300b050: 14e78023 sb a4,320(a5) + ReferenceSpadType, isApertureSpads); + } + + return Status; + 300b054: fef40783 lb a5,-17(s0) +} + 300b058: 853e mv a0,a5 + 300b05a: 40b6 lw ra,76(sp) + 300b05c: 4426 lw s0,72(sp) + 300b05e: 6161 addi sp,sp,80 + 300b060: 8082 ret + +0300b062 : +} + + +VL53L0X_Error VL53L0X_perform_single_ref_calibration(VL53L0X_DEV Dev, + uint8_t vhv_init_byte) +{ + 300b062: 7179 addi sp,sp,-48 + 300b064: d606 sw ra,44(sp) + 300b066: d422 sw s0,40(sp) + 300b068: 1800 addi s0,sp,48 + 300b06a: fca42e23 sw a0,-36(s0) + 300b06e: 87ae mv a5,a1 + 300b070: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b074: fe0407a3 sb zero,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300b078: fef40783 lb a5,-17(s0) + 300b07c: ef91 bnez a5,300b098 + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, + 300b07e: fdb44783 lbu a5,-37(s0) + 300b082: 0017e793 ori a5,a5,1 + 300b086: 9f81 uxtb a5 + 300b088: 863e mv a2,a5 + 300b08a: 4581 li a1,0 + 300b08c: fdc42503 lw a0,-36(s0) + 300b090: 3271 jal ra,300aa1c + 300b092: 87aa mv a5,a0 + 300b094: fef407a3 sb a5,-17(s0) + VL53L0X_REG_SYSRANGE_MODE_START_STOP | + vhv_init_byte); + + if (Status == VL53L0X_ERROR_NONE) + 300b098: fef40783 lb a5,-17(s0) + 300b09c: e799 bnez a5,300b0aa + Status = VL53L0X_measurement_poll_for_completion(Dev); + 300b09e: fdc42503 lw a0,-36(s0) + 300b0a2: 2935 jal ra,300b4de + 300b0a4: 87aa mv a5,a0 + 300b0a6: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300b0aa: fef40783 lb a5,-17(s0) + 300b0ae: eb89 bnez a5,300b0c0 + Status = VL53L0X_ClearInterruptMask(Dev, 0); + 300b0b0: 4581 li a1,0 + 300b0b2: fdc42503 lw a0,-36(s0) + 300b0b6: b30ff0ef jal ra,300a3e6 + 300b0ba: 87aa mv a5,a0 + 300b0bc: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300b0c0: fef40783 lb a5,-17(s0) + 300b0c4: eb89 bnez a5,300b0d6 + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x00); + 300b0c6: 4601 li a2,0 + 300b0c8: 4581 li a1,0 + 300b0ca: fdc42503 lw a0,-36(s0) + 300b0ce: 32b9 jal ra,300aa1c + 300b0d0: 87aa mv a5,a0 + 300b0d2: fef407a3 sb a5,-17(s0) + + return Status; + 300b0d6: fef40783 lb a5,-17(s0) +} + 300b0da: 853e mv a0,a5 + 300b0dc: 50b2 lw ra,44(sp) + 300b0de: 5422 lw s0,40(sp) + 300b0e0: 6145 addi sp,sp,48 + 300b0e2: 8082 ret + +0300b0e4 : +VL53L0X_Error VL53L0X_ref_calibration_io(VL53L0X_DEV Dev, + uint8_t read_not_write, + uint8_t VhvSettings, uint8_t PhaseCal, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, + const uint8_t vhv_enable, const uint8_t phase_enable) +{ + 300b0e4: 7139 addi sp,sp,-64 + 300b0e6: de06 sw ra,60(sp) + 300b0e8: dc22 sw s0,56(sp) + 300b0ea: 0080 addi s0,sp,64 + 300b0ec: fca42e23 sw a0,-36(s0) + 300b0f0: 852e mv a0,a1 + 300b0f2: 85b2 mv a1,a2 + 300b0f4: 8636 mv a2,a3 + 300b0f6: fce42a23 sw a4,-44(s0) + 300b0fa: fcf42823 sw a5,-48(s0) + 300b0fe: 86c2 mv a3,a6 + 300b100: 8746 mv a4,a7 + 300b102: 87aa mv a5,a0 + 300b104: fcf40da3 sb a5,-37(s0) + 300b108: 87ae mv a5,a1 + 300b10a: fcf40d23 sb a5,-38(s0) + 300b10e: 87b2 mv a5,a2 + 300b110: fcf40ca3 sb a5,-39(s0) + 300b114: 87b6 mv a5,a3 + 300b116: fcf40c23 sb a5,-40(s0) + 300b11a: 87ba mv a5,a4 + 300b11c: fcf407a3 sb a5,-49(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b120: fe0407a3 sb zero,-17(s0) + uint8_t PhaseCalint = 0; + 300b124: fe040723 sb zero,-18(s0) + + /* Read VHV from device */ + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300b128: 4605 li a2,1 + 300b12a: 0ff00593 li a1,255 + 300b12e: fdc42503 lw a0,-36(s0) + 300b132: 30ed jal ra,300aa1c + 300b134: 87aa mv a5,a0 + 300b136: 873e mv a4,a5 + 300b138: fef44783 lbu a5,-17(s0) + 300b13c: 8fd9 or a5,a5,a4 + 300b13e: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + 300b142: 4601 li a2,0 + 300b144: 4581 li a1,0 + 300b146: fdc42503 lw a0,-36(s0) + 300b14a: 2b85 jal ra,300b6ba + 300b14c: 87aa mv a5,a0 + 300b14e: 873e mv a4,a5 + 300b150: fef44783 lbu a5,-17(s0) + 300b154: 8fd9 or a5,a5,a4 + 300b156: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300b15a: 4601 li a2,0 + 300b15c: 0ff00593 li a1,255 + 300b160: fdc42503 lw a0,-36(s0) + 300b164: 2b99 jal ra,300b6ba + 300b166: 87aa mv a5,a0 + 300b168: 873e mv a4,a5 + 300b16a: fef44783 lbu a5,-17(s0) + 300b16e: 8fd9 or a5,a5,a4 + 300b170: fef407a3 sb a5,-17(s0) + + if (read_not_write) { + 300b174: fdb44783 lbu a5,-37(s0) + 300b178: c7a9 beqz a5,300b1c2 + if (vhv_enable) + 300b17a: fd844783 lbu a5,-40(s0) + 300b17e: cf99 beqz a5,300b19c + Status |= VL53L0X_RdByte(Dev, 0xCB, pVhvSettings); + 300b180: fd442603 lw a2,-44(s0) + 300b184: 0cb00593 li a1,203 + 300b188: fdc42503 lw a0,-36(s0) + 300b18c: 232d jal ra,300b6b6 + 300b18e: 87aa mv a5,a0 + 300b190: 873e mv a4,a5 + 300b192: fef44783 lbu a5,-17(s0) + 300b196: 8fd9 or a5,a5,a4 + 300b198: fef407a3 sb a5,-17(s0) + if (phase_enable) + 300b19c: fcf44783 lbu a5,-49(s0) + 300b1a0: cba5 beqz a5,300b210 + Status |= VL53L0X_RdByte(Dev, 0xEE, &PhaseCalint); + 300b1a2: fee40793 addi a5,s0,-18 + 300b1a6: 863e mv a2,a5 + 300b1a8: 0ee00593 li a1,238 + 300b1ac: fdc42503 lw a0,-36(s0) + 300b1b0: 2319 jal ra,300b6b6 + 300b1b2: 87aa mv a5,a0 + 300b1b4: 873e mv a4,a5 + 300b1b6: fef44783 lbu a5,-17(s0) + 300b1ba: 8fd9 or a5,a5,a4 + 300b1bc: fef407a3 sb a5,-17(s0) + 300b1c0: a881 j 300b210 + } else { + if (vhv_enable) + 300b1c2: fd844783 lbu a5,-40(s0) + 300b1c6: c385 beqz a5,300b1e6 + Status |= VL53L0X_WrByte(Dev, 0xCB, VhvSettings); + 300b1c8: fda44783 lbu a5,-38(s0) + 300b1cc: 863e mv a2,a5 + 300b1ce: 0cb00593 li a1,203 + 300b1d2: fdc42503 lw a0,-36(s0) + 300b1d6: 21d5 jal ra,300b6ba + 300b1d8: 87aa mv a5,a0 + 300b1da: 873e mv a4,a5 + 300b1dc: fef44783 lbu a5,-17(s0) + 300b1e0: 8fd9 or a5,a5,a4 + 300b1e2: fef407a3 sb a5,-17(s0) + if (phase_enable) + 300b1e6: fcf44783 lbu a5,-49(s0) + 300b1ea: c39d beqz a5,300b210 + Status |= VL53L0X_UpdateByte(Dev, 0xEE, 0x80, PhaseCal); + 300b1ec: fd944783 lbu a5,-39(s0) + 300b1f0: 86be mv a3,a5 + 300b1f2: 08000613 li a2,128 + 300b1f6: 0ee00593 li a1,238 + 300b1fa: fdc42503 lw a0,-36(s0) + 300b1fe: 33e030ef jal ra,300e53c + 300b202: 87aa mv a5,a0 + 300b204: 873e mv a4,a5 + 300b206: fef44783 lbu a5,-17(s0) + 300b20a: 8fd9 or a5,a5,a4 + 300b20c: fef407a3 sb a5,-17(s0) + } + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300b210: 4605 li a2,1 + 300b212: 0ff00593 li a1,255 + 300b216: fdc42503 lw a0,-36(s0) + 300b21a: 2145 jal ra,300b6ba + 300b21c: 87aa mv a5,a0 + 300b21e: 873e mv a4,a5 + 300b220: fef44783 lbu a5,-17(s0) + 300b224: 8fd9 or a5,a5,a4 + 300b226: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + 300b22a: 4605 li a2,1 + 300b22c: 4581 li a1,0 + 300b22e: fdc42503 lw a0,-36(s0) + 300b232: 2161 jal ra,300b6ba + 300b234: 87aa mv a5,a0 + 300b236: 873e mv a4,a5 + 300b238: fef44783 lbu a5,-17(s0) + 300b23c: 8fd9 or a5,a5,a4 + 300b23e: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300b242: 4601 li a2,0 + 300b244: 0ff00593 li a1,255 + 300b248: fdc42503 lw a0,-36(s0) + 300b24c: 21bd jal ra,300b6ba + 300b24e: 87aa mv a5,a0 + 300b250: 873e mv a4,a5 + 300b252: fef44783 lbu a5,-17(s0) + 300b256: 8fd9 or a5,a5,a4 + 300b258: fef407a3 sb a5,-17(s0) + + *pPhaseCal = (uint8_t)(PhaseCalint&0xEF); + 300b25c: fee44783 lbu a5,-18(s0) + 300b260: 9bbd andi a5,a5,-17 + 300b262: 0ff7f713 andi a4,a5,255 + 300b266: fd042783 lw a5,-48(s0) + 300b26a: a398 sb a4,0(a5) + + return Status; + 300b26c: fef40783 lb a5,-17(s0) +} + 300b270: 853e mv a0,a5 + 300b272: 50f2 lw ra,60(sp) + 300b274: 5462 lw s0,56(sp) + 300b276: 6121 addi sp,sp,64 + 300b278: 8082 ret + +0300b27a : + + +VL53L0X_Error VL53L0X_perform_vhv_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, const uint8_t get_data_enable, + const uint8_t restore_config) +{ + 300b27a: 7179 addi sp,sp,-48 + 300b27c: d606 sw ra,44(sp) + 300b27e: d422 sw s0,40(sp) + 300b280: 1800 addi s0,sp,48 + 300b282: fca42e23 sw a0,-36(s0) + 300b286: fcb42c23 sw a1,-40(s0) + 300b28a: 87b2 mv a5,a2 + 300b28c: 8736 mv a4,a3 + 300b28e: fcf40ba3 sb a5,-41(s0) + 300b292: 87ba mv a5,a4 + 300b294: fcf40b23 sb a5,-42(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b298: fe0407a3 sb zero,-17(s0) + uint8_t SequenceConfig = 0; + 300b29c: fe040723 sb zero,-18(s0) + uint8_t VhvSettings = 0; + 300b2a0: fe0406a3 sb zero,-19(s0) + uint8_t PhaseCal = 0; + 300b2a4: fe040623 sb zero,-20(s0) + uint8_t PhaseCalInt = 0; + 300b2a8: fe0405a3 sb zero,-21(s0) + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + if (restore_config) + 300b2ac: fd644783 lbu a5,-42(s0) + 300b2b0: c799 beqz a5,300b2be + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + 300b2b2: fdc42783 lw a5,-36(s0) + 300b2b6: 15c7c783 lbu a5,348(a5) + 300b2ba: fef40723 sb a5,-18(s0) + + /* Run VHV */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x01); + 300b2be: 4605 li a2,1 + 300b2c0: 4585 li a1,1 + 300b2c2: fdc42503 lw a0,-36(s0) + 300b2c6: 2ed5 jal ra,300b6ba + 300b2c8: 87aa mv a5,a0 + 300b2ca: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300b2ce: fef40783 lb a5,-17(s0) + 300b2d2: eb89 bnez a5,300b2e4 + Status = VL53L0X_perform_single_ref_calibration(Dev, 0x40); + 300b2d4: 04000593 li a1,64 + 300b2d8: fdc42503 lw a0,-36(s0) + 300b2dc: 3359 jal ra,300b062 + 300b2de: 87aa mv a5,a0 + 300b2e0: fef407a3 sb a5,-17(s0) + + /* Read VHV from device */ + if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { + 300b2e4: fef40783 lb a5,-17(s0) + 300b2e8: eb85 bnez a5,300b318 + 300b2ea: fd744703 lbu a4,-41(s0) + 300b2ee: 4785 li a5,1 + 300b2f0: 02f71463 bne a4,a5,300b318 + Status = VL53L0X_ref_calibration_io(Dev, 1, + 300b2f4: feb40793 addi a5,s0,-21 + 300b2f8: fec44683 lbu a3,-20(s0) + 300b2fc: fed44603 lbu a2,-19(s0) + 300b300: 4881 li a7,0 + 300b302: 4805 li a6,1 + 300b304: fd842703 lw a4,-40(s0) + 300b308: 4585 li a1,1 + 300b30a: fdc42503 lw a0,-36(s0) + 300b30e: 3bd9 jal ra,300b0e4 + 300b310: 87aa mv a5,a0 + 300b312: fef407a3 sb a5,-17(s0) + 300b316: a029 j 300b320 + VhvSettings, PhaseCal, /* Not used here */ + pVhvSettings, &PhaseCalInt, + 1, 0); + } else + *pVhvSettings = 0; + 300b318: fd842783 lw a5,-40(s0) + 300b31c: 00078023 sb zero,0(a5) + + + if ((Status == VL53L0X_ERROR_NONE) && restore_config) { + 300b320: fef40783 lb a5,-17(s0) + 300b324: e79d bnez a5,300b352 + 300b326: fd644783 lbu a5,-42(s0) + 300b32a: c785 beqz a5,300b352 + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 300b32c: fee44783 lbu a5,-18(s0) + 300b330: 863e mv a2,a5 + 300b332: 4585 li a1,1 + 300b334: fdc42503 lw a0,-36(s0) + 300b338: 2649 jal ra,300b6ba + 300b33a: 87aa mv a5,a0 + 300b33c: fef407a3 sb a5,-17(s0) + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + 300b340: fef40783 lb a5,-17(s0) + 300b344: e799 bnez a5,300b352 + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + 300b346: fdc42783 lw a5,-36(s0) + 300b34a: fee44703 lbu a4,-18(s0) + 300b34e: 14e78e23 sb a4,348(a5) + + } + + return Status; + 300b352: fef40783 lb a5,-17(s0) +} + 300b356: 853e mv a0,a5 + 300b358: 50b2 lw ra,44(sp) + 300b35a: 5422 lw s0,40(sp) + 300b35c: 6145 addi sp,sp,48 + 300b35e: 8082 ret + +0300b360 : + +VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, + uint8_t *pPhaseCal, const uint8_t get_data_enable, + const uint8_t restore_config) +{ + 300b360: 7179 addi sp,sp,-48 + 300b362: d606 sw ra,44(sp) + 300b364: d422 sw s0,40(sp) + 300b366: 1800 addi s0,sp,48 + 300b368: fca42e23 sw a0,-36(s0) + 300b36c: fcb42c23 sw a1,-40(s0) + 300b370: 87b2 mv a5,a2 + 300b372: 8736 mv a4,a3 + 300b374: fcf40ba3 sb a5,-41(s0) + 300b378: 87ba mv a5,a4 + 300b37a: fcf40b23 sb a5,-42(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b37e: fe0407a3 sb zero,-17(s0) + uint8_t SequenceConfig = 0; + 300b382: fe040723 sb zero,-18(s0) + uint8_t VhvSettings = 0; + 300b386: fe0406a3 sb zero,-19(s0) + uint8_t PhaseCal = 0; + 300b38a: fe040623 sb zero,-20(s0) + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + if (restore_config) + 300b38e: fd644783 lbu a5,-42(s0) + 300b392: c799 beqz a5,300b3a0 + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + 300b394: fdc42783 lw a5,-36(s0) + 300b398: 15c7c783 lbu a5,348(a5) + 300b39c: fef40723 sb a5,-18(s0) + + /* Run PhaseCal */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x02); + 300b3a0: 4609 li a2,2 + 300b3a2: 4585 li a1,1 + 300b3a4: fdc42503 lw a0,-36(s0) + 300b3a8: 2e09 jal ra,300b6ba + 300b3aa: 87aa mv a5,a0 + 300b3ac: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300b3b0: fef40783 lb a5,-17(s0) + 300b3b4: eb81 bnez a5,300b3c4 + Status = VL53L0X_perform_single_ref_calibration(Dev, 0x0); + 300b3b6: 4581 li a1,0 + 300b3b8: fdc42503 lw a0,-36(s0) + 300b3bc: 315d jal ra,300b062 + 300b3be: 87aa mv a5,a0 + 300b3c0: fef407a3 sb a5,-17(s0) + + /* Read PhaseCal from device */ + if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { + 300b3c4: fef40783 lb a5,-17(s0) + 300b3c8: eb85 bnez a5,300b3f8 + 300b3ca: fd744703 lbu a4,-41(s0) + 300b3ce: 4785 li a5,1 + 300b3d0: 02f71463 bne a4,a5,300b3f8 + Status = VL53L0X_ref_calibration_io(Dev, 1, + 300b3d4: feb40713 addi a4,s0,-21 + 300b3d8: fec44683 lbu a3,-20(s0) + 300b3dc: fed44603 lbu a2,-19(s0) + 300b3e0: 4885 li a7,1 + 300b3e2: 4801 li a6,0 + 300b3e4: fd842783 lw a5,-40(s0) + 300b3e8: 4585 li a1,1 + 300b3ea: fdc42503 lw a0,-36(s0) + 300b3ee: 39dd jal ra,300b0e4 + 300b3f0: 87aa mv a5,a0 + 300b3f2: fef407a3 sb a5,-17(s0) + 300b3f6: a029 j 300b400 + VhvSettings, PhaseCal, /* Not used here */ + &VhvSettingsint, pPhaseCal, + 0, 1); + } else + *pPhaseCal = 0; + 300b3f8: fd842783 lw a5,-40(s0) + 300b3fc: 00078023 sb zero,0(a5) + + + if ((Status == VL53L0X_ERROR_NONE) && restore_config) { + 300b400: fef40783 lb a5,-17(s0) + 300b404: e79d bnez a5,300b432 + 300b406: fd644783 lbu a5,-42(s0) + 300b40a: c785 beqz a5,300b432 + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 300b40c: fee44783 lbu a5,-18(s0) + 300b410: 863e mv a2,a5 + 300b412: 4585 li a1,1 + 300b414: fdc42503 lw a0,-36(s0) + 300b418: 244d jal ra,300b6ba + 300b41a: 87aa mv a5,a0 + 300b41c: fef407a3 sb a5,-17(s0) + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + 300b420: fef40783 lb a5,-17(s0) + 300b424: e799 bnez a5,300b432 + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + 300b426: fdc42783 lw a5,-36(s0) + 300b42a: fee44703 lbu a4,-18(s0) + 300b42e: 14e78e23 sb a4,348(a5) + + } + + return Status; + 300b432: fef40783 lb a5,-17(s0) +} + 300b436: 853e mv a0,a5 + 300b438: 50b2 lw ra,44(sp) + 300b43a: 5422 lw s0,40(sp) + 300b43c: 6145 addi sp,sp,48 + 300b43e: 8082 ret + +0300b440 : + +VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable) +{ + 300b440: 7179 addi sp,sp,-48 + 300b442: d606 sw ra,44(sp) + 300b444: d422 sw s0,40(sp) + 300b446: 1800 addi s0,sp,48 + 300b448: fca42e23 sw a0,-36(s0) + 300b44c: fcb42c23 sw a1,-40(s0) + 300b450: fcc42a23 sw a2,-44(s0) + 300b454: 87b6 mv a5,a3 + 300b456: fcf409a3 sb a5,-45(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b45a: fe0407a3 sb zero,-17(s0) + uint8_t SequenceConfig = 0; + 300b45e: fe040723 sb zero,-18(s0) + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + 300b462: fdc42783 lw a5,-36(s0) + 300b466: 15c7c783 lbu a5,348(a5) + 300b46a: fef40723 sb a5,-18(s0) + + /* In the following function we don't save the config to optimize + * writes on device. Config is saved and restored only once. + */ + Status = VL53L0X_perform_vhv_calibration( + 300b46e: fd344783 lbu a5,-45(s0) + 300b472: 4681 li a3,0 + 300b474: 863e mv a2,a5 + 300b476: fd842583 lw a1,-40(s0) + 300b47a: fdc42503 lw a0,-36(s0) + 300b47e: 3bf5 jal ra,300b27a + 300b480: 87aa mv a5,a0 + 300b482: fef407a3 sb a5,-17(s0) + Dev, pVhvSettings, get_data_enable, 0); + + + if (Status == VL53L0X_ERROR_NONE) + 300b486: fef40783 lb a5,-17(s0) + 300b48a: ef89 bnez a5,300b4a4 + Status = VL53L0X_perform_phase_calibration( + 300b48c: fd344783 lbu a5,-45(s0) + 300b490: 4681 li a3,0 + 300b492: 863e mv a2,a5 + 300b494: fd442583 lw a1,-44(s0) + 300b498: fdc42503 lw a0,-36(s0) + 300b49c: 35d1 jal ra,300b360 + 300b49e: 87aa mv a5,a0 + 300b4a0: fef407a3 sb a5,-17(s0) + Dev, pPhaseCal, get_data_enable, 0); + + + if (Status == VL53L0X_ERROR_NONE) { + 300b4a4: fef40783 lb a5,-17(s0) + 300b4a8: e785 bnez a5,300b4d0 + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 300b4aa: fee44783 lbu a5,-18(s0) + 300b4ae: 863e mv a2,a5 + 300b4b0: 4585 li a1,1 + 300b4b2: fdc42503 lw a0,-36(s0) + 300b4b6: 2411 jal ra,300b6ba + 300b4b8: 87aa mv a5,a0 + 300b4ba: fef407a3 sb a5,-17(s0) + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + 300b4be: fef40783 lb a5,-17(s0) + 300b4c2: e799 bnez a5,300b4d0 + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + 300b4c4: fdc42783 lw a5,-36(s0) + 300b4c8: fee44703 lbu a4,-18(s0) + 300b4cc: 14e78e23 sb a4,348(a5) + + } + + return Status; + 300b4d0: fef40783 lb a5,-17(s0) +} + 300b4d4: 853e mv a0,a5 + 300b4d6: 50b2 lw ra,44(sp) + 300b4d8: 5422 lw s0,40(sp) + 300b4da: 6145 addi sp,sp,48 + 300b4dc: 8082 ret + +0300b4de : + } + return Status; +} + +VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev) +{ + 300b4de: 7179 addi sp,sp,-48 + 300b4e0: d606 sw ra,44(sp) + 300b4e2: d422 sw s0,40(sp) + 300b4e4: 1800 addi s0,sp,48 + 300b4e6: fca42e23 sw a0,-36(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b4ea: fe0407a3 sb zero,-17(s0) + uint8_t NewDataReady = 0; + 300b4ee: fe0403a3 sb zero,-25(s0) + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + LoopNb = 0; + 300b4f2: fe042423 sw zero,-24(s0) + + do { + Status = VL53L0X_GetMeasurementDataReady(Dev, &NewDataReady); + 300b4f6: fe740793 addi a5,s0,-25 + 300b4fa: 85be mv a1,a5 + 300b4fc: fdc42503 lw a0,-36(s0) + 300b500: f8efe0ef jal ra,3009c8e + 300b504: 87aa mv a5,a0 + 300b506: fef407a3 sb a5,-17(s0) + if (Status != 0) + 300b50a: fef40783 lb a5,-17(s0) + 300b50e: eb95 bnez a5,300b542 + break; /* the error is set */ + + if (NewDataReady == 1) + 300b510: fe744703 lbu a4,-25(s0) + 300b514: 4785 li a5,1 + 300b516: 02f70863 beq a4,a5,300b546 + break; /* done note that status == 0 */ + + LoopNb++; + 300b51a: fe842783 lw a5,-24(s0) + 300b51e: 0785 addi a5,a5,1 + 300b520: fef42423 sw a5,-24(s0) + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) { + 300b524: fe842703 lw a4,-24(s0) + 300b528: 7cf00793 li a5,1999 + 300b52c: 00e7f663 bgeu a5,a4,300b538 + Status = VL53L0X_ERROR_TIME_OUT; + 300b530: 57e5 li a5,-7 + 300b532: fef407a3 sb a5,-17(s0) + break; + 300b536: a809 j 300b548 + } + + VL53L0X_PollingDelay(Dev); + 300b538: fdc42503 lw a0,-36(s0) + 300b53c: 1a8030ef jal ra,300e6e4 + Status = VL53L0X_GetMeasurementDataReady(Dev, &NewDataReady); + 300b540: bf5d j 300b4f6 + break; /* the error is set */ + 300b542: 0001 nop + 300b544: a011 j 300b548 + break; /* done note that status == 0 */ + 300b546: 0001 nop + } while (1); + + LOG_FUNCTION_END(Status); + + return Status; + 300b548: fef40783 lb a5,-17(s0) +} + 300b54c: 853e mv a0,a5 + 300b54e: 50b2 lw ra,44(sp) + 300b550: 5422 lw s0,40(sp) + 300b552: 6145 addi sp,sp,48 + 300b554: 8082 ret + +0300b556 : + + +uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg) +{ + 300b556: 7179 addi sp,sp,-48 + 300b558: d622 sw s0,44(sp) + 300b55a: 1800 addi s0,sp,48 + 300b55c: 87aa mv a5,a0 + 300b55e: fcf40fa3 sb a5,-33(s0) + /*! + * Converts the encoded VCSEL period register value into the real + * period in PLL clocks + */ + + uint8_t vcsel_period_pclks = 0; + 300b562: fe0407a3 sb zero,-17(s0) + + vcsel_period_pclks = (vcsel_period_reg + 1) << 1; + 300b566: fdf44783 lbu a5,-33(s0) + 300b56a: 0785 addi a5,a5,1 + 300b56c: 9f81 uxtb a5 + 300b56e: 0786 slli a5,a5,0x1 + 300b570: fef407a3 sb a5,-17(s0) + + return vcsel_period_pclks; + 300b574: fef44783 lbu a5,-17(s0) +} + 300b578: 853e mv a0,a5 + 300b57a: 5432 lw s0,44(sp) + 300b57c: 6145 addi sp,sp,48 + 300b57e: 8082 ret + +0300b580 : + return vcsel_period_reg; +} + + +uint32_t VL53L0X_isqrt(uint32_t num) +{ + 300b580: 7179 addi sp,sp,-48 + 300b582: d622 sw s0,44(sp) + 300b584: 1800 addi s0,sp,48 + 300b586: fca42e23 sw a0,-36(s0) + * Implements an integer square root + * + * From: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots + */ + + uint32_t res = 0; + 300b58a: fe042623 sw zero,-20(s0) + uint32_t bit = 1 << 30; + 300b58e: 400007b7 lui a5,0x40000 + 300b592: fef42423 sw a5,-24(s0) + /* The second-to-top bit is set: + * 1 << 14 for 16-bits, 1 << 30 for 32 bits + */ + + /* "bit" starts at the highest power of four <= the argument. */ + while (bit > num) + 300b596: a031 j 300b5a2 + bit >>= 2; + 300b598: fe842783 lw a5,-24(s0) + 300b59c: 8389 srli a5,a5,0x2 + 300b59e: fef42423 sw a5,-24(s0) + while (bit > num) + 300b5a2: fe842703 lw a4,-24(s0) + 300b5a6: fdc42783 lw a5,-36(s0) + 300b5aa: fee7e7e3 bltu a5,a4,300b598 + + + while (bit != 0) { + 300b5ae: a881 j 300b5fe + if (num >= res + bit) { + 300b5b0: fec42703 lw a4,-20(s0) + 300b5b4: fe842783 lw a5,-24(s0) + 300b5b8: 97ba add a5,a5,a4 + 300b5ba: fdc42703 lw a4,-36(s0) + 300b5be: 02f76663 bltu a4,a5,300b5ea + num -= res + bit; + 300b5c2: fec42703 lw a4,-20(s0) + 300b5c6: fe842783 lw a5,-24(s0) + 300b5ca: 97ba add a5,a5,a4 + 300b5cc: fdc42703 lw a4,-36(s0) + 300b5d0: 40f707b3 sub a5,a4,a5 + 300b5d4: fcf42e23 sw a5,-36(s0) + res = (res >> 1) + bit; + 300b5d8: fec42783 lw a5,-20(s0) + 300b5dc: 8385 srli a5,a5,0x1 + 300b5de: fe842703 lw a4,-24(s0) + 300b5e2: 97ba add a5,a5,a4 + 300b5e4: fef42623 sw a5,-20(s0) + 300b5e8: a031 j 300b5f4 + } else + res >>= 1; + 300b5ea: fec42783 lw a5,-20(s0) + 300b5ee: 8385 srli a5,a5,0x1 + 300b5f0: fef42623 sw a5,-20(s0) + + bit >>= 2; + 300b5f4: fe842783 lw a5,-24(s0) + 300b5f8: 8389 srli a5,a5,0x2 + 300b5fa: fef42423 sw a5,-24(s0) + while (bit != 0) { + 300b5fe: fe842783 lw a5,-24(s0) + 300b602: f7dd bnez a5,300b5b0 + } + + return res; + 300b604: fec42783 lw a5,-20(s0) +} + 300b608: 853e mv a0,a5 + 300b60a: 5432 lw s0,44(sp) + 300b60c: 6145 addi sp,sp,48 + 300b60e: 8082 ret + +0300b610 : + return res; +} + + +VL53L0X_Error VL53L0X_device_read_strobe(VL53L0X_DEV Dev) +{ + 300b610: 7179 addi sp,sp,-48 + 300b612: d606 sw ra,44(sp) + 300b614: d422 sw s0,40(sp) + 300b616: 1800 addi s0,sp,48 + 300b618: fca42e23 sw a0,-36(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b61c: fe0407a3 sb zero,-17(s0) + uint8_t strobe; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + Status |= VL53L0X_WrByte(Dev, 0x83, 0x00); + 300b620: 4601 li a2,0 + 300b622: 08300593 li a1,131 + 300b626: fdc42503 lw a0,-36(s0) + 300b62a: 2841 jal ra,300b6ba + 300b62c: 87aa mv a5,a0 + 300b62e: 873e mv a4,a5 + 300b630: fef44783 lbu a5,-17(s0) + 300b634: 8fd9 or a5,a5,a4 + 300b636: fef407a3 sb a5,-17(s0) + + /* polling + * use timeout to avoid deadlock + */ + if (Status == VL53L0X_ERROR_NONE) { + 300b63a: fef40783 lb a5,-17(s0) + 300b63e: eba1 bnez a5,300b68e + LoopNb = 0; + 300b640: fe042423 sw zero,-24(s0) + do { + Status = VL53L0X_RdByte(Dev, 0x83, &strobe); + 300b644: fe740793 addi a5,s0,-25 + 300b648: 863e mv a2,a5 + 300b64a: 08300593 li a1,131 + 300b64e: fdc42503 lw a0,-36(s0) + 300b652: 2095 jal ra,300b6b6 + 300b654: 87aa mv a5,a0 + 300b656: fef407a3 sb a5,-17(s0) + if ((strobe != 0x00) || Status != VL53L0X_ERROR_NONE) + 300b65a: fe744783 lbu a5,-25(s0) + 300b65e: ef99 bnez a5,300b67c + 300b660: fef40783 lb a5,-17(s0) + 300b664: ef81 bnez a5,300b67c + break; + + LoopNb = LoopNb + 1; + 300b666: fe842783 lw a5,-24(s0) + 300b66a: 0785 addi a5,a5,1 # 40000001 + 300b66c: fef42423 sw a5,-24(s0) + } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP); + 300b670: fe842703 lw a4,-24(s0) + 300b674: 7cf00793 li a5,1999 + 300b678: fce7f6e3 bgeu a5,a4,300b644 + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) + 300b67c: fe842703 lw a4,-24(s0) + 300b680: 7cf00793 li a5,1999 + 300b684: 00e7f563 bgeu a5,a4,300b68e + Status = VL53L0X_ERROR_TIME_OUT; + 300b688: 57e5 li a5,-7 + 300b68a: fef407a3 sb a5,-17(s0) + + } + + Status |= VL53L0X_WrByte(Dev, 0x83, 0x01); + 300b68e: 4605 li a2,1 + 300b690: 08300593 li a1,131 + 300b694: fdc42503 lw a0,-36(s0) + 300b698: 200d jal ra,300b6ba + 300b69a: 87aa mv a5,a0 + 300b69c: 873e mv a4,a5 + 300b69e: fef44783 lbu a5,-17(s0) + 300b6a2: 8fd9 or a5,a5,a4 + 300b6a4: fef407a3 sb a5,-17(s0) + + LOG_FUNCTION_END(Status); + return Status; + 300b6a8: fef40783 lb a5,-17(s0) + +} + 300b6ac: 853e mv a0,a5 + 300b6ae: 50b2 lw ra,44(sp) + 300b6b0: 5422 lw s0,40(sp) + 300b6b2: 6145 addi sp,sp,48 + 300b6b4: 8082 ret + +0300b6b6 : + 300b6b6: 72d0206f j 300e5e2 + +0300b6ba : + 300b6ba: 5cb0206f j 300e484 + +0300b6be : + +VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option) +{ + 300b6be: 7119 addi sp,sp,-128 + 300b6c0: de86 sw ra,124(sp) + 300b6c2: dca2 sw s0,120(sp) + 300b6c4: 0100 addi s0,sp,128 + 300b6c6: f8a42623 sw a0,-116(s0) + 300b6ca: 87ae mv a5,a1 + 300b6cc: f8f405a3 sb a5,-117(s0) + + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300b6d0: fe0407a3 sb zero,-17(s0) + uint8_t byte; + uint32_t TmpDWord; + uint8_t ModuleId; + uint8_t Revision; + uint8_t ReferenceSpadCount = 0; + 300b6d4: fe040723 sb zero,-18(s0) + uint8_t ReferenceSpadType = 0; + 300b6d8: fe0406a3 sb zero,-19(s0) + uint32_t PartUIDUpper = 0; + 300b6dc: fa042c23 sw zero,-72(s0) + uint32_t PartUIDLower = 0; + 300b6e0: fa042a23 sw zero,-76(s0) + uint32_t OffsetFixed1104_mm = 0; + 300b6e4: fc042c23 sw zero,-40(s0) + int16_t OffsetMicroMeters = 0; + 300b6e8: fe041523 sh zero,-22(s0) + uint32_t DistMeasTgtFixed1104_mm = 400 << 4; + 300b6ec: 6789 lui a5,0x2 + 300b6ee: 90078793 addi a5,a5,-1792 # 1900 + 300b6f2: fcf42a23 sw a5,-44(s0) + uint32_t DistMeasFixed1104_400_mm = 0; + 300b6f6: fe042223 sw zero,-28(s0) + uint32_t SignalRateMeasFixed1104_400_mm = 0; + 300b6fa: fe042023 sw zero,-32(s0) + char ProductId[19]; + char *ProductId_tmp; + uint8_t ReadDataFromDeviceDone; + FixPoint1616_t SignalRateMeasFixed400mmFix = 0; + 300b6fe: fc042823 sw zero,-48(s0) + int i; + + + LOG_FUNCTION_START(""); + + ReadDataFromDeviceDone = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + 300b702: f8c42783 lw a5,-116(s0) + 300b706: 11c7c783 lbu a5,284(a5) + 300b70a: fcf407a3 sb a5,-49(s0) + ReadDataFromDeviceDone); + + /* This access is done only once after that a GetDeviceInfo or + * datainit is done + */ + if (ReadDataFromDeviceDone != 7) { + 300b70e: fcf44703 lbu a4,-49(s0) + 300b712: 479d li a5,7 + 300b714: 14f70ae3 beq a4,a5,300c068 + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + 300b718: 4605 li a2,1 + 300b71a: 08000593 li a1,128 + 300b71e: f8c42503 lw a0,-116(s0) + 300b722: 3f61 jal ra,300b6ba + 300b724: 87aa mv a5,a0 + 300b726: 873e mv a4,a5 + 300b728: fef44783 lbu a5,-17(s0) + 300b72c: 8fd9 or a5,a5,a4 + 300b72e: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300b732: 4605 li a2,1 + 300b734: 0ff00593 li a1,255 + 300b738: f8c42503 lw a0,-116(s0) + 300b73c: 3fbd jal ra,300b6ba + 300b73e: 87aa mv a5,a0 + 300b740: 873e mv a4,a5 + 300b742: fef44783 lbu a5,-17(s0) + 300b746: 8fd9 or a5,a5,a4 + 300b748: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + 300b74c: 4601 li a2,0 + 300b74e: 4581 li a1,0 + 300b750: f8c42503 lw a0,-116(s0) + 300b754: 379d jal ra,300b6ba + 300b756: 87aa mv a5,a0 + 300b758: 873e mv a4,a5 + 300b75a: fef44783 lbu a5,-17(s0) + 300b75e: 8fd9 or a5,a5,a4 + 300b760: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); + 300b764: 4619 li a2,6 + 300b766: 0ff00593 li a1,255 + 300b76a: f8c42503 lw a0,-116(s0) + 300b76e: 37b1 jal ra,300b6ba + 300b770: 87aa mv a5,a0 + 300b772: 873e mv a4,a5 + 300b774: fef44783 lbu a5,-17(s0) + 300b778: 8fd9 or a5,a5,a4 + 300b77a: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdByte(Dev, 0x83, &byte); + 300b77e: fc740793 addi a5,s0,-57 + 300b782: 863e mv a2,a5 + 300b784: 08300593 li a1,131 + 300b788: f8c42503 lw a0,-116(s0) + 300b78c: 372d jal ra,300b6b6 + 300b78e: 87aa mv a5,a0 + 300b790: 873e mv a4,a5 + 300b792: fef44783 lbu a5,-17(s0) + 300b796: 8fd9 or a5,a5,a4 + 300b798: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x83, byte|4); + 300b79c: fc744783 lbu a5,-57(s0) + 300b7a0: 0047e793 ori a5,a5,4 + 300b7a4: 9f81 uxtb a5 + 300b7a6: 863e mv a2,a5 + 300b7a8: 08300593 li a1,131 + 300b7ac: f8c42503 lw a0,-116(s0) + 300b7b0: 3729 jal ra,300b6ba + 300b7b2: 87aa mv a5,a0 + 300b7b4: 873e mv a4,a5 + 300b7b6: fef44783 lbu a5,-17(s0) + 300b7ba: 8fd9 or a5,a5,a4 + 300b7bc: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x07); + 300b7c0: 461d li a2,7 + 300b7c2: 0ff00593 li a1,255 + 300b7c6: f8c42503 lw a0,-116(s0) + 300b7ca: 3dc5 jal ra,300b6ba + 300b7cc: 87aa mv a5,a0 + 300b7ce: 873e mv a4,a5 + 300b7d0: fef44783 lbu a5,-17(s0) + 300b7d4: 8fd9 or a5,a5,a4 + 300b7d6: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x81, 0x01); + 300b7da: 4605 li a2,1 + 300b7dc: 08100593 li a1,129 + 300b7e0: f8c42503 lw a0,-116(s0) + 300b7e4: 3dd9 jal ra,300b6ba + 300b7e6: 87aa mv a5,a0 + 300b7e8: 873e mv a4,a5 + 300b7ea: fef44783 lbu a5,-17(s0) + 300b7ee: 8fd9 or a5,a5,a4 + 300b7f0: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_PollingDelay(Dev); + 300b7f4: f8c42503 lw a0,-116(s0) + 300b7f8: 6ed020ef jal ra,300e6e4 + 300b7fc: 87aa mv a5,a0 + 300b7fe: 873e mv a4,a5 + 300b800: fef44783 lbu a5,-17(s0) + 300b804: 8fd9 or a5,a5,a4 + 300b806: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + 300b80a: 4605 li a2,1 + 300b80c: 08000593 li a1,128 + 300b810: f8c42503 lw a0,-116(s0) + 300b814: 355d jal ra,300b6ba + 300b816: 87aa mv a5,a0 + 300b818: 873e mv a4,a5 + 300b81a: fef44783 lbu a5,-17(s0) + 300b81e: 8fd9 or a5,a5,a4 + 300b820: fef407a3 sb a5,-17(s0) + + if (((option & 1) == 1) && + 300b824: f8b44783 lbu a5,-117(s0) + 300b828: 8b85 andi a5,a5,1 + 300b82a: 16078163 beqz a5,300b98c + ((ReadDataFromDeviceDone & 1) == 0)) { + 300b82e: fcf44783 lbu a5,-49(s0) + 300b832: 8b85 andi a5,a5,1 + if (((option & 1) == 1) && + 300b834: 14079c63 bnez a5,300b98c + Status |= VL53L0X_WrByte(Dev, 0x94, 0x6b); + 300b838: 06b00613 li a2,107 + 300b83c: 09400593 li a1,148 + 300b840: f8c42503 lw a0,-116(s0) + 300b844: 3d9d jal ra,300b6ba + 300b846: 87aa mv a5,a0 + 300b848: 873e mv a4,a5 + 300b84a: fef44783 lbu a5,-17(s0) + 300b84e: 8fd9 or a5,a5,a4 + 300b850: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300b854: f8c42503 lw a0,-116(s0) + 300b858: 3b65 jal ra,300b610 + 300b85a: 87aa mv a5,a0 + 300b85c: 873e mv a4,a5 + 300b85e: fef44783 lbu a5,-17(s0) + 300b862: 8fd9 or a5,a5,a4 + 300b864: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300b868: fc040793 addi a5,s0,-64 + 300b86c: 863e mv a2,a5 + 300b86e: 09000593 li a1,144 + 300b872: f8c42503 lw a0,-116(s0) + 300b876: 619020ef jal ra,300e68e + 300b87a: 87aa mv a5,a0 + 300b87c: 873e mv a4,a5 + 300b87e: fef44783 lbu a5,-17(s0) + 300b882: 8fd9 or a5,a5,a4 + 300b884: fef407a3 sb a5,-17(s0) + + ReferenceSpadCount = (uint8_t)((TmpDWord >> 8) & 0x07f); + 300b888: fc042783 lw a5,-64(s0) + 300b88c: 83a1 srli a5,a5,0x8 + 300b88e: 9f81 uxtb a5 + 300b890: 07f7f793 andi a5,a5,127 + 300b894: fef40723 sb a5,-18(s0) + ReferenceSpadType = (uint8_t)((TmpDWord >> 15) & 0x01); + 300b898: fc042783 lw a5,-64(s0) + 300b89c: 83bd srli a5,a5,0xf + 300b89e: 9f81 uxtb a5 + 300b8a0: 8b85 andi a5,a5,1 + 300b8a2: fef406a3 sb a5,-19(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x24); + 300b8a6: 02400613 li a2,36 + 300b8aa: 09400593 li a1,148 + 300b8ae: f8c42503 lw a0,-116(s0) + 300b8b2: 3521 jal ra,300b6ba + 300b8b4: 87aa mv a5,a0 + 300b8b6: 873e mv a4,a5 + 300b8b8: fef44783 lbu a5,-17(s0) + 300b8bc: 8fd9 or a5,a5,a4 + 300b8be: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300b8c2: f8c42503 lw a0,-116(s0) + 300b8c6: 33a9 jal ra,300b610 + 300b8c8: 87aa mv a5,a0 + 300b8ca: 873e mv a4,a5 + 300b8cc: fef44783 lbu a5,-17(s0) + 300b8d0: 8fd9 or a5,a5,a4 + 300b8d2: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300b8d6: fc040793 addi a5,s0,-64 + 300b8da: 863e mv a2,a5 + 300b8dc: 09000593 li a1,144 + 300b8e0: f8c42503 lw a0,-116(s0) + 300b8e4: 5ab020ef jal ra,300e68e + 300b8e8: 87aa mv a5,a0 + 300b8ea: 873e mv a4,a5 + 300b8ec: fef44783 lbu a5,-17(s0) + 300b8f0: 8fd9 or a5,a5,a4 + 300b8f2: fef407a3 sb a5,-17(s0) + + + NvmRefGoodSpadMap[0] = (uint8_t)((TmpDWord >> 24) + 300b8f6: fc042783 lw a5,-64(s0) + 300b8fa: 83e1 srli a5,a5,0x18 + 300b8fc: 9f81 uxtb a5 + 300b8fe: f8f40c23 sb a5,-104(s0) + & 0xff); + NvmRefGoodSpadMap[1] = (uint8_t)((TmpDWord >> 16) + 300b902: fc042783 lw a5,-64(s0) + 300b906: 83c1 srli a5,a5,0x10 + 300b908: 9f81 uxtb a5 + 300b90a: f8f40ca3 sb a5,-103(s0) + & 0xff); + NvmRefGoodSpadMap[2] = (uint8_t)((TmpDWord >> 8) + 300b90e: fc042783 lw a5,-64(s0) + 300b912: 83a1 srli a5,a5,0x8 + 300b914: 9f81 uxtb a5 + 300b916: f8f40d23 sb a5,-102(s0) + & 0xff); + NvmRefGoodSpadMap[3] = (uint8_t)(TmpDWord & 0xff); + 300b91a: fc042783 lw a5,-64(s0) + 300b91e: 9f81 uxtb a5 + 300b920: f8f40da3 sb a5,-101(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x25); + 300b924: 02500613 li a2,37 + 300b928: 09400593 li a1,148 + 300b92c: f8c42503 lw a0,-116(s0) + 300b930: 3369 jal ra,300b6ba + 300b932: 87aa mv a5,a0 + 300b934: 873e mv a4,a5 + 300b936: fef44783 lbu a5,-17(s0) + 300b93a: 8fd9 or a5,a5,a4 + 300b93c: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300b940: f8c42503 lw a0,-116(s0) + 300b944: 31f1 jal ra,300b610 + 300b946: 87aa mv a5,a0 + 300b948: 873e mv a4,a5 + 300b94a: fef44783 lbu a5,-17(s0) + 300b94e: 8fd9 or a5,a5,a4 + 300b950: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300b954: fc040793 addi a5,s0,-64 + 300b958: 863e mv a2,a5 + 300b95a: 09000593 li a1,144 + 300b95e: f8c42503 lw a0,-116(s0) + 300b962: 52d020ef jal ra,300e68e + 300b966: 87aa mv a5,a0 + 300b968: 873e mv a4,a5 + 300b96a: fef44783 lbu a5,-17(s0) + 300b96e: 8fd9 or a5,a5,a4 + 300b970: fef407a3 sb a5,-17(s0) + + NvmRefGoodSpadMap[4] = (uint8_t)((TmpDWord >> 24) + 300b974: fc042783 lw a5,-64(s0) + 300b978: 83e1 srli a5,a5,0x18 + 300b97a: 9f81 uxtb a5 + 300b97c: f8f40e23 sb a5,-100(s0) + & 0xff); + NvmRefGoodSpadMap[5] = (uint8_t)((TmpDWord >> 16) + 300b980: fc042783 lw a5,-64(s0) + 300b984: 83c1 srli a5,a5,0x10 + 300b986: 9f81 uxtb a5 + 300b988: f8f40ea3 sb a5,-99(s0) + & 0xff); + } + + if (((option & 2) == 2) && + 300b98c: f8b44783 lbu a5,-117(s0) + 300b990: 8b89 andi a5,a5,2 + 300b992: 3c078763 beqz a5,300bd60 + ((ReadDataFromDeviceDone & 2) == 0)) { + 300b996: fcf44783 lbu a5,-49(s0) + 300b99a: 8b89 andi a5,a5,2 + if (((option & 2) == 2) && + 300b99c: 3c079263 bnez a5,300bd60 + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x02); + 300b9a0: 4609 li a2,2 + 300b9a2: 09400593 li a1,148 + 300b9a6: f8c42503 lw a0,-116(s0) + 300b9aa: 3b01 jal ra,300b6ba + 300b9ac: 87aa mv a5,a0 + 300b9ae: 873e mv a4,a5 + 300b9b0: fef44783 lbu a5,-17(s0) + 300b9b4: 8fd9 or a5,a5,a4 + 300b9b6: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300b9ba: f8c42503 lw a0,-116(s0) + 300b9be: 3989 jal ra,300b610 + 300b9c0: 87aa mv a5,a0 + 300b9c2: 873e mv a4,a5 + 300b9c4: fef44783 lbu a5,-17(s0) + 300b9c8: 8fd9 or a5,a5,a4 + 300b9ca: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdByte(Dev, 0x90, &ModuleId); + 300b9ce: fbf40793 addi a5,s0,-65 + 300b9d2: 863e mv a2,a5 + 300b9d4: 09000593 li a1,144 + 300b9d8: f8c42503 lw a0,-116(s0) + 300b9dc: 39e9 jal ra,300b6b6 + 300b9de: 87aa mv a5,a0 + 300b9e0: 873e mv a4,a5 + 300b9e2: fef44783 lbu a5,-17(s0) + 300b9e6: 8fd9 or a5,a5,a4 + 300b9e8: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); + 300b9ec: 07b00613 li a2,123 + 300b9f0: 09400593 li a1,148 + 300b9f4: f8c42503 lw a0,-116(s0) + 300b9f8: 31c9 jal ra,300b6ba + 300b9fa: 87aa mv a5,a0 + 300b9fc: 873e mv a4,a5 + 300b9fe: fef44783 lbu a5,-17(s0) + 300ba02: 8fd9 or a5,a5,a4 + 300ba04: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300ba08: f8c42503 lw a0,-116(s0) + 300ba0c: 3111 jal ra,300b610 + 300ba0e: 87aa mv a5,a0 + 300ba10: 873e mv a4,a5 + 300ba12: fef44783 lbu a5,-17(s0) + 300ba16: 8fd9 or a5,a5,a4 + 300ba18: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdByte(Dev, 0x90, &Revision); + 300ba1c: fbe40793 addi a5,s0,-66 + 300ba20: 863e mv a2,a5 + 300ba22: 09000593 li a1,144 + 300ba26: f8c42503 lw a0,-116(s0) + 300ba2a: 3171 jal ra,300b6b6 + 300ba2c: 87aa mv a5,a0 + 300ba2e: 873e mv a4,a5 + 300ba30: fef44783 lbu a5,-17(s0) + 300ba34: 8fd9 or a5,a5,a4 + 300ba36: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x77); + 300ba3a: 07700613 li a2,119 + 300ba3e: 09400593 li a1,148 + 300ba42: f8c42503 lw a0,-116(s0) + 300ba46: 3995 jal ra,300b6ba + 300ba48: 87aa mv a5,a0 + 300ba4a: 873e mv a4,a5 + 300ba4c: fef44783 lbu a5,-17(s0) + 300ba50: 8fd9 or a5,a5,a4 + 300ba52: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300ba56: f8c42503 lw a0,-116(s0) + 300ba5a: 3e5d jal ra,300b610 + 300ba5c: 87aa mv a5,a0 + 300ba5e: 873e mv a4,a5 + 300ba60: fef44783 lbu a5,-17(s0) + 300ba64: 8fd9 or a5,a5,a4 + 300ba66: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300ba6a: fc040793 addi a5,s0,-64 + 300ba6e: 863e mv a2,a5 + 300ba70: 09000593 li a1,144 + 300ba74: f8c42503 lw a0,-116(s0) + 300ba78: 417020ef jal ra,300e68e + 300ba7c: 87aa mv a5,a0 + 300ba7e: 873e mv a4,a5 + 300ba80: fef44783 lbu a5,-17(s0) + 300ba84: 8fd9 or a5,a5,a4 + 300ba86: fef407a3 sb a5,-17(s0) + + ProductId[0] = (char)((TmpDWord >> 25) & 0x07f); + 300ba8a: fc042783 lw a5,-64(s0) + 300ba8e: 83e5 srli a5,a5,0x19 + 300ba90: 07e2 slli a5,a5,0x18 + 300ba92: 87e1 srai a5,a5,0x18 + 300ba94: 07f7f793 andi a5,a5,127 + 300ba98: 07e2 slli a5,a5,0x18 + 300ba9a: 87e1 srai a5,a5,0x18 + 300ba9c: faf40023 sb a5,-96(s0) + ProductId[1] = (char)((TmpDWord >> 18) & 0x07f); + 300baa0: fc042783 lw a5,-64(s0) + 300baa4: 83c9 srli a5,a5,0x12 + 300baa6: 07e2 slli a5,a5,0x18 + 300baa8: 87e1 srai a5,a5,0x18 + 300baaa: 07f7f793 andi a5,a5,127 + 300baae: 07e2 slli a5,a5,0x18 + 300bab0: 87e1 srai a5,a5,0x18 + 300bab2: faf400a3 sb a5,-95(s0) + ProductId[2] = (char)((TmpDWord >> 11) & 0x07f); + 300bab6: fc042783 lw a5,-64(s0) + 300baba: 83ad srli a5,a5,0xb + 300babc: 07e2 slli a5,a5,0x18 + 300babe: 87e1 srai a5,a5,0x18 + 300bac0: 07f7f793 andi a5,a5,127 + 300bac4: 07e2 slli a5,a5,0x18 + 300bac6: 87e1 srai a5,a5,0x18 + 300bac8: faf40123 sb a5,-94(s0) + ProductId[3] = (char)((TmpDWord >> 4) & 0x07f); + 300bacc: fc042783 lw a5,-64(s0) + 300bad0: 8391 srli a5,a5,0x4 + 300bad2: 07e2 slli a5,a5,0x18 + 300bad4: 87e1 srai a5,a5,0x18 + 300bad6: 07f7f793 andi a5,a5,127 + 300bada: 07e2 slli a5,a5,0x18 + 300badc: 87e1 srai a5,a5,0x18 + 300bade: faf401a3 sb a5,-93(s0) + + byte = (uint8_t)((TmpDWord & 0x00f) << 3); + 300bae2: fc042783 lw a5,-64(s0) + 300bae6: 9f81 uxtb a5 + 300bae8: 078e slli a5,a5,0x3 + 300baea: 9f81 uxtb a5 + 300baec: 0787f793 andi a5,a5,120 + 300baf0: 9f81 uxtb a5 + 300baf2: fcf403a3 sb a5,-57(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x78); + 300baf6: 07800613 li a2,120 + 300bafa: 09400593 li a1,148 + 300bafe: f8c42503 lw a0,-116(s0) + 300bb02: 3e65 jal ra,300b6ba + 300bb04: 87aa mv a5,a0 + 300bb06: 873e mv a4,a5 + 300bb08: fef44783 lbu a5,-17(s0) + 300bb0c: 8fd9 or a5,a5,a4 + 300bb0e: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300bb12: f8c42503 lw a0,-116(s0) + 300bb16: 3ced jal ra,300b610 + 300bb18: 87aa mv a5,a0 + 300bb1a: 873e mv a4,a5 + 300bb1c: fef44783 lbu a5,-17(s0) + 300bb20: 8fd9 or a5,a5,a4 + 300bb22: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300bb26: fc040793 addi a5,s0,-64 + 300bb2a: 863e mv a2,a5 + 300bb2c: 09000593 li a1,144 + 300bb30: f8c42503 lw a0,-116(s0) + 300bb34: 696000ef jal ra,300c1ca + 300bb38: 87aa mv a5,a0 + 300bb3a: 873e mv a4,a5 + 300bb3c: fef44783 lbu a5,-17(s0) + 300bb40: 8fd9 or a5,a5,a4 + 300bb42: fef407a3 sb a5,-17(s0) + + ProductId[4] = (char)(byte + + ((TmpDWord >> 29) & 0x07f)); + 300bb46: fc042783 lw a5,-64(s0) + 300bb4a: 83f5 srli a5,a5,0x1d + 300bb4c: 9f81 uxtb a5 + 300bb4e: 07f7f793 andi a5,a5,127 + 300bb52: 0ff7f713 andi a4,a5,255 + ProductId[4] = (char)(byte + + 300bb56: fc744783 lbu a5,-57(s0) + 300bb5a: 97ba add a5,a5,a4 + 300bb5c: 9f81 uxtb a5 + 300bb5e: 07e2 slli a5,a5,0x18 + 300bb60: 87e1 srai a5,a5,0x18 + 300bb62: faf40223 sb a5,-92(s0) + ProductId[5] = (char)((TmpDWord >> 22) & 0x07f); + 300bb66: fc042783 lw a5,-64(s0) + 300bb6a: 83d9 srli a5,a5,0x16 + 300bb6c: 07e2 slli a5,a5,0x18 + 300bb6e: 87e1 srai a5,a5,0x18 + 300bb70: 07f7f793 andi a5,a5,127 + 300bb74: 07e2 slli a5,a5,0x18 + 300bb76: 87e1 srai a5,a5,0x18 + 300bb78: faf402a3 sb a5,-91(s0) + ProductId[6] = (char)((TmpDWord >> 15) & 0x07f); + 300bb7c: fc042783 lw a5,-64(s0) + 300bb80: 83bd srli a5,a5,0xf + 300bb82: 07e2 slli a5,a5,0x18 + 300bb84: 87e1 srai a5,a5,0x18 + 300bb86: 07f7f793 andi a5,a5,127 + 300bb8a: 07e2 slli a5,a5,0x18 + 300bb8c: 87e1 srai a5,a5,0x18 + 300bb8e: faf40323 sb a5,-90(s0) + ProductId[7] = (char)((TmpDWord >> 8) & 0x07f); + 300bb92: fc042783 lw a5,-64(s0) + 300bb96: 83a1 srli a5,a5,0x8 + 300bb98: 07e2 slli a5,a5,0x18 + 300bb9a: 87e1 srai a5,a5,0x18 + 300bb9c: 07f7f793 andi a5,a5,127 + 300bba0: 07e2 slli a5,a5,0x18 + 300bba2: 87e1 srai a5,a5,0x18 + 300bba4: faf403a3 sb a5,-89(s0) + ProductId[8] = (char)((TmpDWord >> 1) & 0x07f); + 300bba8: fc042783 lw a5,-64(s0) + 300bbac: 8385 srli a5,a5,0x1 + 300bbae: 07e2 slli a5,a5,0x18 + 300bbb0: 87e1 srai a5,a5,0x18 + 300bbb2: 07f7f793 andi a5,a5,127 + 300bbb6: 07e2 slli a5,a5,0x18 + 300bbb8: 87e1 srai a5,a5,0x18 + 300bbba: faf40423 sb a5,-88(s0) + + byte = (uint8_t)((TmpDWord & 0x001) << 6); + 300bbbe: fc042783 lw a5,-64(s0) + 300bbc2: 9f81 uxtb a5 + 300bbc4: 079a slli a5,a5,0x6 + 300bbc6: 9f81 uxtb a5 + 300bbc8: 0407f793 andi a5,a5,64 + 300bbcc: 9f81 uxtb a5 + 300bbce: fcf403a3 sb a5,-57(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x79); + 300bbd2: 07900613 li a2,121 + 300bbd6: 09400593 li a1,148 + 300bbda: f8c42503 lw a0,-116(s0) + 300bbde: 3cf1 jal ra,300b6ba + 300bbe0: 87aa mv a5,a0 + 300bbe2: 873e mv a4,a5 + 300bbe4: fef44783 lbu a5,-17(s0) + 300bbe8: 8fd9 or a5,a5,a4 + 300bbea: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_device_read_strobe(Dev); + 300bbee: f8c42503 lw a0,-116(s0) + 300bbf2: 3c39 jal ra,300b610 + 300bbf4: 87aa mv a5,a0 + 300bbf6: 873e mv a4,a5 + 300bbf8: fef44783 lbu a5,-17(s0) + 300bbfc: 8fd9 or a5,a5,a4 + 300bbfe: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300bc02: fc040793 addi a5,s0,-64 + 300bc06: 863e mv a2,a5 + 300bc08: 09000593 li a1,144 + 300bc0c: f8c42503 lw a0,-116(s0) + 300bc10: 2b6d jal ra,300c1ca + 300bc12: 87aa mv a5,a0 + 300bc14: 873e mv a4,a5 + 300bc16: fef44783 lbu a5,-17(s0) + 300bc1a: 8fd9 or a5,a5,a4 + 300bc1c: fef407a3 sb a5,-17(s0) + + ProductId[9] = (char)(byte + + ((TmpDWord >> 26) & 0x07f)); + 300bc20: fc042783 lw a5,-64(s0) + 300bc24: 83e9 srli a5,a5,0x1a + 300bc26: 9f81 uxtb a5 + 300bc28: 07f7f793 andi a5,a5,127 + 300bc2c: 0ff7f713 andi a4,a5,255 + ProductId[9] = (char)(byte + + 300bc30: fc744783 lbu a5,-57(s0) + 300bc34: 97ba add a5,a5,a4 + 300bc36: 9f81 uxtb a5 + 300bc38: 07e2 slli a5,a5,0x18 + 300bc3a: 87e1 srai a5,a5,0x18 + 300bc3c: faf404a3 sb a5,-87(s0) + ProductId[10] = (char)((TmpDWord >> 19) & 0x07f); + 300bc40: fc042783 lw a5,-64(s0) + 300bc44: 83cd srli a5,a5,0x13 + 300bc46: 07e2 slli a5,a5,0x18 + 300bc48: 87e1 srai a5,a5,0x18 + 300bc4a: 07f7f793 andi a5,a5,127 + 300bc4e: 07e2 slli a5,a5,0x18 + 300bc50: 87e1 srai a5,a5,0x18 + 300bc52: faf40523 sb a5,-86(s0) + ProductId[11] = (char)((TmpDWord >> 12) & 0x07f); + 300bc56: fc042783 lw a5,-64(s0) + 300bc5a: 83b1 srli a5,a5,0xc + 300bc5c: 07e2 slli a5,a5,0x18 + 300bc5e: 87e1 srai a5,a5,0x18 + 300bc60: 07f7f793 andi a5,a5,127 + 300bc64: 07e2 slli a5,a5,0x18 + 300bc66: 87e1 srai a5,a5,0x18 + 300bc68: faf405a3 sb a5,-85(s0) + ProductId[12] = (char)((TmpDWord >> 5) & 0x07f); + 300bc6c: fc042783 lw a5,-64(s0) + 300bc70: 8395 srli a5,a5,0x5 + 300bc72: 07e2 slli a5,a5,0x18 + 300bc74: 87e1 srai a5,a5,0x18 + 300bc76: 07f7f793 andi a5,a5,127 + 300bc7a: 07e2 slli a5,a5,0x18 + 300bc7c: 87e1 srai a5,a5,0x18 + 300bc7e: faf40623 sb a5,-84(s0) + + byte = (uint8_t)((TmpDWord & 0x01f) << 2); + 300bc82: fc042783 lw a5,-64(s0) + 300bc86: 9f81 uxtb a5 + 300bc88: 078a slli a5,a5,0x2 + 300bc8a: 9f81 uxtb a5 + 300bc8c: 07c7f793 andi a5,a5,124 + 300bc90: 9f81 uxtb a5 + 300bc92: fcf403a3 sb a5,-57(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7A); + 300bc96: 07a00613 li a2,122 + 300bc9a: 09400593 li a1,148 + 300bc9e: f8c42503 lw a0,-116(s0) + 300bca2: 3c21 jal ra,300b6ba + 300bca4: 87aa mv a5,a0 + 300bca6: 873e mv a4,a5 + 300bca8: fef44783 lbu a5,-17(s0) + 300bcac: 8fd9 or a5,a5,a4 + 300bcae: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_device_read_strobe(Dev); + 300bcb2: f8c42503 lw a0,-116(s0) + 300bcb6: 3aa9 jal ra,300b610 + 300bcb8: 87aa mv a5,a0 + 300bcba: 873e mv a4,a5 + 300bcbc: fef44783 lbu a5,-17(s0) + 300bcc0: 8fd9 or a5,a5,a4 + 300bcc2: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300bcc6: fc040793 addi a5,s0,-64 + 300bcca: 863e mv a2,a5 + 300bccc: 09000593 li a1,144 + 300bcd0: f8c42503 lw a0,-116(s0) + 300bcd4: 29dd jal ra,300c1ca + 300bcd6: 87aa mv a5,a0 + 300bcd8: 873e mv a4,a5 + 300bcda: fef44783 lbu a5,-17(s0) + 300bcde: 8fd9 or a5,a5,a4 + 300bce0: fef407a3 sb a5,-17(s0) + + ProductId[13] = (char)(byte + + ((TmpDWord >> 30) & 0x07f)); + 300bce4: fc042783 lw a5,-64(s0) + 300bce8: 83f9 srli a5,a5,0x1e + 300bcea: 9f81 uxtb a5 + 300bcec: 07f7f793 andi a5,a5,127 + 300bcf0: 0ff7f713 andi a4,a5,255 + ProductId[13] = (char)(byte + + 300bcf4: fc744783 lbu a5,-57(s0) + 300bcf8: 97ba add a5,a5,a4 + 300bcfa: 9f81 uxtb a5 + 300bcfc: 07e2 slli a5,a5,0x18 + 300bcfe: 87e1 srai a5,a5,0x18 + 300bd00: faf406a3 sb a5,-83(s0) + ProductId[14] = (char)((TmpDWord >> 23) & 0x07f); + 300bd04: fc042783 lw a5,-64(s0) + 300bd08: 83dd srli a5,a5,0x17 + 300bd0a: 07e2 slli a5,a5,0x18 + 300bd0c: 87e1 srai a5,a5,0x18 + 300bd0e: 07f7f793 andi a5,a5,127 + 300bd12: 07e2 slli a5,a5,0x18 + 300bd14: 87e1 srai a5,a5,0x18 + 300bd16: faf40723 sb a5,-82(s0) + ProductId[15] = (char)((TmpDWord >> 16) & 0x07f); + 300bd1a: fc042783 lw a5,-64(s0) + 300bd1e: 83c1 srli a5,a5,0x10 + 300bd20: 07e2 slli a5,a5,0x18 + 300bd22: 87e1 srai a5,a5,0x18 + 300bd24: 07f7f793 andi a5,a5,127 + 300bd28: 07e2 slli a5,a5,0x18 + 300bd2a: 87e1 srai a5,a5,0x18 + 300bd2c: faf407a3 sb a5,-81(s0) + ProductId[16] = (char)((TmpDWord >> 9) & 0x07f); + 300bd30: fc042783 lw a5,-64(s0) + 300bd34: 83a5 srli a5,a5,0x9 + 300bd36: 07e2 slli a5,a5,0x18 + 300bd38: 87e1 srai a5,a5,0x18 + 300bd3a: 07f7f793 andi a5,a5,127 + 300bd3e: 07e2 slli a5,a5,0x18 + 300bd40: 87e1 srai a5,a5,0x18 + 300bd42: faf40823 sb a5,-80(s0) + ProductId[17] = (char)((TmpDWord >> 2) & 0x07f); + 300bd46: fc042783 lw a5,-64(s0) + 300bd4a: 8389 srli a5,a5,0x2 + 300bd4c: 07e2 slli a5,a5,0x18 + 300bd4e: 87e1 srai a5,a5,0x18 + 300bd50: 07f7f793 andi a5,a5,127 + 300bd54: 07e2 slli a5,a5,0x18 + 300bd56: 87e1 srai a5,a5,0x18 + 300bd58: faf408a3 sb a5,-79(s0) + ProductId[18] = '\0'; + 300bd5c: fa040923 sb zero,-78(s0) + + } + + if (((option & 4) == 4) && + 300bd60: f8b44783 lbu a5,-117(s0) + 300bd64: 8b91 andi a5,a5,4 + 300bd66: 22078363 beqz a5,300bf8c + ((ReadDataFromDeviceDone & 4) == 0)) { + 300bd6a: fcf44783 lbu a5,-49(s0) + 300bd6e: 8b91 andi a5,a5,4 + if (((option & 4) == 4) && + 300bd70: 20079e63 bnez a5,300bf8c + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); + 300bd74: 07b00613 li a2,123 + 300bd78: 09400593 li a1,148 + 300bd7c: f8c42503 lw a0,-116(s0) + 300bd80: 3a2d jal ra,300b6ba + 300bd82: 87aa mv a5,a0 + 300bd84: 873e mv a4,a5 + 300bd86: fef44783 lbu a5,-17(s0) + 300bd8a: 8fd9 or a5,a5,a4 + 300bd8c: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300bd90: f8c42503 lw a0,-116(s0) + 300bd94: 290d jal ra,300c1c6 + 300bd96: 87aa mv a5,a0 + 300bd98: 873e mv a4,a5 + 300bd9a: fef44783 lbu a5,-17(s0) + 300bd9e: 8fd9 or a5,a5,a4 + 300bda0: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDUpper); + 300bda4: fb840793 addi a5,s0,-72 + 300bda8: 863e mv a2,a5 + 300bdaa: 09000593 li a1,144 + 300bdae: f8c42503 lw a0,-116(s0) + 300bdb2: 2921 jal ra,300c1ca + 300bdb4: 87aa mv a5,a0 + 300bdb6: 873e mv a4,a5 + 300bdb8: fef44783 lbu a5,-17(s0) + 300bdbc: 8fd9 or a5,a5,a4 + 300bdbe: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7C); + 300bdc2: 07c00613 li a2,124 + 300bdc6: 09400593 li a1,148 + 300bdca: f8c42503 lw a0,-116(s0) + 300bdce: 2101 jal ra,300c1ce + 300bdd0: 87aa mv a5,a0 + 300bdd2: 873e mv a4,a5 + 300bdd4: fef44783 lbu a5,-17(s0) + 300bdd8: 8fd9 or a5,a5,a4 + 300bdda: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300bdde: f8c42503 lw a0,-116(s0) + 300bde2: 26d5 jal ra,300c1c6 + 300bde4: 87aa mv a5,a0 + 300bde6: 873e mv a4,a5 + 300bde8: fef44783 lbu a5,-17(s0) + 300bdec: 8fd9 or a5,a5,a4 + 300bdee: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDLower); + 300bdf2: fb440793 addi a5,s0,-76 + 300bdf6: 863e mv a2,a5 + 300bdf8: 09000593 li a1,144 + 300bdfc: f8c42503 lw a0,-116(s0) + 300be00: 26e9 jal ra,300c1ca + 300be02: 87aa mv a5,a0 + 300be04: 873e mv a4,a5 + 300be06: fef44783 lbu a5,-17(s0) + 300be0a: 8fd9 or a5,a5,a4 + 300be0c: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x73); + 300be10: 07300613 li a2,115 + 300be14: 09400593 li a1,148 + 300be18: f8c42503 lw a0,-116(s0) + 300be1c: 2e4d jal ra,300c1ce + 300be1e: 87aa mv a5,a0 + 300be20: 873e mv a4,a5 + 300be22: fef44783 lbu a5,-17(s0) + 300be26: 8fd9 or a5,a5,a4 + 300be28: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300be2c: f8c42503 lw a0,-116(s0) + 300be30: 2e59 jal ra,300c1c6 + 300be32: 87aa mv a5,a0 + 300be34: 873e mv a4,a5 + 300be36: fef44783 lbu a5,-17(s0) + 300be3a: 8fd9 or a5,a5,a4 + 300be3c: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300be40: fc040793 addi a5,s0,-64 + 300be44: 863e mv a2,a5 + 300be46: 09000593 li a1,144 + 300be4a: f8c42503 lw a0,-116(s0) + 300be4e: 2eb5 jal ra,300c1ca + 300be50: 87aa mv a5,a0 + 300be52: 873e mv a4,a5 + 300be54: fef44783 lbu a5,-17(s0) + 300be58: 8fd9 or a5,a5,a4 + 300be5a: fef407a3 sb a5,-17(s0) + + SignalRateMeasFixed1104_400_mm = (TmpDWord & + 0x0000000ff) << 8; + 300be5e: fc042783 lw a5,-64(s0) + 300be62: 00879713 slli a4,a5,0x8 + SignalRateMeasFixed1104_400_mm = (TmpDWord & + 300be66: 67c1 lui a5,0x10 + 300be68: 17fd addi a5,a5,-1 # ffff + 300be6a: 8ff9 and a5,a5,a4 + 300be6c: fef42023 sw a5,-32(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x74); + 300be70: 07400613 li a2,116 + 300be74: 09400593 li a1,148 + 300be78: f8c42503 lw a0,-116(s0) + 300be7c: 2e89 jal ra,300c1ce + 300be7e: 87aa mv a5,a0 + 300be80: 873e mv a4,a5 + 300be82: fef44783 lbu a5,-17(s0) + 300be86: 8fd9 or a5,a5,a4 + 300be88: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300be8c: f8c42503 lw a0,-116(s0) + 300be90: 2e1d jal ra,300c1c6 + 300be92: 87aa mv a5,a0 + 300be94: 873e mv a4,a5 + 300be96: fef44783 lbu a5,-17(s0) + 300be9a: 8fd9 or a5,a5,a4 + 300be9c: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300bea0: fc040793 addi a5,s0,-64 + 300bea4: 863e mv a2,a5 + 300bea6: 09000593 li a1,144 + 300beaa: f8c42503 lw a0,-116(s0) + 300beae: 2e31 jal ra,300c1ca + 300beb0: 87aa mv a5,a0 + 300beb2: 873e mv a4,a5 + 300beb4: fef44783 lbu a5,-17(s0) + 300beb8: 8fd9 or a5,a5,a4 + 300beba: fef407a3 sb a5,-17(s0) + + SignalRateMeasFixed1104_400_mm |= ((TmpDWord & + 0xff000000) >> 24); + 300bebe: fc042783 lw a5,-64(s0) + 300bec2: 83e1 srli a5,a5,0x18 + SignalRateMeasFixed1104_400_mm |= ((TmpDWord & + 300bec4: fe042703 lw a4,-32(s0) + 300bec8: 8fd9 or a5,a5,a4 + 300beca: fef42023 sw a5,-32(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x75); + 300bece: 07500613 li a2,117 + 300bed2: 09400593 li a1,148 + 300bed6: f8c42503 lw a0,-116(s0) + 300beda: 2cd5 jal ra,300c1ce + 300bedc: 87aa mv a5,a0 + 300bede: 873e mv a4,a5 + 300bee0: fef44783 lbu a5,-17(s0) + 300bee4: 8fd9 or a5,a5,a4 + 300bee6: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300beea: f8c42503 lw a0,-116(s0) + 300beee: 2ce1 jal ra,300c1c6 + 300bef0: 87aa mv a5,a0 + 300bef2: 873e mv a4,a5 + 300bef4: fef44783 lbu a5,-17(s0) + 300bef8: 8fd9 or a5,a5,a4 + 300befa: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300befe: fc040793 addi a5,s0,-64 + 300bf02: 863e mv a2,a5 + 300bf04: 09000593 li a1,144 + 300bf08: f8c42503 lw a0,-116(s0) + 300bf0c: 2c7d jal ra,300c1ca + 300bf0e: 87aa mv a5,a0 + 300bf10: 873e mv a4,a5 + 300bf12: fef44783 lbu a5,-17(s0) + 300bf16: 8fd9 or a5,a5,a4 + 300bf18: fef407a3 sb a5,-17(s0) + + DistMeasFixed1104_400_mm = (TmpDWord & 0x0000000ff) + << 8; + 300bf1c: fc042783 lw a5,-64(s0) + 300bf20: 00879713 slli a4,a5,0x8 + DistMeasFixed1104_400_mm = (TmpDWord & 0x0000000ff) + 300bf24: 67c1 lui a5,0x10 + 300bf26: 17fd addi a5,a5,-1 # ffff + 300bf28: 8ff9 and a5,a5,a4 + 300bf2a: fef42223 sw a5,-28(s0) + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x76); + 300bf2e: 07600613 li a2,118 + 300bf32: 09400593 li a1,148 + 300bf36: f8c42503 lw a0,-116(s0) + 300bf3a: 2c51 jal ra,300c1ce + 300bf3c: 87aa mv a5,a0 + 300bf3e: 873e mv a4,a5 + 300bf40: fef44783 lbu a5,-17(s0) + 300bf44: 8fd9 or a5,a5,a4 + 300bf46: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_device_read_strobe(Dev); + 300bf4a: f8c42503 lw a0,-116(s0) + 300bf4e: 2ca5 jal ra,300c1c6 + 300bf50: 87aa mv a5,a0 + 300bf52: 873e mv a4,a5 + 300bf54: fef44783 lbu a5,-17(s0) + 300bf58: 8fd9 or a5,a5,a4 + 300bf5a: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + 300bf5e: fc040793 addi a5,s0,-64 + 300bf62: 863e mv a2,a5 + 300bf64: 09000593 li a1,144 + 300bf68: f8c42503 lw a0,-116(s0) + 300bf6c: 2cb9 jal ra,300c1ca + 300bf6e: 87aa mv a5,a0 + 300bf70: 873e mv a4,a5 + 300bf72: fef44783 lbu a5,-17(s0) + 300bf76: 8fd9 or a5,a5,a4 + 300bf78: fef407a3 sb a5,-17(s0) + + DistMeasFixed1104_400_mm |= ((TmpDWord & 0xff000000) + >> 24); + 300bf7c: fc042783 lw a5,-64(s0) + 300bf80: 83e1 srli a5,a5,0x18 + DistMeasFixed1104_400_mm |= ((TmpDWord & 0xff000000) + 300bf82: fe442703 lw a4,-28(s0) + 300bf86: 8fd9 or a5,a5,a4 + 300bf88: fef42223 sw a5,-28(s0) + } + + Status |= VL53L0X_WrByte(Dev, 0x81, 0x00); + 300bf8c: 4601 li a2,0 + 300bf8e: 08100593 li a1,129 + 300bf92: f8c42503 lw a0,-116(s0) + 300bf96: 2c25 jal ra,300c1ce + 300bf98: 87aa mv a5,a0 + 300bf9a: 873e mv a4,a5 + 300bf9c: fef44783 lbu a5,-17(s0) + 300bfa0: 8fd9 or a5,a5,a4 + 300bfa2: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); + 300bfa6: 4619 li a2,6 + 300bfa8: 0ff00593 li a1,255 + 300bfac: f8c42503 lw a0,-116(s0) + 300bfb0: 2c39 jal ra,300c1ce + 300bfb2: 87aa mv a5,a0 + 300bfb4: 873e mv a4,a5 + 300bfb6: fef44783 lbu a5,-17(s0) + 300bfba: 8fd9 or a5,a5,a4 + 300bfbc: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_RdByte(Dev, 0x83, &byte); + 300bfc0: fc740793 addi a5,s0,-57 + 300bfc4: 863e mv a2,a5 + 300bfc6: 08300593 li a1,131 + 300bfca: f8c42503 lw a0,-116(s0) + 300bfce: 614020ef jal ra,300e5e2 + 300bfd2: 87aa mv a5,a0 + 300bfd4: 873e mv a4,a5 + 300bfd6: fef44783 lbu a5,-17(s0) + 300bfda: 8fd9 or a5,a5,a4 + 300bfdc: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x83, byte&0xfb); + 300bfe0: fc744783 lbu a5,-57(s0) + 300bfe4: 9bed andi a5,a5,-5 + 300bfe6: 9f81 uxtb a5 + 300bfe8: 863e mv a2,a5 + 300bfea: 08300593 li a1,131 + 300bfee: f8c42503 lw a0,-116(s0) + 300bff2: 2af1 jal ra,300c1ce + 300bff4: 87aa mv a5,a0 + 300bff6: 873e mv a4,a5 + 300bff8: fef44783 lbu a5,-17(s0) + 300bffc: 8fd9 or a5,a5,a4 + 300bffe: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300c002: 4605 li a2,1 + 300c004: 0ff00593 li a1,255 + 300c008: f8c42503 lw a0,-116(s0) + 300c00c: 22c9 jal ra,300c1ce + 300c00e: 87aa mv a5,a0 + 300c010: 873e mv a4,a5 + 300c012: fef44783 lbu a5,-17(s0) + 300c016: 8fd9 or a5,a5,a4 + 300c018: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + 300c01c: 4605 li a2,1 + 300c01e: 4581 li a1,0 + 300c020: f8c42503 lw a0,-116(s0) + 300c024: 226d jal ra,300c1ce + 300c026: 87aa mv a5,a0 + 300c028: 873e mv a4,a5 + 300c02a: fef44783 lbu a5,-17(s0) + 300c02e: 8fd9 or a5,a5,a4 + 300c030: fef407a3 sb a5,-17(s0) + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300c034: 4601 li a2,0 + 300c036: 0ff00593 li a1,255 + 300c03a: f8c42503 lw a0,-116(s0) + 300c03e: 2a41 jal ra,300c1ce + 300c040: 87aa mv a5,a0 + 300c042: 873e mv a4,a5 + 300c044: fef44783 lbu a5,-17(s0) + 300c048: 8fd9 or a5,a5,a4 + 300c04a: fef407a3 sb a5,-17(s0) + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + 300c04e: 4601 li a2,0 + 300c050: 08000593 li a1,128 + 300c054: f8c42503 lw a0,-116(s0) + 300c058: 2a9d jal ra,300c1ce + 300c05a: 87aa mv a5,a0 + 300c05c: 873e mv a4,a5 + 300c05e: fef44783 lbu a5,-17(s0) + 300c062: 8fd9 or a5,a5,a4 + 300c064: fef407a3 sb a5,-17(s0) + } + + if ((Status == VL53L0X_ERROR_NONE) && + 300c068: fef40783 lb a5,-17(s0) + 300c06c: 14079663 bnez a5,300c1b8 + 300c070: fcf44703 lbu a4,-49(s0) + 300c074: 479d li a5,7 + 300c076: 14f70163 beq a4,a5,300c1b8 + (ReadDataFromDeviceDone != 7)) { + /* Assign to variable if status is ok */ + if (((option & 1) == 1) && + 300c07a: f8b44783 lbu a5,-117(s0) + 300c07e: 8b85 andi a5,a5,1 + 300c080: cfa1 beqz a5,300c0d8 + ((ReadDataFromDeviceDone & 1) == 0)) { + 300c082: fcf44783 lbu a5,-49(s0) + 300c086: 8b85 andi a5,a5,1 + if (((option & 1) == 1) && + 300c088: eba1 bnez a5,300c0d8 + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c08a: f8c42783 lw a5,-116(s0) + 300c08e: fee44703 lbu a4,-18(s0) + 300c092: 12e78fa3 sb a4,319(a5) + ReferenceSpadCount, ReferenceSpadCount); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c096: f8c42783 lw a5,-116(s0) + 300c09a: fed44703 lbu a4,-19(s0) + 300c09e: 14e78023 sb a4,320(a5) + ReferenceSpadType, ReferenceSpadType); + + for (i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++) { + 300c0a2: fc042e23 sw zero,-36(s0) + 300c0a6: a025 j 300c0ce + Dev->Data.SpadData.RefGoodSpadMap[i] = + NvmRefGoodSpadMap[i]; + 300c0a8: fdc42783 lw a5,-36(s0) + 300c0ac: ff040713 addi a4,s0,-16 + 300c0b0: 97ba add a5,a5,a4 + 300c0b2: fa87c703 lbu a4,-88(a5) + Dev->Data.SpadData.RefGoodSpadMap[i] = + 300c0b6: f8c42683 lw a3,-116(s0) + 300c0ba: fdc42783 lw a5,-36(s0) + 300c0be: 97b6 add a5,a5,a3 + 300c0c0: 14e78b23 sb a4,342(a5) + for (i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++) { + 300c0c4: fdc42783 lw a5,-36(s0) + 300c0c8: 0785 addi a5,a5,1 + 300c0ca: fcf42e23 sw a5,-36(s0) + 300c0ce: fdc42703 lw a4,-36(s0) + 300c0d2: 4795 li a5,5 + 300c0d4: fce7dae3 bge a5,a4,300c0a8 + } + } + + if (((option & 2) == 2) && + 300c0d8: f8b44783 lbu a5,-117(s0) + 300c0dc: 8b89 andi a5,a5,2 + 300c0de: cf95 beqz a5,300c11a + ((ReadDataFromDeviceDone & 2) == 0)) { + 300c0e0: fcf44783 lbu a5,-49(s0) + 300c0e4: 8b89 andi a5,a5,2 + if (((option & 2) == 2) && + 300c0e6: eb95 bnez a5,300c11a + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c0e8: fbf44703 lbu a4,-65(s0) + 300c0ec: f8c42783 lw a5,-116(s0) + 300c0f0: 10e78ea3 sb a4,285(a5) + ModuleId, ModuleId); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c0f4: fbe44703 lbu a4,-66(s0) + 300c0f8: f8c42783 lw a5,-116(s0) + 300c0fc: 10e78f23 sb a4,286(a5) + Revision, Revision); + + ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + 300c100: f8c42783 lw a5,-116(s0) + 300c104: 11f78793 addi a5,a5,287 + 300c108: fcf42423 sw a5,-56(s0) + ProductId); + VL53L0X_COPYSTRING(ProductId_tmp, ProductId); + 300c10c: fa040793 addi a5,s0,-96 + 300c110: 85be mv a1,a5 + 300c112: fc842503 lw a0,-56(s0) + 300c116: 435020ef jal ra,300ed4a + + } + + if (((option & 4) == 4) && + 300c11a: f8b44783 lbu a5,-117(s0) + 300c11e: 8b91 andi a5,a5,4 + 300c120: cfb5 beqz a5,300c19c + ((ReadDataFromDeviceDone & 4) == 0)) { + 300c122: fcf44783 lbu a5,-49(s0) + 300c126: 8b91 andi a5,a5,4 + if (((option & 4) == 4) && + 300c128: ebb5 bnez a5,300c19c + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c12a: fb842703 lw a4,-72(s0) + 300c12e: f8c42783 lw a5,-116(s0) + 300c132: 14e7a223 sw a4,324(a5) + PartUIDUpper, PartUIDUpper); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c136: fb442703 lw a4,-76(s0) + 300c13a: f8c42783 lw a5,-116(s0) + 300c13e: 14e7a423 sw a4,328(a5) + PartUIDLower, PartUIDLower); + + SignalRateMeasFixed400mmFix = + 300c142: fe042783 lw a5,-32(s0) + 300c146: 07a6 slli a5,a5,0x9 + 300c148: fcf42823 sw a5,-48(s0) + VL53L0X_FIXPOINT97TOFIXPOINT1616( + SignalRateMeasFixed1104_400_mm); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c14c: f8c42783 lw a5,-116(s0) + 300c150: fd042703 lw a4,-48(s0) + 300c154: 14e7a623 sw a4,332(a5) + SignalRateMeasFixed400mm, + SignalRateMeasFixed400mmFix); + + OffsetMicroMeters = 0; + 300c158: fe041523 sh zero,-22(s0) + if (DistMeasFixed1104_400_mm != 0) { + 300c15c: fe442783 lw a5,-28(s0) + 300c160: cb8d beqz a5,300c192 + OffsetFixed1104_mm = + 300c162: fe442703 lw a4,-28(s0) + 300c166: fd442783 lw a5,-44(s0) + 300c16a: 40f707b3 sub a5,a4,a5 + 300c16e: fcf42c23 sw a5,-40(s0) + DistMeasFixed1104_400_mm - + DistMeasTgtFixed1104_mm; + OffsetMicroMeters = (OffsetFixed1104_mm + * 1000) >> 4; + 300c172: fd842703 lw a4,-40(s0) + 300c176: 3e800793 li a5,1000 + 300c17a: 02f707b3 mul a5,a4,a5 + 300c17e: 8391 srli a5,a5,0x4 + OffsetMicroMeters = (OffsetFixed1104_mm + 300c180: fef41523 sh a5,-22(s0) + OffsetMicroMeters *= -1; + 300c184: fea45783 lhu a5,-22(s0) + 300c188: 40f007b3 neg a5,a5 + 300c18c: 9fa1 uxth a5 + 300c18e: fef41523 sh a5,-22(s0) + } + + PALDevDataSet(Dev, + 300c192: fea41703 lh a4,-22(s0) + 300c196: f8c42783 lw a5,-116(s0) + 300c19a: c3d8 sw a4,4(a5) + Part2PartOffsetAdjustmentNVMMicroMeter, + OffsetMicroMeters); + } + byte = (uint8_t)(ReadDataFromDeviceDone|option); + 300c19c: fcf44703 lbu a4,-49(s0) + 300c1a0: f8b44783 lbu a5,-117(s0) + 300c1a4: 8fd9 or a5,a5,a4 + 300c1a6: 9f81 uxtb a5 + 300c1a8: fcf403a3 sb a5,-57(s0) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, + 300c1ac: fc744703 lbu a4,-57(s0) + 300c1b0: f8c42783 lw a5,-116(s0) + 300c1b4: 10e78e23 sb a4,284(a5) + byte); + } + + LOG_FUNCTION_END(Status); + return Status; + 300c1b8: fef40783 lb a5,-17(s0) +} + 300c1bc: 853e mv a0,a5 + 300c1be: 50f6 lw ra,124(sp) + 300c1c0: 5466 lw s0,120(sp) + 300c1c2: 6109 addi sp,sp,128 + 300c1c4: 8082 ret + +0300c1c6 : + 300c1c6: c4aff06f j 300b610 + +0300c1ca : + 300c1ca: 4c40206f j 300e68e + +0300c1ce : + 300c1ce: 2b60206f j 300e484 + +0300c1d2 : + + +uint32_t VL53L0X_calc_macro_period_ps(VL53L0X_DEV Dev, + uint8_t vcsel_period_pclks) +{ + 300c1d2: 7179 addi sp,sp,-48 + 300c1d4: d622 sw s0,44(sp) + 300c1d6: 1800 addi s0,sp,48 + 300c1d8: fca42e23 sw a0,-36(s0) + 300c1dc: 87ae mv a5,a1 + 300c1de: fcf40da3 sb a5,-37(s0) + LOG_FUNCTION_START(""); + + /* The above calculation will produce rounding errors, + * therefore set fixed value + */ + PLL_period_ps = 1655; + 300c1e2: 67700793 li a5,1655 + 300c1e6: 4801 li a6,0 + 300c1e8: fef42423 sw a5,-24(s0) + 300c1ec: ff042623 sw a6,-20(s0) + + macro_period_vclks = 2304; + 300c1f0: 6785 lui a5,0x1 + 300c1f2: 90078793 addi a5,a5,-1792 # 900 + 300c1f6: fef42223 sw a5,-28(s0) + macro_period_ps = (uint32_t)(macro_period_vclks + 300c1fa: fdb44703 lbu a4,-37(s0) + * vcsel_period_pclks * PLL_period_ps); + 300c1fe: fe442783 lw a5,-28(s0) + 300c202: 02f70733 mul a4,a4,a5 + macro_period_ps = (uint32_t)(macro_period_vclks + 300c206: fe842783 lw a5,-24(s0) + 300c20a: 02f707b3 mul a5,a4,a5 + 300c20e: fef42023 sw a5,-32(s0) + + LOG_FUNCTION_END(""); + return macro_period_ps; + 300c212: fe042783 lw a5,-32(s0) +} + 300c216: 853e mv a0,a5 + 300c218: 5432 lw s0,44(sp) + 300c21a: 6145 addi sp,sp,48 + 300c21c: 8082 ret + +0300c21e : + +uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks) +{ + 300c21e: 7179 addi sp,sp,-48 + 300c220: d622 sw s0,44(sp) + 300c222: 1800 addi s0,sp,48 + 300c224: fca42e23 sw a0,-36(s0) + /*! + * Encode timeout in macro periods in (LSByte * 2^MSByte) + 1 format + */ + + uint16_t encoded_timeout = 0; + 300c228: fe041723 sh zero,-18(s0) + uint32_t ls_byte = 0; + 300c22c: fe042423 sw zero,-24(s0) + uint16_t ms_byte = 0; + 300c230: fe041323 sh zero,-26(s0) + + if (timeout_macro_clks > 0) { + 300c234: fdc42783 lw a5,-36(s0) + 300c238: c7a9 beqz a5,300c282 + ls_byte = timeout_macro_clks - 1; + 300c23a: fdc42783 lw a5,-36(s0) + 300c23e: 17fd addi a5,a5,-1 + 300c240: fef42423 sw a5,-24(s0) + + while ((ls_byte & 0xFFFFFF00) > 0) { + 300c244: a819 j 300c25a + ls_byte = ls_byte >> 1; + 300c246: fe842783 lw a5,-24(s0) + 300c24a: 8385 srli a5,a5,0x1 + 300c24c: fef42423 sw a5,-24(s0) + ms_byte++; + 300c250: fe645783 lhu a5,-26(s0) + 300c254: 0785 addi a5,a5,1 + 300c256: fef41323 sh a5,-26(s0) + while ((ls_byte & 0xFFFFFF00) > 0) { + 300c25a: fe842783 lw a5,-24(s0) + 300c25e: f007f793 andi a5,a5,-256 + 300c262: f3f5 bnez a5,300c246 + } + + encoded_timeout = (ms_byte << 8) + 300c264: fe645783 lhu a5,-26(s0) + 300c268: 07a2 slli a5,a5,0x8 + 300c26a: 01079713 slli a4,a5,0x10 + 300c26e: 8341 srli a4,a4,0x10 + + (uint16_t) (ls_byte & 0x000000FF); + 300c270: fe842783 lw a5,-24(s0) + 300c274: 9fa1 uxth a5 + 300c276: 0ff7f793 andi a5,a5,255 + 300c27a: 9fa1 uxth a5 + encoded_timeout = (ms_byte << 8) + 300c27c: 97ba add a5,a5,a4 + 300c27e: fef41723 sh a5,-18(s0) + } + + return encoded_timeout; + 300c282: fee45783 lhu a5,-18(s0) + +} + 300c286: 853e mv a0,a5 + 300c288: 5432 lw s0,44(sp) + 300c28a: 6145 addi sp,sp,48 + 300c28c: 8082 ret + +0300c28e : + +uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout) +{ + 300c28e: 7179 addi sp,sp,-48 + 300c290: d622 sw s0,44(sp) + 300c292: 1800 addi s0,sp,48 + 300c294: 87aa mv a5,a0 + 300c296: fcf41f23 sh a5,-34(s0) + /*! + * Decode 16-bit timeout register value - format (LSByte * 2^MSByte) + 1 + */ + + uint32_t timeout_macro_clks = 0; + 300c29a: fe042623 sw zero,-20(s0) + + timeout_macro_clks = ((uint32_t) (encoded_timeout & 0x00FF) + 300c29e: fde45783 lhu a5,-34(s0) + 300c2a2: 0ff7f793 andi a5,a5,255 + << (uint32_t) ((encoded_timeout & 0xFF00) >> 8)) + 1; + 300c2a6: fde45703 lhu a4,-34(s0) + 300c2aa: 8321 srli a4,a4,0x8 + 300c2ac: 9f21 uxth a4 + 300c2ae: 00e797b3 sll a5,a5,a4 + timeout_macro_clks = ((uint32_t) (encoded_timeout & 0x00FF) + 300c2b2: 0785 addi a5,a5,1 + 300c2b4: fef42623 sw a5,-20(s0) + + return timeout_macro_clks; + 300c2b8: fec42783 lw a5,-20(s0) +} + 300c2bc: 853e mv a0,a5 + 300c2be: 5432 lw s0,44(sp) + 300c2c0: 6145 addi sp,sp,48 + 300c2c2: 8082 ret + +0300c2c4 : + +/* To convert ms into register value */ +uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, + uint32_t timeout_period_us, + uint8_t vcsel_period_pclks) +{ + 300c2c4: 7179 addi sp,sp,-48 + 300c2c6: d606 sw ra,44(sp) + 300c2c8: d422 sw s0,40(sp) + 300c2ca: 1800 addi s0,sp,48 + 300c2cc: fca42e23 sw a0,-36(s0) + 300c2d0: fcb42c23 sw a1,-40(s0) + 300c2d4: 87b2 mv a5,a2 + 300c2d6: fcf40ba3 sb a5,-41(s0) + uint32_t macro_period_ps; + uint32_t macro_period_ns; + uint32_t timeout_period_mclks = 0; + 300c2da: fe042623 sw zero,-20(s0) + + macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); + 300c2de: fd744783 lbu a5,-41(s0) + 300c2e2: 85be mv a1,a5 + 300c2e4: fdc42503 lw a0,-36(s0) + 300c2e8: 35ed jal ra,300c1d2 + 300c2ea: fea42423 sw a0,-24(s0) + macro_period_ns = (macro_period_ps + 500) / 1000; + 300c2ee: fe842783 lw a5,-24(s0) + 300c2f2: 1f478713 addi a4,a5,500 + 300c2f6: 3e800793 li a5,1000 + 300c2fa: 02f757b3 divu a5,a4,a5 + 300c2fe: fef42223 sw a5,-28(s0) + + timeout_period_mclks = + (uint32_t) (((timeout_period_us * 1000) + 300c302: fd842703 lw a4,-40(s0) + 300c306: 3e800793 li a5,1000 + 300c30a: 02f70733 mul a4,a4,a5 + + (macro_period_ns / 2)) / macro_period_ns); + 300c30e: fe442783 lw a5,-28(s0) + 300c312: 8385 srli a5,a5,0x1 + 300c314: 973e add a4,a4,a5 + timeout_period_mclks = + 300c316: fe442783 lw a5,-28(s0) + 300c31a: 02f757b3 divu a5,a4,a5 + 300c31e: fef42623 sw a5,-20(s0) + + return timeout_period_mclks; + 300c322: fec42783 lw a5,-20(s0) +} + 300c326: 853e mv a0,a5 + 300c328: 50b2 lw ra,44(sp) + 300c32a: 5422 lw s0,40(sp) + 300c32c: 6145 addi sp,sp,48 + 300c32e: 8082 ret + +0300c330 : + +/* To convert register value into us */ +uint32_t VL53L0X_calc_timeout_us(VL53L0X_DEV Dev, + uint16_t timeout_period_mclks, + uint8_t vcsel_period_pclks) +{ + 300c330: 7179 addi sp,sp,-48 + 300c332: d606 sw ra,44(sp) + 300c334: d422 sw s0,40(sp) + 300c336: 1800 addi s0,sp,48 + 300c338: fca42e23 sw a0,-36(s0) + 300c33c: 87ae mv a5,a1 + 300c33e: 8732 mv a4,a2 + 300c340: fcf41d23 sh a5,-38(s0) + 300c344: 87ba mv a5,a4 + 300c346: fcf40ca3 sb a5,-39(s0) + uint32_t macro_period_ps; + uint32_t macro_period_ns; + uint32_t actual_timeout_period_us = 0; + 300c34a: fe042623 sw zero,-20(s0) + + macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); + 300c34e: fd944783 lbu a5,-39(s0) + 300c352: 85be mv a1,a5 + 300c354: fdc42503 lw a0,-36(s0) + 300c358: 3dad jal ra,300c1d2 + 300c35a: fea42423 sw a0,-24(s0) + macro_period_ns = (macro_period_ps + 500) / 1000; + 300c35e: fe842783 lw a5,-24(s0) + 300c362: 1f478713 addi a4,a5,500 + 300c366: 3e800793 li a5,1000 + 300c36a: 02f757b3 divu a5,a4,a5 + 300c36e: fef42223 sw a5,-28(s0) + + actual_timeout_period_us = + ((timeout_period_mclks * macro_period_ns) + 500) / 1000; + 300c372: fda45703 lhu a4,-38(s0) + 300c376: fe442783 lw a5,-28(s0) + 300c37a: 02f707b3 mul a5,a4,a5 + 300c37e: 1f478713 addi a4,a5,500 + actual_timeout_period_us = + 300c382: 3e800793 li a5,1000 + 300c386: 02f757b3 divu a5,a4,a5 + 300c38a: fef42623 sw a5,-20(s0) + + return actual_timeout_period_us; + 300c38e: fec42783 lw a5,-20(s0) +} + 300c392: 853e mv a0,a5 + 300c394: 50b2 lw ra,44(sp) + 300c396: 5422 lw s0,40(sp) + 300c398: 6145 addi sp,sp,48 + 300c39a: 8082 ret + +0300c39c : + + +VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t *pTimeOutMicroSecs) +{ + 300c39c: 7139 addi sp,sp,-64 + 300c39e: de06 sw ra,60(sp) + 300c3a0: dc22 sw s0,56(sp) + 300c3a2: 0080 addi s0,sp,64 + 300c3a4: fca42623 sw a0,-52(s0) + 300c3a8: 87ae mv a5,a1 + 300c3aa: fcc42223 sw a2,-60(s0) + 300c3ae: fcf405a3 sb a5,-53(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300c3b2: fe0407a3 sb zero,-17(s0) + uint8_t CurrentVCSELPulsePeriodPClk; + uint8_t EncodedTimeOutByte = 0; + 300c3b6: fe040023 sb zero,-32(s0) + uint32_t TimeoutMicroSeconds = 0; + 300c3ba: fe042423 sw zero,-24(s0) + uint16_t PreRangeEncodedTimeOut = 0; + 300c3be: fc041f23 sh zero,-34(s0) + uint16_t MsrcTimeOutMClks; + uint16_t PreRangeTimeOutMClks; + uint16_t FinalRangeTimeOutMClks = 0; + 300c3c2: fe041223 sh zero,-28(s0) + uint16_t FinalRangeEncodedTimeOut; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + + if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || + 300c3c6: fcb44783 lbu a5,-53(s0) + 300c3ca: cb99 beqz a5,300c3e0 + 300c3cc: fcb44703 lbu a4,-53(s0) + 300c3d0: 4785 li a5,1 + 300c3d2: 00f70763 beq a4,a5,300c3e0 + (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || + 300c3d6: fcb44703 lbu a4,-53(s0) + 300c3da: 4789 li a5,2 + 300c3dc: 04f71f63 bne a4,a5,300c43a + (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c3e0: fe140793 addi a5,s0,-31 + 300c3e4: 863e mv a2,a5 + 300c3e6: 4581 li a1,0 + 300c3e8: fcc42503 lw a0,-52(s0) + 300c3ec: 2ee9 jal ra,300c7c6 + 300c3ee: 87aa mv a5,a0 + 300c3f0: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + if (Status == VL53L0X_ERROR_NONE) { + 300c3f4: fef40783 lb a5,-17(s0) + 300c3f8: ef89 bnez a5,300c412 + Status = VL53L0X_RdByte(Dev, + 300c3fa: fe040793 addi a5,s0,-32 + 300c3fe: 863e mv a2,a5 + 300c400: 04600593 li a1,70 + 300c404: fcc42503 lw a0,-52(s0) + 300c408: 1da020ef jal ra,300e5e2 + 300c40c: 87aa mv a5,a0 + 300c40e: fef407a3 sb a5,-17(s0) + VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, + &EncodedTimeOutByte); + } + MsrcTimeOutMClks = VL53L0X_decode_timeout(EncodedTimeOutByte); + 300c412: fe044783 lbu a5,-32(s0) + 300c416: 9fa1 uxth a5 + 300c418: 853e mv a0,a5 + 300c41a: 3d95 jal ra,300c28e + 300c41c: 87aa mv a5,a0 + 300c41e: fef41123 sh a5,-30(s0) + + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + 300c422: fe144703 lbu a4,-31(s0) + 300c426: fe245783 lhu a5,-30(s0) + 300c42a: 863a mv a2,a4 + 300c42c: 85be mv a1,a5 + 300c42e: fcc42503 lw a0,-52(s0) + 300c432: 3dfd jal ra,300c330 + 300c434: fea42423 sw a0,-24(s0) + 300c438: a299 j 300c57e + MsrcTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { + 300c43a: fcb44703 lbu a4,-53(s0) + 300c43e: 478d li a5,3 + 300c440: 06f71b63 bne a4,a5,300c4b6 + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c444: fe140793 addi a5,s0,-31 + 300c448: 863e mv a2,a5 + 300c44a: 4581 li a1,0 + 300c44c: fcc42503 lw a0,-52(s0) + 300c450: 2e9d jal ra,300c7c6 + 300c452: 87aa mv a5,a0 + 300c454: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods (MCLKS) */ + if (Status == VL53L0X_ERROR_NONE) { + 300c458: fef40783 lb a5,-17(s0) + 300c45c: 12079163 bnez a5,300c57e + + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c460: fe140793 addi a5,s0,-31 + 300c464: 863e mv a2,a5 + 300c466: 4581 li a1,0 + 300c468: fcc42503 lw a0,-52(s0) + 300c46c: 2ea9 jal ra,300c7c6 + 300c46e: 87aa mv a5,a0 + 300c470: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + if (Status == VL53L0X_ERROR_NONE) { + 300c474: fef40783 lb a5,-17(s0) + 300c478: ef81 bnez a5,300c490 + Status = VL53L0X_RdWord(Dev, + 300c47a: fde40793 addi a5,s0,-34 + 300c47e: 863e mv a2,a5 + 300c480: 05100593 li a1,81 + 300c484: fcc42503 lw a0,-52(s0) + 300c488: 2689 jal ra,300c7ca + 300c48a: 87aa mv a5,a0 + 300c48c: fef407a3 sb a5,-17(s0) + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &PreRangeEncodedTimeOut); + } + + PreRangeTimeOutMClks = VL53L0X_decode_timeout( + 300c490: fde45783 lhu a5,-34(s0) + 300c494: 853e mv a0,a5 + 300c496: 3be5 jal ra,300c28e + 300c498: 87aa mv a5,a0 + 300c49a: fef41323 sh a5,-26(s0) + PreRangeEncodedTimeOut); + + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + 300c49e: fe144703 lbu a4,-31(s0) + 300c4a2: fe645783 lhu a5,-26(s0) + 300c4a6: 863a mv a2,a4 + 300c4a8: 85be mv a1,a5 + 300c4aa: fcc42503 lw a0,-52(s0) + 300c4ae: 3549 jal ra,300c330 + 300c4b0: fea42423 sw a0,-24(s0) + 300c4b4: a0e9 j 300c57e + PreRangeTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { + 300c4b6: fcb44703 lbu a4,-53(s0) + 300c4ba: 4791 li a5,4 + 300c4bc: 0cf71163 bne a4,a5,300c57e + + VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + 300c4c0: fd440793 addi a5,s0,-44 + 300c4c4: 85be mv a1,a5 + 300c4c6: fcc42503 lw a0,-52(s0) + 300c4ca: 2345 jal ra,300ca6a + PreRangeTimeOutMClks = 0; + 300c4cc: fe041323 sh zero,-26(s0) + + if (SchedulerSequenceSteps.PreRangeOn) { + 300c4d0: fd744783 lbu a5,-41(s0) + 300c4d4: c3a1 beqz a5,300c514 + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c4d6: fe140793 addi a5,s0,-31 + 300c4da: 863e mv a2,a5 + 300c4dc: 4581 li a1,0 + 300c4de: fcc42503 lw a0,-52(s0) + 300c4e2: 24d5 jal ra,300c7c6 + 300c4e4: 87aa mv a5,a0 + 300c4e6: fef407a3 sb a5,-17(s0) + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods + * (MCLKS) + */ + if (Status == VL53L0X_ERROR_NONE) { + 300c4ea: fef40783 lb a5,-17(s0) + 300c4ee: e39d bnez a5,300c514 + Status = VL53L0X_RdWord(Dev, + 300c4f0: fde40793 addi a5,s0,-34 + 300c4f4: 863e mv a2,a5 + 300c4f6: 05100593 li a1,81 + 300c4fa: fcc42503 lw a0,-52(s0) + 300c4fe: 24f1 jal ra,300c7ca + 300c500: 87aa mv a5,a0 + 300c502: fef407a3 sb a5,-17(s0) + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &PreRangeEncodedTimeOut); + PreRangeTimeOutMClks = VL53L0X_decode_timeout( + 300c506: fde45783 lhu a5,-34(s0) + 300c50a: 853e mv a0,a5 + 300c50c: 3349 jal ra,300c28e + 300c50e: 87aa mv a5,a0 + 300c510: fef41323 sh a5,-26(s0) + PreRangeEncodedTimeOut); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + 300c514: fef40783 lb a5,-17(s0) + 300c518: eb99 bnez a5,300c52e + /* Retrieve FINAL-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c51a: fe140793 addi a5,s0,-31 + 300c51e: 863e mv a2,a5 + 300c520: 4585 li a1,1 + 300c522: fcc42503 lw a0,-52(s0) + 300c526: 2445 jal ra,300c7c6 + 300c528: 87aa mv a5,a0 + 300c52a: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &CurrentVCSELPulsePeriodPClk); + } + + /* Retrieve FINAL-RANGE Timeout in Macro periods (MCLKS) */ + if (Status == VL53L0X_ERROR_NONE) { + 300c52e: fef40783 lb a5,-17(s0) + 300c532: e39d bnez a5,300c558 + Status = VL53L0X_RdWord(Dev, + 300c534: fdc40793 addi a5,s0,-36 + 300c538: 863e mv a2,a5 + 300c53a: 07100593 li a1,113 + 300c53e: fcc42503 lw a0,-52(s0) + 300c542: 2461 jal ra,300c7ca + 300c544: 87aa mv a5,a0 + 300c546: fef407a3 sb a5,-17(s0) + VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &FinalRangeEncodedTimeOut); + FinalRangeTimeOutMClks = VL53L0X_decode_timeout( + 300c54a: fdc45783 lhu a5,-36(s0) + 300c54e: 853e mv a0,a5 + 300c550: 3b3d jal ra,300c28e + 300c552: 87aa mv a5,a0 + 300c554: fef41223 sh a5,-28(s0) + FinalRangeEncodedTimeOut); + } + + FinalRangeTimeOutMClks -= PreRangeTimeOutMClks; + 300c558: fe445703 lhu a4,-28(s0) + 300c55c: fe645783 lhu a5,-26(s0) + 300c560: 40f707b3 sub a5,a4,a5 + 300c564: fef41223 sh a5,-28(s0) + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + 300c568: fe144703 lbu a4,-31(s0) + 300c56c: fe445783 lhu a5,-28(s0) + 300c570: 863a mv a2,a4 + 300c572: 85be mv a1,a5 + 300c574: fcc42503 lw a0,-52(s0) + 300c578: 3b65 jal ra,300c330 + 300c57a: fea42423 sw a0,-24(s0) + FinalRangeTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } + + *pTimeOutMicroSecs = TimeoutMicroSeconds; + 300c57e: fc442783 lw a5,-60(s0) + 300c582: fe842703 lw a4,-24(s0) + 300c586: c398 sw a4,0(a5) + + return Status; + 300c588: fef40783 lb a5,-17(s0) +} + 300c58c: 853e mv a0,a5 + 300c58e: 50f2 lw ra,60(sp) + 300c590: 5462 lw s0,56(sp) + 300c592: 6121 addi sp,sp,64 + 300c594: 8082 ret + +0300c596 : + + +VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t TimeOutMicroSecs) +{ + 300c596: 7139 addi sp,sp,-64 + 300c598: de06 sw ra,60(sp) + 300c59a: dc22 sw s0,56(sp) + 300c59c: 0080 addi s0,sp,64 + 300c59e: fca42623 sw a0,-52(s0) + 300c5a2: 87ae mv a5,a1 + 300c5a4: fcc42223 sw a2,-60(s0) + 300c5a8: fcf405a3 sb a5,-53(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300c5ac: fe0407a3 sb zero,-17(s0) + uint16_t MsrcRangeTimeOutMClks; + uint32_t FinalRangeTimeOutMClks; + uint16_t FinalRangeEncodedTimeOut; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + + if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || + 300c5b0: fcb44783 lbu a5,-53(s0) + 300c5b4: cb99 beqz a5,300c5ca + 300c5b6: fcb44703 lbu a4,-53(s0) + 300c5ba: 4785 li a5,1 + 300c5bc: 00f70763 beq a4,a5,300c5ca + (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || + 300c5c0: fcb44703 lbu a4,-53(s0) + 300c5c4: 4789 li a5,2 + 300c5c6: 08f71363 bne a4,a5,300c64c + (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c5ca: fe340793 addi a5,s0,-29 + 300c5ce: 863e mv a2,a5 + 300c5d0: 4581 li a1,0 + 300c5d2: fcc42503 lw a0,-52(s0) + 300c5d6: 2ac5 jal ra,300c7c6 + 300c5d8: 87aa mv a5,a0 + 300c5da: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + if (Status == VL53L0X_ERROR_NONE) { + 300c5de: fef40783 lb a5,-17(s0) + 300c5e2: e7a9 bnez a5,300c62c + MsrcRangeTimeOutMClks = VL53L0X_calc_timeout_mclks(Dev, + 300c5e4: fe344783 lbu a5,-29(s0) + 300c5e8: 863e mv a2,a5 + 300c5ea: fc442583 lw a1,-60(s0) + 300c5ee: fcc42503 lw a0,-52(s0) + 300c5f2: 39c9 jal ra,300c2c4 + 300c5f4: 87aa mv a5,a0 + 300c5f6: fef41223 sh a5,-28(s0) + TimeOutMicroSecs, + (uint8_t)CurrentVCSELPulsePeriodPClk); + + if (MsrcRangeTimeOutMClks > 256) + 300c5fa: fe445703 lhu a4,-28(s0) + 300c5fe: 10000793 li a5,256 + 300c602: 00e7f663 bgeu a5,a4,300c60e + MsrcEncodedTimeOut = 255; + 300c606: 57fd li a5,-1 + 300c608: fef40723 sb a5,-18(s0) + 300c60c: a039 j 300c61a + else + MsrcEncodedTimeOut = + (uint8_t)MsrcRangeTimeOutMClks - 1; + 300c60e: fe445783 lhu a5,-28(s0) + 300c612: 9f81 uxtb a5 + MsrcEncodedTimeOut = + 300c614: 17fd addi a5,a5,-1 + 300c616: fef40723 sb a5,-18(s0) + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c61a: fee44783 lbu a5,-18(s0) + 300c61e: 01079713 slli a4,a5,0x10 + 300c622: 8341 srli a4,a4,0x10 + 300c624: fcc42783 lw a5,-52(s0) + 300c628: 10e79223 sh a4,260(a5) + LastEncodedTimeout, + MsrcEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + 300c62c: fef40783 lb a5,-17(s0) + 300c630: 18079463 bnez a5,300c7b8 + Status = VL53L0X_WrByte(Dev, + 300c634: fee44783 lbu a5,-18(s0) + 300c638: 863e mv a2,a5 + 300c63a: 04600593 li a1,70 + 300c63e: fcc42503 lw a0,-52(s0) + 300c642: 3671 jal ra,300c1ce + 300c644: 87aa mv a5,a0 + 300c646: fef407a3 sb a5,-17(s0) + if (Status == VL53L0X_ERROR_NONE) { + 300c64a: a2bd j 300c7b8 + VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, + MsrcEncodedTimeOut); + } + } else { + + if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { + 300c64c: fcb44703 lbu a4,-53(s0) + 300c650: 478d li a5,3 + 300c652: 08f71163 bne a4,a5,300c6d4 + + if (Status == VL53L0X_ERROR_NONE) { + 300c656: fef40783 lb a5,-17(s0) + 300c65a: e3b9 bnez a5,300c6a0 + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c65c: fe340793 addi a5,s0,-29 + 300c660: 863e mv a2,a5 + 300c662: 4581 li a1,0 + 300c664: fcc42503 lw a0,-52(s0) + 300c668: 2ab9 jal ra,300c7c6 + 300c66a: 87aa mv a5,a0 + 300c66c: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + PreRangeTimeOutMClks = + VL53L0X_calc_timeout_mclks(Dev, + 300c670: fe344783 lbu a5,-29(s0) + 300c674: 863e mv a2,a5 + 300c676: fc442583 lw a1,-60(s0) + 300c67a: fcc42503 lw a0,-52(s0) + 300c67e: 3199 jal ra,300c2c4 + 300c680: 87aa mv a5,a0 + PreRangeTimeOutMClks = + 300c682: fef41623 sh a5,-20(s0) + TimeOutMicroSecs, + (uint8_t)CurrentVCSELPulsePeriodPClk); + PreRangeEncodedTimeOut = VL53L0X_encode_timeout( + 300c686: fec45783 lhu a5,-20(s0) + 300c68a: 853e mv a0,a5 + 300c68c: 3e49 jal ra,300c21e + 300c68e: 87aa mv a5,a0 + 300c690: fef41023 sh a5,-32(s0) + PreRangeTimeOutMClks); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + 300c694: fe045703 lhu a4,-32(s0) + 300c698: fcc42783 lw a5,-52(s0) + 300c69c: 10e79223 sh a4,260(a5) + LastEncodedTimeout, + PreRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + 300c6a0: fef40783 lb a5,-17(s0) + 300c6a4: ef89 bnez a5,300c6be + Status = VL53L0X_WrWord(Dev, + 300c6a6: fe045783 lhu a5,-32(s0) + 300c6aa: 863e mv a2,a5 + 300c6ac: 05100593 li a1,81 + 300c6b0: fcc42503 lw a0,-52(s0) + 300c6b4: 62d010ef jal ra,300e4e0 + 300c6b8: 87aa mv a5,a0 + 300c6ba: fef407a3 sb a5,-17(s0) + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + PreRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + 300c6be: fef40783 lb a5,-17(s0) + 300c6c2: 0e079b63 bnez a5,300c7b8 + VL53L0X_SETDEVICESPECIFICPARAMETER( + 300c6c6: fcc42783 lw a5,-52(s0) + 300c6ca: fc442703 lw a4,-60(s0) + 300c6ce: 10e7a823 sw a4,272(a5) + 300c6d2: a0dd j 300c7b8 + Dev, + PreRangeTimeoutMicroSecs, + TimeOutMicroSecs); + } + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { + 300c6d4: fcb44703 lbu a4,-53(s0) + 300c6d8: 4791 li a5,4 + 300c6da: 0cf71c63 bne a4,a5,300c7b2 + * must be added. To do this both final and pre-range + * timeouts must be expressed in macro periods MClks + * because they have different vcsel periods. + */ + + VL53L0X_GetSequenceStepEnables(Dev, + 300c6de: fd840793 addi a5,s0,-40 + 300c6e2: 85be mv a1,a5 + 300c6e4: fcc42503 lw a0,-52(s0) + 300c6e8: 2649 jal ra,300ca6a + &SchedulerSequenceSteps); + PreRangeTimeOutMClks = 0; + 300c6ea: fe041623 sh zero,-20(s0) + if (SchedulerSequenceSteps.PreRangeOn) { + 300c6ee: fdb44783 lbu a5,-37(s0) + 300c6f2: c3a1 beqz a5,300c732 + + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c6f4: fe340793 addi a5,s0,-29 + 300c6f8: 863e mv a2,a5 + 300c6fa: 4581 li a1,0 + 300c6fc: fcc42503 lw a0,-52(s0) + 300c700: 20d9 jal ra,300c7c6 + 300c702: 87aa mv a5,a0 + 300c704: fef407a3 sb a5,-17(s0) + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods + * (MCLKS) + */ + if (Status == VL53L0X_ERROR_NONE) { + 300c708: fef40783 lb a5,-17(s0) + 300c70c: e39d bnez a5,300c732 + Status = VL53L0X_RdWord(Dev, 0x51, + 300c70e: fe040793 addi a5,s0,-32 + 300c712: 863e mv a2,a5 + 300c714: 05100593 li a1,81 + 300c718: fcc42503 lw a0,-52(s0) + 300c71c: 207d jal ra,300c7ca + 300c71e: 87aa mv a5,a0 + 300c720: fef407a3 sb a5,-17(s0) + &PreRangeEncodedTimeOut); + PreRangeTimeOutMClks = + VL53L0X_decode_timeout( + 300c724: fe045783 lhu a5,-32(s0) + 300c728: 853e mv a0,a5 + 300c72a: 3695 jal ra,300c28e + 300c72c: 87aa mv a5,a0 + PreRangeTimeOutMClks = + 300c72e: fef41623 sh a5,-20(s0) + } + + /* Calculate FINAL RANGE Timeout in Macro Periods + * (MCLKS) and add PRE-RANGE value + */ + if (Status == VL53L0X_ERROR_NONE) { + 300c732: fef40783 lb a5,-17(s0) + 300c736: eb99 bnez a5,300c74c + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + 300c738: fe340793 addi a5,s0,-29 + 300c73c: 863e mv a2,a5 + 300c73e: 4585 li a1,1 + 300c740: fcc42503 lw a0,-52(s0) + 300c744: 2049 jal ra,300c7c6 + 300c746: 87aa mv a5,a0 + 300c748: fef407a3 sb a5,-17(s0) + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &CurrentVCSELPulsePeriodPClk); + } + if (Status == VL53L0X_ERROR_NONE) { + 300c74c: fef40783 lb a5,-17(s0) + 300c750: e7a5 bnez a5,300c7b8 + + FinalRangeTimeOutMClks = + VL53L0X_calc_timeout_mclks(Dev, + 300c752: fe344783 lbu a5,-29(s0) + FinalRangeTimeOutMClks = + 300c756: 863e mv a2,a5 + 300c758: fc442583 lw a1,-60(s0) + 300c75c: fcc42503 lw a0,-52(s0) + 300c760: 3695 jal ra,300c2c4 + 300c762: fea42423 sw a0,-24(s0) + TimeOutMicroSecs, + (uint8_t) CurrentVCSELPulsePeriodPClk); + + FinalRangeTimeOutMClks += PreRangeTimeOutMClks; + 300c766: fec45783 lhu a5,-20(s0) + 300c76a: fe842703 lw a4,-24(s0) + 300c76e: 97ba add a5,a5,a4 + 300c770: fef42423 sw a5,-24(s0) + + FinalRangeEncodedTimeOut = + 300c774: fe842503 lw a0,-24(s0) + 300c778: 345d jal ra,300c21e + 300c77a: 87aa mv a5,a0 + 300c77c: fef41323 sh a5,-26(s0) + VL53L0X_encode_timeout(FinalRangeTimeOutMClks); + + if (Status == VL53L0X_ERROR_NONE) { + 300c780: fef40783 lb a5,-17(s0) + 300c784: ef89 bnez a5,300c79e + Status = VL53L0X_WrWord(Dev, 0x71, + 300c786: fe645783 lhu a5,-26(s0) + 300c78a: 863e mv a2,a5 + 300c78c: 07100593 li a1,113 + 300c790: fcc42503 lw a0,-52(s0) + 300c794: 54d010ef jal ra,300e4e0 + 300c798: 87aa mv a5,a0 + 300c79a: fef407a3 sb a5,-17(s0) + FinalRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + 300c79e: fef40783 lb a5,-17(s0) + 300c7a2: eb99 bnez a5,300c7b8 + VL53L0X_SETDEVICESPECIFICPARAMETER( + 300c7a4: fcc42783 lw a5,-52(s0) + 300c7a8: fc442703 lw a4,-60(s0) + 300c7ac: 10e7a423 sw a4,264(a5) + 300c7b0: a021 j 300c7b8 + FinalRangeTimeoutMicroSecs, + TimeOutMicroSecs); + } + } + } else + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300c7b2: 57f1 li a5,-4 + 300c7b4: fef407a3 sb a5,-17(s0) + + } + return Status; + 300c7b8: fef40783 lb a5,-17(s0) +} + 300c7bc: 853e mv a0,a5 + 300c7be: 50f2 lw ra,60(sp) + 300c7c0: 5462 lw s0,56(sp) + 300c7c2: 6121 addi sp,sp,64 + 300c7c4: 8082 ret + +0300c7c6 : + 300c7c6: ed0fc06f j 3008e96 + +0300c7ca : + 300c7ca: 66f0106f j 300e638 + +0300c7ce : + return Status; +} + +VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) +{ + 300c7ce: 7179 addi sp,sp,-48 + 300c7d0: d606 sw ra,44(sp) + 300c7d2: d422 sw s0,40(sp) + 300c7d4: 1800 addi s0,sp,48 + 300c7d6: fca42e23 sw a0,-36(s0) + 300c7da: 87ae mv a5,a1 + 300c7dc: fcc42a23 sw a2,-44(s0) + 300c7e0: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300c7e4: fe0407a3 sb zero,-17(s0) + uint8_t vcsel_period_reg; + + switch (VcselPeriodType) { + 300c7e8: fdb44783 lbu a5,-37(s0) + 300c7ec: c789 beqz a5,300c7f6 + 300c7ee: 4705 li a4,1 + 300c7f0: 02e78063 beq a5,a4,300c810 + 300c7f4: a81d j 300c82a + case VL53L0X_VCSEL_PERIOD_PRE_RANGE: + Status = VL53L0X_RdByte(Dev, + 300c7f6: fee40793 addi a5,s0,-18 + 300c7fa: 863e mv a2,a5 + 300c7fc: 05000593 li a1,80 + 300c800: fdc42503 lw a0,-36(s0) + 300c804: 5df010ef jal ra,300e5e2 + 300c808: 87aa mv a5,a0 + 300c80a: fef407a3 sb a5,-17(s0) + VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, + &vcsel_period_reg); + break; + 300c80e: a00d j 300c830 + case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: + Status = VL53L0X_RdByte(Dev, + 300c810: fee40793 addi a5,s0,-18 + 300c814: 863e mv a2,a5 + 300c816: 07000593 li a1,112 + 300c81a: fdc42503 lw a0,-36(s0) + 300c81e: 5c5010ef jal ra,300e5e2 + 300c822: 87aa mv a5,a0 + 300c824: fef407a3 sb a5,-17(s0) + VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, + &vcsel_period_reg); + break; + 300c828: a021 j 300c830 + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300c82a: 57f1 li a5,-4 + 300c82c: fef407a3 sb a5,-17(s0) + } + + if (Status == VL53L0X_ERROR_NONE) + 300c830: fef40783 lb a5,-17(s0) + 300c834: eb99 bnez a5,300c84a + *pVCSELPulsePeriodPCLK = + VL53L0X_decode_vcsel_period(vcsel_period_reg); + 300c836: fee44783 lbu a5,-18(s0) + 300c83a: 853e mv a0,a5 + 300c83c: d1bfe0ef jal ra,300b556 + 300c840: 87aa mv a5,a0 + 300c842: 873e mv a4,a5 + *pVCSELPulsePeriodPCLK = + 300c844: fd442783 lw a5,-44(s0) + 300c848: a398 sb a4,0(a5) + + return Status; + 300c84a: fef40783 lb a5,-17(s0) +} + 300c84e: 853e mv a0,a5 + 300c850: 50b2 lw ra,44(sp) + 300c852: 5422 lw s0,40(sp) + 300c854: 6145 addi sp,sp,48 + 300c856: 8082 ret + +0300c858 : + + +VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + 300c858: 711d addi sp,sp,-96 + 300c85a: ce86 sw ra,92(sp) + 300c85c: cca2 sw s0,88(sp) + 300c85e: 1080 addi s0,sp,96 + 300c860: faa42623 sw a0,-84(s0) + 300c864: fab42423 sw a1,-88(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300c868: fe0407a3 sb zero,-17(s0) + uint32_t FinalRangeTimingBudgetMicroSeconds; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; + 300c86c: 7d000793 li a5,2000 + 300c870: faf42e23 sw a5,-68(s0) + uint32_t StartOverheadMicroSeconds = 1910; + 300c874: 77600793 li a5,1910 + 300c878: fef42223 sw a5,-28(s0) + uint32_t EndOverheadMicroSeconds = 960; + 300c87c: 3c000793 li a5,960 + 300c880: fef42023 sw a5,-32(s0) + uint32_t MsrcOverheadMicroSeconds = 660; + 300c884: 29400793 li a5,660 + 300c888: fcf42e23 sw a5,-36(s0) + uint32_t TccOverheadMicroSeconds = 590; + 300c88c: 24e00793 li a5,590 + 300c890: fcf42c23 sw a5,-40(s0) + uint32_t DssOverheadMicroSeconds = 690; + 300c894: 2b200793 li a5,690 + 300c898: fcf42a23 sw a5,-44(s0) + uint32_t PreRangeOverheadMicroSeconds = 660; + 300c89c: 29400793 li a5,660 + 300c8a0: fcf42823 sw a5,-48(s0) + uint32_t FinalRangeOverheadMicroSeconds = 550; + 300c8a4: 22600793 li a5,550 + 300c8a8: fcf42623 sw a5,-52(s0) + uint32_t PreRangeTimeoutMicroSeconds = 0; + 300c8ac: fa042c23 sw zero,-72(s0) + uint32_t SubTimeout = 0; + 300c8b0: fc042423 sw zero,-56(s0) + + LOG_FUNCTION_START(""); + + FinalRangeTimingBudgetMicroSeconds = + MeasurementTimingBudgetMicroSeconds - + (StartOverheadMicroSeconds + EndOverheadMicroSeconds); + 300c8b4: fe442703 lw a4,-28(s0) + 300c8b8: fe042783 lw a5,-32(s0) + 300c8bc: 97ba add a5,a5,a4 + FinalRangeTimingBudgetMicroSeconds = + 300c8be: fa842703 lw a4,-88(s0) + 300c8c2: 40f707b3 sub a5,a4,a5 + 300c8c6: fef42423 sw a5,-24(s0) + + Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + 300c8ca: fc040793 addi a5,s0,-64 + 300c8ce: 85be mv a1,a5 + 300c8d0: fac42503 lw a0,-84(s0) + 300c8d4: 2a59 jal ra,300ca6a + 300c8d6: 87aa mv a5,a0 + 300c8d8: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE && + 300c8dc: fef40783 lb a5,-17(s0) + 300c8e0: e7f5 bnez a5,300c9cc + (SchedulerSequenceSteps.TccOn || + 300c8e2: fc044783 lbu a5,-64(s0) + if (Status == VL53L0X_ERROR_NONE && + 300c8e6: e799 bnez a5,300c8f4 + SchedulerSequenceSteps.MsrcOn || + 300c8e8: fc144783 lbu a5,-63(s0) + (SchedulerSequenceSteps.TccOn || + 300c8ec: e781 bnez a5,300c8f4 + SchedulerSequenceSteps.DssOn)) { + 300c8ee: fc244783 lbu a5,-62(s0) + SchedulerSequenceSteps.MsrcOn || + 300c8f2: cfe9 beqz a5,300c9cc + + /* TCC, MSRC and DSS all share the same timeout */ + Status = get_sequence_step_timeout(Dev, + 300c8f4: fbc40793 addi a5,s0,-68 + 300c8f8: 863e mv a2,a5 + 300c8fa: 4589 li a1,2 + 300c8fc: fac42503 lw a0,-84(s0) + 300c900: 3c71 jal ra,300c39c + 300c902: 87aa mv a5,a0 + 300c904: fef407a3 sb a5,-17(s0) + + /* Subtract the TCC, MSRC and DSS timeouts if they are + * enabled. + */ + + if (Status != VL53L0X_ERROR_NONE) + 300c908: fef40783 lb a5,-17(s0) + 300c90c: c781 beqz a5,300c914 + return Status; + 300c90e: fef40783 lb a5,-17(s0) + 300c912: a2b9 j 300ca60 + + /* TCC */ + if (SchedulerSequenceSteps.TccOn) { + 300c914: fc044783 lbu a5,-64(s0) + 300c918: cb95 beqz a5,300c94c + + SubTimeout = MsrcDccTccTimeoutMicroSeconds + + TccOverheadMicroSeconds; + 300c91a: fbc42783 lw a5,-68(s0) + SubTimeout = MsrcDccTccTimeoutMicroSeconds + 300c91e: fd842703 lw a4,-40(s0) + 300c922: 97ba add a5,a5,a4 + 300c924: fcf42423 sw a5,-56(s0) + + if (SubTimeout < + 300c928: fc842703 lw a4,-56(s0) + 300c92c: fe842783 lw a5,-24(s0) + 300c930: 00f77b63 bgeu a4,a5,300c946 + FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds -= + 300c934: fe842703 lw a4,-24(s0) + 300c938: fc842783 lw a5,-56(s0) + 300c93c: 40f707b3 sub a5,a4,a5 + 300c940: fef42423 sw a5,-24(s0) + 300c944: a021 j 300c94c + SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300c946: 57f1 li a5,-4 + 300c948: fef407a3 sb a5,-17(s0) + } + } + + if (Status != VL53L0X_ERROR_NONE) { + 300c94c: fef40783 lb a5,-17(s0) + 300c950: c781 beqz a5,300c958 + LOG_FUNCTION_END(Status); + return Status; + 300c952: fef40783 lb a5,-17(s0) + 300c956: a229 j 300ca60 + } + + /* DSS */ + if (SchedulerSequenceSteps.DssOn) { + 300c958: fc244783 lbu a5,-62(s0) + 300c95c: cf85 beqz a5,300c994 + + SubTimeout = 2 * (MsrcDccTccTimeoutMicroSeconds + + 300c95e: fbc42703 lw a4,-68(s0) + 300c962: fd442783 lw a5,-44(s0) + 300c966: 97ba add a5,a5,a4 + 300c968: 0786 slli a5,a5,0x1 + 300c96a: fcf42423 sw a5,-56(s0) + DssOverheadMicroSeconds); + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + 300c96e: fc842703 lw a4,-56(s0) + 300c972: fe842783 lw a5,-24(s0) + 300c976: 00f77b63 bgeu a4,a5,300c98c + FinalRangeTimingBudgetMicroSeconds + -= SubTimeout; + 300c97a: fe842703 lw a4,-24(s0) + 300c97e: fc842783 lw a5,-56(s0) + 300c982: 40f707b3 sub a5,a4,a5 + 300c986: fef42423 sw a5,-24(s0) + 300c98a: a089 j 300c9cc + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300c98c: 57f1 li a5,-4 + 300c98e: fef407a3 sb a5,-17(s0) + 300c992: a82d j 300c9cc + } + } else if (SchedulerSequenceSteps.MsrcOn) { + 300c994: fc144783 lbu a5,-63(s0) + 300c998: cb95 beqz a5,300c9cc + /* MSRC */ + SubTimeout = MsrcDccTccTimeoutMicroSeconds + + 300c99a: fbc42783 lw a5,-68(s0) + 300c99e: fdc42703 lw a4,-36(s0) + 300c9a2: 97ba add a5,a5,a4 + 300c9a4: fcf42423 sw a5,-56(s0) + MsrcOverheadMicroSeconds; + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + 300c9a8: fc842703 lw a4,-56(s0) + 300c9ac: fe842783 lw a5,-24(s0) + 300c9b0: 00f77b63 bgeu a4,a5,300c9c6 + FinalRangeTimingBudgetMicroSeconds + -= SubTimeout; + 300c9b4: fe842703 lw a4,-24(s0) + 300c9b8: fc842783 lw a5,-56(s0) + 300c9bc: 40f707b3 sub a5,a4,a5 + 300c9c0: fef42423 sw a5,-24(s0) + 300c9c4: a021 j 300c9cc + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300c9c6: 57f1 li a5,-4 + 300c9c8: fef407a3 sb a5,-17(s0) + } + } + + } + + if (Status != VL53L0X_ERROR_NONE) { + 300c9cc: fef40783 lb a5,-17(s0) + 300c9d0: c781 beqz a5,300c9d8 + LOG_FUNCTION_END(Status); + return Status; + 300c9d2: fef40783 lb a5,-17(s0) + 300c9d6: a069 j 300ca60 + } + + if (SchedulerSequenceSteps.PreRangeOn) { + 300c9d8: fc344783 lbu a5,-61(s0) + 300c9dc: c7a1 beqz a5,300ca24 + + /* Subtract the Pre-range timeout if enabled. */ + + Status = get_sequence_step_timeout(Dev, + 300c9de: fb840793 addi a5,s0,-72 + 300c9e2: 863e mv a2,a5 + 300c9e4: 458d li a1,3 + 300c9e6: fac42503 lw a0,-84(s0) + 300c9ea: 3a4d jal ra,300c39c + 300c9ec: 87aa mv a5,a0 + 300c9ee: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + + SubTimeout = PreRangeTimeoutMicroSeconds + + 300c9f2: fb842783 lw a5,-72(s0) + 300c9f6: fd042703 lw a4,-48(s0) + 300c9fa: 97ba add a5,a5,a4 + 300c9fc: fcf42423 sw a5,-56(s0) + PreRangeOverheadMicroSeconds; + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + 300ca00: fc842703 lw a4,-56(s0) + 300ca04: fe842783 lw a5,-24(s0) + 300ca08: 00f77b63 bgeu a4,a5,300ca1e + FinalRangeTimingBudgetMicroSeconds -= SubTimeout; + 300ca0c: fe842703 lw a4,-24(s0) + 300ca10: fc842783 lw a5,-56(s0) + 300ca14: 40f707b3 sub a5,a4,a5 + 300ca18: fef42423 sw a5,-24(s0) + 300ca1c: a021 j 300ca24 + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300ca1e: 57f1 li a5,-4 + 300ca20: fef407a3 sb a5,-17(s0) + } + } + + + if (Status == VL53L0X_ERROR_NONE && + 300ca24: fef40783 lb a5,-17(s0) + 300ca28: eb95 bnez a5,300ca5c + SchedulerSequenceSteps.FinalRangeOn) { + 300ca2a: fc444783 lbu a5,-60(s0) + if (Status == VL53L0X_ERROR_NONE && + 300ca2e: c79d beqz a5,300ca5c + + FinalRangeTimingBudgetMicroSeconds -= + 300ca30: fe842703 lw a4,-24(s0) + 300ca34: fcc42783 lw a5,-52(s0) + 300ca38: 40f707b3 sub a5,a4,a5 + 300ca3c: fef42423 sw a5,-24(s0) + * budget and the sum of all other timeouts within the sequence. + * If there is no room for the final range timeout, then an + * error will be set. Otherwise the remaining time will be + * applied to the final range. + */ + Status = set_sequence_step_timeout(Dev, + 300ca40: fe842603 lw a2,-24(s0) + 300ca44: 4591 li a1,4 + 300ca46: fac42503 lw a0,-84(s0) + 300ca4a: 36b1 jal ra,300c596 + 300ca4c: 87aa mv a5,a0 + 300ca4e: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + FinalRangeTimingBudgetMicroSeconds); + + VL53L0X_SETPARAMETERFIELD(Dev, + 300ca52: fac42783 lw a5,-84(s0) + 300ca56: fa842703 lw a4,-88(s0) + 300ca5a: c7d8 sw a4,12(a5) + MeasurementTimingBudgetMicroSeconds); + } + + LOG_FUNCTION_END(Status); + + return Status; + 300ca5c: fef40783 lb a5,-17(s0) +} + 300ca60: 853e mv a0,a5 + 300ca62: 40f6 lw ra,92(sp) + 300ca64: 4466 lw s0,88(sp) + 300ca66: 6125 addi sp,sp,96 + 300ca68: 8082 ret + +0300ca6a : + 300ca6a: eb0fc06f j 300911a + +0300ca6e : + +VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + 300ca6e: 711d addi sp,sp,-96 + 300ca70: ce86 sw ra,92(sp) + 300ca72: cca2 sw s0,88(sp) + 300ca74: 1080 addi s0,sp,96 + 300ca76: faa42623 sw a0,-84(s0) + 300ca7a: fab42423 sw a1,-88(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300ca7e: fe0407a3 sb zero,-17(s0) + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + uint32_t FinalRangeTimeoutMicroSeconds; + uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; + 300ca82: 7d000793 li a5,2000 + 300ca86: fcf42023 sw a5,-64(s0) + uint32_t StartOverheadMicroSeconds = 1910; + 300ca8a: 77600793 li a5,1910 + 300ca8e: fef42423 sw a5,-24(s0) + uint32_t EndOverheadMicroSeconds = 960; + 300ca92: 3c000793 li a5,960 + 300ca96: fef42223 sw a5,-28(s0) + uint32_t MsrcOverheadMicroSeconds = 660; + 300ca9a: 29400793 li a5,660 + 300ca9e: fef42023 sw a5,-32(s0) + uint32_t TccOverheadMicroSeconds = 590; + 300caa2: 24e00793 li a5,590 + 300caa6: fcf42e23 sw a5,-36(s0) + uint32_t DssOverheadMicroSeconds = 690; + 300caaa: 2b200793 li a5,690 + 300caae: fcf42c23 sw a5,-40(s0) + uint32_t PreRangeOverheadMicroSeconds = 660; + 300cab2: 29400793 li a5,660 + 300cab6: fcf42a23 sw a5,-44(s0) + uint32_t FinalRangeOverheadMicroSeconds = 550; + 300caba: 22600793 li a5,550 + 300cabe: fcf42823 sw a5,-48(s0) + uint32_t PreRangeTimeoutMicroSeconds = 0; + 300cac2: fa042e23 sw zero,-68(s0) + + LOG_FUNCTION_START(""); + + /* Start and end overhead times always present */ + *pMeasurementTimingBudgetMicroSeconds + = StartOverheadMicroSeconds + EndOverheadMicroSeconds; + 300cac6: fe842703 lw a4,-24(s0) + 300caca: fe442783 lw a5,-28(s0) + 300cace: 973e add a4,a4,a5 + 300cad0: fa842783 lw a5,-88(s0) + 300cad4: c398 sw a4,0(a5) + + Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + 300cad6: fc840793 addi a5,s0,-56 + 300cada: 85be mv a1,a5 + 300cadc: fac42503 lw a0,-84(s0) + 300cae0: 3769 jal ra,300ca6a + 300cae2: 87aa mv a5,a0 + 300cae4: fef407a3 sb a5,-17(s0) + + if (Status != VL53L0X_ERROR_NONE) { + 300cae8: fef40783 lb a5,-17(s0) + 300caec: c781 beqz a5,300caf4 + LOG_FUNCTION_END(Status); + return Status; + 300caee: fef40783 lb a5,-17(s0) + 300caf2: aa09 j 300cc04 + } + + + if (SchedulerSequenceSteps.TccOn || + 300caf4: fc844783 lbu a5,-56(s0) + 300caf8: e799 bnez a5,300cb06 + SchedulerSequenceSteps.MsrcOn || + 300cafa: fc944783 lbu a5,-55(s0) + if (SchedulerSequenceSteps.TccOn || + 300cafe: e781 bnez a5,300cb06 + SchedulerSequenceSteps.DssOn) { + 300cb00: fca44783 lbu a5,-54(s0) + SchedulerSequenceSteps.MsrcOn || + 300cb04: cfad beqz a5,300cb7e + + Status = get_sequence_step_timeout(Dev, + 300cb06: fc040793 addi a5,s0,-64 + 300cb0a: 863e mv a2,a5 + 300cb0c: 4589 li a1,2 + 300cb0e: fac42503 lw a0,-84(s0) + 300cb12: 28f5 jal ra,300cc0e + 300cb14: 87aa mv a5,a0 + 300cb16: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcDccTccTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) { + 300cb1a: fef40783 lb a5,-17(s0) + 300cb1e: e3a5 bnez a5,300cb7e + if (SchedulerSequenceSteps.TccOn) { + 300cb20: fc844783 lbu a5,-56(s0) + 300cb24: cf89 beqz a5,300cb3e + *pMeasurementTimingBudgetMicroSeconds += + 300cb26: fa842783 lw a5,-88(s0) + 300cb2a: 4398 lw a4,0(a5) + MsrcDccTccTimeoutMicroSeconds + + 300cb2c: fc042683 lw a3,-64(s0) + 300cb30: fdc42783 lw a5,-36(s0) + 300cb34: 97b6 add a5,a5,a3 + *pMeasurementTimingBudgetMicroSeconds += + 300cb36: 973e add a4,a4,a5 + 300cb38: fa842783 lw a5,-88(s0) + 300cb3c: c398 sw a4,0(a5) + TccOverheadMicroSeconds; + } + + if (SchedulerSequenceSteps.DssOn) { + 300cb3e: fca44783 lbu a5,-54(s0) + 300cb42: cf99 beqz a5,300cb60 + *pMeasurementTimingBudgetMicroSeconds += + 300cb44: fa842783 lw a5,-88(s0) + 300cb48: 4398 lw a4,0(a5) + 2 * (MsrcDccTccTimeoutMicroSeconds + + 300cb4a: fc042683 lw a3,-64(s0) + 300cb4e: fd842783 lw a5,-40(s0) + 300cb52: 97b6 add a5,a5,a3 + 300cb54: 0786 slli a5,a5,0x1 + *pMeasurementTimingBudgetMicroSeconds += + 300cb56: 973e add a4,a4,a5 + 300cb58: fa842783 lw a5,-88(s0) + 300cb5c: c398 sw a4,0(a5) + 300cb5e: a005 j 300cb7e + DssOverheadMicroSeconds); + } else if (SchedulerSequenceSteps.MsrcOn) { + 300cb60: fc944783 lbu a5,-55(s0) + 300cb64: cf89 beqz a5,300cb7e + *pMeasurementTimingBudgetMicroSeconds += + 300cb66: fa842783 lw a5,-88(s0) + 300cb6a: 4398 lw a4,0(a5) + MsrcDccTccTimeoutMicroSeconds + + 300cb6c: fc042683 lw a3,-64(s0) + 300cb70: fe042783 lw a5,-32(s0) + 300cb74: 97b6 add a5,a5,a3 + *pMeasurementTimingBudgetMicroSeconds += + 300cb76: 973e add a4,a4,a5 + 300cb78: fa842783 lw a5,-88(s0) + 300cb7c: c398 sw a4,0(a5) + MsrcOverheadMicroSeconds; + } + } + } + + if (Status == VL53L0X_ERROR_NONE) { + 300cb7e: fef40783 lb a5,-17(s0) + 300cb82: eb95 bnez a5,300cbb6 + if (SchedulerSequenceSteps.PreRangeOn) { + 300cb84: fcb44783 lbu a5,-53(s0) + 300cb88: c79d beqz a5,300cbb6 + Status = get_sequence_step_timeout(Dev, + 300cb8a: fbc40793 addi a5,s0,-68 + 300cb8e: 863e mv a2,a5 + 300cb90: 458d li a1,3 + 300cb92: fac42503 lw a0,-84(s0) + 300cb96: 28a5 jal ra,300cc0e + 300cb98: 87aa mv a5,a0 + 300cb9a: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + *pMeasurementTimingBudgetMicroSeconds += + 300cb9e: fa842783 lw a5,-88(s0) + 300cba2: 4398 lw a4,0(a5) + PreRangeTimeoutMicroSeconds + + 300cba4: fbc42683 lw a3,-68(s0) + 300cba8: fd442783 lw a5,-44(s0) + 300cbac: 97b6 add a5,a5,a3 + *pMeasurementTimingBudgetMicroSeconds += + 300cbae: 973e add a4,a4,a5 + 300cbb0: fa842783 lw a5,-88(s0) + 300cbb4: c398 sw a4,0(a5) + PreRangeOverheadMicroSeconds; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + 300cbb6: fef40783 lb a5,-17(s0) + 300cbba: eb95 bnez a5,300cbee + if (SchedulerSequenceSteps.FinalRangeOn) { + 300cbbc: fcc44783 lbu a5,-52(s0) + 300cbc0: c79d beqz a5,300cbee + Status = get_sequence_step_timeout(Dev, + 300cbc2: fc440793 addi a5,s0,-60 + 300cbc6: 863e mv a2,a5 + 300cbc8: 4591 li a1,4 + 300cbca: fac42503 lw a0,-84(s0) + 300cbce: 2081 jal ra,300cc0e + 300cbd0: 87aa mv a5,a0 + 300cbd2: fef407a3 sb a5,-17(s0) + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &FinalRangeTimeoutMicroSeconds); + *pMeasurementTimingBudgetMicroSeconds += + 300cbd6: fa842783 lw a5,-88(s0) + 300cbda: 4398 lw a4,0(a5) + (FinalRangeTimeoutMicroSeconds + + 300cbdc: fc442683 lw a3,-60(s0) + 300cbe0: fd042783 lw a5,-48(s0) + 300cbe4: 97b6 add a5,a5,a3 + *pMeasurementTimingBudgetMicroSeconds += + 300cbe6: 973e add a4,a4,a5 + 300cbe8: fa842783 lw a5,-88(s0) + 300cbec: c398 sw a4,0(a5) + FinalRangeOverheadMicroSeconds); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + 300cbee: fef40783 lb a5,-17(s0) + 300cbf2: e799 bnez a5,300cc00 + VL53L0X_SETPARAMETERFIELD(Dev, + 300cbf4: fa842783 lw a5,-88(s0) + 300cbf8: 4398 lw a4,0(a5) + 300cbfa: fac42783 lw a5,-84(s0) + 300cbfe: c7d8 sw a4,12(a5) + MeasurementTimingBudgetMicroSeconds, + *pMeasurementTimingBudgetMicroSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; + 300cc00: fef40783 lb a5,-17(s0) +} + 300cc04: 853e mv a0,a5 + 300cc06: 40f6 lw ra,92(sp) + 300cc08: 4466 lw s0,88(sp) + 300cc0a: 6125 addi sp,sp,96 + 300cc0c: 8082 ret + +0300cc0e : + 300cc0e: f8eff06f j 300c39c + +0300cc12 : + + + +VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer) +{ + 300cc12: 7139 addi sp,sp,-64 + 300cc14: de06 sw ra,60(sp) + 300cc16: dc22 sw s0,56(sp) + 300cc18: 0080 addi s0,sp,64 + 300cc1a: fca42623 sw a0,-52(s0) + 300cc1e: fcb42423 sw a1,-56(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300cc22: fe0407a3 sb zero,-17(s0) + uint8_t localBuffer[4]; /* max */ + uint16_t Temp16; + + LOG_FUNCTION_START(""); + + Index = 0; + 300cc26: fe042223 sw zero,-28(s0) + + while ((*(pTuningSettingBuffer + Index) != 0) && + 300cc2a: a49d j 300ce90 + (Status == VL53L0X_ERROR_NONE)) { + NumberOfWrites = *(pTuningSettingBuffer + Index); + 300cc2c: fe442783 lw a5,-28(s0) + 300cc30: fc842703 lw a4,-56(s0) + 300cc34: 97ba add a5,a5,a4 + 300cc36: 239c lbu a5,0(a5) + 300cc38: fef401a3 sb a5,-29(s0) + Index++; + 300cc3c: fe442783 lw a5,-28(s0) + 300cc40: 0785 addi a5,a5,1 + 300cc42: fef42223 sw a5,-28(s0) + if (NumberOfWrites == 0xFF) { + 300cc46: fe344703 lbu a4,-29(s0) + 300cc4a: 0ff00793 li a5,255 + 300cc4e: 1af71c63 bne a4,a5,300ce06 + /* internal parameters */ + SelectParam = *(pTuningSettingBuffer + Index); + 300cc52: fe442783 lw a5,-28(s0) + 300cc56: fc842703 lw a4,-56(s0) + 300cc5a: 97ba add a5,a5,a4 + 300cc5c: 239c lbu a5,0(a5) + 300cc5e: fef400a3 sb a5,-31(s0) + Index++; + 300cc62: fe442783 lw a5,-28(s0) + 300cc66: 0785 addi a5,a5,1 + 300cc68: fef42223 sw a5,-28(s0) + switch (SelectParam) { + 300cc6c: fe144783 lbu a5,-31(s0) + 300cc70: 4705 li a4,1 + 300cc72: 06e78c63 beq a5,a4,300ccea + 300cc76: 4705 li a4,1 + 300cc78: 00f74463 blt a4,a5,300cc80 + 300cc7c: cb89 beqz a5,300cc8e + 300cc7e: a241 j 300cdfe + 300cc80: 4709 li a4,2 + 300cc82: 0ce78263 beq a5,a4,300cd46 + 300cc86: 470d li a4,3 + 300cc88: 10e78d63 beq a5,a4,300cda2 + 300cc8c: aa8d j 300cdfe + case 0: /* uint16_t SigmaEstRefArray -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + 300cc8e: fe442783 lw a5,-28(s0) + 300cc92: fc842703 lw a4,-56(s0) + 300cc96: 97ba add a5,a5,a4 + 300cc98: 239c lbu a5,0(a5) + 300cc9a: fef40023 sb a5,-32(s0) + Index++; + 300cc9e: fe442783 lw a5,-28(s0) + 300cca2: 0785 addi a5,a5,1 + 300cca4: fef42223 sw a5,-28(s0) + lsb = *(pTuningSettingBuffer + Index); + 300cca8: fe442783 lw a5,-28(s0) + 300ccac: fc842703 lw a4,-56(s0) + 300ccb0: 97ba add a5,a5,a4 + 300ccb2: 239c lbu a5,0(a5) + 300ccb4: fcf40fa3 sb a5,-33(s0) + Index++; + 300ccb8: fe442783 lw a5,-28(s0) + 300ccbc: 0785 addi a5,a5,1 + 300ccbe: fef42223 sw a5,-28(s0) + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + 300ccc2: fe044783 lbu a5,-32(s0) + 300ccc6: 9fa1 uxth a5 + 300ccc8: 07a2 slli a5,a5,0x8 + 300ccca: 01079713 slli a4,a5,0x10 + 300ccce: 8341 srli a4,a4,0x10 + 300ccd0: fdf44783 lbu a5,-33(s0) + 300ccd4: 9fa1 uxth a5 + 300ccd6: 97ba add a5,a5,a4 + 300ccd8: fcf41e23 sh a5,-36(s0) + PALDevDataSet(Dev, SigmaEstRefArray, Temp16); + 300ccdc: fcc42783 lw a5,-52(s0) + 300cce0: fdc45703 lhu a4,-36(s0) + 300cce4: 16e79023 sh a4,352(a5) + break; + 300cce8: a265 j 300ce90 + case 1: /* uint16_t SigmaEstEffPulseWidth -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + 300ccea: fe442783 lw a5,-28(s0) + 300ccee: fc842703 lw a4,-56(s0) + 300ccf2: 97ba add a5,a5,a4 + 300ccf4: 239c lbu a5,0(a5) + 300ccf6: fef40023 sb a5,-32(s0) + Index++; + 300ccfa: fe442783 lw a5,-28(s0) + 300ccfe: 0785 addi a5,a5,1 + 300cd00: fef42223 sw a5,-28(s0) + lsb = *(pTuningSettingBuffer + Index); + 300cd04: fe442783 lw a5,-28(s0) + 300cd08: fc842703 lw a4,-56(s0) + 300cd0c: 97ba add a5,a5,a4 + 300cd0e: 239c lbu a5,0(a5) + 300cd10: fcf40fa3 sb a5,-33(s0) + Index++; + 300cd14: fe442783 lw a5,-28(s0) + 300cd18: 0785 addi a5,a5,1 + 300cd1a: fef42223 sw a5,-28(s0) + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + 300cd1e: fe044783 lbu a5,-32(s0) + 300cd22: 9fa1 uxth a5 + 300cd24: 07a2 slli a5,a5,0x8 + 300cd26: 01079713 slli a4,a5,0x10 + 300cd2a: 8341 srli a4,a4,0x10 + 300cd2c: fdf44783 lbu a5,-33(s0) + 300cd30: 9fa1 uxth a5 + 300cd32: 97ba add a5,a5,a4 + 300cd34: fcf41e23 sh a5,-36(s0) + PALDevDataSet(Dev, SigmaEstEffPulseWidth, + 300cd38: fcc42783 lw a5,-52(s0) + 300cd3c: fdc45703 lhu a4,-36(s0) + 300cd40: 16e79123 sh a4,354(a5) + Temp16); + break; + 300cd44: a2b1 j 300ce90 + case 2: /* uint16_t SigmaEstEffAmbWidth -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + 300cd46: fe442783 lw a5,-28(s0) + 300cd4a: fc842703 lw a4,-56(s0) + 300cd4e: 97ba add a5,a5,a4 + 300cd50: 239c lbu a5,0(a5) + 300cd52: fef40023 sb a5,-32(s0) + Index++; + 300cd56: fe442783 lw a5,-28(s0) + 300cd5a: 0785 addi a5,a5,1 + 300cd5c: fef42223 sw a5,-28(s0) + lsb = *(pTuningSettingBuffer + Index); + 300cd60: fe442783 lw a5,-28(s0) + 300cd64: fc842703 lw a4,-56(s0) + 300cd68: 97ba add a5,a5,a4 + 300cd6a: 239c lbu a5,0(a5) + 300cd6c: fcf40fa3 sb a5,-33(s0) + Index++; + 300cd70: fe442783 lw a5,-28(s0) + 300cd74: 0785 addi a5,a5,1 + 300cd76: fef42223 sw a5,-28(s0) + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + 300cd7a: fe044783 lbu a5,-32(s0) + 300cd7e: 9fa1 uxth a5 + 300cd80: 07a2 slli a5,a5,0x8 + 300cd82: 01079713 slli a4,a5,0x10 + 300cd86: 8341 srli a4,a4,0x10 + 300cd88: fdf44783 lbu a5,-33(s0) + 300cd8c: 9fa1 uxth a5 + 300cd8e: 97ba add a5,a5,a4 + 300cd90: fcf41e23 sh a5,-36(s0) + PALDevDataSet(Dev, SigmaEstEffAmbWidth, Temp16); + 300cd94: fcc42783 lw a5,-52(s0) + 300cd98: fdc45703 lhu a4,-36(s0) + 300cd9c: 16e79223 sh a4,356(a5) + break; + 300cda0: a8c5 j 300ce90 + case 3: /* uint16_t targetRefRate -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + 300cda2: fe442783 lw a5,-28(s0) + 300cda6: fc842703 lw a4,-56(s0) + 300cdaa: 97ba add a5,a5,a4 + 300cdac: 239c lbu a5,0(a5) + 300cdae: fef40023 sb a5,-32(s0) + Index++; + 300cdb2: fe442783 lw a5,-28(s0) + 300cdb6: 0785 addi a5,a5,1 + 300cdb8: fef42223 sw a5,-28(s0) + lsb = *(pTuningSettingBuffer + Index); + 300cdbc: fe442783 lw a5,-28(s0) + 300cdc0: fc842703 lw a4,-56(s0) + 300cdc4: 97ba add a5,a5,a4 + 300cdc6: 239c lbu a5,0(a5) + 300cdc8: fcf40fa3 sb a5,-33(s0) + Index++; + 300cdcc: fe442783 lw a5,-28(s0) + 300cdd0: 0785 addi a5,a5,1 + 300cdd2: fef42223 sw a5,-28(s0) + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + 300cdd6: fe044783 lbu a5,-32(s0) + 300cdda: 9fa1 uxth a5 + 300cddc: 07a2 slli a5,a5,0x8 + 300cdde: 01079713 slli a4,a5,0x10 + 300cde2: 8341 srli a4,a4,0x10 + 300cde4: fdf44783 lbu a5,-33(s0) + 300cde8: 9fa1 uxth a5 + 300cdea: 97ba add a5,a5,a4 + 300cdec: fcf41e23 sh a5,-36(s0) + PALDevDataSet(Dev, targetRefRate, Temp16); + 300cdf0: fcc42783 lw a5,-52(s0) + 300cdf4: fdc45703 lhu a4,-36(s0) + 300cdf8: 16e79423 sh a4,360(a5) + break; + 300cdfc: a851 j 300ce90 + default: /* invalid parameter */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300cdfe: 57f1 li a5,-4 + 300ce00: fef407a3 sb a5,-17(s0) + 300ce04: a071 j 300ce90 + } + + } else if (NumberOfWrites <= 4) { + 300ce06: fe344703 lbu a4,-29(s0) + 300ce0a: 4791 li a5,4 + 300ce0c: 06e7ef63 bltu a5,a4,300ce8a + Address = *(pTuningSettingBuffer + Index); + 300ce10: fe442783 lw a5,-28(s0) + 300ce14: fc842703 lw a4,-56(s0) + 300ce18: 97ba add a5,a5,a4 + 300ce1a: 239c lbu a5,0(a5) + 300ce1c: fef40123 sb a5,-30(s0) + Index++; + 300ce20: fe442783 lw a5,-28(s0) + 300ce24: 0785 addi a5,a5,1 + 300ce26: fef42223 sw a5,-28(s0) + + for (i = 0; i < NumberOfWrites; i++) { + 300ce2a: fe042423 sw zero,-24(s0) + 300ce2e: a805 j 300ce5e + localBuffer[i] = *(pTuningSettingBuffer + + 300ce30: fe442783 lw a5,-28(s0) + 300ce34: fc842703 lw a4,-56(s0) + 300ce38: 97ba add a5,a5,a4 + 300ce3a: 2398 lbu a4,0(a5) + 300ce3c: fe842783 lw a5,-24(s0) + 300ce40: ff040693 addi a3,s0,-16 + 300ce44: 97b6 add a5,a5,a3 + 300ce46: fee78423 sb a4,-24(a5) + Index); + Index++; + 300ce4a: fe442783 lw a5,-28(s0) + 300ce4e: 0785 addi a5,a5,1 + 300ce50: fef42223 sw a5,-28(s0) + for (i = 0; i < NumberOfWrites; i++) { + 300ce54: fe842783 lw a5,-24(s0) + 300ce58: 0785 addi a5,a5,1 + 300ce5a: fef42423 sw a5,-24(s0) + 300ce5e: fe344783 lbu a5,-29(s0) + 300ce62: fe842703 lw a4,-24(s0) + 300ce66: fcf745e3 blt a4,a5,300ce30 + } + + Status = VL53L0X_WriteMulti(Dev, Address, localBuffer, + 300ce6a: fe344683 lbu a3,-29(s0) + 300ce6e: fd840713 addi a4,s0,-40 + 300ce72: fe244783 lbu a5,-30(s0) + 300ce76: 863a mv a2,a4 + 300ce78: 85be mv a1,a5 + 300ce7a: fcc42503 lw a0,-52(s0) + 300ce7e: 522010ef jal ra,300e3a0 + 300ce82: 87aa mv a5,a0 + 300ce84: fef407a3 sb a5,-17(s0) + 300ce88: a021 j 300ce90 + NumberOfWrites); + + } else { + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300ce8a: 57f1 li a5,-4 + 300ce8c: fef407a3 sb a5,-17(s0) + while ((*(pTuningSettingBuffer + Index) != 0) && + 300ce90: fe442783 lw a5,-28(s0) + 300ce94: fc842703 lw a4,-56(s0) + 300ce98: 97ba add a5,a5,a4 + 300ce9a: 239c lbu a5,0(a5) + 300ce9c: c789 beqz a5,300cea6 + 300ce9e: fef40783 lb a5,-17(s0) + 300cea2: d80785e3 beqz a5,300cc2c + } + } + + LOG_FUNCTION_END(Status); + return Status; + 300cea6: fef40783 lb a5,-17(s0) +} + 300ceaa: 853e mv a0,a5 + 300ceac: 50f2 lw ra,60(sp) + 300ceae: 5462 lw s0,56(sp) + 300ceb0: 6121 addi sp,sp,64 + 300ceb2: 8082 ret + +0300ceb4 : + +VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_xtalk_rate_mcps) +{ + 300ceb4: 7179 addi sp,sp,-48 + 300ceb6: d606 sw ra,44(sp) + 300ceb8: d422 sw s0,40(sp) + 300ceba: 1800 addi s0,sp,48 + 300cebc: fca42e23 sw a0,-36(s0) + 300cec0: fcb42c23 sw a1,-40(s0) + 300cec4: fcc42a23 sw a2,-44(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300cec8: fe0407a3 sb zero,-17(s0) + + uint8_t xtalkCompEnable; + FixPoint1616_t totalXtalkMegaCps; + FixPoint1616_t xtalkPerSpadMegaCps; + + *ptotal_xtalk_rate_mcps = 0; + 300cecc: fd442783 lw a5,-44(s0) + 300ced0: 0007a023 sw zero,0(a5) + + Status = VL53L0X_GetXTalkCompensationEnable(Dev, &xtalkCompEnable); + 300ced4: fe340793 addi a5,s0,-29 + 300ced8: 85be mv a1,a5 + 300ceda: fdc42503 lw a0,-36(s0) + 300cede: ba0fc0ef jal ra,300927e + 300cee2: 87aa mv a5,a0 + 300cee4: fef407a3 sb a5,-17(s0) + if (Status == VL53L0X_ERROR_NONE) { + 300cee8: fef40783 lb a5,-17(s0) + 300ceec: ef85 bnez a5,300cf24 + + if (xtalkCompEnable) { + 300ceee: fe344783 lbu a5,-29(s0) + 300cef2: cb8d beqz a5,300cf24 + + VL53L0X_GETPARAMETERFIELD( + 300cef4: fdc42783 lw a5,-36(s0) + 300cef8: 4f9c lw a5,24(a5) + 300cefa: fef42423 sw a5,-24(s0) + XTalkCompensationRateMegaCps, + xtalkPerSpadMegaCps); + + /* FixPoint1616 * FixPoint 8:8 = FixPoint0824 */ + totalXtalkMegaCps = + pRangingMeasurementData->EffectiveSpadRtnCount * + 300cefe: fd842783 lw a5,-40(s0) + 300cf02: 2bde lhu a5,20(a5) + 300cf04: 873e mv a4,a5 + totalXtalkMegaCps = + 300cf06: fe842783 lw a5,-24(s0) + 300cf0a: 02e787b3 mul a5,a5,a4 + 300cf0e: fef42223 sw a5,-28(s0) + xtalkPerSpadMegaCps; + + /* FixPoint0824 >> 8 = FixPoint1616 */ + *ptotal_xtalk_rate_mcps = + (totalXtalkMegaCps + 0x80) >> 8; + 300cf12: fe442783 lw a5,-28(s0) + 300cf16: 08078793 addi a5,a5,128 + 300cf1a: 0087d713 srli a4,a5,0x8 + *ptotal_xtalk_rate_mcps = + 300cf1e: fd442783 lw a5,-44(s0) + 300cf22: c398 sw a4,0(a5) + } + } + + return Status; + 300cf24: fef40783 lb a5,-17(s0) +} + 300cf28: 853e mv a0,a5 + 300cf2a: 50b2 lw ra,44(sp) + 300cf2c: 5422 lw s0,40(sp) + 300cf2e: 6145 addi sp,sp,48 + 300cf30: 8082 ret + +0300cf32 : + +VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_signal_rate_mcps) +{ + 300cf32: 7179 addi sp,sp,-48 + 300cf34: d606 sw ra,44(sp) + 300cf36: d422 sw s0,40(sp) + 300cf38: 1800 addi s0,sp,48 + 300cf3a: fca42e23 sw a0,-36(s0) + 300cf3e: fcb42c23 sw a1,-40(s0) + 300cf42: fcc42a23 sw a2,-44(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300cf46: fe0407a3 sb zero,-17(s0) + FixPoint1616_t totalXtalkMegaCps; + + LOG_FUNCTION_START(""); + + *ptotal_signal_rate_mcps = + pRangingMeasurementData->SignalRateRtnMegaCps; + 300cf4a: fd842783 lw a5,-40(s0) + 300cf4e: 47d8 lw a4,12(a5) + *ptotal_signal_rate_mcps = + 300cf50: fd442783 lw a5,-44(s0) + 300cf54: c398 sw a4,0(a5) + + Status = VL53L0X_get_total_xtalk_rate( + 300cf56: fe840793 addi a5,s0,-24 + 300cf5a: 863e mv a2,a5 + 300cf5c: fd842583 lw a1,-40(s0) + 300cf60: fdc42503 lw a0,-36(s0) + 300cf64: 3f81 jal ra,300ceb4 + 300cf66: 87aa mv a5,a0 + 300cf68: fef407a3 sb a5,-17(s0) + Dev, pRangingMeasurementData, &totalXtalkMegaCps); + + if (Status == VL53L0X_ERROR_NONE) + 300cf6c: fef40783 lb a5,-17(s0) + 300cf70: eb91 bnez a5,300cf84 + *ptotal_signal_rate_mcps += totalXtalkMegaCps; + 300cf72: fd442783 lw a5,-44(s0) + 300cf76: 4398 lw a4,0(a5) + 300cf78: fe842783 lw a5,-24(s0) + 300cf7c: 973e add a4,a4,a5 + 300cf7e: fd442783 lw a5,-44(s0) + 300cf82: c398 sw a4,0(a5) + + return Status; + 300cf84: fef40783 lb a5,-17(s0) +} + 300cf88: 853e mv a0,a5 + 300cf8a: 50b2 lw ra,44(sp) + 300cf8c: 5422 lw s0,40(sp) + 300cf8e: 6145 addi sp,sp,48 + 300cf90: 8082 ret + +0300cf92 : + +VL53L0X_Error get_dmax_lut_points(VL53L0X_DMaxLUT_t data, uint32_t lut_size, + FixPoint1616_t input, int32_t *index0, int32_t *index1){ + 300cf92: 7179 addi sp,sp,-48 + 300cf94: d622 sw s0,44(sp) + 300cf96: d426 sw s1,40(sp) + 300cf98: 1800 addi s0,sp,48 + 300cf9a: 84aa mv s1,a0 + 300cf9c: fcb42e23 sw a1,-36(s0) + 300cfa0: fcc42c23 sw a2,-40(s0) + 300cfa4: fcd42a23 sw a3,-44(s0) + 300cfa8: fce42823 sw a4,-48(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300cfac: fe0401a3 sb zero,-29(s0) + FixPoint1616_t index0_tmp = 0; + 300cfb0: fe042623 sw zero,-20(s0) + FixPoint1616_t index1_tmp = 0; + 300cfb4: fe042423 sw zero,-24(s0) + int index = 0; + 300cfb8: fe042223 sw zero,-28(s0) + + for (index = 0; index < lut_size; index++) { + 300cfbc: fe042223 sw zero,-28(s0) + 300cfc0: a025 j 300cfe8 + if (input <= data.ambRate_mcps[index]) { + 300cfc2: fe442783 lw a5,-28(s0) + 300cfc6: 078a slli a5,a5,0x2 + 300cfc8: 97a6 add a5,a5,s1 + 300cfca: 439c lw a5,0(a5) + 300cfcc: fd842703 lw a4,-40(s0) + 300cfd0: 00e7e763 bltu a5,a4,300cfde + index1_tmp = index; + 300cfd4: fe442783 lw a5,-28(s0) + 300cfd8: fef42423 sw a5,-24(s0) + break; + 300cfdc: a821 j 300cff4 + for (index = 0; index < lut_size; index++) { + 300cfde: fe442783 lw a5,-28(s0) + 300cfe2: 0785 addi a5,a5,1 + 300cfe4: fef42223 sw a5,-28(s0) + 300cfe8: fe442783 lw a5,-28(s0) + 300cfec: fdc42703 lw a4,-36(s0) + 300cff0: fce7e9e3 bltu a5,a4,300cfc2 + } + } + + if (index == lut_size) { + 300cff4: fe442783 lw a5,-28(s0) + 300cff8: fdc42703 lw a4,-36(s0) + 300cffc: 00f71c63 bne a4,a5,300d014 + /* input is higher than last x point */ + index0_tmp = index1_tmp = lut_size - 1; + 300d000: fdc42783 lw a5,-36(s0) + 300d004: 17fd addi a5,a5,-1 + 300d006: fef42423 sw a5,-24(s0) + 300d00a: fe842783 lw a5,-24(s0) + 300d00e: fef42623 sw a5,-20(s0) + 300d012: a821 j 300d02a + } else if (index1_tmp == 0) { + 300d014: fe842783 lw a5,-24(s0) + 300d018: e781 bnez a5,300d020 + /* input is lower than first x point */ + index0_tmp = 0; + 300d01a: fe042623 sw zero,-20(s0) + 300d01e: a031 j 300d02a + } else{ + /* input is in between 2 points */ + index0_tmp = index1_tmp - 1; + 300d020: fe842783 lw a5,-24(s0) + 300d024: 17fd addi a5,a5,-1 + 300d026: fef42623 sw a5,-20(s0) + } + + *index0 = index0_tmp; + 300d02a: fec42703 lw a4,-20(s0) + 300d02e: fd442783 lw a5,-44(s0) + 300d032: c398 sw a4,0(a5) + *index1 = index1_tmp; + 300d034: fe842703 lw a4,-24(s0) + 300d038: fd042783 lw a5,-48(s0) + 300d03c: c398 sw a4,0(a5) + + return Status; + 300d03e: fe340783 lb a5,-29(s0) +} + 300d042: 853e mv a0,a5 + 300d044: 5432 lw s0,44(sp) + 300d046: 54a2 lw s1,40(sp) + 300d048: 6145 addi sp,sp,48 + 300d04a: 8082 ret + +0300d04c : + +VL53L0X_Error VL53L0X_calc_dmax( + VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm){ + 300d04c: 7111 addi sp,sp,-256 + 300d04e: df86 sw ra,252(sp) + 300d050: dda2 sw s0,248(sp) + 300d052: 0200 addi s0,sp,256 + 300d054: f4a42623 sw a0,-180(s0) + 300d058: f4b42423 sw a1,-184(s0) + 300d05c: f4c42223 sw a2,-188(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300d060: fe0405a3 sb zero,-21(s0) + VL53L0X_DeviceParameters_t CurrentParameters; + int32_t index0 = 0; + 300d064: f4042c23 sw zero,-168(s0) + int32_t index1 = 0; + 300d068: f4042a23 sw zero,-172(s0) + FixPoint1616_t dmax_mm; + FixPoint1616_t linearSlope; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + 300d06c: f5c40793 addi a5,s0,-164 + 300d070: 85be mv a1,a5 + 300d072: f4c42503 lw a0,-180(s0) + 300d076: b33fb0ef jal ra,3008ba8 + 300d07a: 87aa mv a5,a0 + 300d07c: fef405a3 sb a5,-21(s0) + + if (ambRateMeas <= CurrentParameters.dmax_lut.ambRate_mcps[0]) { + 300d080: f9842783 lw a5,-104(s0) + 300d084: f4842703 lw a4,-184(s0) + 300d088: 00e7e763 bltu a5,a4,300d096 + dmax_mm = CurrentParameters.dmax_lut.dmax_mm[0]; + 300d08c: fb442783 lw a5,-76(s0) + 300d090: fef42623 sw a5,-20(s0) + 300d094: aa21 j 300d1ac + } else if (ambRateMeas >= + CurrentParameters.dmax_lut. + ambRate_mcps[VL53L0X_DMAX_LUT_SIZE - 1]) { + 300d096: fb042783 lw a5,-80(s0) + } else if (ambRateMeas >= + 300d09a: f4842703 lw a4,-184(s0) + 300d09e: 00f76763 bltu a4,a5,300d0ac + dmax_mm = + 300d0a2: fcc42783 lw a5,-52(s0) + 300d0a6: fef42623 sw a5,-20(s0) + 300d0aa: a209 j 300d1ac + CurrentParameters.dmax_lut.dmax_mm[VL53L0X_DMAX_LUT_SIZE - + 1]; + } else{ + get_dmax_lut_points(CurrentParameters.dmax_lut, + 300d0ac: f0040793 addi a5,s0,-256 + 300d0b0: f9840713 addi a4,s0,-104 + 300d0b4: 03800693 li a3,56 + 300d0b8: 8636 mv a2,a3 + 300d0ba: 85ba mv a1,a4 + 300d0bc: 853e mv a0,a5 + 300d0be: 06d010ef jal ra,300e92a + 300d0c2: f5440713 addi a4,s0,-172 + 300d0c6: f5840693 addi a3,s0,-168 + 300d0ca: f0040793 addi a5,s0,-256 + 300d0ce: f4842603 lw a2,-184(s0) + 300d0d2: 459d li a1,7 + 300d0d4: 853e mv a0,a5 + 300d0d6: 3d75 jal ra,300cf92 + VL53L0X_DMAX_LUT_SIZE, ambRateMeas, &index0, &index1); + + if (index0 == index1) { + 300d0d8: f5842703 lw a4,-168(s0) + 300d0dc: f5442783 lw a5,-172(s0) + 300d0e0: 00f71e63 bne a4,a5,300d0fc + dmax_mm = CurrentParameters.dmax_lut.dmax_mm[index0]; + 300d0e4: f5842783 lw a5,-168(s0) + 300d0e8: 07c1 addi a5,a5,16 + 300d0ea: 078a slli a5,a5,0x2 + 300d0ec: ff040713 addi a4,s0,-16 + 300d0f0: 97ba add a5,a5,a4 + 300d0f2: f847a783 lw a5,-124(a5) + 300d0f6: fef42623 sw a5,-20(s0) + 300d0fa: a84d j 300d1ac + } else { + amb0 = CurrentParameters.dmax_lut.ambRate_mcps[index0]; + 300d0fc: f5842783 lw a5,-168(s0) + 300d100: 07b1 addi a5,a5,12 + 300d102: 078a slli a5,a5,0x2 + 300d104: ff040713 addi a4,s0,-16 + 300d108: 97ba add a5,a5,a4 + 300d10a: f787a783 lw a5,-136(a5) + 300d10e: fef42223 sw a5,-28(s0) + amb1 = CurrentParameters.dmax_lut.ambRate_mcps[index1]; + 300d112: f5442783 lw a5,-172(s0) + 300d116: 07b1 addi a5,a5,12 + 300d118: 078a slli a5,a5,0x2 + 300d11a: ff040713 addi a4,s0,-16 + 300d11e: 97ba add a5,a5,a4 + 300d120: f787a783 lw a5,-136(a5) + 300d124: fef42023 sw a5,-32(s0) + dmax0 = CurrentParameters.dmax_lut.dmax_mm[index0]; + 300d128: f5842783 lw a5,-168(s0) + 300d12c: 07c1 addi a5,a5,16 + 300d12e: 078a slli a5,a5,0x2 + 300d130: ff040713 addi a4,s0,-16 + 300d134: 97ba add a5,a5,a4 + 300d136: f847a783 lw a5,-124(a5) + 300d13a: fcf42e23 sw a5,-36(s0) + dmax1 = CurrentParameters.dmax_lut.dmax_mm[index1]; + 300d13e: f5442783 lw a5,-172(s0) + 300d142: 07c1 addi a5,a5,16 + 300d144: 078a slli a5,a5,0x2 + 300d146: ff040713 addi a4,s0,-16 + 300d14a: 97ba add a5,a5,a4 + 300d14c: f847a783 lw a5,-124(a5) + 300d150: fcf42c23 sw a5,-40(s0) + if ((amb1 - amb0) != 0) { + 300d154: fe042703 lw a4,-32(s0) + 300d158: fe442783 lw a5,-28(s0) + 300d15c: 04f70463 beq a4,a5,300d1a4 + /* Fix16:16/Fix16:8 => Fix16:8 */ + linearSlope = (dmax0-dmax1)/((amb1-amb0) >> 8); + 300d160: fdc42703 lw a4,-36(s0) + 300d164: fd842783 lw a5,-40(s0) + 300d168: 8f1d sub a4,a4,a5 + 300d16a: fe042683 lw a3,-32(s0) + 300d16e: fe442783 lw a5,-28(s0) + 300d172: 40f687b3 sub a5,a3,a5 + 300d176: 83a1 srli a5,a5,0x8 + 300d178: 02f757b3 divu a5,a4,a5 + 300d17c: fcf42a23 sw a5,-44(s0) + + /* Fix16:8 * Fix16:8 => Fix16:16 */ + dmax_mm = + (((amb1 - + 300d180: fe042703 lw a4,-32(s0) + 300d184: f4842783 lw a5,-184(s0) + 300d188: 40f707b3 sub a5,a4,a5 + ambRateMeas) >> 8) * linearSlope) + + 300d18c: 0087d713 srli a4,a5,0x8 + 300d190: fd442783 lw a5,-44(s0) + 300d194: 02f707b3 mul a5,a4,a5 + dmax_mm = + 300d198: fd842703 lw a4,-40(s0) + 300d19c: 97ba add a5,a5,a4 + 300d19e: fef42623 sw a5,-20(s0) + 300d1a2: a029 j 300d1ac + dmax1; + } else{ + dmax_mm = dmax0; + 300d1a4: fdc42783 lw a5,-36(s0) + 300d1a8: fef42623 sw a5,-20(s0) + } + } + } + *pdmax_mm = (uint32_t)(dmax_mm >> 16); + 300d1ac: fec42783 lw a5,-20(s0) + 300d1b0: 0107d713 srli a4,a5,0x10 + 300d1b4: f4442783 lw a5,-188(s0) + 300d1b8: c398 sw a4,0(a5) + + LOG_FUNCTION_END(Status); + + return Status; + 300d1ba: feb40783 lb a5,-21(s0) +} + 300d1be: 853e mv a0,a5 + 300d1c0: 50fe lw ra,252(sp) + 300d1c2: 546e lw s0,248(sp) + 300d1c4: 6111 addi sp,sp,256 + 300d1c6: 8082 ret + +0300d1c8 : + +VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *pSigmaEstimate) +{ + 300d1c8: 7155 addi sp,sp,-208 + 300d1ca: c786 sw ra,204(sp) + 300d1cc: c5a2 sw s0,200(sp) + 300d1ce: 0980 addi s0,sp,208 + 300d1d0: f2a42e23 sw a0,-196(s0) + 300d1d4: f2b42c23 sw a1,-200(s0) + 300d1d8: f2c42a23 sw a2,-204(s0) + /* Expressed in 100ths of a ns, i.e. centi-ns */ + const uint32_t cPulseEffectiveWidth_centi_ns = 800; + 300d1dc: 32000793 li a5,800 + 300d1e0: fcf42423 sw a5,-56(s0) + /* Expressed in 100ths of a ns, i.e. centi-ns */ + const uint32_t cAmbientEffectiveWidth_centi_ns = 600; + 300d1e4: 25800793 li a5,600 + 300d1e8: fcf42223 sw a5,-60(s0) + const FixPoint1616_t cDfltFinalRangeIntegrationTimeMilliSecs = + 300d1ec: 001907b7 lui a5,0x190 + 300d1f0: fcf42023 sw a5,-64(s0) + 0x00190000; /* 25ms */ + const uint32_t cVcselPulseWidth_ps = 4700; /* pico secs */ + 300d1f4: 6785 lui a5,0x1 + 300d1f6: 25c78793 addi a5,a5,604 # 125c + 300d1fa: faf42e23 sw a5,-68(s0) + const FixPoint1616_t cSigmaEstMax = 0x028F87AE; + 300d1fe: 028f87b7 lui a5,0x28f8 + 300d202: 7ae78793 addi a5,a5,1966 # 28f87ae + 300d206: faf42c23 sw a5,-72(s0) + const FixPoint1616_t cSigmaEstRtnMax = 0xF000; + 300d20a: 67bd lui a5,0xf + 300d20c: faf42a23 sw a5,-76(s0) + const FixPoint1616_t cAmbToSignalRatioMax = 0xF0000000/ + 300d210: f0000737 lui a4,0xf0000 + 300d214: fc442783 lw a5,-60(s0) + 300d218: 02f757b3 divu a5,a4,a5 + 300d21c: faf42823 sw a5,-80(s0) + cAmbientEffectiveWidth_centi_ns; + /* Time Of Flight per mm (6.6 pico secs) */ + const FixPoint1616_t cTOF_per_mm_ps = 0x0006999A; + 300d220: 0006a7b7 lui a5,0x6a + 300d224: 99a78793 addi a5,a5,-1638 # 6999a + 300d228: faf42623 sw a5,-84(s0) + const uint32_t c16BitRoundingParam = 0x00008000; + 300d22c: 67a1 lui a5,0x8 + 300d22e: faf42423 sw a5,-88(s0) + const FixPoint1616_t cMaxXTalk_kcps = 0x00320000; + 300d232: 003207b7 lui a5,0x320 + 300d236: faf42223 sw a5,-92(s0) + const uint32_t cPllPeriod_ps = 1655; + 300d23a: 67700793 li a5,1655 + 300d23e: faf42023 sw a5,-96(s0) + FixPoint1616_t xTalkCorrection; + FixPoint1616_t ambientRate_kcps; + FixPoint1616_t peakSignalRate_kcps; + FixPoint1616_t xTalkCompRate_mcps; + uint32_t xTalkCompRate_kcps; + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300d242: f8040fa3 sb zero,-97(s0) + * Estimates the range sigma + */ + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + 300d246: f3c42783 lw a5,-196(s0) + 300d24a: 4f9c lw a5,24(a5) + 300d24c: f4f42423 sw a5,-184(s0) + * We work in kcps rather than mcps as this helps keep within the + * confines of the 32 Fix1616 type. + */ + + ambientRate_kcps = + (pRangingMeasurementData->AmbientRateRtnMegaCps * 1000) >> 16; + 300d250: f3842783 lw a5,-200(s0) + 300d254: 4b98 lw a4,16(a5) + 300d256: 3e800793 li a5,1000 + 300d25a: 02f707b3 mul a5,a4,a5 + ambientRate_kcps = + 300d25e: 83c1 srli a5,a5,0x10 + 300d260: f8f42c23 sw a5,-104(s0) + + Status = VL53L0X_get_total_signal_rate( + 300d264: f4440793 addi a5,s0,-188 + 300d268: 863e mv a2,a5 + 300d26a: f3842583 lw a1,-200(s0) + 300d26e: f3c42503 lw a0,-196(s0) + 300d272: 31c1 jal ra,300cf32 + 300d274: 87aa mv a5,a0 + 300d276: f8f40fa3 sb a5,-97(s0) + Dev, pRangingMeasurementData, &totalSignalRate_mcps); + Status = VL53L0X_get_total_xtalk_rate( + 300d27a: f4840793 addi a5,s0,-184 + 300d27e: 863e mv a2,a5 + 300d280: f3842583 lw a1,-200(s0) + 300d284: f3c42503 lw a0,-196(s0) + 300d288: 3135 jal ra,300ceb4 + 300d28a: 87aa mv a5,a0 + 300d28c: f8f40fa3 sb a5,-97(s0) + + + /* Signal rate measurement provided by device is the + * peak signal rate, not average. + */ + peakSignalRate_kcps = (totalSignalRate_mcps * 1000); + 300d290: f4442703 lw a4,-188(s0) + 300d294: 3e800793 li a5,1000 + 300d298: 02f707b3 mul a5,a4,a5 + 300d29c: f8f42a23 sw a5,-108(s0) + peakSignalRate_kcps = (peakSignalRate_kcps + 0x8000) >> 16; + 300d2a0: f9442703 lw a4,-108(s0) + 300d2a4: 67a1 lui a5,0x8 + 300d2a6: 97ba add a5,a5,a4 + 300d2a8: 83c1 srli a5,a5,0x10 + 300d2aa: f8f42a23 sw a5,-108(s0) + + xTalkCompRate_kcps = xTalkCompRate_mcps * 1000; + 300d2ae: f4842703 lw a4,-184(s0) + 300d2b2: 3e800793 li a5,1000 + 300d2b6: 02f707b3 mul a5,a4,a5 + 300d2ba: fcf42823 sw a5,-48(s0) + + if (xTalkCompRate_kcps > cMaxXTalk_kcps) + 300d2be: fd042703 lw a4,-48(s0) + 300d2c2: fa442783 lw a5,-92(s0) + 300d2c6: 00e7f663 bgeu a5,a4,300d2d2 + xTalkCompRate_kcps = cMaxXTalk_kcps; + 300d2ca: fa442783 lw a5,-92(s0) + 300d2ce: fcf42823 sw a5,-48(s0) + + if (Status == VL53L0X_ERROR_NONE) { + 300d2d2: f9f40783 lb a5,-97(s0) + 300d2d6: 0e079e63 bnez a5,300d3d2 + + /* Calculate final range macro periods */ + finalRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( + 300d2da: f3c42783 lw a5,-196(s0) + 300d2de: 1087a783 lw a5,264(a5) # 8108 + 300d2e2: fef42423 sw a5,-24(s0) + Dev, FinalRangeTimeoutMicroSecs); + + finalRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( + 300d2e6: f3c42783 lw a5,-196(s0) + 300d2ea: 10c7c783 lbu a5,268(a5) + 300d2ee: f8f409a3 sb a5,-109(s0) + Dev, FinalRangeVcselPulsePeriod); + + finalRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( + 300d2f2: f9344783 lbu a5,-109(s0) + 300d2f6: 863e mv a2,a5 + 300d2f8: fe842583 lw a1,-24(s0) + 300d2fc: f3c42503 lw a0,-196(s0) + 300d300: fc5fe0ef jal ra,300c2c4 + 300d304: f8a42623 sw a0,-116(s0) + Dev, finalRangeTimeoutMicroSecs, finalRangeVcselPCLKS); + + /* Calculate pre-range macro periods */ + preRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( + 300d308: f3c42783 lw a5,-196(s0) + 300d30c: 1107a783 lw a5,272(a5) + 300d310: fef42223 sw a5,-28(s0) + Dev, PreRangeTimeoutMicroSecs); + + preRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( + 300d314: f3c42783 lw a5,-196(s0) + 300d318: 1147c783 lbu a5,276(a5) + 300d31c: f8f405a3 sb a5,-117(s0) + Dev, PreRangeVcselPulsePeriod); + + preRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( + 300d320: f8b44783 lbu a5,-117(s0) + 300d324: 863e mv a2,a5 + 300d326: fe442583 lw a1,-28(s0) + 300d32a: f3c42503 lw a0,-196(s0) + 300d32e: f97fe0ef jal ra,300c2c4 + 300d332: f8a42223 sw a0,-124(s0) + Dev, preRangeTimeoutMicroSecs, preRangeVcselPCLKS); + + vcselWidth = 3; + 300d336: 478d li a5,3 + 300d338: fcf42623 sw a5,-52(s0) + if (finalRangeVcselPCLKS == 8) + 300d33c: f9344703 lbu a4,-109(s0) + 300d340: 47a1 li a5,8 + 300d342: 00f71563 bne a4,a5,300d34c + vcselWidth = 2; + 300d346: 4789 li a5,2 + 300d348: fcf42623 sw a5,-52(s0) + + + peakVcselDuration_us = vcselWidth * 2048 * + (preRangeMacroPCLKS + finalRangeMacroPCLKS); + 300d34c: f8442703 lw a4,-124(s0) + 300d350: f8c42783 lw a5,-116(s0) + 300d354: 973e add a4,a4,a5 + peakVcselDuration_us = vcselWidth * 2048 * + 300d356: fcc42783 lw a5,-52(s0) + 300d35a: 02f707b3 mul a5,a4,a5 + 300d35e: 07ae slli a5,a5,0xb + 300d360: f8f42023 sw a5,-128(s0) + peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; + 300d364: f8042783 lw a5,-128(s0) + 300d368: 1f478713 addi a4,a5,500 + 300d36c: 3e800793 li a5,1000 + 300d370: 02f757b3 divu a5,a4,a5 + 300d374: f8f42023 sw a5,-128(s0) + peakVcselDuration_us *= cPllPeriod_ps; + 300d378: f8042703 lw a4,-128(s0) + 300d37c: fa042783 lw a5,-96(s0) + 300d380: 02f707b3 mul a5,a4,a5 + 300d384: f8f42023 sw a5,-128(s0) + peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; + 300d388: f8042783 lw a5,-128(s0) + 300d38c: 1f478713 addi a4,a5,500 + 300d390: 3e800793 li a5,1000 + 300d394: 02f757b3 divu a5,a4,a5 + 300d398: f8f42023 sw a5,-128(s0) + + /* Fix1616 >> 8 = Fix2408 */ + totalSignalRate_mcps = (totalSignalRate_mcps + 0x80) >> 8; + 300d39c: f4442783 lw a5,-188(s0) + 300d3a0: 08078793 addi a5,a5,128 + 300d3a4: 83a1 srli a5,a5,0x8 + 300d3a6: f4f42223 sw a5,-188(s0) + + /* Fix2408 * uint32 = Fix2408 */ + vcselTotalEventsRtn = totalSignalRate_mcps * + 300d3aa: f4442783 lw a5,-188(s0) + 300d3ae: f8042703 lw a4,-128(s0) + 300d3b2: 02f707b3 mul a5,a4,a5 + 300d3b6: fef42623 sw a5,-20(s0) + peakVcselDuration_us; + + /* Fix2408 >> 8 = uint32 */ + vcselTotalEventsRtn = (vcselTotalEventsRtn + 0x80) >> 8; + 300d3ba: fec42783 lw a5,-20(s0) + 300d3be: 08078793 addi a5,a5,128 + 300d3c2: 83a1 srli a5,a5,0x8 + 300d3c4: fef42623 sw a5,-20(s0) + + /* Fix2408 << 8 = Fix1616 = */ + totalSignalRate_mcps <<= 8; + 300d3c8: f4442783 lw a5,-188(s0) + 300d3cc: 07a2 slli a5,a5,0x8 + 300d3ce: f4f42223 sw a5,-188(s0) + } + + if (Status != VL53L0X_ERROR_NONE) { + 300d3d2: f9f40783 lb a5,-97(s0) + 300d3d6: c781 beqz a5,300d3de + LOG_FUNCTION_END(Status); + return Status; + 300d3d8: f9f40783 lb a5,-97(s0) + 300d3dc: ae39 j 300d6fa + } + + if (peakSignalRate_kcps == 0) { + 300d3de: f9442783 lw a5,-108(s0) + 300d3e2: ef89 bnez a5,300d3fc + *pSigmaEstimate = cSigmaEstMax; + 300d3e4: f3442783 lw a5,-204(s0) + 300d3e8: fb842703 lw a4,-72(s0) + 300d3ec: c398 sw a4,0(a5) + PALDevDataSet(Dev, SigmaEstimate, cSigmaEstMax); + 300d3ee: f3c42783 lw a5,-196(s0) + 300d3f2: fb842703 lw a4,-72(s0) + 300d3f6: 16e7a623 sw a4,364(a5) + 300d3fa: acf5 j 300d6f6 + } else { + if (vcselTotalEventsRtn < 1) + 300d3fc: fec42783 lw a5,-20(s0) + 300d400: e781 bnez a5,300d408 + vcselTotalEventsRtn = 1; + 300d402: 4785 li a5,1 + 300d404: fef42623 sw a5,-20(s0) + + sigmaEstimateP1 = cPulseEffectiveWidth_centi_ns; + 300d408: fc842783 lw a5,-56(s0) + 300d40c: f6f42e23 sw a5,-132(s0) + + /* ((FixPoint1616 << 16)* uint32)/uint32 = FixPoint1616 */ + sigmaEstimateP2 = (ambientRate_kcps << 16)/peakSignalRate_kcps; + 300d410: f9842783 lw a5,-104(s0) + 300d414: 01079713 slli a4,a5,0x10 + 300d418: f9442783 lw a5,-108(s0) + 300d41c: 02f757b3 divu a5,a4,a5 + 300d420: fef42023 sw a5,-32(s0) + if (sigmaEstimateP2 > cAmbToSignalRatioMax) { + 300d424: fe042703 lw a4,-32(s0) + 300d428: fb042783 lw a5,-80(s0) + 300d42c: 00e7f663 bgeu a5,a4,300d438 + /* Clip to prevent overflow. Will ensure safe + * max result. + */ + sigmaEstimateP2 = cAmbToSignalRatioMax; + 300d430: fb042783 lw a5,-80(s0) + 300d434: fef42023 sw a5,-32(s0) + } + sigmaEstimateP2 *= cAmbientEffectiveWidth_centi_ns; + 300d438: fe042703 lw a4,-32(s0) + 300d43c: fc442783 lw a5,-60(s0) + 300d440: 02f707b3 mul a5,a4,a5 + 300d444: fef42023 sw a5,-32(s0) + + sigmaEstimateP3 = 2 * VL53L0X_isqrt(vcselTotalEventsRtn * 12); + 300d448: fec42703 lw a4,-20(s0) + 300d44c: 47b1 li a5,12 + 300d44e: 02f707b3 mul a5,a4,a5 + 300d452: 853e mv a0,a5 + 300d454: 2c45 jal ra,300d704 + 300d456: 87aa mv a5,a0 + 300d458: 0786 slli a5,a5,0x1 + 300d45a: f6f42c23 sw a5,-136(s0) + + /* uint32 * FixPoint1616 = FixPoint1616 */ + deltaT_ps = pRangingMeasurementData->RangeMilliMeter * + 300d45e: f3842783 lw a5,-200(s0) + 300d462: 279e lhu a5,8(a5) + 300d464: 873e mv a4,a5 + 300d466: fac42783 lw a5,-84(s0) + 300d46a: 02e787b3 mul a5,a5,a4 + 300d46e: f6f42a23 sw a5,-140(s0) + * (uint32 << 16) - FixPoint1616 = FixPoint1616. + * Divide result by 1000 to convert to mcps. + * 500 is added to ensure rounding when integer division + * truncates. + */ + diff1_mcps = (((peakSignalRate_kcps << 16) - + 300d472: f9442783 lw a5,-108(s0) + 300d476: 01079713 slli a4,a5,0x10 + 2 * xTalkCompRate_kcps) + 500)/1000; + 300d47a: fd042783 lw a5,-48(s0) + 300d47e: 0786 slli a5,a5,0x1 + diff1_mcps = (((peakSignalRate_kcps << 16) - + 300d480: 40f707b3 sub a5,a4,a5 + 2 * xTalkCompRate_kcps) + 500)/1000; + 300d484: 1f478713 addi a4,a5,500 + diff1_mcps = (((peakSignalRate_kcps << 16) - + 300d488: 3e800793 li a5,1000 + 300d48c: 02f757b3 divu a5,a4,a5 + 300d490: f6f42823 sw a5,-144(s0) + + /* vcselRate + xtalkCompRate */ + diff2_mcps = ((peakSignalRate_kcps << 16) + 500)/1000; + 300d494: f9442783 lw a5,-108(s0) + 300d498: 07c2 slli a5,a5,0x10 + 300d49a: 1f478713 addi a4,a5,500 + 300d49e: 3e800793 li a5,1000 + 300d4a2: 02f757b3 divu a5,a4,a5 + 300d4a6: f6f42623 sw a5,-148(s0) + + /* Shift by 8 bits to increase resolution prior to the + * division + */ + diff1_mcps <<= 8; + 300d4aa: f7042783 lw a5,-144(s0) + 300d4ae: 07a2 slli a5,a5,0x8 + 300d4b0: f6f42823 sw a5,-144(s0) + + /* FixPoint0824/FixPoint1616 = FixPoint2408 */ + xTalkCorrection = abs(diff1_mcps/diff2_mcps); + 300d4b4: f7042703 lw a4,-144(s0) + 300d4b8: f6c42783 lw a5,-148(s0) + 300d4bc: 02f757b3 divu a5,a4,a5 + 300d4c0: 853e mv a0,a5 + 300d4c2: 45e010ef jal ra,300e920 + 300d4c6: 87aa mv a5,a0 + 300d4c8: f6f42423 sw a5,-152(s0) + + /* FixPoint2408 << 8 = FixPoint1616 */ + xTalkCorrection <<= 8; + 300d4cc: f6842783 lw a5,-152(s0) + 300d4d0: 07a2 slli a5,a5,0x8 + 300d4d2: f6f42423 sw a5,-152(s0) + + if (pRangingMeasurementData->RangeStatus != 0) { + 300d4d6: f3842783 lw a5,-200(s0) + 300d4da: 2f9c lbu a5,24(a5) + 300d4dc: c789 beqz a5,300d4e6 + pwMult = 1 << 16; + 300d4de: 67c1 lui a5,0x10 + 300d4e0: fcf42e23 sw a5,-36(s0) + 300d4e4: a0a5 j 300d54c + } else { + /* FixPoint1616/uint32 = FixPoint1616 */ + /* smaller than 1.0f */ + pwMult = deltaT_ps/cVcselPulseWidth_ps; + 300d4e6: f7442703 lw a4,-140(s0) + 300d4ea: fbc42783 lw a5,-68(s0) + 300d4ee: 02f757b3 divu a5,a4,a5 + 300d4f2: fcf42e23 sw a5,-36(s0) + /* + * FixPoint1616 * FixPoint1616 = FixPoint3232, however + * both values are small enough such that32 bits will + * not be exceeded. + */ + pwMult *= ((1 << 16) - xTalkCorrection); + 300d4f6: 6741 lui a4,0x10 + 300d4f8: f6842783 lw a5,-152(s0) + 300d4fc: 40f707b3 sub a5,a4,a5 + 300d500: fdc42703 lw a4,-36(s0) + 300d504: 02f707b3 mul a5,a4,a5 + 300d508: fcf42e23 sw a5,-36(s0) + + /* (FixPoint3232 >> 16) = FixPoint1616 */ + pwMult = (pwMult + c16BitRoundingParam) >> 16; + 300d50c: fdc42703 lw a4,-36(s0) + 300d510: fa842783 lw a5,-88(s0) + 300d514: 97ba add a5,a5,a4 + 300d516: 83c1 srli a5,a5,0x10 + 300d518: fcf42e23 sw a5,-36(s0) + + /* FixPoint1616 + FixPoint1616 = FixPoint1616 */ + pwMult += (1 << 16); + 300d51c: fdc42703 lw a4,-36(s0) + 300d520: 67c1 lui a5,0x10 + 300d522: 97ba add a5,a5,a4 + 300d524: fcf42e23 sw a5,-36(s0) + * At this point the value will be 1.xx, therefore if we + * square the value this will exceed 32 bits. To address + * this perform a single shift to the right before the + * multiplication. + */ + pwMult >>= 1; + 300d528: fdc42783 lw a5,-36(s0) + 300d52c: 8385 srli a5,a5,0x1 + 300d52e: fcf42e23 sw a5,-36(s0) + /* FixPoint1715 * FixPoint1715 = FixPoint3430 */ + pwMult = pwMult * pwMult; + 300d532: fdc42703 lw a4,-36(s0) + 300d536: fdc42783 lw a5,-36(s0) + 300d53a: 02f707b3 mul a5,a4,a5 + 300d53e: fcf42e23 sw a5,-36(s0) + + /* (FixPoint3430 >> 14) = Fix1616 */ + pwMult >>= 14; + 300d542: fdc42783 lw a5,-36(s0) + 300d546: 83b9 srli a5,a5,0xe + 300d548: fcf42e23 sw a5,-36(s0) + } + + /* FixPoint1616 * uint32 = FixPoint1616 */ + sqr1 = pwMult * sigmaEstimateP1; + 300d54c: fdc42703 lw a4,-36(s0) + 300d550: f7c42783 lw a5,-132(s0) + 300d554: 02f707b3 mul a5,a4,a5 + 300d558: f6f42223 sw a5,-156(s0) + + /* (FixPoint1616 >> 16) = FixPoint3200 */ + sqr1 = (sqr1 + 0x8000) >> 16; + 300d55c: f6442703 lw a4,-156(s0) + 300d560: 67a1 lui a5,0x8 + 300d562: 97ba add a5,a5,a4 + 300d564: 83c1 srli a5,a5,0x10 + 300d566: f6f42223 sw a5,-156(s0) + + /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ + sqr1 *= sqr1; + 300d56a: f6442703 lw a4,-156(s0) + 300d56e: f6442783 lw a5,-156(s0) + 300d572: 02f707b3 mul a5,a4,a5 + 300d576: f6f42223 sw a5,-156(s0) + + sqr2 = sigmaEstimateP2; + 300d57a: fe042783 lw a5,-32(s0) + 300d57e: f6f42023 sw a5,-160(s0) + + /* (FixPoint1616 >> 16) = FixPoint3200 */ + sqr2 = (sqr2 + 0x8000) >> 16; + 300d582: f6042703 lw a4,-160(s0) + 300d586: 67a1 lui a5,0x8 + 300d588: 97ba add a5,a5,a4 + 300d58a: 83c1 srli a5,a5,0x10 + 300d58c: f6f42023 sw a5,-160(s0) + + /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ + sqr2 *= sqr2; + 300d590: f6042703 lw a4,-160(s0) + 300d594: f6042783 lw a5,-160(s0) + 300d598: 02f707b3 mul a5,a4,a5 + 300d59c: f6f42023 sw a5,-160(s0) + + /* FixPoint64000 + FixPoint6400 = FixPoint6400 */ + sqrSum = sqr1 + sqr2; + 300d5a0: f6442703 lw a4,-156(s0) + 300d5a4: f6042783 lw a5,-160(s0) + 300d5a8: 97ba add a5,a5,a4 + 300d5aa: f4f42e23 sw a5,-164(s0) + + /* SQRT(FixPoin6400) = FixPoint3200 */ + sqrtResult_centi_ns = VL53L0X_isqrt(sqrSum); + 300d5ae: f5c42503 lw a0,-164(s0) + 300d5b2: 2a89 jal ra,300d704 + 300d5b4: f4a42c23 sw a0,-168(s0) + + /* (FixPoint3200 << 16) = FixPoint1616 */ + sqrtResult_centi_ns <<= 16; + 300d5b8: f5842783 lw a5,-168(s0) + 300d5bc: 07c2 slli a5,a5,0x10 + 300d5be: f4f42c23 sw a5,-168(s0) + /* + * Note that the Speed Of Light is expressed in um per 1E-10 + * seconds (2997) Therefore to get mm/ns we have to divide by + * 10000 + */ + sigmaEstRtn = (((sqrtResult_centi_ns+50)/100) / + 300d5c2: f5842783 lw a5,-168(s0) + 300d5c6: 03278713 addi a4,a5,50 # 8032 + 300d5ca: 06400793 li a5,100 + 300d5ce: 02f75733 divu a4,a4,a5 + 300d5d2: f7842783 lw a5,-136(s0) + 300d5d6: 02f757b3 divu a5,a4,a5 + 300d5da: fcf42c23 sw a5,-40(s0) + sigmaEstimateP3); + sigmaEstRtn *= VL53L0X_SPEED_OF_LIGHT_IN_AIR; + 300d5de: fd842703 lw a4,-40(s0) + 300d5e2: 6785 lui a5,0x1 + 300d5e4: bb578793 addi a5,a5,-1099 # bb5 + 300d5e8: 02f707b3 mul a5,a4,a5 + 300d5ec: fcf42c23 sw a5,-40(s0) + + /* Add 5000 before dividing by 10000 to ensure rounding. */ + sigmaEstRtn += 5000; + 300d5f0: fd842703 lw a4,-40(s0) + 300d5f4: 6785 lui a5,0x1 + 300d5f6: 38878793 addi a5,a5,904 # 1388 + 300d5fa: 97ba add a5,a5,a4 + 300d5fc: fcf42c23 sw a5,-40(s0) + sigmaEstRtn /= 10000; + 300d600: fd842703 lw a4,-40(s0) + 300d604: 6789 lui a5,0x2 + 300d606: 71078793 addi a5,a5,1808 # 2710 + 300d60a: 02f757b3 divu a5,a4,a5 + 300d60e: fcf42c23 sw a5,-40(s0) + + if (sigmaEstRtn > cSigmaEstRtnMax) { + 300d612: fd842703 lw a4,-40(s0) + 300d616: fb442783 lw a5,-76(s0) + 300d61a: 00e7f663 bgeu a5,a4,300d626 + /* Clip to prevent overflow. Will ensure safe + * max result. + */ + sigmaEstRtn = cSigmaEstRtnMax; + 300d61e: fb442783 lw a5,-76(s0) + 300d622: fcf42c23 sw a5,-40(s0) + } + finalRangeIntegrationTimeMilliSecs = + (finalRangeTimeoutMicroSecs + preRangeTimeoutMicroSecs + + 300d626: fe842703 lw a4,-24(s0) + 300d62a: fe442783 lw a5,-28(s0) + 300d62e: 97ba add a5,a5,a4 + 300d630: 1f478713 addi a4,a5,500 + finalRangeIntegrationTimeMilliSecs = + 300d634: 3e800793 li a5,1000 + 300d638: 02f757b3 divu a5,a4,a5 + 300d63c: f4f42a23 sw a5,-172(s0) + * (inc pre-range) + * sqrt(FixPoint1616/int) = FixPoint2408) + */ + sigmaEstRef = + VL53L0X_isqrt((cDfltFinalRangeIntegrationTimeMilliSecs + + finalRangeIntegrationTimeMilliSecs/2)/ + 300d640: f5442783 lw a5,-172(s0) + 300d644: 0017d713 srli a4,a5,0x1 + VL53L0X_isqrt((cDfltFinalRangeIntegrationTimeMilliSecs + + 300d648: fc042783 lw a5,-64(s0) + 300d64c: 973e add a4,a4,a5 + 300d64e: f5442783 lw a5,-172(s0) + 300d652: 02f757b3 divu a5,a4,a5 + sigmaEstRef = + 300d656: 853e mv a0,a5 + 300d658: 2075 jal ra,300d704 + 300d65a: f4a42823 sw a0,-176(s0) + finalRangeIntegrationTimeMilliSecs); + + /* FixPoint2408 << 8 = FixPoint1616 */ + sigmaEstRef <<= 8; + 300d65e: f5042783 lw a5,-176(s0) + 300d662: 07a2 slli a5,a5,0x8 + 300d664: f4f42823 sw a5,-176(s0) + sigmaEstRef = (sigmaEstRef + 500)/1000; + 300d668: f5042783 lw a5,-176(s0) + 300d66c: 1f478713 addi a4,a5,500 + 300d670: 3e800793 li a5,1000 + 300d674: 02f757b3 divu a5,a4,a5 + 300d678: f4f42823 sw a5,-176(s0) + + /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ + sqr1 = sigmaEstRtn * sigmaEstRtn; + 300d67c: fd842703 lw a4,-40(s0) + 300d680: fd842783 lw a5,-40(s0) + 300d684: 02f707b3 mul a5,a4,a5 + 300d688: f6f42223 sw a5,-156(s0) + /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ + sqr2 = sigmaEstRef * sigmaEstRef; + 300d68c: f5042703 lw a4,-176(s0) + 300d690: f5042783 lw a5,-176(s0) + 300d694: 02f707b3 mul a5,a4,a5 + 300d698: f6f42023 sw a5,-160(s0) + + /* sqrt(FixPoint3232) = FixPoint1616 */ + sqrtResult = VL53L0X_isqrt((sqr1 + sqr2)); + 300d69c: f6442703 lw a4,-156(s0) + 300d6a0: f6042783 lw a5,-160(s0) + 300d6a4: 97ba add a5,a5,a4 + 300d6a6: 853e mv a0,a5 + 300d6a8: 28b1 jal ra,300d704 + 300d6aa: f4a42623 sw a0,-180(s0) + * Note that the Shift by 4 bits increases resolution prior to + * the sqrt, therefore the result must be shifted by 2 bits to + * the right to revert back to the FixPoint1616 format. + */ + + sigmaEstimate = 1000 * sqrtResult; + 300d6ae: f4c42703 lw a4,-180(s0) + 300d6b2: 3e800793 li a5,1000 + 300d6b6: 02f707b3 mul a5,a4,a5 + 300d6ba: fcf42a23 sw a5,-44(s0) + + if ((peakSignalRate_kcps < 1) || (vcselTotalEventsRtn < 1) || + 300d6be: f9442783 lw a5,-108(s0) + 300d6c2: cb91 beqz a5,300d6d6 + 300d6c4: fec42783 lw a5,-20(s0) + 300d6c8: c799 beqz a5,300d6d6 + 300d6ca: fd442703 lw a4,-44(s0) + 300d6ce: fb842783 lw a5,-72(s0) + 300d6d2: 00e7f663 bgeu a5,a4,300d6de + (sigmaEstimate > cSigmaEstMax)) { + sigmaEstimate = cSigmaEstMax; + 300d6d6: fb842783 lw a5,-72(s0) + 300d6da: fcf42a23 sw a5,-44(s0) + } + + *pSigmaEstimate = (uint32_t)(sigmaEstimate); + 300d6de: f3442783 lw a5,-204(s0) + 300d6e2: fd442703 lw a4,-44(s0) + 300d6e6: c398 sw a4,0(a5) + PALDevDataSet(Dev, SigmaEstimate, *pSigmaEstimate); + 300d6e8: f3442783 lw a5,-204(s0) + 300d6ec: 4398 lw a4,0(a5) + 300d6ee: f3c42783 lw a5,-196(s0) + 300d6f2: 16e7a623 sw a4,364(a5) + } + + LOG_FUNCTION_END(Status); + return Status; + 300d6f6: f9f40783 lb a5,-97(s0) +} + 300d6fa: 853e mv a0,a5 + 300d6fc: 40be lw ra,204(sp) + 300d6fe: 442e lw s0,200(sp) + 300d700: 6169 addi sp,sp,208 + 300d702: 8082 ret + +0300d704 : + 300d704: e7dfd06f j 300b580 + +0300d708 : + uint8_t DeviceRangeStatus, + FixPoint1616_t SignalRate, + uint16_t EffectiveSpadRtnCount, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + uint8_t *pPalRangeStatus) +{ + 300d708: 711d addi sp,sp,-96 + 300d70a: ce86 sw ra,92(sp) + 300d70c: cca2 sw s0,88(sp) + 300d70e: 1080 addi s0,sp,96 + 300d710: faa42e23 sw a0,-68(s0) + 300d714: fac42a23 sw a2,-76(s0) + 300d718: fae42823 sw a4,-80(s0) + 300d71c: faf42623 sw a5,-84(s0) + 300d720: 87ae mv a5,a1 + 300d722: faf40da3 sb a5,-69(s0) + 300d726: 87b6 mv a5,a3 + 300d728: faf41c23 sh a5,-72(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300d72c: fe0407a3 sb zero,-17(s0) + uint8_t NoneFlag; + uint8_t SigmaLimitflag = 0; + 300d730: fe0406a3 sb zero,-19(s0) + uint8_t SignalRefClipflag = 0; + 300d734: fe040623 sb zero,-20(s0) + uint8_t RangeIgnoreThresholdflag = 0; + 300d738: fe0405a3 sb zero,-21(s0) + uint8_t SigmaLimitCheckEnable = 0; + 300d73c: fc040da3 sb zero,-37(s0) + uint8_t SignalRateFinalRangeLimitCheckEnable = 0; + 300d740: fc040d23 sb zero,-38(s0) + uint8_t SignalRefClipLimitCheckEnable = 0; + 300d744: fc040ca3 sb zero,-39(s0) + uint8_t RangeIgnoreThresholdLimitCheckEnable = 0; + 300d748: fc040c23 sb zero,-40(s0) + FixPoint1616_t SigmaEstimate; + FixPoint1616_t SigmaLimitValue; + FixPoint1616_t SignalRefClipValue; + FixPoint1616_t RangeIgnoreThresholdValue; + FixPoint1616_t SignalRatePerSpad; + uint8_t DeviceRangeStatusInternal = 0; + 300d74c: fe040123 sb zero,-30(s0) + uint16_t tmpWord = 0; + 300d750: fc041323 sh zero,-58(s0) + uint8_t Temp8; + uint32_t Dmax_mm = 0; + 300d754: fc042023 sw zero,-64(s0) + * the value 11 in the DeviceRangeStatus. + * In addition, the SigmaEstimator is not included in the VL53L0X + * DeviceRangeStatus, this will be added in the PalRangeStatus. + */ + + DeviceRangeStatusInternal = ((DeviceRangeStatus & 0x78) >> 3); + 300d758: fbb44783 lbu a5,-69(s0) + 300d75c: 878d srai a5,a5,0x3 + 300d75e: 9f81 uxtb a5 + 300d760: 8bbd andi a5,a5,15 + 300d762: fef40123 sb a5,-30(s0) + + if (DeviceRangeStatusInternal == 0 || + 300d766: fe244783 lbu a5,-30(s0) + 300d76a: cf9d beqz a5,300d7a8 + 300d76c: fe244703 lbu a4,-30(s0) + 300d770: 4795 li a5,5 + 300d772: 02f70b63 beq a4,a5,300d7a8 + DeviceRangeStatusInternal == 5 || + 300d776: fe244703 lbu a4,-30(s0) + 300d77a: 479d li a5,7 + 300d77c: 02f70663 beq a4,a5,300d7a8 + DeviceRangeStatusInternal == 7 || + 300d780: fe244703 lbu a4,-30(s0) + 300d784: 47b1 li a5,12 + 300d786: 02f70163 beq a4,a5,300d7a8 + DeviceRangeStatusInternal == 12 || + 300d78a: fe244703 lbu a4,-30(s0) + 300d78e: 47b5 li a5,13 + 300d790: 00f70c63 beq a4,a5,300d7a8 + DeviceRangeStatusInternal == 13 || + 300d794: fe244703 lbu a4,-30(s0) + 300d798: 47b9 li a5,14 + 300d79a: 00f70763 beq a4,a5,300d7a8 + DeviceRangeStatusInternal == 14 || + 300d79e: fe244703 lbu a4,-30(s0) + 300d7a2: 47bd li a5,15 + 300d7a4: 00f71663 bne a4,a5,300d7b0 + DeviceRangeStatusInternal == 15 + ) { + NoneFlag = 1; + 300d7a8: 4785 li a5,1 + 300d7aa: fef40723 sb a5,-18(s0) + 300d7ae: a019 j 300d7b4 + } else { + NoneFlag = 0; + 300d7b0: fe040723 sb zero,-18(s0) + + /* + * Check if Sigma limit is enabled, if yes then do comparison with limit + * value and put the result back into pPalRangeStatus. + */ + if (Status == VL53L0X_ERROR_NONE) + 300d7b4: fef40783 lb a5,-17(s0) + 300d7b8: eb99 bnez a5,300d7ce + Status = VL53L0X_GetLimitCheckEnable(Dev, + 300d7ba: fdb40793 addi a5,s0,-37 + 300d7be: 863e mv a2,a5 + 300d7c0: 4581 li a1,0 + 300d7c2: fbc42503 lw a0,-68(s0) + 300d7c6: 26b1 jal ra,300db12 + 300d7c8: 87aa mv a5,a0 + 300d7ca: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + &SigmaLimitCheckEnable); + + if ((SigmaLimitCheckEnable != 0) && (Status == VL53L0X_ERROR_NONE)) { + 300d7ce: fdb44783 lbu a5,-37(s0) + 300d7d2: c3d9 beqz a5,300d858 + 300d7d4: fef40783 lb a5,-17(s0) + 300d7d8: e3c1 bnez a5,300d858 + /* + * compute the Sigma and check with limit + */ + Status = VL53L0X_calc_sigma_estimate( + 300d7da: fd440793 addi a5,s0,-44 + 300d7de: 863e mv a2,a5 + 300d7e0: fb042583 lw a1,-80(s0) + 300d7e4: fbc42503 lw a0,-68(s0) + 300d7e8: 32c5 jal ra,300d1c8 + 300d7ea: 87aa mv a5,a0 + 300d7ec: fef407a3 sb a5,-17(s0) + Dev, + pRangingMeasurementData, + &SigmaEstimate); + if (Status == VL53L0X_ERROR_NONE) + 300d7f0: fef40783 lb a5,-17(s0) + 300d7f4: ef91 bnez a5,300d810 + Status = VL53L0X_calc_dmax( + 300d7f6: fb042783 lw a5,-80(s0) + 300d7fa: 4b9c lw a5,16(a5) + 300d7fc: fc040713 addi a4,s0,-64 + 300d800: 863a mv a2,a4 + 300d802: 85be mv a1,a5 + 300d804: fbc42503 lw a0,-68(s0) + 300d808: 3091 jal ra,300d04c + 300d80a: 87aa mv a5,a0 + 300d80c: fef407a3 sb a5,-17(s0) + Dev, + pRangingMeasurementData->AmbientRateRtnMegaCps, + &Dmax_mm); + if (Status == VL53L0X_ERROR_NONE) + 300d810: fef40783 lb a5,-17(s0) + 300d814: eb89 bnez a5,300d826 + pRangingMeasurementData->RangeDMaxMilliMeter = Dmax_mm; + 300d816: fc042783 lw a5,-64(s0) + 300d81a: 01079713 slli a4,a5,0x10 + 300d81e: 8341 srli a4,a4,0x10 + 300d820: fb042783 lw a5,-80(s0) + 300d824: a7ba sh a4,10(a5) + + if (Status == VL53L0X_ERROR_NONE) { + 300d826: fef40783 lb a5,-17(s0) + 300d82a: e79d bnez a5,300d858 + Status = VL53L0X_GetLimitCheckValue(Dev, + 300d82c: fd040793 addi a5,s0,-48 + 300d830: 863e mv a2,a5 + 300d832: 4581 li a1,0 + 300d834: fbc42503 lw a0,-68(s0) + 300d838: 2cd9 jal ra,300db0e + 300d83a: 87aa mv a5,a0 + 300d83c: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + &SigmaLimitValue); + + if ((SigmaLimitValue > 0) && + 300d840: fd042783 lw a5,-48(s0) + 300d844: cb91 beqz a5,300d858 + (SigmaEstimate > SigmaLimitValue)) + 300d846: fd442703 lw a4,-44(s0) + 300d84a: fd042783 lw a5,-48(s0) + if ((SigmaLimitValue > 0) && + 300d84e: 00e7f563 bgeu a5,a4,300d858 + /* Limit Fail */ + SigmaLimitflag = 1; + 300d852: 4785 li a5,1 + 300d854: fef406a3 sb a5,-19(s0) + + /* + * Check if Signal ref clip limit is enabled, if yes then do comparison + * with limit value and put the result back into pPalRangeStatus. + */ + if (Status == VL53L0X_ERROR_NONE) + 300d858: fef40783 lb a5,-17(s0) + 300d85c: eb99 bnez a5,300d872 + Status = VL53L0X_GetLimitCheckEnable(Dev, + 300d85e: fd940793 addi a5,s0,-39 + 300d862: 863e mv a2,a5 + 300d864: 4589 li a1,2 + 300d866: fbc42503 lw a0,-68(s0) + 300d86a: 2465 jal ra,300db12 + 300d86c: 87aa mv a5,a0 + 300d86e: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipLimitCheckEnable); + + if ((SignalRefClipLimitCheckEnable != 0) && + 300d872: fd944783 lbu a5,-39(s0) + 300d876: cfd1 beqz a5,300d912 + 300d878: fef40783 lb a5,-17(s0) + 300d87c: ebd9 bnez a5,300d912 + (Status == VL53L0X_ERROR_NONE)) { + + Status = VL53L0X_GetLimitCheckValue(Dev, + 300d87e: fcc40793 addi a5,s0,-52 + 300d882: 863e mv a2,a5 + 300d884: 4589 li a1,2 + 300d886: fbc42503 lw a0,-68(s0) + 300d88a: 2451 jal ra,300db0e + 300d88c: 87aa mv a5,a0 + 300d88e: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipValue); + + /* Read LastSignalRefMcps from device */ + if (Status == VL53L0X_ERROR_NONE) + 300d892: fef40783 lb a5,-17(s0) + 300d896: eb99 bnez a5,300d8ac + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + 300d898: 4605 li a2,1 + 300d89a: 0ff00593 li a1,255 + 300d89e: fbc42503 lw a0,-68(s0) + 300d8a2: 3e3000ef jal ra,300e484 + 300d8a6: 87aa mv a5,a0 + 300d8a8: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) + 300d8ac: fef40783 lb a5,-17(s0) + 300d8b0: ef89 bnez a5,300d8ca + Status = VL53L0X_RdWord(Dev, + 300d8b2: fc640793 addi a5,s0,-58 + 300d8b6: 863e mv a2,a5 + 300d8b8: 0b600593 li a1,182 + 300d8bc: fbc42503 lw a0,-68(s0) + 300d8c0: 579000ef jal ra,300e638 + 300d8c4: 87aa mv a5,a0 + 300d8c6: fef407a3 sb a5,-17(s0) + VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, + &tmpWord); + + if (Status == VL53L0X_ERROR_NONE) + 300d8ca: fef40783 lb a5,-17(s0) + 300d8ce: eb99 bnez a5,300d8e4 + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + 300d8d0: 4601 li a2,0 + 300d8d2: 0ff00593 li a1,255 + 300d8d6: fbc42503 lw a0,-68(s0) + 300d8da: 3ab000ef jal ra,300e484 + 300d8de: 87aa mv a5,a0 + 300d8e0: fef407a3 sb a5,-17(s0) + + LastSignalRefMcps = VL53L0X_FIXPOINT97TOFIXPOINT1616(tmpWord); + 300d8e4: fc645783 lhu a5,-58(s0) + 300d8e8: 07a6 slli a5,a5,0x9 + 300d8ea: fcf42e23 sw a5,-36(s0) + PALDevDataSet(Dev, LastSignalRefMcps, LastSignalRefMcps); + 300d8ee: fbc42783 lw a5,-68(s0) + 300d8f2: fdc42703 lw a4,-36(s0) + 300d8f6: 16e7aa23 sw a4,372(a5) + + if ((SignalRefClipValue > 0) && + 300d8fa: fcc42783 lw a5,-52(s0) + 300d8fe: cb91 beqz a5,300d912 + (LastSignalRefMcps > SignalRefClipValue)) { + 300d900: fcc42783 lw a5,-52(s0) + if ((SignalRefClipValue > 0) && + 300d904: fdc42703 lw a4,-36(s0) + 300d908: 00e7f563 bgeu a5,a4,300d912 + /* Limit Fail */ + SignalRefClipflag = 1; + 300d90c: 4785 li a5,1 + 300d90e: fef40623 sb a5,-20(s0) + * Check if Signal ref clip limit is enabled, if yes then do comparison + * with limit value and put the result back into pPalRangeStatus. + * EffectiveSpadRtnCount has a format 8.8 + * If (Return signal rate < (1.5 x Xtalk x number of Spads)) : FAIL + */ + if (Status == VL53L0X_ERROR_NONE) + 300d912: fef40783 lb a5,-17(s0) + 300d916: eb99 bnez a5,300d92c + Status = VL53L0X_GetLimitCheckEnable(Dev, + 300d918: fd840793 addi a5,s0,-40 + 300d91c: 863e mv a2,a5 + 300d91e: 458d li a1,3 + 300d920: fbc42503 lw a0,-68(s0) + 300d924: 22fd jal ra,300db12 + 300d926: 87aa mv a5,a0 + 300d928: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + &RangeIgnoreThresholdLimitCheckEnable); + + if ((RangeIgnoreThresholdLimitCheckEnable != 0) && + 300d92c: fd844783 lbu a5,-40(s0) + 300d930: cbb1 beqz a5,300d984 + 300d932: fef40783 lb a5,-17(s0) + 300d936: e7b9 bnez a5,300d984 + (Status == VL53L0X_ERROR_NONE)) { + + /* Compute the signal rate per spad */ + if (EffectiveSpadRtnCount == 0) { + 300d938: fb845783 lhu a5,-72(s0) + 300d93c: e781 bnez a5,300d944 + SignalRatePerSpad = 0; + 300d93e: fe042223 sw zero,-28(s0) + 300d942: a819 j 300d958 + } else { + SignalRatePerSpad = (FixPoint1616_t)((256 * SignalRate) + 300d944: fb442783 lw a5,-76(s0) + 300d948: 00879713 slli a4,a5,0x8 + 300d94c: fb845783 lhu a5,-72(s0) + 300d950: 02f757b3 divu a5,a4,a5 + 300d954: fef42223 sw a5,-28(s0) + / EffectiveSpadRtnCount); + } + + Status = VL53L0X_GetLimitCheckValue(Dev, + 300d958: fc840793 addi a5,s0,-56 + 300d95c: 863e mv a2,a5 + 300d95e: 458d li a1,3 + 300d960: fbc42503 lw a0,-68(s0) + 300d964: 226d jal ra,300db0e + 300d966: 87aa mv a5,a0 + 300d968: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + &RangeIgnoreThresholdValue); + + if ((RangeIgnoreThresholdValue > 0) && + 300d96c: fc842783 lw a5,-56(s0) + 300d970: cb91 beqz a5,300d984 + (SignalRatePerSpad < RangeIgnoreThresholdValue)) { + 300d972: fc842783 lw a5,-56(s0) + if ((RangeIgnoreThresholdValue > 0) && + 300d976: fe442703 lw a4,-28(s0) + 300d97a: 00f77563 bgeu a4,a5,300d984 + /* Limit Fail add 2^6 to range status */ + RangeIgnoreThresholdflag = 1; + 300d97e: 4785 li a5,1 + 300d980: fef405a3 sb a5,-21(s0) + } + } + + if (Status == VL53L0X_ERROR_NONE) { + 300d984: fef40783 lb a5,-17(s0) + 300d988: efdd bnez a5,300da46 + if (NoneFlag == 1) { + 300d98a: fee44703 lbu a4,-18(s0) + 300d98e: 4785 li a5,1 + 300d990: 00f71763 bne a4,a5,300d99e + *pPalRangeStatus = 255; /* NONE */ + 300d994: fac42783 lw a5,-84(s0) + 300d998: 577d li a4,-1 + 300d99a: a398 sb a4,0(a5) + 300d99c: a06d j 300da46 + } else if (DeviceRangeStatusInternal == 1 || + 300d99e: fe244703 lbu a4,-30(s0) + 300d9a2: 4785 li a5,1 + 300d9a4: 00f70c63 beq a4,a5,300d9bc + 300d9a8: fe244703 lbu a4,-30(s0) + 300d9ac: 4789 li a5,2 + 300d9ae: 00f70763 beq a4,a5,300d9bc + DeviceRangeStatusInternal == 2 || + 300d9b2: fe244703 lbu a4,-30(s0) + 300d9b6: 478d li a5,3 + 300d9b8: 00f71763 bne a4,a5,300d9c6 + DeviceRangeStatusInternal == 3) { + *pPalRangeStatus = 5; /* HW fail */ + 300d9bc: fac42783 lw a5,-84(s0) + 300d9c0: 4715 li a4,5 + 300d9c2: a398 sb a4,0(a5) + 300d9c4: a049 j 300da46 + } else if (DeviceRangeStatusInternal == 6 || + 300d9c6: fe244703 lbu a4,-30(s0) + 300d9ca: 4799 li a5,6 + 300d9cc: 00f70763 beq a4,a5,300d9da + 300d9d0: fe244703 lbu a4,-30(s0) + 300d9d4: 47a5 li a5,9 + 300d9d6: 00f71763 bne a4,a5,300d9e4 + DeviceRangeStatusInternal == 9) { + *pPalRangeStatus = 4; /* Phase fail */ + 300d9da: fac42783 lw a5,-84(s0) + 300d9de: 4711 li a4,4 + 300d9e0: a398 sb a4,0(a5) + 300d9e2: a095 j 300da46 + } else if (DeviceRangeStatusInternal == 8 || + 300d9e4: fe244703 lbu a4,-30(s0) + 300d9e8: 47a1 li a5,8 + 300d9ea: 00f70c63 beq a4,a5,300da02 + 300d9ee: fe244703 lbu a4,-30(s0) + 300d9f2: 47a9 li a5,10 + 300d9f4: 00f70763 beq a4,a5,300da02 + DeviceRangeStatusInternal == 10 || + 300d9f8: fec44703 lbu a4,-20(s0) + 300d9fc: 4785 li a5,1 + 300d9fe: 00f71763 bne a4,a5,300da0c + SignalRefClipflag == 1) { + *pPalRangeStatus = 3; /* Min range */ + 300da02: fac42783 lw a5,-84(s0) + 300da06: 470d li a4,3 + 300da08: a398 sb a4,0(a5) + 300da0a: a835 j 300da46 + } else if (DeviceRangeStatusInternal == 4 || + 300da0c: fe244703 lbu a4,-30(s0) + 300da10: 4791 li a5,4 + 300da12: 00f70763 beq a4,a5,300da20 + 300da16: feb44703 lbu a4,-21(s0) + 300da1a: 4785 li a5,1 + 300da1c: 00f71763 bne a4,a5,300da2a + RangeIgnoreThresholdflag == 1) { + *pPalRangeStatus = 2; /* Signal Fail */ + 300da20: fac42783 lw a5,-84(s0) + 300da24: 4709 li a4,2 + 300da26: a398 sb a4,0(a5) + 300da28: a839 j 300da46 + } else if (SigmaLimitflag == 1) { + 300da2a: fed44703 lbu a4,-19(s0) + 300da2e: 4785 li a5,1 + 300da30: 00f71763 bne a4,a5,300da3e + *pPalRangeStatus = 1; /* Sigma Fail */ + 300da34: fac42783 lw a5,-84(s0) + 300da38: 4705 li a4,1 + 300da3a: a398 sb a4,0(a5) + 300da3c: a029 j 300da46 + } else { + *pPalRangeStatus = 0; /* Range Valid */ + 300da3e: fac42783 lw a5,-84(s0) + 300da42: 00078023 sb zero,0(a5) + } + } + + /* fill the Limit Check Status */ + + Status = VL53L0X_GetLimitCheckEnable(Dev, + 300da46: fda40793 addi a5,s0,-38 + 300da4a: 863e mv a2,a5 + 300da4c: 4585 li a1,1 + 300da4e: fbc42503 lw a0,-68(s0) + 300da52: 20c1 jal ra,300db12 + 300da54: 87aa mv a5,a0 + 300da56: fef407a3 sb a5,-17(s0) + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + &SignalRateFinalRangeLimitCheckEnable); + + if (Status == VL53L0X_ERROR_NONE) { + 300da5a: fef40783 lb a5,-17(s0) + 300da5e: e3cd bnez a5,300db00 + if ((SigmaLimitCheckEnable == 0) || (SigmaLimitflag == 1)) + 300da60: fdb44783 lbu a5,-37(s0) + 300da64: c791 beqz a5,300da70 + 300da66: fed44703 lbu a4,-19(s0) + 300da6a: 4785 li a5,1 + 300da6c: 00f71663 bne a4,a5,300da78 + Temp8 = 1; + 300da70: 4785 li a5,1 + 300da72: fef401a3 sb a5,-29(s0) + 300da76: a019 j 300da7c + else + Temp8 = 0; + 300da78: fe0401a3 sb zero,-29(s0) + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + 300da7c: fbc42783 lw a5,-68(s0) + 300da80: fe344703 lbu a4,-29(s0) + 300da84: 02e78323 sb a4,38(a5) + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, Temp8); + + if ((DeviceRangeStatusInternal == 4) || + 300da88: fe244703 lbu a4,-30(s0) + 300da8c: 4791 li a5,4 + 300da8e: 00f70563 beq a4,a5,300da98 + (SignalRateFinalRangeLimitCheckEnable == 0)) + 300da92: fda44783 lbu a5,-38(s0) + if ((DeviceRangeStatusInternal == 4) || + 300da96: e789 bnez a5,300daa0 + Temp8 = 1; + 300da98: 4785 li a5,1 + 300da9a: fef401a3 sb a5,-29(s0) + 300da9e: a019 j 300daa4 + else + Temp8 = 0; + 300daa0: fe0401a3 sb zero,-29(s0) + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + 300daa4: fbc42783 lw a5,-68(s0) + 300daa8: fe344703 lbu a4,-29(s0) + 300daac: 02e783a3 sb a4,39(a5) + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + Temp8); + + if ((SignalRefClipLimitCheckEnable == 0) || + 300dab0: fd944783 lbu a5,-39(s0) + 300dab4: c791 beqz a5,300dac0 + 300dab6: fec44703 lbu a4,-20(s0) + 300daba: 4785 li a5,1 + 300dabc: 00f71663 bne a4,a5,300dac8 + (SignalRefClipflag == 1)) + Temp8 = 1; + 300dac0: 4785 li a5,1 + 300dac2: fef401a3 sb a5,-29(s0) + 300dac6: a019 j 300dacc + else + Temp8 = 0; + 300dac8: fe0401a3 sb zero,-29(s0) + + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + 300dacc: fbc42783 lw a5,-68(s0) + 300dad0: fe344703 lbu a4,-29(s0) + 300dad4: 02e78423 sb a4,40(a5) + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, Temp8); + + if ((RangeIgnoreThresholdLimitCheckEnable == 0) || + 300dad8: fd844783 lbu a5,-40(s0) + 300dadc: c791 beqz a5,300dae8 + 300dade: feb44703 lbu a4,-21(s0) + 300dae2: 4785 li a5,1 + 300dae4: 00f71663 bne a4,a5,300daf0 + (RangeIgnoreThresholdflag == 1)) + Temp8 = 1; + 300dae8: 4785 li a5,1 + 300daea: fef401a3 sb a5,-29(s0) + 300daee: a019 j 300daf4 + else + Temp8 = 0; + 300daf0: fe0401a3 sb zero,-29(s0) + + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + 300daf4: fbc42783 lw a5,-68(s0) + 300daf8: fe344703 lbu a4,-29(s0) + 300dafc: 02e784a3 sb a4,41(a5) + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + Temp8); + } + + LOG_FUNCTION_END(Status); + return Status; + 300db00: fef40783 lb a5,-17(s0) + +} + 300db04: 853e mv a0,a5 + 300db06: 40f6 lw ra,92(sp) + 300db08: 4466 lw s0,88(sp) + 300db0a: 6125 addi sp,sp,96 + 300db0c: 8082 ret + +0300db0e : + 300db0e: ad9fb06f j 30095e6 + +0300db12 : + 300db12: 989fb06f j 300949a + +0300db16 : + .I2cDevAddr = VL53L0X_IIC_ADDR, /* 上电默认IIC通讯地址ַ*/ +}; + + +static void device_detect(VL53L0X_DEV dev, uint8_t iic_addr) +{ + 300db16: 7179 addi sp,sp,-48 + 300db18: d606 sw ra,44(sp) + 300db1a: d422 sw s0,40(sp) + 300db1c: 1800 addi s0,sp,48 + 300db1e: fca42e23 sw a0,-36(s0) + 300db22: 87ae mv a5,a1 + 300db24: fcf40da3 sb a5,-37(s0) + uint16_t module_id = 0; + 300db28: fe041623 sh zero,-20(s0) + VL53L0X_Error status; + /** + * 获取设备ID,身份鉴别 + * 另外可以相当于一次通讯验证,IIC是否可以正常通讯 + * */ + status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &module_id); + 300db2c: fec40793 addi a5,s0,-20 + 300db30: 863e mv a2,a5 + 300db32: 0c000593 li a1,192 + 300db36: fdc42503 lw a0,-36(s0) + 300db3a: 2ff000ef jal ra,300e638 + 300db3e: 87aa mv a5,a0 + 300db40: fef407a3 sb a5,-17(s0) + DBG_PRINTF("VL53L0X ID: %d,status: %d\r\n",module_id,status); + 300db44: fec45783 lhu a5,-20(s0) + 300db48: 873e mv a4,a5 + 300db4a: fef40783 lb a5,-17(s0) + 300db4e: 863e mv a2,a5 + 300db50: 85ba mv a1,a4 + 300db52: 0300f7b7 lui a5,0x300f + 300db56: 4a478513 addi a0,a5,1188 # 300f4a4 + 300db5a: 223d jal ra,300dc88 + if (module_id != VL53L0X_MODULE_ID) + 300db5c: fec45703 lhu a4,-20(s0) + 300db60: 67bd lui a5,0xf + 300db62: eaa78793 addi a5,a5,-342 # eeaa + 300db66: 00f70863 beq a4,a5,300db76 + { + print_log("VL53L0X Detect Failed!\r\n"); + 300db6a: 0300f7b7 lui a5,0x300f + 300db6e: 4c078513 addi a0,a5,1216 # 300f4c0 + 300db72: 2a19 jal ra,300dc88 + while (1) + 300db74: a001 j 300db74 + /** + * 改变IIC设备地址 + * 如果你想改变IIC设备地址,有多个设备使用时,可用此API + * 上电默认的地址是0x29,可以自己设置IIC地址 + */ + if (iic_addr != dev->I2cDevAddr) + 300db76: fdc42783 lw a5,-36(s0) + 300db7a: 1807c783 lbu a5,384(a5) + 300db7e: fdb44703 lbu a4,-37(s0) + 300db82: 02f70a63 beq a4,a5,300dbb6 + { + VL53L0X_SetDeviceAddress(dev, iic_addr << 1); + 300db86: fdb44783 lbu a5,-37(s0) + 300db8a: 0786 slli a5,a5,0x1 + 300db8c: 9f81 uxtb a5 + 300db8e: 85be mv a1,a5 + 300db90: fdc42503 lw a0,-36(s0) + 300db94: 963fa0ef jal ra,30084f6 + dev->I2cDevAddr = iic_addr; + 300db98: fdc42783 lw a5,-36(s0) + 300db9c: fdb44703 lbu a4,-37(s0) + 300dba0: 18e78023 sb a4,384(a5) + print_log("Change IIC address success! IIC Address: 0x%x\r\n",iic_addr); + 300dba4: fdb44783 lbu a5,-37(s0) + 300dba8: 85be mv a1,a5 + 300dbaa: 0300f7b7 lui a5,0x300f + 300dbae: 4dc78513 addi a0,a5,1244 # 300f4dc + 300dbb2: 28d9 jal ra,300dc88 + }else{ + print_log("Default IIC Address: 0x%x\r\n",iic_addr); + } +} + 300dbb4: a809 j 300dbc6 + print_log("Default IIC Address: 0x%x\r\n",iic_addr); + 300dbb6: fdb44783 lbu a5,-37(s0) + 300dbba: 85be mv a1,a5 + 300dbbc: 0300f7b7 lui a5,0x300f + 300dbc0: 50c78513 addi a0,a5,1292 # 300f50c + 300dbc4: 20d1 jal ra,300dc88 +} + 300dbc6: 0001 nop + 300dbc8: 50b2 lw ra,44(sp) + 300dbca: 5422 lw s0,40(sp) + 300dbcc: 6145 addi sp,sp,48 + 300dbce: 8082 ret + +0300dbd0 : + * 设备配置:效准和初始化 + * 根据手册在测量前有一系列初始化和效准过程,保证测量精度 + + */ +static void device_init(VL53L0X_DEV dev) +{ + 300dbd0: 7179 addi sp,sp,-48 + 300dbd2: d606 sw ra,44(sp) + 300dbd4: d422 sw s0,40(sp) + 300dbd6: 1800 addi s0,sp,48 + 300dbd8: fca42e23 sw a0,-36(s0) + uint8_t vhvsettings; + uint8_t phasecal; + uint32_t refspadcount; + uint8_t isaperturespads; + // 设备初始化 + VL53L0X_DataInit(dev); + 300dbdc: fdc42503 lw a0,-36(s0) + 300dbe0: 955fa0ef jal ra,3008534 + // 加载特殊配置 + VL53L0X_StaticInit(dev); + 300dbe4: fdc42503 lw a0,-36(s0) + 300dbe8: c95fa0ef jal ra,300887c + // Spad(单光子雪崩二极管)效准,用来对返射会的IR光进行测量的 + VL53L0X_PerformRefSpadManagement(dev, &refspadcount, &isaperturespads); + 300dbec: fe740713 addi a4,s0,-25 + 300dbf0: fe840793 addi a5,s0,-24 + 300dbf4: 863a mv a2,a4 + 300dbf6: 85be mv a1,a5 + 300dbf8: fdc42503 lw a0,-36(s0) + 300dbfc: 8ddfc0ef jal ra,300a4d8 + /*温度效准*/ + VL53L0X_PerformRefCalibration(dev, &vhvsettings, &phasecal); + 300dc00: fee40713 addi a4,s0,-18 + 300dc04: fef40793 addi a5,s0,-17 + 300dc08: 863a mv a2,a4 + 300dc0a: 85be mv a1,a5 + 300dc0c: fdc42503 lw a0,-36(s0) + 300dc10: c1ffb0ef jal ra,300982e + * 有三种工作模式 + * 单次测量 0 + * 连续测量 1 + * 连续延时测量 3 + */ + VL53L0X_SetDeviceMode(dev, DEMO_DEVICE_MODE); + 300dc14: 4585 li a1,1 + 300dc16: fdc42503 lw a0,-36(s0) + 300dc1a: 950fb0ef jal ra,3008d6a + * 默认时间是33ms,最小的时间是20ms + * 这个会涉及到准确率,太快,准确率会有所下降 + * 增加测量时间会提高准确率 + * 测量时间增加到2倍,测量的标准差减少到根号2 + */ + VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev, DEMO_BUDGET_TIME); + 300dc1e: 67c1 lui a5,0x10 + 300dc20: 1d078593 addi a1,a5,464 # 101d0 + 300dc24: fdc42503 lw a0,-36(s0) + 300dc28: a06fb0ef jal ra,3008e2e +} + 300dc2c: 0001 nop + 300dc2e: 50b2 lw ra,44(sp) + 300dc30: 5422 lw s0,40(sp) + 300dc32: 6145 addi sp,sp,48 + 300dc34: 8082 ret + +0300dc36 : + +/** + */ +void Vl53l0xInit(void) +{ + 300dc36: 1141 addi sp,sp,-16 + 300dc38: c606 sw ra,12(sp) + 300dc3a: c422 sw s0,8(sp) + 300dc3c: 0800 addi s0,sp,16 + // uint8_t ret; + // VL53L0X_RangingMeasurementData_t data; + + vl53l0x_hw_reset(); //使能,设置 XSHUT引脚为高电平(低电平表示关闭) + 300dc3e: 26f1 jal ra,300e00a + device_detect(&demo_dev, CUSTOM_DEV_IIC_ADDDR); /*首次通讯验证和设备验证*/ + 300dc40: 02900593 li a1,41 + 300dc44: d9418513 addi a0,gp,-620 # 40003c8 + 300dc48: 35f9 jal ra,300db16 + device_init(&demo_dev); /*设备初始化-会设置测试时间(精确相关)和设备工作模式*/ + 300dc4a: d9418513 addi a0,gp,-620 # 40003c8 + 300dc4e: 3749 jal ra,300dbd0 + + print_log("VL53L0X init Succedded!\r\n"); + 300dc50: 0300f7b7 lui a5,0x300f + 300dc54: 52878513 addi a0,a5,1320 # 300f528 + 300dc58: 2805 jal ra,300dc88 + // /*获取测量结果*/ + // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + // /*输出测量结果(单位mm)*/ + // DBG_PRINTF("Distance: %dmm\r\n", data.RangeMilliMeter); + // } +} + 300dc5a: 0001 nop + 300dc5c: 40b2 lw ra,12(sp) + 300dc5e: 4422 lw s0,8(sp) + 300dc60: 0141 addi sp,sp,16 + 300dc62: 8082 ret + +0300dc64 : +// 开始测量 +void Vl53l0xStart(void){ + 300dc64: 1141 addi sp,sp,-16 + 300dc66: c606 sw ra,12(sp) + 300dc68: c422 sw s0,8(sp) + 300dc6a: 0800 addi s0,sp,16 + /*开始测量*/ + VL53L0X_StartMeasurement(&demo_dev); + 300dc6c: d9418513 addi a0,gp,-620 # 40003c8 + 300dc70: e53fb0ef jal ra,3009ac2 + print_log("VL53L0X start ranging!\r\n"); + 300dc74: 0300f7b7 lui a5,0x300f + 300dc78: 54478513 addi a0,a5,1348 # 300f544 + 300dc7c: 2031 jal ra,300dc88 +} + 300dc7e: 0001 nop + 300dc80: 40b2 lw ra,12(sp) + 300dc82: 4422 lw s0,8(sp) + 300dc84: 0141 addi sp,sp,16 + 300dc86: 8082 ret + +0300dc88 : + 300dc88: e69f506f j 3003af0 + +0300dc8c : + /*开始测量*/ + VL53L0X_StopMeasurement(&demo_dev); + print_log("VL53L0X stop ranging!\r\n"); +} +// 获取测量结果 单位mm +unsigned short GetDistance(void){ + 300dc8c: 7179 addi sp,sp,-48 + 300dc8e: d606 sw ra,44(sp) + 300dc90: d422 sw s0,40(sp) + 300dc92: 1800 addi s0,sp,48 + + uint8_t ret = 0; + 300dc94: fe0407a3 sb zero,-17(s0) + VL53L0X_RangingMeasurementData_t data; + /*检查是否完成一次测量*/ + VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + 300dc98: fef40793 addi a5,s0,-17 + 300dc9c: 85be mv a1,a5 + 300dc9e: d9418513 addi a0,gp,-620 # 40003c8 + 300dca2: fedfb0ef jal ra,3009c8e + if(ret==1){ + 300dca6: fef44703 lbu a4,-17(s0) + 300dcaa: 4785 li a5,1 + 300dcac: 00f71c63 bne a4,a5,300dcc4 + /*获取测量结果*/ + VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + 300dcb0: fd040793 addi a5,s0,-48 + 300dcb4: 85be mv a1,a5 + 300dcb6: d9418513 addi a0,gp,-620 # 40003c8 + 300dcba: 874fc0ef jal ra,3009d2e + return data.RangeMilliMeter; + 300dcbe: fd845783 lhu a5,-40(s0) + 300dcc2: a011 j 300dcc6 + } + + return 0; + 300dcc4: 4781 li a5,0 + // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + // } while (ret != 1); + // /*获取测量结果*/ + // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + // return data.RangeMilliMeter; +} + 300dcc6: 853e mv a0,a5 + 300dcc8: 50b2 lw ra,44(sp) + 300dcca: 5422 lw s0,40(sp) + 300dccc: 6145 addi sp,sp,48 + 300dcce: 8082 ret + +0300dcd0 : +// // IIC的延时函数,根据自己的mcu进行替换 +// BASE_FUNC_DELAY_US(t_us); +// } + +void vl53l0x_iic_start(void) +{ + 300dcd0: 1141 addi sp,sp,-16 + 300dcd2: c606 sw ra,12(sp) + 300dcd4: c422 sw s0,8(sp) + 300dcd6: 0800 addi s0,sp,16 + VL53L0X_IIC_SDA(1); + 300dcd8: 4605 li a2,1 + 300dcda: 45c1 li a1,16 + 300dcdc: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dce0: 2e95 jal ra,300e054 + VL53L0X_IIC_SCL(1); + 300dce2: 4605 li a2,1 + 300dce4: 45c1 li a1,16 + 300dce6: 52418513 addi a0,gp,1316 # 4000b58 + 300dcea: 26ad jal ra,300e054 + vl53l0x_iic_delay(2); + 300dcec: 000f47b7 lui a5,0xf4 + 300dcf0: 24078593 addi a1,a5,576 # f4240 + 300dcf4: 4509 li a0,2 + 300dcf6: 2ea9 jal ra,300e050 + VL53L0X_IIC_SDA(0); + 300dcf8: 4601 li a2,0 + 300dcfa: 45c1 li a1,16 + 300dcfc: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd00: 2e91 jal ra,300e054 + vl53l0x_iic_delay(2); + 300dd02: 000f47b7 lui a5,0xf4 + 300dd06: 24078593 addi a1,a5,576 # f4240 + 300dd0a: 4509 li a0,2 + 300dd0c: 2691 jal ra,300e050 + VL53L0X_IIC_SCL(0); + 300dd0e: 4601 li a2,0 + 300dd10: 45c1 li a1,16 + 300dd12: 52418513 addi a0,gp,1316 # 4000b58 + 300dd16: 2e3d jal ra,300e054 +} + 300dd18: 0001 nop + 300dd1a: 40b2 lw ra,12(sp) + 300dd1c: 4422 lw s0,8(sp) + 300dd1e: 0141 addi sp,sp,16 + 300dd20: 8082 ret + +0300dd22 : + +void vl53l0x_iic_stop(void) +{ + 300dd22: 1141 addi sp,sp,-16 + 300dd24: c606 sw ra,12(sp) + 300dd26: c422 sw s0,8(sp) + 300dd28: 0800 addi s0,sp,16 + VL53L0X_IIC_SCL(0); + 300dd2a: 4601 li a2,0 + 300dd2c: 45c1 li a1,16 + 300dd2e: 52418513 addi a0,gp,1316 # 4000b58 + 300dd32: 260d jal ra,300e054 + VL53L0X_IIC_SDA(0); + 300dd34: 4601 li a2,0 + 300dd36: 45c1 li a1,16 + 300dd38: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd3c: 2e21 jal ra,300e054 + vl53l0x_iic_delay(2); + 300dd3e: 000f47b7 lui a5,0xf4 + 300dd42: 24078593 addi a1,a5,576 # f4240 + 300dd46: 4509 li a0,2 + 300dd48: 2621 jal ra,300e050 + VL53L0X_IIC_SCL(1); + 300dd4a: 4605 li a2,1 + 300dd4c: 45c1 li a1,16 + 300dd4e: 52418513 addi a0,gp,1316 # 4000b58 + 300dd52: 2609 jal ra,300e054 + vl53l0x_iic_delay(1); + 300dd54: 000f47b7 lui a5,0xf4 + 300dd58: 24078593 addi a1,a5,576 # f4240 + 300dd5c: 4505 li a0,1 + 300dd5e: 2ccd jal ra,300e050 + VL53L0X_IIC_SDA(1); + 300dd60: 4605 li a2,1 + 300dd62: 45c1 li a1,16 + 300dd64: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd68: 24f5 jal ra,300e054 + vl53l0x_iic_delay(4); + 300dd6a: 000f47b7 lui a5,0xf4 + 300dd6e: 24078593 addi a1,a5,576 # f4240 + 300dd72: 4511 li a0,4 + 300dd74: 2cf1 jal ra,300e050 +} + 300dd76: 0001 nop + 300dd78: 40b2 lw ra,12(sp) + 300dd7a: 4422 lw s0,8(sp) + 300dd7c: 0141 addi sp,sp,16 + 300dd7e: 8082 ret + +0300dd80 : + +uint8_t vl53l0x_iic_wait_ack(void) +{ + 300dd80: 1101 addi sp,sp,-32 + 300dd82: ce06 sw ra,28(sp) + 300dd84: cc22 sw s0,24(sp) + 300dd86: 1000 addi s0,sp,32 + uint8_t waittime = 0; + 300dd88: fe0407a3 sb zero,-17(s0) + uint8_t rack = 0; + 300dd8c: fe040723 sb zero,-18(s0) + VL53L0X_SDA_Direction(1); + 300dd90: 4601 li a2,0 + 300dd92: 45c1 li a1,16 + 300dd94: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dd98: 24bd jal ra,300e006 + VL53L0X_IIC_SDA(1); + 300dd9a: 4605 li a2,1 + 300dd9c: 45c1 li a1,16 + 300dd9e: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dda2: 2c4d jal ra,300e054 + vl53l0x_iic_delay(1); + 300dda4: 000f47b7 lui a5,0xf4 + 300dda8: 24078593 addi a1,a5,576 # f4240 + 300ddac: 4505 li a0,1 + 300ddae: 244d jal ra,300e050 + VL53L0X_IIC_SCL(1); + 300ddb0: 4605 li a2,1 + 300ddb2: 45c1 li a1,16 + 300ddb4: 52418513 addi a0,gp,1316 # 4000b58 + 300ddb8: 2c71 jal ra,300e054 + vl53l0x_iic_delay(1); + 300ddba: 000f47b7 lui a5,0xf4 + 300ddbe: 24078593 addi a1,a5,576 # f4240 + 300ddc2: 4505 li a0,1 + 300ddc4: 2471 jal ra,300e050 + + while (VL53L0X_IIC_READ_SDA()) + 300ddc6: a025 j 300ddee + { + waittime++; + 300ddc8: fef44783 lbu a5,-17(s0) + 300ddcc: 0785 addi a5,a5,1 + 300ddce: fef407a3 sb a5,-17(s0) + + if (waittime > 250) + 300ddd2: fef44703 lbu a4,-17(s0) + 300ddd6: 0fa00793 li a5,250 + 300ddda: 00e7fa63 bgeu a5,a4,300ddee + { + VL53L0X_SDA_Direction(0); + 300ddde: 4605 li a2,1 + 300dde0: 45c1 li a1,16 + 300dde2: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dde6: 2405 jal ra,300e006 + vl53l0x_iic_stop(); + 300dde8: 3f2d jal ra,300dd22 + return 1; + 300ddea: 4785 li a5,1 + 300ddec: a025 j 300de14 + while (VL53L0X_IIC_READ_SDA()) + 300ddee: 45c1 li a1,16 + 300ddf0: 56c18513 addi a0,gp,1388 # 4000ba0 + 300ddf4: ebef60ef jal ra,30044b2 + 300ddf8: 87aa mv a5,a0 + 300ddfa: f7f9 bnez a5,300ddc8 + } + } + VL53L0X_SDA_Direction(0); + 300ddfc: 4605 li a2,1 + 300ddfe: 45c1 li a1,16 + 300de00: 56c18513 addi a0,gp,1388 # 4000ba0 + 300de04: 2409 jal ra,300e006 + VL53L0X_IIC_SCL(0); + 300de06: 4601 li a2,0 + 300de08: 45c1 li a1,16 + 300de0a: 52418513 addi a0,gp,1316 # 4000b58 + 300de0e: 2499 jal ra,300e054 + + return rack; + 300de10: fee44783 lbu a5,-18(s0) +} + 300de14: 853e mv a0,a5 + 300de16: 40f2 lw ra,28(sp) + 300de18: 4462 lw s0,24(sp) + 300de1a: 6105 addi sp,sp,32 + 300de1c: 8082 ret + +0300de1e : + +void vl53l0x_iic_ack(void) +{ + 300de1e: 1141 addi sp,sp,-16 + 300de20: c606 sw ra,12(sp) + 300de22: c422 sw s0,8(sp) + 300de24: 0800 addi s0,sp,16 + VL53L0X_IIC_SCL(0); + 300de26: 4601 li a2,0 + 300de28: 45c1 li a1,16 + 300de2a: 52418513 addi a0,gp,1316 # 4000b58 + 300de2e: 241d jal ra,300e054 + VL53L0X_IIC_SDA(0); + 300de30: 4601 li a2,0 + 300de32: 45c1 li a1,16 + 300de34: 56c18513 addi a0,gp,1388 # 4000ba0 + 300de38: 2c31 jal ra,300e054 + vl53l0x_iic_delay(2); + 300de3a: 000f47b7 lui a5,0xf4 + 300de3e: 24078593 addi a1,a5,576 # f4240 + 300de42: 4509 li a0,2 + 300de44: 2431 jal ra,300e050 + VL53L0X_IIC_SCL(1); + 300de46: 4605 li a2,1 + 300de48: 45c1 li a1,16 + 300de4a: 52418513 addi a0,gp,1316 # 4000b58 + 300de4e: 2419 jal ra,300e054 + vl53l0x_iic_delay(2); + 300de50: 000f47b7 lui a5,0xf4 + 300de54: 24078593 addi a1,a5,576 # f4240 + 300de58: 4509 li a0,2 + 300de5a: 2add jal ra,300e050 + VL53L0X_IIC_SCL(0); + 300de5c: 4601 li a2,0 + 300de5e: 45c1 li a1,16 + 300de60: 52418513 addi a0,gp,1316 # 4000b58 + 300de64: 2ac5 jal ra,300e054 +} + 300de66: 0001 nop + 300de68: 40b2 lw ra,12(sp) + 300de6a: 4422 lw s0,8(sp) + 300de6c: 0141 addi sp,sp,16 + 300de6e: 8082 ret + +0300de70 : + +void vl53l0x_iic_nack(void) +{ + 300de70: 1141 addi sp,sp,-16 + 300de72: c606 sw ra,12(sp) + 300de74: c422 sw s0,8(sp) + 300de76: 0800 addi s0,sp,16 + VL53L0X_IIC_SCL(0); + 300de78: 4601 li a2,0 + 300de7a: 45c1 li a1,16 + 300de7c: 52418513 addi a0,gp,1316 # 4000b58 + 300de80: 2ad1 jal ra,300e054 + VL53L0X_IIC_SDA(1); + 300de82: 4605 li a2,1 + 300de84: 45c1 li a1,16 + 300de86: 56c18513 addi a0,gp,1388 # 4000ba0 + 300de8a: 22e9 jal ra,300e054 + vl53l0x_iic_delay(2); + 300de8c: 000f47b7 lui a5,0xf4 + 300de90: 24078593 addi a1,a5,576 # f4240 + 300de94: 4509 li a0,2 + 300de96: 2a6d jal ra,300e050 + VL53L0X_IIC_SCL(1); + 300de98: 4605 li a2,1 + 300de9a: 45c1 li a1,16 + 300de9c: 52418513 addi a0,gp,1316 # 4000b58 + 300dea0: 2a55 jal ra,300e054 + vl53l0x_iic_delay(2); + 300dea2: 000f47b7 lui a5,0xf4 + 300dea6: 24078593 addi a1,a5,576 # f4240 + 300deaa: 4509 li a0,2 + 300deac: 2255 jal ra,300e050 + VL53L0X_IIC_SCL(0); + 300deae: 4601 li a2,0 + 300deb0: 45c1 li a1,16 + 300deb2: 52418513 addi a0,gp,1316 # 4000b58 + 300deb6: 2a79 jal ra,300e054 +} + 300deb8: 0001 nop + 300deba: 40b2 lw ra,12(sp) + 300debc: 4422 lw s0,8(sp) + 300debe: 0141 addi sp,sp,16 + 300dec0: 8082 ret + +0300dec2 : + +void vl53l0x_iic_send_byte(uint8_t dat) +{ + 300dec2: 7179 addi sp,sp,-48 + 300dec4: d606 sw ra,44(sp) + 300dec6: d422 sw s0,40(sp) + 300dec8: 1800 addi s0,sp,48 + 300deca: 87aa mv a5,a0 + 300decc: fcf40fa3 sb a5,-33(s0) + uint8_t t; + VL53L0X_IIC_SCL(0); + 300ded0: 4601 li a2,0 + 300ded2: 45c1 li a1,16 + 300ded4: 52418513 addi a0,gp,1316 # 4000b58 + 300ded8: 2ab5 jal ra,300e054 + for (t=0; t<8; t++) + 300deda: fe0407a3 sb zero,-17(s0) + 300dede: a0b5 j 300df4a + { + VL53L0X_IIC_SDA((dat & 0x80) >> 7); + 300dee0: fdf40783 lb a5,-33(s0) + 300dee4: 0007d863 bgez a5,300def4 + 300dee8: 4605 li a2,1 + 300deea: 45c1 li a1,16 + 300deec: 56c18513 addi a0,gp,1388 # 4000ba0 + 300def0: 2295 jal ra,300e054 + 300def2: a031 j 300defe + 300def4: 4601 li a2,0 + 300def6: 45c1 li a1,16 + 300def8: 56c18513 addi a0,gp,1388 # 4000ba0 + 300defc: 2aa1 jal ra,300e054 + dat <<= 1; + 300defe: fdf44783 lbu a5,-33(s0) + 300df02: 0786 slli a5,a5,0x1 + 300df04: fcf40fa3 sb a5,-33(s0) + vl53l0x_iic_delay(2); + 300df08: 000f47b7 lui a5,0xf4 + 300df0c: 24078593 addi a1,a5,576 # f4240 + 300df10: 4509 li a0,2 + 300df12: 2a3d jal ra,300e050 + VL53L0X_IIC_SCL(1); + 300df14: 4605 li a2,1 + 300df16: 45c1 li a1,16 + 300df18: 52418513 addi a0,gp,1316 # 4000b58 + 300df1c: 2a25 jal ra,300e054 + vl53l0x_iic_delay(2); + 300df1e: 000f47b7 lui a5,0xf4 + 300df22: 24078593 addi a1,a5,576 # f4240 + 300df26: 4509 li a0,2 + 300df28: 2225 jal ra,300e050 + VL53L0X_IIC_SCL(0); + 300df2a: 4601 li a2,0 + 300df2c: 45c1 li a1,16 + 300df2e: 52418513 addi a0,gp,1316 # 4000b58 + 300df32: 220d jal ra,300e054 + vl53l0x_iic_delay(2); + 300df34: 000f47b7 lui a5,0xf4 + 300df38: 24078593 addi a1,a5,576 # f4240 + 300df3c: 4509 li a0,2 + 300df3e: 2a09 jal ra,300e050 + for (t=0; t<8; t++) + 300df40: fef44783 lbu a5,-17(s0) + 300df44: 0785 addi a5,a5,1 + 300df46: fef407a3 sb a5,-17(s0) + 300df4a: fef44703 lbu a4,-17(s0) + 300df4e: 479d li a5,7 + 300df50: f8e7f8e3 bgeu a5,a4,300dee0 + + } + +} + 300df54: 0001 nop + 300df56: 50b2 lw ra,44(sp) + 300df58: 5422 lw s0,40(sp) + 300df5a: 6145 addi sp,sp,48 + 300df5c: 8082 ret + +0300df5e : + +uint8_t vl53l0x_iic_read_byte(uint8_t ack) +{ + 300df5e: 7179 addi sp,sp,-48 + 300df60: d606 sw ra,44(sp) + 300df62: d422 sw s0,40(sp) + 300df64: 1800 addi s0,sp,48 + 300df66: 87aa mv a5,a0 + 300df68: fcf40fa3 sb a5,-33(s0) + uint8_t i; + uint8_t dat = 0; + 300df6c: fe040723 sb zero,-18(s0) + VL53L0X_SDA_Direction(1); + 300df70: 4601 li a2,0 + 300df72: 45c1 li a1,16 + 300df74: 56c18513 addi a0,gp,1388 # 4000ba0 + 300df78: 2079 jal ra,300e006 + for (i = 0; i < 8; i++ ) + 300df7a: fe0407a3 sb zero,-17(s0) + 300df7e: a8a9 j 300dfd8 + { + VL53L0X_IIC_SCL(0); + 300df80: 4601 li a2,0 + 300df82: 45c1 li a1,16 + 300df84: 52418513 addi a0,gp,1316 # 4000b58 + 300df88: 20f1 jal ra,300e054 + vl53l0x_iic_delay(2); + 300df8a: 000f47b7 lui a5,0xf4 + 300df8e: 24078593 addi a1,a5,576 # f4240 + 300df92: 4509 li a0,2 + 300df94: 2875 jal ra,300e050 + VL53L0X_IIC_SCL(1); + 300df96: 4605 li a2,1 + 300df98: 45c1 li a1,16 + 300df9a: 52418513 addi a0,gp,1316 # 4000b58 + 300df9e: 285d jal ra,300e054 + dat <<= 1; + 300dfa0: fee44783 lbu a5,-18(s0) + 300dfa4: 0786 slli a5,a5,0x1 + 300dfa6: fef40723 sb a5,-18(s0) + + if (VL53L0X_IIC_READ_SDA()) + 300dfaa: 45c1 li a1,16 + 300dfac: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dfb0: d02f60ef jal ra,30044b2 + 300dfb4: 87aa mv a5,a0 + 300dfb6: c791 beqz a5,300dfc2 + { + dat++; + 300dfb8: fee44783 lbu a5,-18(s0) + 300dfbc: 0785 addi a5,a5,1 + 300dfbe: fef40723 sb a5,-18(s0) + } + vl53l0x_iic_delay(2); + 300dfc2: 000f47b7 lui a5,0xf4 + 300dfc6: 24078593 addi a1,a5,576 # f4240 + 300dfca: 4509 li a0,2 + 300dfcc: 2051 jal ra,300e050 + for (i = 0; i < 8; i++ ) + 300dfce: fef44783 lbu a5,-17(s0) + 300dfd2: 0785 addi a5,a5,1 + 300dfd4: fef407a3 sb a5,-17(s0) + 300dfd8: fef44703 lbu a4,-17(s0) + 300dfdc: 479d li a5,7 + 300dfde: fae7f1e3 bgeu a5,a4,300df80 + } + VL53L0X_SDA_Direction(0); + 300dfe2: 4605 li a2,1 + 300dfe4: 45c1 li a1,16 + 300dfe6: 56c18513 addi a0,gp,1388 # 4000ba0 + 300dfea: 2831 jal ra,300e006 + if (ack == 0) + 300dfec: fdf44783 lbu a5,-33(s0) + 300dff0: e399 bnez a5,300dff6 + { + vl53l0x_iic_nack(); + 300dff2: 3dbd jal ra,300de70 + 300dff4: a011 j 300dff8 + } + else + { + vl53l0x_iic_ack(); + 300dff6: 3525 jal ra,300de1e + } + + return dat; + 300dff8: fee44783 lbu a5,-18(s0) +} + 300dffc: 853e mv a0,a5 + 300dffe: 50b2 lw ra,44(sp) + 300e000: 5422 lw s0,40(sp) + 300e002: 6145 addi sp,sp,48 + 300e004: 8082 ret + +0300e006 : + 300e006: ad6f606f j 30042dc + +0300e00a : + +/** + * VL53L0X 硬件复位,通过引脚设置关机再开机实现复位 + */ +void vl53l0x_hw_reset(void) +{ + 300e00a: 1141 addi sp,sp,-16 + 300e00c: c606 sw ra,12(sp) + 300e00e: c422 sw s0,8(sp) + 300e010: 0800 addi s0,sp,16 + // 复位引脚,考虑要不要接吧 改变引脚电平实现复位,0 到1 复位 + VL53L0X_XSH(0); + 300e012: 4601 li a2,0 + 300e014: 4591 li a1,4 + 300e016: 4dc18513 addi a0,gp,1244 # 4000b10 + 300e01a: 282d jal ra,300e054 + vl53l0x_iic_delay(30*1000) ;//延时30ms + 300e01c: 000f47b7 lui a5,0xf4 + 300e020: 24078593 addi a1,a5,576 # f4240 + 300e024: 679d lui a5,0x7 + 300e026: 53078513 addi a0,a5,1328 # 7530 + 300e02a: 201d jal ra,300e050 + VL53L0X_XSH(1); + 300e02c: 4605 li a2,1 + 300e02e: 4591 li a1,4 + 300e030: 4dc18513 addi a0,gp,1244 # 4000b10 + 300e034: 2005 jal ra,300e054 + vl53l0x_iic_delay(30*1000) ; + 300e036: 000f47b7 lui a5,0xf4 + 300e03a: 24078593 addi a1,a5,576 # f4240 + 300e03e: 679d lui a5,0x7 + 300e040: 53078513 addi a0,a5,1328 # 7530 + 300e044: 2031 jal ra,300e050 +} + 300e046: 0001 nop + 300e048: 40b2 lw ra,12(sp) + 300e04a: 4422 lw s0,8(sp) + 300e04c: 0141 addi sp,sp,16 + 300e04e: 8082 ret + +0300e050 : + 300e050: a94f306f j 30012e4 + +0300e054 : + 300e054: b70f606f j 30043c4 + +0300e058 : + +// return status; +// } + +int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count) +{ + 300e058: 7179 addi sp,sp,-48 + 300e05a: d606 sw ra,44(sp) + 300e05c: d422 sw s0,40(sp) + 300e05e: 1800 addi s0,sp,48 + 300e060: 87aa mv a5,a0 + 300e062: 872e mv a4,a1 + 300e064: fcc42c23 sw a2,-40(s0) + 300e068: fcd42a23 sw a3,-44(s0) + 300e06c: fcf40fa3 sb a5,-33(s0) + 300e070: 87ba mv a5,a4 + 300e072: fcf40f23 sb a5,-34(s0) + int32_t status = STATUS_OK; + 300e076: fe042423 sw zero,-24(s0) + + int32_t i; + + vl53l0x_iic_start(); + 300e07a: 3999 jal ra,300dcd0 + vl53l0x_iic_send_byte((address << 1) | 0); + 300e07c: fdf44783 lbu a5,-33(s0) + 300e080: 0786 slli a5,a5,0x1 + 300e082: 9f81 uxtb a5 + 300e084: 853e mv a0,a5 + 300e086: 3d35 jal ra,300dec2 + if (vl53l0x_iic_wait_ack() == 1) + 300e088: 39e5 jal ra,300dd80 + 300e08a: 87aa mv a5,a0 + 300e08c: 873e mv a4,a5 + 300e08e: 4785 li a5,1 + 300e090: 00f71563 bne a4,a5,300e09a + { + vl53l0x_iic_stop(); + 300e094: 3179 jal ra,300dd22 + return STATUS_FAIL; + 300e096: 4785 li a5,1 + 300e098: a085 j 300e0f8 + } + vl53l0x_iic_send_byte(index); + 300e09a: fde44783 lbu a5,-34(s0) + 300e09e: 853e mv a0,a5 + 300e0a0: 350d jal ra,300dec2 + if (vl53l0x_iic_wait_ack() == 1) + 300e0a2: 39f9 jal ra,300dd80 + 300e0a4: 87aa mv a5,a0 + 300e0a6: 873e mv a4,a5 + 300e0a8: 4785 li a5,1 + 300e0aa: 00f71563 bne a4,a5,300e0b4 + { + vl53l0x_iic_stop(); + 300e0ae: 3995 jal ra,300dd22 + return STATUS_FAIL; + 300e0b0: 4785 li a5,1 + 300e0b2: a099 j 300e0f8 + } + for (i=0; i + { + vl53l0x_iic_send_byte(pdata[i]); + 300e0ba: fec42783 lw a5,-20(s0) + 300e0be: fd842703 lw a4,-40(s0) + 300e0c2: 97ba add a5,a5,a4 + 300e0c4: 239c lbu a5,0(a5) + 300e0c6: 853e mv a0,a5 + 300e0c8: 3bed jal ra,300dec2 + if (vl53l0x_iic_wait_ack() == 1) + 300e0ca: 395d jal ra,300dd80 + 300e0cc: 87aa mv a5,a0 + 300e0ce: 873e mv a4,a5 + 300e0d0: 4785 li a5,1 + 300e0d2: 00f71563 bne a4,a5,300e0dc + { + vl53l0x_iic_stop(); + 300e0d6: 31b1 jal ra,300dd22 + return STATUS_FAIL; + 300e0d8: 4785 li a5,1 + 300e0da: a839 j 300e0f8 + for (i=0; i + } + } + vl53l0x_iic_stop(); + 300e0f2: 3905 jal ra,300dd22 + + return status; + 300e0f4: fe842783 lw a5,-24(s0) +} + 300e0f8: 853e mv a0,a5 + 300e0fa: 50b2 lw ra,44(sp) + 300e0fc: 5422 lw s0,40(sp) + 300e0fe: 6145 addi sp,sp,48 + 300e100: 8082 ret + +0300e102 : + +int32_t VL53L0X_read_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count) +{ + 300e102: 7179 addi sp,sp,-48 + 300e104: d606 sw ra,44(sp) + 300e106: d422 sw s0,40(sp) + 300e108: 1800 addi s0,sp,48 + 300e10a: 87aa mv a5,a0 + 300e10c: 872e mv a4,a1 + 300e10e: fcc42c23 sw a2,-40(s0) + 300e112: fcd42a23 sw a3,-44(s0) + 300e116: fcf40fa3 sb a5,-33(s0) + 300e11a: 87ba mv a5,a4 + 300e11c: fcf40f23 sb a5,-34(s0) + int32_t status = STATUS_OK; + 300e120: fe042623 sw zero,-20(s0) + + vl53l0x_iic_start(); + 300e124: 3675 jal ra,300dcd0 + vl53l0x_iic_send_byte((address << 1) | 0); + 300e126: fdf44783 lbu a5,-33(s0) + 300e12a: 0786 slli a5,a5,0x1 + 300e12c: 9f81 uxtb a5 + 300e12e: 853e mv a0,a5 + 300e130: 3b49 jal ra,300dec2 + if (vl53l0x_iic_wait_ack() == 1) + 300e132: 31b9 jal ra,300dd80 + 300e134: 87aa mv a5,a0 + 300e136: 873e mv a4,a5 + 300e138: 4785 li a5,1 + 300e13a: 00f71563 bne a4,a5,300e144 + { + vl53l0x_iic_stop(); + 300e13e: 36d5 jal ra,300dd22 + return STATUS_FAIL; + 300e140: 4785 li a5,1 + 300e142: a059 j 300e1c8 + } + vl53l0x_iic_send_byte(index); + 300e144: fde44783 lbu a5,-34(s0) + 300e148: 853e mv a0,a5 + 300e14a: 3ba5 jal ra,300dec2 + if (vl53l0x_iic_wait_ack() == 1) + 300e14c: 3915 jal ra,300dd80 + 300e14e: 87aa mv a5,a0 + 300e150: 873e mv a4,a5 + 300e152: 4785 li a5,1 + 300e154: 00f71563 bne a4,a5,300e15e + { + vl53l0x_iic_stop(); + 300e158: 36e9 jal ra,300dd22 + return STATUS_FAIL; + 300e15a: 4785 li a5,1 + 300e15c: a0b5 j 300e1c8 + } + vl53l0x_iic_stop(); + 300e15e: 36d1 jal ra,300dd22 + vl53l0x_iic_start(); + 300e160: 3e85 jal ra,300dcd0 + vl53l0x_iic_send_byte((address << 1) | 1); + 300e162: fdf44783 lbu a5,-33(s0) + 300e166: 0786 slli a5,a5,0x1 + 300e168: 07e2 slli a5,a5,0x18 + 300e16a: 87e1 srai a5,a5,0x18 + 300e16c: 0017e793 ori a5,a5,1 + 300e170: 07e2 slli a5,a5,0x18 + 300e172: 87e1 srai a5,a5,0x18 + 300e174: 9f81 uxtb a5 + 300e176: 853e mv a0,a5 + 300e178: 33a9 jal ra,300dec2 + if (vl53l0x_iic_wait_ack() == 1) + 300e17a: 3119 jal ra,300dd80 + 300e17c: 87aa mv a5,a0 + 300e17e: 873e mv a4,a5 + 300e180: 4785 li a5,1 + 300e182: 02f71d63 bne a4,a5,300e1bc + { + vl53l0x_iic_stop(); + 300e186: 3e71 jal ra,300dd22 + return STATUS_FAIL; + 300e188: 4785 li a5,1 + 300e18a: a83d j 300e1c8 + } + while (count) + { + *pdata = vl53l0x_iic_read_byte((count > 1) ? 1 : 0); + 300e18c: fd442783 lw a5,-44(s0) + 300e190: 0027a793 slti a5,a5,2 + 300e194: 0017c793 xori a5,a5,1 + 300e198: 9f81 uxtb a5 + 300e19a: 853e mv a0,a5 + 300e19c: 33c9 jal ra,300df5e + 300e19e: 87aa mv a5,a0 + 300e1a0: 873e mv a4,a5 + 300e1a2: fd842783 lw a5,-40(s0) + 300e1a6: a398 sb a4,0(a5) + count--; + 300e1a8: fd442783 lw a5,-44(s0) + 300e1ac: 17fd addi a5,a5,-1 + 300e1ae: fcf42a23 sw a5,-44(s0) + pdata++; + 300e1b2: fd842783 lw a5,-40(s0) + 300e1b6: 0785 addi a5,a5,1 + 300e1b8: fcf42c23 sw a5,-40(s0) + while (count) + 300e1bc: fd442783 lw a5,-44(s0) + 300e1c0: f7f1 bnez a5,300e18c + } + vl53l0x_iic_stop(); + 300e1c2: 3685 jal ra,300dd22 + + + return status; + 300e1c4: fec42783 lw a5,-20(s0) +} + 300e1c8: 853e mv a0,a5 + 300e1ca: 50b2 lw ra,44(sp) + 300e1cc: 5422 lw s0,40(sp) + 300e1ce: 6145 addi sp,sp,48 + 300e1d0: 8082 ret + +0300e1d2 : + + +int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data) +{ + 300e1d2: 7179 addi sp,sp,-48 + 300e1d4: d606 sw ra,44(sp) + 300e1d6: d422 sw s0,40(sp) + 300e1d8: 1800 addi s0,sp,48 + 300e1da: 87aa mv a5,a0 + 300e1dc: 86ae mv a3,a1 + 300e1de: 8732 mv a4,a2 + 300e1e0: fcf40fa3 sb a5,-33(s0) + 300e1e4: 87b6 mv a5,a3 + 300e1e6: fcf40f23 sb a5,-34(s0) + 300e1ea: 87ba mv a5,a4 + 300e1ec: fcf40ea3 sb a5,-35(s0) + int32_t status = STATUS_OK; + 300e1f0: fe042623 sw zero,-20(s0) + const int32_t cbyte_count = 1; + 300e1f4: 4785 li a5,1 + 300e1f6: fef42423 sw a5,-24(s0) + + status = VL53L0X_write_multi(address, index, &data, cbyte_count); + 300e1fa: fdd40613 addi a2,s0,-35 + 300e1fe: fde44703 lbu a4,-34(s0) + 300e202: fdf44783 lbu a5,-33(s0) + 300e206: fe842683 lw a3,-24(s0) + 300e20a: 85ba mv a1,a4 + 300e20c: 853e mv a0,a5 + 300e20e: 35a9 jal ra,300e058 + 300e210: fea42623 sw a0,-20(s0) + + return status; + 300e214: fec42783 lw a5,-20(s0) + +} + 300e218: 853e mv a0,a5 + 300e21a: 50b2 lw ra,44(sp) + 300e21c: 5422 lw s0,40(sp) + 300e21e: 6145 addi sp,sp,48 + 300e220: 8082 ret + +0300e222 : + + +int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data) +{ + 300e222: 7179 addi sp,sp,-48 + 300e224: d606 sw ra,44(sp) + 300e226: d422 sw s0,40(sp) + 300e228: 1800 addi s0,sp,48 + 300e22a: 87aa mv a5,a0 + 300e22c: 86ae mv a3,a1 + 300e22e: 8732 mv a4,a2 + 300e230: fcf40fa3 sb a5,-33(s0) + 300e234: 87b6 mv a5,a3 + 300e236: fcf40f23 sb a5,-34(s0) + 300e23a: 87ba mv a5,a4 + 300e23c: fcf41e23 sh a5,-36(s0) + int32_t status = STATUS_OK; + 300e240: fe042623 sw zero,-20(s0) + + uint8_t buffer[BYTES_PER_WORD]; + + // Split 16-bit word into MS and LS uint8_t + buffer[0] = (uint8_t)(data >> 8); + 300e244: fdc45783 lhu a5,-36(s0) + 300e248: 83a1 srli a5,a5,0x8 + 300e24a: 9fa1 uxth a5 + 300e24c: 9f81 uxtb a5 + 300e24e: fef40423 sb a5,-24(s0) + buffer[1] = (uint8_t)(data & 0x00FF); + 300e252: fdc45783 lhu a5,-36(s0) + 300e256: 9f81 uxtb a5 + 300e258: fef404a3 sb a5,-23(s0) + + status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_WORD); + 300e25c: fe840613 addi a2,s0,-24 + 300e260: fde44703 lbu a4,-34(s0) + 300e264: fdf44783 lbu a5,-33(s0) + 300e268: 4689 li a3,2 + 300e26a: 85ba mv a1,a4 + 300e26c: 853e mv a0,a5 + 300e26e: 33ed jal ra,300e058 + 300e270: fea42623 sw a0,-20(s0) + + return status; + 300e274: fec42783 lw a5,-20(s0) + +} + 300e278: 853e mv a0,a5 + 300e27a: 50b2 lw ra,44(sp) + 300e27c: 5422 lw s0,40(sp) + 300e27e: 6145 addi sp,sp,48 + 300e280: 8082 ret + +0300e282 : + +} + + +int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata) +{ + 300e282: 7179 addi sp,sp,-48 + 300e284: d606 sw ra,44(sp) + 300e286: d422 sw s0,40(sp) + 300e288: 1800 addi s0,sp,48 + 300e28a: 87aa mv a5,a0 + 300e28c: 872e mv a4,a1 + 300e28e: fcc42c23 sw a2,-40(s0) + 300e292: fcf40fa3 sb a5,-33(s0) + 300e296: 87ba mv a5,a4 + 300e298: fcf40f23 sb a5,-34(s0) + int32_t status = STATUS_OK; + 300e29c: fe042623 sw zero,-20(s0) + int32_t cbyte_count = 1; + 300e2a0: 4785 li a5,1 + 300e2a2: fef42423 sw a5,-24(s0) + + status = VL53L0X_read_multi(address, index, pdata, cbyte_count); + 300e2a6: fde44703 lbu a4,-34(s0) + 300e2aa: fdf44783 lbu a5,-33(s0) + 300e2ae: fe842683 lw a3,-24(s0) + 300e2b2: fd842603 lw a2,-40(s0) + 300e2b6: 85ba mv a1,a4 + 300e2b8: 853e mv a0,a5 + 300e2ba: 35a1 jal ra,300e102 + 300e2bc: fea42623 sw a0,-20(s0) + + return status; + 300e2c0: fec42783 lw a5,-20(s0) + +} + 300e2c4: 853e mv a0,a5 + 300e2c6: 50b2 lw ra,44(sp) + 300e2c8: 5422 lw s0,40(sp) + 300e2ca: 6145 addi sp,sp,48 + 300e2cc: 8082 ret + +0300e2ce : + + +int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata) +{ + 300e2ce: 7179 addi sp,sp,-48 + 300e2d0: d606 sw ra,44(sp) + 300e2d2: d422 sw s0,40(sp) + 300e2d4: 1800 addi s0,sp,48 + 300e2d6: 87aa mv a5,a0 + 300e2d8: 872e mv a4,a1 + 300e2da: fcc42c23 sw a2,-40(s0) + 300e2de: fcf40fa3 sb a5,-33(s0) + 300e2e2: 87ba mv a5,a4 + 300e2e4: fcf40f23 sb a5,-34(s0) + int32_t status = STATUS_OK; + 300e2e8: fe042623 sw zero,-20(s0) + uint8_t buffer[BYTES_PER_WORD] = {0}; + 300e2ec: fe041423 sh zero,-24(s0) + + status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_WORD); + 300e2f0: fe840613 addi a2,s0,-24 + 300e2f4: fde44703 lbu a4,-34(s0) + 300e2f8: fdf44783 lbu a5,-33(s0) + 300e2fc: 4689 li a3,2 + 300e2fe: 85ba mv a1,a4 + 300e300: 853e mv a0,a5 + 300e302: 3501 jal ra,300e102 + 300e304: fea42623 sw a0,-20(s0) + // DBG_PRINTF("status: %d\r\n",status); + *pdata = ((uint16_t)buffer[0]<<8) + (uint16_t)buffer[1]; + 300e308: fe844783 lbu a5,-24(s0) + 300e30c: 9fa1 uxth a5 + 300e30e: 07a2 slli a5,a5,0x8 + 300e310: 01079713 slli a4,a5,0x10 + 300e314: 8341 srli a4,a4,0x10 + 300e316: fe944783 lbu a5,-23(s0) + 300e31a: 9fa1 uxth a5 + 300e31c: 97ba add a5,a5,a4 + 300e31e: 01079713 slli a4,a5,0x10 + 300e322: 8341 srli a4,a4,0x10 + 300e324: fd842783 lw a5,-40(s0) + 300e328: a39a sh a4,0(a5) + + return status; + 300e32a: fec42783 lw a5,-20(s0) + +} + 300e32e: 853e mv a0,a5 + 300e330: 50b2 lw ra,44(sp) + 300e332: 5422 lw s0,40(sp) + 300e334: 6145 addi sp,sp,48 + 300e336: 8082 ret + +0300e338 : + +int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata) +{ + 300e338: 7179 addi sp,sp,-48 + 300e33a: d606 sw ra,44(sp) + 300e33c: d422 sw s0,40(sp) + 300e33e: 1800 addi s0,sp,48 + 300e340: 87aa mv a5,a0 + 300e342: 872e mv a4,a1 + 300e344: fcc42c23 sw a2,-40(s0) + 300e348: fcf40fa3 sb a5,-33(s0) + 300e34c: 87ba mv a5,a4 + 300e34e: fcf40f23 sb a5,-34(s0) + int32_t status = STATUS_OK; + 300e352: fe042623 sw zero,-20(s0) + uint8_t buffer[BYTES_PER_DWORD]; + + status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_DWORD); + 300e356: fe840613 addi a2,s0,-24 + 300e35a: fde44703 lbu a4,-34(s0) + 300e35e: fdf44783 lbu a5,-33(s0) + 300e362: 4691 li a3,4 + 300e364: 85ba mv a1,a4 + 300e366: 853e mv a0,a5 + 300e368: 3b69 jal ra,300e102 + 300e36a: fea42623 sw a0,-20(s0) + *pdata = ((uint32_t)buffer[0]<<24) + ((uint32_t)buffer[1]<<16) + ((uint32_t)buffer[2]<<8) + (uint32_t)buffer[3]; + 300e36e: fe844783 lbu a5,-24(s0) + 300e372: 01879713 slli a4,a5,0x18 + 300e376: fe944783 lbu a5,-23(s0) + 300e37a: 07c2 slli a5,a5,0x10 + 300e37c: 973e add a4,a4,a5 + 300e37e: fea44783 lbu a5,-22(s0) + 300e382: 07a2 slli a5,a5,0x8 + 300e384: 97ba add a5,a5,a4 + 300e386: feb44703 lbu a4,-21(s0) + 300e38a: 973e add a4,a4,a5 + 300e38c: fd842783 lw a5,-40(s0) + 300e390: c398 sw a4,0(a5) + + return status; + 300e392: fec42783 lw a5,-20(s0) + +} + 300e396: 853e mv a0,a5 + 300e398: 50b2 lw ra,44(sp) + 300e39a: 5422 lw s0,40(sp) + 300e39c: 6145 addi sp,sp,48 + 300e39e: 8082 ret + +0300e3a0 : + + return Status; +} + +// the ranging_sensor_comms.dll will take care of the page selection +VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ + 300e3a0: 7179 addi sp,sp,-48 + 300e3a2: d606 sw ra,44(sp) + 300e3a4: d422 sw s0,40(sp) + 300e3a6: 1800 addi s0,sp,48 + 300e3a8: fca42e23 sw a0,-36(s0) + 300e3ac: 87ae mv a5,a1 + 300e3ae: fcc42a23 sw a2,-44(s0) + 300e3b2: fcd42823 sw a3,-48(s0) + 300e3b6: fcf40da3 sb a5,-37(s0) + + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e3ba: fe0407a3 sb zero,-17(s0) + int32_t status_int = 0; + 300e3be: fe042423 sw zero,-24(s0) + uint8_t deviceAddress; + + if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ + 300e3c2: fd042703 lw a4,-48(s0) + 300e3c6: 03f00793 li a5,63 + 300e3ca: 00e7f563 bgeu a5,a4,300e3d4 + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300e3ce: 57f1 li a5,-4 + 300e3d0: fef407a3 sb a5,-17(s0) + } + + deviceAddress = Dev->I2cDevAddr; + 300e3d4: fdc42783 lw a5,-36(s0) + 300e3d8: 1807c783 lbu a5,384(a5) + 300e3dc: fef403a3 sb a5,-25(s0) + + status_int = VL53L0X_write_multi(deviceAddress, index, pdata, count); + 300e3e0: fd042683 lw a3,-48(s0) + 300e3e4: fdb44703 lbu a4,-37(s0) + 300e3e8: fe744783 lbu a5,-25(s0) + 300e3ec: fd442603 lw a2,-44(s0) + 300e3f0: 85ba mv a1,a4 + 300e3f2: 853e mv a0,a5 + 300e3f4: 3195 jal ra,300e058 + 300e3f6: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e3fa: fe842783 lw a5,-24(s0) + 300e3fe: c781 beqz a5,300e406 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e400: 57b1 li a5,-20 + 300e402: fef407a3 sb a5,-17(s0) + + return Status; + 300e406: fef40783 lb a5,-17(s0) +} + 300e40a: 853e mv a0,a5 + 300e40c: 50b2 lw ra,44(sp) + 300e40e: 5422 lw s0,40(sp) + 300e410: 6145 addi sp,sp,48 + 300e412: 8082 ret + +0300e414 : + +// the ranging_sensor_comms.dll will take care of the page selection +VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ + 300e414: 7179 addi sp,sp,-48 + 300e416: d606 sw ra,44(sp) + 300e418: d422 sw s0,40(sp) + 300e41a: 1800 addi s0,sp,48 + 300e41c: fca42e23 sw a0,-36(s0) + 300e420: 87ae mv a5,a1 + 300e422: fcc42a23 sw a2,-44(s0) + 300e426: fcd42823 sw a3,-48(s0) + 300e42a: fcf40da3 sb a5,-37(s0) + VL53L0X_I2C_USER_VAR + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e42e: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + + if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ + 300e432: fd042703 lw a4,-48(s0) + 300e436: 03f00793 li a5,63 + 300e43a: 00e7f563 bgeu a5,a4,300e444 + Status = VL53L0X_ERROR_INVALID_PARAMS; + 300e43e: 57f1 li a5,-4 + 300e440: fef407a3 sb a5,-17(s0) + } + + deviceAddress = Dev->I2cDevAddr; + 300e444: fdc42783 lw a5,-36(s0) + 300e448: 1807c783 lbu a5,384(a5) + 300e44c: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_read_multi(deviceAddress, index, pdata, count); + 300e450: fd042683 lw a3,-48(s0) + 300e454: fdb44703 lbu a4,-37(s0) + 300e458: fee44783 lbu a5,-18(s0) + 300e45c: fd442603 lw a2,-44(s0) + 300e460: 85ba mv a1,a4 + 300e462: 853e mv a0,a5 + 300e464: 3979 jal ra,300e102 + 300e466: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e46a: fe842783 lw a5,-24(s0) + 300e46e: c781 beqz a5,300e476 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e470: 57b1 li a5,-20 + 300e472: fef407a3 sb a5,-17(s0) + + return Status; + 300e476: fef40783 lb a5,-17(s0) +} + 300e47a: 853e mv a0,a5 + 300e47c: 50b2 lw ra,44(sp) + 300e47e: 5422 lw s0,40(sp) + 300e480: 6145 addi sp,sp,48 + 300e482: 8082 ret + +0300e484 : + + +VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data){ + 300e484: 7179 addi sp,sp,-48 + 300e486: d606 sw ra,44(sp) + 300e488: d422 sw s0,40(sp) + 300e48a: 1800 addi s0,sp,48 + 300e48c: fca42e23 sw a0,-36(s0) + 300e490: 87ae mv a5,a1 + 300e492: 8732 mv a4,a2 + 300e494: fcf40da3 sb a5,-37(s0) + 300e498: 87ba mv a5,a4 + 300e49a: fcf40d23 sb a5,-38(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e49e: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + 300e4a2: fdc42783 lw a5,-36(s0) + 300e4a6: 1807c783 lbu a5,384(a5) + 300e4aa: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_write_byte(deviceAddress, index, data); + 300e4ae: fda44683 lbu a3,-38(s0) + 300e4b2: fdb44703 lbu a4,-37(s0) + 300e4b6: fee44783 lbu a5,-18(s0) + 300e4ba: 8636 mv a2,a3 + 300e4bc: 85ba mv a1,a4 + 300e4be: 853e mv a0,a5 + 300e4c0: 3b09 jal ra,300e1d2 + 300e4c2: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e4c6: fe842783 lw a5,-24(s0) + 300e4ca: c781 beqz a5,300e4d2 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e4cc: 57b1 li a5,-20 + 300e4ce: fef407a3 sb a5,-17(s0) + + return Status; + 300e4d2: fef40783 lb a5,-17(s0) +} + 300e4d6: 853e mv a0,a5 + 300e4d8: 50b2 lw ra,44(sp) + 300e4da: 5422 lw s0,40(sp) + 300e4dc: 6145 addi sp,sp,48 + 300e4de: 8082 ret + +0300e4e0 : + +VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data){ + 300e4e0: 7179 addi sp,sp,-48 + 300e4e2: d606 sw ra,44(sp) + 300e4e4: d422 sw s0,40(sp) + 300e4e6: 1800 addi s0,sp,48 + 300e4e8: fca42e23 sw a0,-36(s0) + 300e4ec: 87ae mv a5,a1 + 300e4ee: 8732 mv a4,a2 + 300e4f0: fcf40da3 sb a5,-37(s0) + 300e4f4: 87ba mv a5,a4 + 300e4f6: fcf41c23 sh a5,-40(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e4fa: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + 300e4fe: fdc42783 lw a5,-36(s0) + 300e502: 1807c783 lbu a5,384(a5) + 300e506: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_write_word(deviceAddress, index, data); + 300e50a: fd845683 lhu a3,-40(s0) + 300e50e: fdb44703 lbu a4,-37(s0) + 300e512: fee44783 lbu a5,-18(s0) + 300e516: 8636 mv a2,a3 + 300e518: 85ba mv a1,a4 + 300e51a: 853e mv a0,a5 + 300e51c: 3319 jal ra,300e222 + 300e51e: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e522: fe842783 lw a5,-24(s0) + 300e526: c781 beqz a5,300e52e + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e528: 57b1 li a5,-20 + 300e52a: fef407a3 sb a5,-17(s0) + + return Status; + 300e52e: fef40783 lb a5,-17(s0) +} + 300e532: 853e mv a0,a5 + 300e534: 50b2 lw ra,44(sp) + 300e536: 5422 lw s0,40(sp) + 300e538: 6145 addi sp,sp,48 + 300e53a: 8082 ret + +0300e53c : + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData){ + 300e53c: 7179 addi sp,sp,-48 + 300e53e: d606 sw ra,44(sp) + 300e540: d422 sw s0,40(sp) + 300e542: 1800 addi s0,sp,48 + 300e544: fca42e23 sw a0,-36(s0) + 300e548: 87ae mv a5,a1 + 300e54a: 8736 mv a4,a3 + 300e54c: fcf40da3 sb a5,-37(s0) + 300e550: 87b2 mv a5,a2 + 300e552: fcf40d23 sb a5,-38(s0) + 300e556: 87ba mv a5,a4 + 300e558: fcf40ca3 sb a5,-39(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e55c: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + uint8_t data; + + deviceAddress = Dev->I2cDevAddr; + 300e560: fdc42783 lw a5,-36(s0) + 300e564: 1807c783 lbu a5,384(a5) + 300e568: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_read_byte(deviceAddress, index, &data); + 300e56c: fe740693 addi a3,s0,-25 + 300e570: fdb44703 lbu a4,-37(s0) + 300e574: fee44783 lbu a5,-18(s0) + 300e578: 8636 mv a2,a3 + 300e57a: 85ba mv a1,a4 + 300e57c: 853e mv a0,a5 + 300e57e: 3311 jal ra,300e282 + 300e580: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e584: fe842783 lw a5,-24(s0) + 300e588: c781 beqz a5,300e590 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e58a: 57b1 li a5,-20 + 300e58c: fef407a3 sb a5,-17(s0) + + if (Status == VL53L0X_ERROR_NONE) { + 300e590: fef40783 lb a5,-17(s0) + 300e594: e3a1 bnez a5,300e5d4 + data = (data & AndData) | OrData; + 300e596: fe744703 lbu a4,-25(s0) + 300e59a: fda44783 lbu a5,-38(s0) + 300e59e: 8ff9 and a5,a5,a4 + 300e5a0: 0ff7f713 andi a4,a5,255 + 300e5a4: fd944783 lbu a5,-39(s0) + 300e5a8: 8fd9 or a5,a5,a4 + 300e5aa: 9f81 uxtb a5 + 300e5ac: fef403a3 sb a5,-25(s0) + status_int = VL53L0X_write_byte(deviceAddress, index, data); + 300e5b0: fe744683 lbu a3,-25(s0) + 300e5b4: fdb44703 lbu a4,-37(s0) + 300e5b8: fee44783 lbu a5,-18(s0) + 300e5bc: 8636 mv a2,a3 + 300e5be: 85ba mv a1,a4 + 300e5c0: 853e mv a0,a5 + 300e5c2: 3901 jal ra,300e1d2 + 300e5c4: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e5c8: fe842783 lw a5,-24(s0) + 300e5cc: c781 beqz a5,300e5d4 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e5ce: 57b1 li a5,-20 + 300e5d0: fef407a3 sb a5,-17(s0) + } + + return Status; + 300e5d4: fef40783 lb a5,-17(s0) +} + 300e5d8: 853e mv a0,a5 + 300e5da: 50b2 lw ra,44(sp) + 300e5dc: 5422 lw s0,40(sp) + 300e5de: 6145 addi sp,sp,48 + 300e5e0: 8082 ret + +0300e5e2 : + +VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data){ + 300e5e2: 7179 addi sp,sp,-48 + 300e5e4: d606 sw ra,44(sp) + 300e5e6: d422 sw s0,40(sp) + 300e5e8: 1800 addi s0,sp,48 + 300e5ea: fca42e23 sw a0,-36(s0) + 300e5ee: 87ae mv a5,a1 + 300e5f0: fcc42a23 sw a2,-44(s0) + 300e5f4: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e5f8: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + 300e5fc: fdc42783 lw a5,-36(s0) + 300e600: 1807c783 lbu a5,384(a5) + 300e604: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_read_byte(deviceAddress, index, data); + 300e608: fdb44703 lbu a4,-37(s0) + 300e60c: fee44783 lbu a5,-18(s0) + 300e610: fd442603 lw a2,-44(s0) + 300e614: 85ba mv a1,a4 + 300e616: 853e mv a0,a5 + 300e618: 31ad jal ra,300e282 + 300e61a: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e61e: fe842783 lw a5,-24(s0) + 300e622: c781 beqz a5,300e62a + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e624: 57b1 li a5,-20 + 300e626: fef407a3 sb a5,-17(s0) + + return Status; + 300e62a: fef40783 lb a5,-17(s0) +} + 300e62e: 853e mv a0,a5 + 300e630: 50b2 lw ra,44(sp) + 300e632: 5422 lw s0,40(sp) + 300e634: 6145 addi sp,sp,48 + 300e636: 8082 ret + +0300e638 : + +VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data){ + 300e638: 7179 addi sp,sp,-48 + 300e63a: d606 sw ra,44(sp) + 300e63c: d422 sw s0,40(sp) + 300e63e: 1800 addi s0,sp,48 + 300e640: fca42e23 sw a0,-36(s0) + 300e644: 87ae mv a5,a1 + 300e646: fcc42a23 sw a2,-44(s0) + 300e64a: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e64e: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + 300e652: fdc42783 lw a5,-36(s0) + 300e656: 1807c783 lbu a5,384(a5) + 300e65a: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_read_word(deviceAddress, index, data); + 300e65e: fdb44703 lbu a4,-37(s0) + 300e662: fee44783 lbu a5,-18(s0) + 300e666: fd442603 lw a2,-44(s0) + 300e66a: 85ba mv a1,a4 + 300e66c: 853e mv a0,a5 + 300e66e: 3185 jal ra,300e2ce + 300e670: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e674: fe842783 lw a5,-24(s0) + 300e678: c781 beqz a5,300e680 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e67a: 57b1 li a5,-20 + 300e67c: fef407a3 sb a5,-17(s0) + + return Status; + 300e680: fef40783 lb a5,-17(s0) +} + 300e684: 853e mv a0,a5 + 300e686: 50b2 lw ra,44(sp) + 300e688: 5422 lw s0,40(sp) + 300e68a: 6145 addi sp,sp,48 + 300e68c: 8082 ret + +0300e68e : + +VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data){ + 300e68e: 7179 addi sp,sp,-48 + 300e690: d606 sw ra,44(sp) + 300e692: d422 sw s0,40(sp) + 300e694: 1800 addi s0,sp,48 + 300e696: fca42e23 sw a0,-36(s0) + 300e69a: 87ae mv a5,a1 + 300e69c: fcc42a23 sw a2,-44(s0) + 300e6a0: fcf40da3 sb a5,-37(s0) + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + 300e6a4: fe0407a3 sb zero,-17(s0) + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + 300e6a8: fdc42783 lw a5,-36(s0) + 300e6ac: 1807c783 lbu a5,384(a5) + 300e6b0: fef40723 sb a5,-18(s0) + + status_int = VL53L0X_read_dword(deviceAddress, index, data); + 300e6b4: fdb44703 lbu a4,-37(s0) + 300e6b8: fee44783 lbu a5,-18(s0) + 300e6bc: fd442603 lw a2,-44(s0) + 300e6c0: 85ba mv a1,a4 + 300e6c2: 853e mv a0,a5 + 300e6c4: 3995 jal ra,300e338 + 300e6c6: fea42423 sw a0,-24(s0) + + if (status_int != 0) + 300e6ca: fe842783 lw a5,-24(s0) + 300e6ce: c781 beqz a5,300e6d6 + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + 300e6d0: 57b1 li a5,-20 + 300e6d2: fef407a3 sb a5,-17(s0) + + return Status; + 300e6d6: fef40783 lb a5,-17(s0) +} + 300e6da: 853e mv a0,a5 + 300e6dc: 50b2 lw ra,44(sp) + 300e6de: 5422 lw s0,40(sp) + 300e6e0: 6145 addi sp,sp,48 + 300e6e2: 8082 ret + +0300e6e4 : + +#define VL53L0X_POLLINGDELAY_LOOPNB 250 +VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev){ + 300e6e4: 7179 addi sp,sp,-48 + 300e6e6: d622 sw s0,44(sp) + 300e6e8: 1800 addi s0,sp,48 + 300e6ea: fca42e23 sw a0,-36(s0) + VL53L0X_Error status = VL53L0X_ERROR_NONE; + 300e6ee: fe0407a3 sb zero,-17(s0) + // { + // WaitForSingleObject(hEvent,cTimeout_ms); + // } + + // LOG_FUNCTION_END(status); + return status; + 300e6f2: fef40783 lb a5,-17(s0) +} + 300e6f6: 853e mv a0,a5 + 300e6f8: 5432 lw s0,44(sp) + 300e6fa: 6145 addi sp,sp,48 + 300e6fc: 8082 ret + +0300e6fe <__truncdfsf2>: + 300e6fe: 00202873 frrm a6 + 300e702: 001006b7 lui a3,0x100 + 300e706: 16fd addi a3,a3,-1 # fffff + 300e708: 8eed and a3,a3,a1 + 300e70a: 0145d893 srli a7,a1,0x14 + 300e70e: 00369793 slli a5,a3,0x3 + 300e712: 7ff8f893 andi a7,a7,2047 + 300e716: 01d55693 srli a3,a0,0x1d + 300e71a: 8edd or a3,a3,a5 + 300e71c: 00188793 addi a5,a7,1 + 300e720: 7ff7f793 andi a5,a5,2047 + 300e724: 4705 li a4,1 + 300e726: 81fd srli a1,a1,0x1f + 300e728: 00351613 slli a2,a0,0x3 + 300e72c: 16f75b63 bge a4,a5,300e8a2 <__truncdfsf2+0x1a4> + 300e730: c8088713 addi a4,a7,-896 + 300e734: 0fe00793 li a5,254 + 300e738: 0ae7d063 bge a5,a4,300e7d8 <__truncdfsf2+0xda> + 300e73c: 04080063 beqz a6,300e77c <__truncdfsf2+0x7e> + 300e740: 478d li a5,3 + 300e742: 02f81963 bne a6,a5,300e774 <__truncdfsf2+0x76> + 300e746: c99d beqz a1,300e77c <__truncdfsf2+0x7e> + 300e748: 57fd li a5,-1 + 300e74a: 0fe00713 li a4,254 + 300e74e: 4681 li a3,0 + 300e750: 4615 li a2,5 + 300e752: 4509 li a0,2 + 300e754: 00166613 ori a2,a2,1 + 300e758: 1aa80063 beq a6,a0,300e8f8 <__truncdfsf2+0x1fa> + 300e75c: 450d li a0,3 + 300e75e: 18a80a63 beq a6,a0,300e8f2 <__truncdfsf2+0x1f4> + 300e762: 12081763 bnez a6,300e890 <__truncdfsf2+0x192> + 300e766: 00f7f513 andi a0,a5,15 + 300e76a: 4891 li a7,4 + 300e76c: 13150263 beq a0,a7,300e890 <__truncdfsf2+0x192> + 300e770: 0791 addi a5,a5,4 + 300e772: aa39 j 300e890 <__truncdfsf2+0x192> + 300e774: 4789 li a5,2 + 300e776: fcf819e3 bne a6,a5,300e748 <__truncdfsf2+0x4a> + 300e77a: d5f9 beqz a1,300e748 <__truncdfsf2+0x4a> + 300e77c: 4781 li a5,0 + 300e77e: 0ff00713 li a4,255 + 300e782: 4615 li a2,5 + 300e784: 00579693 slli a3,a5,0x5 + 300e788: 0006db63 bgez a3,300e79e <__truncdfsf2+0xa0> + 300e78c: 0705 addi a4,a4,1 # 10001 + 300e78e: 0ff00693 li a3,255 + 300e792: 16d70563 beq a4,a3,300e8fc <__truncdfsf2+0x1fe> + 300e796: fc0006b7 lui a3,0xfc000 + 300e79a: 16fd addi a3,a3,-1 # fbffffff + 300e79c: 8ff5 and a5,a5,a3 + 300e79e: 0ff00693 li a3,255 + 300e7a2: 838d srli a5,a5,0x3 + 300e7a4: 00d71663 bne a4,a3,300e7b0 <__truncdfsf2+0xb2> + 300e7a8: c781 beqz a5,300e7b0 <__truncdfsf2+0xb2> + 300e7aa: 004007b7 lui a5,0x400 + 300e7ae: 4581 li a1,0 + 300e7b0: 008006b7 lui a3,0x800 + 300e7b4: 16fd addi a3,a3,-1 # 7fffff + 300e7b6: 8ff5 and a5,a5,a3 + 300e7b8: 808006b7 lui a3,0x80800 + 300e7bc: 0ff77713 andi a4,a4,255 + 300e7c0: 16fd addi a3,a3,-1 # 807fffff + 300e7c2: 075e slli a4,a4,0x17 + 300e7c4: 8ff5 and a5,a5,a3 + 300e7c6: 05fe slli a1,a1,0x1f + 300e7c8: 8fd9 or a5,a5,a4 + 300e7ca: 8fcd or a5,a5,a1 + 300e7cc: c219 beqz a2,300e7d2 <__truncdfsf2+0xd4> + 300e7ce: 00162073 csrs fflags,a2 + 300e7d2: f0078553 fmv.w.x fa0,a5 + 300e7d6: 8082 ret + 300e7d8: 08e04e63 bgtz a4,300e874 <__truncdfsf2+0x176> + 300e7dc: 57a5 li a5,-23 + 300e7de: 0ef74d63 blt a4,a5,300e8d8 <__truncdfsf2+0x1da> + 300e7e2: 008007b7 lui a5,0x800 + 300e7e6: 4379 li t1,30 + 300e7e8: 8edd or a3,a3,a5 + 300e7ea: 40e30333 sub t1,t1,a4 + 300e7ee: 47fd li a5,31 + 300e7f0: 0467ce63 blt a5,t1,300e84c <__truncdfsf2+0x14e> + 300e7f4: c8288893 addi a7,a7,-894 + 300e7f8: 011617b3 sll a5,a2,a7 + 300e7fc: 00f037b3 snez a5,a5 + 300e800: 011696b3 sll a3,a3,a7 + 300e804: 00665333 srl t1,a2,t1 + 300e808: 8edd or a3,a3,a5 + 300e80a: 00d367b3 or a5,t1,a3 + 300e80e: 4701 li a4,0 + 300e810: cff9 beqz a5,300e8ee <__truncdfsf2+0x1f0> + 300e812: 00179713 slli a4,a5,0x1 + 300e816: 00777693 andi a3,a4,7 + 300e81a: 4601 li a2,0 + 300e81c: c28d beqz a3,300e83e <__truncdfsf2+0x140> + 300e81e: 4689 li a3,2 + 300e820: 0cd80263 beq a6,a3,300e8e4 <__truncdfsf2+0x1e6> + 300e824: 468d li a3,3 + 300e826: 0ad80b63 beq a6,a3,300e8dc <__truncdfsf2+0x1de> + 300e82a: 4605 li a2,1 + 300e82c: 00081963 bnez a6,300e83e <__truncdfsf2+0x140> + 300e830: 00f77693 andi a3,a4,15 + 300e834: 4511 li a0,4 + 300e836: 4605 li a2,1 + 300e838: 00a68363 beq a3,a0,300e83e <__truncdfsf2+0x140> + 300e83c: 0711 addi a4,a4,4 + 300e83e: 01b75693 srli a3,a4,0x1b + 300e842: 0016c693 xori a3,a3,1 + 300e846: 8a85 andi a3,a3,1 + 300e848: 4701 li a4,0 + 300e84a: a83d j 300e888 <__truncdfsf2+0x18a> + 300e84c: 57f9 li a5,-2 + 300e84e: 40e78733 sub a4,a5,a4 + 300e852: 02000793 li a5,32 + 300e856: 00e6d733 srl a4,a3,a4 + 300e85a: 4501 li a0,0 + 300e85c: 00f30663 beq t1,a5,300e868 <__truncdfsf2+0x16a> + 300e860: ca288893 addi a7,a7,-862 + 300e864: 01169533 sll a0,a3,a7 + 300e868: 00c567b3 or a5,a0,a2 + 300e86c: 00f037b3 snez a5,a5 + 300e870: 8fd9 or a5,a5,a4 + 300e872: bf71 j 300e80e <__truncdfsf2+0x110> + 300e874: 051a slli a0,a0,0x6 + 300e876: 00a037b3 snez a5,a0 + 300e87a: 068e slli a3,a3,0x3 + 300e87c: 8275 srli a2,a2,0x1d + 300e87e: 8edd or a3,a3,a5 + 300e880: 00c6e7b3 or a5,a3,a2 + 300e884: 4681 li a3,0 + 300e886: 4601 li a2,0 + 300e888: 0077f513 andi a0,a5,7 + 300e88c: ec0513e3 bnez a0,300e752 <__truncdfsf2+0x54> + 300e890: ee068ae3 beqz a3,300e784 <__truncdfsf2+0x86> + 300e894: 00167693 andi a3,a2,1 + 300e898: ee0686e3 beqz a3,300e784 <__truncdfsf2+0x86> + 300e89c: 00266613 ori a2,a2,2 + 300e8a0: b5d5 j 300e784 <__truncdfsf2+0x86> + 300e8a2: 00c6e7b3 or a5,a3,a2 + 300e8a6: 00089563 bnez a7,300e8b0 <__truncdfsf2+0x1b2> + 300e8aa: 00f037b3 snez a5,a5 + 300e8ae: b785 j 300e80e <__truncdfsf2+0x110> + 300e8b0: cf8d beqz a5,300e8ea <__truncdfsf2+0x1ec> + 300e8b2: 7ff00793 li a5,2047 + 300e8b6: 4601 li a2,0 + 300e8b8: 00f89863 bne a7,a5,300e8c8 <__truncdfsf2+0x1ca> + 300e8bc: 00400637 lui a2,0x400 + 300e8c0: 8e75 and a2,a2,a3 + 300e8c2: 00163613 seqz a2,a2 + 300e8c6: 0612 slli a2,a2,0x4 + 300e8c8: 068e slli a3,a3,0x3 + 300e8ca: 020007b7 lui a5,0x2000 + 300e8ce: 8fd5 or a5,a5,a3 + 300e8d0: 0ff00713 li a4,255 + 300e8d4: 4681 li a3,0 + 300e8d6: bf4d j 300e888 <__truncdfsf2+0x18a> + 300e8d8: 4785 li a5,1 + 300e8da: bf25 j 300e812 <__truncdfsf2+0x114> + 300e8dc: 4605 li a2,1 + 300e8de: f1a5 bnez a1,300e83e <__truncdfsf2+0x140> + 300e8e0: 0721 addi a4,a4,8 + 300e8e2: bfb1 j 300e83e <__truncdfsf2+0x140> + 300e8e4: 4605 li a2,1 + 300e8e6: dda1 beqz a1,300e83e <__truncdfsf2+0x140> + 300e8e8: bfe5 j 300e8e0 <__truncdfsf2+0x1e2> + 300e8ea: 0ff00713 li a4,255 + 300e8ee: 4601 li a2,0 + 300e8f0: bd51 j 300e784 <__truncdfsf2+0x86> + 300e8f2: fdd9 bnez a1,300e890 <__truncdfsf2+0x192> + 300e8f4: 07a1 addi a5,a5,8 # 2000008 + 300e8f6: bf69 j 300e890 <__truncdfsf2+0x192> + 300e8f8: ddc1 beqz a1,300e890 <__truncdfsf2+0x192> + 300e8fa: bfed j 300e8f4 <__truncdfsf2+0x1f6> + 300e8fc: 4781 li a5,0 + 300e8fe: 00080e63 beqz a6,300e91a <__truncdfsf2+0x21c> + 300e902: 468d li a3,3 + 300e904: 00d81763 bne a6,a3,300e912 <__truncdfsf2+0x214> + 300e908: c989 beqz a1,300e91a <__truncdfsf2+0x21c> + 300e90a: 57fd li a5,-1 + 300e90c: 0fe00713 li a4,254 + 300e910: a029 j 300e91a <__truncdfsf2+0x21c> + 300e912: 4689 li a3,2 + 300e914: fed81be3 bne a6,a3,300e90a <__truncdfsf2+0x20c> + 300e918: d9ed beqz a1,300e90a <__truncdfsf2+0x20c> + 300e91a: 00566613 ori a2,a2,5 + 300e91e: b541 j 300e79e <__truncdfsf2+0xa0> + +0300e920 : + 300e920: 41f55793 srai a5,a0,0x1f + 300e924: 8d3d xor a0,a0,a5 + 300e926: 8d1d sub a0,a0,a5 + 300e928: 8082 ret + +0300e92a : + 300e92a: 87aa mv a5,a0 + 300e92c: 0035f713 andi a4,a1,3 + 300e930: c319 beqz a4,300e936 + 300e932: 1a061a63 bnez a2,300eae6 + 300e936: 0037f693 andi a3,a5,3 + 300e93a: 24068563 beqz a3,300eb84 + 300e93e: 477d li a4,31 + 300e940: 0ac77363 bgeu a4,a2,300e9e6 + 300e944: 4889 li a7,2 + 300e946: 0005c703 lbu a4,0(a1) # 80000000 + 300e94a: 0005a803 lw a6,0(a1) + 300e94e: 25168163 beq a3,a7,300eb90 + 300e952: 488d li a7,3 + 300e954: 2b168e63 beq a3,a7,300ec10 + 300e958: 00e78023 sb a4,0(a5) + 300e95c: 0015c703 lbu a4,1(a1) + 300e960: 00358e13 addi t3,a1,3 + 300e964: 00378313 addi t1,a5,3 + 300e968: 00e780a3 sb a4,1(a5) + 300e96c: 0025c703 lbu a4,2(a1) + 300e970: ffd60893 addi a7,a2,-3 # 3ffffd + 300e974: 4ec1 li t4,16 + 300e976: 00e78123 sb a4,2(a5) + 300e97a: 8772 mv a4,t3 + 300e97c: 879a mv a5,t1 + 300e97e: 00172683 lw a3,1(a4) + 300e982: 01885813 srli a6,a6,0x18 + 300e986: 18c1 addi a7,a7,-16 + 300e988: 00869593 slli a1,a3,0x8 + 300e98c: 00b86833 or a6,a6,a1 + 300e990: 00572583 lw a1,5(a4) + 300e994: 0107a023 sw a6,0(a5) + 300e998: 82e1 srli a3,a3,0x18 + 300e99a: 00859813 slli a6,a1,0x8 + 300e99e: 0106e6b3 or a3,a3,a6 + 300e9a2: c3d4 sw a3,4(a5) + 300e9a4: 00972683 lw a3,9(a4) + 300e9a8: 81e1 srli a1,a1,0x18 + 300e9aa: 0741 addi a4,a4,16 + 300e9ac: 00869813 slli a6,a3,0x8 + 300e9b0: 0105e5b3 or a1,a1,a6 + 300e9b4: ffd72803 lw a6,-3(a4) + 300e9b8: c78c sw a1,8(a5) + 300e9ba: 82e1 srli a3,a3,0x18 + 300e9bc: 00881593 slli a1,a6,0x8 + 300e9c0: 8ecd or a3,a3,a1 + 300e9c2: c7d4 sw a3,12(a5) + 300e9c4: 07c1 addi a5,a5,16 + 300e9c6: fb1eece3 bltu t4,a7,300e97e + 300e9ca: fec60713 addi a4,a2,-20 + 300e9ce: 8311 srli a4,a4,0x4 + 300e9d0: 00170793 addi a5,a4,1 + 300e9d4: 0792 slli a5,a5,0x4 + 300e9d6: 00fe05b3 add a1,t3,a5 + 300e9da: 1635 addi a2,a2,-19 + 300e9dc: 979a add a5,a5,t1 + 300e9de: 56c1 li a3,-16 + 300e9e0: 02d70733 mul a4,a4,a3 + 300e9e4: 963a add a2,a2,a4 + 300e9e6: 01067713 andi a4,a2,16 + 300e9ea: c359 beqz a4,300ea70 + 300e9ec: 0005c703 lbu a4,0(a1) + 300e9f0: 07c1 addi a5,a5,16 + 300e9f2: 05c1 addi a1,a1,16 + 300e9f4: fee78823 sb a4,-16(a5) + 300e9f8: ff15c703 lbu a4,-15(a1) + 300e9fc: fee788a3 sb a4,-15(a5) + 300ea00: ff25c703 lbu a4,-14(a1) + 300ea04: fee78923 sb a4,-14(a5) + 300ea08: ff35c703 lbu a4,-13(a1) + 300ea0c: fee789a3 sb a4,-13(a5) + 300ea10: ff45c703 lbu a4,-12(a1) + 300ea14: fee78a23 sb a4,-12(a5) + 300ea18: ff55c703 lbu a4,-11(a1) + 300ea1c: fee78aa3 sb a4,-11(a5) + 300ea20: ff65c703 lbu a4,-10(a1) + 300ea24: fee78b23 sb a4,-10(a5) + 300ea28: ff75c703 lbu a4,-9(a1) + 300ea2c: fee78ba3 sb a4,-9(a5) + 300ea30: ff85c703 lbu a4,-8(a1) + 300ea34: fee78c23 sb a4,-8(a5) + 300ea38: ff95c703 lbu a4,-7(a1) + 300ea3c: fee78ca3 sb a4,-7(a5) + 300ea40: ffa5c703 lbu a4,-6(a1) + 300ea44: fee78d23 sb a4,-6(a5) + 300ea48: ffb5c703 lbu a4,-5(a1) + 300ea4c: fee78da3 sb a4,-5(a5) + 300ea50: ffc5c703 lbu a4,-4(a1) + 300ea54: fee78e23 sb a4,-4(a5) + 300ea58: ffd5c703 lbu a4,-3(a1) + 300ea5c: fee78ea3 sb a4,-3(a5) + 300ea60: ffe5c703 lbu a4,-2(a1) + 300ea64: fee78f23 sb a4,-2(a5) + 300ea68: fff5c703 lbu a4,-1(a1) + 300ea6c: fee78fa3 sb a4,-1(a5) + 300ea70: 00867713 andi a4,a2,8 + 300ea74: c339 beqz a4,300eaba + 300ea76: 0005c703 lbu a4,0(a1) + 300ea7a: 07a1 addi a5,a5,8 + 300ea7c: 05a1 addi a1,a1,8 + 300ea7e: fee78c23 sb a4,-8(a5) + 300ea82: ff95c703 lbu a4,-7(a1) + 300ea86: fee78ca3 sb a4,-7(a5) + 300ea8a: ffa5c703 lbu a4,-6(a1) + 300ea8e: fee78d23 sb a4,-6(a5) + 300ea92: ffb5c703 lbu a4,-5(a1) + 300ea96: fee78da3 sb a4,-5(a5) + 300ea9a: ffc5c703 lbu a4,-4(a1) + 300ea9e: fee78e23 sb a4,-4(a5) + 300eaa2: ffd5c703 lbu a4,-3(a1) + 300eaa6: fee78ea3 sb a4,-3(a5) + 300eaaa: ffe5c703 lbu a4,-2(a1) + 300eaae: fee78f23 sb a4,-2(a5) + 300eab2: fff5c703 lbu a4,-1(a1) + 300eab6: fee78fa3 sb a4,-1(a5) + 300eaba: 00467713 andi a4,a2,4 + 300eabe: cf59 beqz a4,300eb5c + 300eac0: 0005c703 lbu a4,0(a1) + 300eac4: 0791 addi a5,a5,4 + 300eac6: 0591 addi a1,a1,4 + 300eac8: fee78e23 sb a4,-4(a5) + 300eacc: ffd5c703 lbu a4,-3(a1) + 300ead0: fee78ea3 sb a4,-3(a5) + 300ead4: ffe5c703 lbu a4,-2(a1) + 300ead8: fee78f23 sb a4,-2(a5) + 300eadc: fff5c703 lbu a4,-1(a1) + 300eae0: fee78fa3 sb a4,-1(a5) + 300eae4: a8a5 j 300eb5c + 300eae6: 0585 addi a1,a1,1 + 300eae8: fff5c703 lbu a4,-1(a1) + 300eaec: 0785 addi a5,a5,1 + 300eaee: 167d addi a2,a2,-1 + 300eaf0: fee78fa3 sb a4,-1(a5) + 300eaf4: bd25 j 300e92c + 300eaf6: 00072883 lw a7,0(a4) + 300eafa: 06c1 addi a3,a3,16 + 300eafc: 0741 addi a4,a4,16 + 300eafe: ff16a823 sw a7,-16(a3) + 300eb02: ff472883 lw a7,-12(a4) + 300eb06: ff16aa23 sw a7,-12(a3) + 300eb0a: ff872883 lw a7,-8(a4) + 300eb0e: ff16ac23 sw a7,-8(a3) + 300eb12: ffc72883 lw a7,-4(a4) + 300eb16: ff16ae23 sw a7,-4(a3) + 300eb1a: 40e308b3 sub a7,t1,a4 + 300eb1e: fd186ce3 bltu a6,a7,300eaf6 + 300eb22: 00465713 srli a4,a2,0x4 + 300eb26: 56c1 li a3,-16 + 300eb28: 02d706b3 mul a3,a4,a3 + 300eb2c: 0712 slli a4,a4,0x4 + 300eb2e: 97ba add a5,a5,a4 + 300eb30: 95ba add a1,a1,a4 + 300eb32: 9636 add a2,a2,a3 + 300eb34: 00867713 andi a4,a2,8 + 300eb38: cb11 beqz a4,300eb4c + 300eb3a: 4198 lw a4,0(a1) + 300eb3c: 07a1 addi a5,a5,8 + 300eb3e: 05a1 addi a1,a1,8 + 300eb40: fee7ac23 sw a4,-8(a5) + 300eb44: ffc5a703 lw a4,-4(a1) + 300eb48: fee7ae23 sw a4,-4(a5) + 300eb4c: 00467713 andi a4,a2,4 + 300eb50: c711 beqz a4,300eb5c + 300eb52: 4198 lw a4,0(a1) + 300eb54: 0791 addi a5,a5,4 + 300eb56: 0591 addi a1,a1,4 + 300eb58: fee7ae23 sw a4,-4(a5) + 300eb5c: 00267713 andi a4,a2,2 + 300eb60: cb19 beqz a4,300eb76 + 300eb62: 0005c703 lbu a4,0(a1) + 300eb66: 0789 addi a5,a5,2 + 300eb68: 0589 addi a1,a1,2 + 300eb6a: fee78f23 sb a4,-2(a5) + 300eb6e: fff5c703 lbu a4,-1(a1) + 300eb72: fee78fa3 sb a4,-1(a5) + 300eb76: 8a05 andi a2,a2,1 + 300eb78: c609 beqz a2,300eb82 + 300eb7a: 0005c703 lbu a4,0(a1) + 300eb7e: 00e78023 sb a4,0(a5) + 300eb82: 8082 ret + 300eb84: 872e mv a4,a1 + 300eb86: 86be mv a3,a5 + 300eb88: 00c58333 add t1,a1,a2 + 300eb8c: 483d li a6,15 + 300eb8e: b771 j 300eb1a + 300eb90: 00e78023 sb a4,0(a5) + 300eb94: 0015c703 lbu a4,1(a1) + 300eb98: 00258e13 addi t3,a1,2 + 300eb9c: 00278313 addi t1,a5,2 + 300eba0: 00e780a3 sb a4,1(a5) + 300eba4: ffe60893 addi a7,a2,-2 + 300eba8: 8772 mv a4,t3 + 300ebaa: 879a mv a5,t1 + 300ebac: 4ec5 li t4,17 + 300ebae: 00272683 lw a3,2(a4) + 300ebb2: 01085813 srli a6,a6,0x10 + 300ebb6: 18c1 addi a7,a7,-16 + 300ebb8: 01069593 slli a1,a3,0x10 + 300ebbc: 00b86833 or a6,a6,a1 + 300ebc0: 00672583 lw a1,6(a4) + 300ebc4: 0107a023 sw a6,0(a5) + 300ebc8: 82c1 srli a3,a3,0x10 + 300ebca: 01059813 slli a6,a1,0x10 + 300ebce: 0106e6b3 or a3,a3,a6 + 300ebd2: c3d4 sw a3,4(a5) + 300ebd4: 00a72683 lw a3,10(a4) + 300ebd8: 81c1 srli a1,a1,0x10 + 300ebda: 0741 addi a4,a4,16 + 300ebdc: 01069813 slli a6,a3,0x10 + 300ebe0: 0105e5b3 or a1,a1,a6 + 300ebe4: ffe72803 lw a6,-2(a4) + 300ebe8: c78c sw a1,8(a5) + 300ebea: 82c1 srli a3,a3,0x10 + 300ebec: 01081593 slli a1,a6,0x10 + 300ebf0: 8ecd or a3,a3,a1 + 300ebf2: c7d4 sw a3,12(a5) + 300ebf4: 07c1 addi a5,a5,16 + 300ebf6: fb1eece3 bltu t4,a7,300ebae + 300ebfa: fec60713 addi a4,a2,-20 + 300ebfe: 8311 srli a4,a4,0x4 + 300ec00: 00170793 addi a5,a4,1 + 300ec04: 0792 slli a5,a5,0x4 + 300ec06: 00fe05b3 add a1,t3,a5 + 300ec0a: 1639 addi a2,a2,-18 + 300ec0c: 979a add a5,a5,t1 + 300ec0e: bbc1 j 300e9de + 300ec10: 0585 addi a1,a1,1 + 300ec12: 00178313 addi t1,a5,1 + 300ec16: 00e78023 sb a4,0(a5) + 300ec1a: fff60893 addi a7,a2,-1 + 300ec1e: 872e mv a4,a1 + 300ec20: 879a mv a5,t1 + 300ec22: 4e49 li t3,18 + 300ec24: 00372683 lw a3,3(a4) + 300ec28: 00885813 srli a6,a6,0x8 + 300ec2c: 18c1 addi a7,a7,-16 + 300ec2e: 01869e93 slli t4,a3,0x18 + 300ec32: 01d86833 or a6,a6,t4 + 300ec36: 0107a023 sw a6,0(a5) + 300ec3a: 00772803 lw a6,7(a4) + 300ec3e: 82a1 srli a3,a3,0x8 + 300ec40: 0741 addi a4,a4,16 + 300ec42: 01881e93 slli t4,a6,0x18 + 300ec46: 01d6e6b3 or a3,a3,t4 + 300ec4a: c3d4 sw a3,4(a5) + 300ec4c: ffb72683 lw a3,-5(a4) + 300ec50: 00885813 srli a6,a6,0x8 + 300ec54: 07c1 addi a5,a5,16 + 300ec56: 01869e93 slli t4,a3,0x18 + 300ec5a: 01d86833 or a6,a6,t4 + 300ec5e: ff07ac23 sw a6,-8(a5) + 300ec62: fff72803 lw a6,-1(a4) + 300ec66: 82a1 srli a3,a3,0x8 + 300ec68: 01881e93 slli t4,a6,0x18 + 300ec6c: 01d6e6b3 or a3,a3,t4 + 300ec70: fed7ae23 sw a3,-4(a5) + 300ec74: fb1e68e3 bltu t3,a7,300ec24 + 300ec78: fec60713 addi a4,a2,-20 + 300ec7c: 8311 srli a4,a4,0x4 + 300ec7e: 00170793 addi a5,a4,1 + 300ec82: 0792 slli a5,a5,0x4 + 300ec84: 95be add a1,a1,a5 + 300ec86: 163d addi a2,a2,-17 + 300ec88: 979a add a5,a5,t1 + 300ec8a: bb91 j 300e9de + +0300ec8c : + 300ec8c: c25d beqz a2,300ed32 + 300ec8e: 0ff5f793 andi a5,a1,255 + 300ec92: 00f50023 sb a5,0(a0) # 14100000 + 300ec96: 00c50733 add a4,a0,a2 + 300ec9a: fef70fa3 sb a5,-1(a4) + 300ec9e: 4689 li a3,2 + 300eca0: 08c6f963 bgeu a3,a2,300ed32 + 300eca4: 00f500a3 sb a5,1(a0) + 300eca8: 00f50123 sb a5,2(a0) + 300ecac: fef70f23 sb a5,-2(a4) + 300ecb0: fef70ea3 sb a5,-3(a4) + 300ecb4: 4699 li a3,6 + 300ecb6: 06c6fe63 bgeu a3,a2,300ed32 + 300ecba: 00f501a3 sb a5,3(a0) + 300ecbe: fef70e23 sb a5,-4(a4) + 300ecc2: 46a1 li a3,8 + 300ecc4: 06c6f763 bgeu a3,a2,300ed32 + 300ecc8: 40a007b3 neg a5,a0 + 300eccc: 8b8d andi a5,a5,3 + 300ecce: 00f50733 add a4,a0,a5 + 300ecd2: 8e1d sub a2,a2,a5 + 300ecd4: 010107b7 lui a5,0x1010 + 300ecd8: 10178793 addi a5,a5,257 # 1010101 + 300ecdc: 0ff5f593 andi a1,a1,255 + 300ece0: 02f585b3 mul a1,a1,a5 + 300ece4: 9a71 andi a2,a2,-4 + 300ece6: 00c707b3 add a5,a4,a2 + 300ecea: c30c sw a1,0(a4) + 300ecec: feb7ae23 sw a1,-4(a5) + 300ecf0: 04c6f163 bgeu a3,a2,300ed32 + 300ecf4: c34c sw a1,4(a4) + 300ecf6: c70c sw a1,8(a4) + 300ecf8: feb7aa23 sw a1,-12(a5) + 300ecfc: feb7ac23 sw a1,-8(a5) + 300ed00: 46e1 li a3,24 + 300ed02: 02c6f863 bgeu a3,a2,300ed32 + 300ed06: c74c sw a1,12(a4) + 300ed08: cb0c sw a1,16(a4) + 300ed0a: cb4c sw a1,20(a4) + 300ed0c: cf0c sw a1,24(a4) + 300ed0e: feb7a223 sw a1,-28(a5) + 300ed12: feb7a423 sw a1,-24(a5) + 300ed16: feb7a623 sw a1,-20(a5) + 300ed1a: feb7a823 sw a1,-16(a5) + 300ed1e: 00477793 andi a5,a4,4 + 300ed22: 07e1 addi a5,a5,24 + 300ed24: 97ba add a5,a5,a4 + 300ed26: 46fd li a3,31 + 300ed28: 9732 add a4,a4,a2 + 300ed2a: 40f70633 sub a2,a4,a5 + 300ed2e: 00c6e363 bltu a3,a2,300ed34 + 300ed32: 8082 ret + 300ed34: c38c sw a1,0(a5) + 300ed36: c3cc sw a1,4(a5) + 300ed38: c78c sw a1,8(a5) + 300ed3a: c7cc sw a1,12(a5) + 300ed3c: cb8c sw a1,16(a5) + 300ed3e: cbcc sw a1,20(a5) + 300ed40: cf8c sw a1,24(a5) + 300ed42: cfcc sw a1,28(a5) + 300ed44: 02078793 addi a5,a5,32 + 300ed48: b7cd j 300ed2a + +0300ed4a : + 300ed4a: 1141 addi sp,sp,-16 + 300ed4c: c422 sw s0,8(sp) + 300ed4e: c606 sw ra,12(sp) + 300ed50: 842a mv s0,a0 + 300ed52: 2825 jal ra,300ed8a <__stpcpy> + 300ed54: 8522 mv a0,s0 + 300ed56: 40b2 lw ra,12(sp) + 300ed58: 4422 lw s0,8(sp) + 300ed5a: 0141 addi sp,sp,16 + 300ed5c: 8082 ret + +0300ed5e : + 300ed5e: c605 beqz a2,300ed86 + 300ed60: 00150713 addi a4,a0,1 + 300ed64: 9532 add a0,a0,a2 + 300ed66: fff74783 lbu a5,-1(a4) + 300ed6a: 0005c683 lbu a3,0(a1) + 300ed6e: c799 beqz a5,300ed7c + 300ed70: c691 beqz a3,300ed7c + 300ed72: 00a70563 beq a4,a0,300ed7c + 300ed76: 0705 addi a4,a4,1 + 300ed78: 00d78563 beq a5,a3,300ed82 + 300ed7c: 40d78533 sub a0,a5,a3 + 300ed80: 8082 ret + 300ed82: 0585 addi a1,a1,1 + 300ed84: b7cd j 300ed66 + 300ed86: 4501 li a0,0 + 300ed88: 8082 ret + +0300ed8a <__stpcpy>: + 300ed8a: 00a5c7b3 xor a5,a1,a0 + 300ed8e: 8b8d andi a5,a5,3 + 300ed90: cf91 beqz a5,300edac <__stpcpy+0x22> + 300ed92: 0005c783 lbu a5,0(a1) + 300ed96: 00f50023 sb a5,0(a0) + 300ed9a: e3b1 bnez a5,300edde <__stpcpy+0x54> + 300ed9c: 8082 ret + 300ed9e: 0005c783 lbu a5,0(a1) + 300eda2: 00f50023 sb a5,0(a0) + 300eda6: dbfd beqz a5,300ed9c <__stpcpy+0x12> + 300eda8: 0585 addi a1,a1,1 + 300edaa: 0505 addi a0,a0,1 + 300edac: 0035f793 andi a5,a1,3 + 300edb0: f7fd bnez a5,300ed9e <__stpcpy+0x14> + 300edb2: feff0637 lui a2,0xfeff0 + 300edb6: 80808737 lui a4,0x80808 + 300edba: eff60613 addi a2,a2,-257 # fefefeff + 300edbe: 08070713 addi a4,a4,128 # 80808080 + 300edc2: 4194 lw a3,0(a1) + 300edc4: 00c687b3 add a5,a3,a2 + 300edc8: fff6c813 not a6,a3 + 300edcc: 0107f7b3 and a5,a5,a6 + 300edd0: 8ff9 and a5,a5,a4 + 300edd2: f3e1 bnez a5,300ed92 <__stpcpy+0x8> + 300edd4: 0511 addi a0,a0,4 + 300edd6: 0591 addi a1,a1,4 + 300edd8: fed52e23 sw a3,-4(a0) + 300eddc: b7dd j 300edc2 <__stpcpy+0x38> + 300edde: 0585 addi a1,a1,1 + 300ede0: 0505 addi a0,a0,1 + 300ede2: bf45 j 300ed92 <__stpcpy+0x8> + +0300ede4 <__rodata_start>: + 300ede4: 9680 pop {ra,s0-s6},384 + 300ede6: 4b18 lw a4,16(a4) + +0300ede8 : + 300ede8: 0000 1400 0000 0000 0140 0000 1000 1400 ........@....... + 300edf8: 0000 0000 0144 0000 2000 1400 0000 0000 ....D.... ...... + 300ee08: 0148 0000 3000 1400 0000 0000 014c 0000 H....0......L... + 300ee18: 0000 1430 0000 0000 0240 0000 1000 1430 ..0.....@.....0. + 300ee28: 0000 0000 0244 0000 2000 1430 0000 0000 ....D.... 0..... + 300ee38: 0248 0000 3000 1430 0000 0000 024c 0000 H....00.....L... + 300ee48: 0000 1438 0000 0000 0040 0000 0000 1420 ..8.....@..... . + 300ee58: 0000 0000 0180 0000 1000 1420 0000 0000 .......... ..... + 300ee68: 0184 0000 0000 1410 0000 0000 01c0 0000 ................ + 300ee78: 1000 1410 0000 0000 01c4 0000 0000 1460 ..............`. + 300ee88: 0001 0000 02c0 0000 0000 1470 0000 0000 ..........p..... + 300ee98: 0440 0000 1000 1470 0000 0000 0444 0000 @.....p.....D... + 300eea8: 2000 1470 0000 0000 0448 0000 3000 1470 . p.....H....0p. + 300eeb8: 0000 0000 044c 0000 0000 1440 0000 0000 ....L.....@..... + 300eec8: 0200 0000 0000 14b0 0000 0000 0280 0000 ................ + 300eed8: 1000 14b0 0000 0000 0284 0000 2000 14b0 ............. .. + 300eee8: 0000 0000 0288 0000 0000 1c00 0000 0000 ................ + 300eef8: 0300 0000 0000 1450 0000 0000 0480 0000 ......P......... + 300ef08: 1000 1450 0000 0000 0484 0000 2000 1450 ..P.......... P. + 300ef18: 0000 0000 0488 0000 3000 1450 0000 0000 .........0P..... + 300ef28: 048c 0000 4000 1450 0000 0000 0490 0000 .....@P......... + 300ef38: 5000 1450 0000 0000 0494 0000 1000 1440 .PP...........@. + 300ef48: 0004 0000 03c0 0000 0000 14c0 0000 0000 ................ + 300ef58: 04c0 0000 1000 14c0 0000 0000 04c4 0000 ................ + 300ef68: 0000 147d 0000 0000 0b00 0000 0000 1480 ..}............. + 300ef78: 0000 0000 0380 0000 0000 14a0 0000 0000 ................ + 300ef88: 0400 0000 1000 14a0 0000 0000 0404 0000 ................ + 300ef98: 2000 14a0 0000 0000 0408 0000 3000 14a0 . ...........0.. + 300efa8: 0000 0000 040c 0000 0000 1001 0000 0000 ................ + 300efb8: 0340 0000 0000 1810 0005 0000 0a60 0000 @...........`... + 300efc8: 0000 1830 0005 0000 0a70 0000 0000 1840 ..0.....p.....@. + 300efd8: 0005 0000 0a80 0000 0000 1820 0005 0000 .......... ..... + 300efe8: 0a90 0000 1000 1820 0005 0000 0a90 0004 ...... ......... + 300eff8: 0000 1800 0002 0000 0a00 0000 0000 1471 ..............q. + 300f008: 0003 0000 0500 0000 2e2e 642f 6972 6576 ........../drive + 300f018: 7372 622f 7361 2f65 7273 2f63 6e69 6574 rs/base/src/inte + 300f028: 7272 7075 2e74 0063 1634 0300 1686 0300 rrupt.c.4....... + 300f038: 16d8 0300 172a 0300 177c 0300 17ce 0300 ....*...|....... + 300f048: 1820 0300 1872 0300 1908 0300 195a 0300 ...r.......Z... + 300f058: 19ac 0300 19fe 0300 1a50 0300 1aa2 0300 ........P....... + 300f068: 1af4 0300 1b46 0300 2e2e 642f 6972 6576 ....F...../drive + 300f078: 7372 632f 6772 692f 636e 632f 6772 695f rs/crg/inc/crg_i + 300f088: 2e70 0068 2e2e 642f 6972 6576 7372 632f p.h.../drivers/c + 300f098: 6772 732f 6372 632f 6772 632e 0000 0000 rg/src/crg.c.... + 300f0a8: 0000 0000 0001 0000 0002 0000 0003 0000 ................ + 300f0b8: 0004 0000 0005 0000 0006 0000 0007 0000 ................ + 300f0c8: 25aa 0300 25b4 0300 25c8 0300 25aa 0300 .%...%...%...%.. + 300f0d8: 25e4 0300 25aa 0300 38e0 0300 394a 0300 .%...%...8..J9.. + 300f0e8: 394a 0300 394a 0300 394a 0300 394a 0300 J9..J9..J9..J9.. + 300f0f8: 394a 0300 394a 0300 394a 0300 394a 0300 J9..J9..J9..J9.. + 300f108: 394a 0300 3820 0300 3876 0300 394a 0300 J9.. 8..v8..J9.. + 300f118: 390a 0300 394a 0300 394a 0300 394a 0300 .9..J9..J9..J9.. + 300f128: 394a 0300 394a 0300 394a 0300 394a 0300 J9..J9..J9..J9.. + 300f138: 394a 0300 394a 0300 38e0 0300 394a 0300 J9..J9...8..J9.. + 300f148: 394a 0300 384a 0300 394a 0300 38a0 0300 J9..J8..J9...8.. + 300f158: 394a 0300 394a 0300 38e0 0300 2e2e 642f J9..J9...8..../d + 300f168: 6972 6576 7372 672f 6970 2f6f 6e69 2f63 rivers/gpio/inc/ + 300f178: 7067 6f69 695f 2e70 0068 0000 2e2e 642f gpio_ip.h...../d + 300f188: 6972 6576 7372 672f 6970 2f6f 7273 2f63 rivers/gpio/src/ + 300f198: 7067 6f69 632e 0000 2e2e 642f 6972 6576 gpio.c..../drive + 300f1a8: 7372 672f 7470 732f 6372 672f 7470 632e rs/gpt/src/gpt.c + 300f1b8: 0000 0000 2e2e 642f 6972 6576 7372 692f ....../drivers/i + 300f1c8: 6332 732f 6372 692f 6332 632e 0000 0000 2c/src/i2c.c.... + 300f1d8: 2e2e 642f 6972 6576 7372 692f 636f 676d ../drivers/iocmg + 300f1e8: 692f 636e 692f 636f 676d 695f 2e70 0068 /inc/iocmg_ip.h. + 300f1f8: 2e2e 642f 6972 6576 7372 692f 636f 676d ../drivers/iocmg + 300f208: 732f 6372 692f 636f 676d 632e 0000 0000 /src/iocmg.c.... + 300f218: 2e2e 642f 6972 6576 7372 742f 6d69 7265 ../drivers/timer + 300f228: 692f 636e 742f 6d69 7265 695f 2e70 0068 /inc/timer_ip.h. + 300f238: 2e2e 642f 6972 6576 7372 742f 6d69 7265 ../drivers/timer + 300f248: 732f 6372 742f 6d69 7265 632e 0000 0000 /src/timer.c.... + 300f258: 6474 0300 648a 0300 64a0 0300 64b6 0300 td...d...d...d.. + 300f268: 64cc 0300 2e2e 642f 6972 6576 7372 752f .d..../drivers/u + 300f278: 7261 2f74 7273 2f63 6175 7472 632e 0000 art/src/uart.c.. + 300f288: 6e8e 0300 6e9a 0300 6ea6 0300 6eb2 0300 .n...n...n...n.. + 300f298: 6ebe 0300 6eca 0300 6ed6 0300 6ee2 0300 .n...n...n...n.. + 300f2a8: 6eee 0300 7473 706f 7920 756f 7720 6c69 .n..stop you wil + 300f2b8: 206c 6968 2074 7469 2021 0a0d 0000 0000 l hit it! ...... + 300f2c8: 6f79 2075 6168 6576 6220 6565 206e 6f77 you have been wo + 300f2d8: 6b72 6e69 2067 6f66 2072 2e31 2035 6f68 rking for 1.5 ho + 300f2e8: 7275 2c73 6c70 6165 6573 7720 6c61 206b urs,please walk + 300f2f8: 7261 756f 646e 6120 646e 7220 6c65 7861 around and relax + 300f308: 7e20 0d20 000a 0000 6177 6e72 6e69 2c67 ~ .....warning, + 300f318: 7320 6d6f 6f65 656e 6820 7361 6920 766e someone has inv + 300f328: 6461 6465 7920 756f 2072 6f68 7375 2165 aded your house! + 300f338: 0d20 000a 7473 706f 0a0d 0000 6573 7674 ...stop....setv + 300f348: 0000 0000 6f63 656d 0000 0000 6162 6b63 ....come....back + 300f358: 0000 0000 7473 5f61 6361 0074 7473 7261 ....sta_act.star + 300f368: 0074 0000 7567 7261 0064 0000 7473 706f t...guard...stop + 300f378: 0000 0000 656c 7466 0000 0000 6972 6867 ....left....righ + 300f388: 0074 0000 6572 7274 6165 0074 6c63 006f t...retreat.clo. + 300f398: 6e61 0074 6564 6b73 0000 0000 7267 756f ant.desk....grou + 300f3a8: 646e 0000 c000 45a8 0000 4000 8d9a 0300 nd.....E...@.... + 300f3b8: 8d9a 0300 8da6 0300 8d9a 0300 8da6 0300 ................ + 300f3c8: 8da6 0300 8da6 0300 8da6 0300 8da6 0300 ................ + 300f3d8: 8da6 0300 8da6 0300 8da6 0300 8da6 0300 ................ + 300f3e8: 8da6 0300 8da6 0300 8da6 0300 8da6 0300 ................ + 300f3f8: 8da6 0300 8da6 0300 8da6 0300 8d9a 0300 ................ + 300f408: 8d9a 0300 8f44 0300 8f52 0300 8f60 0300 ....D...R...`... + 300f418: 8f6e 0300 8f7c 0300 8fae 0300 8fba 0300 n...|........... + 300f428: 8fc8 0300 8fd4 0300 8fe2 0300 909e 0300 ................ + 300f438: 90b4 0300 90ca 0300 90e0 0300 90f6 0300 ................ + 300f448: 93c4 0300 93d2 0300 93ee 0300 93fc 0300 ................ + 300f458: 940a 0300 9432 0300 9558 0300 9564 0300 ....2...X...d... + 300f468: 9580 0300 958c 0300 9598 0300 9598 0300 ................ + 300f478: 9620 0300 9630 0300 965e 0300 966e 0300 ...0...^...n... + 300f488: 967e 0300 967e 0300 a2b2 0300 a2b8 0300 ~...~........... + 300f498: a2c0 0300 a2c8 0300 a2d0 0300 4c56 3335 ............VL53 + 300f4a8: 304c 2058 4449 203a 6425 732c 6174 7574 L0X ID: %d,statu + 300f4b8: 3a73 2520 0d64 000a 4c56 3335 304c 2058 s: %d...VL53L0X + 300f4c8: 6544 6574 7463 4620 6961 656c 2164 0a0d Detect Failed!.. + 300f4d8: 0000 0000 6843 6e61 6567 4920 4349 6120 ....Change IIC a + 300f4e8: 6464 6572 7373 7320 6375 6563 7373 2021 ddress success! + 300f4f8: 4949 2043 6441 7264 7365 3a73 3020 2578 IIC Address: 0x% + 300f508: 0d78 000a 6544 6166 6c75 2074 4949 2043 x...Default IIC + 300f518: 6441 7264 7365 3a73 3020 2578 0d78 000a Address: 0x%x... + 300f528: 4c56 3335 304c 2058 6e69 7469 5320 6375 VL53L0X init Suc + 300f538: 6563 6464 6465 0d21 000a 0000 4c56 3335 cedded!.....VL53 + 300f548: 304c 2058 7473 7261 2074 6172 676e 6e69 L0X start rangin + 300f558: 2167 0a0d 0000 0000 4c56 3335 304c 2058 g!......VL53L0X + 300f568: 7473 706f 7220 6e61 6967 676e 0d21 000a stop ranging!... diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.map" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.map" new file mode 100644 index 00000000..03aed788 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/bin/target.map" @@ -0,0 +1,8281 @@ +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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (__libc_free) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (__malloc_lock) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (__madvise) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__mmap) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) (mprotect) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) (munmap) +d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) (fwide) +d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o (abs) +d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) (memchr) +d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) (__strchrnul) +d:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + obj/user/vl53l0x/core/src/vl53l0x_api_core.o (strcpy) +d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) (wcschr) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) (wcslen) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__lock) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__stack_chk_guard) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (___errno_location) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__floatscan) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) (__intscan) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) (__libc) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__shlim) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) (__syscall_ret) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) (__c_dot_utf8_locale) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (copysignl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (fabsl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (fmodl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (scalbn) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (scalbnl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) (__fsmu8) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) (mbrtowc) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) (wcrtomb) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) (wcsrtombs) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) (__lockfile) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) (__stdio_close) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) (__stdio_read) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) (__stdio_seek) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) (__toread) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) (__uflow) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) (vsnprintf) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) (__stpcpy) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) (__lseek) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) (__fpclassifyl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) (__stdio_exit_needed) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) (__ofl_lock) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) (vfprintf) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (strnlen) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (strerror) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) (__lctrans) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__signbitl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (frexpl) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__towrite) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__fwritex) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_lshrdi3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) (__lshrdi3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_ashldi3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) (__ashldi3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_divdi3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__divdi3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_moddi3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__moddi3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__muldf3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsidf.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__floatsidf) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(addtf3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__addtf3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(divtf3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__divtf3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(eqtf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__eqtf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(getf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__getf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(letf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) (__letf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(multf3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__multf3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(subtf3.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__subtf3) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixtfsi.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__fixtfsi) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(fixunstfsi.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) (__fixunstfsi) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatsitf.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__floatsitf) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(floatunsitf.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__floatunsitf) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extendsftf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__extendsftf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(extenddftf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) (__extenddftf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfsf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__trunctfsf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) (__trunctfdf2) +d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(muldf3.o) (__clzsi2) + +Allocating common symbols +Common symbol size file + +__stack_chk_guard 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) +__hwcap 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) +__libc 0x38 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) +__malloc_lock 0x4 d:/software/compiler/hispark/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 0xe9a 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 0xbe3 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.IsADCSampleChannel + 0x0000000000000000 0x1c obj/drivers/adc/src/adc.o + .text.IsADCSOCx + 0x0000000000000000 0x1c obj/drivers/adc/src/adc.o + .text.IsADCIntx + 0x0000000000000000 0x1c obj/drivers/adc/src/adc.o + .text.IsADCTrigSource + 0x0000000000000000 0x1c obj/drivers/adc/src/adc.o + .text.IsADCFinishMode + 0x0000000000000000 0x2c obj/drivers/adc/src/adc.o + .text.IsADCPriorityMode + 0x0000000000000000 0x1e obj/drivers/adc/src/adc.o + .text.IsADCTotalTime + 0x0000000000000000 0x1c obj/drivers/adc/src/adc.o + .rodata 0x0000000000000000 0x50 obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableAvddChannel + 0x0000000000000000 0x4a obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt0 + 0x0000000000000000 0x8e obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt1 + 0x0000000000000000 0x90 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt2 + 0x0000000000000000 0x8e obj/drivers/adc/src/adc.o + .text.DCL_ADC_SetSOCxBlindInt3 + 0x0000000000000000 0x90 obj/drivers/adc/src/adc.o + .text.DCL_ADC_EnableIntx + 0x0000000000000000 0x86 obj/drivers/adc/src/adc.o + .text.DCL_ADC_ClearIntx + 0x0000000000000000 0x7c obj/drivers/adc/src/adc.o + .text.ADC_GetCTRLAddr + 0x0000000000000000 0x36 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSelectChannel + 0x0000000000000000 0xd2 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSelcetTrigSource + 0x0000000000000000 0xc4 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSetAcqps + 0x0000000000000000 0xcc obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSoftTrigger + 0x0000000000000000 0x86 obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxMultiSoftTrigger + 0x0000000000000000 0x6a obj/drivers/adc/src/adc.o + .text.DCL_ADC_SOCxSetPriority + 0x0000000000000000 0x76 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_ReadSOCxResult + 0x0000000000000000 0x8c 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.DCL_ADC_EnableSOCxContinue + 0x0000000000000000 0x96 obj/drivers/adc/src/adc.o + .text.DCL_ADC_DisableSOCxContinue + 0x0000000000000000 0x98 obj/drivers/adc/src/adc.o + .text.IsDmaChannelNum + 0x0000000000000000 0x50 obj/drivers/adc/src/adc.o + .text.HAL_ADC_Init + 0x0000000000000000 0xd6 obj/drivers/adc/src/adc.o + .text.HAL_ADC_Deinit + 0x0000000000000000 0x62 obj/drivers/adc/src/adc.o + .text.HAL_ADC_ConfigureSoc + 0x0000000000000000 0x214 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_StartIt + 0x0000000000000000 0x158 obj/drivers/adc/src/adc.o + .text.HAL_ADC_SoftTrigMultiSample + 0x0000000000000000 0x9a obj/drivers/adc/src/adc.o + .text.HAL_ADC_SoftTrigSample + 0x0000000000000000 0x9e obj/drivers/adc/src/adc.o + .text.HAL_ADC_GetConvResult + 0x0000000000000000 0x9e 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 + .debug_info 0x0000000000000000 0x6633 obj/drivers/adc/src/adc.o + .debug_abbrev 0x0000000000000000 0x32c obj/drivers/adc/src/adc.o + .debug_aranges + 0x0000000000000000 0x1c8 obj/drivers/adc/src/adc.o + .debug_ranges 0x0000000000000000 0x1b8 obj/drivers/adc/src/adc.o + .debug_line 0x0000000000000000 0x15ae obj/drivers/adc/src/adc.o + .debug_str 0x0000000000000000 0x4f3b obj/drivers/adc/src/adc.o + .comment 0x0000000000000000 0x2a obj/drivers/adc/src/adc.o + .debug_frame 0x0000000000000000 0x794 obj/drivers/adc/src/adc.o + .riscv.attributes + 0x0000000000000000 0x32 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 0x4b07 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 0x5097 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 0x615 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 0x779 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 0x5a9 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 0x14fc 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 0x13ae 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 0x22a6 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 0x18c7 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 0xe94 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 0xfd4 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_IpClkSelectSet + 0x0000000000000000 0xc8 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_IpClkDivSet + 0x0000000000000000 0xc8 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 0x62f 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 0x87e obj/drivers/debug/log/src/app_command.o + .debug_str 0x0000000000000000 0x8c4 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 0x4f0 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 0x466 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 0x313 obj/drivers/debug/log/src/config.o + .debug_str 0x0000000000000000 0x594 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 0x20df 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 0x593 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 0x7b0 obj/drivers/debug/log/src/dfx_log.o + .debug_str 0x0000000000000000 0x8b9 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 0x74a 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 0x5c2 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 0x32d obj/drivers/debug/log/src/ext_command.o + .debug_str 0x0000000000000000 0x54a 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 0x177c 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 0x1366 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 0x1a74 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.HAL_GPIO_DeInit + 0x0000000000000000 0xde 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 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.IsGptSetOption + 0x0000000000000000 0x2c obj/drivers/gpt/src/gpt.o + .text.GPT_GetKeepState + 0x0000000000000000 0x28 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_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 + .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 0xcf6 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 + .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 + .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_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 + .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 0x222d 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 0x9f2 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 0x7d3 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 0x857 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 0xe41 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 0x1774 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 0x24d0 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 0x17a6 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 0x882 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 0x46c4 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.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.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.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.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 0x1e97 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 0xabd 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 0x74b 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 0x4077 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 0x59f 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 0x4ce 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 0x4af 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 0x56e 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 0x60c 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 0x50d 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 0x560 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 0x529 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 0x737 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 0x5da 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 0x552 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 0x666 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 0x626 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 0x58a 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 0x6d5 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 0x59a 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 0x54e 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 0x54e 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 0x4e0 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 0x523 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 0x50a 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 0x5c2 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 0x4d3 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 0x4fd 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 0x546 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 0x16e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o + .debug_str 0x0000000000000000 0x4e2 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 0x16f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o + .debug_str 0x0000000000000000 0x4ec 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 0x1ea obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o + .debug_str 0x0000000000000000 0x4ee 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 0x110f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o + .debug_str 0x0000000000000000 0x80b 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 0x214 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o + .debug_str 0x0000000000000000 0x4e4 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 0xe34 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o + .debug_str 0x0000000000000000 0x76c 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 0x16d obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o + .debug_str 0x0000000000000000 0x4d9 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 0x172 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o + .debug_str 0x0000000000000000 0x4eb 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 0x1e48 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o + .debug_str 0x0000000000000000 0xd51 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 0x1e35 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o + .debug_str 0x0000000000000000 0xda5 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 0x176c obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o + .debug_str 0x0000000000000000 0xc2c 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 0x17c0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o + .debug_str 0x0000000000000000 0xc3d 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 0x199 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o + .debug_str 0x0000000000000000 0x511 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 0x16f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o + .debug_str 0x0000000000000000 0x4f4 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 0x16e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o + .debug_str 0x0000000000000000 0x4e2 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 0x2f5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o + .debug_str 0x0000000000000000 0x51f 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 0x5f1 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o + .debug_str 0x0000000000000000 0x6b7 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 0x304 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o + .debug_str 0x0000000000000000 0x522 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 0x3ac obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o + .debug_str 0x0000000000000000 0x54a 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 0x2ac obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o + .debug_str 0x0000000000000000 0x522 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 0x170 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o + .debug_str 0x0000000000000000 0x4fe 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 0x16f obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o + .debug_str 0x0000000000000000 0x4ec 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 0x1b1 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o + .debug_str 0x0000000000000000 0x53b 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 0x1b2 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o + .debug_str 0x0000000000000000 0x545 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 0x1a4 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o + .debug_str 0x0000000000000000 0x532 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 0x284 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o + .debug_str 0x0000000000000000 0x529 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 0x1ce obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o + .debug_str 0x0000000000000000 0x50b 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 0x1c9 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o + .debug_str 0x0000000000000000 0x53b 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 0x1cf obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o + .debug_str 0x0000000000000000 0x515 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 0x1fe obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o + .debug_str 0x0000000000000000 0x54f 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 0x1a5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o + .debug_str 0x0000000000000000 0x53c 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 0x2f5 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o + .debug_str 0x0000000000000000 0x51d 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 0x293 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o + .debug_str 0x0000000000000000 0x50f 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 0x304 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o + .debug_str 0x0000000000000000 0x521 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 0x2f0 obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o + .debug_str 0x0000000000000000 0x51c 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 0x2ac obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o + .debug_str 0x0000000000000000 0x52e 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 0x1dd obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o + .debug_str 0x0000000000000000 0x4ec 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 0x1de obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o + .debug_str 0x0000000000000000 0x4ee 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 0x16e obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o + .debug_str 0x0000000000000000 0x4e3 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 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.UART0ReadInterruptCallback + 0x0000000000000000 0x12 obj/user/generatecode/system_init.o + .text 0x0000000000000000 0x0 obj/user/mycar/src/mycar_control.o + .data 0x0000000000000000 0x0 obj/user/mycar/src/mycar_control.o + .bss 0x0000000000000000 0x0 obj/user/mycar/src/mycar_control.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetVersion + 0x0000000000000000 0x3e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetPalSpecVersion + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetProductRevision + 0x0000000000000000 0x5a obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetDeviceInfo + 0x0000000000000000 0x38 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetDeviceErrorStatus + 0x0000000000000000 0x50 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetDeviceErrorString + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetRangeStatusString + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetPalErrorString + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetPalStateString + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetPalState + 0x0000000000000000 0x2c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetPowerMode + 0x0000000000000000 0xb4 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetPowerMode + 0x0000000000000000 0x62 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetOffsetCalibrationDataMicroMeter + 0x0000000000000000 0x38 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetLinearityCorrectiveGain + 0x0000000000000000 0x70 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetLinearityCorrectiveGain + 0x0000000000000000 0x2c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetGroupParamHold + 0x0000000000000000 0x24 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetUpperLimitMilliMeter + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetTotalSignalRate + 0x0000000000000000 0x7a obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetTuningSettingBuffer + 0x0000000000000000 0x5e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetTuningSettingBuffer + 0x0000000000000000 0x3e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_WaitDeviceBooted + 0x0000000000000000 0x1e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_ResetDevice + 0x0000000000000000 0xc4 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetDeviceParameters + 0x0000000000000000 0x178 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetRangeFractionEnable + 0x0000000000000000 0x50 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetHistogramMode + 0x0000000000000000 0x24 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetHistogramMode + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetVcselPulsePeriod + 0x0000000000000000 0x4a obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetSequenceStepEnable + 0x0000000000000000 0x6e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetNumberOfSequenceSteps + 0x0000000000000000 0x26 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetSequenceStepsInfo + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetSequenceStepTimeout + 0x0000000000000000 0xf0 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetSequenceStepTimeout + 0x0000000000000000 0x7c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetInterMeasurementPeriodMilliSeconds + 0x0000000000000000 0x8e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetXTalkCompensationEnable + 0x0000000000000000 0x90 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetXTalkCompensationRateMegaCps + 0x0000000000000000 0x92 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetRefCalibration + 0x0000000000000000 0x4a obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetRefCalibration + 0x0000000000000000 0x40 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetNumberOfLimitCheck + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetLimitCheckInfo + 0x0000000000000000 0x44 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetLimitCheckStatus + 0x0000000000000000 0x52 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetLimitCheckCurrent + 0x0000000000000000 0x198 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_GetLimitCheckCurrent + 0x0000000000000000 0x18 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetWrapAroundCheckEnable + 0x0000000000000000 0xa4 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_PerformSingleHistogramMeasurement + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_PerformXTalkMeasurement + 0x0000000000000000 0x2a obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_PerformXTalkCalibration + 0x0000000000000000 0x40 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_PerformOffsetCalibration + 0x0000000000000000 0x40 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_StopMeasurement + 0x0000000000000000 0xd2 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_WaitDeviceReadyForNewMeasurement + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetMeasurementRefSignal + 0x0000000000000000 0x5c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetHistogramMeasurementData + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetNumberOfROIZones + 0x0000000000000000 0x30 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetNumberOfROIZones + 0x0000000000000000 0x26 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetMaxNumberOfROIZones + 0x0000000000000000 0x26 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetGpioConfig + 0x0000000000000000 0x126 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_GetGpioConfig + 0x0000000000000000 0x14 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetInterruptThresholds + 0x0000000000000000 0x92 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetStopCompletedStatus + 0x0000000000000000 0x13a obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_EnableInterruptMask + 0x0000000000000000 0x22 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetSpadAmbientDamperThreshold + 0x0000000000000000 0x80 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetSpadAmbientDamperThreshold + 0x0000000000000000 0x7c obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetSpadAmbientDamperFactor + 0x0000000000000000 0x88 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetSpadAmbientDamperFactor + 0x0000000000000000 0x8e obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_SetReferenceSpads + 0x0000000000000000 0x44 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text.VL53L0X_GetReferenceSpads + 0x0000000000000000 0x40 obj/user/vl53l0x/core/src/vl53l0x_api.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_perform_xtalk_calibration + 0x0000000000000000 0x222 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_perform_offset_calibration + 0x0000000000000000 0x1c4 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_set_offset_calibration_data_micro_meter + 0x0000000000000000 0xb4 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_apply_offset_adjustment + 0x0000000000000000 0x96 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.count_enabled_spads + 0x0000000000000000 0x158 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_get_reference_spads + 0x0000000000000000 0xf0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_set_ref_calibration + 0x0000000000000000 0x54 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text.VL53L0X_get_ref_calibration + 0x0000000000000000 0x56 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .text.VL53L0X_reverse_bytes + 0x0000000000000000 0x8e obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .text.VL53L0X_encode_vcsel_period + 0x0000000000000000 0x2a obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .text.VL53L0X_quadrature_sum + 0x0000000000000000 0x68 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .text.VL53L0X_set_vcsel_pulse_period + 0x0000000000000000 0x6c6 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .debug_info 0x0000000000000000 0x4dc0 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .debug_abbrev 0x0000000000000000 0x1e9 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .debug_aranges + 0x0000000000000000 0x18 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .debug_line 0x0000000000000000 0x2e2 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .debug_str 0x0000000000000000 0x3592 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .comment 0x0000000000000000 0x2a obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .riscv.attributes + 0x0000000000000000 0x32 obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .rodata 0x0000000000000000 0x4a6 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_check_part_used + 0x0000000000000000 0xa6 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_device_info + 0x0000000000000000 0x14a obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_device_error_string + 0x0000000000000000 0x19e obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .rodata.VL53L0X_get_device_error_string + 0x0000000000000000 0x3c obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_range_status_string + 0x0000000000000000 0xd8 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .rodata.VL53L0X_get_range_status_string + 0x0000000000000000 0x18 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_pal_error_string + 0x0000000000000000 0x1e6 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .rodata.VL53L0X_get_pal_error_string + 0x0000000000000000 0x190 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_pal_state_string + 0x0000000000000000 0x10a obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_sequence_steps_info + 0x0000000000000000 0xb4 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .rodata.VL53L0X_get_sequence_steps_info + 0x0000000000000000 0x14 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text.VL53L0X_get_limit_check_info + 0x0000000000000000 0xdc obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .rodata.VL53L0X_get_limit_check_info + 0x0000000000000000 0x18 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_info 0x0000000000000000 0x5675 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_abbrev 0x0000000000000000 0x28c obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_aranges + 0x0000000000000000 0x58 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_ranges 0x0000000000000000 0x48 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_line 0x0000000000000000 0x8db obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_str 0x0000000000000000 0x3ec2 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .comment 0x0000000000000000 0x2a obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .debug_frame 0x0000000000000000 0x13c obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .riscv.attributes + 0x0000000000000000 0x32 obj/user/vl53l0x/core/src/vl53l0x_api_strings.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/mine/src/vl53l0x.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/mine/src/vl53l0x.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/mine/src/vl53l0x.o + .text.Vl53l0xStop + 0x0000000000000000 0x32 obj/user/vl53l0x/mine/src/vl53l0x.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .bss.debug_string + 0x0000000000000000 0x100 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .text.VL53L0X_write_dword + 0x0000000000000000 0x78 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .text.VL53L0X_platform_wait_us + 0x0000000000000000 0x4c obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .text.VL53L0X_wait_ms + 0x0000000000000000 0x30 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .rodata 0x0000000000000000 0x4 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .text 0x0000000000000000 0x0 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .data 0x0000000000000000 0x0 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .bss 0x0000000000000000 0x0 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .text.VL53L0X_LockSequenceAccess + 0x0000000000000000 0x1a obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .text.VL53L0X_UnlockSequenceAccess + 0x0000000000000000 0x1a obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .text.VL53L0X_WrDWord + 0x0000000000000000 0x5c obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .text 0x0000000000000000 0x35e d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .rodata 0x0000000000000000 0x100 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_info 0x0000000000000000 0x2d0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_abbrev 0x0000000000000000 0xd2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_aranges + 0x0000000000000000 0x18 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_line 0x0000000000000000 0x345 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .debug_str 0x0000000000000000 0x483 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clz.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .text.iswspace + 0x0000000000000000 0x26 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .text.__iswspace_l + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .rodata.spaces.1304 + 0x0000000000000000 0x58 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(iswspace.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .text.isxdigit + 0x0000000000000000 0x1c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .text.__isxdigit_l + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(isxdigit.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.free 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text.__simple_malloc + 0x0000000000000000 0x224 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text.__libc_malloc + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text.default_malloc + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.brk.1649 + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.cur.1650 + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.end.1651 + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sbss.lock 0x0000000000000000 0x4 d:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .sdata.__bump_lockptr + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lite_malloc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.queue 0x0000000000000000 0x28 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.get_meta + 0x0000000000000000 0xc8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.get_stride + 0x0000000000000000 0x2e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.nontrivial_free + 0x0000000000000000 0x2ac d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text.__libc_free + 0x0000000000000000 0x1cc d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(free.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.queue 0x0000000000000000 0x28 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.get_stride + 0x0000000000000000 0x2e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.enframe 0x0000000000000000 0xde d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.rdlock 0x0000000000000000 0x24 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.step_seq + 0x0000000000000000 0x3c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.size_to_class + 0x0000000000000000 0x8a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__malloc_atfork + 0x0000000000000000 0x24 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__malloc_alloc_meta + 0x0000000000000000 0x224 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.alloc_slot + 0x0000000000000000 0x4fe d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__libc_malloc_impl + 0x0000000000000000 0x200 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text.__malloc_allzerop + 0x0000000000000000 0x140 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .bss.__malloc_context + 0x0000000000000000 0x1f8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .rodata.__malloc_size_classes + 0x0000000000000000 0x60 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .rodata.debruijn32.2634 + 0x0000000000000000 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .rodata.small_cnt_tab + 0x0000000000000000 0x1b d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .sdata.med_cnt_tab + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + COMMON 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(malloc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .text.__madvise + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(madvise.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .text.dummy 0x0000000000000000 0x2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .text.__mmap 0x0000000000000000 0x9e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mmap.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .text.__mprotect + 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mprotect.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .text.dummy 0x0000000000000000 0x2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .text.__munmap + 0x0000000000000000 0x28 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(munmap.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .text.mbtowc 0x0000000000000000 0x100 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbtowc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .text.wcstombs + 0x0000000000000000 0x38 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcstombs.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .text.wctomb 0x0000000000000000 0xe d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wctomb.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .text.feof 0x0000000000000000 0x3a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(feof.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .text.locking_getc + 0x0000000000000000 0x82 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .text.fgetc 0x0000000000000000 0x3e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .text.fgets 0x0000000000000000 0x124 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgets.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .text.__fgetwc_unlocked + 0x0000000000000000 0x11a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .text.fgetwc 0x0000000000000000 0x44 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fgetwc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .text.fread 0x0000000000000000 0xc8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fread.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text.__fseeko_unlocked + 0x0000000000000000 0x98 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text.__fseeko + 0x0000000000000000 0x50 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text.fseek 0x0000000000000000 0xe d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fseek.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text.__ftello_unlocked + 0x0000000000000000 0x52 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text.__ftello + 0x0000000000000000 0x4c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text.ftell 0x0000000000000000 0x2c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ftell.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .text.fwide 0x0000000000000000 0x76 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwide.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .bss.buf 0x0000000000000000 0x408 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .data.__stdin_FILE + 0x0000000000000000 0x90 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .sdata.__stdin_used + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .sdata.stdin 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stdin.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .text.ungetc 0x0000000000000000 0x86 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .text.ungetwc 0x0000000000000000 0x108 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ungetwc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .text.vsprintf + 0x0000000000000000 0x14 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsprintf.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtox 0x0000000000000000 0xa2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtof 0x0000000000000000 0x44 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtod 0x0000000000000000 0x44 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text.strtold 0x0000000000000000 0x4e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtod.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtox 0x0000000000000000 0x7c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoull + 0x0000000000000000 0xc d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoll 0x0000000000000000 0xe d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoul 0x0000000000000000 0x16 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtol 0x0000000000000000 0x18 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoimax + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text.strtoumax + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strtol.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .text.memchr 0x0000000000000000 0x78 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memchr.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .text.memmove 0x0000000000000000 0xf6 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memmove.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .text.strchr 0x0000000000000000 0x26 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchr.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .text.__strchrnul + 0x0000000000000000 0x84 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strchrnul.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .text.strcmp 0x0000000000000000 0x1c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcmp.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .text.strlen 0x0000000000000000 0x46 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strlen.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .text.wcschr 0x0000000000000000 0x30 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcschr.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .text.wcslen 0x0000000000000000 0x12 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcslen.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .text.__lock 0x0000000000000000 0xa4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .text.__unlock + 0x0000000000000000 0x3c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lock.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + COMMON 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stack_chk_fail.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .text.__errno_location + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__errno_location.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text.scanexp 0x0000000000000000 0x1e0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text.decfloat + 0x0000000000000000 0x111e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text.__floatscan + 0x0000000000000000 0xb4c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.__floatscan.cst4 + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.__floatscan.str1.4 + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.decfloat.cst16 + 0x0000000000000000 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.decfloat.cst8 + 0x0000000000000000 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.p10s.2022 + 0x0000000000000000 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .rodata.th.2003 + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(floatscan.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .text.__intscan + 0x0000000000000000 0x4da d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .rodata 0x0000000000000000 0x9 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .rodata.table 0x0000000000000000 0x101 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(intscan.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .sbss.__progname + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .sbss.__progname_full + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + COMMON 0x0000000000000000 0x3c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(libc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .text.__shlim 0x0000000000000000 0x36 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .text.__shgetc + 0x0000000000000000 0xe6 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(shgetc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .text.__syscall_ret + 0x0000000000000000 0x28 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(syscall_ret.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .rodata.__c_locale + 0x0000000000000000 0x18 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .rodata.empty_mo + 0x0000000000000000 0x14 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(c_locale.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .text.copysignl + 0x0000000000000000 0x38 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(copysignl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .text.fabsl 0x0000000000000000 0x26 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fabsl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .text.fmodl 0x0000000000000000 0x3b0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fmodl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .text.scalbn 0x0000000000000000 0xce d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .rodata.scalbn.cst8 + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbn.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .text.scalbnl 0x0000000000000000 0x154 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(scalbnl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .rodata.__fsmu8 + 0x0000000000000000 0xcc d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(internal.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .text.mbrtowc 0x0000000000000000 0x108 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .sbss.internal_state.3006 + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(mbrtowc.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .text.wcrtomb 0x0000000000000000 0xfc d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcrtomb.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .text.wcsrtombs + 0x0000000000000000 0x134 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(wcsrtombs.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .text.__lockfile + 0x0000000000000000 0x7c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .text.__unlockfile + 0x0000000000000000 0x34 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lockfile.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .text.dummy 0x0000000000000000 0x2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .text.__stdio_close + 0x0000000000000000 0x22 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_close.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .text.__stdio_read + 0x0000000000000000 0xac d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_read.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .text.__stdio_seek + 0x0000000000000000 0xa d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_seek.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .text.__toread + 0x0000000000000000 0x56 d:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__toread.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .text.__uflow 0x0000000000000000 0x54 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__uflow.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .text.sn_write + 0x0000000000000000 0x8a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .text.vsnprintf + 0x0000000000000000 0xa2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vsnprintf.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .text.__lseek 0x0000000000000000 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(lseek.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .text.__fpclassifyl + 0x0000000000000000 0x40 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__fpclassifyl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .text.close_file + 0x0000000000000000 0x52 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .text.__stdio_exit + 0x0000000000000000 0x56 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .sbss.dummy_file + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__stdio_exit.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .text.__ofl_lock + 0x0000000000000000 0x22 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .text.__ofl_unlock + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .sbss.ofl_head + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .sbss.ofl_lock + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .sdata.__stdio_ofl_lockptr + 0x0000000000000000 0x4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(ofl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.pop_arg 0x0000000000000000 0xdc d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.pop_arg + 0x0000000000000000 0x48 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.fmt_u 0x0000000000000000 0x6a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.getint 0x0000000000000000 0x48 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.out 0x0000000000000000 0x1a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.pad 0x0000000000000000 0xba d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.fmt_fp 0x0000000000000000 0xf4a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.printf_core + 0x0000000000000000 0x74a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.printf_core + 0x0000000000000000 0x100 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text.vfprintf + 0x0000000000000000 0x14e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.fmt_fp.cst16 + 0x0000000000000000 0x10 d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.states + 0x0000000000000000 0x1d0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .rodata.xdigits + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(vfprintf.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .text.strnlen 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strnlen.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .text.__strerror_l + 0x0000000000000000 0x30 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .text.strerror + 0x0000000000000000 0xe d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .rodata.errmsgidx + 0x0000000000000000 0x108 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .rodata.errmsgstr + 0x0000000000000000 0x77a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strerror.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text.dummy 0x0000000000000000 0x2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text.__lctrans + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text.__lctrans_cur + 0x0000000000000000 0x10 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__lctrans.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .text.__signbitl + 0x0000000000000000 0x8 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__signbitl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .text.frexpl 0x0000000000000000 0x11c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(frexpl.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .text.__towrite + 0x0000000000000000 0x34 d:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(__towrite.o) + .text 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .bss 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .text.__fwritex + 0x0000000000000000 0xa4 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .text.fwrite 0x0000000000000000 0x6e d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(fwrite.o) + .text 0x0000000000000000 0x2a d:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(trunctfdf2.o) + .text 0x0000000000000000 0x3c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + .data 0x0000000000000000 0x0 d:/software/compiler/hispark/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:/software/compiler/hispark/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 0x337 d:/software/compiler/hispark/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 0x124 d:/software/compiler/hispark/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 0x6b d:/software/compiler/hispark/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 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + .debug_ranges 0x0000000000000000 0x18 d:/software/compiler/hispark/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 0x38d d:/software/compiler/hispark/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 0x4a0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + .comment 0x0000000000000000 0x2a d:/software/compiler/hispark/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 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.o) + .riscv.attributes + 0x0000000000000000 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(_clzsi2.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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a +LOAD d:/software/compiler/hispark/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/mycar/src/mycar_control.o +LOAD obj/user/vl53l0x/core/src/vl53l0x_api.o +LOAD obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o +LOAD obj/user/vl53l0x/core/src/vl53l0x_api_core.o +LOAD obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o +LOAD obj/user/vl53l0x/core/src/vl53l0x_api_strings.o +LOAD obj/user/vl53l0x/mine/src/vl53l0x.o +LOAD obj/user/vl53l0x/mine/src/vl53l0x_iic.o +LOAD obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o +LOAD obj/user/vl53l0x/platform/src/vl53l0x_platform.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 0x6ec + *(.text.entry) + .text.entry 0x0000000003000004 0x6ec obj/chip/3061m/startup.o + 0x0000000003000004 _start + +.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 0x00000000030006f0 + 0x00000000030006f0 __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 0x00000000030006f0 + 0x00000000030006f0 __reserved_code_load_addr = LOADADDR (.reserved.data) + 0x0000000004000000 __reserved_code_start_addr = . + *(.reserved.data*) + 0x0000000004000000 . = ALIGN (0x4) + 0x0000000004000000 __reserved_code_end_addr = . + +.text 0x00000000030006f0 0xee88 + 0x00000000030006f0 __start_addr = . + *(.text*) + .text.Chip_InitFail + 0x00000000030006f0 0x8 obj/chip/3061m/chipinit/chipinit.o + .text.Chip_Init + 0x00000000030006f8 0x40 obj/chip/3061m/chipinit/chipinit.o + 0x00000000030006f8 Chip_Init + .text.CalculateGain + 0x0000000003000738 0x2a obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.CHIP_GetInfo + 0x0000000003000762 0x4a obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.CHIP_AnalogTrim + 0x00000000030007ac 0x50c obj/chip/3061m/chipinit/anatrim/anatrim.o + .text.FOTP_InfoGet.trans.43 + 0x0000000003000cb8 0x4 _kmpl_trans + 0x0000000003000cb8 FOTP_InfoGet.trans.43 + .text.ANATRIM_Entry + 0x0000000003000cbc 0x52 obj/chip/3061m/chipinit/anatrim/anatrim.o + 0x0000000003000cbc ANATRIM_Entry + .text.ANAVREF_Init + 0x0000000003000d0e 0x5a obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + 0x0000000003000d0e ANAVREF_Init + .text.HAL_CRG_IpEnableSet.trans.18 + 0x0000000003000d68 0x4 _kmpl_trans + 0x0000000003000d68 HAL_CRG_IpEnableSet.trans.18 + .text.CRG_SetCoreClockSelect + 0x0000000003000d6c 0x42 obj/chip/3061m/chipinit/crginit/crginit.o + 0x0000000003000d6c CRG_SetCoreClockSelect + .text.SetFlashDiv + 0x0000000003000dae 0x92 obj/chip/3061m/chipinit/flashinit/flashinit.o + .text.GetFlashFreq + 0x0000000003000e40 0x64 obj/chip/3061m/chipinit/flashinit/flashinit.o + .text.FLASH_ClockConfig + 0x0000000003000ea4 0xc4 obj/chip/3061m/chipinit/flashinit/flashinit.o + 0x0000000003000ea4 FLASH_ClockConfig + .text.SYSTICK_Init + 0x0000000003000f68 0x22 obj/chip/3061m/chipinit/systickinit/systickinit.o + 0x0000000003000f68 SYSTICK_Init + .text.SYSTICK_GetCRGHZ + 0x0000000003000f8a 0x1c obj/chip/3061m/chipinit/systickinit/systickinit.o + 0x0000000003000f8a SYSTICK_GetCRGHZ + .text.FOTP_CheckReadStatus + 0x0000000003000fa6 0x84 obj/chip/3061m/fotp/fotp_info_read.o + .text.FOTP_InfoGet + 0x000000000300102a 0x162 obj/chip/3061m/fotp/fotp_info_read.o + 0x000000000300102a FOTP_InfoGet + .text.GetCrgIpMatchInfo + 0x000000000300118c 0x64 obj/chip/3061m/ip_crg/ip_crg_common.o + 0x000000000300118c GetCrgIpMatchInfo + .text.AssertErrorLog + 0x00000000030011f0 0x16 obj/drivers/base/src/assert.o + 0x00000000030011f0 AssertErrorLog + .text.DCL_SYSTICK_GetTick + 0x0000000003001206 0x14 obj/drivers/base/src/clock.o + .text.BASE_FUNC_DelayUs + 0x000000000300121a 0x5a obj/drivers/base/src/clock.o + 0x000000000300121a BASE_FUNC_DelayUs + .text.BASE_FUNC_DelayMs + 0x0000000003001274 0x38 obj/drivers/base/src/clock.o + 0x0000000003001274 BASE_FUNC_DelayMs + .text.BASE_FUNC_DelaySeconds + 0x00000000030012ac 0x38 obj/drivers/base/src/clock.o + 0x00000000030012ac BASE_FUNC_DelaySeconds + .text.BASE_FUNC_Delay + 0x00000000030012e4 0x52 obj/drivers/base/src/clock.o + 0x00000000030012e4 BASE_FUNC_Delay + .text.IRQ_ClearN + 0x0000000003001336 0x20 obj/drivers/base/src/interrupt.o + .text.InterruptEntry + 0x0000000003001356 0x3c obj/drivers/base/src/interrupt.o + 0x0000000003001356 InterruptEntry + .text.IRQ_Init + 0x0000000003001392 0x50 obj/drivers/base/src/interrupt.o + 0x0000000003001392 IRQ_Init + .text.IRQ_Register + 0x00000000030013e2 0x82 obj/drivers/base/src/interrupt.o + 0x00000000030013e2 IRQ_Register + .text.IRQ_EnableN + 0x0000000003001464 0x12e obj/drivers/base/src/interrupt.o + 0x0000000003001464 IRQ_EnableN + .text.SysErrPrint + 0x0000000003001592 0x12 obj/drivers/base/src/interrupt.o + 0x0000000003001592 SysErrPrint + .text.SysErrFinish + 0x00000000030015a4 0xe obj/drivers/base/src/interrupt.o + .text.SysErrExcEntry + 0x00000000030015b2 0x1e obj/drivers/base/src/interrupt.o + 0x00000000030015b2 SysErrExcEntry + .text.SysErrNmiEntry + 0x00000000030015d0 0x34 obj/drivers/base/src/interrupt.o + 0x00000000030015d0 SysErrNmiEntry + .text.SetLocalIntNumPri + 0x0000000003001604 0x2ca obj/drivers/base/src/interrupt.o + .text.IRQ_SetLocalPriority + 0x00000000030018ce 0x2e4 obj/drivers/base/src/interrupt.o + .text.IRQ_SetPriority + 0x0000000003001bb2 0x74 obj/drivers/base/src/interrupt.o + 0x0000000003001bb2 IRQ_SetPriority + .text.IRQ_DummyHandler + 0x0000000003001c26 0x12 obj/drivers/base/src/interrupt.o + .text.IRQ_SetCallBack + 0x0000000003001c38 0x3e obj/drivers/base/src/interrupt.o + .text.DCL_SYSCTRL_CrgWriteProtectionDisable + 0x0000000003001c76 0x28 obj/drivers/crg/src/crg.o + .text.DCL_SYSCTRL_CrgWriteProtectionEnable + 0x0000000003001c9e 0x2a obj/drivers/crg/src/crg.o + .text.IsCrgPllRefClkSelect + 0x0000000003001cc8 0x2c obj/drivers/crg/src/crg.o + .text.IsCrgPllPreDiv + 0x0000000003001cf4 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgPllPostDiv + 0x0000000003001d10 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgPllPostDiv2 + 0x0000000003001d2c 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgPllFbDiv + 0x0000000003001d48 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgCoreCkSel + 0x0000000003001d64 0x36 obj/drivers/crg/src/crg.o + .text.IsCrg1MCkSel + 0x0000000003001d9a 0x2c obj/drivers/crg/src/crg.o + .text.IsCrg1MCkDiv + 0x0000000003001dc6 0x1c obj/drivers/crg/src/crg.o + .text.IsCrgValidPreDiv + 0x0000000003001de2 0x5e obj/drivers/crg/src/crg.o + .text.IsCrgValidFdDiv + 0x0000000003001e40 0x8a obj/drivers/crg/src/crg.o + .text.IsCrgValidPostDiv + 0x0000000003001eca 0x48 obj/drivers/crg/src/crg.o + .text.IsCrgValidPostDiv2 + 0x0000000003001f12 0x48 obj/drivers/crg/src/crg.o + .text.IsCrgAdcClkModeSelect + 0x0000000003001f5a 0x40 obj/drivers/crg/src/crg.o + .text.IsCrgAdcClkDiv + 0x0000000003001f9a 0x40 obj/drivers/crg/src/crg.o + .text.DCL_CRG_SetCoreClkSel + 0x0000000003001fda 0x70 obj/drivers/crg/src/crg.o + .text.AssertErrorLog.trans.0 + 0x000000000300204a 0x4 _kmpl_trans + 0x000000000300204a AssertErrorLog.trans.0 + .text.HAL_CRG_Init + 0x000000000300204e 0x2c0 obj/drivers/crg/src/crg.o + 0x000000000300204e HAL_CRG_Init + .text.HAL_CRG_SetCoreClockSelect + 0x000000000300230e 0x8e obj/drivers/crg/src/crg.o + 0x000000000300230e HAL_CRG_SetCoreClockSelect + .text.CRG_GetVcoFreq + 0x000000000300239c 0x90 obj/drivers/crg/src/crg.o + .text.HAL_CRG_GetPllFreq + 0x000000000300242c 0x68 obj/drivers/crg/src/crg.o + 0x000000000300242c HAL_CRG_GetPllFreq + .text.HAL_CRG_GetCoreClkFreq + 0x0000000003002494 0x92 obj/drivers/crg/src/crg.o + 0x0000000003002494 HAL_CRG_GetCoreClkFreq + .text.HAL_CRG_GetIpFreq + 0x0000000003002526 0xde obj/drivers/crg/src/crg.o + 0x0000000003002526 HAL_CRG_GetIpFreq + .text.HAL_CRG_IpEnableSet + 0x0000000003002604 0xce obj/drivers/crg/src/crg.o + 0x0000000003002604 HAL_CRG_IpEnableSet + .text.CRG_GetAdcIpFreq + 0x00000000030026d2 0x11a obj/drivers/crg/src/crg.o + .text.CRG_IsValidPllConfig + 0x00000000030027ec 0xc2 obj/drivers/crg/src/crg.o + .text.CRG_IsValid1MHzConfig + 0x00000000030028ae 0x52 obj/drivers/crg/src/crg.o + .text.CRG_GetPllRefIni + 0x0000000003002900 0x2a obj/drivers/crg/src/crg.o + .text.CRG_GetPreDivValue + 0x000000000300292a 0x2e obj/drivers/crg/src/crg.o + .text.CRG_GetPllFbDivValue + 0x0000000003002958 0x42 obj/drivers/crg/src/crg.o + .text.CRG_GetPllPostDivValue + 0x000000000300299a 0x3a obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelEnableSet + 0x00000000030029d4 0x186 obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelEnableGet + 0x0000000003002b5a 0x80 obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelResetSet + 0x0000000003002bda 0x102 obj/drivers/crg/src/crg.o + .text.CRG_IpWoClkSelResetGet + 0x0000000003002cdc 0x82 obj/drivers/crg/src/crg.o + .text.CRG_AdcEnableSet + 0x0000000003002d5e 0xae obj/drivers/crg/src/crg.o + .text.AssertErrorLog.trans.1 + 0x0000000003002e0c 0x4 _kmpl_trans + 0x0000000003002e0c AssertErrorLog.trans.1 + .text.CRG_AdcEnableGet + 0x0000000003002e10 0x76 obj/drivers/crg/src/crg.o + .text.CRG_AdcClkSelectSet + 0x0000000003002e86 0xee obj/drivers/crg/src/crg.o + .text.CRG_AdcClkSelectGet + 0x0000000003002f74 0x82 obj/drivers/crg/src/crg.o + .text.CRG_AdcDivSet + 0x0000000003002ff6 0xd0 obj/drivers/crg/src/crg.o + .text.CRG_AdcDivGet + 0x00000000030030c6 0x8e obj/drivers/crg/src/crg.o + .text.CRG_EfcEnableSet + 0x0000000003003154 0x78 obj/drivers/crg/src/crg.o + .text.CRG_EfcEnableGet + 0x00000000030031cc 0x66 obj/drivers/crg/src/crg.o + .text.CRG_AnaEnableSet + 0x0000000003003232 0x164 obj/drivers/crg/src/crg.o + .text.CRG_AnaEnableGet + 0x0000000003003396 0x76 obj/drivers/crg/src/crg.o + .text.DBG_PrintCh + 0x000000000300340c 0x42 obj/drivers/debug/src/debug.o + .text.DBG_PrintStr + 0x000000000300344e 0x4a obj/drivers/debug/src/debug.o + .text.DBG_Pow 0x0000000003003498 0x40 obj/drivers/debug/src/debug.o + .text.DBG_CountDigits + 0x00000000030034d8 0x68 obj/drivers/debug/src/debug.o + .text.DBG_PutUnsignedNum + 0x0000000003003540 0xb2 obj/drivers/debug/src/debug.o + .text.DBG_PrintInt + 0x00000000030035f2 0x5e obj/drivers/debug/src/debug.o + .text.DBG_PrintHex + 0x0000000003003650 0x44 obj/drivers/debug/src/debug.o + .text.DBG_PrintFlt + 0x0000000003003694 0x13c obj/drivers/debug/src/debug.o + .text.ParseSpecifier + 0x00000000030037d0 0x19c obj/drivers/debug/src/debug.o + .text.DBG_PrintIntWithField + 0x000000000300396c 0x11a obj/drivers/debug/src/debug.o + .text.DBG_Atoi + 0x0000000003003a86 0x6a obj/drivers/debug/src/debug.o + .text.DBG_UartPrintf + 0x0000000003003af0 0x168 obj/drivers/debug/src/debug.o + 0x0000000003003af0 DBG_UartPrintf + .text.IsGpioValue + 0x0000000003003c58 0x2c obj/drivers/gpio/src/gpio.o + .text.IsGpioDirection + 0x0000000003003c84 0x2c obj/drivers/gpio/src/gpio.o + .text.IsGpioPins + 0x0000000003003cb0 0x30 obj/drivers/gpio/src/gpio.o + .text.IsGpioPin + 0x0000000003003ce0 0x7e obj/drivers/gpio/src/gpio.o + .text.IsGpioITMode + 0x0000000003003d5e 0x54 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_SetValue + 0x0000000003003db2 0xd4 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_SetDirection + 0x0000000003003e86 0xf6 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_ClearIrq + 0x0000000003003f7c 0xa6 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_EnableIrq + 0x0000000003004022 0xb0 obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_DisableIrq + 0x00000000030040d2 0xaa obj/drivers/gpio/src/gpio.o + .text.DCL_GPIO_GetMIS + 0x000000000300417c 0x7a obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_Init + 0x00000000030041f6 0xe6 obj/drivers/gpio/src/gpio.o + 0x00000000030041f6 HAL_GPIO_Init + .text.HAL_GPIO_SetDirection + 0x00000000030042dc 0xe8 obj/drivers/gpio/src/gpio.o + 0x00000000030042dc HAL_GPIO_SetDirection + .text.HAL_GPIO_SetValue + 0x00000000030043c4 0xea obj/drivers/gpio/src/gpio.o + 0x00000000030043c4 HAL_GPIO_SetValue + .text.AssertErrorLog.trans.2 + 0x00000000030044ae 0x4 _kmpl_trans + 0x00000000030044ae AssertErrorLog.trans.2 + .text.HAL_GPIO_GetPinValue + 0x00000000030044b2 0xcc obj/drivers/gpio/src/gpio.o + 0x00000000030044b2 HAL_GPIO_GetPinValue + .text.GPIO_SetLevelIrqType + 0x000000000300457e 0x96 obj/drivers/gpio/src/gpio.o + .text.GPIO_SetEdgeIrqType + 0x0000000003004614 0x9a obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_SetIrqType + 0x00000000030046ae 0x20e obj/drivers/gpio/src/gpio.o + 0x00000000030046ae HAL_GPIO_SetIrqType + .text.GPIO_ExcuteCallBack + 0x00000000030048bc 0x108 obj/drivers/gpio/src/gpio.o + .text.HAL_GPIO_IrqHandler + 0x00000000030049c4 0x10a obj/drivers/gpio/src/gpio.o + 0x00000000030049c4 HAL_GPIO_IrqHandler + .text.HAL_GPIO_RegisterCallBack + 0x0000000003004ace 0xfa obj/drivers/gpio/src/gpio.o + 0x0000000003004ace HAL_GPIO_RegisterCallBack + .text.IsGptPwmNum + 0x0000000003004bc8 0x1c obj/drivers/gpt/src/gpt.o + .text.IsGptDiv + 0x0000000003004be4 0x1e obj/drivers/gpt/src/gpt.o + .text.IsGptPeriod + 0x0000000003004c02 0x30 obj/drivers/gpt/src/gpt.o + .text.IsGptRefDot + 0x0000000003004c32 0x1e obj/drivers/gpt/src/gpt.o + .text.IsGptAction + 0x0000000003004c50 0x1c obj/drivers/gpt/src/gpt.o + .text.HAL_GPT_Init + 0x0000000003004c6c 0x8e obj/drivers/gpt/src/gpt.o + 0x0000000003004c6c HAL_GPT_Init + .text.HAL_GPT_Start + 0x0000000003004cfa 0x8e obj/drivers/gpt/src/gpt.o + 0x0000000003004cfa HAL_GPT_Start + .text.HAL_GPT_Stop + 0x0000000003004d88 0x8c obj/drivers/gpt/src/gpt.o + 0x0000000003004d88 HAL_GPT_Stop + .text.HAL_GPT_Config + 0x0000000003004e14 0x30c obj/drivers/gpt/src/gpt.o + 0x0000000003004e14 HAL_GPT_Config + .text.HAL_GPT_GetReferCounterAndAction + 0x0000000003005120 0xda obj/drivers/gpt/src/gpt.o + 0x0000000003005120 HAL_GPT_GetReferCounterAndAction + .text.AssertErrorLog.trans.3 + 0x00000000030051fa 0x4 _kmpl_trans + 0x00000000030051fa AssertErrorLog.trans.3 + .text.IsI2cFunctionMode + 0x00000000030051fe 0x40 obj/drivers/i2c/src/i2c.o + .text.IsI2cAddressMode + 0x000000000300523e 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cSdaHoldTime + 0x000000000300526a 0x1e obj/drivers/i2c/src/i2c.o + .text.IsI2cGeneralCallMode + 0x0000000003005288 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cOwnAddressOrMask + 0x00000000030052b4 0x1c obj/drivers/i2c/src/i2c.o + .text.IsXMBusAddressOrMask + 0x00000000030052d0 0x1c obj/drivers/i2c/src/i2c.o + .text.IsXMBusAddressEnable + 0x00000000030052ec 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cSpikeFilterTime + 0x0000000003005318 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cFreq + 0x0000000003005334 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cIgnoreAckFlag + 0x0000000003005350 0x2c obj/drivers/i2c/src/i2c.o + .text.IsI2cTxWaterMark + 0x000000000300537c 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cRxWaterMark + 0x0000000003005398 0x1c obj/drivers/i2c/src/i2c.o + .text.IsI2cSdaDelayTime + 0x00000000030053b4 0x1c obj/drivers/i2c/src/i2c.o + .text.CheckAllInitParameters + 0x00000000030053d0 0x24c obj/drivers/i2c/src/i2c.o + .text.HAL_I2C_Init + 0x000000000300561c 0x2e2 obj/drivers/i2c/src/i2c.o + 0x000000000300561c HAL_I2C_Init + .text.DCL_IOCMG_SetRegValue + 0x00000000030058fe 0x44 obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetDriveRate + 0x0000000003005942 0x6e obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetPullMode + 0x00000000030059b0 0x8c obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetLevelShiftRate + 0x0000000003005a3c 0x6e obj/drivers/iocmg/src/iocmg.o + .text.DCL_IOCMG_SetSchmidtMode + 0x0000000003005aaa 0x6e obj/drivers/iocmg/src/iocmg.o + .text.IOCMG_GetRegAddr + 0x0000000003005b18 0x52 obj/drivers/iocmg/src/iocmg.o + .text.HAL_IOCMG_SetPinAltFuncMode + 0x0000000003005b6a 0x3a obj/drivers/iocmg/src/iocmg.o + 0x0000000003005b6a HAL_IOCMG_SetPinAltFuncMode + .text.HAL_IOCMG_SetPinPullMode + 0x0000000003005ba4 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003005ba4 HAL_IOCMG_SetPinPullMode + .text.HAL_IOCMG_SetPinSchmidtMode + 0x0000000003005bf0 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003005bf0 HAL_IOCMG_SetPinSchmidtMode + .text.HAL_IOCMG_SetPinLevelShiftRate + 0x0000000003005c3c 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003005c3c HAL_IOCMG_SetPinLevelShiftRate + .text.HAL_IOCMG_SetPinDriveRate + 0x0000000003005c88 0x4c obj/drivers/iocmg/src/iocmg.o + 0x0000000003005c88 HAL_IOCMG_SetPinDriveRate + .text.IsTimerMode + 0x0000000003005cd4 0x36 obj/drivers/timer/src/timer.o + .text.IsTimerInterruptType + 0x0000000003005d0a 0x2c obj/drivers/timer/src/timer.o + .text.IsTimerSize + 0x0000000003005d36 0x2c obj/drivers/timer/src/timer.o + .text.IsTimerPeriod + 0x0000000003005d62 0x1c obj/drivers/timer/src/timer.o + .text.IsTimerDiv + 0x0000000003005d7e 0x36 obj/drivers/timer/src/timer.o + .text.HAL_TIMER_Init + 0x0000000003005db4 0x252 obj/drivers/timer/src/timer.o + 0x0000000003005db4 HAL_TIMER_Init + .text.AssertErrorLog.trans.4 + 0x0000000003006006 0x4 _kmpl_trans + 0x0000000003006006 AssertErrorLog.trans.4 + .text.HAL_TIMER_Start + 0x000000000300600a 0x82 obj/drivers/timer/src/timer.o + 0x000000000300600a HAL_TIMER_Start + .text.HAL_TIMER_IrqHandler + 0x000000000300608c 0xe8 obj/drivers/timer/src/timer.o + 0x000000000300608c HAL_TIMER_IrqHandler + .text.HAL_TIMER_RegisterCallback + 0x0000000003006174 0x94 obj/drivers/timer/src/timer.o + 0x0000000003006174 HAL_TIMER_RegisterCallback + .text.IsUartDatalength + 0x0000000003006208 0x1c obj/drivers/uart/src/uart.o + .text.IsUartStopbits + 0x0000000003006224 0x2c obj/drivers/uart/src/uart.o + .text.IsUartParitymode + 0x0000000003006250 0x22 obj/drivers/uart/src/uart.o + .text.IsUartTransmode + 0x0000000003006272 0x3c obj/drivers/uart/src/uart.o + .text.IsUartFIFOThreshold + 0x00000000030062ae 0x1c obj/drivers/uart/src/uart.o + .text.IsUartOversampleMultiple + 0x00000000030062ca 0x1c obj/drivers/uart/src/uart.o + .text.DivClosest + 0x00000000030062e6 0x3e obj/drivers/uart/src/uart.o + .text.BaudDetectCallBack + 0x0000000003006324 0xdc obj/drivers/uart/src/uart.o + .text.CharterMatchCallBack + 0x0000000003006400 0x4c obj/drivers/uart/src/uart.o + .text.UART_SetParityBit + 0x000000000300644c 0x96 obj/drivers/uart/src/uart.o + .text.HAL_UART_Init + 0x00000000030064e2 0x3be obj/drivers/uart/src/uart.o + 0x00000000030064e2 HAL_UART_Init + .text.WriteITCallBack + 0x00000000030068a0 0x152 obj/drivers/uart/src/uart.o + .text.ReadITCallBack + 0x00000000030069f2 0x162 obj/drivers/uart/src/uart.o + .text.ErrorServiceCallback + 0x0000000003006b54 0x14a obj/drivers/uart/src/uart.o + .text.HAL_UART_IrqHandler + 0x0000000003006c9e 0x15e obj/drivers/uart/src/uart.o + 0x0000000003006c9e HAL_UART_IrqHandler + .text.HAL_UART_RegisterCallBack + 0x0000000003006dfc 0x10e obj/drivers/uart/src/uart.o + 0x0000000003006dfc HAL_UART_RegisterCallBack + .text.AssertErrorLog.trans.5 + 0x0000000003006f0a 0x4 _kmpl_trans + 0x0000000003006f0a AssertErrorLog.trans.5 + .text.UART0ReadInterruptCallback + 0x0000000003006f0e 0x22 obj/user/main.o + 0x0000000003006f0e UART0ReadInterruptCallback + .text.TIMER0_InterruptProcess + 0x0000000003006f30 0x70 obj/user/main.o + 0x0000000003006f30 TIMER0_InterruptProcess + .text.GPIO1_1_CallbackFunc + 0x0000000003006fa0 0x26 obj/user/main.o + 0x0000000003006fa0 GPIO1_1_CallbackFunc + .text.GPIO1_4_CallbackFunc + 0x0000000003006fc6 0x26 obj/user/main.o + 0x0000000003006fc6 GPIO1_4_CallbackFunc + .text.UART0_InterruptTxInit + 0x0000000003006fec 0x5e obj/user/main.o + .text.GetNumFromStr + 0x000000000300704a 0x50 obj/user/main.o + .text.main 0x000000000300709a 0x30a obj/user/main.o + 0x000000000300709a main + .text.CarWorkStatus.trans.51 + 0x00000000030073a4 0x4 _kmpl_trans + 0x00000000030073a4 CarWorkStatus.trans.51 + .text.DBG_UartPrintf.trans.32 + 0x00000000030073a8 0x4 _kmpl_trans + 0x00000000030073a8 DBG_UartPrintf.trans.32 + .text.strncmp.trans.28 + 0x00000000030073ac 0x4 _kmpl_trans + 0x00000000030073ac strncmp.trans.28 + .text.CRG_Config + 0x00000000030073b0 0x6a obj/user/generatecode/system_init.o + 0x00000000030073b0 CRG_Config + .text.GPIO_Init + 0x000000000300741a 0x218 obj/user/generatecode/system_init.o + .text.HAL_GPIO_SetIrqType.trans.44 + 0x0000000003007632 0x4 _kmpl_trans + 0x0000000003007632 HAL_GPIO_SetIrqType.trans.44 + .text.HAL_GPIO_Init.trans.36 + 0x0000000003007636 0x4 _kmpl_trans + 0x0000000003007636 HAL_GPIO_Init.trans.36 + .text.HAL_GPIO_SetDirection.trans.30 + 0x000000000300763a 0x4 _kmpl_trans + 0x000000000300763a HAL_GPIO_SetDirection.trans.30 + .text.HAL_GPIO_SetValue.trans.11 + 0x000000000300763e 0x4 _kmpl_trans + 0x000000000300763e HAL_GPIO_SetValue.trans.11 + .text.GPT1_Init + 0x0000000003007642 0x92 obj/user/generatecode/system_init.o + .text.GPT2_Init + 0x00000000030076d4 0x92 obj/user/generatecode/system_init.o + .text.GPT3_Init + 0x0000000003007766 0x98 obj/user/generatecode/system_init.o + .text.HAL_GPT_Init.trans.55 + 0x00000000030077fe 0x4 _kmpl_trans + 0x00000000030077fe HAL_GPT_Init.trans.55 + .text.TIMER0_Init + 0x0000000003007802 0xcc obj/user/generatecode/system_init.o + .text.HAL_CRG_IpEnableSet.trans.19 + 0x00000000030078ce 0x4 _kmpl_trans + 0x00000000030078ce HAL_CRG_IpEnableSet.trans.19 + .text.UART0WriteInterruptCallback + 0x00000000030078d2 0x12 obj/user/generatecode/system_init.o + 0x00000000030078d2 UART0WriteInterruptCallback + .text.UART0_Init + 0x00000000030078e4 0xd0 obj/user/generatecode/system_init.o + .text.IRQ_EnableN.trans.54 + 0x00000000030079b4 0x4 _kmpl_trans + 0x00000000030079b4 IRQ_EnableN.trans.54 + .text.IRQ_SetPriority.trans.53 + 0x00000000030079b8 0x4 _kmpl_trans + 0x00000000030079b8 IRQ_SetPriority.trans.53 + .text.IRQ_Register.trans.52 + 0x00000000030079bc 0x4 _kmpl_trans + 0x00000000030079bc IRQ_Register.trans.52 + .text.I2C0_Init + 0x00000000030079c0 0x86 obj/user/generatecode/system_init.o + .text.IOConfig + 0x0000000003007a46 0x43c obj/user/generatecode/system_init.o + .text.HAL_IOCMG_SetPinDriveRate.trans.24 + 0x0000000003007e82 0x4 _kmpl_trans + 0x0000000003007e82 HAL_IOCMG_SetPinDriveRate.trans.24 + .text.HAL_IOCMG_SetPinLevelShiftRate.trans.23 + 0x0000000003007e86 0x4 _kmpl_trans + 0x0000000003007e86 HAL_IOCMG_SetPinLevelShiftRate.trans.23 + .text.HAL_IOCMG_SetPinSchmidtMode.trans.22 + 0x0000000003007e8a 0x4 _kmpl_trans + 0x0000000003007e8a HAL_IOCMG_SetPinSchmidtMode.trans.22 + .text.HAL_IOCMG_SetPinPullMode.trans.21 + 0x0000000003007e8e 0x4 _kmpl_trans + 0x0000000003007e8e HAL_IOCMG_SetPinPullMode.trans.21 + .text.HAL_IOCMG_SetPinAltFuncMode.trans.20 + 0x0000000003007e92 0x4 _kmpl_trans + 0x0000000003007e92 HAL_IOCMG_SetPinAltFuncMode.trans.20 + .text.SystemInit + 0x0000000003007e96 0x26 obj/user/generatecode/system_init.o + 0x0000000003007e96 SystemInit + .text.MotorStatus + 0x0000000003007ebc 0xb4 obj/user/mycar/src/mycar_control.o + 0x0000000003007ebc MotorStatus + .text.HAL_GPIO_SetValue.trans.12 + 0x0000000003007f70 0x4 _kmpl_trans + 0x0000000003007f70 HAL_GPIO_SetValue.trans.12 + .text.ChangeCarApt + 0x0000000003007f74 0x92 obj/user/mycar/src/mycar_control.o + 0x0000000003007f74 ChangeCarApt + .text.SynTwoMotorSpeed + 0x0000000003008006 0x1da obj/user/mycar/src/mycar_control.o + 0x0000000003008006 SynTwoMotorSpeed + .text.SetCarAptAndStart + 0x00000000030081e0 0xba obj/user/mycar/src/mycar_control.o + 0x00000000030081e0 SetCarAptAndStart + .text.HAL_GPT_GetReferCounterAndAction.trans.45 + 0x000000000300829a 0x4 _kmpl_trans + 0x000000000300829a HAL_GPT_GetReferCounterAndAction.trans.45 + .text.CarWorkStatus + 0x000000000300829e 0x6e obj/user/mycar/src/mycar_control.o + 0x000000000300829e CarWorkStatus + .text.TurnLeft + 0x000000000300830c 0x40 obj/user/mycar/src/mycar_control.o + 0x000000000300830c TurnLeft + .text.TurnRight + 0x000000000300834c 0x40 obj/user/mycar/src/mycar_control.o + 0x000000000300834c TurnRight + .text.Retreat 0x000000000300838c 0x32 obj/user/mycar/src/mycar_control.o + 0x000000000300838c Retreat + .text.ClockwiseMotor + 0x00000000030083be 0x3a obj/user/mycar/src/mycar_control.o + 0x00000000030083be ClockwiseMotor + .text.AnticlockwiseMotor + 0x00000000030083f8 0x3a obj/user/mycar/src/mycar_control.o + 0x00000000030083f8 AnticlockwiseMotor + .text.HAL_GPT_Start.trans.35 + 0x0000000003008432 0x4 _kmpl_trans + 0x0000000003008432 HAL_GPT_Start.trans.35 + .text.Come 0x0000000003008436 0x2e obj/user/mycar/src/mycar_control.o + 0x0000000003008436 Come + .text.AsGuard 0x0000000003008464 0x5a obj/user/mycar/src/mycar_control.o + 0x0000000003008464 AsGuard + .text.BASE_FUNC_Delay.trans.14 + 0x00000000030084be 0x4 _kmpl_trans + 0x00000000030084be BASE_FUNC_Delay.trans.14 + .text.VL53L0X_GetOffsetCalibrationDataMicroMeter + 0x00000000030084c2 0x34 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x00000000030084c2 VL53L0X_GetOffsetCalibrationDataMicroMeter + .text.VL53L0X_SetDeviceAddress + 0x00000000030084f6 0x3e obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x00000000030084f6 VL53L0X_SetDeviceAddress + .text.VL53L0X_DataInit + 0x0000000003008534 0x340 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008534 VL53L0X_DataInit + .text.VL53L0X_SetLimitCheckValue.trans.46 + 0x0000000003008874 0x4 _kmpl_trans + 0x0000000003008874 VL53L0X_SetLimitCheckValue.trans.46 + .text.VL53L0X_SetLimitCheckEnable.trans.39 + 0x0000000003008878 0x4 _kmpl_trans + 0x0000000003008878 VL53L0X_SetLimitCheckEnable.trans.39 + .text.VL53L0X_StaticInit + 0x000000000300887c 0x328 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300887c VL53L0X_StaticInit + .text.VL53L0X_WrByte.trans.6 + 0x0000000003008ba4 0x4 _kmpl_trans + 0x0000000003008ba4 VL53L0X_WrByte.trans.6 + .text.VL53L0X_GetDeviceParameters + 0x0000000003008ba8 0x1c2 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008ba8 VL53L0X_GetDeviceParameters + .text.VL53L0X_SetDeviceMode + 0x0000000003008d6a 0x4e obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008d6a VL53L0X_SetDeviceMode + .text.VL53L0X_GetDeviceMode + 0x0000000003008db8 0x2a obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008db8 VL53L0X_GetDeviceMode + .text.VL53L0X_GetFractionEnable + 0x0000000003008de2 0x4c obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008de2 VL53L0X_GetFractionEnable + .text.VL53L0X_SetMeasurementTimingBudgetMicroSeconds + 0x0000000003008e2e 0x34 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008e2e VL53L0X_SetMeasurementTimingBudgetMicroSeconds + .text.VL53L0X_GetMeasurementTimingBudgetMicroSeconds + 0x0000000003008e62 0x34 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008e62 VL53L0X_GetMeasurementTimingBudgetMicroSeconds + .text.VL53L0X_GetVcselPulsePeriod + 0x0000000003008e96 0x40 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008e96 VL53L0X_GetVcselPulsePeriod + .text.VL53L0X_SetSequenceStepEnable + 0x0000000003008ed6 0x184 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003008ed6 VL53L0X_SetSequenceStepEnable + .text.sequence_step_enabled + 0x000000000300905a 0xc0 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300905a sequence_step_enabled + .text.VL53L0X_GetSequenceStepEnables + 0x000000000300911a 0xe2 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300911a VL53L0X_GetSequenceStepEnables + .text.VL53L0X_RdByte.trans.16 + 0x00000000030091fc 0x4 _kmpl_trans + 0x00000000030091fc VL53L0X_RdByte.trans.16 + .text.VL53L0X_GetInterMeasurementPeriodMilliSeconds + 0x0000000003009200 0x7e obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003009200 VL53L0X_GetInterMeasurementPeriodMilliSeconds + .text.VL53L0X_GetXTalkCompensationEnable + 0x000000000300927e 0x32 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300927e VL53L0X_GetXTalkCompensationEnable + .text.VL53L0X_GetXTalkCompensationRateMegaCps + 0x00000000030092b0 0x88 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x00000000030092b0 VL53L0X_GetXTalkCompensationRateMegaCps + .text.VL53L0X_SetLimitCheckEnable + 0x0000000003009338 0x162 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003009338 VL53L0X_SetLimitCheckEnable + .text.VL53L0X_GetLimitCheckEnable + 0x000000000300949a 0x5a obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300949a VL53L0X_GetLimitCheckEnable + .text.VL53L0X_SetLimitCheckValue + 0x00000000030094f4 0xee obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x00000000030094f4 VL53L0X_SetLimitCheckValue + .text.VL53L0X_WrWord.trans.42 + 0x00000000030095e2 0x4 _kmpl_trans + 0x00000000030095e2 VL53L0X_WrWord.trans.42 + .text.VL53L0X_GetLimitCheckValue + 0x00000000030095e6 0x156 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x00000000030095e6 VL53L0X_GetLimitCheckValue + .text.VL53L0X_RdWord.trans.25 + 0x000000000300973c 0x4 _kmpl_trans + 0x000000000300973c VL53L0X_RdWord.trans.25 + .text.VL53L0X_GetWrapAroundCheckEnable + 0x0000000003009740 0x7a obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003009740 VL53L0X_GetWrapAroundCheckEnable + .text.VL53L0X_PerformSingleMeasurement + 0x00000000030097ba 0x74 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x00000000030097ba VL53L0X_PerformSingleMeasurement + .text.VL53L0X_PerformRefCalibration + 0x000000000300982e 0x3e obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300982e VL53L0X_PerformRefCalibration + .text.VL53L0X_CheckAndLoadInterruptSettings + 0x000000000300986c 0x24e obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300986c VL53L0X_CheckAndLoadInterruptSettings + .text.VL53L0X_GetInterruptThresholds.trans.56 + 0x0000000003009aba 0x4 _kmpl_trans + 0x0000000003009aba VL53L0X_GetInterruptThresholds.trans.56 + .text.VL53L0X_load_tuning_settings.trans.47 + 0x0000000003009abe 0x4 _kmpl_trans + 0x0000000003009abe VL53L0X_load_tuning_settings.trans.47 + .text.VL53L0X_StartMeasurement + 0x0000000003009ac2 0x1c8 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003009ac2 VL53L0X_StartMeasurement + .text.VL53L0X_WrByte.trans.7 + 0x0000000003009c8a 0x4 _kmpl_trans + 0x0000000003009c8a VL53L0X_WrByte.trans.7 + .text.VL53L0X_GetMeasurementDataReady + 0x0000000003009c8e 0xa0 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003009c8e VL53L0X_GetMeasurementDataReady + .text.VL53L0X_GetRangingMeasurementData + 0x0000000003009d2e 0x2f8 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000003009d2e VL53L0X_GetRangingMeasurementData + .text.VL53L0X_PerformSingleRangingMeasurement + 0x000000000300a026 0x70 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300a026 VL53L0X_PerformSingleRangingMeasurement + .text.VL53L0X_SetGpioConfig + 0x000000000300a096 0x2ce obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300a096 VL53L0X_SetGpioConfig + .text.VL53L0X_GetInterruptThresholds + 0x000000000300a364 0x82 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300a364 VL53L0X_GetInterruptThresholds + .text.VL53L0X_ClearInterruptMask + 0x000000000300a3e6 0x9e obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300a3e6 VL53L0X_ClearInterruptMask + .text.VL53L0X_GetInterruptMaskStatus + 0x000000000300a484 0x54 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300a484 VL53L0X_GetInterruptMaskStatus + .text.VL53L0X_PerformRefSpadManagement + 0x000000000300a4d8 0x3a obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000300a4d8 VL53L0X_PerformRefSpadManagement + .text.VL53L0X_get_offset_calibration_data_micro_meter + 0x000000000300a512 0xa6 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a512 VL53L0X_get_offset_calibration_data_micro_meter + .text.get_next_good_spad + 0x000000000300a5b8 0xfa obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a5b8 get_next_good_spad + .text.is_aperture + 0x000000000300a6b2 0x3a obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a6b2 is_aperture + .text.enable_spad_bit + 0x000000000300a6ec 0x96 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a6ec enable_spad_bit + .text.set_ref_spad_map + 0x000000000300a782 0x36 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a782 set_ref_spad_map + .text.get_ref_spad_map + 0x000000000300a7b8 0x36 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a7b8 get_ref_spad_map + .text.enable_ref_spads + 0x000000000300a7ee 0x150 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a7ee enable_ref_spads + .text.perform_ref_signal_measurement + 0x000000000300a93e 0xda obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300a93e perform_ref_signal_measurement + .text.VL53L0X_RdWord.trans.26 + 0x000000000300aa18 0x4 _kmpl_trans + 0x000000000300aa18 VL53L0X_RdWord.trans.26 + .text.VL53L0X_WrByte.trans.8 + 0x000000000300aa1c 0x4 _kmpl_trans + 0x000000000300aa1c VL53L0X_WrByte.trans.8 + .text.VL53L0X_perform_ref_spad_management + 0x000000000300aa20 0x4c2 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300aa20 VL53L0X_perform_ref_spad_management + .text.memcpy.trans.37 + 0x000000000300aee2 0x4 _kmpl_trans + 0x000000000300aee2 memcpy.trans.37 + .text.VL53L0X_set_reference_spads + 0x000000000300aee6 0x17c obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300aee6 VL53L0X_set_reference_spads + .text.VL53L0X_perform_single_ref_calibration + 0x000000000300b062 0x82 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300b062 VL53L0X_perform_single_ref_calibration + .text.VL53L0X_ref_calibration_io + 0x000000000300b0e4 0x196 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300b0e4 VL53L0X_ref_calibration_io + .text.VL53L0X_perform_vhv_calibration + 0x000000000300b27a 0xe6 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300b27a VL53L0X_perform_vhv_calibration + .text.VL53L0X_perform_phase_calibration + 0x000000000300b360 0xe0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300b360 VL53L0X_perform_phase_calibration + .text.VL53L0X_perform_ref_calibration + 0x000000000300b440 0x9e obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x000000000300b440 VL53L0X_perform_ref_calibration + .text.VL53L0X_measurement_poll_for_completion + 0x000000000300b4de 0x78 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300b4de VL53L0X_measurement_poll_for_completion + .text.VL53L0X_decode_vcsel_period + 0x000000000300b556 0x2a obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300b556 VL53L0X_decode_vcsel_period + .text.VL53L0X_isqrt + 0x000000000300b580 0x90 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300b580 VL53L0X_isqrt + .text.VL53L0X_device_read_strobe + 0x000000000300b610 0xa6 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300b610 VL53L0X_device_read_strobe + .text.VL53L0X_RdByte.trans.17 + 0x000000000300b6b6 0x4 _kmpl_trans + 0x000000000300b6b6 VL53L0X_RdByte.trans.17 + .text.VL53L0X_WrByte.trans.9 + 0x000000000300b6ba 0x4 _kmpl_trans + 0x000000000300b6ba VL53L0X_WrByte.trans.9 + .text.VL53L0X_get_info_from_device + 0x000000000300b6be 0xb08 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300b6be VL53L0X_get_info_from_device + .text.VL53L0X_device_read_strobe.trans.38 + 0x000000000300c1c6 0x4 _kmpl_trans + 0x000000000300c1c6 VL53L0X_device_read_strobe.trans.38 + .text.VL53L0X_RdDWord.trans.29 + 0x000000000300c1ca 0x4 _kmpl_trans + 0x000000000300c1ca VL53L0X_RdDWord.trans.29 + .text.VL53L0X_WrByte.trans.10 + 0x000000000300c1ce 0x4 _kmpl_trans + 0x000000000300c1ce VL53L0X_WrByte.trans.10 + .text.VL53L0X_calc_macro_period_ps + 0x000000000300c1d2 0x4c obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c1d2 VL53L0X_calc_macro_period_ps + .text.VL53L0X_encode_timeout + 0x000000000300c21e 0x70 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c21e VL53L0X_encode_timeout + .text.VL53L0X_decode_timeout + 0x000000000300c28e 0x36 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c28e VL53L0X_decode_timeout + .text.VL53L0X_calc_timeout_mclks + 0x000000000300c2c4 0x6c obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c2c4 VL53L0X_calc_timeout_mclks + .text.VL53L0X_calc_timeout_us + 0x000000000300c330 0x6c obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c330 VL53L0X_calc_timeout_us + .text.get_sequence_step_timeout + 0x000000000300c39c 0x1fa obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c39c get_sequence_step_timeout + .text.set_sequence_step_timeout + 0x000000000300c596 0x230 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c596 set_sequence_step_timeout + .text.VL53L0X_GetVcselPulsePeriod.trans.34 + 0x000000000300c7c6 0x4 _kmpl_trans + 0x000000000300c7c6 VL53L0X_GetVcselPulsePeriod.trans.34 + .text.VL53L0X_RdWord.trans.27 + 0x000000000300c7ca 0x4 _kmpl_trans + 0x000000000300c7ca VL53L0X_RdWord.trans.27 + .text.VL53L0X_get_vcsel_pulse_period + 0x000000000300c7ce 0x8a obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c7ce VL53L0X_get_vcsel_pulse_period + .text.VL53L0X_set_measurement_timing_budget_micro_seconds + 0x000000000300c858 0x212 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300c858 VL53L0X_set_measurement_timing_budget_micro_seconds + .text.VL53L0X_GetSequenceStepEnables.trans.49 + 0x000000000300ca6a 0x4 _kmpl_trans + 0x000000000300ca6a VL53L0X_GetSequenceStepEnables.trans.49 + .text.VL53L0X_get_measurement_timing_budget_micro_seconds + 0x000000000300ca6e 0x1a0 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300ca6e VL53L0X_get_measurement_timing_budget_micro_seconds + .text.get_sequence_step_timeout.trans.40 + 0x000000000300cc0e 0x4 _kmpl_trans + 0x000000000300cc0e get_sequence_step_timeout.trans.40 + .text.VL53L0X_load_tuning_settings + 0x000000000300cc12 0x2a2 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300cc12 VL53L0X_load_tuning_settings + .text.VL53L0X_get_total_xtalk_rate + 0x000000000300ceb4 0x7e obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300ceb4 VL53L0X_get_total_xtalk_rate + .text.VL53L0X_get_total_signal_rate + 0x000000000300cf32 0x60 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300cf32 VL53L0X_get_total_signal_rate + .text.get_dmax_lut_points + 0x000000000300cf92 0xba obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300cf92 get_dmax_lut_points + .text.VL53L0X_calc_dmax + 0x000000000300d04c 0x17c obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300d04c VL53L0X_calc_dmax + .text.VL53L0X_calc_sigma_estimate + 0x000000000300d1c8 0x53c obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300d1c8 VL53L0X_calc_sigma_estimate + .text.VL53L0X_isqrt.trans.50 + 0x000000000300d704 0x4 _kmpl_trans + 0x000000000300d704 VL53L0X_isqrt.trans.50 + .text.VL53L0X_get_pal_range_status + 0x000000000300d708 0x406 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x000000000300d708 VL53L0X_get_pal_range_status + .text.VL53L0X_GetLimitCheckValue.trans.48 + 0x000000000300db0e 0x4 _kmpl_trans + 0x000000000300db0e VL53L0X_GetLimitCheckValue.trans.48 + .text.VL53L0X_GetLimitCheckEnable.trans.41 + 0x000000000300db12 0x4 _kmpl_trans + 0x000000000300db12 VL53L0X_GetLimitCheckEnable.trans.41 + .text.device_detect + 0x000000000300db16 0xba obj/user/vl53l0x/mine/src/vl53l0x.o + .text.device_init + 0x000000000300dbd0 0x66 obj/user/vl53l0x/mine/src/vl53l0x.o + .text.Vl53l0xInit + 0x000000000300dc36 0x2e obj/user/vl53l0x/mine/src/vl53l0x.o + 0x000000000300dc36 Vl53l0xInit + .text.Vl53l0xStart + 0x000000000300dc64 0x24 obj/user/vl53l0x/mine/src/vl53l0x.o + 0x000000000300dc64 Vl53l0xStart + .text.DBG_UartPrintf.trans.33 + 0x000000000300dc88 0x4 _kmpl_trans + 0x000000000300dc88 DBG_UartPrintf.trans.33 + .text.GetDistance + 0x000000000300dc8c 0x44 obj/user/vl53l0x/mine/src/vl53l0x.o + 0x000000000300dc8c GetDistance + .text.vl53l0x_iic_start + 0x000000000300dcd0 0x52 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300dcd0 vl53l0x_iic_start + .text.vl53l0x_iic_stop + 0x000000000300dd22 0x5e obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300dd22 vl53l0x_iic_stop + .text.vl53l0x_iic_wait_ack + 0x000000000300dd80 0x9e obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300dd80 vl53l0x_iic_wait_ack + .text.vl53l0x_iic_ack + 0x000000000300de1e 0x52 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300de1e vl53l0x_iic_ack + .text.vl53l0x_iic_nack + 0x000000000300de70 0x52 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300de70 vl53l0x_iic_nack + .text.vl53l0x_iic_send_byte + 0x000000000300dec2 0x9c obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300dec2 vl53l0x_iic_send_byte + .text.vl53l0x_iic_read_byte + 0x000000000300df5e 0xa8 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300df5e vl53l0x_iic_read_byte + .text.HAL_GPIO_SetDirection.trans.31 + 0x000000000300e006 0x4 _kmpl_trans + 0x000000000300e006 HAL_GPIO_SetDirection.trans.31 + .text.vl53l0x_hw_reset + 0x000000000300e00a 0x46 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x000000000300e00a vl53l0x_hw_reset + .text.BASE_FUNC_Delay.trans.15 + 0x000000000300e050 0x4 _kmpl_trans + 0x000000000300e050 BASE_FUNC_Delay.trans.15 + .text.HAL_GPIO_SetValue.trans.13 + 0x000000000300e054 0x4 _kmpl_trans + 0x000000000300e054 HAL_GPIO_SetValue.trans.13 + .text.VL53L0X_write_multi + 0x000000000300e058 0xaa obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e058 VL53L0X_write_multi + .text.VL53L0X_read_multi + 0x000000000300e102 0xd0 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e102 VL53L0X_read_multi + .text.VL53L0X_write_byte + 0x000000000300e1d2 0x50 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e1d2 VL53L0X_write_byte + .text.VL53L0X_write_word + 0x000000000300e222 0x60 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e222 VL53L0X_write_word + .text.VL53L0X_read_byte + 0x000000000300e282 0x4c obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e282 VL53L0X_read_byte + .text.VL53L0X_read_word + 0x000000000300e2ce 0x6a obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e2ce VL53L0X_read_word + .text.VL53L0X_read_dword + 0x000000000300e338 0x68 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x000000000300e338 VL53L0X_read_dword + .text.VL53L0X_WriteMulti + 0x000000000300e3a0 0x74 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e3a0 VL53L0X_WriteMulti + .text.VL53L0X_ReadMulti + 0x000000000300e414 0x70 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e414 VL53L0X_ReadMulti + .text.VL53L0X_WrByte + 0x000000000300e484 0x5c obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e484 VL53L0X_WrByte + .text.VL53L0X_WrWord + 0x000000000300e4e0 0x5c obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e4e0 VL53L0X_WrWord + .text.VL53L0X_UpdateByte + 0x000000000300e53c 0xa6 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e53c VL53L0X_UpdateByte + .text.VL53L0X_RdByte + 0x000000000300e5e2 0x56 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e5e2 VL53L0X_RdByte + .text.VL53L0X_RdWord + 0x000000000300e638 0x56 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e638 VL53L0X_RdWord + .text.VL53L0X_RdDWord + 0x000000000300e68e 0x56 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e68e VL53L0X_RdDWord + .text.VL53L0X_PollingDelay + 0x000000000300e6e4 0x1a obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x000000000300e6e4 VL53L0X_PollingDelay + .text 0x000000000300e6fe 0x222 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + 0x000000000300e6fe __truncdfsf2 + .text.abs 0x000000000300e920 0xa d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + 0x000000000300e920 abs + .text.memcpy 0x000000000300e92a 0x362 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + 0x000000000300e92a memcpy + .text.memset 0x000000000300ec8c 0xbe d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + 0x000000000300ec8c memset + .text.strcpy 0x000000000300ed4a 0x14 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + 0x000000000300ed4a strcpy + .text.strncmp 0x000000000300ed5e 0x2c d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + 0x000000000300ed5e strncmp + .text.__stpcpy + 0x000000000300ed8a 0x5a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + 0x000000000300ed8a __stpcpy + 0x000000000300ed8a stpcpy + *(.ram.text*) + 0x000000000300ede4 . = ALIGN (0x4) + 0x000000000300ede4 __rodata_start = . + *(.rodata*) + .rodata 0x000000000300ede4 0x4 obj/chip/3061m/chipinit/anatrim/anatrim.o + .rodata.g_crgIpMatch + 0x000000000300ede8 0x228 obj/chip/3061m/ip_crg/ip_crg_common.o + .rodata 0x000000000300f010 0x20 obj/drivers/base/src/interrupt.o + .rodata.SetLocalIntNumPri + 0x000000000300f030 0x20 obj/drivers/base/src/interrupt.o + .rodata.IRQ_SetLocalPriority + 0x000000000300f050 0x20 obj/drivers/base/src/interrupt.o + .rodata 0x000000000300f070 0x58 obj/drivers/crg/src/crg.o + .rodata.HAL_CRG_GetIpFreq + 0x000000000300f0c8 0x18 obj/drivers/crg/src/crg.o + .rodata.ParseSpecifier + 0x000000000300f0e0 0x84 obj/drivers/debug/src/debug.o + .rodata 0x000000000300f164 0x3b obj/drivers/gpio/src/gpio.o + *fill* 0x000000000300f19f 0x1 + .rodata 0x000000000300f1a0 0x19 obj/drivers/gpt/src/gpt.o + *fill* 0x000000000300f1b9 0x3 + .rodata 0x000000000300f1bc 0x19 obj/drivers/i2c/src/i2c.o + *fill* 0x000000000300f1d5 0x3 + .rodata 0x000000000300f1d8 0x3d obj/drivers/iocmg/src/iocmg.o + *fill* 0x000000000300f215 0x3 + .rodata 0x000000000300f218 0x3d obj/drivers/timer/src/timer.o + *fill* 0x000000000300f255 0x3 + .rodata.UART_SetParityBit + 0x000000000300f258 0x14 obj/drivers/uart/src/uart.o + .rodata 0x000000000300f26c 0x1b obj/drivers/uart/src/uart.o + *fill* 0x000000000300f287 0x1 + .rodata.HAL_UART_RegisterCallBack + 0x000000000300f288 0x24 obj/drivers/uart/src/uart.o + .rodata 0x000000000300f2ac 0x104 obj/user/main.o + .rodata 0x000000000300f3b0 0x4 obj/user/mycar/src/mycar_control.o + .rodata.VL53L0X_SetDeviceMode + 0x000000000300f3b4 0x58 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_SetSequenceStepEnable + 0x000000000300f40c 0x28 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.sequence_step_enabled + 0x000000000300f434 0x14 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_SetLimitCheckEnable + 0x000000000300f448 0x18 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_SetLimitCheckValue + 0x000000000300f460 0x18 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_GetLimitCheckValue + 0x000000000300f478 0x18 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata.VL53L0X_SetGpioConfig + 0x000000000300f490 0x14 obj/user/vl53l0x/core/src/vl53l0x_api.o + .rodata 0x000000000300f4a4 0xd4 obj/user/vl53l0x/mine/src/vl53l0x.o + 0x000000000300f578 . = ALIGN (0x4) + 0x000000000300f578 __rodata_end = . + *(.got*) + 0x000000000300f578 __text_end = . + +.rela.dyn 0x000000000300f578 0x0 + .rela.text.entry + 0x000000000300f578 0x0 obj/chip/3061m/startup.o + .rela.text.UART0_Init + 0x000000000300f578 0x0 obj/chip/3061m/startup.o + +.data 0x0000000004000020 0x52c load address 0x000000000300f578 + 0x000000000300f578 __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 + .data.targetSpeed + 0x00000000040000fc 0x4 obj/user/main.o + 0x00000000040000fc targetSpeed + .data.KP 0x0000000004000100 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000100 KP + .data.KI 0x0000000004000104 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000104 KI + .data.KD 0x0000000004000108 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000108 KD + .data.DefaultTuningSettings + 0x000000000400010c 0xf3 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x000000000400010c DefaultTuningSettings + *fill* 0x00000000040001ff 0x1 + .data.InterruptThresholdSettings + 0x0000000004000200 0x1b6 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x0000000004000200 InterruptThresholdSettings + *fill* 0x00000000040003b6 0x2 + .data.refArrayQuadrants + 0x00000000040003b8 0x10 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x00000000040003b8 refArrayQuadrants + .data.demo_dev + 0x00000000040003c8 0x184 obj/user/vl53l0x/mine/src/vl53l0x.o + 0x000000000400054c . = ALIGN (0x4) + 0x000000000400054c __data_end = . + 0x000000000000052c __data_size = (__data_end - __data_start) + +.stackBound 0x0000000004004ff0 0x0 load address 0x000000000300faa4 + 0x000000000300faa4 __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 0x000000000300faa4 0x0 + 0x000000000300faa4 __checksum_addr = . + *(CHECKSUM) + 0x000000000300faa4 __checksum_end = . + +.bss 0x000000000400054c 0x6fc + 0x000000000400054c __bss_begin__ = . + *(.bss*) + .bss.g_irqCallbackFunc + 0x000000000400054c 0x398 obj/drivers/base/src/interrupt.o + 0x000000000400054c g_irqCallbackFunc + .bss.g_crgBaseAddr + 0x00000000040008e4 0x4 obj/drivers/crg/src/crg.o + .bss.g_anaEnableFlag + 0x00000000040008e8 0x1 obj/drivers/crg/src/crg.o + .bss.USART_RX_STA + 0x00000000040008e9 0x1 obj/drivers/uart/src/uart.o + 0x00000000040008e9 USART_RX_STA + .bss.g_carStart + 0x00000000040008ea 0x1 obj/user/main.o + 0x00000000040008ea g_carStart + .bss.g_carStop + 0x00000000040008eb 0x1 obj/user/main.o + 0x00000000040008eb g_carStop + .bss.readData 0x00000000040008ec 0x14 obj/user/main.o + .bss.g_uartReceiveFlag + 0x0000000004000900 0x1 obj/user/main.o + .bss.f_250ms 0x0000000004000901 0x1 obj/user/main.o + .bss.f_1s 0x0000000004000902 0x1 obj/user/main.o + .bss.f_10s 0x0000000004000903 0x1 obj/user/main.o + .bss.v_num_left + 0x0000000004000904 0x4 obj/user/main.o + .bss.v_num_right + 0x0000000004000908 0x4 obj/user/main.o + .bss.workStatus + 0x000000000400090c 0x1 obj/user/main.o + *fill* 0x000000000400090d 0x1 + .bss.s_distance + 0x000000000400090e 0x2 obj/user/main.o + 0x000000000400090e s_distance + .bss.f_sedentary + 0x0000000004000910 0x1 obj/user/main.o + .bss.f_guard 0x0000000004000911 0x1 obj/user/main.o + *fill* 0x0000000004000912 0x2 + .bss.time_num 0x0000000004000914 0x4 obj/user/main.o + .bss.time_sedentary_num + 0x0000000004000918 0x4 obj/user/main.o + .bss.g_gpt1 0x000000000400091c 0x34 obj/user/main.o + 0x000000000400091c g_gpt1 + .bss.g_gpt2 0x0000000004000950 0x34 obj/user/main.o + 0x0000000004000950 g_gpt2 + .bss.g_gpt3 0x0000000004000984 0x34 obj/user/main.o + 0x0000000004000984 g_gpt3 + .bss.g_timer0 0x00000000040009b8 0x28 obj/user/main.o + 0x00000000040009b8 g_timer0 + .bss.g_uart0 0x00000000040009e0 0x80 obj/user/main.o + 0x00000000040009e0 g_uart0 + .bss.g_i2c0 0x0000000004000a60 0x68 obj/user/main.o + 0x0000000004000a60 g_i2c0 + .bss.g_gpio1 0x0000000004000ac8 0x48 obj/user/main.o + 0x0000000004000ac8 g_gpio1 + .bss.g_gpio2 0x0000000004000b10 0x48 obj/user/main.o + 0x0000000004000b10 g_gpio2 + .bss.g_gpio3 0x0000000004000b58 0x48 obj/user/main.o + 0x0000000004000b58 g_gpio3 + .bss.g_gpio4 0x0000000004000ba0 0x48 obj/user/main.o + 0x0000000004000ba0 g_gpio4 + .bss.g_gpio5 0x0000000004000be8 0x48 obj/user/main.o + 0x0000000004000be8 g_gpio5 + .bss.preLeftError + 0x0000000004000c30 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000c30 preLeftError + .bss.ppreLeftError + 0x0000000004000c34 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000c34 ppreLeftError + .bss.preRightError + 0x0000000004000c38 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000c38 preRightError + .bss.ppreRightError + 0x0000000004000c3c 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000c3c ppreRightError + .bss.Left_ESC_Output_PWM + 0x0000000004000c40 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000c40 Left_ESC_Output_PWM + .bss.Right_ESC_Output_PWM + 0x0000000004000c44 0x4 obj/user/mycar/src/mycar_control.o + 0x0000000004000c44 Right_ESC_Output_PWM + *(COMMON) + 0x0000000004000c48 . = ALIGN (0x4) + 0x0000000004000c48 __bss_end__ = . + 0x00000000000006fc __bss_size__ = (__bss_end__ - __bss_begin__) + 0x0000000004000634 __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/base/src/assert.o + .riscv.attributes + 0x00000000000001f3 0x32 obj/drivers/base/src/clock.o + .riscv.attributes + 0x0000000000000225 0x36 obj/drivers/base/src/interrupt.o + .riscv.attributes + 0x000000000000025b 0x32 obj/drivers/crg/src/crg.o + .riscv.attributes + 0x000000000000028d 0x32 obj/drivers/debug/src/debug.o + .riscv.attributes + 0x00000000000002bf 0x32 obj/drivers/gpio/src/gpio.o + .riscv.attributes + 0x00000000000002f1 0x32 obj/drivers/gpt/src/gpt.o + .riscv.attributes + 0x0000000000000323 0x32 obj/drivers/i2c/src/i2c.o + .riscv.attributes + 0x0000000000000355 0x32 obj/drivers/iocmg/src/iocmg.o + .riscv.attributes + 0x0000000000000387 0x32 obj/drivers/timer/src/timer.o + .riscv.attributes + 0x00000000000003b9 0x32 obj/drivers/uart/src/uart.o + .riscv.attributes + 0x00000000000003eb 0x32 obj/user/main.o + .riscv.attributes + 0x000000000000041d 0x32 obj/user/generatecode/system_init.o + .riscv.attributes + 0x000000000000044f 0x32 obj/user/mycar/src/mycar_control.o + .riscv.attributes + 0x0000000000000481 0x32 obj/user/vl53l0x/core/src/vl53l0x_api.o + .riscv.attributes + 0x00000000000004b3 0x32 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .riscv.attributes + 0x00000000000004e5 0x32 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .riscv.attributes + 0x0000000000000517 0x32 obj/user/vl53l0x/mine/src/vl53l0x.o + .riscv.attributes + 0x0000000000000549 0x32 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .riscv.attributes + 0x000000000000057b 0x32 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .riscv.attributes + 0x00000000000005ad 0x32 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .riscv.attributes + 0x00000000000005df 0x36 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + .riscv.attributes + 0x0000000000000615 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + .riscv.attributes + 0x0000000000000647 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .riscv.attributes + 0x0000000000000679 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .riscv.attributes + 0x00000000000006ab 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + .riscv.attributes + 0x00000000000006dd 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .riscv.attributes + 0x000000000000070f 0x32 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.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/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/gpio/src/gpio.o + .comment 0x0000000000000029 0x2a obj/drivers/gpt/src/gpt.o + .comment 0x0000000000000029 0x2a obj/drivers/i2c/src/i2c.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/mycar/src/mycar_control.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/core/src/vl53l0x_api.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/mine/src/vl53l0x.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .comment 0x0000000000000029 0x2a obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .comment 0x0000000000000029 0x2a d:/software/compiler/hispark/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:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + .comment 0x0000000000000029 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .comment 0x0000000000000029 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .comment 0x0000000000000029 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + .comment 0x0000000000000029 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .comment 0x0000000000000029 0x2a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + +.note.GNU-stack + 0x0000000000000000 0x0 + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(abs.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memcpy.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(memset.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strcpy.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(strncmp.o) + .note.GNU-stack + 0x0000000000000000 0x0 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../sysroot/usr/lib\libc.a(stpcpy.o) + +.debug_line 0x0000000000000000 0x131b1 + .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 0x53 obj/drivers/base/src/assert.o + .debug_line 0x000000000000145e 0x1bf obj/drivers/base/src/clock.o + .debug_line 0x000000000000161d 0x6ff obj/drivers/base/src/interrupt.o + .debug_line 0x0000000000001d1c 0x1984 obj/drivers/crg/src/crg.o + .debug_line 0x00000000000036a0 0x6d4 obj/drivers/debug/src/debug.o + .debug_line 0x0000000000003d74 0xfec obj/drivers/gpio/src/gpio.o + .debug_line 0x0000000000004d60 0xc6a obj/drivers/gpt/src/gpt.o + .debug_line 0x00000000000059ca 0x272f obj/drivers/i2c/src/i2c.o + .debug_line 0x00000000000080f9 0x7b5 obj/drivers/iocmg/src/iocmg.o + .debug_line 0x00000000000088ae 0x904 obj/drivers/timer/src/timer.o + .debug_line 0x00000000000091b2 0x180e obj/drivers/uart/src/uart.o + .debug_line 0x000000000000a9c0 0x565 obj/user/main.o + .debug_line 0x000000000000af25 0x9af obj/user/generatecode/system_init.o + .debug_line 0x000000000000b8d4 0x616 obj/user/mycar/src/mycar_control.o + .debug_line 0x000000000000beea 0x26b8 obj/user/vl53l0x/core/src/vl53l0x_api.o + .debug_line 0x000000000000e5a2 0x1329 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .debug_line 0x000000000000f8cb 0x1c62 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .debug_line 0x000000000001152d 0x566 obj/user/vl53l0x/mine/src/vl53l0x.o + .debug_line 0x0000000000011a93 0x5cd obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .debug_line 0x0000000000012060 0x66c obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .debug_line 0x00000000000126cc 0x6db obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .debug_line 0x0000000000012da7 0x40a d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + +.debug_info 0x0000000000000000 0x5ad57 + .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 0x81 obj/drivers/base/src/assert.o + .debug_info 0x000000000000dccc 0x2d1 obj/drivers/base/src/clock.o + .debug_info 0x000000000000df9d 0xe40 obj/drivers/base/src/interrupt.o + .debug_info 0x000000000000eddd 0x41a4 obj/drivers/crg/src/crg.o + .debug_info 0x0000000000012f81 0x281c obj/drivers/debug/src/debug.o + .debug_info 0x000000000001579d 0x1006 obj/drivers/gpio/src/gpio.o + .debug_info 0x00000000000167a3 0x1197 obj/drivers/gpt/src/gpt.o + .debug_info 0x000000000001793a 0x388a obj/drivers/i2c/src/i2c.o + .debug_info 0x000000000001b1c4 0x12ff obj/drivers/iocmg/src/iocmg.o + .debug_info 0x000000000001c4c3 0x80c obj/drivers/timer/src/timer.o + .debug_info 0x000000000001cccf 0x2e50 obj/drivers/uart/src/uart.o + .debug_info 0x000000000001fb1f 0x506b obj/user/main.o + .debug_info 0x0000000000024b8a 0x80ac obj/user/generatecode/system_init.o + .debug_info 0x000000000002cc36 0x50be obj/user/mycar/src/mycar_control.o + .debug_info 0x0000000000031cf4 0x77a5 obj/user/vl53l0x/core/src/vl53l0x_api.o + .debug_info 0x0000000000039499 0x61ed obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .debug_info 0x000000000003f686 0x6635 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .debug_info 0x0000000000045cbb 0x54a1 obj/user/vl53l0x/mine/src/vl53l0x.o + .debug_info 0x000000000004b15c 0x4f16 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .debug_info 0x0000000000050072 0x51ea obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .debug_info 0x000000000005525c 0x5830 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .debug_info 0x000000000005aa8c 0x2cb d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + +.debug_abbrev 0x0000000000000000 0x41b0 + .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 0x5c obj/drivers/base/src/assert.o + .debug_abbrev 0x0000000000000b75 0x15b obj/drivers/base/src/clock.o + .debug_abbrev 0x0000000000000cd0 0x275 obj/drivers/base/src/interrupt.o + .debug_abbrev 0x0000000000000f45 0x2ba obj/drivers/crg/src/crg.o + .debug_abbrev 0x00000000000011ff 0x31d obj/drivers/debug/src/debug.o + .debug_abbrev 0x000000000000151c 0x2c6 obj/drivers/gpio/src/gpio.o + .debug_abbrev 0x00000000000017e2 0x253 obj/drivers/gpt/src/gpt.o + .debug_abbrev 0x0000000000001a35 0x312 obj/drivers/i2c/src/i2c.o + .debug_abbrev 0x0000000000001d47 0x2be obj/drivers/iocmg/src/iocmg.o + .debug_abbrev 0x0000000000002005 0x1f0 obj/drivers/timer/src/timer.o + .debug_abbrev 0x00000000000021f5 0x33f obj/drivers/uart/src/uart.o + .debug_abbrev 0x0000000000002534 0x2b5 obj/user/main.o + .debug_abbrev 0x00000000000027e9 0x2c7 obj/user/generatecode/system_init.o + .debug_abbrev 0x0000000000002ab0 0x29c obj/user/mycar/src/mycar_control.o + .debug_abbrev 0x0000000000002d4c 0x307 obj/user/vl53l0x/core/src/vl53l0x_api.o + .debug_abbrev 0x0000000000003053 0x2e2 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .debug_abbrev 0x0000000000003335 0x2fc obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .debug_abbrev 0x0000000000003631 0x298 obj/user/vl53l0x/mine/src/vl53l0x.o + .debug_abbrev 0x00000000000038c9 0x271 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .debug_abbrev 0x0000000000003b3a 0x26a obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .debug_abbrev 0x0000000000003da4 0x2b3 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .debug_abbrev 0x0000000000004057 0x159 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + +.debug_aranges 0x0000000000000000 0x13a8 + .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 0x20 obj/drivers/base/src/assert.o + .debug_aranges + 0x0000000000000198 0x48 obj/drivers/base/src/clock.o + .debug_aranges + 0x00000000000001e0 0xc8 obj/drivers/base/src/interrupt.o + .debug_aranges + 0x00000000000002a8 0x1e8 obj/drivers/crg/src/crg.o + .debug_aranges + 0x0000000000000490 0x88 obj/drivers/debug/src/debug.o + .debug_aranges + 0x0000000000000518 0xf0 obj/drivers/gpio/src/gpio.o + .debug_aranges + 0x0000000000000608 0xe0 obj/drivers/gpt/src/gpt.o + .debug_aranges + 0x00000000000006e8 0x228 obj/drivers/i2c/src/i2c.o + .debug_aranges + 0x0000000000000910 0x128 obj/drivers/iocmg/src/iocmg.o + .debug_aranges + 0x0000000000000a38 0x98 obj/drivers/timer/src/timer.o + .debug_aranges + 0x0000000000000ad0 0x120 obj/drivers/uart/src/uart.o + .debug_aranges + 0x0000000000000bf0 0x50 obj/user/main.o + .debug_aranges + 0x0000000000000c40 0x78 obj/user/generatecode/system_init.o + .debug_aranges + 0x0000000000000cb8 0x78 obj/user/mycar/src/mycar_control.o + .debug_aranges + 0x0000000000000d30 0x320 obj/user/vl53l0x/core/src/vl53l0x_api.o + .debug_aranges + 0x0000000000001050 0xd0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .debug_aranges + 0x0000000000001120 0xe8 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .debug_aranges + 0x0000000000001208 0x48 obj/user/vl53l0x/mine/src/vl53l0x.o + .debug_aranges + 0x0000000000001250 0x58 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .debug_aranges + 0x00000000000012a8 0x68 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .debug_aranges + 0x0000000000001310 0x78 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .debug_aranges + 0x0000000000001388 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + +.debug_str 0x0000000000000000 0xef0f + .debug_str 0x0000000000000000 0x55 obj/chip/3061m/startup.o + .debug_str 0x0000000000000055 0x2f43 obj/chip/3061m/chipinit/chipinit.o + 0x2f8b (size before relaxing) + .debug_str 0x0000000000002f98 0x63d obj/chip/3061m/chipinit/anatrim/anatrim.o + 0x34fd (size before relaxing) + .debug_str 0x00000000000035d5 0x8d obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o + 0x628 (size before relaxing) + .debug_str 0x0000000000003662 0xfe4 obj/chip/3061m/chipinit/crginit/crginit.o + 0x158e (size before relaxing) + .debug_str 0x0000000000004646 0x90a obj/chip/3061m/chipinit/flashinit/flashinit.o + 0xe40 (size before relaxing) + .debug_str 0x0000000000004f50 0xc8 obj/chip/3061m/chipinit/systickinit/systickinit.o + 0x524 (size before relaxing) + .debug_str 0x0000000000005018 0xb5 obj/chip/3061m/fotp/fotp_info_read.o + 0xec3 (size before relaxing) + .debug_str 0x00000000000050cd 0xeb obj/chip/3061m/ip_crg/ip_crg_common.o + 0x52b (size before relaxing) + .debug_str 0x00000000000051b8 0x36 obj/drivers/base/src/assert.o + 0x476 (size before relaxing) + .debug_str 0x00000000000051ee 0xcc obj/drivers/base/src/clock.o + 0x5f8 (size before relaxing) + .debug_str 0x00000000000052ba 0x4ce obj/drivers/base/src/interrupt.o + 0x9a4 (size before relaxing) + .debug_str 0x0000000000005788 0xb08 obj/drivers/crg/src/crg.o + 0x213a (size before relaxing) + .debug_str 0x0000000000006290 0x1981 obj/drivers/debug/src/debug.o + 0x1f4c (size before relaxing) + .debug_str 0x0000000000007c11 0x50c obj/drivers/gpio/src/gpio.o + 0xa10 (size before relaxing) + .debug_str 0x000000000000811d 0x88c obj/drivers/gpt/src/gpt.o + 0xdc3 (size before relaxing) + .debug_str 0x00000000000089a9 0x163b obj/drivers/i2c/src/i2c.o + 0x2a7b (size before relaxing) + .debug_str 0x0000000000009fe4 0xd36 obj/drivers/iocmg/src/iocmg.o + 0x1250 (size before relaxing) + .debug_str 0x000000000000ad1a 0x562 obj/drivers/timer/src/timer.o + 0xa80 (size before relaxing) + .debug_str 0x000000000000b27c 0x500 obj/drivers/uart/src/uart.o + 0x2329 (size before relaxing) + .debug_str 0x000000000000b77c 0x1a9 obj/user/main.o + 0x36a1 (size before relaxing) + .debug_str 0x000000000000b925 0x92 obj/user/generatecode/system_init.o + 0x510c (size before relaxing) + .debug_str 0x000000000000b9b7 0x1b5 obj/user/mycar/src/mycar_control.o + 0x3769 (size before relaxing) + .debug_str 0x000000000000bb6c 0x1934 obj/user/vl53l0x/core/src/vl53l0x_api.o + 0x5209 (size before relaxing) + .debug_str 0x000000000000d4a0 0x76e obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + 0x454f (size before relaxing) + .debug_str 0x000000000000dc0e 0xc2f obj/user/vl53l0x/core/src/vl53l0x_api_core.o + 0x4a8d (size before relaxing) + .debug_str 0x000000000000e83d 0xb0 obj/user/vl53l0x/mine/src/vl53l0x.o + 0x3d1b (size before relaxing) + .debug_str 0x000000000000e8ed 0xcb obj/user/vl53l0x/mine/src/vl53l0x_iic.o + 0x36b4 (size before relaxing) + .debug_str 0x000000000000e9b8 0x11b obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + 0x372c (size before relaxing) + .debug_str 0x000000000000ead3 0x139 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + 0x3d8e (size before relaxing) + .debug_str 0x000000000000ec0c 0x303 d:/software/compiler/hispark/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_ranges 0x0000000000000000 0x1228 + .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 0x10 obj/drivers/base/src/assert.o + .debug_ranges 0x00000000000000e8 0x38 obj/drivers/base/src/clock.o + .debug_ranges 0x0000000000000120 0xb8 obj/drivers/base/src/interrupt.o + .debug_ranges 0x00000000000001d8 0x1d8 obj/drivers/crg/src/crg.o + .debug_ranges 0x00000000000003b0 0x78 obj/drivers/debug/src/debug.o + .debug_ranges 0x0000000000000428 0xe0 obj/drivers/gpio/src/gpio.o + .debug_ranges 0x0000000000000508 0xd0 obj/drivers/gpt/src/gpt.o + .debug_ranges 0x00000000000005d8 0x218 obj/drivers/i2c/src/i2c.o + .debug_ranges 0x00000000000007f0 0x118 obj/drivers/iocmg/src/iocmg.o + .debug_ranges 0x0000000000000908 0x88 obj/drivers/timer/src/timer.o + .debug_ranges 0x0000000000000990 0x110 obj/drivers/uart/src/uart.o + .debug_ranges 0x0000000000000aa0 0x40 obj/user/main.o + .debug_ranges 0x0000000000000ae0 0x68 obj/user/generatecode/system_init.o + .debug_ranges 0x0000000000000b48 0x80 obj/user/mycar/src/mycar_control.o + .debug_ranges 0x0000000000000bc8 0x310 obj/user/vl53l0x/core/src/vl53l0x_api.o + .debug_ranges 0x0000000000000ed8 0xc0 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .debug_ranges 0x0000000000000f98 0xd8 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .debug_ranges 0x0000000000001070 0x38 obj/user/vl53l0x/mine/src/vl53l0x.o + .debug_ranges 0x00000000000010a8 0x48 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .debug_ranges 0x00000000000010f0 0x58 obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .debug_ranges 0x0000000000001148 0x68 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .debug_ranges 0x00000000000011b0 0x78 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + +.debug_frame 0x0000000000000000 0x4c5c + .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 0x30 obj/drivers/base/src/assert.o + .debug_frame 0x0000000000000340 0xe4 obj/drivers/base/src/clock.o + .debug_frame 0x0000000000000424 0x318 obj/drivers/base/src/interrupt.o + .debug_frame 0x000000000000073c 0x80c obj/drivers/crg/src/crg.o + .debug_frame 0x0000000000000f48 0x208 obj/drivers/debug/src/debug.o + .debug_frame 0x0000000000001150 0x3e0 obj/drivers/gpio/src/gpio.o + .debug_frame 0x0000000000001530 0x384 obj/drivers/gpt/src/gpt.o + .debug_frame 0x00000000000018b4 0x964 obj/drivers/i2c/src/i2c.o + .debug_frame 0x0000000000002218 0x4cc obj/drivers/iocmg/src/iocmg.o + .debug_frame 0x00000000000026e4 0x248 obj/drivers/timer/src/timer.o + .debug_frame 0x000000000000292c 0x4b8 obj/drivers/uart/src/uart.o + .debug_frame 0x0000000000002de4 0xec obj/user/main.o + .debug_frame 0x0000000000002ed0 0x1c8 obj/user/generatecode/system_init.o + .debug_frame 0x0000000000003098 0x1c4 obj/user/mycar/src/mycar_control.o + .debug_frame 0x000000000000325c 0xd7c obj/user/vl53l0x/core/src/vl53l0x_api.o + .debug_frame 0x0000000000003fd8 0x358 obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o + .debug_frame 0x0000000000004330 0x3c4 obj/user/vl53l0x/core/src/vl53l0x_api_core.o + .debug_frame 0x00000000000046f4 0xe8 obj/user/vl53l0x/mine/src/vl53l0x.o + .debug_frame 0x00000000000047dc 0x130 obj/user/vl53l0x/mine/src/vl53l0x_iic.o + .debug_frame 0x000000000000490c 0x17c obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o + .debug_frame 0x0000000000004a88 0x1b4 obj/user/vl53l0x/platform/src/vl53l0x_platform.o + .debug_frame 0x0000000000004c3c 0x20 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) + +.debug_loc 0x0000000000000000 0x5c2 + .debug_loc 0x0000000000000000 0x5c2 d:/software/compiler/hispark/hispark studio/tools/windows/cc_riscv32_musl_fp_win/bin/../lib/gcc/riscv32-linux-musl/7.3.0\libgcc.a(truncdfsf2.o) diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.log" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.log" new file mode 100644 index 00000000..deef0e4a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.log" @@ -0,0 +1,478 @@ +Done. Made 1 targets from 4 files in 14ms +ninja: Entering directory `out' +[1/140] cross compiler obj/chip/3061m/startup.o +[2/140] cross compiler obj/chip/3061m/chipinit/chipinit.o +[3/140] cross compiler obj/chip/3061m/chipinit/anatrim/anatrim.o +[4/140] cross compiler obj/chip/3061m/chipinit/anavrefinit/anavrefinit.o +[5/140] cross compiler obj/chip/3061m/chipinit/crginit/crginit.o +[6/140] cross compiler obj/chip/3061m/chipinit/flashinit/flashinit.o +[7/140] cross compiler obj/chip/3061m/chipinit/systickinit/systickinit.o +[8/140] cross compiler obj/chip/3061m/fotp/fotp_info_read.o +[9/140] cross compiler obj/chip/3061m/ip_crg/ip_crg_common.o +[10/140] cross compiler obj/drivers/acmp/src/acmp.o +[11/140] cross compiler obj/drivers/acmp/src/acmp_ex.o +[12/140] cross compiler obj/drivers/adc/src/adc.o +[13/140] cross compiler obj/drivers/adc/src/adc_ex.o +[14/140] cross compiler obj/drivers/apt/src/apt.o +[15/140] cross compiler obj/drivers/base/src/assert.o +[16/140] cross compiler obj/drivers/base/src/base_math.o +[17/140] cross compiler obj/drivers/base/src/clock.o +[18/140] cross compiler obj/drivers/base/src/generalfunc.o +[19/140] cross compiler obj/drivers/base/src/interrupt.o +[20/140] cross compiler obj/drivers/base/src/lock.o +[21/140] cross compiler obj/drivers/base/src/reset.o +[22/140] cross compiler obj/drivers/can/src/can.o +[23/140] cross compiler obj/drivers/capm/src/capm.o +[24/140] cross compiler obj/drivers/cfd/src/cfd.o +[25/140] cross compiler obj/drivers/cmm/src/cmm.o +[26/140] cross compiler obj/drivers/crc/src/crc.o +[27/140] cross compiler obj/drivers/crg/src/crg.o +[28/140] cross compiler obj/drivers/dac/src/dac.o +[29/140] cross compiler obj/drivers/debug/log/src/app_command.o +[30/140] cross compiler obj/drivers/debug/log/src/cmd.o +[31/140] cross compiler obj/drivers/debug/log/src/cmd_common.o +[32/140] cross compiler obj/drivers/debug/log/src/config.o +[33/140] cross compiler obj/drivers/debug/log/src/console.o +[34/140] cross compiler obj/drivers/debug/log/src/dfx_debug.o +[35/140] cross compiler obj/drivers/debug/log/src/dfx_log.o +[36/140] cross compiler obj/drivers/debug/log/src/dfx_log_proc.o +[37/140] cross compiler obj/drivers/debug/log/src/event.o +[38/140] cross compiler obj/drivers/debug/log/src/ext_command.o +[39/140] cross compiler obj/drivers/debug/src/debug.o +[40/140] cross compiler obj/drivers/dma/src/dma.o +[41/140] cross compiler obj/drivers/dma/src/dma_ex.o +[42/140] cross compiler obj/drivers/flash/src/flash.o +[43/140] cross compiler obj/drivers/gpio/src/gpio.o +[44/140] cross compiler obj/drivers/gpt/src/gpt.o +[45/140] cross compiler obj/drivers/gpt/src/gpt_ex.o +[46/140] cross compiler obj/drivers/i2c/src/i2c.o +[47/140] cross compiler obj/drivers/i2c/src/i2c_ex.o +[48/140] cross compiler obj/drivers/iocmg/src/iocmg.o +[49/140] cross compiler obj/drivers/iwdg/src/iwdg.o +[50/140] cross compiler obj/drivers/iwdg/src/iwdg_ex.o +[51/140] cross compiler obj/drivers/pga/src/pga.o +[52/140] cross compiler obj/drivers/pmc/src/pmc.o +[53/140] cross compiler obj/drivers/qdm/src/qdm.o +[54/140] cross compiler obj/drivers/spi/src/spi.o +[55/140] cross compiler obj/drivers/spi/src/spi_ex.o +[56/140] cross compiler obj/drivers/timer/src/timer.o +[57/140] cross compiler obj/drivers/timer/src/timer_ex.o +[58/140] cross compiler obj/drivers/tsensor/src/tsensor.o +[59/140] cross compiler obj/drivers/uart/src/uart.o +[60/140] cross compiler obj/drivers/uart/src/uart_ex.o +[61/140] cross compiler obj/drivers/wwdg/src/wwdg.o +[62/140] cross compiler obj/drivers/wwdg/src/wwdg_ex.o +[63/140] cross compiler obj/middleware/control_library/adc_calibra/mcs_adcCalibr.o +[64/140] cross compiler obj/middleware/control_library/brake/mcs_brake.o +[65/140] cross compiler obj/middleware/control_library/filter/mcs_filter.o +[66/140] cross compiler obj/middleware/control_library/filter/mcs_lpfRk4.o +[67/140] cross compiler obj/middleware/control_library/filter/mcs_pll.o +[68/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o +[69/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ff.o +[70/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_fw_ctrl.o +[71/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o +[72/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o +[73/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o +[74/140] cross compiler obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o +[75/140] cross compiler obj/middleware/control_library/math/mcs_math.o +[76/140] cross compiler obj/middleware/control_library/modulation/mcs_r1_svpwm.o +[77/140] cross compiler obj/middleware/control_library/modulation/mcs_svpwm.o +[78/140] cross compiler obj/middleware/control_library/observer/mcs_fosmo.o +[79/140] cross compiler obj/middleware/control_library/pfc/pfc_curr_ctrl.o +[80/140] cross compiler obj/middleware/control_library/pfc/pfc_volt_ctrl.o +[81/140] cross compiler obj/middleware/control_library/pid_controller/mcs_pid_ctrl.o +[82/140] cross compiler obj/middleware/control_library/power/mcs_power_mgmt.o +[83/140] cross compiler obj/middleware/control_library/protection/mcs_openphs_det.o +[84/140] cross compiler obj/middleware/control_library/protection/mcs_stall_det.o +[85/140] cross compiler obj/middleware/control_library/protection/mcs_unbalance_det.o +[86/140] cross compiler obj/middleware/control_library/ramp/mcs_ramp_mgmt.o +[87/140] cross compiler obj/middleware/control_library/utilities/mcs_mtr_param.o +[88/140] cross compiler obj/middleware/control_library/vf/mcs_vf_ctrl.o +[89/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o +[90/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o +[91/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/gets_s.o +[92/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o +[93/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o +[94/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memset_s.o +[95/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/scanf_s.o +[96/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o +[97/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o +[98/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o +[99/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o +[100/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o +[101/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/snprintf_s.o +[102/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o +[103/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o +[104/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcat_s.o +[105/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o +[106/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncat_s.o +[107/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strncpy_s.o +[108/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o +[109/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o +[110/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swscanf_s.o +[111/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfscanf_s.o +[112/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vfwscanf_s.o +[113/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vscanf_s.o +[114/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o +[115/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o +[116/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o +[117/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswprintf_s.o +[118/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o +[119/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o +[120/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o +[121/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o +[122/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o +[123/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o +[124/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o +[125/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o +[126/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemmove_s.o +[127/140] cross compiler obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o +[128/140] cross compiler obj/user/generatecode/system_init.o +[129/140] cross compiler obj/user/mycar/src/mycar_control.o +../user/mycar/src/mycar_control.c: In function 'AsGuard': + +../user/mycar/src/mycar_control.c:205:18: warning: implicit declaration of function 'GetDistance'; did you mean 'IsQDMInstance'? [-Wimplicit-function-declaration] + distance = GetDistance(); + + + ^~~~~~~~~~~ + + + IsQDMInstance +[130/140] cross compiler obj/user/main.o +../user/main.c: In function 'main': +../user/main.c:281:23: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + if(!strncmp(readData,"setv",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:285:28: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + else if(!strncmp(readData,"come",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:289:28: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + else if(!strncmp(readData,"back",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:292:28: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + else if(!strncmp(readData,"sta_act",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:296:28: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + else if(!strncmp(readData,"start",5)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:299:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"guard",5)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:302:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"stop",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:304:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"left",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:306:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"right",5)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:308:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"retreat",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:321:28: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + else if(!strncmp(readData,"clo",3)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:324:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"ant",3)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:327:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"desk",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ +../user/main.c:331:29: warning: pointer targets in passing argument 1 of 'strncmp' differ in signedness [-Wpointer-sign] + }else if(!strncmp(readData,"ground",4)){ + ^~~~~~~~ +In file included from ../user/main.c:27:0: +d:\software\compiler\hispark\hispark studio\tools\windows\cc_riscv32_musl_fp_win\sysroot\usr\include\string.h:40:5: note: expected 'const char *' but argument is of type 'unsigned char *' + int strncmp (const char *, const char *, size_t); + ^~~~~~~ + +[131/140] cross compiler obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:403:6: warning: no previous prototype for 'get_next_good_spad' [-Wmissing-prototypes] + ^~~~~~~~~~~~~~~~~~ + void get_next_good_spad(uint8_t goodSpadArray[], uint32_t size, +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:453:9: warning: no previous prototype for 'is_aperture' [-Wmissing-prototypes] + uint8_t is_aperture(uint32_t spadIndex) + ^~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:470:15: warning: no previous prototype for 'enable_spad_bit' [-Wmissing-prototypes] + VL53L0X_Error enable_spad_bit(uint8_t spadArray[], uint32_t size, + ^~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:488:15: warning: no previous prototype for 'count_enabled_spads' [-Wmissing-prototypes] + VL53L0X_Error count_enabled_spads(uint8_t spadArray[], + ^~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:546:15: warning: no previous prototype for 'set_ref_spad_map' [-Wmissing-prototypes] + VL53L0X_Error set_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) + ^~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:554:15: warning: no previous prototype for 'get_ref_spad_map' [-Wmissing-prototypes] + VL53L0X_Error get_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) + ^~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:563:15: warning: no previous prototype for 'enable_ref_spads' [-Wmissing-prototypes] + VL53L0X_Error enable_ref_spads(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:636:15: warning: no previous prototype for 'perform_ref_signal_measurement' [-Wmissing-prototypes] + VL53L0X_Error perform_ref_signal_measurement(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:1075:15: warning: no previous prototype for 'VL53L0X_perform_single_ref_calibration' [-Wmissing-prototypes] + VL53L0X_Error VL53L0X_perform_single_ref_calibration(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:1098:15: warning: no previous prototype for 'VL53L0X_ref_calibration_io' [-Wmissing-prototypes] + VL53L0X_Error VL53L0X_ref_calibration_io(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_calibration.c:1134:15: warning: no previous prototype for 'VL53L0X_perform_vhv_calibration' [-Wmissing-prototypes] + VL53L0X_Error VL53L0X_perform_vhv_calibration(VL53L0X_DEV Dev, + + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +[132/140] cross compiler obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o +[133/140] cross compiler obj/user/vl53l0x/core/src/vl53l0x_api_core.o +../user/vl53l0x/core/src/vl53l0x_api_core.c:179:15: warning: no previous prototype for 'VL53L0X_device_read_strobe' [-Wmissing-prototypes] + VL53L0X_Error VL53L0X_device_read_strobe(VL53L0X_DEV Dev) + ^~~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_core.c:482:10: warning: no previous prototype for 'VL53L0X_calc_macro_period_ps' [-Wmissing-prototypes] + uint32_t VL53L0X_calc_macro_period_ps(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_core.c: In function 'VL53L0X_calc_macro_period_ps': +../user/vl53l0x/core/src/vl53l0x_api_core.c:482:51: warning: unused parameter 'Dev' [-Wunused-parameter] + uint32_t VL53L0X_calc_macro_period_ps(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api_core.c: At top level: +../user/vl53l0x/core/src/vl53l0x_api_core.c:565:10: warning: no previous prototype for 'VL53L0X_calc_timeout_us' [-Wmissing-prototypes] + uint32_t VL53L0X_calc_timeout_us(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_core.c:1498:15: warning: no previous prototype for 'get_dmax_lut_points' [-Wmissing-prototypes] + VL53L0X_Error get_dmax_lut_points(VL53L0X_DMaxLUT_t data, uint32_t lut_size, + ^~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_core.c: In function 'get_dmax_lut_points': +../user/vl53l0x/core/src/vl53l0x_api_core.c:1505:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] + + for (index = 0; index < lut_size; index++) { + + ^ + +../user/vl53l0x/core/src/vl53l0x_api_core.c:1512:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] + + if (index == lut_size) { + + ^~ + +[134/140] cross compiler obj/user/vl53l0x/core/src/vl53l0x_api.o +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetPowerMode': +../user/vl53l0x/core/src/vl53l0x_api.c:238:28: warning: unused parameter 'pPowerMode' [-Wunused-parameter] + VL53L0X_PowerModes *pPowerMode) + ^~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_SetGroupParamHold': +../user/vl53l0x/core/src/vl53l0x_api.c:327:53: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, uint8_t GroupParamHold) + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:327:66: warning: unused parameter 'GroupParamHold' [-Wunused-parameter] + VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, uint8_t GroupParamHold) + ^~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetUpperLimitMilliMeter': +../user/vl53l0x/core/src/vl53l0x_api.c:339:59: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:340:12: warning: unused parameter 'pUpperLimitMilliMeter' [-Wunused-parameter] + uint16_t *pUpperLimitMilliMeter) + ^~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_WaitDeviceBooted': +../user/vl53l0x/core/src/vl53l0x_api.c:780:52: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev) + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_SetHistogramMode': +../user/vl53l0x/core/src/vl53l0x_api.c:1031:52: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:1032:25: warning: unused parameter 'HistogramMode' [-Wunused-parameter] + VL53L0X_HistogramModes HistogramMode) + ^~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetHistogramMode': +../user/vl53l0x/core/src/vl53l0x_api.c:1044:52: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:1045:26: warning: unused parameter 'pHistogramMode' [-Wunused-parameter] + VL53L0X_HistogramModes *pHistogramMode) + ^~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: At top level: +../user/vl53l0x/core/src/vl53l0x_api.c:1204:15: warning: no previous prototype for 'sequence_step_enabled' [-Wmissing-prototypes] + VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'sequence_step_enabled': +../user/vl53l0x/core/src/vl53l0x_api.c:1204:49: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetNumberOfSequenceSteps': +../user/vl53l0x/core/src/vl53l0x_api.c:1297:60: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_PerformSingleHistogramMeasurement': +../user/vl53l0x/core/src/vl53l0x_api.c:2137:69: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:2138:38: warning: unused parameter 'pHistogramMeasurementData' [-Wunused-parameter] + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) + ^~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_PerformXTalkMeasurement': +../user/vl53l0x/core/src/vl53l0x_api.c:2165:59: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:2166:11: warning: unused parameter 'TimeoutMs' [-Wunused-parameter] + uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, + ^~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c:2166:38: warning: unused parameter 'pXtalkPerSpad' [-Wunused-parameter] + uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, + ^~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c:2167:11: warning: unused parameter 'pAmbientTooHigh' [-Wunused-parameter] + uint8_t *pAmbientTooHigh) + ^~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: At top level: +../user/vl53l0x/core/src/vl53l0x_api.c:2208:15: warning: no previous prototype for 'VL53L0X_CheckAndLoadInterruptSettings' [-Wmissing-prototypes] + VL53L0X_Error VL53L0X_CheckAndLoadInterruptSettings(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_CheckAndLoadInterruptSettings': +../user/vl53l0x/core/src/vl53l0x_api.c:2221:2: warning: switch missing default case [-Wswitch-default] + switch (InterruptConfig) { + ^~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_WaitDeviceReadyForNewMeasurement': +../user/vl53l0x/core/src/vl53l0x_api.c:2432:68: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:2433:11: warning: unused parameter 'MaxLoop' [-Wunused-parameter] + uint32_t MaxLoop) + ^~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetHistogramMeasurementData': +../user/vl53l0x/core/src/vl53l0x_api.c:2625:63: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:2626:38: warning: unused parameter 'pHistogramMeasurementData' [-Wunused-parameter] + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) + ^~~~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_SetNumberOfROIZones': +../user/vl53l0x/core/src/vl53l0x_api.c:2665:55: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetNumberOfROIZones': +../user/vl53l0x/core/src/vl53l0x_api.c:2680:55: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetMaxNumberOfROIZones': +../user/vl53l0x/core/src/vl53l0x_api.c:2693:58: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_SetInterruptThresholds': +../user/vl53l0x/core/src/vl53l0x_api.c:2876:22: warning: unused parameter 'DeviceMode' [-Wunused-parameter] + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, + ^~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_GetInterruptThresholds': +../user/vl53l0x/core/src/vl53l0x_api.c:2902:22: warning: unused parameter 'DeviceMode' [-Wunused-parameter] + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, + ^~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_ClearInterruptMask': +../user/vl53l0x/core/src/vl53l0x_api.c:2964:16: warning: unused parameter 'InterruptMask' [-Wunused-parameter] + ^~~ + ^~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api.c: In function 'VL53L0X_EnableInterruptMask': +../user/vl53l0x/core/src/vl53l0x_api.c:3013:55: warning: unused parameter 'Dev' [-Wunused-parameter] + uint32_t InterruptMask) + VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, + + + ^~~ +../user/vl53l0x/core/src/vl53l0x_api.c:3014:17: warning: unused parameter 'InterruptMask' [-Wunused-parameter] + + uint32_t InterruptMask) + + ^~~~~~~~~~~~~ + +[135/140] cross compiler obj/user/vl53l0x/mine/src/vl53l0x.o +[136/140] cross compiler obj/user/vl53l0x/core/src/vl53l0x_api_strings.o +../user/vl53l0x/core/src/vl53l0x_api_strings.c:45:15: warning: no previous prototype for 'VL53L0X_check_part_used' [-Wmissing-prototypes] + VL53L0X_Error VL53L0X_check_part_used(VL53L0X_DEV Dev, + ^~~~~~~~~~~~~~~~~~~~~~~ +../user/vl53l0x/core/src/vl53l0x_api_strings.c: In function 'VL53L0X_get_limit_check_info': +../user/vl53l0x/core/src/vl53l0x_api_strings.c:422:56: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, + ^~~ + +[137/140] cross compiler obj/user/vl53l0x/mine/src/vl53l0x_iic.o +[138/140] cross compiler obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o +../user/vl53l0x/platform/src/vl53l0x_i2c_platform.c: In function 'VL53L0X_platform_wait_us': + +../user/vl53l0x/platform/src/vl53l0x_i2c_platform.c:232:11: warning: unused variable 'wait_ms' [-Wunused-variable] + + float wait_ms = (float)wait_us/1000.0f; + +[139/140] cross compiler obj/user/vl53l0x/platform/src/vl53l0x_platform.o +../user/vl53l0x/platform/src/vl53l0x_platform.c: In function 'VL53L0X_LockSequenceAccess': +../user/vl53l0x/platform/src/vl53l0x_platform.c:92:54: warning: unused parameter 'Dev' [-Wunused-parameter] + VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev){ + ^~~ +../user/vl53l0x/platform/src/vl53l0x_platform.c: In function 'VL53L0X_UnlockSequenceAccess': + ^~~~~~~ + +../user/vl53l0x/platform/src/vl53l0x_platform.c:98:56: warning: unused parameter 'Dev' [-Wunused-parameter] + + VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev){ + + ^~~ + +../user/vl53l0x/platform/src/vl53l0x_platform.c: In function 'VL53L0X_PollingDelay': + +../user/vl53l0x/platform/src/vl53l0x_platform.c:262:48: warning: unused parameter 'Dev' [-Wunused-parameter] + + VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev){ + + ^~~ + +[140/140] LINK ./bin/target.elf diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja" new file mode 100644 index 00000000..6913fffb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja" @@ -0,0 +1,20 @@ +ninja_required_version = 1.7.2 + +rule gn + command = "d:/software/compiler/HiSpark/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja.d" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/build.ninja.d" new file mode 100644 index 00000000..0589c2f9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/log.xml" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/log.xml" new file mode 100644 index 00000000..56354dfb --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/log.xml" @@ -0,0 +1,8 @@ + + + + + + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/build/target.elf.ninja" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/build/target.elf.ninja" new file mode 100644 index 00000000..d2e51496 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/build/target.elf.ninja" @@ -0,0 +1,431 @@ +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 -I../user/mycar/inc -I../user/vl53l0x/core/inc -I../user/vl53l0x/mine/inc -I../user/vl53l0x/platform/inc +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/mycar/src/mycar_control.o: cc ../user/mycar/src/mycar_control.c + source_file_part = mycar_control.c + source_name_part = mycar_control +build obj/user/vl53l0x/core/src/vl53l0x_api.o: cc ../user/vl53l0x/core/src/vl53l0x_api.c + source_file_part = vl53l0x_api.c + source_name_part = vl53l0x_api +build obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o: cc ../user/vl53l0x/core/src/vl53l0x_api_calibration.c + source_file_part = vl53l0x_api_calibration.c + source_name_part = vl53l0x_api_calibration +build obj/user/vl53l0x/core/src/vl53l0x_api_core.o: cc ../user/vl53l0x/core/src/vl53l0x_api_core.c + source_file_part = vl53l0x_api_core.c + source_name_part = vl53l0x_api_core +build obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o: cc ../user/vl53l0x/core/src/vl53l0x_api_ranging.c + source_file_part = vl53l0x_api_ranging.c + source_name_part = vl53l0x_api_ranging +build obj/user/vl53l0x/core/src/vl53l0x_api_strings.o: cc ../user/vl53l0x/core/src/vl53l0x_api_strings.c + source_file_part = vl53l0x_api_strings.c + source_name_part = vl53l0x_api_strings +build obj/user/vl53l0x/mine/src/vl53l0x.o: cc ../user/vl53l0x/mine/src/vl53l0x.c + source_file_part = vl53l0x.c + source_name_part = vl53l0x +build obj/user/vl53l0x/mine/src/vl53l0x_iic.o: cc ../user/vl53l0x/mine/src/vl53l0x_iic.c + source_file_part = vl53l0x_iic.c + source_name_part = vl53l0x_iic +build obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o: cc ../user/vl53l0x/platform/src/vl53l0x_i2c_platform.c + source_file_part = vl53l0x_i2c_platform.c + source_name_part = vl53l0x_i2c_platform +build obj/user/vl53l0x/platform/src/vl53l0x_platform.o: cc ../user/vl53l0x/platform/src/vl53l0x_platform.c + source_file_part = vl53l0x_platform.c + source_name_part = vl53l0x_platform + +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/mycar/src/mycar_control.o obj/user/vl53l0x/core/src/vl53l0x_api.o obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o obj/user/vl53l0x/core/src/vl53l0x_api_core.o obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o obj/user/vl53l0x/core/src/vl53l0x_api_strings.o obj/user/vl53l0x/mine/src/vl53l0x.o obj/user/vl53l0x/mine/src/vl53l0x_iic.o obj/user/vl53l0x/platform/src/vl53l0x_i2c_platform.o obj/user/vl53l0x/platform/src/vl53l0x_platform.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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/anatrim/anatrim.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/anatrim/anatrim.o" new file mode 100644 index 0000000000000000000000000000000000000000..f7a440ca4b2b7273bc902e944ba544e43e033038 GIT binary patch literal 73428 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/chipinit.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/chipinit.o" new file mode 100644 index 0000000000000000000000000000000000000000..1d1c86c0e2963f4b1185ed7ecb90a64199cd3417 GIT binary patch literal 58344 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 aR^fYadV1<~h|#iX+pU9t|3=MxyZ;B45AXB< literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/crginit/crginit.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/crginit/crginit.o" new file mode 100644 index 0000000000000000000000000000000000000000..1317a464e8ae943ca9af6d8a2c857dc602bb0b38 GIT binary patch literal 34328 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 JZMa#x{{t6VIuHN= literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/flashinit/flashinit.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/chipinit/flashinit/flashinit.o" new file mode 100644 index 0000000000000000000000000000000000000000..da83d43a18ae8f9e9626e21ee48d73baa2827b16 GIT binary patch literal 20940 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/fotp/fotp_info_read.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/fotp/fotp_info_read.o" new file mode 100644 index 0000000000000000000000000000000000000000..0878fcfbc3df3876607ae3d4bc14b553e0c498e5 GIT binary patch literal 21584 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 EKTFCMU;qFB literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/ip_crg/ip_crg_common.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/ip_crg/ip_crg_common.o" new file mode 100644 index 0000000000000000000000000000000000000000..fc008d6976dea3cd447c8af5fd070ab9abe3a371 GIT binary patch literal 6288 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 a9LG7h&p3f>kjGup?ziaQUsypWWA`5?@S6Dm literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/startup.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/chip/3061m/startup.o" new file mode 100644 index 0000000000000000000000000000000000000000..05474d64807e6baea344e0ab4e474b867159ac9a GIT binary patch literal 24296 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 M9^b$jbP0O@0nQyh^#A|> literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/acmp/src/acmp.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/acmp/src/acmp.o" new file mode 100644 index 0000000000000000000000000000000000000000..ae5736b67e0271aac2975311e5bc89f15027f695 GIT binary patch literal 40908 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/acmp/src/acmp_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/acmp/src/acmp_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..a8b083f2a728a1a7895c3876c51c4940af6f892c GIT binary patch literal 14452 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 Yld+uww|cZJx_-~2f4`sxQmo(q0In&8!~g&Q literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/adc/src/adc.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/adc/src/adc.o" new file mode 100644 index 0000000000000000000000000000000000000000..3e8bbd95908d7545c7f3564a37c9937419e10ddb GIT binary patch literal 181664 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�GpLzCzb$wsxdZBF1)QsX57boVeR&{wHfu(M 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

0FE)*L)B&`P+r6-528% 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 ArT_o{ literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dac/src/dac.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dac/src/dac.o" new file mode 100644 index 0000000000000000000000000000000000000000..1b936c98e2bc1e8767fa394191c085e06b0e4d1e GIT binary patch literal 11596 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 W+s_EJ7=Ii?+U@`p%x^}F-M;|m;ZGg_ literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/config.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/config.o" new file mode 100644 index 0000000000000000000000000000000000000000..7a51bf4a3d80c59b2021ed616f8be592c67ff069 GIT binary patch literal 13784 zcmcgy3vgW3c|KPwSw<4FY+-CmCRrqWWvEt`^ zTQ-!Zc@`)Jf=S{eh5&IwAx^@;Kr@*MB^{cQOr~M_NNCF>OzBKAlZ0kUC&8lMcm8ws zUad{SOekmO-t&Fm`Okm;^WSryyElw&+3Yxuvc*yVtpWyhK&c3-HQHdM`l$Md+BNM( z6RA|m^ZjVXj}|KBXdxXfCGu0ADtU=iG?geP*pjbgv%S$`)=T(aG&$`hua53bWGh~i zQu|7oviCj=IaacePiLm0(+NN7%_Kc9<)xyz#0-2@vL521P1eg#m8Tg;87zoGI{4AS zwd*jd*y>g|EqnPg!}M~+^8Q}wY)s#@CJ_t-n#z0bVUecns&M0#F2@!S%%JUR2W(zsEzC9i#3 zJ=dsI`>l=YFyegkMx_oNyQSygi9DcI#(jN6~lo7WjJM@V9P5JsW}b3x^-> znruwm{_q#6+}haf{u(;%Mo;|o(zoCF`u46}V~Lw@{6pfp={@3Fq2oI1Xb{USE~9$s z#Ja<`+}@~`pDL!02QfJd=Y7BH71h@5J~rEZ&NH*!UAp(|t(PQ!`{qg6dFoiCXLR;~ z#$PT-{`ln9uQA5ilXG|I=q)QonYG#W!?$an4qD4-&Nuv!7ip}WdEnCJ#~La z&8GwLJMY|Y)V4;%?`dp^)QLk!cZt;NsYD!1N-2G9sK3~G6S$c|WWH|JQ*7AC`JP_? zW9X;NVkhdwR0VD#jI`-4tsLtj@C6K9_V21TVrQody@A(LwNMKOxMy*W+=He?8Xn*z z>kefNV?*7c>2_S=lyhK(Zc8DY7l6de1iP^~M}AoKGBL-?1RJVeCIT;vR=f;p7uw4z zB&8jfc;yW7P}LopkXVK!mOT>7ka*d3hV8gGqnvFbW|caVva`}QI!DCg$~hiaN?gX{ z%2RnsS79kLb|*!QSv5|gHB7BxRl~`jULa!ks@~=$qyND(^4ip(gEvA)|?GmI4_rD1I4} z18k`F)?Kio^^uLNbRu=9A>pd7-kBFsg!3W}E3=P;u;^NWeMBrYy5S@r+6pR;svYaw zaQdMQ_L?2+_sm8I^qw}M*12=}&Hs=4v6=FgLL#*TkHM#2>Np2h$pa>qL45qO_~!8~ zV?4@y5*!}dITjxs+dRH)EWUZ?*7(@AQKg@l)!3e0@twOzM#gsTRF`bq9UU1Mh@RiK zy01SP%Oxf=8#3AA>cKQgDLK8Ngms_ErIX>@tLbiEo(7S1_Ac+Rseoy;LkYoxreZ z1U^~GWXqX6NV?>Cei^eB9%I)RcVh6lZfgQ_PWa^rVmrr`3W3Tn;LIÚ=Hkej*J6 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%0D6I1_Z}u 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_log.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_log.o" new file mode 100644 index 0000000000000000000000000000000000000000..55d68815eeb82652ef8b89f12baf0d276e591c36 GIT binary patch literal 40052 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_log_proc.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/dfx_log_proc.o" new file mode 100644 index 0000000000000000000000000000000000000000..c5d46fde04752fb6b9146bee602b423b3edec7d5 GIT binary patch literal 21032 zcmc(Hdz@TFnRcD&o=lR-B$Epy^klK=NzMeAp3E&F!~~MLWHLA;*<1)haF|QaOhZri z(A^V4U=@TI!3%~v8du~Z5&2dDT@_bEiGt|2ipwHic12O+>ZhWx3u;LAdFrj|Q+*QA z{p}xL@jK@{&r?smRrQ`rpG$^!boZ_EJWtu;sh3s2lzP5TsR%0DwPA@$s8iH*;A!!s zl=ygVcrufUXL6(QOloH;V=Jbstz)V9aB6UJl%7;PU5F2-3j>3h)No^bAUhn-WiwaA zQ~7*S+NHB2x%~J*F`diOo0}|7OcvSKxw?l91LLWRA&b^UBMgAr-pL*VLhX4u2^cK77r=4 ztuQc}TB+L)jSt5QW4X)YvSx3bLa8oZNEKyf7fOzLhcCKN3m35}$k>wRmFpT?R(3bG zuH4?(wz9XeeP!3FGJf_!Glz9y^U{`!%xE|#23XRvGCq+{XN&P-&djqh-t1^Yxojbq zNiiJf%y{CLH3vPC&yAb5(-kKKtFmJ^I2f$St*wt2CWnR!snjVoXsgGm+uFPvH}(q$ zSsH^<-s~y=ocN}yy&c-2tCgx>bnlUC8?HODzy8ick;T^?vHEALl$yJzO8q%*_4)+c zccK0DzxqpU!u9u5MUUKifW1H8d2P=tM{cNk^!ELokL?NjSa*Cig0{L<&$0E#i?XNc zo~l=lL=f+xo)=#^^x8E&XYKj@n!&Ehfp=bg#br~TOFXL7FOzY&i1`u6({lycxR2M0|K50-MsmV2ILO=VC0`wvwR-Msg^kz>btDzb3!Nd5b( zD#HC}{jRDmy}i4tiz9w`Q(|j3M*P?AOJ?}mC!dV$J7y2PRcAkPe^1xVRcg)9yjP>z zdw*3|{rp#sEW7L4?LR%j96x&dwND;z+^pYIMQ;S?=Bk&@e(}{qhwJA@|Ho}@zb~d< zJ#6>L+SyaSmN=-UhI8`2<(_(YO`>b97wq%;rh5<9H-7qXeLRZ!9^{_?#i7!%|N8b1 zKY;PQzOU+zPWF8>&Wn|M?B0K1@4iD8KXmsS`M!6EvELVpeX5TA(W?EOb8$X+>mJ>6 zRw;J^h%=8uF`9XHBIB` zdR?v8GxWMfO^N;=gq{+86zhmL1#4CHh*r3cRLH=*sjP@Z^_U`F1(`Fx$m#PjM;-Am zj8Ex6GosOD+tFg0j8vo9K5`x9v5?{H#vvj3=> zDLbdKX*Tj9lb?m=szOciG&pkf=ur)@J*sM1=RM9fi?@Ha-rTxaQ(1ZY4D z_U$l?M?l5C^XKZi+d1lreHYIoW4RH{r0Q;IHYV&IVZ-VK@mbd=Ih~4qIi*fyg}296 zd;8~WVI&a#1F;tj6?Z9bjId(g*n+h3@?V9cVqX?1WIALrJ>`>GjB`MS-y{9?OPmc7 zCu3SIDQ|TdT8Zy8)1SbtHpFG z7OCp$v#KLF_96z(HN8m#qG3--C!)UD)tA8S&8)_Qj6OY`YH;r+Usa-|Z3Ncnwlh0>!0&%?P zd__CrI+~M+KYA5W(Dev~@$FoF^4J^Tqmw|V%o3cUcIfk-xtV{P%KA1gT`L1zB zZFZbi${XE^Mt{cmSLtrbj*auiwa4a3BDk%zhxw7wln?&#^1(}G_pV}}d1zMM=Wp#l zcVpMKzV806&FA%ZtliSB&ec!Ju!L*3t=+s;^=#M{?`&y_pV8FT)ErNa4-BSPr!y06 zts^A)p|REZoo%h@@sT0$Y%WEWF|eHF0PKVRdF(#T3tx*P61C$7RHhj zxe2x(zGSjcOy*Ogc1s0d^R~SSSaQPhR|j-p4^CG6pF*EN3)ZdO>(4=9?hnPlS5+z=yn7H zADm2Qis>xKNIsP+6cH<(MMKu5b`7N__Aaog6p9P;Pu2 zFEo;fHj19}lS7 zV=2CkNv5*}J4j>;J79N;J!Mj+*MZT|e5z2uMKhVn?Rj$|W+d8BnD zg&mk2pTrP{k=T*(RDKj)jE@(_u=k~Qa#wLMiPe}DuqyyF!{g|8+{R}x%sHLSq_Y^1 zK1NEDuq}r&y8-hleJpSkG<+8!_VxGN+H&5tD(S=aPZ@7RP%I2meT6A|u%< zruC4L1IY7ec083Watdy`kphWa3WVRIB#yXbY9fsvph@P-93VS$8SEYG+QD>jB%R6( zGZ^Y}+0kTb=RhW@)3q9-fW9+bNDrnljw@D=rH6<0Ugyz;<`a0kh1y(JPNo4oe{|({ z;8n?K)<8e6$zG+o@0n@DB*c{XJ-xQ^`@ z!s}mXS_$fQ;0>=kINhZji<>6-TeUTZ-z25qm~tpknD>kw@a6e*F|{dIaAR`OORgoFqmph*7fJ>>kYXa_=*WU-a66TKhiqU+CN0JJ3Um$1Hcn5e2%jvs(yFW zVs4Q~mx9Yfi4`OIYlUU>mp`sV@TjgI#bJpdR0Vi_UZv^bi*IUwgS9-e^iC`*Rl2G`%CKa2EY{Ie8iO^{A5c_e@!9Y z8scY#__`3^9OCDP_+W^?J;dJ?;Vy0X4~~D~ zLB55rC=E*Z`Vc=q#DnXT_=9}oJ(yD>szzO8_yJr4D!|Ly(HJjzr24c>`Z^L{xAlN_|Yv zFW7(bd+J`VIiD9w5yICuIse@J(eI9*JSYnl?r@zFRlK(d?xLdVGVtK~5LG+DgX2G{ zt_1%87AaA6HNY)~G14C3I~;xka1gIjy&s%?N~u&g0l4=U{OzMArBZzmV85k^{}JE= z4(GXb(BU5kZY}XD#ZO>?ze+s>zS*h&N8q8v!Jl>F&jmlz@z;Sba(F#>u)kyKbnvU4_HE#|IrDilc!$F~ z!TTKk7VytF?YDsc-s$f`@P5ZX1Rj)_x)l63PJIDYja@jd~5h132K@MoO%UjYA+<9`DDF{l0;;5`oi7w|hB{|~^Q za_V0M{|BePUxBwd^)G|>I`w}7|G5({5>aZz;nmbXpIPRwQER~6-@6|0C!GE^g1_SM?cn!2@%q7o-?JK(0_QbTN{zY{T>g;- zm6$4kf6mFzmEgheb&a|P+`XRc1%Hpz-;LlwsaCgv50->#^MP(6m;6=g>)rFtGbm`|np5%`Tx{tkf$zfYCw*Wm8+ z|I6S(nH@l&h^h$l-0rkeUXo4IP?s+FrYuG+a;#?^AH zs8gn@#WMgpS8#PERs`I(Fj5O6wdhEi<9i+jHf>?s76xizfEKoEVZ&B7Y}G?BE%hLD zqfXtbvxVd6)a^QT!%p3@Q#b9DwynC?R<>ItyFR`%D*{@U1I8~baMCN%1I z<^2PLgZb1>*00^NZW#y6En{%YFyhM(WJgm4`h@dalWAo(439SKfE%;r;6T|S1IosP zXLN`hCN>->Hadyins_=v12_ccsgO=I%V9NI67nGCXUV%9qg^6+wLaTAu78@R5OC* zbV8*Gs`YZ*P#G4giM~wJjupDHTW>g8-Af0>j&82ySmHnMZdN@hexBgR2-)=Vo5;3- zd{KWT7-4;v^W6kr>4wH96gI`&WQHHI%oRh2k*_b|4-vbH?so}!-#jOQ8!eQnSlTq= zua8oVcL|AOGpAlW#MZ-SkJz19p%7cW5xCCi#8z(xp2M4V6k@Bd0FLot3x(L~tAOi_ zPHgoxz%~xC)z?#BEb)o0egSafN3lZLfhG1K4K=o&iy_q+o!IKbz_u@9t7m}i+=;Eu z-*-EAVyhQ{Z5(2&Uj-c7j};2B)vpGwGdi)=uLHJmh^_ts;N;y{q1=ll_F)Y*ww?o! z>Wofo^#_4%Ok%4)3LG;Je8g6N47kqd#8&?bu#H1(_3s16`0$KEZ1sN!t}{BZ)qetP z;}Bb&&r&w$#8&?eu+2HK)qf9c;}BbYIu4QAdmy09!%};{hH4=;jRv0#9AhF;h;7>h zaGlYKt?mQczKE^P<2=b^qqJhN=Nhr~bOAT=t8`w&NkTdIxawQ&^#F!cxnZFen#eNj^-3&x%-Ld|87+ zY}@Vxt}{BZ)prBizKE@U3vlftSfTLLO@3NK#cA94#MaO5ZG2*@|0A%CPi*yPfong5 z6$V3dWofob!4vDJrxZNJ1;&jL4o4J(wLSZbft zQ0>OX&Yjr$uLHJozk{9znG3P?@Nl#`vDKfZzC`@QR_Afv_!L$s&tZvuQA3Tb=lhWA zj81Ize+Rbvk=W|L0Jh`&C2;I9tWb!p=QqH0MkluV?}2ShVypiV*ycZqX~ez+0fpFl zrUKU)o!IJpj7!=+%+58h*e-p5sR|h>N|HRgF9(Dd$p%7dB zV&Fz|{0sue9@iE{Y&|2ubw($)`X#_NC&X4S0^9Mt9XR%7iAiid?*y(hIl4ONqZDcscRE2wqLh69R?5 zW!}GPsJ0OEIyOUx4p z<$5gMk2F*_62Bn$R^lHE=B=~$6Tu%Peo-*bckicyc}jaf6U=mYKNrktc!vbDdygk8 z3d4E-p&|Zy7?>w3${(3Ff1M_dCHY z#5}oCRui*Blyit*5zP1V-hT?_dpGaD1oIg7UKRX);@1R!keGu-`64kd7${E@n|_}o z{*&nZw&5KX{9nYc3qDGGMDWxKU``rk4l({?;dc-F_tp!6>nlVjZqR?xKnTg#QgAs@&V!+ z!MCt2FN7$>4Mx9{9+Rt&6VDRQCy8qXKLT9Oos2@a3O+(V|F8>%xWVYtBJh~8`NTZ9P@0KP65I}4Z(ec|HyHg~dg{b;A@M@N zd`DdWHvw)iy1vfv0~iXgS2jMcQ8qrYjn8Y89sfdl%=n4z_~Z1Lxi6x}GfWC=Yc zpN;gGJQLeIH`8N|nRa^2u|#Z-r4{s;<8T!{=J+JG$0uNEUQuF`H(t-}TxJlPx#&EY z@pJB;8NZ&p88hdLKUuyVgBRViZMczC@{Fi9xHzVYzqByj>&rHFmw;m4xrL{fBO-*__An?xt}jVDiisp!PM@$90` zlNE*7Hy+-bC0ax$_KoK{>aC&^`^Iwv^)}IoedGB6b)NJn#J=&|Mtzy+#J=(Dr@mZt zV&8b~qJFdJ#J=$y0QOdk{s=v12iQ0I=c%s|o!B>?FHv7BI??^5p;o!B>?f1|!mbYkCl4pHwBo!B>?-%(#LI2*f*Y2sc#US*f$>DKO}Auo!B>? zWx(Dx(bv$kJ;1)v*HJ%TbYkCl`l!EEbYkClHdDVqbYkClcps9uP;_G7c-}^Rhv>w< z@eESGRdizCczEC94T(NUPb$E^(XXUFB08~eJiMPtjEYX|8_!4xc#HFGW`^NJT>KW0AedD>0`nc%CzVYx|e>JN# zsZWSb>>JM)sb3~Kv2Q$2P|u4_>>JP5sTV{i_KoLT)Qh4M`^NLH)F(wJ_Kk=CmLRcH zbYkCleoXyx(TRQIIYfPz=)}J9{F?d|q7(bZ^D_0_q7(bZ^9Slzicahs&r#}EiB9Yr zPh|x9--%A_8&5U$w~J2f8_#U&?+~5XHy-}mg~ZjO6Z^*VChE6|PV5^`1F-il(Oc+ z8;2?Iwut^-Z0g?@;0B|A7}D~KL?>Q+p5O!6*f)y^@kvl`$1E!1Z_iZ| z{{&Pu4HgQjDW4OPPh|$0SleVi9=dL@wBtzpY;U6=JF1C)35q|WENeG{|JxT_`VWqp@b|v? z^x$MMWv)>s+i$q3L#>BpigC4v+_+@uathY;;k45w>|-5E1D2^+{*tc|9=5UZ8L!h4 z;3yWBGqKQT$F~a}^SH(8vi5AVh9b%V-ZNqlJk2YyuxKHq!4E>S#m0Lt z1UKHr%Yt~koUxAa9>C(pdl%yI{?ry5?>-1_yr-7KXYyBL>KN}!SloC`NXBWrDaZGSO*FIj>u$Ha0rd}ZV7Rq9jFI6nS9+xh-2G)!-TZCEy8@Hpj4 z1=YH6YmYGs*TMIxIZDNW6R2doS}Z)LoOG%7)A7yJ4hnTP9*-T@SA2_7L$=cK{WnBX Bc@zKu literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/event.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/event.o" new file mode 100644 index 0000000000000000000000000000000000000000..c5cf2057405bf6d6945b7d2e9d86904ad66ad799 GIT binary patch literal 10096 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/ext_command.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/debug/log/src/ext_command.o" new file mode 100644 index 0000000000000000000000000000000000000000..aa47212d5f89f8f031607d4f1aa3792a1405a87a GIT binary patch literal 12236 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�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 LR4&d|kbM6GyoNRS literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dma/src/dma.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/dma/src/dma.o" new file mode 100644 index 0000000000000000000000000000000000000000..65fb6a7c0d27a9ed95c517368c24b41c0fd73066 GIT binary patch literal 95088 zcmeFa33yf2^)`OayWSCp173AQ}=(f>YJ1fb*($hpM%q974ZMQd+l}hzWZLN{eHjS_kI88`Ofp? z=6&~Gd#$zC9?!n_p8M6B=~Lo3j`WJ7zekQm(SoKpN+WZW5!gFACOSHbcOLRmR9rgz zmaQwxHf;Uc3u(Nru5IZ0X^QB=+J;!rrL_$`KaH4nWo<(@L0_wF==*83x_0Mv=hRME z-9EX?!gJ5g)pxz>vn8PK-<0^)v(|&?(<19ZkHiD(6+EzB!2|2n^@&$E{97AWs*S{# z)fb<0W8oV7@9^j9hjvXBvd{WI)GaD%SSs;;=zQQ-i@Qa|4JTN|TfOEm`M=AOPt$8&uxYhk+OvX7@9dVc z=#Fm13F?!ez6t7|paBUQNHiAS?b5AV@y4e-*5?O4>-*2&d3pUy?|x@Tj}Iul^PS!v zA6RiX)CSE2!>BW~FYxh;%V)TLmww)oL1-iC~g&z7~-Nqm6U zFg}{b_yCtmR0J_9f*2J+jEW#eMG&I`KL#E9uWtF|%YB6sW8YTx|$oz0BIeY1wlslf>MBT-s@e-e#*yZ-xV ztS=yw9=2+W_O?6Ezxvr-qjPS&@TXUIc{xvZb?x{&;2mnXX(s*af@rPU^8H;ujV7E= zum5#<>CiBB)z*e<-ia=>bClM>@B5`g@84QFWP_Ri*s33ND^!nFTTP31FO-)%K8g#< ztlGL3F)UQil05mU#& zg-a|bP-4rS#;d~$msnn)#D_PTns39avkR1H78~1$?iB?}+$uJ<;nlhVCHA;8J#6yU zLaldi0qMPrevIYe8@8s0Pu_ZUxAp1ocl#vu;B{*-rdMG$&Cl6rayAyo;oP}u>&BS{ z%KXA;o1LGt=2xc7Vfi^5e`?AU(6+{C+gQNsjm87a=lS(9+BO#OVB@cHXU`$8%G}8r z1M|w3mBUwUF>yKnlhh;EZK~DzW=n0upWfl#BalF3Fv7Q7eDx=v?lkDIEf<~F_3BS| z-TceT2feWKx;V<(nQ8l0)*kksTKPJxe7Z8U;#PvfwOK2*8MdKdkBNGQbI9u2BW}vC z@uqF`=;8w9uPji0?Kb*%NrCb^7bq_gzrjZQhKug$deX_ebp7P3A70LQz~8OdX}$GM zPqxc0*Of)A)z#;BiypadZS}e5uf(jL9=0Kw*=yE?DW~P7gc1+@TZwPyNesIq)UrpO zOenz~pc-8A#QZfQj4*OwR0UpxEp?dETq{rqJ4;JG#{X5DOZWa5dxFWEOZWYlBYiVwjnCak-^f{Hb6V5Pthi}5 z*YMKvLh@@kQw8#Ck2LZlXr~Cieau~QwDR_D(Jt53di{{Qfh6brT}@8ux_7X{S+%wF z7PI@=x_ZfnyGr{om94e$*{i!1ZFzikdf2LD{N~qVQ*|2hN7c%_eMM~{iR}4no{ggi zCk~&y(BC&9UWlpLb0DT$5!21SEq@O*u@C+C_v5Q;zq8G?XjTE~?_n(}+Ik`OH46&l zj>ouPg;p!t`p9+LSfdM+`Xly|leb&y>;k2Jye{p{2YxNDC?I_V#_sH<*x0by_4!TP+A;ObZ{6K)$uGb5$ZfPuf%3n$ zGkK2vZSAHCls~#a`EBj^t|(Cc`U2%QZDS=`SD^fE1U=G75RVUUL{zF_%kU$6St`T=fyBoVn`?jKusB8>2xLW}$lGe50Cr^3OMJeG0m9 z{;{T(>)R@~`XLQ1Ei($z^^9jz?G1TpFW2UKwh1dt>e?8m#k#_6!!L7ZvmL( zK+mtWhvoZq#bN)cUyOx0l^I;PPjLT-DCL}9mK2obSqo0uu#@CjS+6@-!wp;YWN9)^ zmaa4>n7O+`%H*7s{qmj7g(Ik*j@zugWTRHM4%E(f7^h+&aJZ zp{~){S3mQ~7yr0?KE~#%Et2v}u>~p6RxATYo1~*)>pi~vJIJyklA4FpZK3UC)@)K0~+RbLA;~h z_Dr&B%cjFPHq&TxWB-&-QyhD%O)HJY4u91aoYmldlI?Eq(0F&r7~>3TCFXM98vW35 zXf+-w?-{*$;-{anA6?25EKeuXushq1PUru2?}f2$v$xDD%kL4eXz~^m$iv7;?w|cT zq2+n9t7{LqEj_HLp!C@Vq@TvA?uO5KzjsA}+#loaVlq$cKi}5<-ns&%PC}`o?UuT? zK&k8RW(2mi_g`P2L_eNLZ{F5!|K$QDe!{cg&D%P|{(XTGKjPW!=55{4d{CgoX{N-s zPUE7z!uwYJ@B%c16lEmxrZfT5w z(4{2X^gEuVIUKRB!4N;=t`>8#|L3(jg-2B*a) z{_Z?x)n>l$#|WD=b0)Oma~bUzrQT@^YstHytGi7$r!DS8N$2?upKF~|mNTTDrxaSX z=qtzL75j#*!aE{)4`*G$Jj{LGdz|+ckinSs&LZ6VRO|C(SJ%e8i^Y6p&;I3%yE+XI z22`8-(1LkKRkO{p!q;AE{+m;!JV~A^*$4&t*;k}IEj8@UcZXNytvH4KGACK6VS1Q5 zamlX(cfsFUtmnVE^>cT3=B~-UZyL5z(n95hS}3;_))kOR4_lSj3fxoNnRQyTs7rHeXVjf6y>J*_cj#8cf9cjU@wy}a z>}zar%Dkq{YmqJ1c?4v%*l9Ou0Vy0uskkeZq*BI*RBUXeij32?R6KceP%7V;N$Fx< zyPDT-Vm?0nagb!CWx$+qSVPFc};-H@xI$2JxeH3e)14enwKFUop_ms}VWwn8Vg zc|vQKrV2TeZ^5M4S{dBkyzXFL2bj3k*n|U2*UUxUIgUst5=C#CD@9}HA>V5pZ|Ap#VMO!*hwuf}J zI2HdY&=i?&9CwKyMMf`npD5ljmc$EGUgij{zWHS52<@_&X7ek7o-Xr7U zxH6IHYj6}5{}bh_k-RfIdKYV}pV8L4C>|F77g++5tFs3Sx6W3^YhYQN9c6OF+41pa z<1GCWXD1j*I9n5!c2Q@iSmo+$t>x#~VpF+Z3OPNmjbSVyj%8U1GU9yVP=Zw%KxZ_5{n- z*%K{SXIq3@XB*-hVOb*EXmZ5aWpSF*en0vp&bAs!IJ+X=7fXRSd$Luo&YohqI(w?+ z>g;KjtFxzDuFihNa&`6$;nvxXcseYLvz;bKoINwX*EmbR#M!fqB%ECx|0;3zJgZ!t zJ>PP5_5#b**$XXKXD_l`oxRv{b@meB*4dTuzY=FxnH+KU()c)}NB!uRID46qgtK3Z zS7CLP$X;uetFzZxuFkHpT%En%a&`9WmaDVhuw0#8E8IGJb$lBvOJuJxIpXXM@s3>Y z`_V6P_M1i$&fXgTA#wILt6ZJEUHG0Tih1$oIK6`^zr|C2NBodcPCcUh+eQ+~zZZ`{ z5sAcoqO3%eeK($!D7)8F_Wigo(xZMXC(7wawxRHdir{m`mWzXa&dn$e}QMSQT_H2BQQO0tj>^UO|Wj~FFVSScrzAVa8+Q2^( zK3J;#leiX=(m*eH%6}ezZj@7xDF20#g!0$oR1a1D8&TG?uQj$wczS2ce`|Sf%U`#= zhvmPwyu0OZ2v2pj{7vC;7t7zWyvXuD+VZjGZ`*vS+{Sn)JeA7*+T=*@dnZ1M+n0W< zhg9xeBZf_P!5=chRo?k>&lY@xKdC_p$tATV8|l56g>f{wJ32WcjC- zYq0)lc`uv)FX3G@Sf2?`g7vv@PFWZoe~tG--K6sGn;fb9=6Ez}81-X4rSe;hWdHl) zIF)*;x9*nGsSmhd%hst&>IN)`MMAoz4#iT_UC0ipPr2?0>5;kx){BMoN*%$8O2|&B ztsn!0?3}s_LvxUjT~g1%W{Hr#sqW}@BZc%&%>@}HWI$>o#K!Fkm!f#L)J^Q2v9R4! ze*-JBY>(7*G;Vjx_Dt==dRn$uYB;J~Y*}gQU8wA9*-)di#IoT==TOV`HahpVY+s|Z z+_G|`bEIV>jLuP(?Qe8Wv@BzEPPVMl=$vZVXrptwWn+!bS(Y7Obk4EtK%;YkWd|Fb zjh0O?I+t2D(dcZktjg$IZrNm`v(vH~qw{RbYK_iSmQ6D{FR<(|qw^BW4mUcluxzH$ zd5vYWjLvnI)ft_)ST@J#yu-42M(5p@9c6Uh8%O=JY^!_G&TM(JDc?yro6YcNh5u7| z58I=UG5xrA-?%d(b<+F?mZyxO!X{Q6)SvwC;R$NF~sUS z)e!6NX@=MVc)B5dt>0fs-47eP9b7c-moUNgIVw7U(BcDm+g2p$2k{QIyWoR~dkP-U z8?s`-6Nvi?K7{w_0|ZYb9wc}YZ@WtbR}l{tT+L&Ky#-HZ)XD|d5RVi*g?NCmT_;HZB^o`_Ah7SVCKmse1tz4WdxdG~Ujk}J3mjgHudNiZzZ4HZ)iV$^ z9m(Fz7ajH+r0%wN(X7W3-AAzgR(Bn-jnQnz%f@I9V_{=7*Nf3S#=^$vNMakKqZkVt zqochT9mBW`m3!f$V-JQ8d(aW?W}>3w%JEu!2O{vUy1h%pWjsm^*@%=boUUy`DFY@6 z+$=?@XITkz#cL12#-M~4sl=%(Ta>a`>dK{v5ks?=5xPCaBOkruwU;KvZ_h1$dx}{o zUP9s2?WX&su55%hdM(=818qZgQD@q1@##{$J;kill~aXwSZ$MY=|rEVuYB~YLrz}U z5~WsK>6X&SUPJjmb*UL&sVnF3)ayA^krj?oM|sh?K5^(M>(KlXE5xkSl}CxHW2}j# zLXXwj3Z1VGj((#%|QlQ>6Wey_m%zSw$*fxWDGJA3bC zOWNsIsU1Z_Z0-Unt8~8YTB(?I(CYZA*uP9qNBw!W?%xfOmuMJ<@P}|HRozNKGD>i<4tppH?7ti ziA|fZrB>sNT#aiJjWevqq-*bs$#%X~rT%1cOK(U@XKc+Pv-HI8q~1rCUh!J85>n)- z%2aHY87c7FpunEkFiL^nrnrCObRv>Z1d`Jd$tP0W-8snz0?Cd<@_`ihdrtD!K=Ot} z^41i0fKKw-K=Ro{^4b*lgp?d%DtcZZDYZGzE|XZj@Sex8-n;Zj_ujqt++BB$i!no` zhDJSlOh6KLIy(VQ!``K+UtG3Z4A7-ZMBbGdQPj5$f0XWhV2^{0_zp$!gdQx( z1Qy$IZ{!X_i5^}~7v}V|<+@O9uU#P4qX$ZL!A;FBu|SIL)JxPuY#h`S$MLjXn7;E~ z@MnLd^l<_`di3hivj@d?+0|3g7ZTm6nwI*FHudNa8(o-2UAsCJ<6wWlF0nep+}*4@ zral9$D5^+1yBkp|GP#4iTqxROxUn^OR1%>SCZ#<`#E0x=Le`~hx1HlYT_+B>w#vk~ zq)Sp)3hw0#PTM6%bO?0XI#IN=2imhwSKJ9$Tc|73hmAm0Sk1uFaF?!%uM;22@^h?r zd)u5IWxEAs_OX5=C^WjS_07`#^2=F`k_9^JJ73CQQS2h zS(p;kH5~_eHbv5r2u99%ps%q?7*cqqA(hwNrFW7cs?eJ?HYDG{cLg zZ3!<0FgLzlUT)9#W9LOPjMSF@vRQawM@_!F|G!E354xrwSPzGRy)m{8ZB_G~;W%x& zMB3o6z&-zIfyZ(SHl=$@eTTo_P=2K=Kt7ueqS_Z**j&eGRUvHhr_x* ztmX@h9x1k+C;_ZbLMx`f?>mdQ;qvUOn=p=@Va+c>^oX4-wQ7#&*vN?`7P*; zo6z7>YA|Ps%U9v2oN8*Z17AaR8xwU>K!=XM1vELRf}eIKm3cMnn)Z5DPVJ1w(CpvU zY>o;wqX|d<)Xkh8H8!_5HFP$& zwMGp~N7lD5Jf$9A@u+WVZwDV`a7X9D&S-h{!j_gr3mZ<1O!-!ppE9kszOJTLQnEJ1 zu&TLrv**-LubELhXKHXbhfudjf*;(Pj50M zr#H8rIK8=}GqDa&>Kj_A z*1*Ntv!-S0=Ny%zy|W>jI%#@66;5tyZf)+2=mVoduTAwU>nF4Hq{)-(Ov2obrgjFX zN&}?&=T54dlc}#eN{Ws4igmViE^L|2YInHW&pvuab>cV_R=2fwwzswLZ7du1*>%-o zwn4I@6|Ei3OIn*6OZd$kBQ#1|V!4g^(x!!tQPrf`HTAR6lq)*s;6y6Ib2=wAHnva0 z!B=BbM<=lq&uDQfo88noIq4uvO%v9fifCo(n_3qxYH4aT$6M1TTlI+h+}Uh`nRQ0% zv{u@wTG5UMHNH)qG-F21^!h0?=StwJE9;XQ83EX6ZEEQ-rCmAgJnaixO~_n5O&>P2 zt#xtpk`?VuvzND^$xM>z<>;ltMD?`xlSEs4O?!Kr)Ol7--LzR#>*vg@x2Wo9Hh*hU*6Q- zynLzg&-guSVf(^mIl-JW?eLnJbLSWl=cm(;@JaP-Xy+U`({PT3Io0*m)9aEBmD?#z zudiRau*C)|>vc|aE(8-57u7o2lW{Q(qhdzWDW)DK(xdCAPoI{PZA#Y6m{c{rW^#S? z)ETo2x>2cPBWIM38D&bVzYIZLHb1E{Cs0*$XCKWu1(Ox~C&#Oqxr~3UUggkk^&O|R zHq}1?9`)OA<9S(ca=&y&YT8gLFY=$7n~|R+R{?r+}X4&$Kz?)YBLeg zjE)_;W;*%wrq(5$(haJmo6cCVEV6J4=Ae$H$@C&!hWU$4hKy-rtGYEAO-Zz2Rj2w6 zGcur`6S2B9DCNqq}uplPPR(@%fF^m~LEIPFcH$pE)Y#o?T|%%qstZAT~FjEd*f zO`0+L$Z34#?Kl*vL(vtLR<#@r4R6Gam(Z%}L4 zlRZl9jJYM%nM}#p5tSoGmQ*ZTxTtx2bIbC|>|&DkhNa`%Pp-^1FI(II-r82tu?*v~ zqH$s8!itvWWzC)AOIWINMQhV|?xKK~ujp7>vAk_L%Qv2|qNB3{UlMF}+aptys9I zqqBWs1IjEZsh9~jIyxK2FKJzY+Egr-ZAk_D9T*&6w4%ACv$+*yaeEWu1zpXpD9F5~ zQyZF=a~Iknd`0Uin3cu4P3l*O7cXmSUjh@$ zmUS#e>r3v6Q#%(`;AN>MpeX=b8kfQDGSyFIsB?2`OLHq6GJPbegqCb*IUTUQ$@B$! zv1~=f!uBN$h38h%&WqcZoy@vboZi&l#)6$Kh}20dnpzv0ytX&#OWQE9R3OeLLa<}u zVhAwqtXpUE@-|Lf>;~397dg{o7uyIp%ZUKn7X7^qoqw@ezeJ;PsbV4GyrgwmQ)?%y z;D;L_5Y36A|(x;as! zw}%*&vxBWob|-X*yCrj9BHMF}U2M{gi{`F3xd$=ZhGoqiZr#9*wp;VeQjoi=(3Yv5 zH0$u(wqiUgd z3==qJE8T6@uoaTcre9#vubXtF+2PR?T?s-4sxjzwvh);GEl-nTHtz-d-iyM)Gt( zD=x<`Q7boOYMggvYTWd-x@3A_c-W{M6J{^pu(Y)U(+76%CpR^YOi%`1n*eh#i!F1` zW1xRG$DNX$dZ-(fnVpl6+vs)+Zo{2yeO6#uSl-!Q-5G7`UmHuIe4y!5C=E;<&l`ySr>rma^ zgb5+p80YR`jlVfbqoPGT{qSz^akYWEUmZW+RS;AYcPw})N|^qnIXGjHDE_a(#y=uKX=BY>2qr8Y9>RG+v%E7 zAomb+%$;*?^SFVF>A_S?BRXelU5#BuOvFt)!NsQ5h{9dAL9p)Ti-Tw{!7TFZ%E zW(@1OyuG=t9Sd@93>Z%{A1`i_j_lnLV8Bc=>C%Ye~{n=OY$SL7Nt7|EF$NgpZXU3+2TlXzbgtf(mhPbu)ag3MWA&ys+>jt4ca1|r z?uG;jm2gpFWY-rSUFazAr)}7jUYE=Tc6E|FGP=ZmWkwgbu^5)vEb}CVG0>@+T39uA zuge%1W)_8!vJP;jl>Li|n#rn^tWil!lPH+%F;P@oU43B5-n8z$Dl%VJM4Dbzy-TVth^u;bk5W^ftLl~7 zcK%XkZ?F6@+b_T9zgWKR-<7YTfcXN5Ru2DBzscvs7o=FjbV>XpBZTx4Plm9n_sB#p zwOPcrEAybpY}ekRbYd?*t|K+>^9#obXyR$!{~SuUzE%cD|geS9*Ycmc!jwlO*58Pq_I4k0~L1oEEqK zRRw%Xz^4X$dcav%xr!8+|7q03d|ehSi@y|jZalgM@yO55jfdpBcnEj#5bok3+{Ht< z`F5Z2Q24$E^F_FemvH(nmungFG`Gp)layq zpK#~DaM#|#U3&|6?J0boR2Hwoj|uqvfG-F*V<8v5&E;KbJooS*%ggaU1)dwP9fNq~ z=jX;t@?E@yyLbtA@e*#nNND^JUSfUX0}-j;#Z$QJFT&}&T+T9i8oQ`zHb?qH&!B!i zgZky?=hjd1ofYA(e!^Y-gggI*yZ#{D^#|duKL~gILAdJ=!d-t5?)ro91vUoURkA*= zKlDs;2+~pS=qQ`Qc`*e}d3W^=;+3CIc^4na$5;IACEU%qy*0!9Pvbc$OKb}3oC43a zzf)j8KcDh$R*-z>k8pe|-Cn|nD7E%n`$+zQLH>k*PYn3vfV=rx^ttxL6EM6h9qk;Q zX8A-cbuqYqrSZ(C)i$9B|Lp^=5|MO-FEe^qI_ew5uWt~){CvjG%@UIDdWmp6(8FHB z-FOs^JDr^TLzP;8T>VAf^?+p0;0e?K;&jtL|fWH;+j{@$# zH!t<+lWbdr4+;3tfbSjf5gt!W0i>h;LHqU(+BZKxw|ynwwXbm3zQSGm3U}=*+_kT8 z*S^9RBu)$O4ER|AzaZdO1$=G5ZwvUn0e>{$PX^qzulV;~kpFSOw+7s8OQpO#U713{ zcTC!^e^Qbl9SsQDZ$Qv~`T4o+C;4vu5$>!AFHfurck`L>8A1N6fG-ZXYcDB(QINkb z;BLH${11ZsM*{A~qsVXY@)HP<#uJzr4|fd=;+LPF8$ZeKnPfolz00h$?t7-;w$z>-|&FD{xA8*2l)#E zz9`^s{%|`#ilp&ivYV`|)Ms!|pTR+W^7C`+Bl)gA!d-oYyZQ)s^%1_n`ossPQNOE? za95wfi6lWfDv5Nidjowu1)keJB|&}i^C{mw(JJ}H0e9=MRq zz}@^&lH?Giqao5?lJPA5j0w1#UnGBOkbh{vj|sS&f24d%kbg$NFA4Z%0sm&e*99EU znY5SKyD#8R2K?s%e>W;PV20a=@<*_=5p|HQ=uW{Plpdu5t}kVE(7^oT^{hlsSl53OqL+ z!-9C^=TqK|H_3OilyEm+2zU4E!Y5iE_y|Ahn;P&_1Aa%q?+y6#0eA5b{ci{P9|wG^ z$KSJfJ^rVnNyfk8q<@LN@_@VXDETvje8yU?VG7LuG@efOxlQ4t?NZ>m?NJuAM}B^8 zdq}=(58>Iws&Kde622hFck!3}vx0orUnO7X@W}fAVj!i9+G?1HLNYYXk1?7o_~AAipT7kF_6g*FM&Mknh?<^4o`sTEN|YSmgf_7gkFAlg{zeL~KApg;TKN;{%0eAZg(f3A>|E|Xq2#}64(J&j^ zHQ*`m-2R#g;+dbH8&Ao1@f1ENF)Dmyz+L<#e^HQsNx-iNxI15z@~n$od_&t^>8LUq zpHtt;puUwsee?5k>nr)LzQSF7g}eF+cl8zS>MPvUSGcRMa93a9uD+G7vOwu*bWp$1 zLH+XcbL%JhJrk|M`viRNfV=vN{DdICF5q(lz98Uk{D{8OgM1e+$#?rf;p+nVn*x4I z!0+^U0s+#|*dU%`gLvlW=f+d=T|9-mcnWv%6z<|F+{IJ4i>GiGPvHxaN(guH6z<|F z+{IJ4i>L5)fj$>c$#?M-?&3K%DM^ry4hZ6TKoHOT{M>j-{(wZQ@WBBe74WKn&kOib z0dEcXs(`!kDfX`l^6v<^i-*Xs5AvT3_=bQ#@9_izr15EhqwM^a1y6x9UhX<5h;M#A z<+~;YB!9<%yZ$QqeS>@#f5{&n^k zx86&Bd64h?k^Ct^{?vd^5BU6mFA8`|z|RV}8;@fDvLOGefV=fze3COXGjwJ zPzpS^e;g9TGe18!o|5mzpK#aS!Y7JJyb5>olkii6{Ivmh^NGmc6XdTCxEntr@5YaC zH-7k20q#oM^A(peDTs%hzxesN@v!GJiGc8d0eAgh@?HNDesCavXuw_n5qZ~tgr6PA zpBHd9Uy1xTgZu{r{z$;rdpv;v>8LvBPt`&E^7C`!C;4vwBz#C>MEJOXPY8Hjz+Hcn z@+SoO=LX!3ACbQ|$anFP{Fj3KzXZI3~wSn>x2d{n?^1blJ8mj~RvpC|gy4e~Dv_}YNG_xq&$`XK-30e>st zp9CBo)n1|xk8sW5#Q`4>@bZ994EWT5&kOj1fOiJ`+<;#a@XG>zRlwJHTx-Vv>8K_c zpEbew%+JpqpOWv^d*N<=6FxFADtt`9-Fznb(}VnD0^S<%8pf0ulB-XYwbFA4v8P~M$KO1^u4OZaV`eBvrVI;suY zw>D_s{QTVZmHgsFsqp>*FAw;E0iO}@Spi=h@G}B_Tfkoq_-6rk?IHdSPvRrI+~Y}6 zfOPWdQb|omhxysacRiCC>B!YgxT~4)Iun1FT4cCe-{teqjTAPQd>+`vQ$7#t^5yfM zZatLGUplXLGWtg(^^?!1?U-=+{F2-M$menV&nK|`U3yz@bU-IWy`sc-E5Y6UL{W4; z_|PQ3YjiRA-X6akd|!`W4L&d7-J><&Za(cE-2gt{%fAVHV8VBdZU-Oi@w>rGJpMg! zr@v>!_ez}pp3x7%o&KKDdhj7h`JJMt!4LHK^WYOa{!{RY9)AVgUAsiT26y%E8@&!b zJQ3&{y$SBdN8gC=%^d3G|23z4|LCKf^8KSvbISLRHs_S@AMrG2-m zZafc&iosp`48ZTxMvQ1U_CVR=*3F@9|4>@&`v( z<>U{Jt^;@1kcfLx*WXK`Z-H-2{40rW1HU#YP!in*{;J3C1$TY8Bzl1PUinAB-Fj6L zJpu0GRT6CgKh%@|F?fr|Ujo0( zS@c(MSHH68@8BdF8(V_unt)?^RCq@_T^a;qjfpIY-Ea^#a_@ANxdmfV=kH zCn^PBtKxWndLQsj9^W5)P@-?2Xf*hIj~~SH9-johBYc)?pQsl6FJAuP;Qsrsv%$xy zINnb^8hnh$>%pD>`$bLQZhqV^IuZN=PyQtEvlDy!MW=u}{T0!f;7)%g7@|KLU7j~#z#xQU4IxKEd!sL$d8XYz^8cpG;mk{@zGbo*C+XhM61D_zlTH@ zgSRC4lcFoZT|6d5*MUFiuZU%Sbp*s3DxNEQK=)2&qy{e-Jz|T$eRYyMr z_wS#71b(lV|19`R9{&lre}3}|aR0pK*WhkGu8w{O?w`l}5!^q2`7?MbnQyA255fKO zl~2JJd-+?y{qun|eznX$57+_Rt^YOAPT(UF|7)Ut;L|<6JGh(wYofit-TGe>m4UZ< z@)h9U^mrw>n?Gx!1HiX>`GArUG@*wcxLN z@%twD-#mUBxch*0U33rl&R+XI2;SD;h6DZgaqzP}{tWn)9)Ah^CXc@g{;C&`*TLiD z(4a1Q8~jMGz1|1^foJ~{@b7r-wH16PPrfVq-gK`&_Xc0)mG2M!kS9MF{A$mi;ov3E zDOX)I0(_9CZw&YlPu~Ra4E|Jp3UIYoekORC*B(cLyE(Qlss|t7*BXxJe3sXr zPXV9i#p|o!Z+iXXeDJ&Qr~X_HT;Ywk>%jNXY_#8v-~+tzb~|_vFTURe=g)GezK6gs z^y>cvc(Ld2v*7if{7=DqdiDPm_-^=9eZL2u;g$ar_$i+KkHEj~#s72g{$Bs*uZw)w zi(fDB?|b_CgLm`f_XMBq$?px$J+}J8v2?fR?}6ZrUc9TpkN5OX2fy5tp9}tN&)?(0 z_xJb`@L#Dp#D6*XvmQSU{CU(-uDa-4@DDwE7lYS$@xKQAb`^)d8<>wjEq@#EOFGZPoO>$uzX5!yH{M#nhk5xcz#sGCdlq=?<)07EGfLHW1$Z~l-u2+W^5kyo5C&FY@Y_1;4->p9fK1&B5Qv;FVr| z4hKKW%by4Sn%95o!Qb}!$5QYfUVEMd{*vd<>EIJReJjB~_v&{Ec!yWNuYq^>`qMYb zJ^QzVf8z0b!Qb}k`!M*6UjKO#e2i!B1@MEs@$(A!eqR1>!5{SOzYSjH$^Q+!tJhxt z1aJ1*H|~k`&ugC@!QE9C?E?O`H=YK85BKa11OM2I#|ZEhUVX=cb5AH&T{IE=&tCtX z2EMzezYct!=l`+b)4ljKg7b_*^(_OR>-GPW!KZrl`zm;yiUVB$ew?TOO7IIk`(Fn? z#Oq%-gAelT-wl4c*Iyn0@9y=l$H5Qu;`1zcrRU$v;PX9wzXtE)`TGVq&qTF;e+J*= z`SUUO3eW#7;LmvdsVnBzlRbI-dU-Ulb1ut@P+tOdxrwA^ZMs(@asMM^TB6$^=Se>(93TH=X(OG?-cNJz5aPN_&>b<#=Yf4 zZ#-QEzS;Bl8{mIR0$dl}0`9Kb=q~W`q`tM$ec+vmKwb1h@W(y-8^B-l?EM7XT{Y1w z;QsrazX9iaXmZs>Z-F1|#qX~<<*TEQ!TtA7KL`JbSKlJkrOK;MFW?_~@#@dKq`%?w zW#H`|9|HcFH-GL2{s*tWjbi!aniL%bzTV@seXAGW!@&D^`sRQi_~o9xYjWfdGWXiqME;=YCgktq z&0lwc|1xQVy6FC#@&`me1b6-(5IqS#(~I{D;A0Z~bs<|Mi5qPaQcGtvB<@_5WF`179sE#Py#{=Ooo z{Ql7y;P0yXX#Z#>_|Az;U33ZXt6qQjT9U^?713I7|ML_#gJ15A=exmq4=7h%^Z@uh zUVYqLK#BdLr;&eAGQRhVUIbs|`Tt9BckL5x0{1`f@g}(c{@S0w{rA)U2ENkkAO8e* zS6TE0_=}1CvZyO;^F2Y|+zUzjp1>JRRJ9%T>kTa)s2-rkJzL(N&h8-(T>8jXTH z-(#1nE*hVsza*Lr?tdQUFz_O;KhMdL9~>PEzF5`aotQ=7>%IPPBKQ&B{M4CKeo*w4 zobrRBbHRU}$kas_CzwVCMpuFRpYORId^E?Px$4Zl?;ak%E2sQ`=sxfbDvswHJq+H} z^Y2OU&yqH(i(UYC=kJ&wz}?k9`VIJwN&NdqZ-76V2=tHM1$XZs^pD;L=X+Fg)kU9z zyQ^=s6?{aZuW!@^zPZn1)J)mzRvxld~UsKauu zIek*2qYHBQ*l3;QTvPj`4u~GMoNG#-)cEKp%8mW%=ns~2Pt_+?6Mb$u_iTMqwdgF% z7LI6;AGET+4#7vBkC;BPBpQ0E|3g=KKkQ`^lBb^sKVK63!i1qYKb7eJP(b*@V|l+9 zfduc@*!YNcrX)W-X&%g<|9hDEzxkN+!w*)Ct##h-%)x@qlE=nx|2KKuZ}rq9KO9-; zha0>fh!`_F|Cs^&6CL*TUk>o zYiyYo%b3>U@7ht`*s3%hnr6$GcFUMH%TyZQDvfWZ0W+orGo}eMrVTTrjAqkf8Pi%B z(_ER+#=2>>jA^!vX}64NxQuD9jA^ipX|arHvW#i7jA^utX|;@Ltc+=`jA^ONSQC@6 zM!#v#%vj^+SmWndQ!mqg8PjZ;aV7$$%`&EOGvkb;X{U^7yo_nv%mJn@2S~2bV_Gn4 zS}24xMfWXW=#ubO$%m6vQ*ZzV0I+SW=%V0O*>}In97=V%$j!0ns&^ZcFdX< z%$gR=${>?bCd16MW7f1|*0f_*MxG2k8GEK3v!)%hrX91U9kXTtW=&f+HZ5AQq<-O| zMeR)|v%M$Ho>FNF8$gc@V22P<{DRYxrVfe<=TErVg7zP)j6!S={9|CKLjEz7U~C!u zV;99gYlSwzOlbJuDlp+8w<=7C$gL97-N~&s6EJeC&jbzJgpL2LM<#US)+ZA_a_hfF z!GwwFR-XwcxCto#YYnY`W{@!5`ez0Tx%JNs7ILf43>a`T@A1FYH%dch{WG&6^R0ho zP9(SCGczN&8E*V<<7b8(xz%Te9l7<-3_Wt|pP4zyt$$`Xf|~)!|JFYeP%F&oB5dktv)ln!7H_)%t)tz zb<~V@a;wPnX|#ow9Wrkv6I;Gs&n)hD|bVl7W+qoMh-EV@C&%EFCnV!$%en zlVanL(Girrj7CGpo2-z`(h--@A(zoHCu^pWQJ;0# zWpvzSbl_!lcWpw;y zbO2^_1ZH#yW^@e7qK)FRZX00ZEUULkvAs^#aFb$vmX+M3*#0c*Ia72D%BpTsRI`pj zS>8>SZNaRLL0RohmTJ~9m`zqN9fR3q4NDd=9fPt9pdKBA*<>M0Rx%xfSzQxkkHAto z7-gqmQf$Z0>cW=Q!I;&-nAO3U)x|BVt6NqFV^#-aRtIBN2V>Uk7HLZdV^#-aRtIBN z2V+(TV^$ZstPaMkE_GQQgIQhVvbxG;bqr>83}$tq%jy`+>Qa~0wJxh;Fl+k!lq$36 zO{vkfFYACdtQnCIWb`1YLDUhOHOnIM*+-DCT}4;PtPb0(StqNi*aNF-v>)ma&YD#c zYB=vhjh+6pIO_z=69EKS0|;tGbTQ7F)wrsP;j60AAet!xg~(CJWL9x>R@LYj zHLEs6$RUy>+o>dLrV`{!J0u-mCzh<4SdcI6kn|v31sOZWOdTXnn?$O z65ynBnwe)xmFcxpYRtc?DmqhDWBWvL#LZ!LYK(Yi<2TG;6 z_dv3QN(WM|wO z#G3AbD$V>mrAoZ3G5_R_skwD=+sNeiANf0|(WDOiwrQt1s+r!lB*~lH)XZG{$<*+7 zel^|yDOF9IZGM6|hvA1d9e2O{s%h@XXih^S=n~}|Nrm%%x>z&#OO`lxZ?W;gV&j9w#s`b1QoqG@!~;d=QM9$Y=i4C97QYaN zi)Zi^gFTr&JsFEjAX99y@yBB0kHy9xi;X`P8-Gefr}1Ym!8~p*9wK-!aj9UVf2d%- zUs`PO!N3*6B%SBewkKW^;LYL{5;jsUJWKy-5amLDkiKw#BRtn!Sl z>JQ_r`u#YYe$Fq4;+luQ;)4Yr53Kr$RsSMj)laPHi-A=?v8FS&72`$csg#+57hJ?D za{+L<{c_S}z-pIRWv&8NyTqD)EwI`p*7SA26^Dr3J1KKCUT_hs%p<_%6Gdh{u-YY7 z8NPp}c8N9pIbgL*tm!`oR=b-hW9<^F%wK@Z`2}2DAK_2!606K7z-pIR(?0`NyTqE# z@9L@D-h2lzDzi7R+9lR>^S+#&hlw?v-*HpB6M@w(vC8m! z3+2^fcOJ0XC03bZfYmOsrXLTi^(EHyrNC;poif7^3|z!2b1rcCWU+ezu-YY7nM;7x zF0rOx0jze3HJ#6_QMBIVwHItxO|G({R^<#C03aafYmOsrhg2qc8N88E3n$_o^p1HRb~KiIln-TYcR0d zC03asz-pIR(}x4AU1Cii39NRi=GF8CpC$Y+KT2w!YHJ$Ub z`bn(mT<& z)^zjvi3ka}h&6o-aK&uVW9G5H8 zW);(ISz=AU1X#;n>&XzS%r`xmJ1ArI6RXU8qGq~N~9M+xSBDLz{8AmU>L4+ZXHzsy0bK5*YPumdl+h&BCw z;N5LHv8J;h4m=4jxQI1D?LI zd3eD^tm!4-eHJn`ic0XO=_7&5kCm8=0oHLutTG1z>o_9Tbng9h9QpgesYtJwFFI#X z#@Z#;vfS^LA15-6z-pIRWtIY~U1Ck={G)b>HT`5@wR;9|`SGIvzja=+^}2~Z*m@DG z5BJe-z1aN$u-1!MW!O)&USXfndad{5*-x}y8-dj>vFdymxO{=weIHou5~~dNerh+| z2ddpqJb4aLwc8a~*GFR2*&n!kq1fddsCNDNumtI9msraV1y;Mnn$9^>?ecj&eNK>j zb7GaL0xn-9cBgpqYbf7=7hJ?De-m(dgUH_otok`$_34EdT*NBR`KsLhI34#+DxZa% z?mvlDz6!XU52V4x{;zQ$R+;I*8V6!cp9QROAlCF_fGg|+q1q{9_uIrO!@gavh)Zk96RU=SCv%9#FU ze~fS{($y}p%1j4VyTqD43s~(EYx*(3YPX#-)-JKioC{pe2OHtK09fr3tIQ?9YL{5k zuK-rN#G3wfV72=yaB++1e+^jICSsL;9az^UVoiSwxOkbAeGgc5Mk&~xj09f5D$o6V zMXSj3dsVvr601xJij=pB%y3|>FR{w(3#|1e*7Om;T3=#K=UP@_Ke$~5T+9bU;W`w5 zs-IZpX8@~yVok3DR{g}9ZpNwoqRev294B=rR++Pb%R9vGdB7F+iz+2dU-3Us-;+hB zsqZQO1NA*sbZ)o4r-_WI@9BcMH!J^&;DNvze`1Z*U|@|uv8E3J*7y@^I{QGy8KRSI zU3{is?nzWXvC1&Y?_Kyx<~M8SY!kzbY~(0IOYMm1zZ5 zyTqE_4y<;GHJy8yinB%Mdf@VN1dkxL4>DfhVUxa6WK6on#gthk>HUG#H)6HL_^WSW zTc~e-TMUPM#cI)cAaL<{f*DWMAI4Vo`?2M?Q~kv1564%<`J$7tt*~FrJ{7q9LP=i* z+-H-FHDWEh7P$B#kui0@Snz*q-7gWHrtX&t{%@_jeUO%^`{knF)cp#z`IPC37hJ?D(*j(6t;le^s9k^ToQ!m}ORQy22Ufepntm>D#dV^Sd#Ca> zg1KKRzFzPZp3EH{?nC@_kr@hH{tdxqu3Ia3Akx)OVztXLrGEP3i*2NS`t8NGsJKCN zjs!0Mrr*!T2aoBdGbSzo=^_Uk?o>8hVt>s1s_9sKExFlvC5wTTzreja9o$) zD)=5?l_ysD63W~rGA4$@9ab3=L!0i$a0GSQGj?K?XWS}o7d;14{~dy>fVE!{t33OO z_A6pdKNMK?6Ki@MaK*Pp=TVedh!Xtrt|(w z?G^*8U1F8tJ%0Ij#qMxmwM(or`vR+7Vof(^r`kWgbl&@`UEYi7y&z*=8oO+Nux?V2-Hdrumksg{3F>|O+UwM(peE(2D(#F~B;u-YZo z^tHfhm**9F?@z2U4+59pCw3nNR=dP1vmRLO5^MSfV6{uE=`R7R-Hnv7XAZn}z-pIRWj+E{yTqFQ39#BF)^y${s$G7kS?`63Rff;=F27&wmH?|=VwK@Dz11$U zrtb}`c8N7T3#@hzrp!2Wc3i|N!}og19}v5Bz-pIRW%wLQwM(q&#{jEcVoh%ZR=b;l ziysvIJYvxETVj>x?PbM7A~OK~mH$BSU|{u!SmlQRt3Sk=J{(y6A=Y%R1r-mA&QZYS zj|e^xSoIUD`~+atPps)xz^b2E)43K@{7`hx11^44@bSQ^pIGG=0jqvuO9mf=O*Ct^@2Au z{YQdJ(9esX6wEUpJ#QpdJ$+gBDUlfntiBPe%wS;kjabu%0IP4rn!Yb^#Rkzi2DtcX z!4rU0Ke5VJ0jqvuO`ig+`iV7t25`kQqH_*qY|M#OrV+UOS&=ybSnU$44BJla5^Flw zceU%U^`|4f;yKYtlktxQ_auH^Fu!IVzaW^8l!;#yyc_XP1n))slHk3Ge<~Q?436TL z1=kb*OmGwN&jp`I{0qT+noY6a}N-|DfkoOw*+q?{-a<% zi!Xj#@b1L#2;PhMUBP=3|4Hyf;`ankA^x*qo`uGL5nM<7SHWDD_#?qwTjReAzKQr_!FLeVau;3Sn`G9y_KO-&?%-?8;_Y(XT@eslM z?S;5ha0<;9+XqwaM9c@vqvxz4P zzJhp?;B~}Rg6}1+7QCL=>i;M4WJ&LZNk6U;yazD@fUAPIR`7V@se%tD=EMAP9Y=hq z;AO;C|E*Gc*k z;@N^vA)X`nd}98n0IutZ*_gO)Cq7c}L&Qf3ewNtk|AP2vN$=Yo_!z-MiS0vQMiI}K z^vT4>37$iIyx>OSdcmEvjrbYe2(BF ziO&_xXIsWA1)oH`O7L04s|8<7e4gMn#ODjXmG}a|_Yq$x_zB{R1iwgpv0y%TGQLFc zJH(d?{s-}8g41~JPkg!Hor$jyyeILMf-8ux5_}Nx)q8RI1V2o?R`9dLHwfnQ7-LSfxZWhbQSgVv>jZy6{4K$~ zdIR4icz5EP1@A+Ai{P=uw+iO7nB&_7^Vx{;?SlCX#rO`vZN%Red?xXof-fe%OE90g z7T+!ScH-{{et`HM!T%!uuHfEy=2CpG;N6M8CwOn-`vmhjSn>A-^ErR<{etHbKOlG^ z@q>a}i60XD72+QVzJT~)!CxbOMDVwXe<=8IVq2Ea(9^OTi60f2KN3GC_#@)S1%E;O zgy3Gq!0QF?Mf@Yde1?Afq~HUHpAuX{yg~30#7_%8j`$hD&BV_NUP1hv;B$z7EcjC5 z=LKI+{DRCYr1^4h)*&@D*BB0SCY=>ro|nS&S%KS8zsFD@vjB<2QGch;WC@P7iE4U z=_83Z37$gyTfuy8T>QG=xxl5rbGXc=FQAOo(?b!>d50ZW(@f(6~1}=Tm z;WC@fXN1LXN%~{Ne-!*8vF#hbA+~*k&+Lld7MUG(0e(ktFW}O59WJx!eJJxMN#BR~ zJ;5W1|15YE%l^gTGMjz~Wo#X15L-R`4HF$xEyRD7vR@&7U+_i5wh!|;Uh&@~{dVFH z1m6W*`k}*RHvK`$Si4UXTf46iTm5emTm2sqeK zFQ~2kh^?LjiEXd-(^}mDoUm~-T_%p#55q~cDGT_q9 z4wu>V>nUUV+a1JPMCKu4+uxoc-YV&@5`Q81x5N=P(YXEqTxuT_Ph4ix|3aCR$b3$0 zZS9Byl$aZTT)Pn$3El&^w2Q-KHa$a`u9D8*2Z_50KA7^|9WJx!wUn`T=Mh`GO~lr2 zCozAJ3D>E>r8_!YX45aBObnPvL;WC?k6J@Ne?-AP=t|#s-@-Gwfho5l$ zinv(tZ-7g8cDT%@zfBpd^B=@kXHkD(`>@--#JqXJwI^|3!KJ{Z{81@f#AP;p1ZAww z@x)f=bmIOZKc9G4!Apqk4{e+XT)La26PMZalPP0$t|qo~%QeJyZn>Fwpp?Cj*xLOO zF@Nj|*UyLt3Eo7!hv44>mkxHg%%=aDGS=>A#MbT(c%MP-4j{I6%ZRPrF~rvH6yiNa z{}IF`g69I4@`tx@5trHY1(dON+lZ~*vxsedFD15i*AiR1cM%T}o!b{Swbe>&>wYG&wY8Sm&bN0F+j;DV#QTb^r-}Cy{A1wKa)--o z`YV*NKDm0}f~75rTUGm+tRynN1%+8LMYFvDGt**zQ%TiAPG=X~Y@9 zhXa>p9WJx!M^VP=Tuf|rb`n>L{7T|cf-fWBcjn`vcG+w{K z#rka)jn|(&G+wX5#d>uvjn~^J(|COj7whxWY5X%{9*uu?z{Sswb7=gtY(9;D#=*tU zxCJ!+*}9O%KXc*YXYL{zzaF@fW-C4S;No?{;^g8r%-3oB8U`+2!`wjASC_q+X0wuu z*H^dF`1RWonvbf1i`R9x)A)7cT{Ii3fs5CZOKJRibs3Fc$HK+y*av9*TKXZHbuT{oqZIEa4|BG#q7m|zZotKkaR;Y)I?VVR?ygl`2 z8gFO8#dg-;XuN&*7LB+2;9|RP1&y~o-=*<3DO_xm=ABx(O}$2Pu}uvZ+tlmOc$<9# z8gI+P#kM@hFBSU@`p|g40bJ}i$g5qsj^bWdy?$E<_PTKc*z2W@V6Th%z+M;ig}wgi z2Yda~AND$D0PJ;!w=G6?p%WmnkilRaRsPlmu=hm3%|4jBo1y)hd0 zdSfi?b;Wqt>xx5RuOE(py?&Sgd!5h$dz~;9_IjWT_Ih9z>}9_P_Od@0_VRu*?B)G* z*vt4l*vt4iu$Sxku$Suv@aB4+FND1;FM_@NUI}~oT?~7f{W|Pr_6FF?>CLd0(_3LL zn@eCXo43PW9`Ay^JT8U33@(Gc3_bvRxqAqHca8ivKie37Tf7|hvi3CWp@}JRENNa7;+;lk#x5IT!yac{to$h#w>mhntJ=Z|bpv!_5`R)!o%!PqSyqVgFtH zXXN2Z;c{tqMhaVyjhZ{cox;9iE4mZES50i((4ac9<{DC`gxcNhJb(H$Q)9hDr z*mL|zZL~ZbZq~|&ptip}9BwwmkCBJN4S$!Tc7Qw_Znngam50O4w)oG$aMP7s?NEOL&E%59{)_l2@^HABkDn?Jhnq|A)8yfBvlxGjJREMmg`X}D zhnpq%E_pcI`~-ijJRENB#lM~ZYt)HspPPK3I7FoINZF3KUp3QH$0VV zr^v(M=D+w;<>7F%W*#$BJ53%AH|yh1mxsg6#`rVj;c&Al{)_T(xY-;&7zXS z{zCj^@^HA}ZD6&_<>7F1E&d95INaQXzfv9!HylP^yGkAoHymbNyILL&HylP>yG9-k zHymzTTPzQU8xBjYT`LcV8xAwAeN7$?Hyk!vyG|YsHyj39`?@?FZaA#7_6>PB+;Es? z?Rt4Q+;A9W?VIv&xZyCz+70q>xLIqB^f$`G;bvp}x8&h)(-(h}JREMez~3wnhnpJy zUwUr9;b!~f>TT)=(<~`D?1$mMFAs;CQFvZ>=77V^c>E9L;c#;l{&smd+;rl9BoBw1 zS@=8T;c#;T{!V!~+?;~HOCAn4XX1Y>4~Ls`@psF^;fBLvYCn;O!_CF`rSfpNxeWh~ z9$PrvT$fzEUp+*E!}4&r z;n&r*N95sf!zNAbQF%DruxV6#Odbw5tFM{P3YQF@^H8rf`3{b4ma$cuKijb4ma#3sQpGB4ma$Es68VO zhno)kv+{7bnTh|cJREN3;GdI+!_67^=jGvWa}NFmc{to$gnv;U4mX$MUy_Hz%{TDB zlZV62&G?t);c#;s{`c~5xVatw2YEQ$+>L)l9u7Cl@UP0l;pRd7Yw~coc?|zYc{tqs z3jZg0INUso|Fb+CZeGIwMIH_}ui{^qhr`Y5_`k}-;pPqezqO3R;pW}s>Oa-5y;e3W zN)CIDr>*@<9u7B~;NOvl!_8*+f6K$+W=s6L@^H9m>Gis8aJbnaxw?9__X4}ptXXo{ ze+IvnJRELD;MbOi!_B^UcKGFh!_8Ryy7F+i8IS*uZW|nKj!LewQ!vLgnvawm_A~LD z$iw00Bs?4RIpA<}2A(%n zj)WX=xcM%=pFA9Heu&>(9u7BrmUL|kc{tqMi{DZn4mUr?v!fyh9Bv-P^CprUaJYFA zUz3N!%`^BGc{tp>h#w#ihnrXMt@3cV`3pYe;c)XNzAg`kn}6ZAmWRX5d-!eS;c&C& z+UeQRk^>Gm>*KeRhr`Xr`0eH4aI-0X2YEQ$Y>po&4~Lr;{EqT)xT)jWV9Ei9o1K%Z zZR+=+*|p@bABO+5JRELD;&+pW!_64{?(%TB8IRvX9u7B$7Gi75skkaJb=E{n}`GINV%? z-(MaMH`n3E$iw00M*IQtaJcyneyltkZoZHIoID(E?!>cmE(aWL?!k|fhrNx|4n;Vj=r>g%R z&FLkF{oVL87EM3V)G29BvN4FO-MF%|ZB!<>7GidHf~vaJXs5 zUn&oWn@&7$3d{kA8$OG_407IxdZ=Ac{toG#or(ghnxHHH_F4|<{|vIKaz*T%>euz@^HA>4$m)qa=_tcXZ&6AaJU(a|FJwAZuZ3AEf0sA;rO4( z!{KHWeyKbhZVtfTBM*n0gYZ97F12mT3pINU75 zFPDeI%_I0H<>7F%9RDkMINbaO|CBr&ZeGAYEf0sAm+|~^BL^IAUQez*ul`>&FP0qk z@8MsPhr`X9>!<&nJREM;$GaPvJpzXZ+!hnpYa*OrIF&AoX3fI$v8+&qF`R~`;GPvX~;hr`V? z`1R%CaKn3DYwPGShr`Wl$<>Y3zeTf2$zlH`%vUBM*n0v+>)?!{O$u z`0eE3aC0S|KWLEy4ma1~caVp}%`NzW@^HBMK7L1eINaQc=fgm9z~SZ|JO?A>fWytt z@cdDY9B{aK82>4GINUseA0!Wl8{P+9+eID@H^0TNr^g%)H?JgD_fY=^&1Xsu`xW@T zU9Bz)pe@-3_Hhnw5+o$_$Fxf?%O9u7Cl@KfaBaPuI3 zsyrNS9>Y(Qhr`Ws{Dyi=;BfO?a&@Nq*JzF_Iqd(6@0N$d%|Gz7<>7F{d-iKR@^H9W z_e1HAmxsg6Cipq>aJbnVe}X(5ZnnnHm50O4j`$Ph;c&AH{v>%g-0Y73f;=20_ zhr`W2_*3NJaI+u&LwaoCaC1;{^-T2>XwE7*?5E?uBoBw1Zv5HuaJb=b6x7aqFOY}B&5!XH%ERGi8GeC0 z9Bv-Pe?=Y+H^0JvRUQsEFXAtfhr`XQ_=WOtxOo$Qu{<1Z-oalY4~LsIKb-zjc{to` zfL|mJhnr3Dm&wE7W()k~@^HA>27iS-9By{PUnviVo89qO$;07>za3G#S{@EJ`{S>X zhr`Wy{9<`H+#HU-Rvr#F6YyV?hr`We{B`nhxaq=wT^>+|kK?~D4~HB621xA( z@^H9$4*x@WINZF1|FG6|aJcz%a`ngR-=_IV$zi|RM(LNz!{KIK{5|q;xaoucsXQER zw!q&j4~Lsp{4#ks-0XzEPaY08yW#Jbhr`WK{Lkd!a5EbJfIJ*-#^HZ14~Lt>@DIwv z;pS-kFXZ8H(}{mb9u7Ct@ej+x;pRB}Bl2*#IRXEuJRELL!9OMshnq9;zm$i=&AIr; z<>7F1A^r(@INV%}UoH=an=9~7%ERI28vI6jF2UjE#^mZV>X*>`w&bw?3H~{GINaQi ze_kFAH^0QcAP7F%5uSr{bHL%IPyT=PBl3OW{JkKfU!Gb%+Kau+@3|S<<*AJe z<$zmr{}*FWo{D*Pg_$hJ9(ihM>BU~I+wYrdmzq30=o8}c`K6fWP&nj|$S*BzCD-kz zr)t|p9&X)6+>>95dFH~OmOnYaw2UaZZhu~?U53lUgSg>27Urp#XA!&)Hn*4a)N)8K z_Hy0+rc`YQ%fqeQxg1OKRLpZbd^lF0ZP#*i$#whXsfzw-c%qtT^GnOjlI!+=O4T+) z9&YUvzm;E#c~-!4ud8We46{VC}OFOrAjH1T{cTYTT)E94g@x9|)XSRmg)oY{1|BYP04lp zf242wwLIMV3o(a%6!Y+_qv~(v*}dEHTFG_$&C<8MDi625ARfSFeS5Zs|17_KatlwW z9B|!!&*ZkZ<>A)9ibp0F^Nfbyksq7fvSHrv9B|#fJ-KZIdARjI>bsJQd1k>MR@0N* zQY*P`e^&aot>od>kBAp=S>LaP@BsNm$t{CRuG{l>W!u{1;nuo%377Reynms(oBUnL zEqj+-x97bHyNr;B2kj|d&SgE%)9^m>ya%D>u#)Tc{E6qbL*?PteZ?!dtmonV1=STxRC3+^u=ImjfO5bwPdt^&dY&%$PI=xJ(DGEtb^9~Y5B`-r9CwQsa9Pi@5dO9N zqU4r8mRz^LG5z4zyT+3JySnmhaKNNyJvLgj47))Z)itH_x>|G zIzMos5!1RmC-qF5Iiu2W)dzMSH@35T+N=*=$HDDg(>j=}lUtlOd*GC#yQaJFCoZRF6=M~~Ql=+UEQOv}6fK|i8%+W$CbpUxgXCgXbAd){|f z8YgwrI5*cfuCr%c_oNTrEuS}{b9T@FKC^s~dT+4q)xhGS<+;7zJ@oMQuHiFh^mNbc zn$zCZd{gqA$S&R#qY`2cmV^3m-*W7POn zUuNd4|MA#akLo^dWc!ScuFmf9lNx8}y~BF8mdW1T-7~uztKznm$@^#d;Q9Y^iUT{R zwM8$tPn_7@ImdU}DrcP1S*%3lR-wA4&B*0OXXkpTGH}w&V~_2eQ9M<2#^mny zV_CYU&7L%8V0%wb_q2(}_vGCFAA`*^eiG+l*}Y?szZPG-cC2ibf-Zjq^^WFFKh5*! zeV&_#;Qc?lowI4a-m$$i>!0F!x6l90)pTWubYzA$=#eDatXzX|?Ji3VTYth}4+<3hs^8HYIq~m_%?!lGU%iEzEpD%2e z4B-kqn1k`xJT-U4d7QtJ^RisLxE;*58G%R9u?3Khv zCUZaf_kGG2dQI^G(h(mgV`yC~n_w zP4o55_mPcF$9#SBRLnQAX})dqeNMdIE=DomkxlbWeIfs@O18}R@jMmtozXNO#~e>C zCd;qId~B|9nIS%J*FWfXF(1#bV!o@I=Bwnfh^v~9O}@tY#x~5iMZ}!?Eg!If;%M<7E zd|@++`PRx4gX5rH688RE+&(s$8aw_T{dj~&(XE}(c)hpg^|D)p>ut?balP9%&3ASF zewKX`#VF=$ZJKZKAMvk;->z?z^Xig@$7N0PZT)7Y!hSIxza8^bJbpiJnr}(&n_Z+SdjBovV-u?J_I15g zE=T+yAG|jj0pSjHW z`@yc_;`SZeG~a6Z!(&yiBc?XZ_wL)}_ha{l`Q|sx$KPFD)%WAVYntzpT*)uZ^NUeDeoLF?>-$dmI&5gh z#pCy4(|iZ#3rzOG6r-4r{UBUsh|lQC`FK)re~0I(m=9>Yzpv*?{(6K*F&`g2^}hM? zQpup83W!%*WqfXt;RgJHslK zkLJ3(7{z(>n&x|VK(*453mo&YJ&#;koe6s26h0X6>eBouUzp>}s zV=lhn=?P0Fc<+8z!(*mq%wIg z=1(9iE{?@acFdnd9xFCFCB+*-CiLJi@o?r(npnI5Uw-pW94F(WN8jL>ITo2?u{oBQ z;{LT-Q0D_yLgZ9PO^^MiV|v0QG|DKAF*P}3>eQ2ao^VbcUiu$S))Vrx zU}GKIF+29ZtIchp!IR8!vN`T=jt7|I9_CnTj#JEWsyR+G$34w)x;f4;$C>6h%N*n8 zSZ0oUnd9E(INKcOnBzX?xUV_RHOKwTv0R&XceB&HSG)fonx{hV&cnH-Ium04dE=Bk zGwu8mKaGN^7z2#?9=>Fj`j;Vd+9ZF5{~*Agrf{bJ5q=AqWk|6%t;V13|2eXW8|-=0 zZ$Q>7_{`uuEYZ5kjM}tfe}R7*7N40$w$i6bv44Q_h06C=evtD0lpm~ouJS{a@2mV! z<@+dKBzzxKGOO61=YI(`$Fs=+&!2Bf;*ITHo?qp^4{yCP`Xzl(Z7ktzy>#su1;%uEM5oeeAH^EJ>jDCr;%Z(+R zZSj8*Ioqn@*4Z}Y*4b6ct+VaQt+Pifx6U4;+&bGKT%B$5UyGb=HYMWhYJU^*y)ybG z&aN?*aCU=#W{K_DV^!QbyHUAy_BiF%*-gr=v&Sp9&Yqy$I=fl8I=kM#4mC^9c9{}! z_M`p;|QEr`03s+}* z{k5oBob59u;_Q%rt8tcoiL)7F31>(B-$c%CQE}_+smiUhTa{a9Pg8E4JzcqV_T$Q} zvu6lbXLJ5Lk+XSIBF=uoKMDC>8T}GxKWQxC>^c54+4GcJXU|t|o&B_O z>+A)}t+N*@x6WQ9T%A4JzY#S{&u%v*;_Su#R9vK`1OwX4gLV~y)x>E_>IOA;@|auABo>0V&x)sv(HPv zc={bj>{kC?BgXSYY?rZw*bn?eaf)>7onyql@2`%;?r_BJ^3CB5-^1U*iCt^P{mJoZy|79fhsEEbv0RLS0{?hD+{5K-;haK_9 z{BIg@>WKI+j3vZ>MtuV)5>2FUNlqrt9riejMtP;*Yeku@2UI^<+ii_t$eDMzbU-LcGg?M zqt1F;IF~F$#|!??(GqF=KTU}={vH2W(|ER18vm}b+-sNb$6~o@cDGa%+sO;IY@JGC zt8pnT7BVsR7RV$alVe}!bw@~PtP8bI7cw>GbD6EZt?KFk{ShD)A5C)UZ?=?mL8b`4muvi)N3fK5_%K<_cwj(QH;$ zYcy9Wt2de*%9a?-b;_0+%`Rn!8_koH9ceWClr1-!gUVJI&9t&cqdB6i*=XjKwHVDa zm9-ho?aJDX=K0EwF`5@CTWvHiQMT4-UaoAN(cG!5(`a6=tjlQLpzK(qd6Tl^jOKTI zuk2}#RTIXUBX2h4dkW{U8U9n@H&|Y(Gx~TlkEg}`MC^T($qYKlIHaW8_@fiL$GD>t zy4QH46S~hhGu-F`WKqLI(4E8iShSQ-@!`DvDVF>rc&9f>@R7t*1TW)_ z&2+)biQ|Hg+6kH2f>#jF6}<8R;Bvu@#PbC=9S(eu;N}Iuiv+h2*9dMUt`pow+~AcI zv*El%dprE1#j|j4FXc-J6|b7ZTmF4%RMgJfqO>pM=p7(Ce5kPBr!(3QhN<2)ac%L6 zj`;<0=Mu)|^T_1y$ir+u!q|Mm*rjP@bSrl0pfcW1$1d$d1=Qt*%JUzIT@P%Nzk`h1 z0G5b-8V?-c82X6^|J-pWi1E2G-sz)aSj_MjOq*3&G;QB$8}^>zPsdsUUrS4uBMU81 zh}8&vRf?Hd!msvOcxF-NFP!58Of2!pCl&k4OIdVy=@F&OpL~#4G;JC{;;EiHv{32tI%`2uOS=Ts4aSpzhu`+oZ@=Fd0~wI7C@nFWK=(y66W zN@+H0Z$}~yi%FDbO=b1Q>%CA%3G=A6cR`{7_0QJ&O>5?885%+1eP;P^lxLdKeVtOA zIk(zBYL2vd;hY)%%n2)If4KD#wpCyJ@is1oj2xn39QFU7bTTGJk(Y;r@4r25Dvst+By#<65B5@-UT<6$p7o8->Kz^$8qOR> zV~>vkQzO-b9@L^of^Z%fnY_$;C8jM!=a%?IeAeaTIhjA9hN)Gyj7s|D#Jz1I9Qhjy11dnP{p>G_76J)w#CA>q}*m zz4_E|#_JudOW^5YBA4&Zd&Vk5tJe0mL}yEz1_GPh8Fm;eqDQz=sIqUdcN0VrED2JGYzXvG}C-#b91N3*pN$R zo4V8K#_nFRu!0*_c6J4c&g0~?dgrv9w2N}% zR9t8KZ)8<>rZ1iJFnw3{^<~>JSNoE=Jh4~?)^gAowroYCfsBSY)+Q7+ zZc4za$rP?`S-rM%6AKmDLN+HclFX(?2FIxs4AE24T5Uns#s?qjCh z;yQD-b*HO+bxUXX!K_-7wXU;$ZD)Jero^iDwpEyMj0*%8M{<0m6(%H?soZIq-b7z2 z$I*s)eZkx;VrCW?85={G<&0m4rqhX3J~=eTwf3;7Fq>sktjnf`v#I=PrWQNBI0wu; z=}2Y<@-lu+V!vi|$Wz#w%A|6GW8%h{{ZXHyO1s$DB?c>nECSLGO4%iV;)FLkJ|=Zi za5XTELS1$&?PwtWYdC70d+Q2Q4<67m(KtLTlfv3Fylc5&m`NXujhe1(cP7^yEsw^e zu3*9tNVIItCo_F+Acc`r;$PGaoymdq`Rr(Kp252@)u-KRT`@z$X+50DXNS|AzU{f@ zq3&pW1`ppnkjif!9!X|68(~#cQA}rj^4p;Sz+AO z)yy63{%HBvb!jzfkp8KU#*t0$>Rh>I{l@lYto@Cfx>{@(7UnUH#)M7~HjJ61vhIh4 zxozX3aFIx)hjm4Es@u4>v)NQ}pbz0y|O$!30-wL>DxR%F&HW6iE| zJHm{CGxgahRvTTD+SY6+Zwi9)CDpanHRV-9-94#gsq{!~*iVw}9bA^(QX8g*`g_4M z!&SKC{jvzpR{Rqq%$)-aiay`;ys0 z4rU4Rdxvv*05V2{?JW<~}Ynjg)w3U*XJn?hE1I@O(% zicF{FWVb?*{?Uxtxl}oMFdxWN*^=C{P{n!&lYOJ44d!nG5t{Xtb(3JHW1R z+=|AzKRdLAZL2yxnH}bd`80a!W24DTZ_*iilRr3|!u&x$p8~^NcRvi+?`&H>H8RZg zhSNa(EA*V1vHjWug_U>}Uq;fw@Rw{F?&(!ooGxwdcx&;_Beq;uJ@*Iq7bxJo-0 z1*@@gU001+sGN*oe8$+#1Wu8y1ox^~d73&~R<75@RyR$@w{)(>x>{@2Eq6t;8%uMg za@;9w*_{1c%X(am^0oUy&d9OB|MUQt)A>@YKDeKN0I zWA`HFW~4qEe(XJSBi+5pFq(yC`k1`>G1D8H91}xsxR{-5ZL~k3^O3XMHX8xwN*`^g zc-!TT*zK$7d$U8~Z41`$WOhrkuO>nPoHN~3xWzK}wnpB)7vT2H**n^flmXJMqV`g> z2{4u0dze+7EfS!GVbmzHw?@X?+?Pa=VfPfq9o)akjkhorZf!qSbgfIKH`SxD8!dC* zm@K(#8I#putn4HhbED1Rw)X^n~0Vsnfdalf~#F5IHqyIV!AqJb~rmoOzl>)i?qw8 zyX2ww?R~`uw)eK{&4UK}SRfo5dRYDnOPbmClt+Dt3#n;~T{(5~bH^FArKdZW_(Op>7mk3k#0c;B4f-7hbo{zMm zG3MUFo-Jc*d(f^?V?4Iq);9hEh>WpIIx@yy0FhA(7v<`vYbb9c?eyf_vb~8qP2+Lr zrFWdV0?VGBE^+p-4?DRL%H=z--QpcB`@mH(YgdgdYg{>G_7#@3S}CfFIxlLjIdie+ zwKX*zUVaca&3)zgVPa5IUtJT_l!rB8T~*EEs-WRuxn(f#Hr_`n^87RWsWEwW&*zew z8mE;vp6@qKndHSvn=+?oiaj{H*fRLj~Rtqe$+^#l>rK}sa)?C z&tC{wV(wAGksvV?j?^Uj!;vu2OLTgwHKx<2c(Y39ogXRD_mPC_fV4G4O(~ESNB^KR#GKwm+o2&>zAJ{UN+i zhwwsw2ru-9@KAlEKRj1{A1wZn7y3)e*%nEKks>eh@V3WEeCA&8g$0wxwfBSNv@fVg zc|6h-UeFX?Gp@Waep0@9TzPgJKYtv*eH_1I9N+Em2m%y&c)#PMBK?V_%_{QnV$4ZJ zUSZ^zT_nF#h%Ab{xamK4ezEOt|C8^I&XD#-)Z5Er-?;OeV_WE-Vl%ex{HC@$KURRd z^P?HuogamBQGk(KjiWmro!|w%$sT{S?2ZSq+utXFyW^1rFQlp7D9Bp=^vR^S_ep#o zCBI|^ihJkbcspLCNs4=ySZKbddppPQncla-Pl=YfxOW@)`_B1yf@fyflj7bzfHl(# z{C>bsm={pYi+exE@iD&4HYx5siSK6}{s-`XJN!BDUpjg(fEUIm?!5|L?dZP)o|=Gz zNpbvY!}ES%De9jBK0jK9;`nuj=QTU_bHQJ8>YERKt5d!Re5-j;Ptmwn2Yz2Pt>fO2 z;7>c{{NeH?(Pbg-b%1v{?dt-67#~S-Z!_?>obo>KI>+BM_|F~vJowAb_?`iNO%z6P zZ#(#)(?1u1%MavPW8AwOe8jQe0e-hr|MlQ6Ip^O5exWn|yTA{1+J7f_vE$FZ;0NL( zDegT8e5=zRkAq*}*gpk+s8jzl;B%b%{{ikf^}h=KC8s~$0sof6@ov%kp~I(uS3C8^ z!Jl^K?_BWL96les(W!qC_y&j9fj{bu&ynCSIrF6%e5s??L3`UB=>IP8VWBO zfDdu{a~F8OGhTOsS3CCi0&jQX=|S-K9RD8&XB({kQ^40a{yYP|z!~p-#A9KF)Y>t)1ccdk*;i zj{U{pQ=Rr-0bb_#cQyE0=lrjNuW-iqTi~}j{eK(yg--w71^xr4|Lz0d<>);GeuiWJ z1o((!{|E4$7(?6szkq+s@%LZgYn=Xm3q0ZI7eV_H$9@X1a zQrz1LzTL6k2L6mKhTa9>zjo{|18;TgcYv>Q+WS@THfO$k8@$Zv&+mb6aN4sQ{9LEL z{|5i0(;tt4KjQSqZ^28Q`kn!w@9-DEzwgA)>)@|A@%cXZWsd)oP;4@9li+sZl{0i!LN17mxHfy{AmN964_mcOvjl9X1l!fByu|HO2b-H}Df2y;s05an_%A z!0&U$6F=_v&UX4^8u;Ix`u7H3;jI7V;BPwh9}FIyj`)4+SzQ~D}i@?9=lwSdUjdT8& z!T;p6|Lfo{JN|tK{90!|d>{NpNAJhrH#qHm035$9kNkTae1fC@JMe>@{(KI+kS2RC zfbWhnCVQ`fCmny@1;5{!PyGAjhaElsEiSJKlH#8Hm96D?o`&)xEyeS!N^t(Qg`~K5 z7rIDE3;%lt+#liz2TqvLq$@h{xR|3;;{qo&-OzjfU2hpIb5uezfapE`UNx27LHdvm-EvfQWWW324}t z>=_+MbocaRlUr!Aa(!!9$1@G!=?2hVO!2aHAep17aQ>n}Pt-3~!jt5S9)YngeAUYr z-2>Blv=-KZOyeoPRmb>Ct|tYmXxwMMY6hwns9d0Wp>3A+OC1YUCsfx$)d{tp(Ds7u z1l6lmy;{}7FJq10wW?REdbO%ot9rGnSF3ups#m9ab*fjVdUdwvRIg6;>Qv8;Ql0A6 zsb0P6)vI2;>eZ`Wy&VeG!*6V5Xw<)Y)vH&%#j3Yh^%kq%V%5VhCe8VaRd2ECEmpn7 zs<&A6mZ;tm)mx%^OH^-(>Mc>d&^Bm^3NKONB`Ul`g&S13L4_MsxIu**RJcKf8&t1B z^%_*KLG_lZ-cr?Ds(MRRZ>j1nRlTLEw^a3(s@_u73u;s_s8PkBMkRw9)eLG>6fcx) zIH+t;qq;$j3I{b-xezl}If|MnT%vf10w#*6D0HIOvB4AA=m|or99o}k00lOJ0vkes zjiJB>5q}#f(H&Z!Z5#zQkOCV?feod=#!_H|DX`HL*l-GLJOwtO0vl0*4XMD!RA7TD zsI&cS!z!?G71+QEY-9yCv;sR70~=g{jjq6kS775SsJA0%BP^)5BWPnRut65sC<|i*gQ1PV(8geBV=%Na7}^*N zZ48Ds216Tzp^d@N#$af}A+*65+F%TAForf5LmP~tiJjI)W7^tMI78RM(8g$JV>C2D z*4k*A-`W!Of(_l!#9nKo>C4s@^Ci2KRHlEp=0E@BX=M(-DayC-=V2Yg1Llp~qN8Nj z#@*X=#pMn@#KC;`Wo?!dufPGR8K0_^28w2*V56zH99h#98_g!Mslitj1(0Urv#8ZT z^Ot-3v=nfyK=V#{U(K&Tp3ScWo_U;X&WUY)HE>lM4oLKW<^%%`wl=JO(JIM58eg_v zVr#Po*w#yI^E-iUy~H-3&qb=*aX>l=pPA;*jRjkq5#%poB}ja(XzL}mHm3vIdWmg5 z-~HKoiEaM5z_wmC)jtLYB;Mxw9R_;5F+Fxs+cObFe3>-xK5y@Xn z%!VRyy7=o2H1F;FF2R)cHwb1M{bL2QT|QreBAtPcf1H8dS;U(JpHHk0l|Dm!g5+OL zyjk#7#Q6Wbn6AagKhZ$%`@{*sKO{a$@O{MHf*&OA5&R5sui(EC_X&Q9I4Ssb;(oz= z|L6}0j$x|#gMud$rv&qTn18b1g~X=_t|Cqgt|cB4d^mANa3}GwU`}P9oriQH@y7)B z5oZPSuMYj3;1S}y;4Q?Xg3lmk$0MCZe5&B{iMI;oJ-mOKV7@c-Inj`=BL2AGox~h8 zq^}WwLNMPM`ka7Bw-A3y@a@EB3cj0on_#{(^f};2_Y;7YQa|%e_8M?#McP^A@NSZPY_=#nD5m5>jY0O0{)6%zK8X%7kn`BR|PL6{+i%+ z;;#$dM0|tb6!DFM`TX7ghT#7q{-)rc5Z@%2?}hwt34V_F+k#&wzFF{uV&Lxx-iuiE z*ARbK@_UJI5u78wRq)xwy9D!{iGQ2muMq#2;9H5mC-@#>)qk7#cFCV!0?b7Pshs!@ z!8OGC!-EyXcS=6rC-`>>K8g5l!6U?~e*-ZWC#1WGcN^$EMEoPcza##!;1`JR5&SOk zy@L6y-M>%pe#ENJXW;%%B>!aMp9(&m_-BGIApUQ`R}tSY_#4Cz2)=`uizO1DLtB0R zcYOXslD{|c!-5wQKO%Su@uPytHe(VE}jJZYr%2i-w2*htooaYe=GTX-snFic$;Ix=Yan2B>!RJ-wWpRIR6iV z`TyDZe-yl)_)mfdiJum{llaeqZzH}@@O{M32!5CNS-~^+0Dewz1@ZHOL*l;(ZY2Jz z;7;Pd3GN|Q{Veg{CI2kqe+d2@@e6{lBmSr0-w?kj_(kHE1iw%GFTs130>3Qy0OD5! z^FI;rUln{5@oR$D62C4uLHveb{vN{rx8P3^tIwY$epB+VAyz+sMf{fJzd-!9;J1k1 z5j=4U@VkQJ#P10{kobMU)x`M6bObT}zMW|mF)!vw8;FYp_YfBg9wsgkdzR&dc5}YF5TkxsGvjv|+JV)?l#QO-omUv&mHxthl zd>8S4f*&B>U+}Mq4-ou3ak=2vi1mj<{Qoli3dx^AJWuce#PbDL5ibyY1aYO{c4BU_ zkTwz@BsfWYu;3es4-tGf@u7krAYLT+Nn&o$kobEHzgqCi#D@vydq2NM@Eqbm@B-pc za6rt>9nv!5I>GJ4^@2AL>r0|;;w6$lMBE_wG-Ce8BuM8FbCZa4De)14uO>cH@QuXF z1m8xyT=0*Gj}rVi@e09zB3>!@1>#1*ZxS~No-iG_S@0pmErRQbTLm9M+$Q)a;CZVG zc%kMWO`CSfKaTil!TrR?2>v*6hv0LGR|~!Xc;1=L)Hckv^6I+@m?ZsV4pLRdX9Lt|d$t;ZuS2k%^e^fta}Ute_YYai!W^ z3tWMiWFoFqn;U>D5Ccram1@InRt4q?6LF>5aC=n2&O;)uRGZzv6*F)^+Ko@8+WZ8# zVkQnq#Fc9EAaKPj=6W7+rP@3STyX?*<#%?KYQxLFzmLiGc)6|MARrM}YW_cgEB0e9 z?icW>R2yE3D)whCew&Ios<(+h;+VC<^QEsw5;!3sQvR-kZxKeFW%wHz?#Fc7e=IwIH zH*thL9219RUYUUgb5F^{<}Kz)NW=@UFJY>~$5)*OVu~TLTjw#zkcby*{?Wko^O);- z#C7``=yl=C>KsSBQ1Un9YaS~>B3`KZL%?`qZ4&Wd1wPcXX$Qz-(=98MU4krEFMbT3Z%!4xQZ1w2wfMMt8LaQS zoeT?ijkBwcyMJF%(70K(SKymz1%h}hzS)jx_}KpY8L-s`^iG6cIe{iyb`QAQj@zNP z3VGCHv#s85f$cef-Y21#aWX9AZL6#2ZSp++)|z^}v{}99fq701K1~0>TG+4GIC7Tp z^Rj+hyUv60yKUszWbJ57Y||OA%UgnP*30xZKCXW^o#2_j-JpMaX&J|DD#Q>&BY-Bo z1U+5S4Yzgi+s-i-%!hNApe?)(M4 z#a)7Q?a7K$>DtzRZ);6eZ5O%Xntxk2+qu4C#gDt>KDL6bTk}^ZdD2L(c>-;}HInu= z9DUJ#oPKKltHIs{LvP+uP<-Ex6-6s|UUJcOPs_QW@Uyl9c2Jj;{e`0Z$(jM+k;n&oY#zedP`gHF6Z5b+VjN9iXT_axnafH z?c4WU^D9c$RjeqgnzMFWzn~z0`y5_>$wh0>gUYrGR;=oBzy?7Dd8}#WPPW}%Ram+6 z{x0K!o&Cx_|2&voaersvzMourVds&ZgRl4K{K;j%yKMFo1%qzh zWBdS{^vEE3WF;(Dw*B$s?K@T+SlO07aP!Wq5nbDs2Z6RTrw#2+ul;=co&zh^e*Ss- zWz?0s<9mHs*T5%43nkmPU$%Bzmpo5`-U-`M@w08Av8Vq0=U0ABx1Yz+vtH>1E4lDW zFG|c9-m)!MaKVNyd8?|1o1PgD{u^CJ%stcd?MQ3P7+Y2Bll5!c*}v+IT!6go-Y(n6 zF>A)IlK5~LQ!wbhwu1c490x?Ni;4pf6_g~#ybbLuT!|d}cVoq?*_X<;>n;)>Uw7e+ zo#{>MU6jJR>dUq*70-TTd>OUkpI=D}zA2-Oe@#7AzRzF-IU@cA7XMyD|AN6@@Bhhl zqwRIH;^(T%FxcI>?#Q)WKHjtTAKU2fo$!0^y5ADLR>jZtRckv3xns|LaFrh)1^Jxa zD%)N+xdZztvU(E->yLcQ#NhfP8P6*a&&W{8m$nPGt*Ii;n7KqUY;)TuKUmYHziF%0 z+nMGV#9G0z+f^&hjDnb)BlD@9V32PJATpce|?iJ>J|F?{V0(^9%XUyA|kc z)U~x|vLB)G_qvMvyPVpmc8~4o>&Ls$*-|lfmG=Jj^VUAy4>K(L9rQ}tTvhcWGp_A( z@3ji7fCIN9N+h?sbX~ixC@9F=-jx#QciBG}-=*MYGp{&~JlM@xWIlH3`p+M@D;U$f z7QXroWBb!_bM1=SzW2*}CtKRS_p5iIQ?RiM$E>a3CvtAzw+`BNa~IB!Hh*{3I?i9z z;`lt;=ij&R#a-y6kzubTeBkdu*uGuQG4x*;$Zllxsh!`>-?BU?D8xEG=)N78U3V1Z zy@K_8^A5K1QknAd^M1vjS;T)Cs8 zC>+;;cF&FJqRJijcS!}@L9OjHy#t*mu}W0#c=#f=YEB2`k8y9YgL&H2LFrMqkA!tv z;QEw?rkyW3&^`V}_HQ@%nfkqdU&MIYv5xEO4vgK7*Pc!vxH;-uK^|w;oVE+Q7^|Ob zLx$wE-HB^A?=Um+j@6i#S^kL3$?i%!H>~-UZx7eC^)xNu)x2)()y9^of1Qzuge}r~ z*(>gz4%z@2;^4D3?qGfdrmcvr3;#hI#+z%mRP{d3=Tw5^oGe+Xh>$tjDU#zcMQMh@hT^C}lNcsRX#Pqqd4)}&0CT%myg8>~z zFm{M;uFTzqjzoE0yV6xv&vI9?(?xk{2Rh%oF@505Xt(FjwbMJ$9)DxHhZ^jMSaCnYGKt_fE0Dx`S)}bgS;o z)429Eti_c(ZItgcQND8z#J;V$*LJhZSYOqD7c1LKj0@R~`}?AuoTpHNJq9h|?xxrF z&NtkOQI7moVB`N1#>Y2UxPg&~eT|Jo+r}+N_C9a>*DPTVxLW`2AKz@p-^sci74Lua zo`u(&*?qr%A5kyvLdUF}X1unx(^yqi$ISMk>f;V{zP-z+%H2QNu2ogn+^$h2b7x)$ zI(wLilDV_AgYw-tckbleIj)1!-`#5G&Ykhtn%;r#J7%ox+?j|f#(|kduv^U8xsJ15 zG8VA6g?}*T)$TOA+qT;{wr#zyHgoV!e}~Cgm6~=|b(RKkK3>^&C8KYr>~uHVXk6KL z;D%VOR#$ds60s{2yEA{k>BoxZkXdIBNREryuf%4cAirZB7caT(G_XHQ%tCn`=&ZRt zePGA4P-zF+`*tu3P47T&C-!k2%|dfJ(0vxV-!uy?@8Fu#am{8E36j5@bK)}*;{|hH zZ<&E!V`SI}*!67mb2FF3M}2eK9=FmK=Ab^?Q?c>4Gmt<2$=!Lh$Fk2#bgn2Ue9t`N z;5y58>$3~S!}0?=9&3L^THT=zyol>JbWp|~xE<16?KD!;_RV(9_U~zQ-@FC8{^XAE?B8I{DN1_l@0>;2)>mC}5zD8yEB}ir=bazs z3G5f=w9}{)4KtfuQT55O_n!NCir(9FwOrBE?uzTs*OhILU9^f3)V5_B*VN5zuT7Jd zj6L`435cAw6!&6n>yNzhqmH#!d0OrF@tk2sa|UWtKXh~#B>wuQwp`-XvSpWTS>tK_ zCv6D>ZH+(Yp`ZHn%-s3BI3zh*X0F4N5x3jgx(gjM*U7zWJB|LF>ExM7t~`ezL)5p8 zzeu02tebX0Rc&9n2bGm#{mj~Cxl1j$Rqpq=L&lXeFIZuA$!+VNKHH0h^)t=AecL*- zu9*EfbVbvwO>OP3r#&;H9JrEC_oA`8QtVEz8N1}$mB zYro=d9ky?mmUmQ#J{9?<5os#<_am}=7drA3+4-AKZFq0Lce2{UPX-1-j(IAd zV;{QmC9+DoJPs%P&tj0Q>C0H$!Ut5 zrpsxToQ{*zY&p%5(>ysXlv9J8n&i|fr)6?FQ%=j}v{Fvz%jse{t(Maja#|;+^>W%E zr<>(;tDH8<=`K0lC#MJG^pKn$mD6T9JtL>*<@BPQUXjyla@r!Nt#W!#PVdXRG52UbH4i%+>(r^tht{xZG zV@~bO@^HMVASc}4@(SUd_OZNDcxrFUtAwZbvivCFyLGpGs_@R8E&sN?KF9JImZvPA zX*t@`Cnp>mUWAtI)m*nA2oESJ~olH!f>w+Lg+hj3z2OEzCtrrLtvWEN7tQr`yT~SbnDPZn>6! z&zA3L`S&gFVfk{)_pp40)`+pFGnd=Sv@=)Q%Cs|A*>dg7I?J^)*I2HdS#P;^=6cJuGaH24&RiOP z9d+h1QzD(YA*_HrNVDD2nH!BJI&)ii`))ciw~Mi;Gk4g^v@;uRW!jlLZMk;lru!z1*vz^lTPmCrS|3x?zJ9}yTm)5v8{wvFM zYTIe~zE=Nh%e8Z1ii=N9sGUm-A0UnUJZwTu;@R!yN@-k9>OIpqwnG}%DMd{*u6ybf zNThLlh_SR*-osX=mG5cG`&<27Tdtn%X}Nl~x8;4U{$7^r3fIqa_59wJtLOKzyqCRx zpzxID$iB8*b7X(ZHAfB*-b0+Td+HMORGibzl!$ZkQ)j~!L7ILL=M)%CIA=)ewa7W& z5@RVHsbb-KYUL%COJ##o|B5O*$g6B<>U!3Zrd@&{JlJTWvJt5XXsL|E$V6qM5|xdP zRW>ZO09Q)ShI^GAlIq63r)gIz8)Gz4S$XQ^sIm$%)>VhG(sFh41j}`;pD4UbXd7E4 zoVTz@ka4NcqQ;CjCF15usb!`ytXCQ{*=V9M(^H3IPbNM8wit`tJVSWo=9!jDWm8i% zxKesP&8uuysuOp4Y1);_jy9U8Y<6m6RN0A%%1%mDRvoMCgwzXBW#92Co0DobmC>$L zR%0|#*}~N5TnF|vgPXLQ!H0EHwcg1yhylp^Ze9zU|D*;z?6ua8&iKUjbXjg zn8ijDjaizyDr(GWVk}oHUuLOG!t7mQ!9_lLpBg=QU*>sELyIKBY%hi*&3Qy@h z#T~-ANk?a{OZ^fp6Hi`mN~ALzQ)$S9G}|qmxzlL&t=uiVC$*)I-eTRGT1`ug#~{2f zwG$*q$j?&mK&z{eO{tTyw_Psefz&4`S;?(J5dJ(hk{iWP*e_B!*qr28_HgPYu&$Q< zGIc$64c#q!EEVpB+cwJ{PYuB8muK1L)N5daEPFE56Pkl9dn&aAOF^+^&!jF#?@BFu z&S(y^>{rGeqb&P%>Ht_d)Up>+U*oz;%U(=1V8)wd*~_Uf!KPUDN@_lOJ>9ZbQ@;h9 zW!Y<~If$v_EPErBK@GDld(+e&q{J_8rN*Ny$FjFg*~e)q+nRb9Rz9=r-P9R~zb`C% z&-7@AWq%TzIda{fQ!{AOvTahkCRk&g4;mtpic zp8dINIZZf+#_;b7=KvVKr*OK`@U(Dt-0&{K*;&JH63&M1L;HUXMZoqL!B-Hlphd6v zwGG$5nIN?fFLOrTfpW%~{oLha)11S;4^8g1fGV_Ypjq4cS}p5l?i2Nx?_*sYM>1IIttks32#`rU-tUPbc=JH1*pQ zPdvi)m!VC(L#Fgxp4QCX-_YNsSd?1RAoNu;wy8A>VShLZ#L{h^rPm`%x5X{p5x2B4 zvXo~kTJ72BfzXlGtk#Q^a)emDTy&~;QAKposqu?WjcPi;)HEg4%CkMf^{+-3PO%rx zmfDW87ak{cs-?4pPD}B^)SBr+r`ysg;;0$6)cS3vr3!(`)&hUGWcwFasEj8%-Ft>w>Qy!-b@wfs4hv9{fp zTcxNLxl@X2Q950EB==3IMJoNkRKkIhu5C7;ULzL!Nkq>;D+F?O5A3?Zpv^UJTqveRYItN;{7T$C=zzCyz*6 zI5E0#gkETeV_-tFDbgGmX%1pLQ=Jl;w?&$rtmbU-(jG>UVa5~?>SXCSO_zS2L=*7UU_?~4ZLgHf5jICy zjWA9VL_^r>R24sYgzJyQlrQ$HVlAn%E%}xxV$Xt#juc}Jf%WIGc&}O_Tf?kB1FklB z0Gz%KMS6tm$xHyEWDCR`^HgYNV!5C!als4G1!d+Jlf0mW_QEeyanoY<%hdhWEdKQ< zJg`UaZs{HadK}%aXPC|qUdqQM@$!*1PR%#`f8 zhg5}IHtq5bQrJM)QWkDjSoy>Hy!~97Pr`#b{| zKL|?m`Tu|Xf9rv7;T|a+{1A-@!>@YmfzOa@Fn+>z|3y>ZSli*h*7(A?H7#`qcc@sq zc+sN8jixLx|CLi+-!ya~YcdS~nS;1!J-w-JUfui_6yTpMrC_0iN+%OG=`TBl=@7T7 zVUWs6bxsEsrX!RSAy?YDb2>#u{Gf+{HFa-iXDW2c)?)Yr5!aJGB07GY!o}YYP#3xWOG-gyzH^j=aO6F z(Mi0@?W|(cz{d8jI%?#}%GaZEQxFTcq=a3TWN^)J4fFf#V`<1Y`X$+%P5-;*#CqPo z3DOYrnXK@+|9gc=lfPG!u~v0h`!=X{!S(UU!KixU@y*^(YP$)_jZk}?|DB}0YrX98 zT5O}Fy#rzsiD`qC_>;59y-(u+Q@26d_Eh@xcE0OINvvKk^F*E;uRGKKN&fx6F$jJg zQFq;X6lMFaQc8xW{UCX+Y(L${oaJl!jyuh`b&qz=HTp@1Zi7RkNq?6Un%`L+(Qk@a zb;vjA{3mwW>+H&5|I^qumaRK?70;eilWtqDE2Nl!e|Fu~|EcqK(dqxV4t0J6EfNj(mcS z7!%*v?2f8$-^BJ!X&;8Zj$redY}RVr#`vl-Xy0s3N~Omg8of>LjsAlk!yW(YEr&F= zee>H(MAQE?w^FfLQm&Fg?XX+F{l9d}My_YxO1ff5!t@#DvwesBk?IQ|!*x~{pox~{gix_03yK~rl#~+UEDmcC8%r0P54oZ=hdn8it*FOS4^IDe09dv z(O5mdzOlY#VNkKKuJ)7(&CQFOXQE$AT3nTNjWu%{>H=+2eM3Xtf|>@yYa7r+ZRXApE~MX+Y8vO+Dw=Cf6O(LxP)@f> zgJ$8G04kloxOq`cYyINJ>e?C@tZzL%m{-@*I)2`~=Ad@byy~U}i>h1d&!`LLE@`Q4 zIHkJfG~=seM)IxJ3y$LWYT9T}&i;&il6hi9XqvO`TbA$XfxO@TVRX5n1>KxR=*eWOGk zhP190kth++)LOTw$y{T`+#4Wq$gIgnO_+A{tYBVEYfU-a98||fcXG=_zJ+B%6qZto z#F#Y!0Wx#KEWgXcX5!Aw#GRRmJ2Mk^W+v{;Ox&57xHB`OU5}ZJ9YlGQ z#S*RJjPj#r9uI#mu4xULBnu~vpJE+SSvR?{zSVzTW*%|H-cMr&p?N`LY4swcJKa8i zaW#0hS`#p?(HvO+PHRHqGeJ!1TOVT-7dM+6XV~?;1+AR7qQs32Yc@X0 z+4v}DCkckGDSF_;`fI19WsSnTw7@9oG^wQ6qtM zUdHkf&$RKC$74_{s^Nv1t<6hnTZ1Jn;)`t?fB1WmQ- zL=(i-=5krLu%hVP;aY&1Q(LK1kFIiN#hSWgk!^2PUF)%oq45n^FBoZl;7*&4=$wV6 zwR-xDX;m}E9~I0q)01m`O>HY){uG!noXHhI+Gi5U)EJ-L+=ZH8ZuI>@j7MxdVB_%` z57&6K#)CB;s|ZzbmznvpvEk0@+^(TJaY>_D85h+ob88<%K%J|-VU$dmI=+0$gjhIC zuR1Egd$G7AdX*kE{> z8cVdK<*=+ZhGlo&l7_mH`osnec_mwm(Ufe{NQpxNI z*zo#Ai{Nayuo-ThUxxuKS+oRAoCn9wUsTt;097nn)UptxFQrSCwazWU$3higC;%Jg zEkeDE)IN=&&-INB^^ItdiIJ!idSz|H8Gy}oCKlL=MN3L*ninLR6^--!=0!`{w~{mJ zniuoJ)&_X$)FpL|wRPUu8~MV;Skg=2=To5AQZpY4^gH|3THmyoGZ@3bw$FLaMC^R) z0atURz_CTVFGldsZ)s`}Z?)E&CY98{&$2eL3%-_q4z<>pEu8p zI-?7h<1VolrHdOSnQCxSsnG@{gVxWJ?aAUM zv)kpm7u}PZ`xCdSN4kqR=fyPbO}5+Pm~99CkyDnU8D=uI*xb(J4m#TOPvlJvS7Wnz zO71auR~>h=O_U zHMfUuEM{QQ3L;%IaNOG1d)Y<2Rpm&_O+TqV0Wdq!pt^kV;)Y-`CJebTs&hLX(^9*a z4JLDbXkOAJTTZ)ZGD@)fiMG1NL8j*Jc0$k=d=j1AYw*l>-E4cExwu?Iraj#Ovy@z2Pp zIfli?YosKTjbROaeLR;n8Q}KohBB&8mh+?dj$*3ReP?u;vlw z_(|nljpeB^<6*}5W9^;3$t6x@ND}uHdRZ%0Io*$zUN5|YcTHWg1?^R5iJl#4(ax~`N(WAZTL>_ZR4~M;*M0cw%52Q>MEN#F;Ogwlp z%kT8XO-rzas;jJ|0HX16K|lRNsL2eYSjnv9H8WrFyR#)ox6<>*xP3uP?Rr zr^eBM`40+h9M0uEN-NI}&rh+1=`G=7rV)_0Z-?4xFzv|mY!JG3rbmTFBM92-xVlnX zrK)e#*}N;Ayr|8okN*Rm)&GIcaiY_{-#UJcrdRF#H!f;R`n8l8fj`>oxxS|>|3kg~ z{zJV_-MF={*K6P4Z_;xQiv}(|8r8 z`A5*+k;Y#_^A8Dl@IOgX;O0LNJjmk0P)BkxEDy9ZM(m+{@*tD6P8C;HdEJl;Pk zcl{IY=1t+QeZt-N3eQGu6h1b=%M;v!0xH3H`YV?*8vj^v_L{Uz*_S68!oE zzcImYPw-b0d`p7=Ex|ueaJP&|d%H)=itvF6UY_8y5`1ogpPb+g34TU`Uzp(Q6CAHy zw1>3so&?{N;CQ`aOds!5jPbV%rK!QJ$;Ljzv%Qvz2 zexm%-1phq2Q&Bw0^?edNFTsZ-_|OC&mEeaY_}Bz@`Rqo9O-u)U0{*8kj}P&a0*{Y> zpTzjLFQ>knkEPtr`oi7*P`Dd^;gi?^a|oZR)VAlC1fQMY^AfxfN^m!xVsCY#+>MWv-;*eR zAi*C^@TU^|nFN16!Rb3W@bC5Bkq-JN{MkR@&-UeUe@eOYr*N0W!Uson3LlZ+M!~2$06xgXm9p3`qFD zeL3~JMi)rA^S^NCf8oym!kzzxJO2xJ{ue$gQQzzYZ%pvB68!uGzdXUONN|@QQvdZ{ zc?1E{cs)_vfBPo<*SY&CF5b=S zm!i^iuz&EDWutITfyev5f1>~G%c;M6WKqi9{3qPSi}2EfKI@jlyaq=J#v?D$p1eeR z+Ly=2L(2D#EDCph6z=9{;pGYaV-ozh1fP@O%MyHLg1h-d>boaV{#=5;n&57|lj}cE zl=q1CLsIVcU&4zM<>M0kxCEb*;Ef5sEWyuD@T(Hs-Tz2?9#53J`x_~D_cy}dNa%l< z;0R=Uh<=|0ADH0z2|h8wrzH4s34T(7HzxR534VTpUzOlDCitxh{(OSJmf%|wd~1UL z+2iUdp3^~oBH!{8`PRNXo^Mj_@=dtQH{mYdgqKH+5bp9#xXU-;a}xS4-=y5-n{bzJ z!d<=zcljp#jfDMA6MRR4caGvuuHP@g2PL?>e-Zr|iSlC-+~uF>yZjTrG@-vd!LLp5 z4GHd^H;BCl6XlO4_;U&Ve1dOD@OKmZvjpFf;HfA+r9Hh8+~up34@s0Cn&6cQJ}JRn zev7>sUU@Xs0BQW@$i*^C1|{;NeR(`Tq}=6)aA#Av%Man@Q6q%A{1EQ)L%6#?6ns@{b|5rl4S2Vs-zITF`CU|9n&ra}p3ErIGXD0Z$3GUV- zY0oW*@{I}Z@t`p*7bf`f1iv`JZ%*(B z6a3`_e>cHhJWG3WqVW{oBf$$3-0inS-#woaenLXu#kZ6B#G@VgTH zfdqH+z106yqWr}KcljXtE+2%ud=T#Df8j1ag#RmH-|goLqmdy<2ZIywJ2(-)?aSlw zE9EX;h37@J2p^Q-?*2{6vx)La3GU`=(LXs+-jLwU34U&ZyZKw}x%*w=8x#7ECirU! zzBR$!{e{?b@h`kBq2DzcFDW0C;O_aZl)HQo?&g2tBfRUQssPe>q2*31;58}m`1~~_ zG5+n#7O;}ZOc1fP@OZan4sa}wp(C-{8{{!oH%PVhGp+|5@~-v^2E zAo8b_yY*Q3z(o1r1b5>n`fj|Or&whge}$p8F9lD5$H%8QF+T0fsMm5lU_SV-wu1H=^&>7vYTw{iO-MEWuYMxXVwmM_h6A4u>Q6a2jd z|02QNdMx$zjpA9ji*Mn>66J>`xLdD9e@dc!R)U|L;BJ2^*Sqyw_=O4mixd2Ek4Iev zNC%~f_$f`qPy6zC{7AWrAK@;3guD0=?&3$diyz@GeuTUD5k5ESgm4!>!rgo+{KAC( z`UJl|!S74(O$q*dg1?a9F5aa6*AnGh65P$d&NEa=2X1E|d{}g)@ZkwQGQmeD_!u+Z zZWhTgd`hI%*>Km2u8H#94R`BTcf&u3;;V<@BO-gbhP(Ke-{*c9mCNtnUXHl@{;4hE z^7|4uKJxs1epD{ct4Bp#o)7!ar}jgce?Ly{-_MZy`$KYn|3L1qSLFVDOz!6wxj&xd z?l>$cg0EaY5VF1WiN=n*Ujcl*~K!7A`|QGGoE&VAQ={4#L2U+EEC0q*jxM{o`JE7UPZkKlS> zwo&;_z?(dNE3nI#+~7`d*WTRV9&qQsUcvp~hu}w!Ucp1u_xNMLuKm3N-Wxrq>iBz) zUx9z_@fX3}{-RItJMed-@;<>E;BGzZ6Z`?(`KwRx9{2`N|1aRK{yqWkt=xRrC-?`r zJNgD+fV)|zU$7JWnMk2uz-Mj8c^qHq9xU@XpG~axcu(-BJl+?4aK!ru1HcPCo(Jyc zr~bi#;BNluAMn}TS)TsE;GcPX7`U5{`v;@Jw|eDc!Cn0Wf(md~|A2tc`ds}3f}_A) z{R7P0;^Jf9;8>IoiR|wi%m$zC@fz@{9-j~H{F@h?0`6x0yr2o(`8O|E0)9+%eO_<| zxbt^j@O^Oq`Ta_8H@i2;@`6jjKlJRa1$X(d{CWK7_0Iu2f8_@+f;)fZ2d{!V zf8`rrIDh2_@1orKD?fN2+<%_?A-MBbe()K%^H+ZGFYr&bIh@JxC*}V0db~f<%m4hK zJNS&qANfHq@JBtqH+by%Gq~%2elQ3;g*xTP4~Bq0?_FOC?))(*7y<75F(^0`-1%cr zP!8_=F({Y>ex{noOg0tV)jueh1-`*6KLPv&kIw;j{umU@2k#ZNZ&1(x?$*yiK{NPl zuY4K!4v(J&&YYKHP_Pnwlu~5oh2SGRz8ZYC$FBlE!Q<<}mwWt1@Xw?A3WHn0Z}!T6 z0{*hc?*spr#~%dupU*uC?)Eo@!BgNTc=n$M_n&{g4E~u{{u=nC$o}BqZSaX6e-FID z;~#*Z?D3Dm&-eJ};OBaL2lz&hr*iy!9vpN9f6XiJ0q#G4=>y*8mG1*SF5*LiJaBhE zG$belpW~GmgP-H^EcksM9|it~$H#&XjQless04TG`Hmlq(3xh1)t&ZGr*U6d^xy(|8*|7^T*KOVsN+q z3=J*^ck}DeU>*3$QGbU9*Mm2E{AO_1-qPT9aM#|_;4X02-qK(bxNC1|@DR8g-_qc5 zaF@TO!871)|5O^h0KO^eUup0PxNCoD@CLX$h6Nvhzp%SX#svQWpBU+k33dSgsjDmR zgf9(o$H-u>7#|%JfFBn1e@rk0ymw!{VoZ<$-@T9H{C<)zJ^jPM`+4W~F_1^&>tN#=fj0yOa>iotky}lm&gy_%K#ssH=5BBOi9o*&LnBZ*izx8t0 zUjV)iU!|h<*6@0-zH7ku_UzvPzB1S8-v%Cf{=OT$hsS>oKEUITfe-fhv*5!${t|e( z$6p7Z=J9vHXM6lF;PoE=1bnH-zXZn@Hb(smfpa~+8}NP}?+IM&@&3Svc>Dn1Ngh84 z_!y68faiI9G;p)W#{)0-_+;Quy14dz8~kgJ9}m8V7q2zo13b=eqCd#vr-GZWfixz^ z1gC>f@XF5ypXu=nz-v6d27Ix{uK_>Ni-#M)Px1I|;Czj^9AkpJ!O!#f&%v+s_+#KV zdHh-MyFLCA_%A*FI{2?W{toz?9{&sYAA7j^KLP*5<6nY*?eP%4-2-2WqV46k-VgA2 zPw<00-XDCV#}5FX;PHdNXL>vX&TrXO`=h}ZdigRQe5uDLgWnMCFUADl2EW29KOX!> zkJo_T`zZ!1wa_HQ)svzX3es@!P-;_xRo5 zM|u3`;NS81W8n23e-`{SkG}-I%HywtZ}R4+cfdD${4d}yd;Amdtsegp{6mk2i0vI7 z-wnLNi>IF8{k{3TKX{SH4*(zTapqn%zFktsI|IJR+y2%3p{=#_|+bt1^y$C zp9p@h$LE7T=5glgZ#=#X{4I~44Zg`+UoHgS?D4hWFME7F_*Req2>e5j{{(!8$L|N< z-CG|X1;5bq@3Y`Tz4DjA5B2z);N86Ve-GUKeZZLD@8Ab{<)4F(^7z-_RUYSSpO5i) zPw+aA?*rcI@dEG_9xn#J+~dQ+kMq`RuEh&HUIo6?BM&{CnUpdi-4QKY08y@Ud9qH2&6sb5EiC2JqP)za9J(kKYS^hQ}WQ=bk{Xe-eD1 z$6o;dvB!T8{wl^m^|yj^PpJGa;ETNd%BSGpLr!Y>SKtf1c*w!p{ffu;0B`c*sV_M9 z2zveg;IHGWB$ab-fp2zi zIKRVLjxj+KIG-6PKOKBeFCWhVcgL9EBJd|8*_hx8;QpTeb>LTf`@vhl3%v55f**!82igD;6L-`-#>w$?D_9Q@b7x|wu5i*#-Gl2 zU-LO8*bV#{&mXb3tq@EKmbKMcOk+fO_NewpW=-+-n!!cjS{-Uk`BJL&-5F=m&nY7k_!+lRSP9`1@YIX2JV<<2?r4{k`v) zpb~r^&%Z~3Z}Rky0l(MV&sBqu)#ji-3&Fd3<8dnZc#od}KF;&+3h*Pn{#^{-;`Q%J z@K?P0uLpm^%a0#}=X&<;0)NW$_s_vcdinS`c-FJ`EAY3x_;>}p$cvx1z;E})^UvV@ zz487Ce3jSUFTiU(9^%W@dwKrf9sCDg{rFnW056n@#uML|8GPmS??7;VhqxSLf}!AN zdF>eqzRrv1ap3dzar%?NkMR641N>Rf-`@eh&%1se_-CH|Mc{osdrQGj_xk^R@SkdR z82|IZyLkRv1D@~o|61^3FCK0J|Hy0KM(}IA>wgB$J(3(_f=9qF^va(GpX#;$Mer7n zzYcz)*WY)+CwSNY75om*-=Bfs?DcOa_)op|bw=#p>&-`df}iD;?+yNiH(m#TZ}<8? z1pFhfeP!Uqo_`MoU+npR0(hBMJ{7#x%kN{s=X(B}1Ad?9uX^x)UU@V4A)dYOf`9D! zXC?Tbz4*KYe7vWB75Gb@y&r=A)$8xA;FCQ4yTKQD?R^k@npge=_y}*lc^>?1&p*Ed z=N?AK|84LCl_K7@f&b1MzmLH;dHwkk{1~sk6nwkG8~<+LCwk?5z@PBOe_wF^j!o+? z1mEWIgTZh0=ATjE+%u^Dc<`TkBYn4;BR{NegOUwe5CEU8T>eJJnjT9^6YN{&-48COYotdy=TBL z_1gauc!f6}Z-C$K)%Qp6W4(C$8~8l) zqex*)uoHZ~=ikog+pCBHImQHgMt!AZP|z3L|9g&o!GGh$Lm~J&dv$>M<6!V_dF>ko z?vDK6aB%%hBv<8ur6a4%nf8oPc#unF8f{~r)M4Bo}d_org| z{exeFyWa=(4_*P^*B}3we!t*7@Ry_Z^$Y$A{%E8#CipDERO%Ca1^!{A-zP}H_anV{ z=m!3g=f6JD*zlrW!2odg`?y{~KKR34{Co?1j_03YvFme#G2kPj`g4PF@LzcTI})5R zC&!pzR_yv7=Gof^QU3G@=A!&DZ@+K~_zrJ)?yM9IFy_Qwq*1YTYvQF;k-Q$taGZhS-lEqIMeum*^Bz{KWXEc5?rTkzC zzWfRw!}-BNe1R3NVky3>1|K8%K^1%j4L+!XFO`8&s^BYD@L}qpDSVF#KB$LpO~D5% z#J8fLb}HlD|M)PCp&nlFj}PkMb^iFE-f-&SW%c-=@^C8Sef0RCa)l|SGTt?h4_<*6 zspErJ;I--apfX;Ijt^SKOVIH_WxVnn4xsW#D&sZX_@FXg%8d^y<1O3p4^{BqXnfEf z-u;XZTEUy1@j(^53>hC(!K;t)K~s3qF+OMtuQkR8uNciM@XliR6yNm5PhOKL~3Wtmc5k}2ginNnVqDK%Hg7~z}DAi)=y@zY!-BPK(JFDIkiTr1;e1~6krFk^-= zgRdEajv2&^8O4kl)eOEkh;mb-8Pkjz)QlO`j2YGpz9$> ztITj`%y?(afM?8zXYhi2=$J9jm_g5&0neDR&zK?4m@&`bP3_P$L!U8YpD}}FP zH?^1`$d~}g;1%JJvaYO&lX-P>mn^8RnLD?+ZYkqt{LG1Ers)Py&j2<{RGVuW7u2;- zRXD#<#a?JnbS5t1IN`(!X+lo41ID)CL|5QMU*N=n!pQ_8&(?qmMsjPy1SGjNVuF&~ zS~G!3Zta=i1UKQyvuzQ+0n5~9LX~oB&x9+vwP!+>+}bl?3vL3JXYHXn%l6R(Fw3n! z%mhVlyKCkua1+)%+y0u+CRdkPdnUjsxAshslUsWx(7{cp^K9*za3{C+%oIm%`)h)q z-1gTb0J-h2Ndj<_20YvTnp7aS?K4S1Zrf*4g50*xOp4$pNqDyH(`YlPLbsPRcu>j=B7@REm68e`4S~e zlrd4tXwJxtPCJ@4GOrtnwpkNLrg>9jhe{@UBeBlSX!gjg&mzqqnfr}IEt?gbK@Srd$odP5UQmIxMUDrGd6WUVkoYFX1s77bIRZPtv+XiCWfLLE&iSw@V+hOI0q zMxx%(%#yW*MVeC?O)^LQjkTQK%Zb1snTGFsmzDR+qM{u5DRe+_IX3SzX?;ntEAH#;mSzSzY3?y2fR7 zk;`fhW_6j%>N=Oz9L#DCW_78{Y7S;~vCHaem(?81>Ux*e1uv^PnAIgOt7~3Xb1PJJpn#w1t@chgjWU(h*|LQ4rgys!VgcOmn+TbGuA) zyG(PtOmn-;q%@4t>oBIy*90%q1TQlQ4n@wDP_$EKnWlT0rhA!5cPMgXp{N6Fk{@Eu zz7X3o z7T4+=P-dnOh{d%!N0gZf1!8fn&LL$wy_A{h1?A!`oovdSqOn(Q^w9`)lB<@1i|fTV zI(?Nzy@`4o`6u$9IKEsOKEa&I%jw1P3F=E3#B%BK1f4F+Bv8stG)|ll1!WXZ5_aV# ztWh3W(bciW4~zJ3GkKA z@h`r1MdqPe^z}SW9{<`NCpY@|@*O8JnlXv_?mnmBeHC0sLen2S59F`iiZ8)~L>zo3 zoXdaq!Z8p(C6@{2qt@Kjg7+g{BX|h0{lh#y4_C}5rX~C*G0OOJg<$^5AoohadB7!C zIeGEbg87`bnEz0QgU^ght`SU|#n%cR=gIllxcCPm&!c?3;IY8D{6{n#gYi>*yfQRHtB-z2yzo~P#CEVvJ!t(Kz@2XUFeU?Fhvk3?q~@hyVS zqP~5!Osx9nQ-}W$hvPnAZ5#bxe5=Um=aSn5)BnY{3(lwf4#8JY&VQuCaWnCqf;SQW zMDR1j_79sr1J-N#zcYF*|Bp}QCLZpRYw7=9)A50WSld4ZxcF|-IRUuj9>H@x`I*G` zihLz??h|Z${xiYG=bHpS4jrwFSnGP3c5Gc+fweCFswbEKB#0vqKl|M8uwFX|@&Q&( zta8RiulIBCDRH854pqs|#SUYs_(8#yz-pgZ^(O(VePWfY|@>9~FEEu-Ye9efnSR6RW%&SnU(5oWJWT zc}#51qE2Ug;2>6=dBDYwi_XcwS}(EcGy-eA#42wF)_RFm&M_)^LTs)B&gDO*;&=f+ zB~J=A{(MUCf7PE)i%sKC`^TOCRewG!_WPhO#ry|b92{%)8?pL$kuLwRLSnU(5{>8v*pIGIqfz>{-%C7}h`x~gk zAi}W$KdN&VaPjY?-c7(-FR|)82(0xItNamQt(REk&j4$^F9YYkD)!$1R{O-N|2DAN zCsz5pz-pgZ<$nWK`=0?9|6c6>3s~(Ft9~1>+9y_d3Tv*~CsuiPuElm-dI1;PKg!)3 zSnU(5KL00H?Gvj!4_NIJt9%Hs+CLOH_jPH1C9v8jR{cr9YM)r;Q-IYzvC5ADR{LjC zhZ7_YV%6dAsB_hu4ki{BLe=c%&~K5!7L&TGJ0Z!f5pY!UrD z;1y!cOiV1^-v)rT4_Wo zug*)>{s!3ZH3%O#HsD8nZsw);rQZMQykzTr6?NtQMeM%~tm96sZFm=0^Nv{Me+JgP zBUbsxz$Ml`=bz#a#6IViT#I)H*1CxGTK?a;)*5@e`**R=zb(~0EwSof4_wTbb>MgeSg++A zl56G9QT~zW@I5-co;B(LvD(=RT>P=<1URXk!NA3zh}`7wr-JigLicIMhY;#}yppIF<^J%f%HvC5l(b-ajGeg<&KcCo(_IQI*|+%u?u zh*f_zu-Ye9`4zxwpIGJB1FQX;sblvQ#Hw>2aPgN??}NZvFR|)80<85CtNd|bt(REk z&jV|{CV&4W_TPqF?Gvm1yTEFnSmocCzt(SGK)?7avEK%)_KDRF^IGi_tGqL?wx3w# zxxm`~zQDyh#6ELb?Gvj$_Y7*^-#-k3Tb)Jf*y2~HKON4)L9F`kQRi#X{}-^@XTJBkP4tOX zKNnc__XAe_Jg64quLgNA-?hKQdM)oAw7>p+#8Ak!zr?CP0=Og;o8`c{DZ#vVQ2WXI z2(|CuN6dh}+9y`~CjghE#pXQV+#JEoakWpZ`pj{)PptA*V6{)I^0R*C$S{_eoJ7IQ7u zy8LySd98I3t4(fawJu_nGk>+NA;87R{O-Ne+IDHCsz4cz-pgZ<>vyI^cI`U$J{=GnQLm_&%5=It9@d%vjJG` z6RZ4o;F7(>=0m`_eFbj@R{O-N{|vC&CssMvU$sxH@>hY?{^!8C{lxwbPd=Ej#22dJ z*c(5(XCPKPgMo|tiw@^uZ5y%bWP!D9#3~;FtZgG!`B>nReZ=M@;Nk&-rvj^eV%2B- zsC{CU9|NrRiB-<{QTq#la|eoj#);Y|R(;OTYTuu$mqD)fiB*3&u-d;CICo#Me$SgE=}Y|s zM1MaIA4;4r@=D?Y!ApTl_+mXAXW~ci3y8JNjG5vColW%v?W;~cu=;^m<%PiN2V#{o z#!3ps<{`kj_8;xafz>{->Q4k#`@||g0$A-6tDLb^GFa@-2F^W5@H}9(PptZkCACki za_$GzzP~qMER_rqo9lsdza@Ahak1bRs8b?%KaN+Y6eRMFM73YYF|~F|fpaZB1h{yp zT)U7u2Maz2xYzz-hgj{HF)Fonp$_fi|9OluV$+OKR`7pyjLO93a3Z~CXMhU*p!<;8o-WfO?Ejrza4-w3N$qB~@=D+WTd@&>r{%cxznBW75 z#|j=ye7NAT#Nz~WUJAzxW{ib=p(KvE#1(=WOJSwpM&b#Amk`^3UOk7nO5_(2^F@?6 z*!OU<;A@DF5PS#mk%I3go+9`G;-dt=NIX^WtHjd;^E(Q|>4N`B{B6Ns5zi3JJyJX&x+;$s9ew!>ouA4qIpT2oAXyvX_P=8!MU#KG7Ozaw}&@od4oR|-!Q zJdOAy!N(9+3+6kQ!#RTI5!VPlg?O&uX5w1G{D1v$o?!05!aBj{5ziNVDe(fqR}wE2 zyq>sTFyDn7o-Fuw;!_0QP23>(0pdl1e@WaZ_$lJWf`3iiB$)fR@KnKX5;qHem$*eR z-%%X43jUaQiQw(T_T@iq#HWdzQ%tx_aChR<1@|UCL-0Pt-xYiS@tK18oG1LA;Dd?J z5a`IQDb0a!3>M=$AUR* z;jMz{*6=pL>~?s&U^XkfLohE3HwwOs_)ft;C;o}x$BBO`_*cYK#PJI8-GbjDzDMw% ziSHHs5%GP3zaajZ;4lYxli=Nn?-$&g_yNHKiP;bw2NFLhnE$gM{zC9b;)eu}BYs%$ zWa38z&mjJ#;O`JWDtI38V}chEv!ghc58+7Tgd2V;%lh z@V>+xC>(qrY4|(A2NAz2nC}1!e=oR__%*>t5Wg;XI`JEVk0E|jFy9XrZV_Bd%s{}g zjQDNA=Mw)x@DGT$3f@foj$pp4GkjMt-^&^PQ83@Z8NMfYH*5&PKMC$n%s|6&5b-v_ zqlw=aJel|}f{!QuKrr7^8U9u9EyT92O~ii_`BTK!ejD-MMcy0#->mut#2<>hjM(a* zLd?L&vE0*NP5iOQH+cGY5q~1`M~Ocb{37u`1aBq&Oz_9V{}jwGtk(XHBK}+`r`>>eik$Dr(|U&x zw~71^Vq5PK#9xd21mXa}i{oTsP7FBCAm$66aa>587JMzSt@mZ(9FcD$w*B2s+)3nJ zb_cfg_9N~r@*?6cf=3c}6W23hh5L(q0CAq+ZxP!*jv+ok0b(vJIG!Q4?c^VuhJ5)qj=hMj{(;0rA|Fm{^%oJ_7bl-Xe30l|PCP{L zjl|y)d=Ig;`8Y9OERN$}#3h3F#Q*)P&i=&qMKye9kJh_@_+ZgL)6>70xK!lpJ^fdR zGa~;BF<)Sg<4fW)!Mo)G4-?#<*tV1JnhEX8H)@DSh|W@CF2Xp@CFV=eaqzve;b_6X zB|b#(ABo2Z{s-})g44LE3l9_An|Q3?0^-93ml1Q3$5BCS+s1bahT}!Pnz&r>22bZM z;tG-TogM1KFNiBezDF-$Yja=X2_i2cwqt!5v3)5x-&Gq{iOz|{lLRj!wlVxYVs1uo zTtaN)_DSL+ME)l6k%HeRo+9|4#77BE^#-0Qcu(SKf(H^$7d(Xc+k!_CbK`?!BJoVY zvxsL2o=beR;3nc@1fNBGtl*1@j}v??@$rKB-l*^d!JCM=vBJUk>xQ!hzf63hV7^y3 zJV`L$sT)=c=KFNRIfD5v^sq+o-o$eS7ZTSB9!AWK8;)|~I>FP4=Lxg6|>b#t_G&#EpVqAYLrE6%Qc7Cc&2wpDK7QakJoSh+72z zkhoPa-_;u~5xkL@8&4ef6Q3sd3F2jf`L5pZbir>DpCNb~@plFPgZNCrUlV^%FyF%x zo+Y>+F*mk23W%2r9zlGz;PJ%g2%bW`LhwxDm4c52E?DJok(JM-&bcB#mH0ft%Zbky zd=>Epg0CaKQ1A`F1s6G7WaS&FV{QI|*xG!K*xG!9_+q*C9pXy_{|UI@QiqGI{A21^ zn_m-KJA2|CHQ{BV-~N8lzf2ul*E__vFCP=zzI;t=`?4P%CWg0) zor8#P6I=pZaJ$1rRz8Y4)_xVS?aML5wl8(WwlAxR?+`nD$FTP6C&U{?{s{4%f}bS* ziD141v*4!=7g_l$)Uj=NkN7Up`H1*#!T;d3_c&Z+<$SM~Uc1LW!1s#IzQp$l9!&f* z!F=yy!6t``tb8PO)DOh>i_Q$<2L$t-h6O)&xX8+DylYP-eo%DIB>siq<-GPGhl{NI zBJbMUi60i7`-mSA`~a{0rNc#5{)Bh!OT^aye;|HT^mh*33W#ltWr#P6{y5?%1s_5Dl;Ekr1y4I%WaY6aQN9JH#&t{)qTDf^!A}zbJTj;+F*X04{jh z;UX*VPaWHaB4TT2IPq^qe>AUs#o;0=pF*AAiToJiR|TIy{ogxWWaV|#v30c)za~20 zCw^V<3SRq$!$nqpDRu04Z6JPAbbds&;Y)cJ$Re?z=g@EgSM z2!5N_zUy$2mH&x4e-t?$Mc{deU~HeGYq2GXt|iuMF{MRqgPEvp#M-tz>e&7cqK@?g zvHD>!b*w*&sbl?2tbQ(~jve1&)Uo4Etm8h4IyMdurH+kHVvWyn)Okw!SV>M?ZI(F_N*12mT zb?hA2Kpi_b66@U9L>)Wdwo=E=!^AodFQbl~&(EZeo#%;lo?lKKyY8%{j$Mz4bv-(t zI=AHDGYBrmkFJTtx+bm$);0PH>f9*$#JWbWqmJDVtf$U(qC>3vgbmcOdzhQ4WA`@1 zy0^KNI(EObkveO{4zcc|?xK#}o83p9OGSrR_iPVP=R%P`L>;?VB-Xv+qtsa`I-99u z_o&3WM+J;>hnk_yyRO7GXS);IT+Su7InsyN=E&Z}HZKMe+q}plwz)8f*yh4uVjKU( z#5Vp*iEYdeBepR=irB{ap~N=M#}V7ut|YdxJ&D-H^Autm&(n!*49_CAF?<}cjoaD8 zHg4w-+gP1PY-4pHv5n6LVjG`L#5N{diET_SBerpPCb8X{Eho17z?H-{_Rc4^@pdt> zjkndrHpZ?XwlTJj*v8d*VjEW*h;1z0Ol)K6R$?1J8;NcF+(m3-=00K@Ge!r`6M5W^ zpL{$!<3U_#<&OjBcc&EZH^xt))p;H`AJ3I|5EojVSAp~KtcM42q1D+6oR4QQJhtMe z(CYjZI6oI3IEeWkXC5EnC!fD?v$)XeYzGgqcjv+11?OXLr?}9{_n;hm8Xm-jR)@bA z&d0jWgSgP@@OQ-d14T|;Xm$8^O8NVWoVd{HnD6@KA1~k_F0?xQKD7M(MNV93b@;pE z{5+8p7g`S8IdP%YSxfm)krNkMovSH7P1;OcXmxG?4u^~W9n=}=aG{m|jB+MD4&p+q z!{0~ej}|#`q1Abk@~ZCTAklhZeJNnTxfOPqMUy; zfrGfv>byhwGU+36q1E{-a5zEqKc`NW!-ZD9gK|z(IEV|aPG^|QpDc3XLaW2SVa`87 zf}>CMdZYVR;Q5i)A50WxX|j90*5n2e++ewcDT^W$5Vcc$cYQB zP8H?Hik!I6>KsM+aUv%!v^p~>KVIa-g;s~ZXU{)DeNv_Tja!r zR_7GTPZT+Eq19mu<)0*S;zFylobqas6Bk+?{*FF>j>w4%tXB7>|U{_OfLE|vV15Ha47g%6*Ib0ScGtD#4G{d7Lue8j(QZgblDz!2a zBTX#xij>II676r=@p7F%96wDS4mVHWr_00P=4pJlJRENR zfInUy4mZ3^s5n6$4mZ4M<9BwYhUn&oWo2&6(kcY#~_4v!=;c)YH{1@fn zaB~};J4CtQaC0~Qa(Ou1+=stH9u7A=t)aM59u7Cl@K?#h;fALL6kn2u!wtXYFTN}f zhZ}xvUtBE@hZ}wkUo4P^!wtU>!{O#A{N3_!xH%TTP#z99Q}ExGhr`YB_2ER-m4mWS&ACZT{O}`D(|56?fH=E&?%fsPjd;G8D z;c&zLl!`~?;c&zAk&4IU;czn)|7&?T+>F3KE)R#Bz40sL;czn&|AagoZpPq$BM*lg z_JdgbRvr#FhvHAubqhK9u7BW;h&d>!_CF` z7v$k^GatW79u7Cx;{PZQhnuhASIfiU=2rZl=9UN{}CpW#J{xzC6 zYaI5Ke(B$mhr`WA_ZcJREMu<2RCr!_A?1et^gYhnu65n|OdB z*HoI#YaI3`;(2m!_5u&56Q#f=4SkU@^HAh8{Z)hhnvOtk@9f3S%M!W4~Lrv@%zie;btlR0C_mv zEXRLX9u7Av@T2A7aPt&?j657}R^rFX!{KH%ew;iUZg@UzaiBaLZeGWKL>>+|Z{c|` zG8Y_f*4sG!czHP7Y>NM=JREMe#UCsWhns=;L*(Ibvm5?Uc{tqcfj>+h4mUg>xR@Xh zhno-K50{6-%>no$7F1E`E|c9BwYfPnL(n&6W5m@^HAh0pBGLhnsKUr^>_OW+8r>JREMm zho3GFhnolS-STj_;d#`>@$zuES%E)69u7B8<9p=caI+deLmmz{Yw$DW;c)XNewI8O zZu<34KU*FSH(TIOl!wF3cKBX-INa=npCb>48}^xA^vT2FW>@@Nc{tn*#h)Y(ha2{- zUYslshnv0e^W@=hGZOEezrx{$eXtj&sE5PNc>Jg3;cznnf2uqjZrE3Q@fmqI+)Tuu zCJ%?3F8t~8aJXTg?!{;2;c#;z{tS6I+?7GiIDWo79B!V)UoH=an^pKL>J`Y*}D z;bv3(m*wGb!|N1^tL5Qv^B(*Hc{tqcivNl{9Bzi;uaSqt&EEKH<>7EM3V)qE9B#(r zua}3z&EfbP7F1 zHvSv(aJabye~UaEZrDd^@lAO++$_M~Di4R78}PTu!{O#;{O$5^xVasFhddl^cr8hB zr#u{P7URDq4~Ls2_`BrcaPuJkZh1J|EX6OBhr`Ws{I})daI*q`k31Z1p2VM{uURnLHeB=Hnlchr`V^_+QGy;pQg%a(Ou1d=vjGc{tpB z3;(D*9B#gYe@q?@H{ZwqS{@EJKgK^U4~Ltd;aAAR;bs~B33)i&Jcj>`JREL*i~p@W z9B!V)KPeA~n-}oElZV62pYc!0!{O#t{L}JqxOoHrj657}{)K;59u7AfZkql%c{tqk z$DgaOO*q_ao!qoaJ+JdBR@XS}2jTxD4~Lt<_!s5ja5D`5XL&f>?2Ug(9u7C7@Gr~5 z;buJk6?r(^9EtynJREM0#s5_v4maKSSLNYwGY7v$9u7CB;9rx6!_7JP*X7}Ga}oY; z@^HAh68}H)aJab!|AssqZf?Z?T^&m6INbacU(x3b9Bv-QH_5}{W;y8C9 z9Bz0WVlhA-4mTt5+sMP=W(7F%62GTB9B%%E-%B12H?QMAC=Z7lUb|ZGBqmmJxY-E5 zk31Z1w!-f#4~Ls~;Xfn~hnx4}_mhXi4X=$YI^^MSvm1V-JREM`j~^uuhnsf%{_=3R z*%yC+JRENJ$A4HJ4macQqvhdnb1;64JREM0z>k%O!_Cq7aq@7u>BJu>4~Ls+_>aiL z;fB`;7YE71;bsngygVFkK863NJRELL#~&;YhnsWohseX>=0g0T@^HBM0{$?0INV&0 zzd#-iH`gXN9VLGY%_nLc_IKismWRX5_wdKa!{LV4J{O;qhr`V;@W;x-;pTDtM0q&e zJcU0_9u7Av@tyK;xLJ*#BoBw1SMZbN;c)Xheu_LCZr;Lo$;07hz0K24m50O4#`tOS zaJYFVe!4syZU*4H<>7GiZv64`aJU(WKS3T2H#}ds=#huR&0ze6@^H8rkT)Go7s+oA z=VRQg9rMtrwzE9k!iDEL zJP+lZqu>^7rE*Ljnuk@f%B}Xtry4O-9v;4nxG#^&IrHET$e)@=%^fvvwZAY`+kWzJ zOPhFp9+h*hg7=qSkVnlQt#PaUH&eBZmxo(Mix=imIcE`ksQkTo)O<>fTkU_5s{K>) zaB#)sdNL2?oM+(A@~E6s$-9Y77szjr-2C+# zx7u%=zWrH^le-jx!@MAq+HWEujll@Ps`6vZho!Ct@dZ6Z(Ab|w>&4li1T{RrSRY6=O;J! z&o{Z?R(l?&qD)k+sVT%?-W0pN9CLq@DB3) z2-;lKxYd3Qjklj4MVk2F+Ymf$-7tgOZystZ}RT zi1h6j$is20m~YkP9KNkKT`Yf4a`U1Zx7zb+5GY{4x1GlbdJOxYd4K`nDPJaLdQVl_7IJHKVU{QXcp9 z>UerdeO>eVDnq7p_H|ZD7G@PUxLHa>|t6u60hR?vt?b-1|@OntVcaZ-W#1I{W6n?UJjPd&sQWb9*}bx(?`? z+BvtU@9n`sBPWcVSiR&UXZ225$7y4_`l=_7?CG91b4J(9zW>ryx9!O8zUhtIH@bEa zV>@R~>FMgt|NAUmQMKzxRdq16)&Iu-o>Zsg?j_f`xz+Rkw-c+op{zUGxS4%jy}fg1>%;V) zTfX-6x+{0x7hAVS%ewisYq)m0c5bPtwkyy4^zWK9ciP0xNt1fJPV!|~^>)sj)>VFb z$*n{6bkEGM44s@`Sd}4@XU*Vq?rpQC_IA$T>!*9p*uo!Z#b*J+ABM|%bS4eYV35YnYXKXYW^y^@_%*j&!+Kmcdt&?oAPpT`4rYlhjiuC zpH(V@{63yTKGam^Lq0gKXja@)c(IeNv@xFT+UmVt|JfmuD_Muk$wxG#`bNI!|LZ`wW9x#(C&G+gd; z*)7*e)wkvO4{5mEj{E=}lddDH?eb7w?wp2s3-goMPe*;*yqOL27UcbEE`xdRs+-5% zwEVaB_Ta9KDwS*U{c@GtcV5H17ay)vmSohC2X0f!?fXWBIq$}XdABaB z&EtA3=RMRg@1C5uXE`j7%XvK9pa0hWKVHi2`SQfN?v;ki?Rlh9xhgNLBb$MFC@**W zJa7HHM>nZd{IE(^waeupW6slo%(X#2*L_KTu686Byq^a?|9I%GejcwA-aTEpO5~x% z`g!-S$lKQx9T^VFLphI!Z|dhA#uraHqz<`DSU+!R-VojF?Tfm3a~tR77f%}(;8l+1 zzIy$9eL{Rc__DUS;M^1`FO@<>)5`B8s;s^d3^3NZ%Ey|mmB7- z*tSx6E>AC4o?Kn46Y96`nCG>R=Z-v;?>FW44akpC-R4vl=Z(N?J61gblZI7xr#Echz1ba- zu3TI$>y&hG2k+!swMSFsxPE$n-+aH^zKgQUf3vGmzS(rDKCb2a<^PxC^-7t?9oY># wxKbIJyefw=Z;L$SQ=Hb`S4*tS{&uCp-|#C}Id97pb(>uon-B6_Qzy#q-xSF7pa1{> literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpio/src/gpio.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpio/src/gpio.o" new file mode 100644 index 0000000000000000000000000000000000000000..3b21cb8cfd580cff09f053c637c07226e1ec0725 GIT binary patch literal 67052 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpt/src/gpt_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/gpt/src/gpt_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..805d0690fa8036d2834c72ded91294705bb72dc6 GIT binary patch literal 33592 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 Sm21Vfdu21e6Yf>u?EVi%$Vj39 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/i2c/src/i2c.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/i2c/src/i2c.o" new file mode 100644 index 0000000000000000000000000000000000000000..3b2561b3718bba810c0a055748d9815e581ed882 GIT binary patch literal 196140 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/i2c/src/i2c_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/i2c/src/i2c_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..c10d4a1eb99e77b2a478cd56a71a508f3995549c GIT binary patch literal 58692 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

y_y9L!h_W-JFYmV+6~!Hnf##&R%Y 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 KKYJ&z^Zp+yZsIrq literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iocmg/src/iocmg.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iocmg/src/iocmg.o" new file mode 100644 index 0000000000000000000000000000000000000000..b90b850e0b1e8d88e711fe0b90ff1b3ef67c364d GIT binary patch literal 56488 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iwdg/src/iwdg_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/iwdg/src/iwdg_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..bffbfe18e2b3f0e39b8f8731b8a2f3d3cfcfeb06 GIT binary patch literal 24296 zcmdsfdwgA0nfBV}B)yPclBOlSfgwqEDE5RlP0O_L&K3h`P|lQ ze&op9`8`{X%nf#1(2*N%=z}krKa$t{>;(i!r`sRccSC#kD|?Xt>X`f) z_b|ey_MLmjzq)hJ#?nnsl3%v!fqiq^cmC;5Q>p*x!*i_)*PgvoH$C}>=B|~cotJL+ zTT|SQr>Bl>$7P7StNoHYmhX7y@~=)mK>3rtdhNT5&|Eb(!v1=?>7<=|+RdhKYo6_2 zVBWcfO~kz+1IPJpL9Uy?x2=c9woVHMV`syR|i5EsyNSlb*No zZMSyry>jQ1RpydAF8Th>(x=CGzi|)a?P`7gq^mF6ac$+^y;ITlL-!s;HC?~*?dP79 z`Yx-#{OxDFhwFiV zTr!92p?TbX*TX)4J)Cv`&-3l^DEVt*^8x(3T7Ccik9XIu>hbT~u7wBi`1S1nn02+h zcz_6g?_WKDXaBYQzSNi!o|#RFJ^4?vIPsAx!7SryP|}Fcl4bZP<%bzpGQOlVH&`&K zU>tcWWqqk&f@LK(@PzRt^FV{PtMECI8S)ueoU)&3a}f35#4dc65t?9=NblbXGN~l! z`U>`wZBF+B?zBkHCjpT^@(T7-s0RhsS2AIy(osuiLYrC=oHq&GEYD}Rm>^HRyk*S> z6Ks6~&{Qyl)OtQ`i29*c>?P{O#ZkBWQ7`I>qJA)rddXaZPeU~`UZP%8 z9Q9g1>Xi?{CT+bcj(S}ls;OWIiTV$;A?indhrL9-sW|G*e$*SMq+HaUanxI$vQZgA zqTWgyqTbPly+qw@!<5Wb`f*F=qA?iP+j^p?x5rWMJQS*_Utk6T1-Y4`BrJu9(5UKN?=MY53=hM_>F8`?j)l{$osq^!+O_~{e@fh6B$O`&W z1$!&_!7acgf*<-S@C3nMu4FO6|B?eP7yOm~0G@6tUcyc)c$k5wA)uL=KKfo)N%|N< zsU&@@ZMO}OK8{!_NgvOHLMllw`#k(oNqRX~`*iW2@G;<-IQo_&KNX-_tvKDh21+G) z>LPwJ1-pI;aXMk@BEr-S{V4ljMhOB*!y zd?}%^=WA>p?KVl+MH*IEqp&_>X3-Pe5^&^Q3U(b{YRqg>%-2*!TpDb|iy0UA;UYOz^Uc z7wnS!mo;A*!=!FF7tV@c-jvF+^prVMPOqv6$}uddI#X7*91>3RQvugt0!n5C^|Jzi z(o#b{jv2;`SL+0<;*wx_8O_I*9al!@#KTQ`%3PQZIv9W|3zk)al$DWUwO0lL>7P6~ zvK@`QDKRZ8n_M=jjN;TPuKi7%e} z`?5Jk>mC{y7#igFRAcy!RlcYqq9yiQDMpY4-(T%Xpwy0N`sE-<^A062sght^nzt<2 z9Y7J?|Kwc_8n40LJa8~6RBZol>VS3c&;EyZvLCo%fBCN$y(Jx_(;SubhwP^tnv~S$ z4I5xu1`wz;M&r`F`LnlyK~R!%gEjwvoiC1=I`E{}xPGsTu;hB5j2pE&mA;s*f>xr_ zF3|HMACnum_+K#yw)^@i)+u&a3ieZSMgQx#B=#q(`MImc8;7w=5}5}a8RY3q=-5kx zlNG)CU#n>U!QT4s2V1joWqZfzBiVdwXMcZ7XZN|rDy^rUvSHn+YdhApwVU4lq0WNH z8*&5L4Hph)m906st>g4l)@7B?)c&J1*R<(B38hZi^YlH|Ml zmgToDZp;nzc7qQNWkv>2U#6$C(3$Da4de>Ts#&TqI+$HHlG~OA9v&U(%M1?X*;1W370nna^eo#lIEvn6dPj0w2D3ex?!Hb`+lz*G zjpq6bxj~TLd^S5$K&;##3NkNyL3ehzkV7Mcj}D%n8|;zVRT}9V$`>-(!O;N~xw z8ST$za)TqTkr*vZz_u)F>d$Jeom;l#vm+yT9GU4K8XD%1($wkd%nb}+urY*r3~O%| z6POtoMH724u)PD>{1#L(Ffh`G*_YhW3kqEseDpa1QvulDGk|&rTzm#YpL2u#xj{6@ zu92t{u4H%rHo$z=t_8MYU^LU2-@@_qnib7+Z+>7a`HD}0`AE%2Rv$9potjvwX zg+^G)x@^hzj@9T)e>Qfn&lV*78J+#3_B4a&C$;^Zo|QWLyGPN@?7Hk0o{EM>3ur>} z{-yZAI2OuzD|1_;cs86puVGM7MK@;U+*L5e-E1#v1Zu$A&w2scE+}LNd$j3Yog>*5 zJv}^HbTBrqIc4Rk8kb+{bau?djj1#j1;} zuKI<>#@7YokCa_PY?W=UESxh|tUbNWbhHc&^~Xb0v}EFS*4`l_Ym4_CyJ<_VuxV&G zJJ`X)vcDfE#7*5;UeK%(=WW6|k@4CPU9mQ-X+0^aoxI-8wCy3M9K~dSWEc#)I4DDk zqokuJw>6%;;x!{C8RKLvr>{3zdmQ26m@ZD8jgA2{zXMg+k+MT$`)co}&&^&~R2!FU zw61ya?!v`;6)pwFw70e%TYWe$R6W&rpR{PYHo--~XnxSSEX7eO)#nL-)MQNWpb+8Hvs#dyjcEfoWi^Cq}IK2 zU8&Q=W54lxZ9;omt_s-Vt!%ET^YRE=rYwy5lwKWZYs`My9Q#rayo>f+^DaDRzI)G# zMQCh3H`2Y;1oeQW_6DkPcu~hdHHRm7GM^leIy6an`>@X{!Vh)X z8ow#QmnS%%#7L6zJ&tO5eg~E$`Bylq`FtuRN%Gk@#~tE6ZN}rRt)yn`QsBk?8=vU^ z*!<%DOFoZDNy4MYZ5qG9Wh-Br;KwF-v&SO{z^{0%Dzspq0xxd=#6!sGS}kJ~Ri zUVp+*jG8F?j0FGt1mEoO2m++>c>8=6&c;3kUfjRQiT;hvFYce@$Ndu?_fL4-KjCrz zgs+YoDLg*jgrAwnXWJ#&NA8ZGe^bp)WzE>9z>E7gHPOGZ`Sj!QpeD(;?+vUXyxe7L z{MiW}UmwID_g^^Q%SjR*pMQkM>sNTZeuX!?;;7$GX;YEtZ$+ZNWAlsWQ}U-rL50Wt z6CPg|gvawKd|je^JfD((P9lGMg5R9ryFGrV;zzMh;k^Uf|G1Y={_hF?>jdAI;8UW@ zmb9-X!5b31F~OH6_$di~T7sY9@u(>PY3)y}RVL<7`s?Qx&!6PS^C$d>sDSWzJqkZD zk-s*<&rL>umI38vs#&c|b z@pwvpe0~!i-%kjS?@5Hm*H7W`_zI85S9ovKX5sO83XjKA`1J|@jR}6M$0G=kHdTr7 zs7j2-*!<%0ko@puT2$3u8L9>O<8jTXK+!Q=6=ZwRB@G~N)hy>XhA z=-=4<;{Hi~+&|%Q|Afc=6CU?Zc-%kXasPzJ{S&@9YOwIQfA)=Ml$)0KnjW`r5Boayv~kSyq@I#v^jFg{bEbR<$h{&#N~eE?1;OaN7I1t$DmC8&zrxG^A#i+t9B+OMz97mU zZ?7$J{zUWBqWp>GKa0wjnO_yv@7X|J&p2)!U ze>`|Kp-m-*zl8Cx&;02`+};XvFnHYm3Nr_Mohy#}hidTc9-jy9U(b#J|Ff5WB=|wt zBvqIuVE=k~47h*2Tn^ss?3ge9+-9Z6SA+Z4hm*nM%bcpSgV zTn`?{uQEG}%Fi;l7L}i6ZYwH3%iLL1ewO(Zc$^L~4}!0bggWze@W)D=P-mV5e`s9H zzh6|o+WfSL*O*tpD?I<};Ojm9Ciqg1r&7lJ8b5iERA(lF^O$zL9Q;?FzY6>)myIVY z{0Y+AUj97rZu>hmn(E8~@cEv9G5DFD|2Xg?z4}|hpYY0`1Rke4vmX2uZ+y-IU*pB= z20z#1=Ys##i$4N>lNbL3;2S-D8TdV3`D?-N_VRav|JJMjW8jTm{$1c-_Uii#_yRBg ze()wg1(!}I?P z{N|`Yh1mn{Umsopf75I4AHhH5)&Dkly*J*ak(WWI;@5`$^11V1zK)R{RErhl@j z0r&4e=7Sd^Pn}r=e5u#|W1>8kFSBcTGoejorXBhBdF?&5$Uo7X0p8;5c)s<1@Dn_L zw#Yx;^n*7?{_$o6{EEm^XFd>Nno7;3;MYg~Qgd}tzWrTWl$$p5B219>t~|mIH@A4@ z`P|}@$~ni=QWfTrME(zza}7>Q%`h)3=P@uXRb?jVSPIAeY5dci=(SVv3n|mEc44)t z^Il6O-fTqWpclP^h%&~$$BMFw-t5RbuEd)q`|6{0|L^(Mwk|~T8nG?L)`V>lwxh5e zO-!(YV<|su#xX#R%xz?DBMY}$N=qZlH`3Qg-(p(@11z=`(Y%;dEvD8=t<`EQ zv6v;ASfYvXnwZ-}UlSuYF>(`qP4q3HZwbpTVZ0^uEun7-ElX%wO3PA)>dAJEZt3Xk z>dI%gQe3fqmCfXy`P{QM@#Q-Qw`51?6VA8iT1t0XhDA`6jlho0z>W=JJlV0)U~Ch1 zY!&mg#3Bu62MxL%bM7_pBInc4b|#pw!53+CJ1^8Vexr-)+NtsET*23<@fx+QjT+C+ z8}l`eojvfy8pqBdxwgyBB=}N|XD5~U8gH?-Z?SgYPB8NA9CNR6?M#!qkz~A8E!MWG zEplsAyChb%*kG<+F5H3shDGRco{h1S%T>Roi2i66;f!T~Khb0=TpuyTV#pICd>< zI)Y2I#Y-HQmfC?pNgW5f4iS$gsLrdSy~H-A#SSWRT}0dP7CQy2+T2Xob-b#@9&S+8 zyVN$c#ZEI+&bF-7++gp}LbGB7udWMi`TS6R?a-F^MR4({39q5~ON7>S?HxGxtQmfX zm-c_{R|`>I(FsXkHRIel8(aCe@qtu>Z8pD%A`vgPNWM4BQ9bnZBY>yziwzR7^YeRQ z<~vl4ITl;_cP+HnCl{aBD(7DX?BWwU{X}3FpV;aAUYPkFK9HtkEC0TQW-fLvKC$yx z1H1UdPOk%Y@rj+j066nBK9Fqu9|-=N#{Z$jwDF($ABg{~7yn291M&F)0%;1i1^?SZ zb1-)0imN@$wNd^YK9KkfAoFh);;#`<_9ue*glP7^$JosU*Wn!1lWWq=oxdjeOd<2U z#IbAdKLm5Vx%gw&p2mOIYwrb#c_wz#PKvQ>b04Gyd;o(qh|SeY>^ym3*DqqHZv}S! zB6j+RfHN=R1L;O=(f^5<522AB zCY~&qw+_J+!7mU`6+8{QpjKZzSe}e5Bin-z(TYJK{wN=^^SF!F*;E=tKQ)5+5o0cY$jc#<*Vf=jd4^ zI-dsx`U2oJ;>DuxWm!%#5^=risgk&C1@RK`@VQU0RPcL%YmbU?z3NAJW%-;ZI9fcd z#C#Ef#OFJ;$Hur`^>y^5AlSDt2c&*?wi23pciO+{?^&uf~z3N$d zwCpJHsp8*GtUsE#9Juy>b2>F@*GK;`M^>1Fqc=<9gK}^2$C*e7bnP zOUwsjNIziNjWMoQ{W-7fFNt;T?D_mm@$*{j;!Fp2afn?U-pjdm&ZS4&N$lELO^^1s zjvgHcVmA)<{IBD=fF2!ZVmHnUfunh($IT->I*&)wqwC>#dUTx-yLHk`kFMdB^yu0q zc58bzJ$g*7rALo7Vt1_BYm*+cyzaYWnb;l6yhnBCicR$Bxq{f8D>l=k=bRpT^jt*j z&P9OHT$B*&oK7It^)QK8$KTGKjydNm&@s33rQX>jm109nqi4VdD(v8?^ z*l8rp&v&SQO?2W=JduYqe0p^EpE z*h2O2_PXX!ss2<*~)qI^Q-gjUN)x+DYfL}zArU2J)At(-2 zpGAGX=)|FVcq>qIgy_VfdP3^@!(if2J-me1JR*MLP(8fd292WgvQ)!`hD02y&QpBN z648l6_3#v2vs85AP(3_F)*K}|aj2fNsB`fm5r^vOq<)O(#G!h!)W0D*aj2dF;GkLb z3+QQyaj5!b)LTU-4%KrF^_8L%hwAx9>TRMEhw8bR`YO?hL-p*U-Yz=UM7Jppl3}^}Im+ zbkT`J^}Iy=4AF^0^}I%Xqv*t;diGL(OmyNCg0nv#=^^8&<6rDI!&&AY- zL?;f_b2as0(TPL#e1!UWq7#Sexr2IMbmCAwpP)V>I&r9;Pg8$fbmCAw{Eb0yq3BiHJ+4~kA4s^@9y9}=B7RL_s8Uo1LtsGjGkZx@|7RL{?;Um`kj zs2=`*FEy8nP8_P|x705aoj6p_>(nn7oj6p_pQ-NCgTSX@h)iX-{qoNas>fvuF zYMv0CI8@JNz`-4&Ur*1+V;rjfQR;V!P8_OdH}$(jCl1x~8R~b7P8_P|i_||MI&r9; zhpB&3bmCAwk5d1X=)|FVo}m7u=)|FVo(2x?6a6Rj@CFKrI8^^;D z(TPL#yg~g7q7#Se;dknq`$Z=X)iaU$1ELd$>X}OYi=q>U>fvuOYMv6EI8@JcNWnKn zpGiDHFmJ7DXT-Q(^$et?EQCZnugpTjTLc&9cwz=aYQ|Q37?I$5)lUOoQcYE!cQwrs zya_uOXESk~=snogvO*-{desZSOBPVYZ%42-)mvz`W9Q;rPP|Zb9-_6!#kgK|F4Lua zh=@cyZ?T2;p4r8@2U4(H^v_~fyC%lf++?kxg)&=zP3V`>`0;tIn@sOaGVX#PdEZm|wqLoK3{H ziM|=Q_R}%0SN%NbOF1D(#PfC&;rE`vF3xu1&xn3GaP5OJu2=mg=u5vOI`O>E2{sKQ z7Y^V*iom{*mwlf@h3o|d)4>0D!8CN?54{`mLqhV|{>}#GHblR1DSl}U>sU+TCp8DK z6#cqpf1a^FwAr7l=oPp8=Ek!netzTSMDNIpJA}9Jp6RdsTqo{$6sox6#i1gT-z|M5 z@6{ODiuzULi+@^xIrDxbE!nZG1${LPC0K2^|r<;etDK@wyH6Y9EA;dKDJV9%$tPGp7XJH@eV@pW^k8W zyp0h2c-wK&*$j>G#%mtq@%GYh--#eC&|Grycnb65z39c8sCkTc7dAiMbs(Fex#Z&A z4#AJtjDgw=jqT%Q()IV7z<#`!LG-kYoOt{n2lnIb_To*}JhqSLem~xcXizgWmt6aP z1Hq5Sm#e&1vwc%FkMTJEe!OcC;0y|yT)a|fe!Sxm?_p?+SAmUrjK@b>Ebiv_#kBvs z*SNn&B;vhsoH5U#9OG4DbMg2L!;g0-GHyk_ORjyVCE`7e&QfDM-rBf$+Y<4P#p3LB z!LWDnMicR>m&fg^^5T6w5pVYa;_XVrd&7%2%ZtZn3HTSKaTv%y@&MB0@*Ypbd-?=p zo`#S84L!LAfG)r%&H#6q8ldA zjIeznHrKut@Ij8IVC7u-t%Qr`LURvmlrDg;`e13}CS)>RIkt(|5HCu%HsbzgKkJIe RvhRD~bo?EOSAnbd{{fQ6#R32T literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/pga/src/pga.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/pga/src/pga.o" new file mode 100644 index 0000000000000000000000000000000000000000..6a4075244c3d2ee4bcf04c6a8e3fe4365870880b GIT binary patch literal 17672 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/pmc/src/pmc.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/pmc/src/pmc.o" new file mode 100644 index 0000000000000000000000000000000000000000..592cd9db015d24c60619e48c4c4c0afc60999c35 GIT binary patch literal 38100 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 XCNyet{`Lj;bu%t8<||$WPWOKRvwdW& literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/qdm/src/qdm.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/qdm/src/qdm.o" new file mode 100644 index 0000000000000000000000000000000000000000..67ebdfe3095880e704fad2838cffe9c327deab37 GIT binary patch literal 84852 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/spi/src/spi.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/spi/src/spi.o" new file mode 100644 index 0000000000000000000000000000000000000000..34bd9d1ffe8ecfbdadc9456c78da29a431ab52f3 GIT binary patch literal 142420 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 u+!q-*^4&-QPQR?wK>? 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 br!l}sjU~yZ_HgSvEZ;R-F(>Fj98>&1kjysh literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/timer/src/timer.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/timer/src/timer.o" new file mode 100644 index 0000000000000000000000000000000000000000..14edd1eae9b54e487522fb1643a508823df428d0 GIT binary patch literal 41580 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⁡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 a<2cgmTZ*pj2Lgw_tFDitEkOm&_x}Jf{sTe) literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/timer/src/timer_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/timer/src/timer_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..96c7c9faf86bf5f9a4f97a80561cad3910b75ecf GIT binary patch literal 12012 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 am;0j1if+<)$b7c1tNn+tSLO!P_kRF|onS@) literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/uart/src/uart.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/uart/src/uart.o" new file mode 100644 index 0000000000000000000000000000000000000000..6a677f8c2c4aa307b832cf7bcbd29acc205878ed GIT binary patch literal 128224 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

{ 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

)Xne9gXWK&&;KBCQT**?tp~2 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 M6(p|bPW&+b9~JKnZvX%Q literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/brake/mcs_brake.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/brake/mcs_brake.o" new file mode 100644 index 0000000000000000000000000000000000000000..f1c31d676f631f5022bdb2eb114c26351a55d122 GIT binary patch literal 11380 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 apm+=S_)D#dCf@v*Zw@x}EK`Uw1OFG{i9N3X literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_filter.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_filter.o" new file mode 100644 index 0000000000000000000000000000000000000000..75e8c2f0e4ed189b92ae74eab6406709f0ca5cc7 GIT binary patch literal 10556 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 Yg?F!uItXkH*Tr=1un>Gl(M7}m1%xGRfdBvi literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_lpfRk4.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_lpfRk4.o" new file mode 100644 index 0000000000000000000000000000000000000000..94eb1b3ad6d158dc5616d5a8b61398be27c90f2f GIT binary patch literal 8328 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 T1}*}T)ZK#@`VAvOZFK(ukY%<7 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_pll.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/filter/mcs_pll.o" new file mode 100644 index 0000000000000000000000000000000000000000..1c5728f3d061dbcd13b90f74ae637bdebe0d580e GIT binary patch literal 16104 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_curr_ctrl.o" new file mode 100644 index 0000000000000000000000000000000000000000..e64cae5a9306c79b2296b4da6b5a209bc5ab489a GIT binary patch literal 15996 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 kQ3p^Mk9p^jj(9COi?h~^fQ5UOZ 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 Tm{6ScHquJ$XJ^_>s22V=tQ0{f literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_if_ctrl.o" new file mode 100644 index 0000000000000000000000000000000000000000..968d915d7238f2dc9e20dd7dee9ef70f44a01266 GIT binary patch literal 12636 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_pos_ctrl.o" new file mode 100644 index 0000000000000000000000000000000000000000..71fce330e52c20026f804ce786b999aa90b5a2d9 GIT binary patch literal 20064 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 Kk;_D$gZ~XLTSx!^ literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_spd_ctrl.o" new file mode 100644 index 0000000000000000000000000000000000000000..c9c88aa9d3d55b75ae924d0c29c93958deb5a405 GIT binary patch literal 11752 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 B77PFY literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/foc_loop_ctrl/mcs_startup.o" new file mode 100644 index 0000000000000000000000000000000000000000..815b6d92493de0530e8ed7bb7fdd73be9f5d9b5f GIT binary patch literal 9272 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 Fe*iHzbeRAE literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/modulation/mcs_r1_svpwm.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/modulation/mcs_r1_svpwm.o" new file mode 100644 index 0000000000000000000000000000000000000000..0aa66467002151ecdb2b3f13de4dc1e4d5430f57 GIT binary patch literal 20704 zcmd5^dw5*MeVx0z^4iERY=VtUK&;HHakR1}%h)^&e#kZkLma;YCiY5NNlR9{Vs|CW z4qq_A*tBT~4kXY-4J4(F`$~bhBqd4fG$xNi8R<$ZR);c`BtYP%SMB z`t#l0h1~9JIk%vzRIHXug`I_bXE|Hmv!K7!Jy^(A^QGc~{;tZ-a_i2@(7^8gmM%ot zcO|yJ2DmafbHd-Jo>J4B^h2l9bFrn4oK80$JAHfl*y-DTbx+;$*k_YU&AcP2?t}fg zeM$un9!&2)y(y`l|MsjGANraS3Iof~6iDWu)n(+^Q zDyhbcwriYd$#h3p=Dz1fwSW=5+;Q4BFiu4F^&rX}e@;;1^oT|KPmi2n`;urMd;RU* zFV3dt_=!OMW_f2vUG{zZ{1J4cHV_{>YRqdooK)uc$M*QA_W0=}&bEtq$;}hKpE|xz z;hdbpIXQ(Ar+6*~5@VyHRj16k7-wwvpL(OQ-8W7&)^yLoWTHu*K#w=JR7$A#fj|y2+q?nlfP;A ziyYb4FtW(uc%O5aj)TY_IYC7b&TB2+ho7Y56G<o@C;cEADXDE&caj!~L^Q#?$*>H5?H?+jPf^jbZzFwoRXVc}{`MEb6ct`Jtqo z?MS?BiB}&<{&sR^GV%K3_Z|GyTJ*f*W%O;^+;McYeOt#kI(mUPU-IH45hr2ejMXL1 zSbgNV$2REAIn1j)H&6IZ>KVm(bt>JAZT^u{P4kZ6YD&Dud9|;8?7WKOs=#^r_vfag zzpu@_FRkdo6{{YhCjdo&P z_nnB8J3Pi|;=7ppB_`_GBQZ^lxb9f{C}&vvhsQciOUBlok=p$p8RyvAgTqZaak^

J)aKPV3%IHMx9KI^a1$msVQ$5f$8*LK#uA?x zYrYowhQu-#(ki%xIHBsO#1=GTKY_;hlAf70mD~Y9tiREmE^f0l4SbCLM$&j;^Y434B z)84?=yQ&1`j6_|&SXHrL0;1tCk%#((iA@+h#ywLoQjIA!#lXi*zYp!OjPBT>?W5Rc z%UCFOXv5S&6+AA!!qg!Zd|q(h)ZHrhg5Yk{yC0FvObhm~BBo&Er?qt?d( zqzjO}0EN!5u`&1Rr=c1an%ojxd5%O*pL1p~W5V*;A6a=0i%qGkRS}!5)YSG`bkb>{ zwmqcN#|?uqx*Qt@4#`|i2K`^|Za_70br@9y!K+iJU~hi!;M@lP(_b=g@{?z~!|1uzEgr9RW6IcAPde=oJa;ePZWJr;~NP0sMD8XHV1{C}@YM^_X&b1R1P6}7Q-)7A~! zuHAW6wupBls@%G1XjQh*r7F3uYN@=g*qs|z-GkLVTZVRT%=h+H)!OT}G_GoGZCui_ zsAXYera#-6UzRTnENbf^DR=cPD-SJd%lG$mffq}eN`JOc$aH6`*-RndpRX=!WU1<4 zF}JLe-|#f&gJo(QsA@S6DO<>AD^igeG@b}sQO{t};Eboi z-doJLoXWB`8?37@hc{ZeOukrgjl^i-1nkYRrb5ovn(gf^=PH%_P%cv_l?FJZG?`an zY+oCVx+50QXmkXquGCVw`)6{kdY5UGRq+Lm-iBfd$2)42HZ?u{V<&$`&$axR#+6(1-Gsd?)YodzSU#?WZ~GoLwkBP|kHB zw^WpiDT}9iw-~G{TdnyU`m&Xrlrf#ice@2m+P9L8c0FG`oa+i3$!IReZ%nzhGGrG_ zY1cN?S=z0JRul&MvSF7MR!y_Yn%;6G-sG9=zkdzQao<$xT47EAz)ID3>5krfbw_C+ zSKP_@S}0(p*wIz$&OtLun75-eSXC8S**OTZl$VORj{MM8Gz$ZnHBC2Tw?&3v9#_Kd#-Uufb>ZTcg{=!4+ZML9XBJ+ZX>ePOJzzJbtpb*xtBSl`0X zHyp-W(TWC@^OY|A08IndnOj@iK(pCnm|$!^{pLrz@ku^@_}C=;JV$ML z`Hn(S@~?~JcSd-3guge!Mu2!A@le;MJi+OSD`@q=I6QzEPO_-65;bAd|`wyjqv3WepQ68kMNBiuR#F* zzG8dBG%3=*vH7F>C;4Fv;b+$Z3U7|^H4z@pC-DzQ^7lsgfe8OlgopD_;{9PH|KSLK zJi?Df__rebM-d)g=2G7owfQ9ctOyV1r{rH8$=@8|yCS?0;lmNWKf>>f@Vh)->k2?z z)ko$-ePlk2%^y7m@Nm5merc@{!o&4P_=ZS6?p!uW{!NbB_7@_&9O2>o zk@9y&^27Ng`QiK#9?loxUyGD~Cc?iT;oB?1G{QGT_{Ip|?(y1C0>ts| zHe9QiGbJ*=$L5co-;y8BZ{gwm79P%T^Cq>{gt(e!>fc;b#J?lL`y%|72oLYKQa+r| z!o&G1JextZNFL{{GjntS>Z$;+PnjwL| z)sdI&A|(``yTj|HPQ4AhO){~sQwy*UpAYKPBJfTxe+lr2$1ekZ)Z_T$9`&%tR{@9X zZJk;R9?riy#b>8j?R?a!cYx2sCMl_S@6nFp`S1o{|M_MY`21S_B$WdW+doP1UbWZD zF98pGyh>cFf0E*NFaP<0*M2x(C#l=P{pW!@!Ixu`lu#c42*YAkV*_axL-iw|@f8IwjScu|D7^;{641INtS&_fG$Q!#}+8*YjhwvINuA z*Rc=VKSljLc-a0a>f7M{_53Wje|>%r++Qz$2=1>R&w+2oCTWWLIl#9Z#r@&e!2Wvq z0=U0^y;}1U%vAL_cbC?*1~n6WPn{DQ)Ew|Hd%OueOlPY_qxfvK0-PUzK zoPFQw8RzQK$|uUB7=evfnRoZ;~b_-rr!UhwlhejE64uRcB-T;Q66_2q-$RWIIs z;2-t;4}gE&*aqH{8cai8{qRj{$23D@%%pkuk-qY zKYvi`JpZr2AMyMzg5T)nzYczrm!FI&b(hDdf%6@_qy{w$yyTTXAAH#Jr@^oA_yX`S zO;Hzv`|Is8@JGCOtHB@l__g4dc=5J?Pxta~1P@ca>IV1M_jiL|;rT1z8@zb$0YB~W z+rcxnfDP*X;Ne}TLEQs>!t;L&JWP|+C&B&u%^!icdj3biU-0-}f*$MP^Jb4ILAO~jXa zmw4}-WjWh81AkR=q2(Nt8TjV3)N-Dq8L@h`I#PaXgugq&-)lMN(2N+KM@N0y?NTl4 z7dEQ7!#J*5$XzRUZP;;JgsmOhVr&;9o@Ok!QP$O&dzdfh}kPPtuf_!WC$J^Kz!wFu{T$tPdLA2*ix+w3Adxd ztjL-eNe*lum<`Y9U~E1PY$pz8D0yUSd9)GCn3CHVW_ZbM6f?-=HjWu;@HQK#%{Hjb z#%r@pYP0d$Y@^z2yf)h`bG8s?5zDPvX~L~p?V_49$Xr{?BG+w3hnr&pw;dXDM(MV7 zne$3+>oR8-+??PwD@|9{tad#zXPmjVj&?V;QkNM3xNR&mD-eU-fy#rNxqPvww6ON7 z-+b^`QK{t0)z#&4sl2|_Tgw~$X~g@s;Jy=>F9`DeVw3rXYCfmh4;u0zZELpRiRR~ub7&agj@h@IXBoOuj8BtFkJ zf7U>=4!ZbUZ=9dcv@Sle)2|11@rj+@37q*Hc1X8iYyL|E)%$R0_)LhM{{W;pRws7) zM}eCk7ypAexV8~H&qKhjZNyIJGns1}vD5jipZPp?NF0KOBL*7mJgjn#)rpHg5Idc}Lo$B_0VxIS z+C%I-e3o_XA$B_NEzNwmMmigtYY(yWGyuEy5Ig-mVAmdEr*rOQj$(&&7PjUu8HlI8 zFn%*#)Pb$}%Lb~ead3Snc7Fa&aeXItdM9x6G3=1~u(`ey zI}d-;xV8~HeE`_Cjo9hKz?mnoLwXup^H&U1r*X)9Rd6H5zxiu|Hv(t);|0lF<4+1^ ze_eb0zH@9{dx%}V923_bVyByH{3!@XOR+Wooq_5K99(>2=U)lz;uAZ44X}$(>~xN2 zh8G0VW^B#hFi>5OgNsk>{OBd*=?8!_-@*>*D7G2%a6*udVsoA!0ylpfJEWgso6ZXz$y~pG8)D~w0n!|+ z6FZ&1*Bh)(>~y|YaDHN^Pxbu7PM_iViJg9~=O=bL=bMX9?DYAbpV;Xwo}bw1OFcia z(=Ye@#7oZ#P8ew3p$9(_d=B-06MO;jj|I;o=F1kO#n^(M7^qed|5Py7oZx4I?;!qn z!S@sYT<}B0zYzQt;$I5pr5^lBFuN2yFPPziUkm0n8}Q;r;=MKa55Z>=pAjd-%)JAj*}gg9;WyXoN~hx7pPG{K)Ho-X){#5@T|PZ4wRL;7c8+xHiU z`7#aZ6tR0Lir=?Q{O1Quz-g=31G_lq5Zf_N6WjB(nAo1jRm5jYoOck<61I=Y=?J^)Gv6ze#N8(hrF3 zocRT@?U%Vu&zCsny0&rnoaW*ayZGiBx9#NG=-N;0+TRH5#(6G1cASabIGgL*p6h0M z>>MC=b6_E`n}_Z6*m+3o<{@BhOcKO)OePZBcAE9ajU z9_ne)iM93IMx7S{60x?PgVZk)omgAX`>Fq#=)~H3?g0)Ki2iYUT0^X@{zuf?L?_nP z^DuS$FhQ)X=kwHgks%Rl>v@9uV$q4U^?ZZ+#iA2y>-i4#C885+>p4z+sp!PodVWa# z648mZ_56hTrJ@sS>-i=1%S0#E)^n2j<)Ra7>v@IxGSP{(_3+Q@QdfvhtgUAP^(#du z*48tb`f|~Uwe`%PzCv_jZ9TkKrdEnhtgYuf>Z?R2*48tZdWY!5+Ir?wUoASZww{I5 z*N9H6t%u(LQfoyg*4A@5^{YfD*4D%Ob!wgH#M*kUqJFjL#M*k+Q~$K+#M*i`0|y&K z-$~EL5NoU7M17O!#M*jproLHpVr@OQP~Rdtv9_KA)VGRGtgYt*)VGOFtgYvM>f1#p z*4D%C38{CAPOPnm-xX5Vi%zVq=Lq#1L?_nP^H6rEUG55GgCc8N}`t>=5xv!WAg>p4NaQ*>f&JwK)1B|5RTo|DwOMJLwQ!|xHP zoan^bdV)Cg9?^-l^(3kHicYMpXA1Q`(TTP7%%q+domg8BpTSZ$iB7Do=X~n#7M)mI z55I$?3ZfHh>v56#M*kY)Q3bT*4EQYeYfbu+Isq_4~tH$t>PZYwI~o z{ebAi+Il`s{h;W?+Io&qzf*K#Z9R`u|1Hspwe=jO{@bDxYwP(6_4kWTtgYuM>c1m8 zv9_LXQU8GG#M*kErGA&_#M*kkPyK_U6Km`F5%s%8C)U>UGwO##C)U>UJoOKWPOPox z1?u;RPOPox6!m*WC)U;zOF;jy=)~H3_%Fp%9}%5cThCPL_lZudt%v_=Jaxb5#M*iq zsQ<3$#M*iqsee>-Vr@N|`o}~k*4EQZeMEF(Z9Q$&e@}E`Z9Pk=e_V88Z9V*co_auZ zVr@Mg)E^X`SX=2`4~tH$t>-LA!6Ty2 zCQb@I7l)>|h8X`_5tB05FJUGUu|C5<^N*5UoaK;$^F{B#q3LZQPFsBoq>JZ^PJCfX z@Gcx&oNi)Pg2bh{X}y64r>(vR(voXLC)NuE^D=XBcu54;iO%WUv^T_Qt8@64FaQ#< zeushPZ-iW&BanhyME@KPO@9#LwAH^3X~{#P6YE8w;#OSvSZoGWBonA_q$>6!0=En{{07C26Z_gQe9T=Ru+lpg)&Cz;Y9v|{}1 z@XIB-;eEG8PuK%1$v5gz+Bg!wT)QY3Al1TuY=?iRHmY1tIol7H`S&m__$QU+eCJ>_ zXK!0}z~A^V2iXC(3D(vgvBxaG07v?;WSJE8F^?&YZ6dZe^EJc6GA=&j@fvX{VZkLh z(&ySY47}1+2JDw-ndR7+e%>N~Bg4zA4jc0(W8-x8<2??t5t>Ub9xpLJUPr4^yPz>1 zmjD;- z@W^$+kGFJ*e3N3lX*Q4Xj$`whqwYmK-WOeRdEbTL$NL?`HO~=M-%9}=N2kyOhdxDF{x#P)d-qlL=xJ=|Z_+J?n BwsZgh literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/modulation/mcs_svpwm.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/modulation/mcs_svpwm.o" new file mode 100644 index 0000000000000000000000000000000000000000..5558130bd0359e8f23621a80420fdef5a181f237 GIT binary patch literal 18868 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 _AH}sr)abza5dXP_MheHLnoYvJ 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/observer/mcs_fosmo.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/observer/mcs_fosmo.o" new file mode 100644 index 0000000000000000000000000000000000000000..5dc852c4b8a707745b9dede914901648fd17fdf2 GIT binary patch literal 23476 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 YZBIiJ59glOxBnca|5l1*U5xL40DNJ6pa1{> literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/power/mcs_power_mgmt.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/power/mcs_power_mgmt.o" new file mode 100644 index 0000000000000000000000000000000000000000..aed09273ee2ef962a5d433ae2efdb8453daaae92 GIT binary patch literal 8344 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_openphs_det.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_openphs_det.o" new file mode 100644 index 0000000000000000000000000000000000000000..19e381980a8bf2ff0557e20e2cd2608d35b21949 GIT binary patch literal 9768 zcmb_i3y>T~dG6W0y*+W#S&y?G*oO6th!;T zB80W5`)kD)#KHml{MEsg=dV6Ic;V`)A3TxUl6f{S#F9tz;$!IP^^>qX_t@YgSMSb? z%a@k@`gaOG@e(Ebr-^2n7l`LmTg z`n>em>*vnANajlk=JDs*OK#UIpJGkg@^ja-e43V@Ow=f^Ur#W`>rdhJ!j)GC9{;W^ z*FOF_%Qpx9_{)#(T6FHzu17z5>Z#3-{>}d4hjw88$#sC8T!Z1<_2z!zS446a+oenH zjxM=z=1ZK)GF>^Z8H#Kd78&OGt|1heTkc1mBcpOl;*89*GVhXkPUhXByC*Yv9>&s1 zW;LP4xBWGsa-O-JIHzphMcj>kZX#-$TnH4huYhiSs!Fh zvCjS+d2g#-1xc7WQy25Qo&{QfB&;#^WW+kV1F=xnW6JtaA1kdfR%Fh6_y(!n!2u~x zp8;AZ$s%)#byj&O>i(36qG~gP`bE~Nz9qfczMJ|EEL&tPTn1k&MQ`us-Ylk&)ex<^ zx~$E;y}f&uZ0db?ueAixSuL`CH}@hmORU~r!{!%&rLt$qM%4A#Vh?QREsa=2rDVN# zg)$mkvB+B7y=D0yPOPBI-kiwxsK%M)Ld?Gb17Y(8$rgK-%xTkyHo8N$xnbQLbz!n) z)DCfxdq+k{uBt@;m+TUjBr9rgVOc-#TYy|1h+wU^dejMV?OBKRX>vxLtvR^^vqdXw zVH;W^(`9vMxg$}e8B}IWU4|xEl}kHit#WQ?j9dF2```Lj{-p0~$CJ%of1KH_U&0&v zjGh-s={hejJFgOChGrx|$DO}AR$$>Rn4@FLnj6C8}; zJ!0Sf?UTF9O}xq^JTQ4sm#S)8-7Wi)xo7f#E)R;CO^2qv@DN{YlW^_U>v-KAsQ9vwiix zP7pf2JKgfDt{*dakAttYf)HG-4Me@wrWzde!pe+uU#HP_!tzv|KI?VQagVhTJt*yR z7`lGbDNhBVU#_6dbivt&VFY1ye7f1eY@C`}4u^AuhJjCYyn5(0q11fW4MO6n^ed{jHD%(&G~-F3WXUlc>^19N69bZaB$|Y2S*f1@^j*0ZIEqHcDf`n5MPgXdI@kQh zEa&E&aQzk=hIK^hNXKnf+{D^Tex~JN{~*ry!!RhZd!;KIq&ygcsR2}R%$8CG{)^vyQ z(i>#9RmbXJX{Wrf=DGDMouRJPoOayVa@~>P8pkNW&w7D3dd><{*w4xvLA&vB1NN$JD_|btdh&bGyLA z$|2j!hHv#9b-nBOu5H^k6;|^(tQKZne`I*9G(0j~7#$v6=M1lRMmFB2P9ect-7g?n zVLf0i$cO^;q)hY`wx6<2XC~(Nh|GyEOJ?a|2!(Fv~-_yDPXsp4fENtgKHFCqm1b4sev<@-6} zvhoWkQlZVgcVuyU#Z4z6If3g;Lawc+y}V~iD^)MAe+hkQhiV_kL+QVpvOky7Kb_M5A*H{N(qB&Lucq|ZQu_B&`sI}V zMoRy2O8;3(j~@g1Ar#f}YBqO0=cU&3+WNWcsp{uP9+kd0rLRuu@pG)~H>T>hr1b46 z{e1~Nf&f{8ubYHq)hArUWQF|FO6c)UB$*ZQ$d%qN(mWkCV_j2PN|apFP{C*l%8h2^NUs$p1d#`o$^W z|L8JAzjz$*!$uYT;!K1I7K%^K(HD!)&e8kD=b@J(u3vls__GQB7odM7p??)R=d7e( zyaW)(vtN7z`g&a}FrIG%zm#bII`nf1{rk}W07*%|_-_FD!-6FG#TAtCJEdRbEFr#` zXukmZ#}oRE&`TbbOp}oi;Z)f5G#}a9+L_)j+-hCApu^~6h@C@t zu9@)@oAGP{HsdEYJkJp`eqzJ(o#Nb$3^Ii@^dSjFn83e7%$Et|6G#UC9q~c3IG2$O z{wDD~WQF)QB!mBxSic~6);hn248mu7=w1ossbJ>C6T*!1?Z9SU#D?b{F!LfdJl|u^ zuOowWBU$=IJ)ihD$O^Ft$@)zR1y3i7FGR=+B~G7!knr#tuVW>W)!BWrC+p+xpkl7PZHm+Fyn9475*dQhQfbF+*J5! z;+Dc(7ptxCKM@~M_yuBL;Y-AU!mkjsbI7-ltd4|o?FMFJJgE5$&Ry%M;^z||Q+Ofp z!0{LlYW_CboKXA*;@?tuFYyBk-$ne}3LgX>creC;n!lemIzDnuKcZ~7e@xqcVAGb^ zv|UacJ)WCsqsK{X##x|^p5sc|=(!V{xdTRhbrI`v_7H3Ta*vrfkk>vr9!vXV==obJ zh0`nQ*Cny7dAE9~ua; zt!-Wew)k*EzJXNa;y{RP&A$d*yoIa~#J0BiE^zT3WQ8EMwat%#i|-^W1hK7ccn>NT z$U=Z^ZIdT|tD=eRg2KGp6^k*pwas$!1BxfMwaq)puT(s-t!;ScE3Q&Jv8`=}$@9>H z5Zl^@&r5Mo@x->a;a#w}TJglTw%JYoHpLU$+GZd5+Z9i2Ynub)-=%nBTiYBaKcskK zTie`6-cdZUt!+Z`CB+ll+U7y>YZOmxYn#*LhZRq3Ynvy?k0_ql);1p_zgzLdwzhc+ z*xI1@zo5+>F}5}Tx8ye|p4iql&yjz(;)!i-^N-};qj+Ll+gv0+u6SZw+kB1uX2lcR z+U6zldlXM>Ya4kEyif7+T*@oVtvs+a#)Fz?DA(Vpc;Z!WQ+Oi^OZ(waEINa1K^j;~ zr0}5TKL~yOsH6q)s+$x(gu?haOgyIeDvE(EF&@->2x{!TiYH#jflx}p@do}hfim<} zIb%@h9t%Z@KlO{!R1k=g-%^V2*2^WW0f#i|4Zoo?Z8d}01U3_n<6S_Rn-FUZ4+0_hc+igTSV|k|v_vXPw(kP9 zMc4H#6XJ`&E0A(XtmCWc14v1KKZPy{mJs8Qk9X4FMflr@hV;ir!T2i!&+!LEKL)6Y z{c&F>{n623aP-GltntTJGW{8uz<^F92m_D6AnETg9KDQ6`s>woobN+OrVXHY4htja zOa)@vgcuW~bwKL<9x0mW;mC=h5db?2cc{rx5U zG4}MgP}gxD&moyMfP()B@-GR(z-L*9v;~RsBlvq0bEZFD1z1Oa7m?V;%<*5b!3MZd zw6Kopk}i$iRRs5TZNtLYeMe(cwHlo~U=)<>m+~r7a(tKZu73p_$H(K=jPLuv7c|Lb$A9mJW?DgVTLYT~Y?>foe@$T4hjL8~%{Voo1v6H6Mu%5@AnH$e5 zckZm$CKMZ-LR*>=r3!6iDMkt*po&J06(ky}(waa80*OSBN@*L>id3a4Zi@glc;_)pQ*gjh%mkwoDZX|Pe;ByJR$ z%%)mUELQ!KxzOKKXw;*yQJt#>`7jrr+SCjikza^{MtxJQ(3)#SxoUN;=tr4?5T_m- z_>F$FJp0|p`p;a~{@mi5*?;=F_Iuvc{=#+b``*<4 z+3VPIY#hV+A1icj@%%q3v}f^EjrtbPzfNxK=|RlE#lz{NdvhN<(}`H-sb5Y^BHeb0 zk-ExAiN0$iH8{TKs)^eKqC7Z$uB#*Btov$VaN^wJOP_iD!tb&_SI27yq`+qorD^v zi2D?O3-J<#)5OaLqLxUE5w3tM*{JlF*svK~(iy;0BomTLI!ma@hjSkx#X0|1crKOj zKElMKRdGY#ZvzcUa>qt%CpqV-DeE1|`k2<(iNvG#_h?7u(4ARTR#n<=rB%?q1Y1}x zn;GYm;+$75#&u`3rYrSm#UAbWFoNNXE5l=Ow9*+LUNw{)zH#{8H7lJJYtX+9VrXc` zP!cgnYB-GOu5yNkwhz5~$XSJ`FBi#SDhF3>LjVS#F6pX+t2?ELWX5^VI%PbuZlyCa zuygI>v+L+&X@AEou~vv1-iBrmf*-PL99-2?XW5pXI?HX-j-e34aIHH;*J2V$hEXp$ zhVcI*U&j0giGa|d#DyzWGy9frGVO=U`c zch%2@|M&M{W&5#m5FKkY{rVgl^s808IFA(?MIW4Gx@E^2?MOsH&5w1oP(csmWB>c^ zP3@kZPTiT=oS8~_wOl@!398M_*%FnoP?-tmH)n%dsQ|s+@LDyznZ05z%6U}|ekR3Q zQM>NXw1U$pfQVM+^vs5nzbyQ@Tzfka-ynM8j-maev>P6MMrdpLo7ZMVY|SAM(vOs0~Lh_e@D^CaawlDt@tD z^}V3pGMz-UFaf81wp8_XtGRMH^joc9-uJ4FMw20>QO*o5sMQc`gfK){OFkyhtF_U^ zA_7~g`C%DN)M~8?W?z-I7oxm}N5v4B3czZyhIVVlKb>LBLA@H((IL4;I)gAZ3)Rzr zp)c10dr@n9xv)j^uSrcLoDAC7-mj6K3K=eha-@z*uQ)C_S8mhv0`f852vT@ z$V^R7rLt4mE#A~tZ+hFU>VUz4&P&O!AW7joiGTl9M*+aNY!$k?E*LT?zl@AVdv$j;OcEE-l}3?yzgQj940JG5ztF{>L%>VoZNArhhZ0|1hTiET;b=rYAaK zSL0n4(^tpzR7~$)yH)+kSb5gcJ52*5#b9i{24nMeZF%o}sq)c|Q>Cwu>D_gx%6G=f z56AT5F})en7h?KDG5wL4{!~nVCZ>Nerhh4>U$XQL1mJzJcReqS#qZkk-uS6<`LQD% zD}AKXh|)L4^lm&=x%#bwMoQmq*>@m7Qhld&sHFO!vUGgnSdzr2qAf|$?HT!`7?tC< z*B8fU$BVk%pWb+_7VGG!BYom#V0(Xa?{Dpt_X`);-p{u|xA%Jny1jq1(Cz(AU-o`w z-|YRo1G>FGcSE=L?*ZuD_z#M^p|edTgW~-F_Imvd==S==*QT)7TMqg&NJ<9fST-6J z^LYZ8V^*@%@=a#BID_Zc38jpRPa@|Sl#Gf`1MoXn$*2_@GApdMsgH=~@#Hsxl2P$h z0KRLKjEc(!%6wFO3wgKyqvCtef7E#`jEcX7{!>eT4SM%{9~J)${V$P}jEbKCT(;~P z`-{3%V7*-h?ymPy(cd}SXtY%D?6lY0D(I`N`s<;8*7Be3sXr)gg>J9kDd<12?6*Px zdrRL5{a-Ep0Q98%-Gz;gio?(^S>^Xb|1V2F4!tY=q72>MPj%>DvFzu2?B(w+o$5*P z_6{aUS|eBbT5(R-XB#7le(?vEKkoMPT4xMK@N3YY#mb-4I%7P-&(Pkl^@7M8no5Zc z3&?j*;gLn!jI;&m4y3I}cOq>=dKc0(ji#shpxHF-rfHaE&1srtS&)?+YZv`|yF8c6 z=R<#7Ju_!DWf$h^Wxqu`rSq1rYnjTb4x2+&wuOw{K*mPtk3B`Mo6)VX z5s+E>**7a~_U$#Mx<-~GLm_QZsH@09(=SVz>&9gWsO#os3{aa5qP7_wd!fE-4evEly>*!U+l{Lg^Bqj*5pB2C^ap?tR*|2Km& z_I$@0|HOuOfsKD+!)Jg!P9TJ5@yIy|B{nvDES}i#oX1JN6d`q_$@?V~r;&NTsqm-B zb0I*UMlw9lr^(+UtIl*YmetUW|MkFTEX0QAc+FVsv2$D=U&@dHB<}XPgv);!o0gUIfZW_&MUl$82|oI?m}{k5{d)FzQUXyr=;+4;xo+Pd*{5fI<81e)6UU{fM$zfz0?H1vdVPjeqVJGj`rn%-D&|*i*F8G2B2K z9a~}(Tfk0ReZ+b!ONez0ml5mO%D!oz?2n^;GUE@r6ox6SU-`tY=FgF*GYGM(ZGIm( zE&nqSg4oqIkCPw9148U-n+w3{x8VV~faGeM&jY8~K?t#{Z7u?*xj7)juC{prI6XpE z2x3>;{55cT6- zQ{Xfw7DDW5n>T>d+{6%KSKIJ!jP!a*^GAH)YMVjwH!7ak)i%q?bAdpJU2Vg=XZjtA zCw8^XI`TY(AjGb=c?bD@iYIop%{Z{b#Rb_!8@G#H&2zt`ClpWYY8&pC^hU)KyV_}s34$={}UVprSn-kQE$@x-pSnIk``cw$%E_~bps6T8}mdo!I;Jh7{79wfg> z@x-pSIZ1v>@x-pS`3U)G#S^>QhX1Ihvx+Bnwaq8U?^isrt8M-e*x9D|Cup<1i(Sos zj{Lh7PwZ-&KP7*c;)z{tbCLXv;)z{t^E~+jiYIop4VSfZQ1M)X&Y;3vE@P=Kp3po) zcIP`4Pwd{HFq<)cb`qx*zX#damM)&qJg)^?H!Gfad|ct<$c&#N@m9rGkd3{kizhU{ z0P2n%iYMOkE`>#=b*hH{L6AqG$}0v%{z4=&{9i$2@~xK0gbk&Hel?e2X@>Vyd9BU# za*#JI+usE!m%te@{o%H; z{awLE`8GKE3W7t|;mDuLNxSdjXD)gQGvbR*k zgRuSGgm=TsD5Sq3UB>Z#3dz&~6mLhR9}#FVWluskm_={EP9Jg7(v&>`&2IM!77+I! z+a15s2>meJpfNTv>;crX0@xkVWGHI&)@ zo`t`E!eXR9zW$BB?*X%p8RGyZ^#(2!Ei7aDJDnT573hq96-i5D_hW4*Nj&a?-5H}G zXS)=}-tONYrG$6|9Q()XgX!NdfYI$HGAS>>pMHf%o$XSXn>9=Q3ha(!17bOdvq<#E gIC71dJqaid;|}vx;{>{aygJ!-)mso3Q)t=!H*_IA_W%F@ literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_unbalance_det.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/protection/mcs_unbalance_det.o" new file mode 100644 index 0000000000000000000000000000000000000000..4f534ad428c61f2222803e9891987370956f24be GIT binary patch literal 19484 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/utilities/mcs_mtr_param.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/utilities/mcs_mtr_param.o" new file mode 100644 index 0000000000000000000000000000000000000000..3ae89263d315183b4bdc02f8cd22ef6d39af7bc4 GIT binary patch literal 6068 zcmbVQZH!!189sMrcKfmIGHrpjw3=bs&X&?Uotc(W3JcpUZ2?wjlz7ibf5h0aF`8!1$3E;tvyyF%csHK_f(e_`@~+@JBJ26s@r_D)>C-oI87W zG)jDvbI$XAocFx>pIQIiq7onCywhRjvepvTJfxxM6;n4Szfh854Ra>Mt@QMdF6Fc z+*0}ayDvQc*u=~4K6>#>Bc$z|dhm|b{82;

k5Rku`}1v%=PxYCapA&O z+6(QIr!Nc6`1CiIiC>+*T$C1XFZAS$x6hS0o_qehE9Dm#iMjSs8Ib)PuE+>UKW4YuC(o3P1+x8at z5h<(e=b-S!9e@Rew-YZ{_&VZM3hy8;DttZhl?v}9-k`8ayjkHYaY^A_#9I}vZv)=0 zaD#ZKP$BO=4rbX~=$4}iql8Y9aefCLe+98oBFuf!)!Ze>a%Y5CS>QZjtTDEYuN%vc zZyLXU{TidV9@?#9Z0uHukRlD?zOc?18{0p2^O%9dG_qRc$I0BeZr_*?qgM}D#8VM> z!en{XxNV~{n%KC;SUWnk;pyp(oV;RWV4d55K(4@YoFO(dGzO)&P{RMx{S3Oiu+SUE z-^W*@mv;b9DfRu>>H2oN!~?p7Id=TMV7bHP+pVf42 zarR`-=_KM9^fbKFcas16zH^Zi$LBr zlq~9If_}p2jG*n%muQyiN(*-3_9)9W6>w8X<25aRON<1R@`VWaHCL((0KH^u5qb zn0m-u*D>w+5Dx?x2p2qB`y*8N?a0tBFcihDB z!E_?qjuZHDd`zUyo^RP<;vfjc_x;n3-&U(@kvv1D?e{$`Xa$}Z&>fx*D@XknA2jJl zlrd3BuIYFll8qEbNNdN&2AWHl0Bi_+8VUvs_cAYZ6gFKIg@jP5&HBFU)V=5XfN%BpKzU(2 zWUS7KtrTWxdc1V_QR9i+XY$jlmW$jIKc4>S^lQ_ra|h}$ik!GLCyWWe5m_%9VSUzX zgtggDBW%pJh|W5#I0DG{Od(zn11g9=y*FS05Koo`uU==VFfYHtQjYfOTP2m`@o}*x zW#l*_t{&ot_2gF$Y}EYX5Wna{>30t4)psF6%sz<&cxQBj;sp&VBU z`Gr1^jf+#j_{!2$6!SoDr!1cDVPN@bDP={$z4&cL|9Rj|nRvboKA+*g3jU^y{d2&- z&hXy`eka3!7x=Fk{zc$=hX2t36BNa(=vQRcdjtH}sFGBaYh9Vq{|@q}wU+ZQ0N<72 zF9P!$T2WD42Dm3>VZY=;BQvA$o!$S{;Qx`azY6?q8U6!^ z#r1kV*Ib($5&JU!hALIC;2! zlNuYEZ_r-ZMV8;SW6BlJ7o@gIC+oRt;0o}#M-4ZqVXqo)RKq?s=r!x98?MP%7$-;V zsjgkswXeE%*3fnh+8v&*)A`{;a^P&eR-KEf$Q{2E)Run#9*AQ*N)AO)5FHJ=_$`L~ z?$j@iYk;pQqvMFSTOuLv@+K|ky-wv6t-V7T5vOwAYf~Stqrlhj@`H#|n-jpBw46AV zj{+MNbf8se@&$#FC&t*04s;coah-&+?ijj|TuZqwBs4X2!P!e}D*H*|s=}=2#x8|f zPmG$vA11CV+$L@)91`n5A0pN-j3}%%g2F@14_P`cv@kZXBJgZ z5iRw@^RQ(K9f&yfLq4@B5KmDe1mAJ|2}fd0EssekaYf4?qnw)wBCcqg&jOcMQz`^; zMcX_HT-L83;)=FmJu6><4n$nhHs^uMd6rviR@$kD0V-l&cm!ia;$B$zE z&JopS9E)lcC?>L9t4eM4*plDRQodMTFgH_NF`d)2NEOm0vi~4rc}=|_DpBRn41A$4 znb*PZcUZ}f)+&BXMozPz*s*@T_c3gO4UWJ1#|Yz|p*cCtGu^byYkt^{I?@E%aT!JPKXb-^=jVgOdJutWtj;0Z!)tiklJ8=Lj^VI>w!1s$PX%i9l1Tdk}nf-JQ6D zHOROwk8Qf{U$NMy^ZZh*S({26j)v2}{%wH2P!SS<=%p d4=DbK+I%E+0zQRE*Alx8sF}av1Wl>kzW_h+v{nEB literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/vf/mcs_vf_ctrl.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/control_library/vf/mcs_vf_ctrl.o" new file mode 100644 index 0000000000000000000000000000000000000000..a109ab3d2ae0758149bfc9a9ec81475852867b45 GIT binary patch literal 16780 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 D9Ve}C literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..debcd45e1cb259c3060a78c240653382f71c1d10 GIT binary patch literal 5268 zcmcgvO^h5z6|SD1wb$N1Z#LLo!q3EOuWhp3yR)`8#_`(D+FpCbiUi^a1x+;R>8YM+ zyZ_uj>$O2RA;v)h4km~kh=hnDB$P{pKr#|YAgz!OkvI@>KpapMi7O$w;W&J+erDPW z;^)E}Rn_-iz4xl>)vM~7>t|P&4Z~oX4E8?jbBx{H!I+88!$RQz+r@UWXD@I0!=AU< z?kW5AyHhhiySroK!p819jXP5_Rb$G2(0F-kweq7~Q+q$S_u~E=_fFh=ao>#(&3zjm zz5*YAd7iPU>DSS-aqq-8e){B|3y$;k=PMYpDn_V^!G{IjR8^{5Nn%z9{3vIY!2#lg zRpq3y3|tbNHNFJF7TIfTAsL@o=}D4Gc#2@9D*RS< z2+Qq|Fyr71HHwT^KLQ#e&NxVZ%v-;_u2||ZZ{5B=Jd*O98IO=%<<{yb8fMIVPH^Wj zhqe%m8~a8lhRo52MxWj_ZtU0v-MwsR=mbP?qadbM-O0?+V?&P(tW03l6JU-{Vzpz? zCC#nVj5-DnORb@miIbD0u#FU`XS;2joD?30_D`-%j2jPZIko%yOOporh6Z|8mEDXD zqp%Tp8pL=oCfR7;F|q6uvmhFZQf}4 zdG>!9i7_v8oycouwo3=m34;7;!ZW)|A$tG#)T}2k4J>J~6BSsE+;%&?AIvCc&#MS!2cq!*u4qtu*L+az}E>ChF zlaPE7QPRlKl_=}RX>ReT2$cZI7se6vu{w;L7A`F`FH(|Gpz_p*$O(KWlLLvMW!%*R zc||0!Rgyuy6Ir?^Tbx(Ua1h!>z%4(@^du22Y``^6BL!TI>U26O&oY0FTR|Kr6jD-h z^q77aBG?FFim-Yd8)$_Err1Vcy^yCJ3=xJ|7rQTei}k!^q3UV@wgNC{hZr~1{>d5E z>_>qgVL~EDdW+DOZg34SfV>qkyxtfwN-AGxPMdy9OJk^Ekk1TtE= zFQ#NUh;t_jd6d%<%Hc)`r01TaB#kX(oW*fr#hrrUr4nQ<4zN4eT3kAw&x1BOLth+q zEWYLhmI&7(W&!ycuE-WH$^7bK7Z<14b;>T7CnRID@M5?UP#l_B@K7FiqfX;Kfw#L)?+!1@OK3AKcn?G#LEm-xV2jy*s z`;cB1AAw9}eAO7Ku)W~Rv^4tUnHRQwbNkZpV6AfIH%oVxhQ&4ecpX~eYr%~DfCJ(Z zoKNb_a6Xx9dh^MA({MY~=RK;j_vmfVBh06V37G1Os)eS!^EC^uD%R2y zfFJKOK>yrNYZnh2p(p!m0#haV&urq)Y~s&v;#W8EUo7!G2w*bt26JxDqeM@I40h>trCBn#622f z{k4*Cgnb$HLP_5Nf1$*8!4H@C7`%AGqNVY!pdK&ve+@j|e2T`{O`y}I{_lW4P~yJ_ zeou-20r-O`lE&C;0C>JD8e=~JdbyA&8r!?h?A11J z6`iKjYNdQ_4*cU!E!PjL_K0d1dU~l7b$CX4(vCh~%1Rqcn|WpWsB8}@_NZ*t0LnkP z$FNFOseD#hXt%^KFA=wVR?F&2M-N7$$a(pZ7tgUZy<&EhVzM9uLimt`;?x=RNC(mR zFz`Qsi0%sG;{vje5q?Nw>Ne;>4|*8I_@sdB0O3zbOv4zTmiRHkHB_K;CbHuVXL8;DO-)Aw;p~0E4sS9N4+O{_R(j&!8SrL3@x$a46Lw3AZbP2jS>=iu)KWHdj7sORq$U@})%33~?{{SFx_qCP6G zsaET4ASwFqFR4R%Zz?@Bg8mAL<~NQ)dXxvhLcx?0G=dHw zxbvDpOJfpIi%|5a0lfr<^u0KOLjHE3(B9}=24rtxkh=sFX@4|_vfd1gf2WnuYQ28| D!?1l} literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/fwscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..386d03532316e0efc9a20d1e5b4ec441a7dcd50a GIT binary patch literal 5344 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memcpy_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..187968262db608cccd5923ced0509855707026a8 GIT binary patch literal 59176 zcmeI533yah)~?S};g%$l9$zx_U7&f59# z4ViGtzR$odmR5d_V{Rqq0?O}d+3h+mx#+0DmwYv3%J4+l>{nXQ&_x1mt=6Z=} zw}o(d*=~8)ede|}uD~8}Tm8!lSBZOq_Vz);ck27%qN7rGUQB+bp}l<2oK|fsE{*rn zxo2m;kz5ya%`aNEJ-^`o?fHkS*`D8f-FDhbJ7{ZnczbEbF7}e=*}b%5mwU-eesD#b z2HH=woHf)E?I+S%J8Vy|?k@HdC5EetHBkk-tt;Gq`rzU=XJV_aZ4+d1zoacZX!s7= zYdc&It`D|N#oFBTyYl&Mnz0n38{0HSbsv1(h_&l{L$Ba3ZK%gz+9r7ThQ-5XUyAI) zeAF&n8s33hY+3jGMN410+o^r>uU}f4zk2D@w>zinu!T=OAGLQGw&1B#^VctZB5H?o zdj8u>&u`_7&wpd-jQk&#mff96%fXT}?>s74Jgmo4`N=ln(XF!MhOK+5Yp;cOJn##* zd#^=z{2^L)=J9QUi^uF6WRB?-WDe^eTs-QiAam3y!L_; z{zcD*OD~!lwWTspf=xMk_q`{v)V;4iE1IPe$C=z7$`XJ7iGTg%7hK5*3Fxes1) z*d=a%zopt9^4e-u+oN9FxvK36ukGli@$#Pb+HO*9&wFimskWEAwn3`xA70xYYF%FU z+TOVsJ6_xQs_lKR?YLXxd4A-zou=A8@!IZIZJ&E>52>~Vs(JZg^iIuu_zSnwOtJWo6>j|w|S9z^BwQ7CbYrVBq z>sqh1uvP0uuQk=Gb(`0^V};(LAhY%T`}A$PHP>r>zEx|U*LrfR)?%;qv{tP{yw=-W zwT|^#?`qXL*=z0FsLyw(A&T7#_C_iq^N|EG&-i}TGlIELGi-}9TD(JScZ zA2;m!6*LpaR&DkTkf!RL*Ulw2>vnd{Ur5isyW4i}m)(70_v2yrbHVQC$p1fIAHqP+ z*>})6JDr)%X?13bbM|}3CdZASkqtY9v-{6~`#tc#f9wXMURk?GX?Bm&>>j0|XBUiV z?;fSW863`A1MeJv_b81X$=p3kqxZ({Q5wBBc8}8RK5N^3*7pDBS=;WB$=xHiyGN`4 z`;64@9;NwjKkV{f-T~V?1VNUq%Cc|CYQL*FWWdZw71Q6$EP87Rm1HHV>zaeioCK8p zlW|0N0&zBs%#d$#?5u4?=HM1;$jKT(fA^@TKkOa>mvIO%Gt15_GuKwy1!txEQ$yQ~ z#L?m71ns7@R0WA+EC)gRwPfM{o>;q(mYhSk!5*-9-Hr|KB5s?R7#;phz~#qTmh!!5 z%WZjvl#B_tpd>4Ce3+&-E*WcCN`|_UOer}b+>flbiNuLvWmIyKWhrTKC0SB3E*yiB z?8M38!l-1tWhuGSl_aF(l<*>yv`L&A{yi!=&9apI)0JdP$?4(!D9K5j5$=piCRmn| z4z!o;=C_fO--I8dWRJweFhy;=`I9V5$&s!kM@lA#-N|a(Hc=KRKQ5S3I~mXbSMNn0tY3TL6DePU|(LR2!%vXs2-O4>jz&ptqA9#SDrvSXCCgpOUQ*H$UWk&8iRt0iou%ZW@K}`WotPb77nNLWSxRnqC0(RsPIv)I_DNh4J{OhDwJas;UCG{3a%uQy zlyReAbc=P93mXg7)WM3({GTfJ}w%rm} zg=JC6?=4Ho*{-Ckl*|v0K}q+-)!~AuoJDJofLSxVZ{^R(Uk{iNg%;Rh($Kd~q*q&D9C8!b!8AXm~uN*0Iv zkk$5p#7*JksN`nLQqtf`_Lq`d!lP00tHhG<+Nk7K%Tlt`l^h@?w}mrNl9yN-J`ga))Ip*@Iqr?B?f5$(`XQlq3^(g$2~co4>-clnitw z2TI8w!@bFBo1a)2PKrwIwk##}t|TcX_k^QR(lha=@S3P(m1QZp&6VU!$)CgDqU4~& zz2VbQ$$gfkgx(I#+tO1??ho%liAg*V{t%TsXjw{f=(W;r{y|dmm+*a*^h&G_e@$(? z`43r^lEYnzk&=hQE@ZXso%m}wF)De)vXs=hl3r5sXm}J#4o*B4ULBSE&9ao->PmV` z$>ZU9C^;nYM7Sm@dD60!taBv?OUYB=-6;8WVomscRPwZCDQUBZZ2loq@=Ul9B?XCR z!$YWzH~%@yQgWCp`L&chA9g0IZDHbt@HbJ(-z`f?tt%;zk{82~C@D(36wZ%IUbZYH zOI%5zl)Mt2i;_bVYs06al7Cp1lGj{Gk(9g|u0%<3;_k@EbmFaWLR9j$Whtp~B`GQSXE*{SC5a8;@1v4; zEKA8Pt|Tob?}jr_(kJm=_+(VF(Xy1h>PkwaMmSn=MO8sVnI#B_D?!$!gm_u_ZhsD*42+l$_;C`bo*B;c%3cCO!+V zib}RxmXe!YNq;H%JUj;_0}@|^PedjEvMeS4a3!TuvMpSJlEV^ThTlXbUs;xtEIQJ+ zkNp8s@^$zQN)Ata6ZWDu-u!PZOG$rMa+s8S7v_@Hc3|TB@bswU2g_1&rYkvIN`4H7 zp=40vr|`e_mpx@JV{#EZ}L7QZrD ze5NeEhSw%j7C()5Nv15mqIK)!U~juC9t~UXX-+*F@?Mr%J{s~C$t)iYc`wT>UF&4p zvmL{OI&^NA*3p_(@teWJo6y1~fVi;5B1!vwf#+c|94j^>;QNwnLOPM;x;?u_S^_F;H*XZU*_ zNZCWl=};6N(ao+&qF1-0J9i8_We@3k{m^a*?Ump~QE^7sAjl;t^MdTyjy9_k9msT& zHIi6otPgb+LpyTsqHq`UrUrZpi_U*&qT}HI15-Qd+L^)CbcPv*|L(9S{k0zrgDxsM zw6?mUqNehkvc}3or&Tvq*Ho9+*Bx3@J!MLLOI<}%`LxRNvnEYX716(bhvETLaoB{W z`l@CWOen9fZK$rPY@9%q4P}jIx!b&^=9Y@;`U%bT^)*cs&Z(}es6VG^LV5Y5#_Fc> z=_Tn&wJl9Gld2jfQPYH`bDJ9L>zgOEG&N4Bt}Cx;si>SVrMkK4|H_hr|Kc8y6%2yf z%G&aVb0;+w(Njtgl-1NUpW9H`R5T6uWK%P3JRzOcHC2|kG**_Ap!-%tOLKJ%8B|97 z+TQV*k7kCMAsq^YK}J@Xof!bLGc$0*e|O>AJXh)DFCA4&n8|Y|%5ux$Iq}jm?J})H zM194r;>B6NT*Y0@jy%}_qBhaO_K2u$MC~J@AptCxD)x#fH=<4vb&hE7i1vx7YeY0S zAoJ@UQIClBkLXts9T-tEqMi{Q6j85;dPj6{M89UrmOFuW?0>jRuiL##ahLyBb}7Z( z#jOv$EbBzU9(Hnx~opQZ`Asqch~)*+^#zA z0a0t*h4UhBSDiUOYTZ@0Hc{(;es3HS<)o|Ay-*N&g%K4+bZA60wkHqDR7B~BN+RkL zQQwIAMbtl{(uf8`bXY`(M>H^^K@km(=!l4DkWtp}$cTnUG%TXw5sipwWJE_XMcO?X zW@bGfikX@9LX3Zp@x>Tlit*(bUx{&TjQ@!7)fiukab1kB$M{B!Z^pPj#ax zei`FeF@7E6H!*%2<99KBAL9=({utv=G5$No?J@3%ac7J_$2iM97iMN%6yxj|FOG3e zjF-eXH^xh2yiAb0u6tqo4`0%j{J-^*7C#loM+xy0aD0@ot0&uCJ;fdvJ*<-v#ZRnq zlpqIgyI-pKh;CQ=araAAM%M0^Dt@`m%-a1@g-1$e*6x=o-Vgt0U#co9o0@~8#+;lt zES1XZUsO_5oL5*|Hl=z{bxlJ_x(cGPeA=K!8mFkPttuy7S6|pvOQ-mS6=lt3g*DZ+ z)y;$QP}SU0S2?Ju`n*cwhL)yjg$?x$sING)rK!2Fv2tpCV?||S?9k8(`Q`OZ&E!=z z5JA^BKsKFI-CRDc@XVIlhQj8uDK(g9O-*%S<&1{1x(X5vWzEf%jdg`(Q<|C^%gU){ zYF^>-v>G(rFlcIB3vEqdRa5oUy2^^e@@ZwX*eY7_DJ|7C&DC`zsv0Y4%V}QKbySG9 z${FRA4b9cG60BS5FjT`!7prMnePeTBWnD|H7&PQlTaVe%*3pt1TgtJa%`J`au%ntA ztH~;>sV-~c1=*cOLmzHIRV{Uv3zbLlsda^}rD;%FW=6wL6)iQDh1GRUZY61N(H(GJ zC6-iEDN8MzI<>K~si}H;WnoQyeFJtWLS=55)wQ*>vuPJL(r&G)q&u*%wuM%)f_7|G zZDr$BT10Ja(=@vGxwU0R^OQpRGtC)vR}j`z)Y5Wm-TW~#+UDxIn(8`QA=^iyjc}Fa zHRlmFR@%ORwWw_=ENh&K{i#+fx}U2WYo}w|3eT%-tVdyU4ehD3TPo|yE7g5({b}{p z)PHC{pGCo@vMLH-zhm2)s~hU+4MXUCRkD8Zp0ho+O7=j!4cFZ1jlymKsqXs#t{zm%x` zQlgetqLx;o_DhM{FC}Wfl&JkuqV`M4fMC+m$4?r0^ym@1CKdH9^c)v7*ES5NXQfHl zYsc9k)e()2^^HMG9Y2%h;h8L;t*NW0yEJmKL2gIUHXqqki#eUtSZ-&;cYD87V2h*e z?W4B0kJ{coYJ2;r?d_wsw~yN1K5BdWsO{~ewztoKVA^35rdBsksBfsOn}kPVO$|K< z(vUd~Z`U_iCvKZi-x6<7Ap0g-@xE#W`>GY}+s6(y*Tr3~uUgH%sw>hv38T5C)TXD@ zoKtGfDYfY-HP4jV^px84l-l%^T5eyJ@2m2CO9Q+NA6GUbuw5crxxQ*e`>GXH>#0^# zt)*H?wM?~0wT1(*+px!jqlOJTEU!0SBP;TzS2m`K`xX_aiu2ON={|+U{R&g12lEjE zjfB&+%HU_3GJ|ktxMxO?M_NxqJLC<&D7-9VX#1QXW9<_|pBuVoMo%3e)|t$%A&1ES zWv)1ySLX7){?~HzPbvqUS6$xJNI)5X zvX>{s%nH85J2|6?_CdseOu2sL%uI6hlu1`Vu>UZA)`9TlYt$pF%j{76) zxIeOv`y=bPKeCSdBkQ<7vX1*B>sj9V&-e5SPsja_>*M~%`d%;pq^CD{dZVY~{>StC z&})zTAGgQ-kM$Q`{wGg&iuxDlv$7HmgA3iyt=ReESi#@&C)9XCF&C_&cwblITl6fmlSJGPP z$)29+>4l!Y-_vV7z17qF=@=}M_eam@Wsda_Pfzgl3{PM0>H9tXs;9Skx&yuQn7AbLk=?rfFi)TA>FJ(c;OTokz1GuTc)C5k7h13X zA)dyYxOID#r{{PYZ|c_h$36Y7r?-2$d-Sm9`=`{?<2-$;r?2qza!)_$>32Q-lc)Eg z>(hFB(w-jU=`%e&*VDIo`Y}(x?PsxG z=)HD&eGc*TNKa4k^aY+?(G@O0but=GqRdZ?!-dip$1U+?LAJ^iw$KlOAr zy=_(RpQNV;d-`-wPxtgSp1#M^cnhsw-eyl{bZFgvfTs`h^mtD3N=>@97nuzQ@z|EA93iZZqlZy7lpJ`yfvTcG2GY zc$n+s<6+hX(L7kk$HT1S<6+kE@i6NlUj1lK$H&8*kB^60$H&90Cwui3p04urnVyc1 ze|dfjy!M5jUgYV;o?hwcXFUCar(g8+%btGK)9XCF-qRm?db_8yqvJu|-dv@lC_yH@ ze;xe+pS|UY^Fut1kI(A%$)2wB^ej(br|I2)t=j2bZ>{t(p04urY){|p>4!c2hNr*sbcg8plDGd5 zPmlC8K0C@2=Vy8PW=}uj>9;-ogQxe2jxTxseLQ`lryD$dm8VyF`UOvK@pN`{e96o2 z>FJ@K#-}Ou{J5P6sjxTwA(w-jc={ir(^YjW&Kj-Pqp3aJnCwciv zPY?F=P)|2|dcLPudips}f9Pqv0YvZb9-c1s^f*s9czT|v@AUKW@g=WMv8P9SdYY%_czTJaAMx~hPvetqdi(HU zG_4CfJ<8J+o}T6D#hza6>2;po=IQp)@g?t{-ku)r>B*j+>FI@@zTeaM{FUDRt)9+_ zjwgA2dU|?@rzd!NhNl;JdX=YN^z;@_XGO=4ygqrJ9_Z;)J>Bf->7G8%(+fPk(9<_7 z?e-*YGlN_$Nq6!zeIiRunfyt$$jJ=oQ)Oz(47%Cln|QpNuLs5BdpsVkkFRk&q}Q+Y z@%4T|KDC=@8CgLu;sT|AO&lM;Wd({hXP4swqf6{uqd?4xgd?F_}l5~7NkrRw09iLC+1jmw&&nI$%v845Q z`N^c?^NF0`bkcgfd=hCrUXFFw{hXjr4eV6KOqOK7+I#FF&8O9xtCwT921s zN_uj1{GSudBdy2F@p(@@UXFdG$IEXdt;frkkk;enx0BZ6)(jz@y z{t#(BUXJ@hkC#71T921MM_P}UzeHM(m%mC{kC(qmT921+Ag#yC-zTld%QutO@` z*5l>dNbB+PZ%OO%@}EfS@$#QZ>+$j|Iycng<$I9UN`~@$w0z^?3Od z(t5mn8fiUVUPoGwkKya7^!V9%r1kh39$R|+4d?E9d~P0TJ$`o$X+6HTkhC8EyP32e zA6!OSj~}iet;ZKvk=Emn50cj7laG+rqAKE@pt-!U7*M3N0Zj$ z_a~CpkAE}_4SA8r1kX)JlE>$7Z}UY*EcRBt*?Jv zMOt4USwLD}KUqXtUtd{5T3>%zPFi1|SxH)7zqyyRzP_`Xw7&lH7-@ZdXbow7{pbbK z`uY-H8}#)jj6Lb=QyWO@>sOmd>+4%vNbBogUyzQc4#791)<1ad~qp_s; z_^W-8O*%gQY9HWh)Z*i>_CY7o7109P2VF_W$7Ah-14!%h6TFt;n31RU0mjM}IZ5N? z#iUMWu(5epTsFq~qiN_Q4p^+g1BG()#@AbkcgfWin|!9#chHpMTYm z*5_A^q;ZVIQ+xZ`tH*EgRc?Cxb`EJhetQLJJ$^f%v>w03Yxgy3{)7di)m0K6?B%O?noslUtus(t7+BU!wPjY9CHokKf|hNsr%- zC9TJA$CK9Mw-ZR~@!Kh+_4qB0z4Z8P9cev&+e})I-=0TWkKfKBt;cV1?54+W=aJUq zx7U!?+##0N$c@j9Q*0<+ZCks`0Xmvdi?f5(t7;%5z>167RQcy{PsE0di?ff z(t7-M9cev&`!;Dkev4yIJ$}2Hv>w0RN?MQKennc3*Ze?QkLTdnRgd>%Wz+oB_zS+6 zP>&bolGfu%`;gY-O*r<|<55Y{dc3MPX+54*L|Tt`^&zdt!*J}Z$IFJ0*5hd-N$c^p z(WLcw+=-<1cpZ+t^?2Sy(t5nFg0vnFJd?B@FT__U>hVMzyX*1BnWXi2zVw`*E@#Hs1>+$9dr1g08CenJmdJAbio{e)CJ>LBdX+0kP6KOqO9<&JpJ)WLT zT93Em+^3HkAMZq3kJoo4t;h2ZAg#yydy>}I190x7uNM@P*4GpIk=EB6@U@isdc;uD z`g#S*^^ns^>+2oJX_0P-W$G4O zK^n&lJar4MAw7-uxzmeU)$gsIn~>NySWWHkN3VC?g1?deYqWrF!84>kQS*O^^zZ3E zPu+rb#4}WW1L@C{{($stYJEN>{gTpOl8&GMx&`=#%}r`~Ka>7m>Fk^!xJb>v1L^ye z-iP$QN*S?wBag6Qs7o>4a?euq~ zaSZMBPSSCQ?-pd!wY>J~{_Q}ztI{~v>8bPqq>Gg{qz5WpM0%9c{YZ~fdNAq9N{=L6 zqcqOFwkbWH^me5ulFm{0cNOU_O4pIjQ+hh-0;Mk?U8?k4(!-U$iu72euO~f0>6=L} zQ1|z8(o2-ShxA=4{~+lHlzxo#6G}fr`Zc9rCS9)P_XcTvPp`ZG-X)E1+;w_0>GxFq z7o;bv`};eztNpi=^a|CEFI#<3=?y$nqdM&{kv=4fc*4KXyY1Q5>NRz%) zt?yx^Usm%QN?M=KjUuhj_r{REQmy}Z()d1Up1K7SN#hvO>3D1bPL6$T)Yq#TDX+)p zXOPz8_ZN`(%lXwaRA&OGwApXR?Cjt=eWCv@!_P>k9KIoK@6TB@N_gSY58b5HK52bJDqmLKr50@5= zF3t;j&IpP|r|EwQ{qIBn`_lh@^uIs-FQxwj=s$gKlK!Od2Qm6sB>h2TMK_5(|Kd7LOqGB!Ws+ZbzFGZd{T}gi| zp@}{@N`FvEpVOp2sH9Jj(k{WW=(Du+2g{<5AJZRH^g~5IRP;kdKUDNXMSoQEM@4^B z^hZU1RP;whe^m5GMSoQEM@1NdY3cG%Gh3)#5qM{TPrKl)H#Q;O6ji~*<^fQkXA7=VgYF-lU!s7V#0C{>KAR58lvlb`l43RA_XOckRvRcvdeAJ|&@ z%q;obAGkwskKm4AJ3-3!f|TtBDccWHwj-o$Pe|FWkg|OtWjjO4_J$OFAe-iFdqT=~ zg%o}K8jf8<+Z$50JEUxXNZAgNvOOYYyF|+NiInXWDcdVj^dV-NgY6e7+c8qMXQXV` zNO9kw58YD6c8C;rN!u?{^!Z}=cF)+Zk+OXwWjja8_KuY89x2;DQnrJnY!6A1gVwcX(Ed12M&n^7q!p|=J^kREd+V-fl?NMplqtdoVrEQN& z+a8s+Ju1!XZ?`CIwevPuljMwCz7>+keuw|DC%TdOVz#8D4Nu*q@Z3!|cE90PW@Psrw9L`&KWLek-G|UJH@hF9Wqx*FlD2yj zx3ao+k3!3;*}V!aD`)pCw5*=pyQJ;@#jV>=nV)^E!k78kJq<1MvyWM5nV)^!lD3ar z+{*myqZeAX*FJ)wWqa+T7~1VwnV)?ulW!l*xRv?YM>Mp|&pxW5Wq$UN4K4Gtk8Wt$ zfA$eh+CIi{E8A-y=g_jf_OT8v+iM^1(6WB^F;CjQj^I|-&pr!4%lg^p187-4`=}o| z6s;pixQy#Svd;FoVyMjwjWV+S_PK-RXP-Al4#nD!9D%<>Ef2MfcDsb3SgVmEWZmrZ z$jG7S*&|29eZRV{s=gS9tWA~bi$M4gHae1(Z#r=Yw)|x;J?L1u;6A=ElO)c?8!>1) zg#H&kz+6mR@E~(P@L!m5y{%w1^C;p@)A)oQjQ6Ku8b|-#d`?w7g*X>)@}Q}K{<~VR ztDQ;gYUdK?KFoPscgy`N^D^)w%nvGFL+s`WcJo|I?B%>vf>J4o@9R-e7tFere?)6hzr-SkL@jZnt2}h8Rq4RS0Mi^ z`*?p>0p9pR(_`T0nb#}cKwS6&`y1iocgSe^kp36G$h?KvE%!U(PPmv&6WHyyfTD$X zQw>d>=%$mL3xZw7?$5QHvHMfl?$3X)Z};b`%yxeY+x__(`*wfI#lOk4yaHjnKVRpJ z-JfqT+x;nQ_b1-mLlgFA?t12{hzs6gzEkl^;=;GtUj-jO$VSuS^uGXa3Zm(4#W-gz ze24u_@ZV+L4F5gmPl?@fu@7@MvY$;iZr_64e(ONo5pOu63GaK$-Nc+!Tm=4r{ln;{ z`^z!A`3xp&Kk>oNA4gm$wNn%~E1s=*f#T(g@i24q!QJL~i{hP%N7MCLm%;mc98V{9 z`vL6M^8%H@`*B@tf~<{p&+yA0lI@q`DX1vOPU1p-nG^z~PWzJI>yl2EM3+yu2tIP_O0lUn- zD)WrWfL-QgmD!{+V3+w+Wp=6z*k$nE47U%v6T5W=yG&AL@Lmd+0lUm#l{rymz%FyT z%G9Y0*kz`x%siC=yUYTW!MLGYAF#{Zt1{224A^DXs?27U0lUl>Dw9QHYHnFzm%&)I z+lNV&0lUm0Dl@wYnU8Y!Nz%GL^a+evSGGLb(uQD|%19q8amAOJ? zz%Fx*%G{|kV3%2?GS8?C*kxW;nGaP4>@r(bCWFSM-Tnc)Oj}~N?RhE#cA4HPGgxK7 zE;CYPCa4V9WhzwWJe2{v46aeS^;xJgV3)x)2$y+KWxy`;n9ATfquX|{%iwyWo6lD& z19q98R3ZP)K4%6oX!4a;5N+jz&XtG!FU5X zO$)$nnHPfFF)s$UXI=uP?cmD!@+%-M}hk>j|TT= z9t)N?SB?V@VE8T;DDw%;1SH1fk!gW10TgaA3TbA0r+U?gWov zUI{*)c@-ERaG>da@CnST!6!050zQfPaqu|iHQ)AI^9*F_ znXgfNJ@O6gFM@wI^9pbyGoF7Ojcg ztF`C#G9UC+=iBpo@zH;rkEaR8c&Io=H*)&{?A8-q!DVKu4A^DnsLVo@0lUl+mAPMK zz%KKM%B)oxu*ct?=oPQS+6oUuXh=+%Y3IYIInjZu*-D8`K&xnabE8-V3)yr z`dtR+^)3T;nXxK^^Lm#7yA0lY@8*N^dY1va%siFBdA-YkT?X%wck{t{y~}`I2JcyN z8JyR<4A^DxUUrwkdA-YkT_y|Xv$B71Uhgtsmr1G&&g)$U>@q`C2IuuI19lm_H{2}? z=k+cFb{V|i+huTG?=oPQS)?*JuXh=+%dA!zoY%Vy*k$luYqu<%*SieZWxi1voY%Vy z*kwB5d{*`$&g)$U>@s+tv&-PT-etfpgZD1G49@Fa2JA9;KeEfL~o_;Tif;47GifPcq496XPC6!=Q!(cr6?$AW*)JPtgc`Bd=L%oD)ZFi!?w%Ul6o zz&s6n9dix%dgcc34b0789K6sp1N;Z(nczjtv%ohp&jBxHz6^X5^E~j)%=5vwFfRb( zfQY7r;9Hp&gKuMA0$$3z47`l_PVnu_E5XZ|SAp+fz8`!i^J?&2%#VOqFh36dBl8;Y zO6KRlcQd~TzK3}&_)pC1z^jM(};iAA)h9N7EMY1I$~&4>E59|AqM* z@M`8Czz;ER2S3al&@pZJSLQ6RJl1l+IFO_X$Lisu%(>vln7e@g#*Ab5@NwoI;3t^# zz)v#c*gkxU8OQM98s-A<)6B)-XPEndpJgruKgT=}{5I3h-;p)4=PPaefiL&fEZggSi>}Ci4t14!UWY z34V)t7Wi%EIpBXXUk2X5JP-U1^L+5T%nQKpF)svfWL^w@pLq#*6Z10g2h4YZKV)7B z{)l-Mcr)|;;E$PCgSRk00{(>gaqy?iYrvl|KL^Ii1Whl3KWAPG{(^ZO_+QNH!P}TO zfWKtk2>y!sL-5zkTfjI$p=m4lTjp)x@0h;9hiRT8Pl!cfz0c` z^kdJM+O#De%#6=yg!F^Ym}XQTDO_o}${DFkB>g{Bm7{%>OLC4N6-WPL_}Wqt7d zE#XAYmw_iSR}$w>j=7ik4ams)TnLu^a}!wh&)wiMu3ZhD!u$wvetFEj#D5AIndhru znddgJ%#$8cG#<;fxnQa7LhR-VcJu6tjI47HWMo^wZd>w@k^S5g8QK3}xBq)1BYmR) z8R;`%*JlW$^`WO68bjvwq=#d)4%AhHP}ae&zbqH)9LjR-I?J-Ko}n!3W;_qm;}a8} zlautAacsoL>v$3ip$TjxgSQO2@4NxK@0-C}_mZ@KF@X*BGfa3LPtv)QV7O)ZHP zrwME%gSVF@@q$Sc*hmI%3rlulA8aIp%dW}J?1PPDaEUaDok0`WNCuZYlXwxP32Y>T zOPI-h*asWQ;F4rgzRD16B$Gq0K}qajn!rXfo#5kzohGo6Ob__o*#{fR>%%Sl2XCG`N(--~$?1PPD2Ef0ER-7iVk<5|AAvz{aqmeN&8}Uzp--~^) zkxUtUbYz;qMlxr?KbU>6kqlnPlZUVmHj=pz{;$~w8_8S_9}ftcz(z7SrA!vG4>pp) zDPOXPeXx-XPRWvovJWI33{Gj1DfYoeGC0jhrr8G@$-Dx;gnh7)3=Y$i zeb@&Z$>1pp)%X|_Ssb~Tl$>3!;i7(Bh32Y>T zr=jE!xIq9mlEKqf@<{f2m2OG(}3V$5?U?Z6g@K0tRY$UT8{&@DmMl##rpTa)aNaiQ_r?L+=lEJl! zVGIBbn{+o7e{%$z&(UZ)P8CB$Erj zg?+G*On3Ox*#{fR^n`y7`(PuPBKR}d2OG(h!atXNu#wDA_~)??Hj)_)|F`Uejbz5d zpUFPhNMHW?1PPDE`xs&`(Ps(e0NiFHv3>B znZ@ugW*=-MvmE{$_Q6IntKeV4KG;a+Vfb^|2OG((fqyCcU?UlPS5xvb_Q6InIFC+V z&OX>kW)u7?*asWQY=!?j_Q6In-@%{9KG;Ym$R__v_Q6InZQ)poH z0RDXT!A3H@;a|-@*hnS~{~GqeMlu88U&}t&NM3WX8h3j(xC^%<1s2XCG`N zQvv@5_Q6Inb?_Im4>ppS0sjx|gNZ?1PPD7Q%m!eXx-X#>$d^VIOQHa}WI0 z?1PPD9)kZ6`(PuPHSiy1A8aJ^3jDva4>po{8~!8ggNCzY$Wq< z_pp)_i!a&U>|HGb0Pe{vkx|s!S|vj zUt}L_By%17m)Hjz$t;2YGW%d7nLomRg?+G*%!BaPvJW?}F*asWQya@kQ_Q6In zZ^D0#eXx|HG(+>W>*asWQ;JclY+t>#i$s7p(OZLG=G6nFzVjpZI(;xoV?1PPD z@ZC2MllHalqHj+6W{&(zyjbu)S|2_L)BbhVc|G+-jNM;gzT=1j`Y$P+4 zINZs3d=FHTuIym~8}ZMFAF>ZNlDQN<-snmb*huDT_?hg3jbv_wpT$1dNal9<3HHH8 zGJk@f%|6&j<{|j_Q3;yBMlw&q&tV^IB=ZvdJ=g~u$-D`_E&E_2nfKwhV;^iJ^BMg1 z?1PPDzJpn+0e^4y!A3I2!{3K}u#wDZ@b_gOY$Q_-zbpG-Bbi$G-Pi{k z$uz_7&OX>k=0f=Uu@5$qxg35E_Q6In*TUbQeXx|HG^GEpj;66=YBbf)_AI?75Nak@Q-F6Y$S6m z{A1V$8_Apu|5*0HMlzG&k7gfiBvTFlIQGFtGEMNuun#tpIUoMjqeXxkW(@oa_Q6In zr@^meA8aI30l$iUu#rqX{Hg4NjbzS)KaG8`k<2CVtJwz|$;^j;Ci`F`nH%As#Xi_b zW;y&C_Q6Ine}-SnKG;YG?`KHXu@5$qc@};>`(Ps(ytg6Qz&_YW<{kKFvkx|s!FS6i z8`%dN$$SmJiG8q<41Vh;*~~uJNM?_{$ZugEY$VeK{&e=iMl!#Ge-8U#Bbh_s&tM;H zB-0oEx$J|DWQM>$kA1L_%(3u)%RbmhW<30v?1PPD%HW^RKG;a62L1)?gN?}T?1PPDUW9)$`(PuPH{svHKG;ZR6Z|FYgN`$Yc{GVd(CH}c&_5YE5uo=UA8Qr+~%mZ&{e?Hyh-@)4p z?j`=M#Qm4E4>mv3A529}=hiltO`+T7M!ucqsJU`Rb5K-K)?5}8O=)ThiW)0x%8K9? z`CsWAx45sz(`o0)H|X(v8tXCVqFuJxWvG^MU|LKZpMR&vGfs_{)`{Q)&qUx7-5aEc!o${$tvD zHGQs~ZV#aU@bRBcWdd|nJ-<#Qj9V#cbMqTXtmn7o8v0Ir%3*%k2X20oi1qwRX$J9k zt;h2_-J4(O0{RUI8n?v!upiv~@VLSJ+-n?~|hy!~F0x z;O2K7v0lG#I_vMMkC%hTpPpauWwaf#e%Nnre)q`y-1;rZ-}U<4<;`!y-SPU-AzC!Q z=Vg9$W2ePy+e=Ty(fn|^z|{~2i>U+RK6aDCEo3-G z+dX~xdDG8fxLhxH$wM?x^01$2S4PW4U(@s3O!Mnao|{}7hG+Hs20k1FlgY#U_Les6 z@4cwN)sPH2^dpb@f}31hTLL}5#WcTdJ$ZinQW$NR-+nT`Vwu7IN74KH(eY%${O})- z1>Cw^@8kLVK_zC}(B4OK&L2m)l}^wtmW%07%IWo+N7py<$iw#HImNBtk>t^HK?7>+ zG?sod%Q4+jvz>73`W}ovlv_*t1}}rtXa<;HF8!yj8$GuW23eQV=gQ>u5!%fUyOheJ PY30TsILS4V>+pX7sW}B4 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/memmove_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..6d345b469c10b11d8fb93f824fd3edc35d1a4615 GIT binary patch literal 6548 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 S2DN1lMZ4c3zn{L1-9G`N;%|fi literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/securecutil.o" new file mode 100644 index 0000000000000000000000000000000000000000..03febc3bf0dcdbd890d6fe248eda2f2e1419f260 GIT binary patch literal 5232 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 b;*y?3aBId1qz3Z4RMq<>*7wKKYOMD!FV1s+ literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_a.o" new file mode 100644 index 0000000000000000000000000000000000000000..8ebf0166d427f97a4ee9beeeb22765072322c7fe GIT binary patch literal 132300 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureinput_w.o" new file mode 100644 index 0000000000000000000000000000000000000000..d6b2ffbd9092b2a8e8147e969c82f9d57206513b GIT binary patch literal 135260 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_a.o" new file mode 100644 index 0000000000000000000000000000000000000000..9b2548572d208e6db1b02720b1caa66287f13277 GIT binary patch literal 108508 zcmeEv4SZF_weOs>LlO}%Bq;KsM#7hvLz5GX$VD1MNB~nvAqC1!fpBs{g84EZh}0@b zAgCxtsG?03m0GmctJb2m*6T;AR;{9P5i4!2TJfq^Y3mhGlD_|%HM3{-91#0{_q}(2 z?{^1s&ib#lX3d&4Yi7^h`<%0{m{wXG3WbC&A@Mh1kPz*iA>lzdK`M+Do5Xb@CpVfm z;hg+)C!Tjf;nbpO#S0)ayvn7qs(AHE@V;|#@}3d9#i?22w;##Me&|SAcX{`z&s98^ zm7NsI8b2tsIVCB4`{1mRpZ2aD)80E}{n}COJ>ID9o|{m2|7sz!MsJ6tyLZaE2g^p3 zS5{uR`a2h|f98(v)v4OzgR9s67-d77)#QPJdkM}X%J^L=~yyoU- ziRzmDvy=k`XKrH}a^F-1qR z#?gB_dPDEsN3zC$`Z;>>#gqhbM8zMkw&TIX84 zcn4YDH}@Bg#qOS6U&+tM*C*P%U3$shZ9$)p@7V$Y`t+4~ZT;lA0i z;)4=rZBId7?JO8wMB{j=lNniK5zBGAzv5_Jt48bEql}g}CaDJ_)pNA*_@<0r*W4e< z=fx^0x@Kanh!xYW3%$|sX>?J~GwaA#&UB2&)QpaUf2Wbz z`!x8y83!-H=n((mWFa=MPZs$%c_}Gk>zyRMcCDHry?^;zNJOO%mtOqUY`6DpMSQz^ ze|622o45sIx6`-#r-T2PT@M!TF3G#(VEEWxXS_a`GOqWkwU6GU*Otz;9wKG%?GAp@ z!RWbKl`?J`LlHvV^(oXkMH}l3qF>beqmtNX`=xYU%8+fOrQ>zG->=ZX(WD*Pu-YL?LFRDj6ZslH983+U*zXNk<0TT<|Ddvwc9;n0 z!_DD;$djU;K~u@r`PV#pBm3dD{w!KAmaUf@rS?kKFBR!c+3COGXq zXx~3Bn=v&j(prqs-V1MEc6igecbI-SB}p9Kbk&E9)*6Z>OIcsm~VVrR*q}v_X$G zT0-57{V8cg?S0_{toNunw#d(a^v&gh*`2p1@FV|e7=5J3%M@g2n0UtQK z-q_ShJ?Y813;xhMj%PFu-4va`=#X?X>QCt)YTwk;HqramXZ1WVF}trL3uAw0A8x%% zt@sbV|Y>zS-MKV+HCJdn<|sIb@GrR@lN4ExwGN8sC;2mc)L$Ur^q!9n~J#7vD_dtl~x)MtdF7nc}bCYca00qvKHkO&O)e#k8N8 zky+SRKoeQzA@6_oqUWM*F7EAJ`2yus{kJv(JQ0SE3<=g zcE{S$NxetYHAl9iwMz4H--Qocvu;08UGrmQ2WU?KYAxEGvVLvL+c8c!v*~$soyn@K5!>aFDmMK9)`y}av_6Ey z-P=eHQ9nYX_&CMth(2#2t*ujg=EwRUL=7_+yL&t3{2a0^Bxu!Y?|rA_z#)uL+0ybe zyi7j2S=nED@YQVdF6N#NI-kAsB&?++pY}}Y zcsK>SXY7w2y{Rkf&J^qpOFqT!5PQY2hZQb#+oLx@nszR#KUfDstrz0HiN%y`$D>!p#MMivHh+yoPQ=&Mde4P%(8RF}t zq;jo+7>AJHqXtgC{|kya%JG_lQJd-^LYq^Tc(K#u{vDikDatE>Dqv$g5+4}U@}EQ+rB?Qli2BCc)nDT6RelS7jJI-)+xx3ljFfi3xY!bocft*@~6EyBG8R;3YVNqnRLIG13@|HHSBS z|7i~+DS2PVU85YZJZ-h4#a+!l9V+fN$oZDkp|kc=}5yXk=~(o(+&#z zQu4J^_IWK&tW|0=u(guj)Ne#{Lp%ndSpY@^EdJsIAg# zv~wJ{S;Mhki!)Tpah%7>nI%^opcnL!QLo%o&l_dN$Q>19x6?m%k=?BOC;~DI z_S2DqqnQz7BnM8EoT% zlC3YSO?jv{BLzpOYxiSUB2r@4?+@&l=`17BH=LQLUMuIO?Mv6xC*_fxY6N{cT5Ob8 zvV9zB+xLevQt)1K5PslTjH_Ymc4VaBh>L4v87Vltr~>AM2cPEq0lQ2h+;5IR!go>pZX>HH&(0-oz`M zhuQIDN$hu&LG6|v-?5O{h$|>Jztb~co&)sky^z}8`oh2+Xdlwpu2acbq(39=skly$ljT*&V`{#=L5JVyE;W4%gxznaNVR;g{&sTRIVpQ zy?VVW>K#%->lHY3{iuMh@)yxs_$;km&wiiRuHPfh#HAU&Kc7}U((RZ$Ud%_pUirMx6URSt^RJmAlwD{7*J$KzRuoEM}{|fmhQ7MM@Ct$PLx>`<=bUe zlSQ=tbV#<*%)<&aASCZ)} zvU|k`QK36QII65Gp%#CIXycm1g`K!2D6bEaCEnZMs-2W^3}2@RclThW$&|6BT?6W$ zFYD8lFuIqauWkTib>wSQT_x%&8LqpLMpuc4@pBm-}*JxgMHplHYc|q(yis= z`iO}Ubk?Vo9V-eH_5Zw`dbhdbb)18id9nI~g^5wzj2IZ3PJc&#dWhs0n?pwDKkxg} zI=G+Cb&9O<{L@`BZZxKcHYa!QhQ_N2y}2!ABCaOxp_QKIlpXo4Q?tgtduZ=ejKiU= zC0W_;9@sIEBP-?&b0C-fh=D zDi8gpJ1w32Jy3LKg?5KW^$(wnKtA_`?xk2gdCd>8V#t^!(b{6iY|7O=9gkm)JB$u@ z&CIOKqMob~>f;!^%G)z)tVVunIqx*gq|N^KSe7h-8nnnm{Lw2V=Onq&y5M~Y+O^CmD!GV zw)D^ltsRv_S8R`%93<{nLueVZv*^eho38pKSnDiYnbAie%&Q}BdQ`AGigbB^PO6CaOB#wi?%mn@RQBB_rqe%(}&nwl!G z+rh~+F;n?P(vpNYH6>L_K?u--{*&zgeIe)IKKdvLbTug{NpgherS>6_2#38seTeWp zMTEm))=8EHq7+$Vf5tYn)zzIP#8{vP{I%h)PW^%Hm$41Cq$XAmLZgzKBqQC=*RY5% z(c#=2yn0D8c1cNnY8zSwoFtKa34cBGP0$!L&6pNi3K|P5N-BLgk^W8~D<=srBo+G- z%S)9iCxR5-lrFsXOPYq)zBl59xnCzPlLbVwM}5yFt%vdAC9w}6Mbh_)?WIYh?BAde zwaWC#p(#FnN{D*xAu)W`m=L+t_eA1{DDI-~aM1lzlE_5z+&X{(#OBwKq{H&nldnng zwU2yFmai%DHIMsFTTAR8OVgd;*3HyQd5;ybqjHl0p?j&;XnI z4v}nX@fp-?za)x7za%oiZd87bT7xHsL$SBPV9%?FRCIh4=p^P>Q;$-aUPg33rfYIY zo#|Sl2Qj^zbWUaZBBF;gT}N~#)AdA;WV(Uqu}n7-oy~O9`|u%$>5Hk~6VQb#AWx-m z9)eH?BBZ+1oC8i@VxN>5TJ;Tl=$5N~w+2-deHleYx%@pDCDyr|Xyx)1v zqreS!F3^z1B-~l9;XElV8z$@CnM`>U?yO?CT{aT#tb_L`p-oPsd48jtl8GkGeo18F zG^xL{PteI*F~_*woqb5(>+D*kG0D8ntv)8dyv{AF*po;4uzbT6jDI05d!6kHKPqv! zvy{cZ>_ZbV+&P`$V|{24z0Ma`olbsHVZkd>&+B~biZfz0BJ^q>Ik7u`c}1pF!pmT| z#kvENbAY|hjaLX?dX6t0BBSngK6HgRlj?T(l2OSt*k0$otNdzp5T4Om-y}j`OMU~& zUgz~!2;Vi94>X|WG-|G7+gYKBd{p5-AlAxr9~amTGM^4I!CL_ z()ymSRi?Bm*tI!oBz4Xe_Mr~z66*TBU$IbE97$tW*oRi6aOXd>nIc&&+*#xIoWok& zht}(G=Q5q61DqTkh1H%rIiL^G2%d(Ng0QF|hqemgqXFiO|0F4x@tb^WpCqw0H7!3$ zVrvV|sIG4np}#1oCf;AA8MJjqtqA>1fjSlJKV#-_33YY*_WztjG^RZp+^-DE2?@VP zQH{{+R@DQ3)z_74x`9V6t&up$afcsGQn@6<{U{%SIxkX|w^?--_;t1g>TL7taBeNP z>Rj&ES+46S%X2NQ?Y`DrUyE%OTUyWiTE)H=FJNao!!z&%95X0;&Q`89a$nC@_0(9O zoy5yYm0AY}Ic8>PGlPO=25B>@D_im zX3aYu4KNn&Ox1vR6{lhCS}_l+wdq>X^9zX1MF6x^)e?q8`E= z%jGuRc22PE9No6cu}{L3bGn4OUefhG3A4|Oxh>Yi@twogm-^OBXW28J2SsYe} z&XINT1`%4UgUk&sRwkFI%>T9&b28$X)wRPn`|U8%{t=lKX`1&-x*Ms@Su?}(=){wB zuVyHZD%hhL%A*DB(G2BLxw96{3X@IR)~dzle9QPnzVY*e#?KELKVKWCgZbALsN?NO zfsTx_f3{_RpKt%{p#8Ih_RrS#Ih<#!aF%fk5v8n_)A34KFHLl;;S%aPAEz#CV~F1% z9UOvHku+ zhz*Z#Vty~_bQBl}f1Vcc?Q)l1JXc8#cHK@#rt$6Xsr)x#u}THB-Ye3Mq)yo!dD;hN*i^EPQv z+Kl2t57)abVDq+s&D-e273ZOB^LA}>9N7t77wi{XyN=cxI@eZ^ws~IXBUhZA-5kd$ z(DiJhlnr+Bb&2UPHZU}5K*ovQfMEl^HF#hsZ7`ZWMR)@yo%l~D&Ok4{k>bP?r$CO& zONzw)zmHPsLn_G`(4UM8Cn+aEmo!sDp&1z=h)y_D%*gl}wn2SIgTRh=f^YikL#RqW zszQ?fNuenx5=jkH)d6FnIviC`$_Sl!qUNUc_YF*hY#?ANyGk&9aOlK7S~bJSaH-4G z!v;-y)d!d1pzoU=jCTCWry57Y2-%SFp|1~-LFqGQ$c&7Eq4eZ}Q*SIBLXHmY!!98f zq&iI1RB-tCkX!F2u6J6ZL|HujM2t#$GOl947IjbA%49w@dgh6tZw)451Q9rX8e{C7 zYGfpwvn-5q)l`e475~IBLju*usJ>xbsBdG9nht_$=PV-$1ZSM#>l$cMh_fjVvsL$$ zb+H?Z86VI5(@o0v|0(|yf&YoX|3?w1!Gh(94=~$9p)UsX$E*B74#MNdf33c@s;Vx2 zNo8~VYc;hkwRN?z#)hxe)h=Dy*w#?h603>FE?T@IcRc>(f32lCCaNY?v@}+?QiY0G zV|`O?UA(yhHJd7%FVgRsEv;=;wT%_6jg56J6_?aDR5f1GQW1+SZmw;Kt;mZmu5W9p zTU_0=7@~@nOIw;78(S;dTAC|r8)9{BRq=|YwXH4xS6ce7Zv>&MSQd*_sIErpY8%>C zMySIT=Z?=CpQHOIL}OcPQ(No!+J-v1^IKV0*LrDFyk&e1Ey^veh#yF7X+Yu!Pe5ap zZi(Z@8U9*p>%c%QW;8Y94y7_D+1N73mEF586!MaA!7Sv3 z53C)UppgT|Fyd5|h9&Q4o*dCe)Rm?-j?0iXEY&MCECi zvF9;|vad9DnS7N}P}ZD&UAHY=lr2b#uGZ7!_Pi5)s!dUS%-lEB3CUhRlH<=ZzaQp3 zRn1y5KspgpYmePUyDv7M`(;ZdC)n@?JBYxxe zNSgFgWY@ndUzuaS%3cS(dn0HdDEwnksA9*dATyQ+Bv|PKT?swaIhbtcTTuOPTHPL* zpvo6o#j;3aWU@N!U4bh4hOdmK(qXT$cb{24`n8UPmGU&$r$w!+ic8|Xb zoe-yBBQK&6*#&E0^$x`H_$y0~o)pp&+2A3OlpTZPENy>2Y9!dbg!l)J@^*ymJg{lj z;a9e1bzE7qrka{ZtiyJi?|bbpQ+bTUOlABTpb!(@{@CSvT0=TWHWW&&^8CS2j-#1#`;^da$`K{N_^0 zMKzOIooBB#BEhO#QiJLo2s_%=j0+fMO{ zyymM&yFuXxzL3LbJ9aWu^;j~WU-`Ht+Y1`oc7o0|yWf`YDlynqyD7WJk{>kusBf5k zx=4D)bfe|vv6@XV&kK97k=N0PZNT==rfnTb2hIH1F~jN!nG~$_iC-x(Hi>OB$L7lz zW7c>)*CnO5sphzD*@lMdZP1bH`UZo*-rG&_e71wY18nPj6^?D0>)MH8+h?g|Kj`vP zM|C;TfaC4s9rU}H7+I@Q zpf6v}Z$JYfZ;*VIn!yG;PYikKQfP;VP0D>!P<o3>j1Cw2sTel`?;26qMwrTsre0dgn%%#@OzpVQ;w|t z%3ibPFM0MqDR)%r9FXOSBb#W0b#^7L?GH&^%Uj(SSp$4^8XlauoBHdCYd2-nR=|T* zZ%0+T@0MaP=f_$b>z9fcuBNvNNN2Ux zFO4_nPbhDk+ls5U%S2OURTaJCw(-2mI#Tfsh=2U@{MQmL2rsT2A0w;tS{meK;_4ao zO?9HBc2#_FtEjrPVSa5@YYizBH^<|}b&Zv+g>BW<@n+GAE|lUEPWaFh`FC+!V{2_3 zomf%1xURNEc4lf#WwYqTYrvQnyA*VwQuQ@*q{wA3zZh*xFO zS8S>ffVMaqtV94Sm)6Ba<%-JMI-=&1zkX9?&GG8mm6jQ*eF*|e8b$F~W0kBh!>>>p zuWl_-hul;i6AT!Pusa;m%dkH4Ta4PPx zRJJaRH#dqp6`;Dxme#oxBoQlaY_6}AotV*r{v*g3y=e`NZOdvzL*s0Dhk+d`nqBVn z^%Cg>KCz98G|-i;6hLx*?u>=ge79&wXE(J{9?ZfQuF4t_HKYesZb1VgFod#t*|a%R zr_CzYHDI0+NOzMVSpqZ~G7FK+=?i2w>IxL**|FA2JrI5`;CC!8CA63sgML=ZByT`x@eLK-uWz(r zD$7Kob?^ccBKDyfy=gf@MS1zqRzqYO^FIr8YIaYIiGj9IY)>p@X8yX`m_2^FoYiK3z zlGfL@o}ZZmL2Fw>{CqM9x~Z+DCeqZ{MD?qdx3#oJn&ZnFo2%l@hJ*Xn;Kv$UTEVMs z0!6s7iD1hmwXLz5$nv)OrbsItN5HGAtBu50HdQuM0bpsxV%89;T#E6kjG@l5%*brG zffeHXWesiUO{AI+Q4ty#AULj$1pw7JXySmhR0-T&s+6|1GD zvAH!8Z)mGm4BSVrZ)|`*dWV*q+hWww*0yHiQJ}CQfmK;oTiL=5$)L4hx~Yb$+ZrSt zv3O8l))3K>mh+>^81Cs;wbjKVwGA!WNkj_+uqsY1;Zx15Sh;LjbG)Sm>vE(HYcPeB zlrVLTli#NpL*4RsaO(V7_5ybf-D7I8qLxJK>eQT|4;-eom!~U7b$&9U55il+L z3N*HI{*u|II*wLrt#m0;i8wE7sK-%^x?qPJAz;hCp{C}>2r@1b$7e4Zm$gy6RD!H% zti$MFXz}@p>e_f+6&ZsJ2fj!gM}vqA*ZJ@Q{1sSvm*Vptt(Tr(gU^7-QK#%eb$?mm z$yAABYjeE5vKH&KS(`CK;>~i$B^M*wj#SsT(u!f$54j#;`S2Gwb6n$vb2dIF;vbik zuv+e=P>WR-G_6z`w2~H=UQoho>iii+<NWaT5#CFUW|9I zFu`l5ITkg*6fLWmS=hr;FUr4NHcg0JWo)XZ?vlZDR}_LCm~IjUZ0 zLl}C(do)Cfu!b)X*~UN@4#+85qxHrbJ^9TuOSf=9X5oeqSz9D6CCYP@JUoXKzC=Fj zIP#ZBo@upBB-;1=3|DY>5_L>p!Z)zam-w;zIDWJq*N?id;D;Qeqs2qVQ#K>Mv@h=; zt1sF{c*$}4a^-R4Hy%gcbo5wQ@oqhykJ81X^wS#Gnq$S&(kVE;&Sk9fG&6X+4$?W!g4)GjEOJbLe3=0{c%}%9J!3?vFl4Qe@6=W ztV_{=)yXsIcy}aO=J~PfhvnfgQ&&{)_OUSB&at{67ee_FPZ6STfb@}PHqoZs#r4sq zoW<4Ars(1rQLAcWEzKYtn*{OkO}`|Gzx>??AaI|pAN;xd}X1Z zHVM(EMXloD7h%p)nC19BhE+WLn9V;aJO}S#;F*@3e(YwpgIzgcd|5>muAix)vM0Y$ zBY7+@a^(1mj4CWI)lk(Z-?-rW8dmYpvX(uE(BbD`9RE`t{}bgw|5+aO+h9D|!Ny;f z&vNA2CyET&U+Bn}I{1DEKjPr9pB8MduY>0~xXZzJIe4doA9wIm4yM?0F(Xab6MaRs zlH@}t3{3qsrLPnJM0qg&ET`|SaA7<`LuG%wgC{t6qJs+@Y{rl6uXN9 z4mRV%_6Pa#V?5Hq*$&QeFvXTjUroq&4`&D~6lW~n!@$A#_jBT(C?|bz?Mq-L5`ipi2EASo$4z}OlX+Kd;`es(M-1x)z6u(KvqaAG46PBC#$hh3mU*KT! zoeRE(ZWRx|nhJ~1}yCFA9ee3gT*cJLMl zoAs6LJ?hAxa_}<_e%`^m9K74X6iY7n*0NPRks)4InEDh3o@vSPTV+nX6Xm3DR$-Q> z`8F7v`O0{lBcJ48b9`fcbNpp&<`d&ZPW>egu5vK-l?%R1X%$bLEZ$Lg8{Wgf!FZhP z#3NB2j0ejH`E4*B>EHWs4g?$o)huzudia|ERz`_0vcKVknC;en) z1Ha`Z>!&-|93NS3_AiXh{Aawvseh$|*E`t6L+>_O!4pG7hB`J~4ptaA*uNo8{}ScF z{;}NjkFn_=W79vzCSMsZ_x)#V`pbBgBPZXv;9Ij+@$d^P<5d5sP8c}YzhO@Q66K_C z<}1rhelpJX+hjc6!G#Vs$2- z<1{B8iSl4PSZ?CMc&OhZV>AAY&G<7m^O^BBgT;+3&E9x^ulV{Fzd#wH&a=Q#FE|5={z$R|0N`o`r9O~`i- zKm4~$_5U+)!ob1)pXu~JQBL|M-&t!og2Dc#nfWcJKiQQ!KfhsR{Y+;fGExRqq7}&H;Dx;kKC(48U zXZfkpI@c$;nO`h7>jz`A|6yF@)Gv0hSwC3cm9to!4wNF^cyOsc=%Bh z`t@8Y+wd0#4#sPY6R$*hFkUP_g$&BV_;d}GeKS8J8)`-yVWH}Pk=Sq~X! z`>irAaIjh5SZ?CY*vwbPO-_B2Z{|otDxSy@e^dRN1snzr_AkfjU!pwNKbD*PVr=q@ zv01+uoAsUXbl-o*23zSF-%d9Z&hH~nL5`p4MxkFn_wW78kTraz2LfAXFFOcY;N z{kaE{u$budXQI=eM0v13EI0jOZ2H64^oQ{{-z&x@-x!TbQNz7OAp8`%8nBr;5Bq#of@?iW~ZsN~)f^U$q z@q#h6&1I4%GB)|n*yJ~3GyaUp zS1yw^A>TbQMXXT$DFY`A9PG~&r$32u(ogoSvOLYg>y-U(;1`h<3D3F-i((z`c)2Yb?^!YoAV*IXXZcSs~!D~4!+L86iY4znvn0F zC=%OMyoVwm!ob0J7di1xln3L@@&SG;j58f<<~z&Hddk?$7sfSC{mUF|`p^2?9QlI| z?so7?4&LM7_Z|FK2Y>G1eriuAR6NrhobKRL986=u#YBd%CyK?-)OeLcCkz}MuVQDs z66K_y%Es}^@>4AAlOQ}XUD`MEo%Kzdj2HTq7%z8lorBHzvHs_)ckoOH z&vG#34wqt0$afE;{iMn-T64m{W~@nNrjuWZa?(#GRasbW)&s^S-x!b9>Z-kb2NyVa zmV@Uxc!7gWK5~029ry|(!6g_CPn3#XDqgh4gn@$^rB1vO<)m-sBg^}#)`YTW z_9La@9n~Jy35oB@_C`4R;~i{P5w>6I$mck?#=&O3a{VhE`9=qKIe3SI?{zT6j*Ib( zuqS4T&s2YDO$Y-A<2%cVZ=#&^O+K=`FBzAGak_@e{!k0|RUa|S1TQ2mlkJbS>n zIq94HVY%rq<5T@s8JqqxHuI5jp`&l|h2>^FW4y%CuW|4y2b<$5*I(_(&HBc2iVYXD z5)k%8xhPQa+X);74#uzCiC>~T7(bSq^^EawZXBd>Ka_ee#9NJWa@VPb?5Ig2Sl7+FEuZ*W?v1-4-!6v_0-^7n`wWDwHjpZhujLq?d z@zqZKTO8cw;B5}3*l{sOa>AZiA|6!nB_G4U!T2t5;+rTZeUqOoH|q;yb39@^k{XwV zv57xpldp`6w7T-I)WK$zXMK}JjF&k2W;~39R6Ma%{947M5I77RjK@+Z9*J_&H~Gf$ zzGPe$#wH$&Ptju4UZ#U{96ZUvCO_F8`OamjCgi&(s>GYBfBV1*0|)z8<@7I6PWooN zS#IVNW3yf}9_xF-c%p-izbrTNhw&0ezskYQ4!+F6?GC=$!FM_Meg{A9;9U-W)xmol zOtI!-JSXho+YBG7@t|u6Vc_6+R6FC5C=ZSY%T0bU92aIo$g=HVLaNw=KB&X z*PmI`@iy0&SYG7RH`kX~ZmuVpm5N;SM2+ZG`LYT)3~a`NG-{lDNtBbmS)W*L<}c$B zWJ(sslQmTBO?R-FudH9=$eSE&@`3fKFI-Gb!k$@Umv zvPrx$HuHt?a7RAY!Djtp{bEO6=HP`6u5fUjgI79ugM)8$@GTCeSaDgd3Hk2f$@Sw^ zJZU8g0|(<-=fpEn9*if;O*|Q&;@OMTv$J?*Z1Rh-IX*I;<>=3Iu$hmn zztoX8ICzDFP5yEH%N+UT4qokGiY*t@5@Am?iA5^@MZjU;VEmh$_$SJP@n^Y-KVuXB zCef_gOGSGj@jcnzNODFN*3Z^Z`7_zU1r8?PxtNuWuqT?udevUP6zX5I)4yh?e~EJH z-vBm_SC$WTu*oNuk9Oqa96a8^Q3sp+V|$Yv`4k6}k6c*atapsfew?w%N5*FUGG3z1 zss2_u*c=sD-^^;pW)v8k{UGC2j=gpVU+3WM7WPRHo@kZh+3hpg{yqo)!NG4k_&o=I z;NXuP{8tAba_|ucBhgi1|B@V>>|k^MjP>d1$6OeXb?_ty7dUv4gO@tE+QBsrZguc_ z2XA!nT@Jp-!OuJRZ3n;S;P)NeHyn(|sSehk3Dfg+vLm13;8F)Ka&VJ_n;pE;!CM`C zhl8JUFn*OaFuo%kJjKED99-q#8V6tI;OiZHi-YfQ@OB4xJNQKh?{V-)4%T~SJwB;P z!TzT^c({X$9lX%NRSs@&@Ja{Y;NZI)e7}Pqb?|NnzvbW$9Q?V1)BK-h;Q5{D;7JZH zbMR6J*Ex8lgSR^P4hKKt;O8Cus)OHm@MjKA@=tKMfArW*E{soiaJGZTJ2>j#dzn;Qi@tfmwlO=x6-yft(Y_9+GmDr3&KZ#Ae`S&5rewcqRVXtrB{rv&{{`)px&fhP; z+Q3U(WZh^L;!|%18KkfyC`T z=KGObea!dYw)>dxA65I9?}wQ6f$taW^W}WK-M;=v{Wasu*XwTe_4)c&m5=#)jPZ}J z9~Aj=KHs*F4`kn7KM9-h;Pu6?F0K-{B?)|LQkPV5C$Pz%RPkfr`?VM==}&;|-zWMP z;IK7+e+E3y!Vd%QwD4oVk6ZXjU~~NFE1m(K;J4RTya2q?!n=UY_2joP)!+=e`4i>bxGW(&^;zR|)Jz$Tt&ib~** zEqOJtSzofmMZi_QJWDhI*ZFvqXag>`@G4+){2V2&05Tw|Lhr*jMY^X%r_f|RCg*O7@rUhV786x)H#d?^+80Gs%iiu-}PeEm|f6ZkR_j%@Mu8 ztNr?OL=w)mO#J5vIu|qk&kz!z-Bxu!~);~U%p5z0yga}5>>!v zd>4u3z^4C;L=&*t?=2E5fX#ZjNL&Uy(zm}vTnRkc!W)1yeY{j$2YiZ!w*WW$xJujt zZ1SN>Yy*DPlHUc~ZsB`@&3>gyJP2&opDOVP@DyLaT09QC!ouCaODz06uzi1d7qE#> zwb%n};#)2D0Y7Hde;fFSh2IDM*uozJoBd3+_!QWzKh@%MVEg_zoy?ke)`(CRV)F{^ck(98u(SrVJ^+04%oha(+phT zugA?|C9r+H<#J&A`gc3|fH*I#!4+t*+3 z1GcZnJp^oDPkj{FzW(|IuzmgY8DRT*>5IVj_0?B_?dz+1f$i&|e*m_xpS}xhUqAf- z*uFk`0NB1h`5CZ%J@W`~8ukD>KJ?fv`}!t5`pv!`Isn+do=Fb}w69+d1-7qWW&+#S z3r7Rn*Wa>%&HB+SqQJD~YkwvJcWVgEDZqcQa1n5_l`k`a?fW-nz)LOpJYf5NO9k*f zmV7C&egC5d*uMWkk3_WZN3;Ul_cvAn+xG)j1KamY)&tx32Q~uR_d{*~F7*4iLTm*t zvhc0IOMSdjYzN+8;d_A1{9P&T2R3E3cmlY`k8g+g4e%^qp+me1{2xi0(IMUp)L$z; z4B&O*Fz^noE;;Cjp7 zi-Bnm#-&4C3OvyAXASU^mc6ThM_afP_(NSC{k<8O&T+K8+kw+9`*#E5LY^;w0J!2r zgMR^BZQ&<@^>>~H?EeP%KCAvKz)xEKz5zUAD0gC7tp6_2>XYD z|IP9@1Yf>u_4fqeNtS;DLFZfX90L4vtNxk53oU#W@C#OZxxfeT$E8D@2m04m{4M}4 zvg9*BPqgIU1a7qKe;fE;v^n&r68JJpzZN)Z$u9<`Jv0}LKkx}wf7SrETk@-bFR<)& zlH3}Pn}HWw`nLm5wd~yue5oaW0C<#ze*yew3qJ|`Q~YWFegpa@4bi_>eHk%ViZ_67 z@Z~GTTfndRxI?@Tyx;PlVt=|dzK4JZTbLfIGRdl+3cSGTZQYEP6qzK!bQLvEnEtGr{!-s@LN`XR{-0`rx>uke_0M3 zx9l|o+w1+M!1nQBHSiaRk?zk1V0-=F1Z*E)ZUjEv8qZsS|7_L23)sHj{Zn8(e^ixb z@er`R-}xo5z2A8X_*JX_&jZh}`tvHVDNW)H;3A*VB;Epk%+h}!*qk3UiBEv-{o!Z8 zZ(91jz#m)rlpOd;=myarxZQ8BK@0+}vGj)r^y@?xaFwrLC&mGvZs|t@`pd<6z_Ka=OxOIlbl}-Y znx^-1F@xkjt6Y=;hmqr4I>ds2{v5Fw*zDith-%;mEq@vU`emXGc#$@TGr`M%Z?(p| zJ)l2JTmyW)uRlxN06f&fTY<+~_*URuR{ZXA%sO8^_ zz^0Un*MJ}N8KvTPz=JIO7O)wwQt=*ef6Kp5fah5H{|Ve>;V*z^Tk%Z7PqIH_&9DBz zrpy$BfX#T!6vKd%t^SP+=ogE#f$jTaQQ*~9d;b*BFA{~o=K5lhm;t=m%I`S={Q~iA zU~@b!5KDk(Tl%#D{VAde*jyi&A}#?o*F!qQYT#b$_;wZW1%3cJ#0|ivOcpl-SNM#{ zVjJ+^eB2@K4(Lx3_XAJy<&(t20eOdbB7i4~XMykW^(Ts#fcIGOejRv%l|OF<>gS97 zz~=fyzW5lJ?n!a!5C;SL6GU%7e}d?fhWTWT*8pHsqT*!WnLZ;bh68W1^hX8sb3``q zEMGrItUu#S$IqVz^v8&YfVcSu z#)w}6-)gO=-2wek;sxN1zWyljDlqN2x#0XXpr0k)241ek_oAvlK zaXxU=_Xqd$fN!$mQwn^#FYgfF0ybrsr~o$OF-*jO)2#VW7tkLfT7WP24Ga;h2wVMK z3q0Fue`BEjU~vQR)qefKVk_|bR{U-c=$|Zp47|M3)`)>iCV#(hFe%`_#0sqd&9pXQM>71BLhv)^~WyK>U zUCZeGB+(z(tVbt_4B%_5{2Lz7?=MCGoAtH77z=!x)xX?;em`+8usL4$6XyfpZ~0RU ze9&rdHtyS6aR_gH^4Vq@|S__^Q%3; z_Vv2o1KZb&-vzd>Uw#N|U%&e+uzmgcu%nMhj0CPn`>ufStepn&J$$~yE}pnXq*#ye zprtF#!9yK9(!pmtIO^c@96ZIr(-gh|ZKsEEWN3-U+M44{^r&h)ZM>w{pzKq?6z%trFWcZF6R{Bt8t+Z_Ix*IXLDSyc(EitZR;G$a;u< z;iaW`wlsCjV$N2NMQ=eBJa8P(-ksLa*tV?3S1ZS3ca@T?RvNEvEyIJS@%Un2M?HsK zTXvphFRRU|T~?D&k8EF1ji-XokF_?|FZJ!o)F7eH(SV=#JGYe{fsBWNx5mrqQRCyI z(H!|OVix;PIabACUvMdgjfcxrWPS-d%hXJV7L{v)LEwCMmg71^~}@nv`j_KLWCA~Y&;2G0er zrTWr9Z&`vF9*fJVN@m%{Ts(|BUd3{gM~tV^BhOnG;z8o{KxhiH>~_3)d^B&ud1Pa@ zTzrTsYm5AoCMQFhL5)=s6@khot9F-E&BK4hizf zXnr2OP_=yNIVtB;-F(tJmsHNBy62MMT+%yN_D)Kv#<^r_BI!*ey@{kUkyOs38s`!3 zJkmRljOON$VlJi)y^>aL4q3|Oxa5*Exw%q@LnFhI8zlp|vj4d<9=TCzK}IPzDlN!h zW&6Od|l`+lDmzpw`xiYM|`LbOZ*jyRe+;gRU8Qa`*rTufIWf|FA z8QNSK+uVs#Q-(NqqSTxyH7Cm0PL!5q*mKX5{gTnomEq4lkED3=xO^okEnf6W9!7Jd zROV?^jzUz9LR2PgR3>axj!0ByD^@Dn~GS4#gxY zvpp(PJDM;1E=MXV$0#aCCn`rID&rrO(TmE_iOSK5%E;%*tc%K+=W$=oqsZs+oXnwU z5wjL4Ib&y#CK zo{WEd2*CxMn%t~%*o>giB}{!c6oBV^5oc6#h11%TU@zxX>)u9 zS-)UzF;6*3(0E9KOtWfpWy7*~3#l@$t8Iv@ib`9X;kr~)njpVGsJC3X)B#iI@kXBF zjfM z3%;Dqs7=;UTQwr*HMrCla8;M&T1<6xIw%+9x=efuQDLE+c!ksC8*!;+aLF{dss(u< z1eZ*Kt1QYD19jw@0V#C?Qu$UWGXzKtgq(|{OJ2ZNiWhuUVUz0+ED%H;&DHIYMbx3O zLmf4Qau$P2Ap%!LO3v!yLOD*w)AVr3Sq?5a1Fq^h8A5Byo?HW9ml?B=klemFS&3g_eAqrjtnS2*Bmh(kUj7Uf}X*=>(KVGjKUBIz8oz1TObnC$C(u z!R4Oo)Rya3aiPrk;%PeZmIn=H~CgrD6?dm z%2K%|V)V!##8ZugJXRn!at}oBqzyY94f$4BD05{Ry+R{b9#RSmVVCW(+dS}x4`Dm>2)Mm9+$x8*y&}4w`IkJa``EqrdJ`}r%5M#Z@3q7 zy@H}<%TA*{2UM?WysHD7BdQm@T%F*#a@Il4vDJ$sZw$faQ0cWZSI#@IIRJWT&6NjA zusHyF<;|7z5Nr;BUYK*`gan%dpx5nOy^!a!pituCY4WYGkQ^zTMz0hMHpw#_Dmn)2 z051bz>p^9A3)#zQ@=Y3%o#Q11+7toFmZ9MF2W-DdilCIs2=l51xmxRTc|3Rl0h>Zm zSV+RcX}*feR^Ch(7s`1LU7cQ>DV)V%t1RXXIJL}qCo{iTXFhMbi)F?Z`x(nqMdo&~ zpW8gE3ON&WZ{*A?ER^m}qgUCG4yc~PxjfSgIZJe;cu|l;gC$MX<@H1M9BY7P`h>5> zQC1nF)wEZ<1Qv4Q=Qb@qoxXFzYC{P3s@-R z8>a#~FO{e98|NJs5gIJWsP)2Wcw5mTuYgsH#f#hO8*xn}kEp8J6-3p?>tjuqic9#? z2F_pW;tir2=is8gvaYT%MklTFS{m5GjQS?JpE{AQul<%Ud=j09KPr>(mwg{!KrIFx zp)YWu&^69%^}*037JVz|balO&Xl>^{(2)nY?oQHwkm&=KKG9lV;2N;jPX(P#Ulc>3 zdx_dU(ORGGfogsFe6H3ZTI<{aI_)90L-)ATe$I3z>}IQr)Y+gT^d&TuDfr8NglX!# zrmI0~`$TK|D?mqn!TNMhBl}UNZ?W`=*82BY`VW%+FIj(=rBAfhe+#s>|GA|@wAP{T zvZT?M=1?+;{uR@7k8NnGWXt<)TA#*xnBv>xJ_r2l$GI-uPt5*Trt?8-J49LZ4#|@$WLvPXw6>@I{P`U+e-9rm>v!~?Rln05KUi%M4`B)y~wo8 z?cXv@u}Z&zGDMfXe6*N_I^ zJJEJ%>>@9-P66oj$MAwufIqD>2y`}mi4%qTrRnh&E$zI*I+Q=zuQELnbef`QXj+Srp|7{6+RK{SxT(-{J*@XkC~3nD#pBP!2@)GM!2E z8%)#uN>d*uEF%7!%x@z8KBh+#|MyJO`jhqtre_kLzMP8Ej=!|Gn5Otq6_|1%a6luZ0-KH16sGuNelrC-Q8 zL~ETnpd;_GP8I2lVjZHj4&`n3e%2WYI!)1&Nnd^Oj%ckf`}IES%XXDbyIpCMzNm{r z@yu2<2$)}cAB?GUZ)P~5T)unzf|u0C{1wART1 z9r+9E%p{!{j~CHe=M>OG)d%8<)_k%*O!0}T8gZ;xYvrBAfhKNWNueTf<+6MsYh zYG|!968vF`PqgOKe2IL@`m|nYdZ|UznyLBgEgGZ<{U_I@*O2ld)uQ_m{Tb_|S$tZf zv_AQ-Y05)QXIk_~i>CN%9U8CDLAFn0q4^VtrZ1ACP@Zc(#Z%J-L?31yYB%k3V@K2F z;77h-eii8)VS1%S-)iaHM|`FKghjt<(eGOHXBJI+HeGiB=m>rB9fj8Lw7)Yw4)oAo zL+f#*xi(DkiPn6YcWHt@Y(R4)5@Px?i@x5Xw_Eg1i+<6f_kd16%y~|ce%Z*C7=LnPZBUIhM>iGRG8O=9r>o zjwxE^n4&W+np0p&5GRcxQI=x(A_{3n3U?$7%3 zKt~2Jolg9dm_8Ns(DE=|`TH_D&xZpKQ+%Q|pXO$o`eI%_=ydg^1ERGKje8pXAO#AI zbwttCM5i-Ae zQqb9_GEMoAHiYSk#2?Bu9V61e!EF((ZPMBjp&!pcp&U++u@2E%=M>P{!&zrE=(N+A z&ITP(AM!6J`V8h*kWMDkD~MM7%Pf6)Tt1U^sE=tQn4U~@7Sn~KKay#=?$M8Upfuwz zZ8X!AZ)u8u4`{7Vv!~{Wb19(ORG8Z#MmS3(5riX&s`q z&LGf{b6AJ^o|eyaCg}7*{GmIdwLbMd?OfKOaY?5iUqB&R>nsADt-jz!@sH3C#-KD2 zt-i=heTn=N^B)DBHkoM|^Ye}U>?uqyAf2x>P4*)NOjFz<>dS1jo~IQupVk?zvxE5b zqckYb5M9LdtDv?2L~H-w2c12Qbv^>E?R-vjG4tuPBwhVzC(*hteeXBBgmp#|O+S8v zGM@C+7!j@Y_UE$>^=0S-oNq+y_?!-UnBo(y`BO-rQ%_!_(|qc?UI&QQe3^R-xvj0>r@x9p zKp|S|(3+X{&#bc(^w0%{);f=ZKTPq7*8JU|)5C0&XwBaTI-=T5f>_fsf8J(&JAdeV z8Cr+(C#`~gC^w&LgIJ$vt^W*Y-R|#5NA;a(t@9pe?Zc;}znFbE0($7T4XyPBni;0}L~DK; zX#bdH@##Am>67q+LbTSW-~Np(Vf#g-^DEXNTIX3-O*;R?IZ3qE z*#bJPlI?E;ovnVX;B(SHMYrgVuhwlFl1w5QS*1vw`^k!F-}Me=F$hD)xtd_cuGv^i!ZC)l5H6{AEnAwDzG0bVU6q#8RSFyLF(m>$&aBY(F|`$MPJ*)6O?TjxkC z)3jC9`b2Ae+UjM~4~bE~@TT=?+0`_KL;JG=bT+-9+-UK)5&shA?g$m-xSCKGB-rP5c{~PqgO0 z2wJZ*boo-RUGzIp*{isZ^czrV-(~uJ;$Oz}0pctAGtjy&#U=DT)|Fy1=4~EPA>{ms)h0MVDLj0*kJ&=p{sVu%A^Hzs92LESiqL+Rs*^H*npR7XLDf zUTx9s7QMluH(K=d7QMxyw_0?UMQ21doB8Yi++e`HC~Spt?E8z z@t?5hZi{}-qF=P=T|_H8yNOou*=yozJ`5%*W$lVw6gP&#Xn%tpAxO?XM#@K z$aV@qN3LZ$A9VU7ye1H>=UOr7wCh->jC5uu;Wc<~Xd!U6(pdsJvWfMpL8o2MG>x_9 zW7>&OC-eIeeFM|@nv)1^X8L5Jw=g|~=f5Z)TeO z58cA_9HM`~^n9Ybn64uFhfLG2ABS#b8sGdDq1%|=Nc1+Q?;!eirhiKG9ZbvIxRdGU ziNBrcmx=xn({fDjV){?S|1s15LG%u$4-=z4>3)9%h1o6rr*^G(SZwP zHPH_SBv z{XEkHF;z7GG@@T%{#iu7$n-fx|CZ?sh<=G_+V6#4X1aywT})p=G))c^`hAwrE6k^7 zIfPP~|9zrgW&SpzUt@YZ=&ap_9;5jGLOTD({Ktt_C(M#V@z&RuTOc z>$DQB{A?#$`M-teKe5hsqTgnkK0Xq9hiUrQLFiqkY2O(7Gt+d7H|sq^k5PQOO&i+J ze7da?dY@^!MUnOIh90B%DPV;@VE(B@f5`N3yk&i4=rM{vigf;i`T0a+eLEFH{B@!~ zX8vrVKVf<<-m(t-ug1;D}G%6A^b1-Rr2y)`9Qoza*YFXf$R34qVdnI!5^vF z4*s{8&qLN)@_)I&b^FiIc->*JuV5o!c08NQsQgx2x#YS%`$Q_%odNsy-OwVwV13Uj(l& zz6ACT#I8uL@e9lauG_Ou&SK6J@P=xB0dFK`znQg-ORn4hfyUR7f54llc@OR({(yBi zExB&Ldftu}=R+&(CzX1`ej_tW_2J^_dNU&D3r zZBVlG=H*S0UYZvR;t9|!i8Sm~|iAb1DyA*{<4 zHy5~WKbFSp&V+rNc?!IvdiHNv=_@`bxwccub^D8GJcs=k7WXUeg#F>`@3QVLS{JU{ zv;V?MKlvwNzdrR#xWD|<$u)my8?M{0pc$Zs{TNnu74u%g3O7!8r>@GhR9+h`wa+w70A%8UM4l22BKa7i7$rt7GIuR8(ebT{yG{T|A*my)I13f5wl;w+P)>%?f=rSF8lf`Za3DnR$eLJ=n{CV}m;Njx^lWY5zT(@UmhsB)Z-~-gK-@VF# z;xky6jZ7|Z-To>X->+aFd6k3I+z0!;H0=AMa&K2m@9P_4_p>MDnc2PM}=mt431JdN+m9Rd41oC75{z2v(6Ei|5aAMBYwfj#p#@FcDKJUm(aVsdRt$#whJXgu>H z*fZBzH`z1UZ&_uk)@7e%m7~SmB-f59xo*#X%Ziy}Vb7TbPgDOTc)IwMr8o-aP0bx$a{Zhu-KNb`1owuJ=rt+z@E7~e6rTv2R=nSEV*`S$#wftG@f}Z?3wJ(sq$s@XThh5 z7be$EFS%}i35_pr*Ta51@*Q}A`bXh2#LM9`#ZM*IzEX1C{y7@Yd<{NJ%{%bf;`dqi zoRaJItL76=#n0Uk_M94guKId%ZDGlE``$F?$+I7&%2&mM;q%2qS$9#%b^DPtKE2~% z|J>Q|*VNC4zb-y0xpqOxb^EhuJm(U)IB($#)!z+YB>o%-_MD z`4`wT--j>Nx|I!*FB7ktT)VvFx_x&V&)gFB%s#MZ?hap}b@zc6i-#rGt}MB3KZ?dP zC%~RL2fj-EeE1vUlagy!mt40$i^g*Ba^3!ZnkDj&!`F#_ z2VXD#1AK${rR3U;CD-j=r}6Rm2=?*m_NinapUvQ#wC+~$&EnSN+ASs5?fcSrCi~ne zW)6ov^GNtst=kUYCZ3vH`&P+y`wp7hxye)={ZSf+S6Lnd-kjD1`;Nm{Or8M)^ET%c3X#7}U1U-fRSOwvy*Hvf_C;xOiS}G|d)j#?Wk8a`C+1Senh`C(`sRxp-c23QZ6B zX*8RbTs&_%i)JJF4w{WiE}j>iN3((ai8P-oxp?07RGM|<7tpL*a`AlcSu|_OFQi$! z)v0&b=8YXord z8o^Q;zfN%%jbFcji`Osiq48@>570cP?J``v_Vf^qU&DHYW`!EKcx~%38eZJUWf_fM zcY}-9-8iiBeVvw7;0MKPzz>PL!9Ni9fFBn3gnuaR1wSI*8h%vV7ygmBAN*tSuJB{x zf$&enL*e_x!(rct83Fq~(kR&XF-F6_Uoi&u{fe=$?@LUCeP3bU+3rLedAi(zl~uZF#? zUjlnuepUfn!gnGHvKO6EAsci-i|*2dprIRe2SV!U~ju0gT1|8277zG9QHQ) zDfk4f`wZ;u@(S47<>z5|_V-oT+uzsWqc!s_*xTIq;K}kIz~0WbaM|{@ zbrsm#)-_;nPrJe1o_2@54c!nvN;7-FM~HjE-fs4Sy{+6D_O@~x*xSe6u(ywWVQ&-r z!QLkB3VS;^5Z+%uYY;q4JQ&_jJQVi!ZaBQJ{0Mk&@hI5axY6)u<;TFgiO0g;mQ94c zEt>-Gpk^BE?bj@LJNXWHd+|KDE}}A6@RstI z!rtyIhP~an8uqqk3G8jnjj*>bx5D1OEQP&IxeN9-;g!@s1$!Iu4D9W~3fS9)=V5OPUWC0Zcm?+D|EsWX|6hlFoBtN<+x+)n z-_Cyk`*xo9As4sp{0*XtZ`&K~R!YzFeFca88u;$=aJb=pFV%dmgar;a8{+e^ zJqsLe_**X3xvO+~INbC~uJC54T(+m#tmLq7!}pYj!_6T4=JIg3*$>Yf?Q?;{%^~7EM7T-%A4mXqWTgk)WW;(tq4~LsM_?kQ%Zsy~+mWRX5Dfm`-INY3p4|zD;oQto^ z!{O#){5JA%xVaL)tvnoVuElRB4~Lr@@VsF;7dYJ9o?O{U{e3jMlpOYt;`_7Gi4*oOpaJcyZ|5TdFIxLE@~ zP#z99>*7Br4~H8*R#fE!9J#>Z=F|8+}tWvon4#c{tqge*5b2 z`W?aHhQCEr8K!<1&3+|^{ek$;%fsPjBz~S|!r|t~*71);c&Adey%(mZuope^*DJr-1Nd9 zFAs;Cz|WJ1!_7|k`SNhM*$sb!JREL#uU+*^@^H8rfj?0m4mXG5Pm+hj%@O!7<^OVl z!wsL~s4P%FJ-K>j$zeYS{}p*S+;DNMo+S^5n^W*-%fsR34E#CraJV@af37?nZoY=+ zfkG~DxVZ#>o;)0GuEc*;9u7Cx;7`o|gDoqxM4Rj)hp!TaPvp}VtF{+u=|zjN%_BA;BdodVJg?E|0m6LC5QdWtERtR z9u7C_;BSzJ!_6l68|C3}vlad(c{tqE@i)uE;bwdM$vVz(xY;GS@@@6I)7)8d*bl|u zB@c(2gYn;yhr`Vn{N3_!xS53it~?xWrs40Ahr`V*JQvbj;BYf9x$>a;(`kNCa@g}x zgzCfcaJV@i|3i5=-0;?i>Lc=SxVZxVs5~5QuEGCE9u7A*;D0O+hnw5*kIBQ~=1%-i z7F{+i9QJFjmi`a&aJb>&Q1y@UaJbnV z|AIUmZg|L7eNi3`H#_5Bl83|1K>VNN;c&Ar{$+VM+($pw z4*RM2f5^k(rUUIhnsKW|0xfL8=i8izAq1l8=ktV{!1PXH+SJbkcY#~efSUM;c)X1{v&xf+&qFm zUB3%B+$>A3tXk<@;b|H^#49c{tphjqfcFhnw^9JIKS~<{~^h zB*+C0H@r8yx}!WCZmz@km50O4?f9MK;c#;=erI_&-24!~i#!}|ev0oW4~Lsy;rq+O z;pTUE|M4g|+&qUrQ|B!lZeC8V_>W7yL9>Tu!eP(*#;b$m;c&Ck8tM0xhr>-bJRh#g z1r9eG(eZ9u7A<c z@^H9$3qMaD4ma=P=gY(4<|8~0wsL{P&1!4raX3}|`pMPPN)G!?@Tbee;fBuu)iCBlRO-59>Cu$4~LtF@wdps;pQ>?t@3cV`6>Q3 zc{toWh5wd39BzJ#zg->vsf)n~jqz-&emC%|j)JeI5S;c{to`k7uVE zxxnFOm*mQ0>UXDkyyUPSjDJEN4mbPZm&wE7W(598c{to0ivOuR9Bz)l^CV3!aJU(t zT=|vy=`>H59QJeYzmbQ-&3rsNr^y8lH>co#Cl804Gw>_q;c#;<{#kiA+b-=sbtR%}Q(MdH#X=b&{(el^phbR;c=Kc{to`iEmk{^YR0Sn^t^99u7C# z<9T5)7dYIs;a8T2!_DXLtH{IQW^eqe@^HA}b4k_J@&0T5{OmgWpUZ4maP&_mqdj%_I2D<>7GiIDQLxINU79 zZz&Il8~(O7Gi7QR&;4ma=PLmmz{ zE#1=B<>7F%8h#sjINWr@Zz~Unn+@>W$;08M2Y!2bINWT3?=269o2~IX$iv}gJA5B` zINbEb?Ku3c{tqg*|+LW@^HA>3%|2G9Bzinp+@^H8rh3_v9hZ{aa zS8bDr!_61*7wNJMhnq>smCva^mS&HV!~S^uAbB|4oP^&~9u7CB!_C?Fz2)I> z!{_y?gXQ6Ha}j&TT zn_L;8{t+5>B9aRn_K)L7%ERGiIi5E=ig47DLL$S!%vlm!wsLQtR5{7hns!z)8yfBb1;6oJRENL++}r!JREK& z;b+Rj;bs<+~aI+MDiaZ={?#7=g4~Lrv@L!gP!_C9^)8yfB^BDegc{toG!(XP; z0*9NYk}Kz^e~xBh$zlHz{ycd&-24^)Re3nv`~!c!JREM`#V?YF!_9~IugSyVX61F$ ze_b99H*4ZAkcY#~diV?F;c&AN{vvre+-!!wSRM{HTj4K}hr>-P{&Jm%aJbnaxpI~I zU1_c^IqY}GUn38Po5A>R%ERGiKm4`waJU(PUm_2On?v!}$;07h4E}m~INXfK-yjc% zn<@Ak<>7EM1Amh|9Bw-BH_OA}<^=pL@^H906@RNd9B$6U-zE=-n}zsq$;07h5&jDO zF5qx;X>#Q|>aV5wZpmSP6aF4~INb2rzgRyD4mbBFR~}OTBbtXx4*O;J zAIihwW;vcWDdYl&n`e?MkE?%yW?9K$|7ZM@@^H9$4gXVlINZFA|Cu}-ZuqQpb-6qo zZYuen$Li1J;c&A${ulCaxLF7POL;il@R{rCQ}S@Q*%bdPc{to`j=xIh2^?-(lPfFK z_oexL$zk7ye@-3_Hv{p{%fsPjFZ>_m;czn)|3`T^+#G;^K^_h_qwp`v!{O!#{7dq1 zxEYK8lRO-5CgER}hr|T;pRB}H*_At;pXJz%IoUSrg@{}us7Gi zApT$SaJYFC|A9OlZl1t@C=Z95pW{E0hr`X&_H+7uhaC200g*U6_ax_i7U81PkA`p{2RZQJREM=r$lvcc{tpxjUOxzhnw~B z`^dxLW)u7nc{to`j^9@v4ma$xqB>L_4maE4hsnd?W=H&f@^HB6kN>7F%Fa7{|INa=yKTsYHH|!ImIzk=}H;3a7l83|1QTT)9;c(NAA1M!qn`7{! z~F;@fVShgUQh7MsT!g<&9u7BG;4hbl z!_77LE9BvDa|3>{JRELr!(S;6hnqX`SINWS=3e|a*e8a^D_QM{f^*p^ICG{Hudk*++K3n zw|px7Qh7MstcJfs9u7C`1E+eYJREK|z~3bghntP@ykS2VINWTJT)AKUwlv=>IqY}D ze_tLBH~sN^@Ff>G-0X&bNFEM1d*Xi}4~Lt5@ej+x;bwpQ59Q%-GZO!ZJREKg$3H3$ zhnu7DKaz*T4g2<~{#YIkH^<-~lZV62vG||J!{O$5{NwU)xH$>`gghK>PRB2khr`X; z_$TGzaC1KXr}A*Pxd{I=c{tp#f1&Dfc{to$ga5fa9ByvF|3V%PH@D$`DG!I6JMmA+ z!{O#${IBKVaPuJkX?Zx@Jc@rt9u7B8;C~|zhnt_{e=84%o2T)=lZV62v-lPAaJYE^ z|ExS5ZvKq_y*wOlUc)~p4~Lt#@z2Y{;pSiXKgh%3rm|uBKgz@5W_A1v@^H9W2mhix z9Bw{^e@Pw=H=E-BBoBw1E%7hQ!{MeC|B5^uZnnq&Sso5IJK_H#4~Lrp_`k}-;f8%i zRbQ2d!_D6KzsbYlW*GkO@^H905dWGy9BvN5zb+4lnxOoY`hCCc@{)%5y9u7BeVxFE^xRRgWp&l4mT6f@^H9$9AA@%!_8Cpt>xix^Lu=&JRELb!G}B?ZeGLJ<>7GiHhvp< zINbaTzpXqRZdThk{dV$jxap4HULFoNpT_r=hr`WQ_#Ncoa8t+kk%z<04)`7A;c&AH zzOOtSZa#zGNgfV2d*FALhr`W2_+8}TaPxV5KY2LZ9E|TT4~Lt>@on;OxH$?xKpqY^ z?f6~g;c#;d{xkA$xH%U8S$R0z9FN~k9u7Ar;RnjY;pTMw=j7pVb2ff=c{tphkKaQc z4mTI$2g$?X<{JE-@^HAh3BQ*-9B%Hy?=269oBQ#D<>7Gi1N=VnaJYE_KSUl5H$TJQ zEDwj9r;{uD%m0z)z>>rM75oT!INbale~>&JZr;KlEDwj9_wgg;;c(NkN%~RpaJX3w ze~3IBZq~xzA`gd~4U#KI%5P5dg_6U*hX0~G9B#J7A0-cmn;r3E<>7GCA3shW4mZ2u z$IHXvW>5SCc{tqci=QYDhnxNJ?ecKA8Ht}H4~Lt>@ss7@a5DivMIH_}lkvC8!{H`3 z-T63Oz6YG|3uNh;Uo{TQ1+LrgkldE{?^$5p)4(z?zlu47;QSdZgY&D_yAwOPZhuIs z0o%*N@oDkI{8r4F0`Dk4Ex*+mmJ3|BXO{#6_QvMt=JG3c?!=ab`K_3<2;Nuz!u(bn zUUJ?3RvMoVOW_06+?C&IN0eN*|6!`O!{y=DgT>48TQO%j`~~@^@>`7)lnY$9e<8VT zGPb1!ZXFA?w7i;M#hlmSW3VkPZ{=6*luqpAy8X(PoO7}~+&V+tExDM}9X?Hd!{i!g zOfGQUzBRe+e0jL_3~}G&VopE!0{LB&Ygd(Aw;z_i?MivL^_P3>Pdt4rFeMo!{>w3-u@K5FW7)I?kCD-kLp1$oFdARlG;uWmxInTo@X@Ytm`=~`SNpx3sf$vB-dKucg(tm`>j z!(6y>*(SNh1r#?GH=eR+WcaHx`d&UC)^a zhy0Y}+O8$n?T=62Hb5S3-Bx@m>w3-tcsKd8l51RGbAjvjmn63hm4{n*7hj!R%vk~t zm%lN&c6iBkd)@}rHd-ETJy84z>-zXS29J^FZ927aCD-j=Z0KKsC#rdserCyad)|)F zHbWk6oh)8sDx|_hg;{0d$X>Oe_!}y`F_c@GfS@94^H3z z40*WUm&GGk*KVnD9&TMI?no}?%!4nHKQXy>P04lp^U}9n zEf2R|F20m?eS8+fOXROkuH9R5-TvF@+qf~v1#Z1T`~d5E4o?AB9*}<|x%R`7>-JBj z@Bgqo-0wj#PpcJkcnYlYBYB>#sx2?MZqL&tZ9kKTTYn;6WtDQy8t^aWd01ZKh9?)e zZogS_+jH`8>#xOICl|+uhfI|ho-jRn}|0EvFx;}q~!tcuuPp)l{ z7ua0jy8V&K1J;*^<3sh_ttsYAgSj!wWma-+*OKe@Urs+@fIJ*M#EV$h$LB(LH~CAG zYo9Ntyj;tm`@N!Sm%mNUohxa^0SN{-zW%gcr*XO0F#}xo&@8`nKEU;nr`6N3*WyjDhczADdje zzvR08jP(8QlZX4=E$-ZhkLR4oobSt@%A7|_uG=qS&Li@0zaNMfv##e{4RfQO3x686 z_H@a0d-k!@_G@{#^$GCMsS^2v> z`^l+Q@`fQ7xNiS$a$Ac$-1-mo?2faTvkJV5nl+MZ8&wHftBbd0T^}EI zfm+!}zISr1SIKpIcFEd*OL@3o5Ak5u^_-z_O`cuE);?2m-Tn*d+jfb^9-;A8@2R9D9h_k4-V>Lii~8OOtEIlw7yJA${A?@^I^T@lw|H@nK&y zl^OE)B-c(Yxo-dC^lhie!>z}Pm$R z0{QonYd4l$x94wAw%s5Pw_Ysno?Oh?5WYp8{lnDmF1cHB|29`5%oG5dQd=JbQ_ zmESeF#s(x8xNg5s@_>Ei;b4QD%ZTJ+&M5fvYDOp54lB8CKRJEdq4IF+0peM#>+`1r zK3slYa_#7n>-OxkrERJ_+&V_w(r3>6=^f+7=l71;`aY$gj`n#SEqx}A>loM4XZ)Nw zEq!Ls6v51u)9{IvEi4=xTW#toY@a@_RxkyB4-&JUP7eSG`uU3MNd^S}um z?@y{2}3B1g^KYwn~;?X#Osz+tnecC_z3Wn7nj|GCpT zrhd|aT^`lWaXMtL`NL<9RKp33z`9{;}&?s9DY0w+wJ zGj-;SE)P9y>co!bOUxm&^7gL%Fn(6!IaZu2K6p;&t;;6|BW6yWk+*r}IsTvPkDfK} zlMg&_?!>8G9Xe!odwb`FqRT7f$oBSQM$H^Dd*+Oe5$&@lw9jb1+zgvBRky-Jrhno= zT~5|XKA?T_xQ?mEb#VPeRkftZ$E7$*@7N0cbd00c|gB5A8>r$TK&f%{fk4qO6NtSeRiLncj@;T zpBWR|$Is0T?Tkrzn<5@Je*EnA{9<_|pTp!ejfMHex*XOmzj*qbpIglPR5$J-EIiu2*J{CDHLhw_R2VqWgPh@^U(5itea8eyjOGHs63o`>*p7TG4C@?^Ty`m(xcNCOL6@AHO(9JMoSAX zbuf>Yu8Mg)4V(Xcd^uphwO8lAi=~)1vT5G(oHs2a=H*)jKAy+ZqK)&8&I{N%#jyNd z%;PE3#?w3S&GPrb%VWjyyQ*m(kGuR5Pv_KP-epbm=H)!jFOJ`)4f7sqn#cYpxr`S} zG4KASc?)u0asF|eQXD^?4$S{PKL1|Ld0kyEf7>)~!?*IiHMt(gZ}WzEA2iL|J+EZD z=i$Xt96z2`Y&`$QlNKDvsY4xkBUdJ2B_IQw+=R#k@@u8s{y{dGqpc=53W< z#XO$sYn(Sb_x07)<*%)2-YRdGw?nmtc_W+V@i*i7nZ=R^cP>0N*m(SU=Dgzcwq{Wr zzgbQ5rsR#v)f&$mZNt2qo93OC z^G@sH_+8gD@4}o{Twb`+6Q;EX6$DQr&oZhrd_et_{k#m{&>Q^cL%F*j?}2DCW_z ze9$!Sk({?IJ;!ga{3_;c?s>)UV|32@G(W&g@pF1)$2x=T7yYxPWpOg|2Im)tb;~c_ zBG&l(;O}IQ>S7*mVPl;^`Nh)v{XEY3oq0p@tC%;!^NQo~*amt3FApykIu@Stg9q`C zT(-&mfsf9Wn8)v#!#IA&Bs3nsMR_OVtn|fF{2bn*(>U+c56jCR*Y{%H8BOzgY}nFr zM=>nF7xPYSns;f=E6%^+4fC#Tn)i6lThzt8tD5HZ`>4F1!|huh+|);cn&w@d^NQ;Sm;YiOuVFQwfA{3PuFk)wo94Ze^G4+yejf)n%zM9S-k^t)9}gM7f^oX6#Zd57j# zF>jZqdA&Eu_hxw=z7_NOG|js)=M}eCqZ{UpYMOUI&RfvMJYFwrJbn-5JZ`5ren&LS zo6|J!7dh|JF6QyNS>wD9a^8)eH>P18uZuOFe@EwuSklG3bDQQZ$+ebw9+xkE7U$=; zn&z#WcXB7CFP7r`yQyj3tV-qM%iq|Hi+RhM=5^$}y^3M^y_omorg`_|yyEvUzG2?q zn&#b|^Hy{*kJsB8&%fn4Z(er%J|;HI`BlujqiNprId5QTjAIlMy+?ZVw%nuX1?9j^_={l zj~i+DT6vA~ykyGI>=xy^#Zp`jK1$d4ds{xg(y}P;lXH5{&adM4);;ItWsj?V=kiS6 zsO(()Bfl4?m+uW{YfHD8dB0?OOUrrbpY(OCdvZQqz`T!_X}OU(H1B&BOEHh<&>Fk3 O`QEu|9+zS%y8j2rt5LK7 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/secureprintoutput_w.o" new file mode 100644 index 0000000000000000000000000000000000000000..3f5029dbdb6170d3bb5e32699ee7d7096ab0d2a8 GIT binary patch literal 109056 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 O(sumtcsm)@xBCx$$QaT9 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sprintf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..b36c687384b7b3f0887a6b3abbde7f041324572f GIT binary patch literal 5412 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 RI_635Ee!r80adi#zX8zwli2_O literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/sscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..0b8c91d0bf5de44796b09da29ea0db789a89a4c5 GIT binary patch literal 5268 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strcpy_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..00b6a2dfa92cf734257f591ca6b84b89b3173e86 GIT binary patch literal 23036 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/strtok_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..19bdf6899a2af0499cda688cbaf64da9df8791f1 GIT binary patch literal 11156 zcmcgxZEPIJd7izaC`zO#O0-QeR+KYOTsk)IM4mn@%a%k_5@jl?>{^oRHf*Wm-5$Bt zed%_OqEvrKmK52s+f+$vTd4~Ru!{1K%MeP_6 z&{#^JXWrS{y_4m%KiVO7_j#Uq=bd-nnVsD|KE7-3gk@POD3*|@s#6+jgE>=(dMS$Xq zKfdx_&*etVckcL4b@Ih+XEFzNWuG{4>`41N1An7dCDSi|LceIGeGY1$^mJHj1t5)CVb=1id=(W*DzqW23 z-9P_?^I+P~ z^#a*aGO382n=TjGgUogYrMIS-N=Uc(G_TE znDjAcnDmi1KGrq+c)H<3S2W^WXX2E|GC^b#$C_pz-*5QP6%8M2ntUVzAImTvWvv+I z#T4s>?%W(SJuT;^CGZud`SP4!R93IBBAZ%+-MyXh?wh+0_N}mb`jE7>sbLGJFy^xBGi@dl~vob27+PrYL~e6VIo+S=Z)8+H!$Pxh{` zR<@6=dUm|uLfz6ujaIQ$N_B=#NW0S3b=obvw&uBUblMGn9S9K})4_81i%@kp@`J^X zBI{qn|HIQobQV{4V?HhGr`^kN)>|@pI=!ys=JQ48Xtw68n{z$4=;kWrbwzh(rcy8G zz1*CWJ3Ku{07O2KD?sa&O0b&F1I3N5SI+Tq}u@ceq-txWlqO3|A- z>X!4Bqux|5H(hhR-2D2?bgAwYrwi3-R84uuyjrE=Pu0EJlv~af>v`w@rIV={*Y}k2 z{F+}mJnf}(d^CAJ;!e+TezL`)f2`_wV0=cYMS9NSE3CMM&7t}HI2CLpR(qT~2QKl@ z1_(J1+OKJDd9ANUb<1{rj$O~oIx8NjGZ9@+Ii|fVxt^~#F&JqYbr8X57#YA18)Mfd zO{134=&@f#O}vZUT$y0mt(dmaFe9 zXl>G)EJsWZR`XfkIZ!$5l-1mpsae;bs#KlwG@LobqLcHne)A4At%P+`mAbF~_jks+ z$V!@?yl;A9a__Ei1i86vjYE)dG~2!JU}DGUXyT6a`t(R5Rm#q|Tis%HeWpNC%gt@A z;a+h|g&cUflJZJek|~TSo6>36nqVuxUUs&6?r{gWTKDEs)k>A^^AFcOKUH&PE492+ z3l-!GdamO6&wmxzxk;QZ?mgXNvS$EV?OYp_(n{L8@8bcWUKSb_PSq z=Fny~k-86I;J(>9Tdrd?se;T|iem&r;4^i%=(}Z*Le0UP!Iz6^)^*N8&Z+t?f)HLW zbGwkep-3m?*#ILdq81tS24mqU_M(;1vTE*jB$o7Fkde^DYxteK_XjNhsPcERCG+Q+1c5e<9Y79lPXp!Ri>0i z*`QCiR6??m!WzrII&?*_Yb-f%D@- zU+}6$$(HZxkWyLXdA3|~%07n>O*c{?o*Ry;wMq&rF6H1+Rhg|bUuJ>KSBjV&Of8-S z1=lI&=?rz)gHq0XwwTiC+KMQk&*R}ZgU6$PZ0j5znR?c_y3o8@b8@Jyl;vj1VzX*& zVSJ#JRlZWk-4yIw!zS#W?C9bSTtYtB^8a!IYyGO>Kw8pzS zRBX@NGKjA@H~-yQ$CHdEKLNi_UCCMN1L`|`!;o>2s$-x-uO1h`0V zh?(l>bSYCEnJ#3induzSaX07H0ASNv@KA4*Hud4p8Uz4&iBfQRFAK!DJoy6()+R69 zP!8aTf#2MyC1`6I*R}Pu*Pko8oz(Ye%#(1uG@2s(a{)E=Yg>4_g>P%&dt3PZEu3SK z()>mmN2EzpGlgpmym`FsE#tkmp7#2SO8b%eaJ<69@d^*eD_njbpabFI_=JyX-(h_? zUa8;LQqNB?DN_GnK#hNnRZ2KhZ$M4F;rPWq9Ix<0E%x~q&aq1gXO=vUFV`Rz&Or>kIX_EV@^fu{ zbAF`$2I≦lnMQANW$FK3pHd$AfCqKFp8QhwDXuq&BSMxZ9iK?`nzv+WO}Br9O;b z`07Rv!UtOTtt~tpuh?f=>cjC%eK>yMJ6r6-`$6hwTIv^C_#-X+i3o2%fVjf9dZffv zxUwn7)rv?hIljIlC9ZCaFxL0!{2yqjvLA-)Rqo&DdSw2i^GP0!w|PGM6@Q(G?x**G zhxuz$`@zHeuTA|D_!tf;?dr<_VSnxF5O`?ct{m_%-|fl;kKTV}@aX-CPf`_*uS0Pz zLVq3VQSdOnrFv}R(4;I?X91$?=Na(m`Z)(4o!@7{Lw{ZBcfiAVyVM2nu=J=u0{L-6 z=u>|N{8WU$0sK&ezumwDz3T6q_>Jn{z{6G3r~bXEzE6D&{!!zx)TcfHztphlQ~dSt z{Rr;_|GS9&O7Opq@P6=>`UgKY>Qf2u47WS=?&9^T)5Y7V?V;=c+$8EL-&9+su*G4OCbE>)+&?S?_0 zdZx*~Lwy}QdjC8R-WBQZ0{FX;@n39e->$w5938eRqB-Gl4=GXA(ZwbKB9}Uub zGb+7zJ&p}H?!YlhVRQtiI|(R{ZschbPqfIeGBe5(8)j&dp-F}&8JgssnfmN>c4nsL z%+vaw{S%{`&6RG!wHL9gWy`aUM?2yC%rmWm#-J8uaA7pK zn9hT~*6fYjLs9=vFC|#dYjl4 z#I1WA=b$Ebh2wS0g~|wjIgyVdy&_UMSp?kIhVz2C=6W2#Ts5hJVD5!0+e5rwpuWe3 zXN7S89i9`s2bUB#X%y|p+#H|j=djpM;F2l|{uNw?OM+M9veMjy#6b+3fP44=K)D-7 zivNy4N#Gc+63M+gd_?eVxTI==M{pVD!vbY9jsR;v#)i*@VV@RC@f~-idAt$_F|hlU zbbvw}=uDYarz+o(*1TXo!L6f$>CRdZ%sbOMCioWO(>Qyyw)Rv?;_^I3}rVC z>oE=Wv&VW|Fmq^~5IjwMQZU1^%%*yR_>}0sL3~>9H;K;(<}=Ouir@>xX9d4P{G{M- z&c9DY%>XYl8V4O8!=ehm8Jt+8F=0 z6C3|`5*z>b67#{0@&NJI1wRO!{6>g}jGm>9@mV1@J|87!Vo>-Tuzp+cv&7E|{uXfZ zxeyN-{r6~Ne13=6`1~%h@%aPd=cVmG5}z0RE^zW&As#aNN3=11^m^k&q4eMg+TH*h zv?UJOuA+^JjrUX#GjR}ef;J{6YiVP0MI7WxuTL`<+)sizA`a$=_gb({Hqgeb6XIZ< z05)Q7BR1phAU1J!5u4oVF`C#oF3ZHG$7SN-SS+(<62xXrGJea%Fv%P)fq=3fc%U=H zw$Xo?Iy*-pwvEj+^<|urD=1`4rl zY)(@DRnduUWAhZS#RQ;ygEpTFv2FD8)NdA@*fusVQfIiQOcY|<*!(N?l<35^vH5^{T6ALD*nCKRo#@22vAIlrM08@?*j%AL zDmt-kY~nHK8PSPtW3z<1d5{p>#%4Kn-ZUu0wz27@&J7-g*fusd16y~AZqsIKh;5?} zQ{N^!v2AQJ)VGUHY#W=+)W<|8wvEj;>i39FY#W<#>W4%pwvEjmV2ckfl!LUH46$wW zFH_$mI+OIS$EfcUo!B-uXQ49Uqk)f z8u*!lq?g;Ua(Z304 zANa))OfEKYx%_CE5Axd zKa)&UMv_mWChb!sekcWA(2Yv--(L8SQB%7@En9+>{vSgc|Jt7A$L%8U$NMbmkMF%tKnqIX?`sgE@ok2`)6nRT zc?Mnr?m{m6| z3g?NKg`MmHusx@%7^f;!D5|_imLoEMu5d^ZKJX z`(@!Zk_P2-^07eq8u}s*`s=~51V^wJ04g63O1}FAC4ij6sNIu;=r^cDT>$?Z+ymf6 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/swprintf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..36fcfa7d1b7e5ae43e3ddaef4c3a49ae6a58c2e4 GIT binary patch literal 5476 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 e_XhrYYeU=vNE%?vu_+>WqD{aNmJcj-Cb;T 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsnprintf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..923a5b1a01b3b37b115f7bdfe6ec659d33f2519f GIT binary patch literal 8904 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 E124N4xBvhE literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsprintf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..56de666b03c9ed1c16b262bd39b3d7f660210a57 GIT binary patch literal 6320 zcmcgwTaX-889qHTyIHbiHy0%d7i-8SlLYC>%p@cb*d%Or7o!nSt`A!^_Vo13H0kMX z`m(u*8VFEeVHH@G7K)aZlvq}wf|i#DL8}5NSXe4W@#Kq^K8O$MgH@UZzweyWGo8^= zeDR+;=Y0R={O6qiobz}0d}86~qG1>!BSZXE3^^e-y<3PPlzXJX4zW>OBu?Hv{`!{J z#HN|*ljmlx{O-A#E6$#q+40)BGu!7^9)IP`_OmPZqP~CS;g?w3zgkt0vR_D<)Yvbs z5|quHUL{uUxa{j^Dy5ZTWq#$%w)|h4x|0yv=B3uC*OkITlO1y`^{gb?7#!h z-n`}31?#@k+c4phoL@;!{X&UHssi~!y@tA2T1BQ*8gu{;P_SUM zz^sz)i-uH8^dKotNYMqfEFO3S_3F|B>WK$YDd|B<6+A>(EXgs7Yqhfp$iyToW9L3L znv5qd#WLg~jGcsq$Cfm=4JL)h?$q2Csk>Ekw@cm4Yv{#zFC7*h^DryUc6BL`;&sNh zsST6GsY|AA+qlkHyAd`QiQ?4$$!jN%Y`_e+ipj|X&?7h+Vv=LpWQ-=`8(@FkW`txK zwzQn62r4evGjMcpGYwYLfSSpwad5L5Wc%hL8`c@?#}94#?A&Gpx(mk!y$YLzSTl4& zR$R(eaOQe{CHxQ7%ZNx(96)Ut|Cm~XS{`lk)#|Rk+irW#aVv6m_1xI?Ts!c0d2Xu} zq<%ZLdyajqxm>T}w|7?@*`mFFDGoXbJ1p5jKXg4OT0+mzijHM%IZo2H8!RP3;KfVF zUB4Y1kC$w_8M(2&yt~otr?J=UgiWZH;*)U{1j$kwM@z16duiKQYPm`Le;G-L0T+okp>U6Kse=$rvy4FcTIAsHo6*(RfEz z1zIVOs)w$}N9EwLcV6Ik%d+AW7*zNjG zyKMKYNXY7j8*eKguGh=^s=KSTve~yh(a8}%Y#|G~QX57c#m~AVu zOwaAR$!wXulGJx*xqRR-jeBMogzVqGD~%H~a=Jm(cA}vK#~X4xh!e;BpV-h z6T4^LmG(n3v05H|dY)@KCqm0_g9)u9aU$QeS_r&lqffVN-h^o&%(GoT#cIrsTByl2 zg2Tl1o`C5@4k8I(E;do>oD;SaCN3tS_|)fhQKM^7+zX<_bo{ih1-N$oz=u6nhmoVy z=0cM+qKtt`A{QddbFEknB!d=Xuk=8j)R)-I$za~~%}f)|HncOOfOhIRrt8PqBoQra zz$u3#d5#{{>UJY1j@@O)^nxH{NNHqcW4ir5f{hSH2y4f|2Acg8Q*0x!oxT%wF+{%~ z_ptj)o1REoCaPX0z*Ycy?LNlsXa4C7Yj%Cl^)VrNMh1(>dfMJ8z{rtjfwSnRrWJJ= z&)l>I``n58%Uqjz%83GYOgu#D?$q&ZC%5-f-V1QeOvL#Z3}dSU1IC?eOWZKvE#WcH z^BYD^p4g6#z;NV&0rwW?J;34b#G$96mAG&<>6tTj80u+g-M zPPuj*0p$E;5Ra4rmBgRl9xwoyOP&RJk3H2){VO-#Eg5c!c*y_~jA)<0JfiBRpR>6{+=o zGGq1n9?kIs2vAfnxdTx#7dZ;$gMFYSFW*!LlA@3=nmK-2?pJ=i^Y?EZz8r+e$Ma(F z`FL<|^6}aNKEJ*S`26~Zdj$pNzaRC>gp#Jk9NMciC&aXPKk&zL{BUdvCq-+ZBUmFs z)SR=TX>lCjZ}R1xl4&vA8^u3>=GQs>BjCSDm85C$8MNQa>AwK}GNnX4ExwBSg&hA4 z;OBDo&w$^R)BgZieN#|4EuKgH^PK&Q;J=pRUj_fi9RE7_@1rQ17QX>_Bd7m;rjl(* zyoolyzkdNg+~aBSckrpSWi>4dxbiRL{H+H6+Z?|h{I_!a#pk7n@qs6TqF6h^uN&bv zh#k5==eWL561#K$Wba|(#S3utXss-^oecAHkK6*yEsSf;zDMlN2}{$>e_!@573}q&D-@mK`r;4AZ~H&+hbpSHXP}Pp8O)a zaz=%o_cOyga<~e-cB``4OF2JVLD!*Vn0Irnmfs9)@^XWC2iNnWf{1rZghvzFwR|vv zPNQV@JS7GP2l2UQ?37UObQo7CjK47OMXWGBOoef!!j}`93Uhda69;ijLtnJ(iEES! zv4~>SC6sx~XefLK<$9uRV)bWqwZNOVr(^3fHik5$ba{ag=u4tRP zDCZ`Fh%4GApV5PIbD?|EuV<=XRP|3<_N zoO!`qM3rAc_=q^KUnjEqu#&I6RebM8ZYxckSS{+E)tA5wAsxI;?HTD-&^*IWyQ1bt z?WiL$#qk>aH#?@G(QzMzETe2(raIogLt0V8*`*!#o^lpmmm5&BIRJ{YC_8h449-EG z_xEG?>p@9>JSLgHTY$4ZfZ|VJn8z~8bR7sXOx>3-@iKv?OlN`5kGlhRss2~*S&6#8S_xi{Ha c1{7~1*Uo27z-N$i$lJ|hV!vbuO_|+40a0x8tN;K2 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vsscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..054b2f71c5c149eb9d73019162da7735f155d66b GIT binary patch literal 6832 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 GyMF=X?f$m_ literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vswscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..ae6b2d9234b6ac651dd851da6f0c8ff259c03deb GIT binary patch literal 8012 zcmcgxTZ|l6wLLZ6o|$;!@jPN|lK>r$-D9HZ_H_Fh(!IkY_9e8>6egC!pT>19H_J7{< z?mHj&!Q&V18AR`k6H`xLoVf17MOag-{h2Oq#mX%A4V;4GoaVD)ZVeHN!oR>sVXXy=2_iJ@z<`?g{fatzrS zrmOLOsft-qk6I(^ zVf7l38QweerlBL_$YQe?8rqL`Op}I~(pB1I6;1lbVZU!97IZCaX*rk|Y`9`a$I*d} zG+0dowhWD1LqiN|M(K@hE4xXUn=Yyas1k zZ^(FQY^FzdR{E-TZ|Hqn>0`ZKH^xb#VDb(S7i zw5k|?W20jmdiGLU74wE$?#RuTO1a&|?ZxR_p=npW8P9KRFV{&Tr!f;@MZ9L+0T04L z+{6qNYIb55e6Q&xGdcE3+JQS0duLqWRy%GKT49U*YwvBxNg;BV!l>p(T@5x7^iCKj z(A8T&I5w?!Rt8LFuya1#gxo(`mmlvQT+uT!*+e$nnp?Evsrc}|j zDsF^PQgDNIQ!B8!n<3p{bch_a9S$^UN7QkmlE{O~_B}gRf#jrNo1}s2?Lgv!p@aES zP)J+inX-0<8?Dy%-GUdyX_A;NEWjC;k$hK2wU?G6H;%n!x8R3ii&IJ?JB{fzo0x1& zVT5U|yI8w8Z%|((0^pJ!&pDQLPu!XcQ`jVVx`JC0gWSip`exG0F>Qk(OoH^_46V|B2!C~9@j^=ov7wlG*K zxXZR*kkd7TETCUT39h0DC#Po`D9m!zxx3K46`=sd*u&~(vhh;GBr1tmwktlShsDZ` zBH_bxPM-MU(*czuw^kO896hWwwXlslPqYJdALV!-iGTfZux&;8tYesOb!{I|(w;Y}Qj3Dm*RsDr zGQzssTGJ=40XJoCczW(ZYwpTH5&duu?K!g%cy9Q%L-$$__R*s63(wBc=wJyA@-Zr` zNx)UIdY4XG!<2i8z(BqR-KEAX*D}MhM(*(Ji6c0Z2>X9ll@@phz ze6h%?S4*h&;phX$JB%S&@j8R?9lp1nT)uNlJJr6r(?{{K9)491e|-C8{E0OQ%DZ%*qd-Cn?8PDIgb3F1jUwTpP-Fy{)Z6|`_xgO4!J|(KXo4?|F(`KFD zLJxmu4}VV&=Qo5BM0ceX$1AoW8L`G- zw3i1Imq`w!q?GUyMCOCBmAU2c3kd)0^cnln{iB)C6u*wYP-U$nN#{fvF016;ZH-5x8fLcC6qX|UxX_4`7mwj%7!?#c>;KZjv=4Nk=ir7#lj2W zdzZCWLR1^zHz~Z1Sl<}<*+p10N`Eaei!>yU!#W_LjA_j(e2{vcAPYDw4hX`rSo0E! zA-+xFKNG)2;Smd%i9@a-KBn+a;@cITCB8%9n~3=fAmkR{2@X`_Nv(ee zZQic*4dQnwe3JN`3O_)sb9k7T4?4)>#9VyHGsN#!_*vrjDExikiAonwYQ0?d|4@3? zqSXE>;MATtwckJ+o%1!c(PJS_#{$^#lO@)12Z?oGxyN*0Id=Zq0%5J*q+el(^IGpw z&rT5HytWCc*RMFld2Q3CUjAk)1aV&5+(o^91tQLCn|rC}1VD)M+U6YfMWrXsYa7;d z>orRM2yHkq5aPVnb6qy^Mu8CLwGHe2rq?PxabDYenfj}ho;a^7~EHovBx1q?!**ETOw zKcV!*d2RC>>NhJrabDZ}AN5<5o;a^<{!INgr6OfCLixX-)XyHMEINkl!!a=_p~RC~&oZ%#g$+WyWxa$#6ywuP`~rt-5~*t= zMTvVV5k>x@C5qKJ7RAW*?IN{BSC8x_tmL}nO2!-kI zG5F*2hW^+$^|uI|jtNj)2lA4kNFmFi>F-87aQ`2T^v8Kf{WXBoK7e8r6EtQhQg~O7 z-2@zLWd|*(-7>ftcNY8mcIX(FWj2lbVc@h6ptuq&cwdSFq!}q{6tA@8U4?`z`AEN1$VVUkVksunI%rlBmS1lKecujw9R va}9Paj0M9MH5`mJf`gC7^xgmz&!YxDojL(eAxofXcQ>9Z|H}?qQoFwb)1SN6 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/vwscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..fba21d1351b9d049c9613a9860e5466faf518820 GIT binary patch literal 6416 zcmcgwZEPIH8J@j6Cr*s*B&I+hg-e_`fqKuri}OK<6UV`Z&=k^yk5)3e?CtH{E!o>W z_QQ4}q=p7)e;}by1XQ9GRYC9rRrEtb>W@lDNTpJLv{Ly|2~|S;pjD+xP^7A=34NZK z*}KiDD(at(wX@IjzVE#A&O5U+bN<%C$wk93L|P2-chO@)tbR#|Jd`uiV2`+7TqkaS zblsnJynj)QPrR}=zVjDrm+u|xb)h3F<$)i%J`1LmGPa0 zE0=b^v-bF}FYPW|`TmEWJ+$xT@2xL+0{nk;QP3wXuh@TBFFt!{ z>&wJPp8Vug?f&i7w=X`2&coeRBV{(Iy${*T^tx`FW9-N>gpOUiX|8D|Dt>ZsdBd9r#n8TdM_$UytmTW1p)omrMBDKNW?x zs2^I2f=0{+OLoxixSkU(p=HMk&!z8T6eo2zSc-$dig#D)_&w(ED27z}1uD{>0*lSV#|56#FMtVOP1tjqJu!z(A{1z9VsYH3eP)dqS@ z$zAt8P&{5P7Y~&7mZpnl+p4*^% zZW{=^mbhN*`XG(aaiSQ$Tptaob5?Dq6T1jP@xTJ@FjV^`kUM zWD65;!C_CHqkFZQ&CrP=ciAz$Am}iqG_uk@-F6$vMhZiuwc%g_&31wi>qu;)?SxHq z(QZdA%)Zhlt8vXl)k+1J3P7*kM!)UUKb>LBuJ5@%0+MT_JBYNU?Ogy29k~`5MLRLA zu*rO8!s^a*BWy2oY~}?g4A?OCkf}!#$G4r#+)H^YaIt=n=W{TOtOg92caAM~I|0r- zuD*tjua`NwVjDUGy`H-UoLj8-0E@p7bv%`=*p(rf7V_Nm+m0V|2-$Qa1UFJ ze0d`A)pu0nchuXmL<0ezb}SE1y=O#!|NG89mE8$f*b!ou{b6yOWZMGp`VFE$7%~3M~zI2>x&?CsW}xy z0$=fimM0pX)f5ew3YnIg6*;02gl$VUVK?Hg_K&x-w%< z?>EZ_Z&mv$_ibKFK1az5<1u46CyEqi%KXUOosS#e&COpkD01H0^Y6|N=Z=+OAkQvg z>;@c=dvT>xuC^1w0WsZ?#E3$7i702zNNl!t~U1@ZCcshn@blBMA4d{2dW9zdCr z$H_mO;k*fK>Er!+a(T^@cB;L+J7xI(t`DU@+{fqp_+lSF+sAq5Q$_jnQmW(c^l?n3 zF3SEwO8ag)d38_$L|tMev;isAL%x-@$uB#{L=b4>R`9gTI&2{}B9z41X2;qYQroJeTqRbMSo` z{!8$`X8gYm{!FI*Z@_!gJ}Q0>x+SCkBlyi3{sH)n8UKF)zcs@@24BnA{}X(FhVxFW zevUzb`Pcydw~T%>_+*A}1@D!DxCK1Bes+PEGX0z2FJ;>A10T!iXTfjD@CEQ*S=WO= zdC~iFsmP1XeflwRMz?27TXF^QaK;~7+kL!us^B7AIyqewJ6G|p;Mt33Kc0Pf>P{_b zR;^ksbe5;VkDXbp%;-1u#+sECV^8#OK)qAP2Nl)+=^jSf zM(b`@Lj1^<%CdG?X8bTNYtLovvaEfTwX?GJR@Uyy+Fyn5#d&&NTu38N-@1>A?xVs! z)Hq$g5lr_oDt|}#0;k>y{)9O55c0nR&y6Qgp%CwtNQeo%Z_;w&RDK9}lA8?59G=OW ziG;Wlk9muP;(olg+|$Ep+d4#>ic0*uJs8Bw@V;q!FaE~xd4wRI&^Av|F8{G31o4End75&)y%A4nn`bHK!bBmS&^9kozD3E2 zC$!DWl;5P}#1qV?=WH$-;NK#>n4=-J5X2-v#tbf6P1Q2L8Hb75kT;I)OBW Qj3I0HIs*G$w^h&X--wj}z5oCK literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscat_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..5acfab5c43fc8e0e6895f1e3e57736f7d0db02f5 GIT binary patch literal 9632 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcscpy_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..fefb4b3642ca8b70a061452b5fb38b26ab07aafa GIT binary patch literal 8520 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncat_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..10f055835ef4b75c7634a5a1411c3028c4b5b120 GIT binary patch literal 9900 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcsncpy_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..d16e96f70d7a9e1c54af076831f9b49da23c5c77 GIT binary patch literal 9800 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 H5ZV0?z?_3B literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wcstok_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..bf90db1b01fdc60e2eb8b963e4bd2eeda861baf9 GIT binary patch literal 11220 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wmemcpy_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..21246f6877de8297ef80ffcd71cbb3efb39c4859 GIT binary patch literal 6000 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 Shnz#vZVEZ-SL~oDxBC}OY2xw# literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/middleware/hisilicon/libboundscheck_v1.1.16/src/wscanf_s.o" new file mode 100644 index 0000000000000000000000000000000000000000..5e41134d048c9dc2cccc00f2985c21d3e75578fb GIT binary patch literal 5268 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 z

!DNa&ur!UV<;YYrHt>JZsHyXax@MgnX3~x8Q!|-mydko)iSmFum|Co`#V)!+~ zZyJ8j@P~#ALVV!+$@(30dm}&3aFJn|Z;2)7mMOQ(_}ebyZ~5}1zp=bS(4SfSk2!1P z67N|q@t#@cyUa3vVP0+WTVr^=;&6(Sl-q5}yW5mEU!E*4%cZ=`QeI|hU(C{en8yaC zn5F$NHyQbI!(tCkFZN)T_9dQ9S)|+^Q~o`s{Q2@^`B^UGJ?6GSKj!v^W&Fl+86PlL zne-D3*BKW3@b$}$T;c`GrF}C$ZPFhxEbWogw+-!yxw~OmzhHUR$onb|x57!v-EHdQ zZc`um@??FmTVsM8gSkggf?52NS?tZc#H3$lc)4MT_k8_2Bj03ri{WjCC2Dbg z;?;MDlys7EdyPH!8hhr;llEk}*ppf8$t?C`?iaLRmj07@gprRnEb)NTPgL@7ij$Pv zXUezFlrLXSVR<{l63BA{bQtnYxzDG^@^5x0$ zv0UnlS=u+V)E9H#pak;(!xGOP4H7y@xyOyZj~jjS6F7{`Z{)#yr?#e9sGmHMr zdSJ`ms#{>7JZpTUuMylS@eBUs|$UfGW?9;XAM7R_<-S@ zFTd1pbI;O$o#J^?xT=NcK7m_$miExfT;JMo8^eW$+j^Gv*3R?ZaKE!XR|h`Fv*>fK z;qyI9`@F!j
(&LO`}o~6IL$a7PWclIp)-^H{3o!*2^_FCI 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_calibration.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_calibration.o" new file mode 100644 index 0000000000000000000000000000000000000000..6f8fd9f32329a9705b836daef685a90842e93dff GIT binary patch literal 145628 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≥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
j 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 A+W-In literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_strings.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/core/src/vl53l0x_api_strings.o" new file mode 100644 index 0000000000000000000000000000000000000000..ec728cd24812545809057f58b9fca6c3c8329002 GIT binary patch literal 111552 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 sEAxpq8Ro&Ro0W(<}1poj5 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/mine/src/vl53l0x_iic.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/mine/src/vl53l0x_iic.o" new file mode 100644 index 0000000000000000000000000000000000000000..1a3f0bb66f9a94961b7811013cd2e787fddc93f6 GIT binary patch literal 87592 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 EUrW$iA^-pY literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/platform/src/vl53l0x_i2c_platform.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/BSP/platform/src/vl53l0x_i2c_platform.o" new file mode 100644 index 0000000000000000000000000000000000000000..ae6ea26aa99f42d2447555c2954cee6dd75e25fa GIT binary patch literal 88636 zcmdSC2Y6Lg_Wym(y*C7ta0x{LMTuUTN+350RYXD(AP@*9p{VFJ6(VV-06IGMHsXwR z?A@{VHr7$cUdHa&yN)_K@yqVqn(sL#GcopS-1*R^qsEnO ze1Fk*|8{yDHSXw5vyQoW$xgN9bw?ilU)l;Cg8TkgZGHTI(bm1Lbal9&V%PUF-#zZM zkA`{l^MA1MkndvdzGLQHh1QpCJnf2c-f52x^Xy&Z5wv~dS(j3Yjl&YVeEkzKEH!~r zWgCC^%E=+CZ^=g2A6s}FMZ)bI33nZLX&mtY8yzz*G5YIGL;AhAF$xcp_D799dedFU zgdR(by$qiCWl|G6h}5H&KeX}Uqb|Pihzk?3uQw4Lap9#%4e59ECRfi1bAM?q63Zrz zp*OYv-J?`K(hnd_HPH2o>3W8waTO_B?J@vrHju5NV-e%O&|X_=Nn&U$O}{PJ zW!}-7F23-R%pqrH`XxslHScuLU1utxz2_hA(o)_pg8+-UC68~-?O zpm*9anWJX}qt1Vqby~*Zv%+XhFYkE=m;G%|&x`RG7~|nFhtqw&A~9&=dC@WWip4To z+Izf=%otImy%FF2@K3*ePDl7V%HJ`MZ;td#Lm7A5K_|EyLIDvSWY6m7I6+HQ;2*)EZ-D1JJ%-qG)UZ-5l>9 ztD25GAQ^35LN{xAPr4j~z7fh|U1Qb5aVz=090SD>>)wIfs_2ZnOb1G`RSlmAowR=(0VQbc5 zAeV$<+xW-g7FJ}K${r<(3|HJi6d9qoy(qG+;z(6wJK>R{$WZ^vK#{FEM-&<97f{EJ zQk|m6_FNK*jP^@2ph!bcw-+0u!bhp_vBHt*B?Qv9I&5@qLxJ%uA9yusacf3@a2 zv)2f#*(>}v0_7KQj+njHFQ6_JB|Sy?rCbuquk%~wf_%pEVWA-+rlN$*aQ91m_#MUxzTu742 zJ2^)xU+ceyYP~4cBbBe?lBoRG{sWkBr1HZ=7{WyOaOEA8j}VSH<&M;R7Zyh;yBI!N z+4at2lwD(vRUW4Dk5k@8`FQ26l}}K1jsK1E5Y0bP*?De*vh&=bUSmopY{JcFwt8**WJ1W#^n5m7Q~LQg+U{S=l+~7GZVHx&Gm> zv^eKH&JpL_>VHk^u_*aLoO2tOgmdoof5b9eddiO+td0yE$=LKPP&fWg@1Dtd2;T&NY*2EIQ=BZSiTT?4@nfW!s&x=wZlqf~qHOQIHm07Duitdfosmky)yI zZ{YxJ^E&y8JsQ}7uh3S^^Zv^*0hh_;??L=Mn7@bc_fY=cn!mTt+8hnx}T!I2`wmkb}aEh<`{QN#eqc48IN;)P-TxET8*K zMz()EF6Q>n800^I1jkFpVE_=H(V-X#wqJWkuhFbCyI=nm35HH*hN_fsf=Bfb&$%KAS{DaM#4WC zHS@TUF`9FDkjlvSzlOG6l=KoCOyrVKcCx=6+APZIQGpvVGxVsycgjxF%AK;)m7TIP zl%2A>DLZ9n3ahe3{_dz*lr={W8N2%zla5i+OO&0(C82D&|5%{xTovvtJ5SjuJ73u; zTcPZfU7+lgU8wAotrS*eOZ~qG%9e4CSay-W7}vch=_Sf8=8{l$soy)yS$3HUcgikT zcFL|$cFOLh?3CSG*(ob~^qB9IT`BphY>j^=Y8K1Za*imwum2+}OL~d2`*BGq+vM+r za}NoFX06OAyGq$9yIR>P+oJ50JwVwhyGGe5+bXQeHuz4?36uN*(v)gWvA>R!m4by|3#pz9BPQNhx$u# z-HVc5qU^7^B$PeIKV*cn?6E4`DSMo*Kz(E2)~L;LikPo3xROmgy*5?kXXhI{x^Xz*}jXgTl_m&7~LnD-pVB*>~24A zJ7?B=L^Bn3r#}Zd((Jp8X7~F2aNUd2eIo2nToS?__S*tskE98E(EnW^>>(rUQNM-415xb~mcqy$s#%Ms+)v@s5_)eMp9GXYt@hrG_+8Es%XMC;7IAeUHtb5~(Z)*nGv3?Y$ zl^Fv1AO0g~i8Nkz+0yu*{MTqF7NvGd<2Q22?QZomB9Ya3ZnYGRoI%+%wRjmBkvT}n zb|WJ*@;RWto zDK<269dcyvk+DtW-vHTrWDJkALA7b5x|cB`GLIbS3vCxU9TZdAKJo>qztX74(|Y^@ho$^(k?7>g3<(*S)epALNbe$Cb7)fN=cSk zrc}f-=PONSnUzXYS>_U@=@F7yt2BdU?yoeHWi~3!VwtOzX0yyzr8z9KQ>iRMGJBND zS?1wN^H}E5N);^gcqMEOM|$1{r9~|BWTmPI$vjm~vAigMRQM#v*&4xnbKK?*%}7N)K%T_X{;YsP9oMe`T+h{O05@>$ z8o-TQc`n`|fEei=O)N4#v){Cvchslz{iah=p49i7LE9a9Qr~Yk+S$pI`hGJhEl=wE z?M@pRc~akR7NzA$eZM_u_bE^6`^~1bJgM(jLYv7vI&1Oz&7t&YNtd3CE8`_yMw{LV zk}juofu!eBx>(ZlC_T-~j(w8nd9bGEo#*$P@_o>bsg%@q%-@7`jHU&zUj=Q0TCqbQ zSa1s9JRefX?!&&pSA3^nmqgEUynYMsz|Ax*dxvLEn~_kNnbRpL@-t_UE@G$5-RRu` zu~X(udcH4q%G{k^5fD3N&Z0;9VyDbKC@pr%oIM*d#ZH+elomT>&Y1xDVyDbfN{gK` z%jo3`u~TL_J(L$aWzMCv*eP=!y$vvpZI(HIE@aM>bOq@=Tha?CT_)*;BXIA0Nmo+3 zQqqg)J&GlguA&z^Y9+m7Hqz^1K{}1dj$H&v*)cLATQ76Z5lBY*XW+5~UH?7&1E577 zU5NCjQy*_f`r2yNak!iv+YjG69f2>ox(8jAE z`V`_D(q5g&TK6c*#B;N*N{&`{W?fC@5Z7j1Luqks*0q!t*JfQu=^U-}`tM0bPS!0g zfs9*ubIvBpx{cB*<915-*ZclB6XoNvtjAu)Pl&*2$KzZdRy2Z7F#6joJ}Ed-@h^hg zDLyT@t>QC`m}b1uv8+eFMHOS{#fGd$>G~LYuOaK%9$dv}gl~3N)^k)08oiQ_LZZT} zECx^G1z!^ssei2miPV?rx=4M!AEl!tLZrSy#USXeFhiBvC5)n2Mp2&-WbbD)|=`iDhl0m3+Y%8LIfDi_!zN=HdoQU6COmK)28_zTAA zDlIE2s~$9fmyB64T@~q)G%G{%^@%}NKVg3>E#F^RS5;YCDQ9Yama;BMvvQPmNtzW` z)+K4yK;@|3pQ{{E9xRLj2dlI!&u>Lbc$Jpra}KZ4vWEDFqp4n$+R5`!)=(~q#&75U zF=+fq6|PIvtnG!fbV-`EgD^=zWh4AogUYrwm5uTb#dR-Aa;367E{V#<`J=}>OOF>} z?zB5=XW^K$^e)1fEvT|F{#@KCEgNep+tvR&S4MKBvI$%gl@<9%1eF!{scf<^R+J<> z>0cTMFEqlZ_{(wKi;^4>K9x&C_$>deK=>Xa%srvVnk|f#4GEv=dpkSLcQ?XI{99Q# z$r0gmxFm#E_`Bg23BUz?gzFKM3ZLii8wj6ogjf25aNUcN91*^VOG0?9|9v2QsR(z6 zd0FlVN_Tfz?g&b^?^*5$O1JM>d#Q5z#3E~N;fU)!`>1>uK>G@lMzBn^zwIv0GBund z(Yl}C&dQUXqI`-=LiuJtV^?PxcjV-vb+rh0&u+5Zk&~V+WF4USPFZ*4qz^N*^vEgd z0@k|}8gs1XJLUD1iN=2@ zbGUzNpv)0mQj|H~pN8w00s>`D;F3`0WIu&vlEmyOB0LyGPZf?i%bh0d>sB^P&T?Y? zbRVB}hL(4OraNVFgQlJ`#oQq1PMLJyo^`g$m&W|oKLVPGWq-#x(wKAnhq*DNw^;UE zE{Vom;^$0sjk#2XxiI^Kvg;$4E4w~&rLyZIS1CKsT%)Y}{;X@2^_hE?dppE=?gq_w zVS1CY>ti=7yFPY{vJ2x|m7V8rS9Z?$qq1|xoysmU?pAhTeXp_$YxhEk3v2fRh(2@A zdQi(d=RTtBX3)ok<(YfdMgBxsUYvC?=ZLc&_fMr&c$EAi&U%7N!dcJxcTRH7dR~P) zXT7NGob{5jbJky#owHt6cFuZ5**WV~W#_Edl%2Em1Pd?5N>6xG^PRKY3mVQ@`hte< zob`^Dcg}JzWH@KNuldedA1XU%eWdK1^|7*Z)+fr&S$|h{&iYK*Im^9J;hd$1Sn8~2 z{MTW5an`eZr#R~ie-F6Hi;`c&SzmHVIO_+$Iq96GCr-ia^OIKYoV8KeIjheL5?T6! zgzuac(dXmNSy5%@teCQMRzGFuEP3-G<~wI?rTNZT?i~u}EPaO}m>>pddFQOSvU66h zvUAp8W#_D+%FbE(8intiHC*$Zv$j=s&e~qtIct=#I_o?CcvxPXC1-)+th~r)aFZ7$ zzlgJTj8I89YkcIEz*+J>Lo5$PF+q%tyc7r<$JL0iT_R`Wx)-JUMA)ue62b~2xrNU2 zMWWd-w`wjH-b#cQL<&(-G))@elOum);Uq_dPvMdfzI&uC5I#$UxtE!<_D~k#yG4E% z2%l+$&yJMhx)&umBD{o4Liqg16M^sw5f-fV76|KdY;NSUK=?c(d|~7w7EW?RcqNzI zF4xc6GqPu~9x`QBM}DN;A)h#9)kOBhhD8pUvT7r@1LTk?YiXnx%Xv9u%32;d5G!Cg zCC%E4Ux|=Y(yYBBZy`rcNwZdRj+~Na?HgH$Ri~ViX6+Zb5-?gSO+}VLoACnsM>4Pk zdrY7%QV)1apguARtCD908X^-gk-jL<7`YShia=B3Sd7|l2sB5EFeGgagd$&iB-;b*OU%yBp8_MkRBO!s$tyX6*cx|#CXk;&>q#SN! zSJL^2986>{q5~B<+{j)`ds8{L%C4fcoLgltp|qS^Wm7olxm9*GrRCfzyLL9@$hlSa zQko@455$+3y^PXwZk4@)%FDS`_Fj~hbF1vVDJ|z#+51ph&aJX}t1stP+56HNmYiE< zr^rZUB7grzl$Ud>>^eG!k#no;dOFuxfrBM7cqYnt*$vMjsfNxen>1w$CXTV`<((9H zyCjdV%;xXI`TJ)Pm$Ud&SahtH)5FqpdS^gjynoIi2jJ(p&X#sB=TNFcY@YLLJ`D2W zvvUqU3|CqCoWm%IK&ilw-{BtzN~X#`oCL*VIj8J0RS!0D=+pzDH%iVMa!wP}L!+G2 z1@+J<=L|tTYRUP%pdK3KoGGY>Mmc8*j!?;G3l3L2hmkg_qhmS0tAIXyu#s~zUFU<1 zoO92irbJ0svB!D)AsJnauVHjUJN|L=ex^2Ex(Nt}BHS*Ms$84?An4k3xu9#)6@so! zR|>i|T_xz+#OHZ2-?d4O^nBMQKGln9n=amdnrqV~Bt+VD9VzWaNmpsp^;8V%-*zv4 ziuyDn8khW0(5Ziipi}=&L8ty*f=>Or1)ci$2s-ue6?E$ViBZ+R<&8l7Tj{!}e_uYX zdQs9<)W4sKLH$P$neNnoOr$#N%P}NQ$)$1W$B;Sc$B;Qs$-Pc}J(YCo>#3wuUrr?h z>pyGNfB0PJBN6pTsQz=GvHGN|sQ)|_gZi)THp8her;c1iAtpBEu)Z8}s`{Ud*v+Z` z_fY+B4uFMbB>$^(!?qG5zW_?b52xQ zSI#+l>WMZ;`3%k1m2*x%VQs~a?*y&*iS*#5U{0pLGcJ2k(wWyhIsJVqm>bI(=$|-K zmx4L&KvQ>YIfJw+-2~(eR@O~G&JbnSl%dM5DO)SMrfj3^nlen;HD$OkHDyRFXMlel zG~=abjvU2GV@CL2aAQbsY0S1<5{=o>U$MJu%uXuYH723#8Z%niHD-*mYs^?>*O+n2 zt})}4U1Rjj6u~8a(lb+S%qah0XeN!x<2$7>yZV1ZGrTD2EsdGLCAZ6qL7Z0$nm&z0=r29TPk#&$rGmKO+HLo6H(W<+6usekS+8*4kKgbEm5s!2og0+B zjh;bj+1n}YH2>oml!?dUj~$1fJWj-AR)K{DWmdt|D=4!Hh0Ewz{E^FX7mua!@Of4I zsXcMki;_f9=r2?ZmAv>Seu|iv*!FmBN06UO;T)f(KK~PniPRUU7?05LS8m5uFG?ar z>Z?=?Qr{_>?WDfTQr%OqxQzRBKnY#nszx!9%9DpkeLn|Ry(ozgsUJ`=Nd5E#{1oM6 z+z+J6xUW(_xe~=hYB(In|5=Z#UX(@r*rh_P+Z697$l*hpIdMvclWqV z0NmZ<8Gansy(o$0?jG;wQ%Te{z<&q{9y{XtB~kfEzhsW9e0v?(bl{BZlO}hTA0MUpIxxm% zIE!s3m2c}eK$29xT{zIicl5vG%Bdcyd?zl6%6IlR1(oZl>CU0zyGmt26|V`aRGPOW;8HA}$H#XZXLu zE#kJ_RJgO;Os!m}l=$wN?<_YfrKR>8^I_F5`d-zFQ_o7sfSZ+3#MCJ4R`DL#1 z`6}F1UZJe>U3`IX5JUR#%6H0CYIzq^i?qDXXYs|FuP1czDrG&Pi!Tx0Ml4zG9{|lH z4CZol4#6c{%t{H^x>6zY7yT@gm0}+72+$ka;a>&|8h{-3RBs> z{;zP|i;`TaY(FlE%9{Ma<<4@=D$H4KweTnr-ryIbq_m{b2ygK}X5l19gde~qA^br9 zut0d12n$-$EgZC@N7$FjI{b@+$~sMDy?!~adr^`rm96EHsO(Vxji9n$t1#D+!-TaZ zzw$Q)!VfXR5BG0o;Uq_dAHgLd{CNNDxz0={^b!6WWfx#4D(iwOzCk#{1<*;F?*izz z!tNPgT%HHT+!1d4WXZ=nQZ%R?>)#Dc#0~O*Oakf@e;}^owJv;%@~3ji?fPfL&-8bg zuM4R7S^hPc)#NxYezu=Lh8*X`&++})7=bBpz4*EQa)2D##n1Dv1IVFW{Cq!(0Zb0< z;urWu5Fm$k@eBQSQXR%y&ol$W{Aui{QE(%3@`c=ehwRh9BMlsVnl?g#mrG*Y9@1` zFsaWxOPJJRo+(U~GyB4)Ii8^|y^$RmFCJJ}R-vn{fkl**mDj*xT0Y82-oVMEp)5ED zPWc+wGC#)TgKxYQEbPTH`JFALMnsV~X~S=~GnY zt;@#scr5q#H{oZ3G|N4c3?H1z<(?&|yZBr=N<$1wVL3{}X3WB zpstj2FJP3Fa_;HRLIGaUY19; zSI*RSASv$zQm&%AA?5m&fs`9WHz(yrK_}%VMwT)bw}>t`)7_AA=S_hWJpyx5^a#vJ zxkrTR0Zy(Qfo%`fM#pmh_$-7-`|qG)(*8fS;wsvYZ>jS>Duy~A$*gqk=Z!_^FF69+ zfjU4e_o1;UCQ=^`r9S=+OC=E^^$98#AD#R3HTcP0B9{-iG%crFa{alNU`6ScxzCeG z>6W=KYzLWgz@GbJ9n#W8b9o;#T<-nrOSmrGHTUIRQB|H7of0VV3RO;1oHu^Z)D??V zkwMcaDT)l5PQ60Lhe0!_Gl?RDcB76UiVT`bkuHi1+I<3U6-5TkqO>S7Xb8dOXI28=ba;%I-#TM~L(WmoGrBBrARCcET9+JDQ{$}qVoOfC+SRg}~}tQLu6kOu6;A>)%s?({EIC7e7p$SNjB zMf&sgNNx<^4Lbo}#fx>o{u!;q$Dc47S2CiM-kC3aL-O3mKkrw_-X+Y4oU(FPrthd& z%;WB?hEeXjNq=1^e&O{@#7E`Ic2rVcr{(ds47?Ut7mh$l<1+fpAr>|oU%eB zzMdxk4f@4nlAj&RhC9zhC)Ovqftx8(!{ZuTd_0MUwJ}5-Bk_4&c`t(}rmN*MupH_>K)^a`BCaC4c zv|4U*78LpCr^|mJkbi!fd?l5CK3OG*fD6;)U+ior@=r;ZzvG@x|5MWBE2(^?eI)`; zOOt>4j~t~g!q%kAKO&I7CQZJQ%3q^ika%MekyC1=wl=NJqoKz07o^LVI~JtLR#Mpu z(q!}Pf$U0=y*j_e^B22%JRc_r@gdpK_;&H7!v^`e!(iLdUUv2@T*ACD*{i^^JEm9q zqie_fS=rgy6+>oZ@0N`fy4PXM(AVF8@4h*Z=xV9B%Vu;D&1Xe5AltCqO zw)V%3AOQn1xDFg$WM?~}0|x}Mra?@u=4DX%L7JCQF(f;CKz2?xl^BeR{c(5N#UaB) zB;PhPEP?%j>Wbpn34{Vk)G*(#7(x{d-w}#U!j%!G%`9u%AyALCMbox}av4-L-80h2 zLf-a6d=#Wyw$%=r3j<6;?kLU;8l6W{XO6%)UL3T3j}dfXr?G6JM0k7H^3mEzu3!vG zkQvy*V~4=h1X!hp*Qtr)Z3PjmpLU+;?=eEWH*Q45kU{?7ezS-Feh&L*7cBVIuT*r` z@Ls|R|KU#0%SS=gg$jC&_!ptD#?tox#!n-nH|kx4sm=F)j1R!K@1q^~hj-p4^>#OP zO`21)WKw5qT~BjISKFlSt_BYoja@Bko4UFu)z@`5O=@XRyVhIR)zkM{V_V&pE;V$t zwRN=j&0zs1t8vE4?vCc3b#+}$D{;BArM0PRss0yJJxltY-mVzwRAVEEh(+Wnmbd-TG@S2cUMP8&&uBJu9Z-}wYRZpWqk|& zjNSiw*;+uJ4RcFtCkloYL22b~Kq+Cpw&JnSy zslBPIuBWM?qp|7#f19&Sjprwsmq*Yr*;y zY?g8nIf=tm@cS3ma!G5aWTvD$Q5!GV-W!^=TJ)P8^CE?#0_=n#Eou3tKYQzP|L637$n_$zNc3Qm zf|TDc>QS;^bSsu??g3+{a4LPe#Y+FTD%pl?e(&auJ%p9&$KO%@=DX5WJH>bQup*@; z{GDF>{GfP7C^2e^OFI3g>w}v%SMnFtdVe6`7Zrc%zZKt-lCK6g8C%(wrMKzBptw~@ zjJ*ZBeG?QHTV=BKOu@#wp1R7W_EkNry|P6msnTSsv}*C(ig{jlV_jKOYu!P$7=gU5 zj#Ot?V+w(vYHqDt<(00kYj1CAo!iph(!IJA{c%oR!y2!muryUuTT)w|s;yX5UbVE= z>uSP8wYI6z>u#%0)nR%-pTi&S?rvyJwRWsaQFr6JmX%l6R8%caRhQ2bH72JjD=WMd zsWiW?y|J~)TUt_Go2sIMC5x6+RxF;EN*1l)!b{4lE0)Yp)mEi6HD|9>O?9a^Z%J*c zVsUM1Ze__lk2I=IEvhOjPgO5n%q6SJDoRBxU!GH0Rk{#zMS;RpS$R!us-&!}8iFdS zQcKYiZfQf^8ZJVj%d4wXrIppJch~xs1`)TUq`IPZuhgQF>V@38s^yDW5Emn@%B7`U zt5S_EYg5g24IXZ8GxnRav<7XcELjFqN+YYw_gqQ}kr@h8)ho7Sk7B(#w_+~ZxukY} zs-|M^@&YNEelfYFi-lXdShS^!#ap^Kc}o|kZ0X|EEnS?prHj+OWtEeQDhpPmx|-@5 zQ}qY+AQ;!Dnp>JXQq8@stttEg-})xlZdHng_Q@XEw7x6Vxvs5%^4RU`DW+?yt19P6 z74w%PCaRW~)>fy=Dr!pRRF<>p=T=nKmRCa@Cb%GS3xZTKNEHUDq99f5b#?codPFs^ zqrItnbw`g>mmai}#h;}`uA`;qU}@wvtS;j2)zgq_Xzh}T2wkPAy{;a?PyLTt)ZW{c z>h7uY=9JWwb5~nhld4)sjqY5Ps%z*efSH=>3b;8O)HUUm<)yU<#Tqm%RkgTsFK@~6 zMN81cjz*5+>XPN$Nhp%3?{bXNJX+t|ooeoC(vBzHdU4g_a+JpJuyU6utB}aY+H-kJ zBSw&(uDbT_X7rPeUi5P6yy;E@^};E|xDw3bE~j7m$E)~4WomQ9^FXf{<=TF4_$!|FnIM^jf9 z85~1a>)KRj6P&ZUsbLMeY)dPTWNZfvBl5G{Ljcf-3O5|s+k}8X2=b^{TIt3_HZWf+ zLv3^CG0W(rQJSj8?+c5-nn1}~8Ctn1oUY*;d)C8brK`Q}&XzSz=oYO#Ow6k7KJt$?uZ?v{vnDLn-O+$=F49ewY;8)d!)msx4f_eQ zB$U90K^4Kc%nFs&u!Z6K)ZA)3t?ZEQt7Ala2Yk@h*>h0f37(%QQrM*pZH=j>^)d2ch*;4#f zaCS!0%xFA*%&l2Ov0q*5&4H84ny_!^sp)NKK(qu?de3@vXAFmI>bcbzd)YY79AsV| zhP&$4Ntp`7OkI5=`I>*Uc?~_?ZEX<2sFKvw|7j;X=|5~Bv>n<{5D$$_>pcuo2U4`~ zoDe8PF47ou#W8Qxp)<&39)4*~2*OrJUfdK6F5DAYO0k1-GP(U*A11_|7N_Ar-1kHa+>_+Y)DqjB*?<%_DS_ex(< zVLimkK)V#SaCN<{JiL+F7twxm#iBWguw~&&hw7#A)lDs)Y)@M$xcClN0OJ{r*UDYs(MAJ0}V9fcZ}J+ z?QL~E4XeqfD89J2ja%v_sG21eJhxyjquCLIBz5BIrsidJt-Vbp4LvO#GL+Y@NG-<_ zx0+XXcKqYciLnoB+{PwZ=khSm15R~$N!eaHVATaH?sctDCT)S!2CKGs4Q-mnR z6x7B*-axBp)(!J`0Zky>=JNGeDm1zgOsCej5D$`|wEsi6(ckTPwUFuI#u$LLv) z-Fp)cwAAxb;sENJQo7qiC7m1)_30Z3#7vbA@D+2a%V_9N!RxvlBC~U3$vT>M?PM|X zHjU^gopb}fTYPWsZOmVdEnOJ&$hE!g-7Txyn;P>PR@ZfT`2CS2+cjB`!k_G@@oLlb z?CPOTh(eR;YYKf${m=b|#%1p6X-=Zp;OW5Y?yXPJp&h9~vou++0!Mc;JXF+p&8;0+ zfpm#6snfWig$x(8Xmf)OZL4{2hWNpfrBCeBFzt*-+oEtPf}3laT49V@oU8<^Xmm2T zwgcML)U|cCHZ7v?#80-3n{ru*TQHgRYe#R7hbfYSOqMfqWCp`bz>`YP`e16|Q4mdI z?Jyoxm(MLJK=)5_Xa*|^*YJ|E(gHR(meIke$M&kJty)4J!&=v^>Jj=h(xF!&gf}xE zuVS#jTT~${DwM*UMgAp2RaTXh;cm%7Fn6pChTrw6YVr-YgvaA0)#Wv%C6!obmsKoF z6;7UF8Z)PW=0B{d526FDjc%!m9LScbSX5KW7BvGZ9cu-#N2V!l59TbcyR3X}1=jp!<&`Da z&{kkmUQ=EwtI|13tFa%gEMGhi8_nbt4vDGKTPU{e;)eDO9!`Z@dJYP3N z)-!0K5CjHq2T~lAFkCn0dRS`<%SVcAYJd)bc7iO!5Fnk2Ou*4fL#tb0K@qQ;MoJqR zWU(aey<1yomXo~_jN^ihrSNtq#rL{BX}I2W3Z*rTs-S_34`B5l8isVPJ{Fp31+@S8ZvNj^0!_m|?tdBM==`(Mp9vnujXxZ>94~ut=yaoiD}O&GOqFi>1Odg%l1I zbR9!tTG|f?juukIUNsIsHd{UhQnWcVG3$b#*4zj!{vqp}wAh$ZELk$fQ9xEKUci=E zJ!9pnmY$Uz*m_WNnp$Z}z{4Fpi0SC$D`DPB8sNF9GJ5M#3RY0$F5W;jHsJ(Oc2IDe z?u_dic{fIWmEi`*ja)g)qOL*H1g)1K%57P(?rEhp!dxs}yiRoAgK@?phe8+-_)Z=m zQ*&_ZLb;&la5YOxO3SgdaVs-d9tvQyLS3p$4n(j#4+d10SY7MZSJWcxi`4zH`hd;k z;X)g&ktlA>$hwMK-BrLdx}1*C=3DnaWhJ$kD0t+YN`DfJY(Z||oxL8y@SdTpt*+0e zAM-n>XhVy$&*s+d zrdF@h4&LExiY+va8Qkz9(~C%W`l-(Rig~nWkfWPm(NJ0(4BKKaWBtiweLEYpr+BH2 zV>Dg!b0AL}0V|v6hMpHa3 zgU{g;S;*9%AZMGe-?2t6DfW0a&*$x?2W>B%X6eCtmIonM; z09J!-urUkaX+fX8AkeUZ>*~o1b}KLrW-K?d%9$hi!)|8iT+WP4)I6Eu%$bQy=OiuM zb)vQ{Y@eyj=B~g>i7uwiGReYeo0Y^01E;M{ zxw%InbZ=UeF0R7zf9aAXRXBI0Cdf3yLj|q!HlOgfu#M+_if5>+TUM=>5bf@4XokP* zc{9TE3#SmLvZ@YSipL>tP0x?i8rOATwQi#rTFK_xO)9vM>|3I+?*%*xle0D&+-Z3U z7f@94VHiajKY-v<3Yq`V2r*)?sM3)cn_=pk@Jb^dp<&mT>OQEw0gp<%c^;A{eMx=d zSExUW^k=acyU)J0w7QD-t%%w1pwm8uriqZO>L#|eSRUbFo7dHY=x-FWl8xlVt1MMI ze{l^@P5eLtrP?$II8G>nv7Do)A{_g{#G$=jb~xOP`5=s9h@_WJ?z2*HhZ0yI6ic+E zJ;j<^S+RuIJFqXuHl2~`qr$GZ4z z!~0!f|3}Mlki*w$enxgT)WCTmt#9OPk~Y4zm;lp zaY`-0f{voOCVYU&EYHf>xzwJTy%x*C3i?qeuOcggb)y8ouAp(0xh~bv)76?bCervx zuZyq;i+Pt3ZZ5Del`Rkr1-d}$+jS9@>iuBeg@5FcP!}(;`*ZNeZ0c(`A0vhPuvf;D)3hFodR7U%VU6#?Zao*ykd8Nr@ z9=}VMm)}-b-?Dp4YiChmGeK9w>fO8WzGO>Va|5`&Bfq;1%cOj29Nxskv-92a3Xsv$ z+upQ0jr~Y>_I9t%@9gNL`x_7F?e59PU!uln-_#Xe!FmbT8?ZdUwdPKwh&wt7yVteg zj4}U!-nP#C9vXXbt+ll!ziE9Zma%}&x*lxl+Vkt`vEab|GB1BsUVatSKq&9Ns=XJj z$#0gWXg>855EQTP#aUKMJAmFVz!=qzxW|o@*R;N&sgn-myM=q(>6KBbT`%zpIKK&_ zvtE!FAyFQ!L(Q}vLPL9cyQm5>6k-XN>RMasx}_pETDP41lMwejB;Q;^@m1~lE~k6< zLKTJ=02+H+oAR+`b4tQmaKOP$R1==)NWr>QtLVf4TkibUj*d<;DHW=7jcaLZgRx=4 zE||3$GhPo~rG$!&Fl;mShpSLUTU+;PcwcgR*Z0)t<7>6M09PQ{+SrDA+njt7hBmjf zy!rj@>dN7h*O&klPMO$xvUDqlyg;6W;b8}bQT54PV!A)HqbYo8|EQQTR zdqb1)Jzrnl(SrDao!6jXcU?0Iklm?mcyiD|0}zFQ>K9s$Beq#B5Y`+NAm1Y1I}rTM z-JLj<6^X1;ejV(*svS?EdZ-E3+%SPi4g_^}b>t)B@|*Cwa>uG(vX=(P+77%-jdz&y zv5ahPX=-gGVaV%fUzOj4=luC>uHB&puCHzBZmDm99tZ8dx}~v^y-v}E+wqvL0l6LR z(wXWor_d0ZwmjrP(VemCI~L98LSBle10Ck*Sv#KgVW#0_rj9!NY$O7Nk%8_L!HJfm_(D(WKwjT|c*lj)k4Uw0&$kOzW#s^jdHMKQ`CL%PBf4gmye2 zZ|O`1Gev3o?f`}DlV)lKO()K3@E%X6WPg6OiC3)dl>@g_WW%qg=SX(TPHl7B2FT@? zyI6MmPNVM`6i!z8VG-?XFhb&)G9OYvQC>XL`q-^#cool!c=rO1+alsWfLAj>e>$X= z*a&xxJ?od#`!$R3ehoL+u5LNN=%GYA8Yqh*Iyd9X?ugA*B zMb3ex=YZ z_$&}3Tob();r3U&T-w5>lRHUjbzQ4=MmY*e@v}XQz8zh7OJdDjdOMiLvuXqu48a>Y zeS5$KtSrGfVx?CHrx-L$>Z`ys=;56Ms0f45k(ItY04*e^+cRf%5?nPDfoYba{$ftK z+#91dBIs-tkBrP4$#jm`v93M+9FUgJ*zD6l)%X3MaycJG2^|yhP}m(VxgmsmUiz+@ zFQpH@d?|hSC&TE{mp*ML*6Me3x<3`xmsBmyH#j#a~*F#tVezOJJO1_7D zWsd0P>{VM%jo=Q({zQ)mhk%mGN){mpL;U2o74vr9`ECY^YEY_*Gq#~TgQC}(SkQw`TZF>@ULIRn=0z$?yW-^66rA%HWv1sIwqZ1BnHG^L&aF3z!96Nm=B>M$zWi?&VsqW~*{jviNL~7<&)rwd2xjv68 z{QCiTcY_~-K|Dt|4H)#MGwesIhR$=2$Mh*tRzrs{RE|asKAKsKg9F#wNGC2wtH$ux z5t3W}eS|IkLPBzjzmbqE+M?XzEnc0h#?TcthfJ}VHq$31ISi#{^O3Z^JuknA!7tCF zzi52WQ*3IYnJL7;T2nB#Q6Yp?+NpbB8}le~8hODj;Sjm98qp4)hjSYjc;fOU7%i|u#*-Fo*gLu~3e-3A3fopqgR{AvhYA|B_$-~2 zr%VoFyz;DZRlY2Jazb2S&rh9`9+jvY!sRoqyAZ>CY)SK~tZR9+bkBozK+yv|ZYu_9 zY>N2VDFq%q1){HJR>(cO<~JC*`tT)wYEfq}Ez^0Ggo|+icLTOJKgi_zFj~~hJ4anT zbi(dtJMs^SRs(a-jQ4kXB z7=25kro7hmb}}7nAG~sHxRGwZ>U7{Q?qR*`Y-h{bmil_|8ul$;obM z?3St29vnW>FE&)-biutsi+2!pmJHs@kR={mkRoNZN3e3bYAj!dgT)^DjVU)DqCyS` zj&HXDpdxtUr>_J#J?yy}4TGUUXpYg}n{v+?!}kd2tvtM^#%iShPEO$p?6#Wuk&y1O z@ycHi)@(*^UTNu!yzz8))tCoICkrM|EJzmQ6&4g0=NC-LPfpuePVVpvnE35d?`M3X zo_~lxAmZhL?PpHBpzH|$_{f}`{$Av*2j)CBX8`^RLi)#+iEiUdAr#3=FXq{Dk@-^W ze=M`&7nC{R7nCXc1!d}gL7DykdzoKLk^iynT9sEqe^mxswT88xKMu(ZJ~S=tOs3ij zI}1|Hg`I_|21*^=($L+7L?3$+;`fw;Pt5z`=Kzp^Pc4GwuMD`0QTqL5^NIHP`vXz@ zDl`3kg7A|e|Bq&HVe@<{kKbOCiye_%oIP{lr=r7^WU&5ikghPJ`hyD@{{UsdwOZc~e5rlu= zheLl!{v&y6Ki-G8>BHOhVfuq&@{#*T8+JMLlYWyv-M?G) z@$csO>Hd}c(7(c=e}%^fl?u=A!#$ z;r#)L+kUqd{7X;3GV@L6a8IQ{v^D|@bj6VTP3__ z!Qb*9)1(3k?`3>{Z|;8!ToQy`!ut?>V-VH}j=lc)GfDDEc(isqds4_hA-QdC$T1)G z4F+dkA=gvH#KF zro6EJ4d7!vnD{vlyuZ=!GVqPY|JQ;y7`_$UVA^{Rcr^VrfBq!Ahro}Rczg={ z6aS@JDv`jmm`{~2`mSAxTB zJNyr(KT_rLSAvf;@*2UjjXtg53rB|Kd%&OLpS%AMr1Nt^J{tUp(RTxQC+mOk1|$DG zFrI`5@-74K+Arj5!4H`GZv`Kk7v|pse#Y4IAu#z+J_+wB@DGMx1jq5u<-dV+!te)3 zPc!@((u)j#jdZ=?pO9W>IEKDOZFcf=!21=3JQUnxcqI5YhDU?>Kg;A>;D7M#CchZ` zl;N4+cTN12fd`xTsRR$lKl#A_NUt;Tz7l+%=|7F&b9N5Pw}Shd`0W8dX!^$?-~lH8 zXz-s*{s!<)_~+_B9qHl5-{*nzjK41f??&fX{K0$xKAH}*ly3!pH#p>b!EqCRkAM#~ z_IL)oEH5no3iu_X-@D*9Ond(hUT((kufP-VPd*9nC!}{Y<4*=+^E4wb4nE4*cNn>Bbi@Pj7)Qs6Vpe6|{VjhRmm z1XmdQ9SrU;{x}Le#k79|xX6qLXMoQ(@pb{_?-=TH1$ZAb-rop55`RiiJ_+wm@E|k3 z{~0{n)b}L#V>4dA2>#yK?@jQx#y)=oA7aL{&%xDZe)%3e+tladuPd%G<8>Bzu&I9t z_&H;bk>F9LJ!8O!oBAh$n@xY33ck$5?`-f)GhbGKugePUQ4K!Lw09qHk7-XM_zV-@ zZQylA{#tOo(eE(ujb^+*9=xyd*D2u1X8u11yfi=5=Th)zCcdu)e{bUFHt^}Dzx)Y& zhsl2wyw1eev*1&WJzoVcGV$~t_!gtzr{EbTp1uYjVA{74e1eImevrM5@$W$J*~UM^ z!GAUJvm3_R`4>A3(2t3N%KNH+(`d>Ntant`6gEs}6f`qpme4No|fAIOnJ}uxe z#y(x()%Yi$g!e0?M;ZGZ4Q?>@ISIU-vCr?pwZ=Xdf`4V~b0zpw6HhmR>vsz4y9<1^ ziH8Tl`x^b80*^QG@e+8t84uqAA37{%r80 zroRjYmz(>y2M;#$$yo3K#@>^_JDBp*z`3Tr67UHVLwy&3%S?M~z)zdQz! z|Dmy^%WyaNViO;SfH#@@j{&bV@$p;mf<$PKGr>0*dtU_pm+603frp#*$IamPO}yR> zz7TVke6YU(M~(ge0!|ry{tC`E?SC6gdn$MT$KZX8yf4648~^+pJlV*jKg@cz>EAiv zZ;ZdT20v)>cK}~)+BXioj~Oot!0m>ogO4yg2YkBWh2Wn|{MUm2Zu-l<;Kz->XzzOO zxUjt);P(u#2Y+Sw2ykqCSpGNQtqq?B&NTDedEnuO{{Y_E@b%yshW`jIG3$Z*!4u5< z@;JD_jCaq27YqpXc^&+^(dPs3&FEwDNqGMNe`5UoEqJi8*U#X2#y|a$cb~f*``tm{ z^Nszs1()F-CqDsRZ^oAi;7iPSFd00+%ulnx`x<@bfrI9vz9rzNcM0Y11wPk|-}T@h zOn+MgUTEUI2YkMXuS3DlZxhNp7Tj&->)(OroBn?m_)z1Ii@`sd{%|$;shvZ4w}3|m z4M=$RfG6(~=06O+%;Y}}?lt4n%iya_eeZyeHRI(cVEU89@=17Kf}2f${1H6gv^SRR zdB>ae=>TwvvDY@>d^2B;0&hr$^2dXJR}^v*?C%=#4Dc|lspOOJO2MZXe^-L<$_w+C zf-f=S-+tg*jQ>}Gv&{V832rm`9t3{Fy29&P;n3iueK|GVJBO?=bb@~|0yzXBg%+V>Oq3jC8# z!plI}^Nhdo-&J^f6o&c3z~>JQIS>4a>0dj8JB+;w!4V^WH}I!sd@Tb%X!`FW@JA+o zmx1#qg!QGsc_yA#gAX?P90+bV_B$ASkXf$IN)}XYiNCo=<`wHsj-q;Kz-<-UN>`@%1?Ebx0q{~_S(`iJcs2}YOJPr@4me%-{+MDPkTUrhxM@x$`7!8yjh72r3F{A%zB z6W{xQ-!t+X!FS`Id=g$8(pQ`IuLbXJ=DWkdUm5wwgXs*<-G2)B6C?i|@Y_b-rQpv^ zJYNew$=Lrk@J_}*e*&Lo#c6!F48{ zH-dLJ>xX_A>)$u!2Z9@oJ?MXxTWHGf2*&?p9N1$Q@J*&a6@l+De7Y0hxHb@4Ktp61nw~Y z`WN^qWA7ipdrS`HMUYo(#;?#fR3_mKMgF74e%pf&F!IJCJ;?Zb68H!+eoq4rHvPQ> zJjwKr1>l{G{cDKL{J0WaV#dEFaIcB?cJN09VSCnrUpMs~4!+j(pA*0vCWYls1rIUy zrDs*O#y*#U&oTDA4*X_8c>nF-15JDG11~ZC_c8FVlVSPiz$Iq=@*22dmoWc*@QJ4V zpMf7U?fnLvGQ0^)Hk41o%S0?}XW}CloG|e^0=(3e-wFIzGd}GK9%{zxV(@xn&)vcF z|EIb7=7KN9KgU%_2j)WjtN4)CFcGd@GxV)t-+6u56kZWKH1oF9QeYW!~6m& zZ}guI-rvlRbHI0-{=X1BFmNEAUxD8>_3sOQ!`P=8e3$7@9pH(kzpe-0X4-!Qc#&Bj z{06+hls^r8oauk(fj>3<>kr^(O!@1l?zON!+*HveNhnVN6()BVd|Rz z&VWq$B)rMs0Y?8>;I$@y9(a$f!}3eO=Vphz7x-cmFZJM!IKS z3?B;~Xx10M1J5w`p9QWo^W(+f1C4#I29Gm*3;0K~p1TLURbihCtH4JX?gZax+ItZA zHZ%So2|nJ$|B2w&2ZZuZ2Vb2Gnf6xle|^)ngm*dkZPQjY#VDR^* z{o8?WH~nigc#v7I<%3t6`FjfZFJ^wCzPG42)Nej`t!dw$;Ma}3y}`pw`x?L(8*T+J zHT|m>yo0&_*We#byd4L=+1T%7@NK5OXM>xILj5iQk2C%G8t|hgzHbFjGUe|D4>a-c z2>4#Z^e$MH8E;+z?`7_P7d+P3=kMSjP5<}`yvnJE`1%R_t%=tR^z{0O2*6MwX~xWdRk1H7%V-v!`&Gd^4ae$%w)M({t)cz7rH zG}9md49>uq=jwkF+->q-1m_!nz6s9F3(Nlv{IRK@-t9Wbj33{F-!$#@QT8#Te-?PE z;UVBI6Hg<-(@lM2z$cmhF%g_F_L>TQ$n>|_;7l{$R)AkH_N)fqV*I-gcwf`rM(}4w zUK@COGas!5k2d4YVPJX(Pd*9nc<@70LOumt=@9XA4)`SFuS>x-CZ4Yar_BAgfxj{O z{R#Y~DgP*#p7F~E?_+|WG5z~h@Sjcpeh)m?*z;3xs~OL~2Cp#vWh3}SQ-43qo%BwO zt8XB9x$*aKaKiX=NAO0oKG+4kW1ij)dlZ51Gy2a2ziIkUId~rv&x^sCrhUu7Yj+9d z?GHY}a0_^Y;V$r*hJOXV#PHGJ>kOX+zQgeE!4Dd~5d4T4Z?6OoHv74ozn`w> zLqmNZ1m~Iip8}6I@$?cH{~xt}65de3NAC_&$-}vru=2#Wu|{$2QD__*#({{s3^58Na*1N1FNm5HOvIJNd_eH<@_&EqFhdjq&45@Xf}a7l98k{pTuhyBSYz z1}`@8b~pH>JSPy(|G^uLKmG!~*7)%))1(~W<=0B>&$raI(TPO-v{6WP5k@=e7W(@ zx8UbYfBG4GvXS2(v2%kNUj~7z&G@q|_%@?o0(__$Zzh1RH9Q&o1=hs!NqDosKb!n{ z;O&h4mVm2GyzB+0IoI7^4_;&9e+_tw@kbB%WMl6`!TTEd$AWu}e}4zgHRJnP;KNP+ z#o*)3_;NM)LSz41z~zOZe)oW1cZhg>7+hr9|1|hqBmZUaEVEvF2Rz*5e*(VU#K)K5 zyG{O&;E`rLilJ|xI>jk~{Xh5#qwhB0k4^be;Qh>aJ05%|VnRL%F9}W=d(HsIP^Zf; z1sCOoTnWxM@v;;=#Q1MN@HZxYR)J46+zIY){BaPN_BirMct?WIGWwqg{*4(=P6zj3 zjB@4A2m8kUmxGTp`8R;e@z0gN1L?y|`yK#)?6Tp{C%`Wmd%ggE(2S37fNwYB#fRXR z&3N@saEs|*-+@mz?eh?8Zy5h=1)gi-cQE+VBBxNo+YbD_(PuRHIWykpgBO_oJ_WqY zj0bywUxW_wNqFD;ZOTZJ1{A<9k<%Q*M1&=cRxEFklvHv6B4W_?613r0Bc>gP4dd4Q7 zg!e9Zkn!i=!98Yu@fCQfvDZ)F-u%tGnET7X-xzx@0_PcfF9Tm|#*-AdpK1SU@G#TA4g`N|`oqECH6~t<0zYcn zvjKdgiI+3L@0s!O0D`?BOnf{ErZtLu@cUcfn~lBS z1m9)&Z{R;0{v7;-;qSqZ8GHMA=)Y!s$pQ~H{c{NTS`$wr!55qHZVY%PWXdPuO$5JZ z=G&>@3KKuG!OxoUw*s6u*watKs|JUkVcy>0z+CwK;Ck?r`L0C5TLZq#*rx}aW9G|4 z!Qp3X?-+1paA9j+Ti$H^|9j+rZN`fW!Qp3!cLlgTxG==K0sOY{-yPt4`nv-7{Y)^O zLC6Q=EBJgfe!T#`%f$B^;P5lZ`vBY-To~ki2EN$%?;CLV8R%^UR|gjcdKrk-sPS){ zV%LnX!-80*n+ABJ!0Uti2YBPaYbLl039lfne6}|Y-0ZUPX2@*t$9e8T!mCItzm>Nq zc$v$_-{05^Oz*tOC*jqnmCy7J0EheSOnx_+_6V;0uaJM3iN~YU?$7WxfIoA^y$tX4 zwERF2mx%IjD+h(Ws5d4Aq@vz9?-F;vk8v{+^KMY4ItE8Fya!!AI2Zq3>cgM*VJ{eq zr2HUdYV%_8w9Oa(iA>ran11g24U{|6TLM%7Q#^^m=b%Wg-3*;a@TS zO~$_|_%{{*rsE&}ARxYy^hHIIR0jXM=fuiJ{;zE6>hTBI))JT0%$;6HcTl3pT`8hF zr6~T}+f_~7;jQ#1(6yNUpt87|)WHv`4nL?u{2;w3Pm7X@K++OFrpXVjomIwF)|!5* zKyCoBicG3Z{M9j*l2mC)6_-?bg-$P(Q>dC1s+>Zno60FvIrtBjL}!)bjKVg79{4{X zIloBd6{)-;l~<(lid0^a$}3WN#cGRU)vs9P6+6qRykeDCtn!LgUa`t6R(X?E-ei?G zS>;Vud6QM%WR-{il7jW0tnwzSyvZtWiu0Aq!!Mz5`6((7|IeYY%A2C{rl`CrDsPI) zo2v4rs=TQxZ>q|}p*YK%s`93)ys0X0s>++H@}{Z0X)14;%A2P0rm4JXDsP&~o2K%n zsk~__Z@S8xuJWdH1I7b)cl{K}pwzlCBRWT_;MqUX*m*DCzo9 z(siVy>q$x1m6EP6C5xS%U2jUd?v!->Dd{>?()FmM>rzSAr;@HyC0(ydx^9(p{VM4? zR?_vXr0ZHq*SC_cb0w!Z54!G^bp0#oI@tfy+MUN+Ij`>n-%l!0NGegNz3bUU(thSm z5-Li_Sf)l%Xi#Y~oRBh~49PqX2@#p6;v6R=Gm&|ohlI?(`&!q1wHIIK`~Bzl@mlS- zd)@o0jyC1 zYZSp6WiV0(BW2KbDal)Aqzp#NV5AI2%3!1nM#^BM3`WXeq~BAKG8id?kun%5gOM^A zDT9$R7%791G8id?kun%5gOM^ADT9$R7%791G8id?kun%5gOM^ADT9$R7%791G8id? zkun%5gOM^ADT9$R7%791G8id?kun%5gOM^ADT9$R7%791G8id?kun%5gE-z&>Ha5D z1|wxKQU)VsFj591WiV0(BV{mB1|wxKQU)VsFj591WiV0(BV{mB1|wxKQU)VsFj591 zWiV0(BV{mB1|wxKQU)Vsuy*a0t1w0iW27)f3S*=&Mhau3Fh&Yvq%cMbW27)f3S*=& zMhau3FvbdFtT4t3W2`X73S+D=#tLJsFvbdFtT4t3W2`X73S+D=#tLJsFvbdFtT4t3 zW2`X73S+D=#tLJsFvbdFtT4t3W2`X73S+D=#tLJsFvhyRVudkQ7-NMoRv2T2F;*C3 zg)vqbV}&tR7-NMoRv2T2F;*C3g)vqbV}&tR7-NMoRv2T2F;*C3g)vqbV}&tR7-NMo zRv2T2F;*C3g)vqbV}&tR7-NMoRv2T2F;*C3g)vqbV}&tR7-NMoRv2T2F;*C3g)vqb zV}&tR7-NMoRv2StFjfX*WiVC-V`VT_24iI~Rt95bFjfX*WiVC-V`VT_24iI~Q3exb zFi{2*WiU|&6J;<_1`}m4Q3exbFi{2*WiU|&6J;<_1`}m4Q3exbFi{2*WiU|&6J;<_ z1`}m4Q3exbFi{2*WiU|&6J;<_1`}m4Q3exbFi{2*WiU|&6J;<_1`}m4Q3exbFj1@$ zg)vbW6NNER7!!ptQ3exbFi{2*WiU|&6J;<_1`}m4Q3exbFi{2*WiU|&6J;<_1`}m4 zQ3exbFi{2*WiU|&6J;<_1`}nlcJ1a>7!!ptQ5X}2F;N&3g)vbW6NNER7!!ptQ5X}2 zF;N&3g)vbW6NNER7!!ptQ5X}2F;N&3g)vbW6NNER7!!ptQ5X}2F;y5-g)vnaQ-v{A z7*mBYRTxu+F;y5-g)vnaQ-v{A7*mBYRTxu+F;y5-g)vnaQ-v{A7*mBYRTxu+F;y5- zg)vnaQ-v{A7*mBYRTxu+F;y5--C9zGF;y5-g)vnaQ-v{A7*mBYRTxucFjWRqWiV9+ zQ)Mt!a#MvdRTxu+F;y5-g)vnaQ-v{A7*mBYRTxu+F;y5-g)vnaQ-v{A7*mBYRTxu+ zF;y5-g)vnaQ-v{A7*l01RR&XKFjWRqWiV9+Q)Mt!22*7)RR&XKFjWRqWiV9+Q)Mt! z22*7)RR&XKFjWRqWiV9+Q)Mt!22*7)RR&XKFjWRKWiV3)Gi5MS1~X+aQwB3-FjEFI zWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS1~X+a zQwB3-FjEFIWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3) zGi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS1~X+aQwB3- zFjEFIWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS1~X+aQwB3-FjEFIWiV3)Gi5MS z1~X+aQwB3-FjEFIWiV3)Gi5MS26JUFR|a!sFjoe1WiVF;b7e4B26JUFR|a!sFjoe1 zWiVF;b7e4B26JUFR|a!sFjoe1WiVF;b7e4B26JUFR|a!sFjoe1WiVF;b7e4B26JUF zR|a!sFjoe1WiVF;b7e4B26JUFR|a!sFjoe1WiVF;b7e4B26JUFR|a!sFjoe1WiVF; zb7e4B26JUFR|a!sFjoe1WiVF;b7e4B26JUFR|a!sFjoe1WiVF;b7e4B26JUFR|a!s zFjoe1WiVF;b7e4B26JUFR|a!sFjoe1WiVF;b7e4B26JUFR|a!sFjoe1WiVF;b7e4B z26JUFR|a!sFjoc(Ww1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1dPzDQSuuujI zWw1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1d zPzDQSuuujIWw1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1dPzDQSuuujIWw1~N z3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1dPzDQS zuuujIWw1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS1`B1dPzDQSuuujIWw1~N3uUlS z25XhUT4k_S8LU+XYn8!TWw2HmtW^eUmBCtNuvQtYEoHFxE_}VMcdxatyVWX+wMt-Z zDW%q0x*1rjZVt5yYi%i`=)k*u=+IlB%51GNTdU00Dzmkv%;KBzJ}16e@1vG7j5F{W zKF;vh@@tjp+ES*`fj7p`p|@m98OIrTyANmRJ=;>|aR%Oa#Tj~2w{#zXGw`+$&hWQ~ zYIUDbTZ%b4@J<~%@Rgs57&Yby`_on$$2lK!I!f^09ivgT|2bFP@v#5Y z!$Ui&G|mq7e#F@EqX(CMh~p;kaI3u!*lX9pJx3ffbZXrt8#-#@;L#IGAJJ)c8b6eX zkH6^SQ}|eDGvB#8ta>-pXR#kvy|20H-S&@-z3kNNboRjN8ED@29{b0}5IbppSUn?A z_xWMfCz+exYya4oW+%-Lt7nE;^PdUdXaCr^)J|FpR{yoA`&zK-cbJ>rZ~xd>WGAf! ztLG83)_TF*^a1@#PbAGLxF9CJ(a!0N&6x!DYUFRXg$^I~3yRUcH=5363Feg@}( zRZq(5uUo<{y8T^}W2jfbx(a}!9e@ZMJlO$M5V_OAJ()f&C@Dx1| zewxO13zpF%;AiL);pOzH@U!&UFs^VLbLU|4Z0otCcQ2E7Tpbgo8B3Ihu$B4 zm&Sfl0^DG290R{kPk}$6XTTrQv*C~E%i)jddGIInBKT8!3H%xT8vHr^Hv9$s5&R|n zCHxirJ&cWH!w&md5qv{$0)Ihu6>t!avc6 z!9UZ-!MJj491s6Wp923zUkd+DUk(33-w4}(7`MW>Vr^hQ5kWorX?Pv_dAL5k0&YNm z12?39fN`U+fn!Dljp%yonAf8l!Ryl-!HsDge;~k}lZ^=8fG%L%xNLNXH==vOO=;}g zCD@qm4>zOnHzI-WnC?)xIqSpV7W7Ei4>mXk-jsFhKQ3rRPlGq3r^9|QqM2}O*3W_4 z(AU6Q&|kuSu)+>@mlSNp`Xt!v3*fe_zgSj(A4ZsLdohP|(b#u?;2)l@f;+Gt z!y$b%Tuo1hJJPdZzYI&^POQHPZ%uz$*3-f6D1&WSKML+lp9v%AHs-@V=X-D$)_;Vz zqw%-n>Nyhj%ZdGn2VL1S3$CH(!V!(Xs}ExO12~~q!@h3)M&^|D=CIG-5B43YVxQRR z$G*gZoc$-4^`8e9tX~7y(hK43=_T+E^z$(8J|BZ*qd2SZ@dS zps}y60C$i!c7}JM_knk%hr&JSW8q%($#8G_Ja{+y8hCelA>4=l6z)s^4*NFTaDDS0 ztZxbXHpG6Wf_|)HKghwJ^j`2@^dNX|dJNp3J_+83J{R7Xz7qCrvH;$X^+#a*abk38XQ9J1^YIc2_MQj_T!{&atnMI z>kq=dO`e7avAz->On(j!p?`sg(v6##htb&gZ7`hP20onL0rqXO2RwrHL*OImqv0dz z<6++>XTc*`zYHEl-vS>+KL{U9KMmuTt&NrNX!>*5w@K9o<}s`nu-{I0hsUx$5cX|? zeXs`OSf2tPOP>ypr!R&l(DUGl^nLJg^ip^dy#n@a@(Dbd^))aaAlPWMp?NCZ3ifT% z5uV0+0Uu9ezteUU@6z`UgioYL!Y9#F;D6Ak!@f-x!_!%R89tf*5I%+e9zKuX>%-ugH2#K9J@esNtUn5$PCr}Lvu;zXpTT+?_)NMp>}wqkpT+uA_-q>c zXjIQ7@HwpC44+Hi5Bv4|E&NZ`@wa!uY`P`vYlZN6tPg_ErzgM{(9_`y>2u&Y^ri4c z^iA+wdJ%jvy#&65UJhSMuY@n7u`j^ja{7Dt3c6l1^Of{Q@Ktmh_-eWnd<~t!*V4Pf z*U|mq>uKz#FSvm|3cit^4BtdQ0MDaegm0!_gXhz4!?(~M!ne|&!?)4j!VBmh;oIro z;5+F0o0u2UZQwiUO873iBfN;-4!)blKJ9{g=sn?k>HXmQ=!4+<>A~;=^a%Jt8vC{j z9-@zhAEqb6kI>k^UGOMo&>O<9(jmNp?hL<1NAT-(0k5RH!*9?%;Wz2N@LP0$_-%Rs{0==1 zewUsEzek@4zfYe5e?XrPe@Nd1e?%{WKc=6CKcTUYxZqRzcla}U!xrYx=`Ge#S!mH?~;qT~`@M`*V_6_CpkG&ieguYx+sJ4gDIt1^p?!CH)hO7XWOm zXD>DdZE5TaNb~Olw`2VXxRRb!*0TVvV*PQrJ^c&Zfo|H`j29Se><(Ac*l$eGk)8v0 zqUXc@Gd=)s&H5^M8+u)PK`rP^ZwhZqSHoTC9Nv!J4em-0fPMZW;TqN_!x23T_Qw)) z;h6Pj;e`GGPU+QfMq~dVK~6V^{a}{u;ab)ccze1hyaT;I+>JgQ-jSXN`(>U1<3$=9 z7s7rym%%%+{vOd2N#{MCKed+aWzW~90bSrp&I)o3P6BsXI+1LdhK=+3S(u3fG=wsl6Y3!>ZID|eO zK9s%)#*1M#u7?NFcfy0|#qbb%IXskp10F_y1`nsP--O_Bx?x-M2)a3Z1YHRqNq2=u z(%s=vbU*kg`e68I`ds)J`Z{-ei$B0KLwAYUxkmQKZD29zrz#g_1l>z(k)@U zKxm^9o7Uz{do(x}0p95b8H6A$m*rVR~Qq z5qbptC_NGOc}|5FvwknUgnkNsjDD@G{}cFe)_;WkcUHsD{4ds9!2hP(!%xsL{2zK3 zI0{O6p9C*u{Y>~t`cl|0=Y04n)*pbMrk{fSGQ18iWBoJu8Tw~;azyy#>3CEJ_~+ej=_0{mpG>(fGyh1mJy}uv)D(gex74)%X zJvYOzvHl4BI=#HCr(q|nuVlS7{06-Z>}w5&-(-CX{1%OU!mHfB z!tb)a0)CJF1omy)c5Czdtm7DO!3Q*sH>$M`fInn?1nl!42Yu}f6w~m@DKE@@Q?IE z@EUp<{1g2K{4@Op{0sdn{43pLTk~&p8~As+GyDhL4X#+Hl;wVKKpzU@O*tFK!0XT_ z!1d{~;Rf{Oa6|f5*mv&y5R5nUY%GJ5|w zc$3h^RJbX92D~wS3G4^6z8T(x_50!G^pkK4`Zc&E{VBXD{S)j5kza2+^Jc8$I90*s zbSJnqT?@CN`@mb!2f8R47eSA3G4@tzZv%J^DbP)o*&@$bi=OZ4s=U6 zq(iuxw$Do1^FF#a+=)IA-kLrF-iDq8;|*9FGvRINi{LKwjqrB#J#bh03Al!S1;(4V zHa>!5`Ug0n8`hXpx+R>^A)M3p5l?$gNB4$n=>uWkKIg*Qvwj`C1HBUNMt=kENLNH= z|6cnPraix7eNT8N`mnN|IdBiw=fgYG50v$+f_GuPQEc9oZUN&BY8#bsFB<#w4|>zx z;N9pxus_#35Z;~j;jlly8wdAc{X`gVdfPY?_UCSM;XPQt9_~jkg!iN$f%l?ujJRNL zdIgL(&ux4N??bPG_oe@U_oJI6=KXm;vsuZkSHlO;_R&Xs-be2W51=Q*1L@iDLG(rN z!8DFH7#u=h3*!xZ8}s19=mqc~dJ#OBegGaqFNTNG|AF!5zl|5*;q+VZsr*?!gAZr@ z2Y3WsFEt-QZwMbrZw})_1U5o=6m1^^wda6zclc1psd zdM11AJ7j8$O%$$*`|G6ZUoIz`pMFu&;X; z?CU-T`?}A=zV17)ulqIZ_fb`a`5dlmpIKkKZZFu^-5>UKhr_<^c-YrH8TNH&!@llS zu&=uS_I2Nb&*i$`!~XNuuQmI+o4~$qCG6|k2dvkw+XMD>_lAAlL9nko8uoRsf&a;M z7s0;nu3y;K zy&Cp)?|^;XkKpsU?k}*f+qj$A*KG~^y4%3M?hdf8y9ey+9s>KiN5j7E@vyIZ7kmNN zT?+fUD_~#u6WG^X1N*v-b~O9CtzcibBkb!Iu&=v2?CVa4FXXxx!E@;A;EU*m@Lc*) z_+t7Q_!4?0d@21Yd>Q>Cd^z2qyZH)wGx$n+8~7?Zhy8cWuJF~Y?+yF?^C7UmhBFer zhCS2aYw4Nrb@Vy#_4Ez!4fHMWjr2nJCi-4@9{mV>GyOa~pMDd*h5ih_m9Dpw`8Ik( zcmdrSzMbv@-$8E=FQj*a@1zfg@1jS+i|8rv-Sn;SJ@ljSz4Y?3o_am3ejn>C;QQ(J zu+K9Pet`9(;RoqyWjzbvhge?%KTJPY)>D6Ht3SeeEBH~mBfOX{U|)AEyoB``@MH9a zWj)u!kF&lA_UE2o!2e=B*v0&BdSlqnFiW>2qQK-YelJSziGA z_dWtY#rksCpU=JpKh64Aus{C|cQr3#eFyj%dJovwIs{(M`q8kjbshXH>-WLW(M#dy z=@qcg^9lR{>ucZ_=|(-xK4&ZVCDuE_FVh9=Kg&4y71mFKU!~{3zSa%!3fA9*U!zyS zuhaE<)%9-=uVj61_zik+S$9_1Euh^>FJu zl8)f7=$+uN>3;Ax^uh4A^hkIWJqiAfo&m3>&xgOKuZDl17r;N#55a5br{JIH74XmW zNANH7YWP>W-tOk#=%(=R^o8&r^gP(_&lkZJ^(!zI!vVbvw*3fWtbo^{KY;7g-@py% zU*U#yqdw+!>E>`Fx-GmO-5K`Z9R=*aJNAIrXV1ZKV|p~)gq{j-K+l9Xq_2cGqOXUW z((~bs>4k7J`bl^b`dPR+{R->{kNgU5$@*$|Q~GDP6&>_7Z$@thZ%%Iox28k54P6Uw zLGKQ4Ne_UxqK|;v(#OH==oxS&eF0oWUkiJVUV+=Q{wa(Paobn}hxEF8)b+Q4t6AR; z?nrlsJJEZV^$&x$X8kyL8+r!ZnZ5wtmcAC&WrMr0{wcg2y{4?Eb3dzhWql{OhTa2? z=mBs{4~G+aES%EE!x=pb_5)B|02i!Z1=rFG;qB>%;2r3tu;=9^*z@uZ+>Je7z&p}w z;O=z&JNMygPjn z+=spf?n~ba??K-S_oE+!{lIO{zneZU`Omo%XI#+vr z4tj>LejV)dEQEdj#qdz}JOvM}%!l7D4HLuNUlV z?FakMH4GllIgf!S(BsTi6YE^<_2bdwYn=i6T61Av>jv1@x(oKT9)pkLoXcSRF^!Gq z%vF=?TRj#h9nj-z^?`k@ z0kB_RBjDrty%S(x_Z0X9*3X7dq-UF}PO5XY*XN?g*SZ1rweEs_ttGIp^(^dbHMH#& z{DX5gg?-NEW~~KltybvqpRo;k{AY*tv$sW$Z}ax(@#_NCb5swb_A{ogV1%%=Sc&XBk$O?V;A%`xg6Ev-Z9P)_sfJ zOxE6~?T;S6PlI)zHV{32KY1v6{QeWx{ikv5cCHWmb=nB_ZQBI)ZCkote0w%W-M44y zy6|n-26f+tZDHST*ye#}ytK{z{sh}O@cWt4cGi6z>b`wS+t%+_u{{I7zwH70eK@vZ z;M<|J4gF`wb_@Jx$IAr4dRDN3r|6Z9>l}I=Pp2#KL)(Bu@4-{w$_-eDL+`;;)5;B5 zhePkdQ^(4UScgOJ!PC4-Y)Bh$=skFPR=F|jaOgdFT2oATLih+l`m96U>dJi6+R^mov0}j0h4=XFTU>y#f5mnhu$*_b%e|Y9D2_= zsMoL#hu(7m>h_)@1{`|NC8*nbZy0dsJy)Tgunvdba|7!3{tX5kde1GW+j|}uFy61i zSctm4_aKMfb1&++Gq3@N-t#c(_BuNT9D2{=sM~AY7;xx4Poi$GHDkb`_dJU_?qF=d zq4&Iq`Yo)(q4%sbVz&Y{=8K;2$L!GJ^WS%td2W`O~R-m?aEd(Mvmhu-r$ z>bPUG0f*jWhySUlyp?r0^q%$2cwCOr0zLif9D2Pq>ie(`hu+f;^?g}~L+`0ZeLvRW z(0jH;eSg;B(0lMVzm*5D4u{^8qkbFfaOgcahHh{O>wVF4Se-+!_eXsY>u~5j2ckZh zbvX2%Ls1{XIvje>Fw}>#4u{?|67^xM!=d+#L47#uaOgb~Q9qn@IP{(=s4rk04!vi( zIXH^-v(R%)okOpmhx%yN;m~{LqCSRoIP{(?P#?=W9D2`nsE=bE4!!3l)Nf}U4!!4g zb1;eZ2hcO6&Y{;Aqdt{&IP{(;P@l#+9D2_()Q@K!4!!3E)K6d?4!vgu>L;=ehu-rB z>UXdXhu-snIXIQ|uhDZ_okOqV*nO2VS%*XK`33b^tiz%A1P!fzI_q%gJ?o-=2J3L> zJ&jRc$T}Q)&nD*JpR8|*p7ZJ)dc8gB=d%un-m^987qAY8-qRKJ3t5Ll@5xY~!#W&# z&-SR_$vPZ*&o1WRGS>G*&lPnJy}lpnSF#R=-g6M@SFsL<-ZL2Wt67Ib?-`EzU97{Q z_cXUsu!!|m@Vayx`%=}m&edMWueWR~*5MB8)403WJh*EPDp~JgU#hy-x!UWvJIi-u z9S%FtL+p#@L0p3#_K%H`cB<-IV#(D#XxzlJK6UP}D?P)$Xdc`|f_|)@ZC|Pe)VbR0 z*sR%stiv7lrsvrg&2uY!5bKCR)e&{B_WBYlWg}RJI~+ ztG)iAm9k@5hdUfie`8-X&uVxg>uc;w)j#T7?e+Bno986f;SQ7O=4Q>)3ORj#hZLOZ2$vWHt8`wr+);!(db6D?Tu9{otYOnXVdU_G-a59@d6yLju9s*xNA8xL? zw$9aFpJ?^;8rI?Da=N0+gsGz^4jpD+CywXWkU`=4O`VqJYe6SYJXG0Vf-|U zU40c@hL0URdc+vJ`pV`yV*Jq2)-`_AgyECA44r6ux*K-f#1RwxhVXxXX>Bcb)2Xn# z!_r9ntG?88w6m}1TgU(ZuYEWVquNf5?DT*2b^g0PO=9QOw-W~L%1|!9d|%)UAG&#*X&?4eW&Tn%HTWoyzBHYyZ<81s|I4F#G@V`I2>mitBwo{2I`F z)6M1c^|T56F4WGcsL*_PSW!OTibg?cpIx|o>-l-OeE1bsJ|F(X#qVP6oVxjN7f?Rm zH)ZoR_VX~`Lv|{k4_AyoRI+pG=DXKiK3^ldqr~q*T)qwbJj}P!PUZ7WvHAA3nudPf zSFBJzU)!?zHuCc@AMUfu=fi6ki|Dn6HIRRzBbM_D%jUv^1sW zYidp9^Yt&AZ}te7du-KF#;wU*>DuE2x-l z!Nq*-%I3o^5%4{_POl$gJ-HQp;5?jO{Y&4nxfK;#tI2!N_o4UctTonm0?zP(p9A9^ ztCjz}ckC5Z;Ln3_`8wE1Kkq8*E05SjyCaD(fe%fMuVq(f#XRflVUIC8S^ZR-4D&U$ k6YjfgzP00%_v|{UT>HOkw;wWE-Zy<8dxx`Z0j>N00I3L=8vp=u zh0q}odI=B`YUnKl2r&T?2sH@_1VRh#{hl)So|T>FNuKw4e}DY;^U>~n@60`O=A1KU z&YZcs`hIQw65sbd_wv0@ybyWb+CJaQK;{qIi(+SX$>{#P|4UM_t}?z;KJDLX&%^^|EZeSKB_KbXdpshQtq?3nq@IU_&H zX#ey*@9(Rx0@Y)8eB_&BA0IjXstlBO$owW_>7CykyEOG}#tt>#+Hlro z|H>2Wy2kS|*=J<3JIUknu(t@|NNG9VGyD+*G9pp>kcw$_C}w6xd-_veMwY3V-bPLR zENU91vb3)_j4nq;(q*|a>lC_@$ycIW&f;>$DCUhDW%O-y?K9`D4vKLqj(8bw^f!`j zp6s~f`=ZBgk84uAC%7;AR9JkSidplbAMFegWTWgw|4v0Me?sMn-iT{(We*g&j}c1o z(`;PH+7SKnQ+&$3|9qcFNcrneQ1o-?Le%p&;v-W)gh7^o5k7H{Cm_r32PhDb<5RDr z1QhrS0mcX@@~Ox10*V=ID`1=-#b~DrnBWu3^94-iep22D>W&)mP@*!ltwNlOYA?E- zUyEC%yt8mPF7)%h-ckw+F1>DVGl7M>{ zr~&=Ve+=wQmYSb)%_0H6V6a%geGDoE+|Rt#2zY?OG64_quc{|MuUpJ zV3bnyPZr1qMPD<`BNTnhG>`JV!c3aGGAX^tIv5w1M=bK6gEU8xFfy{(X%9mwnX1V1h@waXhi;`SKBw50zW?v6X1%?m6j)?w&1(TRS;z$lP$@3;)Fp zRzKO7UTbc<_VZ!4DedcDH;rzdhIRU1sY-9SBZ4-L`+JrTyFnZMe5Psi;BmtmaSvOt zsO-nqpk(&*%37elJv}|8_1q z&dbam=_k?Y)}+AfET1MtX4ZIbLTB8|&KBs8^Ck=e<|rKNO=ttmRk)QmVE`~s;TWZr zFPQq=CNn$gpNC#1CgNRQ_6V+-SXI~JWf%DQWM@(0f#-F0A-4o$WBspjkr^4Mv?mKA z;}vczjBKrNk}xts;Y4L*8^IHWkug5`d|_lOt`SBi`qwfe)Tb~qiCcn^ss7J!%Y^n+ z(#zgniBDGII|z73`t#6IBs0qppXYzT#EFg&-kxb8)% zAL)EOw?yYh`Ev`Mq`xo3U?yVl8x?P>_-Mfq$J{Ym@66&@#m7S^0tm2atZ>9JLirwH(R$Q$0rzm!sJ5{mM+-ZuP=1x~!sP~_txIpolit`npr8rOV z*@|-&pQAWO@wtL&`ol7g@b`tJ#WIfM8d1)9{z#7mRP2=VN5xJ#Zz*=ld0Vkl&O3^oa^6+!l=Gfqr=0f{JLUXI zu~W{U6+7kpMX^)P2a26?{;Jq1=WmLgaz0e-l=G2dr<}hlcFOr!uqx+wemNv9%6XM* zL^+@MS3@mcl=L9V`3JXza=!9^7%1m!CGM2-jbf*qZxy@H|?+5 z?+cjuC$|)4{75CPdr|6Fn2AKFC78*Me1U>kN{$c<7QkG=lZE)m$b_xjNVB*`i04I~ zW8y?di05-l5FZm+iCcvDRzhrimg2F3v5lbBVRU4DK)l!x9~apL*S#pw5#r;yC5TUs z+#V1w5n@5yu$^EP%cRIl0r71O@zTgiOq}Ql@hRLA#CMJ?8tXXUMTiAr*;R0c(?OZm zy9qO0v70cv3D#J4TBH?}#b9>g8WCf8xFwjG7r8NDW_KZmO_qpt55ePn z#d``yCX&QDC-Pj-*<91v{73@Vy(rO@&K7XXypHUu$Unzvo+-OJaxrad$kY*9N2Z`4 zd8X{z$aiQZd8X_okvC8y8MN%BkwOH%k~GU+7FhuDQ-wfX>l^bXs;( zWHQ*PmuAh8$&hiQfR@M+04)MmMqU9}BVbje6LMKAV0Gk0fP=i~AMi1v4U(Yoak{fm zFm=Fqq~P5g&QRH|VUg-KJ*Va{)YFX7_bnuixHfH@F5B*$<$K~@N2uxQEfUhEtBx~G zFF6+0@}Ks}?QLpcTfQ=x-~XF50k;{&??wDRn%|50eGI>E#qVSJeH_1!=l8AoeFDF4 z!|xOMeGqO@y!2Vcq*rFPRG5IB%zlR@jo6$NmQ5<^?!?sZCPtMIX=&s zoLv7~T+GYLDe~uHcC)?YjP@z#rJ$HWrk7WqGs<5Pv>C%?m{Tz>9f&_YSP-&XF}1wR zobCO$QHL%-ZU=Szx=`fos8|<@oN0=6p~%@uu{x=oofWH-%GpJ+I;osp1*1Rsjhrd| zh;7tKo$a56TZCCn6*!NXqp1SlF*{E?cg*gt*fG0@ zV#n;BiXF4_1uL^N{W}6?P3j?MfjG_%*q};(|63Sm3n2i+0UQkm~G)2VfFz3P;lf$i7#RHKyC?U z!WX4ffk$LxB=j@b>09kYiicFZ2G*fIM(#g5q{1S_*izY9H!8Awt? zm_5>enwcfOgxRCGC73Zj&Mm?0dH!X%MI?K^5_imApx7~cp<>7EMT#A>7b|wm z{!p=F_7cI$>^c5J0ke{U5N3bmZ%=`2l=u>6FXfhC_8R}|fZ1!6xMTLmg6UTH#jE^n zOPnOG<{BY>o&N&0h!Pzkem%DY@!R}5+#-_DO*k+SyTv~QB@wG^--Xy6{%+JFO7{t| zJGmu@{oFqv7lqg_gfnUiVn6fmK}m?+YdE{lKZ06B={_NLKeq(2NBy^OQHVX3M(me< zbUR1v5ku^8|4AlB_X)8lxFv}F%3q9IgqUu3BTm7(-6dNAr_cIr0dd(l%dlVY$Ktvd zB|1XrZ*6nPD2HZLCYP}3@lfMX@iW*+w8X4Ssev$`Ay5B&*K z+~C~a(^;SHJ)_Rlb?+I~y>redI(Xe1=lnyNal-givF?p?K2xlFmo0<;+Hb_Ly(o=S2LBDW%)ismi9~+Cy^EGI zBDu5%N*oo9+yfxnjhvB@IF=gOZscS~M#D$SA%9M8`HQqB98&ct|X_JH!mg9&zQ)R61Vrr85fvXp0iCP z2kOj})8?E>kuIPtMUx{n7;T=S?IM*J^(aMCBAvyf@(>3z;(rm3g*IaN$kPw#VTn5LfI=hQOIjoQOfrg@yAI;MG&B5V#J&r=mG zXPRd!YG9h@Dr#h!mn&*wnpZ1oVVc(|TE#SPRJ4X^-s*eN<4nPk@d+ z)RX$$-Ki+2_PKk|c1KR?bN8g3ot)I?&Zn}R)aNdsjf|Ys=Pu+;4ejK;+(oqel#}}0 z#Z;D)`rJy|OqNKSDk@Kvay31lFipxer+~t)Qm&~;|Tp^$8 zZOof@>oldAw>uSue%>C$i^wT&PkMGh}cuvdAf~>TJ*#IptMTS>%*gLl0kwobqbvP+sJew}i?fr@W=~G{8LRYuPVA zbH0@8i08#p-iyjLQr`Ovv|lFWdMejTc{x2t(J18xda$EK%8hq{hYgS*Wg`kRdqAl$ zlZ439%iHG+6g82Mf6#mApLf^t?n|Tm_GfY3HA;-%DZLTjpid^~4eLL~4Oye|uV0I{ z%t!uDXbf7uA=F3yjZ_wW0yNY=Pv^TUX;3L8R!3+nt`KDYXXj5VKO*E7mj`>P^iAVKA`&Bkm{=y zxaviTgiw8rnt|$D_u*5>yv<~g{1o^O!#vl?yS9@zU&CF(`X9qi-a8Rjy(m$XPTr?x z=;XsAc5$72#AI^DYA1hZ2=z;!A4_eH!cU|&OW{8l`Xd#7DsY6t&jm&mejzYZ;g<~Q zu_;LYuRq+yvHv%^E|UM}2h2Y4D(rtn&GItyBmU5?8d~LNNT`AVz%jx&GBuRZI5Iz~ z^_u3-A0gP!*7jM7H5AIvRy|}C2DD9P zzUNCdO*^Yh#ZV|~&6Jjn!oxhXdOeg7`1(W|kXWRRS z2A%C-I@`tH3fH|T(Us12<(BAdrhjA5*{orm%@z!&N5m`q=K|t04DmVsF-)B32=Tex z62uq!+0)%f76~zTtdPH0Fy%f#e7?U6T8d5<7~+-wADB4N5#m+c62$BL&Vcw{!-#9% zNQp1?PYQ@HGsNrt`MB;yiH;Co&MiT_#h7F~^<&AXD zoxiU#r^gKW`w5P?*|WdWcLsETU^Sp7zZRT`WSY4~to1iif zmnU-8+AYN0flI#26KO&q|6r|m%(^_0o;lMcTLBNJi7xkiL>xW5Ww@S-$s5ytnpC4_N| ze_tSsV})4M4fZ&}8E&x0YrPxH30m)%*VND`VP>QMhk%)*xur03lHZQ&SOV}a%=~~` zf|)b@lPjEN&JyB*6FpmSrjy(`f_>e8=1T%5bA)cb^Uu@v&S|>TkaL=v8p?D|(4~fS zvz>pD(wD)U?%xQ`M6zdajSS{u|05m@@hyY-A-BX}uJq^5bc4A{i8(X7MzNbC*D7{% z?V^QL!GB=etKboaS!PdS|A$DRy)0cExUv-J#f-@tumD=I>JM zlySFWr;MK|c9!vT#m=nnQ|!#zJ;mY7+C8ufk12L5=o5l-L|K>n`$F=f ztSh)il=Y;4AJpVUNiU+Tr?@4Q^=tp_Sx#9mC~>E(mlQi?{YJ4<*2{{WvVN=BDQlBr zr>s{LJ7xV&u~U|&o$xfP%=y=~-YLsHRpFGSPgUS>PujbuDx9+1Qxr~FZz(;etalVU zWxc1^DeHa3PFa6a?3DFq#ZFltD0a$nPeC|kY350l^(%kGY^SW}`A$*R-~EH3CY=93 zFQTlExh0hKrGM5Orz}kq1*^~3+PPEKH;SFIhCS7guTM4jPFWE>)OO0sQ0$bIsn{uN zgkq;Gd0ZjWcgo7vdZ#S+;Db|^KKKwU5c%5PDXT!SQ`RWOPFbTBJ7tYg?3AU?KKM>q z30#Aio}aNUa%9U(r4TY~t4$b|v%g+k0dftsUg011H4nyrppf^3gw*fW@h(~UN*M3bvXXHS5g*OCrMRH+vZwu&-+yi@gUqDafEO78a0n6av zNR$L88MypIB5gpKih3gt0A(rai%f**^N^jJhELAU5gkqjT_*Snhl^DS11x$?T@>v3 zchqybLh~D3PWw^?UrBr7g0E6fCEN ziX=A*R-A$+l58qypt2;J3L2>_U!N)1hsu&{DrlmzB%2Ca!empy$}rhfuqsS86|AB5 zl58s2m&%fCD%g+8l58s2pURSKDp*TpNj4Q6K#3PtUs=rW8~Ob^Ay>F! zEGTU66{eVa;ZPhfE35E`^YFRDU{AkScqH{9GA}%elR;kA;=;p!f~(|Zyu$BO5r&e& z$G!MtLm8>`Hxi+&%)+x)&ez07;n^gROsrL_-Vx#bfkJ3=0#H+~Tk{_TL zJq&Ln=!T2%$HV)M#&p$A3*4Blmag2Gt`X?Qbge))rXLG*W4cbD8`Jdy-IzF^m+8AP zNlFjj-4fw(RxeY>bj338BV)Rfh{%|3BBs44@hW4wnVNz9pS~Zkf0y*>*uPt#WB(q3 zj{TnrbnM?N(6Rq>fsXxO2z2bOj(tf(;^7ymO;1A>rl%nbpOJeV`>}yuiu`gN4K>E*H_8)yLVE?g@ z{a=s6RWC}s3i~fmGqC?k=OV|xWF>-yRQs#CSH*b&>vCFEjhZtFZqzH3R#9*?zHO{{x}wr2kiej(tuWX1XMB z;fGS|*q0Tn~ z1N-0n1)tK%x9RME=h)vGcY1|hdgNRvxxh?cw>gCot=Gu8Fhj9M&V`!w#2AELRO>Zz zE*v3PNAXo|r5nZ9#0Q6hg(LkIaEqsZ@Scl;SD58f!@SJGLjNulgtSX&>W;0jNW0Qa zK;dY`x(O&OR_ul{MzI^pR*KzF#wvD08K>9{WxQY-$~KvW`Tizw#zAtSq+(?-Tl*7n z-HQ_6GMEY65`)>!KeoyZrc{Z$!Aw!?1~XN$8_f2K-C%Z5>;|)=VmFv+irru|XA0vI zVQS7)2Q%5f2As)YO88D0%r5?)cre7b3}#nunO~AwSm7_M)&R6{hJPG6VUENKXZp*@ zrDY15<>z6FWh$EOKh5qz>gM<-!+!I$ZmwUq7}1QPdHyJLJx0;){_8;F746~wgxJl5 zlmo{0WOfQOtHIQE=-yj4YVO%6^BO*CUIU6+-u)C5C9oQ`2QBClSdH4V2jyilkw(p5 zi5oNwDLVXa01hkUUC*vd6PFLY2>@IGmf3S@gn=XeLx&45@BlUR;}}r!XgeKcFgpU#b4-MKlv$Lw8*C zx6^RdixLT;`XMy~)z5O4II40u6;S;`SQlRZu@jmJRX)-ZUcY>csS*jH`cG<>ms#Zd zNfdZK7pb3iTiGJ@(|LM2RHS}7Q#$(YT-?ahy+{@Sp6*3ae|KER*I)6Ti-K1)!l#z# zE8qVR1?fvqp4{VDMe3N{7k-M=F-O!F6{#bZ=jn=a{i3C=b2-zJ&d2!IaOc#IbiNh0 zMCTLzUfd#`Pg2LGjs-C2%R?3IBAo@D?>emWGQqi;$0?ew^_s^i+D-4*JWWx#)@z=o zs6y`-=6Ce>1}CC6@$VwJ8UAI=Jn<>a&*YY1eh>fJfcZU@xRcy`?Od0Xq6J#-B)3qo zN^YM2M9}%}TqB(?^4H?J7o~or^Tpf}oiFv1bxv~2l(_4>PO+|cMSBSjY)B8UT*j`b zUfVmHTCVMNJu6zF^_rn8YEY~hx}rwGV?~m+{(0a`B)NoZWH9^qukc`qZy8Jzx5Qxf z_1_2vqlZ`S)S_sAA-tUouXI+s-jZ`N1XwkruEK%P8aOX_=@B_DAT2Ii_Vn#Vv)=V z{<{J5azG{qb(X&eu6t49GZzJ~=xlD8pA{{-z^_}b0aVe2{>!w?<#3aW{1vE>bY9WL z{;qKUlC&%Op??g3B<+eW@izfT(yr)7{&e_FN!k@%>K_OKB|_~o|02|s3%K0xN6jn_ zzlyH#$CBTWv{=!V{!!GcqO1IKs4gNcul5@;FESNf<39_OrRZA!bljJx=*RxWWYlELZhwGGpQ(%*XUUkK1#qjdNy$=0q5vBlc96T6vv=R3lMvSg}3dQZc z;u?mg&GGwV>BR9XIkjzxN-k~@D%aE9pmOtx0hL?iHb>>wbSk$o zWGedvRBorcLFH$!1ynQz=BQ{2%<=LIA*u^l%*9nNN+g8pQ`9VLYVmU~ zA_X%ssYA85uK=io(d4-Dy^ce;Bg|O(tPv%$_t6gpo1x$5i2qR+_Qdt-ovxw%tFfwK_l_&9l##B;yTPau3>=u7ArusOPr@<$@>bM!xK}QA(QlGq$P??;HIRynAD-2^{U0;N2Tr(~tLKbYnYqNj`38$&X!r5Q>GF zL=W6yog3l5PM`YnFS!ggJJrP3QO!!a?X0ysQ>8zW8%E9=@OEMRS^9nXEjS?I`##g# z%A^^w6*+5vMbs>ER?Bp*`737o6`IIH0X0vTA!QJ`rJg#f<9kK>+^SMeZCs@NhRs? z!Sp_lU+HA~U|OFKruC_4KasSeeMOoNrE&0Z8VA2r4y5HHg1VHG+tNAtB;e$>G)`_y z-*@mzK==oyC=Qx$Ai9m()#X6>$@kd@1C^24@v90H?8kJq0;5;2EBNGTYBH$ z1bw$@-!htZrHFWp?pm9Emw1-7X?Gmp?(qB~fBS;s+>C;43RaFQ@<)w>J&Z-Ty+`hz zxpl<|yr+7(xeHN`6-A3#SQKY_R5`-;>x!|1@kVY3yjw0-nqogUm+qyj+4%vXd8o@# z7_BQNn5*3YVpY=nqI4e~8qSS^2!jH17ut`WqMJ8^&`z`q(<`GB-CrH!qjioq&s3#8h2z zcyXI?GF;|#V%P#prRkk(wf^hhTOdYPaLsK#ZkfZP@b^?V0bN zsy(w{w#PFDd@o}7@H!1)N0lqzGi|!RXlvGUbjPjhii`ZwBNmUppo#^uQ#2SW{oLiw zDq#$r;4ZJpC<-`O2!krRWHrU&m>KsV)?UqcmdmVeMO%8OX z*0(0&Yug9<277wriM8E5$-&mdA?~vznHuWo8CaVd80bx|UEkB+F|ai!aHZ*wYImXZEaV3`&z9l>+R_u+E7L<*3O+ib9(vOp8odUp^mt>MV3&R zR?$9?i0?)h|JV6U9+pfD45Zc$B@>RNwQW7A zMXJV~G~{ABb++8Dcz-<6nu@m%z;?WKy|ZWbmT!nTTb|xdW}ZxS;HT%yV1CoPX{NhY zslx{2NnFYZFLlJ%^|Z%v4YS2H>xg&Ch1T9)cMH5KQ5`@9W*1#WE21^h^GL|Co1^MeJQzFw%ImB2-`z z>TB)kM`=trjzB0pVl2As^fF%c{0w~Q2k#Mn=Q3@^;3c%loBw^2_tWps$Ovg^S*V*n z{&j!f1jK09>DUvJ{{fk^eRr#n`44Wr;(vbYt^e~|9|&%Z^0@y?hBsH56?(b?e;W|~ zk0tT$|NPcZ|L3@REIPu~w{lm~;5I70LGASnt647)>|6YgKJib6vxVSX1p%VPkfz zzP`?j5lhQj`#XB$9(LgHCC!8J_MXn3_QuvkYhOGC*Us%5Yn$pCm&IBdVp^)&H`d%# z?KR=1WY0i93Z3ypyq^fPcC^63cuN~wVs$H8VoT~PmwJtfcvEYCSDXerFqB%})1DY; zj<+X08c0)Yc|%QYtZC&6rruCfSM9B=Y-*9qRrL+kd)KW{zGuX0YMWbPl{Ga@=%KD5 zwh{th0kyXt!mLuCwM|X2>iQ-gZel}EyO3+FY^rP7H@3X8X>S%v!|D}Gh?^0+wIZNI zSFEFFU97XU-K*<|2$siNlS7GkU%Wrn7*F&JbS&@b?d<{k1N|LIqm-(Z&5%lc)FOBZKv>EfI%U7Wk6i}SX0ad)r2HJM_CtL(hQhFE7$=RmA;sJAzUA8l@n z_w;!r=(a>`aD87nU1M9=K=Y%esiD5gTb*bftV|3H^>Qy=R#&$)#cJxBE34{jy;b$IXV#amiLFjl9hMUFUs6}!Qrm=15zl$e@k58m zQmY60JA1l*PNp70^VK~a@O-I6Ykv|B zq8iFfrEw!O1Jh*)GN_mnOL;BSwy!5u)7M&?NDRp2ChteS%1)?qnozjdu!_cj>28_j zxrq9~mZAQh{;uYDDus_^;{b^|F-(qa2Y>C0DxJ&XUfozC}>KW`i z+q-A59^;7wX$nracU=tLGuBSV3h&X=%f7h1dv+|*y56-FS;Ue(hsQk_5iJi;B`gv~ zg*m`3zPjEycvc8st3k(0mNFKfsnaCZgzvetC#-7@_-&DOf=9*WX1+1C0Ya_r_LlU( zgsbqhb`5&>l7l^m#4$U2AsAUPlD)0#;tlKjD?2){z+f{$%nf4l40dB8W8yMX5# zZNQww0n`OAmuD97ODyyYmNB))P__$ z{5gO0d40@Rn#du;D99aJV^wc+)IxNr@FUVwXYys_k9kDom*quqGJA|2Qn6R$5sSRyI zot+d0#JUH1J4Et`xxwX7ikM}8DP6JHlJPpS-Tv0zbepE&p&fz4y4GH%4}-<@!_20| zo+PVwy`n)&tf}gLwqmj^IL~^lPH0VN3*Lm+G>=wxF&M-e$)V(6yuTyX4^^r8VFd>X z^8C#`UEmTS!SZ(e{ywR2OYsA)SJUv9Ve}jXb+2E7prsnWg3ns7FiU+E%%=w7NPDVz zh#gH36Qwr5ufVIbyq7e=K3S|Z?#87wV7Lje<>X1~<249VQtqjPbtXUrR@K_pLB_=& zeO`Mi+1Cfk47CH*U3+(ho6qdTm0z8bFsqLE1`q!8(9QcLRdVwgZlR;Ku@y5-F7s+Z z>t8SrbfLgafv4k1&s1gwRNSOp)7R$at@G2g62tqMIEM5HyC)J9O2t;LsH7DVC)`YR zc0hG?q9+xvOAQM|S=ekSFg7e6D;vW_VRd5lK%#@Uin2Y8^RDdiY#TeW4Xg*=Fk`vn6>_}maLVHJ#f#^axlNS`SRN34Nd!|$E^q;nHg{w z!#22esFyu2h6tP8VvtHRkv++p(p_-Pv}|F)-#Z>3^bm8WR@T+59E7Wd_GbmlMyj3YVm(ZzYCAhC``UC>70JMN zB$4r<&_E*xp2tmVLN>`yl9gdy8tU(BO|^HEMx1#p>q({tx)ASg*+ATyi@<@GT&(I8 zR$wilNrqXzs27t-nl#%Qh{yW9L9AQtv>##~5eSvj>KTlUv{|AHt}uk3J!1E zu@8Y;p?mtUtR~}bwx>2=^@#H#MD8RedM1A(t&<))9b_wPOW#exdK;P`igxS)iJEj> zSJhNQD`X4~NTX9yCY!r#l$-&r9PEI>bF@u6&II{mGC5icL7>7dm2Sfo$P)dj7fLfS zLZxjPvv&AK|t4 zVVY1@H5o(n5$}i{(tS7+aa38t98V%Mu)I#9UfhMnoa};RS>I4u1CJwBm@otDf^}#^ ztci5VBjkmtv8lGXy0RYoshYY~u^F@Hn88(*Q(%C7(qWV+9au*~3-)uQ1)9=4pddp* zlg{qvWZEIslfZ@!u`2oHAg*ccXm1{9Z;BtP+g{Rf5_@IQF%zy^-dxQRcH0ZA6L79w z@f4ggnV_9#$nEfUiZiW&HS3b<0+;%p{y3&g>agm81kb;9@uf)2vW%-%HX)NyU%O%{ zQWO<)ST%EH4$@4qVI%DnJ)FIO5NEb%St3WmsV!1M+B~E9DljMJF~(L6u_oaUAhj;Mi~Q4a@j`4VJwuHB493nfiF5Y0i z=wh07W@4FfX)(8R-eLrfNQm~`^WcP?x2s^1JnJzV7`WIu*!Ec8PH_kAK46$0M^8)0 zn&By1dnumrg5ZL;4oo*qP-G5p7nookj`P~%G2|}2j`f^2AYWTGguN=PT#_cVoCdx` z-7vc;sHMwp?pVu%t?lu0>~HZ=As;j3W2St}l8@Q);gVih_ITJN5ri`2emoNyK@V8| ztA;u-&s-jp6M-%l8`G2;hK~sl3%w{DlGxQuO(4wTS;6Ds30=Lc5VBpxh7-gJisdBBxukh{n1{pF8B{e> zW=c6vDBw9BlqtLERHCP=s~6ER?^Xsn(qjoWnqmG*S6Uk-Q2Yy@Gc=g0RsCbLO!)+) z!8&`B@m_Dxu0UbHfMg4~G}e0q0y3Uv?i{BcE+oY{?WD?xr8(0iJcx<(eB`parOO~K zNjk#LQr?=D*4{&^@wh|0KiNtym&e106U*u7Mr1QcG!@DP>mUTN< zg%lN{NlI3dfi_DP5~J@$nuk_rnis@;xV-3=TMvlLoLSOTxx7|SfDtcuc(iM1B`sm(t&{v%7QI#9n`CJ{V)vPVX$kB<0vkMg9LlnLG&buu9az0 zSyh89Cn*@`K=7VeUT`=MD}#0=TGpr>wnrWV$!l{74W?;ryoEGj_~50B-~3c*Kce`-v?tX7?bZ z$B`hLLfw*jWM7aecY8xl7}oaFGQn9uVvkLYoHzRmo*SHzqGMBRmvCBHyMZOZxvRPr z)$qp6wJcJdjabb##IR}SK9M+}DT|04M@}1P#^JyfE2kc~!h*4JPozqMohAfNi920$ zBsWiLv>Q>%QX5Z9qh|R#-G}iZQ45n_=#9cBG{c${WMin!=9VnRF^n|%GM&pn>=I69fv≈@qsJXPq3s zr)i8rW~2b?>Fk210f$Gj;6Pzyzv*!{|K;E9BQr-mSD z%7L}_kt*7{>S+Pctpk=DoMf^t^*oZ#tn@fCwSg8PUV@AoXseBZ<7q08lQE?2v)zd! z-J7=QUeSO}*~-SohNc#_2wCXZ(NM^|d7wjtUM*18!XsXG1Fo1@2G}nJedC z$rkx&kCRa;;+pg%qGe}BcCM!=aGx}3p{ouYcf-HNl85!T<3WieFMkxR^$b*ChSTQ^ z{hX9MkAHMXG7eoWzU#~+Lh(mBMk%F7*5W$k*Bnw&-t6sLE*+YzrGyR56 zoMk3?C(EaKxTO#2KlW^58f-m{2|PK_p2Cv@WZ&4i&}k#j47PDvnba}JUXy1!r%uVn zsPF38!(u6yV(J~}?<&E{O3x>d%+e#bCG~ZU9JxW@JQ1+Ox^w=-P(Qg8QSh+S_~6)_ z*-wNyH`#+w7Mz}afDS2W*UiIba~~3gQRCDXHb~Fpk;j11NKnmE;2Z^NIlrXOVr(I{ zOvT-K2Fr`{@hmXs9qLjX_NVV|NDpyI=#XSEvm14P9j=LFh$LUyO;Toq4n^qvgPaD! zlW@n6{HaS-so$a$1rET;K{-uLyL7aA9F>!n z5T9}k7Cwl;SRSKcozuvh_gx|BHNU0qSQq@&* zN*r3K7efY_6MiPht(8!pdQqEC%BI`yp=f^Tv8B!>8!A$?y>!LOlIn_z5`L1rq^z&C zt!F_`@8HZCodgo?-3tf$_E> zWG;L90q9vGxVe7J3fxF_@eS?qLE5w?1rPPpBl*(1UgD^{ERIz`FUSMcXphmMX9~VB z(9}?Zx*$QpU~s9mx2H8J9kI}m^>7`zv$-;J4b8jy%Un%z!3-sa=XmHzvofqLj!8%h z3OGDYJ>g(d8n$+IQPu`2jI!Q=fk6@}HR2sPG2YYH2Vp~m35c~5t7r;eBmj#Y5Ns#b z+%9y1BaLooUuuUoq}s~x*6l7p6)5(0^r7EAN1upc%su@$jRZq%Bf%ito$bAcqnL=Z zEf5!dLuEK27{*qh=gvgmIvQKq;qk-(-I(fyq~viqqkF#IJ%D55GRXN5G)%U3#zpQl zwp7ocJZFU(Zd0$X$V%_5P?t* z2n{9%%3yJ2aeN(QplgWar3SKY0AC)#cSOn%ws!W!dpn32>adEJ#n-j=ma(`NfD2rw z2VC2Fz{g<=x_df0SnFh6xE-g=?fm$wOr}RIo%DdfX7MS?+`=Z2LV>UaF3+{N}TgpX2Al2y`6EwEZSkNe})SyV- zR+9!;$Q%&6qYxLJGGiO)sL^H=Xl!n;0=mH?LiA7;#W=dX8J>DW=7Y}@X-frXi9~W6 z9$=+W!J*)xHI7i^B+YF^6CBaI?Kj6-vIti20;+NgcB-ijs}YUiq%k3nQ`%sf&C5|* ziXfg6=5mlj=Xi8R)sJCg(ZtF~NkqQEB_tg~Z0^mC?omZE4V|6IcxuI} z<$S&q=2Fu_Cu9zhYNq5Mo`fO7X|=O9zci1M0lc@7gESZQno|rH^g3x`U8cup`w-pI zTygF_i0s@Wc?j*?6ZV^BdT577NgsN4(;OF(jS|<`(*)@fBsCEvV@nx6$}j$f;+t+t zX&|fB)5%9LtivVrhzM@#^BNMA_~B$K9BG`MFmhW%4!yRpi{=R!>u&9pe57+NVZclW z9^8!{vGB1n+&{ieSBdi+`kn+iR6glW@#AE0oBSvZ-xZo2Ic5C@1cmzi-T?P*n;+i!tN?UK1T=oXm_opXFDP%_ygM6Vpa~nRsr_m-_ zsN2P(2`+Eud^=C@^aKK5O84)4Dc!^KCGqi;`$2ZAZ=a@6G4;G|Mk zT;!?{ai<-`rdv5?C?52)XVW}oY0K!&==4cTdVGhIYGzK5%{mX2W+vg&Z->x>bfj-R zxn(C6WaPkK;1Kv3D8#Bbg<`JwAu())`3};g$xT-6+Y+Aq^W&qGstCMIWqm!9kfazt zf4~_5eoMo9?NMdAQ<9z7jk-q-Ib$qa99nW~`dab06+O2`4vAJMlh{TK zJcwwX*DDTZYOw7zhfz*(O&$E87><2r=>kvZpMlinxnzd+Y0E(GazaUqu{>i2d$Wmj zGBj)-E$bdSy}T0l2=Ts(M`n0X*ml4E7cfxE9)VBbv|2t7(>oGC$%hHlHCtPrll*d<-DKi?g2cnW$OX<01IBi_>wxBsNh-ZuFYh)px zLGBMTfenKbpDhS45Igh@@>2uk$d@Dr`b5$-a8G>h)WqjbQ6ms% zg=laUeDzDe9T&s%9_j9$#2(0kxpYnEYOon(#2Z$$G%stQWHDk3eIkavCx1^1PeSn_ zD#-K1q!TboL_xk=HXTG9vN|anLkmD~N+-7VHj9$!xH6(cGrAuZKs%d*I(F5;BjS3s2$Zg_dp@ zzDuj>u7Xzv_cQ}L4SukOzJkC~!3xzj)CnoH^3$bsItUfvRE5}d4`q1!!A&5uPOAj- z7JfI1hC3JpE|fDA12o#?Da1H+Aq~ZSY*vdK}C1avdX8>Qr=%SN4>qw*V+EvIBr|8SIE|vgu zY+&rsTsTEdaIzeJ>5)Ze6Q<;gc|Ncxd6^X_;tsXLr)uaiTs(TpY@~k)V8$Bkojdtd zk>)k;u$zO)!wT@0R#)#)GL4dw9VIZ4it^dh%PY!DW|YsERaQQytYY3yl9I)b3E=k) zyzlVJ@cbkE{D?OZ*uJU?%BxQDtManE#wV)&jrtOMGs?KX=4k(<2vLaiK2$|S{>wJq z|3;gZ|D`r7{tY@;{~K-o9XkI(oBvJ+l@$;ymZWz40^N=%MmdW921g~{a z`D+`7yNBUW9&&#u55en9`=E$I1}r;${QCd$f<~Lyr;lIi!|@9a$1gY>zu;xV=&u-t zTZZ8^!*D1cp%=<0oT+q623C#q@#*i-2lO_tPamJuhvO3*j!$qnKEdJm1c&1j9F9+L zI6lGQ_ymXJqg60`W#Au@q>oSkUt-W?^ZNAhNj?2&yu1X5;}yJvtJeOihT(9$(mouo zVEl}#z69gP8Pjk$-U3&_pBdh$VdK;PGZ3`eygq$=QeQHx{nTMNoR88z>8FTwi_ zyZ@kJ`0!!)!eRK*VfgA{__|^E#$ot&gM%Up8Q$n&^3wmm88q6wK3!f?AKHW9&>jSb z_8>U42f?8|2oB{bIJ5`Bp*;u=?IB#*Xb2e?9q}8!^#6|r7dEd?AD`5R;}aZ?PjEOs z!QuD>hvO3*j!$qnKEdJm1c&2GA5DfgcG&pzzdHou+q^z~d{Q5dPjEOs!QuD>hvO3* zj!$qnKEdJm1c&1j9F8yKgocpejUP5X{pSS1_%^Sn@r7Pp>I;Uo53NM%!|~!r9nC94 z{^LY&CBvit{Sm%0hV3dcywKBAs|>FsY|OZn#}oD^@nMK19y>g^OX8(<0haZ-Ex^Oq zv*GK3_|Mye_TrC1c@LjI!|hG<6Y@7)-cwluvjX}fc*J3RF~TF?8T!jCZztgHpnaA% z9p#n)=Xf*IaGp00IJBn%ZvpUrLHki2*`oD_^iLYX_M^S}G(3iWn%vZn^+H=j1@zmA z_u^?(rdO#)vC--HQCWGFdZe2_2WDF89p|d}b6fA+G+g3c3B2b-cd^vF9>r%Sh4@w! zm(36H-6;MDKk6s1Qty5g%18+OD)k=4=jCMN{3`XH!Dl6YtWRF0-is(q3&QwP?{~o0 znEu`bK6r|>rt!Ux;+6P?a(R_{AEEF$DS=<5-WT|M$F!#{R3>fC_*II3BI|ia1{12( z8wGqbDOKyo1K+rPh)aOCH{+cKybS-(R$irEIdG%te;)AVrhYN-$7a0CfY+JvH3EMx za9E|@8sNB*|3SbNw9n*Msn-qs*j6DP1il}C@+$QOBa2ZQ!O#y(fS>jJ%%* zzS{J^3HV6U{te(Ab`9yj5BzB`fuVok5Aj2h@`C<><9mddw#*IY{w(14O#LX}4~%_| z2Y$xbZwc@bfrBpfrU83K{^h{ujtKjk2YkPg*J9uUj6E&`{>+T85%`CB;r(lXml^v$ z2>8jsjYI#yD+33G`3}5uL3sZL;O&fkZ3KST*yBmS*Bg1A34BDb43v5o0*`@jUSF9XZVJO~5A`dA$LAyXpUZ z;P*`XkAQF3-CcnGfp;=xFS04I(7rUB;~ zdnpJ041GF!^MJoL{$nvP`A}EC4EQNCUmAhW#-FQSgYqT(kE7^Hsdo_Y2IJ4Wfe$nO zc95{~FB^adjDOn*JlfDZ33#gUH)jHWWcaxd`1{5mUk+Sn>aPR7$6|N`d_W{o=3-LPOT>Qza)cZcl*BSm!0)D{wr?Y@JnDzc*;D?OAxeE9OGyWTa z-Igt#`w$afX_1H-5Gd^@eebBcQg8&5B#oa zUkm)~{ILHOz$X}gxElC1!|y@Bi_H4m1N^C39}>X38hLyVIA!=b4tS=CA5H_FYx+AM z_%}wsmjSI40yTOxyR~WnlaJ#{~0dFvP9`I=f zR{~#Y@Ls@o8{7>1jKOPx-!wQ5yyv`-|9;?o3|n`A@jemLo_#QKVo&cV1;;CN)FEsZ1JK*1#c;_wPYE%CK@bjkr zQ{Wp+|K9@NVb;Hq&^7%z{f+UEZ{{(9t(h9GWN0r z_-}^42H*qDc-H`*S{nA>3j9;U|G~gVnRqA(e2t-Z1n_T-e2)jddP+#|bl`i;{I~%4 zdB{Xwh>w7ML}55TL8{N5*w zKgZACQGUSC`zP?SlCVAlYx$YR-f$e~UAlc(zZLKu#@}xXJjuj6I|3hL{8>5hlcvAj zf!7;B3Hbw;T|*js0{2-)8z703IA4^1A`}RMY>_zz-XFoD6)B z8P7Su4@?Q~zXbRgGoP*jo@4sI8F+uQUfvD7$;{^mflJMJp9Fr^jOPX5LUaGCz@DN1 zHt@ZMzrO;HH}Uyrz+FaP-vRfV^`HLLSpAG}JVn4!V{a3H$C&X=0e;fVmtBExH}*9f z_&8%<3xSU{@>~ksRucBt2>cVn-@d@t7<+01ei(o9D)kOQd8)Ce6!3{gzefUZGWt0I z_%>rdX8<2<*2fEhe{cNR6~K$l{XYS|(8z;q`zAC0egXX3i6MWF0)Junc@FpjBcI;_ zmm2xJ0Zcy0jqgvu*Wl0Lk5TS3^7#t*1S22%FQGS@_W8j454D*9~0eN+SgWJ@8d#|F#nN8xx-#2s~!DuzeSBm67Kl@FcT7 z90vTZvG-$uKb#)ke+ux$rv16VubT1w2>1!p{#xLjOnSl z;A@P2UIZ>S^Y=C2@0s=K9pG-GkG}yQW9mN#{;BED!(82D>?s?##;j+ffxk2B#Wuh> z#=lPmUS;CvGT`}Tp}gh*zh?Bi2>24i-!kB@OnkNv@DB{X`vKo%#@`M+$@tG+;QNhz z4gu$z`EV5Qj%NOy2s~ukp9%bgv5$*@-!=G3;4cln0r*if-aCQYjX$^#_yN=3W5A2d z{QDK~X~zCH0l#kM)0@C|8Te$h(f^*nEoMA5z!#hKV>$4b#=orsE;jUHz=K9V-M~8=dWQnf z-X`q-aNrM&zK#WsnfguTt+}l&2VZ zJ`G%N^!F0*@n*mAI`Fz(!~5R_KGEP0fiE=p3*hSw_A&R0&H9!DJk{W0;MoS_pNM%& z4Bj620AnxHf!oabG8cH2@t2E%Pch@G10E;~`ELTIe^Vl_Qg46YFz%ZcwggRE(Tt0{J~Yg6HCJOHvzwE?C&n%Ij$Q0 zJpjDH*!L5_Yk~%)-mifRj68k^Jj3{#w}8Jj@z4jrE6n&l1-{*^*WUt9F!O&TeC zAESWpGxK3<;1$yy!==17HyM5Hg8Dz0divMdBNl}17XX(T|GfnGQPW=o@Cjx;TmwvN zs=P|QR^VODe5AGad^6r8aFMa^BY-Q7e>xtx-mI6W1NWHy)CIu%oBl5ce%{Qt>w#Y} z^0*y%iP87Zf#+=>^7{zzQ^x;23%tVEL*Pz`rr}`#$iervC51d1WE}e*&*I z^fNFwzA*K9z$6e2N)QC-BS0p9}z>XXtGJzQl~@Xkg#?_mhDyGWtFT_$fp065!j6 zKCS`&wZS(7Z*Tnd-N1{@e18!5AcLO-zG!+lo)>^CjeWcdysfeCw}D?a{_d~9zcute z10FQ{VOk6CHvS0?#(~y)SSv{^V8awV`~O8Q&qm55Oi}eG2$yqwgbuCz^Qh1mIV93)`Oo{D|TA zLf~Q(FI)lq9ekFf{}bR$GoCwuA29Rx7r-S(zK;S=GWvcF_*-LdzXe`t;=4D1KR5dL z6L6p5?_=OGWE z08a5ZqBkr(Y{4l?6k30!CRIS_bget3Tu@Z&~)gTS;$b@UGdP8j|vH}Q_CKLt2o z2kY6nz-Jo!`4R9UvtC^byqED$w*WsE4g0$Xc#QG?4*}!fYzF*11$=>_|03{2{K>1- zdky6sCWQDM;6k(B{S9~*L;rK&Z!*I6cm&G3)X>icKElu&4LslQvkh>Ck^fZS{S5sw z;MK<7<^W$~=r00(!sve)@FnFTKl=cm?I7g4AMmY)emiiL@$bFBn`XNkO1&ZAy#oc6 zdPf1zG4ePO_*~>XzFz@18UMBk_<3{xo50_g`Tl3%`9^-90Do=PgRg-*4Zl&$Q}9d;$D~nO{C+M=_}z zPY&=AMn1*BXBc@-1iskxw>|KaroZXHuNe8v1*VwA(O(Qa&Dc*J@Y|++6L8Gf+y20B znDwm#_$DLIKHzh(Fig_fZba6Z$*}c-oAx{w&}gGv6-;zRawLR{;D4$H*^0#fcG@@ z-vAG}<`~}y%-v1Ko(h3~Yu2Cfz_ZQ#+zz#`hcGA>)6451cgpzXzOc=zj!^ zFC*)#)cX?nC^J9t&(ytpP5g=fdhYcZe#QX*)bKM2xX`R`I{*)rg!Fd<{*B>h9`Huv zpDKZ0H0$$Tz`vRk-ro$omEnIa@O5Lt`Z(~FJA}9&co&RGUZvi8;2JaEHv-4a{Q3bf z?8u&$HuQvf-X7F9WKQQst2f*)|`T8mF?Z#hy3tVgHkA$tQogI#E6!7zA{%;NZk+J7e;D2lrw%-N# zJG1`G0?sq`z5w_{A$VZyEc!9Qem(yw?NMnl7(W?{?scMqfV%-f2`={|NAjb3^IRf&XgcOV1`=JU6WW4!Fqpn=H)D?M;70z@VHEeSse`>vbFOp+kMFe=0sk2J`#9_ncr6cA8+Q@Pk^s9?e747!ua=J z0AFh6@1wwDjr^Vie$x1FdNv`;#80$W*wgsKKLOua67u&kFs;GzD)qhsKDQ*qnV?NM zba|C}`M`&o{r*_s3ygo741BNYe;V+@qVWC-;NR^L;yr+88e9$BV(h6N_+r!FO5o#+ zyblDv$H=P-_@`#R4FVr+{LNv&4;y(N1N^Gd?v{tSHdxRBpZfJ@B%Ujy%N>?t}C z`CZIWd6jwvzzu~V9tXV2)RzG7Z}3jQAM`{10DSu;1f(e?S+4B^tTH5 z!_2UK4ERZ-?{44+jXfL+e59EVhXd0yEv~;~f$uW@{Z!x~<3A|3o^R-13Vel;|Br!> z$DgBjE6VhYp2I%_{;Sc)!@!I82e|!U{?@yPxET1wk`PY>e&5)`_P`ICcx5{9_l^AK0{_^|$Hl;N z;S=Ol>eT`N-K@7wz?Yc$y+81;OuX6we5bj;5BN3XALzR&KQ-g|KJfR9J)8twX!t)1 znC67z=VIWujsLz1xTrX+zY+KmV}CydK5KMXe?Rbn4#J;44t%kZ=kvgKnECSx@X5xX z{1Ny~V{d-}&NcS&58#PLKHmT@H2S32aDc2LaQWovZHw4#W+4C4fC6@9zQs z$=KI%z^9gn_n!v5*x38|z>|$Xz6|*PGe;mxYdz`1`{Cdf3MJnX&qxvGG-fuMdlCJg%_* zVjHhj`1-!Y#-+m7$FFTXvG92P#l{l~kH=-~v9NjJc(Q_xPbjR1*TUg%m~?x(+PGig z{wdqIOQFA?jV~|EpV|1q!trH*jqfWwzP7RPZiU-7%*GoOo?nl$@x;P-yp4Moj?eqq z`0c{wGi-cP;dnXA#;e&eNVorZ8-HBL-x)UUUif-6*T&Zu?vHsk{-&_Mueb5S!u+?} zc+0~5`+$w7Zrr@y6E@zlaQO>1zORs%H*9=(VgKW2zjcN0H}JLp7fol6*B@-0+4mUS z>PmmucuHaZ<+|JV8-?d<9c=t*;qzPF#UHZZRBRZ|L<kE&ki*3Ab;r_VV#)lMc-z_%YsBru5vGJtB@#GO3Hc=<0X0XdfVD~QQ`IsxAFKs z&6n?P<0A`SKlirrJB8!V{x<&3{&BOvuQcyfm~Xa?Cl?-HC)l`q;dpYUjpr6VAAD{8 zx^R0hw=w=ELG#~WoIZ(aC#?ix1kP4W8*!SZNB~_8y`{FKhtfz zsIb3}uyNPI{yxUWc+Hj8Kh?(g9hJuC+W5M{{e6jz@fgDfA`ur zEL{Il^k>c2UufgJaQ#*GJANjgPf2Y#VE&A<&WNW=u*uU+X*2erDN}X(c3s~Dal-98Ehii$UmLGp$Y*Bb=53`?e;YU7-jzyQ+4z$}-gj)#-@de~jmI=i(7rUr##39V zP*iO^ye(T=Y~z<(YXUnzL5u#@rLSA` zw=VtM;_{}T*CuFHYH{b6TH($vY_05>ej7iQ<2H0!rgf=Di}A9hO?-^csgwQj-B2H6 z8a!;r`xyJM(=u&KGnTsi1Rvu*?6gd~(s@f=u5%;s^7f^Bmb!eQkMWr4w9HDS#Y_f&6P3v-4`%LUoJ3())%TCG5k3Ln!=dv?hvhK50d^&v|`YdXngUwg<`D%LwW1p|; z^HqJm+P=c&KA-)!qp5&L|x&lmfAiO-k#e2LGO z_9E&zJgqsn2Im$ZEGU_4!htFZ1~_pD*+I zGM_K=`7)m`^Z7ELFZ1~_pD*|Ma-T2v`Es8x_xW<4FZcO!pD*|Ma-Xl#=o3~N_0Y4B z@pG|~;Img6eR@0ZsxI;cDviEErO}tDG-{1n_U*w}X-Z8~Y?^XYJ1W$AG;>pQYR8J& zMVeXZsVF`b<)_m0StvmjMW~_-RTQF%QiL~Tt=)YU<*1?{Rg|QPqEu0qDhg9YX{snr z73Ha-Kvk5eiXv4}rYZ_mMX9Pp+Rw^WMZu~lSrtXAqHI+Zu8PuCQM@Y3S49D`YMWFMfs~JfE6XMq6k)$!HPmyQ3@-HVMRHtD2Np$ zv7#tel*Nj|SWz0QN@Gg)sti^eJ%d$cu&NAJmBFeqSXBnA%3xI) ztSW<5ef6p;gH>g)sxM$wWw5FYR+Yi3GFVjxtIA+i8LTRURb{ZM3|5uFsxnwr2CK?o zRT-=*gH>g)sti_@!KyM?RR*idU{x8cDuY#Ju&NAJmBFeqSXBnA%3xI)tSW<5Ww5FY zR+Yi3GFVjx@fMD?<4;u?tSW<5Ww5FYR+Yi3GFVjxtIA+i8LTRURb{ZM3|5uFsxnwr z2CK?oRT-=*gH>g)sti_@!KyM?RR*idU{x8cDuY#Ju&NAJmBFeqSXBnA%3xI)tSW<5 zWw5FYR+Yi3GFVjxtIA+i8LTRURb?<#218{qR0cz3FjNLZWiV6*LuD{j218{qR0cz3 zFjNLZWiV6*LuD{j218{qR0cz3FjNLZWiV6*LuD{j218{qR0cz3FjNLZWiV6*LuD{j z218{qR0cz3FjNLZWiV6*LuD{j218{qR0cz3FjNLZWiV6*LuD{j218{qR0cz3FjNLZ zWiV6*LuD{j218{qR0cz3FjNLZWiV6*LuD{j218{qR0cz3FjNLZWiV6*LuD{j218{q zR0cz3FjNLZWiV6*LuD{j2JPvbe+dbd#!zVtmBvtM43)-EX$+OdP-zU6#!zVtmBvtM z43)-EX$+OdP-zU6#!zVtmBvVEjFiSmX^fP{NNJ3e#z<+5l*UMDjFiSmX^fP{NNJ3e z#z<+5l*UMDjFiSmX^fP{NNJ3e#z<+5bQeTQW27`jN@JunMoMF(G)78eq%=lKW27`j zN@JunMoMF(G)78eq%=lKW27`jN@JunMoMF(G)78eq%=lKW27`jN@JunMoMF(G)78e zq%=lKW27`jN@JunMoMF(G)78eq%=lKW27`jN@JunMoMF(G)78eq%=lKW27`jN@Jun zMoMF(G)78eq%=lKW26j5%3!1nM#^BM3`WXeqzp#NV5AI2%3!1nM#^BM3`WXeqzp#N zV5AI2%3!1n#>!x<493b}tPIA=V5|(r%3!Pv#>!x<493b}tPIA=V5|(r%3!Pv#>!x< z493b}tPIA=V5|(r%3!Pv#>!x<493b}tPIA=V5|(r%3!Pv#>!x<493b}tPIA=V5|(r zidC#I#tLJsFvbdFtT4vPV5|(r%3!Pv#>!x<493b}tPIA=V5|(r%3!Pv#>!x<493b} ztPIA=V5|(r%3!Pv#>!x<493b}tPIA=V5|(r%3!Pv#>!x<493b}tPIA=V5|(r%3!Pv z#>!x<493b}tPIA=V5|(r%3!Pv#>!x<493b}tPIA=V5|(r%3!Pv#>!x<493b}tPCc~ zV4@5r%3z`lCdy!<3?|B8q6{X=V4@5r%3z`lCdy!<3?|B8q72%*!1FtnL>Ww!!9*EM zl)*$9Oq9Vy8BCPHL>Ww!!9*EMl)*$9Oq9Vy8BCPHL>Ww!!9*EMl)*$9OccFD(MuG) zMA1tWy+nacl)*$9Oq9Vy8BCPHL>Ww!!9*EMl)*$9Oq9Vy8BCPHL>Ww!!9*EMl)*$9 zOq9Vy8BCPHL>Ww!!9*EMl)*$9Oq9Vy8BCPHL>Ww!!9*EMl)*$9Oq9Vy8BCPHL>Ww! z!9*EMl)*$9Oq9Vy8BCPHL>Ww!!9*EMl)*$9Oq9Vy8BCPHL>Ww!!9*EMmBCaQOqIb@ z8BCSIR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_!BiPc zmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8BCSI zR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQ zOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8BCSIR2fW_ z!BiPcmBCaQOqIb@8BCSIR2fW_!BiPcmBCaQOqIb@8O)TyOc~6S!Au#4mBCyY%$31h z8O)WzTp7%j!CV>4mBCyY%$31h8O)WzTp7%j!CV>4mBCyY%$31h8O)WzTp7%j!CV>4 zmBCyY%$31h8O)WzTp7%j!CV>4mBCyY%$31h8O)WzTp7%j!CV>4mBCyY%$31h8O)Wz zTp7%j!CV>4mBCyY%$31h8O)WzTp7%j!CV>4mBCyY%$31h8O)WzTp7%j!CV>4mBCyY z%$31h8O)WzTp7%j!CV>4mBCyY%$31h8O)WzTp7%j!CV>4mBCyY%$31h8O)WzTp7%j z!CV>4mBCyY%$32smcc=r@yE`CwrKkCv;7{w>6i7jc%lctt3{7~XWOW}T6fcL^c7UA z={N6@vC%+s__YljA0;`_Ark*_hDxZmFUH#WUN@8JJ_$KC(y+wtnc5qKlt z?GBneePYv8d~e?=EowWCA3d&R*Ho+Q*|KTG)Xff=K7Ofr#uQ5gwI>6o=e0+*bhLFVeH&m*`XAm+AB2Mf4@`EA$octMtwAYcw7T!Rs_W1aHub;Wz0| z;J4`S;kW5OVKmy-DKNi7cZ1)hH-z7#w};=ScZENo_l7^Dr@%jiQ)&mac1YU;T9BxJ9eVBsQ^xp8Y^fb5)JquorJ{fLHpARojUkSIP=ff+|55n!~ zh46~>oA65X$ME0iAK(tOy|lR$bfo_V(Dddb?IZ^-t-)JJ^E6(4}Ax`K8^Q@ z3Hs8{!Tso0;70mQxI%veSLxs2kjDGF1QERk9Mj$5gvNWk1pcNsec+7s5YFk%;0;!MidN+75-5cJHPT}ooyuU!O1HBVGgdPPCrN_cM z(v#p}G~T-*7)~D#??j&p?@XTskDxDrN7D1*UFf@E9K3B?0PjXW29Khjfp@20g7=_5 zgZHHI{v^R(G~OpG7)^I*YaT8s}FC4x>MX52x`yZov^W-Zv!pJN+AcB;CsXwkeoJ zcY$ZqW8r_$bK!r|pBL&q+gbf6*6}xg>fZ%EnsuBDFgS+BdqD)p(#ONc(dWU((^tbM z(C@(~(m%o{(QWMSMYYx@@X4$XgHNIHz6R=<3!lpRyYOkWyucLA9@8EiRPxuBJ=Qq(lJPN*% z^*ONb!+G#ctj~vUrg83x;1>F2_*VKucs~6-d>h@mgZXy4Gwl1MCwvF%5qu{-5Wb5Z z4*NbC2j9*5bod_nDEMA_4tyUy55AwC4?jRZ0{cGs4PL-{NBgEl`=kf_AnO&__sIbG zA=Zb&57T&mi{KIZK=@I5HvAZUI{Y|&3H$_oGwl21LHJ45Ux1&Y--Dl~zkz+91f9&! zu-*}Vmd5)D1`Fv5{2V<1ex4o*zd(2C0AbYJ*&dK35!dVARS$sX{VtnUZEMgJXsn?42heR2`JnDrarcj)`! zcj<-jd-P)XefmrI1Nslx_es*({2}Yx!XME%H*D~4dJ?>ZJ`DbtJ`whPi1YXbpRoQK z{3-o$p$F%l2tH#yhCioqo>R?p1pEc-XTV?5mlk^7fWKn>EBI^r&q5E*n;m?^`r7cf zG|t(n`*#BT9qWg~-_s|-{&`&h|G@go@Q?H-@K5xQ@XvIsF6Lk84)CvZSNK14Z}>Ml zg@31UuEXFDdMNxSy$4*fZ{}>91PAm?co`b!iVRxOXTYuLf5FSr*THS*yWr*M$KbZ~ zOYrjayKp=D3wQ;(aW!*$dTV$^dIxwVdMEgA^loqmdNkaTo&a~Er@$-I)8NkZq3|m7 z88E&nx9wcG3w;s18jW)%2CLKe!E4YD!)wwwFJiD3{T$qtUIcfeac;z5ZTda9JG}(% zLF4?00e&!G+jnq1{R`Za#yJv$Ui7l|L!zKeuK+jD9pQE8F7Uc^SGYHgb0r4r(d)u} z=zj3}bPV^UH-!7q1K>s)=S&PL^mcHS9tMZ>E^tKe3CHw!IH7UgumC>@vF$)Oqi4YW zrkyx{Vz2@0N5LD?cn{-XBl=Q!WBMw16Z!^tQ+ht!pS~L&KretdqaTAer=NxKgBjcY z4R1kz4iBQggSVvrgtwyGu3_Gq?h0>1_lCEn2f%~rJ>l)>>G1aSQSc5l&MO!Uq36N) zL6L1Z*H*A2{Rljaei`=TPka0O^k6vaIG0$k6J3FKrU$?yXqf??=ys_os0l zGtIvMK7jQ_@PYJ4@KpK-cpANIH}iCQ75E^!7kn@s!+!gxz%y9?2aF#O+I9wf2z@Dh zD2?}H3=X3of)A%(gpZ)#hkbs$zgh5i)^Wb7;7EE?cow|_Je%GV{s+B3{7?Ew_$d0+ zS`WWAJq{nu`djcZG|uIu+t9PS`B>I-_&EAN_;~sl_yqcX_(b|8_#}FT9_Ewj?y!H3 zjqoX~?*pGo9|506pA4T)UkIN;Uk{&2-v`g3pM`z?x8bu`{{lXn{vGz`iYwNc&tZKF z_*{Bd_&j=F_43cZ46K_ktg%_k*9H4~L(maqf=bDH`V(3!bL0fS;k~!_U$W!3*i<;pgbq zW%Kj&>hKFR&czYDNaGwv!AmsWpDK8n-VR7(J#=+ofOX`D+^^IQdg!TNmoOL_tP75xnSHT@d=4gDefE&Vn8 z9sL{pJ>7O4^AB`q_(!@s{1e>={+Z6;U+97Guk;Z3KlCX0H+moVcX~Sf2R#e^lRgQy zGudD}7xsNM5B7caFdVSwO?VmlJs7{#vh8EIHCZ`76xe?ratYjv_1oYw{V43Wa}nIY`bY3O^bfG# zhGqMh*JXVbxHsJk_7lRzu&=uX+=o3o!RymF7odLjav|K8^;_V6^h0nX{UYqQv)%gU z3hQgbRk|M>(woBGKLd_f$9oh6F^%^VRL{#Weqn1H&f6NK^e=^;N?)sItPg^7dS}?z zItAW<^~>N5>01ju55pU={t~<~{Q>Oz`8#+M)?4*6Z%VHW`@Y>4?$7#O@BsP%*l*7) zcr(^dgMI#sVf<3swwqv|a{)Y%_2=O&=yzfNS=ra{Al6Hb<}K+C@K$tp*nbW-65g8i zDeyM*5wPFRli_VyzYzA@c|Gj6?IUM$J0N-d(+E><_UBc zcptg}_Wi#nJdyS3@V+$OA0(JW&w(e?^WZ7;e0V?l5qN+4W%vO4L-;`Ydw43{Ix3x`Gw9*)OnMxA2t6G>ls*bRjGhA@PS1mnpy$JXryqfjq+f=8 z|Fn z;FIY0;FIZZ;8W-zF`r6zgioV;z^BvpVoCd6j~)P@Ne_kR(4*nA=mX)i>DjRFpS$35 zSYHUAOSehQ=h17z=hN%Ke%-O~T-Im87tqHQdKSPJvc3qui2kV1(>1gDzgV}|Sljo2 zbbt5~dOP@1dRO=|dICI;o(}u>WwYVSSw98#@5ScASFnB+d?kGw?B8cS1YgDabMV#l zTktjXC-AlOkMMPLtK57&-2uLV?h4;X_l9qx?Iq4l-efad^`Ohd8!^d^i0%d=LE&d@ubGd>{Q8d_Vmy`~dwsyntSQ1G9g> zunPPj>pkFy==I@;=^TE9-U5D<9tuB3?+!msPlTVK4}zbhXTwj?C&N$E=fTg=m&4D} zH^U3*`{3v3Ct-iizX*Pw_4nWx=r3S@KK~2s&*$53Xnv7BJ>i$=-tfzGBfN-C;8*C4 z;8*F*;MeG_;MeKx;Wy~v@SF5*@LTl0@Z0q9@M8KR_#OHl_+5G-{2u)_{676T`~m$R z_(QtgM&^&`)!~2B>%dFs6#keV1pBe#Q1}zpFNJ;Gn_*vf0qpBO2m88z)hyy3fF$bKQ4fU-wJc*Zm## zb=z-h_I1~Uecj%$ubacZ?pCm`I|BA~PlUhVx);H|?)9**doS$kJ`MZ2Z@|9pC$O*k zGwkaw*Wc{xt_u6Q+rVFP-Q8hdcQWkj9tQimC&Iq&T-evW7S{a>`?^oVzV4f_uiJ5e z`75qlhJD=x_H_rrzV6Pjue&$w>mCgIy2rr2?%A-fdj;(4E{4D6y5GURZmZ4AzV6Df zuUilMx*_cAZVvmp!(d-`EbQw}gMHm=;cvL^gYdWXLijuSE%p^?*MzxKjAK{ zpAD}@UtZ{W9bTRF&*3%b{}g)q4YK;0tZxqE1Dq>*!Ryocr(`L!@f^Ghc{<^nZf3P^xxnu=(XTM^t$ktbOLWhZw_xw4}rI#cZav7 z_k{=3GvMv$qhWsorZeFkSib}wLf;4vrSF4xq@RX|(XYe9=_T+^^bhdPbgS*mBj}Fs zNP2B}7kYhoS9(KuH~Im16#WwH$Mbh!{NaLapTT?3Kf!y_t+qGsMgI*RO|J=$p&Q__ zbO?{5H-*R3+roR(BVhm9F&6f(9S6e`*mE?z4}C5?k)8+dOWzDnqMw8()6c9jb0m`PWOTjqWi!H(*xld^fvHJdMJDdJq|vUo(3OA z{{udpJ{>-Sz8L;HeItA%eLp;leirr|1w+iUS?>)0gRY1FNmpU--x5BG^51?$ z^vpv4$?&nPUko2d-v}R1-w&TaKMU)&4K<(0dT00~x*qnP5%9^Z?+c$o9}J&L{{uda zJ_SCVJ|8}Vz5+gzz6G8`-w&TfKLwvnzXhK|FM-dczk@w5f5M)Z6?QbA$DS_m`E)%z zm+l8&KyL_NNN)*WL=S`iMehk;OizM6BQs#n$O-Tz>^Td*l)f0gjJ_70N8b)#PCp1= zK|cduNxuqTMZXVUO@9GjL;nn4OSc+kzK-q!Ur*P=H_(mnjr7LwP4u?#&GgRjE%XHV zR(dKtpFY@Je_OK~ynY&bZfE^s_zwCS_)hu;T=%YKH+cPV^xVz*B6xOCI|hCL-^2Ph z@V)e(@O^aW;pY44Ztw$iow2~J&$C};X^?LO9S{3+l z_G}72L2n29y1T)??nKzvodNspJO+M}*F6n>ik@Sxf4bQXUcVkaejDzAeV!*_U-wnm z*Zm0gb-#z7;hcZK&(h26Y-=rSc7xZ~w7S+>7xuMM*w@+u_O*t=zSbD{InFs5ex5$S zT>nC|8@zrzdi?V`2lllthkdPEVPES(*w=a;|v@gdSgO*%9VN z>{%Iph3*0Sy8U2ZcVpPs9Spz9{+;31=v~eAuQ$8F>(kKV>&}LK-BV#-_d?j$y%zR$ z?}B~ZC*U_Y|BLXO^eg82x0>DH^{>$5bN&Ip&7QU+&5P;w=K6P<-Qe{e=<(~eu_H$C zE_*t_-qYEv>%zM3YUuIXuoim!w!yk>-O=Owrzd)RzrosX>!8Q)yFTdg`xMrF+K3*1 zEJf(?#~7@~ScV>dY}=3bnjZ789`pUt<5?Ss9?u}G4BEFoO~(p*y4rNCfOV{}rvOdI zuHoqMV;8Jrm+ji7W9caL_^}k$v2-u=_%VDOdi>Z9>)5^zdi-m|Wc2vg4p?71j7|4f zYuNAWwy@tv?P0%V98zhkgI|gnj?l?mOS-eNgw~Ozr;i z{fzr4@cmr7kNkLx`z7$>aDUj3`2%6!pSAnKzwQi1-S=T_|NDN!J`a4q)%LmXE9~dM z_thG+7N3j&-=~Jr&efU>z=dPmKDttixsR+1MOl2ivw4dO9|{ z?Dg$Y@5DM>_MYLWugp4J_MVZbU&lIJ_MW}W0q!*0CZT7IW|zHwAnI$f4wtzZBm9y~Ryt7jc9d(Y*lU(Y&R_MYp_!Md#DA%fT9V1vtE$J3oUJYa2u%ie>h3w7(W z4wtu@0BL2Z#GQguphq>^+EIU4?bH>^<+JUS%CFd(X$HhpfY8 z@A(|{8(4?S-t)aVu-~g;`x8C(I~cj_b-Z7F9l~cDT=t$7P`BShV1vuv(-C$1xj#0z z>^)sjx1Y0PgUjC274`n8+RtiG_nvyx2e1y8`_m1m-`MQ3_w=)RU_bxDwgGy!Zg$!0 z{ZY4{*Ih?1NY;f6oMxt)tOJjq}-m?el_B|># zxa>V+P``W(^9Wv?HGIu2mA!Da86jruOE!)5O|7WG|Ohs)k` zGU~gr4wt>>Ow>oQ4wt>>Jk)n*9WHy%g{a@mI$ZXi%gw=9)^9@3_-2>Aemm-WvksTN z=U&t&unw2K=ONVhVI3}e&l9LmWF0Ph&qCDqWgRYi&&#M!VjV7f&l{*uW*shj&%3Bk zVI3}e&%aUMk9D~0J)fh#KkIPWd%i{e0M_BM_xyz=d&-$qUopreEJr&e% zWgRYiPi_v5VtpWbj%jw;>)W7yEbDODdxoHX9P4n|dv-?sc-G;v_l!dQ1lHlQ_l!aP zMAqT5_w0lENvy+V@0pDHeAeNz_e?hjXRv-Gdge5{?DeBjKZ|v^>^&!>Le$S=9WHwh&bd){KI?GVd#*(NHrC;?_uOa>E@u61^jy;H zvey@&ektp4*?S&C{W8|!viIPe9(A{~4wt>Bvz3B7SYHjc%do9w|MY&`Fdk>vBKxQQ z3|$AGw30> zu0O7Z!~bA?q`Cf-W;b|!qScd=S%-TaO;5*leV&={X{;Y^uE(8e8{FXalg-Io*5O`f z(&w5r&js*BtY2)d$DMB*+~D<6-)V6oUuED>&q;`(Mzr2K} z`1^~C3a1qOi%b1nf`56*|5{Av6Kwezw>X6$=W9NjqwVp+d(W1N7mwyU%(kfgMG5aa zt6A*6EcG3`|CA}?_p|%5w(~jt-cv_Uv975Tr;R_D`GU!{MPg z-<^f|upczvP3Gc!IJS(@WcE?>UF+BB@0WdS^Yt|2_O-Krn(rxdaXy^J;{d(6@1g}d&kDOPJgdA7Usj3QO)1f ze)a40uT@K>;WpoJGd|xA_D}O!xy5|F?E&^zw{JD;E8f1V3b(IQVZL;!`HuM?^HrCc z@0r4UoeT2~U1~nO)akEo-{7U@`?@e6o>u7dov_q=o7e?^^|(LQ`|PT<4L`SO#FH1_ z?Bd#nmq``(OXqGu>D`UFpYgOs>z=vPe8<@*;eXOun@98EWg#*y*wDWI<9UxZU3Q6~ zxbFA61*LnfhWmFd`=@pB_|&*>m%V_k+*<`n09evhEE*YcdNyY*>4oKgnY!Lb6{r+b%5C)obehRg8p!=?JB z&nuPu>0GTG)C`N2Bo4{b8chuqmNXgY=)OKpEFm5wY!+%#WD8``=} O+g6i;Qpdsq>ia*r)b^qP literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/generatecode/system_init.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/generatecode/system_init.o" new file mode 100644 index 0000000000000000000000000000000000000000..588275f5a8a891394379557548f23c1611235c68 GIT binary patch literal 149256 zcmdqK2Y6k@@iu;%x@Ae0djW%OYz#JPmTY5#Wp$7&A;|?WT&r9atj4`pw&^DH1PBBO zHS`)12rW(sBqY>SN(dndH3=b&R1y*(3!4l^HXQ^|{@n=7A<72xs7c9T|-8~sj{(^;X zzrSF=;Qb5g7A$%D{Yx?&f5FnX-#@Ev!GUkTe_q{!`EP%K=e}=$uwY^E!RvJk_Ivw- zOES)U|B$mT2hTTmJI?3Nx$@Do>Q-IvFAhF9WAS6}UGeDYb%&hw<#qd2cXWJWcV$8P z6Z<~qWS&)1QPVQjyaTz;CFf)~6?H9BuXxm;%DNXhU3gZ8GnVqDs7OmerO5zGxV*(wAa#2|2nTGjKb;vq<<7u5<6YeXA?ol+ikEWc+BIF%lZBi|Vd;k}ZmHT$nL($cs-KlvekmEy=38 z;=3llFyl*8UbHB!?uyVGH+|ww&(NjSEeN3n=VsWFo5JZclKBfX9iAH|tkt3kYPI

0f#97!9{fcsEk^ zugUJ1Zs7@XzTZcBx;e9(zfu*k$4LJ~umal(n7N6E@}4T)VhkRf*g%gLQ*$Osf9*f| zuNqzY2(3;mEBD1tA{?YKa7h%+j>P@KO%^B%o{bCtIfWnA!-HgO!1RBLDPDthS2N$tp>W6dZR&#Vz&7@lmY2`ZpGMnPP5JPGqQW^d3yTW# ziwlcq7ZmPMP&9W}*}S8F9QD4(E9&`2`gsxgZ8@BCud+e;WheV(x!GRR<7GdX9yy&d zjB^+2XW5{_|Ka-oDczMHS@Xm4BTFb9|HYm5DjPJU;u!zr2-TpJz8W2Cr^fZ3Pv1h3 z#k-Wn-9^cc;_kv^b8&ZZvXPDsZ)@!B!9kiN0sN0|@QQi=`aS?0z=jsV@}J@EWR(65 z*u0|nCL#NZ(tiY-R}}vjjDG^=7kzD(uir1Erywov4OO6$^=mC%GSag>d<_J@B;84q zbM)_<)6>%F-y6eM6#r}NY#`U;e~-;8>LomUaVWp2CO+7{qVTR#Jt67jZQ(15Z+^k| zWbjMm;~$sJD@y;pY+h0P5Azyj$&deOHZS_kucowg{s-qEM-TxOWQXfJ$4J$$8wc}2Z+Z;g8RiUaeCdh}(H;VUX% zEgPJOX7tvmN8dLTzM}GtJHd%4zSrsGfaqYncUlH#rW518)Ac3Shh88Y_IY9cQW3sF zc$&Lh%ik@7`P)M@e~^TOs5c=)-w7G|ZkwL2ucU|i3iJ06aY4e)$2~2NzJ^&|lD@*B zrth1ukh@Q^ok5#mce2Flk2H2^4irM@Mkm_&E#|x z-<6bJ-x(S8-8P-_X9rRxJ*J=`1hN z=WK_X|B4L0DTD9I;0H7K*$n=32EUuZpJZ@^25Wwae#0_&Yz9xs;F%dbH-ndD@PQe; zK7%)B@W~nclMFsPgD=hCYcd!=d7W0@do%dq41PL;U&-KiGx)O%{!a!E2&SE4?}`lG zH-nop_}C1-B7+~w;3qTq{R|!$OnbGzWbo_^uFc>BGPpT|kI&#UGx+8Vz9)lU%HTIM z_`3|wrpY6}q&`zJxG;lPW$>B|UZ266Gx*XBzAl4*nZfsF@Y5OmtYKFZ`i#mqzXhkF z!R%j7MLk+Tg|DbLD+C-xJ$&h*c}2Yvj=$k}Eb~D-zoFO_rf1GCWISIR$dvKY#(%or z)+daGbkRKT4!qm>+&y4Bf4d)S=W7pv&%~d+CU_6yV6hUus?2)=$96n^8f?e27r;Y; z{JVOu1jlqR-FpM?;e2_z_ZGN`lK3^<+e)87f1d9B6Bz0<-TN0fwBK~^-{39ylh<_b z8ysBckj6vEy47$Nm~0@g>E1x_Lk^LD2>5ZsqrlG^rr$pg>oncl1^lK-p9X%{FvV`F zgS@7Dv%w!bM0xYUUm9Kvz9QfmUL`mze}=alY{!dgu#M04U>m>p2iy30FxbYwMzD>K zt>9&*{0^{Fzz^^jf>WLnZxVQ1c9?%Uc=IkH z7gPTHkmrHV3YOI+-eT~lxncS;@EO6jLy1=d?hWE&iMIy4ZxH`WyhFfbBYBm0t>Eh& zLcebCx;@;95^p2;qF~uy;%x>G4kpZqk6?Vuq`peLGr@2 zpJ}gK!6zGg-2>j+*z+OqXZ-cfRAhY%Ve&5nzcVMyUjuG1?YjniwbAzw@TqRo4EAdU|0`JVq5Z*knfBcX{;Sbv zGx)56u)LGOaZ}!z;3G}@UI6Ye^0t5n8GWt;HwObsiFYe_D{L;W5{@lnjK4pG^mC2B zJPsaf+aG*@k^c(#r@M#p-UQDa5c0d=ht2gLgLCu4^e@4GHTCn5_uqyowk3?dL%{il z$AIS;&Id0yJPn*QOtG=g@LcdIh8Ke`HM|UbdoZm*{|7%|m}2W+3?Bmi+;A&6VcNGF zJi+ir@KeVBHiKJ@|C|gS0vpK-{h!i}zh40E<}dlD93|csaL%rp9ef>lgYn;6!7%W=)KNLL5=sy-b&(wD!IJ$FK-VE?0qyHT6XcK=HfnPNBT?+0q_N@Vb zX5{S;zR~oLwcrblzpew1G4Z_*{Gz%3DDZPe{}aL0roGPq|IYZ|1>p5&e7YQbf{B+m zfM=Wjdpr0irakTl&ouRa1pKw}m#4vhGv&Vwz9m1j-<#lLOuT;&e8A8!{S)wiO#Jx< zJlB**ze4(uiPw4HM~(ePfln~)J09F(zkcvj#vVt5#~XW|1pds-ch3a( z7=11TA8qV&1$cibjhZpI(Z z13z!t=Th*gX1u-@e6AUvZUvLh@+$Fuh2x7%`ftG}oAQ1St~BlYBKUF>AKn1(Xv+UP zc$A6nAAz4W_5Tt)dRkaMec9}ZrhNy3$tF&};oyfyggg#>h0%91_%&1hOz_`L{u1y6 z;~$H`<)%MWfhU^&R||g9)b~f=)?h=w#A^Z{Z@2?|zTx%YK_*`Q7`(;!`^n&6n)1#9 zPdEMV=itr8|E~mpm><^vCh$kbKkfuSZ?1n3e2?*`$G{Km5?=o-_+n%4SHZ8F{`VI6 zB-1|s0M9e^`wV;q<~Z^y@xBEQF!moX5b@XOGZ_4~vBwzjU1okU0erBLw;T9a(>}An zql~--;8RTht^`+`_FVA5DMx8F(MlewTq~Obzp2N9l%d1FtoFFSyt6@4&|!ehPfMi9de?KWzBV z;6EDP3jVv{kHI5N{Qe4jk%=df1jYjs@93u_<`{n&0bXwWV<#}hbZ3t#;NKX3r(bi( zM;R`iel204X`fQ?uU#_6`{m%_#(s6+3iz12{y^~lCcdP=-6kG%f?qWC+W?+p^r5** zFr7ttr+_Ez7Ro;x{J4qV7lD@=dt3!xW&HgY;FFDi-39)gnQ#9Z95Lhl`OoR^s$Ne^rLY1n)()kZ!`6o2fo3`D+6yZ_1PO-VDzsCe`ebIAn?^jUNiW& zraijAZyDYQj+_2{47k$pPrxa|=YX4yf794?)r_#cuLj?5{N-lwN;5yc8~mh^_YioZ z>7P%4gNMox51t3_SP;s89X#3emv_LAnfiVJ&NcDk-{29(-@XU`)WqLx^qu>SenY{p z8~w+ER~i4F2)-3E{#<(&xrgYn-pz{gDwufG61(D>8k;AKXi8^BA9{cZ zOnl4(?_>JgC~%(fukqjmj6T!AH=Fof1kN?~n-5NycvKGF%lQ8a@a-m@))qnYz<&=0 zUvK=U1^gp3UUh@R`$;9ZkF~%Q;fd?6X-4T4YD-QOZ1m4fcF97dt{CN-Xp}V^aO1!4W~iMI?~Z0xZQ zc%#XG0Qld~+2wBpUuODKJNP}5zaM<5@t>n9-Nb{Fz=Hw@!G0_FQxk741P?Uv?F#VW zCf?i#zQn|@JHV@r{T=`>HS?86!MhuMp8+3b+V2%`zUl9O1wUivgYSc{GV}dU!H<~q z|9~%X=0SU8AyzCf^&JHMmC=7R_zn|K@^PF68P2}Dg0C`M48F+p_dUV48-J((hp!TE zCFM8v+ZSABG4^T&7npc+7&w@;(Be zZ_4`;yo<4q58Dhd?KKemFXJD>!PLiG`QyM(n|Lu9yt+6{p9#Ly*s}!up^?8Bd<1lG z@~Xgr`tYY(@Tq2g@gs1N>Ay|jn~gm>z{8CE^T9|6AKjMvA5*O>gL zf!{X$;b-7~7=OPEe5>hS*MToG<=+NgXyo4uzR&3YJMda_{Zruc%>46@;NeD}KZD;h z`fLTCXyVPs;2n*9zXHEu^ogMEUl{*LfXhsO8v)+g^zWU(RYw0QV2TOOp1Xt3GxN#0 z;0pMROD_fIjSP7?_(apc>cE#9e>o8RxfxGV;4h4Sb%O6R{<;B7d)}_R&ERW|Jx&2% zZ>~QZywJ$M2z;lp&sE@l!@mIUVC3HgKG^ivUxV|^`1m;Z6I0*kz|+il{u+3^vESR^ zRmLCw2`)DN{yF$=)8D@X-(ccN9AzD7{E>cA{$P`T2k=!v04(u#0p}R|Ob1_V^qUR7 z!Cb!(e4+8DCEyRucwG&io*&wO4Y**BkQ=~X&k6ZZ@IX`FUhruq9v%t)!ubCQ;79Yq z>rV&2WBl`c@S&!Cwt(L-{pEV_=VpHVOR#V1b07HjNGShd@Es;Ut#xQjlUIrN5_nG& zpZ)?aL7TYrcfqwLe*O#mow4uN;JZ!!D17nv#vZxg7UQoY!HZ0M*ctqZY0s(P=S_Mc z_#QJp%>$o4E7Y$He3q%--r!rze5@YaVdCjQ;BO2!gWoa!(*^$C=(7?0C&R~pH=B6y z6L8e@uXDiHn(^gg@JiF3SA!oj{(UpJ+vL9+yukRwL*OqAKLK88;?48mpPTDn2e%me zyaPVR)b9gIcjm+R`fu>l#$Ue&=a~9sqi^J!`VR$f$aextys_Zv#y=*48%#W&0j51Q zd6jr`z`pV4Md0gZhv`ef$2x?5HQ)y0pY-ff%9OVj{Jv@Lb>LkFIRRMzgP%0{j{@Ik z;`@nU-}vhp;2#z#!$*aV>9LJBF`rH8C(eww}%Rj*M$NRxA7<tjM7be?g&1> z%ugqQZ#C^pd!xTK`tJe0%8ZYDfww>hSN<|EJu~2VAMjH~{sG{Z4L5?{GTaXSz;HkK zOT$Nlqq~LjPXZ4zd?t7Y!xw@_n0R{y`1Jhn`WwL$OnMnX z2K)iWGt_kX}s%=KA_RnrX*0@EJ1lQ$ZCys=L{ zc)n@>UBOdK|0o968h_Xme6Hya72u~#`>h23!;Js?fx8QU4B>}dY0t`6MxPFFE{xw1s`Yn_qE{2@bLOu!DS}@ufVq%`}`I>U}~8E z_uzgLFJAnDI`nEA+VV7f==(r1CEIE1|xfUAtXE5Q#N|5^q9&h)SS zz;BrLI0U@L_-7koo9hP5b@~{F3q4%fP;g2iJk= z8FYD-c(;KU82`K%{M^7W{deG-jXypGKGnpNKZ5Tu<^36aobjKn;7d*Wd<;Is&#qfdPdB*=!;Hyo0bb^mC_TB(qX5?=Mmz(xI1$>H$?`MN)56RW~v znRxUaIAQ7&hwd?>-w<%OvDXgZY7=jF0iT9G?ev=tUT*A3w)nkCUkLuK@h6JK*XM`V zSAz$e_FDt~)c8*W_(H>nf{!u!_kw2_{f-3Z8~slJuQT!Fbnt47G4d+$&IdnZ<||vk zGzPo$>%lSD%<(V5OVB4A-v|E4A=>j{@L*%lKY+)Z`1lg|E)y^Q0=~t>t9QXS%yI%t zynlgDF!lQyyxP=13fs~>LV1;Vx!@V*`jOybqtDLZ#U|cQ1-}ZJ?)pOTDiaUpfzL7Z zF9Tm^{CjWkVaC7e!DpE34+1}F^l1hkYV_>_pJK*~jo@2Md_M+!#BQN}KLO{PczzDC znV(z?9&O}b4Q|U1ufG|*-mKT|1|Mha{}A|E)8C!|(>)n^;r>7PAS3^E@KDp9?|=_A z^NSC_KQ{LIH~4Uq{yjL~*grcTY~&9G|H{;NEckjeK1~F_9P#vp`~Tp(&Grvoen);jwo@=f@16*R} zHy42aZsOtP;CpxX^i|^B0RD~P+rd*z{`-Fu^+nTyFfWEiM0e?=WyE zf4sLTEj>&jkx_4MAX#``2Jh*eq}TgM85)UsXQy$Ncd>GW(+7FiDpQjV#lrJ;Won|K zxVdz18jtjTlg6XG$Casz4~>lWo>Sh;JjQ!fxs`bb?@i@p%wxTG(|E_=SvW}_=Y5%$ zj)89?F2qaHclNTC$x_4c;O0bSYJ*{s3ErM*=@Y%0G@k6Gl*y-uMP_)1DpMI0X8SYv zm<&EEgD=hC8#4G;8T?oVzmmakX7JxK_=61ocLsZts3!8F`ebMD=nUR1gZWz=XW~a& z+}Bob`>QGLhspUj_V9+^A2&aiXn(VALs!qbI(%_>e{b3^xiu$S@ZFS6@|BA8LqPn! zvcWIC@pmiETv3?sP1?xcH@NLrPo{qd_RJOkud(}pkE%|;2A->~A~wXHU<+_T4anRc z6s3uUq5>AMPy$V#T^v#ExR`4Y97SD3-;0JI zo0DgL_s%3IOeS$|Qqi$bYA>0+6!v0Ik7}=w+EW(VE9-rq9-Z*2gje`zj~K5o(gT<5 zfw>;#IV{kl7O(6XS@F7jnevi7O65zHSME_NU#`4^9^69-7maWsyUS;^2iUYe8b{> zKeY1Ai}!t<$d9UgizD~-%D20{ANz5YZ+*P)$5s9u;C(-?@@E3?`+DWi2j2Jf%AXZ` zKk@a-pBucdTh5O!@%0ivzQor{{ANphz0^Mqsjrv%^-X=fRG$i8&(1PbzP(dlFZK0O zUoZ3ZGG8zA^)g>C^Yt=cFZ1;>UoZ3ZGG8zE^>Sa&?l_kBpZj{bub2CJxv!V|dbzKc z`+9}1SNM8`uUGhbg|AomdWEl7_+99}dbPe@ zt*=+=Z{+EEp_sBOPze-QYWpvq9R&(c}bSHWO+@N z_oV#I#=gKxYGG-4Wz?CHN>fs6N~%psy(y_UB{ip{>Xg(SoEMU1R(ndSPf7hLsX!$) zsH6&&)S;3}R8osds!>TjDyc{%HL0X3mDHtD`THfVyV_Jzol5FcNrft@Q6*KXq)wGo zs*+k&Qmsmq;i$iu9E6iQol+nSV;{lsbVE{tfZ2a)UuLlR#MMO zDq2ZRE2(NFb*-ebmDIM9>Q++UN-A7QjVq~gC3UW((v{S@l4@5{?@B6ONzE&%dL?zQ zr1F*2zLM%!QvXUSU`Y)use&bSFj5C2bR_Y} zM*4RuQU@b-Fj5C2budx~BXuxR2P1VbQU@b-Fj5C2budx~BXuxR2P1VbQU@b-Fj5C2 zbudx~BXuxR2P1VbQU@b-Fj5C2budx~BXuxR2P1VbQU@b-Fj5C2budx~BXuxR2P1Vb zQU@b-Fj5C2br7e}D}Voq)WJv{jMTwM9gNh$NF9vS!AKp9)WJv{jMTwM9gNh$NF9vS z!AKp9)WJv{jMTwM9gNh$NF9vS!AKp9)WO>2UlJ-~q%uY-W27=hDr2NFMk-^ZGDa$6 zq%uY-W27=hDr2NFMk-^ZGDa$6q%y`TW2`d9Dr2lN#wug1GR7)ntTM(bW2`d9Dr2lN z#wug1GR7)ntTM(bW2`d9Dr2lN#wug1GR7)ntXn=-8Do_(RvBZJF;*F4l`&QsW0f&h z8Do_(RvBZJF;*F4l`&QsW0f&h8Do_(RvBZJF;*F4l`&QsW0f&h8Do_(RvBZJF;*F4 zl`&QsW0f&h8Do_(RvBZJF;*F4l`&QsW0f&h8Do_(RvBZJF;*F4l`&QsW0f&h8Do_( zRvBZJF;*F4l`&QsW0f&h8Do_(RtIBsFjfa+bud;3V|6fA2V-?GRtIBsFjfa+bud;3 zV|6fA2V-?GRtIBsFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+budu}6Lm0A2NQKLQ3n%s zFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+budu}6Lm0A z2NQKLQ3n&%Dp45|l`&Bn6O}Ph854CdQ3n%sFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+ zbudu}6Lm0A2NQKLQ3n%sFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+budu}6Lm0A2NQKL zQ3n%sFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+budu}6Lm0A2NQKLQ3n%sFi{5+budu} z6Lm0E2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0RR>db zFjWUrbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q&lfj z^-@(YRrOL;FI8bvbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0RR>dbFjWUr zbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0 zRR>dbFjWUrbud*2Q*|&^2UB%0RR>dbFjWUrbud*2Q*|&^2UB%0RR>dbFjEIJbud#0 zGj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3 zFjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi z2QzgrQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJ zbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xi2Qzgr zQwKA3FjEIJbud#0Gj%Xi2QzgrQwKA3FjEIJbud#0Gj%Xm2Xl2WR|j)-Fjoh2bud>4 zb9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)- zFjoh2bud>4b9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR z2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)-Fjoh2 zbud>4b9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)-Fjoh2bud>4b9FFR2Xl2W zR|j)-Fjoh2bud>4b9FFR2Xl2WR|j)-uuumJb+Awe3w5wi2McwuPzMWjuuumJb+Awe z3w5wi2McwuPzMWjuuumJb+Awe3w5wi2McwuPzMWjuuumJb+Awe3w5wi2McwuPzMWj zuuumJb+Awe3w5wi2McwuPzMWjuuumJb+Awe3w5wi2McwuPzMWjuuumJb+Awe3w5wi z2McwuPzMWjuuumJb+Awe3w5wi2McwuPzMWjuuumJb+Awe3w5wi2McwuPzMWjuuumJ zb+Awe3w5wi2McwuPzMWjuuumJb+Awe3w5wi2McwuPzMWjuuumJb+Awe3w5wi2Mcwu zPzMWjuuumJb+Awe3w5wo9jsLcYt_M8b+A?)tW^hV)xlbIuvQ(cRR?R;!CG~&RvoNW z2W!hs>D8T&$@SW8`D1gn<>uf6_(dc>pkH*Bn}iSGL3Vt=A8fBxoombG#RPsQh6(-7 zR6Va%&uh!|#wdOhic$TVwOn_60KY562lRW`a)0pw{3Zt)<)=~}J*0dpRjh>bpyF+PGy-o%PpqH7 z>G}yAub&Wmp7`68e|NI#^8uI7Alu|`Qub+>FrseKr1BXrOG8TkecEE2KKXynWn4Z} z>VRpJ8tcZD&!oEl*fbv7iDy;aqg$ULes<#WNw585_GdJ9TiD;d^wdqzv-|Et_Oo!G z20QuZsEQuL8V*?T=QabTjUPC5Lf;8?Zd;zz+)iabe#E$m6+I@5tE=cXY4`FU;0&DH zFuqUSsKyGQfBon&jTQat?40+*8Y_C>WV%!9C)JhLsOUDnv3|sVN8{?oO{#0eUmD@h z!z&l90hX;lH(uY~uksvLjz7<2;yJ{y z!Mbc_Zsj?wyt7&Rf|c)L*1llndzowAvRAhCv6o8!+hSNV{mrdBhn4S-c|U$w`Czm5 z1uGw8u6f&D*>;${RN@cLY=bp3(cH>&SUJ9Mv@clsk!I}+R(_JX#lP*9ZKv9cE(>es zOtU^;u=4WP+r}2y_CH^5o^NU&(>y+>m7c@O%U^GvH~svU*T*Z{{%3v9|7U&A|7U&A zo34+`sxM8~skB^ufpwhi%{9yHm2JD&ONV#LET6r!!@G1>d(+}Qx|zLc`7ibt);jpK zsdun)+yv?!tbB9Kd*5N@=&ZgEH0|#;mbW~_UfH&dy=WfC-||%+53IbCxe_M`unkt8 zn5#U8l^5og{y)3H%DW=Ri3DuxYA?$7Ft>c2Ijnr3x$-gQu<`@VtvrX7AKYXfRzB2R z<@2!ek>;A8?3Hb!>_z*6HG@v+vQ7KdV0jC_>=azqPksUGvPYR)c@8T-7W0qtdcn$1 zFjsjFE1zlBah__{Wns;nZEoe4g_Y07{QLIGHdy)j<|@x&-gFPe4TVa>c^)^&%KFEzLD%f4-{^#3mm z*37%+D$il%ADVUDKQ`-Y64uP;W_?Y<%D*=2vfr9@Sy(eansr%N`5$H-GtSdki370> z*36pbD$il%&CR+EVdX8&y6&*@P0jfKm9fFf@%)SWw+vRkl^M@Bhz(ZW#$59&^U$oz z!kXFMtbYe#I5VCCnV zt2~F5&o$Tl&fDQKvn~s3<|?!9E5gdJ#rz}uo(U_TXRh)bR(`Wt`?}Sve>-5!EHGF3 zza6mhyUn`nz2?f6JZ4xk51Okyhm}8S)@2_z>%JDOnWxQF8*@!q`LkwS_C<5cH+X$v z&Aeu=#5XG2VC8R`t2~F5FEi`=2CV#Jv+h5`%0D+(t;_Xc<=>iX{=@uxvn~s3=4Z3+ zd&A0q$Gm@zVC5C7*}go7m9Js0!8c3WaDG+Y{;+16n|1rc%3EUIZ(CUTrkM8}R=ySH z{c8YLUX6LrVdd?c%)`oSn#{w>cQ&_tlb=Uec`vh$6IPD%ZME{_gq8QhynnsH%KKy9 zb67dfyQurOu=2s?s^+|HVdX>3E&gOa%3S%$3Tx&tT-I|~`FPAX<20PFVRq=9)EloH*}u%YXCh3f9bEv+hsA%7>bDe-c(c(yZ$>#$5RouNSNtJjZsG z=dkjLnD^@iD{sWS=dki4&AMK&@)OK8IN7dkGcn`0KdhOv%{tE6=1Sa=w++_J`Q|Fm zVdWQN-j4@Xj^{Sfal*>4GV3^D<@3!oYw|d6#>_I_{;+25GV3_+HCKMaKZ$wIVdc-5b)2yBSIjkjqRdw@^A3*_*38>x9p}5|%5Qm`ux36qS9uOA z{}l6nJh1XFG4DC7{9Ch*6ITAaxuzL!&p$BpE{_w|%$gSIIGdX*zvFSjnpxjmY|%DbC&oUrmf=9=a_&VHDA-(J}UYi575j&rcN@&_I#teHd2Ri4Aj zhhyH42Ub1`^Pa=X4>RjHVdahHnss=bQ_OnY0M^V==2n~X*kI+ynsxjqm@DxEx^1v# zW}2%!hn1g>c|T5A`PrEF99BNttmB83&o$Thznhntb^Neqt~TrVVdd9j-hZx#mEVkc z&tc`aW8UxY!OHK#yyvj;2Qly01y=s3S=SL({-n9(2lmP~So!nj4t{@fP5W4|EIm=A?J&|~3_^pWt6^hq!l zwrv(%qA!Ib`c62e?}HN>KmP_Py$H_em*AZK1TN^W;9B|zxHJ75yc4~e-QNpv5qFZw#TH+>V_hh6~prEy<9=tut(-kZjK?_eMLZFpb$eYijU89ab)X8+y=_$1r5 zKD-}|`?SISbR~QMy$yUI9m0d?8h9`r!3WU=d@#KWdEZAQx*i@$PlxO1Mery(uF4B!395XZ`|w7>&EU!Qu2* zFiK$CpYS*u=cEb7(>RB5Fo8Z8o=A^{{TQx>k6?Ze+(0jCG85Q0!C(^eUT`Bl3Z6{Q zgni8i;VH~<9@=0k{a%xq9`;-~I?e$wN^Bd>+Zs%xC&5S2IG<{8H2pAq4E-YP`&|Z4 zXZ|(pw?ljTHz7Edc^BB{aX!!BIOd1IK0gkg!F)P=Jbe~?0(~ibB7GB#Z#=d=0G~`h z2hXJ6g8jOD0iVMBKk%vadiMN7!D;lC@ac31_zb!Wd?wu&K8rpCKARo~pF>ZF@r}^7 zv*5qeI2Then_de0ZSpC6F7sbuzfGFkzqi48%<*q>Fo(u@Cxi3p&hQ2FUhswVVE7{X zF!*BnDA;e4)8R{)UkuNs=fU{qZQH%D-zLw%moZ-oUrv7tUqSy0Ur9G#$9xrC3IBuM z9`@U0ID9p8oc~a_$tmzP%<&vxx=pTwuVuavzK(thzMftJ-#~u^&!c~WZ=`Xq!C*eU z8SJ-7JNPE%Ieas{JA4a$0PMHPX!us)-|SLikSlDcEn5KjFKW zZ@iw_zfRh~3z;Xdf1UJ%?`Dp3-Uav2c&_l^Ub+#!k3I>$pFR(MfW8`jkX``$ZSpw$ z5c5~yhw1m>N9gZizfIP#$MSn%67!$of6~qD zcVb$nEBrF^{oq&Vx+XJ|;eRnd8Ge4cj4FQZ(%>?)$Go3@H+F(@KSnj z_zn7C_)WSVev6(0zfI#DPQkzFS@1IYQurNu9{eu75Ppw-9DbjE3I2e78~%{S^G^pK z(Lci<(|@zaq=QfBmhh+a*6?R^4g5J>3x7fPg1@8(z+chl!(Y?4z~9h!!r#*O!Qau3 zz~9q27g6v7{T%!w{WAO${W|Gk1idSkdX zjo;4%ZD^b~E@(^RJVOC~;IOR*Zb!#(d%6$29o-+^o*o46K;!&D0e)Dq4d)IDI?y-= zRM3&01@A~-2X~^MfJ^jJ7(eLP_9-0GzrqRK+;H(d&1r5fpB+vB;12;gnQB_ z!MoAt!M^^pa4+WXz`N7mzeKb6X z#yK0FR-6D9`YFX@^S7>zQ|l@e4`Y`on%5Plpd@emOjr zUILG!KZo&4OWWGm<7dGHx)z>D9|0dh&xC#b^Wg^O&%=}G_uxkQJ9sj^dMh&?RIqI$ zcq-i*K9a_B&TIW1@HFNF;G^gfu-})M1Ru@(Mi>uN*!D0yoqiEMmR<%QN8|a}gBf(i zmgeK>7Vru5Ht>mbC-@|~D||A&5A3(ePuzN}o5pjA2j|cs?DvIYcoy@n@ZV{ir&;%l2E((NkAcsn@!Y(@dGtx} z9C|i@S}8R_%XT{{5ahoeu6#} zev&>6eu|y~KTV$iFQVtb&(K%Fi|L!;XX$(4=jf;4=jqSj7w8}17wOfi&A!h1@Jq}q z;eXO0{4yQEuh6@||DyMTU#0hlm(auE*XZ%^>-16ZQhFx*20a^olfDdoi=GF+P2UCo zn|>5tMn4a~LobEjr9Xt@qD|%*YsWRH}qrhxAd#?c3iv);xYcf9#UW56mu>bpV0sJ@S*TQSkcfxDYkHdJd+_slte>`NZ z(7ZPDD!4hl1MJ7S6TA-d-tfBgL9idg;qZFQkB0GJylrQ|8_<`)zTX?+7R>L1H>4NC z{@Bav?aVEiZw_xnw}i(`5cF7=Pqq+qdu*^lI(R zzGi0_zd*2UZ@7vc(q!fW7=ILF+kALS`u-*}-@{umUwb?A*7O#z?`u04zo4+K7T%WL z6ZYGA5M0f?9&SxfgZ;L}d8L9j%%6nY(yzk4uMc7T0>ri-VPAjE?al3&ZwmXGA>5vM z25(3Ag8lQgKfFEjQSc7*6d1o?v27;okApo3cVPZ9+>w3{_T$7k(}NwEufBuXk8>l~ zkF7V{i8DiCzwAV~#C!&fU+ma63-)!cfMe#j!U_E_?APl>IAy*J_Wf>NW6qd&fOEPF zj9(nt))%g&4}m+=>G00?f~yjcY*hy`@(zDhrsw{mu)y#SJ0cD4)>wYg8lY?0`ALvDcq0# z6yBTu6~-^kY-`@pyf0k|_ougq2hg42f%IPRe)M1%zi_kdF!%uaDEL77ba)VbF+7-_ z2OmV=3*(n{wmkzMLNA36r9Xv-(7(b%>E=6{htZYraC&=q1l<|-+ou5@$@~5#UE9xtba(h{dT;m~ z`e1k#T@U}Ao&wLNPlV51K)fB6?f+V!9oC z3EcsnOWRX7*w1~m{jd7=b057cd^x=vde~#hKILh4d`=Zu)%q9(pc(FMSn!AALQ1 zKYcU&0KEWykiHjwh<*fqn0^s{g#HSClwKnD(w6H0QUWU5Bv39y)gTJTf)BIZDHT9J?X^q{q73; zekZ{%aKAHQ-|rmQ_j@($`@IA9{XPo&eqVxpzsq3X?^m#2-#=jAuRWKG{oKv{?gsmQ z2g1JJ5wP#K0rveK5Bq*+!M@+iVc+k~u^ zEA0E-8}|Jk3j2P?!M@*PVBhbp@ISfV$6(*@KVjeRJFxHf8`$?7>}2-+ZV2o13;TXc zu2K#<5f_=X?z`oymVBhZ|*!TN7?EBrYi}_#NZ#(!^I)Rta-Qm~h zec;#WL*b?LSojV4DELkKRQN6WeE4m89{g|mes~%EH0=M@yaK<&d>QQDpFfBF`|~gG zyPVl@7xR1cX7Ky;R`3UO27gHJ41Yv-hd-wGfIp%4hCii;!=KUP;m_%#;VCJUClqzUErVSec+$zAx&n^g@0jwE&MBe zXOo#v;NO`44*yQC)79+z+7U3M!XHs|#=DWfEv*&d9Z_H=IYtmQ2e%agMwU|E&`(=NHn=#*@yLoMTYuGQl zBix+%uCQNrZ+IQ%Lty`Tb^^RE^W$Lu`FA0_9`k46_31ZZ-`D5x2F!nleP2lra|`Bs z!W+_q;Ffef?CVT}H)4JoyfJ+d>}%ctZ^HZ@cvE^2?AImeY2J+arts!;2>ZS=cnjv^ z;Y#{MxQad(_W8wdE9T4KE$OdepQ+f*ycP2T-kRXC+>ZGexIH}?-i|&2-kv@O-hrMA*U&e>9q7B@ zj`U;jj`WLgC;Bb8M1KZH^e=EsueG~5p*Mk3x;329B{-*dg$uebTuUDWcc$y%o#?6X z&h*J}7y4Xy7y3$gSGw&U=B{)t?BCCKgS#=`7w%3U0{5Wn;hywlcsKfZxEFmEygPjn zya#;^yeEAdychid{M>5z_EWJ4_J2FxgnM)5Gq?}^2i%u#zNfh#y&1eWy(7F2ox=Ol zJHhxvW81pJ1L(o4oqi^fU0G z^y}~t`eS$~{S!QlUUM(=aC#GX1l1?7JbD&9hrR?ppS~8p zfW8NQgnkl!lwJ&9NH2k#m1|w`CVUa|kKyLbzkn}h{tLV=^FQEAm^bfdUZ42}@Lc9q za0}+!z?U+wfm<>!!Iv@b0&mQ`JA66we(I%pZVnp&x^9rJurOZ(HGZp8pdww=-V`-$DNXFQ9*e@1*}U zx4vtI+j-u6pB3wD4*NRo;Dwy;0N+iQ%&qTP;dY+y+~l&o;d?o=FMJ=pA1-_U3b*t8 z;3k({)4p_q2RPFL_8EMM>$0#eyE$h37+PV*j}6wbZG#!VzHKn$w*#!(p*?2&wynX8 z-{!Dx^G=xY&z(K=xcqYp>vL)k)hz!yu^+FOf1SYkI_ZiT{~GIw8UNaY^|fbQe%;rA z{dU8*9$jC2TM7L7mTxP+j<|gSzmDbG$FCP|lfbXnHn3k8+zx?%eU@(r|9ZxC5B%%A zeBJ$+aeV_n=EUw!1v^?`+pgwn``v&XdcGTSdyF0%9QsUeKTl$V!>(nPpG%~=`wE9XgFhFmwx6}I!J*IKPrj=0g z?dKD0aOgAmQ?2TMF^5B+!Jk+Kb{_@XotUwId*smb`;goBR%~$SGx$@aYWseH4Gw(< ze{xj)DswpW8Qfh6_G6Ae)2TjSg+tHZMt&f3IP@9(8BO&d=5XjU__LVmCCuT_XYl7N z!BFP-vy$rJD;#+%F;m~I`LOzN)9Qw=_$VW4WL!a3i z`55MK=rgU6zs4L6eP#!9FoAi7nIl#>^n7RJ4b0)tXSySw#2gNNW)I|z%;C^y`XQgp z91eYEAo3~9;m~IWBcI9~4t?fOIUM@TCCFzoheMya7Wpa6;m~Jp zLVhZ9IP{r2ke|jJ4t?ex791p2Zvvedayne`gMdK7)rot7kKZL!ZIJk=5riheMzF4f%P@ z;m~J-H7uXQ91eYEE#&7jheMxP5BUYm;m~I`LVh80IP{sVkYB_c4t=IA@{5_nq0j7q z{1WDH=rbkcbD6`T&*aE2We$fv(*^lu%;C^ydLX}?IUM@Tp2)9Y4u?LoH}Wf)!=caY zhx{t$aOg7!A^!(+IP{rO$ggG&hdwhA`8CYp&}XJ1zm_>1`pk6X*D;4fpE(iv^~~YW zXHG+Y19Ld^nRAfOV-ANtGY9#N%;C^yEm4u?L2yCBs!GlxT;!Cjf^ zTbRS4&)}|Y^{vd|&}VQLs`@tOaOg7+A-|nD9Qw=?$nRhdhdzTJOR5(zheMxv3HhDO z;m~K6Ais+_9Qw>#$QLq)L!WsM`Q6On&}TkDeh+gv^qH@a-^&~hedY(`_c4b z{mkLeXM(?3{s410^qIAgKgb*oeP%u64>5;BpV^Td89YBg^|Q?3&}W7sU&-28{E$G-sY?qQoG-7FKu@!vtppV(K-jhdon-R z-n8C#h1+?4m__M6%;BUD-Dq#L&XMo{=EvBZ)(5R{JI_zIC>_ikPWGqIvo~7jLikYT zbL~xQ?9ev2o#!{2vwEZz6>!^OWmYV(H(KXzcpUTl?M>@xE8NcW#TI2aaNFRv6U(f4 z#olP0*I-;B+upR7*3Xq$c0122I!>B4u5s9Kd)wH+w_~Knx+5DaI*uIHIIN=Ma67>Q zUUh78W{9TmPngIL+sO+?_S7Y87$<+|UpJzzeo9@hvBO4lXw(opC-pdAaMX~}3UzW$ z88UwIxFKV4ZiMn)_E>WXtMl;3Z1Zi@2zqlQeX8(BBr&e||d`y5?9=R*0T zI5!3Mzz>z*TRzSl*ScfVvs{!f=cl?@VLNXIZxlQCMJ)T7FZ?681v=?N<#S*xzX(o* z(d3;bi{X?QO+I2L^w4hVC)kNV8tTT{(b=b`<9^-x5A3w+^JFxc`hT4=qsa(Ql(Ev; zGydn}$$y_+qshn12Qp;O@r`v24U;D}4&>Q1nhe;vGx|*)*Q;T|xB-m~b`>V@3v0zy zDW8>t7g%vB68rkA8$NmTkYU4zH`Gn>Ywl6Qu<@ho>#b_8_bTQ##sa?CKiTDNkiGsZ z>*3qdUzwZ!7w1m-i*xvKVdeem*zH3VGVa#?l{wtaT6u0&w;%2ftURaBy?v-cet8vh zt6J~DRO_lm5lIZhvvE z?<(fn+rG7FzXz>iZia^Jt>(t8Vs6YT<{DQqx5p~xj{l2uXaB{yOa9^G5s6eo!&gX0cvtd(nEWS6Z*e zF1M=nwz9dV>oqo6uWgg{daShGU|VmveO#M;xV-JM(t5AhdiZ?c`0zbm$2W4N_3%_V zez&!}j@BEp(t52n2r4%B^|ouW-jTkZF1Ic&XKQN1ezBeGbNY9yg%$oqeb7Fx%g?~& z?ftIyf-SNAp0o+C2mTGx^_b)9m51!rvbF60`)_hZbO^InTJP>QLB;1e*Td&U>s`6h zdc6n&JmuEOraH`#6ZYYCURWu^UIeQ;3G%of4tqhv4I@6#)-w~wvY)jqCG z`+aPs_2wTER9tUESTD90t@p-C>&>$D>g?w%ZCVfiYbq|&)ju%s(4gX&b+{gWtkQb; z-#c-cPCoa;(29yH{pT@6_!wUBzhE|Ce0Yr8{+o!)V4H8>3?j1pTKmFVTXOlf%;tvntElK=$s@KH)@xxe lYuk&hw|wjRk$t|}EPr?Tv2SQm)45v@4=V6Dxi;UA)2w@ZukO&AUgbd6GLM9**NK67aUqf;;NG3A?TIUI8t2j^9 zI?rR(wobLysm?q(+N#x-I{)5l*ypT!q5bsRr~m!#^Ki3YXYaH2+Iy`%t#cBN zs;FA(`@ZKszW0R}lIKn8@x3%;&f)@7y}8~T&mWTU%!H@B!8dHa<;3F6S7v_s{oR`< z;`a&&~0UtN{k?-BL3(D@^ zeEO+d{;@UpxG9-~Pe0}Cj4fNYe*5y76Z5tXM!E0)lXB3yW?lWx(3*^xSAwr4o_F~Y z*M=!*!xXe(;smrM4?icTe?M^&{!PHYJp7xH{_Vu+>E9kVrTp8vts|e?JmryZU);Dg zYs%y=zeoD}DHFbAeK%j5>1BdBFE70I;?}Kvy$<(~zElonyeTuj{FXQqym?Cb_sAd2 z`PUGqfB)jve+~@}*YVP>Nz|_6Q`&X>zi8L-r1$@%U8M7r|GF*ESKCGX(75a~ZfkUzYkeB7 zZpr+tsPR?ljbTW;y#MZwJvLKs(!CFyu;2tYwnJ|_;E)p^{plk|XHA@O)z=fJ-}Uuz z=Z2u)qJWKBD~89{zvR`hQnL*b~V; z|G%jr)ei@c9Tt6iw6oa>6}tqMHueeZ=REu0OL5X}*gSD0R{yo{eZM91?HP?()sPVjXB=F7KlYyL0`HB!nvI_B?mL6^E?DOPGtQ1$${Vd9k zQrcclhd1EzKKRPWOs5}dooC^jFUz;j=?H(P@prn%!qWN@=C(ucPPq+rX5f++OHY@Z zwSx2oAG?zN04nfdS~mSyQkn}r)481k)3@SEP6VwTbU$V4z0vX+xb&YW7u}O?&drKe z?~9*GhP(l5_{92THn& z(t{;^2&IQhx|h5zvfVdNlWvC!OU*gwzJn<32I> zoV3*4vmMiEC8y`1jH~2=BmT_|*4EL>_A<9!^V5{uRQB~JnL@X`m{N%4sUPVLciwDn zxc8qaH)x?>zGVtMRDccnf8+pwwvcBfMcA;G7YqmGxe9kbf`K@S>!{4oG;> zTrLU4cJQyoMOI{_${sI@j8fc56dA2JP88WuajYsbMtH0!GTeV6P-Fz>h$3VCy>Q)& zQk|m6I4%iACizWKDAL&1>qU1_;p0{KWZ}p-HC|{%O%&?bmWVAP|m+r6C zeAn%D!rJYX{&#`$dvcC+d%eFGu6t3^Q_0~!0REOY*cn5uSqyERO?S@{t)G6W#S=N88) zJ0Ct?*^SN>@0V>va{S7%DH;~ znaYEdf2^FNe3tS+<+GKumA5DlP(DYP7Ib*V;eI+&Vw@v5M~ri>zlpXdQL=*==R7V6 z<6P<=g{_kq<1!WQjPny^XPnE01LItw`OY{$Rd&X?QrQ{jDrIM!tCgK`u2FWzxmMX3 z=Q?F)oa>dHac)p{#<@}18RsTtXPldropEkacE-6?*%{|HWoMk*m7Q_!Pu&ao+TQ zKFAs8_bS{O=PhMtoIeN$#(7)wopIh#cE)*E*%{}L%Fa0NDLdo*N!c0aePw5y50ss8 zK2&zb`AFFr=VN7OoIfi&<9wp*jPn;|XPmz(JL7z+?2Pl7vNO)-%FZ}{6ISEA?!SSa z7UR6ZIbxhI{A!rRi;^A0IA3x}80Q;*DUO0Nt$nM)opHWXcEyB{?EIhf6~E@CcnPrKKZ8*r+V!9fWD_hw!112`DL=4>Q6?Mt;Y_Nsb5~ z#U&wpeB^*Yc%BFg_6<7=YqyMx92E%P$q1hinThLOl;nu;iChxGcZ+-+2%jdxf^L~E zoaSthula7k%usd%ra)NtvQr}ihq#vR$~n@Fg^?e#GE}c9Q^X~q%)H22+#=mLUxeY1 zCA>g*q_4cYFiy?Xt#cxW29?b)uNErs$5`mh?+i>u5fxRLf@R{WTwUH;GPL)7i z@Bb+G6emyzrfnak${7|=qdOysubNp?Hf(QE?1Z;V9peN z-Eo@s?cUs_dQ8tKpET_MI^xrA)k`|2%dtCS<@=EB1l3k=SCAH6Q-EAo^pY9aBD2)( zL{9j+M#?z-uR;Smaqf8j{y)M5TxKwT58>~j{5_1nhx7Lc{@#JVNAmY5{vOTWJM#A! z{vONU;HNf{69Ynu1v#{Z&u+E3rj$GtmBa4;j{Uz#FGOqdb%k4459vWu57z~?cO zk?miPi$k(9hWPIy!Typl)c>3c2@GRM_l6W^4EDbY$_(c;-01;aij7eBiE3RVSlW>E zj9vUQkq3*T&dECQ>q3z+MOhb$jH$}HP-N_?tdms6Zpu1IWlU4nNh)KyuuM`J6aCv! zGf&4ElQ@Sbsf>Jo1g?8g(o6ba2A71gv;Bp*BFbv0z|EK$8Y=Levh%cZr|f)Xr|be{ zr|j;^PT7URs_abvK-4VCn$SbWBL87lmh=*3_u!IHw!;4?PDX}ww!aMXIJ`Nq+^uy5@lC$NhrJ8KM%J^&#qD7PT94} zPT9ScowEBVJ7xD(cFM{bJ>7T8?l1YOY@L5^plm(oh_VOxJikXtFH!bDE(v85ei`B( zqHMEP=9FzwcFMLYJ7wFHow5fjJ7w1^J7wF2RoO;Aftsafn>a_5?eL#~npn(`E6R3q zNhsUze-+8e*-k~ z@ZiiTdnA{HvM2bL;uh)I6IHlVcC)fm_9SJe?8(Yb*;ACAvZpFLWls}UWsmb843s^d zb41zG{fW5lMM*E|*)zB#ls(tq6E};p=c#a~?D@)0*$b4NvKJ~lWiL{8%3iGOl)Xe) zmEGdEBPDJi5eQNCQvW$tmh=*3FXNI>_GA%jx=swZ(E-ndSzw}FR zi*)OKqL~W&x!)KF`-Rc$et!zBT2Z=Bggw9|A?!E)8G*1zlZ5@+zbz2MS zk|)K6N1j2BoINsjh>U^v$=M@gROF02oIRj4M30WNl6U$-V{xw-B{*yrRglQP-zCsoTXI2GM6Y7 zvCML%nJja;(rlJlr8Jji)+o(qne|EwSmr@W3t489(jF|cRcQ&!Y*#8}ncYg|EVECk zf@L19w2WmQuT;r0Pg26+5dC?Y(n^;3W2I`Ad5%&I%e-8vmStY0RL?T6Q(D6^Z&KQu zW!~m{(SO2Le8wX)@tN*1;aePMs|WAPemi7%Mm!ST+4<~2tbjUj1J|z(ypF3^2X5rr z)q$J1^1)v87pOu;M}kG>F3g^YA`pi8jEl=t*7t`rep44Y9p|m`y&n%(CWS-PjO6f_GF1sJqPL*`|K1ffObOogg zCB2l=vn0KY((}B5=>woI&G_CWe&(Ff6P)gIDXHyPJ|5|GT3Wr#N;(F$bYwDeQfGI|?e9`{++@)pQkDCtVld5NU=q;$EYS1iE2%Ozb!=_*OD zr1vOlBwbA}cGOF{rUB_q=s}7`3{0odcUWziggJaicPEs4hZlE@ZJz_V8_K4j?X|YG_W=ap#N^g0F zWDJbmxj2w<7oVuPU9q20T5KA-o6=c&-#tT7J~ut~_|5paGcvr`6I>s*A%agbV$2Kv zR&cE1(}H6ZpAp(cXIpU>)(uA=@oRBT9kEaK-) z(XCZ1O|~j%0Ph21>AIECePk@E`5NYrWeEE*EuW>VTcKD?IaBioDC<5lHc(mjk+DI_ zx{r+IDyQlFgOwx7LxnNAv9*eMekoeQTdSDQIlQ%s4fEHasa}-Y$%{v9IG04@$M~lQ zjUTJRbzd19CplBjH^zZSQM8E2(bHd~ku(GXtb z9~uZRHp1ul`M8ewH@-#qTrLUWd-!(+!WWA$_gEpeM3^?S5Wdj=T_Ajs5nke-!oo?8 z2ruQ55MJpI+0|*jXNqu*8>#SR{!Ek*7TE1Tv;^qBQ4#9a7%c zCycRfWj#g3dW0i-YKrx0zMh(5`qqiBr>2+-73rxdcBqu6=YMdMCjUFMOe~q;9O;b1 zd>_~G{tv#TGk(M+(HY13tM#X5gtsUXA7shp4%eq>-jS#0hsg*J$%Q` z)$(rAbfF2Q|2Rr8&j-mdJ% z*d5AljNPg1-1shKXZgF8oiXlFcEwrAC$*_t>v9@ zA60fM=;Oiz#8{X6=`)7mglUx$Udfq>?z!~cW74D4nlCm?_ z%gWAJzf*R`dPUh8>s4iEtk;yCv0hhp#?r78-e#3`=l7cLjOE^{aK_TNDtu=w_f~~7 zmV1lB8S9TK&l&4a%Fb9HC_7_)sO*gOk+L(^$I8xFpC~(Hxwjyku{83e#(LJj9X&52 z>p8wtjPCL?tgrlqMb20nCJI)cZ?$q~tnZYau~Ob@h&R9d0 zow0^1J7ej)556i*O^t>2L0(fGqyvV~alNTksh_QB# zP)QhTYUJd=Sn?7=dLD{mftVb*F%UL|s}W(lMY?d^i_(1}Y#Nt@u;R%3fv}mP*+{o* zo+TU;;f0Z`Vy9`55k5O|9}6crB76>)gz!a?GTb6&+e3um_$0hoS%mK%Nd&?d8sSSK zqj4S2fAB5BOSmM2FOOV~i$js?#VSQuu-DsDShr(KBM+mb^zkwyd_`mfu6t3EBf_h= ztndkhlVjO`n_3poZhp7>|xa&1^F<|#gke^A_YJ7v!8oJ>0zkK^a4wM5b_J)K!63{we&)a5eKx4oP zN=k5JKo!MDBrq{xB?VL@xG`WAol_;)G@zQ&a9?}|)KFT2O#}9#v;><5)KXf4O#|w~ zVAFur2jRK|n+B|*v;><5>`mn**fd}tN*9X!eJL%$rUCm=T7pdj_NTN2n+6;}fhP$z z4Tw`GNw8_aL1&?i1e*plP#i{rO#{|ZTxV|tlBmP8P{te3crB9J(b?tEIos)C>0J38 z6L}>hk2`${e;>`?KZv;ORlh=yPV%z*SbBE~i`zT7HJICWk0{_@iGFAT3Bq%pM`z&v+1~#(KrVdHRTE)SM>@9*C zG|E0lP=iL<=L%}5CHp)<4H{*iFQ`GI>M=4&!NC(vk>DgzFhdvzG$o?^1 z=fFnx#og4DDCsKwamg$sqm%G8if$;!KW^R+)TS$60!kyUlB!&rt`>A{x<=5o=~_Y8 zrt1V(RES( z!8Ba;qNJ;+{}2^}`j6Glcj`YbQl0t|hQ!M+Vw>bJWOi~GGW#jH*Qu{jNvFO>C7t>b zl?;0SIlgxk^n*wJ<`C#3>OV@?Mg8X=X7x!|QU3)h2K8SXvcRb?QORIHyg_%T2kO5m z=z9P6g0A=95_IbSLC~rHwxCo09YNRo?=q_TuM|QbQU6uCF6#gBnE6OYNmo(-Jt_wE z|NLB_{wE^U_5NQ3UGH<)kQN#-#;20&)R!Qq@6?wdCti+`!he&(PJIb-2E8vqPF4S- zPXqNorn^M_zc0a6FG{+K`v0I}Q2)F0c6Yu1y;S1V|3Of9&e>k_&N*9Rf$6>;bFw3v zuRG`LG-cg6XKU0G<98@D@v@_uuRG`L3}J1>H+MrVF~YZ`2X6(lGyNa98KmmeX}n6hiiaAnt&5z4M9J1D!Rj8t|_86`|j z8J?b<;~xjjcmtO$p;&3mX#X*&j$e~Pt~6#xE{VqM?9W)_8Z$wKyT(jZc8!^&>>9I+ zvTMv_W!IP~%C0d}m0e>rW(wyLJ88^R8#CUofo9T}Jib#JGtEB-&G4e6w=`xtmmHgy zo?YaBgsUUjUd4U^O~T_CX8QjmNEe#r-!l)OG~3@WAHJ$I$Da+u4^*1#e+e3_G|&Gf z`f<3@eE%dUGD>NIzZzAKO-C=|rzo~Nt1~eDueg#&dMqC}chMfYh7X+gH7?6~K5#yd z0AAY%E}#WnHdX_7ACB~L8At;cdbn4&AvuSw1Ms#&zI`c_bHs8}X!DkoLVQEg^Q@fH zI#4DzE9a~S@sl;k;oX9!w~z?^P34?(E(1iVVD8|Y3qK2PxQH(44Hr{dA6VsF@+_6j z%DHLmVwZn2?Ps*?EwZ=ac_Qc5Z>Ve}=dR^J*`LuvMlE|crClrUnSwI8={b*|jGsJl z<;V);9uVco3WQ}^a%BaQA)oW;b-0U%d`|dmE9a>?T*cuJ-=fgdR1B58^auPDF)y>7 z@LrA}Kf^-IpBAH>7rsX^k@_MP+8d;99bjC z6p;E>J&K7`UT8$>9|z&87bOuQ^*t&Esee8dKSeoNBiwVi99bh&>PI)Am`Dw$?wr3i z;i?xU5hC?dDh8?lcn3d4syxUFr2aE-Tep0kNP3R% z?}-GDef*gK*9XEnrw`O8NjW;F%OkR!AJ*eWo*HswvEZp8C+ZKzbuUU{cR<3+$?&Np z>dNsSMM7ljQ!4lBR*p{M?w5mdbP|u~yp^Mq_KpxZJUu7d{}7U-a(VtGl@Iq1$8|4C z^+@F-xFjkc>z9?f%E##>sFQ4tK9zED|D5rfuajtwOnvENr1Bm81SCo2W4NSLzO(-o zS5EavZlPAL%TLZC&38Sw zhp_hCJpU&_eVdTzN2ca>Kv>)M#Jr*Pmy`k)KD zEb+N2E$@74rIy#VFK3nJYcwyXT3MrcIW@whA$+jHZ--{mlS?^A8nc&w8#jjZmd4a_ zNi=33|DK>R`k>1_;mFxfgpcr5+5NS0scfzPT2R^Erm_S4BXHe|l3c0mKrV^O68`WC z*K^G(%=KKW@OTm4=+8k(X-Sh2j^CVS;Uq_dAIv2o{1E?`KzNS`3tG}E9JHiQ*q6$> z{40aXx=m&M{xV$mq9j);+rTAJ*%AI*L1jm(FxQf!gta9<^1Y?5C5Ic~NBeiNaFQd! zkKvLKev*GNZV?ALIYsy>%Fe+~Ro2Z{&S}C?=Rl`xzH^{6gx&MN9C>z>?!vt}KbCyF z1Vs*YqJMv&ygW=3hdRq2g6m$C^c3aK=8|KxqB-aLdCPUPm2-iAGgdX(dF5Q_?}7{o z{pDQbr!Bz}J`%ZJ&c*&d015ErT;ksfkN{uKrG69>m<0H8F7szYfCTt*e&Tl{N8Vk` zx!kWn&a81P?F#=d$kFgx&QJZ-RI3Eka<23bra1+FbpoH9tNbY#7wJk@`&WUol&r*xygJM635#+;k{>p;3~%(>Y=0VQ?Y zm~)FCaytGnxTZ3j&Qg&X0X3`jT$iZdpt+QmNZ+7& z2ce8a_Xf?UbRKUj2Q8o-oJ98q?M~@kxoaE(}Gv-#Tg~qvAxwV^JBXaA)t!8e$*=pvlZblj1N$2i+2f*&6Ws@wm zMG;e7`BQKCAC0KiJv=DYjZX1rbp)7 z3wXQa0v5R!GGg_S!V-3KNBrE2rLZ3Hb1xCpBYy6sg1S@Ay^K+I%DLyf00nrTn0qc= z=N(<{Pl|EXi;{BE_m@*K=zI036;5A`zd3z1{-zO%T#3K!L{i=jq+CyTL&_}&22ySn z-JF!$1f7)I8Cl9y+#Nt(QuiQqTw=)mgGvfj7H~#^xS)1fDmc_ zy6peQcG-eVOk+1Nu?sgT$swWJVxL2 z@h`c3mFMls$tNDfkH}e_yAe&}OHY%e>G+q=NCo)gUm_RoO1*G>>V?ZvFKkJ@a8h_d zl$Ny7pE0Da#p)g z6GbZ`XYHRvRVtmE#v(77U*n|bQ?EzPsuJN!%Y|l8&5^UplW2*^E|mMU-Xft^$(t$E zBs5FtAfeeps^J`=y;Vb+kNM+YvN_O@w+n%WO3Ovsj?!M0tyF_06d$~#svrN784W<~ z>ly2Ubmxr5Al-pGhWNV-8kU_lXw0D1BZv63or}!!(grQa-aWf=*y7O(N5c?!q?Nr# zHh$^IOV{KeIOS}w5}VA7bbpWRY?P%tunF}tr{eap*_bSL2;|_AX)a{oi5q7|5xeC? z2Bs0pAVE1J{3)YJz@R7#&K>4wXFH*Ta{^iOAZCc>MXCHy&5KqJ%g)Zp9+*ufhT&os z?oPTme58ov+eU;Xumx6KQ5>7yP#}pK<@=SxsG`w3L$Lx}+0nF_WsMmI^;lapZ7h_F zQq^?NI3o*rI}P(ukaD@N#%nG*U>LC0F@&zMor-<#+u=s2{op{Jm?r_oEk($>jWntIwcBzk%a);07d3R151H}v$S zUTf-T*xseau8xkb&eR+hu>GvI;>Og{bZPsATe{o2QcLr-e^q=NwOhLT{)Ozmwhr`C zO3US9vUKjvmPBWwr=c&=*wvKqJnq|gV^?QiPggt5mZ_Io$t(K~?M^f$ntNxo!d6~m zdspLnNmBR3+qwbpT6C+pT9L-ZnCDR+$khP?xQs!J#>&-! zoW{i*XhH3i%b1dxkdX_G8`?UN8cgFR%7bWhnh)WAT7r2LETQzfCmwCNS4dsdUhC}Ny7kE8g@$R0cIR3(Pyt%!h#Vc!V=uoJ-Xm2lVXk71A7MI2A>PzY?;`Nm)E2>x5dp!v(D;p9`UT?>`ctd-F<}mz~ z>fXloczf5zIL$14*P4pjy2|QR@!E=IqQ>la6;57pQfYZZXH$E^TU}CHAFrl@B`a&H zDpxIw7tP$83)fWCR@N+!*H_0iRk}~SuC~luR#P9ZTvZ=mT2->lBaLd~E33;Z;?CZys2$Nyt$## z!_6J0D@#|`p*dA0YtXCG-r9=2R+DbjBgOIBy|>pjv-IlH%B5&>P5ttCUFE(Ng;F&6 zV$t?47H{w3%`6K`&7?us|}x3|afM`+h2&{HjO zTG?iM)Pw7K;@ulN3Mr56y@{N;zP7rmR0J+x3umZaTUK8iFR!dCDXpsDj$T?>RbNpH zaXoFlfy)*KsiGiN9HeFjsaal6Z(qDmRP(wz6TPineNtVrx6T&pmCbY`EMD5x)$TR6 z&g5~`*BEbX?~%n8Vm9Bn_bQ-|P z{t74F&QPASw^vU$cC_`CcQjP=^mNH!qiH2oMj`n;E>^Fh24KvIK+%+k3-XhDW?doA z1|?=`!=Bq%UZqO?zZ&_jF|R5Z02~X?QL(^kf`3+ zS<=*mnYq_%B6Ygq6Wy&I>r(4x+im;Y*{uu%rJ=tGvlY$cY)aGfC`GecU3FP`E#@|O zcOmy7_n-DH=4P2!`!@A8Vxr_99bO0PlGK~%sot(ed~=ar>dE#*d?WVMJsk}_>!~NH zw%P>wTXTzOg9)3pDzD>ihC{@c)>c$_T{66N4(aTIAv(JI4h_t~3m3T$+qJQyDW1UJ ziYBY*3e>l0U4L^kEsXKjuJ$JBQXTjzi@F3uwh>OUp`o2`hIe6vV6f5JRz@58jcvV& zm0f*ZJ*>R?u+p?2L(%i z-zJyzc?D_(zA=*w@?9 z0bz_PQ*F@LS`>^)nl4pi9VH&-twXl0imal(=L(i|_O| z>--Ek!MwwRk_FFl3k`fnhS=U6>)a@#610zquU=I`3r$72)G<4_X>CtiU!t-vWjn=v z$+m|NVVYiDQ_n}cro@J}#zedg4vO&+Y^>M;dNxtVxv66{X13KeQd=SIiDcYiZp5(S z9UUZa13JT8wpSdBMd-f4>K}1u)6cbdMErMIzBH?o(BUNefn*6^BQ$Z}ia~ zs=1lm5k{kZD+X&X{;oT%3A&i_Y(o~u#NFT7(a_h}O1+8fRs9{@GPi2g)l~9=g9VOO zPt24$<*aFF?@yF8_O*4%d|tnId@c6AwY=A}lOT^qOn}(@HYH>O%yT_YIJFfe_!A;B zVKoF>@r~_J#w|BkeR#QP?4TxDgLft3&>2&CBkiqOG1#q;mJl{x#U|_{n%wlI3v*rD zVY;@{J}_S2iu-9k^P2lRxi#G7wCG{n#5;P|d%b<##T;J1x>CETthLkYAUk5rcP89M z*KDmSR`JfNu>)<8G96eldJ}Fu^ld`SBEhpP4Y;`UJ`GYS-Rq%}Znplq!T+}?#fNsn|UjS%Otkl{QQZEn;Vt(8w~@E>eiQXHSA zV%K?eSPB;&n7J;|j?Sn@Tq@XNV?@EUUC^$sp`*J!u@WP^4L{LwaP!VaSvB3l%hKFl z%ItEx`mv+x>|<|}b*oesE=>Epmh^23RurBE(MDDivp{Xd(vm_9dRYvD&4ufMlJc@b z?s;ssgISL|uCBhihD?VYvD^D&4AA`MHFm(4yD^%o63uDO)Yv z)8Ww~NB59~Ue>Uxx}+RJr3{?CYeO(AZ;IEF?YMzFP1n>`)RmP~VUu27xh7sbdyZ*i zX(6qF*pMGeVZN>nM}W><;=2EIw2SJoLUWn6c8#nMU~7|JWEN^thA#8JMk zqD=O!rK@XkbgimbwG3y{qB%UA=E`Uy-?v*GI&^s54Oklw4bDL{;yD6A{+cv$FqMeW zXx9)p4quA1_o4@Tu{}VyZD*%RLm)Zkjrm^U;U;EFZPnS-F0tj9O=MhBZ?V7AEbVq? z(An#yN!Jci>f9na(YLqJ>L_P2^rLfEmcnPLIN$5ezTv)=R3?c@y+9Xe4rGs}fh4;s zIw&)RdjmNa^A-j^&x^kFA0Hc*@~MHhhfbthomn%wm}JVCSRq`5#2wnUyZglEz)f;R zEQ-fI28Fa(w~4{l+)my!0nyeP{)s_?VVKl(@(4@~7)4%lR}VHwh%$Li8~IR56KH8a z4(f1aIc_K1p^jRjb1P3p=;#)E#$fApH#8;+aiGGFBKc7)KW560S@L7H{BVH|EK%Gj zYA<#NwA^BelUg(|7S~8g4ZC?foD4C;xEYKhVYI&?-{+~02WHvw5^Oc<%a%*APP1!w zQMY&)xriflp}QXv)7E)#5WtAf@@f+eP1|fg11Z`ZTH*DaKpS*87XOglQj#ysnI%~= z8In6zuG*7(qIJRkEp2`Kcj3fB%}KP=+Oj`AAi*`h66Wns3j{Y+W`7OXU|f>9_!!od zK!8%tVKAE>vKyNCOhuAF7jz@TM@c3lwVPQTbdwbN!}DfU2KHwN!vh~(hJ z-oQ&8-^nv+ycD;t5VbV6S65R~R)IZ|+uvb=;qp)bCmR|DQl*_&OVo>*Y z_fVLHNK`1;bd=2sCT%r* z*!#1o_w8EH8RtDaZ5Q~6g{Yk#A=o2umT`yvItc|~gV)}G!wXg}+H{eY;k2r!FO7E_ zFI`$&vJ!zO@;wCF8=9z>b?OgdqAbhpn953OR%&#(ns%MZ`#P%CmMr%0923!R9D#zp zX*jDVh4(Rt$!{t6Sl!=O(@%$7k6aZ7l^>Ozu$TlpX;Mt!aX}oxS6v8_V+AFpcg27U*z=#!A%c7 zg;-?j5X4nFc!gWV#@5+M@byGjU?EJ~q0Gb2%xWN9;z9$CgoLU?RN z4Ya7kz?g4?!#9=L))3eq(Z!_IrKot`HYKr>KmeH^@g(gDc=jcS=9SAmr=nmL48cD- zQ9b$ib^^UGsam?W8b?$Y zO_x>53{hDFg4W7`X={h9@%;i7<0rUr&D{4A$4xUD}4I3FRfchMskpNyu&x2X{z{!?HV2XtTU+ zgFLiLvI3$p)ZgT^yp+>WDC?rfij+Zan7rje-*Qeb-%@MhD%@6_WY))dQ6!1T=8ctD zU*zKfABTK3pC96J7r18(ZlhI?bBhMa=+Q?};X3TbIfO@(t=oGx@m_%1jrS_h$rKY= z*HT6Es_sbT;R_p3AFJ4>P8ady&K3eChjA~2_DpLB|I4^rsfB=1~Rjs5-V znwn}vWXWc-fbdK}8@X-Q^z9t^c}U_ZY%8Wman0WDMnuqi*YRnCR}N0WKV{<_wiFLj ztgAwWZ7vk0mMBiWfCp$Y3DB%e+eP#@xg3Yc$e;Mx1cxtV8H2`j^zD)TGj>}oh^4tF zG1Lt@(c(}{;}I5V!gDwr`r^HZb~fVaYA>%b^0=@_9~&0y&zbsjmUMK=`L(RJn$NHB z(=hsJpJCG?M?H!H9OT}B-4CAFc|8a+dri`%)MXMGE032gUsXq$h#l~p#jZilicK0l zHeojpmI58%a&F;~%5gGs8xmSJJ7xdjf)iNtXNiL(J@&%e%{9D>K`*mAQ@m6kGxqd% z(p(_MN_jwt)&(0(*$dP2O?sZX%`in#cp)A^!D;9PBO1`y=*Sk3+sNlr$4PU4E4cWb@8!<%MrbxW9 z$t!EqD@~g6P}J8oT+9q2XC@Wmjw=shm>2?KgooO1 z1-e}wqTIZO(){G|abp)f+J1|=DmL>YiU3`?P zR{!pm)0;gc&~VX5G&(fwUW@jB%T}$n>%CXjKaM9j)rw@i`v?|XBIaT^fb0E z>e(=}xUHkP5!~68-`jz`Pd+s(zr795*cau|U48wXiA6NaBi-HK+nV3q)lK&|9o*mB zmyf^Y+|`3fYyOAR9>L%>n*oMer{=xkn-T8eq)8bltds}{DQ#bab zfbNDqoXr6TUMUU?osLfli5d~*%OTRQVyPVb^(6^0iBn)=%l`8a$zCDB_jz+nlh z91nSZUHGLJh8QZ5}y9);naY~0><`yy|oMDAs_v`9tC?Fno)rI zo!W-y30*YxkQ=CeVb8J0Hfs-rH3tRAw($2ZIDd0*Hv+68kyXlXKtH#1;@MOmHNkc_ zx7n%L^(UAP@*$VTLLb;@9B!0JMiXVONHr$ZMY)pswNF@(H0 zF9ABiVUgjTq|QM6gd~`4lcsqbs&w0dSHj{mi(Q1s6)H*H(BVSzh7K2!H*~l#(@l6B zqM-?oCM~y?&_d?+8#ICSV4U@Oc#R7WzB|l&1r`cv~n_V};j=ZEI@=?aok|JI%_`N7TD7#l8+-{MLvWcE8*#kK>)14Yn1-~RFJtEr% zt}^-1ks5JA9F?CT;VDpOO9H!&lI}ikJLXe7lwNlzwo+&e@3U#|>|WY&2Sfay=x(_z z;-yyHCp;_mZCXq3=9SxQ$iaV?b&MdMkV- z1sy73jHHcHkvzR~8}_8US=?bsm*&y=n$HmuK5_e4>``4P+ihcA$6@uQckeoIq@p3= zCUHJQQScdWEnr8%FF#;bWgntO;pheSZEVRbgbQhNA~ z@*N!N!?c&6_b1#Di+4}kIdk%OiMKYi>$ueTIX~vZl-$*Ww<*>yrPqsTlB=btLm$7+ zf~hTh(IE5(nke9t`unHJd3lDdV)fC*l?*G#SXDNc$f zK<52r>|edEjh)FMJ=!|sVBh1(%QSex8^@*;`&sOvI@nn`9rwh{B6U z_HiH&F*?Gzhb;P}qRvH`j7Re^U%hobz2`%Q*5_w3o48mMdsGA7AK?o5)fXHrxeOW2 z#N$f$sjmq3_iR{A;RZ_Wl-<}H^VH5F`EgUwIfyLc!6Ku5A&XlA>)O~X8MhrzEF_H1bGZzmrRH%(@cN{C z=U86SH4#PbF|JiQo?e7t#pIbB2VG@FqSvITQcQ0gS#vLNaWp|w+5YcOMYys9RoLFGkSk?mS2E?+D-QPnfnyK!WEO*v+ug=!y z>o%EvVwPF);H$mS1tI3c?~kU_wO(&)b{jvoHW?x@&e6oq zHJBT)-^F7Q9K<0G`{icdFIyF88aB7{#6VLNN5iQRl*vwux0}_OD%K>gE;2#W0HlW; zYKd?MOj{>7E=M70wUiwwJ!|W84{deQ(D)p;6%#RDF6QT&ylut72jvkYCxzStW{;*# zu0DK;pIX!%tg94(!kZ7+ykPxEH3*LZzQ~Upxn9f+>*NKZo<53|yCsY4MWXo^a@_kt zb%{RNXqR+0)$z>iUgqo5hi=p|vqJIHB7RQ7&qR_Qzrpi*HgfaqOQvdgd59A@4Vz3~ za;U4QcY~igmD>}%H^R5O9U~0Ov2xVZ?w&OxC``YTgg0(z6U9$!nuFc0+j&we5MHET zY^XvM!M#0;HxPAY3|^+#NG~~)!Q!N%juicMlCExk^Ul15#JcJZv0@EkitvcWzz5-e z>^VFT+`3Oi@bb7G5uJiIutt+)*gv%3=xq;aB97+n zBq+3PezLzwemK5`Lw^&Vks@zN3a?4w_7pxmg-=W2;O}K=d)`dRe>;WWHyk99Nb^Rd z^v8&l@waV$a(_sEIO>Im2bBm*O`)kWD1{=!k47* zRVjQ+3g3~!_Zkk8NTlJ9mnP3|BUAc!+x+DImHcph73RO1$`uJu3Mv(zmBRQdW%`l) zRSs3Zy;FGq6kcaINFtHujZSIb=#=(to1ff1$q(Bn9JWt5Y@cx0KH;!^!eRS_!}bY> z?Gp~$hd(D}K55>Vl=h8DY2UW_$?cQ;uzkW|`-H>&f$*F_2jL|tyk`oB?UnNNCO=3b zk%s@dAlV-35WU%hxQTI9AGS|8Y@cx0KH;!^!eRS_!}bY>?Gp~$CmgnKe9$&Zq~TAoCfjf4 zl=f|#pWHsl58Edkwof?pN8#c?3*m(+yd;H}8V-_3q<4f%FI zI|FR@uQV3yeswO`?oVlKbmE_UM$mst;oag8`z>lqX}}Y`6-b9xo#=&oA1XA}I|$!* zPoy+`3cNOaX9tZg@Or?V!zqtG1>TP&q2JTIQNmZ7vRs?%BR4)4~biYFhYU%Yw%0Kv9EypI!6Cr0)Gm;=kfE#35uxi zRV1$srtt#r58ye$fG+Sp0PhqG_yX@!@NT9*wu0A_QTbEgQ2=Dvj*5_h|KwBPEk^o!hp2xUnEuN-mtPIe z85Qzc@Pa`h$H6a84Y>vUBU4`&_z0ulM(_#rXS(=P;2i~y8h_Xf{%S;+e1U$ytAN*&Ne=GQ?!tnlk zz>70Neh~Z{bN^%DJMzN(XTh(V{(J>YHkA*?KN$awdB7haJ=*Z6NY60573ng=KOnug z;Y^I34#T9iW z8UKlchv1)lV1J~4XZ*7Z{Jt4K8^Is!8kRo_JlXi~X7FRP!u&JA(@g&P;D=5APrzgF zPd-==ke+AkeJgmDvG={;{fff!zXIPz!EF9u{s*ryf_+KD@b90TuyGV&?#hJsHv^9A|#`9|I(@Vlme^T8LH^G>_;fShKMMY%*>5}x-owoAuY%{B z`rZLon(`lm*P8zO0z54*tnXX!#b!Q>;?LD?H0#SC@CH-gNbr+p{>=ktoBDSJe{A}r z7`)81XLs<=jD5<%x0&&@68wbm-!c!gR2Zv$VDAL{dS@Mp%q9|o72_Wc(8f*CI_fg>jW z_u$iwf4vXB#`Nc>;PZ_?{S*9-(a%TOCgV>7z?Ycz4Fi8{{9`P*%Gh@o@H56fGr+Tr z|I7uiHsfyz_W8C&q?6J z@lQSl-dRXDnf|#5e3hy1N^phgpPRrZn*RA2_)XJ44}b?4eI5g!Ga;<+Iq*ZqA6^6Z z8vWh{uQC4dXYdtfKKv5Ar682|9XM+ICnFR7Yv$Wr@NCncqrmT*`*#M%jDPJ0KHc0u z6I^W8lZD{RP5Uaq&8GY+@K{sdTJS?=zjP3IU(?<;@F%8x5BO=cNj^9qfh){)p|S7n;QP${@C&-%)c+^?lQb5_*lbr;C9pA{lRmGhW97HWoEp0g0C>+ZzFg&g@G)_L*9-o}*z0icyHmpQbe6^c zu{HGDaEf#K`HbIkm62Y8v`UxN2G{0O+s@YCQ^jlcX3yu_?8e*o8* z`R+sTK{=tmpM!_&8uHiR*D)sLQ{bgxZrI!S`#|vSX1*AK^sUBzJAof`w_`s%1^le( zzd~>$>TvSsgWoXzQ3|I24aDWI0N0xJsUG}*@xKGWL32@GGdS1ycNh4VX8zs;9&P&L z7;xP9`zhf2jDKwb7n$~50=~|y*H?qDHTvEHe$3e89`FxlJUj#*zFXM7C%}b40}8ws zz(<(;H^9%E{P)0joA&(${EeyaAK*Wk`SJ(w&ZfV!;OkGA@iYY7V%obS_!zT4od`b3 z%umz7U1ond8+>t5*q%MWr_Ky{8Mt&>$Ti?G*n`QZz}pA>nenf6;7{|y{Pp06%>35} zo?yx!0Ul)5e~OjdnibxECircWe*yRwGybjs?{4JZ0KVFchdaR~W`4U5yui#~zX8kt z;YW2Ac+Y^h8vl3&e4Vk!+u+Aw6ZsT)AAy$}|Nk4f%JlCy;A_l$pN_Ts2-BV%aEocr z4&Z4<-gxjHrae=^*O>ew@ZXKS7l8LO@+kJwZN_gE_%g$*!M`?qAox?mE#O?U{&j=* z+AVDVq2SZae0(hU+G%0_so+1D`R*KWpOJSd_^chm^4EY*HuJ-+;B@1^_ku4r^%v*syNKg2Y)*}E)%=lUizQXj^a_}f4e=l&p@wa`!kD2k?2wrOX zw;kL$J*=-Ee4O#8Bf+m3eKv!iHU0Nv@Lfi~3&Avp%BR5lDfoE9H-i6=7v|pu{+03P z`@uVy{71oU#vadtR~Y-h3jT-b&v(G@nfdW!@HeKvz5t(S+W#$B{)b7@slba4!hX`s z&x63vn*JLJ&dH*(^eOQ2z`Gg$-xW-IH2D;G#b6BifOiKkFzZV>xZSK*E5XD3u>2bE zVAH>G@P|fzD|o)~??b>PM*d;o*YQt21>SK;$ISY78u$`Z{#@`-(|?zNJIs7?EqJ*p ze;arYBk$+n&x}7m41Un`|8K!1M*d6Sznk^z_uy(H|9$WS#{QpzzcS_#-A#|Z<_M8;0EKL z`+I<6SVV8Ls|6gWogye+gb; z^!*O}g0WWy`a0jtH@V;yW__psXY*V$f9(toKLy@y;L&EkITL(&P^Q3Jh;+BHcLn%1 z)1Rxr)6D*PEqJXNe+Pk^%zWDht}^Ro5BOl?Uq1r>+4R@(;LIYYae;R_nEty#`4o8P zf!{LY=O^Hw7KHiNfp<0idpo$t^v^HA-Pn+?$5qu2($)~_O8tI*j zL#DmToyOnJ1}`@9F9xqS`B#Da-R)@K&ERj0Kiv)fgXzBq!9O?S^Ko#o>CflErv%up_`948rxXg^V&%r~A!v6gloNf9i4Rc)|uF0ps8wg%(=9dxRmredo;LA*Z zPXXU<##bTuA=97p!Hs4=Pzrw8_|FRP{l;JG!Dkyj0KC%lM>F_G=Ke15jb^>t1m0}= z=NRxZ!>53U8~Iznql&}!)81#0Ss$+kuQ&2<0S_q*%ijaO4r4+-1>Qs8xyB!!0AFC{ z_ZPskjXmE0pKIom_rR@Y{{0L1C9}T%13cNBPk#WPX6&DZx!_Er-w^OrQ{Rr@v1YtZ z1lJq=rh}i)3)@4_I^HqY#Oz`oheHValiiGuF0lwLkzX5!v@#j0ixkmr{z>njf)BiU} zH=6nL8Sv+(e_sJFH{;=L@Lk6KAAx5WfBhTyLo>d<0k;}^rbE_AX8yA^mKj;P0_ssZ;fe$nG8wwt4 z{CN!c;Mrk)lfcJ1gns$p*~UNVU9=6RzQy2!jJ=nG>5M3!0&g$y8>ale;DqtNM)1c* zemi(4(|`TobItsHB=`%{p3UHNGah~n{=FHG7lNCNzx)(@zsaY$d#SPKUEqqmQ2+bE zdz$&_QSg~&{&*Jrt!eM8;HQlK?|^qV{4w}M<4<3JJ57Dxf`4hoM-**eZTf2v`1fYK zjikOY>unx*kQooVf}c0`Ee3Be?cE(5HRGckJl(8EE5YTaf7gKN9Xa_FcyaLOb3$$f zS2=|L90I=5*y}Lx-Nv7f1NWNyPXlM0@?`r;GyX3F|Hb&zwcxEr|J%UNnDPB{@MhDW z4};G&{!j1XU1Y|~OW==9|NI_I@36?Hzb?0Y7cH68x&+TJRqY?+5;?;U@4`hC9IN z(?b0>fWI^Tbrg7^nU78a-)rWtv%r~{qvTWIT?B41_g@JPe_yY_y9wNkG2qJo3_RV8 zw+Fz7oBYSX#~6MN{DzrtUjtJN(#d-lyv8t{efKl`CAiD9|2y#R#{L3?vqHu5XL^GyG*0#hCGDe%@JeUtI0gTTKq z_GkkyH}emjefBfue+1rO#`p1H+LJo@r-SQE`SZY+nEv?*_`WG&`Rl+RU<|nXZwFVJ z_3;w*7R=y_#rbN&!h728Tk}=CE!1s`FT(98sq{4z`fC>WTGOA4z~>o%Tnhfk zjK^wlmKpzhgLgCj+yMUAjHiRa2M%`?;`u-L%UH;VgU>hpbpklY=yL}6@Vv16`QYiM z{>#BnM8f>*!E22_-vRz)K$!na@cG6c9|8B9`R8fyfu_FSfe$zS^9L}!BP*W*??Z5g zDgQb6F(dzL@SSEpO2b@miWyG>!EYJ;Mu0CZ4CU_xe#-C^aE+P&3&G=!{`0|mnfbL8 ze3uz-E5N52t_MG9{Qm%OwXsJt_*T>3UEnQ7{wDBC#@@$(_cH6jDd0bt{4L-|&3L&4 ze2dZlYB2tAsDAMKC*U_6!e8$JpKaFHhrnMO`A>l9oj>{D`9FB0$$ta%dQ%_N)j0#mpal;NP10;|TCUrhiWazh&~z1aHPa z*PaWIrapIk1^7dUu-6UX_e_7?34X`y&+h}jZ03XCfGMWz}tLyP3wn(&3B$F!Om1_$afU?f|Yf<9$4suDSZBB7L@LUlDkW z>F)*LADjEjz^9w`RDtQ4kCV3=e34lX4g|k$=I<78vzd>(!5^4-&!OOKvtKzDyw1o! z6`X74pL4*|j6E&|e{AO8YrvPA@pLQrb7P--!Pgo2zXBH;dp-$%)9g211h<*~dK3JK z$^R4hO8j&E@mHkR8~Izor<(N%zw+z-s30sK1HWq4gQ4Ji&H6b8JlpioByh~MFCRR| z^!FU_!)E*~2Dg~@F9%l|d+!CF2Oo3#?+bp?_-iAWp0T<7cJRB#9{u1y8vi^J95?rG z2H$MfgCB$MGJGNU9y5M_3jVwCj~l_eV@-1P-v$26^!NSXe;R%iOnvOiKZ|sh;a8FV zmFe$yz`L9IZ6?{@~ zVWL+Erf2%{De&fl4>t34DVWwU`4o67z~N_SuMWI4xUjRgA9!n)yMX7%;P5lvYX`3j zE{ym3z@29QcLX^6jPp(ahvmn4r-Oem^TT=I@H57{3|t>v7~@?7KG5iMD>(d&_U-|P z@<)3Qg3F9O9tVe?k=}FQu>45xRq)}azuy6epAp_i;Cq7$BfQVSdz<;>YjF4(=0zau z{oukdZvc3z@!w(Kx6S%D7EEV8`4o7&fY+JvKLb3+5A)}OFP$3l5^(q#;w=Xs6meIE zcs1bZX1?7Ae6bnt>%jMz@j$<8I@YWwec%~pd>#S5#pIs|{*`IZncy$X_`3l7s>#0s z{KR0VAJ$LsC#Jo3g2PXS_e=2I!G#QdcWi^1PoF~mP_tin8T>ON@2wE8R`bl(X~ z_x_rcKiT^hJlSRA_xU3e5N|e|1uiu_2wZMBNFtHu1%~I#XWHOBO|=;m4Vz} zgMztFcx(z!P2rg-yeNhDR9?sRjr8i0c(iwbGR;{-@ry=@r2KJSUlNb^HY?MdI~0?} zY04)tPxQ`F26B76jzb$8@V7PPKVqBF=*_6Yls{<`eiq~3Z2X&rfB3(iXZ(Nd-FJ9Y z_4+OFY{iDCh>8j*n#c}E5t-eCs5B831Qk0W{Ma15);}H?D9DA== zkG-H`J&LIJU9;Ymj2wT@J-9%*Tx)>iQBNs5wQ9Eb);q? z4!g3?#s#u>G2da=_9t9Id*?gw<*~ShxUlvv^3Nz=Zu@ijqT{_UXs>l!o-2Pf$bHT7 z7luFkswH2xq;>t`MY?>xUgQ@o@^#9G#ny>@o$|55pM9O!*NJ@{JI`j32UoZB{75jRLub23GiLaOF$oYDSub242OMJb=*Gqi8)YnUWz0}uBeZ5pyg|BDl zEGl1q`#FT~eZADz%Y41e*UNmp%-73&z0B9ke7(%q%Y41e*UNpq+}F!}z1-K!eZAb* z%XMS%^>SY?_x0@G>y|Hf;p-K?Ug7H%zFy($6~12K>lMCU;p^4;dUd{Dov&Bt>(%*s zb-rGmuUF^m)%kjLzFw)5FIej2E0#L>lBG_*W~q}eYOjIHucl;wt-t(bl{)#lrB1$Z zsgqW2tcX@_C`m(08fwzelZK)+G^L>`>PpG}(Hi%zwv-}W=7xT%I3+cwr0SH^9h{lc z*U@EGeM;(2Nd+pYK_ykFqz;u-qLNxvQjJRLQAtHAsYxYOsiZEI5*=r?siZoU)TfdP zRZ^o$s#HmxDydW@wW_3AmF(XO@=I2+N@`Xq)zMJ5N-9@L?JB8WCH1SMf|b;;k}6hG z$4V+$Ni8d>W+nBkq@tD7w34b;QrAil&^&l`&EoBb6~y86%Z3QW+zaF;W>Ll`&EoBb6~y8Do_(RvBZJF;*F4l`&QsW0f&h z8Do_(RvBZJF;*F4l`&QsW0f&h8Do_(RvBZJF;*F4l`&QsW0f&h8Do_(RvBZJF;*F4 zl`&QsW0f&h8Do_(RvBZJF;*F4l`&QsW0f)1bsDRTvC0^$jIqiXtBkSA7^{r2${4GR zvC0^$jIqiXtBkSA7^{r2${4GRvC0^$jIqiXtBkSA7^{r2${4GRvC0^$jIqiXtBkSA z7^{r2${4GRvC0^$jIqiXtBkSA7^{r2${4GRvC0^$jIqiXtBkSA7^{r2${4GIu{s#5 zgRwdotAnvR7^{P^IvA^iu{s#5gRwf8sDp_*n5ct^I+&<~i8`35gNZtrsDp_*n5ct^ zI+&<~i8`35gNZtrsDp_*n5ct^I+&<~i8`35gNZtrsDp_*n5ct^I+&<~i8`35gNZtr zsDp_*n5ct^I+&<~i8`35gNZtrsDp_*n5ct^I+&<~iE5RojETyasEmoqn5c}2I+&<~ zi8`35gNZtrsDp_*n5ct^I+&<~i8`35gNZtrsDp_*n5ct^I+&<~i8`35gNZtrsDp_* zn5ct^I+&<~i8`35gNZtrsDp_*n5ct^I+&<~i8`35gNZtrsDp_*n5ct^I+&<~i8`35 zgNZtrsDp_*n5ct^I+&`1sXCadgQ+^0s)MOIn5u)RI+&`1sXCadgQ+^0s)MOIn5u)R zI+&`1sXCadgQ+^0s)MOIn5u)RI+&`1sXCadgQ+^0s)MOIn5u)RI+&`1sXCadgQ+^0 zs)MOIn5u)RI+&`1sXCadgQ+^0s)MPjm#TWHs+X#Isj8Q%u&Fwjs)MOIn5u)RI+&`1 zsXCadgQ+^0s)MOIn5u)RI+&`1sXCadgQ+^0s)MOIn5u)RI+&`1sXCadgQ+^0s)MOI zn5u)RI+&`1sXCadgQ+^0s)MOIn5u)RI+&`1sXCadgQ+^0s)MOIn5u)RI+&`1sXCad zgQ+^0se_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!A zI+&@0nL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&* zse_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&@0 znL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&*se_q1 zn5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&@0nL3!MgPA&*se_q1n5l!AI+&}2xjLAu zgSk4GtAn{Zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=i zI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk4G ztAn{Zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2 zxjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk4GtAn{Z zn5%=iI+&}2xjLAugSk4GtAn{Zn5%=iI+&}2xjLAugSk3bsDp(%Sg3=AI#{TKg*sTM zgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+sDp(%Sg3=A zI#{TKg*sTMgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+ zsDp(%Sg3=AI#{TKg*sTMgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+sDp(%Sg3=AI#{TK zg*sTMgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+sDp(%Sg3=AI#{TKg*sTMgM~U+sDp(% zSg3=AI#{TKg*sTMgM~U+sDp(%Sg3=AI#{O;)~SPa>R_EZSf>uwse^UuU|qRQy}I)O zvtBzlJaAU0=G5uNS68kpM)ABMM)h20xxV-Sp8vxK^kitc&h~-wjlw>l8%JHa-uM8X z+rkI@Ij*{L-SGiDlY|fG`O$Ly@c}$Gj}Pbx)bhOmK7eP?@Bux;TE17n2k`72KA@*y zbuUq;dx<*TIn?RSp-y)Wb>%w;tb!+9v5KD1)tyD1?kwtbXHlm+i#pv|)alNmPIne{ zy0fU$okgAQEb7X47T6`8Y{D-6NvAs9dDQ97qpo~^fKk6n%J2DCEJlnuY%H#a?%na} z-R%WEVO;v|JI7Uh$Jz;N?S!fmCrzlr>7Yl9jjMWh>ocf);$=JOD$h~PkEB&S?Cj5n z*Y_AQzT3Eol&)gM+rzI-~``tf$2)^3NE&-v_UnclsB)$Y4i?QSQ! zx05mBjGsL9F8)+;p3=WM73g1{^nLHCV+I^GmKT3qef_Yi|2#viUC#Z+jvwh?UH5K# z?>wm2K6~^S)U$rnkf{xqn`e`)JQ=&6L=~t1ZakkV56XZ+IKz6?fJx)W;F6Y6zIY91 zzU_hY1|KzILVfw7RdpLPam1m2j(Ut8U0>C0!Y+13-C&8&4`<)@gn4y^nv^S0mH|7^R!-a7nHX4RGU zPG2vq`8j5Ny|D7@%vv8-j=vM8bztQS%vuLlzR0X~VC7Gkbva)$>uZNK^O{*-JFI+( zS!=?|zc6bZSozmxtph9n&a8D{s4tDJ|GcQChljXA6w ze`B$==dkj`taV`JUCg>Xu=1{ET^?9@AG7ugD=*)+eZQ5r?ZKG$uM5`vFtgT&mE-Tx zX?%+=lFt_#`R{l}NJgodPa~q$Bl`qA-A7@zkGIMLsVdXzy-j6e^{AY6; z&tc^&Fz@TY%JKJe+jtHu-^$$TZGOG5^7iJ|p2Nyqx6RFevKyLh@0<0xux36n>uZOV<2+uPhn0VA*1llnKbf2VoBLXB z*5|^SS!I>ReZk6cjxhBaR^HUCUc<`QH8)4GY{U6*^|`QSHZiN?uyUM#O!KhvEzH^% zth~Ls`7hiT&aJD@g*B6ywJ%tCQ85oI?_$=zVCCI0@3%u(c`wX+4lCco+~Q^4{$b^9 z?BeSC8mxQ^v%asv$~&6%eGOI~ne}}QR*t`4uJvK%yJ6nHpTf%bFzfp}tbCwZ`-PPc zHfz7I@?mDJ11le8*5!efk2CA?z{-!synnxjl}|Hkzp(Q2%vv8-j_-+Dzw-Oze9Zg$ zu;v$F-g8)a3v-9%_CMS3^HmF+D8{Xs_Q*eE4lD13IX~vG^2Dsm1}iVjEk5Epu=1{E zU1nH$PqQvFth~2b>%hwUn_GR%^bE{7|4=W#T zZsR$u9JhyUf3^SFHpbp`tYFQIH|toz$|sv!e8zpj%8xheSi#CqGV55u%BP#P4y+uv z8C}zKfrpKaDLftAlS>zKgGZ!+tcz{=M(YrnAaHWfLnyaRHaoX9pJ)@_ZzsKwD^GQSKem+U%#9!?d#I*4c2jJW!CKtR$l&n%DY+l z`&5W^{C)%0{MJ~y8{%^0Zt+2k| zcfne}y;;WxR$jgx`tkXX+o2za%G)9C-*kK`@9Xe2>iATCy*(}0@qxA9-OM^Zu<|`H z@Apx#@&TCl99I7SkB=P;+y1x5r`!v_|EcT+Zu7c7sl5H;HlX_x`2TkN|EKlQwHC{o z*#G(OHnk3JGtF0&2ThZ6T?dUt;kbV%ZrJsax0d0E~{u})PyfuyA zzk+S(s#VM#=r!PNY5YDFbfjCt_(E;#2zR3KdreTHJHrv(6^`j$;DjCor*u7>(IerU zJ`yhIqu@IFc(^lt3A{Z$3+_T+1MfgT0PjfS^%R1gXq-Pa=t@5eccWi{aRu786z)NP z2lu3Zfp?~HPSKzjy)nECy&2q_u7P)@{|4_ycY=4P`@((bz2Uy}0WfYvwhe;&(e-eD zdL+CjeI&dWeH6SmeH=W1J{jJJo&oPmp9}9tUkvY0Uk)EYUkx8f;~b{JLG*3#KzcEZ z8@p|I4dUPsx)(f%zO*98-Cr=6`41I&6MOxDU8oH1Rh4?oRdL4Jpew8 z#C^c{hUNX`DArUrPj^ zz`Q#=jou5!9ieSQ;gjg`@X7Q^@G0~K@Tv41cshM2d>XwNKAnCEodE8wf>X7&R|Fq>`zUrl#_=g?i?YiOLaDVR$Sg#DO|g0E$MEPNe( z7JNND3-)7j3w#6f1@MjZGw@CH+wjfwQur2n1$-;rY#p;7lb-Nx%nyM5b}|CKo%vMQ zkI4*p9&^0TVsHn2BYY=)KYSPcBz!mhCVUV5Ieahu3+%^aE&GKbxQ{u`GZDY0_jM}#H1og1 z&(Jqj%;4N2!L!Vtf}f+8z<&LLoxT$OgPsfHhjH6(f&+RUj3-8HyBA)SUH~_t7sIR3Pr!J> z#J1;P{7`S(EAX215_m28eHc%q*!Bs$HoX*XMt=vdL;nopmjl~=hu5Q~M<etLC=Q!(evQ`^dfjq z`UQ9|`hD2f-^3oQ3HD~bEj)nU0p5r13-3$g^^Jr5=+W^0^l|V3^x3el{}_BA^Cj>> z^cV0zdO3VB-P9hi4i2GP!T3erwyoj8G|ow?^~b|Qn4bm@r7x|Rc^*EL`A6_Dx{bZo zTYv`-Y%9Ts(Ieo)>Eq$y^u6#1`f1p|#<$=jm~YU=j0YiX!?|XHQFH;1rhCI<=>6fb z^l*3_jn_TY`lrKqFvGT)@Ob(L*ngIo4^Lpe44z1@X0LY{Orke}C)4d^}=lflp_CDm;U}0QR4Yu7b~Cek*(?{Q!Ix z{Um%g{W^ROjn_ui&oCNB^=xyK&X`G)WxQN~bzL?$zzJ$i> zlm?g5N5V5{yf$ud8GSbVclvVpa{5Mi7JVOl1^pO&CH*pd6^+*n4QA8dz*p11!E@-f zw=iErZwk+)YvF6@6uyq`0bft=3Ew~uf^Vcp!#B~#z&F#k!?)0n!ne{d!ne`y!nf03 z!t>~#;XCNHw=~~Lw}tPbw}J1bbNC**2YfHx55A8+2%b+L4&P5tfd4_C06##V2``{8 zg&(A^ffv%Z!w=C9z>DaA!Vl9+;KlT(@FVp1@T2q}@MCndYV+fCC-|TA_V5$*F0ik& zH~b{?LGV-bNcd^`DEJxrWcXS7T=+Tqa`<`rdiVwUF8D?IA^0WwY4~OOb@&zfL-pox^X_Jzzgpc#U-(t1<99oS6>4OXIZj;qU1yVZWb$3I2ik$MBEz5AaWP`*!Ak)7!&8 z)4RdG&H?Z*%+H3G)3f1U>Dw#j7s4x;KMVW!m$%{Hn12cXPA`Z5pw|k`_6n!iHi5?n zW%q#t=7Zr?=y9-L&S~(f%+G_H(6eE`4D;aCm@k4?r(b~Apx=jmzsuk?nOD`C*P@%l zC-JiNhMO`!7+#wm4L75YgZ*;e1FysUDR^Ca3A`TtMa6t|d&`?M&tW_%VcRaSuXzI8 zg84=82K3yDnYZB$nSTp!Ly*z?(2X9^RBb2lnH9CESYn zZE$OPA?(NYC%6rBy!Lv4Csk}~4g2NU2Hu?c_OP$NJKUD}L9nkm65fLOG4Pi3nXq49 zm&4V}Z-(&%j%^RXThUL${y5mG+nC!i-vkcn_OM@0oO>szW!@Y1%eg=7m+d^bJ!h_k z{d4bu@x+mBkHK5hufo30$M81He}p^Gt93B@*R>J6E%SD;@AqK1BlGd_cJxUwo}{wv z0=Puafg}1(IHniF3H=hB(jUMX{T-ast88m7=oWAtT@81pBY1ndJKTld3*Lbq3hzjd zhj*e+g1gcez}@IMaCiDnxCgx$?n%D{`|)qu(Y!PBws0?cJ9rm*C%8A=58jm?1n)+V zg?Fb#oy@kFj|HSiSL z{^4K4%t&}D^J(zW^m!FCPr%18e-}QM{u0KM!?yhlA5X6qn@^xyz|-iqu>W4x0X~tr z{e#qo-^J{enC(7?`QGr!^kDb{eoq_?pThiT_*D8dcshL%d>VZ58O~V}oXz|<_#Are#C$HjDSRH?7e1dp48DLK1z$*yhcBY1z!%fU z!|qIqduW8TPMtjXJaMwBB!Tp{A`+hHjeZM!rzTf*` z-|yqF@Ap;M_xlm-`~4pFuXmNsX5ViHKgs>>3j2Qdhkd_?!@l3iuG&@N4up@auH2qxlVb9oWCuYzn{0ydCWK&n4LJpLc|paAsflEqWmQ zHhn1k4t)&#E`1{W9(@}8K7BU)FZv?*1NwUSL;5cGBYF}1G5rSo3H=fLDg7<{8Qo+j z^XGJP_zQY7_)EGIyp-+&e?{*Ke@zdBzoAFM%jl!wZ|U3M@92l&@97sRW}0-h{0HV6 z!#~m??CTr||HOPW{BQc$ikW%v&&(fzf1zKhm|4A><;$73f`6sAhF8#?Vc+kO@Ndkg z!@tv)RLool|H1rT*ndC$8m?+mg>BXD=78P+_VsIEI~NVM81~N{39rh08r+0F5BATU z4X?(09_*jH2wt7}3$Xvr`#!t|^JTFAj@-V7c}?a!z-!TcVc*xma8u@^Vc*xa@Y>A( z0XL(cg4dy!z`o8GF#dw1ZOh^H=%zi*zGf@9IrFXI_36&Ae=XzT7R*nBH=r+teP7qZ z8!~?n-iZDIZb>)UxpBS=yfO1V;Z5iv6*EV|n=-!E@_E&Mk+fw!i+!Q0S#z#Zs;@V4|3a7TIyyd6Cq?nGY%m*_cgM9+g`dLf+9&%i0Y z1kUKs;GF&mF6bt`&2@AOxHEkTyghvr?DzTi!d;jzhIgQ!gZ+MW3GDZ)pTIkE<~w*N z`ggc1-E>!TH@YRdm_{?Zxt?=OAfo}3v7?@W({@t2EjI|kl`J{|5&&xUuU zuY-4^Z-IBG?}Gc#Ps4rb7vVkVH{gEsGPpne6TBzA0^W;WbvN_gbZdA3y(PR4-5%bT z-X7kM-VNTLJ^(&|9u6N!9|a#oPlpH67sChBb7Ak%8}K2_zk~;9<;9gUJ z=$Y`z^fmA)^lk8|^!@O3`ce2a`g!y(UIxETSM6bbgKiGLNpA$7L2n5!p+opg zI)dM#bNDQ}2mChO8$O#J0KY>Y0G~tG!|&2Zz~|DF;rHlc;PdDc;q&QJ%{3P^y4Lga zFmoaEE8$gw@_o@Y@I}n;gfFJ&!?>|2jF|@C*k|(*Wvl}$MF61_wYaH zpuhP6dOdgny&3! z&YS~3MqgmAdA!lJp092#2>!{uIqdm{X3fKz-vl#$+1g;nFEgymyai_bIB$g+KmM?e ze|yaM_1*z9etUp*d+3B2zb)BAp$)e&Shq2IxTxWFYrnoX+-_mrZo6W}Z}UAd<6VH& z1^e-*pA`^ zGk)JS3NwD62J1e}XpeCmu;$u6$ki^@Zaf_oSK!pP7PuJ?3!eGsh!u&K$9<^VSk+h${?Rii`CuS4FNIUM@TEy!_$vJDP> z=1%0BF^5B+nU8#P=5XjU3z4^F4u?L2ziw5%1#>v`8T_@X>Q9)%q0iv2Kn2?|$6rgT zw&&`w!J+5xBe&<$u)(3ve1hDbbHWCPKC=`#ZtS+fq0fAW+@6QP28TZLGje;}9~&I{ z%OmpP+m@hUs^qH2(?eSJ@aOg8_kfW5g z!FVhfTQzcfY*7w3egF~OW4tYQ3Fn<2Vb_;Ucak@jFnTPyS=5XjU^UcA&%<+(S_5O_xJ;&1+ z)dw(#L!ZIJ+|>s%heMyi!`9UYF^5B+!9&c|1DV62&)^~B>VuiXq0iuHah%;C^y@DOeFVCHb>Gk7?)dI)nk^cg%nTKySwIP{s-n%FTpoOyF|^@v7?p0`AP z1amm_nKsBrGKWK-sYX7EIUM>-d*q{;!=cY~L_UT&9QsUxd@OS~^qJ1c$1#UPpXrMH zNak?pGrf?HXAXxx(+Bwk=5XjUdm+a+N!#GiXZA-vi8&nl%pu4pGlxT;8HW5Q=5XjU z!;yc^91eYEoH;m-IeyKqKB3W}=O-ec#vBfP2EXoBpU4~zeFndFR-eQi4t?fA$S zL!ZHq6xF9NheMyik0#ZpGKWK-!H+N1UoeM5pTUnx!I{kO#mw1_4n4=O4b|r`heMxP zjQm{YaOg8nAU}^e9Qw?2$j@gEhd%QP@(Y;5q0cNqej#%>^qF^&f5{vUedZH$a2fM& zF>`sNL(l(>d=_&!^qJp~U%?y>eP-3wEWeUD9Qw>!$gg4!hd#3&^4ZMc&}TM4zLYr} z`b=wca2@jyGdDCk^t=P|8=1qQ&qT;?Vh)EsQy{;YIUM@Tj>vCe4u?L2*FC7dl{p;x z%x=hUV-ANtvj_68n8TsZ>}wA0WN#%!kNdVGf5r^EvWYnZu#ae1rTo=5XjUKO%pfIUM@TugKqE4u?Jy ztZw<6%;C^y)_H*4u?LoKJsPE;m~I`v?%zN`6jS^3|kv}tHB3tgKItC z)|_pCw5kejw^o@|g}u`{UEr3?yV|>&>PFXkzNbammdxRHo6-aAoz@u)V<)x^v$vYP z$}GFqbA0Q{v4CxG*s08_Q|z7AIUOFr{49G{b7-S$J;&WyHk3KsZa*4#F431&`ioL5jt49dgGZ?;;`7m?M!baD6KFRXzLFRC~d+2HST)#b^ z0xx2Iy1C}5M%Q{i)AIC5=5X=|J=d&tZh&zG+J=|6sClQ+wVvbU9DN=#W^D? zK3YC~M8%(VCW(&Y$MWhc?_yZ}&`F06!nr@}nkak7(4ph&C;KJvXgp5mp(~r&Uqquu zjH%Zuc6+Jnc<9*CqwB}$tKsJzHh#!xn;Ji2!l9Ep4w*P{{D`5GCfeHni>!TLc}f1Aa6I0jnpAT!p}*MXP9z{j-7 z!z`$r!%JZ3W0;jkuQd1b|1dY%<|>aLUh+a~RIYdWe>r#ge>sOAUH_Z?F8(j)-uf@+ zmfIYTpKgEndI#&uvRwSpjN{PN-mo>>AgG#RpM>jeeS5>la64#epI^D&K>NTamTS{` zcD4U$y;C*~s^(dS_3-13){9qKuls6MRr9r&z1MmjS6VM=-FQ3QsA9c7E3LQO)*Jd4 z>+Q1AdUH1ms&243T)vGf)*HOidIRm4{MC8~t+ZaB%^TOlk6!wE@x9dkYq&lZ+Ij=* z&)W3$j$3KHA8frfEyLx*eTvq@_ub0%TCDNcmk%#ThR^A0Z`f9}4XU>A^)|CVYrQ!u ztvB(1SnrCJ)@!q6<9cl?)?2jFdav1fy>J11)7SgJO6zs04yp#*48Gni?M;{Og_YK8 zW2Hh@wP`)PbW-KlJImI4!-lY4jlF5TcYQs5-dtM`AJZn|Wq$0xhV2HMTiCzhj}0ID zWTpL1tO=@)Ex6y%#9yr@3b)GnBe53FK8z)vYp@PGQ)YBq

j<)rt`RCxB*4uQY^=>)1@qT<8o6~xwmDXEs>$SAo zv^K5RVWss}*xx1YzYZ@Se$~)=JNSB?e1YbN+GEkVR^#Qvn!Q(=n`%EVZ{0Xn{yH$X z?@E_%uFXBF3uPb2ezEPj(&g(j%5H!5%?Za3-%EA*4z)Rp$Ki9Z4WCt2KCc!3)Oh@` z3ma|NX4zcxe)hAlCC}SpSg*Ogtz~bvUc+{aJ>E3Crs0nb*9Y!{|1>u?sG3x<1AR&V E2f_v$Pyhe` literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api.o" new file mode 100644 index 0000000000000000000000000000000000000000..9ce118b94a8d7be594ed4c18c695ceee1e61be04 GIT binary patch literal 255332 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

  • _RyVvvyGIkFt_Ips5k$I&}m^rj) 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 BJ%0cI literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_calibration.o" new file mode 100644 index 0000000000000000000000000000000000000000..13ddf52c112a58f7088885e76ee29d86df91647b GIT binary patch literal 145644 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≫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 I@sZj6f8BQO;{X5v literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_ranging.o" new file mode 100644 index 0000000000000000000000000000000000000000..31c41449cec9da65e7c376ab7361b7799ecf0071 GIT binary patch literal 72156 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_strings.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/core/src/vl53l0x_api_strings.o" new file mode 100644 index 0000000000000000000000000000000000000000..eee382e817bebf03dbabc09170cb3dd9646111e2 GIT binary patch literal 111568 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/mine/src/vl53l0x_iic.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/vl53l0x/mine/src/vl53l0x_iic.o" new file mode 100644 index 0000000000000000000000000000000000000000..beb327e3abb7f6fc56a4cb2541dbf20eb857657a GIT binary patch literal 87600 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%0D<3IDk_n7fu5%>)gA1lD+rhRqb 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 IpX{5CE1oOTSk%_7zR~KpoWTVOz)6D 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 "${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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" new file mode 100644 index 00000000..0521690a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" @@ -0,0 +1,1926 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#ifndef _VL53L0X_API_H_ +#define _VL53L0X_API_H_ + +#include "vl53l0x_api_strings.h" +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef _MSC_VER +# ifdef VL53L0X_API_EXPORTS +# define VL53L0X_API __declspec(dllexport) +# else +# define VL53L0X_API +# endif +#else +# define VL53L0X_API +#endif + +/** @defgroup VL53L0X_cut11_group VL53L0X cut1.1 Function Definition + * @brief VL53L0X cut1.1 Function Definition + * @{ + */ + +/** @defgroup VL53L0X_general_group VL53L0X General Functions + * @brief General functions and definitions + * @{ + */ + +/** + * @brief Return the VL53L0X PAL Implementation Version + * + * @note This function doesn't access to the device + * + * @param pVersion Pointer to current PAL Implementation Version + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion); + +/** + * @brief Return the PAL Specification Version used for the current + * implementation. + * + * @note This function doesn't access to the device + * + * @param pPalSpecVersion Pointer to current PAL Specification Version + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalSpecVersion( + VL53L0X_Version_t *pPalSpecVersion); + +/** + * @brief Reads the Product Revision for a for given Device + * This function can be used to distinguish cut1.0 from cut1.1. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pProductRevisionMajor Pointer to Product Revision Major + * for a given Device + * @param pProductRevisionMinor Pointer to Product Revision Minor + * for a given Device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev, + uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor); + +/** + * @brief Reads the Device information for given Device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pVL53L0X_DeviceInfo Pointer to current device info for a given + * Device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo); + +/** + * @brief Read current status of the error register for the selected device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pDeviceErrorStatus Pointer to current error code of the device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev, + VL53L0X_DeviceError * pDeviceErrorStatus); + +/** + * @brief Human readable Range Status string for a given RangeStatus + * + * @note This function doesn't access to the device + * + * @param RangeStatus The RangeStatus code as stored on + * @a VL53L0X_RangingMeasurementData_t + * @param pRangeStatusString The returned RangeStatus string. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus, + char *pRangeStatusString); + +/** + * @brief Human readable error string for a given Error Code + * + * @note This function doesn't access to the device + * + * @param ErrorCode The error code as stored on ::VL53L0X_DeviceError + * @param pDeviceErrorString The error string corresponding to the ErrorCode + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceErrorString( + VL53L0X_DeviceError ErrorCode, char *pDeviceErrorString); + +/** + * @brief Human readable error string for current PAL error status + * + * @note This function doesn't access to the device + * + * @param PalErrorCode The error code as stored on @a VL53L0X_Error + * @param pPalErrorString The error string corresponding to the + * PalErrorCode + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode, + char *pPalErrorString); + +/** + * @brief Human readable PAL State string + * + * @note This function doesn't access to the device + * + * @param PalStateCode The State code as stored on @a VL53L0X_State + * @param pPalStateString The State string corresponding to the + * PalStateCode + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode, + char *pPalStateString); + +/** + * @brief Reads the internal state of the PAL for a given Device + * + * @note This function doesn't access to the device + * + * @param Dev Device Handle + * @param pPalState Pointer to current state of the PAL for a + * given Device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, + VL53L0X_State * pPalState); + +/** + * @brief Set the power mode for a given Device + * The power mode can be Standby or Idle. Different level of both Standby and + * Idle can exists. + * This function should not be used when device is in Ranging state. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param PowerMode The value of the power mode to set. + * see ::VL53L0X_PowerModes + * Valid values are: + * VL53L0X_POWERMODE_STANDBY_LEVEL1, + * VL53L0X_POWERMODE_IDLE_LEVEL1 + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when PowerMode + * is not in the supported list + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes PowerMode); + +/** + * @brief Get the power mode for a given Device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pPowerMode Pointer to the current value of the power + * mode. see ::VL53L0X_PowerModes + * Valid values are: + * VL53L0X_POWERMODE_STANDBY_LEVEL1, + * VL53L0X_POWERMODE_IDLE_LEVEL1 + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes * pPowerMode); + +/** + * Set or over-hide part to part calibration offset + * \sa VL53L0X_DataInit() VL53L0X_GetOffsetCalibrationDataMicroMeter() + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param OffsetCalibrationDataMicroMeter Offset (microns) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter( + VL53L0X_DEV Dev, int32_t OffsetCalibrationDataMicroMeter); + +/** + * @brief Get part to part calibration offset + * + * @par Function Description + * Should only be used after a successful call to @a VL53L0X_DataInit to backup + * device NVM value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pOffsetCalibrationDataMicroMeter Return part to part + * calibration offset from device (microns) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter( + VL53L0X_DEV Dev, int32_t *pOffsetCalibrationDataMicroMeter); + +/** + * Set the linearity corrective gain + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LinearityCorrectiveGain Linearity corrective + * gain in x1000 + * if value is 1000 then no modification is applied. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev, + int16_t LinearityCorrectiveGain); + +/** + * @brief Get the linearity corrective gain + * + * @par Function Description + * Should only be used after a successful call to @a VL53L0X_DataInit to backup + * device NVM value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pLinearityCorrectiveGain Pointer to the linearity + * corrective gain in x1000 + * if value is 1000 then no modification is applied. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev, + uint16_t *pLinearityCorrectiveGain); + +/** + * Set Group parameter Hold state + * + * @par Function Description + * Set or remove device internal group parameter hold + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param GroupParamHold Group parameter Hold state to be set (on/off) + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, + uint8_t GroupParamHold); + +/** + * @brief Get the maximal distance for actual setup + * @par Function Description + * Device must be initialized through @a VL53L0X_SetParameters() prior calling + * this function. + * + * Any range value more than the value returned is to be considered as + * "no target detected" or + * "no target in detectable range"\n + * @warning The maximal distance depends on the setup + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param pUpperLimitMilliMeter The maximal range limit for actual setup + * (in millimeter) + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, + uint16_t *pUpperLimitMilliMeter); + + +/** + * @brief Get the Total Signal Rate + * @par Function Description + * This function will return the Total Signal Rate after a good ranging is done. + * + * @note This function access to Device + * + * @param Dev Device Handle + * @param pTotalSignalRate Total Signal Rate value in Mega count per second + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev, + FixPoint1616_t *pTotalSignalRate); + +/** @} VL53L0X_general_group */ + +/** @defgroup VL53L0X_init_group VL53L0X Init Functions + * @brief VL53L0X Init Functions + * @{ + */ + +/** + * @brief Set new device address + * + * After completion the device will answer to the new address programmed. + * This function should be called when several devices are used in parallel + * before start programming the sensor. + * When a single device us used, there is no need to call this function. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param DeviceAddress The new Device address + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, + uint8_t DeviceAddress); + +/** + * + * @brief One time device initialization + * + * To be called once and only once after device is brought out of reset + * (Chip enable) and booted see @a VL53L0X_WaitDeviceBooted() + * + * @par Function Description + * When not used after a fresh device "power up" or reset, it may return + * @a #VL53L0X_ERROR_CALIBRATION_WARNING meaning wrong calibration data + * may have been fetched from device that can result in ranging offset error\n + * If application cannot execute device reset or need to run VL53L0X_DataInit + * multiple time then it must ensure proper offset calibration saving and + * restore on its own by using @a VL53L0X_GetOffsetCalibrationData() on first + * power up and then @a VL53L0X_SetOffsetCalibrationData() in all subsequent + * init. + * This function will change the VL53L0X_State from VL53L0X_STATE_POWERDOWN to + * VL53L0X_STATE_WAIT_STATICINIT. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev); + +/** + * @brief Set the tuning settings pointer + * + * This function is used to specify the Tuning settings buffer to be used + * for a given device. The buffer contains all the necessary data to permit + * the API to write tuning settings. + * This function permit to force the usage of either external or internal + * tuning settings. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pTuningSettingBuffer Pointer to tuning settings buffer. + * @param UseInternalTuningSettings Use internal tuning settings value. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings); + +/** + * @brief Get the tuning settings pointer and the internal external switch + * value. + * + * This function is used to get the Tuning settings buffer pointer and the + * value. + * of the switch to select either external or internal tuning settings. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param ppTuningSettingBuffer Pointer to tuning settings buffer. + * @param pUseInternalTuningSettings Pointer to store Use internal tuning + * settings value. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings); + +/** + * @brief Do basic device init (and eventually patch loading) + * This function will change the VL53L0X_State from + * VL53L0X_STATE_WAIT_STATICINIT to VL53L0X_STATE_IDLE. + * In this stage all default setting will be applied. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev); + +/** + * @brief Wait for device booted after chip enable (hardware standby) + * This function can be run only when VL53L0X_State is VL53L0X_STATE_POWERDOWN. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + * + */ +VL53L0X_API VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev); + +/** + * @brief Do an hard reset or soft reset (depending on implementation) of the + * device \nAfter call of this function, device must be in same state as right + * after a power-up sequence.This function will change the VL53L0X_State to + * VL53L0X_STATE_POWERDOWN. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev); + +/** @} VL53L0X_init_group */ + +/** @defgroup VL53L0X_parameters_group VL53L0X Parameters Functions + * @brief Functions used to prepare and setup the device + * @{ + */ + +/** + * @brief Prepare device for operation + * @par Function Description + * Update device with provided parameters + * @li Then start ranging operation. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pDeviceParameters Pointer to store current device parameters. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev, + const VL53L0X_DeviceParameters_t *pDeviceParameters); + +/** + * @brief Retrieve current device parameters + * @par Function Description + * Get actual parameters of the device + * @li Then start ranging operation. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pDeviceParameters Pointer to store current device parameters. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, + VL53L0X_DeviceParameters_t *pDeviceParameters); + +/** + * @brief Set a new device mode + * @par Function Description + * Set device to a new mode (ranging, histogram ...) + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param DeviceMode New device mode to apply + * Valid values are: + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when DeviceMode + * is not in the supported list + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode); + +/** + * @brief Get current new device mode + * @par Function Description + * Get actual mode of the device(ranging, histogram ...) + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pDeviceMode Pointer to current apply mode value + * Valid values are: + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when + * DeviceMode is not in the supported list + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes * pDeviceMode); + +/** + * @brief Sets the resolution of range measurements. + * @par Function Description + * Set resolution of range measurements to either 0.25mm if + * fraction enabled or 1mm if not enabled. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param Enable Enable high resolution + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, + uint8_t Enable); + +/** + * @brief Gets the fraction enable parameter indicating the resolution of + * range measurements. + * + * @par Function Description + * Gets the fraction enable state, which translates to the resolution of + * range measurements as follows :Enabled:=0.25mm resolution, + * Not Enabled:=1mm resolution. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param pEnable Output Parameter reporting the fraction enable state. + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, + uint8_t *pEnable); + +/** + * @brief Set a new Histogram mode + * @par Function Description + * Set device to a new Histogram mode + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param HistogramMode New device mode to apply + * Valid values are: + * VL53L0X_HISTOGRAMMODE_DISABLED + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when + * HistogramMode is not in the supported list + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes HistogramMode); + +/** + * @brief Get current new device mode + * @par Function Description + * Get current Histogram mode of a Device + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pHistogramMode Pointer to current Histogram Mode value + * Valid values are: + * VL53L0X_HISTOGRAMMODE_DISABLED + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes * pHistogramMode); + +/** + * @brief Set Ranging Timing Budget in microseconds + * + * @par Function Description + * Defines the maximum time allowed by the user to the device to run a + * full ranging sequence for the current mode (ranging, histogram, ASL ...) + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param MeasurementTimingBudgetMicroSeconds Max measurement time in + * microseconds. + * Valid values are: + * >= 17000 microsecs when wraparound enabled + * >= 12000 microsecs when wraparound disabled + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned if + MeasurementTimingBudgetMicroSeconds out of range + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds( + VL53L0X_DEV Dev, uint32_t MeasurementTimingBudgetMicroSeconds); + +/** + * @brief Get Ranging Timing Budget in microseconds + * + * @par Function Description + * Returns the programmed the maximum time allowed by the user to the + * device to run a full ranging sequence for the current mode + * (ranging, histogram, ASL ...) + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pMeasurementTimingBudgetMicroSeconds Max measurement time in + * microseconds. + * Valid values are: + * >= 17000 microsecs when wraparound enabled + * >= 12000 microsecs when wraparound disabled + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds( + VL53L0X_DEV Dev, uint32_t *pMeasurementTimingBudgetMicroSeconds); + +/** + * @brief Gets the VCSEL pulse period. + * + * @par Function Description + * This function retrieves the VCSEL pulse period for the given period type. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param VcselPeriodType VCSEL period identifier (pre-range|final). + * @param pVCSELPulsePeriod Pointer to VCSEL period value. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error VcselPeriodType parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriod); + +/** + * @brief Sets the VCSEL pulse period. + * + * @par Function Description + * This function retrieves the VCSEL pulse period for the given period type. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param VcselPeriodType VCSEL period identifier (pre-range|final). + * @param VCSELPulsePeriod VCSEL period value + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error VcselPeriodType parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriod); + +/** + * @brief Sets the (on/off) state of a requested sequence step. + * + * @par Function Description + * This function enables/disables a requested sequence step. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param SequenceStepEnabled Demanded state {0=Off,1=On} + * is enabled. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled); + +/** + * @brief Gets the (on/off) state of a requested sequence step. + * + * @par Function Description + * This function retrieves the state of a requested sequence step, i.e. on/off. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param pSequenceStepEnabled Out parameter reporting if the sequence step + * is enabled {0=Off,1=On}. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled); + +/** + * @brief Gets the (on/off) state of all sequence steps. + * + * @par Function Description + * This function retrieves the state of all sequence step in the scheduler. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param pSchedulerSequenceSteps Pointer to struct containing result. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, + VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps); + +/** + * @brief Sets the timeout of a requested sequence step. + * + * @par Function Description + * This function sets the timeout of a requested sequence step. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param TimeOutMilliSecs Demanded timeout + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs); + +/** + * @brief Gets the timeout of a requested sequence step. + * + * @par Function Description + * This function retrieves the timeout of a requested sequence step. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param pTimeOutMilliSecs Timeout value. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + FixPoint1616_t *pTimeOutMilliSecs); + +/** + * @brief Gets number of sequence steps managed by the API. + * + * @par Function Description + * This function retrieves the number of sequence steps currently managed + * by the API + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param pNumberOfSequenceSteps Out parameter reporting the number of + * sequence steps. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, + uint8_t *pNumberOfSequenceSteps); + +/** + * @brief Gets the name of a given sequence step. + * + * @par Function Description + * This function retrieves the name of sequence steps corresponding to + * SequenceStepId. + * + * @note This function doesn't Accesses the device + * + * @param SequenceStepId Sequence step identifier. + * @param pSequenceStepsString Pointer to Info string + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepsInfo( + VL53L0X_SequenceStepId SequenceStepId, char *pSequenceStepsString); + +/** + * Program continuous mode Inter-Measurement period in milliseconds + * + * @par Function Description + * When trying to set too short time return INVALID_PARAMS minimal value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param InterMeasurementPeriodMilliSeconds Inter-Measurement Period in ms. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds( + VL53L0X_DEV Dev, uint32_t InterMeasurementPeriodMilliSeconds); + +/** + * Get continuous mode Inter-Measurement period in milliseconds + * + * @par Function Description + * When trying to set too short time return INVALID_PARAMS minimal value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pInterMeasurementPeriodMilliSeconds Pointer to programmed + * Inter-Measurement Period in milliseconds. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds( + VL53L0X_DEV Dev, uint32_t *pInterMeasurementPeriodMilliSeconds); + +/** + * @brief Enable/Disable Cross talk compensation feature + * + * @note This function is not Implemented. + * Enable/Disable Cross Talk by set to zero the Cross Talk value + * by using @a VL53L0X_SetXTalkCompensationRateMegaCps(). + * + * @param Dev Device Handle + * @param XTalkCompensationEnable Cross talk compensation + * to be set 0=disabled else = enabled + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t XTalkCompensationEnable); + +/** + * @brief Get Cross talk compensation rate + * + * @note This function is not Implemented. + * Enable/Disable Cross Talk by set to zero the Cross Talk value by + * using @a VL53L0X_SetXTalkCompensationRateMegaCps(). + * + * @param Dev Device Handle + * @param pXTalkCompensationEnable Pointer to the Cross talk compensation + * state 0=disabled or 1 = enabled + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t *pXTalkCompensationEnable); + +/** + * @brief Set Cross talk compensation rate + * + * @par Function Description + * Set Cross talk compensation rate. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param XTalkCompensationRateMegaCps Compensation rate in + * Mega counts per second (16.16 fix point) see datasheet for details + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps( + VL53L0X_DEV Dev, + FixPoint1616_t XTalkCompensationRateMegaCps); + +/** + * @brief Get Cross talk compensation rate + * + * @par Function Description + * Get Cross talk compensation rate. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pXTalkCompensationRateMegaCps Pointer to Compensation rate + in Mega counts per second (16.16 fix point) see datasheet for details + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps( + VL53L0X_DEV Dev, + FixPoint1616_t *pXTalkCompensationRateMegaCps); + +/** + * @brief Set Reference Calibration Parameters + * + * @par Function Description + * Set Reference Calibration Parameters. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param VhvSettings Parameter for VHV + * @param PhaseCal Parameter for PhaseCal + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, + uint8_t VhvSettings, uint8_t PhaseCal); + +/** + * @brief Get Reference Calibration Parameters + * + * @par Function Description + * Get Reference Calibration Parameters. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pVhvSettings Pointer to VHV parameter + * @param pPhaseCal Pointer to PhaseCal Parameter + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal); + +/** + * @brief Get the number of the check limit managed by a given Device + * + * @par Function Description + * This function give the number of the check limit managed by the Device + * + * @note This function doesn't Access to the device + * + * @param pNumberOfLimitCheck Pointer to the number of check limit. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfLimitCheck( + uint16_t *pNumberOfLimitCheck); + +/** + * @brief Return a description string for a given limit check number + * + * @par Function Description + * This function returns a description string for a given limit check number. + * The limit check is identified with the LimitCheckId. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckString Pointer to the + description string of the given check limit. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is + returned when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, + uint16_t LimitCheckId, char *pLimitCheckString); + +/** + * @brief Return a the Status of the specified check limit + * + * @par Function Description + * This function returns the Status of the specified check limit. + * The value indicate if the check is fail or not. + * The limit check is identified with the LimitCheckId. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckStatus Pointer to the + Limit Check Status of the given check limit. + * LimitCheckStatus : + * 0 the check is not fail + * 1 the check if fail or not enabled + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is + returned when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, + uint16_t LimitCheckId, uint8_t *pLimitCheckStatus); + +/** + * @brief Enable/Disable a specific limit check + * + * @par Function Description + * This function Enable/Disable a specific limit check. + * The limit check is identified with the LimitCheckId. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param LimitCheckEnable if 1 the check limit + * corresponding to LimitCheckId is Enabled + * if 0 the check limit + * corresponding to LimitCheckId is disabled + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned + * when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, uint8_t LimitCheckEnable); + +/** + * @brief Get specific limit check enable state + * + * @par Function Description + * This function get the enable state of a specific limit check. + * The limit check is identified with the LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckEnable Pointer to the check limit enable + * value. + * if 1 the check limit + * corresponding to LimitCheckId is Enabled + * if 0 the check limit + * corresponding to LimitCheckId is disabled + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned + * when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, uint8_t *pLimitCheckEnable); + +/** + * @brief Set a specific limit check value + * + * @par Function Description + * This function set a specific limit check value. + * The limit check is identified with the LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param LimitCheckValue Limit check Value for a given + * LimitCheckId + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned when either + * LimitCheckId or LimitCheckValue value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, + uint16_t LimitCheckId, FixPoint1616_t LimitCheckValue); + +/** + * @brief Get a specific limit check value + * + * @par Function Description + * This function get a specific limit check value from device then it updates + * internal values and check enables. + * The limit check is identified with the LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckValue Pointer to Limit + * check Value for a given LimitCheckId. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned + * when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, + uint16_t LimitCheckId, FixPoint1616_t *pLimitCheckValue); + +/** + * @brief Get the current value of the signal used for the limit check + * + * @par Function Description + * This function get a the current value of the signal used for the limit check. + * To obtain the latest value you should run a ranging before. + * The value reported is linked to the limit check identified with the + * LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckCurrent Pointer to current Value for a + * given LimitCheckId. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned when + * LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, + uint16_t LimitCheckId, FixPoint1616_t *pLimitCheckCurrent); + +/** + * @brief Enable (or disable) Wrap around Check + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param WrapAroundCheckEnable Wrap around Check to be set + * 0=disabled, other = enabled + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t WrapAroundCheckEnable); + +/** + * @brief Get setup of Wrap around Check + * + * @par Function Description + * This function get the wrapAround check enable parameters + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pWrapAroundCheckEnable Pointer to the Wrap around Check state + * 0=disabled or 1 = enabled + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t *pWrapAroundCheckEnable); + +/** @} VL53L0X_parameters_group */ + +/** @defgroup VL53L0X_measurement_group VL53L0X Measurement Functions + * @brief Functions used for the measurements + * @{ + */ + +/** + * @brief Single shot measurement. + * + * @par Function Description + * Perform simple measurement sequence (Start measure, Wait measure to end, + * and returns when measurement is done). + * Once function returns, user can get valid data by calling + * VL53L0X_GetRangingMeasurement or VL53L0X_GetHistogramMeasurement + * depending on defined measurement mode + * User should Clear the interrupt in case this are enabled by using the + * function VL53L0X_ClearInterruptMask(). + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev); + +/** + * @brief Perform Reference Calibration + * + * @details Perform a reference calibration of the Device. + * This function should be run from time to time before doing + * a ranging measurement. + * This function will launch a special ranging measurement, so + * if interrupt are enable an interrupt will be done. + * This function will clear the interrupt generated automatically. + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pVhvSettings Pointer to vhv settings parameter. + * @param pPhaseCal Pointer to PhaseCal parameter. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal); + +/** + * @brief Perform XTalk Measurement + * + * @details Measures the current cross talk from glass in front + * of the sensor. + * This functions performs a histogram measurement and uses the results + * to measure the crosstalk. For the function to be successful, there + * must be no target in front of the sensor. + * + * @warning This function is a blocking function + * + * @warning This function is not supported when the final range + * vcsel clock period is set below 10 PCLKS. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param TimeoutMs Histogram measurement duration. + * @param pXtalkPerSpad Output parameter containing the crosstalk + * measurement result, in MCPS/Spad. Format fixpoint 16:16. + * @param pAmbientTooHigh Output parameter which indicate that + * pXtalkPerSpad is not good if the Ambient is too high. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS vcsel clock period not supported + * for this operation. Must not be less than 10PCLKS. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, + uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, + uint8_t *pAmbientTooHigh); + +/** + * @brief Perform XTalk Calibration + * + * @details Perform a XTalk calibration of the Device. + * This function will launch a ranging measurement, if interrupts + * are enabled an interrupt will be done. + * This function will clear the interrupt generated automatically. + * This function will program a new value for the XTalk compensation + * and it will enable the cross talk before exit. + * This function will disable the VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD. + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @note This function change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * + * @param Dev Device Handle + * @param XTalkCalDistance XTalkCalDistance value used for the XTalk + * computation. + * @param pXTalkCompensationRateMegaCps Pointer to new + * XTalkCompensation value. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps); + +/** + * @brief Perform Offset Calibration + * + * @details Perform a Offset calibration of the Device. + * This function will launch a ranging measurement, if interrupts are + * enabled an interrupt will be done. + * This function will clear the interrupt generated automatically. + * This function will program a new value for the Offset calibration value + * This function will disable the VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD. + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @note This function does not change the device mode. + * + * @param Dev Device Handle + * @param CalDistanceMilliMeter Calibration distance value used for the + * offset compensation. + * @param pOffsetMicroMeter Pointer to new Offset value computed by the + * function. + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter); + +/** + * @brief Start device measurement + * + * @details Started measurement will depend on device parameters set through + * @a VL53L0X_SetParameters() + * This is a non-blocking function. + * This function will change the VL53L0X_State from VL53L0X_STATE_IDLE to + * VL53L0X_STATE_RUNNING. + * + * @note This function Access to the device + * + + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when + * DeviceMode programmed with @a VL53L0X_SetDeviceMode is not in the supported + * list: + * Supported mode are: + * VL53L0X_DEVICEMODE_SINGLE_RANGING, + * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + * @return VL53L0X_ERROR_TIME_OUT Time out on start measurement + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev); + +/** + * @brief Stop device measurement + * + * @details Will set the device in standby mode at end of current measurement\n + * Not necessary in single mode as device shall return automatically + * in standby mode at end of measurement. + * This function will change the VL53L0X_State from + * VL53L0X_STATE_RUNNING to VL53L0X_STATE_IDLE. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev); + +/** + * @brief Return Measurement Data Ready + * + * @par Function Description + * This function indicate that a measurement data is ready. + * This function check if interrupt mode is used then check is done accordingly. + * If perform function clear the interrupt, this function will not work, + * like in case of @a VL53L0X_PerformSingleRangingMeasurement(). + * The previous function is blocking function, VL53L0X_GetMeasurementDataReady + * is used for non-blocking capture. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pMeasurementDataReady Pointer to Measurement Data Ready. + * 0=data not ready, 1 = data ready + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, + uint8_t *pMeasurementDataReady); + +/** + * @brief Wait for device ready for a new measurement command. + * Blocking function. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param MaxLoop Max Number of polling loop (timeout). + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement( + VL53L0X_DEV Dev, + uint32_t MaxLoop); + +/** + * @brief Retrieve the Reference Signal after a measurements + * + * @par Function Description + * Get Reference Signal from last successful Ranging measurement + * This function return a valid value after that you call the + * @a VL53L0X_GetRangingMeasurementData(). + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pMeasurementRefSignal Pointer to the Ref Signal to fill up. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev, + FixPoint1616_t *pMeasurementRefSignal); + +/** + * @brief Retrieve the measurements from device for a given setup + * + * @par Function Description + * Get data from last successful Ranging measurement + * @warning USER should take care about @a VL53L0X_GetNumberOfROIZones() + * before get data. + * PAL will fill a NumberOfROIZones times the corresponding data + * structure used in the measurement function. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pRangingMeasurementData Pointer to the data structure to fill up. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); + +/** + * @brief Retrieve the measurements from device for a given setup + * + * @par Function Description + * Get data from last successful Histogram measurement + * @warning USER should take care about @a VL53L0X_GetNumberOfROIZones() + * before get data. + * PAL will fill a NumberOfROIZones times the corresponding data structure + * used in the measurement function. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param pHistogramMeasurementData Pointer to the histogram data structure. + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData); + +/** + * @brief Performs a single ranging measurement and retrieve the ranging + * measurement data + * + * @par Function Description + * This function will change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING with @a VL53L0X_SetDeviceMode(), + * It performs measurement with @a VL53L0X_PerformSingleMeasurement() + * It get data from last successful Ranging measurement with + * @a VL53L0X_GetRangingMeasurementData. + * Finally it clear the interrupt with @a VL53L0X_ClearInterruptMask(). + * + * @note This function Access to the device + * + * @note This function change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * + * @param Dev Device Handle + * @param pRangingMeasurementData Pointer to the data structure to fill up. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement( + VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); + +/** + * @brief Performs a single histogram measurement and retrieve the histogram + * measurement data + * Is equivalent to VL53L0X_PerformSingleMeasurement + + * VL53L0X_GetHistogramMeasurementData + * + * @par Function Description + * Get data from last successful Ranging measurement. + * This function will clear the interrupt in case of these are enabled. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param pHistogramMeasurementData Pointer to the data structure to fill up. + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement( + VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData); + +/** + * @brief Set the number of ROI Zones to be used for a specific Device + * + * @par Function Description + * Set the number of ROI Zones to be used for a specific Device. + * The programmed value should be less than the max number of ROI Zones given + * with @a VL53L0X_GetMaxNumberOfROIZones(). + * This version of API manage only one zone. + * + * @param Dev Device Handle + * @param NumberOfROIZones Number of ROI Zones to be used for a + * specific Device. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned if + * NumberOfROIZones != 1 + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t NumberOfROIZones); + +/** + * @brief Get the number of ROI Zones managed by the Device + * + * @par Function Description + * Get number of ROI Zones managed by the Device + * USER should take care about @a VL53L0X_GetNumberOfROIZones() + * before get data after a perform measurement. + * PAL will fill a NumberOfROIZones times the corresponding data + * structure used in the measurement function. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pNumberOfROIZones Pointer to the Number of ROI Zones value. + * @return VL53L0X_ERROR_NONE Success + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pNumberOfROIZones); + +/** + * @brief Get the Maximum number of ROI Zones managed by the Device + * + * @par Function Description + * Get Maximum number of ROI Zones managed by the Device. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pMaxNumberOfROIZones Pointer to the Maximum Number + * of ROI Zones value. + * @return VL53L0X_ERROR_NONE Success + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pMaxNumberOfROIZones); + +/** @} VL53L0X_measurement_group */ + +/** @defgroup VL53L0X_interrupt_group VL53L0X Interrupt Functions + * @brief Functions used for interrupt managements + * @{ + */ + +/** + * @brief Set the configuration of GPIO pin for a given device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param Pin ID of the GPIO Pin + * @param Functionality Select Pin functionality. + * Refer to ::VL53L0X_GpioFunctionality + * @param DeviceMode Device Mode associated to the Gpio. + * @param Polarity Set interrupt polarity. Active high + * or active low see ::VL53L0X_InterruptPolarity + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_GPIO_NOT_EXISTING Only Pin=0 is accepted + * @return VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED This error occurs + * when Functionality programmed is not in the supported list: + * Supported value are: + * VL53L0X_GPIOFUNCTIONALITY_OFF, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH, + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT, + * VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity); + +/** + * @brief Get current configuration for GPIO pin for a given device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param Pin ID of the GPIO Pin + * @param pDeviceMode Pointer to Device Mode associated to the Gpio. + * @param pFunctionality Pointer to Pin functionality. + * Refer to ::VL53L0X_GpioFunctionality + * @param pPolarity Pointer to interrupt polarity. + * Active high or active low see ::VL53L0X_InterruptPolarity + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_GPIO_NOT_EXISTING Only Pin=0 is accepted + * @return VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED This error occurs + * when Functionality programmed is not in the supported list: + * Supported value are: + * VL53L0X_GPIOFUNCTIONALITY_OFF, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT, + * VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes * pDeviceMode, + VL53L0X_GpioFunctionality * pFunctionality, + VL53L0X_InterruptPolarity * pPolarity); + +/** + * @brief Set low and high Interrupt thresholds for a given mode + * (ranging, ALS, ...) for a given device + * + * @par Function Description + * Set low and high Interrupt thresholds for a given mode (ranging, ALS, ...) + * for a given device + * + * @note This function Access to the device + * + * @note DeviceMode is ignored for the current device + * + * @param Dev Device Handle + * @param DeviceMode Device Mode for which change thresholds + * @param ThresholdLow Low threshold (mm, lux ..., depending on the mode) + * @param ThresholdHigh High threshold (mm, lux ..., depending on the mode) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, + FixPoint1616_t ThresholdHigh); + +/** + * @brief Get high and low Interrupt thresholds for a given mode + * (ranging, ALS, ...) for a given device + * + * @par Function Description + * Get high and low Interrupt thresholds for a given mode (ranging, ALS, ...) + * for a given device + * + * @note This function Access to the device + * + * @note DeviceMode is ignored for the current device + * + * @param Dev Device Handle + * @param DeviceMode Device Mode from which read thresholds + * @param pThresholdLow Low threshold (mm, lux ..., depending on the mode) + * @param pThresholdHigh High threshold (mm, lux ..., depending on the mode) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh); + +/** + * @brief Return device stop completion status + * + * @par Function Description + * Returns stop completiob status. + * User shall call this function after a stop command + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pStopStatus Pointer to status variable to update + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev, + uint32_t *pStopStatus); + + +/** + * @brief Clear given system interrupt condition + * + * @par Function Description + * Clear given interrupt(s). + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param InterruptMask Mask of interrupts to clear + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INTERRUPT_NOT_CLEARED Cannot clear interrupts + * + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask); + +/** + * @brief Return device interrupt status + * + * @par Function Description + * Returns currently raised interrupts by the device. + * User shall be able to activate/deactivate interrupts through + * @a VL53L0X_SetGpioConfig() + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pInterruptMaskStatus Pointer to status variable to update + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, + uint32_t *pInterruptMaskStatus); + +/** + * @brief Configure ranging interrupt reported to system + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param InterruptMask Mask of interrupt to Enable/disable + * (0:interrupt disabled or 1: interrupt enabled) + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask); + +/** @} VL53L0X_interrupt_group */ + +/** @defgroup VL53L0X_SPADfunctions_group VL53L0X SPAD Functions + * @brief Functions used for SPAD managements + * @{ + */ + +/** + * @brief Set the SPAD Ambient Damper Threshold value + * + * @par Function Description + * This function set the SPAD Ambient Damper Threshold value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param SpadAmbientDamperThreshold SPAD Ambient Damper Threshold value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperThreshold); + +/** + * @brief Get the current SPAD Ambient Damper Threshold value + * + * @par Function Description + * This function get the SPAD Ambient Damper Threshold value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pSpadAmbientDamperThreshold Pointer to programmed + * SPAD Ambient Damper Threshold value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperThreshold); + +/** + * @brief Set the SPAD Ambient Damper Factor value + * + * @par Function Description + * This function set the SPAD Ambient Damper Factor value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param SpadAmbientDamperFactor SPAD Ambient Damper Factor value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperFactor); + +/** + * @brief Get the current SPAD Ambient Damper Factor value + * + * @par Function Description + * This function get the SPAD Ambient Damper Factor value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pSpadAmbientDamperFactor Pointer to programmed SPAD Ambient + * Damper Factor value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperFactor); + +/** + * @brief Performs Reference Spad Management + * + * @par Function Description + * The reference SPAD initialization procedure determines the minimum amount + * of reference spads to be enables to achieve a target reference signal rate + * and should be performed once during initialization. + * + * @note This function Access to the device + * + * @note This function change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * + * @param Dev Device Handle + * @param refSpadCount Reports ref Spad Count + * @param isApertureSpads Reports if spads are of type + * aperture or non-aperture. + * 1:=aperture, 0:=Non-Aperture + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the Ref Spad procedure. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads); + +/** + * @brief Applies Reference SPAD configuration + * + * @par Function Description + * This function applies a given number of reference spads, identified as + * either Aperture or Non-Aperture. + * The requested spad count and type are stored within the device specific + * parameters data for access by the host. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param refSpadCount Number of ref spads. + * @param isApertureSpads Defines if spads are of type + * aperture or non-aperture. + * 1:=aperture, 0:=Non-Aperture + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the in the reference + * spad configuration. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, + uint32_t refSpadCount, uint8_t isApertureSpads); + +/** + * @brief Retrieves SPAD configuration + * + * @par Function Description + * This function retrieves the current number of applied reference spads + * and also their type : Aperture or Non-Aperture. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param refSpadCount Number ref Spad Count + * @param isApertureSpads Reports if spads are of type + * aperture or non-aperture. + * 1:=aperture, 0:=Non-Aperture + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the in the reference + * spad configuration. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads); + +/** @} VL53L0X_SPADfunctions_group */ + +/** @} VL53L0X_cut11_group */ + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" new file mode 100644 index 00000000..8fe3cf8a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef _VL53L0X_API_CALIBRATION_H_ +#define _VL53L0X_API_CALIBRATION_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +VL53L0X_Error VL53L0X_perform_xtalk_calibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps); + +VL53L0X_Error VL53L0X_perform_offset_calibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, + int32_t *pOffsetMicroMeter); + +VL53L0X_Error VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t OffsetCalibrationDataMicroMeter); + +VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter); + +VL53L0X_Error VL53L0X_apply_offset_adjustment(VL53L0X_DEV Dev); + +VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads); + +VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, + uint32_t count, uint8_t isApertureSpads); + +VL53L0X_Error VL53L0X_get_reference_spads(VL53L0X_DEV Dev, + uint32_t *pSpadCount, uint8_t *pIsApertureSpads); + +VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, + uint8_t *pPhaseCal, const uint8_t get_data_enable, + const uint8_t restore_config); + +VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable); + +VL53L0X_Error VL53L0X_set_ref_calibration(VL53L0X_DEV Dev, + uint8_t VhvSettings, uint8_t PhaseCal); + +VL53L0X_Error VL53L0X_get_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal); + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_CALIBRATION_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" new file mode 100644 index 00000000..676cfb9d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef _VL53L0X_API_CORE_H_ +#define _VL53L0X_API_CORE_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +VL53L0X_Error VL53L0X_reverse_bytes(uint8_t *data, uint32_t size); + +VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev); + +uint8_t VL53L0X_encode_vcsel_period(uint8_t vcsel_period_pclks); + +uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg); + +uint32_t VL53L0X_isqrt(uint32_t num); + +uint32_t VL53L0X_quadrature_sum(uint32_t a, uint32_t b); + +VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option); + +VL53L0X_Error VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK); + +VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK); + +uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout); + +VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t *pTimeOutMicroSecs); + +VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t TimeOutMicroSecs); + +VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds); + +VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds); + +VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer); + +VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *pSigmaEstimate); + +VL53L0X_Error VL53L0X_calc_dmax( + VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm); + +VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_xtalk_rate_mcps); + +VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_signal_rate_mcps); + +VL53L0X_Error VL53L0X_get_pal_range_status(VL53L0X_DEV Dev, + uint8_t DeviceRangeStatus, + FixPoint1616_t SignalRate, + uint16_t EffectiveSpadRtnCount, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + uint8_t *pPalRangeStatus); + +uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, + uint32_t timeout_period_us, uint8_t vcsel_period_pclks); + +uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks); + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_CORE_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" new file mode 100644 index 00000000..18ac3991 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef _VL53L0X_API_RANGING_H_ +#define _VL53L0X_API_RANGING_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_RANGING_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" new file mode 100644 index 00000000..eeed00c3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" @@ -0,0 +1,278 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef VL53L0X_API_STRINGS_H_ +#define VL53L0X_API_STRINGS_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo); + +VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode, + char *pDeviceErrorString); + +VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus, + char *pRangeStatusString); + +VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode, + char *pPalErrorString); + +VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode, + char *pPalStateString); + +VL53L0X_Error VL53L0X_get_sequence_steps_info( + VL53L0X_SequenceStepId SequenceStepId, + char *pSequenceStepsString); + +VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + char *pLimitCheckString); + + +#ifdef USE_EMPTY_STRING + #define VL53L0X_STRING_DEVICE_INFO_NAME "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS0 "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS1 "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS2 "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_ES1 "" + #define VL53L0X_STRING_DEVICE_INFO_TYPE "" + + /* PAL ERROR strings */ + #define VL53L0X_STRING_ERROR_NONE "" + #define VL53L0X_STRING_ERROR_CALIBRATION_WARNING "" + #define VL53L0X_STRING_ERROR_MIN_CLIPPED "" + #define VL53L0X_STRING_ERROR_UNDEFINED "" + #define VL53L0X_STRING_ERROR_INVALID_PARAMS "" + #define VL53L0X_STRING_ERROR_NOT_SUPPORTED "" + #define VL53L0X_STRING_ERROR_RANGE_ERROR "" + #define VL53L0X_STRING_ERROR_TIME_OUT "" + #define VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED "" + #define VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL "" + #define VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING "" + #define VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED "" + #define VL53L0X_STRING_ERROR_CONTROL_INTERFACE "" + #define VL53L0X_STRING_ERROR_INVALID_COMMAND "" + #define VL53L0X_STRING_ERROR_DIVISION_BY_ZERO "" + #define VL53L0X_STRING_ERROR_REF_SPAD_INIT "" + #define VL53L0X_STRING_ERROR_NOT_IMPLEMENTED "" + + #define VL53L0X_STRING_UNKNOW_ERROR_CODE "" + + + + /* Range Status */ + #define VL53L0X_STRING_RANGESTATUS_NONE "" + #define VL53L0X_STRING_RANGESTATUS_RANGEVALID "" + #define VL53L0X_STRING_RANGESTATUS_SIGMA "" + #define VL53L0X_STRING_RANGESTATUS_SIGNAL "" + #define VL53L0X_STRING_RANGESTATUS_MINRANGE "" + #define VL53L0X_STRING_RANGESTATUS_PHASE "" + #define VL53L0X_STRING_RANGESTATUS_HW "" + + + /* Range Status */ + #define VL53L0X_STRING_STATE_POWERDOWN "" + #define VL53L0X_STRING_STATE_WAIT_STATICINIT "" + #define VL53L0X_STRING_STATE_STANDBY "" + #define VL53L0X_STRING_STATE_IDLE "" + #define VL53L0X_STRING_STATE_RUNNING "" + #define VL53L0X_STRING_STATE_UNKNOWN "" + #define VL53L0X_STRING_STATE_ERROR "" + + + /* Device Specific */ + #define VL53L0X_STRING_DEVICEERROR_NONE "" + #define VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE "" + #define VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE "" + #define VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND "" + #define VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET "" + #define VL53L0X_STRING_DEVICEERROR_SNRCHECK "" + #define VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK "" + #define VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK "" + #define VL53L0X_STRING_DEVICEERROR_TCC "" + #define VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY "" + #define VL53L0X_STRING_DEVICEERROR_MINCLIP "" + #define VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE "" + #define VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW "" + #define VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW "" + #define VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD "" + #define VL53L0X_STRING_DEVICEERROR_UNKNOWN "" + + /* Check Enable */ + #define VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE "" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE "" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP "" + #define VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD "" + + /* Sequence Step */ + #define VL53L0X_STRING_SEQUENCESTEP_TCC "" + #define VL53L0X_STRING_SEQUENCESTEP_DSS "" + #define VL53L0X_STRING_SEQUENCESTEP_MSRC "" + #define VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE "" + #define VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE "" +#else + #define VL53L0X_STRING_DEVICE_INFO_NAME "VL53L0X cut1.0" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS0 "VL53L0X TS0" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS1 "VL53L0X TS1" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS2 "VL53L0X TS2" + #define VL53L0X_STRING_DEVICE_INFO_NAME_ES1 "VL53L0X ES1 or later" + #define VL53L0X_STRING_DEVICE_INFO_TYPE "VL53L0X" + + /* PAL ERROR strings */ + #define VL53L0X_STRING_ERROR_NONE \ + "No Error" + #define VL53L0X_STRING_ERROR_CALIBRATION_WARNING \ + "Calibration Warning Error" + #define VL53L0X_STRING_ERROR_MIN_CLIPPED \ + "Min clipped error" + #define VL53L0X_STRING_ERROR_UNDEFINED \ + "Undefined error" + #define VL53L0X_STRING_ERROR_INVALID_PARAMS \ + "Invalid parameters error" + #define VL53L0X_STRING_ERROR_NOT_SUPPORTED \ + "Not supported error" + #define VL53L0X_STRING_ERROR_RANGE_ERROR \ + "Range error" + #define VL53L0X_STRING_ERROR_TIME_OUT \ + "Time out error" + #define VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED \ + "Mode not supported error" + #define VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL \ + "Buffer too small" + #define VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING \ + "GPIO not existing" + #define VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED \ + "GPIO funct not supported" + #define VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED \ + "Interrupt not Cleared" + #define VL53L0X_STRING_ERROR_CONTROL_INTERFACE \ + "Control Interface Error" + #define VL53L0X_STRING_ERROR_INVALID_COMMAND \ + "Invalid Command Error" + #define VL53L0X_STRING_ERROR_DIVISION_BY_ZERO \ + "Division by zero Error" + #define VL53L0X_STRING_ERROR_REF_SPAD_INIT \ + "Reference Spad Init Error" + #define VL53L0X_STRING_ERROR_NOT_IMPLEMENTED \ + "Not implemented error" + + #define VL53L0X_STRING_UNKNOW_ERROR_CODE \ + "Unknown Error Code" + + + + /* Range Status */ + #define VL53L0X_STRING_RANGESTATUS_NONE "No Update" + #define VL53L0X_STRING_RANGESTATUS_RANGEVALID "Range Valid" + #define VL53L0X_STRING_RANGESTATUS_SIGMA "Sigma Fail" + #define VL53L0X_STRING_RANGESTATUS_SIGNAL "Signal Fail" + #define VL53L0X_STRING_RANGESTATUS_MINRANGE "Min Range Fail" + #define VL53L0X_STRING_RANGESTATUS_PHASE "Phase Fail" + #define VL53L0X_STRING_RANGESTATUS_HW "Hardware Fail" + + + /* Range Status */ + #define VL53L0X_STRING_STATE_POWERDOWN "POWERDOWN State" + #define VL53L0X_STRING_STATE_WAIT_STATICINIT \ + "Wait for staticinit State" + #define VL53L0X_STRING_STATE_STANDBY "STANDBY State" + #define VL53L0X_STRING_STATE_IDLE "IDLE State" + #define VL53L0X_STRING_STATE_RUNNING "RUNNING State" + #define VL53L0X_STRING_STATE_UNKNOWN "UNKNOWN State" + #define VL53L0X_STRING_STATE_ERROR "ERROR State" + + + /* Device Specific */ + #define VL53L0X_STRING_DEVICEERROR_NONE "No Update" + #define VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE \ + "VCSEL Continuity Test Failure" + #define VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE \ + "VCSEL Watchdog Test Failure" + #define VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND \ + "No VHV Value found" + #define VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET \ + "MSRC No Target Error" + #define VL53L0X_STRING_DEVICEERROR_SNRCHECK \ + "SNR Check Exit" + #define VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK \ + "Range Phase Check Error" + #define VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK \ + "Sigma Threshold Check Error" + #define VL53L0X_STRING_DEVICEERROR_TCC \ + "TCC Error" + #define VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY \ + "Phase Consistency Error" + #define VL53L0X_STRING_DEVICEERROR_MINCLIP \ + "Min Clip Error" + #define VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE \ + "Range Complete" + #define VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW \ + "Range Algo Underflow Error" + #define VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW \ + "Range Algo Overlow Error" + #define VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD \ + "Range Ignore Threshold Error" + #define VL53L0X_STRING_DEVICEERROR_UNKNOWN \ + "Unknown error code" + + /* Check Enable */ + #define VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE \ + "SIGMA FINAL RANGE" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE \ + "SIGNAL RATE FINAL RANGE" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP \ + "SIGNAL REF CLIP" + #define VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD \ + "RANGE IGNORE THRESHOLD" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC \ + "SIGNAL RATE MSRC" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE \ + "SIGNAL RATE PRE RANGE" + + /* Sequence Step */ + #define VL53L0X_STRING_SEQUENCESTEP_TCC "TCC" + #define VL53L0X_STRING_SEQUENCESTEP_DSS "DSS" + #define VL53L0X_STRING_SEQUENCESTEP_MSRC "MSRC" + #define VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE "PRE RANGE" + #define VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE "FINAL RANGE" +#endif /* USE_EMPTY_STRING */ + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" new file mode 100644 index 00000000..b67a1dba --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" @@ -0,0 +1,663 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 VL53L0X_def.h + * + * @brief Type definitions for VL53L0X API. + * + */ + + +#ifndef _VL53L0X_DEF_H_ +#define _VL53L0X_DEF_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup VL53L0X_globaldefine_group VL53L0X Defines + * @brief VL53L0X Defines + * @{ + */ + + +/** PAL SPECIFICATION major version */ +#define VL53L0X10_SPECIFICATION_VER_MAJOR 1 +/** PAL SPECIFICATION minor version */ +#define VL53L0X10_SPECIFICATION_VER_MINOR 2 +/** PAL SPECIFICATION sub version */ +#define VL53L0X10_SPECIFICATION_VER_SUB 7 +/** PAL SPECIFICATION sub version */ +#define VL53L0X10_SPECIFICATION_VER_REVISION 1440 + +/** VL53L0X PAL IMPLEMENTATION major version */ +#define VL53L0X10_IMPLEMENTATION_VER_MAJOR 1 +/** VL53L0X PAL IMPLEMENTATION minor version */ +#define VL53L0X10_IMPLEMENTATION_VER_MINOR 0 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X10_IMPLEMENTATION_VER_SUB 9 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X10_IMPLEMENTATION_VER_REVISION 3673 + +/** PAL SPECIFICATION major version */ +#define VL53L0X_SPECIFICATION_VER_MAJOR 1 +/** PAL SPECIFICATION minor version */ +#define VL53L0X_SPECIFICATION_VER_MINOR 2 +/** PAL SPECIFICATION sub version */ +#define VL53L0X_SPECIFICATION_VER_SUB 7 +/** PAL SPECIFICATION sub version */ +#define VL53L0X_SPECIFICATION_VER_REVISION 1440 + +/** VL53L0X PAL IMPLEMENTATION major version */ +#define VL53L0X_IMPLEMENTATION_VER_MAJOR 1 +/** VL53L0X PAL IMPLEMENTATION minor version */ +#define VL53L0X_IMPLEMENTATION_VER_MINOR 0 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X_IMPLEMENTATION_VER_SUB 4 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X_IMPLEMENTATION_VER_REVISION 4960 +#define VL53L0X_DEFAULT_MAX_LOOP 2000 +#define VL53L0X_MAX_STRING_LENGTH 32 + + +#include "vl53l0x_device.h" +#include "vl53l0x_types.h" + + +/**************************************** + * PRIVATE define do not edit + ****************************************/ + +/** @brief Defines the parameters of the Get Version Functions + */ +typedef struct { + uint32_t revision; /*!< revision number */ + uint8_t major; /*!< major number */ + uint8_t minor; /*!< minor number */ + uint8_t build; /*!< build number */ +} VL53L0X_Version_t; + + +/** @brief Defines the parameters of the Get Device Info Functions + */ +typedef struct { + char Name[VL53L0X_MAX_STRING_LENGTH]; + /*!< Name of the Device e.g. Left_Distance */ + char Type[VL53L0X_MAX_STRING_LENGTH]; + /*!< Type of the Device e.g VL53L0X */ + char ProductId[VL53L0X_MAX_STRING_LENGTH]; + /*!< Product Identifier String */ + uint8_t ProductType; + /*!< Product Type, VL53L0X = 1, VL53L1 = 2 */ + uint8_t ProductRevisionMajor; + /*!< Product revision major */ + uint8_t ProductRevisionMinor; + /*!< Product revision minor */ +} VL53L0X_DeviceInfo_t; + + +/** @defgroup VL53L0X_define_Error_group Error and Warning code returned by API + * The following DEFINE are used to identify the PAL ERROR + * @{ + */ + +typedef int8_t VL53L0X_Error; + +#define VL53L0X_ERROR_NONE ((VL53L0X_Error) 0) +#define VL53L0X_ERROR_CALIBRATION_WARNING ((VL53L0X_Error) - 1) + /*!< Warning invalid calibration data may be in used + * \a VL53L0X_InitData() + * \a VL53L0X_GetOffsetCalibrationData + * \a VL53L0X_SetOffsetCalibrationData + */ +#define VL53L0X_ERROR_MIN_CLIPPED ((VL53L0X_Error) - 2) + /*!< Warning parameter passed was clipped to min before to be applied */ + +#define VL53L0X_ERROR_UNDEFINED ((VL53L0X_Error) - 3) + /*!< Unqualified error */ +#define VL53L0X_ERROR_INVALID_PARAMS ((VL53L0X_Error) - 4) + /*!< Parameter passed is invalid or out of range */ +#define VL53L0X_ERROR_NOT_SUPPORTED ((VL53L0X_Error) - 5) + /*!< Function is not supported in current mode or configuration */ +#define VL53L0X_ERROR_RANGE_ERROR ((VL53L0X_Error) - 6) + /*!< Device report a ranging error interrupt status */ +#define VL53L0X_ERROR_TIME_OUT ((VL53L0X_Error) - 7) + /*!< Aborted due to time out */ +#define VL53L0X_ERROR_MODE_NOT_SUPPORTED ((VL53L0X_Error) - 8) + /*!< Asked mode is not supported by the device */ +#define VL53L0X_ERROR_BUFFER_TOO_SMALL ((VL53L0X_Error) - 9) + /*!< ... */ +#define VL53L0X_ERROR_GPIO_NOT_EXISTING ((VL53L0X_Error) - 10) + /*!< User tried to setup a non-existing GPIO pin */ +#define VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED ((VL53L0X_Error) - 11) + /*!< unsupported GPIO functionality */ +#define VL53L0X_ERROR_INTERRUPT_NOT_CLEARED ((VL53L0X_Error) - 12) + /*!< Error during interrupt clear */ +#define VL53L0X_ERROR_CONTROL_INTERFACE ((VL53L0X_Error) - 20) + /*!< error reported from IO functions */ +#define VL53L0X_ERROR_INVALID_COMMAND ((VL53L0X_Error) - 30) + /*!< The command is not allowed in the current device state + * (power down) + */ +#define VL53L0X_ERROR_DIVISION_BY_ZERO ((VL53L0X_Error) - 40) + /*!< In the function a division by zero occurs */ +#define VL53L0X_ERROR_REF_SPAD_INIT ((VL53L0X_Error) - 50) + /*!< Error during reference SPAD initialization */ +#define VL53L0X_ERROR_NOT_IMPLEMENTED ((VL53L0X_Error) - 99) + /*!< Tells requested functionality has not been implemented yet or + * not compatible with the device + */ +/** @} VL53L0X_define_Error_group */ + + +/** @defgroup VL53L0X_define_DeviceModes_group Defines Device modes + * Defines all possible modes for the device + * @{ + */ +typedef uint8_t VL53L0X_DeviceModes; + +#define VL53L0X_DEVICEMODE_SINGLE_RANGING ((VL53L0X_DeviceModes) 0) +#define VL53L0X_DEVICEMODE_CONTINUOUS_RANGING ((VL53L0X_DeviceModes) 1) +#define VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM ((VL53L0X_DeviceModes) 2) +#define VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING ((VL53L0X_DeviceModes) 3) +#define VL53L0X_DEVICEMODE_SINGLE_ALS ((VL53L0X_DeviceModes) 10) +#define VL53L0X_DEVICEMODE_GPIO_DRIVE ((VL53L0X_DeviceModes) 20) +#define VL53L0X_DEVICEMODE_GPIO_OSC ((VL53L0X_DeviceModes) 21) + /* ... Modes to be added depending on device */ +/** @} VL53L0X_define_DeviceModes_group */ + + + +/** @defgroup VL53L0X_define_HistogramModes_group Defines Histogram modes + * Defines all possible Histogram modes for the device + * @{ + */ +typedef uint8_t VL53L0X_HistogramModes; + +#define VL53L0X_HISTOGRAMMODE_DISABLED ((VL53L0X_HistogramModes) 0) + /*!< Histogram Disabled */ +#define VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY ((VL53L0X_HistogramModes) 1) + /*!< Histogram Reference array only */ +#define VL53L0X_HISTOGRAMMODE_RETURN_ONLY ((VL53L0X_HistogramModes) 2) + /*!< Histogram Return array only */ +#define VL53L0X_HISTOGRAMMODE_BOTH ((VL53L0X_HistogramModes) 3) + /*!< Histogram both Reference and Return Arrays */ + /* ... Modes to be added depending on device */ +/** @} VL53L0X_define_HistogramModes_group */ + + +/** @defgroup VL53L0X_define_PowerModes_group List of available Power Modes + * List of available Power Modes + * @{ + */ + +typedef uint8_t VL53L0X_PowerModes; + +#define VL53L0X_POWERMODE_STANDBY_LEVEL1 ((VL53L0X_PowerModes) 0) + /*!< Standby level 1 */ +#define VL53L0X_POWERMODE_STANDBY_LEVEL2 ((VL53L0X_PowerModes) 1) + /*!< Standby level 2 */ +#define VL53L0X_POWERMODE_IDLE_LEVEL1 ((VL53L0X_PowerModes) 2) + /*!< Idle level 1 */ +#define VL53L0X_POWERMODE_IDLE_LEVEL2 ((VL53L0X_PowerModes) 3) + /*!< Idle level 2 */ + +/** @} VL53L0X_define_PowerModes_group */ + + +#define VL53L0X_DMAX_LUT_SIZE 7 + /*!< Defines the number of items in the DMAX lookup table */ + +/** @brief Structure defining data pair that makes up the DMAX Lookup table. + */ +typedef struct { + FixPoint1616_t ambRate_mcps[VL53L0X_DMAX_LUT_SIZE]; + /*!< Ambient rate (mcps) */ + FixPoint1616_t dmax_mm[VL53L0X_DMAX_LUT_SIZE]; + /*!< DMAX Value (mm) */ +} VL53L0X_DMaxLUT_t; + +/** @brief Defines all parameters for the device + */ +typedef struct { + VL53L0X_DeviceModes DeviceMode; + /*!< Defines type of measurement to be done for the next measure */ + VL53L0X_HistogramModes HistogramMode; + /*!< Defines type of histogram measurement to be done for the next + * measure + */ + uint32_t MeasurementTimingBudgetMicroSeconds; + /*!< Defines the allowed total time for a single measurement */ + uint32_t InterMeasurementPeriodMilliSeconds; + /*!< Defines time between two consecutive measurements (between two + * measurement starts). If set to 0 means back-to-back mode + */ + uint8_t XTalkCompensationEnable; + /*!< Tells if Crosstalk compensation shall be enable or not */ + uint16_t XTalkCompensationRangeMilliMeter; + /*!< CrossTalk compensation range in millimeter */ + FixPoint1616_t XTalkCompensationRateMegaCps; + /*!< CrossTalk compensation rate in Mega counts per seconds. + * Expressed in 16.16 fixed point format. + */ + int32_t RangeOffsetMicroMeters; + /*!< Range offset adjustment (mm). */ + + uint8_t LimitChecksEnable[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; + /*!< This Array store all the Limit Check enable for this device. */ + uint8_t LimitChecksStatus[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; + /*!< This Array store all the Status of the check linked to last + * measurement. + */ + FixPoint1616_t LimitChecksValue[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; + /*!< This Array store all the Limit Check value for this device */ + + VL53L0X_DMaxLUT_t dmax_lut; + /*!< Lookup table defining ambient rates and associated + * dmax values. + */ + + uint8_t WrapAroundCheckEnable; + /*!< Tells if Wrap Around Check shall be enable or not */ +} VL53L0X_DeviceParameters_t; + + +/** @defgroup VL53L0X_define_State_group Defines the current status + * of the device + * Defines the current status of the device + * @{ + */ + +typedef uint8_t VL53L0X_State; + +#define VL53L0X_STATE_POWERDOWN ((VL53L0X_State) 0) + /*!< Device is in HW reset */ +#define VL53L0X_STATE_WAIT_STATICINIT ((VL53L0X_State) 1) + /*!< Device is initialized and wait for static initialization */ +#define VL53L0X_STATE_STANDBY ((VL53L0X_State) 2) + /*!< Device is in Low power Standby mode */ +#define VL53L0X_STATE_IDLE ((VL53L0X_State) 3) + /*!< Device has been initialized and ready to do measurements */ +#define VL53L0X_STATE_RUNNING ((VL53L0X_State) 4) + /*!< Device is performing measurement */ +#define VL53L0X_STATE_UNKNOWN ((VL53L0X_State) 98) + /*!< Device is in unknown state and need to be rebooted */ +#define VL53L0X_STATE_ERROR ((VL53L0X_State) 99) + /*!< Device is in error state and need to be rebooted */ + +/** @} VL53L0X_define_State_group */ + + +/** + * @struct VL53L0X_RangeData_t + * @brief Range measurement data. + */ +typedef struct { + uint32_t TimeStamp; /*!< 32-bit time stamp. */ + uint32_t MeasurementTimeUsec; + /*!< Give the Measurement time needed by the device to do the + * measurement. + */ + + + uint16_t RangeMilliMeter; /*!< range distance in millimeter. */ + + uint16_t RangeDMaxMilliMeter; + /*!< Tells what is the maximum detection distance of the device + * in current setup and environment conditions (Filled when + * applicable) + */ + + FixPoint1616_t SignalRateRtnMegaCps; + /*!< Return signal rate (MCPS)\n these is a 16.16 fix point + * value, which is effectively a measure of target + * reflectance. + */ + FixPoint1616_t AmbientRateRtnMegaCps; + /*!< Return ambient rate (MCPS)\n these is a 16.16 fix point + * value, which is effectively a measure of the ambien + * t light. + */ + + uint16_t EffectiveSpadRtnCount; + /*!< Return the effective SPAD count for the return signal. + * To obtain Real value it should be divided by 256 + */ + + uint8_t ZoneId; + /*!< Denotes which zone and range scheduler stage the range + * data relates to. + */ + uint8_t RangeFractionalPart; + /*!< Fractional part of range distance. Final value is a + * FixPoint168 value. + */ + uint8_t RangeStatus; + /*!< Range Status for the current measurement. This is device + * dependent. Value = 0 means value is valid. + * See \ref RangeStatusPage + */ +} VL53L0X_RangingMeasurementData_t; + + +#define VL53L0X_HISTOGRAM_BUFFER_SIZE 24 + +/** + * @struct VL53L0X_HistogramData_t + * @brief Histogram measurement data. + */ +typedef struct { + /* Histogram Measurement data */ + uint32_t HistogramData[VL53L0X_HISTOGRAM_BUFFER_SIZE]; + /*!< Histogram data */ + /*!< Indicate the types of histogram data : + *Return only, Reference only, both Return and Reference + */ + uint8_t FirstBin; /*!< First Bin value */ + uint8_t BufferSize; /*!< Buffer Size - Set by the user.*/ + uint8_t NumberOfBins; + /*!< Number of bins filled by the histogram measurement */ + + VL53L0X_DeviceError ErrorStatus; + /*!< Error status of the current measurement. \n + * see @a ::VL53L0X_DeviceError @a VL53L0X_GetStatusErrorString() + */ +} VL53L0X_HistogramMeasurementData_t; + +#define VL53L0X_REF_SPAD_BUFFER_SIZE 6 + +/** + * @struct VL53L0X_SpadData_t + * @brief Spad Configuration Data. + */ +typedef struct { + uint8_t RefSpadEnables[VL53L0X_REF_SPAD_BUFFER_SIZE]; + /*!< Reference Spad Enables */ + uint8_t RefGoodSpadMap[VL53L0X_REF_SPAD_BUFFER_SIZE]; + /*!< Reference Spad Good Spad Map */ +} VL53L0X_SpadData_t; + +typedef struct { + FixPoint1616_t OscFrequencyMHz; /* Frequency used */ + + uint16_t LastEncodedTimeout; + /* last encoded Time out used for timing budget*/ + + VL53L0X_GpioFunctionality Pin0GpioFunctionality; + /* store the functionality of the GPIO: pin0 */ + + uint32_t FinalRangeTimeoutMicroSecs; + /*!< Execution time of the final range*/ + uint8_t FinalRangeVcselPulsePeriod; + /*!< Vcsel pulse period (pll clocks) for the final range measurement*/ + uint32_t PreRangeTimeoutMicroSecs; + /*!< Execution time of the final range*/ + uint8_t PreRangeVcselPulsePeriod; + /*!< Vcsel pulse period (pll clocks) for the pre-range measurement*/ + + uint16_t SigmaEstRefArray; + /*!< Reference array sigma value in 1/100th of [mm] e.g. 100 = 1mm */ + uint16_t SigmaEstEffPulseWidth; + /*!< Effective Pulse width for sigma estimate in 1/100th + * of ns e.g. 900 = 9.0ns + */ + uint16_t SigmaEstEffAmbWidth; + /*!< Effective Ambient width for sigma estimate in 1/100th of ns + * e.g. 500 = 5.0ns + */ + + + /* Indicate if read from device has been done (==1) or not (==0) */ + uint8_t ReadDataFromDeviceDone; + uint8_t ModuleId; /* Module ID */ + uint8_t Revision; /* test Revision */ + char ProductId[VL53L0X_MAX_STRING_LENGTH]; + /* Product Identifier String */ + uint8_t ReferenceSpadCount; /* used for ref spad management */ + uint8_t ReferenceSpadType; /* used for ref spad management */ + uint8_t RefSpadsInitialised; /* reports if ref spads are initialised. */ + uint32_t PartUIDUpper; /*!< Unique Part ID Upper */ + uint32_t PartUIDLower; /*!< Unique Part ID Lower */ + /*!< Peek Signal rate at 400 mm*/ + FixPoint1616_t SignalRateMeasFixed400mm; + +} VL53L0X_DeviceSpecificParameters_t; + +/** + * @struct VL53L0X_DevData_t + * + * @brief VL53L0X PAL device ST private data structure \n + * End user should never access any of these field directly + * + * These must never access directly but only via macro + */ +typedef struct { + int32_t Part2PartOffsetNVMMicroMeter; + /*!< backed up NVM value */ + int32_t Part2PartOffsetAdjustmentNVMMicroMeter; + /*!< backed up NVM value representing additional offset adjustment */ + VL53L0X_DeviceParameters_t CurrentParameters; + /*!< Current Device Parameter */ + VL53L0X_RangingMeasurementData_t LastRangeMeasure; + /*!< Ranging Data */ + VL53L0X_HistogramMeasurementData_t LastHistogramMeasure; + /*!< Histogram Data */ + VL53L0X_DeviceSpecificParameters_t DeviceSpecificParameters; + /*!< Parameters specific to the device */ + VL53L0X_SpadData_t SpadData; + /*!< Spad Data */ + uint8_t SequenceConfig; + /*!< Internal value for the sequence config */ + uint8_t RangeFractionalEnable; + /*!< Enable/Disable fractional part of ranging data */ + VL53L0X_State PalState; + /*!< Current state of the PAL for this device */ + VL53L0X_PowerModes PowerMode; + /*!< Current Power Mode */ + uint16_t SigmaEstRefArray; + /*!< Reference array sigma value in 1/100th of [mm] e.g. 100 = 1mm */ + uint16_t SigmaEstEffPulseWidth; + /*!< Effective Pulse width for sigma estimate in 1/100th + * of ns e.g. 900 = 9.0ns + */ + uint16_t SigmaEstEffAmbWidth; + /*!< Effective Ambient width for sigma estimate in 1/100th of ns + * e.g. 500 = 5.0ns + */ + uint8_t StopVariable; + /*!< StopVariable used during the stop sequence */ + uint16_t targetRefRate; + /*!< Target Ambient Rate for Ref spad management */ + FixPoint1616_t SigmaEstimate; + /*!< Sigma Estimate - based on ambient & VCSEL rates and + * signal_total_events + */ + FixPoint1616_t SignalEstimate; + /*!< Signal Estimate - based on ambient & VCSEL rates and cross talk */ + FixPoint1616_t LastSignalRefMcps; + /*!< Latest Signal ref in Mcps */ + uint8_t *pTuningSettingsPointer; + /*!< Pointer for Tuning Settings table */ + uint8_t UseInternalTuningSettings; + /*!< Indicate if we use Tuning Settings table */ + uint16_t LinearityCorrectiveGain; + /*!< Linearity Corrective Gain value in x1000 */ +} VL53L0X_DevData_t; + + +/** @defgroup VL53L0X_define_InterruptPolarity_group Defines the Polarity + * of the Interrupt + * Defines the Polarity of the Interrupt + * @{ + */ +typedef uint8_t VL53L0X_InterruptPolarity; + +#define VL53L0X_INTERRUPTPOLARITY_LOW ((VL53L0X_InterruptPolarity) 0) +/*!< Set active low polarity best setup for falling edge. */ +#define VL53L0X_INTERRUPTPOLARITY_HIGH ((VL53L0X_InterruptPolarity) 1) +/*!< Set active high polarity best setup for rising edge. */ + +/** @} VL53L0X_define_InterruptPolarity_group */ + + +/** @defgroup VL53L0X_define_VcselPeriod_group Vcsel Period Defines + * Defines the range measurement for which to access the vcsel period. + * @{ + */ +typedef uint8_t VL53L0X_VcselPeriod; + +#define VL53L0X_VCSEL_PERIOD_PRE_RANGE ((VL53L0X_VcselPeriod) 0) +/*!>9)&0xFFFF) +#define VL53L0X_FIXPOINT97TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<9) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT88(Value) \ + (uint16_t)((Value>>8)&0xFFFF) +#define VL53L0X_FIXPOINT88TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<8) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT412(Value) \ + (uint16_t)((Value>>4)&0xFFFF) +#define VL53L0X_FIXPOINT412TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<4) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT313(Value) \ + (uint16_t)((Value>>3)&0xFFFF) +#define VL53L0X_FIXPOINT313TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<3) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT08(Value) \ + (uint8_t)((Value>>8)&0x00FF) +#define VL53L0X_FIXPOINT08TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<8) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT53(Value) \ + (uint8_t)((Value>>13)&0x00FF) +#define VL53L0X_FIXPOINT53TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<13) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT102(Value) \ + (uint16_t)((Value>>14)&0x0FFF) +#define VL53L0X_FIXPOINT102TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<12) + +#define VL53L0X_MAKEUINT16(lsb, msb) (uint16_t)((((uint16_t)msb)<<8) + \ + (uint16_t)lsb) + +/** @} VL53L0X_define_GeneralMacro_group */ + +/** @} VL53L0X_globaldefine_group */ + + + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _VL53L0X_DEF_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" new file mode 100644 index 00000000..f9412411 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" @@ -0,0 +1,262 @@ +/******************************************************************************* + * Copyright � 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +/** + * Device specific defines. To be adapted by implementer for the targeted + * device. + */ + +#ifndef _VL53L0X_DEVICE_H_ +#define _VL53L0X_DEVICE_H_ + +#include "vl53l0x_types.h" + + +/** @defgroup VL53L0X_DevSpecDefines_group VL53L0X cut1.1 Device + * Specific Defines + * @brief VL53L0X cut1.1 Device Specific Defines + * @{ + */ + + +/** @defgroup VL53L0X_DeviceError_group Device Error + * @brief Device Error code + * + * This enum is Device specific it should be updated in the implementation + * Use @a VL53L0X_GetStatusErrorString() to get the string. + * It is related to Status Register of the Device. + * @{ + */ +typedef uint8_t VL53L0X_DeviceError; + +#define VL53L0X_DEVICEERROR_NONE ((VL53L0X_DeviceError) 0) + /*!< 0 NoError */ +#define VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE ((VL53L0X_DeviceError) 1) +#define VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE ((VL53L0X_DeviceError) 2) +#define VL53L0X_DEVICEERROR_NOVHVVALUEFOUND ((VL53L0X_DeviceError) 3) +#define VL53L0X_DEVICEERROR_MSRCNOTARGET ((VL53L0X_DeviceError) 4) +#define VL53L0X_DEVICEERROR_SNRCHECK ((VL53L0X_DeviceError) 5) +#define VL53L0X_DEVICEERROR_RANGEPHASECHECK ((VL53L0X_DeviceError) 6) +#define VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK ((VL53L0X_DeviceError) 7) +#define VL53L0X_DEVICEERROR_TCC ((VL53L0X_DeviceError) 8) +#define VL53L0X_DEVICEERROR_PHASECONSISTENCY ((VL53L0X_DeviceError) 9) +#define VL53L0X_DEVICEERROR_MINCLIP ((VL53L0X_DeviceError) 10) +#define VL53L0X_DEVICEERROR_RANGECOMPLETE ((VL53L0X_DeviceError) 11) +#define VL53L0X_DEVICEERROR_ALGOUNDERFLOW ((VL53L0X_DeviceError) 12) +#define VL53L0X_DEVICEERROR_ALGOOVERFLOW ((VL53L0X_DeviceError) 13) +#define VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD ((VL53L0X_DeviceError) 14) + +/** @} end of VL53L0X_DeviceError_group */ + + +/** @defgroup VL53L0X_CheckEnable_group Check Enable list + * @brief Check Enable code + * + * Define used to specify the LimitCheckId. + * Use @a VL53L0X_GetLimitCheckInfo() to get the string. + * @{ + */ + +#define VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE 0 +#define VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE 1 +#define VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP 2 +#define VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD 3 +#define VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC 4 +#define VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE 5 + +#define VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS 6 + +/** @} end of VL53L0X_CheckEnable_group */ + + +/** @defgroup VL53L0X_GpioFunctionality_group Gpio Functionality + * @brief Defines the different functionalities for the device GPIO(s) + * @{ + */ +typedef uint8_t VL53L0X_GpioFunctionality; + +#define VL53L0X_GPIOFUNCTIONALITY_OFF \ + ((VL53L0X_GpioFunctionality) 0) /*!< NO Interrupt */ +#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW \ + ((VL53L0X_GpioFunctionality) 1) /*!< Level Low (value < thresh_low) */ +#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH \ + ((VL53L0X_GpioFunctionality) 2) /*!< Level High (value>thresh_high) */ +#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT \ + ((VL53L0X_GpioFunctionality) 3) + /*!< Out Of Window (value < thresh_low OR value > thresh_high) */ +#define VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY \ + ((VL53L0X_GpioFunctionality) 4) /*!< New Sample Ready */ + +/** @} end of VL53L0X_GpioFunctionality_group */ + + +/* Device register map */ + +/** @defgroup VL53L0X_DefineRegisters_group Define Registers + * @brief List of all the defined registers + * @{ + */ +#define VL53L0X_REG_SYSRANGE_START 0x000 + /** mask existing bit in #VL53L0X_REG_SYSRANGE_START*/ + #define VL53L0X_REG_SYSRANGE_MODE_MASK 0x0F + /** bit 0 in #VL53L0X_REG_SYSRANGE_START write 1 toggle state in + * continuous mode and arm next shot in single shot mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_START_STOP 0x01 + /** bit 1 write 0 in #VL53L0X_REG_SYSRANGE_START set single shot mode */ + #define VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT 0x00 + /** bit 1 write 1 in #VL53L0X_REG_SYSRANGE_START set back-to-back + * operation mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK 0x02 + /** bit 2 write 1 in #VL53L0X_REG_SYSRANGE_START set timed operation + * mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_TIMED 0x04 + /** bit 3 write 1 in #VL53L0X_REG_SYSRANGE_START set histogram operation + * mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_HISTOGRAM 0x08 + + +#define VL53L0X_REG_SYSTEM_THRESH_HIGH 0x000C +#define VL53L0X_REG_SYSTEM_THRESH_LOW 0x000E + + +#define VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG 0x0001 +#define VL53L0X_REG_SYSTEM_RANGE_CONFIG 0x0009 +#define VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD 0x0004 + + +#define VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO 0x000A + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_DISABLED 0x00 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_LEVEL_LOW 0x01 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_LEVEL_HIGH 0x02 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_OUT_OF_WINDOW 0x03 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY 0x04 + +#define VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH 0x0084 + + +#define VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR 0x000B + +/* Result registers */ +#define VL53L0X_REG_RESULT_INTERRUPT_STATUS 0x0013 +#define VL53L0X_REG_RESULT_RANGE_STATUS 0x0014 + +#define VL53L0X_REG_RESULT_CORE_PAGE 1 +#define VL53L0X_REG_RESULT_CORE_AMBIENT_WINDOW_EVENTS_RTN 0x00BC +#define VL53L0X_REG_RESULT_CORE_RANGING_TOTAL_EVENTS_RTN 0x00C0 +#define VL53L0X_REG_RESULT_CORE_AMBIENT_WINDOW_EVENTS_REF 0x00D0 +#define VL53L0X_REG_RESULT_CORE_RANGING_TOTAL_EVENTS_REF 0x00D4 +#define VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF 0x00B6 + +/* Algo register */ + +#define VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM 0x0028 + +#define VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS 0x008a + +/* Check Limit registers */ +#define VL53L0X_REG_MSRC_CONFIG_CONTROL 0x0060 + +#define VL53L0X_REG_PRE_RANGE_CONFIG_MIN_SNR 0X0027 +#define VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW 0x0056 +#define VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH 0x0057 +#define VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT 0x0064 + +#define VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_SNR 0X0067 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW 0x0047 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH 0x0048 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT 0x0044 + + +#define VL53L0X_REG_PRE_RANGE_CONFIG_SIGMA_THRESH_HI 0X0061 +#define VL53L0X_REG_PRE_RANGE_CONFIG_SIGMA_THRESH_LO 0X0062 + +/* PRE RANGE registers */ +#define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD 0x0050 +#define VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI 0x0051 +#define VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_LO 0x0052 + +#define VL53L0X_REG_SYSTEM_HISTOGRAM_BIN 0x0081 +#define VL53L0X_REG_HISTOGRAM_CONFIG_INITIAL_PHASE_SELECT 0x0033 +#define VL53L0X_REG_HISTOGRAM_CONFIG_READOUT_CTRL 0x0055 + +#define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x0070 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI 0x0071 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_LO 0x0072 +#define VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS 0x0020 + +#define VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP 0x0046 + + +#define VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N 0x00bf +#define VL53L0X_REG_IDENTIFICATION_MODEL_ID 0x00c0 +#define VL53L0X_REG_IDENTIFICATION_REVISION_ID 0x00c2 + +#define VL53L0X_REG_OSC_CALIBRATE_VAL 0x00f8 + + +#define VL53L0X_SIGMA_ESTIMATE_MAX_VALUE 65535 +/* equivalent to a range sigma of 655.35mm */ + +#define VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH 0x032 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0 0x0B0 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_1 0x0B1 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_2 0x0B2 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_3 0x0B3 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_4 0x0B4 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_5 0x0B5 + +#define VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT 0xB6 +#define VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD 0x4E /* 0x14E */ +#define VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET 0x4F /* 0x14F */ +#define VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE 0x80 + +/* + * Speed of light in um per 1E-10 Seconds + */ + +#define VL53L0X_SPEED_OF_LIGHT_IN_AIR 2997 + +#define VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV 0x0089 + +#define VL53L0X_REG_ALGO_PHASECAL_LIM 0x0030 /* 0x130 */ +#define VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT 0x0030 + +/** @} VL53L0X_DefineRegisters_group */ + +/** @} VL53L0X_DevSpecDefines_group */ + + +#endif + +/* _VL53L0X_DEVICE_H_ */ + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" new file mode 100644 index 00000000..d3edb6cc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + + +#ifndef _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ +#define _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +uint8_t InterruptThresholdSettings[] = { + + /* Start of Interrupt Threshold Settings */ + 0x1, 0xff, 0x00, + 0x1, 0x80, 0x01, + 0x1, 0xff, 0x01, + 0x1, 0x00, 0x00, + 0x1, 0xff, 0x01, + 0x1, 0x4f, 0x02, + 0x1, 0xFF, 0x0E, + 0x1, 0x00, 0x03, + 0x1, 0x01, 0x84, + 0x1, 0x02, 0x0A, + 0x1, 0x03, 0x03, + 0x1, 0x04, 0x08, + 0x1, 0x05, 0xC8, + 0x1, 0x06, 0x03, + 0x1, 0x07, 0x8D, + 0x1, 0x08, 0x08, + 0x1, 0x09, 0xC6, + 0x1, 0x0A, 0x01, + 0x1, 0x0B, 0x02, + 0x1, 0x0C, 0x00, + 0x1, 0x0D, 0xD5, + 0x1, 0x0E, 0x18, + 0x1, 0x0F, 0x12, + 0x1, 0x10, 0x01, + 0x1, 0x11, 0x82, + 0x1, 0x12, 0x00, + 0x1, 0x13, 0xD5, + 0x1, 0x14, 0x18, + 0x1, 0x15, 0x13, + 0x1, 0x16, 0x03, + 0x1, 0x17, 0x86, + 0x1, 0x18, 0x0A, + 0x1, 0x19, 0x09, + 0x1, 0x1A, 0x08, + 0x1, 0x1B, 0xC2, + 0x1, 0x1C, 0x03, + 0x1, 0x1D, 0x8F, + 0x1, 0x1E, 0x0A, + 0x1, 0x1F, 0x06, + 0x1, 0x20, 0x01, + 0x1, 0x21, 0x02, + 0x1, 0x22, 0x00, + 0x1, 0x23, 0xD5, + 0x1, 0x24, 0x18, + 0x1, 0x25, 0x22, + 0x1, 0x26, 0x01, + 0x1, 0x27, 0x82, + 0x1, 0x28, 0x00, + 0x1, 0x29, 0xD5, + 0x1, 0x2A, 0x18, + 0x1, 0x2B, 0x0B, + 0x1, 0x2C, 0x28, + 0x1, 0x2D, 0x78, + 0x1, 0x2E, 0x28, + 0x1, 0x2F, 0x91, + 0x1, 0x30, 0x00, + 0x1, 0x31, 0x0B, + 0x1, 0x32, 0x00, + 0x1, 0x33, 0x0B, + 0x1, 0x34, 0x00, + 0x1, 0x35, 0xA1, + 0x1, 0x36, 0x00, + 0x1, 0x37, 0xA0, + 0x1, 0x38, 0x00, + 0x1, 0x39, 0x04, + 0x1, 0x3A, 0x28, + 0x1, 0x3B, 0x30, + 0x1, 0x3C, 0x0C, + 0x1, 0x3D, 0x04, + 0x1, 0x3E, 0x0F, + 0x1, 0x3F, 0x79, + 0x1, 0x40, 0x28, + 0x1, 0x41, 0x1E, + 0x1, 0x42, 0x2F, + 0x1, 0x43, 0x87, + 0x1, 0x44, 0x00, + 0x1, 0x45, 0x0B, + 0x1, 0x46, 0x00, + 0x1, 0x47, 0x0B, + 0x1, 0x48, 0x00, + 0x1, 0x49, 0xA7, + 0x1, 0x4A, 0x00, + 0x1, 0x4B, 0xA6, + 0x1, 0x4C, 0x00, + 0x1, 0x4D, 0x04, + 0x1, 0x4E, 0x01, + 0x1, 0x4F, 0x00, + 0x1, 0x50, 0x00, + 0x1, 0x51, 0x80, + 0x1, 0x52, 0x09, + 0x1, 0x53, 0x08, + 0x1, 0x54, 0x01, + 0x1, 0x55, 0x00, + 0x1, 0x56, 0x0F, + 0x1, 0x57, 0x79, + 0x1, 0x58, 0x09, + 0x1, 0x59, 0x05, + 0x1, 0x5A, 0x00, + 0x1, 0x5B, 0x60, + 0x1, 0x5C, 0x05, + 0x1, 0x5D, 0xD1, + 0x1, 0x5E, 0x0C, + 0x1, 0x5F, 0x3C, + 0x1, 0x60, 0x00, + 0x1, 0x61, 0xD0, + 0x1, 0x62, 0x0B, + 0x1, 0x63, 0x03, + 0x1, 0x64, 0x28, + 0x1, 0x65, 0x10, + 0x1, 0x66, 0x2A, + 0x1, 0x67, 0x39, + 0x1, 0x68, 0x0B, + 0x1, 0x69, 0x02, + 0x1, 0x6A, 0x28, + 0x1, 0x6B, 0x10, + 0x1, 0x6C, 0x2A, + 0x1, 0x6D, 0x61, + 0x1, 0x6E, 0x0C, + 0x1, 0x6F, 0x00, + 0x1, 0x70, 0x0F, + 0x1, 0x71, 0x79, + 0x1, 0x72, 0x00, + 0x1, 0x73, 0x0B, + 0x1, 0x74, 0x00, + 0x1, 0x75, 0x0B, + 0x1, 0x76, 0x00, + 0x1, 0x77, 0xA1, + 0x1, 0x78, 0x00, + 0x1, 0x79, 0xA0, + 0x1, 0x7A, 0x00, + 0x1, 0x7B, 0x04, + 0x1, 0xFF, 0x04, + 0x1, 0x79, 0x1D, + 0x1, 0x7B, 0x27, + 0x1, 0x96, 0x0E, + 0x1, 0x97, 0xFE, + 0x1, 0x98, 0x03, + 0x1, 0x99, 0xEF, + 0x1, 0x9A, 0x02, + 0x1, 0x9B, 0x44, + 0x1, 0x73, 0x07, + 0x1, 0x70, 0x01, + 0x1, 0xff, 0x01, + 0x1, 0x00, 0x01, + 0x1, 0xff, 0x00, + 0x00, 0x00, 0x00 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" new file mode 100644 index 00000000..fa8418de --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + + +#ifndef _VL53L0X_TUNING_H_ +#define _VL53L0X_TUNING_H_ + +#include "vl53l0x_def.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +uint8_t DefaultTuningSettings[] = { + + /* update 02/11/2015_v36 */ + 0x01, 0xFF, 0x01, + 0x01, 0x00, 0x00, + + 0x01, 0xFF, 0x00, + 0x01, 0x09, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x11, 0x00, + + 0x01, 0x24, 0x01, + 0x01, 0x25, 0xff, + 0x01, 0x75, 0x00, + + 0x01, 0xFF, 0x01, + 0x01, 0x4e, 0x2c, + 0x01, 0x48, 0x00, + 0x01, 0x30, 0x20, + + 0x01, 0xFF, 0x00, + 0x01, 0x30, 0x09, /* mja changed from 0x64. */ + 0x01, 0x54, 0x00, + 0x01, 0x31, 0x04, + 0x01, 0x32, 0x03, + 0x01, 0x40, 0x83, + 0x01, 0x46, 0x25, + 0x01, 0x60, 0x00, + 0x01, 0x27, 0x00, + 0x01, 0x50, 0x06, + 0x01, 0x51, 0x00, + 0x01, 0x52, 0x96, + 0x01, 0x56, 0x08, + 0x01, 0x57, 0x30, + 0x01, 0x61, 0x00, + 0x01, 0x62, 0x00, + 0x01, 0x64, 0x00, + 0x01, 0x65, 0x00, + 0x01, 0x66, 0xa0, + + 0x01, 0xFF, 0x01, + 0x01, 0x22, 0x32, + 0x01, 0x47, 0x14, + 0x01, 0x49, 0xff, + 0x01, 0x4a, 0x00, + + 0x01, 0xFF, 0x00, + 0x01, 0x7a, 0x0a, + 0x01, 0x7b, 0x00, + 0x01, 0x78, 0x21, + + 0x01, 0xFF, 0x01, + 0x01, 0x23, 0x34, + 0x01, 0x42, 0x00, + 0x01, 0x44, 0xff, + 0x01, 0x45, 0x26, + 0x01, 0x46, 0x05, + 0x01, 0x40, 0x40, + 0x01, 0x0E, 0x06, + 0x01, 0x20, 0x1a, + 0x01, 0x43, 0x40, + + 0x01, 0xFF, 0x00, + 0x01, 0x34, 0x03, + 0x01, 0x35, 0x44, + + 0x01, 0xFF, 0x01, + 0x01, 0x31, 0x04, + 0x01, 0x4b, 0x09, + 0x01, 0x4c, 0x05, + 0x01, 0x4d, 0x04, + + + 0x01, 0xFF, 0x00, + 0x01, 0x44, 0x00, + 0x01, 0x45, 0x20, + 0x01, 0x47, 0x08, + 0x01, 0x48, 0x28, + 0x01, 0x67, 0x00, + 0x01, 0x70, 0x04, + 0x01, 0x71, 0x01, + 0x01, 0x72, 0xfe, + 0x01, 0x76, 0x00, + 0x01, 0x77, 0x00, + + 0x01, 0xFF, 0x01, + 0x01, 0x0d, 0x01, + + 0x01, 0xFF, 0x00, + 0x01, 0x80, 0x01, + 0x01, 0x01, 0xF8, + + 0x01, 0xFF, 0x01, + 0x01, 0x8e, 0x01, + 0x01, 0x00, 0x01, + 0x01, 0xFF, 0x00, + 0x01, 0x80, 0x00, + + 0x00, 0x00, 0x00 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_TUNING_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" new file mode 100644 index 00000000..3f0ed04e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" @@ -0,0 +1,3142 @@ +/******************************************************************************* + * Copyright � 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_tuning.h" +#include "vl53l0x_interrupt_threshold_settings.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_calibration.h" +#include "vl53l0x_api_strings.h" + + +#ifndef __KERNEL__ +#include +#endif +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + +#ifdef VL53L0X_LOG_ENABLE +#define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_API, \ + level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) +#endif + +/* Group PAL General Functions */ + +VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + pVersion->major = VL53L0X_IMPLEMENTATION_VER_MAJOR; + pVersion->minor = VL53L0X_IMPLEMENTATION_VER_MINOR; + pVersion->build = VL53L0X_IMPLEMENTATION_VER_SUB; + + pVersion->revision = VL53L0X_IMPLEMENTATION_VER_REVISION; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalSpecVersion(VL53L0X_Version_t *pPalSpecVersion) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + pPalSpecVersion->major = VL53L0X_SPECIFICATION_VER_MAJOR; + pPalSpecVersion->minor = VL53L0X_SPECIFICATION_VER_MINOR; + pPalSpecVersion->build = VL53L0X_SPECIFICATION_VER_SUB; + + pPalSpecVersion->revision = VL53L0X_SPECIFICATION_VER_REVISION; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev, + uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t revision_id; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_IDENTIFICATION_REVISION_ID, + &revision_id); + *pProductRevisionMajor = 1; + *pProductRevisionMinor = (revision_id & 0xF0) >> 4; + + LOG_FUNCTION_END(Status); + return Status; + +} + +VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_device_info(Dev, pVL53L0X_DeviceInfo); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev, + VL53L0X_DeviceError *pDeviceErrorStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t RangeStatus; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, + &RangeStatus); + + *pDeviceErrorStatus = (VL53L0X_DeviceError)((RangeStatus & 0x78) >> 3); + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_GetDeviceErrorString(VL53L0X_DeviceError ErrorCode, + char *pDeviceErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_device_error_string(ErrorCode, pDeviceErrorString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus, + char *pRangeStatusString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_range_status_string(RangeStatus, + pRangeStatusString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode, + char *pPalErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_pal_error_string(PalErrorCode, pPalErrorString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode, + char *pPalStateString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_pal_state_string(PalStateCode, pPalStateString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, VL53L0X_State *pPalState) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pPalState = PALDevDataGet(Dev, PalState); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes PowerMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + /* Only level1 of Power mode exists */ + if ((PowerMode != VL53L0X_POWERMODE_STANDBY_LEVEL1) + && (PowerMode != VL53L0X_POWERMODE_IDLE_LEVEL1)) { + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + } else if (PowerMode == VL53L0X_POWERMODE_STANDBY_LEVEL1) { + /* set the standby level1 of power mode */ + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to standby */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_STANDBY); + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_STANDBY_LEVEL1); + } + + } else { + /* VL53L0X_POWERMODE_IDLE_LEVEL1 */ + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_StaticInit(Dev); + + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_IDLE_LEVEL1); + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes *pPowerMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* Only level1 of Power mode exists */ + Status = VL53L0X_RdByte(Dev, 0x80, &Byte); + + if (Status == VL53L0X_ERROR_NONE) { + if (Byte == 1) { + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_IDLE_LEVEL1); + } else { + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_STANDBY_LEVEL1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, + int32_t OffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_offset_calibration_data_micro_meter(Dev, + OffsetCalibrationDataMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_offset_calibration_data_micro_meter(Dev, + pOffsetCalibrationDataMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev, + int16_t LinearityCorrectiveGain) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + if ((LinearityCorrectiveGain < 0) || (LinearityCorrectiveGain > 1000)) + Status = VL53L0X_ERROR_INVALID_PARAMS; + else { + PALDevDataSet(Dev, LinearityCorrectiveGain, + LinearityCorrectiveGain); + + if (LinearityCorrectiveGain != 1000) { + /* Disable FW Xtalk */ + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, 0); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev, + uint16_t *pLinearityCorrectiveGain) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pLinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, uint8_t GroupParamHold) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, + uint16_t *pUpperLimitMilliMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev, + FixPoint1616_t *pTotalSignalRate) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; + + LOG_FUNCTION_START(""); + + LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); + + Status = VL53L0X_get_total_signal_rate( + Dev, &LastRangeDataBuffer, pTotalSignalRate); + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL General Functions */ + +/* Group PAL Init Functions */ +VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, uint8_t DeviceAddress) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, + DeviceAddress / 2); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceParameters_t CurrentParameters; + int i; + uint8_t StopVariable; + + LOG_FUNCTION_START(""); + + /* by default the I2C is running at 1V8 if you want to change it you + * need to include this define at compilation level. + */ +#ifdef USE_I2C_2V8 + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, + 0xFE, + 0x01); +#endif + + /* Set I2C standard mode */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0x88, 0x00); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, 0); + +#ifdef USE_IQC_STATION + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_apply_offset_adjustment(Dev); +#endif + + /* Default value is 1000 for Linearity Corrective Gain */ + PALDevDataSet(Dev, LinearityCorrectiveGain, 1000); + + /* Set Default static parameters + *set first temporary values 9.44MHz * 65536 = 618660 + */ + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, 618660); + + /* Set Default XTalkCompensationRateMegaCps to 0 */ + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, 0); + + /* Get default parameters */ + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + if (Status == VL53L0X_ERROR_NONE) { + /* initialize PAL values */ + CurrentParameters.DeviceMode = + VL53L0X_DEVICEMODE_SINGLE_RANGING; + CurrentParameters.HistogramMode = + VL53L0X_HISTOGRAMMODE_DISABLED; + + /* Dmax lookup table */ + /* 0.0 */ + CurrentParameters.dmax_lut.ambRate_mcps[0] = (FixPoint1616_t)0x00000000; + /* 1200 */ + CurrentParameters.dmax_lut.dmax_mm[0] = (FixPoint1616_t)0x04B00000; + /* 0.7 */ + CurrentParameters.dmax_lut.ambRate_mcps[1] = (FixPoint1616_t)0x0000B333; + /* 1100 */ + CurrentParameters.dmax_lut.dmax_mm[1] = (FixPoint1616_t)0x044C0000; + /* 2 */ + CurrentParameters.dmax_lut.ambRate_mcps[2] = (FixPoint1616_t)0x00020000; + /* 900 */ + CurrentParameters.dmax_lut.dmax_mm[2] = (FixPoint1616_t)0x03840000; + /* 3.8 */ + CurrentParameters.dmax_lut.ambRate_mcps[3] = (FixPoint1616_t)0x0003CCCC; + /* 750 */ + CurrentParameters.dmax_lut.dmax_mm[3] = (FixPoint1616_t)0x02EE0000; + /* 7.3 */ + CurrentParameters.dmax_lut.ambRate_mcps[4] = (FixPoint1616_t)0x00074CCC; + /* 550 */ + CurrentParameters.dmax_lut.dmax_mm[4] = (FixPoint1616_t)0x02260000; + /* 10 */ + CurrentParameters.dmax_lut.ambRate_mcps[5] = (FixPoint1616_t)0x000A0000; + /* 500 */ + CurrentParameters.dmax_lut.dmax_mm[5] = (FixPoint1616_t)0x01F40000; + /* 15 */ + CurrentParameters.dmax_lut.ambRate_mcps[6] = (FixPoint1616_t)0x000F0000; + /* 400 */ + CurrentParameters.dmax_lut.dmax_mm[6] = (FixPoint1616_t)0x01900000; + + PALDevDataSet(Dev, CurrentParameters, CurrentParameters); + } + + /* Sigma estimator variable */ + PALDevDataSet(Dev, SigmaEstRefArray, 100); + PALDevDataSet(Dev, SigmaEstEffPulseWidth, 900); + PALDevDataSet(Dev, SigmaEstEffAmbWidth, 500); + PALDevDataSet(Dev, targetRefRate, 0x0A00); /* 20 MCPS in 9:7 format */ + + /* Use internal default settings */ + PALDevDataSet(Dev, UseInternalTuningSettings, 1); + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + Status |= VL53L0X_RdByte(Dev, 0x91, &StopVariable); + PALDevDataSet(Dev, StopVariable, StopVariable); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + + /* Enable all check */ + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + if (Status == VL53L0X_ERROR_NONE) + Status |= VL53L0X_SetLimitCheckEnable(Dev, i, 1); + else + break; + + } + + /* Disable the following checks */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0); + + /* Limit default values */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + (FixPoint1616_t)(18 * 65536)); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + (FixPoint1616_t)(25 * 65536 / 100)); + /* 0.25 * 65536 */ + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + (FixPoint1616_t)(35 * 65536)); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + (FixPoint1616_t)(0 * 65536)); + } + + if (Status == VL53L0X_ERROR_NONE) { + + PALDevDataSet(Dev, SequenceConfig, 0xFF); + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 0xFF); + + /* Set PAL state to tell that we are waiting for call to + * VL53L0X_StaticInit + */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_WAIT_STATICINIT); + } + + if (Status == VL53L0X_ERROR_NONE) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 0); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + if (UseInternalTuningSettings == 1) { + /* Force use internal settings */ + PALDevDataSet(Dev, UseInternalTuningSettings, 1); + } else { + + /* check that the first byte is not 0 */ + if (*pTuningSettingBuffer != 0) { + PALDevDataSet(Dev, pTuningSettingsPointer, + pTuningSettingBuffer); + PALDevDataSet(Dev, UseInternalTuningSettings, 0); + + } else { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *ppTuningSettingBuffer = PALDevDataGet(Dev, pTuningSettingsPointer); + *pUseInternalTuningSettings = PALDevDataGet(Dev, + UseInternalTuningSettings); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceParameters_t CurrentParameters = {0}; + uint8_t *pTuningSettingBuffer; + uint16_t tempword = 0; + uint8_t tempbyte = 0; + uint8_t UseInternalTuningSettings = 0; + uint32_t count = 0; + uint8_t isApertureSpads = 0; + uint32_t refSpadCount = 0; + uint8_t ApertureSpads = 0; + uint8_t vcselPulsePeriodPCLK; + uint32_t seqTimeoutMicroSecs; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_info_from_device(Dev, 1); + + /* set the ref spad from NVM */ + count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount); + ApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType); + + /* NVM value invalid */ + if ((ApertureSpads > 1) || + ((ApertureSpads == 1) && (count > 32)) || + ((ApertureSpads == 0) && (count > 12))) + Status = VL53L0X_perform_ref_spad_management(Dev, &refSpadCount, + &isApertureSpads); + else + Status = VL53L0X_set_reference_spads(Dev, count, ApertureSpads); + + + /* Initialize tuning settings buffer to prevent compiler warning. */ + pTuningSettingBuffer = DefaultTuningSettings; + + if (Status == VL53L0X_ERROR_NONE) { + UseInternalTuningSettings = PALDevDataGet(Dev, + UseInternalTuningSettings); + + if (UseInternalTuningSettings == 0) + pTuningSettingBuffer = PALDevDataGet(Dev, + pTuningSettingsPointer); + else + pTuningSettingBuffer = DefaultTuningSettings; + + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_load_tuning_settings(Dev, + pTuningSettingBuffer); + + + /* Set interrupt config to new sample ready */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetGpioConfig(Dev, 0, 0, + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, + VL53L0X_INTERRUPTPOLARITY_LOW); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_RdWord(Dev, 0x84, &tempword); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, + VL53L0X_FIXPOINT412TOFIXPOINT1616(tempword)); + } + + /* After static init, some device parameters may be changed, + * so update them + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetFractionEnable(Dev, &tempbyte); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, RangeFractionalEnable, tempbyte); + + } + + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, CurrentParameters, CurrentParameters); + + + /* read the sequence config and save it */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, tempbyte); + + } + + /* Disable MSRC and TCC by default */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, 0); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_MSRC, 0); + + + /* Set PAL State to standby */ + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + + + + /* Store pre-range vcsel period */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetVcselPulsePeriod( + Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &vcselPulsePeriodPCLK); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeVcselPulsePeriod, + vcselPulsePeriodPCLK); + } + + /* Store final-range vcsel period */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetVcselPulsePeriod( + Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &vcselPulsePeriodPCLK); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeVcselPulsePeriod, + vcselPulsePeriodPCLK); + } + + /* Store pre-range timeout */ + if (Status == VL53L0X_ERROR_NONE) { + Status = get_sequence_step_timeout( + Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &seqTimeoutMicroSecs); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeTimeoutMicroSecs, + seqTimeoutMicroSecs); + } + + /* Store final-range timeout */ + if (Status == VL53L0X_ERROR_NONE) { + Status = get_sequence_step_timeout( + Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &seqTimeoutMicroSecs); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeTimeoutMicroSecs, + seqTimeoutMicroSecs); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* Set reset bit */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, + 0x00); + + /* Wait for some time */ + if (Status == VL53L0X_ERROR_NONE) { + do { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte); + } while (Byte != 0x00); + } + + VL53L0X_PollingDelay(Dev); + + /* Release reset */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, + 0x01); + + /* Wait until correct boot-up of the device */ + if (Status == VL53L0X_ERROR_NONE) { + do { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte); + } while (Byte == 0x00); + } + + VL53L0X_PollingDelay(Dev); + + /* Set PAL State to VL53L0X_STATE_POWERDOWN */ + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, PalState, VL53L0X_STATE_POWERDOWN); + + + LOG_FUNCTION_END(Status); + return Status; +} +/* End Group PAL Init Functions */ + +/* Group PAL Parameters Functions */ +VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev, + const VL53L0X_DeviceParameters_t *pDeviceParameters) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int i; + + LOG_FUNCTION_START(""); + Status = VL53L0X_SetDeviceMode(Dev, pDeviceParameters->DeviceMode); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(Dev, + pDeviceParameters->InterMeasurementPeriodMilliSeconds); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev, + pDeviceParameters->XTalkCompensationRateMegaCps); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, + pDeviceParameters->RangeOffsetMicroMeters); + + + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + if (Status == VL53L0X_ERROR_NONE) + Status |= VL53L0X_SetLimitCheckEnable(Dev, i, + pDeviceParameters->LimitChecksEnable[i]); + else + break; + + if (Status == VL53L0X_ERROR_NONE) + Status |= VL53L0X_SetLimitCheckValue(Dev, i, + pDeviceParameters->LimitChecksValue[i]); + else + break; + + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetWrapAroundCheckEnable(Dev, + pDeviceParameters->WrapAroundCheckEnable); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + pDeviceParameters->MeasurementTimingBudgetMicroSeconds); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, + VL53L0X_DeviceParameters_t *pDeviceParameters) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int i; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetDeviceMode(Dev, &(pDeviceParameters->DeviceMode)); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetInterMeasurementPeriodMilliSeconds(Dev, + &(pDeviceParameters->InterMeasurementPeriodMilliSeconds)); + + + if (Status == VL53L0X_ERROR_NONE) + pDeviceParameters->XTalkCompensationEnable = 0; + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetXTalkCompensationRateMegaCps(Dev, + &(pDeviceParameters->XTalkCompensationRateMegaCps)); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, + &(pDeviceParameters->RangeOffsetMicroMeters)); + + + if (Status == VL53L0X_ERROR_NONE) { + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + /* get first the values, then the enables. + * VL53L0X_GetLimitCheckValue will modify the enable + * flags + */ + if (Status == VL53L0X_ERROR_NONE) { + Status |= VL53L0X_GetLimitCheckValue(Dev, i, + &(pDeviceParameters->LimitChecksValue[i])); + } else { + break; + } + if (Status == VL53L0X_ERROR_NONE) { + Status |= VL53L0X_GetLimitCheckEnable(Dev, i, + &(pDeviceParameters->LimitChecksEnable[i])); + } else { + break; + } + } + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetWrapAroundCheckEnable(Dev, + &(pDeviceParameters->WrapAroundCheckEnable)); + } + + /* Need to be done at the end as it uses VCSELPulsePeriod */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetMeasurementTimingBudgetMicroSeconds(Dev, + &(pDeviceParameters->MeasurementTimingBudgetMicroSeconds)); + } + + if (Status == VL53L0X_ERROR_NONE) { + for (i = 0; i < VL53L0X_DMAX_LUT_SIZE; i++) { + pDeviceParameters->dmax_lut.ambRate_mcps[i] = + Dev->Data.CurrentParameters.dmax_lut.ambRate_mcps[i]; + pDeviceParameters->dmax_lut.dmax_mm[i] = + Dev->Data.CurrentParameters.dmax_lut.dmax_mm[i]; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START("%d", (int)DeviceMode); + + switch (DeviceMode) { + case VL53L0X_DEVICEMODE_SINGLE_RANGING: + case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: + case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: + case VL53L0X_DEVICEMODE_GPIO_DRIVE: + case VL53L0X_DEVICEMODE_GPIO_OSC: + /* Supported modes */ + VL53L0X_SETPARAMETERFIELD(Dev, DeviceMode, DeviceMode); + break; + default: + /* Unsupported mode */ + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes *pDeviceMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, DeviceMode, *pDeviceMode); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, uint8_t Enable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START("%d", (int)Enable); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, Enable); + + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, RangeFractionalEnable, Enable); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, uint8_t *pEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, pEnabled); + + if (Status == VL53L0X_ERROR_NONE) + *pEnabled = (*pEnabled & 1); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes HistogramMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes *pHistogramMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_measurement_timing_budget_micro_seconds(Dev, + MeasurementTimingBudgetMicroSeconds); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_measurement_timing_budget_micro_seconds(Dev, + pMeasurementTimingBudgetMicroSeconds); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_vcsel_pulse_period(Dev, VcselPeriodType, + VCSELPulsePeriodPCLK); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_vcsel_pulse_period(Dev, VcselPeriodType, + pVCSELPulsePeriodPCLK); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + uint8_t SequenceConfigNew = 0; + uint32_t MeasurementTimingBudgetMicroSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + &SequenceConfig); + + SequenceConfigNew = SequenceConfig; + + if (Status == VL53L0X_ERROR_NONE) { + if (SequenceStepEnabled == 1) { + + /* Enable requested sequence step + */ + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + SequenceConfigNew |= 0x10; + break; + case VL53L0X_SEQUENCESTEP_DSS: + SequenceConfigNew |= 0x28; + break; + case VL53L0X_SEQUENCESTEP_MSRC: + SequenceConfigNew |= 0x04; + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + SequenceConfigNew |= 0x40; + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + SequenceConfigNew |= 0x80; + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } else { + /* Disable requested sequence step + */ + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + SequenceConfigNew &= 0xef; + break; + case VL53L0X_SEQUENCESTEP_DSS: + SequenceConfigNew &= 0xd7; + break; + case VL53L0X_SEQUENCESTEP_MSRC: + SequenceConfigNew &= 0xfb; + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + SequenceConfigNew &= 0xbf; + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + SequenceConfigNew &= 0x7f; + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + } + + if (SequenceConfigNew != SequenceConfig) { + /* Apply New Setting */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, SequenceConfigNew); + } + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfigNew); + + + /* Recalculate timing budget */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_GETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + MeasurementTimingBudgetMicroSeconds); + } + } + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceConfig, + uint8_t *pSequenceStepEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + *pSequenceStepEnabled = 0; + LOG_FUNCTION_START(""); + + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + *pSequenceStepEnabled = (SequenceConfig & 0x10) >> 4; + break; + case VL53L0X_SEQUENCESTEP_DSS: + *pSequenceStepEnabled = (SequenceConfig & 0x08) >> 3; + break; + case VL53L0X_SEQUENCESTEP_MSRC: + *pSequenceStepEnabled = (SequenceConfig & 0x04) >> 2; + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + *pSequenceStepEnabled = (SequenceConfig & 0x40) >> 6; + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + *pSequenceStepEnabled = (SequenceConfig & 0x80) >> 7; + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + &SequenceConfig); + + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, SequenceStepId, + SequenceConfig, pSequenceStepEnabled); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, + VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + &SequenceConfig); + + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_TCC, SequenceConfig, + &pSchedulerSequenceSteps->TccOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_DSS, SequenceConfig, + &pSchedulerSequenceSteps->DssOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_MSRC, SequenceConfig, + &pSchedulerSequenceSteps->MsrcOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, SequenceConfig, + &pSchedulerSequenceSteps->PreRangeOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, SequenceConfig, + &pSchedulerSequenceSteps->FinalRangeOn); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, + uint8_t *pNumberOfSequenceSteps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pNumberOfSequenceSteps = VL53L0X_SEQUENCESTEP_NUMBER_OF_CHECKS; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepsInfo( + VL53L0X_SequenceStepId SequenceStepId, + char *pSequenceStepsString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_sequence_steps_info( + SequenceStepId, + pSequenceStepsString); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_Error Status1 = VL53L0X_ERROR_NONE; + uint32_t TimeoutMicroSeconds = ((TimeOutMilliSecs * 1000) + 0x8000) + >> 16; + uint32_t MeasurementTimingBudgetMicroSeconds; + FixPoint1616_t OldTimeOutMicroSeconds; + + LOG_FUNCTION_START(""); + + /* Read back the current value in case we need to revert back to this. + */ + Status = get_sequence_step_timeout(Dev, SequenceStepId, + &OldTimeOutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) { + Status = set_sequence_step_timeout(Dev, SequenceStepId, + TimeoutMicroSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_GETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + /* At this point we don't know if the requested value is valid, + * therefore proceed to update the entire timing budget and + * if this fails, revert back to the previous value. + */ + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + MeasurementTimingBudgetMicroSeconds); + + if (Status != VL53L0X_ERROR_NONE) { + Status1 = set_sequence_step_timeout(Dev, SequenceStepId, + OldTimeOutMicroSeconds); + + if (Status1 == VL53L0X_ERROR_NONE) { + Status1 = + VL53L0X_SetMeasurementTimingBudgetMicroSeconds( + Dev, + MeasurementTimingBudgetMicroSeconds); + } + + Status = Status1; + } + } + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + FixPoint1616_t *pTimeOutMilliSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint32_t TimeoutMicroSeconds; + + LOG_FUNCTION_START(""); + + Status = get_sequence_step_timeout(Dev, SequenceStepId, + &TimeoutMicroSeconds); + if (Status == VL53L0X_ERROR_NONE) { + TimeoutMicroSeconds <<= 8; + *pTimeOutMilliSecs = (TimeoutMicroSeconds + 500)/1000; + *pTimeOutMilliSecs <<= 8; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, + uint32_t InterMeasurementPeriodMilliSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t osc_calibrate_val; + uint32_t IMPeriodMilliSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, + &osc_calibrate_val); + + if (Status == VL53L0X_ERROR_NONE) { + if (osc_calibrate_val != 0) { + IMPeriodMilliSeconds = + InterMeasurementPeriodMilliSeconds + * osc_calibrate_val; + } else { + IMPeriodMilliSeconds = + InterMeasurementPeriodMilliSeconds; + } + Status = VL53L0X_WrDWord(Dev, + VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, + IMPeriodMilliSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, + InterMeasurementPeriodMilliSeconds, + InterMeasurementPeriodMilliSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, + uint32_t *pInterMeasurementPeriodMilliSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t osc_calibrate_val; + uint32_t IMPeriodMilliSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, + &osc_calibrate_val); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdDWord(Dev, + VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, + &IMPeriodMilliSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + if (osc_calibrate_val != 0) { + *pInterMeasurementPeriodMilliSeconds = + IMPeriodMilliSeconds / osc_calibrate_val; + } + VL53L0X_SETPARAMETERFIELD(Dev, + InterMeasurementPeriodMilliSeconds, + *pInterMeasurementPeriodMilliSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t XTalkCompensationEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t TempFix1616; + uint16_t LinearityCorrectiveGain; + + LOG_FUNCTION_START(""); + + LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); + + if ((XTalkCompensationEnable == 0) + || (LinearityCorrectiveGain != 1000)) { + TempFix1616 = 0; + } else { + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + TempFix1616); + } + + /* the following register has a format 3.13 */ + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, + VL53L0X_FIXPOINT1616TOFIXPOINT313(TempFix1616)); + + if (Status == VL53L0X_ERROR_NONE) { + if (XTalkCompensationEnable == 0) { + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 0); + } else { + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t *pXTalkCompensationEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); + *pXTalkCompensationEnable = Temp8; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + uint16_t LinearityCorrectiveGain; + uint16_t data; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); + LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); + + if (Temp8 == 0) { /* disabled write only internal value */ + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + } else { + /* the following register has a format 3.13 */ + if (LinearityCorrectiveGain == 1000) { + data = VL53L0X_FIXPOINT1616TOFIXPOINT313( + XTalkCompensationRateMegaCps); + } else { + data = 0; + } + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, data); + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t Value; + FixPoint1616_t TempFix1616; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, (uint16_t *)&Value); + if (Status == VL53L0X_ERROR_NONE) { + if (Value == 0) { + /* the Xtalk is disabled return value from memory */ + VL53L0X_GETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, TempFix1616); + *pXTalkCompensationRateMegaCps = TempFix1616; + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 0); + } else { + TempFix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616(Value); + *pXTalkCompensationRateMegaCps = TempFix1616; + VL53L0X_SETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, TempFix1616); + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, uint8_t VhvSettings, + uint8_t PhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_ref_calibration(Dev, VhvSettings, PhaseCal); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, uint8_t *pVhvSettings, + uint8_t *pPhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_ref_calibration(Dev, pVhvSettings, pPhaseCal); + + LOG_FUNCTION_END(Status); + return Status; +} + +/* + * CHECK LIMIT FUNCTIONS + */ + +VL53L0X_Error VL53L0X_GetNumberOfLimitCheck(uint16_t *pNumberOfLimitCheck) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pNumberOfLimitCheck = VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, uint16_t LimitCheckId, + char *pLimitCheckString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_limit_check_info(Dev, LimitCheckId, + pLimitCheckString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t *pLimitCheckStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else { + + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + LimitCheckId, Temp8); + + *pLimitCheckStatus = Temp8; + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t LimitCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t TempFix1616 = 0; + uint8_t LimitCheckEnableInt = 0; + uint8_t LimitCheckDisable = 0; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else { + if (LimitCheckEnable == 0) { + TempFix1616 = 0; + LimitCheckEnableInt = 0; + LimitCheckDisable = 1; + + } else { + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + LimitCheckId, TempFix1616); + LimitCheckDisable = 0; + /* this to be sure to have either 0 or 1 */ + LimitCheckEnableInt = 1; + } + + switch (LimitCheckId) { + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + LimitCheckEnableInt); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97(TempFix1616)); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + LimitCheckEnableInt); + + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + LimitCheckEnableInt); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + + Temp8 = (uint8_t)(LimitCheckDisable << 1); + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_MSRC_CONFIG_CONTROL, + 0xFE, Temp8); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + + Temp8 = (uint8_t)(LimitCheckDisable << 4); + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_MSRC_CONFIG_CONTROL, + 0xEF, Temp8); + + break; + + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + + } + + if (Status == VL53L0X_ERROR_NONE) { + if (LimitCheckEnable == 0) { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + LimitCheckId, 0); + } else { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + LimitCheckId, 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t *pLimitCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + *pLimitCheckEnable = 0; + } else { + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + LimitCheckId, Temp8); + *pLimitCheckEnable = Temp8; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, + FixPoint1616_t LimitCheckValue) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, LimitCheckId, + Temp8); + + if (Temp8 == 0) { /* disabled write only internal value */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + LimitCheckId, LimitCheckValue); + } else { + + switch (LimitCheckId) { + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + LimitCheckValue); + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97( + LimitCheckValue)); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + LimitCheckValue); + + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + LimitCheckValue); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97( + LimitCheckValue)); + + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + LimitCheckId, LimitCheckValue); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckValue) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t EnableZeroValue = 0; + uint16_t Temp16; + FixPoint1616_t TempFix1616; + + LOG_FUNCTION_START(""); + + switch (LimitCheckId) { + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, TempFix1616); + EnableZeroValue = 0; + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + &Temp16); + if (Status == VL53L0X_ERROR_NONE) + TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); + + + EnableZeroValue = 1; + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, TempFix1616); + EnableZeroValue = 0; + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + TempFix1616); + EnableZeroValue = 0; + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, + &Temp16); + if (Status == VL53L0X_ERROR_NONE) + TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); + + + EnableZeroValue = 0; + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + + if (Status == VL53L0X_ERROR_NONE) { + + if (EnableZeroValue == 1) { + + if (TempFix1616 == 0) { + /* disabled: return value from memory */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, + LimitChecksValue, LimitCheckId, + TempFix1616); + *pLimitCheckValue = TempFix1616; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + LimitChecksEnable, LimitCheckId, 0); + } else { + *pLimitCheckValue = TempFix1616; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + LimitChecksValue, LimitCheckId, + TempFix1616); + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + LimitChecksEnable, LimitCheckId, 1); + } + } else { + *pLimitCheckValue = TempFix1616; + } + } + + LOG_FUNCTION_END(Status); + return Status; + +} + +VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckCurrent) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else { + switch (LimitCheckId) { + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* Need to run a ranging to have the latest values */ + *pLimitCheckCurrent = PALDevDataGet(Dev, SigmaEstimate); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + /* Need to run a ranging to have the latest values */ + *pLimitCheckCurrent = PALDevDataGet(Dev, + LastSignalRefMcps); + + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + LOG_FUNCTION_END(Status); + return Status; + +} + +/* + * WRAPAROUND Check + */ +VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t WrapAroundCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + uint8_t WrapAroundCheckEnableInt; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &Byte); + if (WrapAroundCheckEnable == 0) { + /* Disable wraparound */ + Byte = Byte & 0x7F; + WrapAroundCheckEnableInt = 0; + } else { + /*Enable wraparound */ + Byte = Byte | 0x80; + WrapAroundCheckEnableInt = 1; + } + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, Byte); + + if (Status == VL53L0X_ERROR_NONE) { + PALDevDataSet(Dev, SequenceConfig, Byte); + VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, + WrapAroundCheckEnableInt); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t *pWrapAroundCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t data; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data); + if (Status == VL53L0X_ERROR_NONE) { + PALDevDataSet(Dev, SequenceConfig, data); + if (data & (0x01 << 7)) + *pWrapAroundCheckEnable = 0x01; + else + *pWrapAroundCheckEnable = 0x00; + } + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, + *pWrapAroundCheckEnable); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL Parameters Functions */ + +/* Group PAL Measurement Functions */ +VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceModes DeviceMode; + + LOG_FUNCTION_START(""); + + /* Get Current DeviceMode */ + Status = VL53L0X_GetDeviceMode(Dev, &DeviceMode); + + /* Start immediately to run a single ranging measurement in case of + * single ranging or single histogram + */ + if (Status == VL53L0X_ERROR_NONE + && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) + Status = VL53L0X_StartMeasurement(Dev); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_measurement_poll_for_completion(Dev); + + + /* Change PAL State in case of single ranging or single histogram */ + if (Status == VL53L0X_ERROR_NONE + && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement(VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, + uint8_t *pPhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_ref_calibration(Dev, pVhvSettings, + pPhaseCal, 1); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, + uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, + uint8_t *pAmbientTooHigh) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_xtalk_calibration(Dev, XTalkCalDistance, + pXTalkCompensationRateMegaCps); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_offset_calibration(Dev, CalDistanceMilliMeter, + pOffsetMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_CheckAndLoadInterruptSettings(VL53L0X_DEV Dev, + uint8_t StartNotStopFlag) +{ + uint8_t InterruptConfig; + FixPoint1616_t ThresholdLow; + FixPoint1616_t ThresholdHigh; + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + Pin0GpioFunctionality); + + switch (InterruptConfig) { + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: + Status = VL53L0X_GetInterruptThresholds(Dev, + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if ((ThresholdLow > 255*65536) && + (Status == VL53L0X_ERROR_NONE)) { + + if (StartNotStopFlag != 0) { + Status = VL53L0X_load_tuning_settings(Dev, + InterruptThresholdSettings); + } else { + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: + Status = VL53L0X_GetInterruptThresholds(Dev, + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if ((ThresholdHigh > 0) && + (Status == VL53L0X_ERROR_NONE)) { + + if (StartNotStopFlag != 0) { + Status = VL53L0X_load_tuning_settings(Dev, + InterruptThresholdSettings); + } else { + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: + Status = VL53L0X_GetInterruptThresholds(Dev, + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if (Status == VL53L0X_ERROR_NONE) { + if (StartNotStopFlag != 0) { + Status = VL53L0X_load_tuning_settings(Dev, + InterruptThresholdSettings); + } else { + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + } + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceModes DeviceMode; + uint8_t Byte; + uint8_t StartStopByte = VL53L0X_REG_SYSRANGE_MODE_START_STOP; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + /* Get Current DeviceMode */ + VL53L0X_GetDeviceMode(Dev, &DeviceMode); + + Status = VL53L0X_WrByte(Dev, 0x80, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + Status = VL53L0X_WrByte(Dev, 0x91, PALDevDataGet(Dev, StopVariable)); + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + + switch (DeviceMode) { + case VL53L0X_DEVICEMODE_SINGLE_RANGING: + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x01); + + Byte = StartStopByte; + if (Status == VL53L0X_ERROR_NONE) { + /* Wait until start bit has been cleared */ + LoopNb = 0; + do { + if (LoopNb > 0) + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_SYSRANGE_START, &Byte); + LoopNb = LoopNb + 1; + } while (((Byte & StartStopByte) == StartStopByte) + && (Status == VL53L0X_ERROR_NONE) + && (LoopNb < VL53L0X_DEFAULT_MAX_LOOP)); + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) + Status = VL53L0X_ERROR_TIME_OUT; + + } + + break; + case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: + /* Back-to-back mode */ + + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK); + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to Running */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); + } + break; + case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: + /* Continuous mode */ + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_TIMED); + + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to Running */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); + } + break; + default: + /* Selected mode not supported */ + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + } + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + Status = VL53L0X_WrByte(Dev, 0x91, 0x00); + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to Idle */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + } + + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 0); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, + uint8_t *pMeasurementDataReady) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SysRangeStatusRegister; + uint8_t InterruptConfig; + uint32_t InterruptMask; + + LOG_FUNCTION_START(""); + + InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + Pin0GpioFunctionality); + + if (InterruptConfig == + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) { + Status = VL53L0X_GetInterruptMaskStatus(Dev, &InterruptMask); + if (InterruptMask == + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) + *pMeasurementDataReady = 1; + else + *pMeasurementDataReady = 0; + } else { + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, + &SysRangeStatusRegister); + if (Status == VL53L0X_ERROR_NONE) { + if (SysRangeStatusRegister & 0x01) + *pMeasurementDataReady = 1; + else + *pMeasurementDataReady = 0; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement(VL53L0X_DEV Dev, + uint32_t MaxLoop) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented for VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t DeviceRangeStatus; + uint8_t RangeFractionalEnable; + uint8_t PalRangeStatus; + uint8_t XTalkCompensationEnable; + uint16_t AmbientRate; + FixPoint1616_t SignalRate; + uint16_t XTalkCompensationRateMegaCps; + uint16_t EffectiveSpadRtnCount; + uint16_t tmpuint16; + uint16_t XtalkRangeMilliMeter; + uint16_t LinearityCorrectiveGain; + uint8_t localBuffer[12]; + VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; + + LOG_FUNCTION_START(""); + + /* + * use multi read even if some registers are not useful, result will + * be more efficient + * start reading at 0x14 dec20 + * end reading at 0x21 dec33 total 14 bytes to read + */ + Status = VL53L0X_ReadMulti(Dev, 0x14, localBuffer, 12); + + if (Status == VL53L0X_ERROR_NONE) { + + pRangingMeasurementData->ZoneId = 0; /* Only one zone */ + pRangingMeasurementData->TimeStamp = 0; /* Not Implemented */ + + tmpuint16 = VL53L0X_MAKEUINT16(localBuffer[11], + localBuffer[10]); + /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional + *(format 11.2) else no fractional + */ + + pRangingMeasurementData->MeasurementTimeUsec = 0; + + + SignalRate = VL53L0X_FIXPOINT97TOFIXPOINT1616( + VL53L0X_MAKEUINT16(localBuffer[7], localBuffer[6])); + /* peak_signal_count_rate_rtn_mcps */ + pRangingMeasurementData->SignalRateRtnMegaCps = SignalRate; + + AmbientRate = VL53L0X_MAKEUINT16(localBuffer[9], + localBuffer[8]); + pRangingMeasurementData->AmbientRateRtnMegaCps = + VL53L0X_FIXPOINT97TOFIXPOINT1616(AmbientRate); + + EffectiveSpadRtnCount = VL53L0X_MAKEUINT16(localBuffer[3], + localBuffer[2]); + /* EffectiveSpadRtnCount is 8.8 format */ + pRangingMeasurementData->EffectiveSpadRtnCount = + EffectiveSpadRtnCount; + + DeviceRangeStatus = localBuffer[0]; + + /* Get Linearity Corrective Gain */ + LinearityCorrectiveGain = PALDevDataGet(Dev, + LinearityCorrectiveGain); + + /* Get ranging configuration */ + RangeFractionalEnable = PALDevDataGet(Dev, + RangeFractionalEnable); + + if (LinearityCorrectiveGain != 1000) { + + tmpuint16 = (uint16_t)((LinearityCorrectiveGain + * tmpuint16 + 500) / 1000); + + /* Implement Xtalk */ + VL53L0X_GETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, + XTalkCompensationEnable); + + if (XTalkCompensationEnable) { + + if ((SignalRate + - ((XTalkCompensationRateMegaCps + * EffectiveSpadRtnCount) >> 8)) + <= 0) { + if (RangeFractionalEnable) + XtalkRangeMilliMeter = 8888; + else + XtalkRangeMilliMeter = 8888 + << 2; + } else { + XtalkRangeMilliMeter = + (tmpuint16 * SignalRate) + / (SignalRate + - ((XTalkCompensationRateMegaCps + * EffectiveSpadRtnCount) + >> 8)); + } + + tmpuint16 = XtalkRangeMilliMeter; + } + + } + + if (RangeFractionalEnable) { + pRangingMeasurementData->RangeMilliMeter = + (uint16_t)((tmpuint16) >> 2); + pRangingMeasurementData->RangeFractionalPart = + (uint8_t)((tmpuint16 & 0x03) << 6); + } else { + pRangingMeasurementData->RangeMilliMeter = tmpuint16; + pRangingMeasurementData->RangeFractionalPart = 0; + } + + /* + * For a standard definition of RangeStatus, this should + * return 0 in case of good result after a ranging + * The range status depends on the device so call a device + * specific function to obtain the right Status. + */ + Status |= VL53L0X_get_pal_range_status(Dev, DeviceRangeStatus, + SignalRate, EffectiveSpadRtnCount, + pRangingMeasurementData, &PalRangeStatus); + + if (Status == VL53L0X_ERROR_NONE) + pRangingMeasurementData->RangeStatus = PalRangeStatus; + + } + + if (Status == VL53L0X_ERROR_NONE) { + /* Copy last read data into Dev buffer */ + LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); + + LastRangeDataBuffer.RangeMilliMeter = + pRangingMeasurementData->RangeMilliMeter; + LastRangeDataBuffer.RangeFractionalPart = + pRangingMeasurementData->RangeFractionalPart; + LastRangeDataBuffer.RangeDMaxMilliMeter = + pRangingMeasurementData->RangeDMaxMilliMeter; + LastRangeDataBuffer.MeasurementTimeUsec = + pRangingMeasurementData->MeasurementTimeUsec; + LastRangeDataBuffer.SignalRateRtnMegaCps = + pRangingMeasurementData->SignalRateRtnMegaCps; + LastRangeDataBuffer.AmbientRateRtnMegaCps = + pRangingMeasurementData->AmbientRateRtnMegaCps; + LastRangeDataBuffer.EffectiveSpadRtnCount = + pRangingMeasurementData->EffectiveSpadRtnCount; + LastRangeDataBuffer.RangeStatus = + pRangingMeasurementData->RangeStatus; + + PALDevDataSet(Dev, LastRangeMeasure, LastRangeDataBuffer); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev, + FixPoint1616_t *pMeasurementRefSignal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SignalRefClipLimitCheckEnable = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipLimitCheckEnable); + if (SignalRefClipLimitCheckEnable != 0) + *pMeasurementRefSignal = PALDevDataGet(Dev, LastSignalRefMcps); + else + Status = VL53L0X_ERROR_INVALID_COMMAND; + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + /* This function will do a complete single ranging + * Here we fix the mode! + */ + Status = VL53L0X_SetDeviceMode(Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_PerformSingleMeasurement(Dev); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetRangingMeasurementData(Dev, + pRangingMeasurementData); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(Dev, 0); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t NumberOfROIZones) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + if (NumberOfROIZones != 1) + Status = VL53L0X_ERROR_INVALID_PARAMS; + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pNumberOfROIZones) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pNumberOfROIZones = 1; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pMaxNumberOfROIZones) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pMaxNumberOfROIZones = 1; + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL Measurement Functions */ + +VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t data; + + LOG_FUNCTION_START(""); + + if (Pin != 0) { + Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; + } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_DRIVE) { + if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) + data = 0x10; + else + data = 1; + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data); + + } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_OSC) { + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x85, 0x02); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x04); + Status |= VL53L0X_WrByte(Dev, 0xcd, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xcc, 0x11); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x07); + Status |= VL53L0X_WrByte(Dev, 0xbe, 0x00); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x06); + Status |= VL53L0X_WrByte(Dev, 0xcc, 0x09); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + + } else { + + if (Status == VL53L0X_ERROR_NONE) { + switch (Functionality) { + case VL53L0X_GPIOFUNCTIONALITY_OFF: + data = 0x00; + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: + data = 0x01; + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: + data = 0x02; + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: + data = 0x03; + break; + case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY: + data = 0x04; + break; + default: + Status = + VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; + } + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data); + + if (Status == VL53L0X_ERROR_NONE) { + if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) + data = 0; + else + data = (uint8_t)(1 << 4); + + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data); + } + + if (Status == VL53L0X_ERROR_NONE) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + Pin0GpioFunctionality, Functionality); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(Dev, 0); + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes *pDeviceMode, + VL53L0X_GpioFunctionality *pFunctionality, + VL53L0X_InterruptPolarity *pPolarity) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_GpioFunctionality GpioFunctionality; + uint8_t data; + + LOG_FUNCTION_START(""); + + /* pDeviceMode not managed by Ewok it return the current mode */ + + Status = VL53L0X_GetDeviceMode(Dev, pDeviceMode); + + if (Status == VL53L0X_ERROR_NONE) { + if (Pin != 0) { + Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; + } else { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, &data); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + switch (data & 0x07) { + case 0x00: + GpioFunctionality = VL53L0X_GPIOFUNCTIONALITY_OFF; + break; + case 0x01: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW; + break; + case 0x02: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH; + break; + case 0x03: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT; + break; + case 0x04: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY; + break; + default: + Status = VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; + } + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, + &data); + + if (Status == VL53L0X_ERROR_NONE) { + if ((data & (uint8_t)(1 << 4)) == 0) + *pPolarity = VL53L0X_INTERRUPTPOLARITY_LOW; + else + *pPolarity = VL53L0X_INTERRUPTPOLARITY_HIGH; + } + + if (Status == VL53L0X_ERROR_NONE) { + *pFunctionality = GpioFunctionality; + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, Pin0GpioFunctionality, + GpioFunctionality); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, + FixPoint1616_t ThresholdHigh) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t Threshold16; + + LOG_FUNCTION_START(""); + + /* no dependency on DeviceMode for Ewok */ + /* Need to divide by 2 because the FW will apply a x2 */ + Threshold16 = (uint16_t)((ThresholdLow >> 17) & 0x00fff); + Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, + Threshold16); + + if (Status == VL53L0X_ERROR_NONE) { + /* Need to divide by 2 because the FW will apply a x2 */ + Threshold16 = (uint16_t)((ThresholdHigh >> 17) & 0x00fff); + Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, + Threshold16); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t Threshold16; + + LOG_FUNCTION_START(""); + + /* no dependency on DeviceMode for Ewok */ + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, + &Threshold16); + /* Need to multiply by 2 because the FW will apply a x2 */ + *pThresholdLow = (FixPoint1616_t)((0x00fff & Threshold16) << 17); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, + &Threshold16); + /* Need to multiply by 2 because the FW will apply a x2 */ + *pThresholdHigh = + (FixPoint1616_t)((0x00fff & Threshold16) << 17); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev, + uint32_t *pStopStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_RdByte(Dev, 0x04, &Byte); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x0); + + *pStopStatus = Byte; + + if (Byte == 0) { + Status = VL53L0X_WrByte(Dev, 0x80, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + Status = VL53L0X_WrByte(Dev, 0x91, + PALDevDataGet(Dev, StopVariable)); + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +/* Group PAL Interrupt Functions */ +VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t LoopCount; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* clear bit 0 range interrupt, bit 1 error interrupt */ + LoopCount = 0; + do { + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00); + Status |= VL53L0X_RdByte(Dev, + VL53L0X_REG_RESULT_INTERRUPT_STATUS, &Byte); + LoopCount++; + } while (((Byte & 0x07) != 0x00) + && (LoopCount < 3) + && (Status == VL53L0X_ERROR_NONE)); + + + if (LoopCount >= 3) + Status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, + uint32_t *pInterruptMaskStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, + &Byte); + *pInterruptMaskStatus = Byte & 0x07; + + if (Byte & 0x18) + Status = VL53L0X_ERROR_RANGE_ERROR; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented for VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL Interrupt Functions */ + +/* Group SPAD functions */ + +VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperThreshold) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrWord(Dev, 0x40, SpadAmbientDamperThreshold); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperThreshold) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_RdWord(Dev, 0x40, pSpadAmbientDamperThreshold); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperFactor) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Byte = (uint8_t)(SpadAmbientDamperFactor & 0x00FF); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x42, Byte); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperFactor) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_RdByte(Dev, 0x42, &Byte); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + *pSpadAmbientDamperFactor = (uint16_t)Byte; + + LOG_FUNCTION_END(Status); + return Status; +} + +/* END Group SPAD functions */ + +/***************************************************************************** + * Internal functions + *****************************************************************************/ + +VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, uint32_t count, + uint8_t isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_reference_spads(Dev, count, isApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, uint32_t *pSpadCount, + uint8_t *pIsApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_reference_spads(Dev, pSpadCount, pIsApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_ref_spad_management(Dev, refSpadCount, + isApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" new file mode 100644 index 00000000..76385538 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" @@ -0,0 +1,1288 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_calibration.h" + +#ifndef __KERNEL__ +#include +#endif + +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + +#define REF_ARRAY_SPAD_0 0 +#define REF_ARRAY_SPAD_5 5 +#define REF_ARRAY_SPAD_10 10 + +uint32_t refArrayQuadrants[4] = {REF_ARRAY_SPAD_10, REF_ARRAY_SPAD_5, + REF_ARRAY_SPAD_0, REF_ARRAY_SPAD_5 }; + +VL53L0X_Error VL53L0X_perform_xtalk_calibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t sum_ranging = 0; + uint16_t sum_spads = 0; + FixPoint1616_t sum_signalRate = 0; + FixPoint1616_t total_count = 0; + uint8_t xtalk_meas = 0; + VL53L0X_RangingMeasurementData_t RangingMeasurementData; + FixPoint1616_t xTalkStoredMeanSignalRate; + FixPoint1616_t xTalkStoredMeanRange; + FixPoint1616_t xTalkStoredMeanRtnSpads; + uint32_t signalXTalkTotalPerSpad; + uint32_t xTalkStoredMeanRtnSpadsAsInt; + uint32_t xTalkCalDistanceAsInt; + FixPoint1616_t XTalkCompensationRateMegaCps; + + if (XTalkCalDistance <= 0) + Status = VL53L0X_ERROR_INVALID_PARAMS; + + /* Disable the XTalk compensation */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationEnable(Dev, 0); + + /* Disable the RIT */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + } + + /* Perform 50 measurements and compute the averages */ + if (Status == VL53L0X_ERROR_NONE) { + sum_ranging = 0; + sum_spads = 0; + sum_signalRate = 0; + total_count = 0; + for (xtalk_meas = 0; xtalk_meas < 50; xtalk_meas++) { + Status = VL53L0X_PerformSingleRangingMeasurement(Dev, + &RangingMeasurementData); + + if (Status != VL53L0X_ERROR_NONE) + break; + + /* The range is valid when RangeStatus = 0 */ + if (RangingMeasurementData.RangeStatus == 0) { + sum_ranging = sum_ranging + + RangingMeasurementData.RangeMilliMeter; + sum_signalRate = sum_signalRate + + RangingMeasurementData.SignalRateRtnMegaCps; + sum_spads = sum_spads + + RangingMeasurementData.EffectiveSpadRtnCount + / 256; + total_count = total_count + 1; + } + } + + /* no valid values found */ + if (total_count == 0) + Status = VL53L0X_ERROR_RANGE_ERROR; + + } + + + if (Status == VL53L0X_ERROR_NONE) { + /* FixPoint1616_t / uint16_t = FixPoint1616_t */ + xTalkStoredMeanSignalRate = sum_signalRate / total_count; + xTalkStoredMeanRange = (FixPoint1616_t)((uint32_t)( + sum_ranging << 16) / total_count); + xTalkStoredMeanRtnSpads = (FixPoint1616_t)((uint32_t)( + sum_spads << 16) / total_count); + + /* Round Mean Spads to Whole Number. + * Typically the calculated mean SPAD count is a whole number + * or very close to a whole + * number, therefore any truncation will not result in a + * significant loss in accuracy. + * Also, for a grey target at a typical distance of around + * 400mm, around 220 SPADs will + * be enabled, therefore, any truncation will result in a loss + * of accuracy of less than + * 0.5%. + */ + xTalkStoredMeanRtnSpadsAsInt = (xTalkStoredMeanRtnSpads + + 0x8000) >> 16; + + /* Round Cal Distance to Whole Number. + * Note that the cal distance is in mm, therefore no resolution + * is lost. + */ + xTalkCalDistanceAsInt = (XTalkCalDistance + 0x8000) >> 16; + + if (xTalkStoredMeanRtnSpadsAsInt == 0 || + xTalkCalDistanceAsInt == 0 || + xTalkStoredMeanRange >= XTalkCalDistance) { + XTalkCompensationRateMegaCps = 0; + } else { + /* Round Cal Distance to Whole Number. + * Note that the cal distance is in mm, therefore no + * resolution is lost. + */ + xTalkCalDistanceAsInt = (XTalkCalDistance + + 0x8000) >> 16; + + /* Apply division by mean spad count early in the + * calculation to keep the numbers small. + * This ensures we can maintain a 32bit calculation. + * Fixed1616 / int := Fixed1616 + */ + signalXTalkTotalPerSpad = (xTalkStoredMeanSignalRate) / + xTalkStoredMeanRtnSpadsAsInt; + + /* Complete the calculation for total Signal XTalk per + * SPAD + * Fixed1616 * (Fixed1616 - Fixed1616/int) := + * (2^16 * Fixed1616) + */ + signalXTalkTotalPerSpad *= ((1 << 16) - + (xTalkStoredMeanRange / xTalkCalDistanceAsInt)); + + /* Round from 2^16 * Fixed1616, to Fixed1616. */ + XTalkCompensationRateMegaCps = (signalXTalkTotalPerSpad + + 0x8000) >> 16; + } + + *pXTalkCompensationRateMegaCps = XTalkCompensationRateMegaCps; + + /* Enable the XTalk compensation */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationEnable(Dev, 1); + + /* Enable the XTalk compensation */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev, + XTalkCompensationRateMegaCps); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_perform_offset_calibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, + int32_t *pOffsetMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t sum_ranging = 0; + FixPoint1616_t total_count = 0; + VL53L0X_RangingMeasurementData_t RangingMeasurementData; + FixPoint1616_t StoredMeanRange; + uint32_t StoredMeanRangeAsInt; + uint32_t CalDistanceAsInt_mm; + uint8_t SequenceStepEnabled; + int meas = 0; + + if (CalDistanceMilliMeter <= 0) + Status = VL53L0X_ERROR_INVALID_PARAMS; + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, 0); + + + /* Get the value of the TCC */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, &SequenceStepEnabled); + + + /* Disable the TCC */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, 0); + + + /* Disable the RIT */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + + /* Perform 50 measurements and compute the averages */ + if (Status == VL53L0X_ERROR_NONE) { + sum_ranging = 0; + total_count = 0; + for (meas = 0; meas < 50; meas++) { + Status = VL53L0X_PerformSingleRangingMeasurement(Dev, + &RangingMeasurementData); + + if (Status != VL53L0X_ERROR_NONE) + break; + + /* The range is valid when RangeStatus = 0 */ + if (RangingMeasurementData.RangeStatus == 0) { + sum_ranging = sum_ranging + + RangingMeasurementData.RangeMilliMeter; + total_count = total_count + 1; + } + } + + /* no valid values found */ + if (total_count == 0) + Status = VL53L0X_ERROR_RANGE_ERROR; + } + + + if (Status == VL53L0X_ERROR_NONE) { + /* FixPoint1616_t / uint16_t = FixPoint1616_t */ + StoredMeanRange = (FixPoint1616_t)((uint32_t)(sum_ranging << 16) + / total_count); + + StoredMeanRangeAsInt = (StoredMeanRange + 0x8000) >> 16; + + /* Round Cal Distance to Whole Number. + * Note that the cal distance is in mm, therefore no resolution + * is lost. + */ + CalDistanceAsInt_mm = (CalDistanceMilliMeter + 0x8000) >> 16; + + *pOffsetMicroMeter = (CalDistanceAsInt_mm - + StoredMeanRangeAsInt) * 1000; + + /* Apply the calculated offset */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, RangeOffsetMicroMeters, + *pOffsetMicroMeter); + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, + *pOffsetMicroMeter); + } + + } + + /* Restore the TCC */ + if (Status == VL53L0X_ERROR_NONE) { + if (SequenceStepEnabled != 0) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, 1); + } + + return Status; +} + + +VL53L0X_Error VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t OffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t cMaxOffsetMicroMeter = 511000; + int32_t cMinOffsetMicroMeter = -512000; + int16_t cOffsetRange = 4096; + uint32_t encodedOffsetVal; + + LOG_FUNCTION_START(""); + + if (OffsetCalibrationDataMicroMeter > cMaxOffsetMicroMeter) + OffsetCalibrationDataMicroMeter = cMaxOffsetMicroMeter; + else if (OffsetCalibrationDataMicroMeter < cMinOffsetMicroMeter) + OffsetCalibrationDataMicroMeter = cMinOffsetMicroMeter; + + /* The offset register is 10.2 format and units are mm + * therefore conversion is applied by a division of + * 250. + */ + if (OffsetCalibrationDataMicroMeter >= 0) { + encodedOffsetVal = + OffsetCalibrationDataMicroMeter/250; + } else { + encodedOffsetVal = + cOffsetRange + + OffsetCalibrationDataMicroMeter/250; + } + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, + encodedOffsetVal); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t RangeOffsetRegister; + int16_t cMaxOffset = 2047; + int16_t cOffsetRange = 4096; + + /* Note that offset has 10.2 format */ + + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, + &RangeOffsetRegister); + + if (Status == VL53L0X_ERROR_NONE) { + RangeOffsetRegister = (RangeOffsetRegister & 0x0fff); + + /* Apply 12 bit 2's compliment conversion */ + if (RangeOffsetRegister > cMaxOffset) + *pOffsetCalibrationDataMicroMeter = + (int16_t)(RangeOffsetRegister - cOffsetRange) + * 250; + else + *pOffsetCalibrationDataMicroMeter = + (int16_t)RangeOffsetRegister * 250; + + } + + return Status; +} + + +VL53L0X_Error VL53L0X_apply_offset_adjustment(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t CorrectedOffsetMicroMeters; + int32_t CurrentOffsetMicroMeters; + + /* if we run on this function we can read all the NVM info + * used by the API + */ + Status = VL53L0X_get_info_from_device(Dev, 7); + + /* Read back current device offset */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, + &CurrentOffsetMicroMeters); + } + + /* Apply Offset Adjustment derived from 400mm measurements */ + if (Status == VL53L0X_ERROR_NONE) { + + /* Store initial device offset */ + PALDevDataSet(Dev, Part2PartOffsetNVMMicroMeter, + CurrentOffsetMicroMeters); + + CorrectedOffsetMicroMeters = CurrentOffsetMicroMeters + + (int32_t)PALDevDataGet(Dev, + Part2PartOffsetAdjustmentNVMMicroMeter); + + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, + CorrectedOffsetMicroMeters); + + /* store current, adjusted offset */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, RangeOffsetMicroMeters, + CorrectedOffsetMicroMeters); + } + } + + return Status; +} + +void get_next_good_spad(uint8_t goodSpadArray[], uint32_t size, + uint32_t curr, int32_t *next) +{ + uint32_t startIndex; + uint32_t fineOffset; + uint32_t cSpadsPerByte = 8; + uint32_t coarseIndex; + uint32_t fineIndex; + uint8_t dataByte; + uint8_t success = 0; + + /* + * Starting with the current good spad, loop through the array to find + * the next. i.e. the next bit set in the sequence. + * + * The coarse index is the byte index of the array and the fine index is + * the index of the bit within each byte. + */ + + *next = -1; + + startIndex = curr / cSpadsPerByte; + fineOffset = curr % cSpadsPerByte; + + for (coarseIndex = startIndex; ((coarseIndex < size) && !success); + coarseIndex++) { + fineIndex = 0; + dataByte = goodSpadArray[coarseIndex]; + + if (coarseIndex == startIndex) { + /* locate the bit position of the provided current + * spad bit before iterating + */ + dataByte >>= fineOffset; + fineIndex = fineOffset; + } + + while (fineIndex < cSpadsPerByte) { + if ((dataByte & 0x1) == 1) { + success = 1; + *next = coarseIndex * cSpadsPerByte + fineIndex; + break; + } + dataByte >>= 1; + fineIndex++; + } + } +} + + +uint8_t is_aperture(uint32_t spadIndex) +{ + /* + * This function reports if a given spad index is an aperture SPAD by + * deriving the quadrant. + */ + uint32_t quadrant; + uint8_t isAperture = 1; + + quadrant = spadIndex >> 6; + if (refArrayQuadrants[quadrant] == REF_ARRAY_SPAD_0) + isAperture = 0; + + return isAperture; +} + + +VL53L0X_Error enable_spad_bit(uint8_t spadArray[], uint32_t size, + uint32_t spadIndex) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + uint32_t cSpadsPerByte = 8; + uint32_t coarseIndex; + uint32_t fineIndex; + + coarseIndex = spadIndex / cSpadsPerByte; + fineIndex = spadIndex % cSpadsPerByte; + if (coarseIndex >= size) + status = VL53L0X_ERROR_REF_SPAD_INIT; + else + spadArray[coarseIndex] |= (1 << fineIndex); + + return status; +} + +VL53L0X_Error count_enabled_spads(uint8_t spadArray[], + uint32_t byteCount, uint32_t maxSpads, + uint32_t *pTotalSpadsEnabled, uint8_t *pIsAperture) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + uint32_t cSpadsPerByte = 8; + uint32_t lastByte; + uint32_t lastBit; + uint32_t byteIndex = 0; + uint32_t bitIndex = 0; + uint8_t tempByte; + uint8_t spadTypeIdentified = 0; + + /* The entire array will not be used for spads, therefore the last + * byte and last bit is determined from the max spads value. + */ + + lastByte = maxSpads / cSpadsPerByte; + lastBit = maxSpads % cSpadsPerByte; + + /* Check that the max spads value does not exceed the array bounds. */ + if (lastByte >= byteCount) + status = VL53L0X_ERROR_REF_SPAD_INIT; + + *pTotalSpadsEnabled = 0; + + /* Count the bits enabled in the whole bytes */ + for (byteIndex = 0; byteIndex <= (lastByte - 1); byteIndex++) { + tempByte = spadArray[byteIndex]; + + for (bitIndex = 0; bitIndex <= cSpadsPerByte; bitIndex++) { + if ((tempByte & 0x01) == 1) { + (*pTotalSpadsEnabled)++; + + if (!spadTypeIdentified) { + *pIsAperture = 1; + if ((byteIndex < 2) && (bitIndex < 4)) + *pIsAperture = 0; + spadTypeIdentified = 1; + } + } + tempByte >>= 1; + } + } + + /* Count the number of bits enabled in the last byte accounting + * for the fact that not all bits in the byte may be used. + */ + tempByte = spadArray[lastByte]; + + for (bitIndex = 0; bitIndex <= lastBit; bitIndex++) { + if ((tempByte & 0x01) == 1) + (*pTotalSpadsEnabled)++; + } + + return status; +} + +VL53L0X_Error set_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) +{ + VL53L0X_Error status = VL53L0X_WriteMulti(Dev, + VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, + refSpadArray, 6); + return status; +} + +VL53L0X_Error get_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) +{ + VL53L0X_Error status = VL53L0X_ReadMulti(Dev, + VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, + refSpadArray, + 6); + return status; +} + +VL53L0X_Error enable_ref_spads(VL53L0X_DEV Dev, + uint8_t apertureSpads, + uint8_t goodSpadArray[], + uint8_t spadArray[], + uint32_t size, + uint32_t start, + uint32_t offset, + uint32_t spadCount, + uint32_t *lastSpad) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + uint32_t index; + uint32_t i; + int32_t nextGoodSpad = offset; + uint32_t currentSpad; + uint8_t checkSpadArray[6]; + + /* + * This function takes in a spad array which may or may not have SPADS + * already enabled and appends from a given offset a requested number + * of new SPAD enables. The 'good spad map' is applied to + * determine the next SPADs to enable. + * + * This function applies to only aperture or only non-aperture spads. + * Checks are performed to ensure this. + */ + + currentSpad = offset; + for (index = 0; index < spadCount; index++) { + get_next_good_spad(goodSpadArray, size, currentSpad, + &nextGoodSpad); + + if (nextGoodSpad == -1) { + status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + + /* Confirm that the next good SPAD is non-aperture */ + if (is_aperture(start + nextGoodSpad) != apertureSpads) { + /* if we can't get the required number of good aperture + * spads from the current quadrant then this is an error + */ + status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + currentSpad = (uint32_t)nextGoodSpad; + enable_spad_bit(spadArray, size, currentSpad); + currentSpad++; + } + *lastSpad = currentSpad; + + if (status == VL53L0X_ERROR_NONE) + status = set_ref_spad_map(Dev, spadArray); + + + if (status == VL53L0X_ERROR_NONE) { + status = get_ref_spad_map(Dev, checkSpadArray); + + i = 0; + + /* Compare spad maps. If not equal report error. */ + while (i < size) { + if (spadArray[i] != checkSpadArray[i]) { + status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + i++; + } + } + return status; +} + + +VL53L0X_Error perform_ref_signal_measurement(VL53L0X_DEV Dev, + uint16_t *refSignalRate) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + VL53L0X_RangingMeasurementData_t rangingMeasurementData; + + uint8_t SequenceConfig = 0; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* + * This function performs a reference signal rate measurement. + */ + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0xC0); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_PerformSingleRangingMeasurement(Dev, + &rangingMeasurementData); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_RdWord(Dev, + VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, + refSignalRate); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (status == VL53L0X_ERROR_NONE) { + /* restore the previous Sequence Config */ + status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + } + + return status; +} + +VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, + uint32_t *refSpadCount, + uint8_t *isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t lastSpadArray[6]; + uint8_t startSelect = 0xB4; + uint32_t minimumSpadCount = 3; + uint32_t maxSpadCount = 44; + uint32_t currentSpadIndex = 0; + uint32_t lastSpadIndex = 0; + int32_t nextGoodSpad = 0; + uint16_t targetRefRate = 0x0A00; /* 20 MCPS in 9:7 format */ + uint16_t peakSignalRateRef; + uint32_t needAptSpads = 0; + uint32_t index = 0; + uint32_t spadArraySize = 6; + uint32_t signalRateDiff = 0; + uint32_t lastSignalRateDiff = 0; + uint8_t complete = 0; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + uint32_t refSpadCount_int = 0; + uint8_t isApertureSpads_int = 0; + + /* + * The reference SPAD initialization procedure determines the minimum + * amount of reference spads to be enables to achieve a target reference + * signal rate and should be performed once during initialization. + * + * Either aperture or non-aperture spads are applied but never both. + * Firstly non-aperture spads are set, begining with 5 spads, and + * increased one spad at a time until the closest measurement to the + * target rate is achieved. + * + * If the target rate is exceeded when 5 non-aperture spads are enabled, + * initialization is performed instead with aperture spads. + * + * When setting spads, a 'Good Spad Map' is applied. + * + * This procedure operates within a SPAD window of interest of a maximum + * 44 spads. + * The start point is currently fixed to 180, which lies towards the end + * of the non-aperture quadrant and runs in to the adjacent aperture + * quadrant. + */ + + + targetRefRate = PALDevDataGet(Dev, targetRefRate); + + /* + * Initialize Spad arrays. + * Currently the good spad map is initialised to 'All good'. + * This is a short term implementation. The good spad map will be + * provided as an input. + * Note that there are 6 bytes. Only the first 44 bits will be used to + * represent spads. + */ + for (index = 0; index < spadArraySize; index++) + Dev->Data.SpadData.RefSpadEnables[index] = 0; + + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, + startSelect); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE, 0); + + /* Perform ref calibration */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_ref_calibration(Dev, &VhvSettings, + &PhaseCal, 0); + + if (Status == VL53L0X_ERROR_NONE) { + /* Enable Minimum NON-APERTURE Spads */ + currentSpadIndex = 0; + lastSpadIndex = currentSpadIndex; + needAptSpads = 0; + Status = enable_ref_spads(Dev, + needAptSpads, + Dev->Data.SpadData.RefGoodSpadMap, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, + startSelect, + currentSpadIndex, + minimumSpadCount, + &lastSpadIndex); + } + + if (Status == VL53L0X_ERROR_NONE) { + currentSpadIndex = lastSpadIndex; + + Status = perform_ref_signal_measurement(Dev, + &peakSignalRateRef); + if ((Status == VL53L0X_ERROR_NONE) && + (peakSignalRateRef > targetRefRate)) { + /* Signal rate measurement too high, + * switch to APERTURE SPADs + */ + + for (index = 0; index < spadArraySize; index++) + Dev->Data.SpadData.RefSpadEnables[index] = 0; + + + /* Increment to the first APERTURE spad */ + while ((is_aperture(startSelect + currentSpadIndex) + == 0) && (currentSpadIndex < maxSpadCount)) { + currentSpadIndex++; + } + + needAptSpads = 1; + + Status = enable_ref_spads(Dev, + needAptSpads, + Dev->Data.SpadData.RefGoodSpadMap, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, + startSelect, + currentSpadIndex, + minimumSpadCount, + &lastSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + currentSpadIndex = lastSpadIndex; + Status = perform_ref_signal_measurement(Dev, + &peakSignalRateRef); + + if ((Status == VL53L0X_ERROR_NONE) && + (peakSignalRateRef > targetRefRate)) { + /* Signal rate still too high after + * setting the minimum number of + * APERTURE spads. Can do no more + * therefore set the min number of + * aperture spads as the result. + */ + isApertureSpads_int = 1; + refSpadCount_int = minimumSpadCount; + } + } + } else { + needAptSpads = 0; + } + } + + if ((Status == VL53L0X_ERROR_NONE) && + (peakSignalRateRef < targetRefRate)) { + /* At this point, the minimum number of either aperture + * or non-aperture spads have been set. Proceed to add + * spads and perform measurements until the target + * reference is reached. + */ + isApertureSpads_int = needAptSpads; + refSpadCount_int = minimumSpadCount; + + memcpy(lastSpadArray, Dev->Data.SpadData.RefSpadEnables, + spadArraySize); + lastSignalRateDiff = abs(peakSignalRateRef - + targetRefRate); + complete = 0; + + while (!complete) { + get_next_good_spad( + Dev->Data.SpadData.RefGoodSpadMap, + spadArraySize, currentSpadIndex, + &nextGoodSpad); + + if (nextGoodSpad == -1) { + Status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + + /* Cannot combine Aperture and Non-Aperture spads, so + * ensure the current spad is of the correct type. + */ + if (is_aperture((uint32_t)startSelect + nextGoodSpad) != + needAptSpads) { + /* At this point we have enabled the maximum + * number of Aperture spads. + */ + complete = 1; + break; + } + + (refSpadCount_int)++; + + currentSpadIndex = nextGoodSpad; + Status = enable_spad_bit( + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, currentSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + currentSpadIndex++; + /* Proceed to apply the additional spad and + * perform measurement. + */ + Status = set_ref_spad_map(Dev, + Dev->Data.SpadData.RefSpadEnables); + } + + if (Status != VL53L0X_ERROR_NONE) + break; + + Status = perform_ref_signal_measurement(Dev, + &peakSignalRateRef); + + if (Status != VL53L0X_ERROR_NONE) + break; + + signalRateDiff = abs(peakSignalRateRef - targetRefRate); + + if (peakSignalRateRef > targetRefRate) { + /* Select the spad map that provides the + * measurement closest to the target rate, + * either above or below it. + */ + if (signalRateDiff > lastSignalRateDiff) { + /* Previous spad map produced a closer + * measurement, so choose this. + */ + Status = set_ref_spad_map(Dev, + lastSpadArray); + memcpy( + Dev->Data.SpadData.RefSpadEnables, + lastSpadArray, spadArraySize); + + (refSpadCount_int)--; + } + complete = 1; + } else { + /* Continue to add spads */ + lastSignalRateDiff = signalRateDiff; + memcpy(lastSpadArray, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize); + } + + } /* while */ + } + + if (Status == VL53L0X_ERROR_NONE) { + *refSpadCount = refSpadCount_int; + *isApertureSpads = isApertureSpads_int; + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, (uint8_t)(*refSpadCount)); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, *isApertureSpads); + } + + return Status; +} + +VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, + uint32_t count, uint8_t isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint32_t currentSpadIndex = 0; + uint8_t startSelect = 0xB4; + uint32_t spadArraySize = 6; + uint32_t maxSpadCount = 44; + uint32_t lastSpadIndex; + uint32_t index; + + /* + * This function applies a requested number of reference spads, either + * aperture or + * non-aperture, as requested. + * The good spad map will be applied. + */ + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, + startSelect); + + for (index = 0; index < spadArraySize; index++) + Dev->Data.SpadData.RefSpadEnables[index] = 0; + + if (isApertureSpads) { + /* Increment to the first APERTURE spad */ + while ((is_aperture(startSelect + currentSpadIndex) == 0) && + (currentSpadIndex < maxSpadCount)) { + currentSpadIndex++; + } + } + Status = enable_ref_spads(Dev, + isApertureSpads, + Dev->Data.SpadData.RefGoodSpadMap, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, + startSelect, + currentSpadIndex, + count, + &lastSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, (uint8_t)(count)); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, isApertureSpads); + } + + return Status; +} + +VL53L0X_Error VL53L0X_get_reference_spads(VL53L0X_DEV Dev, + uint32_t *pSpadCount, uint8_t *pIsApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t refSpadsInitialised; + uint8_t refSpadArray[6]; + uint32_t cMaxSpadCount = 44; + uint32_t cSpadArraySize = 6; + uint32_t spadsEnabled; + uint8_t isApertureSpads = 0; + + refSpadsInitialised = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + RefSpadsInitialised); + + if (refSpadsInitialised == 1) { + + *pSpadCount = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount); + *pIsApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType); + } else { + + /* obtain spad info from device.*/ + Status = get_ref_spad_map(Dev, refSpadArray); + + if (Status == VL53L0X_ERROR_NONE) { + /* count enabled spads within spad map array and + * determine if Aperture or Non-Aperture. + */ + Status = count_enabled_spads(refSpadArray, + cSpadArraySize, + cMaxSpadCount, + &spadsEnabled, + &isApertureSpads); + + if (Status == VL53L0X_ERROR_NONE) { + + *pSpadCount = spadsEnabled; + *pIsApertureSpads = isApertureSpads; + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + RefSpadsInitialised, 1); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, + (uint8_t)spadsEnabled); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, isApertureSpads); + } + } + } + + return Status; +} + + +VL53L0X_Error VL53L0X_perform_single_ref_calibration(VL53L0X_DEV Dev, + uint8_t vhv_init_byte) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_START_STOP | + vhv_init_byte); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_measurement_poll_for_completion(Dev); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(Dev, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x00); + + return Status; +} + + +VL53L0X_Error VL53L0X_ref_calibration_io(VL53L0X_DEV Dev, + uint8_t read_not_write, + uint8_t VhvSettings, uint8_t PhaseCal, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, + const uint8_t vhv_enable, const uint8_t phase_enable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t PhaseCalint = 0; + + /* Read VHV from device */ + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (read_not_write) { + if (vhv_enable) + Status |= VL53L0X_RdByte(Dev, 0xCB, pVhvSettings); + if (phase_enable) + Status |= VL53L0X_RdByte(Dev, 0xEE, &PhaseCalint); + } else { + if (vhv_enable) + Status |= VL53L0X_WrByte(Dev, 0xCB, VhvSettings); + if (phase_enable) + Status |= VL53L0X_UpdateByte(Dev, 0xEE, 0x80, PhaseCal); + } + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + *pPhaseCal = (uint8_t)(PhaseCalint&0xEF); + + return Status; +} + + +VL53L0X_Error VL53L0X_perform_vhv_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, const uint8_t get_data_enable, + const uint8_t restore_config) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + uint8_t PhaseCalInt = 0; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + if (restore_config) + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* Run VHV */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_single_ref_calibration(Dev, 0x40); + + /* Read VHV from device */ + if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { + Status = VL53L0X_ref_calibration_io(Dev, 1, + VhvSettings, PhaseCal, /* Not used here */ + pVhvSettings, &PhaseCalInt, + 1, 0); + } else + *pVhvSettings = 0; + + + if ((Status == VL53L0X_ERROR_NONE) && restore_config) { + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, + uint8_t *pPhaseCal, const uint8_t get_data_enable, + const uint8_t restore_config) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + uint8_t VhvSettingsint; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + if (restore_config) + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* Run PhaseCal */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x02); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_single_ref_calibration(Dev, 0x0); + + /* Read PhaseCal from device */ + if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { + Status = VL53L0X_ref_calibration_io(Dev, 1, + VhvSettings, PhaseCal, /* Not used here */ + &VhvSettingsint, pPhaseCal, + 0, 1); + } else + *pPhaseCal = 0; + + + if ((Status == VL53L0X_ERROR_NONE) && restore_config) { + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* In the following function we don't save the config to optimize + * writes on device. Config is saved and restored only once. + */ + Status = VL53L0X_perform_vhv_calibration( + Dev, pVhvSettings, get_data_enable, 0); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_phase_calibration( + Dev, pPhaseCal, get_data_enable, 0); + + + if (Status == VL53L0X_ERROR_NONE) { + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_set_ref_calibration(VL53L0X_DEV Dev, + uint8_t VhvSettings, uint8_t PhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t pVhvSettings; + uint8_t pPhaseCal; + + Status = VL53L0X_ref_calibration_io(Dev, 0, + VhvSettings, PhaseCal, + &pVhvSettings, &pPhaseCal, + 1, 1); + + return Status; +} + +VL53L0X_Error VL53L0X_get_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + + Status = VL53L0X_ref_calibration_io(Dev, 1, + VhvSettings, PhaseCal, + pVhvSettings, pPhaseCal, + 1, 1); + + return Status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" new file mode 100644 index 00000000..3933a00b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" @@ -0,0 +1,2128 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_calibration.h" + + +#ifndef __KERNEL__ +#include +#endif +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + +VL53L0X_Error VL53L0X_reverse_bytes(uint8_t *data, uint32_t size) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t tempData; + uint32_t mirrorIndex; + uint32_t middle = size/2; + uint32_t index; + + for (index = 0; index < middle; index++) { + mirrorIndex = size - index - 1; + tempData = data[index]; + data[index] = data[mirrorIndex]; + data[mirrorIndex] = tempData; + } + return Status; +} + +VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t NewDataReady = 0; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + LoopNb = 0; + + do { + Status = VL53L0X_GetMeasurementDataReady(Dev, &NewDataReady); + if (Status != 0) + break; /* the error is set */ + + if (NewDataReady == 1) + break; /* done note that status == 0 */ + + LoopNb++; + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) { + Status = VL53L0X_ERROR_TIME_OUT; + break; + } + + VL53L0X_PollingDelay(Dev); + } while (1); + + LOG_FUNCTION_END(Status); + + return Status; +} + + +uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg) +{ + /*! + * Converts the encoded VCSEL period register value into the real + * period in PLL clocks + */ + + uint8_t vcsel_period_pclks = 0; + + vcsel_period_pclks = (vcsel_period_reg + 1) << 1; + + return vcsel_period_pclks; +} + +uint8_t VL53L0X_encode_vcsel_period(uint8_t vcsel_period_pclks) +{ + /*! + * Converts the encoded VCSEL period register value into the real period + * in PLL clocks + */ + + uint8_t vcsel_period_reg = 0; + + vcsel_period_reg = (vcsel_period_pclks >> 1) - 1; + + return vcsel_period_reg; +} + + +uint32_t VL53L0X_isqrt(uint32_t num) +{ + /* + * Implements an integer square root + * + * From: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots + */ + + uint32_t res = 0; + uint32_t bit = 1 << 30; + /* The second-to-top bit is set: + * 1 << 14 for 16-bits, 1 << 30 for 32 bits + */ + + /* "bit" starts at the highest power of four <= the argument. */ + while (bit > num) + bit >>= 2; + + + while (bit != 0) { + if (num >= res + bit) { + num -= res + bit; + res = (res >> 1) + bit; + } else + res >>= 1; + + bit >>= 2; + } + + return res; +} + + +uint32_t VL53L0X_quadrature_sum(uint32_t a, uint32_t b) +{ + /* + * Implements a quadrature sum + * + * rea = sqrt(a^2 + b^2) + * + * Trap overflow case max input value is 65535 (16-bit value) + * as internal calc are 32-bit wide + * + * If overflow then seta output to maximum + */ + uint32_t res = 0; + + if (a > 65535 || b > 65535) + res = 65535; + else + res = VL53L0X_isqrt(a * a + b * b); + + return res; +} + + +VL53L0X_Error VL53L0X_device_read_strobe(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t strobe; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + Status |= VL53L0X_WrByte(Dev, 0x83, 0x00); + + /* polling + * use timeout to avoid deadlock + */ + if (Status == VL53L0X_ERROR_NONE) { + LoopNb = 0; + do { + Status = VL53L0X_RdByte(Dev, 0x83, &strobe); + if ((strobe != 0x00) || Status != VL53L0X_ERROR_NONE) + break; + + LoopNb = LoopNb + 1; + } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP); + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) + Status = VL53L0X_ERROR_TIME_OUT; + + } + + Status |= VL53L0X_WrByte(Dev, 0x83, 0x01); + + LOG_FUNCTION_END(Status); + return Status; + +} + +VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option) +{ + + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t byte; + uint32_t TmpDWord; + uint8_t ModuleId; + uint8_t Revision; + uint8_t ReferenceSpadCount = 0; + uint8_t ReferenceSpadType = 0; + uint32_t PartUIDUpper = 0; + uint32_t PartUIDLower = 0; + uint32_t OffsetFixed1104_mm = 0; + int16_t OffsetMicroMeters = 0; + uint32_t DistMeasTgtFixed1104_mm = 400 << 4; + uint32_t DistMeasFixed1104_400_mm = 0; + uint32_t SignalRateMeasFixed1104_400_mm = 0; + char ProductId[19]; + char *ProductId_tmp; + uint8_t ReadDataFromDeviceDone; + FixPoint1616_t SignalRateMeasFixed400mmFix = 0; + uint8_t NvmRefGoodSpadMap[VL53L0X_REF_SPAD_BUFFER_SIZE]; + int i; + + + LOG_FUNCTION_START(""); + + ReadDataFromDeviceDone = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReadDataFromDeviceDone); + + /* This access is done only once after that a GetDeviceInfo or + * datainit is done + */ + if (ReadDataFromDeviceDone != 7) { + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); + Status |= VL53L0X_RdByte(Dev, 0x83, &byte); + Status |= VL53L0X_WrByte(Dev, 0x83, byte|4); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x07); + Status |= VL53L0X_WrByte(Dev, 0x81, 0x01); + + Status |= VL53L0X_PollingDelay(Dev); + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + + if (((option & 1) == 1) && + ((ReadDataFromDeviceDone & 1) == 0)) { + Status |= VL53L0X_WrByte(Dev, 0x94, 0x6b); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ReferenceSpadCount = (uint8_t)((TmpDWord >> 8) & 0x07f); + ReferenceSpadType = (uint8_t)((TmpDWord >> 15) & 0x01); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x24); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + + NvmRefGoodSpadMap[0] = (uint8_t)((TmpDWord >> 24) + & 0xff); + NvmRefGoodSpadMap[1] = (uint8_t)((TmpDWord >> 16) + & 0xff); + NvmRefGoodSpadMap[2] = (uint8_t)((TmpDWord >> 8) + & 0xff); + NvmRefGoodSpadMap[3] = (uint8_t)(TmpDWord & 0xff); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x25); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + NvmRefGoodSpadMap[4] = (uint8_t)((TmpDWord >> 24) + & 0xff); + NvmRefGoodSpadMap[5] = (uint8_t)((TmpDWord >> 16) + & 0xff); + } + + if (((option & 2) == 2) && + ((ReadDataFromDeviceDone & 2) == 0)) { + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x02); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdByte(Dev, 0x90, &ModuleId); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdByte(Dev, 0x90, &Revision); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x77); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[0] = (char)((TmpDWord >> 25) & 0x07f); + ProductId[1] = (char)((TmpDWord >> 18) & 0x07f); + ProductId[2] = (char)((TmpDWord >> 11) & 0x07f); + ProductId[3] = (char)((TmpDWord >> 4) & 0x07f); + + byte = (uint8_t)((TmpDWord & 0x00f) << 3); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x78); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[4] = (char)(byte + + ((TmpDWord >> 29) & 0x07f)); + ProductId[5] = (char)((TmpDWord >> 22) & 0x07f); + ProductId[6] = (char)((TmpDWord >> 15) & 0x07f); + ProductId[7] = (char)((TmpDWord >> 8) & 0x07f); + ProductId[8] = (char)((TmpDWord >> 1) & 0x07f); + + byte = (uint8_t)((TmpDWord & 0x001) << 6); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x79); + + Status |= VL53L0X_device_read_strobe(Dev); + + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[9] = (char)(byte + + ((TmpDWord >> 26) & 0x07f)); + ProductId[10] = (char)((TmpDWord >> 19) & 0x07f); + ProductId[11] = (char)((TmpDWord >> 12) & 0x07f); + ProductId[12] = (char)((TmpDWord >> 5) & 0x07f); + + byte = (uint8_t)((TmpDWord & 0x01f) << 2); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7A); + + Status |= VL53L0X_device_read_strobe(Dev); + + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[13] = (char)(byte + + ((TmpDWord >> 30) & 0x07f)); + ProductId[14] = (char)((TmpDWord >> 23) & 0x07f); + ProductId[15] = (char)((TmpDWord >> 16) & 0x07f); + ProductId[16] = (char)((TmpDWord >> 9) & 0x07f); + ProductId[17] = (char)((TmpDWord >> 2) & 0x07f); + ProductId[18] = '\0'; + + } + + if (((option & 4) == 4) && + ((ReadDataFromDeviceDone & 4) == 0)) { + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDUpper); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7C); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDLower); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x73); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + SignalRateMeasFixed1104_400_mm = (TmpDWord & + 0x0000000ff) << 8; + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x74); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + SignalRateMeasFixed1104_400_mm |= ((TmpDWord & + 0xff000000) >> 24); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x75); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + DistMeasFixed1104_400_mm = (TmpDWord & 0x0000000ff) + << 8; + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x76); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + DistMeasFixed1104_400_mm |= ((TmpDWord & 0xff000000) + >> 24); + } + + Status |= VL53L0X_WrByte(Dev, 0x81, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); + Status |= VL53L0X_RdByte(Dev, 0x83, &byte); + Status |= VL53L0X_WrByte(Dev, 0x83, byte&0xfb); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + + if ((Status == VL53L0X_ERROR_NONE) && + (ReadDataFromDeviceDone != 7)) { + /* Assign to variable if status is ok */ + if (((option & 1) == 1) && + ((ReadDataFromDeviceDone & 1) == 0)) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, ReferenceSpadCount); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, ReferenceSpadType); + + for (i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++) { + Dev->Data.SpadData.RefGoodSpadMap[i] = + NvmRefGoodSpadMap[i]; + } + } + + if (((option & 2) == 2) && + ((ReadDataFromDeviceDone & 2) == 0)) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ModuleId, ModuleId); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + Revision, Revision); + + ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ProductId); + VL53L0X_COPYSTRING(ProductId_tmp, ProductId); + + } + + if (((option & 4) == 4) && + ((ReadDataFromDeviceDone & 4) == 0)) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + PartUIDUpper, PartUIDUpper); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + PartUIDLower, PartUIDLower); + + SignalRateMeasFixed400mmFix = + VL53L0X_FIXPOINT97TOFIXPOINT1616( + SignalRateMeasFixed1104_400_mm); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + SignalRateMeasFixed400mm, + SignalRateMeasFixed400mmFix); + + OffsetMicroMeters = 0; + if (DistMeasFixed1104_400_mm != 0) { + OffsetFixed1104_mm = + DistMeasFixed1104_400_mm - + DistMeasTgtFixed1104_mm; + OffsetMicroMeters = (OffsetFixed1104_mm + * 1000) >> 4; + OffsetMicroMeters *= -1; + } + + PALDevDataSet(Dev, + Part2PartOffsetAdjustmentNVMMicroMeter, + OffsetMicroMeters); + } + byte = (uint8_t)(ReadDataFromDeviceDone|option); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, + byte); + } + + LOG_FUNCTION_END(Status); + return Status; +} + + +uint32_t VL53L0X_calc_macro_period_ps(VL53L0X_DEV Dev, + uint8_t vcsel_period_pclks) +{ + uint64_t PLL_period_ps; + uint32_t macro_period_vclks; + uint32_t macro_period_ps; + + LOG_FUNCTION_START(""); + + /* The above calculation will produce rounding errors, + * therefore set fixed value + */ + PLL_period_ps = 1655; + + macro_period_vclks = 2304; + macro_period_ps = (uint32_t)(macro_period_vclks + * vcsel_period_pclks * PLL_period_ps); + + LOG_FUNCTION_END(""); + return macro_period_ps; +} + +uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks) +{ + /*! + * Encode timeout in macro periods in (LSByte * 2^MSByte) + 1 format + */ + + uint16_t encoded_timeout = 0; + uint32_t ls_byte = 0; + uint16_t ms_byte = 0; + + if (timeout_macro_clks > 0) { + ls_byte = timeout_macro_clks - 1; + + while ((ls_byte & 0xFFFFFF00) > 0) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + + encoded_timeout = (ms_byte << 8) + + (uint16_t) (ls_byte & 0x000000FF); + } + + return encoded_timeout; + +} + +uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout) +{ + /*! + * Decode 16-bit timeout register value - format (LSByte * 2^MSByte) + 1 + */ + + uint32_t timeout_macro_clks = 0; + + timeout_macro_clks = ((uint32_t) (encoded_timeout & 0x00FF) + << (uint32_t) ((encoded_timeout & 0xFF00) >> 8)) + 1; + + return timeout_macro_clks; +} + + +/* To convert ms into register value */ +uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, + uint32_t timeout_period_us, + uint8_t vcsel_period_pclks) +{ + uint32_t macro_period_ps; + uint32_t macro_period_ns; + uint32_t timeout_period_mclks = 0; + + macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); + macro_period_ns = (macro_period_ps + 500) / 1000; + + timeout_period_mclks = + (uint32_t) (((timeout_period_us * 1000) + + (macro_period_ns / 2)) / macro_period_ns); + + return timeout_period_mclks; +} + +/* To convert register value into us */ +uint32_t VL53L0X_calc_timeout_us(VL53L0X_DEV Dev, + uint16_t timeout_period_mclks, + uint8_t vcsel_period_pclks) +{ + uint32_t macro_period_ps; + uint32_t macro_period_ns; + uint32_t actual_timeout_period_us = 0; + + macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); + macro_period_ns = (macro_period_ps + 500) / 1000; + + actual_timeout_period_us = + ((timeout_period_mclks * macro_period_ns) + 500) / 1000; + + return actual_timeout_period_us; +} + + +VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t *pTimeOutMicroSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t CurrentVCSELPulsePeriodPClk; + uint8_t EncodedTimeOutByte = 0; + uint32_t TimeoutMicroSeconds = 0; + uint16_t PreRangeEncodedTimeOut = 0; + uint16_t MsrcTimeOutMClks; + uint16_t PreRangeTimeOutMClks; + uint16_t FinalRangeTimeOutMClks = 0; + uint16_t FinalRangeEncodedTimeOut; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + + if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, + &EncodedTimeOutByte); + } + MsrcTimeOutMClks = VL53L0X_decode_timeout(EncodedTimeOutByte); + + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + MsrcTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods (MCLKS) */ + if (Status == VL53L0X_ERROR_NONE) { + + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &PreRangeEncodedTimeOut); + } + + PreRangeTimeOutMClks = VL53L0X_decode_timeout( + PreRangeEncodedTimeOut); + + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + PreRangeTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { + + VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + PreRangeTimeOutMClks = 0; + + if (SchedulerSequenceSteps.PreRangeOn) { + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods + * (MCLKS) + */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &PreRangeEncodedTimeOut); + PreRangeTimeOutMClks = VL53L0X_decode_timeout( + PreRangeEncodedTimeOut); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + /* Retrieve FINAL-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &CurrentVCSELPulsePeriodPClk); + } + + /* Retrieve FINAL-RANGE Timeout in Macro periods (MCLKS) */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &FinalRangeEncodedTimeOut); + FinalRangeTimeOutMClks = VL53L0X_decode_timeout( + FinalRangeEncodedTimeOut); + } + + FinalRangeTimeOutMClks -= PreRangeTimeOutMClks; + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + FinalRangeTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } + + *pTimeOutMicroSecs = TimeoutMicroSeconds; + + return Status; +} + + +VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t TimeOutMicroSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t CurrentVCSELPulsePeriodPClk; + uint8_t MsrcEncodedTimeOut; + uint16_t PreRangeEncodedTimeOut; + uint16_t PreRangeTimeOutMClks; + uint16_t MsrcRangeTimeOutMClks; + uint32_t FinalRangeTimeOutMClks; + uint16_t FinalRangeEncodedTimeOut; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + + if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + if (Status == VL53L0X_ERROR_NONE) { + MsrcRangeTimeOutMClks = VL53L0X_calc_timeout_mclks(Dev, + TimeOutMicroSecs, + (uint8_t)CurrentVCSELPulsePeriodPClk); + + if (MsrcRangeTimeOutMClks > 256) + MsrcEncodedTimeOut = 255; + else + MsrcEncodedTimeOut = + (uint8_t)MsrcRangeTimeOutMClks - 1; + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + LastEncodedTimeout, + MsrcEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, + MsrcEncodedTimeOut); + } + } else { + + if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + PreRangeTimeOutMClks = + VL53L0X_calc_timeout_mclks(Dev, + TimeOutMicroSecs, + (uint8_t)CurrentVCSELPulsePeriodPClk); + PreRangeEncodedTimeOut = VL53L0X_encode_timeout( + PreRangeTimeOutMClks); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + LastEncodedTimeout, + PreRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + PreRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeTimeoutMicroSecs, + TimeOutMicroSecs); + } + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { + + /* For the final range timeout, the pre-range timeout + * must be added. To do this both final and pre-range + * timeouts must be expressed in macro periods MClks + * because they have different vcsel periods. + */ + + VL53L0X_GetSequenceStepEnables(Dev, + &SchedulerSequenceSteps); + PreRangeTimeOutMClks = 0; + if (SchedulerSequenceSteps.PreRangeOn) { + + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods + * (MCLKS) + */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, 0x51, + &PreRangeEncodedTimeOut); + PreRangeTimeOutMClks = + VL53L0X_decode_timeout( + PreRangeEncodedTimeOut); + } + } + + /* Calculate FINAL RANGE Timeout in Macro Periods + * (MCLKS) and add PRE-RANGE value + */ + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &CurrentVCSELPulsePeriodPClk); + } + if (Status == VL53L0X_ERROR_NONE) { + + FinalRangeTimeOutMClks = + VL53L0X_calc_timeout_mclks(Dev, + TimeOutMicroSecs, + (uint8_t) CurrentVCSELPulsePeriodPClk); + + FinalRangeTimeOutMClks += PreRangeTimeOutMClks; + + FinalRangeEncodedTimeOut = + VL53L0X_encode_timeout(FinalRangeTimeOutMClks); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrWord(Dev, 0x71, + FinalRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeTimeoutMicroSecs, + TimeOutMicroSecs); + } + } + } else + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + return Status; +} + +VL53L0X_Error VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t vcsel_period_reg; + uint8_t MinPreVcselPeriodPCLK = 12; + uint8_t MaxPreVcselPeriodPCLK = 18; + uint8_t MinFinalVcselPeriodPCLK = 8; + uint8_t MaxFinalVcselPeriodPCLK = 14; + uint32_t MeasurementTimingBudgetMicroSeconds; + uint32_t FinalRangeTimeoutMicroSeconds; + uint32_t PreRangeTimeoutMicroSeconds; + uint32_t MsrcTimeoutMicroSeconds; + uint8_t PhaseCalInt = 0; + + /* Check if valid clock period requested */ + + if ((VCSELPulsePeriodPCLK % 2) != 0) { + /* Value must be an even number */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_PRE_RANGE && + (VCSELPulsePeriodPCLK < MinPreVcselPeriodPCLK || + VCSELPulsePeriodPCLK > MaxPreVcselPeriodPCLK)) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_FINAL_RANGE && + (VCSELPulsePeriodPCLK < MinFinalVcselPeriodPCLK || + VCSELPulsePeriodPCLK > MaxFinalVcselPeriodPCLK)) { + + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + /* Apply specific settings for the requested clock period */ + + if (Status != VL53L0X_ERROR_NONE) + return Status; + + + if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_PRE_RANGE) { + + /* Set phase check limits */ + if (VCSELPulsePeriodPCLK == 12) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x18); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } else if (VCSELPulsePeriodPCLK == 14) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x30); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } else if (VCSELPulsePeriodPCLK == 16) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x40); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } else if (VCSELPulsePeriodPCLK == 18) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x50); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } + } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_FINAL_RANGE) { + + if (VCSELPulsePeriodPCLK == 8) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x10); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x30); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } else if (VCSELPulsePeriodPCLK == 10) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x28); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x20); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } else if (VCSELPulsePeriodPCLK == 12) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x38); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x20); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } else if (VCSELPulsePeriodPCLK == 14) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x048); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x20); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } + } + + + /* Re-calculate and apply timeouts, in macro periods */ + + if (Status == VL53L0X_ERROR_NONE) { + vcsel_period_reg = VL53L0X_encode_vcsel_period((uint8_t) + VCSELPulsePeriodPCLK); + + /* When the VCSEL period for the pre or final range is changed, + * the corresponding timeout must be read from the device using + * the current VCSEL period, then the new VCSEL period can be + * applied. The timeout then must be written back to the device + * using the new VCSEL period. + * + * For the MSRC timeout, the same applies - this timeout being + * dependant on the pre-range vcsel period. + */ + switch (VcselPeriodType) { + case VL53L0X_VCSEL_PERIOD_PRE_RANGE: + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, + vcsel_period_reg); + + + if (Status == VL53L0X_ERROR_NONE) + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + PreRangeTimeoutMicroSeconds); + + + if (Status == VL53L0X_ERROR_NONE) + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + MsrcTimeoutMicroSeconds); + + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeVcselPulsePeriod, + VCSELPulsePeriodPCLK); + break; + case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &FinalRangeTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, + vcsel_period_reg); + + + if (Status == VL53L0X_ERROR_NONE) + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + FinalRangeTimeoutMicroSeconds); + + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeVcselPulsePeriod, + VCSELPulsePeriodPCLK); + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + /* Finally, the timing budget must be re-applied */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_GETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + MeasurementTimingBudgetMicroSeconds); + } + + /* Perform the phase calibration. This is needed after changing on + * vcsel period. + * get_data_enable = 0, restore_config = 1 + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_phase_calibration( + Dev, &PhaseCalInt, 0, 1); + + return Status; +} + +VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t vcsel_period_reg; + + switch (VcselPeriodType) { + case VL53L0X_VCSEL_PERIOD_PRE_RANGE: + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, + &vcsel_period_reg); + break; + case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, + &vcsel_period_reg); + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + if (Status == VL53L0X_ERROR_NONE) + *pVCSELPulsePeriodPCLK = + VL53L0X_decode_vcsel_period(vcsel_period_reg); + + return Status; +} + + + +VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint32_t FinalRangeTimingBudgetMicroSeconds; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; + uint32_t StartOverheadMicroSeconds = 1910; + uint32_t EndOverheadMicroSeconds = 960; + uint32_t MsrcOverheadMicroSeconds = 660; + uint32_t TccOverheadMicroSeconds = 590; + uint32_t DssOverheadMicroSeconds = 690; + uint32_t PreRangeOverheadMicroSeconds = 660; + uint32_t FinalRangeOverheadMicroSeconds = 550; + uint32_t PreRangeTimeoutMicroSeconds = 0; + uint32_t SubTimeout = 0; + + LOG_FUNCTION_START(""); + + FinalRangeTimingBudgetMicroSeconds = + MeasurementTimingBudgetMicroSeconds - + (StartOverheadMicroSeconds + EndOverheadMicroSeconds); + + Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + + if (Status == VL53L0X_ERROR_NONE && + (SchedulerSequenceSteps.TccOn || + SchedulerSequenceSteps.MsrcOn || + SchedulerSequenceSteps.DssOn)) { + + /* TCC, MSRC and DSS all share the same timeout */ + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcDccTccTimeoutMicroSeconds); + + /* Subtract the TCC, MSRC and DSS timeouts if they are + * enabled. + */ + + if (Status != VL53L0X_ERROR_NONE) + return Status; + + /* TCC */ + if (SchedulerSequenceSteps.TccOn) { + + SubTimeout = MsrcDccTccTimeoutMicroSeconds + + TccOverheadMicroSeconds; + + if (SubTimeout < + FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds -= + SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + /* DSS */ + if (SchedulerSequenceSteps.DssOn) { + + SubTimeout = 2 * (MsrcDccTccTimeoutMicroSeconds + + DssOverheadMicroSeconds); + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds + -= SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } else if (SchedulerSequenceSteps.MsrcOn) { + /* MSRC */ + SubTimeout = MsrcDccTccTimeoutMicroSeconds + + MsrcOverheadMicroSeconds; + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds + -= SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + } + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + if (SchedulerSequenceSteps.PreRangeOn) { + + /* Subtract the Pre-range timeout if enabled. */ + + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + + SubTimeout = PreRangeTimeoutMicroSeconds + + PreRangeOverheadMicroSeconds; + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds -= SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + + if (Status == VL53L0X_ERROR_NONE && + SchedulerSequenceSteps.FinalRangeOn) { + + FinalRangeTimingBudgetMicroSeconds -= + FinalRangeOverheadMicroSeconds; + + /* Final Range Timeout + * Note that the final range timeout is determined by the timing + * budget and the sum of all other timeouts within the sequence. + * If there is no room for the final range timeout, then an + * error will be set. Otherwise the remaining time will be + * applied to the final range. + */ + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + FinalRangeTimingBudgetMicroSeconds); + + VL53L0X_SETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + } + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + uint32_t FinalRangeTimeoutMicroSeconds; + uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; + uint32_t StartOverheadMicroSeconds = 1910; + uint32_t EndOverheadMicroSeconds = 960; + uint32_t MsrcOverheadMicroSeconds = 660; + uint32_t TccOverheadMicroSeconds = 590; + uint32_t DssOverheadMicroSeconds = 690; + uint32_t PreRangeOverheadMicroSeconds = 660; + uint32_t FinalRangeOverheadMicroSeconds = 550; + uint32_t PreRangeTimeoutMicroSeconds = 0; + + LOG_FUNCTION_START(""); + + /* Start and end overhead times always present */ + *pMeasurementTimingBudgetMicroSeconds + = StartOverheadMicroSeconds + EndOverheadMicroSeconds; + + Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + + if (SchedulerSequenceSteps.TccOn || + SchedulerSequenceSteps.MsrcOn || + SchedulerSequenceSteps.DssOn) { + + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcDccTccTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) { + if (SchedulerSequenceSteps.TccOn) { + *pMeasurementTimingBudgetMicroSeconds += + MsrcDccTccTimeoutMicroSeconds + + TccOverheadMicroSeconds; + } + + if (SchedulerSequenceSteps.DssOn) { + *pMeasurementTimingBudgetMicroSeconds += + 2 * (MsrcDccTccTimeoutMicroSeconds + + DssOverheadMicroSeconds); + } else if (SchedulerSequenceSteps.MsrcOn) { + *pMeasurementTimingBudgetMicroSeconds += + MsrcDccTccTimeoutMicroSeconds + + MsrcOverheadMicroSeconds; + } + } + } + + if (Status == VL53L0X_ERROR_NONE) { + if (SchedulerSequenceSteps.PreRangeOn) { + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + *pMeasurementTimingBudgetMicroSeconds += + PreRangeTimeoutMicroSeconds + + PreRangeOverheadMicroSeconds; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + if (SchedulerSequenceSteps.FinalRangeOn) { + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &FinalRangeTimeoutMicroSeconds); + *pMeasurementTimingBudgetMicroSeconds += + (FinalRangeTimeoutMicroSeconds + + FinalRangeOverheadMicroSeconds); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + *pMeasurementTimingBudgetMicroSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; +} + + + +VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int i; + int Index; + uint8_t msb; + uint8_t lsb; + uint8_t SelectParam; + uint8_t NumberOfWrites; + uint8_t Address; + uint8_t localBuffer[4]; /* max */ + uint16_t Temp16; + + LOG_FUNCTION_START(""); + + Index = 0; + + while ((*(pTuningSettingBuffer + Index) != 0) && + (Status == VL53L0X_ERROR_NONE)) { + NumberOfWrites = *(pTuningSettingBuffer + Index); + Index++; + if (NumberOfWrites == 0xFF) { + /* internal parameters */ + SelectParam = *(pTuningSettingBuffer + Index); + Index++; + switch (SelectParam) { + case 0: /* uint16_t SigmaEstRefArray -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, SigmaEstRefArray, Temp16); + break; + case 1: /* uint16_t SigmaEstEffPulseWidth -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, SigmaEstEffPulseWidth, + Temp16); + break; + case 2: /* uint16_t SigmaEstEffAmbWidth -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, SigmaEstEffAmbWidth, Temp16); + break; + case 3: /* uint16_t targetRefRate -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, targetRefRate, Temp16); + break; + default: /* invalid parameter */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + } else if (NumberOfWrites <= 4) { + Address = *(pTuningSettingBuffer + Index); + Index++; + + for (i = 0; i < NumberOfWrites; i++) { + localBuffer[i] = *(pTuningSettingBuffer + + Index); + Index++; + } + + Status = VL53L0X_WriteMulti(Dev, Address, localBuffer, + NumberOfWrites); + + } else { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_xtalk_rate_mcps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + uint8_t xtalkCompEnable; + FixPoint1616_t totalXtalkMegaCps; + FixPoint1616_t xtalkPerSpadMegaCps; + + *ptotal_xtalk_rate_mcps = 0; + + Status = VL53L0X_GetXTalkCompensationEnable(Dev, &xtalkCompEnable); + if (Status == VL53L0X_ERROR_NONE) { + + if (xtalkCompEnable) { + + VL53L0X_GETPARAMETERFIELD( + Dev, + XTalkCompensationRateMegaCps, + xtalkPerSpadMegaCps); + + /* FixPoint1616 * FixPoint 8:8 = FixPoint0824 */ + totalXtalkMegaCps = + pRangingMeasurementData->EffectiveSpadRtnCount * + xtalkPerSpadMegaCps; + + /* FixPoint0824 >> 8 = FixPoint1616 */ + *ptotal_xtalk_rate_mcps = + (totalXtalkMegaCps + 0x80) >> 8; + } + } + + return Status; +} + +VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_signal_rate_mcps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t totalXtalkMegaCps; + + LOG_FUNCTION_START(""); + + *ptotal_signal_rate_mcps = + pRangingMeasurementData->SignalRateRtnMegaCps; + + Status = VL53L0X_get_total_xtalk_rate( + Dev, pRangingMeasurementData, &totalXtalkMegaCps); + + if (Status == VL53L0X_ERROR_NONE) + *ptotal_signal_rate_mcps += totalXtalkMegaCps; + + return Status; +} + +VL53L0X_Error get_dmax_lut_points(VL53L0X_DMaxLUT_t data, uint32_t lut_size, + FixPoint1616_t input, int32_t *index0, int32_t *index1){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t index0_tmp = 0; + FixPoint1616_t index1_tmp = 0; + int index = 0; + + for (index = 0; index < lut_size; index++) { + if (input <= data.ambRate_mcps[index]) { + index1_tmp = index; + break; + } + } + + if (index == lut_size) { + /* input is higher than last x point */ + index0_tmp = index1_tmp = lut_size - 1; + } else if (index1_tmp == 0) { + /* input is lower than first x point */ + index0_tmp = 0; + } else{ + /* input is in between 2 points */ + index0_tmp = index1_tmp - 1; + } + + *index0 = index0_tmp; + *index1 = index1_tmp; + + return Status; +} + +VL53L0X_Error VL53L0X_calc_dmax( + VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceParameters_t CurrentParameters; + int32_t index0 = 0; + int32_t index1 = 0; + FixPoint1616_t amb0, amb1, dmax0, dmax1; + FixPoint1616_t dmax_mm; + FixPoint1616_t linearSlope; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + + if (ambRateMeas <= CurrentParameters.dmax_lut.ambRate_mcps[0]) { + dmax_mm = CurrentParameters.dmax_lut.dmax_mm[0]; + } else if (ambRateMeas >= + CurrentParameters.dmax_lut. + ambRate_mcps[VL53L0X_DMAX_LUT_SIZE - 1]) { + dmax_mm = + CurrentParameters.dmax_lut.dmax_mm[VL53L0X_DMAX_LUT_SIZE - + 1]; + } else{ + get_dmax_lut_points(CurrentParameters.dmax_lut, + VL53L0X_DMAX_LUT_SIZE, ambRateMeas, &index0, &index1); + + if (index0 == index1) { + dmax_mm = CurrentParameters.dmax_lut.dmax_mm[index0]; + } else { + amb0 = CurrentParameters.dmax_lut.ambRate_mcps[index0]; + amb1 = CurrentParameters.dmax_lut.ambRate_mcps[index1]; + dmax0 = CurrentParameters.dmax_lut.dmax_mm[index0]; + dmax1 = CurrentParameters.dmax_lut.dmax_mm[index1]; + if ((amb1 - amb0) != 0) { + /* Fix16:16/Fix16:8 => Fix16:8 */ + linearSlope = (dmax0-dmax1)/((amb1-amb0) >> 8); + + /* Fix16:8 * Fix16:8 => Fix16:16 */ + dmax_mm = + (((amb1 - + ambRateMeas) >> 8) * linearSlope) + + dmax1; + } else{ + dmax_mm = dmax0; + } + } + } + *pdmax_mm = (uint32_t)(dmax_mm >> 16); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *pSigmaEstimate) +{ + /* Expressed in 100ths of a ns, i.e. centi-ns */ + const uint32_t cPulseEffectiveWidth_centi_ns = 800; + /* Expressed in 100ths of a ns, i.e. centi-ns */ + const uint32_t cAmbientEffectiveWidth_centi_ns = 600; + const FixPoint1616_t cDfltFinalRangeIntegrationTimeMilliSecs = + 0x00190000; /* 25ms */ + const uint32_t cVcselPulseWidth_ps = 4700; /* pico secs */ + const FixPoint1616_t cSigmaEstMax = 0x028F87AE; + const FixPoint1616_t cSigmaEstRtnMax = 0xF000; + const FixPoint1616_t cAmbToSignalRatioMax = 0xF0000000/ + cAmbientEffectiveWidth_centi_ns; + /* Time Of Flight per mm (6.6 pico secs) */ + const FixPoint1616_t cTOF_per_mm_ps = 0x0006999A; + const uint32_t c16BitRoundingParam = 0x00008000; + const FixPoint1616_t cMaxXTalk_kcps = 0x00320000; + const uint32_t cPllPeriod_ps = 1655; + + uint32_t vcselTotalEventsRtn; + uint32_t finalRangeTimeoutMicroSecs; + uint32_t preRangeTimeoutMicroSecs; + uint32_t finalRangeIntegrationTimeMilliSecs; + FixPoint1616_t sigmaEstimateP1; + FixPoint1616_t sigmaEstimateP2; + FixPoint1616_t sigmaEstimateP3; + FixPoint1616_t deltaT_ps; + FixPoint1616_t pwMult; + FixPoint1616_t sigmaEstRtn; + FixPoint1616_t sigmaEstimate; + FixPoint1616_t xTalkCorrection; + FixPoint1616_t ambientRate_kcps; + FixPoint1616_t peakSignalRate_kcps; + FixPoint1616_t xTalkCompRate_mcps; + uint32_t xTalkCompRate_kcps; + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t diff1_mcps; + FixPoint1616_t diff2_mcps; + FixPoint1616_t sqr1; + FixPoint1616_t sqr2; + FixPoint1616_t sqrSum; + FixPoint1616_t sqrtResult_centi_ns; + FixPoint1616_t sqrtResult; + FixPoint1616_t totalSignalRate_mcps; + FixPoint1616_t sigmaEstRef; + uint32_t vcselWidth; + uint32_t finalRangeMacroPCLKS; + uint32_t preRangeMacroPCLKS; + uint32_t peakVcselDuration_us; + uint8_t finalRangeVcselPCLKS; + uint8_t preRangeVcselPCLKS; + /*! \addtogroup calc_sigma_estimate + * @{ + * + * Estimates the range sigma + */ + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + xTalkCompRate_mcps); + + /* + * We work in kcps rather than mcps as this helps keep within the + * confines of the 32 Fix1616 type. + */ + + ambientRate_kcps = + (pRangingMeasurementData->AmbientRateRtnMegaCps * 1000) >> 16; + + Status = VL53L0X_get_total_signal_rate( + Dev, pRangingMeasurementData, &totalSignalRate_mcps); + Status = VL53L0X_get_total_xtalk_rate( + Dev, pRangingMeasurementData, &xTalkCompRate_mcps); + + + /* Signal rate measurement provided by device is the + * peak signal rate, not average. + */ + peakSignalRate_kcps = (totalSignalRate_mcps * 1000); + peakSignalRate_kcps = (peakSignalRate_kcps + 0x8000) >> 16; + + xTalkCompRate_kcps = xTalkCompRate_mcps * 1000; + + if (xTalkCompRate_kcps > cMaxXTalk_kcps) + xTalkCompRate_kcps = cMaxXTalk_kcps; + + if (Status == VL53L0X_ERROR_NONE) { + + /* Calculate final range macro periods */ + finalRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, FinalRangeTimeoutMicroSecs); + + finalRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, FinalRangeVcselPulsePeriod); + + finalRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( + Dev, finalRangeTimeoutMicroSecs, finalRangeVcselPCLKS); + + /* Calculate pre-range macro periods */ + preRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, PreRangeTimeoutMicroSecs); + + preRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, PreRangeVcselPulsePeriod); + + preRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( + Dev, preRangeTimeoutMicroSecs, preRangeVcselPCLKS); + + vcselWidth = 3; + if (finalRangeVcselPCLKS == 8) + vcselWidth = 2; + + + peakVcselDuration_us = vcselWidth * 2048 * + (preRangeMacroPCLKS + finalRangeMacroPCLKS); + peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; + peakVcselDuration_us *= cPllPeriod_ps; + peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; + + /* Fix1616 >> 8 = Fix2408 */ + totalSignalRate_mcps = (totalSignalRate_mcps + 0x80) >> 8; + + /* Fix2408 * uint32 = Fix2408 */ + vcselTotalEventsRtn = totalSignalRate_mcps * + peakVcselDuration_us; + + /* Fix2408 >> 8 = uint32 */ + vcselTotalEventsRtn = (vcselTotalEventsRtn + 0x80) >> 8; + + /* Fix2408 << 8 = Fix1616 = */ + totalSignalRate_mcps <<= 8; + } + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + if (peakSignalRate_kcps == 0) { + *pSigmaEstimate = cSigmaEstMax; + PALDevDataSet(Dev, SigmaEstimate, cSigmaEstMax); + } else { + if (vcselTotalEventsRtn < 1) + vcselTotalEventsRtn = 1; + + sigmaEstimateP1 = cPulseEffectiveWidth_centi_ns; + + /* ((FixPoint1616 << 16)* uint32)/uint32 = FixPoint1616 */ + sigmaEstimateP2 = (ambientRate_kcps << 16)/peakSignalRate_kcps; + if (sigmaEstimateP2 > cAmbToSignalRatioMax) { + /* Clip to prevent overflow. Will ensure safe + * max result. + */ + sigmaEstimateP2 = cAmbToSignalRatioMax; + } + sigmaEstimateP2 *= cAmbientEffectiveWidth_centi_ns; + + sigmaEstimateP3 = 2 * VL53L0X_isqrt(vcselTotalEventsRtn * 12); + + /* uint32 * FixPoint1616 = FixPoint1616 */ + deltaT_ps = pRangingMeasurementData->RangeMilliMeter * + cTOF_per_mm_ps; + + /* + * vcselRate - xtalkCompRate + * (uint32 << 16) - FixPoint1616 = FixPoint1616. + * Divide result by 1000 to convert to mcps. + * 500 is added to ensure rounding when integer division + * truncates. + */ + diff1_mcps = (((peakSignalRate_kcps << 16) - + 2 * xTalkCompRate_kcps) + 500)/1000; + + /* vcselRate + xtalkCompRate */ + diff2_mcps = ((peakSignalRate_kcps << 16) + 500)/1000; + + /* Shift by 8 bits to increase resolution prior to the + * division + */ + diff1_mcps <<= 8; + + /* FixPoint0824/FixPoint1616 = FixPoint2408 */ + xTalkCorrection = abs(diff1_mcps/diff2_mcps); + + /* FixPoint2408 << 8 = FixPoint1616 */ + xTalkCorrection <<= 8; + + if (pRangingMeasurementData->RangeStatus != 0) { + pwMult = 1 << 16; + } else { + /* FixPoint1616/uint32 = FixPoint1616 */ + /* smaller than 1.0f */ + pwMult = deltaT_ps/cVcselPulseWidth_ps; + + /* + * FixPoint1616 * FixPoint1616 = FixPoint3232, however + * both values are small enough such that32 bits will + * not be exceeded. + */ + pwMult *= ((1 << 16) - xTalkCorrection); + + /* (FixPoint3232 >> 16) = FixPoint1616 */ + pwMult = (pwMult + c16BitRoundingParam) >> 16; + + /* FixPoint1616 + FixPoint1616 = FixPoint1616 */ + pwMult += (1 << 16); + + /* + * At this point the value will be 1.xx, therefore if we + * square the value this will exceed 32 bits. To address + * this perform a single shift to the right before the + * multiplication. + */ + pwMult >>= 1; + /* FixPoint1715 * FixPoint1715 = FixPoint3430 */ + pwMult = pwMult * pwMult; + + /* (FixPoint3430 >> 14) = Fix1616 */ + pwMult >>= 14; + } + + /* FixPoint1616 * uint32 = FixPoint1616 */ + sqr1 = pwMult * sigmaEstimateP1; + + /* (FixPoint1616 >> 16) = FixPoint3200 */ + sqr1 = (sqr1 + 0x8000) >> 16; + + /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ + sqr1 *= sqr1; + + sqr2 = sigmaEstimateP2; + + /* (FixPoint1616 >> 16) = FixPoint3200 */ + sqr2 = (sqr2 + 0x8000) >> 16; + + /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ + sqr2 *= sqr2; + + /* FixPoint64000 + FixPoint6400 = FixPoint6400 */ + sqrSum = sqr1 + sqr2; + + /* SQRT(FixPoin6400) = FixPoint3200 */ + sqrtResult_centi_ns = VL53L0X_isqrt(sqrSum); + + /* (FixPoint3200 << 16) = FixPoint1616 */ + sqrtResult_centi_ns <<= 16; + + /* + * Note that the Speed Of Light is expressed in um per 1E-10 + * seconds (2997) Therefore to get mm/ns we have to divide by + * 10000 + */ + sigmaEstRtn = (((sqrtResult_centi_ns+50)/100) / + sigmaEstimateP3); + sigmaEstRtn *= VL53L0X_SPEED_OF_LIGHT_IN_AIR; + + /* Add 5000 before dividing by 10000 to ensure rounding. */ + sigmaEstRtn += 5000; + sigmaEstRtn /= 10000; + + if (sigmaEstRtn > cSigmaEstRtnMax) { + /* Clip to prevent overflow. Will ensure safe + * max result. + */ + sigmaEstRtn = cSigmaEstRtnMax; + } + finalRangeIntegrationTimeMilliSecs = + (finalRangeTimeoutMicroSecs + preRangeTimeoutMicroSecs + + 500) / 1000; + + /* sigmaEstRef = 1mm * 25ms/final range integration time + * (inc pre-range) + * sqrt(FixPoint1616/int) = FixPoint2408) + */ + sigmaEstRef = + VL53L0X_isqrt((cDfltFinalRangeIntegrationTimeMilliSecs + + finalRangeIntegrationTimeMilliSecs/2)/ + finalRangeIntegrationTimeMilliSecs); + + /* FixPoint2408 << 8 = FixPoint1616 */ + sigmaEstRef <<= 8; + sigmaEstRef = (sigmaEstRef + 500)/1000; + + /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ + sqr1 = sigmaEstRtn * sigmaEstRtn; + /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ + sqr2 = sigmaEstRef * sigmaEstRef; + + /* sqrt(FixPoint3232) = FixPoint1616 */ + sqrtResult = VL53L0X_isqrt((sqr1 + sqr2)); + /* + * Note that the Shift by 4 bits increases resolution prior to + * the sqrt, therefore the result must be shifted by 2 bits to + * the right to revert back to the FixPoint1616 format. + */ + + sigmaEstimate = 1000 * sqrtResult; + + if ((peakSignalRate_kcps < 1) || (vcselTotalEventsRtn < 1) || + (sigmaEstimate > cSigmaEstMax)) { + sigmaEstimate = cSigmaEstMax; + } + + *pSigmaEstimate = (uint32_t)(sigmaEstimate); + PALDevDataSet(Dev, SigmaEstimate, *pSigmaEstimate); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_pal_range_status(VL53L0X_DEV Dev, + uint8_t DeviceRangeStatus, + FixPoint1616_t SignalRate, + uint16_t EffectiveSpadRtnCount, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + uint8_t *pPalRangeStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t NoneFlag; + uint8_t SigmaLimitflag = 0; + uint8_t SignalRefClipflag = 0; + uint8_t RangeIgnoreThresholdflag = 0; + uint8_t SigmaLimitCheckEnable = 0; + uint8_t SignalRateFinalRangeLimitCheckEnable = 0; + uint8_t SignalRefClipLimitCheckEnable = 0; + uint8_t RangeIgnoreThresholdLimitCheckEnable = 0; + FixPoint1616_t SigmaEstimate; + FixPoint1616_t SigmaLimitValue; + FixPoint1616_t SignalRefClipValue; + FixPoint1616_t RangeIgnoreThresholdValue; + FixPoint1616_t SignalRatePerSpad; + uint8_t DeviceRangeStatusInternal = 0; + uint16_t tmpWord = 0; + uint8_t Temp8; + uint32_t Dmax_mm = 0; + FixPoint1616_t LastSignalRefMcps; + + LOG_FUNCTION_START(""); + + + /* + * VL53L0X has a good ranging when the value of the + * DeviceRangeStatus = 11. This function will replace the value 0 with + * the value 11 in the DeviceRangeStatus. + * In addition, the SigmaEstimator is not included in the VL53L0X + * DeviceRangeStatus, this will be added in the PalRangeStatus. + */ + + DeviceRangeStatusInternal = ((DeviceRangeStatus & 0x78) >> 3); + + if (DeviceRangeStatusInternal == 0 || + DeviceRangeStatusInternal == 5 || + DeviceRangeStatusInternal == 7 || + DeviceRangeStatusInternal == 12 || + DeviceRangeStatusInternal == 13 || + DeviceRangeStatusInternal == 14 || + DeviceRangeStatusInternal == 15 + ) { + NoneFlag = 1; + } else { + NoneFlag = 0; + } + + /* + * Check if Sigma limit is enabled, if yes then do comparison with limit + * value and put the result back into pPalRangeStatus. + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + &SigmaLimitCheckEnable); + + if ((SigmaLimitCheckEnable != 0) && (Status == VL53L0X_ERROR_NONE)) { + /* + * compute the Sigma and check with limit + */ + Status = VL53L0X_calc_sigma_estimate( + Dev, + pRangingMeasurementData, + &SigmaEstimate); + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_calc_dmax( + Dev, + pRangingMeasurementData->AmbientRateRtnMegaCps, + &Dmax_mm); + if (Status == VL53L0X_ERROR_NONE) + pRangingMeasurementData->RangeDMaxMilliMeter = Dmax_mm; + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + &SigmaLimitValue); + + if ((SigmaLimitValue > 0) && + (SigmaEstimate > SigmaLimitValue)) + /* Limit Fail */ + SigmaLimitflag = 1; + } + } + + /* + * Check if Signal ref clip limit is enabled, if yes then do comparison + * with limit value and put the result back into pPalRangeStatus. + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipLimitCheckEnable); + + if ((SignalRefClipLimitCheckEnable != 0) && + (Status == VL53L0X_ERROR_NONE)) { + + Status = VL53L0X_GetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipValue); + + /* Read LastSignalRefMcps from device */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, + &tmpWord); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LastSignalRefMcps = VL53L0X_FIXPOINT97TOFIXPOINT1616(tmpWord); + PALDevDataSet(Dev, LastSignalRefMcps, LastSignalRefMcps); + + if ((SignalRefClipValue > 0) && + (LastSignalRefMcps > SignalRefClipValue)) { + /* Limit Fail */ + SignalRefClipflag = 1; + } + } + + /* + * Check if Signal ref clip limit is enabled, if yes then do comparison + * with limit value and put the result back into pPalRangeStatus. + * EffectiveSpadRtnCount has a format 8.8 + * If (Return signal rate < (1.5 x Xtalk x number of Spads)) : FAIL + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + &RangeIgnoreThresholdLimitCheckEnable); + + if ((RangeIgnoreThresholdLimitCheckEnable != 0) && + (Status == VL53L0X_ERROR_NONE)) { + + /* Compute the signal rate per spad */ + if (EffectiveSpadRtnCount == 0) { + SignalRatePerSpad = 0; + } else { + SignalRatePerSpad = (FixPoint1616_t)((256 * SignalRate) + / EffectiveSpadRtnCount); + } + + Status = VL53L0X_GetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + &RangeIgnoreThresholdValue); + + if ((RangeIgnoreThresholdValue > 0) && + (SignalRatePerSpad < RangeIgnoreThresholdValue)) { + /* Limit Fail add 2^6 to range status */ + RangeIgnoreThresholdflag = 1; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + if (NoneFlag == 1) { + *pPalRangeStatus = 255; /* NONE */ + } else if (DeviceRangeStatusInternal == 1 || + DeviceRangeStatusInternal == 2 || + DeviceRangeStatusInternal == 3) { + *pPalRangeStatus = 5; /* HW fail */ + } else if (DeviceRangeStatusInternal == 6 || + DeviceRangeStatusInternal == 9) { + *pPalRangeStatus = 4; /* Phase fail */ + } else if (DeviceRangeStatusInternal == 8 || + DeviceRangeStatusInternal == 10 || + SignalRefClipflag == 1) { + *pPalRangeStatus = 3; /* Min range */ + } else if (DeviceRangeStatusInternal == 4 || + RangeIgnoreThresholdflag == 1) { + *pPalRangeStatus = 2; /* Signal Fail */ + } else if (SigmaLimitflag == 1) { + *pPalRangeStatus = 1; /* Sigma Fail */ + } else { + *pPalRangeStatus = 0; /* Range Valid */ + } + } + + /* fill the Limit Check Status */ + + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + &SignalRateFinalRangeLimitCheckEnable); + + if (Status == VL53L0X_ERROR_NONE) { + if ((SigmaLimitCheckEnable == 0) || (SigmaLimitflag == 1)) + Temp8 = 1; + else + Temp8 = 0; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, Temp8); + + if ((DeviceRangeStatusInternal == 4) || + (SignalRateFinalRangeLimitCheckEnable == 0)) + Temp8 = 1; + else + Temp8 = 0; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + Temp8); + + if ((SignalRefClipLimitCheckEnable == 0) || + (SignalRefClipflag == 1)) + Temp8 = 1; + else + Temp8 = 0; + + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, Temp8); + + if ((RangeIgnoreThresholdLimitCheckEnable == 0) || + (RangeIgnoreThresholdflag == 1)) + Temp8 = 1; + else + Temp8 = 0; + + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + Temp8); + } + + LOG_FUNCTION_END(Status); + return Status; + +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" new file mode 100644 index 00000000..06401b56 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" + + +#ifndef __KERNEL__ +#include +#endif +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" new file mode 100644 index 00000000..c5781cb7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" @@ -0,0 +1,466 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_strings.h" + +#ifndef __KERNEL__ +#include +#endif + +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + + +VL53L0X_Error VL53L0X_check_part_used(VL53L0X_DEV Dev, + uint8_t *Revision, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t ModuleIdInt; + char *ProductId_tmp; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_info_from_device(Dev, 2); + + if (Status == VL53L0X_ERROR_NONE) { + ModuleIdInt = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ModuleId); + + if (ModuleIdInt == 0) { + *Revision = 0; + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, ""); + } else { + *Revision = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, Revision); + ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ProductId); + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, + ProductId_tmp); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t revision_id; + uint8_t Revision; + + Status = VL53L0X_check_part_used(Dev, &Revision, pVL53L0X_DeviceInfo); + + if (Status == VL53L0X_ERROR_NONE) { + if (Revision == 0) { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_TS0); + } else if ((Revision <= 34) && (Revision != 32)) { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_TS1); + } else if (Revision < 39) { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_TS2); + } else { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_ES1); + } + + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Type, + VL53L0X_STRING_DEVICE_INFO_TYPE); + + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_MODEL_ID, + &pVL53L0X_DeviceInfo->ProductType); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_REVISION_ID, + &revision_id); + pVL53L0X_DeviceInfo->ProductRevisionMajor = 1; + pVL53L0X_DeviceInfo->ProductRevisionMinor = + (revision_id & 0xF0) >> 4; + } + + return Status; +} + + +VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode, + char *pDeviceErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (ErrorCode) { + case VL53L0X_DEVICEERROR_NONE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_NONE); + break; + case VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE); + break; + case VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE); + break; + case VL53L0X_DEVICEERROR_NOVHVVALUEFOUND: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND); + break; + case VL53L0X_DEVICEERROR_MSRCNOTARGET: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET); + break; + case VL53L0X_DEVICEERROR_SNRCHECK: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_SNRCHECK); + break; + case VL53L0X_DEVICEERROR_RANGEPHASECHECK: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK); + break; + case VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK); + break; + case VL53L0X_DEVICEERROR_TCC: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_TCC); + break; + case VL53L0X_DEVICEERROR_PHASECONSISTENCY: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY); + break; + case VL53L0X_DEVICEERROR_MINCLIP: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_MINCLIP); + break; + case VL53L0X_DEVICEERROR_RANGECOMPLETE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE); + break; + case VL53L0X_DEVICEERROR_ALGOUNDERFLOW: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW); + break; + case VL53L0X_DEVICEERROR_ALGOOVERFLOW: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW); + break; + case VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD); + break; + + default: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_UNKNOW_ERROR_CODE); + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus, + char *pRangeStatusString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (RangeStatus) { + case 0: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_RANGEVALID); + break; + case 1: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_SIGMA); + break; + case 2: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_SIGNAL); + break; + case 3: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_MINRANGE); + break; + case 4: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_PHASE); + break; + case 5: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_HW); + break; + + default: /**/ + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_NONE); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode, + char *pPalErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (PalErrorCode) { + case VL53L0X_ERROR_NONE: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_NONE); + break; + case VL53L0X_ERROR_CALIBRATION_WARNING: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_CALIBRATION_WARNING); + break; + case VL53L0X_ERROR_MIN_CLIPPED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_MIN_CLIPPED); + break; + case VL53L0X_ERROR_UNDEFINED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_UNDEFINED); + break; + case VL53L0X_ERROR_INVALID_PARAMS: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_INVALID_PARAMS); + break; + case VL53L0X_ERROR_NOT_SUPPORTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_NOT_SUPPORTED); + break; + case VL53L0X_ERROR_INTERRUPT_NOT_CLEARED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED); + break; + case VL53L0X_ERROR_RANGE_ERROR: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_RANGE_ERROR); + break; + case VL53L0X_ERROR_TIME_OUT: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_TIME_OUT); + break; + case VL53L0X_ERROR_MODE_NOT_SUPPORTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED); + break; + case VL53L0X_ERROR_BUFFER_TOO_SMALL: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL); + break; + case VL53L0X_ERROR_GPIO_NOT_EXISTING: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING); + break; + case VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED); + break; + case VL53L0X_ERROR_CONTROL_INTERFACE: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_CONTROL_INTERFACE); + break; + case VL53L0X_ERROR_INVALID_COMMAND: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_INVALID_COMMAND); + break; + case VL53L0X_ERROR_DIVISION_BY_ZERO: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_DIVISION_BY_ZERO); + break; + case VL53L0X_ERROR_REF_SPAD_INIT: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_REF_SPAD_INIT); + break; + case VL53L0X_ERROR_NOT_IMPLEMENTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_NOT_IMPLEMENTED); + break; + + default: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_UNKNOW_ERROR_CODE); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode, + char *pPalStateString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (PalStateCode) { + case VL53L0X_STATE_POWERDOWN: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_POWERDOWN); + break; + case VL53L0X_STATE_WAIT_STATICINIT: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_WAIT_STATICINIT); + break; + case VL53L0X_STATE_STANDBY: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_STANDBY); + break; + case VL53L0X_STATE_IDLE: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_IDLE); + break; + case VL53L0X_STATE_RUNNING: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_RUNNING); + break; + case VL53L0X_STATE_UNKNOWN: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_UNKNOWN); + break; + case VL53L0X_STATE_ERROR: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_ERROR); + break; + + default: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_UNKNOWN); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_sequence_steps_info( + VL53L0X_SequenceStepId SequenceStepId, + char *pSequenceStepsString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_TCC); + break; + case VL53L0X_SEQUENCESTEP_DSS: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_DSS); + break; + case VL53L0X_SEQUENCESTEP_MSRC: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_MSRC); + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE); + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE); + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + LOG_FUNCTION_END(Status); + + return Status; +} + + +VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + char *pLimitCheckString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (LimitCheckId) { + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE); + break; + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE); + break; + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP); + break; + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD); + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC); + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE); + break; + + default: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_UNKNOW_ERROR_CODE); + + } + + LOG_FUNCTION_END(Status); + return Status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" new file mode 100644 index 00000000..9e2a78a0 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" @@ -0,0 +1,16 @@ + +#ifndef __VL53L0X_H +#define __VL53L0X_H + + +// 初始化,包含硬件复位,芯片初次IIC通讯和设备验证,6步初始化校验,配置模式和时间。 +void vl53l0x_init(void); +// 开始测量 +void vl53l0x_start(void); +// 停止测量 +void vl53l0x_stop(void); +// 获取测量距离 +unsigned short get_distance(void); + +#endif + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" new file mode 100644 index 00000000..217fbe16 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" @@ -0,0 +1,66 @@ + + +#ifndef __VL53L0X_IIC_H +#define __VL53L0X_IIC_H + +// hi3061M专用 +#include "main.h" //io相关头文件 +#include "clock.h" //延时函数相关头文件 +#include "debug.h" //串口调试输出 +// hi3061M专用 + +#include "vl53l0x_platform.h" + +#define uint8_t unsigned char + +// 这里需要改为自己MCU相关的延时函数 +#define vl53l0x_iic_delay(t) BASE_FUNC_DELAY_US(t) +// 这里需要改为自己MCU相关的延时函数 +#define print_log DBG_PRINTF + +// 上电复位默认IIC地址 +#define VL53L0X_IIC_ADDR 0x29 +// ID标识 +#define VL53L0X_MODULE_ID 0xEEAA + +// 下面的引脚配置需要改为与自己MCU相关的 +/*硬件复位/使能引脚*/ + #define VL53L0X_XSH(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_LOW_LEVEL); \ + }while(0) + + +/*IIC引脚*/ +#define VL53L0X_IIC_SCL(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_LOW_LEVEL); \ + }while(0) + +#define VL53L0X_IIC_SDA(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_LOW_LEVEL); \ + }while(0) + +// IIC SDA引脚方向[输入(1)输出(0)] +#define VL53L0X_SDA_Direction(x) do{ x ? \ + HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_INPUT_MODE) : \ + HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_OUTPUT_MODE); \ + }while(0) +//IIC 输入模式下获取SDA的引脚值,用于读取数据或者获取ACK +#define VL53L0X_IIC_READ_SDA() HAL_GPIO_GetPinValue(&g_gpio4, GPIO_PIN_4) +// 上面的引脚配置需要改为与自己MCU相关的 + +/*vl53l0x IIC相关函数实现*/ +void vl53l0x_iic_start(void); +void vl53l0x_iic_stop(void); +uint8_t vl53l0x_iic_wait_ack(void); +void vl53l0x_iic_ack(void); +void vl53l0x_iic_nack(void); +void vl53l0x_iic_send_byte(uint8_t dat); +uint8_t vl53l0x_iic_read_byte(uint8_t ack); + + +void vl53l0x_hw_reset(void); +// +#endif diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" new file mode 100644 index 00000000..01ad2989 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" @@ -0,0 +1,159 @@ + +#include "vl53l0x.h" +#include "vl53l0x_iic.h" +#include "vl53l0x_api.h" + + +#define CUSTOM_DEV_IIC_ADDDR (VL53L0X_IIC_ADDR) /*自定义IICַ地址*/ +#define DEMO_DEVICE_MODE VL53L0X_DEVICEMODE_CONTINUOUS_RANGING /* 连续测量模式 */ +#define DEMO_BUDGET_TIME (66*1000) /* 测量时间 */ + +/* VL53L0X设备结构体 */ +static VL53L0X_Dev_t demo_dev = { + .I2cDevAddr = VL53L0X_IIC_ADDR, /* 上电默认IIC通讯地址ַ*/ +}; + + +static void device_detect(VL53L0X_DEV dev, uint8_t iic_addr) +{ + uint16_t module_id = 0; + VL53L0X_Error status; + /** + * 获取设备ID,身份鉴别 + * 另外可以相当于一次通讯验证,IIC是否可以正常通讯 + * */ + status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &module_id); + // DBG_PRINTF("ATK-MS53L0 ID: %d,status: %d\r\n",module_id,status); + if (module_id != VL53L0X_MODULE_ID) + { + print_log("ATK-MS53L0 Detect Failed!\r\n"); + while (1) + { + // 如果通讯失败,就会卡在这个死循环中。 + } + } + /** + * 改变IIC设备地址 + * 如果你想改变IIC设备地址,有多个设备使用时,可用此API + * 上电默认的地址是0x29,可以自己设置IIC地址 + */ + if (iic_addr != dev->I2cDevAddr) + { + VL53L0X_SetDeviceAddress(dev, iic_addr << 1); + dev->I2cDevAddr = iic_addr; + print_log("Change IIC address success! IIC Address: 0x%x\r\n",iic_addr); + }else{ + print_log("Default IIC Address: 0x%x\r\n",iic_addr); + } +} + +/** + * 设备配置:效准和初始化 + * 根据手册在测量前有一系列初始化和效准过程,保证测量精度 + + */ +static void device_init(VL53L0X_DEV dev) +{ + uint8_t vhvsettings; + uint8_t phasecal; + uint32_t refspadcount; + uint8_t isaperturespads; + // 设备初始化 + VL53L0X_DataInit(dev); + // 加载特殊配置 + VL53L0X_StaticInit(dev); + // Spad(单光子雪崩二极管)效准,用来对返射会的IR光进行测量的 + VL53L0X_PerformRefSpadManagement(dev, &refspadcount, &isaperturespads); + /*温度效准*/ + // VL53L0X_PerformRefCalibration(dev, &vhvsettings, &phasecal); + /*偏移效准*/ + // VL53L0X_PerformOffsetCalibration(); + /*串扰效准*/ + // VL53L0X_PerformXTalkCalibration(); + + /**设置工作模式 + * 有三种工作模式 + * 单次测量 0 + * 连续测量 1 + * 连续延时测量 3 + */ + VL53L0X_SetDeviceMode(dev, DEMO_DEVICE_MODE); + + /**设置测量时间 + * 默认时间是33ms,最小的时间是20ms + * 这个会涉及到准确率,太快,准确率会有所下降 + * 增加测量时间会提高准确率 + * 测量时间增加到2倍,测量的标准差减少到根号2 + */ + VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev, DEMO_BUDGET_TIME); +} + +/** + */ +void vl53l0x_init(void) +{ + uint8_t ret; + VL53L0X_RangingMeasurementData_t data; + + vl53l0x_hw_reset(); //使能,设置 XSHUT引脚为高电平(低电平表示关闭) + device_detect(&demo_dev, CUSTOM_DEV_IIC_ADDDR); /*首次通讯验证和设备验证*/ + device_init(&demo_dev); /*设备初始化-会设置测试时间(精确相关)和设备工作模式*/ + + print_log("VL53L0X init Succedded!\r\n"); + + // /*开始测量*/ + // VL53L0X_StartMeasurement(&demo_dev); + + // while (1) + // { + // /*检查是否完成一次测量*/ + // do { + // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + // } while (ret != 1); + // /**清除中断 + // * 如果使用中断的方式,通过连接中断引脚进行判断,进入中断后需要清除中断 + // * 这里使用的是轮询的方式,所以可以不需要 + // */ + // // VL53L0X_ClearInterruptMask(&demo_dev, 0); + + // /*获取测量结果*/ + // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + // /*输出测量结果(单位mm)*/ + // DBG_PRINTF("Distance: %dmm\r\n", data.RangeMilliMeter); + // } +} +// 开始测量 +void vl53l0x_start(void){ + /*开始测量*/ + VL53L0X_StartMeasurement(&demo_dev); + print_log("VL53L0X start ranging!\r\n"); +} +// 停止测量---连续测量模式下 +void vl53l0x_stop(void){ + /*开始测量*/ + VL53L0X_StopMeasurement(&demo_dev); + print_log("VL53L0X stop ranging!\r\n"); +} +// 获取测量结果 单位mm +unsigned short get_distance(void){ + + uint8_t ret = 0; + VL53L0X_RangingMeasurementData_t data; + /*检查是否完成一次测量*/ + VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + if(ret==1){ + /*获取测量结果*/ + VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + return data.RangeMilliMeter; + } + + return 0; + // do { + // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + // } while (ret != 1); + // /*获取测量结果*/ + // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + // return data.RangeMilliMeter; +} + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" new file mode 100644 index 00000000..1eb486f9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" @@ -0,0 +1,139 @@ + + + +#include "vl53l0x_iic.h" + +// static inline void vl53l0x_iic_delay(unsigned int t_us) +// { +// // IIC的延时函数,根据自己的mcu进行替换 +// BASE_FUNC_DELAY_US(t_us); +// } + +void vl53l0x_iic_start(void) +{ + VL53L0X_IIC_SDA(1); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SDA(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); +} + +void vl53l0x_iic_stop(void) +{ + VL53L0X_IIC_SCL(0); + VL53L0X_IIC_SDA(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(1); + VL53L0X_IIC_SDA(1); + vl53l0x_iic_delay(4); +} + +uint8_t vl53l0x_iic_wait_ack(void) +{ + uint8_t waittime = 0; + uint8_t rack = 0; + VL53L0X_SDA_Direction(1); + VL53L0X_IIC_SDA(1); + vl53l0x_iic_delay(1); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(1); + + while (VL53L0X_IIC_READ_SDA()) + { + waittime++; + + if (waittime > 250) + { + VL53L0X_SDA_Direction(0); + vl53l0x_iic_stop(); + return 1; + } + } + VL53L0X_SDA_Direction(0); + VL53L0X_IIC_SCL(0); + + return rack; +} + +void vl53l0x_iic_ack(void) +{ + VL53L0X_IIC_SCL(0); + VL53L0X_IIC_SDA(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); +} + +void vl53l0x_iic_nack(void) +{ + VL53L0X_IIC_SCL(0); + VL53L0X_IIC_SDA(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); +} + +void vl53l0x_iic_send_byte(uint8_t dat) +{ + uint8_t t; + VL53L0X_IIC_SCL(0); + for (t=0; t<8; t++) + { + VL53L0X_IIC_SDA((dat & 0x80) >> 7); + dat <<= 1; + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); + vl53l0x_iic_delay(2); + + } + +} + +uint8_t vl53l0x_iic_read_byte(uint8_t ack) +{ + uint8_t i; + uint8_t dat = 0; + VL53L0X_SDA_Direction(1); + for (i = 0; i < 8; i++ ) + { + VL53L0X_IIC_SCL(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + dat <<= 1; + + if (VL53L0X_IIC_READ_SDA()) + { + dat++; + } + vl53l0x_iic_delay(2); + } + VL53L0X_SDA_Direction(0); + if (ack == 0) + { + vl53l0x_iic_nack(); + } + else + { + vl53l0x_iic_ack(); + } + + return dat; +} + +/** + * VL53L0X 硬件复位,通过引脚设置关机再开机实现复位 + */ +void vl53l0x_hw_reset(void) +{ + // 复位引脚,考虑要不要接吧 改变引脚电平实现复位,0 到1 复位 + VL53L0X_XSH(0); + vl53l0x_iic_delay(30*1000) ;//延时30ms + VL53L0X_XSH(1); + vl53l0x_iic_delay(30*1000) ; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" new file mode 100644 index 00000000..6c953c78 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" @@ -0,0 +1,409 @@ +/* + * COPYRIGHT (C) STMicroelectronics 2014. All rights reserved. + * + * This software is the confidential and proprietary information of + * STMicroelectronics ("Confidential Information"). You shall not + * disclose such Confidential Information and shall use it only in + * accordance with the terms of the license agreement you entered into + * with STMicroelectronics + * + * Programming Golden Rule: Keep it Simple! + * + */ + +/** + * @file VL53L0X_platform.h + * @brief Function prototype definitions for Ewok Platform layer. + * + */ + + +#ifndef _VL53L0X_I2C_PLATFORM_H_ +#define _VL53L0X_I2C_PLATFORM_H_ + + +// 移植封装 +#include "vl53l0x_iic.h" +// 移植封装 + +#include "vl53l0x_def.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Include uint8_t, unit16_t etc definitions + +#include +#include + + +/** + * @brief Typedef defining .\n + * The developer shoud modify this to suit the platform being deployed. + * + */ + +// enum {TRUE = true, FALSE = false}; + +/** + * @brief Typedef defining 8 bit unsigned char type.\n + * The developer shoud modify this to suit the platform being deployed. + * + */ + +#ifndef bool_t +typedef unsigned char bool_t; +#endif + + +#define I2C 0x01 +#define SPI 0x00 + +#define COMMS_BUFFER_SIZE 64 // MUST be the same size as the SV task buffer + +#define BYTES_PER_WORD 2 +#define BYTES_PER_DWORD 4 + +#define VL53L0X_MAX_STRING_LENGTH_PLT 256 + +/** + * @brief Initialise platform comms. + * + * @param comms_type - selects between I2C and SPI + * @param comms_speed_khz - unsigned short containing the I2C speed in kHz + * + * @return status - status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_comms_initialise(uint8_t comms_type, + uint16_t comms_speed_khz); + +/** + * @brief Close platform comms. + * + * @return status - status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_comms_close(void); + +/** + * @brief Cycle Power to Device + * + * @return status - status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_cycle_power(void); + + +/** + * @brief Writes the supplied byte buffer to the device + * + * Wrapper for SystemVerilog Write Multi task + * + * @code + * + * Example: + * + * uint8_t *spad_enables; + * + * int status = VL53L0X_write_multi(RET_SPAD_EN_0, spad_enables, 36); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint8_t buffer containing the data to be written + * @param count - number of bytes in the supplied byte buffer + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count); + + +/** + * @brief Reads the requested number of bytes from the device + * + * Wrapper for SystemVerilog Read Multi task + * + * @code + * + * Example: + * + * uint8_t buffer[COMMS_BUFFER_SIZE]; + * + * int status = status = VL53L0X_read_multi(DEVICE_ID, buffer, 2) + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to the uint8_t buffer to store read data + * @param count - number of uint8_t's to read + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count); + + +/** + * @brief Writes a single byte to the device + * + * Wrapper for SystemVerilog Write Byte task + * + * @code + * + * Example: + * + * uint8_t page_number = MAIN_SELECT_PAGE; + * + * int status = VL53L0X_write_byte(PAGE_SELECT, page_number); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param data - uint8_t data value to write + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data); + + +/** + * @brief Writes a single word (16-bit unsigned) to the device + * + * Manages the big-endian nature of the device (first byte written is the MS byte). + * Uses SystemVerilog Write Multi task. + * + * @code + * + * Example: + * + * uint16_t nvm_ctrl_pulse_width = 0x0004; + * + * int status = VL53L0X_write_word(NVM_CTRL__PULSE_WIDTH_MSB, nvm_ctrl_pulse_width); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param data - uin16_t data value write + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data); + + +/** + * @brief Writes a single dword (32-bit unsigned) to the device + * + * Manages the big-endian nature of the device (first byte written is the MS byte). + * Uses SystemVerilog Write Multi task. + * + * @code + * + * Example: + * + * uint32_t nvm_data = 0x0004; + * + * int status = VL53L0X_write_dword(NVM_CTRL__DATAIN_MMM, nvm_data); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param data - uint32_t data value to write + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_dword(uint8_t address, uint8_t index, uint32_t data); + + + +/** + * @brief Reads a single byte from the device + * + * Uses SystemVerilog Read Byte task. + * + * @code + * + * Example: + * + * uint8_t device_status = 0; + * + * int status = VL53L0X_read_byte(STATUS, &device_status); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint8_t data value + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata); + + +/** + * @brief Reads a single word (16-bit unsigned) from the device + * + * Manages the big-endian nature of the device (first byte read is the MS byte). + * Uses SystemVerilog Read Multi task. + * + * @code + * + * Example: + * + * uint16_t timeout = 0; + * + * int status = VL53L0X_read_word(TIMEOUT_OVERALL_PERIODS_MSB, &timeout); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint16_t data value + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata); + + +/** + * @brief Reads a single dword (32-bit unsigned) from the device + * + * Manages the big-endian nature of the device (first byte read is the MS byte). + * Uses SystemVerilog Read Multi task. + * + * @code + * + * Example: + * + * uint32_t range_1 = 0; + * + * int status = VL53L0X_read_dword(RANGE_1_MMM, &range_1); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint32_t data value + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata); + + +/** + * @brief Implements a programmable wait in us + * + * Wrapper for SystemVerilog Wait in micro seconds task + * + * @param wait_us - integer wait in micro seconds + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_platform_wait_us(int32_t wait_us); + + +/** + * @brief Implements a programmable wait in ms + * + * Wrapper for SystemVerilog Wait in milli seconds task + * + * @param wait_ms - integer wait in milli seconds + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_wait_ms(int32_t wait_ms); + + +/** + * @brief Set GPIO value + * + * @param level - input level - either 0 or 1 + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_set_gpio(uint8_t level); + + +/** + * @brief Get GPIO value + * + * @param plevel - uint8_t pointer to store GPIO level (0 or 1) + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_get_gpio(uint8_t *plevel); + +/** + * @brief Release force on GPIO + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_release_gpio(void); + + +/** +* @brief Get the frequency of the timer used for ranging results time stamps +* +* @param[out] ptimer_freq_hz : pointer for timer frequency +* +* @return status : 0 = ok, 1 = error +* +*/ + +int32_t VL53L0X_get_timer_frequency(int32_t *ptimer_freq_hz); + +/** +* @brief Get the timer value in units of timer_freq_hz (see VL53L0X_get_timestamp_frequency()) +* +* @param[out] ptimer_count : pointer for timer count value +* +* @return status : 0 = ok, 1 = error +* +*/ + +int32_t VL53L0X_get_timer_value(int32_t *ptimer_count); + + + + + +#ifdef __cplusplus +} +#endif + +#endif //_VL53L0X_I2C_PLATFORM_H_ + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" new file mode 100644 index 00000000..a6811fb6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" @@ -0,0 +1,245 @@ +/******************************************************************************* +Copyright � 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +********************************************************************************/ + + +#ifndef _VL53L0X_PLATFORM_H_ +#define _VL53L0X_PLATFORM_H_ + + + + + +#include "vl53l0x_def.h" +#include "vl53l0x_platform_log.h" +#include "vl53l0x_i2c_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file vl53l0x_platform.h + * + * @brief All end user OS/platform/application porting + */ + +/** + * @defgroup VL53L0X_platform_group VL53L0X Platform Functions + * @brief VL53L0X Platform Functions + * @{ + */ + +/** + * @struct VL53L0X_Dev_t + * @brief Generic PAL device type that does link between API and platform abstraction layer + * + */ +typedef struct { + VL53L0X_DevData_t Data; /*!< embed ST Ewok Dev data as "Data"*/ + + /*!< user specific field */ + uint8_t I2cDevAddr; /*!< i2c device address user specific field */ + uint8_t comms_type; /*!< Type of comms : VL53L0X_COMMS_I2C or VL53L0X_COMMS_SPI */ + uint16_t comms_speed_khz; /*!< Comms speed [kHz] : typically 400kHz for I2C */ + +} VL53L0X_Dev_t; + + +/** + * @brief Declare the device Handle as a pointer of the structure @a VL53L0X_Dev_t. + * + */ +typedef VL53L0X_Dev_t* VL53L0X_DEV; + +/** + * @def PALDevDataGet + * @brief Get ST private structure @a VL53L0X_DevData_t data access + * + * @param Dev Device Handle + * @param field ST structure field name + * It maybe used and as real data "ref" not just as "get" for sub-structure item + * like PALDevDataGet(FilterData.field)[i] or PALDevDataGet(FilterData.MeasurementIndex)++ + */ +#define PALDevDataGet(Dev, field) (Dev->Data.field) + +/** + * @def PALDevDataSet(Dev, field, data) + * @brief Set ST private structure @a VL53L0X_DevData_t data field + * @param Dev Device Handle + * @param field ST structure field name + * @param data Data to be set + */ +#define PALDevDataSet(Dev, field, data) (Dev->Data.field)=(data) + + +/** + * @defgroup VL53L0X_registerAccess_group PAL Register Access Functions + * @brief PAL Register Access Functions + * @{ + */ + +/** + * Lock comms interface to serialize all commands to a shared I2C interface for a specific device + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev); + +/** + * Unlock comms interface to serialize all commands to a shared I2C interface for a specific device + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev); + + +/** + * Writes the supplied byte buffer to the device + * @param Dev Device Handle + * @param index The register index + * @param pdata Pointer to uint8_t buffer containing the data to be written + * @param count Number of bytes in the supplied byte buffer + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count); + +/** + * Reads the requested number of bytes from the device + * @param Dev Device Handle + * @param index The register index + * @param pdata Pointer to the uint8_t buffer to store read data + * @param count Number of uint8_t's to read + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count); + +/** + * Write single byte register + * @param Dev Device Handle + * @param index The register index + * @param data 8 bit register data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data); + +/** + * Write word register + * @param Dev Device Handle + * @param index The register index + * @param data 16 bit register data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data); + +/** + * Write double word (4 byte) register + * @param Dev Device Handle + * @param index The register index + * @param data 32 bit register data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data); + +/** + * Read single byte register + * @param Dev Device Handle + * @param index The register index + * @param data pointer to 8 bit data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data); + +/** + * Read word (2byte) register + * @param Dev Device Handle + * @param index The register index + * @param data pointer to 16 bit data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data); + +/** + * Read dword (4byte) register + * @param Dev Device Handle + * @param index The register index + * @param data pointer to 32 bit data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data); + +/** + * Threat safe Update (read/modify/write) single byte register + * + * Final_reg = (Initial_reg & and_data) |or_data + * + * @param Dev Device Handle + * @param index The register index + * @param AndData 8 bit and data + * @param OrData 8 bit or data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData); + +/** @} end of VL53L0X_registerAccess_group */ + + +/** + * @brief execute delay in all polling API call + * + * A typical multi-thread or RTOs implementation is to sleep the task for some 5ms (with 100Hz max rate faster polling is not needed) + * if nothing specific is need you can define it as an empty/void macro + * @code + * #define VL53L0X_PollingDelay(...) (void)0 + * @endcode + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev); /* usually best implemented as a real function */ + +/** @} end of VL53L0X_platform_group */ + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_PLATFORM_H_ */ + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" new file mode 100644 index 00000000..33895778 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" @@ -0,0 +1,118 @@ +/******************************************************************************* +Copyright 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +********************************************************************************/ + + +#ifndef _VL53L0X_PLATFORM_LOG_H_ +#define _VL53L0X_PLATFORM_LOG_H_ + +#include +#include +/* LOG Functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file vl53l0x_platform_log.h + * + * @brief platform log function definition + */ + +//#define VL53L0X_LOG_ENABLE 0 + +enum { + TRACE_LEVEL_NONE, + TRACE_LEVEL_ERRORS, + TRACE_LEVEL_WARNING, + TRACE_LEVEL_INFO, + TRACE_LEVEL_DEBUG, + TRACE_LEVEL_ALL, + TRACE_LEVEL_IGNORE +}; + +enum { + TRACE_FUNCTION_NONE = 0, + TRACE_FUNCTION_I2C = 1, + TRACE_FUNCTION_ALL = 0x7fffffff //all bits except sign +}; + +enum { + TRACE_MODULE_NONE = 0x0, + TRACE_MODULE_API = 0x1, + TRACE_MODULE_PLATFORM = 0x2, + TRACE_MODULE_ALL = 0x7fffffff //all bits except sign +}; + + +#ifdef VL53L0X_LOG_ENABLE + +#include + +extern uint32_t _trace_level; + + + +int32_t VL53L0X_trace_config(char *filename, uint32_t modules, uint32_t level, uint32_t functions); + +void trace_print_module_function(uint32_t module, uint32_t level, uint32_t function, const char *format, ...); + + +//extern FILE * log_file; + +#define LOG_GET_TIME() (int)clock() + +#define _LOG_FUNCTION_START(module, fmt, ... ) \ + trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s "fmt"\n", LOG_GET_TIME(), __FUNCTION__, ##__VA_ARGS__); + +#define _LOG_FUNCTION_END(module, status, ... )\ + trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s %d\n", LOG_GET_TIME(), __FUNCTION__, (int)status, ##__VA_ARGS__) + +#define _LOG_FUNCTION_END_FMT(module, status, fmt, ... )\ + trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s %d "fmt"\n", LOG_GET_TIME(), __FUNCTION__, (int)status,##__VA_ARGS__) + +// __func__ is gcc only +//#define VL53L0X_ErrLog( fmt, ...) fprintf(stderr, "VL53L0X_ErrLog %s" fmt "\n", __func__, ##__VA_ARGS__) + +#else /* VL53L0X_LOG_ENABLE no logging */ + #define VL53L0X_ErrLog(...) (void)0 + #define _LOG_FUNCTION_START(module, fmt, ... ) (void)0 + #define _LOG_FUNCTION_END(module, status, ... ) (void)0 + #define _LOG_FUNCTION_END_FMT(module, status, fmt, ... ) (void)0 +#endif /* else */ + +#define VL53L0X_COPYSTRING(str, ...) strcpy(str, ##__VA_ARGS__) + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_PLATFORM_LOG_H_ */ + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" new file mode 100644 index 00000000..2f8adc98 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" @@ -0,0 +1,111 @@ +/******************************************************************************* +Copyright 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 vl53l0x_types.h + * @brief VL53L0X types definition + */ + +#ifndef VL53L0X_TYPES_H_ +#define VL53L0X_TYPES_H_ + +/** @defgroup porting_type Basic type definition + * @ingroup VL53L0X_platform_group + * + * @brief file vl53l0x_types.h files hold basic type definition that may requires porting + * + * contains type that must be defined for the platform\n + * when target platform and compiler provide stdint.h and stddef.h it is enough to include it.\n + * If stdint.h is not available review and adapt all signed and unsigned 8/16/32 bits basic types. \n + * If stddef.h is not available review and adapt NULL definition . + */ +#include +#include + +#ifndef NULL +#error "Error NULL definition should be done. Please add required include " +#endif + + +#if ! defined(STDINT_H) && !defined(_GCC_STDINT_H) &&!defined(__STDINT_DECLS) && !defined(_GCC_WRAP_STDINT_H) + + #pragma message("Please review type definition of STDINT define for your platform and add to list above ") + + /* + * target platform do not provide stdint or use a different #define than above + * to avoid seeing the message below addapt the #define list above or implement + * all type and delete these pragma + */ + +/** \ingroup VL53L0X_portingType_group + * @{ + */ + + +typedef unsigned long long uint64_t; + + +/** @brief Typedef defining 32 bit unsigned int type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef unsigned int uint32_t; + +/** @brief Typedef defining 32 bit int type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef int int32_t; + +/** @brief Typedef defining 16 bit unsigned short type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef unsigned short uint16_t; + +/** @brief Typedef defining 16 bit short type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef short int16_t; + +/** @brief Typedef defining 8 bit unsigned char type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef unsigned char uint8_t; + +/** @brief Typedef defining 8 bit char type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef signed char int8_t; + +/** @} */ +#endif /* _STDINT_H */ + + +/** use where fractional values are expected + * + * Given a floating point value f it's .16 bit point is (int)(f*(1<<16))*/ +typedef uint32_t FixPoint1616_t; + +#endif /* VL53L0X_TYPES_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" new file mode 100644 index 00000000..c056e6f5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" @@ -0,0 +1,307 @@ +/* + * COPYRIGHT (C) STMicroelectronics 2015. All rights reserved. + * + * This software is the confidential and proprietary information of + * STMicroelectronics ("Confidential Information"). You shall not + * disclose such Confidential Information and shall use it only in + * accordance with the terms of the license agreement you entered into + * with STMicroelectronics + * + * Programming Golden Rule: Keep it Simple! + * + */ + +/*! + * \file VL53L0X_platform.c + * \brief Code function defintions for Ewok Platform Layer + * + */ + +#include "clock.h" +#include "debug.h" +// #include +#include // sprintf(), vsnprintf(), printf() + +#ifdef _MSC_VER +#define snprintf _snprintf +#endif + +#include "vl53l0x_i2c_platform.h" +#include "vl53l0x_def.h" + +// #include "ranging_sensor_comms.h" +// #include "comms_platform.h" + +#include "vl53l0x_platform_log.h" + +#ifdef VL53L0X_LOG_ENABLE +#define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_PLATFORM, level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) +#define trace_i2c(...) trace_print_module_function(TRACE_MODULE_NONE, TRACE_LEVEL_NONE, TRACE_FUNCTION_I2C, ##__VA_ARGS__) +#endif + + + +char debug_string[VL53L0X_MAX_STRING_LENGTH_PLT]; + + +#define MIN_COMMS_VERSION_MAJOR 1 +#define MIN_COMMS_VERSION_MINOR 8 +#define MIN_COMMS_VERSION_BUILD 1 +#define MIN_COMMS_VERSION_REVISION 0 + +#define STATUS_OK 0x00 +#define STATUS_FAIL 0x01 + +// bool_t _check_min_version(void) +// { + +// } + +// int32_t VL53L0X_comms_initialise(uint8_t comms_type, uint16_t comms_speed_khz) +// { + + +// return STATUS_OK; +// } + +// int32_t VL53L0X_comms_close(void) +// { +// int32_t status = STATUS_OK; + +// return status; +// } + +int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count) +{ + int32_t status = STATUS_OK; + + int32_t i; + + vl53l0x_iic_start(); + vl53l0x_iic_send_byte((address << 1) | 0); + if (vl53l0x_iic_wait_ack() == 1) + { + vl53l0x_iic_stop(); + return STATUS_FAIL; + } + vl53l0x_iic_send_byte(index); + if (vl53l0x_iic_wait_ack() == 1) + { + vl53l0x_iic_stop(); + return STATUS_FAIL; + } + for (i=0; i 1) ? 1 : 0); + count--; + pdata++; + } + vl53l0x_iic_stop(); + + + return status; +} + + +int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data) +{ + int32_t status = STATUS_OK; + const int32_t cbyte_count = 1; + + status = VL53L0X_write_multi(address, index, &data, cbyte_count); + + return status; + +} + + +int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data) +{ + int32_t status = STATUS_OK; + + uint8_t buffer[BYTES_PER_WORD]; + + // Split 16-bit word into MS and LS uint8_t + buffer[0] = (uint8_t)(data >> 8); + buffer[1] = (uint8_t)(data & 0x00FF); + + status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_WORD); + + return status; + +} + + +int32_t VL53L0X_write_dword(uint8_t address, uint8_t index, uint32_t data) +{ + int32_t status = STATUS_OK; + uint8_t buffer[BYTES_PER_DWORD]; + + // Split 32-bit word into MS ... LS bytes + buffer[0] = (uint8_t) (data >> 24); + buffer[1] = (uint8_t)((data & 0x00FF0000) >> 16); + buffer[2] = (uint8_t)((data & 0x0000FF00) >> 8); + buffer[3] = (uint8_t) (data & 0x000000FF); + + status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_DWORD); + + return status; + +} + + +int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata) +{ + int32_t status = STATUS_OK; + int32_t cbyte_count = 1; + + status = VL53L0X_read_multi(address, index, pdata, cbyte_count); + + return status; + +} + + +int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata) +{ + int32_t status = STATUS_OK; + uint8_t buffer[BYTES_PER_WORD] = {0}; + + status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_WORD); + // DBG_PRINTF("status: %d\r\n",status); + *pdata = ((uint16_t)buffer[0]<<8) + (uint16_t)buffer[1]; + + return status; + +} + +int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata) +{ + int32_t status = STATUS_OK; + uint8_t buffer[BYTES_PER_DWORD]; + + status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_DWORD); + *pdata = ((uint32_t)buffer[0]<<24) + ((uint32_t)buffer[1]<<16) + ((uint32_t)buffer[2]<<8) + (uint32_t)buffer[3]; + + return status; + +} + +int32_t VL53L0X_platform_wait_us(int32_t wait_us) +{ + int32_t status = STATUS_OK; + float wait_ms = (float)wait_us/1000.0f; + + BASE_FUNC_DELAY_US(wait_us); + +#ifdef VL53L0X_LOG_ENABLE + trace_i2c("Wait us : %6d\n", wait_us); +#endif + + return status; + +} + + +int32_t VL53L0X_wait_ms(int32_t wait_ms) +{ + int32_t status = STATUS_OK; + + BASE_FUNC_DELAY_MS(wait_ms); + + +#ifdef VL53L0X_LOG_ENABLE + trace_i2c("Wait ms : %6d\n", wait_ms); +#endif + + return status; + +} + + +// int32_t VL53L0X_set_gpio(uint8_t level) +// { +// int32_t status = STATUS_OK; +// //status = VL53L0X_set_gpio_sv(level); +// #ifdef VL53L0X_LOG_ENABLE +// trace_i2c("// Set GPIO = %d;\n", level); +// #endif + +// return status; + +// } + + +// int32_t VL53L0X_get_gpio(uint8_t *plevel) +// { +// int32_t status = STATUS_OK; + +// return status; +// } + + +// int32_t VL53L0X_release_gpio(void) +// { +// int32_t status = STATUS_OK; + +// } + +// int32_t VL53L0X_cycle_power(void) +// { +// int32_t status = STATUS_OK; + +// return status; +// } + + +// int32_t VL53L0X_get_timer_frequency(int32_t *ptimer_freq_hz) +// { +// *ptimer_freq_hz = 0; +// return STATUS_FAIL; +// } + + +// int32_t VL53L0X_get_timer_value(int32_t *ptimer_count) +// { +// *ptimer_count = 0; +// return STATUS_FAIL; +// } diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" new file mode 100644 index 00000000..2236329a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" @@ -0,0 +1,275 @@ +/******************************************************************************* +Copyright � 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 VL53L0X_i2c.c + * + * Copyright (C) 2014 ST MicroElectronics + * + * provide variable word size byte/Word/dword VL6180x register access via i2c + * + */ +#include "vl53l0x_platform.h" +// #include "vl53l0x_i2c_platform.h" +#include "vl53l0x_api.h" +// #include + +#define LOG_FUNCTION_START(fmt, ... ) _LOG_FUNCTION_START(TRACE_MODULE_PLATFORM, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ... ) _LOG_FUNCTION_END(TRACE_MODULE_PLATFORM, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ... ) _LOG_FUNCTION_END_FMT(TRACE_MODULE_PLATFORM, status, fmt, ##__VA_ARGS__) + +/** + * @def I2C_BUFFER_CONFIG + * + * @brief Configure Device register I2C access + * + * @li 0 : one GLOBAL buffer \n + * Use one global buffer of MAX_I2C_XFER_SIZE byte in data space \n + * This solution is not multi-Device compliant nor multi-thread cpu safe \n + * It can be the best option for small 8/16 bit MCU without stack and limited ram (STM8s, 80C51 ...) + * + * @li 1 : ON_STACK/local \n + * Use local variable (on stack) buffer \n + * This solution is multi-thread with use of i2c resource lock or mutex see VL6180x_GetI2CAccess() \n + * + * @li 2 : User defined \n + * Per Device potentially dynamic allocated. Requires VL6180x_GetI2cBuffer() to be implemented. + * @ingroup Configuration + */ +#define I2C_BUFFER_CONFIG 1 +/** Maximum buffer size to be used in i2c */ +#define VL53L0X_MAX_I2C_XFER_SIZE 64 /* Maximum buffer size to be used in i2c */ + +#if I2C_BUFFER_CONFIG == 0 + /* GLOBAL config buffer */ + uint8_t i2c_global_buffer[VL53L0X_MAX_I2C_XFER_SIZE]; + + #define DECL_I2C_BUFFER + #define VL53L0X_GetLocalBuffer(Dev, n_byte) i2c_global_buffer + +#elif I2C_BUFFER_CONFIG == 1 + /* ON STACK */ + #define DECL_I2C_BUFFER uint8_t LocBuffer[VL53L0X_MAX_I2C_XFER_SIZE]; + #define VL53L0X_GetLocalBuffer(Dev, n_byte) LocBuffer +#elif I2C_BUFFER_CONFIG == 2 + /* user define buffer type declare DECL_I2C_BUFFER as access via VL53L0X_GetLocalBuffer */ + #define DECL_I2C_BUFFER +#else +#error "invalid I2C_BUFFER_CONFIG " +#endif + + +#define VL53L0X_I2C_USER_VAR /* none but could be for a flag var to get/pass to mutex interruptible return flags and try again */ +#define VL53L0X_GetI2CAccess(Dev) /* todo mutex acquire */ +#define VL53L0X_DoneI2CAcces(Dev) /* todo mutex release */ + + +VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + return Status; +} + +VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + return Status; +} + +// the ranging_sensor_comms.dll will take care of the page selection +VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ + + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int = 0; + uint8_t deviceAddress; + + if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_multi(deviceAddress, index, pdata, count); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +// the ranging_sensor_comms.dll will take care of the page selection +VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ + VL53L0X_I2C_USER_VAR + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_multi(deviceAddress, index, pdata, count); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + + +VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_byte(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_word(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_dword(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + uint8_t data; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_byte(deviceAddress, index, &data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + if (Status == VL53L0X_ERROR_NONE) { + data = (data & AndData) | OrData; + status_int = VL53L0X_write_byte(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + } + + return Status; +} + +VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_byte(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_word(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_dword(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +#define VL53L0X_POLLINGDELAY_LOOPNB 250 +VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev){ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + // LOG_FUNCTION_START(""); + + // const DWORD cTimeout_ms = 1; + // HANDLE hEvent = CreateEvent(0, TRUE, FALSE, 0); + // if(hEvent != NULL) + // { + // WaitForSingleObject(hEvent,cTimeout_ms); + // } + + // LOG_FUNCTION_END(status); + return status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/feature.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/feature.h" new file mode 100644 index 00000000..1e8331dc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/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/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/main.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/main.h" new file mode 100644 index 00000000..e1d4b345 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/main.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 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 "uart.h" +#include "i2c.h" +#include "uart_ex.h" +#include "gpio.h" +#include "gpt.h" +#include "gpt_ex.h" +#include "timer.h" +#include "timer_ex.h" +#include "crg.h" +#include "iocmg.h" +#include "debug.h" +/* USER CODE BEGIN 0 */ + +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ +#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 + +/* USER CODE BEGIN 1 */ + +//电机正反转控制端 +#define left_in1(GPIO_LEVEL) HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_5, GPIO_LEVEL) +#define left_in2(GPIO_LEVEL) HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_6, GPIO_LEVEL) + +#define right_in1(GPIO_LEVEL) HAL_GPIO_SetValue(&g_gpio5, GPIO_PIN_3, GPIO_LEVEL) +#define right_in2(GPIO_LEVEL) HAL_GPIO_SetValue(&g_gpio5, GPIO_PIN_1, GPIO_LEVEL) + +// 工作模式 +#define DESKTOP_MODE 0X00 +#define GROUND_MODE 0X01 + +/* USER CODE END 1 */ +extern GPT_Handle g_gpt1; +extern GPT_Handle g_gpt2; +extern GPT_Handle g_gpt3; +extern TIMER_Handle g_timer0; +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; +extern GPIO_Handle g_gpio1; +extern GPIO_Handle g_gpio2; +extern GPIO_Handle g_gpio3; +extern GPIO_Handle g_gpio4; +extern GPIO_Handle g_gpio5; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0WriteInterruptCallback(void *handle); +void UART0ReadInterruptCallback(void *handle); + +void TIMER0_InterruptProcess(void *handle); +void TIMER0_DMAOverFlow_InterruptProcess(void *handle); + +void GPIO1_1_CallbackFunc(void *param); +void GPIO1_4_CallbackFunc(void *param); + +/* USER CODE BEGIN 2 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 2 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/system_init.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/system_init.c" new file mode 100644 index 00000000..5b53c1e3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/generatecode/system_init.c" @@ -0,0 +1,417 @@ +/** + * @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; +} + +// __weak void GPIO1_1_CallbackFunc(void *param) +// { +// GPIO_Handle *handle = (GPIO_Handle *)param; +// BASE_FUNC_UNUSED(handle); +// } +// __weak void GPIO1_4_CallbackFunc(void *param) +// { +// GPIO_Handle *handle = (GPIO_Handle *)param; +// BASE_FUNC_UNUSED(handle); +// } + +static void GPIO_Init(void) +{ + HAL_CRG_IpEnableSet(GPIO4_BASE, IP_CLK_ENABLE); + g_gpio4.baseAddress = GPIO4; + + g_gpio4.pins = GPIO_PIN_4; + HAL_GPIO_Init(&g_gpio4); + HAL_GPIO_SetDirection(&g_gpio4, g_gpio4.pins, GPIO_OUTPUT_MODE); + HAL_GPIO_SetValue(&g_gpio4, g_gpio4.pins, GPIO_LOW_LEVEL); + HAL_GPIO_SetIrqType(&g_gpio4, g_gpio4.pins, GPIO_INT_TYPE_NONE); + + HAL_CRG_IpEnableSet(GPIO3_BASE, IP_CLK_ENABLE); + g_gpio3.baseAddress = GPIO3; + + g_gpio3.pins = GPIO_PIN_4; + HAL_GPIO_Init(&g_gpio3); + HAL_GPIO_SetDirection(&g_gpio3, g_gpio3.pins, GPIO_OUTPUT_MODE); + HAL_GPIO_SetValue(&g_gpio3, g_gpio3.pins, GPIO_LOW_LEVEL); + HAL_GPIO_SetIrqType(&g_gpio3, g_gpio3.pins, GPIO_INT_TYPE_NONE); + + HAL_CRG_IpEnableSet(GPIO2_BASE, IP_CLK_ENABLE); + g_gpio2.baseAddress = GPIO2; + + g_gpio2.pins = GPIO_PIN_2; + HAL_GPIO_Init(&g_gpio2); + HAL_GPIO_SetDirection(&g_gpio2, g_gpio2.pins, GPIO_OUTPUT_MODE); + HAL_GPIO_SetValue(&g_gpio2, g_gpio2.pins, GPIO_HIGH_LEVEL); + HAL_GPIO_SetIrqType(&g_gpio2, g_gpio2.pins, GPIO_INT_TYPE_NONE); + + + + HAL_CRG_IpEnableSet(GPIO1_BASE, IP_CLK_ENABLE); + g_gpio1.baseAddress = GPIO1; + + g_gpio1.pins = GPIO_PIN_1 | GPIO_PIN_4; + HAL_GPIO_Init(&g_gpio1); + HAL_GPIO_SetDirection(&g_gpio1, g_gpio1.pins, GPIO_INPUT_MODE); + HAL_GPIO_SetValue(&g_gpio1, g_gpio1.pins, GPIO_LOW_LEVEL); + HAL_GPIO_SetIrqType(&g_gpio1, g_gpio1.pins, GPIO_INT_TYPE_BOTH_EDGE); + + HAL_GPIO_RegisterCallBack(&g_gpio1, GPIO_PIN_1, GPIO1_1_CallbackFunc); + HAL_GPIO_RegisterCallBack(&g_gpio1, GPIO_PIN_4, GPIO1_4_CallbackFunc); + IRQ_Register(IRQ_GPIO1, HAL_GPIO_IrqHandler, &g_gpio1); + IRQ_SetPriority(IRQ_GPIO1, 2); /* set gpio1 interrupt priority to 1, 1~15. 1 is priority value */ + IRQ_EnableN(IRQ_GPIO1); /* gpio interrupt enable */ + + HAL_CRG_IpEnableSet(GPIO3_BASE, IP_CLK_ENABLE); + g_gpio3.baseAddress = GPIO3; + + g_gpio3.pins = GPIO_PIN_5 | GPIO_PIN_6; + HAL_GPIO_Init(&g_gpio3); + HAL_GPIO_SetDirection(&g_gpio3, g_gpio3.pins, GPIO_OUTPUT_MODE); + HAL_GPIO_SetValue(&g_gpio3, g_gpio3.pins, GPIO_LOW_LEVEL); + + + HAL_CRG_IpEnableSet(GPIO5_BASE, IP_CLK_ENABLE); + g_gpio5.baseAddress = GPIO5; + + g_gpio5.pins = GPIO_PIN_3 | GPIO_PIN_1; + HAL_GPIO_Init(&g_gpio5); + HAL_GPIO_SetDirection(&g_gpio5, g_gpio5.pins, GPIO_OUTPUT_MODE); + HAL_GPIO_SetValue(&g_gpio5, g_gpio5.pins, GPIO_LOW_LEVEL); + + + return; +} + +static void GPT1_Init(void) +{ + HAL_CRG_IpEnableSet(GPT1_BASE, IP_CLK_ENABLE); + + g_gpt1.baseAddress = GPT1; + g_gpt1.clockDiv = 10 - 1; /* 10 is the internal frequency division of GPT */ + g_gpt1.period = 999; /* 999 is the number of GPT counting cycles. */ + g_gpt1.refA0.refdot = 1; /* 1 is the value of PWM reference point A. */ + g_gpt1.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */ + g_gpt1.refB0.refdot = 299; /* 499 is the value of PWM reference point B. */ + g_gpt1.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */ + g_gpt1.bufLoad = BASE_CFG_ENABLE; + g_gpt1.pwmKeep = BASE_CFG_ENABLE; + g_gpt1.handleEx.periodIntEnable = BASE_CFG_DISABLE; + g_gpt1.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + g_gpt1.triggleAdcOutFinish = BASE_CFG_DISABLE; + g_gpt1.triggleAdcPeriod = BASE_CFG_DISABLE; + + HAL_GPT_Init(&g_gpt1); + +} + +static void GPT2_Init(void) +{ + HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE); + + g_gpt2.baseAddress = GPT2; + g_gpt2.clockDiv = 10 - 1; /* 10 is the internal frequency division of GPT */ + g_gpt2.period = 999; /* 999 is the number of GPT counting cycles. */ + g_gpt2.refA0.refdot = 1; /* 700 is the value of PWM reference point A. */ + g_gpt2.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */ + g_gpt2.refB0.refdot = 299; /* 900 is the value of PWM reference point B. */ + g_gpt2.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */ + g_gpt2.bufLoad = BASE_CFG_ENABLE; + g_gpt2.pwmKeep = BASE_CFG_ENABLE; + g_gpt2.handleEx.periodIntEnable = BASE_CFG_DISABLE; + g_gpt2.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + g_gpt2.triggleAdcOutFinish = BASE_CFG_DISABLE; + g_gpt2.triggleAdcPeriod = BASE_CFG_DISABLE; + + HAL_GPT_Init(&g_gpt2); + +} + +static void GPT3_Init(void) +{ + HAL_CRG_IpEnableSet(GPT3_BASE, IP_CLK_ENABLE); +// 控制舵机 50hz信号 + g_gpt3.baseAddress = GPT3; + g_gpt3.clockDiv = 300 - 1; /* 10 is the internal frequency division of GPT */ + g_gpt3.period = 10000 -1; /* 999 is the number of GPT counting cycles. */ + g_gpt3.refA0.refdot = 1; /* 700 is the value of PWM reference point A. */ + g_gpt3.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action High */ + g_gpt3.refB0.refdot = 4999; /* 900 is the value of PWM reference point B. */ + g_gpt3.refB0.refAction = GPT_ACTION_OUTPUT_LOW; /* GPT Action Low */ + g_gpt3.bufLoad = BASE_CFG_ENABLE; + g_gpt3.pwmKeep = BASE_CFG_ENABLE; + g_gpt3.handleEx.periodIntEnable = BASE_CFG_DISABLE; + g_gpt3.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + g_gpt3.triggleAdcOutFinish = BASE_CFG_DISABLE; + g_gpt3.triggleAdcPeriod = BASE_CFG_DISABLE; + + HAL_GPT_Init(&g_gpt3); + +} + +// __weak void TIMER0_InterruptProcess(void *handle) +// { +// BASE_FUNC_UNUSED(handle); +// /* USER CODE BEGIN TIMER0_InterruptProcess */ +// /* USER CODE END TIMER0_InterruptProcess */ +// } + +static void TIMER0_Init(void) +{ + HAL_CRG_IpEnableSet(TIMER0_BASE, IP_CLK_ENABLE); /* TIMER0 clock enable. */ + unsigned int load = (HAL_CRG_GetIpFreq((void *)TIMER0) / (1u << (TIMERPRESCALER_NO_DIV * 4)) / 1000000u) * 1000; + + g_timer0.baseAddress = TIMER0; + g_timer0.load = load - 1; /* Set timer value immediately */ + g_timer0.bgLoad = load - 1; /* Set timer value */ + g_timer0.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + g_timer0.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + g_timer0.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + g_timer0.interruptEn = BASE_CFG_ENABLE; + g_timer0.adcSocReqEnable = BASE_CFG_DISABLE; + g_timer0.dmaReqEnable = BASE_CFG_DISABLE; + HAL_TIMER_Init(&g_timer0); + IRQ_Register(IRQ_TIMER0, HAL_TIMER_IrqHandler, &g_timer0); + + HAL_TIMER_RegisterCallback(&g_timer0, TIMER_PERIOD_FIN, TIMER0_InterruptProcess); + IRQ_SetPriority(IRQ_TIMER0, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_TIMER0); +} + +__weak void UART0WriteInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void UART0ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ +// /* USER CODE END UART0_READ_IT_FINISH */ +} + +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_INTERRUPT; + g_uart0.rxMode = UART_MODE_INTERRUPT; + 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); + HAL_UART_RegisterCallBack(&g_uart0, UART_WRITE_IT_FINISH, (UART_CallbackType)UART0WriteInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart0, UART_READ_IT_FINISH, (UART_CallbackType)UART0ReadInterruptCallback); + + /* USER CODE BEGIN UART0_Init */ + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart0);//串口接收回调函数有修改,以回车换行符作为接收结束符 + IRQ_SetPriority(IRQ_UART0, 3); /* 1 is priority value */ + IRQ_EnableN(IRQ_UART0); + /* USER CODE END UART0_Init */ + +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); /* I2C0 clock enable. */ + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* 10 is sda Hold Time */ + g_i2c0.freq = 400000; /* freqence is 100000 */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* 10000 is time out */ + g_i2c0.state = I2C_STATE_RESET; + HAL_I2C_Init(&g_i2c0); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN36 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_0_AS_JTAG_TCK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_0_AS_JTAG_TCK, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_0_AS_JTAG_TCK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_0_AS_JTAG_TCK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_0_AS_JTAG_TCK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN37 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_1_AS_JTAG_TMS); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_1_AS_JTAG_TMS, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_1_AS_JTAG_TMS, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_1_AS_JTAG_TMS, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_1_AS_JTAG_TMS, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN47 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_5_AS_GPT1_PWM); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_5_AS_GPT1_PWM, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_5_AS_GPT1_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_5_AS_GPT1_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_5_AS_GPT1_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN6 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN7 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_7_AS_GPT3_PWM); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_7_AS_GPT3_PWM, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_7_AS_GPT3_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_7_AS_GPT3_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_7_AS_GPT3_PWM, 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 */ + /* Config PIN28 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO1_1_AS_GPIO1_1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_1_AS_GPIO1_1, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_1_AS_GPIO1_1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_1_AS_GPIO1_1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_1_AS_GPIO1_1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN18 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_GPIO1_4); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_GPIO1_4, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_GPIO1_4, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_GPIO1_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_GPIO1_4, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + /* Config PIN9 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_5_AS_GPIO3_5); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_5_AS_GPIO3_5, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_5_AS_GPIO3_5, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_5_AS_GPIO3_5, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_5_AS_GPIO3_5, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN8 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_6_AS_GPIO3_6); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_6_AS_GPIO3_6, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_6_AS_GPIO3_6, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_6_AS_GPIO3_6, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_6_AS_GPIO3_6, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + /* Config PIN2 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_1_AS_GPIO5_1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_1_AS_GPIO5_1, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_1_AS_GPIO5_1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_1_AS_GPIO5_1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_1_AS_GPIO5_1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN10 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_3_AS_GPIO5_3); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_3_AS_GPIO5_3, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_3_AS_GPIO5_3, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_3_AS_GPIO5_3, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_3_AS_GPIO5_3, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + + /* Config PIN26 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_3_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_3_AS_I2C0_SDA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_3_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_3_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_3_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN25 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_2_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_2_AS_I2C0_SCL, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_2_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_2_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_2_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + /* Config PIN30 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_4_AS_GPIO4_4); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_4_AS_GPIO4_4, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_4_AS_GPIO4_4, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_4_AS_GPIO4_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_4_AS_GPIO4_4, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN29 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_4_AS_GPIO3_4); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_4_AS_GPIO3_4, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_4_AS_GPIO3_4, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_4_AS_GPIO3_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_4_AS_GPIO3_4, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN34 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_GPIO2_2); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_GPIO2_2, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_GPIO2_2, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_GPIO2_2, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_GPIO2_2, DRIVER_RATE_2); /* Output signal edge fast/slow */ + +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init();//串口初始化中,接收回调函数有修改。 + I2C0_Init(); + GPT1_Init(); + GPT2_Init(); + GPT3_Init(); + TIMER0_Init(); + GPIO_Init(); + + /* USER CODE BEGIN system_init */ + + /* USER CODE END system_init */ +} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/main.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/main.c" new file mode 100644 index 00000000..1268ca1b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/main.c" @@ -0,0 +1,351 @@ +/** + * @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.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +#include +#include // 包含isdigit函数 +#include "vl53l0x.h" +#include "mycar_control.h" + + +unsigned char g_carStart,g_carStop;//电机启动状态 停止状态 + +static unsigned char readData[20] = {0}; +static volatile unsigned char g_uartReceiveFlag;//串口接收标志 +static volatile unsigned char f_250ms,f_1s,f_10s;//计时标志 +static volatile unsigned int v_num_left,v_num_right;// 左右轮速度计数(单位:码盘孔数) +static unsigned char workStatus;//助手工作模式,地面或者桌面 +unsigned short s_distance; //激光测距距离 +// 久坐模式 守卫模式 标志 +static unsigned char f_sedentary,f_guard; + +static volatile unsigned int time_num,time_sedentary_num;//计数器计数 1ms 和久坐计数 10s + +int targetSpeed = 8;//设置目标速度,默认为 8 + +//函数声明 +static void UART0_InterruptTxInit(UART_Handle *uartHandle); +static unsigned int GetNumFromStr(unsigned char* str); +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* 建议用户放置头文件 */ +/* USER CODE END 0 */ + +// 宏定义 +// 调试宏定义 +// #define PRINT_TEST + + +GPT_Handle g_gpt1; +GPT_Handle g_gpt2; +GPT_Handle g_gpt3; +TIMER_Handle g_timer0; +UART_Handle g_uart0; +I2C_Handle g_i2c0; +GPIO_Handle g_gpio1; +GPIO_Handle g_gpio2; +GPIO_Handle g_gpio3; +GPIO_Handle g_gpio4; +GPIO_Handle g_gpio5; + +/* USER CODE BEGIN 1 */ +/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */ + + +/** + * 串口读中断回调函数 +*/ +void UART0ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + // DBG_PRINTF("Read Finish: %s\r\n", readData); + g_uart0.rxbuff = readData;//这很重要,将接收数组的初始地址赋给该指针 + g_uartReceiveFlag = true;//接收数据后,接收标志置为true + return; +} +//timer 定时器中断 +void TIMER0_InterruptProcess(void *handle) +{ + BASE_FUNC_UNUSED(handle); + //1ms 定时器 + time_num++; + + if(time_num%1000==0){ + f_1s = true; + } + if(time_num%250==0){ + f_250ms = true; + } + if(time_num%10000==0){ + f_10s = true; + } + if(time_num == 1000*60*60*24) + time_num = 0; +} +//right v 测量右轮速度 计数 +void GPIO1_1_CallbackFunc(void *param) +{ + GPIO_Handle *handle = (GPIO_Handle *)param; + BASE_FUNC_UNUSED(handle); + // GPIO_InterruptMode mode = HAL_GPIO_GetPinIrqType(handle, handle->pins); + // DBG_PRINTF("GPIO1_1 In intMode[%d]'s callback -- %d", mode,v_num_left); + + //计数 + v_num_right++; +} +//left v 测量左轮速度 计数 + void GPIO1_4_CallbackFunc(void *param) +{ + GPIO_Handle *handle = (GPIO_Handle *)param; + BASE_FUNC_UNUSED(handle); + + v_num_left++; +} + + +/** + * 串口中断接收初始化,使能接收中断 +*/ +void UART0_InterruptTxInit(UART_Handle *uartHandle) +{ + uartHandle->rxState = UART_STATE_BUSY_RX; + uartHandle->rxbuff = readData; + 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 */ + } +} + +/** + * 从字符串中获取数值 + * 开头以数值开头,转换为无符号整型表示 + */ +unsigned int GetNumFromStr(unsigned char* str) +{ + unsigned int i=0; + // 首先需要得到一个纯数字化的字符串 提供的字符串第一个字符为数值 + // 遍历字符串,直到遇到非数字字符 + while (isdigit(*str)) { + i = i * 10 + (*str - '0'); // 将字符转换为数字并构建数字值 + str++; + } + return i; +} + + +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* 建议用户放置初始化代码或启动代码等 */ + /* USER CODE END 2 */ + SystemInit(); + /* USER CODE BEGIN 3 */ + // DBG_PRINTF("Init finish, please enter characters:\r\n"); + g_uartReceiveFlag = false; + UART0_InterruptTxInit(&g_uart0); + /* 建议用户放置初始配置代码 */ + + // 配置vl53l0x初始化 感觉初始化之前最好不要开中断,可能会扰乱IIC通讯 + Vl53l0xInit(); + HAL_TIMER_Start(&g_timer0); + //vl53l0x开始测量 + Vl53l0xStart(); + + // HAL_GPT_Start(&g_gpt3); + //似乎开启后需要开启驱动电机,否则电机会直接转 应该和驱动有关 + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + + // 获取测量结果 如果没有则为0 + s_distance = GetDistance(); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + // 避障实现 + if(s_distance!=0 && s_distance<120){ + targetSpeed = 0; + if(!g_carStop){ + g_carStop =true; + DBG_PRINTF("stop you will hit it! \r\n"); + } + } + + //工作不同模式下的实现 + if(workStatus == DESKTOP_MODE){ + // 桌面模式下 + + // 久坐检测 + if(f_sedentary) //超过1.5小时就报警提示休息 + { + f_sedentary = false; + DBG_PRINTF("you have been working for 1.5 hours,please walk around and relax ~ \r\n"); + } + + }else if(workStatus == GROUND_MODE){ + // 地面模式下 + + // 门口检测 + if(f_guard){ + + if(s_distance!=0 && s_distance<500){ + DBG_PRINTF("warning, someone has invaded your house! \r\n"); + f_guard = 0; + } + } + } + + + if(f_10s){ + // 10s计算 计数任务 定时任务 + f_10s = false; + // DBG_PRINTF("10s--l:%d,r:%d time:%u\r\n",v_num_left,v_num_right,time_num); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + //打印用 + + // 久坐检测 + if(s_distance!=0 && s_distance<500){ + //说明有人 + time_sedentary_num++; + // DBG_PRINTF("long act time: %d\r\n",time_sedentary_num*10); + // if(time_sedentary_num >= 6*2) 调试用 + if(time_sedentary_num >= 10*6*60*1.5) //1.5h + { + f_sedentary = true; + time_sedentary_num = 0; + } + + }else{ + //无人,清零 + time_sedentary_num = 0; + } + } + + if(f_1s){ + f_1s = false; + // 输出测速 + // 先用M法吧 + // 输出转了多少圈,触发了多少次吧 + // DBG_PRINTF("left: %d, right: %d targetSpeed:%d\r\n",v_num_left,v_num_right,targetSpeed); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + if(g_carStart){ + // DBG_PRINTF("left: %d, right: %d targetSpeed:%d\r\n",v_num_left,v_num_right,targetSpeed); + // DBG_PRINTF("ranging distance: %d\r\n",s_distance); + if(targetSpeed==0&&v_num_left==0&&v_num_right==0) + { + CarWorkStatus(0); + DBG_PRINTF("stop\r\n"); + } + } + + // v_num_left = v_num_right = 0; + } + if(f_250ms){ + //250ms 计数任务 定时任务 + f_250ms = false; + // 输出转了多少圈,触发了多少次吧 作为测速结果 + // DBG_PRINTF("10s--l:%d,r:%d\r\n",v_num_left,v_num_right); + // syn_two_motor_vctr(v_num_left,v_num_right,targetSpeed,targetSpeed); + if(g_carStart){ + //PID调速 + SynTwoMotorSpeed(v_num_left,v_num_right,targetSpeed,targetSpeed); + } + + v_num_left = v_num_right = 0; + } + + if(g_uartReceiveFlag){ + //接收到串口数据,进行处理动作 + if(!strncmp(readData,"setv",4)){ + //调整目标速度 + targetSpeed = GetNumFromStr(readData+4); + } + else if(!strncmp(readData,"come",4)){ + //唤来助手 + Come(); + } + else if(!strncmp(readData,"back",4)){ + //唤退助手 + } + else if(!strncmp(readData,"sta_act",4)){ + //开始动画 + // start_act(); + } + else if(!strncmp(readData,"start",5)){ + //电机start + CarWorkStatus(1); + }else if(!strncmp(readData,"guard",5)){ + AsGuard(); + f_guard = 1; + }else if(!strncmp(readData,"stop",4)){ + CarWorkStatus(0); + }else if(!strncmp(readData,"left",4)){ + TurnLeft(); + }else if(!strncmp(readData,"right",5)){ + TurnRight(); + }else if(!strncmp(readData,"retreat",4)){ + Retreat(); + } + // else if(!strncmp(readData,"shuai",4)){ + // shuai(); + // } + /*舵机控制,暂未实现*/ + // else if(!strncmp(readData,"duo",3)){ + // if(!strncmp(readData+3,"+",1)){ + // steering(1); + // }else{ + // steering(0); + // } + else if(!strncmp(readData,"clo",3)){ + ClockwiseMotor(); + + }else if(!strncmp(readData,"ant",3)){ + AnticlockwiseMotor(); + + }else if(!strncmp(readData,"desk",4)){ + // AnticlockwiseMotor(); + workStatus = DESKTOP_MODE; + + }else if(!strncmp(readData,"ground",4)){ + // AnticlockwiseMotor(); + workStatus = GROUND_MODE; + f_guard = 1; + } + //清空数组、标志 + g_uartReceiveFlag = false; + memset(readData,0,sizeof(readData)); + } + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/inc/mycar_control.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/inc/mycar_control.h" new file mode 100644 index 00000000..8db0b300 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/inc/mycar_control.h" @@ -0,0 +1,38 @@ + + +#ifndef MYCAR_CONTROL_H +#define MYCAR_CONTROL_H + + + +extern int targetSpeed; +extern unsigned char g_carStart,g_carStop; + +//驱动电机控制 +void MotorStatus(unsigned char a,unsigned char b,unsigned char c); +//apt 占空比控制 +void ChangeCarApt(unsigned int Left_PWM, unsigned int Right_PWM); +//PID 调速 +void SynTwoMotorSpeed(float current_l_speed,float current_r_speed, + unsigned int target_l_speed,unsigned int target_r_speed); +//设置固定占空比 +void SetCarAptAndStart(unsigned int leftValue, unsigned int rightValue); +//小车工作状态 +void CarWorkStatus(unsigned char i); +// 左转 +void TurnLeft(void); +//右转 +void TurnRight(void); +//后退 +void Retreat(void); +//顺时针 +void ClockwiseMotor(void); +//逆时针 +void AnticlockwiseMotor(void); +//过来 +void Come(void); +//去值守 +void AsGuard(void); + + +#endif /*MYCAR_CONTROL_H*/ \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/src/mycar_control.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/src/mycar_control.c" new file mode 100644 index 00000000..1eda4b21 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/mycar/src/mycar_control.c" @@ -0,0 +1,276 @@ + +#include "mycar_control.h" +#include "main.h" + + +//电机正反转设置 a确定左右 0,1 ,2(同步) b-in1 c-in2 b c 1 0是前进 0 1 是后退 +void MotorStatus(unsigned char a,unsigned char b,unsigned char c) +{ + if(a == 2){ + //同步设置 + left_in1(b);left_in2(c); + right_in1(b);right_in2(c); + }else if(a==0){ + left_in1(b);left_in2(c); + }else{ + right_in1(b);right_in2(c); + } +} + + +/** + * APT0和1的 B点修改配置 +*/ +void ChangeCarApt(unsigned int Left_PWM, unsigned int Right_PWM) +{ + GPT_ReferCfg PWMConfig1,PWMConfig2; + HAL_GPT_GetReferCounterAndAction(&g_gpt1,&PWMConfig1); + HAL_GPT_GetReferCounterAndAction(&g_gpt2,&PWMConfig2); + g_gpt1.baseAddress->GPT_TC_REFB0.reg = Right_PWM; + g_gpt2.baseAddress->GPT_TC_REFB0.reg = Left_PWM; + g_gpt1.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig1.refB0.refAction; + g_gpt2.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig2.refB0.refAction; +} + + +// PID 设置 +// Moto_ID :0 表示左, 1右 +// 似乎有两种方案?一种是直接用目标速度来设定两个轮子误差,分别进行PID计算来调节 使用这种 +// 另一种就是确定一个轮子的速度,让另一个轮子调节来匹配这个速度 +float KP = 10.0, KI = 2.0, KD = 5.0; +float preLeftError = 0.0,ppreLeftError = 0.0; +float preRightError = 0.0,ppreRightError = 0.0; +int Left_ESC_Output_PWM = 0,Right_ESC_Output_PWM = 0; + +void SynTwoMotorSpeed(float current_l_speed,float current_r_speed, + unsigned int target_l_speed,unsigned int target_r_speed) +{ + float L_Error = 0; + float R_Error = 0; + + float P_Error = 0; + float I_Error = 0; + float D_Error = 0; + float addError = 0; + + L_Error = target_l_speed - current_l_speed; //计算误差 + P_Error = L_Error; //比例环节 + I_Error = L_Error - preLeftError; //积分环节 + D_Error = L_Error - 2*preLeftError + ppreLeftError; //微分环节 + + addError = KP * P_Error + KI * I_Error + KD * D_Error +2; //左轮PID增加值 + Left_ESC_Output_PWM += addError; //计算PWM输出值 + + ppreLeftError = preLeftError; + preLeftError = L_Error; + + + R_Error = target_r_speed - current_r_speed; //计算误差 + P_Error = R_Error; //比例环节 + I_Error = R_Error - preRightError; //积分环节 + D_Error = R_Error - 2*preRightError + ppreRightError; //微分环节 + + addError = KP * P_Error + KI * I_Error + KD * D_Error; //左轮PID增加值 + // 根据实际情况进行校准 + Right_ESC_Output_PWM += addError; //计算PWM输出值 + + ppreRightError = preRightError; + preRightError = R_Error; + + // threshold + if(Right_ESC_Output_PWM<1) Right_ESC_Output_PWM = 1; + if(Right_ESC_Output_PWM>799) Right_ESC_Output_PWM =799; + if(Left_ESC_Output_PWM<1) Left_ESC_Output_PWM = 1; + if(Left_ESC_Output_PWM>799) Left_ESC_Output_PWM = 799; + // if(Right_ESC_Output_PWM == 1 &&Left_ESC_Output_PWM == 1){ + // CarWorkStatus(0); + // } + + ChangeCarApt(Left_ESC_Output_PWM, Right_ESC_Output_PWM); //输出左右轮的PWM +} + + +void SetCarAptAndStart(unsigned int leftValue, unsigned int rightValue) +{ + GPT_EN_REG gptEn; + gptEn.BIT.rg_gpt_en = BASE_CFG_SET; + g_gpt1.baseAddress->GPT_EN.reg = gptEn.reg; + g_gpt2.baseAddress->GPT_EN.reg = gptEn.reg; + + GPT_ReferCfg PWMConfig1,PWMConfig2; + HAL_GPT_GetReferCounterAndAction(&g_gpt1,&PWMConfig1); + HAL_GPT_GetReferCounterAndAction(&g_gpt2,&PWMConfig2); + g_gpt1.baseAddress->GPT_TC_REFB0.reg = leftValue; + g_gpt2.baseAddress->GPT_TC_REFB0.reg = rightValue; + g_gpt1.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig1.refB0.refAction; + g_gpt2.baseAddress->GPT_PG_ACT0.BIT.rg_pg_act0_refb0 = PWMConfig2.refB0.refAction; +} + + +// 1 开始 0:停止 +void CarWorkStatus(unsigned char i){ + if(i){ + // 开始工作 + MotorStatus(2,1,0); + BASE_FUNC_DELAY_MS(1); + HAL_GPT_Start(&g_gpt1); + HAL_GPT_Start(&g_gpt2); + targetSpeed =8; + g_carStart = true; + g_carStop = false;//避障提示 + // DBG_PRINTF("start! --%d\r\n",time_num); + }else{ + // 停止工作 + // targetSpeed = 0; + HAL_GPT_Stop(&g_gpt1); + HAL_GPT_Stop(&g_gpt2); + MotorStatus(2,0,0); + g_carStart = false; + g_carStop = true; + // DBG_PRINTF("stop! --%d\r\n",time_num); + } +} + + +// 左转 右边电机往后 +void TurnLeft() +{ + MotorStatus(1,0,1); + MotorStatus(0,1,0); + SetCarAptAndStart(369,369); + g_carStart = true; + BASE_FUNC_DELAY_MS(1100); + CarWorkStatus(0); +} + +// 右转 +void TurnRight() +{ + MotorStatus(0,0,1); + MotorStatus(1,1,0); + SetCarAptAndStart(369,399); + g_carStart = true; + BASE_FUNC_DELAY_MS(1100); + CarWorkStatus(0); +} + +// 后退 +void Retreat() +{ + MotorStatus(2,0,1); + HAL_GPT_Start(&g_gpt1); + HAL_GPT_Start(&g_gpt2); + targetSpeed = 8; + g_carStart = true; +} + + +// 顺时针转 +void ClockwiseMotor() +{ + MotorStatus(0,0,1); + MotorStatus(1,1,0); + HAL_GPT_Start(&g_gpt1); + HAL_GPT_Start(&g_gpt2); + targetSpeed =8; + g_carStart = true; + // DBG_PRINTF("clock! --%d\r\n",time_num); +} +// 逆时针转 +void AnticlockwiseMotor() +{ + MotorStatus(1,0,1); + MotorStatus(0,1,0); + HAL_GPT_Start(&g_gpt1); + HAL_GPT_Start(&g_gpt2); + targetSpeed =8; + g_carStart = true; + // DBG_PRINTF("anticlock! --%d\r\n",time_num); +} + +void Come() +{ + MotorStatus(2,1,0); + SetCarAptAndStart(414,449); + BASE_FUNC_DELAY_S(9); + CarWorkStatus(0); +} + +void AsGuard() +{ + unsigned short distance; + MotorStatus(2,1,0); + SetCarAptAndStart(414,449); + while(1){ + distance = GetDistance(); + if(distance<=750) + { + break; + } + } + TurnRight(); + MotorStatus(2,1,0); + SetCarAptAndStart(414,449); + BASE_FUNC_DELAY_S(9); + TurnLeft(); +} + + + +// // 漂移 暂未实现 +// void shuai(){ +// // targetSpeed = 15; +// // BASE_FUNC_DELAY_MS(1500); +// // MotorStatus(1,0,0); +// // // MotorStatus(0,0,1); +// // targetSpeed = 0; +// // // BASE_FUNC_DELAY_MS(1800); +// // // MotorStatus(2,1,0); +// } +// // 开始动作 唤醒动作 暂未实现 +// void StartAct(){ +// } + +// //apt 步进 调试用 +// void ChangeStepApt(unsigned char x,unsigned char i) +// { +// GPT_ReferCfg PWMConfig1,PWMConfig2; +// HAL_GPT_GetReferCounterAndAction(&g_gpt1,&PWMConfig1); +// HAL_GPT_GetReferCounterAndAction(&g_gpt2,&PWMConfig2); +// DBG_PRINTF("PWM value l: %d! r:%d\r\n",PWMConfig2.refB0.refdot,PWMConfig1.refB0.refdot); +// if(x){ +// if(i) +// PWMConfig1.refB0.refdot = PWMConfig1.refB0.refdot + 10; /* 20000 is the value of PWM reference point A. */ +// else +// PWMConfig2.refB0.refdot = PWMConfig2.refB0.refdot + 10; /* 50000 is the value of PWM reference point A. */ +// }else{ +// if(i) +// PWMConfig1.refB0.refdot = PWMConfig1.refB0.refdot - 10; +// else +// PWMConfig2.refB0.refdot = PWMConfig2.refB0.refdot - 10; +// } +// HAL_GPT_SetReferCounterAndAction(&g_gpt1,&PWMConfig1); +// HAL_GPT_SetReferCounterAndAction(&g_gpt2,&PWMConfig2); +// DBG_PRINTF("PWM value l: %d! r:%d\r\n",PWMConfig2.refB0.refdot,PWMConfig1.refB0.refdot); + +// } + + +// // 用来舵机控制吧 steering engine num = (1,9999) 暂时未物理实现 +// void ControlSteeringGear(unsigned int num){ +// GPT_ReferCfg PWMConfig3; +// HAL_GPT_GetReferCounterAndAction(&g_gpt3,&PWMConfig3); +// if(num){ +// PWMConfig3.refB0.refdot = PWMConfig3.refB0.refdot + 833;//变化10°-555 变化15°-833 +// }else{ +// PWMConfig3.refB0.refdot = PWMConfig3.refB0.refdot - 833; +// } +// DBG_PRINTF("num: %d\r\n",PWMConfig3.refB0.refdot); +// // PWMConfig3.refB0.refdot = num; /* 20000 is the value of PWM reference point A. */ +// HAL_GPT_SetReferCounterAndAction(&g_gpt3,&PWMConfig3); +// } + + + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api.h" new file mode 100644 index 00000000..0521690a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api.h" @@ -0,0 +1,1926 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +#ifndef _VL53L0X_API_H_ +#define _VL53L0X_API_H_ + +#include "vl53l0x_api_strings.h" +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef _MSC_VER +# ifdef VL53L0X_API_EXPORTS +# define VL53L0X_API __declspec(dllexport) +# else +# define VL53L0X_API +# endif +#else +# define VL53L0X_API +#endif + +/** @defgroup VL53L0X_cut11_group VL53L0X cut1.1 Function Definition + * @brief VL53L0X cut1.1 Function Definition + * @{ + */ + +/** @defgroup VL53L0X_general_group VL53L0X General Functions + * @brief General functions and definitions + * @{ + */ + +/** + * @brief Return the VL53L0X PAL Implementation Version + * + * @note This function doesn't access to the device + * + * @param pVersion Pointer to current PAL Implementation Version + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion); + +/** + * @brief Return the PAL Specification Version used for the current + * implementation. + * + * @note This function doesn't access to the device + * + * @param pPalSpecVersion Pointer to current PAL Specification Version + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalSpecVersion( + VL53L0X_Version_t *pPalSpecVersion); + +/** + * @brief Reads the Product Revision for a for given Device + * This function can be used to distinguish cut1.0 from cut1.1. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pProductRevisionMajor Pointer to Product Revision Major + * for a given Device + * @param pProductRevisionMinor Pointer to Product Revision Minor + * for a given Device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev, + uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor); + +/** + * @brief Reads the Device information for given Device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pVL53L0X_DeviceInfo Pointer to current device info for a given + * Device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo); + +/** + * @brief Read current status of the error register for the selected device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pDeviceErrorStatus Pointer to current error code of the device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev, + VL53L0X_DeviceError * pDeviceErrorStatus); + +/** + * @brief Human readable Range Status string for a given RangeStatus + * + * @note This function doesn't access to the device + * + * @param RangeStatus The RangeStatus code as stored on + * @a VL53L0X_RangingMeasurementData_t + * @param pRangeStatusString The returned RangeStatus string. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus, + char *pRangeStatusString); + +/** + * @brief Human readable error string for a given Error Code + * + * @note This function doesn't access to the device + * + * @param ErrorCode The error code as stored on ::VL53L0X_DeviceError + * @param pDeviceErrorString The error string corresponding to the ErrorCode + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceErrorString( + VL53L0X_DeviceError ErrorCode, char *pDeviceErrorString); + +/** + * @brief Human readable error string for current PAL error status + * + * @note This function doesn't access to the device + * + * @param PalErrorCode The error code as stored on @a VL53L0X_Error + * @param pPalErrorString The error string corresponding to the + * PalErrorCode + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode, + char *pPalErrorString); + +/** + * @brief Human readable PAL State string + * + * @note This function doesn't access to the device + * + * @param PalStateCode The State code as stored on @a VL53L0X_State + * @param pPalStateString The State string corresponding to the + * PalStateCode + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode, + char *pPalStateString); + +/** + * @brief Reads the internal state of the PAL for a given Device + * + * @note This function doesn't access to the device + * + * @param Dev Device Handle + * @param pPalState Pointer to current state of the PAL for a + * given Device + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, + VL53L0X_State * pPalState); + +/** + * @brief Set the power mode for a given Device + * The power mode can be Standby or Idle. Different level of both Standby and + * Idle can exists. + * This function should not be used when device is in Ranging state. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param PowerMode The value of the power mode to set. + * see ::VL53L0X_PowerModes + * Valid values are: + * VL53L0X_POWERMODE_STANDBY_LEVEL1, + * VL53L0X_POWERMODE_IDLE_LEVEL1 + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when PowerMode + * is not in the supported list + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes PowerMode); + +/** + * @brief Get the power mode for a given Device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pPowerMode Pointer to the current value of the power + * mode. see ::VL53L0X_PowerModes + * Valid values are: + * VL53L0X_POWERMODE_STANDBY_LEVEL1, + * VL53L0X_POWERMODE_IDLE_LEVEL1 + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes * pPowerMode); + +/** + * Set or over-hide part to part calibration offset + * \sa VL53L0X_DataInit() VL53L0X_GetOffsetCalibrationDataMicroMeter() + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param OffsetCalibrationDataMicroMeter Offset (microns) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter( + VL53L0X_DEV Dev, int32_t OffsetCalibrationDataMicroMeter); + +/** + * @brief Get part to part calibration offset + * + * @par Function Description + * Should only be used after a successful call to @a VL53L0X_DataInit to backup + * device NVM value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pOffsetCalibrationDataMicroMeter Return part to part + * calibration offset from device (microns) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter( + VL53L0X_DEV Dev, int32_t *pOffsetCalibrationDataMicroMeter); + +/** + * Set the linearity corrective gain + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LinearityCorrectiveGain Linearity corrective + * gain in x1000 + * if value is 1000 then no modification is applied. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev, + int16_t LinearityCorrectiveGain); + +/** + * @brief Get the linearity corrective gain + * + * @par Function Description + * Should only be used after a successful call to @a VL53L0X_DataInit to backup + * device NVM value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pLinearityCorrectiveGain Pointer to the linearity + * corrective gain in x1000 + * if value is 1000 then no modification is applied. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev, + uint16_t *pLinearityCorrectiveGain); + +/** + * Set Group parameter Hold state + * + * @par Function Description + * Set or remove device internal group parameter hold + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param GroupParamHold Group parameter Hold state to be set (on/off) + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, + uint8_t GroupParamHold); + +/** + * @brief Get the maximal distance for actual setup + * @par Function Description + * Device must be initialized through @a VL53L0X_SetParameters() prior calling + * this function. + * + * Any range value more than the value returned is to be considered as + * "no target detected" or + * "no target in detectable range"\n + * @warning The maximal distance depends on the setup + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param pUpperLimitMilliMeter The maximal range limit for actual setup + * (in millimeter) + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, + uint16_t *pUpperLimitMilliMeter); + + +/** + * @brief Get the Total Signal Rate + * @par Function Description + * This function will return the Total Signal Rate after a good ranging is done. + * + * @note This function access to Device + * + * @param Dev Device Handle + * @param pTotalSignalRate Total Signal Rate value in Mega count per second + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev, + FixPoint1616_t *pTotalSignalRate); + +/** @} VL53L0X_general_group */ + +/** @defgroup VL53L0X_init_group VL53L0X Init Functions + * @brief VL53L0X Init Functions + * @{ + */ + +/** + * @brief Set new device address + * + * After completion the device will answer to the new address programmed. + * This function should be called when several devices are used in parallel + * before start programming the sensor. + * When a single device us used, there is no need to call this function. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param DeviceAddress The new Device address + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, + uint8_t DeviceAddress); + +/** + * + * @brief One time device initialization + * + * To be called once and only once after device is brought out of reset + * (Chip enable) and booted see @a VL53L0X_WaitDeviceBooted() + * + * @par Function Description + * When not used after a fresh device "power up" or reset, it may return + * @a #VL53L0X_ERROR_CALIBRATION_WARNING meaning wrong calibration data + * may have been fetched from device that can result in ranging offset error\n + * If application cannot execute device reset or need to run VL53L0X_DataInit + * multiple time then it must ensure proper offset calibration saving and + * restore on its own by using @a VL53L0X_GetOffsetCalibrationData() on first + * power up and then @a VL53L0X_SetOffsetCalibrationData() in all subsequent + * init. + * This function will change the VL53L0X_State from VL53L0X_STATE_POWERDOWN to + * VL53L0X_STATE_WAIT_STATICINIT. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev); + +/** + * @brief Set the tuning settings pointer + * + * This function is used to specify the Tuning settings buffer to be used + * for a given device. The buffer contains all the necessary data to permit + * the API to write tuning settings. + * This function permit to force the usage of either external or internal + * tuning settings. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pTuningSettingBuffer Pointer to tuning settings buffer. + * @param UseInternalTuningSettings Use internal tuning settings value. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings); + +/** + * @brief Get the tuning settings pointer and the internal external switch + * value. + * + * This function is used to get the Tuning settings buffer pointer and the + * value. + * of the switch to select either external or internal tuning settings. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param ppTuningSettingBuffer Pointer to tuning settings buffer. + * @param pUseInternalTuningSettings Pointer to store Use internal tuning + * settings value. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings); + +/** + * @brief Do basic device init (and eventually patch loading) + * This function will change the VL53L0X_State from + * VL53L0X_STATE_WAIT_STATICINIT to VL53L0X_STATE_IDLE. + * In this stage all default setting will be applied. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev); + +/** + * @brief Wait for device booted after chip enable (hardware standby) + * This function can be run only when VL53L0X_State is VL53L0X_STATE_POWERDOWN. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + * + */ +VL53L0X_API VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev); + +/** + * @brief Do an hard reset or soft reset (depending on implementation) of the + * device \nAfter call of this function, device must be in same state as right + * after a power-up sequence.This function will change the VL53L0X_State to + * VL53L0X_STATE_POWERDOWN. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev); + +/** @} VL53L0X_init_group */ + +/** @defgroup VL53L0X_parameters_group VL53L0X Parameters Functions + * @brief Functions used to prepare and setup the device + * @{ + */ + +/** + * @brief Prepare device for operation + * @par Function Description + * Update device with provided parameters + * @li Then start ranging operation. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pDeviceParameters Pointer to store current device parameters. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev, + const VL53L0X_DeviceParameters_t *pDeviceParameters); + +/** + * @brief Retrieve current device parameters + * @par Function Description + * Get actual parameters of the device + * @li Then start ranging operation. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pDeviceParameters Pointer to store current device parameters. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, + VL53L0X_DeviceParameters_t *pDeviceParameters); + +/** + * @brief Set a new device mode + * @par Function Description + * Set device to a new mode (ranging, histogram ...) + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param DeviceMode New device mode to apply + * Valid values are: + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when DeviceMode + * is not in the supported list + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode); + +/** + * @brief Get current new device mode + * @par Function Description + * Get actual mode of the device(ranging, histogram ...) + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pDeviceMode Pointer to current apply mode value + * Valid values are: + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING + * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when + * DeviceMode is not in the supported list + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes * pDeviceMode); + +/** + * @brief Sets the resolution of range measurements. + * @par Function Description + * Set resolution of range measurements to either 0.25mm if + * fraction enabled or 1mm if not enabled. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param Enable Enable high resolution + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, + uint8_t Enable); + +/** + * @brief Gets the fraction enable parameter indicating the resolution of + * range measurements. + * + * @par Function Description + * Gets the fraction enable state, which translates to the resolution of + * range measurements as follows :Enabled:=0.25mm resolution, + * Not Enabled:=1mm resolution. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param pEnable Output Parameter reporting the fraction enable state. + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, + uint8_t *pEnable); + +/** + * @brief Set a new Histogram mode + * @par Function Description + * Set device to a new Histogram mode + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param HistogramMode New device mode to apply + * Valid values are: + * VL53L0X_HISTOGRAMMODE_DISABLED + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when + * HistogramMode is not in the supported list + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes HistogramMode); + +/** + * @brief Get current new device mode + * @par Function Description + * Get current Histogram mode of a Device + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pHistogramMode Pointer to current Histogram Mode value + * Valid values are: + * VL53L0X_HISTOGRAMMODE_DISABLED + * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM + * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY + * VL53L0X_HISTOGRAMMODE_RETURN_ONLY + * VL53L0X_HISTOGRAMMODE_BOTH + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes * pHistogramMode); + +/** + * @brief Set Ranging Timing Budget in microseconds + * + * @par Function Description + * Defines the maximum time allowed by the user to the device to run a + * full ranging sequence for the current mode (ranging, histogram, ASL ...) + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param MeasurementTimingBudgetMicroSeconds Max measurement time in + * microseconds. + * Valid values are: + * >= 17000 microsecs when wraparound enabled + * >= 12000 microsecs when wraparound disabled + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned if + MeasurementTimingBudgetMicroSeconds out of range + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds( + VL53L0X_DEV Dev, uint32_t MeasurementTimingBudgetMicroSeconds); + +/** + * @brief Get Ranging Timing Budget in microseconds + * + * @par Function Description + * Returns the programmed the maximum time allowed by the user to the + * device to run a full ranging sequence for the current mode + * (ranging, histogram, ASL ...) + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pMeasurementTimingBudgetMicroSeconds Max measurement time in + * microseconds. + * Valid values are: + * >= 17000 microsecs when wraparound enabled + * >= 12000 microsecs when wraparound disabled + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds( + VL53L0X_DEV Dev, uint32_t *pMeasurementTimingBudgetMicroSeconds); + +/** + * @brief Gets the VCSEL pulse period. + * + * @par Function Description + * This function retrieves the VCSEL pulse period for the given period type. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param VcselPeriodType VCSEL period identifier (pre-range|final). + * @param pVCSELPulsePeriod Pointer to VCSEL period value. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error VcselPeriodType parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriod); + +/** + * @brief Sets the VCSEL pulse period. + * + * @par Function Description + * This function retrieves the VCSEL pulse period for the given period type. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param VcselPeriodType VCSEL period identifier (pre-range|final). + * @param VCSELPulsePeriod VCSEL period value + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error VcselPeriodType parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriod); + +/** + * @brief Sets the (on/off) state of a requested sequence step. + * + * @par Function Description + * This function enables/disables a requested sequence step. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param SequenceStepEnabled Demanded state {0=Off,1=On} + * is enabled. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled); + +/** + * @brief Gets the (on/off) state of a requested sequence step. + * + * @par Function Description + * This function retrieves the state of a requested sequence step, i.e. on/off. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param pSequenceStepEnabled Out parameter reporting if the sequence step + * is enabled {0=Off,1=On}. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled); + +/** + * @brief Gets the (on/off) state of all sequence steps. + * + * @par Function Description + * This function retrieves the state of all sequence step in the scheduler. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param pSchedulerSequenceSteps Pointer to struct containing result. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, + VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps); + +/** + * @brief Sets the timeout of a requested sequence step. + * + * @par Function Description + * This function sets the timeout of a requested sequence step. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param TimeOutMilliSecs Demanded timeout + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs); + +/** + * @brief Gets the timeout of a requested sequence step. + * + * @par Function Description + * This function retrieves the timeout of a requested sequence step. + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param SequenceStepId Sequence step identifier. + * @param pTimeOutMilliSecs Timeout value. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not + * supported. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + FixPoint1616_t *pTimeOutMilliSecs); + +/** + * @brief Gets number of sequence steps managed by the API. + * + * @par Function Description + * This function retrieves the number of sequence steps currently managed + * by the API + * + * @note This function Accesses the device + * + * @param Dev Device Handle + * @param pNumberOfSequenceSteps Out parameter reporting the number of + * sequence steps. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, + uint8_t *pNumberOfSequenceSteps); + +/** + * @brief Gets the name of a given sequence step. + * + * @par Function Description + * This function retrieves the name of sequence steps corresponding to + * SequenceStepId. + * + * @note This function doesn't Accesses the device + * + * @param SequenceStepId Sequence step identifier. + * @param pSequenceStepsString Pointer to Info string + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepsInfo( + VL53L0X_SequenceStepId SequenceStepId, char *pSequenceStepsString); + +/** + * Program continuous mode Inter-Measurement period in milliseconds + * + * @par Function Description + * When trying to set too short time return INVALID_PARAMS minimal value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param InterMeasurementPeriodMilliSeconds Inter-Measurement Period in ms. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds( + VL53L0X_DEV Dev, uint32_t InterMeasurementPeriodMilliSeconds); + +/** + * Get continuous mode Inter-Measurement period in milliseconds + * + * @par Function Description + * When trying to set too short time return INVALID_PARAMS minimal value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pInterMeasurementPeriodMilliSeconds Pointer to programmed + * Inter-Measurement Period in milliseconds. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds( + VL53L0X_DEV Dev, uint32_t *pInterMeasurementPeriodMilliSeconds); + +/** + * @brief Enable/Disable Cross talk compensation feature + * + * @note This function is not Implemented. + * Enable/Disable Cross Talk by set to zero the Cross Talk value + * by using @a VL53L0X_SetXTalkCompensationRateMegaCps(). + * + * @param Dev Device Handle + * @param XTalkCompensationEnable Cross talk compensation + * to be set 0=disabled else = enabled + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t XTalkCompensationEnable); + +/** + * @brief Get Cross talk compensation rate + * + * @note This function is not Implemented. + * Enable/Disable Cross Talk by set to zero the Cross Talk value by + * using @a VL53L0X_SetXTalkCompensationRateMegaCps(). + * + * @param Dev Device Handle + * @param pXTalkCompensationEnable Pointer to the Cross talk compensation + * state 0=disabled or 1 = enabled + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t *pXTalkCompensationEnable); + +/** + * @brief Set Cross talk compensation rate + * + * @par Function Description + * Set Cross talk compensation rate. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param XTalkCompensationRateMegaCps Compensation rate in + * Mega counts per second (16.16 fix point) see datasheet for details + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps( + VL53L0X_DEV Dev, + FixPoint1616_t XTalkCompensationRateMegaCps); + +/** + * @brief Get Cross talk compensation rate + * + * @par Function Description + * Get Cross talk compensation rate. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pXTalkCompensationRateMegaCps Pointer to Compensation rate + in Mega counts per second (16.16 fix point) see datasheet for details + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps( + VL53L0X_DEV Dev, + FixPoint1616_t *pXTalkCompensationRateMegaCps); + +/** + * @brief Set Reference Calibration Parameters + * + * @par Function Description + * Set Reference Calibration Parameters. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param VhvSettings Parameter for VHV + * @param PhaseCal Parameter for PhaseCal + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, + uint8_t VhvSettings, uint8_t PhaseCal); + +/** + * @brief Get Reference Calibration Parameters + * + * @par Function Description + * Get Reference Calibration Parameters. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pVhvSettings Pointer to VHV parameter + * @param pPhaseCal Pointer to PhaseCal Parameter + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal); + +/** + * @brief Get the number of the check limit managed by a given Device + * + * @par Function Description + * This function give the number of the check limit managed by the Device + * + * @note This function doesn't Access to the device + * + * @param pNumberOfLimitCheck Pointer to the number of check limit. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfLimitCheck( + uint16_t *pNumberOfLimitCheck); + +/** + * @brief Return a description string for a given limit check number + * + * @par Function Description + * This function returns a description string for a given limit check number. + * The limit check is identified with the LimitCheckId. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckString Pointer to the + description string of the given check limit. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is + returned when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, + uint16_t LimitCheckId, char *pLimitCheckString); + +/** + * @brief Return a the Status of the specified check limit + * + * @par Function Description + * This function returns the Status of the specified check limit. + * The value indicate if the check is fail or not. + * The limit check is identified with the LimitCheckId. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckStatus Pointer to the + Limit Check Status of the given check limit. + * LimitCheckStatus : + * 0 the check is not fail + * 1 the check if fail or not enabled + * + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is + returned when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, + uint16_t LimitCheckId, uint8_t *pLimitCheckStatus); + +/** + * @brief Enable/Disable a specific limit check + * + * @par Function Description + * This function Enable/Disable a specific limit check. + * The limit check is identified with the LimitCheckId. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param LimitCheckEnable if 1 the check limit + * corresponding to LimitCheckId is Enabled + * if 0 the check limit + * corresponding to LimitCheckId is disabled + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned + * when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, uint8_t LimitCheckEnable); + +/** + * @brief Get specific limit check enable state + * + * @par Function Description + * This function get the enable state of a specific limit check. + * The limit check is identified with the LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckEnable Pointer to the check limit enable + * value. + * if 1 the check limit + * corresponding to LimitCheckId is Enabled + * if 0 the check limit + * corresponding to LimitCheckId is disabled + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned + * when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, uint8_t *pLimitCheckEnable); + +/** + * @brief Set a specific limit check value + * + * @par Function Description + * This function set a specific limit check value. + * The limit check is identified with the LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param LimitCheckValue Limit check Value for a given + * LimitCheckId + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned when either + * LimitCheckId or LimitCheckValue value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, + uint16_t LimitCheckId, FixPoint1616_t LimitCheckValue); + +/** + * @brief Get a specific limit check value + * + * @par Function Description + * This function get a specific limit check value from device then it updates + * internal values and check enables. + * The limit check is identified with the LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckValue Pointer to Limit + * check Value for a given LimitCheckId. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned + * when LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, + uint16_t LimitCheckId, FixPoint1616_t *pLimitCheckValue); + +/** + * @brief Get the current value of the signal used for the limit check + * + * @par Function Description + * This function get a the current value of the signal used for the limit check. + * To obtain the latest value you should run a ranging before. + * The value reported is linked to the limit check identified with the + * LimitCheckId. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param LimitCheckId Limit Check ID + * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). + * @param pLimitCheckCurrent Pointer to current Value for a + * given LimitCheckId. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned when + * LimitCheckId value is out of range. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, + uint16_t LimitCheckId, FixPoint1616_t *pLimitCheckCurrent); + +/** + * @brief Enable (or disable) Wrap around Check + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param WrapAroundCheckEnable Wrap around Check to be set + * 0=disabled, other = enabled + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t WrapAroundCheckEnable); + +/** + * @brief Get setup of Wrap around Check + * + * @par Function Description + * This function get the wrapAround check enable parameters + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pWrapAroundCheckEnable Pointer to the Wrap around Check state + * 0=disabled or 1 = enabled + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t *pWrapAroundCheckEnable); + +/** @} VL53L0X_parameters_group */ + +/** @defgroup VL53L0X_measurement_group VL53L0X Measurement Functions + * @brief Functions used for the measurements + * @{ + */ + +/** + * @brief Single shot measurement. + * + * @par Function Description + * Perform simple measurement sequence (Start measure, Wait measure to end, + * and returns when measurement is done). + * Once function returns, user can get valid data by calling + * VL53L0X_GetRangingMeasurement or VL53L0X_GetHistogramMeasurement + * depending on defined measurement mode + * User should Clear the interrupt in case this are enabled by using the + * function VL53L0X_ClearInterruptMask(). + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev); + +/** + * @brief Perform Reference Calibration + * + * @details Perform a reference calibration of the Device. + * This function should be run from time to time before doing + * a ranging measurement. + * This function will launch a special ranging measurement, so + * if interrupt are enable an interrupt will be done. + * This function will clear the interrupt generated automatically. + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pVhvSettings Pointer to vhv settings parameter. + * @param pPhaseCal Pointer to PhaseCal parameter. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal); + +/** + * @brief Perform XTalk Measurement + * + * @details Measures the current cross talk from glass in front + * of the sensor. + * This functions performs a histogram measurement and uses the results + * to measure the crosstalk. For the function to be successful, there + * must be no target in front of the sensor. + * + * @warning This function is a blocking function + * + * @warning This function is not supported when the final range + * vcsel clock period is set below 10 PCLKS. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param TimeoutMs Histogram measurement duration. + * @param pXtalkPerSpad Output parameter containing the crosstalk + * measurement result, in MCPS/Spad. Format fixpoint 16:16. + * @param pAmbientTooHigh Output parameter which indicate that + * pXtalkPerSpad is not good if the Ambient is too high. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS vcsel clock period not supported + * for this operation. Must not be less than 10PCLKS. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, + uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, + uint8_t *pAmbientTooHigh); + +/** + * @brief Perform XTalk Calibration + * + * @details Perform a XTalk calibration of the Device. + * This function will launch a ranging measurement, if interrupts + * are enabled an interrupt will be done. + * This function will clear the interrupt generated automatically. + * This function will program a new value for the XTalk compensation + * and it will enable the cross talk before exit. + * This function will disable the VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD. + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @note This function change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * + * @param Dev Device Handle + * @param XTalkCalDistance XTalkCalDistance value used for the XTalk + * computation. + * @param pXTalkCompensationRateMegaCps Pointer to new + * XTalkCompensation value. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps); + +/** + * @brief Perform Offset Calibration + * + * @details Perform a Offset calibration of the Device. + * This function will launch a ranging measurement, if interrupts are + * enabled an interrupt will be done. + * This function will clear the interrupt generated automatically. + * This function will program a new value for the Offset calibration value + * This function will disable the VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD. + * + * @warning This function is a blocking function + * + * @note This function Access to the device + * + * @note This function does not change the device mode. + * + * @param Dev Device Handle + * @param CalDistanceMilliMeter Calibration distance value used for the + * offset compensation. + * @param pOffsetMicroMeter Pointer to new Offset value computed by the + * function. + * + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter); + +/** + * @brief Start device measurement + * + * @details Started measurement will depend on device parameters set through + * @a VL53L0X_SetParameters() + * This is a non-blocking function. + * This function will change the VL53L0X_State from VL53L0X_STATE_IDLE to + * VL53L0X_STATE_RUNNING. + * + * @note This function Access to the device + * + + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when + * DeviceMode programmed with @a VL53L0X_SetDeviceMode is not in the supported + * list: + * Supported mode are: + * VL53L0X_DEVICEMODE_SINGLE_RANGING, + * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING + * @return VL53L0X_ERROR_TIME_OUT Time out on start measurement + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev); + +/** + * @brief Stop device measurement + * + * @details Will set the device in standby mode at end of current measurement\n + * Not necessary in single mode as device shall return automatically + * in standby mode at end of measurement. + * This function will change the VL53L0X_State from + * VL53L0X_STATE_RUNNING to VL53L0X_STATE_IDLE. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev); + +/** + * @brief Return Measurement Data Ready + * + * @par Function Description + * This function indicate that a measurement data is ready. + * This function check if interrupt mode is used then check is done accordingly. + * If perform function clear the interrupt, this function will not work, + * like in case of @a VL53L0X_PerformSingleRangingMeasurement(). + * The previous function is blocking function, VL53L0X_GetMeasurementDataReady + * is used for non-blocking capture. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pMeasurementDataReady Pointer to Measurement Data Ready. + * 0=data not ready, 1 = data ready + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, + uint8_t *pMeasurementDataReady); + +/** + * @brief Wait for device ready for a new measurement command. + * Blocking function. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param MaxLoop Max Number of polling loop (timeout). + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement( + VL53L0X_DEV Dev, + uint32_t MaxLoop); + +/** + * @brief Retrieve the Reference Signal after a measurements + * + * @par Function Description + * Get Reference Signal from last successful Ranging measurement + * This function return a valid value after that you call the + * @a VL53L0X_GetRangingMeasurementData(). + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pMeasurementRefSignal Pointer to the Ref Signal to fill up. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev, + FixPoint1616_t *pMeasurementRefSignal); + +/** + * @brief Retrieve the measurements from device for a given setup + * + * @par Function Description + * Get data from last successful Ranging measurement + * @warning USER should take care about @a VL53L0X_GetNumberOfROIZones() + * before get data. + * PAL will fill a NumberOfROIZones times the corresponding data + * structure used in the measurement function. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pRangingMeasurementData Pointer to the data structure to fill up. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); + +/** + * @brief Retrieve the measurements from device for a given setup + * + * @par Function Description + * Get data from last successful Histogram measurement + * @warning USER should take care about @a VL53L0X_GetNumberOfROIZones() + * before get data. + * PAL will fill a NumberOfROIZones times the corresponding data structure + * used in the measurement function. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param pHistogramMeasurementData Pointer to the histogram data structure. + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData); + +/** + * @brief Performs a single ranging measurement and retrieve the ranging + * measurement data + * + * @par Function Description + * This function will change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING with @a VL53L0X_SetDeviceMode(), + * It performs measurement with @a VL53L0X_PerformSingleMeasurement() + * It get data from last successful Ranging measurement with + * @a VL53L0X_GetRangingMeasurementData. + * Finally it clear the interrupt with @a VL53L0X_ClearInterruptMask(). + * + * @note This function Access to the device + * + * @note This function change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * + * @param Dev Device Handle + * @param pRangingMeasurementData Pointer to the data structure to fill up. + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement( + VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); + +/** + * @brief Performs a single histogram measurement and retrieve the histogram + * measurement data + * Is equivalent to VL53L0X_PerformSingleMeasurement + + * VL53L0X_GetHistogramMeasurementData + * + * @par Function Description + * Get data from last successful Ranging measurement. + * This function will clear the interrupt in case of these are enabled. + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param pHistogramMeasurementData Pointer to the data structure to fill up. + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement( + VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData); + +/** + * @brief Set the number of ROI Zones to be used for a specific Device + * + * @par Function Description + * Set the number of ROI Zones to be used for a specific Device. + * The programmed value should be less than the max number of ROI Zones given + * with @a VL53L0X_GetMaxNumberOfROIZones(). + * This version of API manage only one zone. + * + * @param Dev Device Handle + * @param NumberOfROIZones Number of ROI Zones to be used for a + * specific Device. + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned if + * NumberOfROIZones != 1 + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t NumberOfROIZones); + +/** + * @brief Get the number of ROI Zones managed by the Device + * + * @par Function Description + * Get number of ROI Zones managed by the Device + * USER should take care about @a VL53L0X_GetNumberOfROIZones() + * before get data after a perform measurement. + * PAL will fill a NumberOfROIZones times the corresponding data + * structure used in the measurement function. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pNumberOfROIZones Pointer to the Number of ROI Zones value. + * @return VL53L0X_ERROR_NONE Success + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pNumberOfROIZones); + +/** + * @brief Get the Maximum number of ROI Zones managed by the Device + * + * @par Function Description + * Get Maximum number of ROI Zones managed by the Device. + * + * @note This function doesn't Access to the device + * + * @param Dev Device Handle + * @param pMaxNumberOfROIZones Pointer to the Maximum Number + * of ROI Zones value. + * @return VL53L0X_ERROR_NONE Success + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pMaxNumberOfROIZones); + +/** @} VL53L0X_measurement_group */ + +/** @defgroup VL53L0X_interrupt_group VL53L0X Interrupt Functions + * @brief Functions used for interrupt managements + * @{ + */ + +/** + * @brief Set the configuration of GPIO pin for a given device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param Pin ID of the GPIO Pin + * @param Functionality Select Pin functionality. + * Refer to ::VL53L0X_GpioFunctionality + * @param DeviceMode Device Mode associated to the Gpio. + * @param Polarity Set interrupt polarity. Active high + * or active low see ::VL53L0X_InterruptPolarity + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_GPIO_NOT_EXISTING Only Pin=0 is accepted + * @return VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED This error occurs + * when Functionality programmed is not in the supported list: + * Supported value are: + * VL53L0X_GPIOFUNCTIONALITY_OFF, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH, + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT, + * VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity); + +/** + * @brief Get current configuration for GPIO pin for a given device + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param Pin ID of the GPIO Pin + * @param pDeviceMode Pointer to Device Mode associated to the Gpio. + * @param pFunctionality Pointer to Pin functionality. + * Refer to ::VL53L0X_GpioFunctionality + * @param pPolarity Pointer to interrupt polarity. + * Active high or active low see ::VL53L0X_InterruptPolarity + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_GPIO_NOT_EXISTING Only Pin=0 is accepted + * @return VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED This error occurs + * when Functionality programmed is not in the supported list: + * Supported value are: + * VL53L0X_GPIOFUNCTIONALITY_OFF, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH, + * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT, + * VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes * pDeviceMode, + VL53L0X_GpioFunctionality * pFunctionality, + VL53L0X_InterruptPolarity * pPolarity); + +/** + * @brief Set low and high Interrupt thresholds for a given mode + * (ranging, ALS, ...) for a given device + * + * @par Function Description + * Set low and high Interrupt thresholds for a given mode (ranging, ALS, ...) + * for a given device + * + * @note This function Access to the device + * + * @note DeviceMode is ignored for the current device + * + * @param Dev Device Handle + * @param DeviceMode Device Mode for which change thresholds + * @param ThresholdLow Low threshold (mm, lux ..., depending on the mode) + * @param ThresholdHigh High threshold (mm, lux ..., depending on the mode) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, + FixPoint1616_t ThresholdHigh); + +/** + * @brief Get high and low Interrupt thresholds for a given mode + * (ranging, ALS, ...) for a given device + * + * @par Function Description + * Get high and low Interrupt thresholds for a given mode (ranging, ALS, ...) + * for a given device + * + * @note This function Access to the device + * + * @note DeviceMode is ignored for the current device + * + * @param Dev Device Handle + * @param DeviceMode Device Mode from which read thresholds + * @param pThresholdLow Low threshold (mm, lux ..., depending on the mode) + * @param pThresholdHigh High threshold (mm, lux ..., depending on the mode) + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh); + +/** + * @brief Return device stop completion status + * + * @par Function Description + * Returns stop completiob status. + * User shall call this function after a stop command + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pStopStatus Pointer to status variable to update + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev, + uint32_t *pStopStatus); + + +/** + * @brief Clear given system interrupt condition + * + * @par Function Description + * Clear given interrupt(s). + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param InterruptMask Mask of interrupts to clear + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_INTERRUPT_NOT_CLEARED Cannot clear interrupts + * + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask); + +/** + * @brief Return device interrupt status + * + * @par Function Description + * Returns currently raised interrupts by the device. + * User shall be able to activate/deactivate interrupts through + * @a VL53L0X_SetGpioConfig() + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pInterruptMaskStatus Pointer to status variable to update + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, + uint32_t *pInterruptMaskStatus); + +/** + * @brief Configure ranging interrupt reported to system + * + * @note This function is not Implemented + * + * @param Dev Device Handle + * @param InterruptMask Mask of interrupt to Enable/disable + * (0:interrupt disabled or 1: interrupt enabled) + * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented + */ +VL53L0X_API VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask); + +/** @} VL53L0X_interrupt_group */ + +/** @defgroup VL53L0X_SPADfunctions_group VL53L0X SPAD Functions + * @brief Functions used for SPAD managements + * @{ + */ + +/** + * @brief Set the SPAD Ambient Damper Threshold value + * + * @par Function Description + * This function set the SPAD Ambient Damper Threshold value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param SpadAmbientDamperThreshold SPAD Ambient Damper Threshold value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperThreshold); + +/** + * @brief Get the current SPAD Ambient Damper Threshold value + * + * @par Function Description + * This function get the SPAD Ambient Damper Threshold value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pSpadAmbientDamperThreshold Pointer to programmed + * SPAD Ambient Damper Threshold value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperThreshold); + +/** + * @brief Set the SPAD Ambient Damper Factor value + * + * @par Function Description + * This function set the SPAD Ambient Damper Factor value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param SpadAmbientDamperFactor SPAD Ambient Damper Factor value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperFactor); + +/** + * @brief Get the current SPAD Ambient Damper Factor value + * + * @par Function Description + * This function get the SPAD Ambient Damper Factor value + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param pSpadAmbientDamperFactor Pointer to programmed SPAD Ambient + * Damper Factor value + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperFactor); + +/** + * @brief Performs Reference Spad Management + * + * @par Function Description + * The reference SPAD initialization procedure determines the minimum amount + * of reference spads to be enables to achieve a target reference signal rate + * and should be performed once during initialization. + * + * @note This function Access to the device + * + * @note This function change the device mode to + * VL53L0X_DEVICEMODE_SINGLE_RANGING + * + * @param Dev Device Handle + * @param refSpadCount Reports ref Spad Count + * @param isApertureSpads Reports if spads are of type + * aperture or non-aperture. + * 1:=aperture, 0:=Non-Aperture + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the Ref Spad procedure. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads); + +/** + * @brief Applies Reference SPAD configuration + * + * @par Function Description + * This function applies a given number of reference spads, identified as + * either Aperture or Non-Aperture. + * The requested spad count and type are stored within the device specific + * parameters data for access by the host. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param refSpadCount Number of ref spads. + * @param isApertureSpads Defines if spads are of type + * aperture or non-aperture. + * 1:=aperture, 0:=Non-Aperture + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the in the reference + * spad configuration. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, + uint32_t refSpadCount, uint8_t isApertureSpads); + +/** + * @brief Retrieves SPAD configuration + * + * @par Function Description + * This function retrieves the current number of applied reference spads + * and also their type : Aperture or Non-Aperture. + * + * @note This function Access to the device + * + * @param Dev Device Handle + * @param refSpadCount Number ref Spad Count + * @param isApertureSpads Reports if spads are of type + * aperture or non-aperture. + * 1:=aperture, 0:=Non-Aperture + * @return VL53L0X_ERROR_NONE Success + * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the in the reference + * spad configuration. + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_API VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads); + +/** @} VL53L0X_SPADfunctions_group */ + +/** @} VL53L0X_cut11_group */ + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_calibration.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_calibration.h" new file mode 100644 index 00000000..8fe3cf8a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_calibration.h" @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef _VL53L0X_API_CALIBRATION_H_ +#define _VL53L0X_API_CALIBRATION_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +VL53L0X_Error VL53L0X_perform_xtalk_calibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps); + +VL53L0X_Error VL53L0X_perform_offset_calibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, + int32_t *pOffsetMicroMeter); + +VL53L0X_Error VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t OffsetCalibrationDataMicroMeter); + +VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter); + +VL53L0X_Error VL53L0X_apply_offset_adjustment(VL53L0X_DEV Dev); + +VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads); + +VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, + uint32_t count, uint8_t isApertureSpads); + +VL53L0X_Error VL53L0X_get_reference_spads(VL53L0X_DEV Dev, + uint32_t *pSpadCount, uint8_t *pIsApertureSpads); + +VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, + uint8_t *pPhaseCal, const uint8_t get_data_enable, + const uint8_t restore_config); + +VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable); + +VL53L0X_Error VL53L0X_set_ref_calibration(VL53L0X_DEV Dev, + uint8_t VhvSettings, uint8_t PhaseCal); + +VL53L0X_Error VL53L0X_get_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal); + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_CALIBRATION_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_core.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_core.h" new file mode 100644 index 00000000..676cfb9d --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_core.h" @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef _VL53L0X_API_CORE_H_ +#define _VL53L0X_API_CORE_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +VL53L0X_Error VL53L0X_reverse_bytes(uint8_t *data, uint32_t size); + +VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev); + +uint8_t VL53L0X_encode_vcsel_period(uint8_t vcsel_period_pclks); + +uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg); + +uint32_t VL53L0X_isqrt(uint32_t num); + +uint32_t VL53L0X_quadrature_sum(uint32_t a, uint32_t b); + +VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option); + +VL53L0X_Error VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK); + +VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK); + +uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout); + +VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t *pTimeOutMicroSecs); + +VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t TimeOutMicroSecs); + +VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds); + +VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds); + +VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer); + +VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *pSigmaEstimate); + +VL53L0X_Error VL53L0X_calc_dmax( + VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm); + +VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_xtalk_rate_mcps); + +VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_signal_rate_mcps); + +VL53L0X_Error VL53L0X_get_pal_range_status(VL53L0X_DEV Dev, + uint8_t DeviceRangeStatus, + FixPoint1616_t SignalRate, + uint16_t EffectiveSpadRtnCount, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + uint8_t *pPalRangeStatus); + +uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, + uint32_t timeout_period_us, uint8_t vcsel_period_pclks); + +uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks); + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_CORE_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_ranging.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_ranging.h" new file mode 100644 index 00000000..18ac3991 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_ranging.h" @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef _VL53L0X_API_RANGING_H_ +#define _VL53L0X_API_RANGING_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_API_RANGING_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_strings.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_strings.h" new file mode 100644 index 00000000..eeed00c3 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_api_strings.h" @@ -0,0 +1,278 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef VL53L0X_API_STRINGS_H_ +#define VL53L0X_API_STRINGS_H_ + +#include "vl53l0x_def.h" +#include "vl53l0x_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo); + +VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode, + char *pDeviceErrorString); + +VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus, + char *pRangeStatusString); + +VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode, + char *pPalErrorString); + +VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode, + char *pPalStateString); + +VL53L0X_Error VL53L0X_get_sequence_steps_info( + VL53L0X_SequenceStepId SequenceStepId, + char *pSequenceStepsString); + +VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + char *pLimitCheckString); + + +#ifdef USE_EMPTY_STRING + #define VL53L0X_STRING_DEVICE_INFO_NAME "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS0 "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS1 "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS2 "" + #define VL53L0X_STRING_DEVICE_INFO_NAME_ES1 "" + #define VL53L0X_STRING_DEVICE_INFO_TYPE "" + + /* PAL ERROR strings */ + #define VL53L0X_STRING_ERROR_NONE "" + #define VL53L0X_STRING_ERROR_CALIBRATION_WARNING "" + #define VL53L0X_STRING_ERROR_MIN_CLIPPED "" + #define VL53L0X_STRING_ERROR_UNDEFINED "" + #define VL53L0X_STRING_ERROR_INVALID_PARAMS "" + #define VL53L0X_STRING_ERROR_NOT_SUPPORTED "" + #define VL53L0X_STRING_ERROR_RANGE_ERROR "" + #define VL53L0X_STRING_ERROR_TIME_OUT "" + #define VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED "" + #define VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL "" + #define VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING "" + #define VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED "" + #define VL53L0X_STRING_ERROR_CONTROL_INTERFACE "" + #define VL53L0X_STRING_ERROR_INVALID_COMMAND "" + #define VL53L0X_STRING_ERROR_DIVISION_BY_ZERO "" + #define VL53L0X_STRING_ERROR_REF_SPAD_INIT "" + #define VL53L0X_STRING_ERROR_NOT_IMPLEMENTED "" + + #define VL53L0X_STRING_UNKNOW_ERROR_CODE "" + + + + /* Range Status */ + #define VL53L0X_STRING_RANGESTATUS_NONE "" + #define VL53L0X_STRING_RANGESTATUS_RANGEVALID "" + #define VL53L0X_STRING_RANGESTATUS_SIGMA "" + #define VL53L0X_STRING_RANGESTATUS_SIGNAL "" + #define VL53L0X_STRING_RANGESTATUS_MINRANGE "" + #define VL53L0X_STRING_RANGESTATUS_PHASE "" + #define VL53L0X_STRING_RANGESTATUS_HW "" + + + /* Range Status */ + #define VL53L0X_STRING_STATE_POWERDOWN "" + #define VL53L0X_STRING_STATE_WAIT_STATICINIT "" + #define VL53L0X_STRING_STATE_STANDBY "" + #define VL53L0X_STRING_STATE_IDLE "" + #define VL53L0X_STRING_STATE_RUNNING "" + #define VL53L0X_STRING_STATE_UNKNOWN "" + #define VL53L0X_STRING_STATE_ERROR "" + + + /* Device Specific */ + #define VL53L0X_STRING_DEVICEERROR_NONE "" + #define VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE "" + #define VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE "" + #define VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND "" + #define VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET "" + #define VL53L0X_STRING_DEVICEERROR_SNRCHECK "" + #define VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK "" + #define VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK "" + #define VL53L0X_STRING_DEVICEERROR_TCC "" + #define VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY "" + #define VL53L0X_STRING_DEVICEERROR_MINCLIP "" + #define VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE "" + #define VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW "" + #define VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW "" + #define VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD "" + #define VL53L0X_STRING_DEVICEERROR_UNKNOWN "" + + /* Check Enable */ + #define VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE "" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE "" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP "" + #define VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD "" + + /* Sequence Step */ + #define VL53L0X_STRING_SEQUENCESTEP_TCC "" + #define VL53L0X_STRING_SEQUENCESTEP_DSS "" + #define VL53L0X_STRING_SEQUENCESTEP_MSRC "" + #define VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE "" + #define VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE "" +#else + #define VL53L0X_STRING_DEVICE_INFO_NAME "VL53L0X cut1.0" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS0 "VL53L0X TS0" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS1 "VL53L0X TS1" + #define VL53L0X_STRING_DEVICE_INFO_NAME_TS2 "VL53L0X TS2" + #define VL53L0X_STRING_DEVICE_INFO_NAME_ES1 "VL53L0X ES1 or later" + #define VL53L0X_STRING_DEVICE_INFO_TYPE "VL53L0X" + + /* PAL ERROR strings */ + #define VL53L0X_STRING_ERROR_NONE \ + "No Error" + #define VL53L0X_STRING_ERROR_CALIBRATION_WARNING \ + "Calibration Warning Error" + #define VL53L0X_STRING_ERROR_MIN_CLIPPED \ + "Min clipped error" + #define VL53L0X_STRING_ERROR_UNDEFINED \ + "Undefined error" + #define VL53L0X_STRING_ERROR_INVALID_PARAMS \ + "Invalid parameters error" + #define VL53L0X_STRING_ERROR_NOT_SUPPORTED \ + "Not supported error" + #define VL53L0X_STRING_ERROR_RANGE_ERROR \ + "Range error" + #define VL53L0X_STRING_ERROR_TIME_OUT \ + "Time out error" + #define VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED \ + "Mode not supported error" + #define VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL \ + "Buffer too small" + #define VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING \ + "GPIO not existing" + #define VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED \ + "GPIO funct not supported" + #define VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED \ + "Interrupt not Cleared" + #define VL53L0X_STRING_ERROR_CONTROL_INTERFACE \ + "Control Interface Error" + #define VL53L0X_STRING_ERROR_INVALID_COMMAND \ + "Invalid Command Error" + #define VL53L0X_STRING_ERROR_DIVISION_BY_ZERO \ + "Division by zero Error" + #define VL53L0X_STRING_ERROR_REF_SPAD_INIT \ + "Reference Spad Init Error" + #define VL53L0X_STRING_ERROR_NOT_IMPLEMENTED \ + "Not implemented error" + + #define VL53L0X_STRING_UNKNOW_ERROR_CODE \ + "Unknown Error Code" + + + + /* Range Status */ + #define VL53L0X_STRING_RANGESTATUS_NONE "No Update" + #define VL53L0X_STRING_RANGESTATUS_RANGEVALID "Range Valid" + #define VL53L0X_STRING_RANGESTATUS_SIGMA "Sigma Fail" + #define VL53L0X_STRING_RANGESTATUS_SIGNAL "Signal Fail" + #define VL53L0X_STRING_RANGESTATUS_MINRANGE "Min Range Fail" + #define VL53L0X_STRING_RANGESTATUS_PHASE "Phase Fail" + #define VL53L0X_STRING_RANGESTATUS_HW "Hardware Fail" + + + /* Range Status */ + #define VL53L0X_STRING_STATE_POWERDOWN "POWERDOWN State" + #define VL53L0X_STRING_STATE_WAIT_STATICINIT \ + "Wait for staticinit State" + #define VL53L0X_STRING_STATE_STANDBY "STANDBY State" + #define VL53L0X_STRING_STATE_IDLE "IDLE State" + #define VL53L0X_STRING_STATE_RUNNING "RUNNING State" + #define VL53L0X_STRING_STATE_UNKNOWN "UNKNOWN State" + #define VL53L0X_STRING_STATE_ERROR "ERROR State" + + + /* Device Specific */ + #define VL53L0X_STRING_DEVICEERROR_NONE "No Update" + #define VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE \ + "VCSEL Continuity Test Failure" + #define VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE \ + "VCSEL Watchdog Test Failure" + #define VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND \ + "No VHV Value found" + #define VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET \ + "MSRC No Target Error" + #define VL53L0X_STRING_DEVICEERROR_SNRCHECK \ + "SNR Check Exit" + #define VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK \ + "Range Phase Check Error" + #define VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK \ + "Sigma Threshold Check Error" + #define VL53L0X_STRING_DEVICEERROR_TCC \ + "TCC Error" + #define VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY \ + "Phase Consistency Error" + #define VL53L0X_STRING_DEVICEERROR_MINCLIP \ + "Min Clip Error" + #define VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE \ + "Range Complete" + #define VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW \ + "Range Algo Underflow Error" + #define VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW \ + "Range Algo Overlow Error" + #define VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD \ + "Range Ignore Threshold Error" + #define VL53L0X_STRING_DEVICEERROR_UNKNOWN \ + "Unknown error code" + + /* Check Enable */ + #define VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE \ + "SIGMA FINAL RANGE" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE \ + "SIGNAL RATE FINAL RANGE" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP \ + "SIGNAL REF CLIP" + #define VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD \ + "RANGE IGNORE THRESHOLD" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC \ + "SIGNAL RATE MSRC" + #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE \ + "SIGNAL RATE PRE RANGE" + + /* Sequence Step */ + #define VL53L0X_STRING_SEQUENCESTEP_TCC "TCC" + #define VL53L0X_STRING_SEQUENCESTEP_DSS "DSS" + #define VL53L0X_STRING_SEQUENCESTEP_MSRC "MSRC" + #define VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE "PRE RANGE" + #define VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE "FINAL RANGE" +#endif /* USE_EMPTY_STRING */ + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_def.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_def.h" new file mode 100644 index 00000000..1d70dccc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_def.h" @@ -0,0 +1,663 @@ +/******************************************************************************* + * Copyright � 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 VL53L0X_def.h + * + * @brief Type definitions for VL53L0X API. + * + */ + + +#ifndef _VL53L0X_DEF_H_ +#define _VL53L0X_DEF_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup VL53L0X_globaldefine_group VL53L0X Defines + * @brief VL53L0X Defines + * @{ + */ + + +/** PAL SPECIFICATION major version */ +#define VL53L0X10_SPECIFICATION_VER_MAJOR 1 +/** PAL SPECIFICATION minor version */ +#define VL53L0X10_SPECIFICATION_VER_MINOR 2 +/** PAL SPECIFICATION sub version */ +#define VL53L0X10_SPECIFICATION_VER_SUB 7 +/** PAL SPECIFICATION sub version */ +#define VL53L0X10_SPECIFICATION_VER_REVISION 1440 + +/** VL53L0X PAL IMPLEMENTATION major version */ +#define VL53L0X10_IMPLEMENTATION_VER_MAJOR 1 +/** VL53L0X PAL IMPLEMENTATION minor version */ +#define VL53L0X10_IMPLEMENTATION_VER_MINOR 0 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X10_IMPLEMENTATION_VER_SUB 9 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X10_IMPLEMENTATION_VER_REVISION 3673 + +/** PAL SPECIFICATION major version */ +#define VL53L0X_SPECIFICATION_VER_MAJOR 1 +/** PAL SPECIFICATION minor version */ +#define VL53L0X_SPECIFICATION_VER_MINOR 2 +/** PAL SPECIFICATION sub version */ +#define VL53L0X_SPECIFICATION_VER_SUB 7 +/** PAL SPECIFICATION sub version */ +#define VL53L0X_SPECIFICATION_VER_REVISION 1440 + +/** VL53L0X PAL IMPLEMENTATION major version */ +#define VL53L0X_IMPLEMENTATION_VER_MAJOR 1 +/** VL53L0X PAL IMPLEMENTATION minor version */ +#define VL53L0X_IMPLEMENTATION_VER_MINOR 0 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X_IMPLEMENTATION_VER_SUB 4 +/** VL53L0X PAL IMPLEMENTATION sub version */ +#define VL53L0X_IMPLEMENTATION_VER_REVISION 4960 +#define VL53L0X_DEFAULT_MAX_LOOP 2000 +#define VL53L0X_MAX_STRING_LENGTH 32 + + +#include "vl53l0x_device.h" +#include "vl53l0x_types.h" + + +/**************************************** + * PRIVATE define do not edit + ****************************************/ + +/** @brief Defines the parameters of the Get Version Functions + */ +typedef struct { + uint32_t revision; /*!< revision number */ + uint8_t major; /*!< major number */ + uint8_t minor; /*!< minor number */ + uint8_t build; /*!< build number */ +} VL53L0X_Version_t; + + +/** @brief Defines the parameters of the Get Device Info Functions + */ +typedef struct { + char Name[VL53L0X_MAX_STRING_LENGTH]; + /*!< Name of the Device e.g. Left_Distance */ + char Type[VL53L0X_MAX_STRING_LENGTH]; + /*!< Type of the Device e.g VL53L0X */ + char ProductId[VL53L0X_MAX_STRING_LENGTH]; + /*!< Product Identifier String */ + uint8_t ProductType; + /*!< Product Type, VL53L0X = 1, VL53L1 = 2 */ + uint8_t ProductRevisionMajor; + /*!< Product revision major */ + uint8_t ProductRevisionMinor; + /*!< Product revision minor */ +} VL53L0X_DeviceInfo_t; + + +/** @defgroup VL53L0X_define_Error_group Error and Warning code returned by API + * The following DEFINE are used to identify the PAL ERROR + * @{ + */ + +typedef int8_t VL53L0X_Error; + +#define VL53L0X_ERROR_NONE ((VL53L0X_Error) 0) +#define VL53L0X_ERROR_CALIBRATION_WARNING ((VL53L0X_Error) - 1) + /*!< Warning invalid calibration data may be in used + * \a VL53L0X_InitData() + * \a VL53L0X_GetOffsetCalibrationData + * \a VL53L0X_SetOffsetCalibrationData + */ +#define VL53L0X_ERROR_MIN_CLIPPED ((VL53L0X_Error) - 2) + /*!< Warning parameter passed was clipped to min before to be applied */ + +#define VL53L0X_ERROR_UNDEFINED ((VL53L0X_Error) - 3) + /*!< Unqualified error */ +#define VL53L0X_ERROR_INVALID_PARAMS ((VL53L0X_Error) - 4) + /*!< Parameter passed is invalid or out of range */ +#define VL53L0X_ERROR_NOT_SUPPORTED ((VL53L0X_Error) - 5) + /*!< Function is not supported in current mode or configuration */ +#define VL53L0X_ERROR_RANGE_ERROR ((VL53L0X_Error) - 6) + /*!< Device report a ranging error interrupt status */ +#define VL53L0X_ERROR_TIME_OUT ((VL53L0X_Error) - 7) + /*!< Aborted due to time out */ +#define VL53L0X_ERROR_MODE_NOT_SUPPORTED ((VL53L0X_Error) - 8) + /*!< Asked mode is not supported by the device */ +#define VL53L0X_ERROR_BUFFER_TOO_SMALL ((VL53L0X_Error) - 9) + /*!< ... */ +#define VL53L0X_ERROR_GPIO_NOT_EXISTING ((VL53L0X_Error) - 10) + /*!< User tried to setup a non-existing GPIO pin */ +#define VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED ((VL53L0X_Error) - 11) + /*!< unsupported GPIO functionality */ +#define VL53L0X_ERROR_INTERRUPT_NOT_CLEARED ((VL53L0X_Error) - 12) + /*!< Error during interrupt clear */ +#define VL53L0X_ERROR_CONTROL_INTERFACE ((VL53L0X_Error) - 20) + /*!< error reported from IO functions */ +#define VL53L0X_ERROR_INVALID_COMMAND ((VL53L0X_Error) - 30) + /*!< The command is not allowed in the current device state + * (power down) + */ +#define VL53L0X_ERROR_DIVISION_BY_ZERO ((VL53L0X_Error) - 40) + /*!< In the function a division by zero occurs */ +#define VL53L0X_ERROR_REF_SPAD_INIT ((VL53L0X_Error) - 50) + /*!< Error during reference SPAD initialization */ +#define VL53L0X_ERROR_NOT_IMPLEMENTED ((VL53L0X_Error) - 99) + /*!< Tells requested functionality has not been implemented yet or + * not compatible with the device + */ +/** @} VL53L0X_define_Error_group */ + + +/** @defgroup VL53L0X_define_DeviceModes_group Defines Device modes + * Defines all possible modes for the device + * @{ + */ +typedef uint8_t VL53L0X_DeviceModes; + +#define VL53L0X_DEVICEMODE_SINGLE_RANGING ((VL53L0X_DeviceModes) 0) +#define VL53L0X_DEVICEMODE_CONTINUOUS_RANGING ((VL53L0X_DeviceModes) 1) +#define VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM ((VL53L0X_DeviceModes) 2) +#define VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING ((VL53L0X_DeviceModes) 3) +#define VL53L0X_DEVICEMODE_SINGLE_ALS ((VL53L0X_DeviceModes) 10) +#define VL53L0X_DEVICEMODE_GPIO_DRIVE ((VL53L0X_DeviceModes) 20) +#define VL53L0X_DEVICEMODE_GPIO_OSC ((VL53L0X_DeviceModes) 21) + /* ... Modes to be added depending on device */ +/** @} VL53L0X_define_DeviceModes_group */ + + + +/** @defgroup VL53L0X_define_HistogramModes_group Defines Histogram modes + * Defines all possible Histogram modes for the device + * @{ + */ +typedef uint8_t VL53L0X_HistogramModes; + +#define VL53L0X_HISTOGRAMMODE_DISABLED ((VL53L0X_HistogramModes) 0) + /*!< Histogram Disabled */ +#define VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY ((VL53L0X_HistogramModes) 1) + /*!< Histogram Reference array only */ +#define VL53L0X_HISTOGRAMMODE_RETURN_ONLY ((VL53L0X_HistogramModes) 2) + /*!< Histogram Return array only */ +#define VL53L0X_HISTOGRAMMODE_BOTH ((VL53L0X_HistogramModes) 3) + /*!< Histogram both Reference and Return Arrays */ + /* ... Modes to be added depending on device */ +/** @} VL53L0X_define_HistogramModes_group */ + + +/** @defgroup VL53L0X_define_PowerModes_group List of available Power Modes + * List of available Power Modes + * @{ + */ + +typedef uint8_t VL53L0X_PowerModes; + +#define VL53L0X_POWERMODE_STANDBY_LEVEL1 ((VL53L0X_PowerModes) 0) + /*!< Standby level 1 */ +#define VL53L0X_POWERMODE_STANDBY_LEVEL2 ((VL53L0X_PowerModes) 1) + /*!< Standby level 2 */ +#define VL53L0X_POWERMODE_IDLE_LEVEL1 ((VL53L0X_PowerModes) 2) + /*!< Idle level 1 */ +#define VL53L0X_POWERMODE_IDLE_LEVEL2 ((VL53L0X_PowerModes) 3) + /*!< Idle level 2 */ + +/** @} VL53L0X_define_PowerModes_group */ + + +#define VL53L0X_DMAX_LUT_SIZE 7 + /*!< Defines the number of items in the DMAX lookup table */ + +/** @brief Structure defining data pair that makes up the DMAX Lookup table. + */ +typedef struct { + FixPoint1616_t ambRate_mcps[VL53L0X_DMAX_LUT_SIZE]; + /*!< Ambient rate (mcps) */ + FixPoint1616_t dmax_mm[VL53L0X_DMAX_LUT_SIZE]; + /*!< DMAX Value (mm) */ +} VL53L0X_DMaxLUT_t; + +/** @brief Defines all parameters for the device + */ +typedef struct { + VL53L0X_DeviceModes DeviceMode; + /*!< Defines type of measurement to be done for the next measure */ + VL53L0X_HistogramModes HistogramMode; + /*!< Defines type of histogram measurement to be done for the next + * measure + */ + uint32_t MeasurementTimingBudgetMicroSeconds; + /*!< Defines the allowed total time for a single measurement */ + uint32_t InterMeasurementPeriodMilliSeconds; + /*!< Defines time between two consecutive measurements (between two + * measurement starts). If set to 0 means back-to-back mode + */ + uint8_t XTalkCompensationEnable; + /*!< Tells if Crosstalk compensation shall be enable or not */ + uint16_t XTalkCompensationRangeMilliMeter; + /*!< CrossTalk compensation range in millimeter */ + FixPoint1616_t XTalkCompensationRateMegaCps; + /*!< CrossTalk compensation rate in Mega counts per seconds. + * Expressed in 16.16 fixed point format. + */ + int32_t RangeOffsetMicroMeters; + /*!< Range offset adjustment (mm). */ + + uint8_t LimitChecksEnable[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; + /*!< This Array store all the Limit Check enable for this device. */ + uint8_t LimitChecksStatus[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; + /*!< This Array store all the Status of the check linked to last + * measurement. + */ + FixPoint1616_t LimitChecksValue[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; + /*!< This Array store all the Limit Check value for this device */ + + VL53L0X_DMaxLUT_t dmax_lut; + /*!< Lookup table defining ambient rates and associated + * dmax values. + */ + + uint8_t WrapAroundCheckEnable; + /*!< Tells if Wrap Around Check shall be enable or not */ +} VL53L0X_DeviceParameters_t; + + +/** @defgroup VL53L0X_define_State_group Defines the current status + * of the device + * Defines the current status of the device + * @{ + */ + +typedef uint8_t VL53L0X_State; + +#define VL53L0X_STATE_POWERDOWN ((VL53L0X_State) 0) + /*!< Device is in HW reset */ +#define VL53L0X_STATE_WAIT_STATICINIT ((VL53L0X_State) 1) + /*!< Device is initialized and wait for static initialization */ +#define VL53L0X_STATE_STANDBY ((VL53L0X_State) 2) + /*!< Device is in Low power Standby mode */ +#define VL53L0X_STATE_IDLE ((VL53L0X_State) 3) + /*!< Device has been initialized and ready to do measurements */ +#define VL53L0X_STATE_RUNNING ((VL53L0X_State) 4) + /*!< Device is performing measurement */ +#define VL53L0X_STATE_UNKNOWN ((VL53L0X_State) 98) + /*!< Device is in unknown state and need to be rebooted */ +#define VL53L0X_STATE_ERROR ((VL53L0X_State) 99) + /*!< Device is in error state and need to be rebooted */ + +/** @} VL53L0X_define_State_group */ + + +/** + * @struct VL53L0X_RangeData_t + * @brief Range measurement data. + */ +typedef struct { + uint32_t TimeStamp; /*!< 32-bit time stamp. */ + uint32_t MeasurementTimeUsec; + /*!< Give the Measurement time needed by the device to do the + * measurement. + */ + + + uint16_t RangeMilliMeter; /*!< range distance in millimeter. */ + + uint16_t RangeDMaxMilliMeter; + /*!< Tells what is the maximum detection distance of the device + * in current setup and environment conditions (Filled when + * applicable) + */ + + FixPoint1616_t SignalRateRtnMegaCps; + /*!< Return signal rate (MCPS)\n these is a 16.16 fix point + * value, which is effectively a measure of target + * reflectance. + */ + FixPoint1616_t AmbientRateRtnMegaCps; + /*!< Return ambient rate (MCPS)\n these is a 16.16 fix point + * value, which is effectively a measure of the ambien + * t light. + */ + + uint16_t EffectiveSpadRtnCount; + /*!< Return the effective SPAD count for the return signal. + * To obtain Real value it should be divided by 256 + */ + + uint8_t ZoneId; + /*!< Denotes which zone and range scheduler stage the range + * data relates to. + */ + uint8_t RangeFractionalPart; + /*!< Fractional part of range distance. Final value is a + * FixPoint168 value. + */ + uint8_t RangeStatus; + /*!< Range Status for the current measurement. This is device + * dependent. Value = 0 means value is valid. + * See \ref RangeStatusPage + */ +} VL53L0X_RangingMeasurementData_t; + + +#define VL53L0X_HISTOGRAM_BUFFER_SIZE 24 + +/** + * @struct VL53L0X_HistogramData_t + * @brief Histogram measurement data. + */ +typedef struct { + /* Histogram Measurement data */ + uint32_t HistogramData[VL53L0X_HISTOGRAM_BUFFER_SIZE]; + /*!< Histogram data */ + /*!< Indicate the types of histogram data : + *Return only, Reference only, both Return and Reference + */ + uint8_t FirstBin; /*!< First Bin value */ + uint8_t BufferSize; /*!< Buffer Size - Set by the user.*/ + uint8_t NumberOfBins; + /*!< Number of bins filled by the histogram measurement */ + + VL53L0X_DeviceError ErrorStatus; + /*!< Error status of the current measurement. \n + * see @a ::VL53L0X_DeviceError @a VL53L0X_GetStatusErrorString() + */ +} VL53L0X_HistogramMeasurementData_t; + +#define VL53L0X_REF_SPAD_BUFFER_SIZE 6 + +/** + * @struct VL53L0X_SpadData_t + * @brief Spad Configuration Data. + */ +typedef struct { + uint8_t RefSpadEnables[VL53L0X_REF_SPAD_BUFFER_SIZE]; + /*!< Reference Spad Enables */ + uint8_t RefGoodSpadMap[VL53L0X_REF_SPAD_BUFFER_SIZE]; + /*!< Reference Spad Good Spad Map */ +} VL53L0X_SpadData_t; + +typedef struct { + FixPoint1616_t OscFrequencyMHz; /* Frequency used */ + + uint16_t LastEncodedTimeout; + /* last encoded Time out used for timing budget*/ + + VL53L0X_GpioFunctionality Pin0GpioFunctionality; + /* store the functionality of the GPIO: pin0 */ + + uint32_t FinalRangeTimeoutMicroSecs; + /*!< Execution time of the final range*/ + uint8_t FinalRangeVcselPulsePeriod; + /*!< Vcsel pulse period (pll clocks) for the final range measurement*/ + uint32_t PreRangeTimeoutMicroSecs; + /*!< Execution time of the final range*/ + uint8_t PreRangeVcselPulsePeriod; + /*!< Vcsel pulse period (pll clocks) for the pre-range measurement*/ + + uint16_t SigmaEstRefArray; + /*!< Reference array sigma value in 1/100th of [mm] e.g. 100 = 1mm */ + uint16_t SigmaEstEffPulseWidth; + /*!< Effective Pulse width for sigma estimate in 1/100th + * of ns e.g. 900 = 9.0ns + */ + uint16_t SigmaEstEffAmbWidth; + /*!< Effective Ambient width for sigma estimate in 1/100th of ns + * e.g. 500 = 5.0ns + */ + + + /* Indicate if read from device has been done (==1) or not (==0) */ + uint8_t ReadDataFromDeviceDone; + uint8_t ModuleId; /* Module ID */ + uint8_t Revision; /* test Revision */ + char ProductId[VL53L0X_MAX_STRING_LENGTH]; + /* Product Identifier String */ + uint8_t ReferenceSpadCount; /* used for ref spad management */ + uint8_t ReferenceSpadType; /* used for ref spad management */ + uint8_t RefSpadsInitialised; /* reports if ref spads are initialised. */ + uint32_t PartUIDUpper; /*!< Unique Part ID Upper */ + uint32_t PartUIDLower; /*!< Unique Part ID Lower */ + /*!< Peek Signal rate at 400 mm*/ + FixPoint1616_t SignalRateMeasFixed400mm; + +} VL53L0X_DeviceSpecificParameters_t; + +/** + * @struct VL53L0X_DevData_t + * + * @brief VL53L0X PAL device ST private data structure \n + * End user should never access any of these field directly + * + * These must never access directly but only via macro + */ +typedef struct { + int32_t Part2PartOffsetNVMMicroMeter; + /*!< backed up NVM value */ + int32_t Part2PartOffsetAdjustmentNVMMicroMeter; + /*!< backed up NVM value representing additional offset adjustment */ + VL53L0X_DeviceParameters_t CurrentParameters; + /*!< Current Device Parameter */ + VL53L0X_RangingMeasurementData_t LastRangeMeasure; + /*!< Ranging Data */ + VL53L0X_HistogramMeasurementData_t LastHistogramMeasure; + /*!< Histogram Data */ + VL53L0X_DeviceSpecificParameters_t DeviceSpecificParameters; + /*!< Parameters specific to the device */ + VL53L0X_SpadData_t SpadData; + /*!< Spad Data */ + uint8_t SequenceConfig; + /*!< Internal value for the sequence config */ + uint8_t RangeFractionalEnable; + /*!< Enable/Disable fractional part of ranging data */ + VL53L0X_State PalState; + /*!< Current state of the PAL for this device */ + VL53L0X_PowerModes PowerMode; + /*!< Current Power Mode */ + uint16_t SigmaEstRefArray; + /*!< Reference array sigma value in 1/100th of [mm] e.g. 100 = 1mm */ + uint16_t SigmaEstEffPulseWidth; + /*!< Effective Pulse width for sigma estimate in 1/100th + * of ns e.g. 900 = 9.0ns + */ + uint16_t SigmaEstEffAmbWidth; + /*!< Effective Ambient width for sigma estimate in 1/100th of ns + * e.g. 500 = 5.0ns + */ + uint8_t StopVariable; + /*!< StopVariable used during the stop sequence */ + uint16_t targetRefRate; + /*!< Target Ambient Rate for Ref spad management */ + FixPoint1616_t SigmaEstimate; + /*!< Sigma Estimate - based on ambient & VCSEL rates and + * signal_total_events + */ + FixPoint1616_t SignalEstimate; + /*!< Signal Estimate - based on ambient & VCSEL rates and cross talk */ + FixPoint1616_t LastSignalRefMcps; + /*!< Latest Signal ref in Mcps */ + uint8_t *pTuningSettingsPointer; + /*!< Pointer for Tuning Settings table */ + uint8_t UseInternalTuningSettings; + /*!< Indicate if we use Tuning Settings table */ + uint16_t LinearityCorrectiveGain; + /*!< Linearity Corrective Gain value in x1000 */ +} VL53L0X_DevData_t; + + +/** @defgroup VL53L0X_define_InterruptPolarity_group Defines the Polarity + * of the Interrupt + * Defines the Polarity of the Interrupt + * @{ + */ +typedef uint8_t VL53L0X_InterruptPolarity; + +#define VL53L0X_INTERRUPTPOLARITY_LOW ((VL53L0X_InterruptPolarity) 0) +/*!< Set active low polarity best setup for falling edge. */ +#define VL53L0X_INTERRUPTPOLARITY_HIGH ((VL53L0X_InterruptPolarity) 1) +/*!< Set active high polarity best setup for rising edge. */ + +/** @} VL53L0X_define_InterruptPolarity_group */ + + +/** @defgroup VL53L0X_define_VcselPeriod_group Vcsel Period Defines + * Defines the range measurement for which to access the vcsel period. + * @{ + */ +typedef uint8_t VL53L0X_VcselPeriod; + +#define VL53L0X_VCSEL_PERIOD_PRE_RANGE ((VL53L0X_VcselPeriod) 0) +/*!>9)&0xFFFF) +#define VL53L0X_FIXPOINT97TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<9) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT88(Value) \ + (uint16_t)((Value>>8)&0xFFFF) +#define VL53L0X_FIXPOINT88TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<8) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT412(Value) \ + (uint16_t)((Value>>4)&0xFFFF) +#define VL53L0X_FIXPOINT412TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<4) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT313(Value) \ + (uint16_t)((Value>>3)&0xFFFF) +#define VL53L0X_FIXPOINT313TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<3) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT08(Value) \ + (uint8_t)((Value>>8)&0x00FF) +#define VL53L0X_FIXPOINT08TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<8) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT53(Value) \ + (uint8_t)((Value>>13)&0x00FF) +#define VL53L0X_FIXPOINT53TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<13) + +#define VL53L0X_FIXPOINT1616TOFIXPOINT102(Value) \ + (uint16_t)((Value>>14)&0x0FFF) +#define VL53L0X_FIXPOINT102TOFIXPOINT1616(Value) \ + (FixPoint1616_t)(Value<<12) + +#define VL53L0X_MAKEUINT16(lsb, msb) (uint16_t)((((uint16_t)msb)<<8) + \ + (uint16_t)lsb) + +/** @} VL53L0X_define_GeneralMacro_group */ + +/** @} VL53L0X_globaldefine_group */ + + + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _VL53L0X_DEF_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_device.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_device.h" new file mode 100644 index 00000000..f9412411 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_device.h" @@ -0,0 +1,262 @@ +/******************************************************************************* + * Copyright � 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +/** + * Device specific defines. To be adapted by implementer for the targeted + * device. + */ + +#ifndef _VL53L0X_DEVICE_H_ +#define _VL53L0X_DEVICE_H_ + +#include "vl53l0x_types.h" + + +/** @defgroup VL53L0X_DevSpecDefines_group VL53L0X cut1.1 Device + * Specific Defines + * @brief VL53L0X cut1.1 Device Specific Defines + * @{ + */ + + +/** @defgroup VL53L0X_DeviceError_group Device Error + * @brief Device Error code + * + * This enum is Device specific it should be updated in the implementation + * Use @a VL53L0X_GetStatusErrorString() to get the string. + * It is related to Status Register of the Device. + * @{ + */ +typedef uint8_t VL53L0X_DeviceError; + +#define VL53L0X_DEVICEERROR_NONE ((VL53L0X_DeviceError) 0) + /*!< 0 NoError */ +#define VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE ((VL53L0X_DeviceError) 1) +#define VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE ((VL53L0X_DeviceError) 2) +#define VL53L0X_DEVICEERROR_NOVHVVALUEFOUND ((VL53L0X_DeviceError) 3) +#define VL53L0X_DEVICEERROR_MSRCNOTARGET ((VL53L0X_DeviceError) 4) +#define VL53L0X_DEVICEERROR_SNRCHECK ((VL53L0X_DeviceError) 5) +#define VL53L0X_DEVICEERROR_RANGEPHASECHECK ((VL53L0X_DeviceError) 6) +#define VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK ((VL53L0X_DeviceError) 7) +#define VL53L0X_DEVICEERROR_TCC ((VL53L0X_DeviceError) 8) +#define VL53L0X_DEVICEERROR_PHASECONSISTENCY ((VL53L0X_DeviceError) 9) +#define VL53L0X_DEVICEERROR_MINCLIP ((VL53L0X_DeviceError) 10) +#define VL53L0X_DEVICEERROR_RANGECOMPLETE ((VL53L0X_DeviceError) 11) +#define VL53L0X_DEVICEERROR_ALGOUNDERFLOW ((VL53L0X_DeviceError) 12) +#define VL53L0X_DEVICEERROR_ALGOOVERFLOW ((VL53L0X_DeviceError) 13) +#define VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD ((VL53L0X_DeviceError) 14) + +/** @} end of VL53L0X_DeviceError_group */ + + +/** @defgroup VL53L0X_CheckEnable_group Check Enable list + * @brief Check Enable code + * + * Define used to specify the LimitCheckId. + * Use @a VL53L0X_GetLimitCheckInfo() to get the string. + * @{ + */ + +#define VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE 0 +#define VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE 1 +#define VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP 2 +#define VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD 3 +#define VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC 4 +#define VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE 5 + +#define VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS 6 + +/** @} end of VL53L0X_CheckEnable_group */ + + +/** @defgroup VL53L0X_GpioFunctionality_group Gpio Functionality + * @brief Defines the different functionalities for the device GPIO(s) + * @{ + */ +typedef uint8_t VL53L0X_GpioFunctionality; + +#define VL53L0X_GPIOFUNCTIONALITY_OFF \ + ((VL53L0X_GpioFunctionality) 0) /*!< NO Interrupt */ +#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW \ + ((VL53L0X_GpioFunctionality) 1) /*!< Level Low (value < thresh_low) */ +#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH \ + ((VL53L0X_GpioFunctionality) 2) /*!< Level High (value>thresh_high) */ +#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT \ + ((VL53L0X_GpioFunctionality) 3) + /*!< Out Of Window (value < thresh_low OR value > thresh_high) */ +#define VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY \ + ((VL53L0X_GpioFunctionality) 4) /*!< New Sample Ready */ + +/** @} end of VL53L0X_GpioFunctionality_group */ + + +/* Device register map */ + +/** @defgroup VL53L0X_DefineRegisters_group Define Registers + * @brief List of all the defined registers + * @{ + */ +#define VL53L0X_REG_SYSRANGE_START 0x000 + /** mask existing bit in #VL53L0X_REG_SYSRANGE_START*/ + #define VL53L0X_REG_SYSRANGE_MODE_MASK 0x0F + /** bit 0 in #VL53L0X_REG_SYSRANGE_START write 1 toggle state in + * continuous mode and arm next shot in single shot mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_START_STOP 0x01 + /** bit 1 write 0 in #VL53L0X_REG_SYSRANGE_START set single shot mode */ + #define VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT 0x00 + /** bit 1 write 1 in #VL53L0X_REG_SYSRANGE_START set back-to-back + * operation mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK 0x02 + /** bit 2 write 1 in #VL53L0X_REG_SYSRANGE_START set timed operation + * mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_TIMED 0x04 + /** bit 3 write 1 in #VL53L0X_REG_SYSRANGE_START set histogram operation + * mode + */ + #define VL53L0X_REG_SYSRANGE_MODE_HISTOGRAM 0x08 + + +#define VL53L0X_REG_SYSTEM_THRESH_HIGH 0x000C +#define VL53L0X_REG_SYSTEM_THRESH_LOW 0x000E + + +#define VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG 0x0001 +#define VL53L0X_REG_SYSTEM_RANGE_CONFIG 0x0009 +#define VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD 0x0004 + + +#define VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO 0x000A + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_DISABLED 0x00 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_LEVEL_LOW 0x01 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_LEVEL_HIGH 0x02 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_OUT_OF_WINDOW 0x03 + #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY 0x04 + +#define VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH 0x0084 + + +#define VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR 0x000B + +/* Result registers */ +#define VL53L0X_REG_RESULT_INTERRUPT_STATUS 0x0013 +#define VL53L0X_REG_RESULT_RANGE_STATUS 0x0014 + +#define VL53L0X_REG_RESULT_CORE_PAGE 1 +#define VL53L0X_REG_RESULT_CORE_AMBIENT_WINDOW_EVENTS_RTN 0x00BC +#define VL53L0X_REG_RESULT_CORE_RANGING_TOTAL_EVENTS_RTN 0x00C0 +#define VL53L0X_REG_RESULT_CORE_AMBIENT_WINDOW_EVENTS_REF 0x00D0 +#define VL53L0X_REG_RESULT_CORE_RANGING_TOTAL_EVENTS_REF 0x00D4 +#define VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF 0x00B6 + +/* Algo register */ + +#define VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM 0x0028 + +#define VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS 0x008a + +/* Check Limit registers */ +#define VL53L0X_REG_MSRC_CONFIG_CONTROL 0x0060 + +#define VL53L0X_REG_PRE_RANGE_CONFIG_MIN_SNR 0X0027 +#define VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW 0x0056 +#define VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH 0x0057 +#define VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT 0x0064 + +#define VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_SNR 0X0067 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW 0x0047 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH 0x0048 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT 0x0044 + + +#define VL53L0X_REG_PRE_RANGE_CONFIG_SIGMA_THRESH_HI 0X0061 +#define VL53L0X_REG_PRE_RANGE_CONFIG_SIGMA_THRESH_LO 0X0062 + +/* PRE RANGE registers */ +#define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD 0x0050 +#define VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI 0x0051 +#define VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_LO 0x0052 + +#define VL53L0X_REG_SYSTEM_HISTOGRAM_BIN 0x0081 +#define VL53L0X_REG_HISTOGRAM_CONFIG_INITIAL_PHASE_SELECT 0x0033 +#define VL53L0X_REG_HISTOGRAM_CONFIG_READOUT_CTRL 0x0055 + +#define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x0070 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI 0x0071 +#define VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_LO 0x0072 +#define VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS 0x0020 + +#define VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP 0x0046 + + +#define VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N 0x00bf +#define VL53L0X_REG_IDENTIFICATION_MODEL_ID 0x00c0 +#define VL53L0X_REG_IDENTIFICATION_REVISION_ID 0x00c2 + +#define VL53L0X_REG_OSC_CALIBRATE_VAL 0x00f8 + + +#define VL53L0X_SIGMA_ESTIMATE_MAX_VALUE 65535 +/* equivalent to a range sigma of 655.35mm */ + +#define VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH 0x032 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0 0x0B0 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_1 0x0B1 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_2 0x0B2 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_3 0x0B3 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_4 0x0B4 +#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_5 0x0B5 + +#define VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT 0xB6 +#define VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD 0x4E /* 0x14E */ +#define VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET 0x4F /* 0x14F */ +#define VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE 0x80 + +/* + * Speed of light in um per 1E-10 Seconds + */ + +#define VL53L0X_SPEED_OF_LIGHT_IN_AIR 2997 + +#define VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV 0x0089 + +#define VL53L0X_REG_ALGO_PHASECAL_LIM 0x0030 /* 0x130 */ +#define VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT 0x0030 + +/** @} VL53L0X_DefineRegisters_group */ + +/** @} VL53L0X_DevSpecDefines_group */ + + +#endif + +/* _VL53L0X_DEVICE_H_ */ + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_interrupt_threshold_settings.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_interrupt_threshold_settings.h" new file mode 100644 index 00000000..d3edb6cc --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_interrupt_threshold_settings.h" @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + + +#ifndef _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ +#define _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +uint8_t InterruptThresholdSettings[] = { + + /* Start of Interrupt Threshold Settings */ + 0x1, 0xff, 0x00, + 0x1, 0x80, 0x01, + 0x1, 0xff, 0x01, + 0x1, 0x00, 0x00, + 0x1, 0xff, 0x01, + 0x1, 0x4f, 0x02, + 0x1, 0xFF, 0x0E, + 0x1, 0x00, 0x03, + 0x1, 0x01, 0x84, + 0x1, 0x02, 0x0A, + 0x1, 0x03, 0x03, + 0x1, 0x04, 0x08, + 0x1, 0x05, 0xC8, + 0x1, 0x06, 0x03, + 0x1, 0x07, 0x8D, + 0x1, 0x08, 0x08, + 0x1, 0x09, 0xC6, + 0x1, 0x0A, 0x01, + 0x1, 0x0B, 0x02, + 0x1, 0x0C, 0x00, + 0x1, 0x0D, 0xD5, + 0x1, 0x0E, 0x18, + 0x1, 0x0F, 0x12, + 0x1, 0x10, 0x01, + 0x1, 0x11, 0x82, + 0x1, 0x12, 0x00, + 0x1, 0x13, 0xD5, + 0x1, 0x14, 0x18, + 0x1, 0x15, 0x13, + 0x1, 0x16, 0x03, + 0x1, 0x17, 0x86, + 0x1, 0x18, 0x0A, + 0x1, 0x19, 0x09, + 0x1, 0x1A, 0x08, + 0x1, 0x1B, 0xC2, + 0x1, 0x1C, 0x03, + 0x1, 0x1D, 0x8F, + 0x1, 0x1E, 0x0A, + 0x1, 0x1F, 0x06, + 0x1, 0x20, 0x01, + 0x1, 0x21, 0x02, + 0x1, 0x22, 0x00, + 0x1, 0x23, 0xD5, + 0x1, 0x24, 0x18, + 0x1, 0x25, 0x22, + 0x1, 0x26, 0x01, + 0x1, 0x27, 0x82, + 0x1, 0x28, 0x00, + 0x1, 0x29, 0xD5, + 0x1, 0x2A, 0x18, + 0x1, 0x2B, 0x0B, + 0x1, 0x2C, 0x28, + 0x1, 0x2D, 0x78, + 0x1, 0x2E, 0x28, + 0x1, 0x2F, 0x91, + 0x1, 0x30, 0x00, + 0x1, 0x31, 0x0B, + 0x1, 0x32, 0x00, + 0x1, 0x33, 0x0B, + 0x1, 0x34, 0x00, + 0x1, 0x35, 0xA1, + 0x1, 0x36, 0x00, + 0x1, 0x37, 0xA0, + 0x1, 0x38, 0x00, + 0x1, 0x39, 0x04, + 0x1, 0x3A, 0x28, + 0x1, 0x3B, 0x30, + 0x1, 0x3C, 0x0C, + 0x1, 0x3D, 0x04, + 0x1, 0x3E, 0x0F, + 0x1, 0x3F, 0x79, + 0x1, 0x40, 0x28, + 0x1, 0x41, 0x1E, + 0x1, 0x42, 0x2F, + 0x1, 0x43, 0x87, + 0x1, 0x44, 0x00, + 0x1, 0x45, 0x0B, + 0x1, 0x46, 0x00, + 0x1, 0x47, 0x0B, + 0x1, 0x48, 0x00, + 0x1, 0x49, 0xA7, + 0x1, 0x4A, 0x00, + 0x1, 0x4B, 0xA6, + 0x1, 0x4C, 0x00, + 0x1, 0x4D, 0x04, + 0x1, 0x4E, 0x01, + 0x1, 0x4F, 0x00, + 0x1, 0x50, 0x00, + 0x1, 0x51, 0x80, + 0x1, 0x52, 0x09, + 0x1, 0x53, 0x08, + 0x1, 0x54, 0x01, + 0x1, 0x55, 0x00, + 0x1, 0x56, 0x0F, + 0x1, 0x57, 0x79, + 0x1, 0x58, 0x09, + 0x1, 0x59, 0x05, + 0x1, 0x5A, 0x00, + 0x1, 0x5B, 0x60, + 0x1, 0x5C, 0x05, + 0x1, 0x5D, 0xD1, + 0x1, 0x5E, 0x0C, + 0x1, 0x5F, 0x3C, + 0x1, 0x60, 0x00, + 0x1, 0x61, 0xD0, + 0x1, 0x62, 0x0B, + 0x1, 0x63, 0x03, + 0x1, 0x64, 0x28, + 0x1, 0x65, 0x10, + 0x1, 0x66, 0x2A, + 0x1, 0x67, 0x39, + 0x1, 0x68, 0x0B, + 0x1, 0x69, 0x02, + 0x1, 0x6A, 0x28, + 0x1, 0x6B, 0x10, + 0x1, 0x6C, 0x2A, + 0x1, 0x6D, 0x61, + 0x1, 0x6E, 0x0C, + 0x1, 0x6F, 0x00, + 0x1, 0x70, 0x0F, + 0x1, 0x71, 0x79, + 0x1, 0x72, 0x00, + 0x1, 0x73, 0x0B, + 0x1, 0x74, 0x00, + 0x1, 0x75, 0x0B, + 0x1, 0x76, 0x00, + 0x1, 0x77, 0xA1, + 0x1, 0x78, 0x00, + 0x1, 0x79, 0xA0, + 0x1, 0x7A, 0x00, + 0x1, 0x7B, 0x04, + 0x1, 0xFF, 0x04, + 0x1, 0x79, 0x1D, + 0x1, 0x7B, 0x27, + 0x1, 0x96, 0x0E, + 0x1, 0x97, 0xFE, + 0x1, 0x98, 0x03, + 0x1, 0x99, 0xEF, + 0x1, 0x9A, 0x02, + 0x1, 0x9B, 0x44, + 0x1, 0x73, 0x07, + 0x1, 0x70, 0x01, + 0x1, 0xff, 0x01, + 0x1, 0x00, 0x01, + 0x1, 0xff, 0x00, + 0x00, 0x00, 0x00 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_tuning.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_tuning.h" new file mode 100644 index 00000000..fa8418de --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/inc/vl53l0x_tuning.h" @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + + +#ifndef _VL53L0X_TUNING_H_ +#define _VL53L0X_TUNING_H_ + +#include "vl53l0x_def.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +uint8_t DefaultTuningSettings[] = { + + /* update 02/11/2015_v36 */ + 0x01, 0xFF, 0x01, + 0x01, 0x00, 0x00, + + 0x01, 0xFF, 0x00, + 0x01, 0x09, 0x00, + 0x01, 0x10, 0x00, + 0x01, 0x11, 0x00, + + 0x01, 0x24, 0x01, + 0x01, 0x25, 0xff, + 0x01, 0x75, 0x00, + + 0x01, 0xFF, 0x01, + 0x01, 0x4e, 0x2c, + 0x01, 0x48, 0x00, + 0x01, 0x30, 0x20, + + 0x01, 0xFF, 0x00, + 0x01, 0x30, 0x09, /* mja changed from 0x64. */ + 0x01, 0x54, 0x00, + 0x01, 0x31, 0x04, + 0x01, 0x32, 0x03, + 0x01, 0x40, 0x83, + 0x01, 0x46, 0x25, + 0x01, 0x60, 0x00, + 0x01, 0x27, 0x00, + 0x01, 0x50, 0x06, + 0x01, 0x51, 0x00, + 0x01, 0x52, 0x96, + 0x01, 0x56, 0x08, + 0x01, 0x57, 0x30, + 0x01, 0x61, 0x00, + 0x01, 0x62, 0x00, + 0x01, 0x64, 0x00, + 0x01, 0x65, 0x00, + 0x01, 0x66, 0xa0, + + 0x01, 0xFF, 0x01, + 0x01, 0x22, 0x32, + 0x01, 0x47, 0x14, + 0x01, 0x49, 0xff, + 0x01, 0x4a, 0x00, + + 0x01, 0xFF, 0x00, + 0x01, 0x7a, 0x0a, + 0x01, 0x7b, 0x00, + 0x01, 0x78, 0x21, + + 0x01, 0xFF, 0x01, + 0x01, 0x23, 0x34, + 0x01, 0x42, 0x00, + 0x01, 0x44, 0xff, + 0x01, 0x45, 0x26, + 0x01, 0x46, 0x05, + 0x01, 0x40, 0x40, + 0x01, 0x0E, 0x06, + 0x01, 0x20, 0x1a, + 0x01, 0x43, 0x40, + + 0x01, 0xFF, 0x00, + 0x01, 0x34, 0x03, + 0x01, 0x35, 0x44, + + 0x01, 0xFF, 0x01, + 0x01, 0x31, 0x04, + 0x01, 0x4b, 0x09, + 0x01, 0x4c, 0x05, + 0x01, 0x4d, 0x04, + + + 0x01, 0xFF, 0x00, + 0x01, 0x44, 0x00, + 0x01, 0x45, 0x20, + 0x01, 0x47, 0x08, + 0x01, 0x48, 0x28, + 0x01, 0x67, 0x00, + 0x01, 0x70, 0x04, + 0x01, 0x71, 0x01, + 0x01, 0x72, 0xfe, + 0x01, 0x76, 0x00, + 0x01, 0x77, 0x00, + + 0x01, 0xFF, 0x01, + 0x01, 0x0d, 0x01, + + 0x01, 0xFF, 0x00, + 0x01, 0x80, 0x01, + 0x01, 0x01, 0xF8, + + 0x01, 0xFF, 0x01, + 0x01, 0x8e, 0x01, + 0x01, 0x00, 0x01, + 0x01, 0xFF, 0x00, + 0x01, 0x80, 0x00, + + 0x00, 0x00, 0x00 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_TUNING_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api.c" new file mode 100644 index 00000000..3f0ed04e --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api.c" @@ -0,0 +1,3142 @@ +/******************************************************************************* + * Copyright � 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_tuning.h" +#include "vl53l0x_interrupt_threshold_settings.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_calibration.h" +#include "vl53l0x_api_strings.h" + + +#ifndef __KERNEL__ +#include +#endif +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + +#ifdef VL53L0X_LOG_ENABLE +#define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_API, \ + level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) +#endif + +/* Group PAL General Functions */ + +VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + pVersion->major = VL53L0X_IMPLEMENTATION_VER_MAJOR; + pVersion->minor = VL53L0X_IMPLEMENTATION_VER_MINOR; + pVersion->build = VL53L0X_IMPLEMENTATION_VER_SUB; + + pVersion->revision = VL53L0X_IMPLEMENTATION_VER_REVISION; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalSpecVersion(VL53L0X_Version_t *pPalSpecVersion) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + pPalSpecVersion->major = VL53L0X_SPECIFICATION_VER_MAJOR; + pPalSpecVersion->minor = VL53L0X_SPECIFICATION_VER_MINOR; + pPalSpecVersion->build = VL53L0X_SPECIFICATION_VER_SUB; + + pPalSpecVersion->revision = VL53L0X_SPECIFICATION_VER_REVISION; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev, + uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t revision_id; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_IDENTIFICATION_REVISION_ID, + &revision_id); + *pProductRevisionMajor = 1; + *pProductRevisionMinor = (revision_id & 0xF0) >> 4; + + LOG_FUNCTION_END(Status); + return Status; + +} + +VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_device_info(Dev, pVL53L0X_DeviceInfo); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev, + VL53L0X_DeviceError *pDeviceErrorStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t RangeStatus; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, + &RangeStatus); + + *pDeviceErrorStatus = (VL53L0X_DeviceError)((RangeStatus & 0x78) >> 3); + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_GetDeviceErrorString(VL53L0X_DeviceError ErrorCode, + char *pDeviceErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_device_error_string(ErrorCode, pDeviceErrorString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus, + char *pRangeStatusString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_range_status_string(RangeStatus, + pRangeStatusString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode, + char *pPalErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_pal_error_string(PalErrorCode, pPalErrorString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode, + char *pPalStateString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_pal_state_string(PalStateCode, pPalStateString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, VL53L0X_State *pPalState) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pPalState = PALDevDataGet(Dev, PalState); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes PowerMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + /* Only level1 of Power mode exists */ + if ((PowerMode != VL53L0X_POWERMODE_STANDBY_LEVEL1) + && (PowerMode != VL53L0X_POWERMODE_IDLE_LEVEL1)) { + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + } else if (PowerMode == VL53L0X_POWERMODE_STANDBY_LEVEL1) { + /* set the standby level1 of power mode */ + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to standby */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_STANDBY); + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_STANDBY_LEVEL1); + } + + } else { + /* VL53L0X_POWERMODE_IDLE_LEVEL1 */ + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_StaticInit(Dev); + + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_IDLE_LEVEL1); + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, + VL53L0X_PowerModes *pPowerMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* Only level1 of Power mode exists */ + Status = VL53L0X_RdByte(Dev, 0x80, &Byte); + + if (Status == VL53L0X_ERROR_NONE) { + if (Byte == 1) { + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_IDLE_LEVEL1); + } else { + PALDevDataSet(Dev, PowerMode, + VL53L0X_POWERMODE_STANDBY_LEVEL1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, + int32_t OffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_offset_calibration_data_micro_meter(Dev, + OffsetCalibrationDataMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_offset_calibration_data_micro_meter(Dev, + pOffsetCalibrationDataMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev, + int16_t LinearityCorrectiveGain) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + if ((LinearityCorrectiveGain < 0) || (LinearityCorrectiveGain > 1000)) + Status = VL53L0X_ERROR_INVALID_PARAMS; + else { + PALDevDataSet(Dev, LinearityCorrectiveGain, + LinearityCorrectiveGain); + + if (LinearityCorrectiveGain != 1000) { + /* Disable FW Xtalk */ + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, 0); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev, + uint16_t *pLinearityCorrectiveGain) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pLinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, uint8_t GroupParamHold) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, + uint16_t *pUpperLimitMilliMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev, + FixPoint1616_t *pTotalSignalRate) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; + + LOG_FUNCTION_START(""); + + LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); + + Status = VL53L0X_get_total_signal_rate( + Dev, &LastRangeDataBuffer, pTotalSignalRate); + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL General Functions */ + +/* Group PAL Init Functions */ +VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, uint8_t DeviceAddress) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, + DeviceAddress / 2); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceParameters_t CurrentParameters; + int i; + uint8_t StopVariable; + + LOG_FUNCTION_START(""); + + /* by default the I2C is running at 1V8 if you want to change it you + * need to include this define at compilation level. + */ +#ifdef USE_I2C_2V8 + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, + 0xFE, + 0x01); +#endif + + /* Set I2C standard mode */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0x88, 0x00); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, 0); + +#ifdef USE_IQC_STATION + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_apply_offset_adjustment(Dev); +#endif + + /* Default value is 1000 for Linearity Corrective Gain */ + PALDevDataSet(Dev, LinearityCorrectiveGain, 1000); + + /* Set Default static parameters + *set first temporary values 9.44MHz * 65536 = 618660 + */ + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, 618660); + + /* Set Default XTalkCompensationRateMegaCps to 0 */ + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, 0); + + /* Get default parameters */ + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + if (Status == VL53L0X_ERROR_NONE) { + /* initialize PAL values */ + CurrentParameters.DeviceMode = + VL53L0X_DEVICEMODE_SINGLE_RANGING; + CurrentParameters.HistogramMode = + VL53L0X_HISTOGRAMMODE_DISABLED; + + /* Dmax lookup table */ + /* 0.0 */ + CurrentParameters.dmax_lut.ambRate_mcps[0] = (FixPoint1616_t)0x00000000; + /* 1200 */ + CurrentParameters.dmax_lut.dmax_mm[0] = (FixPoint1616_t)0x04B00000; + /* 0.7 */ + CurrentParameters.dmax_lut.ambRate_mcps[1] = (FixPoint1616_t)0x0000B333; + /* 1100 */ + CurrentParameters.dmax_lut.dmax_mm[1] = (FixPoint1616_t)0x044C0000; + /* 2 */ + CurrentParameters.dmax_lut.ambRate_mcps[2] = (FixPoint1616_t)0x00020000; + /* 900 */ + CurrentParameters.dmax_lut.dmax_mm[2] = (FixPoint1616_t)0x03840000; + /* 3.8 */ + CurrentParameters.dmax_lut.ambRate_mcps[3] = (FixPoint1616_t)0x0003CCCC; + /* 750 */ + CurrentParameters.dmax_lut.dmax_mm[3] = (FixPoint1616_t)0x02EE0000; + /* 7.3 */ + CurrentParameters.dmax_lut.ambRate_mcps[4] = (FixPoint1616_t)0x00074CCC; + /* 550 */ + CurrentParameters.dmax_lut.dmax_mm[4] = (FixPoint1616_t)0x02260000; + /* 10 */ + CurrentParameters.dmax_lut.ambRate_mcps[5] = (FixPoint1616_t)0x000A0000; + /* 500 */ + CurrentParameters.dmax_lut.dmax_mm[5] = (FixPoint1616_t)0x01F40000; + /* 15 */ + CurrentParameters.dmax_lut.ambRate_mcps[6] = (FixPoint1616_t)0x000F0000; + /* 400 */ + CurrentParameters.dmax_lut.dmax_mm[6] = (FixPoint1616_t)0x01900000; + + PALDevDataSet(Dev, CurrentParameters, CurrentParameters); + } + + /* Sigma estimator variable */ + PALDevDataSet(Dev, SigmaEstRefArray, 100); + PALDevDataSet(Dev, SigmaEstEffPulseWidth, 900); + PALDevDataSet(Dev, SigmaEstEffAmbWidth, 500); + PALDevDataSet(Dev, targetRefRate, 0x0A00); /* 20 MCPS in 9:7 format */ + + /* Use internal default settings */ + PALDevDataSet(Dev, UseInternalTuningSettings, 1); + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + Status |= VL53L0X_RdByte(Dev, 0x91, &StopVariable); + PALDevDataSet(Dev, StopVariable, StopVariable); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + + /* Enable all check */ + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + if (Status == VL53L0X_ERROR_NONE) + Status |= VL53L0X_SetLimitCheckEnable(Dev, i, 1); + else + break; + + } + + /* Disable the following checks */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0); + + /* Limit default values */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + (FixPoint1616_t)(18 * 65536)); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + (FixPoint1616_t)(25 * 65536 / 100)); + /* 0.25 * 65536 */ + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + (FixPoint1616_t)(35 * 65536)); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + (FixPoint1616_t)(0 * 65536)); + } + + if (Status == VL53L0X_ERROR_NONE) { + + PALDevDataSet(Dev, SequenceConfig, 0xFF); + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + 0xFF); + + /* Set PAL state to tell that we are waiting for call to + * VL53L0X_StaticInit + */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_WAIT_STATICINIT); + } + + if (Status == VL53L0X_ERROR_NONE) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 0); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + if (UseInternalTuningSettings == 1) { + /* Force use internal settings */ + PALDevDataSet(Dev, UseInternalTuningSettings, 1); + } else { + + /* check that the first byte is not 0 */ + if (*pTuningSettingBuffer != 0) { + PALDevDataSet(Dev, pTuningSettingsPointer, + pTuningSettingBuffer); + PALDevDataSet(Dev, UseInternalTuningSettings, 0); + + } else { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev, + uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *ppTuningSettingBuffer = PALDevDataGet(Dev, pTuningSettingsPointer); + *pUseInternalTuningSettings = PALDevDataGet(Dev, + UseInternalTuningSettings); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceParameters_t CurrentParameters = {0}; + uint8_t *pTuningSettingBuffer; + uint16_t tempword = 0; + uint8_t tempbyte = 0; + uint8_t UseInternalTuningSettings = 0; + uint32_t count = 0; + uint8_t isApertureSpads = 0; + uint32_t refSpadCount = 0; + uint8_t ApertureSpads = 0; + uint8_t vcselPulsePeriodPCLK; + uint32_t seqTimeoutMicroSecs; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_info_from_device(Dev, 1); + + /* set the ref spad from NVM */ + count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount); + ApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType); + + /* NVM value invalid */ + if ((ApertureSpads > 1) || + ((ApertureSpads == 1) && (count > 32)) || + ((ApertureSpads == 0) && (count > 12))) + Status = VL53L0X_perform_ref_spad_management(Dev, &refSpadCount, + &isApertureSpads); + else + Status = VL53L0X_set_reference_spads(Dev, count, ApertureSpads); + + + /* Initialize tuning settings buffer to prevent compiler warning. */ + pTuningSettingBuffer = DefaultTuningSettings; + + if (Status == VL53L0X_ERROR_NONE) { + UseInternalTuningSettings = PALDevDataGet(Dev, + UseInternalTuningSettings); + + if (UseInternalTuningSettings == 0) + pTuningSettingBuffer = PALDevDataGet(Dev, + pTuningSettingsPointer); + else + pTuningSettingBuffer = DefaultTuningSettings; + + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_load_tuning_settings(Dev, + pTuningSettingBuffer); + + + /* Set interrupt config to new sample ready */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetGpioConfig(Dev, 0, 0, + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, + VL53L0X_INTERRUPTPOLARITY_LOW); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_RdWord(Dev, 0x84, &tempword); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, + VL53L0X_FIXPOINT412TOFIXPOINT1616(tempword)); + } + + /* After static init, some device parameters may be changed, + * so update them + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetFractionEnable(Dev, &tempbyte); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, RangeFractionalEnable, tempbyte); + + } + + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, CurrentParameters, CurrentParameters); + + + /* read the sequence config and save it */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, tempbyte); + + } + + /* Disable MSRC and TCC by default */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, 0); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_MSRC, 0); + + + /* Set PAL State to standby */ + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + + + + /* Store pre-range vcsel period */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetVcselPulsePeriod( + Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &vcselPulsePeriodPCLK); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeVcselPulsePeriod, + vcselPulsePeriodPCLK); + } + + /* Store final-range vcsel period */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetVcselPulsePeriod( + Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &vcselPulsePeriodPCLK); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeVcselPulsePeriod, + vcselPulsePeriodPCLK); + } + + /* Store pre-range timeout */ + if (Status == VL53L0X_ERROR_NONE) { + Status = get_sequence_step_timeout( + Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &seqTimeoutMicroSecs); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeTimeoutMicroSecs, + seqTimeoutMicroSecs); + } + + /* Store final-range timeout */ + if (Status == VL53L0X_ERROR_NONE) { + Status = get_sequence_step_timeout( + Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &seqTimeoutMicroSecs); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeTimeoutMicroSecs, + seqTimeoutMicroSecs); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* Set reset bit */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, + 0x00); + + /* Wait for some time */ + if (Status == VL53L0X_ERROR_NONE) { + do { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte); + } while (Byte != 0x00); + } + + VL53L0X_PollingDelay(Dev); + + /* Release reset */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, + 0x01); + + /* Wait until correct boot-up of the device */ + if (Status == VL53L0X_ERROR_NONE) { + do { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte); + } while (Byte == 0x00); + } + + VL53L0X_PollingDelay(Dev); + + /* Set PAL State to VL53L0X_STATE_POWERDOWN */ + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, PalState, VL53L0X_STATE_POWERDOWN); + + + LOG_FUNCTION_END(Status); + return Status; +} +/* End Group PAL Init Functions */ + +/* Group PAL Parameters Functions */ +VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev, + const VL53L0X_DeviceParameters_t *pDeviceParameters) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int i; + + LOG_FUNCTION_START(""); + Status = VL53L0X_SetDeviceMode(Dev, pDeviceParameters->DeviceMode); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(Dev, + pDeviceParameters->InterMeasurementPeriodMilliSeconds); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev, + pDeviceParameters->XTalkCompensationRateMegaCps); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, + pDeviceParameters->RangeOffsetMicroMeters); + + + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + if (Status == VL53L0X_ERROR_NONE) + Status |= VL53L0X_SetLimitCheckEnable(Dev, i, + pDeviceParameters->LimitChecksEnable[i]); + else + break; + + if (Status == VL53L0X_ERROR_NONE) + Status |= VL53L0X_SetLimitCheckValue(Dev, i, + pDeviceParameters->LimitChecksValue[i]); + else + break; + + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetWrapAroundCheckEnable(Dev, + pDeviceParameters->WrapAroundCheckEnable); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + pDeviceParameters->MeasurementTimingBudgetMicroSeconds); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, + VL53L0X_DeviceParameters_t *pDeviceParameters) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int i; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetDeviceMode(Dev, &(pDeviceParameters->DeviceMode)); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetInterMeasurementPeriodMilliSeconds(Dev, + &(pDeviceParameters->InterMeasurementPeriodMilliSeconds)); + + + if (Status == VL53L0X_ERROR_NONE) + pDeviceParameters->XTalkCompensationEnable = 0; + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetXTalkCompensationRateMegaCps(Dev, + &(pDeviceParameters->XTalkCompensationRateMegaCps)); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, + &(pDeviceParameters->RangeOffsetMicroMeters)); + + + if (Status == VL53L0X_ERROR_NONE) { + for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { + /* get first the values, then the enables. + * VL53L0X_GetLimitCheckValue will modify the enable + * flags + */ + if (Status == VL53L0X_ERROR_NONE) { + Status |= VL53L0X_GetLimitCheckValue(Dev, i, + &(pDeviceParameters->LimitChecksValue[i])); + } else { + break; + } + if (Status == VL53L0X_ERROR_NONE) { + Status |= VL53L0X_GetLimitCheckEnable(Dev, i, + &(pDeviceParameters->LimitChecksEnable[i])); + } else { + break; + } + } + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetWrapAroundCheckEnable(Dev, + &(pDeviceParameters->WrapAroundCheckEnable)); + } + + /* Need to be done at the end as it uses VCSELPulsePeriod */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetMeasurementTimingBudgetMicroSeconds(Dev, + &(pDeviceParameters->MeasurementTimingBudgetMicroSeconds)); + } + + if (Status == VL53L0X_ERROR_NONE) { + for (i = 0; i < VL53L0X_DMAX_LUT_SIZE; i++) { + pDeviceParameters->dmax_lut.ambRate_mcps[i] = + Dev->Data.CurrentParameters.dmax_lut.ambRate_mcps[i]; + pDeviceParameters->dmax_lut.dmax_mm[i] = + Dev->Data.CurrentParameters.dmax_lut.dmax_mm[i]; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START("%d", (int)DeviceMode); + + switch (DeviceMode) { + case VL53L0X_DEVICEMODE_SINGLE_RANGING: + case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: + case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: + case VL53L0X_DEVICEMODE_GPIO_DRIVE: + case VL53L0X_DEVICEMODE_GPIO_OSC: + /* Supported modes */ + VL53L0X_SETPARAMETERFIELD(Dev, DeviceMode, DeviceMode); + break; + default: + /* Unsupported mode */ + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, + VL53L0X_DeviceModes *pDeviceMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, DeviceMode, *pDeviceMode); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, uint8_t Enable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START("%d", (int)Enable); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, Enable); + + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, RangeFractionalEnable, Enable); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, uint8_t *pEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, pEnabled); + + if (Status == VL53L0X_ERROR_NONE) + *pEnabled = (*pEnabled & 1); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes HistogramMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, + VL53L0X_HistogramModes *pHistogramMode) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_measurement_timing_budget_micro_seconds(Dev, + MeasurementTimingBudgetMicroSeconds); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_measurement_timing_budget_micro_seconds(Dev, + pMeasurementTimingBudgetMicroSeconds); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_vcsel_pulse_period(Dev, VcselPeriodType, + VCSELPulsePeriodPCLK); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_vcsel_pulse_period(Dev, VcselPeriodType, + pVCSELPulsePeriodPCLK); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + uint8_t SequenceConfigNew = 0; + uint32_t MeasurementTimingBudgetMicroSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + &SequenceConfig); + + SequenceConfigNew = SequenceConfig; + + if (Status == VL53L0X_ERROR_NONE) { + if (SequenceStepEnabled == 1) { + + /* Enable requested sequence step + */ + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + SequenceConfigNew |= 0x10; + break; + case VL53L0X_SEQUENCESTEP_DSS: + SequenceConfigNew |= 0x28; + break; + case VL53L0X_SEQUENCESTEP_MSRC: + SequenceConfigNew |= 0x04; + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + SequenceConfigNew |= 0x40; + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + SequenceConfigNew |= 0x80; + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } else { + /* Disable requested sequence step + */ + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + SequenceConfigNew &= 0xef; + break; + case VL53L0X_SEQUENCESTEP_DSS: + SequenceConfigNew &= 0xd7; + break; + case VL53L0X_SEQUENCESTEP_MSRC: + SequenceConfigNew &= 0xfb; + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + SequenceConfigNew &= 0xbf; + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + SequenceConfigNew &= 0x7f; + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + } + + if (SequenceConfigNew != SequenceConfig) { + /* Apply New Setting */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, SequenceConfigNew); + } + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfigNew); + + + /* Recalculate timing budget */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_GETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + MeasurementTimingBudgetMicroSeconds); + } + } + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceConfig, + uint8_t *pSequenceStepEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + *pSequenceStepEnabled = 0; + LOG_FUNCTION_START(""); + + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + *pSequenceStepEnabled = (SequenceConfig & 0x10) >> 4; + break; + case VL53L0X_SEQUENCESTEP_DSS: + *pSequenceStepEnabled = (SequenceConfig & 0x08) >> 3; + break; + case VL53L0X_SEQUENCESTEP_MSRC: + *pSequenceStepEnabled = (SequenceConfig & 0x04) >> 2; + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + *pSequenceStepEnabled = (SequenceConfig & 0x40) >> 6; + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + *pSequenceStepEnabled = (SequenceConfig & 0x80) >> 7; + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + &SequenceConfig); + + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, SequenceStepId, + SequenceConfig, pSequenceStepEnabled); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, + VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + &SequenceConfig); + + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_TCC, SequenceConfig, + &pSchedulerSequenceSteps->TccOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_DSS, SequenceConfig, + &pSchedulerSequenceSteps->DssOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_MSRC, SequenceConfig, + &pSchedulerSequenceSteps->MsrcOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, SequenceConfig, + &pSchedulerSequenceSteps->PreRangeOn); + } + if (Status == VL53L0X_ERROR_NONE) { + Status = sequence_step_enabled(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, SequenceConfig, + &pSchedulerSequenceSteps->FinalRangeOn); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, + uint8_t *pNumberOfSequenceSteps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pNumberOfSequenceSteps = VL53L0X_SEQUENCESTEP_NUMBER_OF_CHECKS; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepsInfo( + VL53L0X_SequenceStepId SequenceStepId, + char *pSequenceStepsString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_sequence_steps_info( + SequenceStepId, + pSequenceStepsString); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_Error Status1 = VL53L0X_ERROR_NONE; + uint32_t TimeoutMicroSeconds = ((TimeOutMilliSecs * 1000) + 0x8000) + >> 16; + uint32_t MeasurementTimingBudgetMicroSeconds; + FixPoint1616_t OldTimeOutMicroSeconds; + + LOG_FUNCTION_START(""); + + /* Read back the current value in case we need to revert back to this. + */ + Status = get_sequence_step_timeout(Dev, SequenceStepId, + &OldTimeOutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) { + Status = set_sequence_step_timeout(Dev, SequenceStepId, + TimeoutMicroSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_GETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + /* At this point we don't know if the requested value is valid, + * therefore proceed to update the entire timing budget and + * if this fails, revert back to the previous value. + */ + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + MeasurementTimingBudgetMicroSeconds); + + if (Status != VL53L0X_ERROR_NONE) { + Status1 = set_sequence_step_timeout(Dev, SequenceStepId, + OldTimeOutMicroSeconds); + + if (Status1 == VL53L0X_ERROR_NONE) { + Status1 = + VL53L0X_SetMeasurementTimingBudgetMicroSeconds( + Dev, + MeasurementTimingBudgetMicroSeconds); + } + + Status = Status1; + } + } + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + FixPoint1616_t *pTimeOutMilliSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint32_t TimeoutMicroSeconds; + + LOG_FUNCTION_START(""); + + Status = get_sequence_step_timeout(Dev, SequenceStepId, + &TimeoutMicroSeconds); + if (Status == VL53L0X_ERROR_NONE) { + TimeoutMicroSeconds <<= 8; + *pTimeOutMilliSecs = (TimeoutMicroSeconds + 500)/1000; + *pTimeOutMilliSecs <<= 8; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, + uint32_t InterMeasurementPeriodMilliSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t osc_calibrate_val; + uint32_t IMPeriodMilliSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, + &osc_calibrate_val); + + if (Status == VL53L0X_ERROR_NONE) { + if (osc_calibrate_val != 0) { + IMPeriodMilliSeconds = + InterMeasurementPeriodMilliSeconds + * osc_calibrate_val; + } else { + IMPeriodMilliSeconds = + InterMeasurementPeriodMilliSeconds; + } + Status = VL53L0X_WrDWord(Dev, + VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, + IMPeriodMilliSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, + InterMeasurementPeriodMilliSeconds, + InterMeasurementPeriodMilliSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, + uint32_t *pInterMeasurementPeriodMilliSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t osc_calibrate_val; + uint32_t IMPeriodMilliSeconds; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, + &osc_calibrate_val); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdDWord(Dev, + VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, + &IMPeriodMilliSeconds); + } + + if (Status == VL53L0X_ERROR_NONE) { + if (osc_calibrate_val != 0) { + *pInterMeasurementPeriodMilliSeconds = + IMPeriodMilliSeconds / osc_calibrate_val; + } + VL53L0X_SETPARAMETERFIELD(Dev, + InterMeasurementPeriodMilliSeconds, + *pInterMeasurementPeriodMilliSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t XTalkCompensationEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t TempFix1616; + uint16_t LinearityCorrectiveGain; + + LOG_FUNCTION_START(""); + + LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); + + if ((XTalkCompensationEnable == 0) + || (LinearityCorrectiveGain != 1000)) { + TempFix1616 = 0; + } else { + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + TempFix1616); + } + + /* the following register has a format 3.13 */ + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, + VL53L0X_FIXPOINT1616TOFIXPOINT313(TempFix1616)); + + if (Status == VL53L0X_ERROR_NONE) { + if (XTalkCompensationEnable == 0) { + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 0); + } else { + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, + uint8_t *pXTalkCompensationEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); + *pXTalkCompensationEnable = Temp8; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + uint16_t LinearityCorrectiveGain; + uint16_t data; + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); + LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); + + if (Temp8 == 0) { /* disabled write only internal value */ + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + } else { + /* the following register has a format 3.13 */ + if (LinearityCorrectiveGain == 1000) { + data = VL53L0X_FIXPOINT1616TOFIXPOINT313( + XTalkCompensationRateMegaCps); + } else { + data = 0; + } + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, data); + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t Value; + FixPoint1616_t TempFix1616; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, (uint16_t *)&Value); + if (Status == VL53L0X_ERROR_NONE) { + if (Value == 0) { + /* the Xtalk is disabled return value from memory */ + VL53L0X_GETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, TempFix1616); + *pXTalkCompensationRateMegaCps = TempFix1616; + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 0); + } else { + TempFix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616(Value); + *pXTalkCompensationRateMegaCps = TempFix1616; + VL53L0X_SETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, TempFix1616); + VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, + 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, uint8_t VhvSettings, + uint8_t PhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_ref_calibration(Dev, VhvSettings, PhaseCal); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, uint8_t *pVhvSettings, + uint8_t *pPhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_ref_calibration(Dev, pVhvSettings, pPhaseCal); + + LOG_FUNCTION_END(Status); + return Status; +} + +/* + * CHECK LIMIT FUNCTIONS + */ + +VL53L0X_Error VL53L0X_GetNumberOfLimitCheck(uint16_t *pNumberOfLimitCheck) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pNumberOfLimitCheck = VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, uint16_t LimitCheckId, + char *pLimitCheckString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_limit_check_info(Dev, LimitCheckId, + pLimitCheckString); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t *pLimitCheckStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else { + + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + LimitCheckId, Temp8); + + *pLimitCheckStatus = Temp8; + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t LimitCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t TempFix1616 = 0; + uint8_t LimitCheckEnableInt = 0; + uint8_t LimitCheckDisable = 0; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else { + if (LimitCheckEnable == 0) { + TempFix1616 = 0; + LimitCheckEnableInt = 0; + LimitCheckDisable = 1; + + } else { + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + LimitCheckId, TempFix1616); + LimitCheckDisable = 0; + /* this to be sure to have either 0 or 1 */ + LimitCheckEnableInt = 1; + } + + switch (LimitCheckId) { + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + LimitCheckEnableInt); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97(TempFix1616)); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + LimitCheckEnableInt); + + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + LimitCheckEnableInt); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + + Temp8 = (uint8_t)(LimitCheckDisable << 1); + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_MSRC_CONFIG_CONTROL, + 0xFE, Temp8); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + + Temp8 = (uint8_t)(LimitCheckDisable << 4); + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_MSRC_CONFIG_CONTROL, + 0xEF, Temp8); + + break; + + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + + } + + if (Status == VL53L0X_ERROR_NONE) { + if (LimitCheckEnable == 0) { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + LimitCheckId, 0); + } else { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + LimitCheckId, 1); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + uint8_t *pLimitCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + *pLimitCheckEnable = 0; + } else { + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, + LimitCheckId, Temp8); + *pLimitCheckEnable = Temp8; + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, + FixPoint1616_t LimitCheckValue) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Temp8; + + LOG_FUNCTION_START(""); + + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, LimitCheckId, + Temp8); + + if (Temp8 == 0) { /* disabled write only internal value */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + LimitCheckId, LimitCheckValue); + } else { + + switch (LimitCheckId) { + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + LimitCheckValue); + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97( + LimitCheckValue)); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + LimitCheckValue); + + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + + /* internal computation: */ + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + LimitCheckValue); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, + VL53L0X_FIXPOINT1616TOFIXPOINT97( + LimitCheckValue)); + + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + LimitCheckId, LimitCheckValue); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckValue) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t EnableZeroValue = 0; + uint16_t Temp16; + FixPoint1616_t TempFix1616; + + LOG_FUNCTION_START(""); + + switch (LimitCheckId) { + + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, TempFix1616); + EnableZeroValue = 0; + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, + &Temp16); + if (Status == VL53L0X_ERROR_NONE) + TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); + + + EnableZeroValue = 1; + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, TempFix1616); + EnableZeroValue = 0; + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + /* internal computation: */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + TempFix1616); + EnableZeroValue = 0; + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, + &Temp16); + if (Status == VL53L0X_ERROR_NONE) + TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); + + + EnableZeroValue = 0; + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + + if (Status == VL53L0X_ERROR_NONE) { + + if (EnableZeroValue == 1) { + + if (TempFix1616 == 0) { + /* disabled: return value from memory */ + VL53L0X_GETARRAYPARAMETERFIELD(Dev, + LimitChecksValue, LimitCheckId, + TempFix1616); + *pLimitCheckValue = TempFix1616; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + LimitChecksEnable, LimitCheckId, 0); + } else { + *pLimitCheckValue = TempFix1616; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + LimitChecksValue, LimitCheckId, + TempFix1616); + VL53L0X_SETARRAYPARAMETERFIELD(Dev, + LimitChecksEnable, LimitCheckId, 1); + } + } else { + *pLimitCheckValue = TempFix1616; + } + } + + LOG_FUNCTION_END(Status); + return Status; + +} + +VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckCurrent) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; + + LOG_FUNCTION_START(""); + + if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else { + switch (LimitCheckId) { + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + /* Need to run a ranging to have the latest values */ + *pLimitCheckCurrent = PALDevDataGet(Dev, SigmaEstimate); + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + /* Need to run a ranging to have the latest values */ + *pLimitCheckCurrent = PALDevDataGet(Dev, + LastSignalRefMcps); + + break; + + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + /* Need to run a ranging to have the latest values */ + LastRangeDataBuffer = PALDevDataGet(Dev, + LastRangeMeasure); + *pLimitCheckCurrent = + LastRangeDataBuffer.SignalRateRtnMegaCps; + + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + LOG_FUNCTION_END(Status); + return Status; + +} + +/* + * WRAPAROUND Check + */ +VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t WrapAroundCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + uint8_t WrapAroundCheckEnableInt; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &Byte); + if (WrapAroundCheckEnable == 0) { + /* Disable wraparound */ + Byte = Byte & 0x7F; + WrapAroundCheckEnableInt = 0; + } else { + /*Enable wraparound */ + Byte = Byte | 0x80; + WrapAroundCheckEnableInt = 1; + } + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, Byte); + + if (Status == VL53L0X_ERROR_NONE) { + PALDevDataSet(Dev, SequenceConfig, Byte); + VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, + WrapAroundCheckEnableInt); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, + uint8_t *pWrapAroundCheckEnable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t data; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data); + if (Status == VL53L0X_ERROR_NONE) { + PALDevDataSet(Dev, SequenceConfig, data); + if (data & (0x01 << 7)) + *pWrapAroundCheckEnable = 0x01; + else + *pWrapAroundCheckEnable = 0x00; + } + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, + *pWrapAroundCheckEnable); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL Parameters Functions */ + +/* Group PAL Measurement Functions */ +VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceModes DeviceMode; + + LOG_FUNCTION_START(""); + + /* Get Current DeviceMode */ + Status = VL53L0X_GetDeviceMode(Dev, &DeviceMode); + + /* Start immediately to run a single ranging measurement in case of + * single ranging or single histogram + */ + if (Status == VL53L0X_ERROR_NONE + && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) + Status = VL53L0X_StartMeasurement(Dev); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_measurement_poll_for_completion(Dev); + + + /* Change PAL State in case of single ranging or single histogram */ + if (Status == VL53L0X_ERROR_NONE + && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement(VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, + uint8_t *pPhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_ref_calibration(Dev, pVhvSettings, + pPhaseCal, 1); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, + uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, + uint8_t *pAmbientTooHigh) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented on VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_xtalk_calibration(Dev, XTalkCalDistance, + pXTalkCompensationRateMegaCps); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_offset_calibration(Dev, CalDistanceMilliMeter, + pOffsetMicroMeter); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_CheckAndLoadInterruptSettings(VL53L0X_DEV Dev, + uint8_t StartNotStopFlag) +{ + uint8_t InterruptConfig; + FixPoint1616_t ThresholdLow; + FixPoint1616_t ThresholdHigh; + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + Pin0GpioFunctionality); + + switch (InterruptConfig) { + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: + Status = VL53L0X_GetInterruptThresholds(Dev, + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if ((ThresholdLow > 255*65536) && + (Status == VL53L0X_ERROR_NONE)) { + + if (StartNotStopFlag != 0) { + Status = VL53L0X_load_tuning_settings(Dev, + InterruptThresholdSettings); + } else { + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: + Status = VL53L0X_GetInterruptThresholds(Dev, + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if ((ThresholdHigh > 0) && + (Status == VL53L0X_ERROR_NONE)) { + + if (StartNotStopFlag != 0) { + Status = VL53L0X_load_tuning_settings(Dev, + InterruptThresholdSettings); + } else { + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: + Status = VL53L0X_GetInterruptThresholds(Dev, + VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, + &ThresholdLow, &ThresholdHigh); + + if (Status == VL53L0X_ERROR_NONE) { + if (StartNotStopFlag != 0) { + Status = VL53L0X_load_tuning_settings(Dev, + InterruptThresholdSettings); + } else { + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); + Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + } + break; + } + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceModes DeviceMode; + uint8_t Byte; + uint8_t StartStopByte = VL53L0X_REG_SYSRANGE_MODE_START_STOP; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + /* Get Current DeviceMode */ + VL53L0X_GetDeviceMode(Dev, &DeviceMode); + + Status = VL53L0X_WrByte(Dev, 0x80, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + Status = VL53L0X_WrByte(Dev, 0x91, PALDevDataGet(Dev, StopVariable)); + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + + switch (DeviceMode) { + case VL53L0X_DEVICEMODE_SINGLE_RANGING: + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x01); + + Byte = StartStopByte; + if (Status == VL53L0X_ERROR_NONE) { + /* Wait until start bit has been cleared */ + LoopNb = 0; + do { + if (LoopNb > 0) + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_SYSRANGE_START, &Byte); + LoopNb = LoopNb + 1; + } while (((Byte & StartStopByte) == StartStopByte) + && (Status == VL53L0X_ERROR_NONE) + && (LoopNb < VL53L0X_DEFAULT_MAX_LOOP)); + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) + Status = VL53L0X_ERROR_TIME_OUT; + + } + + break; + case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: + /* Back-to-back mode */ + + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK); + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to Running */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); + } + break; + case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: + /* Continuous mode */ + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_TIMED); + + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to Running */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); + } + break; + default: + /* Selected mode not supported */ + Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; + } + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + Status = VL53L0X_WrByte(Dev, 0x91, 0x00); + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (Status == VL53L0X_ERROR_NONE) { + /* Set PAL State to Idle */ + PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); + } + + /* Check if need to apply interrupt settings */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 0); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, + uint8_t *pMeasurementDataReady) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SysRangeStatusRegister; + uint8_t InterruptConfig; + uint32_t InterruptMask; + + LOG_FUNCTION_START(""); + + InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + Pin0GpioFunctionality); + + if (InterruptConfig == + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) { + Status = VL53L0X_GetInterruptMaskStatus(Dev, &InterruptMask); + if (InterruptMask == + VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) + *pMeasurementDataReady = 1; + else + *pMeasurementDataReady = 0; + } else { + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, + &SysRangeStatusRegister); + if (Status == VL53L0X_ERROR_NONE) { + if (SysRangeStatusRegister & 0x01) + *pMeasurementDataReady = 1; + else + *pMeasurementDataReady = 0; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement(VL53L0X_DEV Dev, + uint32_t MaxLoop) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented for VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t DeviceRangeStatus; + uint8_t RangeFractionalEnable; + uint8_t PalRangeStatus; + uint8_t XTalkCompensationEnable; + uint16_t AmbientRate; + FixPoint1616_t SignalRate; + uint16_t XTalkCompensationRateMegaCps; + uint16_t EffectiveSpadRtnCount; + uint16_t tmpuint16; + uint16_t XtalkRangeMilliMeter; + uint16_t LinearityCorrectiveGain; + uint8_t localBuffer[12]; + VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; + + LOG_FUNCTION_START(""); + + /* + * use multi read even if some registers are not useful, result will + * be more efficient + * start reading at 0x14 dec20 + * end reading at 0x21 dec33 total 14 bytes to read + */ + Status = VL53L0X_ReadMulti(Dev, 0x14, localBuffer, 12); + + if (Status == VL53L0X_ERROR_NONE) { + + pRangingMeasurementData->ZoneId = 0; /* Only one zone */ + pRangingMeasurementData->TimeStamp = 0; /* Not Implemented */ + + tmpuint16 = VL53L0X_MAKEUINT16(localBuffer[11], + localBuffer[10]); + /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional + *(format 11.2) else no fractional + */ + + pRangingMeasurementData->MeasurementTimeUsec = 0; + + + SignalRate = VL53L0X_FIXPOINT97TOFIXPOINT1616( + VL53L0X_MAKEUINT16(localBuffer[7], localBuffer[6])); + /* peak_signal_count_rate_rtn_mcps */ + pRangingMeasurementData->SignalRateRtnMegaCps = SignalRate; + + AmbientRate = VL53L0X_MAKEUINT16(localBuffer[9], + localBuffer[8]); + pRangingMeasurementData->AmbientRateRtnMegaCps = + VL53L0X_FIXPOINT97TOFIXPOINT1616(AmbientRate); + + EffectiveSpadRtnCount = VL53L0X_MAKEUINT16(localBuffer[3], + localBuffer[2]); + /* EffectiveSpadRtnCount is 8.8 format */ + pRangingMeasurementData->EffectiveSpadRtnCount = + EffectiveSpadRtnCount; + + DeviceRangeStatus = localBuffer[0]; + + /* Get Linearity Corrective Gain */ + LinearityCorrectiveGain = PALDevDataGet(Dev, + LinearityCorrectiveGain); + + /* Get ranging configuration */ + RangeFractionalEnable = PALDevDataGet(Dev, + RangeFractionalEnable); + + if (LinearityCorrectiveGain != 1000) { + + tmpuint16 = (uint16_t)((LinearityCorrectiveGain + * tmpuint16 + 500) / 1000); + + /* Implement Xtalk */ + VL53L0X_GETPARAMETERFIELD(Dev, + XTalkCompensationRateMegaCps, + XTalkCompensationRateMegaCps); + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, + XTalkCompensationEnable); + + if (XTalkCompensationEnable) { + + if ((SignalRate + - ((XTalkCompensationRateMegaCps + * EffectiveSpadRtnCount) >> 8)) + <= 0) { + if (RangeFractionalEnable) + XtalkRangeMilliMeter = 8888; + else + XtalkRangeMilliMeter = 8888 + << 2; + } else { + XtalkRangeMilliMeter = + (tmpuint16 * SignalRate) + / (SignalRate + - ((XTalkCompensationRateMegaCps + * EffectiveSpadRtnCount) + >> 8)); + } + + tmpuint16 = XtalkRangeMilliMeter; + } + + } + + if (RangeFractionalEnable) { + pRangingMeasurementData->RangeMilliMeter = + (uint16_t)((tmpuint16) >> 2); + pRangingMeasurementData->RangeFractionalPart = + (uint8_t)((tmpuint16 & 0x03) << 6); + } else { + pRangingMeasurementData->RangeMilliMeter = tmpuint16; + pRangingMeasurementData->RangeFractionalPart = 0; + } + + /* + * For a standard definition of RangeStatus, this should + * return 0 in case of good result after a ranging + * The range status depends on the device so call a device + * specific function to obtain the right Status. + */ + Status |= VL53L0X_get_pal_range_status(Dev, DeviceRangeStatus, + SignalRate, EffectiveSpadRtnCount, + pRangingMeasurementData, &PalRangeStatus); + + if (Status == VL53L0X_ERROR_NONE) + pRangingMeasurementData->RangeStatus = PalRangeStatus; + + } + + if (Status == VL53L0X_ERROR_NONE) { + /* Copy last read data into Dev buffer */ + LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); + + LastRangeDataBuffer.RangeMilliMeter = + pRangingMeasurementData->RangeMilliMeter; + LastRangeDataBuffer.RangeFractionalPart = + pRangingMeasurementData->RangeFractionalPart; + LastRangeDataBuffer.RangeDMaxMilliMeter = + pRangingMeasurementData->RangeDMaxMilliMeter; + LastRangeDataBuffer.MeasurementTimeUsec = + pRangingMeasurementData->MeasurementTimeUsec; + LastRangeDataBuffer.SignalRateRtnMegaCps = + pRangingMeasurementData->SignalRateRtnMegaCps; + LastRangeDataBuffer.AmbientRateRtnMegaCps = + pRangingMeasurementData->AmbientRateRtnMegaCps; + LastRangeDataBuffer.EffectiveSpadRtnCount = + pRangingMeasurementData->EffectiveSpadRtnCount; + LastRangeDataBuffer.RangeStatus = + pRangingMeasurementData->RangeStatus; + + PALDevDataSet(Dev, LastRangeMeasure, LastRangeDataBuffer); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev, + FixPoint1616_t *pMeasurementRefSignal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SignalRefClipLimitCheckEnable = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipLimitCheckEnable); + if (SignalRefClipLimitCheckEnable != 0) + *pMeasurementRefSignal = PALDevDataGet(Dev, LastSignalRefMcps); + else + Status = VL53L0X_ERROR_INVALID_COMMAND; + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, + VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + /* This function will do a complete single ranging + * Here we fix the mode! + */ + Status = VL53L0X_SetDeviceMode(Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_PerformSingleMeasurement(Dev); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetRangingMeasurementData(Dev, + pRangingMeasurementData); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(Dev, 0); + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t NumberOfROIZones) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + if (NumberOfROIZones != 1) + Status = VL53L0X_ERROR_INVALID_PARAMS; + + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pNumberOfROIZones) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pNumberOfROIZones = 1; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, + uint8_t *pMaxNumberOfROIZones) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + *pMaxNumberOfROIZones = 1; + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL Measurement Functions */ + +VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, + VL53L0X_InterruptPolarity Polarity) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t data; + + LOG_FUNCTION_START(""); + + if (Pin != 0) { + Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; + } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_DRIVE) { + if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) + data = 0x10; + else + data = 1; + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data); + + } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_OSC) { + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x85, 0x02); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x04); + Status |= VL53L0X_WrByte(Dev, 0xcd, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xcc, 0x11); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x07); + Status |= VL53L0X_WrByte(Dev, 0xbe, 0x00); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x06); + Status |= VL53L0X_WrByte(Dev, 0xcc, 0x09); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + + } else { + + if (Status == VL53L0X_ERROR_NONE) { + switch (Functionality) { + case VL53L0X_GPIOFUNCTIONALITY_OFF: + data = 0x00; + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: + data = 0x01; + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: + data = 0x02; + break; + case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: + data = 0x03; + break; + case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY: + data = 0x04; + break; + default: + Status = + VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; + } + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data); + + if (Status == VL53L0X_ERROR_NONE) { + if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) + data = 0; + else + data = (uint8_t)(1 << 4); + + Status = VL53L0X_UpdateByte(Dev, + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data); + } + + if (Status == VL53L0X_ERROR_NONE) + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + Pin0GpioFunctionality, Functionality); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(Dev, 0); + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, + VL53L0X_DeviceModes *pDeviceMode, + VL53L0X_GpioFunctionality *pFunctionality, + VL53L0X_InterruptPolarity *pPolarity) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_GpioFunctionality GpioFunctionality; + uint8_t data; + + LOG_FUNCTION_START(""); + + /* pDeviceMode not managed by Ewok it return the current mode */ + + Status = VL53L0X_GetDeviceMode(Dev, pDeviceMode); + + if (Status == VL53L0X_ERROR_NONE) { + if (Pin != 0) { + Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; + } else { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, &data); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + switch (data & 0x07) { + case 0x00: + GpioFunctionality = VL53L0X_GPIOFUNCTIONALITY_OFF; + break; + case 0x01: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW; + break; + case 0x02: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH; + break; + case 0x03: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT; + break; + case 0x04: + GpioFunctionality = + VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY; + break; + default: + Status = VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; + } + } + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, + &data); + + if (Status == VL53L0X_ERROR_NONE) { + if ((data & (uint8_t)(1 << 4)) == 0) + *pPolarity = VL53L0X_INTERRUPTPOLARITY_LOW; + else + *pPolarity = VL53L0X_INTERRUPTPOLARITY_HIGH; + } + + if (Status == VL53L0X_ERROR_NONE) { + *pFunctionality = GpioFunctionality; + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, Pin0GpioFunctionality, + GpioFunctionality); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, + FixPoint1616_t ThresholdHigh) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t Threshold16; + + LOG_FUNCTION_START(""); + + /* no dependency on DeviceMode for Ewok */ + /* Need to divide by 2 because the FW will apply a x2 */ + Threshold16 = (uint16_t)((ThresholdLow >> 17) & 0x00fff); + Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, + Threshold16); + + if (Status == VL53L0X_ERROR_NONE) { + /* Need to divide by 2 because the FW will apply a x2 */ + Threshold16 = (uint16_t)((ThresholdHigh >> 17) & 0x00fff); + Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, + Threshold16); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, + VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, + FixPoint1616_t *pThresholdHigh) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t Threshold16; + + LOG_FUNCTION_START(""); + + /* no dependency on DeviceMode for Ewok */ + + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, + &Threshold16); + /* Need to multiply by 2 because the FW will apply a x2 */ + *pThresholdLow = (FixPoint1616_t)((0x00fff & Threshold16) << 17); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, + &Threshold16); + /* Need to multiply by 2 because the FW will apply a x2 */ + *pThresholdHigh = + (FixPoint1616_t)((0x00fff & Threshold16) << 17); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev, + uint32_t *pStopStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte = 0; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_RdByte(Dev, 0x04, &Byte); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x0); + + *pStopStatus = Byte; + + if (Byte == 0) { + Status = VL53L0X_WrByte(Dev, 0x80, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status = VL53L0X_WrByte(Dev, 0x00, 0x00); + Status = VL53L0X_WrByte(Dev, 0x91, + PALDevDataGet(Dev, StopVariable)); + Status = VL53L0X_WrByte(Dev, 0x00, 0x01); + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status = VL53L0X_WrByte(Dev, 0x80, 0x00); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +/* Group PAL Interrupt Functions */ +VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t LoopCount; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + /* clear bit 0 range interrupt, bit 1 error interrupt */ + LoopCount = 0; + do { + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00); + Status |= VL53L0X_RdByte(Dev, + VL53L0X_REG_RESULT_INTERRUPT_STATUS, &Byte); + LoopCount++; + } while (((Byte & 0x07) != 0x00) + && (LoopCount < 3) + && (Status == VL53L0X_ERROR_NONE)); + + + if (LoopCount >= 3) + Status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, + uint32_t *pInterruptMaskStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, + &Byte); + *pInterruptMaskStatus = Byte & 0x07; + + if (Byte & 0x18) + Status = VL53L0X_ERROR_RANGE_ERROR; + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, + uint32_t InterruptMask) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; + + LOG_FUNCTION_START(""); + + /* not implemented for VL53L0X */ + + LOG_FUNCTION_END(Status); + return Status; +} + +/* End Group PAL Interrupt Functions */ + +/* Group SPAD functions */ + +VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperThreshold) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrWord(Dev, 0x40, SpadAmbientDamperThreshold); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperThreshold) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_RdWord(Dev, 0x40, pSpadAmbientDamperThreshold); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t SpadAmbientDamperFactor) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Byte = (uint8_t)(SpadAmbientDamperFactor & 0x00FF); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x42, Byte); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev, + uint16_t *pSpadAmbientDamperFactor) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t Byte; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_RdByte(Dev, 0x42, &Byte); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + *pSpadAmbientDamperFactor = (uint16_t)Byte; + + LOG_FUNCTION_END(Status); + return Status; +} + +/* END Group SPAD functions */ + +/***************************************************************************** + * Internal functions + *****************************************************************************/ + +VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, uint32_t count, + uint8_t isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_set_reference_spads(Dev, count, isApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, uint32_t *pSpadCount, + uint8_t *pIsApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_reference_spads(Dev, pSpadCount, pIsApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, + uint32_t *refSpadCount, uint8_t *isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_perform_ref_spad_management(Dev, refSpadCount, + isApertureSpads); + + LOG_FUNCTION_END(Status); + + return Status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_calibration.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_calibration.c" new file mode 100644 index 00000000..76385538 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_calibration.c" @@ -0,0 +1,1288 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_calibration.h" + +#ifndef __KERNEL__ +#include +#endif + +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + +#define REF_ARRAY_SPAD_0 0 +#define REF_ARRAY_SPAD_5 5 +#define REF_ARRAY_SPAD_10 10 + +uint32_t refArrayQuadrants[4] = {REF_ARRAY_SPAD_10, REF_ARRAY_SPAD_5, + REF_ARRAY_SPAD_0, REF_ARRAY_SPAD_5 }; + +VL53L0X_Error VL53L0X_perform_xtalk_calibration(VL53L0X_DEV Dev, + FixPoint1616_t XTalkCalDistance, + FixPoint1616_t *pXTalkCompensationRateMegaCps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t sum_ranging = 0; + uint16_t sum_spads = 0; + FixPoint1616_t sum_signalRate = 0; + FixPoint1616_t total_count = 0; + uint8_t xtalk_meas = 0; + VL53L0X_RangingMeasurementData_t RangingMeasurementData; + FixPoint1616_t xTalkStoredMeanSignalRate; + FixPoint1616_t xTalkStoredMeanRange; + FixPoint1616_t xTalkStoredMeanRtnSpads; + uint32_t signalXTalkTotalPerSpad; + uint32_t xTalkStoredMeanRtnSpadsAsInt; + uint32_t xTalkCalDistanceAsInt; + FixPoint1616_t XTalkCompensationRateMegaCps; + + if (XTalkCalDistance <= 0) + Status = VL53L0X_ERROR_INVALID_PARAMS; + + /* Disable the XTalk compensation */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationEnable(Dev, 0); + + /* Disable the RIT */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + } + + /* Perform 50 measurements and compute the averages */ + if (Status == VL53L0X_ERROR_NONE) { + sum_ranging = 0; + sum_spads = 0; + sum_signalRate = 0; + total_count = 0; + for (xtalk_meas = 0; xtalk_meas < 50; xtalk_meas++) { + Status = VL53L0X_PerformSingleRangingMeasurement(Dev, + &RangingMeasurementData); + + if (Status != VL53L0X_ERROR_NONE) + break; + + /* The range is valid when RangeStatus = 0 */ + if (RangingMeasurementData.RangeStatus == 0) { + sum_ranging = sum_ranging + + RangingMeasurementData.RangeMilliMeter; + sum_signalRate = sum_signalRate + + RangingMeasurementData.SignalRateRtnMegaCps; + sum_spads = sum_spads + + RangingMeasurementData.EffectiveSpadRtnCount + / 256; + total_count = total_count + 1; + } + } + + /* no valid values found */ + if (total_count == 0) + Status = VL53L0X_ERROR_RANGE_ERROR; + + } + + + if (Status == VL53L0X_ERROR_NONE) { + /* FixPoint1616_t / uint16_t = FixPoint1616_t */ + xTalkStoredMeanSignalRate = sum_signalRate / total_count; + xTalkStoredMeanRange = (FixPoint1616_t)((uint32_t)( + sum_ranging << 16) / total_count); + xTalkStoredMeanRtnSpads = (FixPoint1616_t)((uint32_t)( + sum_spads << 16) / total_count); + + /* Round Mean Spads to Whole Number. + * Typically the calculated mean SPAD count is a whole number + * or very close to a whole + * number, therefore any truncation will not result in a + * significant loss in accuracy. + * Also, for a grey target at a typical distance of around + * 400mm, around 220 SPADs will + * be enabled, therefore, any truncation will result in a loss + * of accuracy of less than + * 0.5%. + */ + xTalkStoredMeanRtnSpadsAsInt = (xTalkStoredMeanRtnSpads + + 0x8000) >> 16; + + /* Round Cal Distance to Whole Number. + * Note that the cal distance is in mm, therefore no resolution + * is lost. + */ + xTalkCalDistanceAsInt = (XTalkCalDistance + 0x8000) >> 16; + + if (xTalkStoredMeanRtnSpadsAsInt == 0 || + xTalkCalDistanceAsInt == 0 || + xTalkStoredMeanRange >= XTalkCalDistance) { + XTalkCompensationRateMegaCps = 0; + } else { + /* Round Cal Distance to Whole Number. + * Note that the cal distance is in mm, therefore no + * resolution is lost. + */ + xTalkCalDistanceAsInt = (XTalkCalDistance + + 0x8000) >> 16; + + /* Apply division by mean spad count early in the + * calculation to keep the numbers small. + * This ensures we can maintain a 32bit calculation. + * Fixed1616 / int := Fixed1616 + */ + signalXTalkTotalPerSpad = (xTalkStoredMeanSignalRate) / + xTalkStoredMeanRtnSpadsAsInt; + + /* Complete the calculation for total Signal XTalk per + * SPAD + * Fixed1616 * (Fixed1616 - Fixed1616/int) := + * (2^16 * Fixed1616) + */ + signalXTalkTotalPerSpad *= ((1 << 16) - + (xTalkStoredMeanRange / xTalkCalDistanceAsInt)); + + /* Round from 2^16 * Fixed1616, to Fixed1616. */ + XTalkCompensationRateMegaCps = (signalXTalkTotalPerSpad + + 0x8000) >> 16; + } + + *pXTalkCompensationRateMegaCps = XTalkCompensationRateMegaCps; + + /* Enable the XTalk compensation */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationEnable(Dev, 1); + + /* Enable the XTalk compensation */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev, + XTalkCompensationRateMegaCps); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_perform_offset_calibration(VL53L0X_DEV Dev, + FixPoint1616_t CalDistanceMilliMeter, + int32_t *pOffsetMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t sum_ranging = 0; + FixPoint1616_t total_count = 0; + VL53L0X_RangingMeasurementData_t RangingMeasurementData; + FixPoint1616_t StoredMeanRange; + uint32_t StoredMeanRangeAsInt; + uint32_t CalDistanceAsInt_mm; + uint8_t SequenceStepEnabled; + int meas = 0; + + if (CalDistanceMilliMeter <= 0) + Status = VL53L0X_ERROR_INVALID_PARAMS; + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, 0); + + + /* Get the value of the TCC */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, &SequenceStepEnabled); + + + /* Disable the TCC */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, 0); + + + /* Disable the RIT */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_SetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); + + /* Perform 50 measurements and compute the averages */ + if (Status == VL53L0X_ERROR_NONE) { + sum_ranging = 0; + total_count = 0; + for (meas = 0; meas < 50; meas++) { + Status = VL53L0X_PerformSingleRangingMeasurement(Dev, + &RangingMeasurementData); + + if (Status != VL53L0X_ERROR_NONE) + break; + + /* The range is valid when RangeStatus = 0 */ + if (RangingMeasurementData.RangeStatus == 0) { + sum_ranging = sum_ranging + + RangingMeasurementData.RangeMilliMeter; + total_count = total_count + 1; + } + } + + /* no valid values found */ + if (total_count == 0) + Status = VL53L0X_ERROR_RANGE_ERROR; + } + + + if (Status == VL53L0X_ERROR_NONE) { + /* FixPoint1616_t / uint16_t = FixPoint1616_t */ + StoredMeanRange = (FixPoint1616_t)((uint32_t)(sum_ranging << 16) + / total_count); + + StoredMeanRangeAsInt = (StoredMeanRange + 0x8000) >> 16; + + /* Round Cal Distance to Whole Number. + * Note that the cal distance is in mm, therefore no resolution + * is lost. + */ + CalDistanceAsInt_mm = (CalDistanceMilliMeter + 0x8000) >> 16; + + *pOffsetMicroMeter = (CalDistanceAsInt_mm - + StoredMeanRangeAsInt) * 1000; + + /* Apply the calculated offset */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, RangeOffsetMicroMeters, + *pOffsetMicroMeter); + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, + *pOffsetMicroMeter); + } + + } + + /* Restore the TCC */ + if (Status == VL53L0X_ERROR_NONE) { + if (SequenceStepEnabled != 0) + Status = VL53L0X_SetSequenceStepEnable(Dev, + VL53L0X_SEQUENCESTEP_TCC, 1); + } + + return Status; +} + + +VL53L0X_Error VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t OffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t cMaxOffsetMicroMeter = 511000; + int32_t cMinOffsetMicroMeter = -512000; + int16_t cOffsetRange = 4096; + uint32_t encodedOffsetVal; + + LOG_FUNCTION_START(""); + + if (OffsetCalibrationDataMicroMeter > cMaxOffsetMicroMeter) + OffsetCalibrationDataMicroMeter = cMaxOffsetMicroMeter; + else if (OffsetCalibrationDataMicroMeter < cMinOffsetMicroMeter) + OffsetCalibrationDataMicroMeter = cMinOffsetMicroMeter; + + /* The offset register is 10.2 format and units are mm + * therefore conversion is applied by a division of + * 250. + */ + if (OffsetCalibrationDataMicroMeter >= 0) { + encodedOffsetVal = + OffsetCalibrationDataMicroMeter/250; + } else { + encodedOffsetVal = + cOffsetRange + + OffsetCalibrationDataMicroMeter/250; + } + + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, + encodedOffsetVal); + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, + int32_t *pOffsetCalibrationDataMicroMeter) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint16_t RangeOffsetRegister; + int16_t cMaxOffset = 2047; + int16_t cOffsetRange = 4096; + + /* Note that offset has 10.2 format */ + + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, + &RangeOffsetRegister); + + if (Status == VL53L0X_ERROR_NONE) { + RangeOffsetRegister = (RangeOffsetRegister & 0x0fff); + + /* Apply 12 bit 2's compliment conversion */ + if (RangeOffsetRegister > cMaxOffset) + *pOffsetCalibrationDataMicroMeter = + (int16_t)(RangeOffsetRegister - cOffsetRange) + * 250; + else + *pOffsetCalibrationDataMicroMeter = + (int16_t)RangeOffsetRegister * 250; + + } + + return Status; +} + + +VL53L0X_Error VL53L0X_apply_offset_adjustment(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t CorrectedOffsetMicroMeters; + int32_t CurrentOffsetMicroMeters; + + /* if we run on this function we can read all the NVM info + * used by the API + */ + Status = VL53L0X_get_info_from_device(Dev, 7); + + /* Read back current device offset */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, + &CurrentOffsetMicroMeters); + } + + /* Apply Offset Adjustment derived from 400mm measurements */ + if (Status == VL53L0X_ERROR_NONE) { + + /* Store initial device offset */ + PALDevDataSet(Dev, Part2PartOffsetNVMMicroMeter, + CurrentOffsetMicroMeters); + + CorrectedOffsetMicroMeters = CurrentOffsetMicroMeters + + (int32_t)PALDevDataGet(Dev, + Part2PartOffsetAdjustmentNVMMicroMeter); + + Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, + CorrectedOffsetMicroMeters); + + /* store current, adjusted offset */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, RangeOffsetMicroMeters, + CorrectedOffsetMicroMeters); + } + } + + return Status; +} + +void get_next_good_spad(uint8_t goodSpadArray[], uint32_t size, + uint32_t curr, int32_t *next) +{ + uint32_t startIndex; + uint32_t fineOffset; + uint32_t cSpadsPerByte = 8; + uint32_t coarseIndex; + uint32_t fineIndex; + uint8_t dataByte; + uint8_t success = 0; + + /* + * Starting with the current good spad, loop through the array to find + * the next. i.e. the next bit set in the sequence. + * + * The coarse index is the byte index of the array and the fine index is + * the index of the bit within each byte. + */ + + *next = -1; + + startIndex = curr / cSpadsPerByte; + fineOffset = curr % cSpadsPerByte; + + for (coarseIndex = startIndex; ((coarseIndex < size) && !success); + coarseIndex++) { + fineIndex = 0; + dataByte = goodSpadArray[coarseIndex]; + + if (coarseIndex == startIndex) { + /* locate the bit position of the provided current + * spad bit before iterating + */ + dataByte >>= fineOffset; + fineIndex = fineOffset; + } + + while (fineIndex < cSpadsPerByte) { + if ((dataByte & 0x1) == 1) { + success = 1; + *next = coarseIndex * cSpadsPerByte + fineIndex; + break; + } + dataByte >>= 1; + fineIndex++; + } + } +} + + +uint8_t is_aperture(uint32_t spadIndex) +{ + /* + * This function reports if a given spad index is an aperture SPAD by + * deriving the quadrant. + */ + uint32_t quadrant; + uint8_t isAperture = 1; + + quadrant = spadIndex >> 6; + if (refArrayQuadrants[quadrant] == REF_ARRAY_SPAD_0) + isAperture = 0; + + return isAperture; +} + + +VL53L0X_Error enable_spad_bit(uint8_t spadArray[], uint32_t size, + uint32_t spadIndex) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + uint32_t cSpadsPerByte = 8; + uint32_t coarseIndex; + uint32_t fineIndex; + + coarseIndex = spadIndex / cSpadsPerByte; + fineIndex = spadIndex % cSpadsPerByte; + if (coarseIndex >= size) + status = VL53L0X_ERROR_REF_SPAD_INIT; + else + spadArray[coarseIndex] |= (1 << fineIndex); + + return status; +} + +VL53L0X_Error count_enabled_spads(uint8_t spadArray[], + uint32_t byteCount, uint32_t maxSpads, + uint32_t *pTotalSpadsEnabled, uint8_t *pIsAperture) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + uint32_t cSpadsPerByte = 8; + uint32_t lastByte; + uint32_t lastBit; + uint32_t byteIndex = 0; + uint32_t bitIndex = 0; + uint8_t tempByte; + uint8_t spadTypeIdentified = 0; + + /* The entire array will not be used for spads, therefore the last + * byte and last bit is determined from the max spads value. + */ + + lastByte = maxSpads / cSpadsPerByte; + lastBit = maxSpads % cSpadsPerByte; + + /* Check that the max spads value does not exceed the array bounds. */ + if (lastByte >= byteCount) + status = VL53L0X_ERROR_REF_SPAD_INIT; + + *pTotalSpadsEnabled = 0; + + /* Count the bits enabled in the whole bytes */ + for (byteIndex = 0; byteIndex <= (lastByte - 1); byteIndex++) { + tempByte = spadArray[byteIndex]; + + for (bitIndex = 0; bitIndex <= cSpadsPerByte; bitIndex++) { + if ((tempByte & 0x01) == 1) { + (*pTotalSpadsEnabled)++; + + if (!spadTypeIdentified) { + *pIsAperture = 1; + if ((byteIndex < 2) && (bitIndex < 4)) + *pIsAperture = 0; + spadTypeIdentified = 1; + } + } + tempByte >>= 1; + } + } + + /* Count the number of bits enabled in the last byte accounting + * for the fact that not all bits in the byte may be used. + */ + tempByte = spadArray[lastByte]; + + for (bitIndex = 0; bitIndex <= lastBit; bitIndex++) { + if ((tempByte & 0x01) == 1) + (*pTotalSpadsEnabled)++; + } + + return status; +} + +VL53L0X_Error set_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) +{ + VL53L0X_Error status = VL53L0X_WriteMulti(Dev, + VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, + refSpadArray, 6); + return status; +} + +VL53L0X_Error get_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) +{ + VL53L0X_Error status = VL53L0X_ReadMulti(Dev, + VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, + refSpadArray, + 6); + return status; +} + +VL53L0X_Error enable_ref_spads(VL53L0X_DEV Dev, + uint8_t apertureSpads, + uint8_t goodSpadArray[], + uint8_t spadArray[], + uint32_t size, + uint32_t start, + uint32_t offset, + uint32_t spadCount, + uint32_t *lastSpad) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + uint32_t index; + uint32_t i; + int32_t nextGoodSpad = offset; + uint32_t currentSpad; + uint8_t checkSpadArray[6]; + + /* + * This function takes in a spad array which may or may not have SPADS + * already enabled and appends from a given offset a requested number + * of new SPAD enables. The 'good spad map' is applied to + * determine the next SPADs to enable. + * + * This function applies to only aperture or only non-aperture spads. + * Checks are performed to ensure this. + */ + + currentSpad = offset; + for (index = 0; index < spadCount; index++) { + get_next_good_spad(goodSpadArray, size, currentSpad, + &nextGoodSpad); + + if (nextGoodSpad == -1) { + status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + + /* Confirm that the next good SPAD is non-aperture */ + if (is_aperture(start + nextGoodSpad) != apertureSpads) { + /* if we can't get the required number of good aperture + * spads from the current quadrant then this is an error + */ + status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + currentSpad = (uint32_t)nextGoodSpad; + enable_spad_bit(spadArray, size, currentSpad); + currentSpad++; + } + *lastSpad = currentSpad; + + if (status == VL53L0X_ERROR_NONE) + status = set_ref_spad_map(Dev, spadArray); + + + if (status == VL53L0X_ERROR_NONE) { + status = get_ref_spad_map(Dev, checkSpadArray); + + i = 0; + + /* Compare spad maps. If not equal report error. */ + while (i < size) { + if (spadArray[i] != checkSpadArray[i]) { + status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + i++; + } + } + return status; +} + + +VL53L0X_Error perform_ref_signal_measurement(VL53L0X_DEV Dev, + uint16_t *refSignalRate) +{ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + VL53L0X_RangingMeasurementData_t rangingMeasurementData; + + uint8_t SequenceConfig = 0; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* + * This function performs a reference signal rate measurement. + */ + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_WrByte(Dev, + VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0xC0); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_PerformSingleRangingMeasurement(Dev, + &rangingMeasurementData); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_RdWord(Dev, + VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, + refSignalRate); + + if (status == VL53L0X_ERROR_NONE) + status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (status == VL53L0X_ERROR_NONE) { + /* restore the previous Sequence Config */ + status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + } + + return status; +} + +VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, + uint32_t *refSpadCount, + uint8_t *isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t lastSpadArray[6]; + uint8_t startSelect = 0xB4; + uint32_t minimumSpadCount = 3; + uint32_t maxSpadCount = 44; + uint32_t currentSpadIndex = 0; + uint32_t lastSpadIndex = 0; + int32_t nextGoodSpad = 0; + uint16_t targetRefRate = 0x0A00; /* 20 MCPS in 9:7 format */ + uint16_t peakSignalRateRef; + uint32_t needAptSpads = 0; + uint32_t index = 0; + uint32_t spadArraySize = 6; + uint32_t signalRateDiff = 0; + uint32_t lastSignalRateDiff = 0; + uint8_t complete = 0; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + uint32_t refSpadCount_int = 0; + uint8_t isApertureSpads_int = 0; + + /* + * The reference SPAD initialization procedure determines the minimum + * amount of reference spads to be enables to achieve a target reference + * signal rate and should be performed once during initialization. + * + * Either aperture or non-aperture spads are applied but never both. + * Firstly non-aperture spads are set, begining with 5 spads, and + * increased one spad at a time until the closest measurement to the + * target rate is achieved. + * + * If the target rate is exceeded when 5 non-aperture spads are enabled, + * initialization is performed instead with aperture spads. + * + * When setting spads, a 'Good Spad Map' is applied. + * + * This procedure operates within a SPAD window of interest of a maximum + * 44 spads. + * The start point is currently fixed to 180, which lies towards the end + * of the non-aperture quadrant and runs in to the adjacent aperture + * quadrant. + */ + + + targetRefRate = PALDevDataGet(Dev, targetRefRate); + + /* + * Initialize Spad arrays. + * Currently the good spad map is initialised to 'All good'. + * This is a short term implementation. The good spad map will be + * provided as an input. + * Note that there are 6 bytes. Only the first 44 bits will be used to + * represent spads. + */ + for (index = 0; index < spadArraySize; index++) + Dev->Data.SpadData.RefSpadEnables[index] = 0; + + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, + startSelect); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE, 0); + + /* Perform ref calibration */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_ref_calibration(Dev, &VhvSettings, + &PhaseCal, 0); + + if (Status == VL53L0X_ERROR_NONE) { + /* Enable Minimum NON-APERTURE Spads */ + currentSpadIndex = 0; + lastSpadIndex = currentSpadIndex; + needAptSpads = 0; + Status = enable_ref_spads(Dev, + needAptSpads, + Dev->Data.SpadData.RefGoodSpadMap, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, + startSelect, + currentSpadIndex, + minimumSpadCount, + &lastSpadIndex); + } + + if (Status == VL53L0X_ERROR_NONE) { + currentSpadIndex = lastSpadIndex; + + Status = perform_ref_signal_measurement(Dev, + &peakSignalRateRef); + if ((Status == VL53L0X_ERROR_NONE) && + (peakSignalRateRef > targetRefRate)) { + /* Signal rate measurement too high, + * switch to APERTURE SPADs + */ + + for (index = 0; index < spadArraySize; index++) + Dev->Data.SpadData.RefSpadEnables[index] = 0; + + + /* Increment to the first APERTURE spad */ + while ((is_aperture(startSelect + currentSpadIndex) + == 0) && (currentSpadIndex < maxSpadCount)) { + currentSpadIndex++; + } + + needAptSpads = 1; + + Status = enable_ref_spads(Dev, + needAptSpads, + Dev->Data.SpadData.RefGoodSpadMap, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, + startSelect, + currentSpadIndex, + minimumSpadCount, + &lastSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + currentSpadIndex = lastSpadIndex; + Status = perform_ref_signal_measurement(Dev, + &peakSignalRateRef); + + if ((Status == VL53L0X_ERROR_NONE) && + (peakSignalRateRef > targetRefRate)) { + /* Signal rate still too high after + * setting the minimum number of + * APERTURE spads. Can do no more + * therefore set the min number of + * aperture spads as the result. + */ + isApertureSpads_int = 1; + refSpadCount_int = minimumSpadCount; + } + } + } else { + needAptSpads = 0; + } + } + + if ((Status == VL53L0X_ERROR_NONE) && + (peakSignalRateRef < targetRefRate)) { + /* At this point, the minimum number of either aperture + * or non-aperture spads have been set. Proceed to add + * spads and perform measurements until the target + * reference is reached. + */ + isApertureSpads_int = needAptSpads; + refSpadCount_int = minimumSpadCount; + + memcpy(lastSpadArray, Dev->Data.SpadData.RefSpadEnables, + spadArraySize); + lastSignalRateDiff = abs(peakSignalRateRef - + targetRefRate); + complete = 0; + + while (!complete) { + get_next_good_spad( + Dev->Data.SpadData.RefGoodSpadMap, + spadArraySize, currentSpadIndex, + &nextGoodSpad); + + if (nextGoodSpad == -1) { + Status = VL53L0X_ERROR_REF_SPAD_INIT; + break; + } + + /* Cannot combine Aperture and Non-Aperture spads, so + * ensure the current spad is of the correct type. + */ + if (is_aperture((uint32_t)startSelect + nextGoodSpad) != + needAptSpads) { + /* At this point we have enabled the maximum + * number of Aperture spads. + */ + complete = 1; + break; + } + + (refSpadCount_int)++; + + currentSpadIndex = nextGoodSpad; + Status = enable_spad_bit( + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, currentSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + currentSpadIndex++; + /* Proceed to apply the additional spad and + * perform measurement. + */ + Status = set_ref_spad_map(Dev, + Dev->Data.SpadData.RefSpadEnables); + } + + if (Status != VL53L0X_ERROR_NONE) + break; + + Status = perform_ref_signal_measurement(Dev, + &peakSignalRateRef); + + if (Status != VL53L0X_ERROR_NONE) + break; + + signalRateDiff = abs(peakSignalRateRef - targetRefRate); + + if (peakSignalRateRef > targetRefRate) { + /* Select the spad map that provides the + * measurement closest to the target rate, + * either above or below it. + */ + if (signalRateDiff > lastSignalRateDiff) { + /* Previous spad map produced a closer + * measurement, so choose this. + */ + Status = set_ref_spad_map(Dev, + lastSpadArray); + memcpy( + Dev->Data.SpadData.RefSpadEnables, + lastSpadArray, spadArraySize); + + (refSpadCount_int)--; + } + complete = 1; + } else { + /* Continue to add spads */ + lastSignalRateDiff = signalRateDiff; + memcpy(lastSpadArray, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize); + } + + } /* while */ + } + + if (Status == VL53L0X_ERROR_NONE) { + *refSpadCount = refSpadCount_int; + *isApertureSpads = isApertureSpads_int; + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, (uint8_t)(*refSpadCount)); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, *isApertureSpads); + } + + return Status; +} + +VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, + uint32_t count, uint8_t isApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint32_t currentSpadIndex = 0; + uint8_t startSelect = 0xB4; + uint32_t spadArraySize = 6; + uint32_t maxSpadCount = 44; + uint32_t lastSpadIndex; + uint32_t index; + + /* + * This function applies a requested number of reference spads, either + * aperture or + * non-aperture, as requested. + * The good spad map will be applied. + */ + + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, + startSelect); + + for (index = 0; index < spadArraySize; index++) + Dev->Data.SpadData.RefSpadEnables[index] = 0; + + if (isApertureSpads) { + /* Increment to the first APERTURE spad */ + while ((is_aperture(startSelect + currentSpadIndex) == 0) && + (currentSpadIndex < maxSpadCount)) { + currentSpadIndex++; + } + } + Status = enable_ref_spads(Dev, + isApertureSpads, + Dev->Data.SpadData.RefGoodSpadMap, + Dev->Data.SpadData.RefSpadEnables, + spadArraySize, + startSelect, + currentSpadIndex, + count, + &lastSpadIndex); + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, (uint8_t)(count)); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, isApertureSpads); + } + + return Status; +} + +VL53L0X_Error VL53L0X_get_reference_spads(VL53L0X_DEV Dev, + uint32_t *pSpadCount, uint8_t *pIsApertureSpads) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t refSpadsInitialised; + uint8_t refSpadArray[6]; + uint32_t cMaxSpadCount = 44; + uint32_t cSpadArraySize = 6; + uint32_t spadsEnabled; + uint8_t isApertureSpads = 0; + + refSpadsInitialised = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + RefSpadsInitialised); + + if (refSpadsInitialised == 1) { + + *pSpadCount = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount); + *pIsApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType); + } else { + + /* obtain spad info from device.*/ + Status = get_ref_spad_map(Dev, refSpadArray); + + if (Status == VL53L0X_ERROR_NONE) { + /* count enabled spads within spad map array and + * determine if Aperture or Non-Aperture. + */ + Status = count_enabled_spads(refSpadArray, + cSpadArraySize, + cMaxSpadCount, + &spadsEnabled, + &isApertureSpads); + + if (Status == VL53L0X_ERROR_NONE) { + + *pSpadCount = spadsEnabled; + *pIsApertureSpads = isApertureSpads; + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + RefSpadsInitialised, 1); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, + (uint8_t)spadsEnabled); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, isApertureSpads); + } + } + } + + return Status; +} + + +VL53L0X_Error VL53L0X_perform_single_ref_calibration(VL53L0X_DEV Dev, + uint8_t vhv_init_byte) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, + VL53L0X_REG_SYSRANGE_MODE_START_STOP | + vhv_init_byte); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_measurement_poll_for_completion(Dev); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_ClearInterruptMask(Dev, 0); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x00); + + return Status; +} + + +VL53L0X_Error VL53L0X_ref_calibration_io(VL53L0X_DEV Dev, + uint8_t read_not_write, + uint8_t VhvSettings, uint8_t PhaseCal, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, + const uint8_t vhv_enable, const uint8_t phase_enable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t PhaseCalint = 0; + + /* Read VHV from device */ + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + if (read_not_write) { + if (vhv_enable) + Status |= VL53L0X_RdByte(Dev, 0xCB, pVhvSettings); + if (phase_enable) + Status |= VL53L0X_RdByte(Dev, 0xEE, &PhaseCalint); + } else { + if (vhv_enable) + Status |= VL53L0X_WrByte(Dev, 0xCB, VhvSettings); + if (phase_enable) + Status |= VL53L0X_UpdateByte(Dev, 0xEE, 0x80, PhaseCal); + } + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + + *pPhaseCal = (uint8_t)(PhaseCalint&0xEF); + + return Status; +} + + +VL53L0X_Error VL53L0X_perform_vhv_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, const uint8_t get_data_enable, + const uint8_t restore_config) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + uint8_t PhaseCalInt = 0; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + if (restore_config) + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* Run VHV */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_single_ref_calibration(Dev, 0x40); + + /* Read VHV from device */ + if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { + Status = VL53L0X_ref_calibration_io(Dev, 1, + VhvSettings, PhaseCal, /* Not used here */ + pVhvSettings, &PhaseCalInt, + 1, 0); + } else + *pVhvSettings = 0; + + + if ((Status == VL53L0X_ERROR_NONE) && restore_config) { + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, + uint8_t *pPhaseCal, const uint8_t get_data_enable, + const uint8_t restore_config) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + uint8_t VhvSettingsint; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + if (restore_config) + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* Run PhaseCal */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x02); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_single_ref_calibration(Dev, 0x0); + + /* Read PhaseCal from device */ + if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { + Status = VL53L0X_ref_calibration_io(Dev, 1, + VhvSettings, PhaseCal, /* Not used here */ + &VhvSettingsint, pPhaseCal, + 0, 1); + } else + *pPhaseCal = 0; + + + if ((Status == VL53L0X_ERROR_NONE) && restore_config) { + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t SequenceConfig = 0; + + /* store the value of the sequence config, + * this will be reset before the end of the function + */ + + SequenceConfig = PALDevDataGet(Dev, SequenceConfig); + + /* In the following function we don't save the config to optimize + * writes on device. Config is saved and restored only once. + */ + Status = VL53L0X_perform_vhv_calibration( + Dev, pVhvSettings, get_data_enable, 0); + + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_phase_calibration( + Dev, pPhaseCal, get_data_enable, 0); + + + if (Status == VL53L0X_ERROR_NONE) { + /* restore the previous Sequence Config */ + Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, + SequenceConfig); + if (Status == VL53L0X_ERROR_NONE) + PALDevDataSet(Dev, SequenceConfig, SequenceConfig); + + } + + return Status; +} + +VL53L0X_Error VL53L0X_set_ref_calibration(VL53L0X_DEV Dev, + uint8_t VhvSettings, uint8_t PhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t pVhvSettings; + uint8_t pPhaseCal; + + Status = VL53L0X_ref_calibration_io(Dev, 0, + VhvSettings, PhaseCal, + &pVhvSettings, &pPhaseCal, + 1, 1); + + return Status; +} + +VL53L0X_Error VL53L0X_get_ref_calibration(VL53L0X_DEV Dev, + uint8_t *pVhvSettings, uint8_t *pPhaseCal) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t VhvSettings = 0; + uint8_t PhaseCal = 0; + + Status = VL53L0X_ref_calibration_io(Dev, 1, + VhvSettings, PhaseCal, + pVhvSettings, pPhaseCal, + 1, 1); + + return Status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_core.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_core.c" new file mode 100644 index 00000000..3933a00b --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_core.c" @@ -0,0 +1,2128 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_calibration.h" + + +#ifndef __KERNEL__ +#include +#endif +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + +VL53L0X_Error VL53L0X_reverse_bytes(uint8_t *data, uint32_t size) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t tempData; + uint32_t mirrorIndex; + uint32_t middle = size/2; + uint32_t index; + + for (index = 0; index < middle; index++) { + mirrorIndex = size - index - 1; + tempData = data[index]; + data[index] = data[mirrorIndex]; + data[mirrorIndex] = tempData; + } + return Status; +} + +VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t NewDataReady = 0; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + LoopNb = 0; + + do { + Status = VL53L0X_GetMeasurementDataReady(Dev, &NewDataReady); + if (Status != 0) + break; /* the error is set */ + + if (NewDataReady == 1) + break; /* done note that status == 0 */ + + LoopNb++; + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) { + Status = VL53L0X_ERROR_TIME_OUT; + break; + } + + VL53L0X_PollingDelay(Dev); + } while (1); + + LOG_FUNCTION_END(Status); + + return Status; +} + + +uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg) +{ + /*! + * Converts the encoded VCSEL period register value into the real + * period in PLL clocks + */ + + uint8_t vcsel_period_pclks = 0; + + vcsel_period_pclks = (vcsel_period_reg + 1) << 1; + + return vcsel_period_pclks; +} + +uint8_t VL53L0X_encode_vcsel_period(uint8_t vcsel_period_pclks) +{ + /*! + * Converts the encoded VCSEL period register value into the real period + * in PLL clocks + */ + + uint8_t vcsel_period_reg = 0; + + vcsel_period_reg = (vcsel_period_pclks >> 1) - 1; + + return vcsel_period_reg; +} + + +uint32_t VL53L0X_isqrt(uint32_t num) +{ + /* + * Implements an integer square root + * + * From: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots + */ + + uint32_t res = 0; + uint32_t bit = 1 << 30; + /* The second-to-top bit is set: + * 1 << 14 for 16-bits, 1 << 30 for 32 bits + */ + + /* "bit" starts at the highest power of four <= the argument. */ + while (bit > num) + bit >>= 2; + + + while (bit != 0) { + if (num >= res + bit) { + num -= res + bit; + res = (res >> 1) + bit; + } else + res >>= 1; + + bit >>= 2; + } + + return res; +} + + +uint32_t VL53L0X_quadrature_sum(uint32_t a, uint32_t b) +{ + /* + * Implements a quadrature sum + * + * rea = sqrt(a^2 + b^2) + * + * Trap overflow case max input value is 65535 (16-bit value) + * as internal calc are 32-bit wide + * + * If overflow then seta output to maximum + */ + uint32_t res = 0; + + if (a > 65535 || b > 65535) + res = 65535; + else + res = VL53L0X_isqrt(a * a + b * b); + + return res; +} + + +VL53L0X_Error VL53L0X_device_read_strobe(VL53L0X_DEV Dev) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t strobe; + uint32_t LoopNb; + + LOG_FUNCTION_START(""); + + Status |= VL53L0X_WrByte(Dev, 0x83, 0x00); + + /* polling + * use timeout to avoid deadlock + */ + if (Status == VL53L0X_ERROR_NONE) { + LoopNb = 0; + do { + Status = VL53L0X_RdByte(Dev, 0x83, &strobe); + if ((strobe != 0x00) || Status != VL53L0X_ERROR_NONE) + break; + + LoopNb = LoopNb + 1; + } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP); + + if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) + Status = VL53L0X_ERROR_TIME_OUT; + + } + + Status |= VL53L0X_WrByte(Dev, 0x83, 0x01); + + LOG_FUNCTION_END(Status); + return Status; + +} + +VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option) +{ + + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t byte; + uint32_t TmpDWord; + uint8_t ModuleId; + uint8_t Revision; + uint8_t ReferenceSpadCount = 0; + uint8_t ReferenceSpadType = 0; + uint32_t PartUIDUpper = 0; + uint32_t PartUIDLower = 0; + uint32_t OffsetFixed1104_mm = 0; + int16_t OffsetMicroMeters = 0; + uint32_t DistMeasTgtFixed1104_mm = 400 << 4; + uint32_t DistMeasFixed1104_400_mm = 0; + uint32_t SignalRateMeasFixed1104_400_mm = 0; + char ProductId[19]; + char *ProductId_tmp; + uint8_t ReadDataFromDeviceDone; + FixPoint1616_t SignalRateMeasFixed400mmFix = 0; + uint8_t NvmRefGoodSpadMap[VL53L0X_REF_SPAD_BUFFER_SIZE]; + int i; + + + LOG_FUNCTION_START(""); + + ReadDataFromDeviceDone = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ReadDataFromDeviceDone); + + /* This access is done only once after that a GetDeviceInfo or + * datainit is done + */ + if (ReadDataFromDeviceDone != 7) { + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); + Status |= VL53L0X_RdByte(Dev, 0x83, &byte); + Status |= VL53L0X_WrByte(Dev, 0x83, byte|4); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x07); + Status |= VL53L0X_WrByte(Dev, 0x81, 0x01); + + Status |= VL53L0X_PollingDelay(Dev); + + Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); + + if (((option & 1) == 1) && + ((ReadDataFromDeviceDone & 1) == 0)) { + Status |= VL53L0X_WrByte(Dev, 0x94, 0x6b); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ReferenceSpadCount = (uint8_t)((TmpDWord >> 8) & 0x07f); + ReferenceSpadType = (uint8_t)((TmpDWord >> 15) & 0x01); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x24); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + + NvmRefGoodSpadMap[0] = (uint8_t)((TmpDWord >> 24) + & 0xff); + NvmRefGoodSpadMap[1] = (uint8_t)((TmpDWord >> 16) + & 0xff); + NvmRefGoodSpadMap[2] = (uint8_t)((TmpDWord >> 8) + & 0xff); + NvmRefGoodSpadMap[3] = (uint8_t)(TmpDWord & 0xff); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x25); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + NvmRefGoodSpadMap[4] = (uint8_t)((TmpDWord >> 24) + & 0xff); + NvmRefGoodSpadMap[5] = (uint8_t)((TmpDWord >> 16) + & 0xff); + } + + if (((option & 2) == 2) && + ((ReadDataFromDeviceDone & 2) == 0)) { + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x02); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdByte(Dev, 0x90, &ModuleId); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdByte(Dev, 0x90, &Revision); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x77); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[0] = (char)((TmpDWord >> 25) & 0x07f); + ProductId[1] = (char)((TmpDWord >> 18) & 0x07f); + ProductId[2] = (char)((TmpDWord >> 11) & 0x07f); + ProductId[3] = (char)((TmpDWord >> 4) & 0x07f); + + byte = (uint8_t)((TmpDWord & 0x00f) << 3); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x78); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[4] = (char)(byte + + ((TmpDWord >> 29) & 0x07f)); + ProductId[5] = (char)((TmpDWord >> 22) & 0x07f); + ProductId[6] = (char)((TmpDWord >> 15) & 0x07f); + ProductId[7] = (char)((TmpDWord >> 8) & 0x07f); + ProductId[8] = (char)((TmpDWord >> 1) & 0x07f); + + byte = (uint8_t)((TmpDWord & 0x001) << 6); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x79); + + Status |= VL53L0X_device_read_strobe(Dev); + + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[9] = (char)(byte + + ((TmpDWord >> 26) & 0x07f)); + ProductId[10] = (char)((TmpDWord >> 19) & 0x07f); + ProductId[11] = (char)((TmpDWord >> 12) & 0x07f); + ProductId[12] = (char)((TmpDWord >> 5) & 0x07f); + + byte = (uint8_t)((TmpDWord & 0x01f) << 2); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7A); + + Status |= VL53L0X_device_read_strobe(Dev); + + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + ProductId[13] = (char)(byte + + ((TmpDWord >> 30) & 0x07f)); + ProductId[14] = (char)((TmpDWord >> 23) & 0x07f); + ProductId[15] = (char)((TmpDWord >> 16) & 0x07f); + ProductId[16] = (char)((TmpDWord >> 9) & 0x07f); + ProductId[17] = (char)((TmpDWord >> 2) & 0x07f); + ProductId[18] = '\0'; + + } + + if (((option & 4) == 4) && + ((ReadDataFromDeviceDone & 4) == 0)) { + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDUpper); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x7C); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDLower); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x73); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + SignalRateMeasFixed1104_400_mm = (TmpDWord & + 0x0000000ff) << 8; + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x74); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + SignalRateMeasFixed1104_400_mm |= ((TmpDWord & + 0xff000000) >> 24); + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x75); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + DistMeasFixed1104_400_mm = (TmpDWord & 0x0000000ff) + << 8; + + Status |= VL53L0X_WrByte(Dev, 0x94, 0x76); + Status |= VL53L0X_device_read_strobe(Dev); + Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); + + DistMeasFixed1104_400_mm |= ((TmpDWord & 0xff000000) + >> 24); + } + + Status |= VL53L0X_WrByte(Dev, 0x81, 0x00); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); + Status |= VL53L0X_RdByte(Dev, 0x83, &byte); + Status |= VL53L0X_WrByte(Dev, 0x83, byte&0xfb); + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); + Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); + + Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); + Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); + } + + if ((Status == VL53L0X_ERROR_NONE) && + (ReadDataFromDeviceDone != 7)) { + /* Assign to variable if status is ok */ + if (((option & 1) == 1) && + ((ReadDataFromDeviceDone & 1) == 0)) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadCount, ReferenceSpadCount); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ReferenceSpadType, ReferenceSpadType); + + for (i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++) { + Dev->Data.SpadData.RefGoodSpadMap[i] = + NvmRefGoodSpadMap[i]; + } + } + + if (((option & 2) == 2) && + ((ReadDataFromDeviceDone & 2) == 0)) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + ModuleId, ModuleId); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + Revision, Revision); + + ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ProductId); + VL53L0X_COPYSTRING(ProductId_tmp, ProductId); + + } + + if (((option & 4) == 4) && + ((ReadDataFromDeviceDone & 4) == 0)) { + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + PartUIDUpper, PartUIDUpper); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + PartUIDLower, PartUIDLower); + + SignalRateMeasFixed400mmFix = + VL53L0X_FIXPOINT97TOFIXPOINT1616( + SignalRateMeasFixed1104_400_mm); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + SignalRateMeasFixed400mm, + SignalRateMeasFixed400mmFix); + + OffsetMicroMeters = 0; + if (DistMeasFixed1104_400_mm != 0) { + OffsetFixed1104_mm = + DistMeasFixed1104_400_mm - + DistMeasTgtFixed1104_mm; + OffsetMicroMeters = (OffsetFixed1104_mm + * 1000) >> 4; + OffsetMicroMeters *= -1; + } + + PALDevDataSet(Dev, + Part2PartOffsetAdjustmentNVMMicroMeter, + OffsetMicroMeters); + } + byte = (uint8_t)(ReadDataFromDeviceDone|option); + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, + byte); + } + + LOG_FUNCTION_END(Status); + return Status; +} + + +uint32_t VL53L0X_calc_macro_period_ps(VL53L0X_DEV Dev, + uint8_t vcsel_period_pclks) +{ + uint64_t PLL_period_ps; + uint32_t macro_period_vclks; + uint32_t macro_period_ps; + + LOG_FUNCTION_START(""); + + /* The above calculation will produce rounding errors, + * therefore set fixed value + */ + PLL_period_ps = 1655; + + macro_period_vclks = 2304; + macro_period_ps = (uint32_t)(macro_period_vclks + * vcsel_period_pclks * PLL_period_ps); + + LOG_FUNCTION_END(""); + return macro_period_ps; +} + +uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks) +{ + /*! + * Encode timeout in macro periods in (LSByte * 2^MSByte) + 1 format + */ + + uint16_t encoded_timeout = 0; + uint32_t ls_byte = 0; + uint16_t ms_byte = 0; + + if (timeout_macro_clks > 0) { + ls_byte = timeout_macro_clks - 1; + + while ((ls_byte & 0xFFFFFF00) > 0) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + + encoded_timeout = (ms_byte << 8) + + (uint16_t) (ls_byte & 0x000000FF); + } + + return encoded_timeout; + +} + +uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout) +{ + /*! + * Decode 16-bit timeout register value - format (LSByte * 2^MSByte) + 1 + */ + + uint32_t timeout_macro_clks = 0; + + timeout_macro_clks = ((uint32_t) (encoded_timeout & 0x00FF) + << (uint32_t) ((encoded_timeout & 0xFF00) >> 8)) + 1; + + return timeout_macro_clks; +} + + +/* To convert ms into register value */ +uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, + uint32_t timeout_period_us, + uint8_t vcsel_period_pclks) +{ + uint32_t macro_period_ps; + uint32_t macro_period_ns; + uint32_t timeout_period_mclks = 0; + + macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); + macro_period_ns = (macro_period_ps + 500) / 1000; + + timeout_period_mclks = + (uint32_t) (((timeout_period_us * 1000) + + (macro_period_ns / 2)) / macro_period_ns); + + return timeout_period_mclks; +} + +/* To convert register value into us */ +uint32_t VL53L0X_calc_timeout_us(VL53L0X_DEV Dev, + uint16_t timeout_period_mclks, + uint8_t vcsel_period_pclks) +{ + uint32_t macro_period_ps; + uint32_t macro_period_ns; + uint32_t actual_timeout_period_us = 0; + + macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); + macro_period_ns = (macro_period_ps + 500) / 1000; + + actual_timeout_period_us = + ((timeout_period_mclks * macro_period_ns) + 500) / 1000; + + return actual_timeout_period_us; +} + + +VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t *pTimeOutMicroSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t CurrentVCSELPulsePeriodPClk; + uint8_t EncodedTimeOutByte = 0; + uint32_t TimeoutMicroSeconds = 0; + uint16_t PreRangeEncodedTimeOut = 0; + uint16_t MsrcTimeOutMClks; + uint16_t PreRangeTimeOutMClks; + uint16_t FinalRangeTimeOutMClks = 0; + uint16_t FinalRangeEncodedTimeOut; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + + if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, + &EncodedTimeOutByte); + } + MsrcTimeOutMClks = VL53L0X_decode_timeout(EncodedTimeOutByte); + + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + MsrcTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods (MCLKS) */ + if (Status == VL53L0X_ERROR_NONE) { + + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &PreRangeEncodedTimeOut); + } + + PreRangeTimeOutMClks = VL53L0X_decode_timeout( + PreRangeEncodedTimeOut); + + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + PreRangeTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { + + VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + PreRangeTimeOutMClks = 0; + + if (SchedulerSequenceSteps.PreRangeOn) { + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods + * (MCLKS) + */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &PreRangeEncodedTimeOut); + PreRangeTimeOutMClks = VL53L0X_decode_timeout( + PreRangeEncodedTimeOut); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + /* Retrieve FINAL-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &CurrentVCSELPulsePeriodPClk); + } + + /* Retrieve FINAL-RANGE Timeout in Macro periods (MCLKS) */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, + &FinalRangeEncodedTimeOut); + FinalRangeTimeOutMClks = VL53L0X_decode_timeout( + FinalRangeEncodedTimeOut); + } + + FinalRangeTimeOutMClks -= PreRangeTimeOutMClks; + TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, + FinalRangeTimeOutMClks, + CurrentVCSELPulsePeriodPClk); + } + + *pTimeOutMicroSecs = TimeoutMicroSeconds; + + return Status; +} + + +VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, + VL53L0X_SequenceStepId SequenceStepId, + uint32_t TimeOutMicroSecs) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t CurrentVCSELPulsePeriodPClk; + uint8_t MsrcEncodedTimeOut; + uint16_t PreRangeEncodedTimeOut; + uint16_t PreRangeTimeOutMClks; + uint16_t MsrcRangeTimeOutMClks; + uint32_t FinalRangeTimeOutMClks; + uint16_t FinalRangeEncodedTimeOut; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + + if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || + (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + if (Status == VL53L0X_ERROR_NONE) { + MsrcRangeTimeOutMClks = VL53L0X_calc_timeout_mclks(Dev, + TimeOutMicroSecs, + (uint8_t)CurrentVCSELPulsePeriodPClk); + + if (MsrcRangeTimeOutMClks > 256) + MsrcEncodedTimeOut = 255; + else + MsrcEncodedTimeOut = + (uint8_t)MsrcRangeTimeOutMClks - 1; + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + LastEncodedTimeout, + MsrcEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, + MsrcEncodedTimeOut); + } + } else { + + if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + PreRangeTimeOutMClks = + VL53L0X_calc_timeout_mclks(Dev, + TimeOutMicroSecs, + (uint8_t)CurrentVCSELPulsePeriodPClk); + PreRangeEncodedTimeOut = VL53L0X_encode_timeout( + PreRangeTimeOutMClks); + + VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, + LastEncodedTimeout, + PreRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrWord(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, + PreRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeTimeoutMicroSecs, + TimeOutMicroSecs); + } + } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { + + /* For the final range timeout, the pre-range timeout + * must be added. To do this both final and pre-range + * timeouts must be expressed in macro periods MClks + * because they have different vcsel periods. + */ + + VL53L0X_GetSequenceStepEnables(Dev, + &SchedulerSequenceSteps); + PreRangeTimeOutMClks = 0; + if (SchedulerSequenceSteps.PreRangeOn) { + + /* Retrieve PRE-RANGE VCSEL Period */ + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_PRE_RANGE, + &CurrentVCSELPulsePeriodPClk); + + /* Retrieve PRE-RANGE Timeout in Macro periods + * (MCLKS) + */ + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdWord(Dev, 0x51, + &PreRangeEncodedTimeOut); + PreRangeTimeOutMClks = + VL53L0X_decode_timeout( + PreRangeEncodedTimeOut); + } + } + + /* Calculate FINAL RANGE Timeout in Macro Periods + * (MCLKS) and add PRE-RANGE value + */ + if (Status == VL53L0X_ERROR_NONE) { + + Status = VL53L0X_GetVcselPulsePeriod(Dev, + VL53L0X_VCSEL_PERIOD_FINAL_RANGE, + &CurrentVCSELPulsePeriodPClk); + } + if (Status == VL53L0X_ERROR_NONE) { + + FinalRangeTimeOutMClks = + VL53L0X_calc_timeout_mclks(Dev, + TimeOutMicroSecs, + (uint8_t) CurrentVCSELPulsePeriodPClk); + + FinalRangeTimeOutMClks += PreRangeTimeOutMClks; + + FinalRangeEncodedTimeOut = + VL53L0X_encode_timeout(FinalRangeTimeOutMClks); + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_WrWord(Dev, 0x71, + FinalRangeEncodedTimeOut); + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeTimeoutMicroSecs, + TimeOutMicroSecs); + } + } + } else + Status = VL53L0X_ERROR_INVALID_PARAMS; + + } + return Status; +} + +VL53L0X_Error VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t vcsel_period_reg; + uint8_t MinPreVcselPeriodPCLK = 12; + uint8_t MaxPreVcselPeriodPCLK = 18; + uint8_t MinFinalVcselPeriodPCLK = 8; + uint8_t MaxFinalVcselPeriodPCLK = 14; + uint32_t MeasurementTimingBudgetMicroSeconds; + uint32_t FinalRangeTimeoutMicroSeconds; + uint32_t PreRangeTimeoutMicroSeconds; + uint32_t MsrcTimeoutMicroSeconds; + uint8_t PhaseCalInt = 0; + + /* Check if valid clock period requested */ + + if ((VCSELPulsePeriodPCLK % 2) != 0) { + /* Value must be an even number */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_PRE_RANGE && + (VCSELPulsePeriodPCLK < MinPreVcselPeriodPCLK || + VCSELPulsePeriodPCLK > MaxPreVcselPeriodPCLK)) { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_FINAL_RANGE && + (VCSELPulsePeriodPCLK < MinFinalVcselPeriodPCLK || + VCSELPulsePeriodPCLK > MaxFinalVcselPeriodPCLK)) { + + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + /* Apply specific settings for the requested clock period */ + + if (Status != VL53L0X_ERROR_NONE) + return Status; + + + if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_PRE_RANGE) { + + /* Set phase check limits */ + if (VCSELPulsePeriodPCLK == 12) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x18); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } else if (VCSELPulsePeriodPCLK == 14) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x30); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } else if (VCSELPulsePeriodPCLK == 16) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x40); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } else if (VCSELPulsePeriodPCLK == 18) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x50); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + } + } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_FINAL_RANGE) { + + if (VCSELPulsePeriodPCLK == 8) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x10); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x30); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } else if (VCSELPulsePeriodPCLK == 10) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x28); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x20); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } else if (VCSELPulsePeriodPCLK == 12) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x38); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x20); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } else if (VCSELPulsePeriodPCLK == 14) { + + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, + 0x048); + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, + 0x08); + + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07); + + Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); + Status |= VL53L0X_WrByte(Dev, + VL53L0X_REG_ALGO_PHASECAL_LIM, + 0x20); + Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); + } + } + + + /* Re-calculate and apply timeouts, in macro periods */ + + if (Status == VL53L0X_ERROR_NONE) { + vcsel_period_reg = VL53L0X_encode_vcsel_period((uint8_t) + VCSELPulsePeriodPCLK); + + /* When the VCSEL period for the pre or final range is changed, + * the corresponding timeout must be read from the device using + * the current VCSEL period, then the new VCSEL period can be + * applied. The timeout then must be written back to the device + * using the new VCSEL period. + * + * For the MSRC timeout, the same applies - this timeout being + * dependant on the pre-range vcsel period. + */ + switch (VcselPeriodType) { + case VL53L0X_VCSEL_PERIOD_PRE_RANGE: + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, + vcsel_period_reg); + + + if (Status == VL53L0X_ERROR_NONE) + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + PreRangeTimeoutMicroSeconds); + + + if (Status == VL53L0X_ERROR_NONE) + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + MsrcTimeoutMicroSeconds); + + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + PreRangeVcselPulsePeriod, + VCSELPulsePeriodPCLK); + break; + case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &FinalRangeTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, + vcsel_period_reg); + + + if (Status == VL53L0X_ERROR_NONE) + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + FinalRangeTimeoutMicroSeconds); + + VL53L0X_SETDEVICESPECIFICPARAMETER( + Dev, + FinalRangeVcselPulsePeriod, + VCSELPulsePeriodPCLK); + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + /* Finally, the timing budget must be re-applied */ + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_GETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + + Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, + MeasurementTimingBudgetMicroSeconds); + } + + /* Perform the phase calibration. This is needed after changing on + * vcsel period. + * get_data_enable = 0, restore_config = 1 + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_perform_phase_calibration( + Dev, &PhaseCalInt, 0, 1); + + return Status; +} + +VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, + VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t vcsel_period_reg; + + switch (VcselPeriodType) { + case VL53L0X_VCSEL_PERIOD_PRE_RANGE: + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, + &vcsel_period_reg); + break; + case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, + &vcsel_period_reg); + break; + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + if (Status == VL53L0X_ERROR_NONE) + *pVCSELPulsePeriodPCLK = + VL53L0X_decode_vcsel_period(vcsel_period_reg); + + return Status; +} + + + +VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint32_t FinalRangeTimingBudgetMicroSeconds; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; + uint32_t StartOverheadMicroSeconds = 1910; + uint32_t EndOverheadMicroSeconds = 960; + uint32_t MsrcOverheadMicroSeconds = 660; + uint32_t TccOverheadMicroSeconds = 590; + uint32_t DssOverheadMicroSeconds = 690; + uint32_t PreRangeOverheadMicroSeconds = 660; + uint32_t FinalRangeOverheadMicroSeconds = 550; + uint32_t PreRangeTimeoutMicroSeconds = 0; + uint32_t SubTimeout = 0; + + LOG_FUNCTION_START(""); + + FinalRangeTimingBudgetMicroSeconds = + MeasurementTimingBudgetMicroSeconds - + (StartOverheadMicroSeconds + EndOverheadMicroSeconds); + + Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + + if (Status == VL53L0X_ERROR_NONE && + (SchedulerSequenceSteps.TccOn || + SchedulerSequenceSteps.MsrcOn || + SchedulerSequenceSteps.DssOn)) { + + /* TCC, MSRC and DSS all share the same timeout */ + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcDccTccTimeoutMicroSeconds); + + /* Subtract the TCC, MSRC and DSS timeouts if they are + * enabled. + */ + + if (Status != VL53L0X_ERROR_NONE) + return Status; + + /* TCC */ + if (SchedulerSequenceSteps.TccOn) { + + SubTimeout = MsrcDccTccTimeoutMicroSeconds + + TccOverheadMicroSeconds; + + if (SubTimeout < + FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds -= + SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + /* DSS */ + if (SchedulerSequenceSteps.DssOn) { + + SubTimeout = 2 * (MsrcDccTccTimeoutMicroSeconds + + DssOverheadMicroSeconds); + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds + -= SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } else if (SchedulerSequenceSteps.MsrcOn) { + /* MSRC */ + SubTimeout = MsrcDccTccTimeoutMicroSeconds + + MsrcOverheadMicroSeconds; + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds + -= SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + } + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + if (SchedulerSequenceSteps.PreRangeOn) { + + /* Subtract the Pre-range timeout if enabled. */ + + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + + SubTimeout = PreRangeTimeoutMicroSeconds + + PreRangeOverheadMicroSeconds; + + if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { + FinalRangeTimingBudgetMicroSeconds -= SubTimeout; + } else { + /* Requested timeout too big. */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + + if (Status == VL53L0X_ERROR_NONE && + SchedulerSequenceSteps.FinalRangeOn) { + + FinalRangeTimingBudgetMicroSeconds -= + FinalRangeOverheadMicroSeconds; + + /* Final Range Timeout + * Note that the final range timeout is determined by the timing + * budget and the sum of all other timeouts within the sequence. + * If there is no room for the final range timeout, then an + * error will be set. Otherwise the remaining time will be + * applied to the final range. + */ + Status = set_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + FinalRangeTimingBudgetMicroSeconds); + + VL53L0X_SETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + MeasurementTimingBudgetMicroSeconds); + } + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( + VL53L0X_DEV Dev, + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; + uint32_t FinalRangeTimeoutMicroSeconds; + uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; + uint32_t StartOverheadMicroSeconds = 1910; + uint32_t EndOverheadMicroSeconds = 960; + uint32_t MsrcOverheadMicroSeconds = 660; + uint32_t TccOverheadMicroSeconds = 590; + uint32_t DssOverheadMicroSeconds = 690; + uint32_t PreRangeOverheadMicroSeconds = 660; + uint32_t FinalRangeOverheadMicroSeconds = 550; + uint32_t PreRangeTimeoutMicroSeconds = 0; + + LOG_FUNCTION_START(""); + + /* Start and end overhead times always present */ + *pMeasurementTimingBudgetMicroSeconds + = StartOverheadMicroSeconds + EndOverheadMicroSeconds; + + Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + + if (SchedulerSequenceSteps.TccOn || + SchedulerSequenceSteps.MsrcOn || + SchedulerSequenceSteps.DssOn) { + + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_MSRC, + &MsrcDccTccTimeoutMicroSeconds); + + if (Status == VL53L0X_ERROR_NONE) { + if (SchedulerSequenceSteps.TccOn) { + *pMeasurementTimingBudgetMicroSeconds += + MsrcDccTccTimeoutMicroSeconds + + TccOverheadMicroSeconds; + } + + if (SchedulerSequenceSteps.DssOn) { + *pMeasurementTimingBudgetMicroSeconds += + 2 * (MsrcDccTccTimeoutMicroSeconds + + DssOverheadMicroSeconds); + } else if (SchedulerSequenceSteps.MsrcOn) { + *pMeasurementTimingBudgetMicroSeconds += + MsrcDccTccTimeoutMicroSeconds + + MsrcOverheadMicroSeconds; + } + } + } + + if (Status == VL53L0X_ERROR_NONE) { + if (SchedulerSequenceSteps.PreRangeOn) { + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_PRE_RANGE, + &PreRangeTimeoutMicroSeconds); + *pMeasurementTimingBudgetMicroSeconds += + PreRangeTimeoutMicroSeconds + + PreRangeOverheadMicroSeconds; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + if (SchedulerSequenceSteps.FinalRangeOn) { + Status = get_sequence_step_timeout(Dev, + VL53L0X_SEQUENCESTEP_FINAL_RANGE, + &FinalRangeTimeoutMicroSeconds); + *pMeasurementTimingBudgetMicroSeconds += + (FinalRangeTimeoutMicroSeconds + + FinalRangeOverheadMicroSeconds); + } + } + + if (Status == VL53L0X_ERROR_NONE) { + VL53L0X_SETPARAMETERFIELD(Dev, + MeasurementTimingBudgetMicroSeconds, + *pMeasurementTimingBudgetMicroSeconds); + } + + LOG_FUNCTION_END(Status); + return Status; +} + + + +VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, + uint8_t *pTuningSettingBuffer) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int i; + int Index; + uint8_t msb; + uint8_t lsb; + uint8_t SelectParam; + uint8_t NumberOfWrites; + uint8_t Address; + uint8_t localBuffer[4]; /* max */ + uint16_t Temp16; + + LOG_FUNCTION_START(""); + + Index = 0; + + while ((*(pTuningSettingBuffer + Index) != 0) && + (Status == VL53L0X_ERROR_NONE)) { + NumberOfWrites = *(pTuningSettingBuffer + Index); + Index++; + if (NumberOfWrites == 0xFF) { + /* internal parameters */ + SelectParam = *(pTuningSettingBuffer + Index); + Index++; + switch (SelectParam) { + case 0: /* uint16_t SigmaEstRefArray -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, SigmaEstRefArray, Temp16); + break; + case 1: /* uint16_t SigmaEstEffPulseWidth -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, SigmaEstEffPulseWidth, + Temp16); + break; + case 2: /* uint16_t SigmaEstEffAmbWidth -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, SigmaEstEffAmbWidth, Temp16); + break; + case 3: /* uint16_t targetRefRate -> 2 bytes */ + msb = *(pTuningSettingBuffer + Index); + Index++; + lsb = *(pTuningSettingBuffer + Index); + Index++; + Temp16 = VL53L0X_MAKEUINT16(lsb, msb); + PALDevDataSet(Dev, targetRefRate, Temp16); + break; + default: /* invalid parameter */ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + } else if (NumberOfWrites <= 4) { + Address = *(pTuningSettingBuffer + Index); + Index++; + + for (i = 0; i < NumberOfWrites; i++) { + localBuffer[i] = *(pTuningSettingBuffer + + Index); + Index++; + } + + Status = VL53L0X_WriteMulti(Dev, Address, localBuffer, + NumberOfWrites); + + } else { + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_xtalk_rate_mcps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + uint8_t xtalkCompEnable; + FixPoint1616_t totalXtalkMegaCps; + FixPoint1616_t xtalkPerSpadMegaCps; + + *ptotal_xtalk_rate_mcps = 0; + + Status = VL53L0X_GetXTalkCompensationEnable(Dev, &xtalkCompEnable); + if (Status == VL53L0X_ERROR_NONE) { + + if (xtalkCompEnable) { + + VL53L0X_GETPARAMETERFIELD( + Dev, + XTalkCompensationRateMegaCps, + xtalkPerSpadMegaCps); + + /* FixPoint1616 * FixPoint 8:8 = FixPoint0824 */ + totalXtalkMegaCps = + pRangingMeasurementData->EffectiveSpadRtnCount * + xtalkPerSpadMegaCps; + + /* FixPoint0824 >> 8 = FixPoint1616 */ + *ptotal_xtalk_rate_mcps = + (totalXtalkMegaCps + 0x80) >> 8; + } + } + + return Status; +} + +VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *ptotal_signal_rate_mcps) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t totalXtalkMegaCps; + + LOG_FUNCTION_START(""); + + *ptotal_signal_rate_mcps = + pRangingMeasurementData->SignalRateRtnMegaCps; + + Status = VL53L0X_get_total_xtalk_rate( + Dev, pRangingMeasurementData, &totalXtalkMegaCps); + + if (Status == VL53L0X_ERROR_NONE) + *ptotal_signal_rate_mcps += totalXtalkMegaCps; + + return Status; +} + +VL53L0X_Error get_dmax_lut_points(VL53L0X_DMaxLUT_t data, uint32_t lut_size, + FixPoint1616_t input, int32_t *index0, int32_t *index1){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t index0_tmp = 0; + FixPoint1616_t index1_tmp = 0; + int index = 0; + + for (index = 0; index < lut_size; index++) { + if (input <= data.ambRate_mcps[index]) { + index1_tmp = index; + break; + } + } + + if (index == lut_size) { + /* input is higher than last x point */ + index0_tmp = index1_tmp = lut_size - 1; + } else if (index1_tmp == 0) { + /* input is lower than first x point */ + index0_tmp = 0; + } else{ + /* input is in between 2 points */ + index0_tmp = index1_tmp - 1; + } + + *index0 = index0_tmp; + *index1 = index1_tmp; + + return Status; +} + +VL53L0X_Error VL53L0X_calc_dmax( + VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + VL53L0X_DeviceParameters_t CurrentParameters; + int32_t index0 = 0; + int32_t index1 = 0; + FixPoint1616_t amb0, amb1, dmax0, dmax1; + FixPoint1616_t dmax_mm; + FixPoint1616_t linearSlope; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); + + if (ambRateMeas <= CurrentParameters.dmax_lut.ambRate_mcps[0]) { + dmax_mm = CurrentParameters.dmax_lut.dmax_mm[0]; + } else if (ambRateMeas >= + CurrentParameters.dmax_lut. + ambRate_mcps[VL53L0X_DMAX_LUT_SIZE - 1]) { + dmax_mm = + CurrentParameters.dmax_lut.dmax_mm[VL53L0X_DMAX_LUT_SIZE - + 1]; + } else{ + get_dmax_lut_points(CurrentParameters.dmax_lut, + VL53L0X_DMAX_LUT_SIZE, ambRateMeas, &index0, &index1); + + if (index0 == index1) { + dmax_mm = CurrentParameters.dmax_lut.dmax_mm[index0]; + } else { + amb0 = CurrentParameters.dmax_lut.ambRate_mcps[index0]; + amb1 = CurrentParameters.dmax_lut.ambRate_mcps[index1]; + dmax0 = CurrentParameters.dmax_lut.dmax_mm[index0]; + dmax1 = CurrentParameters.dmax_lut.dmax_mm[index1]; + if ((amb1 - amb0) != 0) { + /* Fix16:16/Fix16:8 => Fix16:8 */ + linearSlope = (dmax0-dmax1)/((amb1-amb0) >> 8); + + /* Fix16:8 * Fix16:8 => Fix16:16 */ + dmax_mm = + (((amb1 - + ambRateMeas) >> 8) * linearSlope) + + dmax1; + } else{ + dmax_mm = dmax0; + } + } + } + *pdmax_mm = (uint32_t)(dmax_mm >> 16); + + LOG_FUNCTION_END(Status); + + return Status; +} + +VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + FixPoint1616_t *pSigmaEstimate) +{ + /* Expressed in 100ths of a ns, i.e. centi-ns */ + const uint32_t cPulseEffectiveWidth_centi_ns = 800; + /* Expressed in 100ths of a ns, i.e. centi-ns */ + const uint32_t cAmbientEffectiveWidth_centi_ns = 600; + const FixPoint1616_t cDfltFinalRangeIntegrationTimeMilliSecs = + 0x00190000; /* 25ms */ + const uint32_t cVcselPulseWidth_ps = 4700; /* pico secs */ + const FixPoint1616_t cSigmaEstMax = 0x028F87AE; + const FixPoint1616_t cSigmaEstRtnMax = 0xF000; + const FixPoint1616_t cAmbToSignalRatioMax = 0xF0000000/ + cAmbientEffectiveWidth_centi_ns; + /* Time Of Flight per mm (6.6 pico secs) */ + const FixPoint1616_t cTOF_per_mm_ps = 0x0006999A; + const uint32_t c16BitRoundingParam = 0x00008000; + const FixPoint1616_t cMaxXTalk_kcps = 0x00320000; + const uint32_t cPllPeriod_ps = 1655; + + uint32_t vcselTotalEventsRtn; + uint32_t finalRangeTimeoutMicroSecs; + uint32_t preRangeTimeoutMicroSecs; + uint32_t finalRangeIntegrationTimeMilliSecs; + FixPoint1616_t sigmaEstimateP1; + FixPoint1616_t sigmaEstimateP2; + FixPoint1616_t sigmaEstimateP3; + FixPoint1616_t deltaT_ps; + FixPoint1616_t pwMult; + FixPoint1616_t sigmaEstRtn; + FixPoint1616_t sigmaEstimate; + FixPoint1616_t xTalkCorrection; + FixPoint1616_t ambientRate_kcps; + FixPoint1616_t peakSignalRate_kcps; + FixPoint1616_t xTalkCompRate_mcps; + uint32_t xTalkCompRate_kcps; + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + FixPoint1616_t diff1_mcps; + FixPoint1616_t diff2_mcps; + FixPoint1616_t sqr1; + FixPoint1616_t sqr2; + FixPoint1616_t sqrSum; + FixPoint1616_t sqrtResult_centi_ns; + FixPoint1616_t sqrtResult; + FixPoint1616_t totalSignalRate_mcps; + FixPoint1616_t sigmaEstRef; + uint32_t vcselWidth; + uint32_t finalRangeMacroPCLKS; + uint32_t preRangeMacroPCLKS; + uint32_t peakVcselDuration_us; + uint8_t finalRangeVcselPCLKS; + uint8_t preRangeVcselPCLKS; + /*! \addtogroup calc_sigma_estimate + * @{ + * + * Estimates the range sigma + */ + + LOG_FUNCTION_START(""); + + VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, + xTalkCompRate_mcps); + + /* + * We work in kcps rather than mcps as this helps keep within the + * confines of the 32 Fix1616 type. + */ + + ambientRate_kcps = + (pRangingMeasurementData->AmbientRateRtnMegaCps * 1000) >> 16; + + Status = VL53L0X_get_total_signal_rate( + Dev, pRangingMeasurementData, &totalSignalRate_mcps); + Status = VL53L0X_get_total_xtalk_rate( + Dev, pRangingMeasurementData, &xTalkCompRate_mcps); + + + /* Signal rate measurement provided by device is the + * peak signal rate, not average. + */ + peakSignalRate_kcps = (totalSignalRate_mcps * 1000); + peakSignalRate_kcps = (peakSignalRate_kcps + 0x8000) >> 16; + + xTalkCompRate_kcps = xTalkCompRate_mcps * 1000; + + if (xTalkCompRate_kcps > cMaxXTalk_kcps) + xTalkCompRate_kcps = cMaxXTalk_kcps; + + if (Status == VL53L0X_ERROR_NONE) { + + /* Calculate final range macro periods */ + finalRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, FinalRangeTimeoutMicroSecs); + + finalRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, FinalRangeVcselPulsePeriod); + + finalRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( + Dev, finalRangeTimeoutMicroSecs, finalRangeVcselPCLKS); + + /* Calculate pre-range macro periods */ + preRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, PreRangeTimeoutMicroSecs); + + preRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( + Dev, PreRangeVcselPulsePeriod); + + preRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( + Dev, preRangeTimeoutMicroSecs, preRangeVcselPCLKS); + + vcselWidth = 3; + if (finalRangeVcselPCLKS == 8) + vcselWidth = 2; + + + peakVcselDuration_us = vcselWidth * 2048 * + (preRangeMacroPCLKS + finalRangeMacroPCLKS); + peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; + peakVcselDuration_us *= cPllPeriod_ps; + peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; + + /* Fix1616 >> 8 = Fix2408 */ + totalSignalRate_mcps = (totalSignalRate_mcps + 0x80) >> 8; + + /* Fix2408 * uint32 = Fix2408 */ + vcselTotalEventsRtn = totalSignalRate_mcps * + peakVcselDuration_us; + + /* Fix2408 >> 8 = uint32 */ + vcselTotalEventsRtn = (vcselTotalEventsRtn + 0x80) >> 8; + + /* Fix2408 << 8 = Fix1616 = */ + totalSignalRate_mcps <<= 8; + } + + if (Status != VL53L0X_ERROR_NONE) { + LOG_FUNCTION_END(Status); + return Status; + } + + if (peakSignalRate_kcps == 0) { + *pSigmaEstimate = cSigmaEstMax; + PALDevDataSet(Dev, SigmaEstimate, cSigmaEstMax); + } else { + if (vcselTotalEventsRtn < 1) + vcselTotalEventsRtn = 1; + + sigmaEstimateP1 = cPulseEffectiveWidth_centi_ns; + + /* ((FixPoint1616 << 16)* uint32)/uint32 = FixPoint1616 */ + sigmaEstimateP2 = (ambientRate_kcps << 16)/peakSignalRate_kcps; + if (sigmaEstimateP2 > cAmbToSignalRatioMax) { + /* Clip to prevent overflow. Will ensure safe + * max result. + */ + sigmaEstimateP2 = cAmbToSignalRatioMax; + } + sigmaEstimateP2 *= cAmbientEffectiveWidth_centi_ns; + + sigmaEstimateP3 = 2 * VL53L0X_isqrt(vcselTotalEventsRtn * 12); + + /* uint32 * FixPoint1616 = FixPoint1616 */ + deltaT_ps = pRangingMeasurementData->RangeMilliMeter * + cTOF_per_mm_ps; + + /* + * vcselRate - xtalkCompRate + * (uint32 << 16) - FixPoint1616 = FixPoint1616. + * Divide result by 1000 to convert to mcps. + * 500 is added to ensure rounding when integer division + * truncates. + */ + diff1_mcps = (((peakSignalRate_kcps << 16) - + 2 * xTalkCompRate_kcps) + 500)/1000; + + /* vcselRate + xtalkCompRate */ + diff2_mcps = ((peakSignalRate_kcps << 16) + 500)/1000; + + /* Shift by 8 bits to increase resolution prior to the + * division + */ + diff1_mcps <<= 8; + + /* FixPoint0824/FixPoint1616 = FixPoint2408 */ + xTalkCorrection = abs(diff1_mcps/diff2_mcps); + + /* FixPoint2408 << 8 = FixPoint1616 */ + xTalkCorrection <<= 8; + + if (pRangingMeasurementData->RangeStatus != 0) { + pwMult = 1 << 16; + } else { + /* FixPoint1616/uint32 = FixPoint1616 */ + /* smaller than 1.0f */ + pwMult = deltaT_ps/cVcselPulseWidth_ps; + + /* + * FixPoint1616 * FixPoint1616 = FixPoint3232, however + * both values are small enough such that32 bits will + * not be exceeded. + */ + pwMult *= ((1 << 16) - xTalkCorrection); + + /* (FixPoint3232 >> 16) = FixPoint1616 */ + pwMult = (pwMult + c16BitRoundingParam) >> 16; + + /* FixPoint1616 + FixPoint1616 = FixPoint1616 */ + pwMult += (1 << 16); + + /* + * At this point the value will be 1.xx, therefore if we + * square the value this will exceed 32 bits. To address + * this perform a single shift to the right before the + * multiplication. + */ + pwMult >>= 1; + /* FixPoint1715 * FixPoint1715 = FixPoint3430 */ + pwMult = pwMult * pwMult; + + /* (FixPoint3430 >> 14) = Fix1616 */ + pwMult >>= 14; + } + + /* FixPoint1616 * uint32 = FixPoint1616 */ + sqr1 = pwMult * sigmaEstimateP1; + + /* (FixPoint1616 >> 16) = FixPoint3200 */ + sqr1 = (sqr1 + 0x8000) >> 16; + + /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ + sqr1 *= sqr1; + + sqr2 = sigmaEstimateP2; + + /* (FixPoint1616 >> 16) = FixPoint3200 */ + sqr2 = (sqr2 + 0x8000) >> 16; + + /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ + sqr2 *= sqr2; + + /* FixPoint64000 + FixPoint6400 = FixPoint6400 */ + sqrSum = sqr1 + sqr2; + + /* SQRT(FixPoin6400) = FixPoint3200 */ + sqrtResult_centi_ns = VL53L0X_isqrt(sqrSum); + + /* (FixPoint3200 << 16) = FixPoint1616 */ + sqrtResult_centi_ns <<= 16; + + /* + * Note that the Speed Of Light is expressed in um per 1E-10 + * seconds (2997) Therefore to get mm/ns we have to divide by + * 10000 + */ + sigmaEstRtn = (((sqrtResult_centi_ns+50)/100) / + sigmaEstimateP3); + sigmaEstRtn *= VL53L0X_SPEED_OF_LIGHT_IN_AIR; + + /* Add 5000 before dividing by 10000 to ensure rounding. */ + sigmaEstRtn += 5000; + sigmaEstRtn /= 10000; + + if (sigmaEstRtn > cSigmaEstRtnMax) { + /* Clip to prevent overflow. Will ensure safe + * max result. + */ + sigmaEstRtn = cSigmaEstRtnMax; + } + finalRangeIntegrationTimeMilliSecs = + (finalRangeTimeoutMicroSecs + preRangeTimeoutMicroSecs + + 500) / 1000; + + /* sigmaEstRef = 1mm * 25ms/final range integration time + * (inc pre-range) + * sqrt(FixPoint1616/int) = FixPoint2408) + */ + sigmaEstRef = + VL53L0X_isqrt((cDfltFinalRangeIntegrationTimeMilliSecs + + finalRangeIntegrationTimeMilliSecs/2)/ + finalRangeIntegrationTimeMilliSecs); + + /* FixPoint2408 << 8 = FixPoint1616 */ + sigmaEstRef <<= 8; + sigmaEstRef = (sigmaEstRef + 500)/1000; + + /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ + sqr1 = sigmaEstRtn * sigmaEstRtn; + /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ + sqr2 = sigmaEstRef * sigmaEstRef; + + /* sqrt(FixPoint3232) = FixPoint1616 */ + sqrtResult = VL53L0X_isqrt((sqr1 + sqr2)); + /* + * Note that the Shift by 4 bits increases resolution prior to + * the sqrt, therefore the result must be shifted by 2 bits to + * the right to revert back to the FixPoint1616 format. + */ + + sigmaEstimate = 1000 * sqrtResult; + + if ((peakSignalRate_kcps < 1) || (vcselTotalEventsRtn < 1) || + (sigmaEstimate > cSigmaEstMax)) { + sigmaEstimate = cSigmaEstMax; + } + + *pSigmaEstimate = (uint32_t)(sigmaEstimate); + PALDevDataSet(Dev, SigmaEstimate, *pSigmaEstimate); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_pal_range_status(VL53L0X_DEV Dev, + uint8_t DeviceRangeStatus, + FixPoint1616_t SignalRate, + uint16_t EffectiveSpadRtnCount, + VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, + uint8_t *pPalRangeStatus) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t NoneFlag; + uint8_t SigmaLimitflag = 0; + uint8_t SignalRefClipflag = 0; + uint8_t RangeIgnoreThresholdflag = 0; + uint8_t SigmaLimitCheckEnable = 0; + uint8_t SignalRateFinalRangeLimitCheckEnable = 0; + uint8_t SignalRefClipLimitCheckEnable = 0; + uint8_t RangeIgnoreThresholdLimitCheckEnable = 0; + FixPoint1616_t SigmaEstimate; + FixPoint1616_t SigmaLimitValue; + FixPoint1616_t SignalRefClipValue; + FixPoint1616_t RangeIgnoreThresholdValue; + FixPoint1616_t SignalRatePerSpad; + uint8_t DeviceRangeStatusInternal = 0; + uint16_t tmpWord = 0; + uint8_t Temp8; + uint32_t Dmax_mm = 0; + FixPoint1616_t LastSignalRefMcps; + + LOG_FUNCTION_START(""); + + + /* + * VL53L0X has a good ranging when the value of the + * DeviceRangeStatus = 11. This function will replace the value 0 with + * the value 11 in the DeviceRangeStatus. + * In addition, the SigmaEstimator is not included in the VL53L0X + * DeviceRangeStatus, this will be added in the PalRangeStatus. + */ + + DeviceRangeStatusInternal = ((DeviceRangeStatus & 0x78) >> 3); + + if (DeviceRangeStatusInternal == 0 || + DeviceRangeStatusInternal == 5 || + DeviceRangeStatusInternal == 7 || + DeviceRangeStatusInternal == 12 || + DeviceRangeStatusInternal == 13 || + DeviceRangeStatusInternal == 14 || + DeviceRangeStatusInternal == 15 + ) { + NoneFlag = 1; + } else { + NoneFlag = 0; + } + + /* + * Check if Sigma limit is enabled, if yes then do comparison with limit + * value and put the result back into pPalRangeStatus. + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + &SigmaLimitCheckEnable); + + if ((SigmaLimitCheckEnable != 0) && (Status == VL53L0X_ERROR_NONE)) { + /* + * compute the Sigma and check with limit + */ + Status = VL53L0X_calc_sigma_estimate( + Dev, + pRangingMeasurementData, + &SigmaEstimate); + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_calc_dmax( + Dev, + pRangingMeasurementData->AmbientRateRtnMegaCps, + &Dmax_mm); + if (Status == VL53L0X_ERROR_NONE) + pRangingMeasurementData->RangeDMaxMilliMeter = Dmax_mm; + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_GetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, + &SigmaLimitValue); + + if ((SigmaLimitValue > 0) && + (SigmaEstimate > SigmaLimitValue)) + /* Limit Fail */ + SigmaLimitflag = 1; + } + } + + /* + * Check if Signal ref clip limit is enabled, if yes then do comparison + * with limit value and put the result back into pPalRangeStatus. + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipLimitCheckEnable); + + if ((SignalRefClipLimitCheckEnable != 0) && + (Status == VL53L0X_ERROR_NONE)) { + + Status = VL53L0X_GetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, + &SignalRefClipValue); + + /* Read LastSignalRefMcps from device */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_RdWord(Dev, + VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, + &tmpWord); + + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); + + LastSignalRefMcps = VL53L0X_FIXPOINT97TOFIXPOINT1616(tmpWord); + PALDevDataSet(Dev, LastSignalRefMcps, LastSignalRefMcps); + + if ((SignalRefClipValue > 0) && + (LastSignalRefMcps > SignalRefClipValue)) { + /* Limit Fail */ + SignalRefClipflag = 1; + } + } + + /* + * Check if Signal ref clip limit is enabled, if yes then do comparison + * with limit value and put the result back into pPalRangeStatus. + * EffectiveSpadRtnCount has a format 8.8 + * If (Return signal rate < (1.5 x Xtalk x number of Spads)) : FAIL + */ + if (Status == VL53L0X_ERROR_NONE) + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + &RangeIgnoreThresholdLimitCheckEnable); + + if ((RangeIgnoreThresholdLimitCheckEnable != 0) && + (Status == VL53L0X_ERROR_NONE)) { + + /* Compute the signal rate per spad */ + if (EffectiveSpadRtnCount == 0) { + SignalRatePerSpad = 0; + } else { + SignalRatePerSpad = (FixPoint1616_t)((256 * SignalRate) + / EffectiveSpadRtnCount); + } + + Status = VL53L0X_GetLimitCheckValue(Dev, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + &RangeIgnoreThresholdValue); + + if ((RangeIgnoreThresholdValue > 0) && + (SignalRatePerSpad < RangeIgnoreThresholdValue)) { + /* Limit Fail add 2^6 to range status */ + RangeIgnoreThresholdflag = 1; + } + } + + if (Status == VL53L0X_ERROR_NONE) { + if (NoneFlag == 1) { + *pPalRangeStatus = 255; /* NONE */ + } else if (DeviceRangeStatusInternal == 1 || + DeviceRangeStatusInternal == 2 || + DeviceRangeStatusInternal == 3) { + *pPalRangeStatus = 5; /* HW fail */ + } else if (DeviceRangeStatusInternal == 6 || + DeviceRangeStatusInternal == 9) { + *pPalRangeStatus = 4; /* Phase fail */ + } else if (DeviceRangeStatusInternal == 8 || + DeviceRangeStatusInternal == 10 || + SignalRefClipflag == 1) { + *pPalRangeStatus = 3; /* Min range */ + } else if (DeviceRangeStatusInternal == 4 || + RangeIgnoreThresholdflag == 1) { + *pPalRangeStatus = 2; /* Signal Fail */ + } else if (SigmaLimitflag == 1) { + *pPalRangeStatus = 1; /* Sigma Fail */ + } else { + *pPalRangeStatus = 0; /* Range Valid */ + } + } + + /* fill the Limit Check Status */ + + Status = VL53L0X_GetLimitCheckEnable(Dev, + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + &SignalRateFinalRangeLimitCheckEnable); + + if (Status == VL53L0X_ERROR_NONE) { + if ((SigmaLimitCheckEnable == 0) || (SigmaLimitflag == 1)) + Temp8 = 1; + else + Temp8 = 0; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, Temp8); + + if ((DeviceRangeStatusInternal == 4) || + (SignalRateFinalRangeLimitCheckEnable == 0)) + Temp8 = 1; + else + Temp8 = 0; + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, + Temp8); + + if ((SignalRefClipLimitCheckEnable == 0) || + (SignalRefClipflag == 1)) + Temp8 = 1; + else + Temp8 = 0; + + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, Temp8); + + if ((RangeIgnoreThresholdLimitCheckEnable == 0) || + (RangeIgnoreThresholdflag == 1)) + Temp8 = 1; + else + Temp8 = 0; + + VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, + VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, + Temp8); + } + + LOG_FUNCTION_END(Status); + return Status; + +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_ranging.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_ranging.c" new file mode 100644 index 00000000..06401b56 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_ranging.c" @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" + + +#ifndef __KERNEL__ +#include +#endif +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_strings.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_strings.c" new file mode 100644 index 00000000..c5781cb7 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/core/src/vl53l0x_api_strings.c" @@ -0,0 +1,466 @@ +/******************************************************************************* + * Copyright 2016, STMicroelectronics International N.V. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND + NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. + IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "vl53l0x_api.h" +#include "vl53l0x_api_core.h" +#include "vl53l0x_api_strings.h" + +#ifndef __KERNEL__ +#include +#endif + +#define LOG_FUNCTION_START(fmt, ...) \ + _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ...) \ + _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ + _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) + + +VL53L0X_Error VL53L0X_check_part_used(VL53L0X_DEV Dev, + uint8_t *Revision, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t ModuleIdInt; + char *ProductId_tmp; + + LOG_FUNCTION_START(""); + + Status = VL53L0X_get_info_from_device(Dev, 2); + + if (Status == VL53L0X_ERROR_NONE) { + ModuleIdInt = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ModuleId); + + if (ModuleIdInt == 0) { + *Revision = 0; + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, ""); + } else { + *Revision = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, Revision); + ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, + ProductId); + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, + ProductId_tmp); + } + } + + LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev, + VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + uint8_t revision_id; + uint8_t Revision; + + Status = VL53L0X_check_part_used(Dev, &Revision, pVL53L0X_DeviceInfo); + + if (Status == VL53L0X_ERROR_NONE) { + if (Revision == 0) { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_TS0); + } else if ((Revision <= 34) && (Revision != 32)) { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_TS1); + } else if (Revision < 39) { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_TS2); + } else { + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, + VL53L0X_STRING_DEVICE_INFO_NAME_ES1); + } + + VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Type, + VL53L0X_STRING_DEVICE_INFO_TYPE); + + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_MODEL_ID, + &pVL53L0X_DeviceInfo->ProductType); + } + + if (Status == VL53L0X_ERROR_NONE) { + Status = VL53L0X_RdByte(Dev, + VL53L0X_REG_IDENTIFICATION_REVISION_ID, + &revision_id); + pVL53L0X_DeviceInfo->ProductRevisionMajor = 1; + pVL53L0X_DeviceInfo->ProductRevisionMinor = + (revision_id & 0xF0) >> 4; + } + + return Status; +} + + +VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode, + char *pDeviceErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (ErrorCode) { + case VL53L0X_DEVICEERROR_NONE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_NONE); + break; + case VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE); + break; + case VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE); + break; + case VL53L0X_DEVICEERROR_NOVHVVALUEFOUND: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND); + break; + case VL53L0X_DEVICEERROR_MSRCNOTARGET: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET); + break; + case VL53L0X_DEVICEERROR_SNRCHECK: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_SNRCHECK); + break; + case VL53L0X_DEVICEERROR_RANGEPHASECHECK: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK); + break; + case VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK); + break; + case VL53L0X_DEVICEERROR_TCC: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_TCC); + break; + case VL53L0X_DEVICEERROR_PHASECONSISTENCY: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY); + break; + case VL53L0X_DEVICEERROR_MINCLIP: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_MINCLIP); + break; + case VL53L0X_DEVICEERROR_RANGECOMPLETE: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE); + break; + case VL53L0X_DEVICEERROR_ALGOUNDERFLOW: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW); + break; + case VL53L0X_DEVICEERROR_ALGOOVERFLOW: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW); + break; + case VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD); + break; + + default: + VL53L0X_COPYSTRING(pDeviceErrorString, + VL53L0X_STRING_UNKNOW_ERROR_CODE); + + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus, + char *pRangeStatusString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (RangeStatus) { + case 0: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_RANGEVALID); + break; + case 1: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_SIGMA); + break; + case 2: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_SIGNAL); + break; + case 3: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_MINRANGE); + break; + case 4: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_PHASE); + break; + case 5: + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_HW); + break; + + default: /**/ + VL53L0X_COPYSTRING(pRangeStatusString, + VL53L0X_STRING_RANGESTATUS_NONE); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode, + char *pPalErrorString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (PalErrorCode) { + case VL53L0X_ERROR_NONE: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_NONE); + break; + case VL53L0X_ERROR_CALIBRATION_WARNING: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_CALIBRATION_WARNING); + break; + case VL53L0X_ERROR_MIN_CLIPPED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_MIN_CLIPPED); + break; + case VL53L0X_ERROR_UNDEFINED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_UNDEFINED); + break; + case VL53L0X_ERROR_INVALID_PARAMS: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_INVALID_PARAMS); + break; + case VL53L0X_ERROR_NOT_SUPPORTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_NOT_SUPPORTED); + break; + case VL53L0X_ERROR_INTERRUPT_NOT_CLEARED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED); + break; + case VL53L0X_ERROR_RANGE_ERROR: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_RANGE_ERROR); + break; + case VL53L0X_ERROR_TIME_OUT: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_TIME_OUT); + break; + case VL53L0X_ERROR_MODE_NOT_SUPPORTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED); + break; + case VL53L0X_ERROR_BUFFER_TOO_SMALL: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL); + break; + case VL53L0X_ERROR_GPIO_NOT_EXISTING: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING); + break; + case VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED); + break; + case VL53L0X_ERROR_CONTROL_INTERFACE: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_CONTROL_INTERFACE); + break; + case VL53L0X_ERROR_INVALID_COMMAND: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_INVALID_COMMAND); + break; + case VL53L0X_ERROR_DIVISION_BY_ZERO: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_DIVISION_BY_ZERO); + break; + case VL53L0X_ERROR_REF_SPAD_INIT: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_REF_SPAD_INIT); + break; + case VL53L0X_ERROR_NOT_IMPLEMENTED: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_ERROR_NOT_IMPLEMENTED); + break; + + default: + VL53L0X_COPYSTRING(pPalErrorString, + VL53L0X_STRING_UNKNOW_ERROR_CODE); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode, + char *pPalStateString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (PalStateCode) { + case VL53L0X_STATE_POWERDOWN: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_POWERDOWN); + break; + case VL53L0X_STATE_WAIT_STATICINIT: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_WAIT_STATICINIT); + break; + case VL53L0X_STATE_STANDBY: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_STANDBY); + break; + case VL53L0X_STATE_IDLE: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_IDLE); + break; + case VL53L0X_STATE_RUNNING: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_RUNNING); + break; + case VL53L0X_STATE_UNKNOWN: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_UNKNOWN); + break; + case VL53L0X_STATE_ERROR: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_ERROR); + break; + + default: + VL53L0X_COPYSTRING(pPalStateString, + VL53L0X_STRING_STATE_UNKNOWN); + } + + LOG_FUNCTION_END(Status); + return Status; +} + +VL53L0X_Error VL53L0X_get_sequence_steps_info( + VL53L0X_SequenceStepId SequenceStepId, + char *pSequenceStepsString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (SequenceStepId) { + case VL53L0X_SEQUENCESTEP_TCC: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_TCC); + break; + case VL53L0X_SEQUENCESTEP_DSS: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_DSS); + break; + case VL53L0X_SEQUENCESTEP_MSRC: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_MSRC); + break; + case VL53L0X_SEQUENCESTEP_PRE_RANGE: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE); + break; + case VL53L0X_SEQUENCESTEP_FINAL_RANGE: + VL53L0X_COPYSTRING(pSequenceStepsString, + VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE); + break; + + default: + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + LOG_FUNCTION_END(Status); + + return Status; +} + + +VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, + uint16_t LimitCheckId, + char *pLimitCheckString) +{ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + LOG_FUNCTION_START(""); + + switch (LimitCheckId) { + case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE); + break; + case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE); + break; + case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP); + break; + case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD); + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC); + break; + + case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE); + break; + + default: + VL53L0X_COPYSTRING(pLimitCheckString, + VL53L0X_STRING_UNKNOW_ERROR_CODE); + + } + + LOG_FUNCTION_END(Status); + return Status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x.h" new file mode 100644 index 00000000..6c5d6fbf --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x.h" @@ -0,0 +1,16 @@ + +#ifndef __VL53L0X_H +#define __VL53L0X_H + + +// 初始化,包含硬件复位,芯片初次IIC通讯和设备验证,6步初始化校验,配置模式和时间。 +void Vl53l0xInit(void); +// 开始测量 +void Vl53l0xStart(void); +// 停止测量 +void Vl53l0xStop(void); +// 获取测量距离 +unsigned short GetDistance(void); + +#endif + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x_iic.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x_iic.h" new file mode 100644 index 00000000..217fbe16 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/inc/vl53l0x_iic.h" @@ -0,0 +1,66 @@ + + +#ifndef __VL53L0X_IIC_H +#define __VL53L0X_IIC_H + +// hi3061M专用 +#include "main.h" //io相关头文件 +#include "clock.h" //延时函数相关头文件 +#include "debug.h" //串口调试输出 +// hi3061M专用 + +#include "vl53l0x_platform.h" + +#define uint8_t unsigned char + +// 这里需要改为自己MCU相关的延时函数 +#define vl53l0x_iic_delay(t) BASE_FUNC_DELAY_US(t) +// 这里需要改为自己MCU相关的延时函数 +#define print_log DBG_PRINTF + +// 上电复位默认IIC地址 +#define VL53L0X_IIC_ADDR 0x29 +// ID标识 +#define VL53L0X_MODULE_ID 0xEEAA + +// 下面的引脚配置需要改为与自己MCU相关的 +/*硬件复位/使能引脚*/ + #define VL53L0X_XSH(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_LOW_LEVEL); \ + }while(0) + + +/*IIC引脚*/ +#define VL53L0X_IIC_SCL(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_LOW_LEVEL); \ + }while(0) + +#define VL53L0X_IIC_SDA(x) do{ x ? \ + HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ + HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_LOW_LEVEL); \ + }while(0) + +// IIC SDA引脚方向[输入(1)输出(0)] +#define VL53L0X_SDA_Direction(x) do{ x ? \ + HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_INPUT_MODE) : \ + HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_OUTPUT_MODE); \ + }while(0) +//IIC 输入模式下获取SDA的引脚值,用于读取数据或者获取ACK +#define VL53L0X_IIC_READ_SDA() HAL_GPIO_GetPinValue(&g_gpio4, GPIO_PIN_4) +// 上面的引脚配置需要改为与自己MCU相关的 + +/*vl53l0x IIC相关函数实现*/ +void vl53l0x_iic_start(void); +void vl53l0x_iic_stop(void); +uint8_t vl53l0x_iic_wait_ack(void); +void vl53l0x_iic_ack(void); +void vl53l0x_iic_nack(void); +void vl53l0x_iic_send_byte(uint8_t dat); +uint8_t vl53l0x_iic_read_byte(uint8_t ack); + + +void vl53l0x_hw_reset(void); +// +#endif diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x.c" new file mode 100644 index 00000000..52e6bd0f --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x.c" @@ -0,0 +1,159 @@ + +#include "vl53l0x.h" +#include "vl53l0x_iic.h" +#include "vl53l0x_api.h" + + +#define CUSTOM_DEV_IIC_ADDDR (VL53L0X_IIC_ADDR) /*自定义IICַ地址*/ +#define DEMO_DEVICE_MODE VL53L0X_DEVICEMODE_CONTINUOUS_RANGING /* 连续测量模式 */ +#define DEMO_BUDGET_TIME (66*1000) /* 测量时间 */ + +/* VL53L0X设备结构体 */ +static VL53L0X_Dev_t demo_dev = { + .I2cDevAddr = VL53L0X_IIC_ADDR, /* 上电默认IIC通讯地址ַ*/ +}; + + +static void device_detect(VL53L0X_DEV dev, uint8_t iic_addr) +{ + uint16_t module_id = 0; + VL53L0X_Error status; + /** + * 获取设备ID,身份鉴别 + * 另外可以相当于一次通讯验证,IIC是否可以正常通讯 + * */ + status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &module_id); + DBG_PRINTF("VL53L0X ID: %d,status: %d\r\n",module_id,status); + if (module_id != VL53L0X_MODULE_ID) + { + print_log("VL53L0X Detect Failed!\r\n"); + while (1) + { + // 如果通讯失败,就会卡在这个死循环中。 + } + } + /** + * 改变IIC设备地址 + * 如果你想改变IIC设备地址,有多个设备使用时,可用此API + * 上电默认的地址是0x29,可以自己设置IIC地址 + */ + if (iic_addr != dev->I2cDevAddr) + { + VL53L0X_SetDeviceAddress(dev, iic_addr << 1); + dev->I2cDevAddr = iic_addr; + print_log("Change IIC address success! IIC Address: 0x%x\r\n",iic_addr); + }else{ + print_log("Default IIC Address: 0x%x\r\n",iic_addr); + } +} + +/** + * 设备配置:效准和初始化 + * 根据手册在测量前有一系列初始化和效准过程,保证测量精度 + + */ +static void device_init(VL53L0X_DEV dev) +{ + uint8_t vhvsettings; + uint8_t phasecal; + uint32_t refspadcount; + uint8_t isaperturespads; + // 设备初始化 + VL53L0X_DataInit(dev); + // 加载特殊配置 + VL53L0X_StaticInit(dev); + // Spad(单光子雪崩二极管)效准,用来对返射会的IR光进行测量的 + VL53L0X_PerformRefSpadManagement(dev, &refspadcount, &isaperturespads); + /*温度效准*/ + VL53L0X_PerformRefCalibration(dev, &vhvsettings, &phasecal); + /*偏移效准*/ + // VL53L0X_PerformOffsetCalibration(); + /*串扰效准*/ + // VL53L0X_PerformXTalkCalibration(); + + /**设置工作模式 + * 有三种工作模式 + * 单次测量 0 + * 连续测量 1 + * 连续延时测量 3 + */ + VL53L0X_SetDeviceMode(dev, DEMO_DEVICE_MODE); + + /**设置测量时间 + * 默认时间是33ms,最小的时间是20ms + * 这个会涉及到准确率,太快,准确率会有所下降 + * 增加测量时间会提高准确率 + * 测量时间增加到2倍,测量的标准差减少到根号2 + */ + VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev, DEMO_BUDGET_TIME); +} + +/** + */ +void Vl53l0xInit(void) +{ + // uint8_t ret; + // VL53L0X_RangingMeasurementData_t data; + + vl53l0x_hw_reset(); //使能,设置 XSHUT引脚为高电平(低电平表示关闭) + device_detect(&demo_dev, CUSTOM_DEV_IIC_ADDDR); /*首次通讯验证和设备验证*/ + device_init(&demo_dev); /*设备初始化-会设置测试时间(精确相关)和设备工作模式*/ + + print_log("VL53L0X init Succedded!\r\n"); + + // /*开始测量*/ + // VL53L0X_StartMeasurement(&demo_dev); + + // while (1) + // { + // /*检查是否完成一次测量*/ + // do { + // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + // } while (ret != 1); + // /**清除中断 + // * 如果使用中断的方式,通过连接中断引脚进行判断,进入中断后需要清除中断 + // * 这里使用的是轮询的方式,所以可以不需要 + // */ + // // VL53L0X_ClearInterruptMask(&demo_dev, 0); + + // /*获取测量结果*/ + // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + // /*输出测量结果(单位mm)*/ + // DBG_PRINTF("Distance: %dmm\r\n", data.RangeMilliMeter); + // } +} +// 开始测量 +void Vl53l0xStart(void){ + /*开始测量*/ + VL53L0X_StartMeasurement(&demo_dev); + print_log("VL53L0X start ranging!\r\n"); +} +// 停止测量---连续测量模式下 +void Vl53l0xStop(void){ + /*开始测量*/ + VL53L0X_StopMeasurement(&demo_dev); + print_log("VL53L0X stop ranging!\r\n"); +} +// 获取测量结果 单位mm +unsigned short GetDistance(void){ + + uint8_t ret = 0; + VL53L0X_RangingMeasurementData_t data; + /*检查是否完成一次测量*/ + VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + if(ret==1){ + /*获取测量结果*/ + VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + return data.RangeMilliMeter; + } + + return 0; + // do { + // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); + // } while (ret != 1); + // /*获取测量结果*/ + // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); + // return data.RangeMilliMeter; +} + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x_iic.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x_iic.c" new file mode 100644 index 00000000..1eb486f9 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/mine/src/vl53l0x_iic.c" @@ -0,0 +1,139 @@ + + + +#include "vl53l0x_iic.h" + +// static inline void vl53l0x_iic_delay(unsigned int t_us) +// { +// // IIC的延时函数,根据自己的mcu进行替换 +// BASE_FUNC_DELAY_US(t_us); +// } + +void vl53l0x_iic_start(void) +{ + VL53L0X_IIC_SDA(1); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SDA(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); +} + +void vl53l0x_iic_stop(void) +{ + VL53L0X_IIC_SCL(0); + VL53L0X_IIC_SDA(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(1); + VL53L0X_IIC_SDA(1); + vl53l0x_iic_delay(4); +} + +uint8_t vl53l0x_iic_wait_ack(void) +{ + uint8_t waittime = 0; + uint8_t rack = 0; + VL53L0X_SDA_Direction(1); + VL53L0X_IIC_SDA(1); + vl53l0x_iic_delay(1); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(1); + + while (VL53L0X_IIC_READ_SDA()) + { + waittime++; + + if (waittime > 250) + { + VL53L0X_SDA_Direction(0); + vl53l0x_iic_stop(); + return 1; + } + } + VL53L0X_SDA_Direction(0); + VL53L0X_IIC_SCL(0); + + return rack; +} + +void vl53l0x_iic_ack(void) +{ + VL53L0X_IIC_SCL(0); + VL53L0X_IIC_SDA(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); +} + +void vl53l0x_iic_nack(void) +{ + VL53L0X_IIC_SCL(0); + VL53L0X_IIC_SDA(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); +} + +void vl53l0x_iic_send_byte(uint8_t dat) +{ + uint8_t t; + VL53L0X_IIC_SCL(0); + for (t=0; t<8; t++) + { + VL53L0X_IIC_SDA((dat & 0x80) >> 7); + dat <<= 1; + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(0); + vl53l0x_iic_delay(2); + + } + +} + +uint8_t vl53l0x_iic_read_byte(uint8_t ack) +{ + uint8_t i; + uint8_t dat = 0; + VL53L0X_SDA_Direction(1); + for (i = 0; i < 8; i++ ) + { + VL53L0X_IIC_SCL(0); + vl53l0x_iic_delay(2); + VL53L0X_IIC_SCL(1); + dat <<= 1; + + if (VL53L0X_IIC_READ_SDA()) + { + dat++; + } + vl53l0x_iic_delay(2); + } + VL53L0X_SDA_Direction(0); + if (ack == 0) + { + vl53l0x_iic_nack(); + } + else + { + vl53l0x_iic_ack(); + } + + return dat; +} + +/** + * VL53L0X 硬件复位,通过引脚设置关机再开机实现复位 + */ +void vl53l0x_hw_reset(void) +{ + // 复位引脚,考虑要不要接吧 改变引脚电平实现复位,0 到1 复位 + VL53L0X_XSH(0); + vl53l0x_iic_delay(30*1000) ;//延时30ms + VL53L0X_XSH(1); + vl53l0x_iic_delay(30*1000) ; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_i2c_platform.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_i2c_platform.h" new file mode 100644 index 00000000..6c953c78 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_i2c_platform.h" @@ -0,0 +1,409 @@ +/* + * COPYRIGHT (C) STMicroelectronics 2014. All rights reserved. + * + * This software is the confidential and proprietary information of + * STMicroelectronics ("Confidential Information"). You shall not + * disclose such Confidential Information and shall use it only in + * accordance with the terms of the license agreement you entered into + * with STMicroelectronics + * + * Programming Golden Rule: Keep it Simple! + * + */ + +/** + * @file VL53L0X_platform.h + * @brief Function prototype definitions for Ewok Platform layer. + * + */ + + +#ifndef _VL53L0X_I2C_PLATFORM_H_ +#define _VL53L0X_I2C_PLATFORM_H_ + + +// 移植封装 +#include "vl53l0x_iic.h" +// 移植封装 + +#include "vl53l0x_def.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Include uint8_t, unit16_t etc definitions + +#include +#include + + +/** + * @brief Typedef defining .\n + * The developer shoud modify this to suit the platform being deployed. + * + */ + +// enum {TRUE = true, FALSE = false}; + +/** + * @brief Typedef defining 8 bit unsigned char type.\n + * The developer shoud modify this to suit the platform being deployed. + * + */ + +#ifndef bool_t +typedef unsigned char bool_t; +#endif + + +#define I2C 0x01 +#define SPI 0x00 + +#define COMMS_BUFFER_SIZE 64 // MUST be the same size as the SV task buffer + +#define BYTES_PER_WORD 2 +#define BYTES_PER_DWORD 4 + +#define VL53L0X_MAX_STRING_LENGTH_PLT 256 + +/** + * @brief Initialise platform comms. + * + * @param comms_type - selects between I2C and SPI + * @param comms_speed_khz - unsigned short containing the I2C speed in kHz + * + * @return status - status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_comms_initialise(uint8_t comms_type, + uint16_t comms_speed_khz); + +/** + * @brief Close platform comms. + * + * @return status - status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_comms_close(void); + +/** + * @brief Cycle Power to Device + * + * @return status - status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_cycle_power(void); + + +/** + * @brief Writes the supplied byte buffer to the device + * + * Wrapper for SystemVerilog Write Multi task + * + * @code + * + * Example: + * + * uint8_t *spad_enables; + * + * int status = VL53L0X_write_multi(RET_SPAD_EN_0, spad_enables, 36); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint8_t buffer containing the data to be written + * @param count - number of bytes in the supplied byte buffer + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count); + + +/** + * @brief Reads the requested number of bytes from the device + * + * Wrapper for SystemVerilog Read Multi task + * + * @code + * + * Example: + * + * uint8_t buffer[COMMS_BUFFER_SIZE]; + * + * int status = status = VL53L0X_read_multi(DEVICE_ID, buffer, 2) + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to the uint8_t buffer to store read data + * @param count - number of uint8_t's to read + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count); + + +/** + * @brief Writes a single byte to the device + * + * Wrapper for SystemVerilog Write Byte task + * + * @code + * + * Example: + * + * uint8_t page_number = MAIN_SELECT_PAGE; + * + * int status = VL53L0X_write_byte(PAGE_SELECT, page_number); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param data - uint8_t data value to write + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data); + + +/** + * @brief Writes a single word (16-bit unsigned) to the device + * + * Manages the big-endian nature of the device (first byte written is the MS byte). + * Uses SystemVerilog Write Multi task. + * + * @code + * + * Example: + * + * uint16_t nvm_ctrl_pulse_width = 0x0004; + * + * int status = VL53L0X_write_word(NVM_CTRL__PULSE_WIDTH_MSB, nvm_ctrl_pulse_width); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param data - uin16_t data value write + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data); + + +/** + * @brief Writes a single dword (32-bit unsigned) to the device + * + * Manages the big-endian nature of the device (first byte written is the MS byte). + * Uses SystemVerilog Write Multi task. + * + * @code + * + * Example: + * + * uint32_t nvm_data = 0x0004; + * + * int status = VL53L0X_write_dword(NVM_CTRL__DATAIN_MMM, nvm_data); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param data - uint32_t data value to write + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_write_dword(uint8_t address, uint8_t index, uint32_t data); + + + +/** + * @brief Reads a single byte from the device + * + * Uses SystemVerilog Read Byte task. + * + * @code + * + * Example: + * + * uint8_t device_status = 0; + * + * int status = VL53L0X_read_byte(STATUS, &device_status); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint8_t data value + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata); + + +/** + * @brief Reads a single word (16-bit unsigned) from the device + * + * Manages the big-endian nature of the device (first byte read is the MS byte). + * Uses SystemVerilog Read Multi task. + * + * @code + * + * Example: + * + * uint16_t timeout = 0; + * + * int status = VL53L0X_read_word(TIMEOUT_OVERALL_PERIODS_MSB, &timeout); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint16_t data value + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata); + + +/** + * @brief Reads a single dword (32-bit unsigned) from the device + * + * Manages the big-endian nature of the device (first byte read is the MS byte). + * Uses SystemVerilog Read Multi task. + * + * @code + * + * Example: + * + * uint32_t range_1 = 0; + * + * int status = VL53L0X_read_dword(RANGE_1_MMM, &range_1); + * + * @endcode + * + * @param address - uint8_t device address value + * @param index - uint8_t register index value + * @param pdata - pointer to uint32_t data value + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata); + + +/** + * @brief Implements a programmable wait in us + * + * Wrapper for SystemVerilog Wait in micro seconds task + * + * @param wait_us - integer wait in micro seconds + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_platform_wait_us(int32_t wait_us); + + +/** + * @brief Implements a programmable wait in ms + * + * Wrapper for SystemVerilog Wait in milli seconds task + * + * @param wait_ms - integer wait in milli seconds + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_wait_ms(int32_t wait_ms); + + +/** + * @brief Set GPIO value + * + * @param level - input level - either 0 or 1 + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_set_gpio(uint8_t level); + + +/** + * @brief Get GPIO value + * + * @param plevel - uint8_t pointer to store GPIO level (0 or 1) + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_get_gpio(uint8_t *plevel); + +/** + * @brief Release force on GPIO + * + * @return status - SystemVerilog status 0 = ok, 1 = error + * + */ + +int32_t VL53L0X_release_gpio(void); + + +/** +* @brief Get the frequency of the timer used for ranging results time stamps +* +* @param[out] ptimer_freq_hz : pointer for timer frequency +* +* @return status : 0 = ok, 1 = error +* +*/ + +int32_t VL53L0X_get_timer_frequency(int32_t *ptimer_freq_hz); + +/** +* @brief Get the timer value in units of timer_freq_hz (see VL53L0X_get_timestamp_frequency()) +* +* @param[out] ptimer_count : pointer for timer count value +* +* @return status : 0 = ok, 1 = error +* +*/ + +int32_t VL53L0X_get_timer_value(int32_t *ptimer_count); + + + + + +#ifdef __cplusplus +} +#endif + +#endif //_VL53L0X_I2C_PLATFORM_H_ + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform.h" new file mode 100644 index 00000000..a6811fb6 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform.h" @@ -0,0 +1,245 @@ +/******************************************************************************* +Copyright � 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +********************************************************************************/ + + +#ifndef _VL53L0X_PLATFORM_H_ +#define _VL53L0X_PLATFORM_H_ + + + + + +#include "vl53l0x_def.h" +#include "vl53l0x_platform_log.h" +#include "vl53l0x_i2c_platform.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file vl53l0x_platform.h + * + * @brief All end user OS/platform/application porting + */ + +/** + * @defgroup VL53L0X_platform_group VL53L0X Platform Functions + * @brief VL53L0X Platform Functions + * @{ + */ + +/** + * @struct VL53L0X_Dev_t + * @brief Generic PAL device type that does link between API and platform abstraction layer + * + */ +typedef struct { + VL53L0X_DevData_t Data; /*!< embed ST Ewok Dev data as "Data"*/ + + /*!< user specific field */ + uint8_t I2cDevAddr; /*!< i2c device address user specific field */ + uint8_t comms_type; /*!< Type of comms : VL53L0X_COMMS_I2C or VL53L0X_COMMS_SPI */ + uint16_t comms_speed_khz; /*!< Comms speed [kHz] : typically 400kHz for I2C */ + +} VL53L0X_Dev_t; + + +/** + * @brief Declare the device Handle as a pointer of the structure @a VL53L0X_Dev_t. + * + */ +typedef VL53L0X_Dev_t* VL53L0X_DEV; + +/** + * @def PALDevDataGet + * @brief Get ST private structure @a VL53L0X_DevData_t data access + * + * @param Dev Device Handle + * @param field ST structure field name + * It maybe used and as real data "ref" not just as "get" for sub-structure item + * like PALDevDataGet(FilterData.field)[i] or PALDevDataGet(FilterData.MeasurementIndex)++ + */ +#define PALDevDataGet(Dev, field) (Dev->Data.field) + +/** + * @def PALDevDataSet(Dev, field, data) + * @brief Set ST private structure @a VL53L0X_DevData_t data field + * @param Dev Device Handle + * @param field ST structure field name + * @param data Data to be set + */ +#define PALDevDataSet(Dev, field, data) (Dev->Data.field)=(data) + + +/** + * @defgroup VL53L0X_registerAccess_group PAL Register Access Functions + * @brief PAL Register Access Functions + * @{ + */ + +/** + * Lock comms interface to serialize all commands to a shared I2C interface for a specific device + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev); + +/** + * Unlock comms interface to serialize all commands to a shared I2C interface for a specific device + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev); + + +/** + * Writes the supplied byte buffer to the device + * @param Dev Device Handle + * @param index The register index + * @param pdata Pointer to uint8_t buffer containing the data to be written + * @param count Number of bytes in the supplied byte buffer + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count); + +/** + * Reads the requested number of bytes from the device + * @param Dev Device Handle + * @param index The register index + * @param pdata Pointer to the uint8_t buffer to store read data + * @param count Number of uint8_t's to read + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count); + +/** + * Write single byte register + * @param Dev Device Handle + * @param index The register index + * @param data 8 bit register data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data); + +/** + * Write word register + * @param Dev Device Handle + * @param index The register index + * @param data 16 bit register data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data); + +/** + * Write double word (4 byte) register + * @param Dev Device Handle + * @param index The register index + * @param data 32 bit register data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data); + +/** + * Read single byte register + * @param Dev Device Handle + * @param index The register index + * @param data pointer to 8 bit data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data); + +/** + * Read word (2byte) register + * @param Dev Device Handle + * @param index The register index + * @param data pointer to 16 bit data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data); + +/** + * Read dword (4byte) register + * @param Dev Device Handle + * @param index The register index + * @param data pointer to 32 bit data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data); + +/** + * Threat safe Update (read/modify/write) single byte register + * + * Final_reg = (Initial_reg & and_data) |or_data + * + * @param Dev Device Handle + * @param index The register index + * @param AndData 8 bit and data + * @param OrData 8 bit or data + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData); + +/** @} end of VL53L0X_registerAccess_group */ + + +/** + * @brief execute delay in all polling API call + * + * A typical multi-thread or RTOs implementation is to sleep the task for some 5ms (with 100Hz max rate faster polling is not needed) + * if nothing specific is need you can define it as an empty/void macro + * @code + * #define VL53L0X_PollingDelay(...) (void)0 + * @endcode + * @param Dev Device Handle + * @return VL53L0X_ERROR_NONE Success + * @return "Other error code" See ::VL53L0X_Error + */ +VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev); /* usually best implemented as a real function */ + +/** @} end of VL53L0X_platform_group */ + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_PLATFORM_H_ */ + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform_log.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform_log.h" new file mode 100644 index 00000000..33895778 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_platform_log.h" @@ -0,0 +1,118 @@ +/******************************************************************************* +Copyright 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +********************************************************************************/ + + +#ifndef _VL53L0X_PLATFORM_LOG_H_ +#define _VL53L0X_PLATFORM_LOG_H_ + +#include +#include +/* LOG Functions */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file vl53l0x_platform_log.h + * + * @brief platform log function definition + */ + +//#define VL53L0X_LOG_ENABLE 0 + +enum { + TRACE_LEVEL_NONE, + TRACE_LEVEL_ERRORS, + TRACE_LEVEL_WARNING, + TRACE_LEVEL_INFO, + TRACE_LEVEL_DEBUG, + TRACE_LEVEL_ALL, + TRACE_LEVEL_IGNORE +}; + +enum { + TRACE_FUNCTION_NONE = 0, + TRACE_FUNCTION_I2C = 1, + TRACE_FUNCTION_ALL = 0x7fffffff //all bits except sign +}; + +enum { + TRACE_MODULE_NONE = 0x0, + TRACE_MODULE_API = 0x1, + TRACE_MODULE_PLATFORM = 0x2, + TRACE_MODULE_ALL = 0x7fffffff //all bits except sign +}; + + +#ifdef VL53L0X_LOG_ENABLE + +#include + +extern uint32_t _trace_level; + + + +int32_t VL53L0X_trace_config(char *filename, uint32_t modules, uint32_t level, uint32_t functions); + +void trace_print_module_function(uint32_t module, uint32_t level, uint32_t function, const char *format, ...); + + +//extern FILE * log_file; + +#define LOG_GET_TIME() (int)clock() + +#define _LOG_FUNCTION_START(module, fmt, ... ) \ + trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s "fmt"\n", LOG_GET_TIME(), __FUNCTION__, ##__VA_ARGS__); + +#define _LOG_FUNCTION_END(module, status, ... )\ + trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s %d\n", LOG_GET_TIME(), __FUNCTION__, (int)status, ##__VA_ARGS__) + +#define _LOG_FUNCTION_END_FMT(module, status, fmt, ... )\ + trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s %d "fmt"\n", LOG_GET_TIME(), __FUNCTION__, (int)status,##__VA_ARGS__) + +// __func__ is gcc only +//#define VL53L0X_ErrLog( fmt, ...) fprintf(stderr, "VL53L0X_ErrLog %s" fmt "\n", __func__, ##__VA_ARGS__) + +#else /* VL53L0X_LOG_ENABLE no logging */ + #define VL53L0X_ErrLog(...) (void)0 + #define _LOG_FUNCTION_START(module, fmt, ... ) (void)0 + #define _LOG_FUNCTION_END(module, status, ... ) (void)0 + #define _LOG_FUNCTION_END_FMT(module, status, fmt, ... ) (void)0 +#endif /* else */ + +#define VL53L0X_COPYSTRING(str, ...) strcpy(str, ##__VA_ARGS__) + +#ifdef __cplusplus +} +#endif + +#endif /* _VL53L0X_PLATFORM_LOG_H_ */ + + + diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_types.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_types.h" new file mode 100644 index 00000000..2f8adc98 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/inc/vl53l0x_types.h" @@ -0,0 +1,111 @@ +/******************************************************************************* +Copyright 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 vl53l0x_types.h + * @brief VL53L0X types definition + */ + +#ifndef VL53L0X_TYPES_H_ +#define VL53L0X_TYPES_H_ + +/** @defgroup porting_type Basic type definition + * @ingroup VL53L0X_platform_group + * + * @brief file vl53l0x_types.h files hold basic type definition that may requires porting + * + * contains type that must be defined for the platform\n + * when target platform and compiler provide stdint.h and stddef.h it is enough to include it.\n + * If stdint.h is not available review and adapt all signed and unsigned 8/16/32 bits basic types. \n + * If stddef.h is not available review and adapt NULL definition . + */ +#include +#include + +#ifndef NULL +#error "Error NULL definition should be done. Please add required include " +#endif + + +#if ! defined(STDINT_H) && !defined(_GCC_STDINT_H) &&!defined(__STDINT_DECLS) && !defined(_GCC_WRAP_STDINT_H) + + #pragma message("Please review type definition of STDINT define for your platform and add to list above ") + + /* + * target platform do not provide stdint or use a different #define than above + * to avoid seeing the message below addapt the #define list above or implement + * all type and delete these pragma + */ + +/** \ingroup VL53L0X_portingType_group + * @{ + */ + + +typedef unsigned long long uint64_t; + + +/** @brief Typedef defining 32 bit unsigned int type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef unsigned int uint32_t; + +/** @brief Typedef defining 32 bit int type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef int int32_t; + +/** @brief Typedef defining 16 bit unsigned short type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef unsigned short uint16_t; + +/** @brief Typedef defining 16 bit short type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef short int16_t; + +/** @brief Typedef defining 8 bit unsigned char type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef unsigned char uint8_t; + +/** @brief Typedef defining 8 bit char type.\n + * The developer should modify this to suit the platform being deployed. + */ +typedef signed char int8_t; + +/** @} */ +#endif /* _STDINT_H */ + + +/** use where fractional values are expected + * + * Given a floating point value f it's .16 bit point is (int)(f*(1<<16))*/ +typedef uint32_t FixPoint1616_t; + +#endif /* VL53L0X_TYPES_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_i2c_platform.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_i2c_platform.c" new file mode 100644 index 00000000..c056e6f5 --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_i2c_platform.c" @@ -0,0 +1,307 @@ +/* + * COPYRIGHT (C) STMicroelectronics 2015. All rights reserved. + * + * This software is the confidential and proprietary information of + * STMicroelectronics ("Confidential Information"). You shall not + * disclose such Confidential Information and shall use it only in + * accordance with the terms of the license agreement you entered into + * with STMicroelectronics + * + * Programming Golden Rule: Keep it Simple! + * + */ + +/*! + * \file VL53L0X_platform.c + * \brief Code function defintions for Ewok Platform Layer + * + */ + +#include "clock.h" +#include "debug.h" +// #include +#include // sprintf(), vsnprintf(), printf() + +#ifdef _MSC_VER +#define snprintf _snprintf +#endif + +#include "vl53l0x_i2c_platform.h" +#include "vl53l0x_def.h" + +// #include "ranging_sensor_comms.h" +// #include "comms_platform.h" + +#include "vl53l0x_platform_log.h" + +#ifdef VL53L0X_LOG_ENABLE +#define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_PLATFORM, level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) +#define trace_i2c(...) trace_print_module_function(TRACE_MODULE_NONE, TRACE_LEVEL_NONE, TRACE_FUNCTION_I2C, ##__VA_ARGS__) +#endif + + + +char debug_string[VL53L0X_MAX_STRING_LENGTH_PLT]; + + +#define MIN_COMMS_VERSION_MAJOR 1 +#define MIN_COMMS_VERSION_MINOR 8 +#define MIN_COMMS_VERSION_BUILD 1 +#define MIN_COMMS_VERSION_REVISION 0 + +#define STATUS_OK 0x00 +#define STATUS_FAIL 0x01 + +// bool_t _check_min_version(void) +// { + +// } + +// int32_t VL53L0X_comms_initialise(uint8_t comms_type, uint16_t comms_speed_khz) +// { + + +// return STATUS_OK; +// } + +// int32_t VL53L0X_comms_close(void) +// { +// int32_t status = STATUS_OK; + +// return status; +// } + +int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count) +{ + int32_t status = STATUS_OK; + + int32_t i; + + vl53l0x_iic_start(); + vl53l0x_iic_send_byte((address << 1) | 0); + if (vl53l0x_iic_wait_ack() == 1) + { + vl53l0x_iic_stop(); + return STATUS_FAIL; + } + vl53l0x_iic_send_byte(index); + if (vl53l0x_iic_wait_ack() == 1) + { + vl53l0x_iic_stop(); + return STATUS_FAIL; + } + for (i=0; i 1) ? 1 : 0); + count--; + pdata++; + } + vl53l0x_iic_stop(); + + + return status; +} + + +int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data) +{ + int32_t status = STATUS_OK; + const int32_t cbyte_count = 1; + + status = VL53L0X_write_multi(address, index, &data, cbyte_count); + + return status; + +} + + +int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data) +{ + int32_t status = STATUS_OK; + + uint8_t buffer[BYTES_PER_WORD]; + + // Split 16-bit word into MS and LS uint8_t + buffer[0] = (uint8_t)(data >> 8); + buffer[1] = (uint8_t)(data & 0x00FF); + + status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_WORD); + + return status; + +} + + +int32_t VL53L0X_write_dword(uint8_t address, uint8_t index, uint32_t data) +{ + int32_t status = STATUS_OK; + uint8_t buffer[BYTES_PER_DWORD]; + + // Split 32-bit word into MS ... LS bytes + buffer[0] = (uint8_t) (data >> 24); + buffer[1] = (uint8_t)((data & 0x00FF0000) >> 16); + buffer[2] = (uint8_t)((data & 0x0000FF00) >> 8); + buffer[3] = (uint8_t) (data & 0x000000FF); + + status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_DWORD); + + return status; + +} + + +int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata) +{ + int32_t status = STATUS_OK; + int32_t cbyte_count = 1; + + status = VL53L0X_read_multi(address, index, pdata, cbyte_count); + + return status; + +} + + +int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata) +{ + int32_t status = STATUS_OK; + uint8_t buffer[BYTES_PER_WORD] = {0}; + + status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_WORD); + // DBG_PRINTF("status: %d\r\n",status); + *pdata = ((uint16_t)buffer[0]<<8) + (uint16_t)buffer[1]; + + return status; + +} + +int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata) +{ + int32_t status = STATUS_OK; + uint8_t buffer[BYTES_PER_DWORD]; + + status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_DWORD); + *pdata = ((uint32_t)buffer[0]<<24) + ((uint32_t)buffer[1]<<16) + ((uint32_t)buffer[2]<<8) + (uint32_t)buffer[3]; + + return status; + +} + +int32_t VL53L0X_platform_wait_us(int32_t wait_us) +{ + int32_t status = STATUS_OK; + float wait_ms = (float)wait_us/1000.0f; + + BASE_FUNC_DELAY_US(wait_us); + +#ifdef VL53L0X_LOG_ENABLE + trace_i2c("Wait us : %6d\n", wait_us); +#endif + + return status; + +} + + +int32_t VL53L0X_wait_ms(int32_t wait_ms) +{ + int32_t status = STATUS_OK; + + BASE_FUNC_DELAY_MS(wait_ms); + + +#ifdef VL53L0X_LOG_ENABLE + trace_i2c("Wait ms : %6d\n", wait_ms); +#endif + + return status; + +} + + +// int32_t VL53L0X_set_gpio(uint8_t level) +// { +// int32_t status = STATUS_OK; +// //status = VL53L0X_set_gpio_sv(level); +// #ifdef VL53L0X_LOG_ENABLE +// trace_i2c("// Set GPIO = %d;\n", level); +// #endif + +// return status; + +// } + + +// int32_t VL53L0X_get_gpio(uint8_t *plevel) +// { +// int32_t status = STATUS_OK; + +// return status; +// } + + +// int32_t VL53L0X_release_gpio(void) +// { +// int32_t status = STATUS_OK; + +// } + +// int32_t VL53L0X_cycle_power(void) +// { +// int32_t status = STATUS_OK; + +// return status; +// } + + +// int32_t VL53L0X_get_timer_frequency(int32_t *ptimer_freq_hz) +// { +// *ptimer_freq_hz = 0; +// return STATUS_FAIL; +// } + + +// int32_t VL53L0X_get_timer_value(int32_t *ptimer_count) +// { +// *ptimer_count = 0; +// return STATUS_FAIL; +// } diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_platform.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_platform.c" new file mode 100644 index 00000000..2236329a --- /dev/null +++ "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/vl53l0x/platform/src/vl53l0x_platform.c" @@ -0,0 +1,275 @@ +/******************************************************************************* +Copyright � 2015, STMicroelectronics International N.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of STMicroelectronics nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND +NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. +IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(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 VL53L0X_i2c.c + * + * Copyright (C) 2014 ST MicroElectronics + * + * provide variable word size byte/Word/dword VL6180x register access via i2c + * + */ +#include "vl53l0x_platform.h" +// #include "vl53l0x_i2c_platform.h" +#include "vl53l0x_api.h" +// #include + +#define LOG_FUNCTION_START(fmt, ... ) _LOG_FUNCTION_START(TRACE_MODULE_PLATFORM, fmt, ##__VA_ARGS__) +#define LOG_FUNCTION_END(status, ... ) _LOG_FUNCTION_END(TRACE_MODULE_PLATFORM, status, ##__VA_ARGS__) +#define LOG_FUNCTION_END_FMT(status, fmt, ... ) _LOG_FUNCTION_END_FMT(TRACE_MODULE_PLATFORM, status, fmt, ##__VA_ARGS__) + +/** + * @def I2C_BUFFER_CONFIG + * + * @brief Configure Device register I2C access + * + * @li 0 : one GLOBAL buffer \n + * Use one global buffer of MAX_I2C_XFER_SIZE byte in data space \n + * This solution is not multi-Device compliant nor multi-thread cpu safe \n + * It can be the best option for small 8/16 bit MCU without stack and limited ram (STM8s, 80C51 ...) + * + * @li 1 : ON_STACK/local \n + * Use local variable (on stack) buffer \n + * This solution is multi-thread with use of i2c resource lock or mutex see VL6180x_GetI2CAccess() \n + * + * @li 2 : User defined \n + * Per Device potentially dynamic allocated. Requires VL6180x_GetI2cBuffer() to be implemented. + * @ingroup Configuration + */ +#define I2C_BUFFER_CONFIG 1 +/** Maximum buffer size to be used in i2c */ +#define VL53L0X_MAX_I2C_XFER_SIZE 64 /* Maximum buffer size to be used in i2c */ + +#if I2C_BUFFER_CONFIG == 0 + /* GLOBAL config buffer */ + uint8_t i2c_global_buffer[VL53L0X_MAX_I2C_XFER_SIZE]; + + #define DECL_I2C_BUFFER + #define VL53L0X_GetLocalBuffer(Dev, n_byte) i2c_global_buffer + +#elif I2C_BUFFER_CONFIG == 1 + /* ON STACK */ + #define DECL_I2C_BUFFER uint8_t LocBuffer[VL53L0X_MAX_I2C_XFER_SIZE]; + #define VL53L0X_GetLocalBuffer(Dev, n_byte) LocBuffer +#elif I2C_BUFFER_CONFIG == 2 + /* user define buffer type declare DECL_I2C_BUFFER as access via VL53L0X_GetLocalBuffer */ + #define DECL_I2C_BUFFER +#else +#error "invalid I2C_BUFFER_CONFIG " +#endif + + +#define VL53L0X_I2C_USER_VAR /* none but could be for a flag var to get/pass to mutex interruptible return flags and try again */ +#define VL53L0X_GetI2CAccess(Dev) /* todo mutex acquire */ +#define VL53L0X_DoneI2CAcces(Dev) /* todo mutex release */ + + +VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + return Status; +} + +VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + + return Status; +} + +// the ranging_sensor_comms.dll will take care of the page selection +VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ + + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int = 0; + uint8_t deviceAddress; + + if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_multi(deviceAddress, index, pdata, count); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +// the ranging_sensor_comms.dll will take care of the page selection +VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ + VL53L0X_I2C_USER_VAR + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ + Status = VL53L0X_ERROR_INVALID_PARAMS; + } + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_multi(deviceAddress, index, pdata, count); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + + +VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_byte(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_word(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_write_dword(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + uint8_t data; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_byte(deviceAddress, index, &data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + if (Status == VL53L0X_ERROR_NONE) { + data = (data & AndData) | OrData; + status_int = VL53L0X_write_byte(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + } + + return Status; +} + +VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_byte(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_word(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data){ + VL53L0X_Error Status = VL53L0X_ERROR_NONE; + int32_t status_int; + uint8_t deviceAddress; + + deviceAddress = Dev->I2cDevAddr; + + status_int = VL53L0X_read_dword(deviceAddress, index, data); + + if (status_int != 0) + Status = VL53L0X_ERROR_CONTROL_INTERFACE; + + return Status; +} + +#define VL53L0X_POLLINGDELAY_LOOPNB 250 +VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev){ + VL53L0X_Error status = VL53L0X_ERROR_NONE; + // LOG_FUNCTION_START(""); + + // const DWORD cTimeout_ms = 1; + // HANDLE hEvent = CreateEvent(0, TRUE, FALSE, 0); + // if(hEvent != NULL) + // { + // WaitForSingleObject(hEvent,cTimeout_ms); + // } + + // LOG_FUNCTION_END(status); + return status; +} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/other/PCB\350\256\276\350\256\241.png" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/other/PCB\350\256\276\350\256\241.png" new file mode 100644 index 0000000000000000000000000000000000000000..9a538db360d2f073af408387f34eedd4fa8adf3c GIT binary patch literal 20960 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/other/\345\237\272\344\272\216Hi3061M\347\232\204\346\231\272\350\203\275\350\257\255\351\237\263\345\212\251\346\211\213.xmind" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/other/\345\237\272\344\272\216Hi3061M\347\232\204\346\231\272\350\203\275\350\257\255\351\237\263\345\212\251\346\211\213.xmind" new file mode 100644 index 0000000000000000000000000000000000000000..09443985dbd9a04a3355a13528251813dbf2d3fa GIT binary patch literal 179420 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 Date: Thu, 14 Nov 2024 11:02:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?15-ns=5Fice-=E6=99=BA=E8=83=BD=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ice <2395438495@qq.com> --- .../user/BSP/core/inc/vl53l0x_api.h" | 1926 ---------- .../BSP/core/inc/vl53l0x_api_calibration.h" | 85 - .../user/BSP/core/inc/vl53l0x_api_core.h" | 113 - .../user/BSP/core/inc/vl53l0x_api_ranging.h" | 47 - .../user/BSP/core/inc/vl53l0x_api_strings.h" | 278 -- .../user/BSP/core/inc/vl53l0x_def.h" | 663 ---- .../user/BSP/core/inc/vl53l0x_device.h" | 262 -- .../vl53l0x_interrupt_threshold_settings.h" | 194 - .../user/BSP/core/inc/vl53l0x_tuning.h" | 146 - .../user/BSP/core/src/vl53l0x_api.c" | 3142 ----------------- .../BSP/core/src/vl53l0x_api_calibration.c" | 1288 ------- .../user/BSP/core/src/vl53l0x_api_core.c" | 2128 ----------- .../user/BSP/core/src/vl53l0x_api_ranging.c" | 42 - .../user/BSP/core/src/vl53l0x_api_strings.c" | 466 --- .../user/BSP/mine/inc/vl53l0x.h" | 16 - .../user/BSP/mine/inc/vl53l0x_iic.h" | 66 - .../user/BSP/mine/src/vl53l0x.c" | 159 - .../user/BSP/mine/src/vl53l0x_iic.c" | 139 - .../BSP/platform/inc/vl53l0x_i2c_platform.h" | 409 --- .../user/BSP/platform/inc/vl53l0x_platform.h" | 245 -- .../BSP/platform/inc/vl53l0x_platform_log.h" | 118 - .../user/BSP/platform/inc/vl53l0x_types.h" | 111 - .../BSP/platform/src/vl53l0x_i2c_platform.c" | 307 -- .../user/BSP/platform/src/vl53l0x_platform.c" | 275 -- 24 files changed, 12625 deletions(-) delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" delete mode 100644 "vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" deleted file mode 100644 index 0521690a..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api.h" +++ /dev/null @@ -1,1926 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND - NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. - IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -#ifndef _VL53L0X_API_H_ -#define _VL53L0X_API_H_ - -#include "vl53l0x_api_strings.h" -#include "vl53l0x_def.h" -#include "vl53l0x_platform.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifdef _MSC_VER -# ifdef VL53L0X_API_EXPORTS -# define VL53L0X_API __declspec(dllexport) -# else -# define VL53L0X_API -# endif -#else -# define VL53L0X_API -#endif - -/** @defgroup VL53L0X_cut11_group VL53L0X cut1.1 Function Definition - * @brief VL53L0X cut1.1 Function Definition - * @{ - */ - -/** @defgroup VL53L0X_general_group VL53L0X General Functions - * @brief General functions and definitions - * @{ - */ - -/** - * @brief Return the VL53L0X PAL Implementation Version - * - * @note This function doesn't access to the device - * - * @param pVersion Pointer to current PAL Implementation Version - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion); - -/** - * @brief Return the PAL Specification Version used for the current - * implementation. - * - * @note This function doesn't access to the device - * - * @param pPalSpecVersion Pointer to current PAL Specification Version - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetPalSpecVersion( - VL53L0X_Version_t *pPalSpecVersion); - -/** - * @brief Reads the Product Revision for a for given Device - * This function can be used to distinguish cut1.0 from cut1.1. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pProductRevisionMajor Pointer to Product Revision Major - * for a given Device - * @param pProductRevisionMinor Pointer to Product Revision Minor - * for a given Device - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev, - uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor); - -/** - * @brief Reads the Device information for given Device - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pVL53L0X_DeviceInfo Pointer to current device info for a given - * Device - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev, - VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo); - -/** - * @brief Read current status of the error register for the selected device - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pDeviceErrorStatus Pointer to current error code of the device - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev, - VL53L0X_DeviceError * pDeviceErrorStatus); - -/** - * @brief Human readable Range Status string for a given RangeStatus - * - * @note This function doesn't access to the device - * - * @param RangeStatus The RangeStatus code as stored on - * @a VL53L0X_RangingMeasurementData_t - * @param pRangeStatusString The returned RangeStatus string. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus, - char *pRangeStatusString); - -/** - * @brief Human readable error string for a given Error Code - * - * @note This function doesn't access to the device - * - * @param ErrorCode The error code as stored on ::VL53L0X_DeviceError - * @param pDeviceErrorString The error string corresponding to the ErrorCode - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceErrorString( - VL53L0X_DeviceError ErrorCode, char *pDeviceErrorString); - -/** - * @brief Human readable error string for current PAL error status - * - * @note This function doesn't access to the device - * - * @param PalErrorCode The error code as stored on @a VL53L0X_Error - * @param pPalErrorString The error string corresponding to the - * PalErrorCode - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode, - char *pPalErrorString); - -/** - * @brief Human readable PAL State string - * - * @note This function doesn't access to the device - * - * @param PalStateCode The State code as stored on @a VL53L0X_State - * @param pPalStateString The State string corresponding to the - * PalStateCode - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode, - char *pPalStateString); - -/** - * @brief Reads the internal state of the PAL for a given Device - * - * @note This function doesn't access to the device - * - * @param Dev Device Handle - * @param pPalState Pointer to current state of the PAL for a - * given Device - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, - VL53L0X_State * pPalState); - -/** - * @brief Set the power mode for a given Device - * The power mode can be Standby or Idle. Different level of both Standby and - * Idle can exists. - * This function should not be used when device is in Ranging state. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param PowerMode The value of the power mode to set. - * see ::VL53L0X_PowerModes - * Valid values are: - * VL53L0X_POWERMODE_STANDBY_LEVEL1, - * VL53L0X_POWERMODE_IDLE_LEVEL1 - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when PowerMode - * is not in the supported list - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, - VL53L0X_PowerModes PowerMode); - -/** - * @brief Get the power mode for a given Device - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pPowerMode Pointer to the current value of the power - * mode. see ::VL53L0X_PowerModes - * Valid values are: - * VL53L0X_POWERMODE_STANDBY_LEVEL1, - * VL53L0X_POWERMODE_IDLE_LEVEL1 - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, - VL53L0X_PowerModes * pPowerMode); - -/** - * Set or over-hide part to part calibration offset - * \sa VL53L0X_DataInit() VL53L0X_GetOffsetCalibrationDataMicroMeter() - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param OffsetCalibrationDataMicroMeter Offset (microns) - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter( - VL53L0X_DEV Dev, int32_t OffsetCalibrationDataMicroMeter); - -/** - * @brief Get part to part calibration offset - * - * @par Function Description - * Should only be used after a successful call to @a VL53L0X_DataInit to backup - * device NVM value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pOffsetCalibrationDataMicroMeter Return part to part - * calibration offset from device (microns) - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter( - VL53L0X_DEV Dev, int32_t *pOffsetCalibrationDataMicroMeter); - -/** - * Set the linearity corrective gain - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param LinearityCorrectiveGain Linearity corrective - * gain in x1000 - * if value is 1000 then no modification is applied. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev, - int16_t LinearityCorrectiveGain); - -/** - * @brief Get the linearity corrective gain - * - * @par Function Description - * Should only be used after a successful call to @a VL53L0X_DataInit to backup - * device NVM value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pLinearityCorrectiveGain Pointer to the linearity - * corrective gain in x1000 - * if value is 1000 then no modification is applied. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev, - uint16_t *pLinearityCorrectiveGain); - -/** - * Set Group parameter Hold state - * - * @par Function Description - * Set or remove device internal group parameter hold - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @param GroupParamHold Group parameter Hold state to be set (on/off) - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, - uint8_t GroupParamHold); - -/** - * @brief Get the maximal distance for actual setup - * @par Function Description - * Device must be initialized through @a VL53L0X_SetParameters() prior calling - * this function. - * - * Any range value more than the value returned is to be considered as - * "no target detected" or - * "no target in detectable range"\n - * @warning The maximal distance depends on the setup - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @param pUpperLimitMilliMeter The maximal range limit for actual setup - * (in millimeter) - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, - uint16_t *pUpperLimitMilliMeter); - - -/** - * @brief Get the Total Signal Rate - * @par Function Description - * This function will return the Total Signal Rate after a good ranging is done. - * - * @note This function access to Device - * - * @param Dev Device Handle - * @param pTotalSignalRate Total Signal Rate value in Mega count per second - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev, - FixPoint1616_t *pTotalSignalRate); - -/** @} VL53L0X_general_group */ - -/** @defgroup VL53L0X_init_group VL53L0X Init Functions - * @brief VL53L0X Init Functions - * @{ - */ - -/** - * @brief Set new device address - * - * After completion the device will answer to the new address programmed. - * This function should be called when several devices are used in parallel - * before start programming the sensor. - * When a single device us used, there is no need to call this function. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param DeviceAddress The new Device address - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, - uint8_t DeviceAddress); - -/** - * - * @brief One time device initialization - * - * To be called once and only once after device is brought out of reset - * (Chip enable) and booted see @a VL53L0X_WaitDeviceBooted() - * - * @par Function Description - * When not used after a fresh device "power up" or reset, it may return - * @a #VL53L0X_ERROR_CALIBRATION_WARNING meaning wrong calibration data - * may have been fetched from device that can result in ranging offset error\n - * If application cannot execute device reset or need to run VL53L0X_DataInit - * multiple time then it must ensure proper offset calibration saving and - * restore on its own by using @a VL53L0X_GetOffsetCalibrationData() on first - * power up and then @a VL53L0X_SetOffsetCalibrationData() in all subsequent - * init. - * This function will change the VL53L0X_State from VL53L0X_STATE_POWERDOWN to - * VL53L0X_STATE_WAIT_STATICINIT. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev); - -/** - * @brief Set the tuning settings pointer - * - * This function is used to specify the Tuning settings buffer to be used - * for a given device. The buffer contains all the necessary data to permit - * the API to write tuning settings. - * This function permit to force the usage of either external or internal - * tuning settings. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pTuningSettingBuffer Pointer to tuning settings buffer. - * @param UseInternalTuningSettings Use internal tuning settings value. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev, - uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings); - -/** - * @brief Get the tuning settings pointer and the internal external switch - * value. - * - * This function is used to get the Tuning settings buffer pointer and the - * value. - * of the switch to select either external or internal tuning settings. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param ppTuningSettingBuffer Pointer to tuning settings buffer. - * @param pUseInternalTuningSettings Pointer to store Use internal tuning - * settings value. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev, - uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings); - -/** - * @brief Do basic device init (and eventually patch loading) - * This function will change the VL53L0X_State from - * VL53L0X_STATE_WAIT_STATICINIT to VL53L0X_STATE_IDLE. - * In this stage all default setting will be applied. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev); - -/** - * @brief Wait for device booted after chip enable (hardware standby) - * This function can be run only when VL53L0X_State is VL53L0X_STATE_POWERDOWN. - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - * - */ -VL53L0X_API VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev); - -/** - * @brief Do an hard reset or soft reset (depending on implementation) of the - * device \nAfter call of this function, device must be in same state as right - * after a power-up sequence.This function will change the VL53L0X_State to - * VL53L0X_STATE_POWERDOWN. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev); - -/** @} VL53L0X_init_group */ - -/** @defgroup VL53L0X_parameters_group VL53L0X Parameters Functions - * @brief Functions used to prepare and setup the device - * @{ - */ - -/** - * @brief Prepare device for operation - * @par Function Description - * Update device with provided parameters - * @li Then start ranging operation. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pDeviceParameters Pointer to store current device parameters. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev, - const VL53L0X_DeviceParameters_t *pDeviceParameters); - -/** - * @brief Retrieve current device parameters - * @par Function Description - * Get actual parameters of the device - * @li Then start ranging operation. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pDeviceParameters Pointer to store current device parameters. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, - VL53L0X_DeviceParameters_t *pDeviceParameters); - -/** - * @brief Set a new device mode - * @par Function Description - * Set device to a new mode (ranging, histogram ...) - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param DeviceMode New device mode to apply - * Valid values are: - * VL53L0X_DEVICEMODE_SINGLE_RANGING - * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING - * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING - * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM - * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY - * VL53L0X_HISTOGRAMMODE_RETURN_ONLY - * VL53L0X_HISTOGRAMMODE_BOTH - * - * - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when DeviceMode - * is not in the supported list - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, - VL53L0X_DeviceModes DeviceMode); - -/** - * @brief Get current new device mode - * @par Function Description - * Get actual mode of the device(ranging, histogram ...) - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param pDeviceMode Pointer to current apply mode value - * Valid values are: - * VL53L0X_DEVICEMODE_SINGLE_RANGING - * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING - * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING - * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM - * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY - * VL53L0X_HISTOGRAMMODE_RETURN_ONLY - * VL53L0X_HISTOGRAMMODE_BOTH - * - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when - * DeviceMode is not in the supported list - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, - VL53L0X_DeviceModes * pDeviceMode); - -/** - * @brief Sets the resolution of range measurements. - * @par Function Description - * Set resolution of range measurements to either 0.25mm if - * fraction enabled or 1mm if not enabled. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param Enable Enable high resolution - * - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, - uint8_t Enable); - -/** - * @brief Gets the fraction enable parameter indicating the resolution of - * range measurements. - * - * @par Function Description - * Gets the fraction enable state, which translates to the resolution of - * range measurements as follows :Enabled:=0.25mm resolution, - * Not Enabled:=1mm resolution. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param pEnable Output Parameter reporting the fraction enable state. - * - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, - uint8_t *pEnable); - -/** - * @brief Set a new Histogram mode - * @par Function Description - * Set device to a new Histogram mode - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param HistogramMode New device mode to apply - * Valid values are: - * VL53L0X_HISTOGRAMMODE_DISABLED - * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM - * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY - * VL53L0X_HISTOGRAMMODE_RETURN_ONLY - * VL53L0X_HISTOGRAMMODE_BOTH - * - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when - * HistogramMode is not in the supported list - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, - VL53L0X_HistogramModes HistogramMode); - -/** - * @brief Get current new device mode - * @par Function Description - * Get current Histogram mode of a Device - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param pHistogramMode Pointer to current Histogram Mode value - * Valid values are: - * VL53L0X_HISTOGRAMMODE_DISABLED - * VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM - * VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY - * VL53L0X_HISTOGRAMMODE_RETURN_ONLY - * VL53L0X_HISTOGRAMMODE_BOTH - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, - VL53L0X_HistogramModes * pHistogramMode); - -/** - * @brief Set Ranging Timing Budget in microseconds - * - * @par Function Description - * Defines the maximum time allowed by the user to the device to run a - * full ranging sequence for the current mode (ranging, histogram, ASL ...) - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param MeasurementTimingBudgetMicroSeconds Max measurement time in - * microseconds. - * Valid values are: - * >= 17000 microsecs when wraparound enabled - * >= 12000 microsecs when wraparound disabled - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned if - MeasurementTimingBudgetMicroSeconds out of range - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds( - VL53L0X_DEV Dev, uint32_t MeasurementTimingBudgetMicroSeconds); - -/** - * @brief Get Ranging Timing Budget in microseconds - * - * @par Function Description - * Returns the programmed the maximum time allowed by the user to the - * device to run a full ranging sequence for the current mode - * (ranging, histogram, ASL ...) - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pMeasurementTimingBudgetMicroSeconds Max measurement time in - * microseconds. - * Valid values are: - * >= 17000 microsecs when wraparound enabled - * >= 12000 microsecs when wraparound disabled - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds( - VL53L0X_DEV Dev, uint32_t *pMeasurementTimingBudgetMicroSeconds); - -/** - * @brief Gets the VCSEL pulse period. - * - * @par Function Description - * This function retrieves the VCSEL pulse period for the given period type. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param VcselPeriodType VCSEL period identifier (pre-range|final). - * @param pVCSELPulsePeriod Pointer to VCSEL period value. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS Error VcselPeriodType parameter not - * supported. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriod); - -/** - * @brief Sets the VCSEL pulse period. - * - * @par Function Description - * This function retrieves the VCSEL pulse period for the given period type. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param VcselPeriodType VCSEL period identifier (pre-range|final). - * @param VCSELPulsePeriod VCSEL period value - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS Error VcselPeriodType parameter not - * supported. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriod); - -/** - * @brief Sets the (on/off) state of a requested sequence step. - * - * @par Function Description - * This function enables/disables a requested sequence step. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param SequenceStepId Sequence step identifier. - * @param SequenceStepEnabled Demanded state {0=Off,1=On} - * is enabled. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not - * supported. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled); - -/** - * @brief Gets the (on/off) state of a requested sequence step. - * - * @par Function Description - * This function retrieves the state of a requested sequence step, i.e. on/off. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param SequenceStepId Sequence step identifier. - * @param pSequenceStepEnabled Out parameter reporting if the sequence step - * is enabled {0=Off,1=On}. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not - * supported. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled); - -/** - * @brief Gets the (on/off) state of all sequence steps. - * - * @par Function Description - * This function retrieves the state of all sequence step in the scheduler. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param pSchedulerSequenceSteps Pointer to struct containing result. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, - VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps); - -/** - * @brief Sets the timeout of a requested sequence step. - * - * @par Function Description - * This function sets the timeout of a requested sequence step. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param SequenceStepId Sequence step identifier. - * @param TimeOutMilliSecs Demanded timeout - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not - * supported. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs); - -/** - * @brief Gets the timeout of a requested sequence step. - * - * @par Function Description - * This function retrieves the timeout of a requested sequence step. - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param SequenceStepId Sequence step identifier. - * @param pTimeOutMilliSecs Timeout value. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS Error SequenceStepId parameter not - * supported. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, - FixPoint1616_t *pTimeOutMilliSecs); - -/** - * @brief Gets number of sequence steps managed by the API. - * - * @par Function Description - * This function retrieves the number of sequence steps currently managed - * by the API - * - * @note This function Accesses the device - * - * @param Dev Device Handle - * @param pNumberOfSequenceSteps Out parameter reporting the number of - * sequence steps. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, - uint8_t *pNumberOfSequenceSteps); - -/** - * @brief Gets the name of a given sequence step. - * - * @par Function Description - * This function retrieves the name of sequence steps corresponding to - * SequenceStepId. - * - * @note This function doesn't Accesses the device - * - * @param SequenceStepId Sequence step identifier. - * @param pSequenceStepsString Pointer to Info string - * - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetSequenceStepsInfo( - VL53L0X_SequenceStepId SequenceStepId, char *pSequenceStepsString); - -/** - * Program continuous mode Inter-Measurement period in milliseconds - * - * @par Function Description - * When trying to set too short time return INVALID_PARAMS minimal value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param InterMeasurementPeriodMilliSeconds Inter-Measurement Period in ms. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds( - VL53L0X_DEV Dev, uint32_t InterMeasurementPeriodMilliSeconds); - -/** - * Get continuous mode Inter-Measurement period in milliseconds - * - * @par Function Description - * When trying to set too short time return INVALID_PARAMS minimal value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pInterMeasurementPeriodMilliSeconds Pointer to programmed - * Inter-Measurement Period in milliseconds. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds( - VL53L0X_DEV Dev, uint32_t *pInterMeasurementPeriodMilliSeconds); - -/** - * @brief Enable/Disable Cross talk compensation feature - * - * @note This function is not Implemented. - * Enable/Disable Cross Talk by set to zero the Cross Talk value - * by using @a VL53L0X_SetXTalkCompensationRateMegaCps(). - * - * @param Dev Device Handle - * @param XTalkCompensationEnable Cross talk compensation - * to be set 0=disabled else = enabled - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev, - uint8_t XTalkCompensationEnable); - -/** - * @brief Get Cross talk compensation rate - * - * @note This function is not Implemented. - * Enable/Disable Cross Talk by set to zero the Cross Talk value by - * using @a VL53L0X_SetXTalkCompensationRateMegaCps(). - * - * @param Dev Device Handle - * @param pXTalkCompensationEnable Pointer to the Cross talk compensation - * state 0=disabled or 1 = enabled - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, - uint8_t *pXTalkCompensationEnable); - -/** - * @brief Set Cross talk compensation rate - * - * @par Function Description - * Set Cross talk compensation rate. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param XTalkCompensationRateMegaCps Compensation rate in - * Mega counts per second (16.16 fix point) see datasheet for details - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps( - VL53L0X_DEV Dev, - FixPoint1616_t XTalkCompensationRateMegaCps); - -/** - * @brief Get Cross talk compensation rate - * - * @par Function Description - * Get Cross talk compensation rate. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pXTalkCompensationRateMegaCps Pointer to Compensation rate - in Mega counts per second (16.16 fix point) see datasheet for details - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps( - VL53L0X_DEV Dev, - FixPoint1616_t *pXTalkCompensationRateMegaCps); - -/** - * @brief Set Reference Calibration Parameters - * - * @par Function Description - * Set Reference Calibration Parameters. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param VhvSettings Parameter for VHV - * @param PhaseCal Parameter for PhaseCal - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, - uint8_t VhvSettings, uint8_t PhaseCal); - -/** - * @brief Get Reference Calibration Parameters - * - * @par Function Description - * Get Reference Calibration Parameters. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pVhvSettings Pointer to VHV parameter - * @param pPhaseCal Pointer to PhaseCal Parameter - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, uint8_t *pPhaseCal); - -/** - * @brief Get the number of the check limit managed by a given Device - * - * @par Function Description - * This function give the number of the check limit managed by the Device - * - * @note This function doesn't Access to the device - * - * @param pNumberOfLimitCheck Pointer to the number of check limit. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfLimitCheck( - uint16_t *pNumberOfLimitCheck); - -/** - * @brief Return a description string for a given limit check number - * - * @par Function Description - * This function returns a description string for a given limit check number. - * The limit check is identified with the LimitCheckId. - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param pLimitCheckString Pointer to the - description string of the given check limit. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is - returned when LimitCheckId value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, - uint16_t LimitCheckId, char *pLimitCheckString); - -/** - * @brief Return a the Status of the specified check limit - * - * @par Function Description - * This function returns the Status of the specified check limit. - * The value indicate if the check is fail or not. - * The limit check is identified with the LimitCheckId. - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param pLimitCheckStatus Pointer to the - Limit Check Status of the given check limit. - * LimitCheckStatus : - * 0 the check is not fail - * 1 the check if fail or not enabled - * - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is - returned when LimitCheckId value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, - uint16_t LimitCheckId, uint8_t *pLimitCheckStatus); - -/** - * @brief Enable/Disable a specific limit check - * - * @par Function Description - * This function Enable/Disable a specific limit check. - * The limit check is identified with the LimitCheckId. - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param LimitCheckEnable if 1 the check limit - * corresponding to LimitCheckId is Enabled - * if 0 the check limit - * corresponding to LimitCheckId is disabled - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned - * when LimitCheckId value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, - uint16_t LimitCheckId, uint8_t LimitCheckEnable); - -/** - * @brief Get specific limit check enable state - * - * @par Function Description - * This function get the enable state of a specific limit check. - * The limit check is identified with the LimitCheckId. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param pLimitCheckEnable Pointer to the check limit enable - * value. - * if 1 the check limit - * corresponding to LimitCheckId is Enabled - * if 0 the check limit - * corresponding to LimitCheckId is disabled - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned - * when LimitCheckId value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, - uint16_t LimitCheckId, uint8_t *pLimitCheckEnable); - -/** - * @brief Set a specific limit check value - * - * @par Function Description - * This function set a specific limit check value. - * The limit check is identified with the LimitCheckId. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param LimitCheckValue Limit check Value for a given - * LimitCheckId - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned when either - * LimitCheckId or LimitCheckValue value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, - uint16_t LimitCheckId, FixPoint1616_t LimitCheckValue); - -/** - * @brief Get a specific limit check value - * - * @par Function Description - * This function get a specific limit check value from device then it updates - * internal values and check enables. - * The limit check is identified with the LimitCheckId. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param pLimitCheckValue Pointer to Limit - * check Value for a given LimitCheckId. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned - * when LimitCheckId value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, - uint16_t LimitCheckId, FixPoint1616_t *pLimitCheckValue); - -/** - * @brief Get the current value of the signal used for the limit check - * - * @par Function Description - * This function get a the current value of the signal used for the limit check. - * To obtain the latest value you should run a ranging before. - * The value reported is linked to the limit check identified with the - * LimitCheckId. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param LimitCheckId Limit Check ID - * (0<= LimitCheckId < VL53L0X_GetNumberOfLimitCheck() ). - * @param pLimitCheckCurrent Pointer to current Value for a - * given LimitCheckId. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned when - * LimitCheckId value is out of range. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, - uint16_t LimitCheckId, FixPoint1616_t *pLimitCheckCurrent); - -/** - * @brief Enable (or disable) Wrap around Check - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param WrapAroundCheckEnable Wrap around Check to be set - * 0=disabled, other = enabled - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev, - uint8_t WrapAroundCheckEnable); - -/** - * @brief Get setup of Wrap around Check - * - * @par Function Description - * This function get the wrapAround check enable parameters - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pWrapAroundCheckEnable Pointer to the Wrap around Check state - * 0=disabled or 1 = enabled - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, - uint8_t *pWrapAroundCheckEnable); - -/** @} VL53L0X_parameters_group */ - -/** @defgroup VL53L0X_measurement_group VL53L0X Measurement Functions - * @brief Functions used for the measurements - * @{ - */ - -/** - * @brief Single shot measurement. - * - * @par Function Description - * Perform simple measurement sequence (Start measure, Wait measure to end, - * and returns when measurement is done). - * Once function returns, user can get valid data by calling - * VL53L0X_GetRangingMeasurement or VL53L0X_GetHistogramMeasurement - * depending on defined measurement mode - * User should Clear the interrupt in case this are enabled by using the - * function VL53L0X_ClearInterruptMask(). - * - * @warning This function is a blocking function - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev); - -/** - * @brief Perform Reference Calibration - * - * @details Perform a reference calibration of the Device. - * This function should be run from time to time before doing - * a ranging measurement. - * This function will launch a special ranging measurement, so - * if interrupt are enable an interrupt will be done. - * This function will clear the interrupt generated automatically. - * - * @warning This function is a blocking function - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pVhvSettings Pointer to vhv settings parameter. - * @param pPhaseCal Pointer to PhaseCal parameter. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, uint8_t *pPhaseCal); - -/** - * @brief Perform XTalk Measurement - * - * @details Measures the current cross talk from glass in front - * of the sensor. - * This functions performs a histogram measurement and uses the results - * to measure the crosstalk. For the function to be successful, there - * must be no target in front of the sensor. - * - * @warning This function is a blocking function - * - * @warning This function is not supported when the final range - * vcsel clock period is set below 10 PCLKS. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param TimeoutMs Histogram measurement duration. - * @param pXtalkPerSpad Output parameter containing the crosstalk - * measurement result, in MCPS/Spad. Format fixpoint 16:16. - * @param pAmbientTooHigh Output parameter which indicate that - * pXtalkPerSpad is not good if the Ambient is too high. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS vcsel clock period not supported - * for this operation. Must not be less than 10PCLKS. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, - uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, - uint8_t *pAmbientTooHigh); - -/** - * @brief Perform XTalk Calibration - * - * @details Perform a XTalk calibration of the Device. - * This function will launch a ranging measurement, if interrupts - * are enabled an interrupt will be done. - * This function will clear the interrupt generated automatically. - * This function will program a new value for the XTalk compensation - * and it will enable the cross talk before exit. - * This function will disable the VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD. - * - * @warning This function is a blocking function - * - * @note This function Access to the device - * - * @note This function change the device mode to - * VL53L0X_DEVICEMODE_SINGLE_RANGING - * - * @param Dev Device Handle - * @param XTalkCalDistance XTalkCalDistance value used for the XTalk - * computation. - * @param pXTalkCompensationRateMegaCps Pointer to new - * XTalkCompensation value. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev, - FixPoint1616_t XTalkCalDistance, - FixPoint1616_t *pXTalkCompensationRateMegaCps); - -/** - * @brief Perform Offset Calibration - * - * @details Perform a Offset calibration of the Device. - * This function will launch a ranging measurement, if interrupts are - * enabled an interrupt will be done. - * This function will clear the interrupt generated automatically. - * This function will program a new value for the Offset calibration value - * This function will disable the VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD. - * - * @warning This function is a blocking function - * - * @note This function Access to the device - * - * @note This function does not change the device mode. - * - * @param Dev Device Handle - * @param CalDistanceMilliMeter Calibration distance value used for the - * offset compensation. - * @param pOffsetMicroMeter Pointer to new Offset value computed by the - * function. - * - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev, - FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter); - -/** - * @brief Start device measurement - * - * @details Started measurement will depend on device parameters set through - * @a VL53L0X_SetParameters() - * This is a non-blocking function. - * This function will change the VL53L0X_State from VL53L0X_STATE_IDLE to - * VL53L0X_STATE_RUNNING. - * - * @note This function Access to the device - * - - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_MODE_NOT_SUPPORTED This error occurs when - * DeviceMode programmed with @a VL53L0X_SetDeviceMode is not in the supported - * list: - * Supported mode are: - * VL53L0X_DEVICEMODE_SINGLE_RANGING, - * VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, - * VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING - * @return VL53L0X_ERROR_TIME_OUT Time out on start measurement - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev); - -/** - * @brief Stop device measurement - * - * @details Will set the device in standby mode at end of current measurement\n - * Not necessary in single mode as device shall return automatically - * in standby mode at end of measurement. - * This function will change the VL53L0X_State from - * VL53L0X_STATE_RUNNING to VL53L0X_STATE_IDLE. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev); - -/** - * @brief Return Measurement Data Ready - * - * @par Function Description - * This function indicate that a measurement data is ready. - * This function check if interrupt mode is used then check is done accordingly. - * If perform function clear the interrupt, this function will not work, - * like in case of @a VL53L0X_PerformSingleRangingMeasurement(). - * The previous function is blocking function, VL53L0X_GetMeasurementDataReady - * is used for non-blocking capture. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pMeasurementDataReady Pointer to Measurement Data Ready. - * 0=data not ready, 1 = data ready - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, - uint8_t *pMeasurementDataReady); - -/** - * @brief Wait for device ready for a new measurement command. - * Blocking function. - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @param MaxLoop Max Number of polling loop (timeout). - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement( - VL53L0X_DEV Dev, - uint32_t MaxLoop); - -/** - * @brief Retrieve the Reference Signal after a measurements - * - * @par Function Description - * Get Reference Signal from last successful Ranging measurement - * This function return a valid value after that you call the - * @a VL53L0X_GetRangingMeasurementData(). - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pMeasurementRefSignal Pointer to the Ref Signal to fill up. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev, - FixPoint1616_t *pMeasurementRefSignal); - -/** - * @brief Retrieve the measurements from device for a given setup - * - * @par Function Description - * Get data from last successful Ranging measurement - * @warning USER should take care about @a VL53L0X_GetNumberOfROIZones() - * before get data. - * PAL will fill a NumberOfROIZones times the corresponding data - * structure used in the measurement function. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pRangingMeasurementData Pointer to the data structure to fill up. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); - -/** - * @brief Retrieve the measurements from device for a given setup - * - * @par Function Description - * Get data from last successful Histogram measurement - * @warning USER should take care about @a VL53L0X_GetNumberOfROIZones() - * before get data. - * PAL will fill a NumberOfROIZones times the corresponding data structure - * used in the measurement function. - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @param pHistogramMeasurementData Pointer to the histogram data structure. - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, - VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData); - -/** - * @brief Performs a single ranging measurement and retrieve the ranging - * measurement data - * - * @par Function Description - * This function will change the device mode to - * VL53L0X_DEVICEMODE_SINGLE_RANGING with @a VL53L0X_SetDeviceMode(), - * It performs measurement with @a VL53L0X_PerformSingleMeasurement() - * It get data from last successful Ranging measurement with - * @a VL53L0X_GetRangingMeasurementData. - * Finally it clear the interrupt with @a VL53L0X_ClearInterruptMask(). - * - * @note This function Access to the device - * - * @note This function change the device mode to - * VL53L0X_DEVICEMODE_SINGLE_RANGING - * - * @param Dev Device Handle - * @param pRangingMeasurementData Pointer to the data structure to fill up. - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement( - VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData); - -/** - * @brief Performs a single histogram measurement and retrieve the histogram - * measurement data - * Is equivalent to VL53L0X_PerformSingleMeasurement + - * VL53L0X_GetHistogramMeasurementData - * - * @par Function Description - * Get data from last successful Ranging measurement. - * This function will clear the interrupt in case of these are enabled. - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @param pHistogramMeasurementData Pointer to the data structure to fill up. - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement( - VL53L0X_DEV Dev, - VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData); - -/** - * @brief Set the number of ROI Zones to be used for a specific Device - * - * @par Function Description - * Set the number of ROI Zones to be used for a specific Device. - * The programmed value should be less than the max number of ROI Zones given - * with @a VL53L0X_GetMaxNumberOfROIZones(). - * This version of API manage only one zone. - * - * @param Dev Device Handle - * @param NumberOfROIZones Number of ROI Zones to be used for a - * specific Device. - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INVALID_PARAMS This error is returned if - * NumberOfROIZones != 1 - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, - uint8_t NumberOfROIZones); - -/** - * @brief Get the number of ROI Zones managed by the Device - * - * @par Function Description - * Get number of ROI Zones managed by the Device - * USER should take care about @a VL53L0X_GetNumberOfROIZones() - * before get data after a perform measurement. - * PAL will fill a NumberOfROIZones times the corresponding data - * structure used in the measurement function. - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param pNumberOfROIZones Pointer to the Number of ROI Zones value. - * @return VL53L0X_ERROR_NONE Success - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, - uint8_t *pNumberOfROIZones); - -/** - * @brief Get the Maximum number of ROI Zones managed by the Device - * - * @par Function Description - * Get Maximum number of ROI Zones managed by the Device. - * - * @note This function doesn't Access to the device - * - * @param Dev Device Handle - * @param pMaxNumberOfROIZones Pointer to the Maximum Number - * of ROI Zones value. - * @return VL53L0X_ERROR_NONE Success - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, - uint8_t *pMaxNumberOfROIZones); - -/** @} VL53L0X_measurement_group */ - -/** @defgroup VL53L0X_interrupt_group VL53L0X Interrupt Functions - * @brief Functions used for interrupt managements - * @{ - */ - -/** - * @brief Set the configuration of GPIO pin for a given device - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param Pin ID of the GPIO Pin - * @param Functionality Select Pin functionality. - * Refer to ::VL53L0X_GpioFunctionality - * @param DeviceMode Device Mode associated to the Gpio. - * @param Polarity Set interrupt polarity. Active high - * or active low see ::VL53L0X_InterruptPolarity - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_GPIO_NOT_EXISTING Only Pin=0 is accepted - * @return VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED This error occurs - * when Functionality programmed is not in the supported list: - * Supported value are: - * VL53L0X_GPIOFUNCTIONALITY_OFF, - * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW, - * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH, - VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT, - * VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, - VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, - VL53L0X_InterruptPolarity Polarity); - -/** - * @brief Get current configuration for GPIO pin for a given device - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param Pin ID of the GPIO Pin - * @param pDeviceMode Pointer to Device Mode associated to the Gpio. - * @param pFunctionality Pointer to Pin functionality. - * Refer to ::VL53L0X_GpioFunctionality - * @param pPolarity Pointer to interrupt polarity. - * Active high or active low see ::VL53L0X_InterruptPolarity - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_GPIO_NOT_EXISTING Only Pin=0 is accepted - * @return VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED This error occurs - * when Functionality programmed is not in the supported list: - * Supported value are: - * VL53L0X_GPIOFUNCTIONALITY_OFF, - * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW, - * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH, - * VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT, - * VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, - VL53L0X_DeviceModes * pDeviceMode, - VL53L0X_GpioFunctionality * pFunctionality, - VL53L0X_InterruptPolarity * pPolarity); - -/** - * @brief Set low and high Interrupt thresholds for a given mode - * (ranging, ALS, ...) for a given device - * - * @par Function Description - * Set low and high Interrupt thresholds for a given mode (ranging, ALS, ...) - * for a given device - * - * @note This function Access to the device - * - * @note DeviceMode is ignored for the current device - * - * @param Dev Device Handle - * @param DeviceMode Device Mode for which change thresholds - * @param ThresholdLow Low threshold (mm, lux ..., depending on the mode) - * @param ThresholdHigh High threshold (mm, lux ..., depending on the mode) - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev, - VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, - FixPoint1616_t ThresholdHigh); - -/** - * @brief Get high and low Interrupt thresholds for a given mode - * (ranging, ALS, ...) for a given device - * - * @par Function Description - * Get high and low Interrupt thresholds for a given mode (ranging, ALS, ...) - * for a given device - * - * @note This function Access to the device - * - * @note DeviceMode is ignored for the current device - * - * @param Dev Device Handle - * @param DeviceMode Device Mode from which read thresholds - * @param pThresholdLow Low threshold (mm, lux ..., depending on the mode) - * @param pThresholdHigh High threshold (mm, lux ..., depending on the mode) - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, - VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, - FixPoint1616_t *pThresholdHigh); - -/** - * @brief Return device stop completion status - * - * @par Function Description - * Returns stop completiob status. - * User shall call this function after a stop command - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pStopStatus Pointer to status variable to update - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev, - uint32_t *pStopStatus); - - -/** - * @brief Clear given system interrupt condition - * - * @par Function Description - * Clear given interrupt(s). - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param InterruptMask Mask of interrupts to clear - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_INTERRUPT_NOT_CLEARED Cannot clear interrupts - * - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, - uint32_t InterruptMask); - -/** - * @brief Return device interrupt status - * - * @par Function Description - * Returns currently raised interrupts by the device. - * User shall be able to activate/deactivate interrupts through - * @a VL53L0X_SetGpioConfig() - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pInterruptMaskStatus Pointer to status variable to update - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, - uint32_t *pInterruptMaskStatus); - -/** - * @brief Configure ranging interrupt reported to system - * - * @note This function is not Implemented - * - * @param Dev Device Handle - * @param InterruptMask Mask of interrupt to Enable/disable - * (0:interrupt disabled or 1: interrupt enabled) - * @return VL53L0X_ERROR_NOT_IMPLEMENTED Not implemented - */ -VL53L0X_API VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, - uint32_t InterruptMask); - -/** @} VL53L0X_interrupt_group */ - -/** @defgroup VL53L0X_SPADfunctions_group VL53L0X SPAD Functions - * @brief Functions used for SPAD managements - * @{ - */ - -/** - * @brief Set the SPAD Ambient Damper Threshold value - * - * @par Function Description - * This function set the SPAD Ambient Damper Threshold value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param SpadAmbientDamperThreshold SPAD Ambient Damper Threshold value - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, - uint16_t SpadAmbientDamperThreshold); - -/** - * @brief Get the current SPAD Ambient Damper Threshold value - * - * @par Function Description - * This function get the SPAD Ambient Damper Threshold value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pSpadAmbientDamperThreshold Pointer to programmed - * SPAD Ambient Damper Threshold value - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, - uint16_t *pSpadAmbientDamperThreshold); - -/** - * @brief Set the SPAD Ambient Damper Factor value - * - * @par Function Description - * This function set the SPAD Ambient Damper Factor value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param SpadAmbientDamperFactor SPAD Ambient Damper Factor value - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev, - uint16_t SpadAmbientDamperFactor); - -/** - * @brief Get the current SPAD Ambient Damper Factor value - * - * @par Function Description - * This function get the SPAD Ambient Damper Factor value - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param pSpadAmbientDamperFactor Pointer to programmed SPAD Ambient - * Damper Factor value - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev, - uint16_t *pSpadAmbientDamperFactor); - -/** - * @brief Performs Reference Spad Management - * - * @par Function Description - * The reference SPAD initialization procedure determines the minimum amount - * of reference spads to be enables to achieve a target reference signal rate - * and should be performed once during initialization. - * - * @note This function Access to the device - * - * @note This function change the device mode to - * VL53L0X_DEVICEMODE_SINGLE_RANGING - * - * @param Dev Device Handle - * @param refSpadCount Reports ref Spad Count - * @param isApertureSpads Reports if spads are of type - * aperture or non-aperture. - * 1:=aperture, 0:=Non-Aperture - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the Ref Spad procedure. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, - uint32_t *refSpadCount, uint8_t *isApertureSpads); - -/** - * @brief Applies Reference SPAD configuration - * - * @par Function Description - * This function applies a given number of reference spads, identified as - * either Aperture or Non-Aperture. - * The requested spad count and type are stored within the device specific - * parameters data for access by the host. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param refSpadCount Number of ref spads. - * @param isApertureSpads Defines if spads are of type - * aperture or non-aperture. - * 1:=aperture, 0:=Non-Aperture - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the in the reference - * spad configuration. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, - uint32_t refSpadCount, uint8_t isApertureSpads); - -/** - * @brief Retrieves SPAD configuration - * - * @par Function Description - * This function retrieves the current number of applied reference spads - * and also their type : Aperture or Non-Aperture. - * - * @note This function Access to the device - * - * @param Dev Device Handle - * @param refSpadCount Number ref Spad Count - * @param isApertureSpads Reports if spads are of type - * aperture or non-aperture. - * 1:=aperture, 0:=Non-Aperture - * @return VL53L0X_ERROR_NONE Success - * @return VL53L0X_ERROR_REF_SPAD_INIT Error in the in the reference - * spad configuration. - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_API VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, - uint32_t *refSpadCount, uint8_t *isApertureSpads); - -/** @} VL53L0X_SPADfunctions_group */ - -/** @} VL53L0X_cut11_group */ - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_API_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" deleted file mode 100644 index 8fe3cf8a..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_calibration.h" +++ /dev/null @@ -1,85 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - -#ifndef _VL53L0X_API_CALIBRATION_H_ -#define _VL53L0X_API_CALIBRATION_H_ - -#include "vl53l0x_def.h" -#include "vl53l0x_platform.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -VL53L0X_Error VL53L0X_perform_xtalk_calibration(VL53L0X_DEV Dev, - FixPoint1616_t XTalkCalDistance, - FixPoint1616_t *pXTalkCompensationRateMegaCps); - -VL53L0X_Error VL53L0X_perform_offset_calibration(VL53L0X_DEV Dev, - FixPoint1616_t CalDistanceMilliMeter, - int32_t *pOffsetMicroMeter); - -VL53L0X_Error VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, - int32_t OffsetCalibrationDataMicroMeter); - -VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, - int32_t *pOffsetCalibrationDataMicroMeter); - -VL53L0X_Error VL53L0X_apply_offset_adjustment(VL53L0X_DEV Dev); - -VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, - uint32_t *refSpadCount, uint8_t *isApertureSpads); - -VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, - uint32_t count, uint8_t isApertureSpads); - -VL53L0X_Error VL53L0X_get_reference_spads(VL53L0X_DEV Dev, - uint32_t *pSpadCount, uint8_t *pIsApertureSpads); - -VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, - uint8_t *pPhaseCal, const uint8_t get_data_enable, - const uint8_t restore_config); - -VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable); - -VL53L0X_Error VL53L0X_set_ref_calibration(VL53L0X_DEV Dev, - uint8_t VhvSettings, uint8_t PhaseCal); - -VL53L0X_Error VL53L0X_get_ref_calibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, uint8_t *pPhaseCal); - - - - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_API_CALIBRATION_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" deleted file mode 100644 index 676cfb9d..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_core.h" +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - -#ifndef _VL53L0X_API_CORE_H_ -#define _VL53L0X_API_CORE_H_ - -#include "vl53l0x_def.h" -#include "vl53l0x_platform.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -VL53L0X_Error VL53L0X_reverse_bytes(uint8_t *data, uint32_t size); - -VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev); - -uint8_t VL53L0X_encode_vcsel_period(uint8_t vcsel_period_pclks); - -uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg); - -uint32_t VL53L0X_isqrt(uint32_t num); - -uint32_t VL53L0X_quadrature_sum(uint32_t a, uint32_t b); - -VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option); - -VL53L0X_Error VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK); - -VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK); - -uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout); - -VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, - uint32_t *pTimeOutMicroSecs); - -VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, - uint32_t TimeOutMicroSecs); - -VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( - VL53L0X_DEV Dev, - uint32_t MeasurementTimingBudgetMicroSeconds); - -VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( - VL53L0X_DEV Dev, - uint32_t *pMeasurementTimingBudgetMicroSeconds); - -VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, - uint8_t *pTuningSettingBuffer); - -VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - FixPoint1616_t *pSigmaEstimate); - -VL53L0X_Error VL53L0X_calc_dmax( - VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm); - -VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - FixPoint1616_t *ptotal_xtalk_rate_mcps); - -VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - FixPoint1616_t *ptotal_signal_rate_mcps); - -VL53L0X_Error VL53L0X_get_pal_range_status(VL53L0X_DEV Dev, - uint8_t DeviceRangeStatus, - FixPoint1616_t SignalRate, - uint16_t EffectiveSpadRtnCount, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - uint8_t *pPalRangeStatus); - -uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, - uint32_t timeout_period_us, uint8_t vcsel_period_pclks); - -uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks); - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_API_CORE_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" deleted file mode 100644 index 18ac3991..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_ranging.h" +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - -#ifndef _VL53L0X_API_RANGING_H_ -#define _VL53L0X_API_RANGING_H_ - -#include "vl53l0x_def.h" -#include "vl53l0x_platform.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - - - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_API_RANGING_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" deleted file mode 100644 index eeed00c3..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_api_strings.h" +++ /dev/null @@ -1,278 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - -#ifndef VL53L0X_API_STRINGS_H_ -#define VL53L0X_API_STRINGS_H_ - -#include "vl53l0x_def.h" -#include "vl53l0x_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev, - VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo); - -VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode, - char *pDeviceErrorString); - -VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus, - char *pRangeStatusString); - -VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode, - char *pPalErrorString); - -VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode, - char *pPalStateString); - -VL53L0X_Error VL53L0X_get_sequence_steps_info( - VL53L0X_SequenceStepId SequenceStepId, - char *pSequenceStepsString); - -VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, - uint16_t LimitCheckId, - char *pLimitCheckString); - - -#ifdef USE_EMPTY_STRING - #define VL53L0X_STRING_DEVICE_INFO_NAME "" - #define VL53L0X_STRING_DEVICE_INFO_NAME_TS0 "" - #define VL53L0X_STRING_DEVICE_INFO_NAME_TS1 "" - #define VL53L0X_STRING_DEVICE_INFO_NAME_TS2 "" - #define VL53L0X_STRING_DEVICE_INFO_NAME_ES1 "" - #define VL53L0X_STRING_DEVICE_INFO_TYPE "" - - /* PAL ERROR strings */ - #define VL53L0X_STRING_ERROR_NONE "" - #define VL53L0X_STRING_ERROR_CALIBRATION_WARNING "" - #define VL53L0X_STRING_ERROR_MIN_CLIPPED "" - #define VL53L0X_STRING_ERROR_UNDEFINED "" - #define VL53L0X_STRING_ERROR_INVALID_PARAMS "" - #define VL53L0X_STRING_ERROR_NOT_SUPPORTED "" - #define VL53L0X_STRING_ERROR_RANGE_ERROR "" - #define VL53L0X_STRING_ERROR_TIME_OUT "" - #define VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED "" - #define VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL "" - #define VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING "" - #define VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED "" - #define VL53L0X_STRING_ERROR_CONTROL_INTERFACE "" - #define VL53L0X_STRING_ERROR_INVALID_COMMAND "" - #define VL53L0X_STRING_ERROR_DIVISION_BY_ZERO "" - #define VL53L0X_STRING_ERROR_REF_SPAD_INIT "" - #define VL53L0X_STRING_ERROR_NOT_IMPLEMENTED "" - - #define VL53L0X_STRING_UNKNOW_ERROR_CODE "" - - - - /* Range Status */ - #define VL53L0X_STRING_RANGESTATUS_NONE "" - #define VL53L0X_STRING_RANGESTATUS_RANGEVALID "" - #define VL53L0X_STRING_RANGESTATUS_SIGMA "" - #define VL53L0X_STRING_RANGESTATUS_SIGNAL "" - #define VL53L0X_STRING_RANGESTATUS_MINRANGE "" - #define VL53L0X_STRING_RANGESTATUS_PHASE "" - #define VL53L0X_STRING_RANGESTATUS_HW "" - - - /* Range Status */ - #define VL53L0X_STRING_STATE_POWERDOWN "" - #define VL53L0X_STRING_STATE_WAIT_STATICINIT "" - #define VL53L0X_STRING_STATE_STANDBY "" - #define VL53L0X_STRING_STATE_IDLE "" - #define VL53L0X_STRING_STATE_RUNNING "" - #define VL53L0X_STRING_STATE_UNKNOWN "" - #define VL53L0X_STRING_STATE_ERROR "" - - - /* Device Specific */ - #define VL53L0X_STRING_DEVICEERROR_NONE "" - #define VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE "" - #define VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE "" - #define VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND "" - #define VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET "" - #define VL53L0X_STRING_DEVICEERROR_SNRCHECK "" - #define VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK "" - #define VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK "" - #define VL53L0X_STRING_DEVICEERROR_TCC "" - #define VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY "" - #define VL53L0X_STRING_DEVICEERROR_MINCLIP "" - #define VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE "" - #define VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW "" - #define VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW "" - #define VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD "" - #define VL53L0X_STRING_DEVICEERROR_UNKNOWN "" - - /* Check Enable */ - #define VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE "" - #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE "" - #define VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP "" - #define VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD "" - - /* Sequence Step */ - #define VL53L0X_STRING_SEQUENCESTEP_TCC "" - #define VL53L0X_STRING_SEQUENCESTEP_DSS "" - #define VL53L0X_STRING_SEQUENCESTEP_MSRC "" - #define VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE "" - #define VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE "" -#else - #define VL53L0X_STRING_DEVICE_INFO_NAME "VL53L0X cut1.0" - #define VL53L0X_STRING_DEVICE_INFO_NAME_TS0 "VL53L0X TS0" - #define VL53L0X_STRING_DEVICE_INFO_NAME_TS1 "VL53L0X TS1" - #define VL53L0X_STRING_DEVICE_INFO_NAME_TS2 "VL53L0X TS2" - #define VL53L0X_STRING_DEVICE_INFO_NAME_ES1 "VL53L0X ES1 or later" - #define VL53L0X_STRING_DEVICE_INFO_TYPE "VL53L0X" - - /* PAL ERROR strings */ - #define VL53L0X_STRING_ERROR_NONE \ - "No Error" - #define VL53L0X_STRING_ERROR_CALIBRATION_WARNING \ - "Calibration Warning Error" - #define VL53L0X_STRING_ERROR_MIN_CLIPPED \ - "Min clipped error" - #define VL53L0X_STRING_ERROR_UNDEFINED \ - "Undefined error" - #define VL53L0X_STRING_ERROR_INVALID_PARAMS \ - "Invalid parameters error" - #define VL53L0X_STRING_ERROR_NOT_SUPPORTED \ - "Not supported error" - #define VL53L0X_STRING_ERROR_RANGE_ERROR \ - "Range error" - #define VL53L0X_STRING_ERROR_TIME_OUT \ - "Time out error" - #define VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED \ - "Mode not supported error" - #define VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL \ - "Buffer too small" - #define VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING \ - "GPIO not existing" - #define VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED \ - "GPIO funct not supported" - #define VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED \ - "Interrupt not Cleared" - #define VL53L0X_STRING_ERROR_CONTROL_INTERFACE \ - "Control Interface Error" - #define VL53L0X_STRING_ERROR_INVALID_COMMAND \ - "Invalid Command Error" - #define VL53L0X_STRING_ERROR_DIVISION_BY_ZERO \ - "Division by zero Error" - #define VL53L0X_STRING_ERROR_REF_SPAD_INIT \ - "Reference Spad Init Error" - #define VL53L0X_STRING_ERROR_NOT_IMPLEMENTED \ - "Not implemented error" - - #define VL53L0X_STRING_UNKNOW_ERROR_CODE \ - "Unknown Error Code" - - - - /* Range Status */ - #define VL53L0X_STRING_RANGESTATUS_NONE "No Update" - #define VL53L0X_STRING_RANGESTATUS_RANGEVALID "Range Valid" - #define VL53L0X_STRING_RANGESTATUS_SIGMA "Sigma Fail" - #define VL53L0X_STRING_RANGESTATUS_SIGNAL "Signal Fail" - #define VL53L0X_STRING_RANGESTATUS_MINRANGE "Min Range Fail" - #define VL53L0X_STRING_RANGESTATUS_PHASE "Phase Fail" - #define VL53L0X_STRING_RANGESTATUS_HW "Hardware Fail" - - - /* Range Status */ - #define VL53L0X_STRING_STATE_POWERDOWN "POWERDOWN State" - #define VL53L0X_STRING_STATE_WAIT_STATICINIT \ - "Wait for staticinit State" - #define VL53L0X_STRING_STATE_STANDBY "STANDBY State" - #define VL53L0X_STRING_STATE_IDLE "IDLE State" - #define VL53L0X_STRING_STATE_RUNNING "RUNNING State" - #define VL53L0X_STRING_STATE_UNKNOWN "UNKNOWN State" - #define VL53L0X_STRING_STATE_ERROR "ERROR State" - - - /* Device Specific */ - #define VL53L0X_STRING_DEVICEERROR_NONE "No Update" - #define VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE \ - "VCSEL Continuity Test Failure" - #define VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE \ - "VCSEL Watchdog Test Failure" - #define VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND \ - "No VHV Value found" - #define VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET \ - "MSRC No Target Error" - #define VL53L0X_STRING_DEVICEERROR_SNRCHECK \ - "SNR Check Exit" - #define VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK \ - "Range Phase Check Error" - #define VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK \ - "Sigma Threshold Check Error" - #define VL53L0X_STRING_DEVICEERROR_TCC \ - "TCC Error" - #define VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY \ - "Phase Consistency Error" - #define VL53L0X_STRING_DEVICEERROR_MINCLIP \ - "Min Clip Error" - #define VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE \ - "Range Complete" - #define VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW \ - "Range Algo Underflow Error" - #define VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW \ - "Range Algo Overlow Error" - #define VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD \ - "Range Ignore Threshold Error" - #define VL53L0X_STRING_DEVICEERROR_UNKNOWN \ - "Unknown error code" - - /* Check Enable */ - #define VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE \ - "SIGMA FINAL RANGE" - #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE \ - "SIGNAL RATE FINAL RANGE" - #define VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP \ - "SIGNAL REF CLIP" - #define VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD \ - "RANGE IGNORE THRESHOLD" - #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC \ - "SIGNAL RATE MSRC" - #define VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE \ - "SIGNAL RATE PRE RANGE" - - /* Sequence Step */ - #define VL53L0X_STRING_SEQUENCESTEP_TCC "TCC" - #define VL53L0X_STRING_SEQUENCESTEP_DSS "DSS" - #define VL53L0X_STRING_SEQUENCESTEP_MSRC "MSRC" - #define VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE "PRE RANGE" - #define VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE "FINAL RANGE" -#endif /* USE_EMPTY_STRING */ - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" deleted file mode 100644 index b67a1dba..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_def.h" +++ /dev/null @@ -1,663 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(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 VL53L0X_def.h - * - * @brief Type definitions for VL53L0X API. - * - */ - - -#ifndef _VL53L0X_DEF_H_ -#define _VL53L0X_DEF_H_ - - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup VL53L0X_globaldefine_group VL53L0X Defines - * @brief VL53L0X Defines - * @{ - */ - - -/** PAL SPECIFICATION major version */ -#define VL53L0X10_SPECIFICATION_VER_MAJOR 1 -/** PAL SPECIFICATION minor version */ -#define VL53L0X10_SPECIFICATION_VER_MINOR 2 -/** PAL SPECIFICATION sub version */ -#define VL53L0X10_SPECIFICATION_VER_SUB 7 -/** PAL SPECIFICATION sub version */ -#define VL53L0X10_SPECIFICATION_VER_REVISION 1440 - -/** VL53L0X PAL IMPLEMENTATION major version */ -#define VL53L0X10_IMPLEMENTATION_VER_MAJOR 1 -/** VL53L0X PAL IMPLEMENTATION minor version */ -#define VL53L0X10_IMPLEMENTATION_VER_MINOR 0 -/** VL53L0X PAL IMPLEMENTATION sub version */ -#define VL53L0X10_IMPLEMENTATION_VER_SUB 9 -/** VL53L0X PAL IMPLEMENTATION sub version */ -#define VL53L0X10_IMPLEMENTATION_VER_REVISION 3673 - -/** PAL SPECIFICATION major version */ -#define VL53L0X_SPECIFICATION_VER_MAJOR 1 -/** PAL SPECIFICATION minor version */ -#define VL53L0X_SPECIFICATION_VER_MINOR 2 -/** PAL SPECIFICATION sub version */ -#define VL53L0X_SPECIFICATION_VER_SUB 7 -/** PAL SPECIFICATION sub version */ -#define VL53L0X_SPECIFICATION_VER_REVISION 1440 - -/** VL53L0X PAL IMPLEMENTATION major version */ -#define VL53L0X_IMPLEMENTATION_VER_MAJOR 1 -/** VL53L0X PAL IMPLEMENTATION minor version */ -#define VL53L0X_IMPLEMENTATION_VER_MINOR 0 -/** VL53L0X PAL IMPLEMENTATION sub version */ -#define VL53L0X_IMPLEMENTATION_VER_SUB 4 -/** VL53L0X PAL IMPLEMENTATION sub version */ -#define VL53L0X_IMPLEMENTATION_VER_REVISION 4960 -#define VL53L0X_DEFAULT_MAX_LOOP 2000 -#define VL53L0X_MAX_STRING_LENGTH 32 - - -#include "vl53l0x_device.h" -#include "vl53l0x_types.h" - - -/**************************************** - * PRIVATE define do not edit - ****************************************/ - -/** @brief Defines the parameters of the Get Version Functions - */ -typedef struct { - uint32_t revision; /*!< revision number */ - uint8_t major; /*!< major number */ - uint8_t minor; /*!< minor number */ - uint8_t build; /*!< build number */ -} VL53L0X_Version_t; - - -/** @brief Defines the parameters of the Get Device Info Functions - */ -typedef struct { - char Name[VL53L0X_MAX_STRING_LENGTH]; - /*!< Name of the Device e.g. Left_Distance */ - char Type[VL53L0X_MAX_STRING_LENGTH]; - /*!< Type of the Device e.g VL53L0X */ - char ProductId[VL53L0X_MAX_STRING_LENGTH]; - /*!< Product Identifier String */ - uint8_t ProductType; - /*!< Product Type, VL53L0X = 1, VL53L1 = 2 */ - uint8_t ProductRevisionMajor; - /*!< Product revision major */ - uint8_t ProductRevisionMinor; - /*!< Product revision minor */ -} VL53L0X_DeviceInfo_t; - - -/** @defgroup VL53L0X_define_Error_group Error and Warning code returned by API - * The following DEFINE are used to identify the PAL ERROR - * @{ - */ - -typedef int8_t VL53L0X_Error; - -#define VL53L0X_ERROR_NONE ((VL53L0X_Error) 0) -#define VL53L0X_ERROR_CALIBRATION_WARNING ((VL53L0X_Error) - 1) - /*!< Warning invalid calibration data may be in used - * \a VL53L0X_InitData() - * \a VL53L0X_GetOffsetCalibrationData - * \a VL53L0X_SetOffsetCalibrationData - */ -#define VL53L0X_ERROR_MIN_CLIPPED ((VL53L0X_Error) - 2) - /*!< Warning parameter passed was clipped to min before to be applied */ - -#define VL53L0X_ERROR_UNDEFINED ((VL53L0X_Error) - 3) - /*!< Unqualified error */ -#define VL53L0X_ERROR_INVALID_PARAMS ((VL53L0X_Error) - 4) - /*!< Parameter passed is invalid or out of range */ -#define VL53L0X_ERROR_NOT_SUPPORTED ((VL53L0X_Error) - 5) - /*!< Function is not supported in current mode or configuration */ -#define VL53L0X_ERROR_RANGE_ERROR ((VL53L0X_Error) - 6) - /*!< Device report a ranging error interrupt status */ -#define VL53L0X_ERROR_TIME_OUT ((VL53L0X_Error) - 7) - /*!< Aborted due to time out */ -#define VL53L0X_ERROR_MODE_NOT_SUPPORTED ((VL53L0X_Error) - 8) - /*!< Asked mode is not supported by the device */ -#define VL53L0X_ERROR_BUFFER_TOO_SMALL ((VL53L0X_Error) - 9) - /*!< ... */ -#define VL53L0X_ERROR_GPIO_NOT_EXISTING ((VL53L0X_Error) - 10) - /*!< User tried to setup a non-existing GPIO pin */ -#define VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED ((VL53L0X_Error) - 11) - /*!< unsupported GPIO functionality */ -#define VL53L0X_ERROR_INTERRUPT_NOT_CLEARED ((VL53L0X_Error) - 12) - /*!< Error during interrupt clear */ -#define VL53L0X_ERROR_CONTROL_INTERFACE ((VL53L0X_Error) - 20) - /*!< error reported from IO functions */ -#define VL53L0X_ERROR_INVALID_COMMAND ((VL53L0X_Error) - 30) - /*!< The command is not allowed in the current device state - * (power down) - */ -#define VL53L0X_ERROR_DIVISION_BY_ZERO ((VL53L0X_Error) - 40) - /*!< In the function a division by zero occurs */ -#define VL53L0X_ERROR_REF_SPAD_INIT ((VL53L0X_Error) - 50) - /*!< Error during reference SPAD initialization */ -#define VL53L0X_ERROR_NOT_IMPLEMENTED ((VL53L0X_Error) - 99) - /*!< Tells requested functionality has not been implemented yet or - * not compatible with the device - */ -/** @} VL53L0X_define_Error_group */ - - -/** @defgroup VL53L0X_define_DeviceModes_group Defines Device modes - * Defines all possible modes for the device - * @{ - */ -typedef uint8_t VL53L0X_DeviceModes; - -#define VL53L0X_DEVICEMODE_SINGLE_RANGING ((VL53L0X_DeviceModes) 0) -#define VL53L0X_DEVICEMODE_CONTINUOUS_RANGING ((VL53L0X_DeviceModes) 1) -#define VL53L0X_DEVICEMODE_SINGLE_HISTOGRAM ((VL53L0X_DeviceModes) 2) -#define VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING ((VL53L0X_DeviceModes) 3) -#define VL53L0X_DEVICEMODE_SINGLE_ALS ((VL53L0X_DeviceModes) 10) -#define VL53L0X_DEVICEMODE_GPIO_DRIVE ((VL53L0X_DeviceModes) 20) -#define VL53L0X_DEVICEMODE_GPIO_OSC ((VL53L0X_DeviceModes) 21) - /* ... Modes to be added depending on device */ -/** @} VL53L0X_define_DeviceModes_group */ - - - -/** @defgroup VL53L0X_define_HistogramModes_group Defines Histogram modes - * Defines all possible Histogram modes for the device - * @{ - */ -typedef uint8_t VL53L0X_HistogramModes; - -#define VL53L0X_HISTOGRAMMODE_DISABLED ((VL53L0X_HistogramModes) 0) - /*!< Histogram Disabled */ -#define VL53L0X_HISTOGRAMMODE_REFERENCE_ONLY ((VL53L0X_HistogramModes) 1) - /*!< Histogram Reference array only */ -#define VL53L0X_HISTOGRAMMODE_RETURN_ONLY ((VL53L0X_HistogramModes) 2) - /*!< Histogram Return array only */ -#define VL53L0X_HISTOGRAMMODE_BOTH ((VL53L0X_HistogramModes) 3) - /*!< Histogram both Reference and Return Arrays */ - /* ... Modes to be added depending on device */ -/** @} VL53L0X_define_HistogramModes_group */ - - -/** @defgroup VL53L0X_define_PowerModes_group List of available Power Modes - * List of available Power Modes - * @{ - */ - -typedef uint8_t VL53L0X_PowerModes; - -#define VL53L0X_POWERMODE_STANDBY_LEVEL1 ((VL53L0X_PowerModes) 0) - /*!< Standby level 1 */ -#define VL53L0X_POWERMODE_STANDBY_LEVEL2 ((VL53L0X_PowerModes) 1) - /*!< Standby level 2 */ -#define VL53L0X_POWERMODE_IDLE_LEVEL1 ((VL53L0X_PowerModes) 2) - /*!< Idle level 1 */ -#define VL53L0X_POWERMODE_IDLE_LEVEL2 ((VL53L0X_PowerModes) 3) - /*!< Idle level 2 */ - -/** @} VL53L0X_define_PowerModes_group */ - - -#define VL53L0X_DMAX_LUT_SIZE 7 - /*!< Defines the number of items in the DMAX lookup table */ - -/** @brief Structure defining data pair that makes up the DMAX Lookup table. - */ -typedef struct { - FixPoint1616_t ambRate_mcps[VL53L0X_DMAX_LUT_SIZE]; - /*!< Ambient rate (mcps) */ - FixPoint1616_t dmax_mm[VL53L0X_DMAX_LUT_SIZE]; - /*!< DMAX Value (mm) */ -} VL53L0X_DMaxLUT_t; - -/** @brief Defines all parameters for the device - */ -typedef struct { - VL53L0X_DeviceModes DeviceMode; - /*!< Defines type of measurement to be done for the next measure */ - VL53L0X_HistogramModes HistogramMode; - /*!< Defines type of histogram measurement to be done for the next - * measure - */ - uint32_t MeasurementTimingBudgetMicroSeconds; - /*!< Defines the allowed total time for a single measurement */ - uint32_t InterMeasurementPeriodMilliSeconds; - /*!< Defines time between two consecutive measurements (between two - * measurement starts). If set to 0 means back-to-back mode - */ - uint8_t XTalkCompensationEnable; - /*!< Tells if Crosstalk compensation shall be enable or not */ - uint16_t XTalkCompensationRangeMilliMeter; - /*!< CrossTalk compensation range in millimeter */ - FixPoint1616_t XTalkCompensationRateMegaCps; - /*!< CrossTalk compensation rate in Mega counts per seconds. - * Expressed in 16.16 fixed point format. - */ - int32_t RangeOffsetMicroMeters; - /*!< Range offset adjustment (mm). */ - - uint8_t LimitChecksEnable[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; - /*!< This Array store all the Limit Check enable for this device. */ - uint8_t LimitChecksStatus[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; - /*!< This Array store all the Status of the check linked to last - * measurement. - */ - FixPoint1616_t LimitChecksValue[VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS]; - /*!< This Array store all the Limit Check value for this device */ - - VL53L0X_DMaxLUT_t dmax_lut; - /*!< Lookup table defining ambient rates and associated - * dmax values. - */ - - uint8_t WrapAroundCheckEnable; - /*!< Tells if Wrap Around Check shall be enable or not */ -} VL53L0X_DeviceParameters_t; - - -/** @defgroup VL53L0X_define_State_group Defines the current status - * of the device - * Defines the current status of the device - * @{ - */ - -typedef uint8_t VL53L0X_State; - -#define VL53L0X_STATE_POWERDOWN ((VL53L0X_State) 0) - /*!< Device is in HW reset */ -#define VL53L0X_STATE_WAIT_STATICINIT ((VL53L0X_State) 1) - /*!< Device is initialized and wait for static initialization */ -#define VL53L0X_STATE_STANDBY ((VL53L0X_State) 2) - /*!< Device is in Low power Standby mode */ -#define VL53L0X_STATE_IDLE ((VL53L0X_State) 3) - /*!< Device has been initialized and ready to do measurements */ -#define VL53L0X_STATE_RUNNING ((VL53L0X_State) 4) - /*!< Device is performing measurement */ -#define VL53L0X_STATE_UNKNOWN ((VL53L0X_State) 98) - /*!< Device is in unknown state and need to be rebooted */ -#define VL53L0X_STATE_ERROR ((VL53L0X_State) 99) - /*!< Device is in error state and need to be rebooted */ - -/** @} VL53L0X_define_State_group */ - - -/** - * @struct VL53L0X_RangeData_t - * @brief Range measurement data. - */ -typedef struct { - uint32_t TimeStamp; /*!< 32-bit time stamp. */ - uint32_t MeasurementTimeUsec; - /*!< Give the Measurement time needed by the device to do the - * measurement. - */ - - - uint16_t RangeMilliMeter; /*!< range distance in millimeter. */ - - uint16_t RangeDMaxMilliMeter; - /*!< Tells what is the maximum detection distance of the device - * in current setup and environment conditions (Filled when - * applicable) - */ - - FixPoint1616_t SignalRateRtnMegaCps; - /*!< Return signal rate (MCPS)\n these is a 16.16 fix point - * value, which is effectively a measure of target - * reflectance. - */ - FixPoint1616_t AmbientRateRtnMegaCps; - /*!< Return ambient rate (MCPS)\n these is a 16.16 fix point - * value, which is effectively a measure of the ambien - * t light. - */ - - uint16_t EffectiveSpadRtnCount; - /*!< Return the effective SPAD count for the return signal. - * To obtain Real value it should be divided by 256 - */ - - uint8_t ZoneId; - /*!< Denotes which zone and range scheduler stage the range - * data relates to. - */ - uint8_t RangeFractionalPart; - /*!< Fractional part of range distance. Final value is a - * FixPoint168 value. - */ - uint8_t RangeStatus; - /*!< Range Status for the current measurement. This is device - * dependent. Value = 0 means value is valid. - * See \ref RangeStatusPage - */ -} VL53L0X_RangingMeasurementData_t; - - -#define VL53L0X_HISTOGRAM_BUFFER_SIZE 24 - -/** - * @struct VL53L0X_HistogramData_t - * @brief Histogram measurement data. - */ -typedef struct { - /* Histogram Measurement data */ - uint32_t HistogramData[VL53L0X_HISTOGRAM_BUFFER_SIZE]; - /*!< Histogram data */ - /*!< Indicate the types of histogram data : - *Return only, Reference only, both Return and Reference - */ - uint8_t FirstBin; /*!< First Bin value */ - uint8_t BufferSize; /*!< Buffer Size - Set by the user.*/ - uint8_t NumberOfBins; - /*!< Number of bins filled by the histogram measurement */ - - VL53L0X_DeviceError ErrorStatus; - /*!< Error status of the current measurement. \n - * see @a ::VL53L0X_DeviceError @a VL53L0X_GetStatusErrorString() - */ -} VL53L0X_HistogramMeasurementData_t; - -#define VL53L0X_REF_SPAD_BUFFER_SIZE 6 - -/** - * @struct VL53L0X_SpadData_t - * @brief Spad Configuration Data. - */ -typedef struct { - uint8_t RefSpadEnables[VL53L0X_REF_SPAD_BUFFER_SIZE]; - /*!< Reference Spad Enables */ - uint8_t RefGoodSpadMap[VL53L0X_REF_SPAD_BUFFER_SIZE]; - /*!< Reference Spad Good Spad Map */ -} VL53L0X_SpadData_t; - -typedef struct { - FixPoint1616_t OscFrequencyMHz; /* Frequency used */ - - uint16_t LastEncodedTimeout; - /* last encoded Time out used for timing budget*/ - - VL53L0X_GpioFunctionality Pin0GpioFunctionality; - /* store the functionality of the GPIO: pin0 */ - - uint32_t FinalRangeTimeoutMicroSecs; - /*!< Execution time of the final range*/ - uint8_t FinalRangeVcselPulsePeriod; - /*!< Vcsel pulse period (pll clocks) for the final range measurement*/ - uint32_t PreRangeTimeoutMicroSecs; - /*!< Execution time of the final range*/ - uint8_t PreRangeVcselPulsePeriod; - /*!< Vcsel pulse period (pll clocks) for the pre-range measurement*/ - - uint16_t SigmaEstRefArray; - /*!< Reference array sigma value in 1/100th of [mm] e.g. 100 = 1mm */ - uint16_t SigmaEstEffPulseWidth; - /*!< Effective Pulse width for sigma estimate in 1/100th - * of ns e.g. 900 = 9.0ns - */ - uint16_t SigmaEstEffAmbWidth; - /*!< Effective Ambient width for sigma estimate in 1/100th of ns - * e.g. 500 = 5.0ns - */ - - - /* Indicate if read from device has been done (==1) or not (==0) */ - uint8_t ReadDataFromDeviceDone; - uint8_t ModuleId; /* Module ID */ - uint8_t Revision; /* test Revision */ - char ProductId[VL53L0X_MAX_STRING_LENGTH]; - /* Product Identifier String */ - uint8_t ReferenceSpadCount; /* used for ref spad management */ - uint8_t ReferenceSpadType; /* used for ref spad management */ - uint8_t RefSpadsInitialised; /* reports if ref spads are initialised. */ - uint32_t PartUIDUpper; /*!< Unique Part ID Upper */ - uint32_t PartUIDLower; /*!< Unique Part ID Lower */ - /*!< Peek Signal rate at 400 mm*/ - FixPoint1616_t SignalRateMeasFixed400mm; - -} VL53L0X_DeviceSpecificParameters_t; - -/** - * @struct VL53L0X_DevData_t - * - * @brief VL53L0X PAL device ST private data structure \n - * End user should never access any of these field directly - * - * These must never access directly but only via macro - */ -typedef struct { - int32_t Part2PartOffsetNVMMicroMeter; - /*!< backed up NVM value */ - int32_t Part2PartOffsetAdjustmentNVMMicroMeter; - /*!< backed up NVM value representing additional offset adjustment */ - VL53L0X_DeviceParameters_t CurrentParameters; - /*!< Current Device Parameter */ - VL53L0X_RangingMeasurementData_t LastRangeMeasure; - /*!< Ranging Data */ - VL53L0X_HistogramMeasurementData_t LastHistogramMeasure; - /*!< Histogram Data */ - VL53L0X_DeviceSpecificParameters_t DeviceSpecificParameters; - /*!< Parameters specific to the device */ - VL53L0X_SpadData_t SpadData; - /*!< Spad Data */ - uint8_t SequenceConfig; - /*!< Internal value for the sequence config */ - uint8_t RangeFractionalEnable; - /*!< Enable/Disable fractional part of ranging data */ - VL53L0X_State PalState; - /*!< Current state of the PAL for this device */ - VL53L0X_PowerModes PowerMode; - /*!< Current Power Mode */ - uint16_t SigmaEstRefArray; - /*!< Reference array sigma value in 1/100th of [mm] e.g. 100 = 1mm */ - uint16_t SigmaEstEffPulseWidth; - /*!< Effective Pulse width for sigma estimate in 1/100th - * of ns e.g. 900 = 9.0ns - */ - uint16_t SigmaEstEffAmbWidth; - /*!< Effective Ambient width for sigma estimate in 1/100th of ns - * e.g. 500 = 5.0ns - */ - uint8_t StopVariable; - /*!< StopVariable used during the stop sequence */ - uint16_t targetRefRate; - /*!< Target Ambient Rate for Ref spad management */ - FixPoint1616_t SigmaEstimate; - /*!< Sigma Estimate - based on ambient & VCSEL rates and - * signal_total_events - */ - FixPoint1616_t SignalEstimate; - /*!< Signal Estimate - based on ambient & VCSEL rates and cross talk */ - FixPoint1616_t LastSignalRefMcps; - /*!< Latest Signal ref in Mcps */ - uint8_t *pTuningSettingsPointer; - /*!< Pointer for Tuning Settings table */ - uint8_t UseInternalTuningSettings; - /*!< Indicate if we use Tuning Settings table */ - uint16_t LinearityCorrectiveGain; - /*!< Linearity Corrective Gain value in x1000 */ -} VL53L0X_DevData_t; - - -/** @defgroup VL53L0X_define_InterruptPolarity_group Defines the Polarity - * of the Interrupt - * Defines the Polarity of the Interrupt - * @{ - */ -typedef uint8_t VL53L0X_InterruptPolarity; - -#define VL53L0X_INTERRUPTPOLARITY_LOW ((VL53L0X_InterruptPolarity) 0) -/*!< Set active low polarity best setup for falling edge. */ -#define VL53L0X_INTERRUPTPOLARITY_HIGH ((VL53L0X_InterruptPolarity) 1) -/*!< Set active high polarity best setup for rising edge. */ - -/** @} VL53L0X_define_InterruptPolarity_group */ - - -/** @defgroup VL53L0X_define_VcselPeriod_group Vcsel Period Defines - * Defines the range measurement for which to access the vcsel period. - * @{ - */ -typedef uint8_t VL53L0X_VcselPeriod; - -#define VL53L0X_VCSEL_PERIOD_PRE_RANGE ((VL53L0X_VcselPeriod) 0) -/*!>9)&0xFFFF) -#define VL53L0X_FIXPOINT97TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<9) - -#define VL53L0X_FIXPOINT1616TOFIXPOINT88(Value) \ - (uint16_t)((Value>>8)&0xFFFF) -#define VL53L0X_FIXPOINT88TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<8) - -#define VL53L0X_FIXPOINT1616TOFIXPOINT412(Value) \ - (uint16_t)((Value>>4)&0xFFFF) -#define VL53L0X_FIXPOINT412TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<4) - -#define VL53L0X_FIXPOINT1616TOFIXPOINT313(Value) \ - (uint16_t)((Value>>3)&0xFFFF) -#define VL53L0X_FIXPOINT313TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<3) - -#define VL53L0X_FIXPOINT1616TOFIXPOINT08(Value) \ - (uint8_t)((Value>>8)&0x00FF) -#define VL53L0X_FIXPOINT08TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<8) - -#define VL53L0X_FIXPOINT1616TOFIXPOINT53(Value) \ - (uint8_t)((Value>>13)&0x00FF) -#define VL53L0X_FIXPOINT53TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<13) - -#define VL53L0X_FIXPOINT1616TOFIXPOINT102(Value) \ - (uint16_t)((Value>>14)&0x0FFF) -#define VL53L0X_FIXPOINT102TOFIXPOINT1616(Value) \ - (FixPoint1616_t)(Value<<12) - -#define VL53L0X_MAKEUINT16(lsb, msb) (uint16_t)((((uint16_t)msb)<<8) + \ - (uint16_t)lsb) - -/** @} VL53L0X_define_GeneralMacro_group */ - -/** @} VL53L0X_globaldefine_group */ - - - - - - - -#ifdef __cplusplus -} -#endif - - -#endif /* _VL53L0X_DEF_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" deleted file mode 100644 index f9412411..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_device.h" +++ /dev/null @@ -1,262 +0,0 @@ -/******************************************************************************* - * Copyright � 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - -/** - * Device specific defines. To be adapted by implementer for the targeted - * device. - */ - -#ifndef _VL53L0X_DEVICE_H_ -#define _VL53L0X_DEVICE_H_ - -#include "vl53l0x_types.h" - - -/** @defgroup VL53L0X_DevSpecDefines_group VL53L0X cut1.1 Device - * Specific Defines - * @brief VL53L0X cut1.1 Device Specific Defines - * @{ - */ - - -/** @defgroup VL53L0X_DeviceError_group Device Error - * @brief Device Error code - * - * This enum is Device specific it should be updated in the implementation - * Use @a VL53L0X_GetStatusErrorString() to get the string. - * It is related to Status Register of the Device. - * @{ - */ -typedef uint8_t VL53L0X_DeviceError; - -#define VL53L0X_DEVICEERROR_NONE ((VL53L0X_DeviceError) 0) - /*!< 0 NoError */ -#define VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE ((VL53L0X_DeviceError) 1) -#define VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE ((VL53L0X_DeviceError) 2) -#define VL53L0X_DEVICEERROR_NOVHVVALUEFOUND ((VL53L0X_DeviceError) 3) -#define VL53L0X_DEVICEERROR_MSRCNOTARGET ((VL53L0X_DeviceError) 4) -#define VL53L0X_DEVICEERROR_SNRCHECK ((VL53L0X_DeviceError) 5) -#define VL53L0X_DEVICEERROR_RANGEPHASECHECK ((VL53L0X_DeviceError) 6) -#define VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK ((VL53L0X_DeviceError) 7) -#define VL53L0X_DEVICEERROR_TCC ((VL53L0X_DeviceError) 8) -#define VL53L0X_DEVICEERROR_PHASECONSISTENCY ((VL53L0X_DeviceError) 9) -#define VL53L0X_DEVICEERROR_MINCLIP ((VL53L0X_DeviceError) 10) -#define VL53L0X_DEVICEERROR_RANGECOMPLETE ((VL53L0X_DeviceError) 11) -#define VL53L0X_DEVICEERROR_ALGOUNDERFLOW ((VL53L0X_DeviceError) 12) -#define VL53L0X_DEVICEERROR_ALGOOVERFLOW ((VL53L0X_DeviceError) 13) -#define VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD ((VL53L0X_DeviceError) 14) - -/** @} end of VL53L0X_DeviceError_group */ - - -/** @defgroup VL53L0X_CheckEnable_group Check Enable list - * @brief Check Enable code - * - * Define used to specify the LimitCheckId. - * Use @a VL53L0X_GetLimitCheckInfo() to get the string. - * @{ - */ - -#define VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE 0 -#define VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE 1 -#define VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP 2 -#define VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD 3 -#define VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC 4 -#define VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE 5 - -#define VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS 6 - -/** @} end of VL53L0X_CheckEnable_group */ - - -/** @defgroup VL53L0X_GpioFunctionality_group Gpio Functionality - * @brief Defines the different functionalities for the device GPIO(s) - * @{ - */ -typedef uint8_t VL53L0X_GpioFunctionality; - -#define VL53L0X_GPIOFUNCTIONALITY_OFF \ - ((VL53L0X_GpioFunctionality) 0) /*!< NO Interrupt */ -#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW \ - ((VL53L0X_GpioFunctionality) 1) /*!< Level Low (value < thresh_low) */ -#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH \ - ((VL53L0X_GpioFunctionality) 2) /*!< Level High (value>thresh_high) */ -#define VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT \ - ((VL53L0X_GpioFunctionality) 3) - /*!< Out Of Window (value < thresh_low OR value > thresh_high) */ -#define VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY \ - ((VL53L0X_GpioFunctionality) 4) /*!< New Sample Ready */ - -/** @} end of VL53L0X_GpioFunctionality_group */ - - -/* Device register map */ - -/** @defgroup VL53L0X_DefineRegisters_group Define Registers - * @brief List of all the defined registers - * @{ - */ -#define VL53L0X_REG_SYSRANGE_START 0x000 - /** mask existing bit in #VL53L0X_REG_SYSRANGE_START*/ - #define VL53L0X_REG_SYSRANGE_MODE_MASK 0x0F - /** bit 0 in #VL53L0X_REG_SYSRANGE_START write 1 toggle state in - * continuous mode and arm next shot in single shot mode - */ - #define VL53L0X_REG_SYSRANGE_MODE_START_STOP 0x01 - /** bit 1 write 0 in #VL53L0X_REG_SYSRANGE_START set single shot mode */ - #define VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT 0x00 - /** bit 1 write 1 in #VL53L0X_REG_SYSRANGE_START set back-to-back - * operation mode - */ - #define VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK 0x02 - /** bit 2 write 1 in #VL53L0X_REG_SYSRANGE_START set timed operation - * mode - */ - #define VL53L0X_REG_SYSRANGE_MODE_TIMED 0x04 - /** bit 3 write 1 in #VL53L0X_REG_SYSRANGE_START set histogram operation - * mode - */ - #define VL53L0X_REG_SYSRANGE_MODE_HISTOGRAM 0x08 - - -#define VL53L0X_REG_SYSTEM_THRESH_HIGH 0x000C -#define VL53L0X_REG_SYSTEM_THRESH_LOW 0x000E - - -#define VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG 0x0001 -#define VL53L0X_REG_SYSTEM_RANGE_CONFIG 0x0009 -#define VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD 0x0004 - - -#define VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO 0x000A - #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_DISABLED 0x00 - #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_LEVEL_LOW 0x01 - #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_LEVEL_HIGH 0x02 - #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_OUT_OF_WINDOW 0x03 - #define VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY 0x04 - -#define VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH 0x0084 - - -#define VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR 0x000B - -/* Result registers */ -#define VL53L0X_REG_RESULT_INTERRUPT_STATUS 0x0013 -#define VL53L0X_REG_RESULT_RANGE_STATUS 0x0014 - -#define VL53L0X_REG_RESULT_CORE_PAGE 1 -#define VL53L0X_REG_RESULT_CORE_AMBIENT_WINDOW_EVENTS_RTN 0x00BC -#define VL53L0X_REG_RESULT_CORE_RANGING_TOTAL_EVENTS_RTN 0x00C0 -#define VL53L0X_REG_RESULT_CORE_AMBIENT_WINDOW_EVENTS_REF 0x00D0 -#define VL53L0X_REG_RESULT_CORE_RANGING_TOTAL_EVENTS_REF 0x00D4 -#define VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF 0x00B6 - -/* Algo register */ - -#define VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM 0x0028 - -#define VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS 0x008a - -/* Check Limit registers */ -#define VL53L0X_REG_MSRC_CONFIG_CONTROL 0x0060 - -#define VL53L0X_REG_PRE_RANGE_CONFIG_MIN_SNR 0X0027 -#define VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW 0x0056 -#define VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH 0x0057 -#define VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT 0x0064 - -#define VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_SNR 0X0067 -#define VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW 0x0047 -#define VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH 0x0048 -#define VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT 0x0044 - - -#define VL53L0X_REG_PRE_RANGE_CONFIG_SIGMA_THRESH_HI 0X0061 -#define VL53L0X_REG_PRE_RANGE_CONFIG_SIGMA_THRESH_LO 0X0062 - -/* PRE RANGE registers */ -#define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD 0x0050 -#define VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI 0x0051 -#define VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_LO 0x0052 - -#define VL53L0X_REG_SYSTEM_HISTOGRAM_BIN 0x0081 -#define VL53L0X_REG_HISTOGRAM_CONFIG_INITIAL_PHASE_SELECT 0x0033 -#define VL53L0X_REG_HISTOGRAM_CONFIG_READOUT_CTRL 0x0055 - -#define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x0070 -#define VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI 0x0071 -#define VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_LO 0x0072 -#define VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS 0x0020 - -#define VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP 0x0046 - - -#define VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N 0x00bf -#define VL53L0X_REG_IDENTIFICATION_MODEL_ID 0x00c0 -#define VL53L0X_REG_IDENTIFICATION_REVISION_ID 0x00c2 - -#define VL53L0X_REG_OSC_CALIBRATE_VAL 0x00f8 - - -#define VL53L0X_SIGMA_ESTIMATE_MAX_VALUE 65535 -/* equivalent to a range sigma of 655.35mm */ - -#define VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH 0x032 -#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0 0x0B0 -#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_1 0x0B1 -#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_2 0x0B2 -#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_3 0x0B3 -#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_4 0x0B4 -#define VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_5 0x0B5 - -#define VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT 0xB6 -#define VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD 0x4E /* 0x14E */ -#define VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET 0x4F /* 0x14F */ -#define VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE 0x80 - -/* - * Speed of light in um per 1E-10 Seconds - */ - -#define VL53L0X_SPEED_OF_LIGHT_IN_AIR 2997 - -#define VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV 0x0089 - -#define VL53L0X_REG_ALGO_PHASECAL_LIM 0x0030 /* 0x130 */ -#define VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT 0x0030 - -/** @} VL53L0X_DefineRegisters_group */ - -/** @} VL53L0X_DevSpecDefines_group */ - - -#endif - -/* _VL53L0X_DEVICE_H_ */ - - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" deleted file mode 100644 index d3edb6cc..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_interrupt_threshold_settings.h" +++ /dev/null @@ -1,194 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - - -#ifndef _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ -#define _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ - - -#ifdef __cplusplus -extern "C" { -#endif - - -uint8_t InterruptThresholdSettings[] = { - - /* Start of Interrupt Threshold Settings */ - 0x1, 0xff, 0x00, - 0x1, 0x80, 0x01, - 0x1, 0xff, 0x01, - 0x1, 0x00, 0x00, - 0x1, 0xff, 0x01, - 0x1, 0x4f, 0x02, - 0x1, 0xFF, 0x0E, - 0x1, 0x00, 0x03, - 0x1, 0x01, 0x84, - 0x1, 0x02, 0x0A, - 0x1, 0x03, 0x03, - 0x1, 0x04, 0x08, - 0x1, 0x05, 0xC8, - 0x1, 0x06, 0x03, - 0x1, 0x07, 0x8D, - 0x1, 0x08, 0x08, - 0x1, 0x09, 0xC6, - 0x1, 0x0A, 0x01, - 0x1, 0x0B, 0x02, - 0x1, 0x0C, 0x00, - 0x1, 0x0D, 0xD5, - 0x1, 0x0E, 0x18, - 0x1, 0x0F, 0x12, - 0x1, 0x10, 0x01, - 0x1, 0x11, 0x82, - 0x1, 0x12, 0x00, - 0x1, 0x13, 0xD5, - 0x1, 0x14, 0x18, - 0x1, 0x15, 0x13, - 0x1, 0x16, 0x03, - 0x1, 0x17, 0x86, - 0x1, 0x18, 0x0A, - 0x1, 0x19, 0x09, - 0x1, 0x1A, 0x08, - 0x1, 0x1B, 0xC2, - 0x1, 0x1C, 0x03, - 0x1, 0x1D, 0x8F, - 0x1, 0x1E, 0x0A, - 0x1, 0x1F, 0x06, - 0x1, 0x20, 0x01, - 0x1, 0x21, 0x02, - 0x1, 0x22, 0x00, - 0x1, 0x23, 0xD5, - 0x1, 0x24, 0x18, - 0x1, 0x25, 0x22, - 0x1, 0x26, 0x01, - 0x1, 0x27, 0x82, - 0x1, 0x28, 0x00, - 0x1, 0x29, 0xD5, - 0x1, 0x2A, 0x18, - 0x1, 0x2B, 0x0B, - 0x1, 0x2C, 0x28, - 0x1, 0x2D, 0x78, - 0x1, 0x2E, 0x28, - 0x1, 0x2F, 0x91, - 0x1, 0x30, 0x00, - 0x1, 0x31, 0x0B, - 0x1, 0x32, 0x00, - 0x1, 0x33, 0x0B, - 0x1, 0x34, 0x00, - 0x1, 0x35, 0xA1, - 0x1, 0x36, 0x00, - 0x1, 0x37, 0xA0, - 0x1, 0x38, 0x00, - 0x1, 0x39, 0x04, - 0x1, 0x3A, 0x28, - 0x1, 0x3B, 0x30, - 0x1, 0x3C, 0x0C, - 0x1, 0x3D, 0x04, - 0x1, 0x3E, 0x0F, - 0x1, 0x3F, 0x79, - 0x1, 0x40, 0x28, - 0x1, 0x41, 0x1E, - 0x1, 0x42, 0x2F, - 0x1, 0x43, 0x87, - 0x1, 0x44, 0x00, - 0x1, 0x45, 0x0B, - 0x1, 0x46, 0x00, - 0x1, 0x47, 0x0B, - 0x1, 0x48, 0x00, - 0x1, 0x49, 0xA7, - 0x1, 0x4A, 0x00, - 0x1, 0x4B, 0xA6, - 0x1, 0x4C, 0x00, - 0x1, 0x4D, 0x04, - 0x1, 0x4E, 0x01, - 0x1, 0x4F, 0x00, - 0x1, 0x50, 0x00, - 0x1, 0x51, 0x80, - 0x1, 0x52, 0x09, - 0x1, 0x53, 0x08, - 0x1, 0x54, 0x01, - 0x1, 0x55, 0x00, - 0x1, 0x56, 0x0F, - 0x1, 0x57, 0x79, - 0x1, 0x58, 0x09, - 0x1, 0x59, 0x05, - 0x1, 0x5A, 0x00, - 0x1, 0x5B, 0x60, - 0x1, 0x5C, 0x05, - 0x1, 0x5D, 0xD1, - 0x1, 0x5E, 0x0C, - 0x1, 0x5F, 0x3C, - 0x1, 0x60, 0x00, - 0x1, 0x61, 0xD0, - 0x1, 0x62, 0x0B, - 0x1, 0x63, 0x03, - 0x1, 0x64, 0x28, - 0x1, 0x65, 0x10, - 0x1, 0x66, 0x2A, - 0x1, 0x67, 0x39, - 0x1, 0x68, 0x0B, - 0x1, 0x69, 0x02, - 0x1, 0x6A, 0x28, - 0x1, 0x6B, 0x10, - 0x1, 0x6C, 0x2A, - 0x1, 0x6D, 0x61, - 0x1, 0x6E, 0x0C, - 0x1, 0x6F, 0x00, - 0x1, 0x70, 0x0F, - 0x1, 0x71, 0x79, - 0x1, 0x72, 0x00, - 0x1, 0x73, 0x0B, - 0x1, 0x74, 0x00, - 0x1, 0x75, 0x0B, - 0x1, 0x76, 0x00, - 0x1, 0x77, 0xA1, - 0x1, 0x78, 0x00, - 0x1, 0x79, 0xA0, - 0x1, 0x7A, 0x00, - 0x1, 0x7B, 0x04, - 0x1, 0xFF, 0x04, - 0x1, 0x79, 0x1D, - 0x1, 0x7B, 0x27, - 0x1, 0x96, 0x0E, - 0x1, 0x97, 0xFE, - 0x1, 0x98, 0x03, - 0x1, 0x99, 0xEF, - 0x1, 0x9A, 0x02, - 0x1, 0x9B, 0x44, - 0x1, 0x73, 0x07, - 0x1, 0x70, 0x01, - 0x1, 0xff, 0x01, - 0x1, 0x00, 0x01, - 0x1, 0xff, 0x00, - 0x00, 0x00, 0x00 -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_INTERRUPT_THRESHOLD_SETTINGS_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" deleted file mode 100644 index fa8418de..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/inc/vl53l0x_tuning.h" +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*******************************************************************************/ - - -#ifndef _VL53L0X_TUNING_H_ -#define _VL53L0X_TUNING_H_ - -#include "vl53l0x_def.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -uint8_t DefaultTuningSettings[] = { - - /* update 02/11/2015_v36 */ - 0x01, 0xFF, 0x01, - 0x01, 0x00, 0x00, - - 0x01, 0xFF, 0x00, - 0x01, 0x09, 0x00, - 0x01, 0x10, 0x00, - 0x01, 0x11, 0x00, - - 0x01, 0x24, 0x01, - 0x01, 0x25, 0xff, - 0x01, 0x75, 0x00, - - 0x01, 0xFF, 0x01, - 0x01, 0x4e, 0x2c, - 0x01, 0x48, 0x00, - 0x01, 0x30, 0x20, - - 0x01, 0xFF, 0x00, - 0x01, 0x30, 0x09, /* mja changed from 0x64. */ - 0x01, 0x54, 0x00, - 0x01, 0x31, 0x04, - 0x01, 0x32, 0x03, - 0x01, 0x40, 0x83, - 0x01, 0x46, 0x25, - 0x01, 0x60, 0x00, - 0x01, 0x27, 0x00, - 0x01, 0x50, 0x06, - 0x01, 0x51, 0x00, - 0x01, 0x52, 0x96, - 0x01, 0x56, 0x08, - 0x01, 0x57, 0x30, - 0x01, 0x61, 0x00, - 0x01, 0x62, 0x00, - 0x01, 0x64, 0x00, - 0x01, 0x65, 0x00, - 0x01, 0x66, 0xa0, - - 0x01, 0xFF, 0x01, - 0x01, 0x22, 0x32, - 0x01, 0x47, 0x14, - 0x01, 0x49, 0xff, - 0x01, 0x4a, 0x00, - - 0x01, 0xFF, 0x00, - 0x01, 0x7a, 0x0a, - 0x01, 0x7b, 0x00, - 0x01, 0x78, 0x21, - - 0x01, 0xFF, 0x01, - 0x01, 0x23, 0x34, - 0x01, 0x42, 0x00, - 0x01, 0x44, 0xff, - 0x01, 0x45, 0x26, - 0x01, 0x46, 0x05, - 0x01, 0x40, 0x40, - 0x01, 0x0E, 0x06, - 0x01, 0x20, 0x1a, - 0x01, 0x43, 0x40, - - 0x01, 0xFF, 0x00, - 0x01, 0x34, 0x03, - 0x01, 0x35, 0x44, - - 0x01, 0xFF, 0x01, - 0x01, 0x31, 0x04, - 0x01, 0x4b, 0x09, - 0x01, 0x4c, 0x05, - 0x01, 0x4d, 0x04, - - - 0x01, 0xFF, 0x00, - 0x01, 0x44, 0x00, - 0x01, 0x45, 0x20, - 0x01, 0x47, 0x08, - 0x01, 0x48, 0x28, - 0x01, 0x67, 0x00, - 0x01, 0x70, 0x04, - 0x01, 0x71, 0x01, - 0x01, 0x72, 0xfe, - 0x01, 0x76, 0x00, - 0x01, 0x77, 0x00, - - 0x01, 0xFF, 0x01, - 0x01, 0x0d, 0x01, - - 0x01, 0xFF, 0x00, - 0x01, 0x80, 0x01, - 0x01, 0x01, 0xF8, - - 0x01, 0xFF, 0x01, - 0x01, 0x8e, 0x01, - 0x01, 0x00, 0x01, - 0x01, 0xFF, 0x00, - 0x01, 0x80, 0x00, - - 0x00, 0x00, 0x00 -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_TUNING_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" deleted file mode 100644 index 3f0ed04e..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api.c" +++ /dev/null @@ -1,3142 +0,0 @@ -/******************************************************************************* - * Copyright � 2016, STMicroelectronics International N.V. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND - NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. - IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -#include "vl53l0x_api.h" -#include "vl53l0x_tuning.h" -#include "vl53l0x_interrupt_threshold_settings.h" -#include "vl53l0x_api_core.h" -#include "vl53l0x_api_calibration.h" -#include "vl53l0x_api_strings.h" - - -#ifndef __KERNEL__ -#include -#endif -#define LOG_FUNCTION_START(fmt, ...) \ - _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) -#define LOG_FUNCTION_END(status, ...) \ - _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) -#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ - _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) - -#ifdef VL53L0X_LOG_ENABLE -#define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_API, \ - level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) -#endif - -/* Group PAL General Functions */ - -VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - pVersion->major = VL53L0X_IMPLEMENTATION_VER_MAJOR; - pVersion->minor = VL53L0X_IMPLEMENTATION_VER_MINOR; - pVersion->build = VL53L0X_IMPLEMENTATION_VER_SUB; - - pVersion->revision = VL53L0X_IMPLEMENTATION_VER_REVISION; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetPalSpecVersion(VL53L0X_Version_t *pPalSpecVersion) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - pPalSpecVersion->major = VL53L0X_SPECIFICATION_VER_MAJOR; - pPalSpecVersion->minor = VL53L0X_SPECIFICATION_VER_MINOR; - pPalSpecVersion->build = VL53L0X_SPECIFICATION_VER_SUB; - - pPalSpecVersion->revision = VL53L0X_SPECIFICATION_VER_REVISION; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev, - uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t revision_id; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_IDENTIFICATION_REVISION_ID, - &revision_id); - *pProductRevisionMajor = 1; - *pProductRevisionMinor = (revision_id & 0xF0) >> 4; - - LOG_FUNCTION_END(Status); - return Status; - -} - -VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev, - VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_device_info(Dev, pVL53L0X_DeviceInfo); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev, - VL53L0X_DeviceError *pDeviceErrorStatus) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t RangeStatus; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, - &RangeStatus); - - *pDeviceErrorStatus = (VL53L0X_DeviceError)((RangeStatus & 0x78) >> 3); - - LOG_FUNCTION_END(Status); - return Status; -} - - -VL53L0X_Error VL53L0X_GetDeviceErrorString(VL53L0X_DeviceError ErrorCode, - char *pDeviceErrorString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_device_error_string(ErrorCode, pDeviceErrorString); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus, - char *pRangeStatusString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_range_status_string(RangeStatus, - pRangeStatusString); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode, - char *pPalErrorString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_pal_error_string(PalErrorCode, pPalErrorString); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode, - char *pPalStateString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_pal_state_string(PalStateCode, pPalStateString); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, VL53L0X_State *pPalState) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *pPalState = PALDevDataGet(Dev, PalState); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, - VL53L0X_PowerModes PowerMode) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - /* Only level1 of Power mode exists */ - if ((PowerMode != VL53L0X_POWERMODE_STANDBY_LEVEL1) - && (PowerMode != VL53L0X_POWERMODE_IDLE_LEVEL1)) { - Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; - } else if (PowerMode == VL53L0X_POWERMODE_STANDBY_LEVEL1) { - /* set the standby level1 of power mode */ - Status = VL53L0X_WrByte(Dev, 0x80, 0x00); - if (Status == VL53L0X_ERROR_NONE) { - /* Set PAL State to standby */ - PALDevDataSet(Dev, PalState, VL53L0X_STATE_STANDBY); - PALDevDataSet(Dev, PowerMode, - VL53L0X_POWERMODE_STANDBY_LEVEL1); - } - - } else { - /* VL53L0X_POWERMODE_IDLE_LEVEL1 */ - Status = VL53L0X_WrByte(Dev, 0x80, 0x00); - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_StaticInit(Dev); - - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, PowerMode, - VL53L0X_POWERMODE_IDLE_LEVEL1); - - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, - VL53L0X_PowerModes *pPowerMode) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte; - - LOG_FUNCTION_START(""); - - /* Only level1 of Power mode exists */ - Status = VL53L0X_RdByte(Dev, 0x80, &Byte); - - if (Status == VL53L0X_ERROR_NONE) { - if (Byte == 1) { - PALDevDataSet(Dev, PowerMode, - VL53L0X_POWERMODE_IDLE_LEVEL1); - } else { - PALDevDataSet(Dev, PowerMode, - VL53L0X_POWERMODE_STANDBY_LEVEL1); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, - int32_t OffsetCalibrationDataMicroMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_set_offset_calibration_data_micro_meter(Dev, - OffsetCalibrationDataMicroMeter); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev, - int32_t *pOffsetCalibrationDataMicroMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_offset_calibration_data_micro_meter(Dev, - pOffsetCalibrationDataMicroMeter); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev, - int16_t LinearityCorrectiveGain) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - if ((LinearityCorrectiveGain < 0) || (LinearityCorrectiveGain > 1000)) - Status = VL53L0X_ERROR_INVALID_PARAMS; - else { - PALDevDataSet(Dev, LinearityCorrectiveGain, - LinearityCorrectiveGain); - - if (LinearityCorrectiveGain != 1000) { - /* Disable FW Xtalk */ - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, 0); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev, - uint16_t *pLinearityCorrectiveGain) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *pLinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, uint8_t GroupParamHold) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev, - uint16_t *pUpperLimitMilliMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev, - FixPoint1616_t *pTotalSignalRate) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; - - LOG_FUNCTION_START(""); - - LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); - - Status = VL53L0X_get_total_signal_rate( - Dev, &LastRangeDataBuffer, pTotalSignalRate); - - LOG_FUNCTION_END(Status); - return Status; -} - -/* End Group PAL General Functions */ - -/* Group PAL Init Functions */ -VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, uint8_t DeviceAddress) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS, - DeviceAddress / 2); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_DeviceParameters_t CurrentParameters; - int i; - uint8_t StopVariable; - - LOG_FUNCTION_START(""); - - /* by default the I2C is running at 1V8 if you want to change it you - * need to include this define at compilation level. - */ -#ifdef USE_I2C_2V8 - Status = VL53L0X_UpdateByte(Dev, - VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV, - 0xFE, - 0x01); -#endif - - /* Set I2C standard mode */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, 0x88, 0x00); - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, 0); - -#ifdef USE_IQC_STATION - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_apply_offset_adjustment(Dev); -#endif - - /* Default value is 1000 for Linearity Corrective Gain */ - PALDevDataSet(Dev, LinearityCorrectiveGain, 1000); - - /* Set Default static parameters - *set first temporary values 9.44MHz * 65536 = 618660 - */ - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, 618660); - - /* Set Default XTalkCompensationRateMegaCps to 0 */ - VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, 0); - - /* Get default parameters */ - Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); - if (Status == VL53L0X_ERROR_NONE) { - /* initialize PAL values */ - CurrentParameters.DeviceMode = - VL53L0X_DEVICEMODE_SINGLE_RANGING; - CurrentParameters.HistogramMode = - VL53L0X_HISTOGRAMMODE_DISABLED; - - /* Dmax lookup table */ - /* 0.0 */ - CurrentParameters.dmax_lut.ambRate_mcps[0] = (FixPoint1616_t)0x00000000; - /* 1200 */ - CurrentParameters.dmax_lut.dmax_mm[0] = (FixPoint1616_t)0x04B00000; - /* 0.7 */ - CurrentParameters.dmax_lut.ambRate_mcps[1] = (FixPoint1616_t)0x0000B333; - /* 1100 */ - CurrentParameters.dmax_lut.dmax_mm[1] = (FixPoint1616_t)0x044C0000; - /* 2 */ - CurrentParameters.dmax_lut.ambRate_mcps[2] = (FixPoint1616_t)0x00020000; - /* 900 */ - CurrentParameters.dmax_lut.dmax_mm[2] = (FixPoint1616_t)0x03840000; - /* 3.8 */ - CurrentParameters.dmax_lut.ambRate_mcps[3] = (FixPoint1616_t)0x0003CCCC; - /* 750 */ - CurrentParameters.dmax_lut.dmax_mm[3] = (FixPoint1616_t)0x02EE0000; - /* 7.3 */ - CurrentParameters.dmax_lut.ambRate_mcps[4] = (FixPoint1616_t)0x00074CCC; - /* 550 */ - CurrentParameters.dmax_lut.dmax_mm[4] = (FixPoint1616_t)0x02260000; - /* 10 */ - CurrentParameters.dmax_lut.ambRate_mcps[5] = (FixPoint1616_t)0x000A0000; - /* 500 */ - CurrentParameters.dmax_lut.dmax_mm[5] = (FixPoint1616_t)0x01F40000; - /* 15 */ - CurrentParameters.dmax_lut.ambRate_mcps[6] = (FixPoint1616_t)0x000F0000; - /* 400 */ - CurrentParameters.dmax_lut.dmax_mm[6] = (FixPoint1616_t)0x01900000; - - PALDevDataSet(Dev, CurrentParameters, CurrentParameters); - } - - /* Sigma estimator variable */ - PALDevDataSet(Dev, SigmaEstRefArray, 100); - PALDevDataSet(Dev, SigmaEstEffPulseWidth, 900); - PALDevDataSet(Dev, SigmaEstEffAmbWidth, 500); - PALDevDataSet(Dev, targetRefRate, 0x0A00); /* 20 MCPS in 9:7 format */ - - /* Use internal default settings */ - PALDevDataSet(Dev, UseInternalTuningSettings, 1); - - Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); - Status |= VL53L0X_RdByte(Dev, 0x91, &StopVariable); - PALDevDataSet(Dev, StopVariable, StopVariable); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); - - /* Enable all check */ - for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { - if (Status == VL53L0X_ERROR_NONE) - Status |= VL53L0X_SetLimitCheckEnable(Dev, i, 1); - else - break; - - } - - /* Disable the following checks */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0); - - /* Limit default values */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_SetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, - (FixPoint1616_t)(18 * 65536)); - } - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_SetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, - (FixPoint1616_t)(25 * 65536 / 100)); - /* 0.25 * 65536 */ - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_SetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, - (FixPoint1616_t)(35 * 65536)); - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_SetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - (FixPoint1616_t)(0 * 65536)); - } - - if (Status == VL53L0X_ERROR_NONE) { - - PALDevDataSet(Dev, SequenceConfig, 0xFF); - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - 0xFF); - - /* Set PAL state to tell that we are waiting for call to - * VL53L0X_StaticInit - */ - PALDevDataSet(Dev, PalState, VL53L0X_STATE_WAIT_STATICINIT); - } - - if (Status == VL53L0X_ERROR_NONE) - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 0); - - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev, - uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - if (UseInternalTuningSettings == 1) { - /* Force use internal settings */ - PALDevDataSet(Dev, UseInternalTuningSettings, 1); - } else { - - /* check that the first byte is not 0 */ - if (*pTuningSettingBuffer != 0) { - PALDevDataSet(Dev, pTuningSettingsPointer, - pTuningSettingBuffer); - PALDevDataSet(Dev, UseInternalTuningSettings, 0); - - } else { - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev, - uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *ppTuningSettingBuffer = PALDevDataGet(Dev, pTuningSettingsPointer); - *pUseInternalTuningSettings = PALDevDataGet(Dev, - UseInternalTuningSettings); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_DeviceParameters_t CurrentParameters = {0}; - uint8_t *pTuningSettingBuffer; - uint16_t tempword = 0; - uint8_t tempbyte = 0; - uint8_t UseInternalTuningSettings = 0; - uint32_t count = 0; - uint8_t isApertureSpads = 0; - uint32_t refSpadCount = 0; - uint8_t ApertureSpads = 0; - uint8_t vcselPulsePeriodPCLK; - uint32_t seqTimeoutMicroSecs; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_info_from_device(Dev, 1); - - /* set the ref spad from NVM */ - count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadCount); - ApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadType); - - /* NVM value invalid */ - if ((ApertureSpads > 1) || - ((ApertureSpads == 1) && (count > 32)) || - ((ApertureSpads == 0) && (count > 12))) - Status = VL53L0X_perform_ref_spad_management(Dev, &refSpadCount, - &isApertureSpads); - else - Status = VL53L0X_set_reference_spads(Dev, count, ApertureSpads); - - - /* Initialize tuning settings buffer to prevent compiler warning. */ - pTuningSettingBuffer = DefaultTuningSettings; - - if (Status == VL53L0X_ERROR_NONE) { - UseInternalTuningSettings = PALDevDataGet(Dev, - UseInternalTuningSettings); - - if (UseInternalTuningSettings == 0) - pTuningSettingBuffer = PALDevDataGet(Dev, - pTuningSettingsPointer); - else - pTuningSettingBuffer = DefaultTuningSettings; - - } - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_load_tuning_settings(Dev, - pTuningSettingBuffer); - - - /* Set interrupt config to new sample ready */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_SetGpioConfig(Dev, 0, 0, - VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, - VL53L0X_INTERRUPTPOLARITY_LOW); - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_RdWord(Dev, 0x84, &tempword); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, - VL53L0X_FIXPOINT412TOFIXPOINT1616(tempword)); - } - - /* After static init, some device parameters may be changed, - * so update them - */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); - - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetFractionEnable(Dev, &tempbyte); - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, RangeFractionalEnable, tempbyte); - - } - - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, CurrentParameters, CurrentParameters); - - - /* read the sequence config and save it */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte); - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, SequenceConfig, tempbyte); - - } - - /* Disable MSRC and TCC by default */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetSequenceStepEnable(Dev, - VL53L0X_SEQUENCESTEP_TCC, 0); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetSequenceStepEnable(Dev, - VL53L0X_SEQUENCESTEP_MSRC, 0); - - - /* Set PAL State to standby */ - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); - - - - /* Store pre-range vcsel period */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetVcselPulsePeriod( - Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &vcselPulsePeriodPCLK); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - PreRangeVcselPulsePeriod, - vcselPulsePeriodPCLK); - } - - /* Store final-range vcsel period */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetVcselPulsePeriod( - Dev, - VL53L0X_VCSEL_PERIOD_FINAL_RANGE, - &vcselPulsePeriodPCLK); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - FinalRangeVcselPulsePeriod, - vcselPulsePeriodPCLK); - } - - /* Store pre-range timeout */ - if (Status == VL53L0X_ERROR_NONE) { - Status = get_sequence_step_timeout( - Dev, - VL53L0X_SEQUENCESTEP_PRE_RANGE, - &seqTimeoutMicroSecs); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - PreRangeTimeoutMicroSecs, - seqTimeoutMicroSecs); - } - - /* Store final-range timeout */ - if (Status == VL53L0X_ERROR_NONE) { - Status = get_sequence_step_timeout( - Dev, - VL53L0X_SEQUENCESTEP_FINAL_RANGE, - &seqTimeoutMicroSecs); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - FinalRangeTimeoutMicroSecs, - seqTimeoutMicroSecs); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte; - - LOG_FUNCTION_START(""); - - /* Set reset bit */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, - 0x00); - - /* Wait for some time */ - if (Status == VL53L0X_ERROR_NONE) { - do { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte); - } while (Byte != 0x00); - } - - VL53L0X_PollingDelay(Dev); - - /* Release reset */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N, - 0x01); - - /* Wait until correct boot-up of the device */ - if (Status == VL53L0X_ERROR_NONE) { - do { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte); - } while (Byte == 0x00); - } - - VL53L0X_PollingDelay(Dev); - - /* Set PAL State to VL53L0X_STATE_POWERDOWN */ - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, PalState, VL53L0X_STATE_POWERDOWN); - - - LOG_FUNCTION_END(Status); - return Status; -} -/* End Group PAL Init Functions */ - -/* Group PAL Parameters Functions */ -VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev, - const VL53L0X_DeviceParameters_t *pDeviceParameters) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int i; - - LOG_FUNCTION_START(""); - Status = VL53L0X_SetDeviceMode(Dev, pDeviceParameters->DeviceMode); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(Dev, - pDeviceParameters->InterMeasurementPeriodMilliSeconds); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev, - pDeviceParameters->XTalkCompensationRateMegaCps); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, - pDeviceParameters->RangeOffsetMicroMeters); - - - for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { - if (Status == VL53L0X_ERROR_NONE) - Status |= VL53L0X_SetLimitCheckEnable(Dev, i, - pDeviceParameters->LimitChecksEnable[i]); - else - break; - - if (Status == VL53L0X_ERROR_NONE) - Status |= VL53L0X_SetLimitCheckValue(Dev, i, - pDeviceParameters->LimitChecksValue[i]); - else - break; - - } - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetWrapAroundCheckEnable(Dev, - pDeviceParameters->WrapAroundCheckEnable); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, - pDeviceParameters->MeasurementTimingBudgetMicroSeconds); - - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev, - VL53L0X_DeviceParameters_t *pDeviceParameters) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int i; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_GetDeviceMode(Dev, &(pDeviceParameters->DeviceMode)); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetInterMeasurementPeriodMilliSeconds(Dev, - &(pDeviceParameters->InterMeasurementPeriodMilliSeconds)); - - - if (Status == VL53L0X_ERROR_NONE) - pDeviceParameters->XTalkCompensationEnable = 0; - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetXTalkCompensationRateMegaCps(Dev, - &(pDeviceParameters->XTalkCompensationRateMegaCps)); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, - &(pDeviceParameters->RangeOffsetMicroMeters)); - - - if (Status == VL53L0X_ERROR_NONE) { - for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) { - /* get first the values, then the enables. - * VL53L0X_GetLimitCheckValue will modify the enable - * flags - */ - if (Status == VL53L0X_ERROR_NONE) { - Status |= VL53L0X_GetLimitCheckValue(Dev, i, - &(pDeviceParameters->LimitChecksValue[i])); - } else { - break; - } - if (Status == VL53L0X_ERROR_NONE) { - Status |= VL53L0X_GetLimitCheckEnable(Dev, i, - &(pDeviceParameters->LimitChecksEnable[i])); - } else { - break; - } - } - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetWrapAroundCheckEnable(Dev, - &(pDeviceParameters->WrapAroundCheckEnable)); - } - - /* Need to be done at the end as it uses VCSELPulsePeriod */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetMeasurementTimingBudgetMicroSeconds(Dev, - &(pDeviceParameters->MeasurementTimingBudgetMicroSeconds)); - } - - if (Status == VL53L0X_ERROR_NONE) { - for (i = 0; i < VL53L0X_DMAX_LUT_SIZE; i++) { - pDeviceParameters->dmax_lut.ambRate_mcps[i] = - Dev->Data.CurrentParameters.dmax_lut.ambRate_mcps[i]; - pDeviceParameters->dmax_lut.dmax_mm[i] = - Dev->Data.CurrentParameters.dmax_lut.dmax_mm[i]; - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, - VL53L0X_DeviceModes DeviceMode) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START("%d", (int)DeviceMode); - - switch (DeviceMode) { - case VL53L0X_DEVICEMODE_SINGLE_RANGING: - case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: - case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: - case VL53L0X_DEVICEMODE_GPIO_DRIVE: - case VL53L0X_DEVICEMODE_GPIO_OSC: - /* Supported modes */ - VL53L0X_SETPARAMETERFIELD(Dev, DeviceMode, DeviceMode); - break; - default: - /* Unsupported mode */ - Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev, - VL53L0X_DeviceModes *pDeviceMode) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - VL53L0X_GETPARAMETERFIELD(Dev, DeviceMode, *pDeviceMode); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, uint8_t Enable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START("%d", (int)Enable); - - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, Enable); - - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, RangeFractionalEnable, Enable); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, uint8_t *pEnabled) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, pEnabled); - - if (Status == VL53L0X_ERROR_NONE) - *pEnabled = (*pEnabled & 1); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev, - VL53L0X_HistogramModes HistogramMode) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev, - VL53L0X_HistogramModes *pHistogramMode) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, - uint32_t MeasurementTimingBudgetMicroSeconds) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_set_measurement_timing_budget_micro_seconds(Dev, - MeasurementTimingBudgetMicroSeconds); - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev, - uint32_t *pMeasurementTimingBudgetMicroSeconds) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_measurement_timing_budget_micro_seconds(Dev, - pMeasurementTimingBudgetMicroSeconds); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_set_vcsel_pulse_period(Dev, VcselPeriodType, - VCSELPulsePeriodPCLK); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_vcsel_pulse_period(Dev, VcselPeriodType, - pVCSELPulsePeriodPCLK); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SequenceConfig = 0; - uint8_t SequenceConfigNew = 0; - uint32_t MeasurementTimingBudgetMicroSeconds; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - &SequenceConfig); - - SequenceConfigNew = SequenceConfig; - - if (Status == VL53L0X_ERROR_NONE) { - if (SequenceStepEnabled == 1) { - - /* Enable requested sequence step - */ - switch (SequenceStepId) { - case VL53L0X_SEQUENCESTEP_TCC: - SequenceConfigNew |= 0x10; - break; - case VL53L0X_SEQUENCESTEP_DSS: - SequenceConfigNew |= 0x28; - break; - case VL53L0X_SEQUENCESTEP_MSRC: - SequenceConfigNew |= 0x04; - break; - case VL53L0X_SEQUENCESTEP_PRE_RANGE: - SequenceConfigNew |= 0x40; - break; - case VL53L0X_SEQUENCESTEP_FINAL_RANGE: - SequenceConfigNew |= 0x80; - break; - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } else { - /* Disable requested sequence step - */ - switch (SequenceStepId) { - case VL53L0X_SEQUENCESTEP_TCC: - SequenceConfigNew &= 0xef; - break; - case VL53L0X_SEQUENCESTEP_DSS: - SequenceConfigNew &= 0xd7; - break; - case VL53L0X_SEQUENCESTEP_MSRC: - SequenceConfigNew &= 0xfb; - break; - case VL53L0X_SEQUENCESTEP_PRE_RANGE: - SequenceConfigNew &= 0xbf; - break; - case VL53L0X_SEQUENCESTEP_FINAL_RANGE: - SequenceConfigNew &= 0x7f; - break; - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - } - - if (SequenceConfigNew != SequenceConfig) { - /* Apply New Setting */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, SequenceConfigNew); - } - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, SequenceConfig, SequenceConfigNew); - - - /* Recalculate timing budget */ - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_GETPARAMETERFIELD(Dev, - MeasurementTimingBudgetMicroSeconds, - MeasurementTimingBudgetMicroSeconds); - - VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, - MeasurementTimingBudgetMicroSeconds); - } - } - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceConfig, - uint8_t *pSequenceStepEnabled) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - *pSequenceStepEnabled = 0; - LOG_FUNCTION_START(""); - - switch (SequenceStepId) { - case VL53L0X_SEQUENCESTEP_TCC: - *pSequenceStepEnabled = (SequenceConfig & 0x10) >> 4; - break; - case VL53L0X_SEQUENCESTEP_DSS: - *pSequenceStepEnabled = (SequenceConfig & 0x08) >> 3; - break; - case VL53L0X_SEQUENCESTEP_MSRC: - *pSequenceStepEnabled = (SequenceConfig & 0x04) >> 2; - break; - case VL53L0X_SEQUENCESTEP_PRE_RANGE: - *pSequenceStepEnabled = (SequenceConfig & 0x40) >> 6; - break; - case VL53L0X_SEQUENCESTEP_FINAL_RANGE: - *pSequenceStepEnabled = (SequenceConfig & 0x80) >> 7; - break; - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SequenceConfig = 0; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - &SequenceConfig); - - if (Status == VL53L0X_ERROR_NONE) { - Status = sequence_step_enabled(Dev, SequenceStepId, - SequenceConfig, pSequenceStepEnabled); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev, - VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SequenceConfig = 0; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - &SequenceConfig); - - if (Status == VL53L0X_ERROR_NONE) { - Status = sequence_step_enabled(Dev, - VL53L0X_SEQUENCESTEP_TCC, SequenceConfig, - &pSchedulerSequenceSteps->TccOn); - } - if (Status == VL53L0X_ERROR_NONE) { - Status = sequence_step_enabled(Dev, - VL53L0X_SEQUENCESTEP_DSS, SequenceConfig, - &pSchedulerSequenceSteps->DssOn); - } - if (Status == VL53L0X_ERROR_NONE) { - Status = sequence_step_enabled(Dev, - VL53L0X_SEQUENCESTEP_MSRC, SequenceConfig, - &pSchedulerSequenceSteps->MsrcOn); - } - if (Status == VL53L0X_ERROR_NONE) { - Status = sequence_step_enabled(Dev, - VL53L0X_SEQUENCESTEP_PRE_RANGE, SequenceConfig, - &pSchedulerSequenceSteps->PreRangeOn); - } - if (Status == VL53L0X_ERROR_NONE) { - Status = sequence_step_enabled(Dev, - VL53L0X_SEQUENCESTEP_FINAL_RANGE, SequenceConfig, - &pSchedulerSequenceSteps->FinalRangeOn); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev, - uint8_t *pNumberOfSequenceSteps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *pNumberOfSequenceSteps = VL53L0X_SEQUENCESTEP_NUMBER_OF_CHECKS; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetSequenceStepsInfo( - VL53L0X_SequenceStepId SequenceStepId, - char *pSequenceStepsString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_sequence_steps_info( - SequenceStepId, - pSequenceStepsString); - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_Error Status1 = VL53L0X_ERROR_NONE; - uint32_t TimeoutMicroSeconds = ((TimeOutMilliSecs * 1000) + 0x8000) - >> 16; - uint32_t MeasurementTimingBudgetMicroSeconds; - FixPoint1616_t OldTimeOutMicroSeconds; - - LOG_FUNCTION_START(""); - - /* Read back the current value in case we need to revert back to this. - */ - Status = get_sequence_step_timeout(Dev, SequenceStepId, - &OldTimeOutMicroSeconds); - - if (Status == VL53L0X_ERROR_NONE) { - Status = set_sequence_step_timeout(Dev, SequenceStepId, - TimeoutMicroSeconds); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_GETPARAMETERFIELD(Dev, - MeasurementTimingBudgetMicroSeconds, - MeasurementTimingBudgetMicroSeconds); - - /* At this point we don't know if the requested value is valid, - * therefore proceed to update the entire timing budget and - * if this fails, revert back to the previous value. - */ - Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, - MeasurementTimingBudgetMicroSeconds); - - if (Status != VL53L0X_ERROR_NONE) { - Status1 = set_sequence_step_timeout(Dev, SequenceStepId, - OldTimeOutMicroSeconds); - - if (Status1 == VL53L0X_ERROR_NONE) { - Status1 = - VL53L0X_SetMeasurementTimingBudgetMicroSeconds( - Dev, - MeasurementTimingBudgetMicroSeconds); - } - - Status = Status1; - } - } - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, - FixPoint1616_t *pTimeOutMilliSecs) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint32_t TimeoutMicroSeconds; - - LOG_FUNCTION_START(""); - - Status = get_sequence_step_timeout(Dev, SequenceStepId, - &TimeoutMicroSeconds); - if (Status == VL53L0X_ERROR_NONE) { - TimeoutMicroSeconds <<= 8; - *pTimeOutMilliSecs = (TimeoutMicroSeconds + 500)/1000; - *pTimeOutMilliSecs <<= 8; - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, - uint32_t InterMeasurementPeriodMilliSeconds) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t osc_calibrate_val; - uint32_t IMPeriodMilliSeconds; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, - &osc_calibrate_val); - - if (Status == VL53L0X_ERROR_NONE) { - if (osc_calibrate_val != 0) { - IMPeriodMilliSeconds = - InterMeasurementPeriodMilliSeconds - * osc_calibrate_val; - } else { - IMPeriodMilliSeconds = - InterMeasurementPeriodMilliSeconds; - } - Status = VL53L0X_WrDWord(Dev, - VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, - IMPeriodMilliSeconds); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETPARAMETERFIELD(Dev, - InterMeasurementPeriodMilliSeconds, - InterMeasurementPeriodMilliSeconds); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev, - uint32_t *pInterMeasurementPeriodMilliSeconds) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t osc_calibrate_val; - uint32_t IMPeriodMilliSeconds; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL, - &osc_calibrate_val); - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdDWord(Dev, - VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD, - &IMPeriodMilliSeconds); - } - - if (Status == VL53L0X_ERROR_NONE) { - if (osc_calibrate_val != 0) { - *pInterMeasurementPeriodMilliSeconds = - IMPeriodMilliSeconds / osc_calibrate_val; - } - VL53L0X_SETPARAMETERFIELD(Dev, - InterMeasurementPeriodMilliSeconds, - *pInterMeasurementPeriodMilliSeconds); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev, - uint8_t XTalkCompensationEnable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - FixPoint1616_t TempFix1616; - uint16_t LinearityCorrectiveGain; - - LOG_FUNCTION_START(""); - - LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); - - if ((XTalkCompensationEnable == 0) - || (LinearityCorrectiveGain != 1000)) { - TempFix1616 = 0; - } else { - VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, - TempFix1616); - } - - /* the following register has a format 3.13 */ - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, - VL53L0X_FIXPOINT1616TOFIXPOINT313(TempFix1616)); - - if (Status == VL53L0X_ERROR_NONE) { - if (XTalkCompensationEnable == 0) { - VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, - 0); - } else { - VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, - 1); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev, - uint8_t *pXTalkCompensationEnable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Temp8; - - LOG_FUNCTION_START(""); - - VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); - *pXTalkCompensationEnable = Temp8; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, - FixPoint1616_t XTalkCompensationRateMegaCps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Temp8; - uint16_t LinearityCorrectiveGain; - uint16_t data; - - LOG_FUNCTION_START(""); - - VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8); - LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain); - - if (Temp8 == 0) { /* disabled write only internal value */ - VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, - XTalkCompensationRateMegaCps); - } else { - /* the following register has a format 3.13 */ - if (LinearityCorrectiveGain == 1000) { - data = VL53L0X_FIXPOINT1616TOFIXPOINT313( - XTalkCompensationRateMegaCps); - } else { - data = 0; - } - - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, data); - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETPARAMETERFIELD(Dev, - XTalkCompensationRateMegaCps, - XTalkCompensationRateMegaCps); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev, - FixPoint1616_t *pXTalkCompensationRateMegaCps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t Value; - FixPoint1616_t TempFix1616; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, (uint16_t *)&Value); - if (Status == VL53L0X_ERROR_NONE) { - if (Value == 0) { - /* the Xtalk is disabled return value from memory */ - VL53L0X_GETPARAMETERFIELD(Dev, - XTalkCompensationRateMegaCps, TempFix1616); - *pXTalkCompensationRateMegaCps = TempFix1616; - VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, - 0); - } else { - TempFix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616(Value); - *pXTalkCompensationRateMegaCps = TempFix1616; - VL53L0X_SETPARAMETERFIELD(Dev, - XTalkCompensationRateMegaCps, TempFix1616); - VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable, - 1); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, uint8_t VhvSettings, - uint8_t PhaseCal) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_set_ref_calibration(Dev, VhvSettings, PhaseCal); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, uint8_t *pVhvSettings, - uint8_t *pPhaseCal) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_ref_calibration(Dev, pVhvSettings, pPhaseCal); - - LOG_FUNCTION_END(Status); - return Status; -} - -/* - * CHECK LIMIT FUNCTIONS - */ - -VL53L0X_Error VL53L0X_GetNumberOfLimitCheck(uint16_t *pNumberOfLimitCheck) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *pNumberOfLimitCheck = VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, uint16_t LimitCheckId, - char *pLimitCheckString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_limit_check_info(Dev, LimitCheckId, - pLimitCheckString); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, - uint16_t LimitCheckId, - uint8_t *pLimitCheckStatus) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Temp8; - - LOG_FUNCTION_START(""); - - if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { - Status = VL53L0X_ERROR_INVALID_PARAMS; - } else { - - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, - LimitCheckId, Temp8); - - *pLimitCheckStatus = Temp8; - - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, - uint16_t LimitCheckId, - uint8_t LimitCheckEnable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - FixPoint1616_t TempFix1616 = 0; - uint8_t LimitCheckEnableInt = 0; - uint8_t LimitCheckDisable = 0; - uint8_t Temp8; - - LOG_FUNCTION_START(""); - - if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { - Status = VL53L0X_ERROR_INVALID_PARAMS; - } else { - if (LimitCheckEnable == 0) { - TempFix1616 = 0; - LimitCheckEnableInt = 0; - LimitCheckDisable = 1; - - } else { - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - LimitCheckId, TempFix1616); - LimitCheckDisable = 0; - /* this to be sure to have either 0 or 1 */ - LimitCheckEnableInt = 1; - } - - switch (LimitCheckId) { - - case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: - /* internal computation: */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, - LimitCheckEnableInt); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: - - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, - VL53L0X_FIXPOINT1616TOFIXPOINT97(TempFix1616)); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: - - /* internal computation: */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, - LimitCheckEnableInt); - - break; - - case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: - - /* internal computation: */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - LimitCheckEnableInt); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: - - Temp8 = (uint8_t)(LimitCheckDisable << 1); - Status = VL53L0X_UpdateByte(Dev, - VL53L0X_REG_MSRC_CONFIG_CONTROL, - 0xFE, Temp8); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: - - Temp8 = (uint8_t)(LimitCheckDisable << 4); - Status = VL53L0X_UpdateByte(Dev, - VL53L0X_REG_MSRC_CONFIG_CONTROL, - 0xEF, Temp8); - - break; - - - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - - } - - } - - if (Status == VL53L0X_ERROR_NONE) { - if (LimitCheckEnable == 0) { - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, - LimitCheckId, 0); - } else { - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, - LimitCheckId, 1); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, - uint16_t LimitCheckId, - uint8_t *pLimitCheckEnable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Temp8; - - LOG_FUNCTION_START(""); - - if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { - Status = VL53L0X_ERROR_INVALID_PARAMS; - *pLimitCheckEnable = 0; - } else { - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, - LimitCheckId, Temp8); - *pLimitCheckEnable = Temp8; - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, - FixPoint1616_t LimitCheckValue) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Temp8; - - LOG_FUNCTION_START(""); - - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, LimitCheckId, - Temp8); - - if (Temp8 == 0) { /* disabled write only internal value */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - LimitCheckId, LimitCheckValue); - } else { - - switch (LimitCheckId) { - - case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: - /* internal computation: */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, - LimitCheckValue); - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: - - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, - VL53L0X_FIXPOINT1616TOFIXPOINT97( - LimitCheckValue)); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: - - /* internal computation: */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, - LimitCheckValue); - - break; - - case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: - - /* internal computation: */ - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - LimitCheckValue); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: - case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: - - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, - VL53L0X_FIXPOINT1616TOFIXPOINT97( - LimitCheckValue)); - - break; - - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - LimitCheckId, LimitCheckValue); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId, - FixPoint1616_t *pLimitCheckValue) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t EnableZeroValue = 0; - uint16_t Temp16; - FixPoint1616_t TempFix1616; - - LOG_FUNCTION_START(""); - - switch (LimitCheckId) { - - case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: - /* internal computation: */ - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, TempFix1616); - EnableZeroValue = 0; - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT, - &Temp16); - if (Status == VL53L0X_ERROR_NONE) - TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); - - - EnableZeroValue = 1; - break; - - case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: - /* internal computation: */ - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, TempFix1616); - EnableZeroValue = 0; - break; - - case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: - /* internal computation: */ - VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - TempFix1616); - EnableZeroValue = 0; - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: - case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT, - &Temp16); - if (Status == VL53L0X_ERROR_NONE) - TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16); - - - EnableZeroValue = 0; - break; - - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - - } - - if (Status == VL53L0X_ERROR_NONE) { - - if (EnableZeroValue == 1) { - - if (TempFix1616 == 0) { - /* disabled: return value from memory */ - VL53L0X_GETARRAYPARAMETERFIELD(Dev, - LimitChecksValue, LimitCheckId, - TempFix1616); - *pLimitCheckValue = TempFix1616; - VL53L0X_SETARRAYPARAMETERFIELD(Dev, - LimitChecksEnable, LimitCheckId, 0); - } else { - *pLimitCheckValue = TempFix1616; - VL53L0X_SETARRAYPARAMETERFIELD(Dev, - LimitChecksValue, LimitCheckId, - TempFix1616); - VL53L0X_SETARRAYPARAMETERFIELD(Dev, - LimitChecksEnable, LimitCheckId, 1); - } - } else { - *pLimitCheckValue = TempFix1616; - } - } - - LOG_FUNCTION_END(Status); - return Status; - -} - -VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, - uint16_t LimitCheckId, - FixPoint1616_t *pLimitCheckCurrent) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; - - LOG_FUNCTION_START(""); - - if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) { - Status = VL53L0X_ERROR_INVALID_PARAMS; - } else { - switch (LimitCheckId) { - case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: - /* Need to run a ranging to have the latest values */ - *pLimitCheckCurrent = PALDevDataGet(Dev, SigmaEstimate); - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: - /* Need to run a ranging to have the latest values */ - LastRangeDataBuffer = PALDevDataGet(Dev, - LastRangeMeasure); - *pLimitCheckCurrent = - LastRangeDataBuffer.SignalRateRtnMegaCps; - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: - /* Need to run a ranging to have the latest values */ - *pLimitCheckCurrent = PALDevDataGet(Dev, - LastSignalRefMcps); - - break; - - case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: - /* Need to run a ranging to have the latest values */ - LastRangeDataBuffer = PALDevDataGet(Dev, - LastRangeMeasure); - *pLimitCheckCurrent = - LastRangeDataBuffer.SignalRateRtnMegaCps; - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: - /* Need to run a ranging to have the latest values */ - LastRangeDataBuffer = PALDevDataGet(Dev, - LastRangeMeasure); - *pLimitCheckCurrent = - LastRangeDataBuffer.SignalRateRtnMegaCps; - - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: - /* Need to run a ranging to have the latest values */ - LastRangeDataBuffer = PALDevDataGet(Dev, - LastRangeMeasure); - *pLimitCheckCurrent = - LastRangeDataBuffer.SignalRateRtnMegaCps; - - break; - - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - LOG_FUNCTION_END(Status); - return Status; - -} - -/* - * WRAPAROUND Check - */ -VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev, - uint8_t WrapAroundCheckEnable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte; - uint8_t WrapAroundCheckEnableInt; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &Byte); - if (WrapAroundCheckEnable == 0) { - /* Disable wraparound */ - Byte = Byte & 0x7F; - WrapAroundCheckEnableInt = 0; - } else { - /*Enable wraparound */ - Byte = Byte | 0x80; - WrapAroundCheckEnableInt = 1; - } - - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, Byte); - - if (Status == VL53L0X_ERROR_NONE) { - PALDevDataSet(Dev, SequenceConfig, Byte); - VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, - WrapAroundCheckEnableInt); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev, - uint8_t *pWrapAroundCheckEnable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t data; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data); - if (Status == VL53L0X_ERROR_NONE) { - PALDevDataSet(Dev, SequenceConfig, data); - if (data & (0x01 << 7)) - *pWrapAroundCheckEnable = 0x01; - else - *pWrapAroundCheckEnable = 0x00; - } - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable, - *pWrapAroundCheckEnable); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -/* End Group PAL Parameters Functions */ - -/* Group PAL Measurement Functions */ -VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_DeviceModes DeviceMode; - - LOG_FUNCTION_START(""); - - /* Get Current DeviceMode */ - Status = VL53L0X_GetDeviceMode(Dev, &DeviceMode); - - /* Start immediately to run a single ranging measurement in case of - * single ranging or single histogram - */ - if (Status == VL53L0X_ERROR_NONE - && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) - Status = VL53L0X_StartMeasurement(Dev); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_measurement_poll_for_completion(Dev); - - - /* Change PAL State in case of single ranging or single histogram */ - if (Status == VL53L0X_ERROR_NONE - && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING) - PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); - - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement(VL53L0X_DEV Dev, - VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, - uint8_t *pPhaseCal) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_perform_ref_calibration(Dev, pVhvSettings, - pPhaseCal, 1); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev, - uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad, - uint8_t *pAmbientTooHigh) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented on VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev, - FixPoint1616_t XTalkCalDistance, - FixPoint1616_t *pXTalkCompensationRateMegaCps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_perform_xtalk_calibration(Dev, XTalkCalDistance, - pXTalkCompensationRateMegaCps); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev, - FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_perform_offset_calibration(Dev, CalDistanceMilliMeter, - pOffsetMicroMeter); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_CheckAndLoadInterruptSettings(VL53L0X_DEV Dev, - uint8_t StartNotStopFlag) -{ - uint8_t InterruptConfig; - FixPoint1616_t ThresholdLow; - FixPoint1616_t ThresholdHigh; - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - Pin0GpioFunctionality); - - switch (InterruptConfig) { - case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: - Status = VL53L0X_GetInterruptThresholds(Dev, - VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, - &ThresholdLow, &ThresholdHigh); - - if ((ThresholdLow > 255*65536) && - (Status == VL53L0X_ERROR_NONE)) { - - if (StartNotStopFlag != 0) { - Status = VL53L0X_load_tuning_settings(Dev, - InterruptThresholdSettings); - } else { - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); - Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); - } - } - break; - case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: - Status = VL53L0X_GetInterruptThresholds(Dev, - VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, - &ThresholdLow, &ThresholdHigh); - - if ((ThresholdHigh > 0) && - (Status == VL53L0X_ERROR_NONE)) { - - if (StartNotStopFlag != 0) { - Status = VL53L0X_load_tuning_settings(Dev, - InterruptThresholdSettings); - } else { - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); - Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); - } - } - break; - case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: - Status = VL53L0X_GetInterruptThresholds(Dev, - VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, - &ThresholdLow, &ThresholdHigh); - - if (Status == VL53L0X_ERROR_NONE) { - if (StartNotStopFlag != 0) { - Status = VL53L0X_load_tuning_settings(Dev, - InterruptThresholdSettings); - } else { - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04); - Status |= VL53L0X_WrByte(Dev, 0x70, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); - } - } - break; - } - - LOG_FUNCTION_END(Status); - return Status; -} - - -VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_DeviceModes DeviceMode; - uint8_t Byte; - uint8_t StartStopByte = VL53L0X_REG_SYSRANGE_MODE_START_STOP; - uint32_t LoopNb; - - LOG_FUNCTION_START(""); - - /* Get Current DeviceMode */ - VL53L0X_GetDeviceMode(Dev, &DeviceMode); - - Status = VL53L0X_WrByte(Dev, 0x80, 0x01); - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status = VL53L0X_WrByte(Dev, 0x00, 0x00); - Status = VL53L0X_WrByte(Dev, 0x91, PALDevDataGet(Dev, StopVariable)); - Status = VL53L0X_WrByte(Dev, 0x00, 0x01); - Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status = VL53L0X_WrByte(Dev, 0x80, 0x00); - - switch (DeviceMode) { - case VL53L0X_DEVICEMODE_SINGLE_RANGING: - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x01); - - Byte = StartStopByte; - if (Status == VL53L0X_ERROR_NONE) { - /* Wait until start bit has been cleared */ - LoopNb = 0; - do { - if (LoopNb > 0) - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_SYSRANGE_START, &Byte); - LoopNb = LoopNb + 1; - } while (((Byte & StartStopByte) == StartStopByte) - && (Status == VL53L0X_ERROR_NONE) - && (LoopNb < VL53L0X_DEFAULT_MAX_LOOP)); - - if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) - Status = VL53L0X_ERROR_TIME_OUT; - - } - - break; - case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING: - /* Back-to-back mode */ - - /* Check if need to apply interrupt settings */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSRANGE_START, - VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK); - if (Status == VL53L0X_ERROR_NONE) { - /* Set PAL State to Running */ - PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); - } - break; - case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING: - /* Continuous mode */ - /* Check if need to apply interrupt settings */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1); - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSRANGE_START, - VL53L0X_REG_SYSRANGE_MODE_TIMED); - - if (Status == VL53L0X_ERROR_NONE) { - /* Set PAL State to Running */ - PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING); - } - break; - default: - /* Selected mode not supported */ - Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED; - } - - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, - VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT); - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status = VL53L0X_WrByte(Dev, 0x00, 0x00); - Status = VL53L0X_WrByte(Dev, 0x91, 0x00); - Status = VL53L0X_WrByte(Dev, 0x00, 0x01); - Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - - if (Status == VL53L0X_ERROR_NONE) { - /* Set PAL State to Idle */ - PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE); - } - - /* Check if need to apply interrupt settings */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 0); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev, - uint8_t *pMeasurementDataReady) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SysRangeStatusRegister; - uint8_t InterruptConfig; - uint32_t InterruptMask; - - LOG_FUNCTION_START(""); - - InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - Pin0GpioFunctionality); - - if (InterruptConfig == - VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) { - Status = VL53L0X_GetInterruptMaskStatus(Dev, &InterruptMask); - if (InterruptMask == - VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) - *pMeasurementDataReady = 1; - else - *pMeasurementDataReady = 0; - } else { - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS, - &SysRangeStatusRegister); - if (Status == VL53L0X_ERROR_NONE) { - if (SysRangeStatusRegister & 0x01) - *pMeasurementDataReady = 1; - else - *pMeasurementDataReady = 0; - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement(VL53L0X_DEV Dev, - uint32_t MaxLoop) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented for VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - - -VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t DeviceRangeStatus; - uint8_t RangeFractionalEnable; - uint8_t PalRangeStatus; - uint8_t XTalkCompensationEnable; - uint16_t AmbientRate; - FixPoint1616_t SignalRate; - uint16_t XTalkCompensationRateMegaCps; - uint16_t EffectiveSpadRtnCount; - uint16_t tmpuint16; - uint16_t XtalkRangeMilliMeter; - uint16_t LinearityCorrectiveGain; - uint8_t localBuffer[12]; - VL53L0X_RangingMeasurementData_t LastRangeDataBuffer; - - LOG_FUNCTION_START(""); - - /* - * use multi read even if some registers are not useful, result will - * be more efficient - * start reading at 0x14 dec20 - * end reading at 0x21 dec33 total 14 bytes to read - */ - Status = VL53L0X_ReadMulti(Dev, 0x14, localBuffer, 12); - - if (Status == VL53L0X_ERROR_NONE) { - - pRangingMeasurementData->ZoneId = 0; /* Only one zone */ - pRangingMeasurementData->TimeStamp = 0; /* Not Implemented */ - - tmpuint16 = VL53L0X_MAKEUINT16(localBuffer[11], - localBuffer[10]); - /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional - *(format 11.2) else no fractional - */ - - pRangingMeasurementData->MeasurementTimeUsec = 0; - - - SignalRate = VL53L0X_FIXPOINT97TOFIXPOINT1616( - VL53L0X_MAKEUINT16(localBuffer[7], localBuffer[6])); - /* peak_signal_count_rate_rtn_mcps */ - pRangingMeasurementData->SignalRateRtnMegaCps = SignalRate; - - AmbientRate = VL53L0X_MAKEUINT16(localBuffer[9], - localBuffer[8]); - pRangingMeasurementData->AmbientRateRtnMegaCps = - VL53L0X_FIXPOINT97TOFIXPOINT1616(AmbientRate); - - EffectiveSpadRtnCount = VL53L0X_MAKEUINT16(localBuffer[3], - localBuffer[2]); - /* EffectiveSpadRtnCount is 8.8 format */ - pRangingMeasurementData->EffectiveSpadRtnCount = - EffectiveSpadRtnCount; - - DeviceRangeStatus = localBuffer[0]; - - /* Get Linearity Corrective Gain */ - LinearityCorrectiveGain = PALDevDataGet(Dev, - LinearityCorrectiveGain); - - /* Get ranging configuration */ - RangeFractionalEnable = PALDevDataGet(Dev, - RangeFractionalEnable); - - if (LinearityCorrectiveGain != 1000) { - - tmpuint16 = (uint16_t)((LinearityCorrectiveGain - * tmpuint16 + 500) / 1000); - - /* Implement Xtalk */ - VL53L0X_GETPARAMETERFIELD(Dev, - XTalkCompensationRateMegaCps, - XTalkCompensationRateMegaCps); - VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, - XTalkCompensationEnable); - - if (XTalkCompensationEnable) { - - if ((SignalRate - - ((XTalkCompensationRateMegaCps - * EffectiveSpadRtnCount) >> 8)) - <= 0) { - if (RangeFractionalEnable) - XtalkRangeMilliMeter = 8888; - else - XtalkRangeMilliMeter = 8888 - << 2; - } else { - XtalkRangeMilliMeter = - (tmpuint16 * SignalRate) - / (SignalRate - - ((XTalkCompensationRateMegaCps - * EffectiveSpadRtnCount) - >> 8)); - } - - tmpuint16 = XtalkRangeMilliMeter; - } - - } - - if (RangeFractionalEnable) { - pRangingMeasurementData->RangeMilliMeter = - (uint16_t)((tmpuint16) >> 2); - pRangingMeasurementData->RangeFractionalPart = - (uint8_t)((tmpuint16 & 0x03) << 6); - } else { - pRangingMeasurementData->RangeMilliMeter = tmpuint16; - pRangingMeasurementData->RangeFractionalPart = 0; - } - - /* - * For a standard definition of RangeStatus, this should - * return 0 in case of good result after a ranging - * The range status depends on the device so call a device - * specific function to obtain the right Status. - */ - Status |= VL53L0X_get_pal_range_status(Dev, DeviceRangeStatus, - SignalRate, EffectiveSpadRtnCount, - pRangingMeasurementData, &PalRangeStatus); - - if (Status == VL53L0X_ERROR_NONE) - pRangingMeasurementData->RangeStatus = PalRangeStatus; - - } - - if (Status == VL53L0X_ERROR_NONE) { - /* Copy last read data into Dev buffer */ - LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure); - - LastRangeDataBuffer.RangeMilliMeter = - pRangingMeasurementData->RangeMilliMeter; - LastRangeDataBuffer.RangeFractionalPart = - pRangingMeasurementData->RangeFractionalPart; - LastRangeDataBuffer.RangeDMaxMilliMeter = - pRangingMeasurementData->RangeDMaxMilliMeter; - LastRangeDataBuffer.MeasurementTimeUsec = - pRangingMeasurementData->MeasurementTimeUsec; - LastRangeDataBuffer.SignalRateRtnMegaCps = - pRangingMeasurementData->SignalRateRtnMegaCps; - LastRangeDataBuffer.AmbientRateRtnMegaCps = - pRangingMeasurementData->AmbientRateRtnMegaCps; - LastRangeDataBuffer.EffectiveSpadRtnCount = - pRangingMeasurementData->EffectiveSpadRtnCount; - LastRangeDataBuffer.RangeStatus = - pRangingMeasurementData->RangeStatus; - - PALDevDataSet(Dev, LastRangeMeasure, LastRangeDataBuffer); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev, - FixPoint1616_t *pMeasurementRefSignal) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SignalRefClipLimitCheckEnable = 0; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_GetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, - &SignalRefClipLimitCheckEnable); - if (SignalRefClipLimitCheckEnable != 0) - *pMeasurementRefSignal = PALDevDataGet(Dev, LastSignalRefMcps); - else - Status = VL53L0X_ERROR_INVALID_COMMAND; - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev, - VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - /* This function will do a complete single ranging - * Here we fix the mode! - */ - Status = VL53L0X_SetDeviceMode(Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_PerformSingleMeasurement(Dev); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetRangingMeasurementData(Dev, - pRangingMeasurementData); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_ClearInterruptMask(Dev, 0); - - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev, - uint8_t NumberOfROIZones) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - if (NumberOfROIZones != 1) - Status = VL53L0X_ERROR_INVALID_PARAMS; - - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev, - uint8_t *pNumberOfROIZones) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *pNumberOfROIZones = 1; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev, - uint8_t *pMaxNumberOfROIZones) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - *pMaxNumberOfROIZones = 1; - - LOG_FUNCTION_END(Status); - return Status; -} - -/* End Group PAL Measurement Functions */ - -VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, - VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality, - VL53L0X_InterruptPolarity Polarity) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t data; - - LOG_FUNCTION_START(""); - - if (Pin != 0) { - Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; - } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_DRIVE) { - if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) - data = 0x10; - else - data = 1; - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data); - - } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_OSC) { - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); - Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x85, 0x02); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x04); - Status |= VL53L0X_WrByte(Dev, 0xcd, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xcc, 0x11); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x07); - Status |= VL53L0X_WrByte(Dev, 0xbe, 0x00); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x06); - Status |= VL53L0X_WrByte(Dev, 0xcc, 0x09); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); - - } else { - - if (Status == VL53L0X_ERROR_NONE) { - switch (Functionality) { - case VL53L0X_GPIOFUNCTIONALITY_OFF: - data = 0x00; - break; - case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW: - data = 0x01; - break; - case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH: - data = 0x02; - break; - case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT: - data = 0x03; - break; - case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY: - data = 0x04; - break; - default: - Status = - VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; - } - } - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data); - - if (Status == VL53L0X_ERROR_NONE) { - if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW) - data = 0; - else - data = (uint8_t)(1 << 4); - - Status = VL53L0X_UpdateByte(Dev, - VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data); - } - - if (Status == VL53L0X_ERROR_NONE) - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - Pin0GpioFunctionality, Functionality); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_ClearInterruptMask(Dev, 0); - - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin, - VL53L0X_DeviceModes *pDeviceMode, - VL53L0X_GpioFunctionality *pFunctionality, - VL53L0X_InterruptPolarity *pPolarity) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_GpioFunctionality GpioFunctionality; - uint8_t data; - - LOG_FUNCTION_START(""); - - /* pDeviceMode not managed by Ewok it return the current mode */ - - Status = VL53L0X_GetDeviceMode(Dev, pDeviceMode); - - if (Status == VL53L0X_ERROR_NONE) { - if (Pin != 0) { - Status = VL53L0X_ERROR_GPIO_NOT_EXISTING; - } else { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, &data); - } - } - - if (Status == VL53L0X_ERROR_NONE) { - switch (data & 0x07) { - case 0x00: - GpioFunctionality = VL53L0X_GPIOFUNCTIONALITY_OFF; - break; - case 0x01: - GpioFunctionality = - VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW; - break; - case 0x02: - GpioFunctionality = - VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH; - break; - case 0x03: - GpioFunctionality = - VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT; - break; - case 0x04: - GpioFunctionality = - VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY; - break; - default: - Status = VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED; - } - } - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, - &data); - - if (Status == VL53L0X_ERROR_NONE) { - if ((data & (uint8_t)(1 << 4)) == 0) - *pPolarity = VL53L0X_INTERRUPTPOLARITY_LOW; - else - *pPolarity = VL53L0X_INTERRUPTPOLARITY_HIGH; - } - - if (Status == VL53L0X_ERROR_NONE) { - *pFunctionality = GpioFunctionality; - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, Pin0GpioFunctionality, - GpioFunctionality); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev, - VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow, - FixPoint1616_t ThresholdHigh) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t Threshold16; - - LOG_FUNCTION_START(""); - - /* no dependency on DeviceMode for Ewok */ - /* Need to divide by 2 because the FW will apply a x2 */ - Threshold16 = (uint16_t)((ThresholdLow >> 17) & 0x00fff); - Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, - Threshold16); - - if (Status == VL53L0X_ERROR_NONE) { - /* Need to divide by 2 because the FW will apply a x2 */ - Threshold16 = (uint16_t)((ThresholdHigh >> 17) & 0x00fff); - Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, - Threshold16); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev, - VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow, - FixPoint1616_t *pThresholdHigh) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t Threshold16; - - LOG_FUNCTION_START(""); - - /* no dependency on DeviceMode for Ewok */ - - Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, - &Threshold16); - /* Need to multiply by 2 because the FW will apply a x2 */ - *pThresholdLow = (FixPoint1616_t)((0x00fff & Threshold16) << 17); - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH, - &Threshold16); - /* Need to multiply by 2 because the FW will apply a x2 */ - *pThresholdHigh = - (FixPoint1616_t)((0x00fff & Threshold16) << 17); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev, - uint32_t *pStopStatus) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte = 0; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_RdByte(Dev, 0x04, &Byte); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, 0xFF, 0x0); - - *pStopStatus = Byte; - - if (Byte == 0) { - Status = VL53L0X_WrByte(Dev, 0x80, 0x01); - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status = VL53L0X_WrByte(Dev, 0x00, 0x00); - Status = VL53L0X_WrByte(Dev, 0x91, - PALDevDataGet(Dev, StopVariable)); - Status = VL53L0X_WrByte(Dev, 0x00, 0x01); - Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status = VL53L0X_WrByte(Dev, 0x80, 0x00); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -/* Group PAL Interrupt Functions */ -VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, - uint32_t InterruptMask) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t LoopCount; - uint8_t Byte; - - LOG_FUNCTION_START(""); - - /* clear bit 0 range interrupt, bit 1 error interrupt */ - LoopCount = 0; - do { - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00); - Status |= VL53L0X_RdByte(Dev, - VL53L0X_REG_RESULT_INTERRUPT_STATUS, &Byte); - LoopCount++; - } while (((Byte & 0x07) != 0x00) - && (LoopCount < 3) - && (Status == VL53L0X_ERROR_NONE)); - - - if (LoopCount >= 3) - Status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev, - uint32_t *pInterruptMaskStatus) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, - &Byte); - *pInterruptMaskStatus = Byte & 0x07; - - if (Byte & 0x18) - Status = VL53L0X_ERROR_RANGE_ERROR; - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, - uint32_t InterruptMask) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED; - - LOG_FUNCTION_START(""); - - /* not implemented for VL53L0X */ - - LOG_FUNCTION_END(Status); - return Status; -} - -/* End Group PAL Interrupt Functions */ - -/* Group SPAD functions */ - -VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, - uint16_t SpadAmbientDamperThreshold) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrWord(Dev, 0x40, SpadAmbientDamperThreshold); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev, - uint16_t *pSpadAmbientDamperThreshold) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_RdWord(Dev, 0x40, pSpadAmbientDamperThreshold); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev, - uint16_t SpadAmbientDamperFactor) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte; - - LOG_FUNCTION_START(""); - - Byte = (uint8_t)(SpadAmbientDamperFactor & 0x00FF); - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x42, Byte); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev, - uint16_t *pSpadAmbientDamperFactor) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t Byte; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_RdByte(Dev, 0x42, &Byte); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - *pSpadAmbientDamperFactor = (uint16_t)Byte; - - LOG_FUNCTION_END(Status); - return Status; -} - -/* END Group SPAD functions */ - -/***************************************************************************** - * Internal functions - *****************************************************************************/ - -VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, uint32_t count, - uint8_t isApertureSpads) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_set_reference_spads(Dev, count, isApertureSpads); - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, uint32_t *pSpadCount, - uint8_t *pIsApertureSpads) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_reference_spads(Dev, pSpadCount, pIsApertureSpads); - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev, - uint32_t *refSpadCount, uint8_t *isApertureSpads) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_perform_ref_spad_management(Dev, refSpadCount, - isApertureSpads); - - LOG_FUNCTION_END(Status); - - return Status; -} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" deleted file mode 100644 index 76385538..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_calibration.c" +++ /dev/null @@ -1,1288 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND - NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. - IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -#include "vl53l0x_api.h" -#include "vl53l0x_api_core.h" -#include "vl53l0x_api_calibration.h" - -#ifndef __KERNEL__ -#include -#endif - -#define LOG_FUNCTION_START(fmt, ...) \ - _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) -#define LOG_FUNCTION_END(status, ...) \ - _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) -#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ - _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) - -#define REF_ARRAY_SPAD_0 0 -#define REF_ARRAY_SPAD_5 5 -#define REF_ARRAY_SPAD_10 10 - -uint32_t refArrayQuadrants[4] = {REF_ARRAY_SPAD_10, REF_ARRAY_SPAD_5, - REF_ARRAY_SPAD_0, REF_ARRAY_SPAD_5 }; - -VL53L0X_Error VL53L0X_perform_xtalk_calibration(VL53L0X_DEV Dev, - FixPoint1616_t XTalkCalDistance, - FixPoint1616_t *pXTalkCompensationRateMegaCps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t sum_ranging = 0; - uint16_t sum_spads = 0; - FixPoint1616_t sum_signalRate = 0; - FixPoint1616_t total_count = 0; - uint8_t xtalk_meas = 0; - VL53L0X_RangingMeasurementData_t RangingMeasurementData; - FixPoint1616_t xTalkStoredMeanSignalRate; - FixPoint1616_t xTalkStoredMeanRange; - FixPoint1616_t xTalkStoredMeanRtnSpads; - uint32_t signalXTalkTotalPerSpad; - uint32_t xTalkStoredMeanRtnSpadsAsInt; - uint32_t xTalkCalDistanceAsInt; - FixPoint1616_t XTalkCompensationRateMegaCps; - - if (XTalkCalDistance <= 0) - Status = VL53L0X_ERROR_INVALID_PARAMS; - - /* Disable the XTalk compensation */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetXTalkCompensationEnable(Dev, 0); - - /* Disable the RIT */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_SetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); - } - - /* Perform 50 measurements and compute the averages */ - if (Status == VL53L0X_ERROR_NONE) { - sum_ranging = 0; - sum_spads = 0; - sum_signalRate = 0; - total_count = 0; - for (xtalk_meas = 0; xtalk_meas < 50; xtalk_meas++) { - Status = VL53L0X_PerformSingleRangingMeasurement(Dev, - &RangingMeasurementData); - - if (Status != VL53L0X_ERROR_NONE) - break; - - /* The range is valid when RangeStatus = 0 */ - if (RangingMeasurementData.RangeStatus == 0) { - sum_ranging = sum_ranging + - RangingMeasurementData.RangeMilliMeter; - sum_signalRate = sum_signalRate + - RangingMeasurementData.SignalRateRtnMegaCps; - sum_spads = sum_spads + - RangingMeasurementData.EffectiveSpadRtnCount - / 256; - total_count = total_count + 1; - } - } - - /* no valid values found */ - if (total_count == 0) - Status = VL53L0X_ERROR_RANGE_ERROR; - - } - - - if (Status == VL53L0X_ERROR_NONE) { - /* FixPoint1616_t / uint16_t = FixPoint1616_t */ - xTalkStoredMeanSignalRate = sum_signalRate / total_count; - xTalkStoredMeanRange = (FixPoint1616_t)((uint32_t)( - sum_ranging << 16) / total_count); - xTalkStoredMeanRtnSpads = (FixPoint1616_t)((uint32_t)( - sum_spads << 16) / total_count); - - /* Round Mean Spads to Whole Number. - * Typically the calculated mean SPAD count is a whole number - * or very close to a whole - * number, therefore any truncation will not result in a - * significant loss in accuracy. - * Also, for a grey target at a typical distance of around - * 400mm, around 220 SPADs will - * be enabled, therefore, any truncation will result in a loss - * of accuracy of less than - * 0.5%. - */ - xTalkStoredMeanRtnSpadsAsInt = (xTalkStoredMeanRtnSpads + - 0x8000) >> 16; - - /* Round Cal Distance to Whole Number. - * Note that the cal distance is in mm, therefore no resolution - * is lost. - */ - xTalkCalDistanceAsInt = (XTalkCalDistance + 0x8000) >> 16; - - if (xTalkStoredMeanRtnSpadsAsInt == 0 || - xTalkCalDistanceAsInt == 0 || - xTalkStoredMeanRange >= XTalkCalDistance) { - XTalkCompensationRateMegaCps = 0; - } else { - /* Round Cal Distance to Whole Number. - * Note that the cal distance is in mm, therefore no - * resolution is lost. - */ - xTalkCalDistanceAsInt = (XTalkCalDistance + - 0x8000) >> 16; - - /* Apply division by mean spad count early in the - * calculation to keep the numbers small. - * This ensures we can maintain a 32bit calculation. - * Fixed1616 / int := Fixed1616 - */ - signalXTalkTotalPerSpad = (xTalkStoredMeanSignalRate) / - xTalkStoredMeanRtnSpadsAsInt; - - /* Complete the calculation for total Signal XTalk per - * SPAD - * Fixed1616 * (Fixed1616 - Fixed1616/int) := - * (2^16 * Fixed1616) - */ - signalXTalkTotalPerSpad *= ((1 << 16) - - (xTalkStoredMeanRange / xTalkCalDistanceAsInt)); - - /* Round from 2^16 * Fixed1616, to Fixed1616. */ - XTalkCompensationRateMegaCps = (signalXTalkTotalPerSpad - + 0x8000) >> 16; - } - - *pXTalkCompensationRateMegaCps = XTalkCompensationRateMegaCps; - - /* Enable the XTalk compensation */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetXTalkCompensationEnable(Dev, 1); - - /* Enable the XTalk compensation */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev, - XTalkCompensationRateMegaCps); - - } - - return Status; -} - -VL53L0X_Error VL53L0X_perform_offset_calibration(VL53L0X_DEV Dev, - FixPoint1616_t CalDistanceMilliMeter, - int32_t *pOffsetMicroMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t sum_ranging = 0; - FixPoint1616_t total_count = 0; - VL53L0X_RangingMeasurementData_t RangingMeasurementData; - FixPoint1616_t StoredMeanRange; - uint32_t StoredMeanRangeAsInt; - uint32_t CalDistanceAsInt_mm; - uint8_t SequenceStepEnabled; - int meas = 0; - - if (CalDistanceMilliMeter <= 0) - Status = VL53L0X_ERROR_INVALID_PARAMS; - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, 0); - - - /* Get the value of the TCC */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetSequenceStepEnable(Dev, - VL53L0X_SEQUENCESTEP_TCC, &SequenceStepEnabled); - - - /* Disable the TCC */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetSequenceStepEnable(Dev, - VL53L0X_SEQUENCESTEP_TCC, 0); - - - /* Disable the RIT */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_SetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0); - - /* Perform 50 measurements and compute the averages */ - if (Status == VL53L0X_ERROR_NONE) { - sum_ranging = 0; - total_count = 0; - for (meas = 0; meas < 50; meas++) { - Status = VL53L0X_PerformSingleRangingMeasurement(Dev, - &RangingMeasurementData); - - if (Status != VL53L0X_ERROR_NONE) - break; - - /* The range is valid when RangeStatus = 0 */ - if (RangingMeasurementData.RangeStatus == 0) { - sum_ranging = sum_ranging + - RangingMeasurementData.RangeMilliMeter; - total_count = total_count + 1; - } - } - - /* no valid values found */ - if (total_count == 0) - Status = VL53L0X_ERROR_RANGE_ERROR; - } - - - if (Status == VL53L0X_ERROR_NONE) { - /* FixPoint1616_t / uint16_t = FixPoint1616_t */ - StoredMeanRange = (FixPoint1616_t)((uint32_t)(sum_ranging << 16) - / total_count); - - StoredMeanRangeAsInt = (StoredMeanRange + 0x8000) >> 16; - - /* Round Cal Distance to Whole Number. - * Note that the cal distance is in mm, therefore no resolution - * is lost. - */ - CalDistanceAsInt_mm = (CalDistanceMilliMeter + 0x8000) >> 16; - - *pOffsetMicroMeter = (CalDistanceAsInt_mm - - StoredMeanRangeAsInt) * 1000; - - /* Apply the calculated offset */ - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETPARAMETERFIELD(Dev, RangeOffsetMicroMeters, - *pOffsetMicroMeter); - Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, - *pOffsetMicroMeter); - } - - } - - /* Restore the TCC */ - if (Status == VL53L0X_ERROR_NONE) { - if (SequenceStepEnabled != 0) - Status = VL53L0X_SetSequenceStepEnable(Dev, - VL53L0X_SEQUENCESTEP_TCC, 1); - } - - return Status; -} - - -VL53L0X_Error VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, - int32_t OffsetCalibrationDataMicroMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t cMaxOffsetMicroMeter = 511000; - int32_t cMinOffsetMicroMeter = -512000; - int16_t cOffsetRange = 4096; - uint32_t encodedOffsetVal; - - LOG_FUNCTION_START(""); - - if (OffsetCalibrationDataMicroMeter > cMaxOffsetMicroMeter) - OffsetCalibrationDataMicroMeter = cMaxOffsetMicroMeter; - else if (OffsetCalibrationDataMicroMeter < cMinOffsetMicroMeter) - OffsetCalibrationDataMicroMeter = cMinOffsetMicroMeter; - - /* The offset register is 10.2 format and units are mm - * therefore conversion is applied by a division of - * 250. - */ - if (OffsetCalibrationDataMicroMeter >= 0) { - encodedOffsetVal = - OffsetCalibrationDataMicroMeter/250; - } else { - encodedOffsetVal = - cOffsetRange + - OffsetCalibrationDataMicroMeter/250; - } - - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, - encodedOffsetVal); - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV Dev, - int32_t *pOffsetCalibrationDataMicroMeter) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint16_t RangeOffsetRegister; - int16_t cMaxOffset = 2047; - int16_t cOffsetRange = 4096; - - /* Note that offset has 10.2 format */ - - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM, - &RangeOffsetRegister); - - if (Status == VL53L0X_ERROR_NONE) { - RangeOffsetRegister = (RangeOffsetRegister & 0x0fff); - - /* Apply 12 bit 2's compliment conversion */ - if (RangeOffsetRegister > cMaxOffset) - *pOffsetCalibrationDataMicroMeter = - (int16_t)(RangeOffsetRegister - cOffsetRange) - * 250; - else - *pOffsetCalibrationDataMicroMeter = - (int16_t)RangeOffsetRegister * 250; - - } - - return Status; -} - - -VL53L0X_Error VL53L0X_apply_offset_adjustment(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t CorrectedOffsetMicroMeters; - int32_t CurrentOffsetMicroMeters; - - /* if we run on this function we can read all the NVM info - * used by the API - */ - Status = VL53L0X_get_info_from_device(Dev, 7); - - /* Read back current device offset */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev, - &CurrentOffsetMicroMeters); - } - - /* Apply Offset Adjustment derived from 400mm measurements */ - if (Status == VL53L0X_ERROR_NONE) { - - /* Store initial device offset */ - PALDevDataSet(Dev, Part2PartOffsetNVMMicroMeter, - CurrentOffsetMicroMeters); - - CorrectedOffsetMicroMeters = CurrentOffsetMicroMeters + - (int32_t)PALDevDataGet(Dev, - Part2PartOffsetAdjustmentNVMMicroMeter); - - Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev, - CorrectedOffsetMicroMeters); - - /* store current, adjusted offset */ - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETPARAMETERFIELD(Dev, RangeOffsetMicroMeters, - CorrectedOffsetMicroMeters); - } - } - - return Status; -} - -void get_next_good_spad(uint8_t goodSpadArray[], uint32_t size, - uint32_t curr, int32_t *next) -{ - uint32_t startIndex; - uint32_t fineOffset; - uint32_t cSpadsPerByte = 8; - uint32_t coarseIndex; - uint32_t fineIndex; - uint8_t dataByte; - uint8_t success = 0; - - /* - * Starting with the current good spad, loop through the array to find - * the next. i.e. the next bit set in the sequence. - * - * The coarse index is the byte index of the array and the fine index is - * the index of the bit within each byte. - */ - - *next = -1; - - startIndex = curr / cSpadsPerByte; - fineOffset = curr % cSpadsPerByte; - - for (coarseIndex = startIndex; ((coarseIndex < size) && !success); - coarseIndex++) { - fineIndex = 0; - dataByte = goodSpadArray[coarseIndex]; - - if (coarseIndex == startIndex) { - /* locate the bit position of the provided current - * spad bit before iterating - */ - dataByte >>= fineOffset; - fineIndex = fineOffset; - } - - while (fineIndex < cSpadsPerByte) { - if ((dataByte & 0x1) == 1) { - success = 1; - *next = coarseIndex * cSpadsPerByte + fineIndex; - break; - } - dataByte >>= 1; - fineIndex++; - } - } -} - - -uint8_t is_aperture(uint32_t spadIndex) -{ - /* - * This function reports if a given spad index is an aperture SPAD by - * deriving the quadrant. - */ - uint32_t quadrant; - uint8_t isAperture = 1; - - quadrant = spadIndex >> 6; - if (refArrayQuadrants[quadrant] == REF_ARRAY_SPAD_0) - isAperture = 0; - - return isAperture; -} - - -VL53L0X_Error enable_spad_bit(uint8_t spadArray[], uint32_t size, - uint32_t spadIndex) -{ - VL53L0X_Error status = VL53L0X_ERROR_NONE; - uint32_t cSpadsPerByte = 8; - uint32_t coarseIndex; - uint32_t fineIndex; - - coarseIndex = spadIndex / cSpadsPerByte; - fineIndex = spadIndex % cSpadsPerByte; - if (coarseIndex >= size) - status = VL53L0X_ERROR_REF_SPAD_INIT; - else - spadArray[coarseIndex] |= (1 << fineIndex); - - return status; -} - -VL53L0X_Error count_enabled_spads(uint8_t spadArray[], - uint32_t byteCount, uint32_t maxSpads, - uint32_t *pTotalSpadsEnabled, uint8_t *pIsAperture) -{ - VL53L0X_Error status = VL53L0X_ERROR_NONE; - uint32_t cSpadsPerByte = 8; - uint32_t lastByte; - uint32_t lastBit; - uint32_t byteIndex = 0; - uint32_t bitIndex = 0; - uint8_t tempByte; - uint8_t spadTypeIdentified = 0; - - /* The entire array will not be used for spads, therefore the last - * byte and last bit is determined from the max spads value. - */ - - lastByte = maxSpads / cSpadsPerByte; - lastBit = maxSpads % cSpadsPerByte; - - /* Check that the max spads value does not exceed the array bounds. */ - if (lastByte >= byteCount) - status = VL53L0X_ERROR_REF_SPAD_INIT; - - *pTotalSpadsEnabled = 0; - - /* Count the bits enabled in the whole bytes */ - for (byteIndex = 0; byteIndex <= (lastByte - 1); byteIndex++) { - tempByte = spadArray[byteIndex]; - - for (bitIndex = 0; bitIndex <= cSpadsPerByte; bitIndex++) { - if ((tempByte & 0x01) == 1) { - (*pTotalSpadsEnabled)++; - - if (!spadTypeIdentified) { - *pIsAperture = 1; - if ((byteIndex < 2) && (bitIndex < 4)) - *pIsAperture = 0; - spadTypeIdentified = 1; - } - } - tempByte >>= 1; - } - } - - /* Count the number of bits enabled in the last byte accounting - * for the fact that not all bits in the byte may be used. - */ - tempByte = spadArray[lastByte]; - - for (bitIndex = 0; bitIndex <= lastBit; bitIndex++) { - if ((tempByte & 0x01) == 1) - (*pTotalSpadsEnabled)++; - } - - return status; -} - -VL53L0X_Error set_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) -{ - VL53L0X_Error status = VL53L0X_WriteMulti(Dev, - VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, - refSpadArray, 6); - return status; -} - -VL53L0X_Error get_ref_spad_map(VL53L0X_DEV Dev, uint8_t *refSpadArray) -{ - VL53L0X_Error status = VL53L0X_ReadMulti(Dev, - VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0, - refSpadArray, - 6); - return status; -} - -VL53L0X_Error enable_ref_spads(VL53L0X_DEV Dev, - uint8_t apertureSpads, - uint8_t goodSpadArray[], - uint8_t spadArray[], - uint32_t size, - uint32_t start, - uint32_t offset, - uint32_t spadCount, - uint32_t *lastSpad) -{ - VL53L0X_Error status = VL53L0X_ERROR_NONE; - uint32_t index; - uint32_t i; - int32_t nextGoodSpad = offset; - uint32_t currentSpad; - uint8_t checkSpadArray[6]; - - /* - * This function takes in a spad array which may or may not have SPADS - * already enabled and appends from a given offset a requested number - * of new SPAD enables. The 'good spad map' is applied to - * determine the next SPADs to enable. - * - * This function applies to only aperture or only non-aperture spads. - * Checks are performed to ensure this. - */ - - currentSpad = offset; - for (index = 0; index < spadCount; index++) { - get_next_good_spad(goodSpadArray, size, currentSpad, - &nextGoodSpad); - - if (nextGoodSpad == -1) { - status = VL53L0X_ERROR_REF_SPAD_INIT; - break; - } - - /* Confirm that the next good SPAD is non-aperture */ - if (is_aperture(start + nextGoodSpad) != apertureSpads) { - /* if we can't get the required number of good aperture - * spads from the current quadrant then this is an error - */ - status = VL53L0X_ERROR_REF_SPAD_INIT; - break; - } - currentSpad = (uint32_t)nextGoodSpad; - enable_spad_bit(spadArray, size, currentSpad); - currentSpad++; - } - *lastSpad = currentSpad; - - if (status == VL53L0X_ERROR_NONE) - status = set_ref_spad_map(Dev, spadArray); - - - if (status == VL53L0X_ERROR_NONE) { - status = get_ref_spad_map(Dev, checkSpadArray); - - i = 0; - - /* Compare spad maps. If not equal report error. */ - while (i < size) { - if (spadArray[i] != checkSpadArray[i]) { - status = VL53L0X_ERROR_REF_SPAD_INIT; - break; - } - i++; - } - } - return status; -} - - -VL53L0X_Error perform_ref_signal_measurement(VL53L0X_DEV Dev, - uint16_t *refSignalRate) -{ - VL53L0X_Error status = VL53L0X_ERROR_NONE; - VL53L0X_RangingMeasurementData_t rangingMeasurementData; - - uint8_t SequenceConfig = 0; - - /* store the value of the sequence config, - * this will be reset before the end of the function - */ - - SequenceConfig = PALDevDataGet(Dev, SequenceConfig); - - /* - * This function performs a reference signal rate measurement. - */ - if (status == VL53L0X_ERROR_NONE) - status = VL53L0X_WrByte(Dev, - VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0xC0); - - if (status == VL53L0X_ERROR_NONE) - status = VL53L0X_PerformSingleRangingMeasurement(Dev, - &rangingMeasurementData); - - if (status == VL53L0X_ERROR_NONE) - status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - - if (status == VL53L0X_ERROR_NONE) - status = VL53L0X_RdWord(Dev, - VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, - refSignalRate); - - if (status == VL53L0X_ERROR_NONE) - status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - - if (status == VL53L0X_ERROR_NONE) { - /* restore the previous Sequence Config */ - status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - SequenceConfig); - if (status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, SequenceConfig, SequenceConfig); - } - - return status; -} - -VL53L0X_Error VL53L0X_perform_ref_spad_management(VL53L0X_DEV Dev, - uint32_t *refSpadCount, - uint8_t *isApertureSpads) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t lastSpadArray[6]; - uint8_t startSelect = 0xB4; - uint32_t minimumSpadCount = 3; - uint32_t maxSpadCount = 44; - uint32_t currentSpadIndex = 0; - uint32_t lastSpadIndex = 0; - int32_t nextGoodSpad = 0; - uint16_t targetRefRate = 0x0A00; /* 20 MCPS in 9:7 format */ - uint16_t peakSignalRateRef; - uint32_t needAptSpads = 0; - uint32_t index = 0; - uint32_t spadArraySize = 6; - uint32_t signalRateDiff = 0; - uint32_t lastSignalRateDiff = 0; - uint8_t complete = 0; - uint8_t VhvSettings = 0; - uint8_t PhaseCal = 0; - uint32_t refSpadCount_int = 0; - uint8_t isApertureSpads_int = 0; - - /* - * The reference SPAD initialization procedure determines the minimum - * amount of reference spads to be enables to achieve a target reference - * signal rate and should be performed once during initialization. - * - * Either aperture or non-aperture spads are applied but never both. - * Firstly non-aperture spads are set, begining with 5 spads, and - * increased one spad at a time until the closest measurement to the - * target rate is achieved. - * - * If the target rate is exceeded when 5 non-aperture spads are enabled, - * initialization is performed instead with aperture spads. - * - * When setting spads, a 'Good Spad Map' is applied. - * - * This procedure operates within a SPAD window of interest of a maximum - * 44 spads. - * The start point is currently fixed to 180, which lies towards the end - * of the non-aperture quadrant and runs in to the adjacent aperture - * quadrant. - */ - - - targetRefRate = PALDevDataGet(Dev, targetRefRate); - - /* - * Initialize Spad arrays. - * Currently the good spad map is initialised to 'All good'. - * This is a short term implementation. The good spad map will be - * provided as an input. - * Note that there are 6 bytes. Only the first 44 bits will be used to - * represent spads. - */ - for (index = 0; index < spadArraySize; index++) - Dev->Data.SpadData.RefSpadEnables[index] = 0; - - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, - startSelect); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE, 0); - - /* Perform ref calibration */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_perform_ref_calibration(Dev, &VhvSettings, - &PhaseCal, 0); - - if (Status == VL53L0X_ERROR_NONE) { - /* Enable Minimum NON-APERTURE Spads */ - currentSpadIndex = 0; - lastSpadIndex = currentSpadIndex; - needAptSpads = 0; - Status = enable_ref_spads(Dev, - needAptSpads, - Dev->Data.SpadData.RefGoodSpadMap, - Dev->Data.SpadData.RefSpadEnables, - spadArraySize, - startSelect, - currentSpadIndex, - minimumSpadCount, - &lastSpadIndex); - } - - if (Status == VL53L0X_ERROR_NONE) { - currentSpadIndex = lastSpadIndex; - - Status = perform_ref_signal_measurement(Dev, - &peakSignalRateRef); - if ((Status == VL53L0X_ERROR_NONE) && - (peakSignalRateRef > targetRefRate)) { - /* Signal rate measurement too high, - * switch to APERTURE SPADs - */ - - for (index = 0; index < spadArraySize; index++) - Dev->Data.SpadData.RefSpadEnables[index] = 0; - - - /* Increment to the first APERTURE spad */ - while ((is_aperture(startSelect + currentSpadIndex) - == 0) && (currentSpadIndex < maxSpadCount)) { - currentSpadIndex++; - } - - needAptSpads = 1; - - Status = enable_ref_spads(Dev, - needAptSpads, - Dev->Data.SpadData.RefGoodSpadMap, - Dev->Data.SpadData.RefSpadEnables, - spadArraySize, - startSelect, - currentSpadIndex, - minimumSpadCount, - &lastSpadIndex); - - if (Status == VL53L0X_ERROR_NONE) { - currentSpadIndex = lastSpadIndex; - Status = perform_ref_signal_measurement(Dev, - &peakSignalRateRef); - - if ((Status == VL53L0X_ERROR_NONE) && - (peakSignalRateRef > targetRefRate)) { - /* Signal rate still too high after - * setting the minimum number of - * APERTURE spads. Can do no more - * therefore set the min number of - * aperture spads as the result. - */ - isApertureSpads_int = 1; - refSpadCount_int = minimumSpadCount; - } - } - } else { - needAptSpads = 0; - } - } - - if ((Status == VL53L0X_ERROR_NONE) && - (peakSignalRateRef < targetRefRate)) { - /* At this point, the minimum number of either aperture - * or non-aperture spads have been set. Proceed to add - * spads and perform measurements until the target - * reference is reached. - */ - isApertureSpads_int = needAptSpads; - refSpadCount_int = minimumSpadCount; - - memcpy(lastSpadArray, Dev->Data.SpadData.RefSpadEnables, - spadArraySize); - lastSignalRateDiff = abs(peakSignalRateRef - - targetRefRate); - complete = 0; - - while (!complete) { - get_next_good_spad( - Dev->Data.SpadData.RefGoodSpadMap, - spadArraySize, currentSpadIndex, - &nextGoodSpad); - - if (nextGoodSpad == -1) { - Status = VL53L0X_ERROR_REF_SPAD_INIT; - break; - } - - /* Cannot combine Aperture and Non-Aperture spads, so - * ensure the current spad is of the correct type. - */ - if (is_aperture((uint32_t)startSelect + nextGoodSpad) != - needAptSpads) { - /* At this point we have enabled the maximum - * number of Aperture spads. - */ - complete = 1; - break; - } - - (refSpadCount_int)++; - - currentSpadIndex = nextGoodSpad; - Status = enable_spad_bit( - Dev->Data.SpadData.RefSpadEnables, - spadArraySize, currentSpadIndex); - - if (Status == VL53L0X_ERROR_NONE) { - currentSpadIndex++; - /* Proceed to apply the additional spad and - * perform measurement. - */ - Status = set_ref_spad_map(Dev, - Dev->Data.SpadData.RefSpadEnables); - } - - if (Status != VL53L0X_ERROR_NONE) - break; - - Status = perform_ref_signal_measurement(Dev, - &peakSignalRateRef); - - if (Status != VL53L0X_ERROR_NONE) - break; - - signalRateDiff = abs(peakSignalRateRef - targetRefRate); - - if (peakSignalRateRef > targetRefRate) { - /* Select the spad map that provides the - * measurement closest to the target rate, - * either above or below it. - */ - if (signalRateDiff > lastSignalRateDiff) { - /* Previous spad map produced a closer - * measurement, so choose this. - */ - Status = set_ref_spad_map(Dev, - lastSpadArray); - memcpy( - Dev->Data.SpadData.RefSpadEnables, - lastSpadArray, spadArraySize); - - (refSpadCount_int)--; - } - complete = 1; - } else { - /* Continue to add spads */ - lastSignalRateDiff = signalRateDiff; - memcpy(lastSpadArray, - Dev->Data.SpadData.RefSpadEnables, - spadArraySize); - } - - } /* while */ - } - - if (Status == VL53L0X_ERROR_NONE) { - *refSpadCount = refSpadCount_int; - *isApertureSpads = isApertureSpads_int; - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadCount, (uint8_t)(*refSpadCount)); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadType, *isApertureSpads); - } - - return Status; -} - -VL53L0X_Error VL53L0X_set_reference_spads(VL53L0X_DEV Dev, - uint32_t count, uint8_t isApertureSpads) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint32_t currentSpadIndex = 0; - uint8_t startSelect = 0xB4; - uint32_t spadArraySize = 6; - uint32_t maxSpadCount = 44; - uint32_t lastSpadIndex; - uint32_t index; - - /* - * This function applies a requested number of reference spads, either - * aperture or - * non-aperture, as requested. - * The good spad map will be applied. - */ - - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT, - startSelect); - - for (index = 0; index < spadArraySize; index++) - Dev->Data.SpadData.RefSpadEnables[index] = 0; - - if (isApertureSpads) { - /* Increment to the first APERTURE spad */ - while ((is_aperture(startSelect + currentSpadIndex) == 0) && - (currentSpadIndex < maxSpadCount)) { - currentSpadIndex++; - } - } - Status = enable_ref_spads(Dev, - isApertureSpads, - Dev->Data.SpadData.RefGoodSpadMap, - Dev->Data.SpadData.RefSpadEnables, - spadArraySize, - startSelect, - currentSpadIndex, - count, - &lastSpadIndex); - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 1); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadCount, (uint8_t)(count)); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadType, isApertureSpads); - } - - return Status; -} - -VL53L0X_Error VL53L0X_get_reference_spads(VL53L0X_DEV Dev, - uint32_t *pSpadCount, uint8_t *pIsApertureSpads) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t refSpadsInitialised; - uint8_t refSpadArray[6]; - uint32_t cMaxSpadCount = 44; - uint32_t cSpadArraySize = 6; - uint32_t spadsEnabled; - uint8_t isApertureSpads = 0; - - refSpadsInitialised = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - RefSpadsInitialised); - - if (refSpadsInitialised == 1) { - - *pSpadCount = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadCount); - *pIsApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadType); - } else { - - /* obtain spad info from device.*/ - Status = get_ref_spad_map(Dev, refSpadArray); - - if (Status == VL53L0X_ERROR_NONE) { - /* count enabled spads within spad map array and - * determine if Aperture or Non-Aperture. - */ - Status = count_enabled_spads(refSpadArray, - cSpadArraySize, - cMaxSpadCount, - &spadsEnabled, - &isApertureSpads); - - if (Status == VL53L0X_ERROR_NONE) { - - *pSpadCount = spadsEnabled; - *pIsApertureSpads = isApertureSpads; - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - RefSpadsInitialised, 1); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadCount, - (uint8_t)spadsEnabled); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadType, isApertureSpads); - } - } - } - - return Status; -} - - -VL53L0X_Error VL53L0X_perform_single_ref_calibration(VL53L0X_DEV Dev, - uint8_t vhv_init_byte) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, - VL53L0X_REG_SYSRANGE_MODE_START_STOP | - vhv_init_byte); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_measurement_poll_for_completion(Dev); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_ClearInterruptMask(Dev, 0); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x00); - - return Status; -} - - -VL53L0X_Error VL53L0X_ref_calibration_io(VL53L0X_DEV Dev, - uint8_t read_not_write, - uint8_t VhvSettings, uint8_t PhaseCal, - uint8_t *pVhvSettings, uint8_t *pPhaseCal, - const uint8_t vhv_enable, const uint8_t phase_enable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t PhaseCalint = 0; - - /* Read VHV from device */ - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - - if (read_not_write) { - if (vhv_enable) - Status |= VL53L0X_RdByte(Dev, 0xCB, pVhvSettings); - if (phase_enable) - Status |= VL53L0X_RdByte(Dev, 0xEE, &PhaseCalint); - } else { - if (vhv_enable) - Status |= VL53L0X_WrByte(Dev, 0xCB, VhvSettings); - if (phase_enable) - Status |= VL53L0X_UpdateByte(Dev, 0xEE, 0x80, PhaseCal); - } - - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - - *pPhaseCal = (uint8_t)(PhaseCalint&0xEF); - - return Status; -} - - -VL53L0X_Error VL53L0X_perform_vhv_calibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, const uint8_t get_data_enable, - const uint8_t restore_config) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SequenceConfig = 0; - uint8_t VhvSettings = 0; - uint8_t PhaseCal = 0; - uint8_t PhaseCalInt = 0; - - /* store the value of the sequence config, - * this will be reset before the end of the function - */ - - if (restore_config) - SequenceConfig = PALDevDataGet(Dev, SequenceConfig); - - /* Run VHV */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x01); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_perform_single_ref_calibration(Dev, 0x40); - - /* Read VHV from device */ - if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { - Status = VL53L0X_ref_calibration_io(Dev, 1, - VhvSettings, PhaseCal, /* Not used here */ - pVhvSettings, &PhaseCalInt, - 1, 0); - } else - *pVhvSettings = 0; - - - if ((Status == VL53L0X_ERROR_NONE) && restore_config) { - /* restore the previous Sequence Config */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - SequenceConfig); - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, SequenceConfig, SequenceConfig); - - } - - return Status; -} - -VL53L0X_Error VL53L0X_perform_phase_calibration(VL53L0X_DEV Dev, - uint8_t *pPhaseCal, const uint8_t get_data_enable, - const uint8_t restore_config) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SequenceConfig = 0; - uint8_t VhvSettings = 0; - uint8_t PhaseCal = 0; - uint8_t VhvSettingsint; - - /* store the value of the sequence config, - * this will be reset before the end of the function - */ - - if (restore_config) - SequenceConfig = PALDevDataGet(Dev, SequenceConfig); - - /* Run PhaseCal */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x02); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_perform_single_ref_calibration(Dev, 0x0); - - /* Read PhaseCal from device */ - if ((Status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) { - Status = VL53L0X_ref_calibration_io(Dev, 1, - VhvSettings, PhaseCal, /* Not used here */ - &VhvSettingsint, pPhaseCal, - 0, 1); - } else - *pPhaseCal = 0; - - - if ((Status == VL53L0X_ERROR_NONE) && restore_config) { - /* restore the previous Sequence Config */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - SequenceConfig); - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, SequenceConfig, SequenceConfig); - - } - - return Status; -} - -VL53L0X_Error VL53L0X_perform_ref_calibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, uint8_t *pPhaseCal, uint8_t get_data_enable) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t SequenceConfig = 0; - - /* store the value of the sequence config, - * this will be reset before the end of the function - */ - - SequenceConfig = PALDevDataGet(Dev, SequenceConfig); - - /* In the following function we don't save the config to optimize - * writes on device. Config is saved and restored only once. - */ - Status = VL53L0X_perform_vhv_calibration( - Dev, pVhvSettings, get_data_enable, 0); - - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_perform_phase_calibration( - Dev, pPhaseCal, get_data_enable, 0); - - - if (Status == VL53L0X_ERROR_NONE) { - /* restore the previous Sequence Config */ - Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, - SequenceConfig); - if (Status == VL53L0X_ERROR_NONE) - PALDevDataSet(Dev, SequenceConfig, SequenceConfig); - - } - - return Status; -} - -VL53L0X_Error VL53L0X_set_ref_calibration(VL53L0X_DEV Dev, - uint8_t VhvSettings, uint8_t PhaseCal) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t pVhvSettings; - uint8_t pPhaseCal; - - Status = VL53L0X_ref_calibration_io(Dev, 0, - VhvSettings, PhaseCal, - &pVhvSettings, &pPhaseCal, - 1, 1); - - return Status; -} - -VL53L0X_Error VL53L0X_get_ref_calibration(VL53L0X_DEV Dev, - uint8_t *pVhvSettings, uint8_t *pPhaseCal) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t VhvSettings = 0; - uint8_t PhaseCal = 0; - - Status = VL53L0X_ref_calibration_io(Dev, 1, - VhvSettings, PhaseCal, - pVhvSettings, pPhaseCal, - 1, 1); - - return Status; -} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" deleted file mode 100644 index 3933a00b..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_core.c" +++ /dev/null @@ -1,2128 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND - NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. - IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -#include "vl53l0x_api.h" -#include "vl53l0x_api_core.h" -#include "vl53l0x_api_calibration.h" - - -#ifndef __KERNEL__ -#include -#endif -#define LOG_FUNCTION_START(fmt, ...) \ - _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) -#define LOG_FUNCTION_END(status, ...) \ - _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) -#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ - _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) - -VL53L0X_Error VL53L0X_reverse_bytes(uint8_t *data, uint32_t size) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t tempData; - uint32_t mirrorIndex; - uint32_t middle = size/2; - uint32_t index; - - for (index = 0; index < middle; index++) { - mirrorIndex = size - index - 1; - tempData = data[index]; - data[index] = data[mirrorIndex]; - data[mirrorIndex] = tempData; - } - return Status; -} - -VL53L0X_Error VL53L0X_measurement_poll_for_completion(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t NewDataReady = 0; - uint32_t LoopNb; - - LOG_FUNCTION_START(""); - - LoopNb = 0; - - do { - Status = VL53L0X_GetMeasurementDataReady(Dev, &NewDataReady); - if (Status != 0) - break; /* the error is set */ - - if (NewDataReady == 1) - break; /* done note that status == 0 */ - - LoopNb++; - if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) { - Status = VL53L0X_ERROR_TIME_OUT; - break; - } - - VL53L0X_PollingDelay(Dev); - } while (1); - - LOG_FUNCTION_END(Status); - - return Status; -} - - -uint8_t VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg) -{ - /*! - * Converts the encoded VCSEL period register value into the real - * period in PLL clocks - */ - - uint8_t vcsel_period_pclks = 0; - - vcsel_period_pclks = (vcsel_period_reg + 1) << 1; - - return vcsel_period_pclks; -} - -uint8_t VL53L0X_encode_vcsel_period(uint8_t vcsel_period_pclks) -{ - /*! - * Converts the encoded VCSEL period register value into the real period - * in PLL clocks - */ - - uint8_t vcsel_period_reg = 0; - - vcsel_period_reg = (vcsel_period_pclks >> 1) - 1; - - return vcsel_period_reg; -} - - -uint32_t VL53L0X_isqrt(uint32_t num) -{ - /* - * Implements an integer square root - * - * From: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots - */ - - uint32_t res = 0; - uint32_t bit = 1 << 30; - /* The second-to-top bit is set: - * 1 << 14 for 16-bits, 1 << 30 for 32 bits - */ - - /* "bit" starts at the highest power of four <= the argument. */ - while (bit > num) - bit >>= 2; - - - while (bit != 0) { - if (num >= res + bit) { - num -= res + bit; - res = (res >> 1) + bit; - } else - res >>= 1; - - bit >>= 2; - } - - return res; -} - - -uint32_t VL53L0X_quadrature_sum(uint32_t a, uint32_t b) -{ - /* - * Implements a quadrature sum - * - * rea = sqrt(a^2 + b^2) - * - * Trap overflow case max input value is 65535 (16-bit value) - * as internal calc are 32-bit wide - * - * If overflow then seta output to maximum - */ - uint32_t res = 0; - - if (a > 65535 || b > 65535) - res = 65535; - else - res = VL53L0X_isqrt(a * a + b * b); - - return res; -} - - -VL53L0X_Error VL53L0X_device_read_strobe(VL53L0X_DEV Dev) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t strobe; - uint32_t LoopNb; - - LOG_FUNCTION_START(""); - - Status |= VL53L0X_WrByte(Dev, 0x83, 0x00); - - /* polling - * use timeout to avoid deadlock - */ - if (Status == VL53L0X_ERROR_NONE) { - LoopNb = 0; - do { - Status = VL53L0X_RdByte(Dev, 0x83, &strobe); - if ((strobe != 0x00) || Status != VL53L0X_ERROR_NONE) - break; - - LoopNb = LoopNb + 1; - } while (LoopNb < VL53L0X_DEFAULT_MAX_LOOP); - - if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP) - Status = VL53L0X_ERROR_TIME_OUT; - - } - - Status |= VL53L0X_WrByte(Dev, 0x83, 0x01); - - LOG_FUNCTION_END(Status); - return Status; - -} - -VL53L0X_Error VL53L0X_get_info_from_device(VL53L0X_DEV Dev, uint8_t option) -{ - - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t byte; - uint32_t TmpDWord; - uint8_t ModuleId; - uint8_t Revision; - uint8_t ReferenceSpadCount = 0; - uint8_t ReferenceSpadType = 0; - uint32_t PartUIDUpper = 0; - uint32_t PartUIDLower = 0; - uint32_t OffsetFixed1104_mm = 0; - int16_t OffsetMicroMeters = 0; - uint32_t DistMeasTgtFixed1104_mm = 400 << 4; - uint32_t DistMeasFixed1104_400_mm = 0; - uint32_t SignalRateMeasFixed1104_400_mm = 0; - char ProductId[19]; - char *ProductId_tmp; - uint8_t ReadDataFromDeviceDone; - FixPoint1616_t SignalRateMeasFixed400mmFix = 0; - uint8_t NvmRefGoodSpadMap[VL53L0X_REF_SPAD_BUFFER_SIZE]; - int i; - - - LOG_FUNCTION_START(""); - - ReadDataFromDeviceDone = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ReadDataFromDeviceDone); - - /* This access is done only once after that a GetDeviceInfo or - * datainit is done - */ - if (ReadDataFromDeviceDone != 7) { - - Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x00); - - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); - Status |= VL53L0X_RdByte(Dev, 0x83, &byte); - Status |= VL53L0X_WrByte(Dev, 0x83, byte|4); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x07); - Status |= VL53L0X_WrByte(Dev, 0x81, 0x01); - - Status |= VL53L0X_PollingDelay(Dev); - - Status |= VL53L0X_WrByte(Dev, 0x80, 0x01); - - if (((option & 1) == 1) && - ((ReadDataFromDeviceDone & 1) == 0)) { - Status |= VL53L0X_WrByte(Dev, 0x94, 0x6b); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - ReferenceSpadCount = (uint8_t)((TmpDWord >> 8) & 0x07f); - ReferenceSpadType = (uint8_t)((TmpDWord >> 15) & 0x01); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x24); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - - NvmRefGoodSpadMap[0] = (uint8_t)((TmpDWord >> 24) - & 0xff); - NvmRefGoodSpadMap[1] = (uint8_t)((TmpDWord >> 16) - & 0xff); - NvmRefGoodSpadMap[2] = (uint8_t)((TmpDWord >> 8) - & 0xff); - NvmRefGoodSpadMap[3] = (uint8_t)(TmpDWord & 0xff); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x25); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - NvmRefGoodSpadMap[4] = (uint8_t)((TmpDWord >> 24) - & 0xff); - NvmRefGoodSpadMap[5] = (uint8_t)((TmpDWord >> 16) - & 0xff); - } - - if (((option & 2) == 2) && - ((ReadDataFromDeviceDone & 2) == 0)) { - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x02); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdByte(Dev, 0x90, &ModuleId); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdByte(Dev, 0x90, &Revision); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x77); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - ProductId[0] = (char)((TmpDWord >> 25) & 0x07f); - ProductId[1] = (char)((TmpDWord >> 18) & 0x07f); - ProductId[2] = (char)((TmpDWord >> 11) & 0x07f); - ProductId[3] = (char)((TmpDWord >> 4) & 0x07f); - - byte = (uint8_t)((TmpDWord & 0x00f) << 3); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x78); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - ProductId[4] = (char)(byte + - ((TmpDWord >> 29) & 0x07f)); - ProductId[5] = (char)((TmpDWord >> 22) & 0x07f); - ProductId[6] = (char)((TmpDWord >> 15) & 0x07f); - ProductId[7] = (char)((TmpDWord >> 8) & 0x07f); - ProductId[8] = (char)((TmpDWord >> 1) & 0x07f); - - byte = (uint8_t)((TmpDWord & 0x001) << 6); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x79); - - Status |= VL53L0X_device_read_strobe(Dev); - - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - ProductId[9] = (char)(byte + - ((TmpDWord >> 26) & 0x07f)); - ProductId[10] = (char)((TmpDWord >> 19) & 0x07f); - ProductId[11] = (char)((TmpDWord >> 12) & 0x07f); - ProductId[12] = (char)((TmpDWord >> 5) & 0x07f); - - byte = (uint8_t)((TmpDWord & 0x01f) << 2); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x7A); - - Status |= VL53L0X_device_read_strobe(Dev); - - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - ProductId[13] = (char)(byte + - ((TmpDWord >> 30) & 0x07f)); - ProductId[14] = (char)((TmpDWord >> 23) & 0x07f); - ProductId[15] = (char)((TmpDWord >> 16) & 0x07f); - ProductId[16] = (char)((TmpDWord >> 9) & 0x07f); - ProductId[17] = (char)((TmpDWord >> 2) & 0x07f); - ProductId[18] = '\0'; - - } - - if (((option & 4) == 4) && - ((ReadDataFromDeviceDone & 4) == 0)) { - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x7B); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDUpper); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x7C); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &PartUIDLower); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x73); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - SignalRateMeasFixed1104_400_mm = (TmpDWord & - 0x0000000ff) << 8; - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x74); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - SignalRateMeasFixed1104_400_mm |= ((TmpDWord & - 0xff000000) >> 24); - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x75); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - DistMeasFixed1104_400_mm = (TmpDWord & 0x0000000ff) - << 8; - - Status |= VL53L0X_WrByte(Dev, 0x94, 0x76); - Status |= VL53L0X_device_read_strobe(Dev); - Status |= VL53L0X_RdDWord(Dev, 0x90, &TmpDWord); - - DistMeasFixed1104_400_mm |= ((TmpDWord & 0xff000000) - >> 24); - } - - Status |= VL53L0X_WrByte(Dev, 0x81, 0x00); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x06); - Status |= VL53L0X_RdByte(Dev, 0x83, &byte); - Status |= VL53L0X_WrByte(Dev, 0x83, byte&0xfb); - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01); - Status |= VL53L0X_WrByte(Dev, 0x00, 0x01); - - Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00); - Status |= VL53L0X_WrByte(Dev, 0x80, 0x00); - } - - if ((Status == VL53L0X_ERROR_NONE) && - (ReadDataFromDeviceDone != 7)) { - /* Assign to variable if status is ok */ - if (((option & 1) == 1) && - ((ReadDataFromDeviceDone & 1) == 0)) { - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadCount, ReferenceSpadCount); - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ReferenceSpadType, ReferenceSpadType); - - for (i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++) { - Dev->Data.SpadData.RefGoodSpadMap[i] = - NvmRefGoodSpadMap[i]; - } - } - - if (((option & 2) == 2) && - ((ReadDataFromDeviceDone & 2) == 0)) { - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - ModuleId, ModuleId); - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - Revision, Revision); - - ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ProductId); - VL53L0X_COPYSTRING(ProductId_tmp, ProductId); - - } - - if (((option & 4) == 4) && - ((ReadDataFromDeviceDone & 4) == 0)) { - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - PartUIDUpper, PartUIDUpper); - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - PartUIDLower, PartUIDLower); - - SignalRateMeasFixed400mmFix = - VL53L0X_FIXPOINT97TOFIXPOINT1616( - SignalRateMeasFixed1104_400_mm); - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - SignalRateMeasFixed400mm, - SignalRateMeasFixed400mmFix); - - OffsetMicroMeters = 0; - if (DistMeasFixed1104_400_mm != 0) { - OffsetFixed1104_mm = - DistMeasFixed1104_400_mm - - DistMeasTgtFixed1104_mm; - OffsetMicroMeters = (OffsetFixed1104_mm - * 1000) >> 4; - OffsetMicroMeters *= -1; - } - - PALDevDataSet(Dev, - Part2PartOffsetAdjustmentNVMMicroMeter, - OffsetMicroMeters); - } - byte = (uint8_t)(ReadDataFromDeviceDone|option); - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, - byte); - } - - LOG_FUNCTION_END(Status); - return Status; -} - - -uint32_t VL53L0X_calc_macro_period_ps(VL53L0X_DEV Dev, - uint8_t vcsel_period_pclks) -{ - uint64_t PLL_period_ps; - uint32_t macro_period_vclks; - uint32_t macro_period_ps; - - LOG_FUNCTION_START(""); - - /* The above calculation will produce rounding errors, - * therefore set fixed value - */ - PLL_period_ps = 1655; - - macro_period_vclks = 2304; - macro_period_ps = (uint32_t)(macro_period_vclks - * vcsel_period_pclks * PLL_period_ps); - - LOG_FUNCTION_END(""); - return macro_period_ps; -} - -uint16_t VL53L0X_encode_timeout(uint32_t timeout_macro_clks) -{ - /*! - * Encode timeout in macro periods in (LSByte * 2^MSByte) + 1 format - */ - - uint16_t encoded_timeout = 0; - uint32_t ls_byte = 0; - uint16_t ms_byte = 0; - - if (timeout_macro_clks > 0) { - ls_byte = timeout_macro_clks - 1; - - while ((ls_byte & 0xFFFFFF00) > 0) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - - encoded_timeout = (ms_byte << 8) - + (uint16_t) (ls_byte & 0x000000FF); - } - - return encoded_timeout; - -} - -uint32_t VL53L0X_decode_timeout(uint16_t encoded_timeout) -{ - /*! - * Decode 16-bit timeout register value - format (LSByte * 2^MSByte) + 1 - */ - - uint32_t timeout_macro_clks = 0; - - timeout_macro_clks = ((uint32_t) (encoded_timeout & 0x00FF) - << (uint32_t) ((encoded_timeout & 0xFF00) >> 8)) + 1; - - return timeout_macro_clks; -} - - -/* To convert ms into register value */ -uint32_t VL53L0X_calc_timeout_mclks(VL53L0X_DEV Dev, - uint32_t timeout_period_us, - uint8_t vcsel_period_pclks) -{ - uint32_t macro_period_ps; - uint32_t macro_period_ns; - uint32_t timeout_period_mclks = 0; - - macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); - macro_period_ns = (macro_period_ps + 500) / 1000; - - timeout_period_mclks = - (uint32_t) (((timeout_period_us * 1000) - + (macro_period_ns / 2)) / macro_period_ns); - - return timeout_period_mclks; -} - -/* To convert register value into us */ -uint32_t VL53L0X_calc_timeout_us(VL53L0X_DEV Dev, - uint16_t timeout_period_mclks, - uint8_t vcsel_period_pclks) -{ - uint32_t macro_period_ps; - uint32_t macro_period_ns; - uint32_t actual_timeout_period_us = 0; - - macro_period_ps = VL53L0X_calc_macro_period_ps(Dev, vcsel_period_pclks); - macro_period_ns = (macro_period_ps + 500) / 1000; - - actual_timeout_period_us = - ((timeout_period_mclks * macro_period_ns) + 500) / 1000; - - return actual_timeout_period_us; -} - - -VL53L0X_Error get_sequence_step_timeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, - uint32_t *pTimeOutMicroSecs) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t CurrentVCSELPulsePeriodPClk; - uint8_t EncodedTimeOutByte = 0; - uint32_t TimeoutMicroSeconds = 0; - uint16_t PreRangeEncodedTimeOut = 0; - uint16_t MsrcTimeOutMClks; - uint16_t PreRangeTimeOutMClks; - uint16_t FinalRangeTimeOutMClks = 0; - uint16_t FinalRangeEncodedTimeOut; - VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; - - if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || - (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || - (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { - - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, - &EncodedTimeOutByte); - } - MsrcTimeOutMClks = VL53L0X_decode_timeout(EncodedTimeOutByte); - - TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, - MsrcTimeOutMClks, - CurrentVCSELPulsePeriodPClk); - } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { - /* Retrieve PRE-RANGE VCSEL Period */ - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - - /* Retrieve PRE-RANGE Timeout in Macro periods (MCLKS) */ - if (Status == VL53L0X_ERROR_NONE) { - - /* Retrieve PRE-RANGE VCSEL Period */ - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, - &PreRangeEncodedTimeOut); - } - - PreRangeTimeOutMClks = VL53L0X_decode_timeout( - PreRangeEncodedTimeOut); - - TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, - PreRangeTimeOutMClks, - CurrentVCSELPulsePeriodPClk); - } - } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { - - VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); - PreRangeTimeOutMClks = 0; - - if (SchedulerSequenceSteps.PreRangeOn) { - /* Retrieve PRE-RANGE VCSEL Period */ - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - - /* Retrieve PRE-RANGE Timeout in Macro periods - * (MCLKS) - */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, - &PreRangeEncodedTimeOut); - PreRangeTimeOutMClks = VL53L0X_decode_timeout( - PreRangeEncodedTimeOut); - } - } - - if (Status == VL53L0X_ERROR_NONE) { - /* Retrieve FINAL-RANGE VCSEL Period */ - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_FINAL_RANGE, - &CurrentVCSELPulsePeriodPClk); - } - - /* Retrieve FINAL-RANGE Timeout in Macro periods (MCLKS) */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI, - &FinalRangeEncodedTimeOut); - FinalRangeTimeOutMClks = VL53L0X_decode_timeout( - FinalRangeEncodedTimeOut); - } - - FinalRangeTimeOutMClks -= PreRangeTimeOutMClks; - TimeoutMicroSeconds = VL53L0X_calc_timeout_us(Dev, - FinalRangeTimeOutMClks, - CurrentVCSELPulsePeriodPClk); - } - - *pTimeOutMicroSecs = TimeoutMicroSeconds; - - return Status; -} - - -VL53L0X_Error set_sequence_step_timeout(VL53L0X_DEV Dev, - VL53L0X_SequenceStepId SequenceStepId, - uint32_t TimeOutMicroSecs) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t CurrentVCSELPulsePeriodPClk; - uint8_t MsrcEncodedTimeOut; - uint16_t PreRangeEncodedTimeOut; - uint16_t PreRangeTimeOutMClks; - uint16_t MsrcRangeTimeOutMClks; - uint32_t FinalRangeTimeOutMClks; - uint16_t FinalRangeEncodedTimeOut; - VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; - - if ((SequenceStepId == VL53L0X_SEQUENCESTEP_TCC) || - (SequenceStepId == VL53L0X_SEQUENCESTEP_DSS) || - (SequenceStepId == VL53L0X_SEQUENCESTEP_MSRC)) { - - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - - if (Status == VL53L0X_ERROR_NONE) { - MsrcRangeTimeOutMClks = VL53L0X_calc_timeout_mclks(Dev, - TimeOutMicroSecs, - (uint8_t)CurrentVCSELPulsePeriodPClk); - - if (MsrcRangeTimeOutMClks > 256) - MsrcEncodedTimeOut = 255; - else - MsrcEncodedTimeOut = - (uint8_t)MsrcRangeTimeOutMClks - 1; - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - LastEncodedTimeout, - MsrcEncodedTimeOut); - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP, - MsrcEncodedTimeOut); - } - } else { - - if (SequenceStepId == VL53L0X_SEQUENCESTEP_PRE_RANGE) { - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - PreRangeTimeOutMClks = - VL53L0X_calc_timeout_mclks(Dev, - TimeOutMicroSecs, - (uint8_t)CurrentVCSELPulsePeriodPClk); - PreRangeEncodedTimeOut = VL53L0X_encode_timeout( - PreRangeTimeOutMClks); - - VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, - LastEncodedTimeout, - PreRangeEncodedTimeOut); - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_WrWord(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI, - PreRangeEncodedTimeOut); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - PreRangeTimeoutMicroSecs, - TimeOutMicroSecs); - } - } else if (SequenceStepId == VL53L0X_SEQUENCESTEP_FINAL_RANGE) { - - /* For the final range timeout, the pre-range timeout - * must be added. To do this both final and pre-range - * timeouts must be expressed in macro periods MClks - * because they have different vcsel periods. - */ - - VL53L0X_GetSequenceStepEnables(Dev, - &SchedulerSequenceSteps); - PreRangeTimeOutMClks = 0; - if (SchedulerSequenceSteps.PreRangeOn) { - - /* Retrieve PRE-RANGE VCSEL Period */ - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_PRE_RANGE, - &CurrentVCSELPulsePeriodPClk); - - /* Retrieve PRE-RANGE Timeout in Macro periods - * (MCLKS) - */ - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdWord(Dev, 0x51, - &PreRangeEncodedTimeOut); - PreRangeTimeOutMClks = - VL53L0X_decode_timeout( - PreRangeEncodedTimeOut); - } - } - - /* Calculate FINAL RANGE Timeout in Macro Periods - * (MCLKS) and add PRE-RANGE value - */ - if (Status == VL53L0X_ERROR_NONE) { - - Status = VL53L0X_GetVcselPulsePeriod(Dev, - VL53L0X_VCSEL_PERIOD_FINAL_RANGE, - &CurrentVCSELPulsePeriodPClk); - } - if (Status == VL53L0X_ERROR_NONE) { - - FinalRangeTimeOutMClks = - VL53L0X_calc_timeout_mclks(Dev, - TimeOutMicroSecs, - (uint8_t) CurrentVCSELPulsePeriodPClk); - - FinalRangeTimeOutMClks += PreRangeTimeOutMClks; - - FinalRangeEncodedTimeOut = - VL53L0X_encode_timeout(FinalRangeTimeOutMClks); - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_WrWord(Dev, 0x71, - FinalRangeEncodedTimeOut); - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - FinalRangeTimeoutMicroSecs, - TimeOutMicroSecs); - } - } - } else - Status = VL53L0X_ERROR_INVALID_PARAMS; - - } - return Status; -} - -VL53L0X_Error VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t vcsel_period_reg; - uint8_t MinPreVcselPeriodPCLK = 12; - uint8_t MaxPreVcselPeriodPCLK = 18; - uint8_t MinFinalVcselPeriodPCLK = 8; - uint8_t MaxFinalVcselPeriodPCLK = 14; - uint32_t MeasurementTimingBudgetMicroSeconds; - uint32_t FinalRangeTimeoutMicroSeconds; - uint32_t PreRangeTimeoutMicroSeconds; - uint32_t MsrcTimeoutMicroSeconds; - uint8_t PhaseCalInt = 0; - - /* Check if valid clock period requested */ - - if ((VCSELPulsePeriodPCLK % 2) != 0) { - /* Value must be an even number */ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_PRE_RANGE && - (VCSELPulsePeriodPCLK < MinPreVcselPeriodPCLK || - VCSELPulsePeriodPCLK > MaxPreVcselPeriodPCLK)) { - Status = VL53L0X_ERROR_INVALID_PARAMS; - } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_FINAL_RANGE && - (VCSELPulsePeriodPCLK < MinFinalVcselPeriodPCLK || - VCSELPulsePeriodPCLK > MaxFinalVcselPeriodPCLK)) { - - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - /* Apply specific settings for the requested clock period */ - - if (Status != VL53L0X_ERROR_NONE) - return Status; - - - if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_PRE_RANGE) { - - /* Set phase check limits */ - if (VCSELPulsePeriodPCLK == 12) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x18); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - } else if (VCSELPulsePeriodPCLK == 14) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x30); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - } else if (VCSELPulsePeriodPCLK == 16) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x40); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - } else if (VCSELPulsePeriodPCLK == 18) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x50); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - } - } else if (VcselPeriodType == VL53L0X_VCSEL_PERIOD_FINAL_RANGE) { - - if (VCSELPulsePeriodPCLK == 8) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x10); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_LIM, - 0x30); - Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); - } else if (VCSELPulsePeriodPCLK == 10) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x28); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_LIM, - 0x20); - Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); - } else if (VCSELPulsePeriodPCLK == 12) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x38); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_LIM, - 0x20); - Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); - } else if (VCSELPulsePeriodPCLK == 14) { - - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH, - 0x048); - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW, - 0x08); - - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07); - - Status |= VL53L0X_WrByte(Dev, 0xff, 0x01); - Status |= VL53L0X_WrByte(Dev, - VL53L0X_REG_ALGO_PHASECAL_LIM, - 0x20); - Status |= VL53L0X_WrByte(Dev, 0xff, 0x00); - } - } - - - /* Re-calculate and apply timeouts, in macro periods */ - - if (Status == VL53L0X_ERROR_NONE) { - vcsel_period_reg = VL53L0X_encode_vcsel_period((uint8_t) - VCSELPulsePeriodPCLK); - - /* When the VCSEL period for the pre or final range is changed, - * the corresponding timeout must be read from the device using - * the current VCSEL period, then the new VCSEL period can be - * applied. The timeout then must be written back to the device - * using the new VCSEL period. - * - * For the MSRC timeout, the same applies - this timeout being - * dependant on the pre-range vcsel period. - */ - switch (VcselPeriodType) { - case VL53L0X_VCSEL_PERIOD_PRE_RANGE: - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_PRE_RANGE, - &PreRangeTimeoutMicroSeconds); - - if (Status == VL53L0X_ERROR_NONE) - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_MSRC, - &MsrcTimeoutMicroSeconds); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, - vcsel_period_reg); - - - if (Status == VL53L0X_ERROR_NONE) - Status = set_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_PRE_RANGE, - PreRangeTimeoutMicroSeconds); - - - if (Status == VL53L0X_ERROR_NONE) - Status = set_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_MSRC, - MsrcTimeoutMicroSeconds); - - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - PreRangeVcselPulsePeriod, - VCSELPulsePeriodPCLK); - break; - case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_FINAL_RANGE, - &FinalRangeTimeoutMicroSeconds); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, - vcsel_period_reg); - - - if (Status == VL53L0X_ERROR_NONE) - Status = set_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_FINAL_RANGE, - FinalRangeTimeoutMicroSeconds); - - VL53L0X_SETDEVICESPECIFICPARAMETER( - Dev, - FinalRangeVcselPulsePeriod, - VCSELPulsePeriodPCLK); - break; - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - /* Finally, the timing budget must be re-applied */ - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_GETPARAMETERFIELD(Dev, - MeasurementTimingBudgetMicroSeconds, - MeasurementTimingBudgetMicroSeconds); - - Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev, - MeasurementTimingBudgetMicroSeconds); - } - - /* Perform the phase calibration. This is needed after changing on - * vcsel period. - * get_data_enable = 0, restore_config = 1 - */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_perform_phase_calibration( - Dev, &PhaseCalInt, 0, 1); - - return Status; -} - -VL53L0X_Error VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV Dev, - VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t vcsel_period_reg; - - switch (VcselPeriodType) { - case VL53L0X_VCSEL_PERIOD_PRE_RANGE: - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD, - &vcsel_period_reg); - break; - case VL53L0X_VCSEL_PERIOD_FINAL_RANGE: - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD, - &vcsel_period_reg); - break; - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - if (Status == VL53L0X_ERROR_NONE) - *pVCSELPulsePeriodPCLK = - VL53L0X_decode_vcsel_period(vcsel_period_reg); - - return Status; -} - - - -VL53L0X_Error VL53L0X_set_measurement_timing_budget_micro_seconds( - VL53L0X_DEV Dev, - uint32_t MeasurementTimingBudgetMicroSeconds) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint32_t FinalRangeTimingBudgetMicroSeconds; - VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; - uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; - uint32_t StartOverheadMicroSeconds = 1910; - uint32_t EndOverheadMicroSeconds = 960; - uint32_t MsrcOverheadMicroSeconds = 660; - uint32_t TccOverheadMicroSeconds = 590; - uint32_t DssOverheadMicroSeconds = 690; - uint32_t PreRangeOverheadMicroSeconds = 660; - uint32_t FinalRangeOverheadMicroSeconds = 550; - uint32_t PreRangeTimeoutMicroSeconds = 0; - uint32_t SubTimeout = 0; - - LOG_FUNCTION_START(""); - - FinalRangeTimingBudgetMicroSeconds = - MeasurementTimingBudgetMicroSeconds - - (StartOverheadMicroSeconds + EndOverheadMicroSeconds); - - Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); - - if (Status == VL53L0X_ERROR_NONE && - (SchedulerSequenceSteps.TccOn || - SchedulerSequenceSteps.MsrcOn || - SchedulerSequenceSteps.DssOn)) { - - /* TCC, MSRC and DSS all share the same timeout */ - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_MSRC, - &MsrcDccTccTimeoutMicroSeconds); - - /* Subtract the TCC, MSRC and DSS timeouts if they are - * enabled. - */ - - if (Status != VL53L0X_ERROR_NONE) - return Status; - - /* TCC */ - if (SchedulerSequenceSteps.TccOn) { - - SubTimeout = MsrcDccTccTimeoutMicroSeconds - + TccOverheadMicroSeconds; - - if (SubTimeout < - FinalRangeTimingBudgetMicroSeconds) { - FinalRangeTimingBudgetMicroSeconds -= - SubTimeout; - } else { - /* Requested timeout too big. */ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - if (Status != VL53L0X_ERROR_NONE) { - LOG_FUNCTION_END(Status); - return Status; - } - - /* DSS */ - if (SchedulerSequenceSteps.DssOn) { - - SubTimeout = 2 * (MsrcDccTccTimeoutMicroSeconds + - DssOverheadMicroSeconds); - - if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { - FinalRangeTimingBudgetMicroSeconds - -= SubTimeout; - } else { - /* Requested timeout too big. */ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } else if (SchedulerSequenceSteps.MsrcOn) { - /* MSRC */ - SubTimeout = MsrcDccTccTimeoutMicroSeconds + - MsrcOverheadMicroSeconds; - - if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { - FinalRangeTimingBudgetMicroSeconds - -= SubTimeout; - } else { - /* Requested timeout too big. */ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - } - - if (Status != VL53L0X_ERROR_NONE) { - LOG_FUNCTION_END(Status); - return Status; - } - - if (SchedulerSequenceSteps.PreRangeOn) { - - /* Subtract the Pre-range timeout if enabled. */ - - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_PRE_RANGE, - &PreRangeTimeoutMicroSeconds); - - SubTimeout = PreRangeTimeoutMicroSeconds + - PreRangeOverheadMicroSeconds; - - if (SubTimeout < FinalRangeTimingBudgetMicroSeconds) { - FinalRangeTimingBudgetMicroSeconds -= SubTimeout; - } else { - /* Requested timeout too big. */ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - - if (Status == VL53L0X_ERROR_NONE && - SchedulerSequenceSteps.FinalRangeOn) { - - FinalRangeTimingBudgetMicroSeconds -= - FinalRangeOverheadMicroSeconds; - - /* Final Range Timeout - * Note that the final range timeout is determined by the timing - * budget and the sum of all other timeouts within the sequence. - * If there is no room for the final range timeout, then an - * error will be set. Otherwise the remaining time will be - * applied to the final range. - */ - Status = set_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_FINAL_RANGE, - FinalRangeTimingBudgetMicroSeconds); - - VL53L0X_SETPARAMETERFIELD(Dev, - MeasurementTimingBudgetMicroSeconds, - MeasurementTimingBudgetMicroSeconds); - } - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_get_measurement_timing_budget_micro_seconds( - VL53L0X_DEV Dev, - uint32_t *pMeasurementTimingBudgetMicroSeconds) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_SchedulerSequenceSteps_t SchedulerSequenceSteps; - uint32_t FinalRangeTimeoutMicroSeconds; - uint32_t MsrcDccTccTimeoutMicroSeconds = 2000; - uint32_t StartOverheadMicroSeconds = 1910; - uint32_t EndOverheadMicroSeconds = 960; - uint32_t MsrcOverheadMicroSeconds = 660; - uint32_t TccOverheadMicroSeconds = 590; - uint32_t DssOverheadMicroSeconds = 690; - uint32_t PreRangeOverheadMicroSeconds = 660; - uint32_t FinalRangeOverheadMicroSeconds = 550; - uint32_t PreRangeTimeoutMicroSeconds = 0; - - LOG_FUNCTION_START(""); - - /* Start and end overhead times always present */ - *pMeasurementTimingBudgetMicroSeconds - = StartOverheadMicroSeconds + EndOverheadMicroSeconds; - - Status = VL53L0X_GetSequenceStepEnables(Dev, &SchedulerSequenceSteps); - - if (Status != VL53L0X_ERROR_NONE) { - LOG_FUNCTION_END(Status); - return Status; - } - - - if (SchedulerSequenceSteps.TccOn || - SchedulerSequenceSteps.MsrcOn || - SchedulerSequenceSteps.DssOn) { - - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_MSRC, - &MsrcDccTccTimeoutMicroSeconds); - - if (Status == VL53L0X_ERROR_NONE) { - if (SchedulerSequenceSteps.TccOn) { - *pMeasurementTimingBudgetMicroSeconds += - MsrcDccTccTimeoutMicroSeconds + - TccOverheadMicroSeconds; - } - - if (SchedulerSequenceSteps.DssOn) { - *pMeasurementTimingBudgetMicroSeconds += - 2 * (MsrcDccTccTimeoutMicroSeconds + - DssOverheadMicroSeconds); - } else if (SchedulerSequenceSteps.MsrcOn) { - *pMeasurementTimingBudgetMicroSeconds += - MsrcDccTccTimeoutMicroSeconds + - MsrcOverheadMicroSeconds; - } - } - } - - if (Status == VL53L0X_ERROR_NONE) { - if (SchedulerSequenceSteps.PreRangeOn) { - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_PRE_RANGE, - &PreRangeTimeoutMicroSeconds); - *pMeasurementTimingBudgetMicroSeconds += - PreRangeTimeoutMicroSeconds + - PreRangeOverheadMicroSeconds; - } - } - - if (Status == VL53L0X_ERROR_NONE) { - if (SchedulerSequenceSteps.FinalRangeOn) { - Status = get_sequence_step_timeout(Dev, - VL53L0X_SEQUENCESTEP_FINAL_RANGE, - &FinalRangeTimeoutMicroSeconds); - *pMeasurementTimingBudgetMicroSeconds += - (FinalRangeTimeoutMicroSeconds + - FinalRangeOverheadMicroSeconds); - } - } - - if (Status == VL53L0X_ERROR_NONE) { - VL53L0X_SETPARAMETERFIELD(Dev, - MeasurementTimingBudgetMicroSeconds, - *pMeasurementTimingBudgetMicroSeconds); - } - - LOG_FUNCTION_END(Status); - return Status; -} - - - -VL53L0X_Error VL53L0X_load_tuning_settings(VL53L0X_DEV Dev, - uint8_t *pTuningSettingBuffer) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int i; - int Index; - uint8_t msb; - uint8_t lsb; - uint8_t SelectParam; - uint8_t NumberOfWrites; - uint8_t Address; - uint8_t localBuffer[4]; /* max */ - uint16_t Temp16; - - LOG_FUNCTION_START(""); - - Index = 0; - - while ((*(pTuningSettingBuffer + Index) != 0) && - (Status == VL53L0X_ERROR_NONE)) { - NumberOfWrites = *(pTuningSettingBuffer + Index); - Index++; - if (NumberOfWrites == 0xFF) { - /* internal parameters */ - SelectParam = *(pTuningSettingBuffer + Index); - Index++; - switch (SelectParam) { - case 0: /* uint16_t SigmaEstRefArray -> 2 bytes */ - msb = *(pTuningSettingBuffer + Index); - Index++; - lsb = *(pTuningSettingBuffer + Index); - Index++; - Temp16 = VL53L0X_MAKEUINT16(lsb, msb); - PALDevDataSet(Dev, SigmaEstRefArray, Temp16); - break; - case 1: /* uint16_t SigmaEstEffPulseWidth -> 2 bytes */ - msb = *(pTuningSettingBuffer + Index); - Index++; - lsb = *(pTuningSettingBuffer + Index); - Index++; - Temp16 = VL53L0X_MAKEUINT16(lsb, msb); - PALDevDataSet(Dev, SigmaEstEffPulseWidth, - Temp16); - break; - case 2: /* uint16_t SigmaEstEffAmbWidth -> 2 bytes */ - msb = *(pTuningSettingBuffer + Index); - Index++; - lsb = *(pTuningSettingBuffer + Index); - Index++; - Temp16 = VL53L0X_MAKEUINT16(lsb, msb); - PALDevDataSet(Dev, SigmaEstEffAmbWidth, Temp16); - break; - case 3: /* uint16_t targetRefRate -> 2 bytes */ - msb = *(pTuningSettingBuffer + Index); - Index++; - lsb = *(pTuningSettingBuffer + Index); - Index++; - Temp16 = VL53L0X_MAKEUINT16(lsb, msb); - PALDevDataSet(Dev, targetRefRate, Temp16); - break; - default: /* invalid parameter */ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - } else if (NumberOfWrites <= 4) { - Address = *(pTuningSettingBuffer + Index); - Index++; - - for (i = 0; i < NumberOfWrites; i++) { - localBuffer[i] = *(pTuningSettingBuffer + - Index); - Index++; - } - - Status = VL53L0X_WriteMulti(Dev, Address, localBuffer, - NumberOfWrites); - - } else { - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_total_xtalk_rate(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - FixPoint1616_t *ptotal_xtalk_rate_mcps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - uint8_t xtalkCompEnable; - FixPoint1616_t totalXtalkMegaCps; - FixPoint1616_t xtalkPerSpadMegaCps; - - *ptotal_xtalk_rate_mcps = 0; - - Status = VL53L0X_GetXTalkCompensationEnable(Dev, &xtalkCompEnable); - if (Status == VL53L0X_ERROR_NONE) { - - if (xtalkCompEnable) { - - VL53L0X_GETPARAMETERFIELD( - Dev, - XTalkCompensationRateMegaCps, - xtalkPerSpadMegaCps); - - /* FixPoint1616 * FixPoint 8:8 = FixPoint0824 */ - totalXtalkMegaCps = - pRangingMeasurementData->EffectiveSpadRtnCount * - xtalkPerSpadMegaCps; - - /* FixPoint0824 >> 8 = FixPoint1616 */ - *ptotal_xtalk_rate_mcps = - (totalXtalkMegaCps + 0x80) >> 8; - } - } - - return Status; -} - -VL53L0X_Error VL53L0X_get_total_signal_rate(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - FixPoint1616_t *ptotal_signal_rate_mcps) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - FixPoint1616_t totalXtalkMegaCps; - - LOG_FUNCTION_START(""); - - *ptotal_signal_rate_mcps = - pRangingMeasurementData->SignalRateRtnMegaCps; - - Status = VL53L0X_get_total_xtalk_rate( - Dev, pRangingMeasurementData, &totalXtalkMegaCps); - - if (Status == VL53L0X_ERROR_NONE) - *ptotal_signal_rate_mcps += totalXtalkMegaCps; - - return Status; -} - -VL53L0X_Error get_dmax_lut_points(VL53L0X_DMaxLUT_t data, uint32_t lut_size, - FixPoint1616_t input, int32_t *index0, int32_t *index1){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - FixPoint1616_t index0_tmp = 0; - FixPoint1616_t index1_tmp = 0; - int index = 0; - - for (index = 0; index < lut_size; index++) { - if (input <= data.ambRate_mcps[index]) { - index1_tmp = index; - break; - } - } - - if (index == lut_size) { - /* input is higher than last x point */ - index0_tmp = index1_tmp = lut_size - 1; - } else if (index1_tmp == 0) { - /* input is lower than first x point */ - index0_tmp = 0; - } else{ - /* input is in between 2 points */ - index0_tmp = index1_tmp - 1; - } - - *index0 = index0_tmp; - *index1 = index1_tmp; - - return Status; -} - -VL53L0X_Error VL53L0X_calc_dmax( - VL53L0X_DEV Dev, FixPoint1616_t ambRateMeas, uint32_t *pdmax_mm){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - VL53L0X_DeviceParameters_t CurrentParameters; - int32_t index0 = 0; - int32_t index1 = 0; - FixPoint1616_t amb0, amb1, dmax0, dmax1; - FixPoint1616_t dmax_mm; - FixPoint1616_t linearSlope; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters); - - if (ambRateMeas <= CurrentParameters.dmax_lut.ambRate_mcps[0]) { - dmax_mm = CurrentParameters.dmax_lut.dmax_mm[0]; - } else if (ambRateMeas >= - CurrentParameters.dmax_lut. - ambRate_mcps[VL53L0X_DMAX_LUT_SIZE - 1]) { - dmax_mm = - CurrentParameters.dmax_lut.dmax_mm[VL53L0X_DMAX_LUT_SIZE - - 1]; - } else{ - get_dmax_lut_points(CurrentParameters.dmax_lut, - VL53L0X_DMAX_LUT_SIZE, ambRateMeas, &index0, &index1); - - if (index0 == index1) { - dmax_mm = CurrentParameters.dmax_lut.dmax_mm[index0]; - } else { - amb0 = CurrentParameters.dmax_lut.ambRate_mcps[index0]; - amb1 = CurrentParameters.dmax_lut.ambRate_mcps[index1]; - dmax0 = CurrentParameters.dmax_lut.dmax_mm[index0]; - dmax1 = CurrentParameters.dmax_lut.dmax_mm[index1]; - if ((amb1 - amb0) != 0) { - /* Fix16:16/Fix16:8 => Fix16:8 */ - linearSlope = (dmax0-dmax1)/((amb1-amb0) >> 8); - - /* Fix16:8 * Fix16:8 => Fix16:16 */ - dmax_mm = - (((amb1 - - ambRateMeas) >> 8) * linearSlope) + - dmax1; - } else{ - dmax_mm = dmax0; - } - } - } - *pdmax_mm = (uint32_t)(dmax_mm >> 16); - - LOG_FUNCTION_END(Status); - - return Status; -} - -VL53L0X_Error VL53L0X_calc_sigma_estimate(VL53L0X_DEV Dev, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - FixPoint1616_t *pSigmaEstimate) -{ - /* Expressed in 100ths of a ns, i.e. centi-ns */ - const uint32_t cPulseEffectiveWidth_centi_ns = 800; - /* Expressed in 100ths of a ns, i.e. centi-ns */ - const uint32_t cAmbientEffectiveWidth_centi_ns = 600; - const FixPoint1616_t cDfltFinalRangeIntegrationTimeMilliSecs = - 0x00190000; /* 25ms */ - const uint32_t cVcselPulseWidth_ps = 4700; /* pico secs */ - const FixPoint1616_t cSigmaEstMax = 0x028F87AE; - const FixPoint1616_t cSigmaEstRtnMax = 0xF000; - const FixPoint1616_t cAmbToSignalRatioMax = 0xF0000000/ - cAmbientEffectiveWidth_centi_ns; - /* Time Of Flight per mm (6.6 pico secs) */ - const FixPoint1616_t cTOF_per_mm_ps = 0x0006999A; - const uint32_t c16BitRoundingParam = 0x00008000; - const FixPoint1616_t cMaxXTalk_kcps = 0x00320000; - const uint32_t cPllPeriod_ps = 1655; - - uint32_t vcselTotalEventsRtn; - uint32_t finalRangeTimeoutMicroSecs; - uint32_t preRangeTimeoutMicroSecs; - uint32_t finalRangeIntegrationTimeMilliSecs; - FixPoint1616_t sigmaEstimateP1; - FixPoint1616_t sigmaEstimateP2; - FixPoint1616_t sigmaEstimateP3; - FixPoint1616_t deltaT_ps; - FixPoint1616_t pwMult; - FixPoint1616_t sigmaEstRtn; - FixPoint1616_t sigmaEstimate; - FixPoint1616_t xTalkCorrection; - FixPoint1616_t ambientRate_kcps; - FixPoint1616_t peakSignalRate_kcps; - FixPoint1616_t xTalkCompRate_mcps; - uint32_t xTalkCompRate_kcps; - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - FixPoint1616_t diff1_mcps; - FixPoint1616_t diff2_mcps; - FixPoint1616_t sqr1; - FixPoint1616_t sqr2; - FixPoint1616_t sqrSum; - FixPoint1616_t sqrtResult_centi_ns; - FixPoint1616_t sqrtResult; - FixPoint1616_t totalSignalRate_mcps; - FixPoint1616_t sigmaEstRef; - uint32_t vcselWidth; - uint32_t finalRangeMacroPCLKS; - uint32_t preRangeMacroPCLKS; - uint32_t peakVcselDuration_us; - uint8_t finalRangeVcselPCLKS; - uint8_t preRangeVcselPCLKS; - /*! \addtogroup calc_sigma_estimate - * @{ - * - * Estimates the range sigma - */ - - LOG_FUNCTION_START(""); - - VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, - xTalkCompRate_mcps); - - /* - * We work in kcps rather than mcps as this helps keep within the - * confines of the 32 Fix1616 type. - */ - - ambientRate_kcps = - (pRangingMeasurementData->AmbientRateRtnMegaCps * 1000) >> 16; - - Status = VL53L0X_get_total_signal_rate( - Dev, pRangingMeasurementData, &totalSignalRate_mcps); - Status = VL53L0X_get_total_xtalk_rate( - Dev, pRangingMeasurementData, &xTalkCompRate_mcps); - - - /* Signal rate measurement provided by device is the - * peak signal rate, not average. - */ - peakSignalRate_kcps = (totalSignalRate_mcps * 1000); - peakSignalRate_kcps = (peakSignalRate_kcps + 0x8000) >> 16; - - xTalkCompRate_kcps = xTalkCompRate_mcps * 1000; - - if (xTalkCompRate_kcps > cMaxXTalk_kcps) - xTalkCompRate_kcps = cMaxXTalk_kcps; - - if (Status == VL53L0X_ERROR_NONE) { - - /* Calculate final range macro periods */ - finalRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( - Dev, FinalRangeTimeoutMicroSecs); - - finalRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( - Dev, FinalRangeVcselPulsePeriod); - - finalRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( - Dev, finalRangeTimeoutMicroSecs, finalRangeVcselPCLKS); - - /* Calculate pre-range macro periods */ - preRangeTimeoutMicroSecs = VL53L0X_GETDEVICESPECIFICPARAMETER( - Dev, PreRangeTimeoutMicroSecs); - - preRangeVcselPCLKS = VL53L0X_GETDEVICESPECIFICPARAMETER( - Dev, PreRangeVcselPulsePeriod); - - preRangeMacroPCLKS = VL53L0X_calc_timeout_mclks( - Dev, preRangeTimeoutMicroSecs, preRangeVcselPCLKS); - - vcselWidth = 3; - if (finalRangeVcselPCLKS == 8) - vcselWidth = 2; - - - peakVcselDuration_us = vcselWidth * 2048 * - (preRangeMacroPCLKS + finalRangeMacroPCLKS); - peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; - peakVcselDuration_us *= cPllPeriod_ps; - peakVcselDuration_us = (peakVcselDuration_us + 500)/1000; - - /* Fix1616 >> 8 = Fix2408 */ - totalSignalRate_mcps = (totalSignalRate_mcps + 0x80) >> 8; - - /* Fix2408 * uint32 = Fix2408 */ - vcselTotalEventsRtn = totalSignalRate_mcps * - peakVcselDuration_us; - - /* Fix2408 >> 8 = uint32 */ - vcselTotalEventsRtn = (vcselTotalEventsRtn + 0x80) >> 8; - - /* Fix2408 << 8 = Fix1616 = */ - totalSignalRate_mcps <<= 8; - } - - if (Status != VL53L0X_ERROR_NONE) { - LOG_FUNCTION_END(Status); - return Status; - } - - if (peakSignalRate_kcps == 0) { - *pSigmaEstimate = cSigmaEstMax; - PALDevDataSet(Dev, SigmaEstimate, cSigmaEstMax); - } else { - if (vcselTotalEventsRtn < 1) - vcselTotalEventsRtn = 1; - - sigmaEstimateP1 = cPulseEffectiveWidth_centi_ns; - - /* ((FixPoint1616 << 16)* uint32)/uint32 = FixPoint1616 */ - sigmaEstimateP2 = (ambientRate_kcps << 16)/peakSignalRate_kcps; - if (sigmaEstimateP2 > cAmbToSignalRatioMax) { - /* Clip to prevent overflow. Will ensure safe - * max result. - */ - sigmaEstimateP2 = cAmbToSignalRatioMax; - } - sigmaEstimateP2 *= cAmbientEffectiveWidth_centi_ns; - - sigmaEstimateP3 = 2 * VL53L0X_isqrt(vcselTotalEventsRtn * 12); - - /* uint32 * FixPoint1616 = FixPoint1616 */ - deltaT_ps = pRangingMeasurementData->RangeMilliMeter * - cTOF_per_mm_ps; - - /* - * vcselRate - xtalkCompRate - * (uint32 << 16) - FixPoint1616 = FixPoint1616. - * Divide result by 1000 to convert to mcps. - * 500 is added to ensure rounding when integer division - * truncates. - */ - diff1_mcps = (((peakSignalRate_kcps << 16) - - 2 * xTalkCompRate_kcps) + 500)/1000; - - /* vcselRate + xtalkCompRate */ - diff2_mcps = ((peakSignalRate_kcps << 16) + 500)/1000; - - /* Shift by 8 bits to increase resolution prior to the - * division - */ - diff1_mcps <<= 8; - - /* FixPoint0824/FixPoint1616 = FixPoint2408 */ - xTalkCorrection = abs(diff1_mcps/diff2_mcps); - - /* FixPoint2408 << 8 = FixPoint1616 */ - xTalkCorrection <<= 8; - - if (pRangingMeasurementData->RangeStatus != 0) { - pwMult = 1 << 16; - } else { - /* FixPoint1616/uint32 = FixPoint1616 */ - /* smaller than 1.0f */ - pwMult = deltaT_ps/cVcselPulseWidth_ps; - - /* - * FixPoint1616 * FixPoint1616 = FixPoint3232, however - * both values are small enough such that32 bits will - * not be exceeded. - */ - pwMult *= ((1 << 16) - xTalkCorrection); - - /* (FixPoint3232 >> 16) = FixPoint1616 */ - pwMult = (pwMult + c16BitRoundingParam) >> 16; - - /* FixPoint1616 + FixPoint1616 = FixPoint1616 */ - pwMult += (1 << 16); - - /* - * At this point the value will be 1.xx, therefore if we - * square the value this will exceed 32 bits. To address - * this perform a single shift to the right before the - * multiplication. - */ - pwMult >>= 1; - /* FixPoint1715 * FixPoint1715 = FixPoint3430 */ - pwMult = pwMult * pwMult; - - /* (FixPoint3430 >> 14) = Fix1616 */ - pwMult >>= 14; - } - - /* FixPoint1616 * uint32 = FixPoint1616 */ - sqr1 = pwMult * sigmaEstimateP1; - - /* (FixPoint1616 >> 16) = FixPoint3200 */ - sqr1 = (sqr1 + 0x8000) >> 16; - - /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ - sqr1 *= sqr1; - - sqr2 = sigmaEstimateP2; - - /* (FixPoint1616 >> 16) = FixPoint3200 */ - sqr2 = (sqr2 + 0x8000) >> 16; - - /* FixPoint3200 * FixPoint3200 = FixPoint6400 */ - sqr2 *= sqr2; - - /* FixPoint64000 + FixPoint6400 = FixPoint6400 */ - sqrSum = sqr1 + sqr2; - - /* SQRT(FixPoin6400) = FixPoint3200 */ - sqrtResult_centi_ns = VL53L0X_isqrt(sqrSum); - - /* (FixPoint3200 << 16) = FixPoint1616 */ - sqrtResult_centi_ns <<= 16; - - /* - * Note that the Speed Of Light is expressed in um per 1E-10 - * seconds (2997) Therefore to get mm/ns we have to divide by - * 10000 - */ - sigmaEstRtn = (((sqrtResult_centi_ns+50)/100) / - sigmaEstimateP3); - sigmaEstRtn *= VL53L0X_SPEED_OF_LIGHT_IN_AIR; - - /* Add 5000 before dividing by 10000 to ensure rounding. */ - sigmaEstRtn += 5000; - sigmaEstRtn /= 10000; - - if (sigmaEstRtn > cSigmaEstRtnMax) { - /* Clip to prevent overflow. Will ensure safe - * max result. - */ - sigmaEstRtn = cSigmaEstRtnMax; - } - finalRangeIntegrationTimeMilliSecs = - (finalRangeTimeoutMicroSecs + preRangeTimeoutMicroSecs + - 500) / 1000; - - /* sigmaEstRef = 1mm * 25ms/final range integration time - * (inc pre-range) - * sqrt(FixPoint1616/int) = FixPoint2408) - */ - sigmaEstRef = - VL53L0X_isqrt((cDfltFinalRangeIntegrationTimeMilliSecs + - finalRangeIntegrationTimeMilliSecs/2)/ - finalRangeIntegrationTimeMilliSecs); - - /* FixPoint2408 << 8 = FixPoint1616 */ - sigmaEstRef <<= 8; - sigmaEstRef = (sigmaEstRef + 500)/1000; - - /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ - sqr1 = sigmaEstRtn * sigmaEstRtn; - /* FixPoint1616 * FixPoint1616 = FixPoint3232 */ - sqr2 = sigmaEstRef * sigmaEstRef; - - /* sqrt(FixPoint3232) = FixPoint1616 */ - sqrtResult = VL53L0X_isqrt((sqr1 + sqr2)); - /* - * Note that the Shift by 4 bits increases resolution prior to - * the sqrt, therefore the result must be shifted by 2 bits to - * the right to revert back to the FixPoint1616 format. - */ - - sigmaEstimate = 1000 * sqrtResult; - - if ((peakSignalRate_kcps < 1) || (vcselTotalEventsRtn < 1) || - (sigmaEstimate > cSigmaEstMax)) { - sigmaEstimate = cSigmaEstMax; - } - - *pSigmaEstimate = (uint32_t)(sigmaEstimate); - PALDevDataSet(Dev, SigmaEstimate, *pSigmaEstimate); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_pal_range_status(VL53L0X_DEV Dev, - uint8_t DeviceRangeStatus, - FixPoint1616_t SignalRate, - uint16_t EffectiveSpadRtnCount, - VL53L0X_RangingMeasurementData_t *pRangingMeasurementData, - uint8_t *pPalRangeStatus) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t NoneFlag; - uint8_t SigmaLimitflag = 0; - uint8_t SignalRefClipflag = 0; - uint8_t RangeIgnoreThresholdflag = 0; - uint8_t SigmaLimitCheckEnable = 0; - uint8_t SignalRateFinalRangeLimitCheckEnable = 0; - uint8_t SignalRefClipLimitCheckEnable = 0; - uint8_t RangeIgnoreThresholdLimitCheckEnable = 0; - FixPoint1616_t SigmaEstimate; - FixPoint1616_t SigmaLimitValue; - FixPoint1616_t SignalRefClipValue; - FixPoint1616_t RangeIgnoreThresholdValue; - FixPoint1616_t SignalRatePerSpad; - uint8_t DeviceRangeStatusInternal = 0; - uint16_t tmpWord = 0; - uint8_t Temp8; - uint32_t Dmax_mm = 0; - FixPoint1616_t LastSignalRefMcps; - - LOG_FUNCTION_START(""); - - - /* - * VL53L0X has a good ranging when the value of the - * DeviceRangeStatus = 11. This function will replace the value 0 with - * the value 11 in the DeviceRangeStatus. - * In addition, the SigmaEstimator is not included in the VL53L0X - * DeviceRangeStatus, this will be added in the PalRangeStatus. - */ - - DeviceRangeStatusInternal = ((DeviceRangeStatus & 0x78) >> 3); - - if (DeviceRangeStatusInternal == 0 || - DeviceRangeStatusInternal == 5 || - DeviceRangeStatusInternal == 7 || - DeviceRangeStatusInternal == 12 || - DeviceRangeStatusInternal == 13 || - DeviceRangeStatusInternal == 14 || - DeviceRangeStatusInternal == 15 - ) { - NoneFlag = 1; - } else { - NoneFlag = 0; - } - - /* - * Check if Sigma limit is enabled, if yes then do comparison with limit - * value and put the result back into pPalRangeStatus. - */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, - &SigmaLimitCheckEnable); - - if ((SigmaLimitCheckEnable != 0) && (Status == VL53L0X_ERROR_NONE)) { - /* - * compute the Sigma and check with limit - */ - Status = VL53L0X_calc_sigma_estimate( - Dev, - pRangingMeasurementData, - &SigmaEstimate); - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_calc_dmax( - Dev, - pRangingMeasurementData->AmbientRateRtnMegaCps, - &Dmax_mm); - if (Status == VL53L0X_ERROR_NONE) - pRangingMeasurementData->RangeDMaxMilliMeter = Dmax_mm; - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_GetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, - &SigmaLimitValue); - - if ((SigmaLimitValue > 0) && - (SigmaEstimate > SigmaLimitValue)) - /* Limit Fail */ - SigmaLimitflag = 1; - } - } - - /* - * Check if Signal ref clip limit is enabled, if yes then do comparison - * with limit value and put the result back into pPalRangeStatus. - */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, - &SignalRefClipLimitCheckEnable); - - if ((SignalRefClipLimitCheckEnable != 0) && - (Status == VL53L0X_ERROR_NONE)) { - - Status = VL53L0X_GetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, - &SignalRefClipValue); - - /* Read LastSignalRefMcps from device */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, 0xFF, 0x01); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_RdWord(Dev, - VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF, - &tmpWord); - - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_WrByte(Dev, 0xFF, 0x00); - - LastSignalRefMcps = VL53L0X_FIXPOINT97TOFIXPOINT1616(tmpWord); - PALDevDataSet(Dev, LastSignalRefMcps, LastSignalRefMcps); - - if ((SignalRefClipValue > 0) && - (LastSignalRefMcps > SignalRefClipValue)) { - /* Limit Fail */ - SignalRefClipflag = 1; - } - } - - /* - * Check if Signal ref clip limit is enabled, if yes then do comparison - * with limit value and put the result back into pPalRangeStatus. - * EffectiveSpadRtnCount has a format 8.8 - * If (Return signal rate < (1.5 x Xtalk x number of Spads)) : FAIL - */ - if (Status == VL53L0X_ERROR_NONE) - Status = VL53L0X_GetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - &RangeIgnoreThresholdLimitCheckEnable); - - if ((RangeIgnoreThresholdLimitCheckEnable != 0) && - (Status == VL53L0X_ERROR_NONE)) { - - /* Compute the signal rate per spad */ - if (EffectiveSpadRtnCount == 0) { - SignalRatePerSpad = 0; - } else { - SignalRatePerSpad = (FixPoint1616_t)((256 * SignalRate) - / EffectiveSpadRtnCount); - } - - Status = VL53L0X_GetLimitCheckValue(Dev, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - &RangeIgnoreThresholdValue); - - if ((RangeIgnoreThresholdValue > 0) && - (SignalRatePerSpad < RangeIgnoreThresholdValue)) { - /* Limit Fail add 2^6 to range status */ - RangeIgnoreThresholdflag = 1; - } - } - - if (Status == VL53L0X_ERROR_NONE) { - if (NoneFlag == 1) { - *pPalRangeStatus = 255; /* NONE */ - } else if (DeviceRangeStatusInternal == 1 || - DeviceRangeStatusInternal == 2 || - DeviceRangeStatusInternal == 3) { - *pPalRangeStatus = 5; /* HW fail */ - } else if (DeviceRangeStatusInternal == 6 || - DeviceRangeStatusInternal == 9) { - *pPalRangeStatus = 4; /* Phase fail */ - } else if (DeviceRangeStatusInternal == 8 || - DeviceRangeStatusInternal == 10 || - SignalRefClipflag == 1) { - *pPalRangeStatus = 3; /* Min range */ - } else if (DeviceRangeStatusInternal == 4 || - RangeIgnoreThresholdflag == 1) { - *pPalRangeStatus = 2; /* Signal Fail */ - } else if (SigmaLimitflag == 1) { - *pPalRangeStatus = 1; /* Sigma Fail */ - } else { - *pPalRangeStatus = 0; /* Range Valid */ - } - } - - /* fill the Limit Check Status */ - - Status = VL53L0X_GetLimitCheckEnable(Dev, - VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, - &SignalRateFinalRangeLimitCheckEnable); - - if (Status == VL53L0X_ERROR_NONE) { - if ((SigmaLimitCheckEnable == 0) || (SigmaLimitflag == 1)) - Temp8 = 1; - else - Temp8 = 0; - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, - VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, Temp8); - - if ((DeviceRangeStatusInternal == 4) || - (SignalRateFinalRangeLimitCheckEnable == 0)) - Temp8 = 1; - else - Temp8 = 0; - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, - VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, - Temp8); - - if ((SignalRefClipLimitCheckEnable == 0) || - (SignalRefClipflag == 1)) - Temp8 = 1; - else - Temp8 = 0; - - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, - VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, Temp8); - - if ((RangeIgnoreThresholdLimitCheckEnable == 0) || - (RangeIgnoreThresholdflag == 1)) - Temp8 = 1; - else - Temp8 = 0; - - VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksStatus, - VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, - Temp8); - } - - LOG_FUNCTION_END(Status); - return Status; - -} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" deleted file mode 100644 index 06401b56..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_ranging.c" +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND - NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. - IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -#include "vl53l0x_api.h" -#include "vl53l0x_api_core.h" - - -#ifndef __KERNEL__ -#include -#endif -#define LOG_FUNCTION_START(fmt, ...) \ - _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) -#define LOG_FUNCTION_END(status, ...) \ - _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) -#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ - _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" deleted file mode 100644 index c5781cb7..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/core/src/vl53l0x_api_strings.c" +++ /dev/null @@ -1,466 +0,0 @@ -/******************************************************************************* - * Copyright 2016, STMicroelectronics International N.V. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND - NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. - IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -#include "vl53l0x_api.h" -#include "vl53l0x_api_core.h" -#include "vl53l0x_api_strings.h" - -#ifndef __KERNEL__ -#include -#endif - -#define LOG_FUNCTION_START(fmt, ...) \ - _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__) -#define LOG_FUNCTION_END(status, ...) \ - _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__) -#define LOG_FUNCTION_END_FMT(status, fmt, ...) \ - _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__) - - -VL53L0X_Error VL53L0X_check_part_used(VL53L0X_DEV Dev, - uint8_t *Revision, - VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t ModuleIdInt; - char *ProductId_tmp; - - LOG_FUNCTION_START(""); - - Status = VL53L0X_get_info_from_device(Dev, 2); - - if (Status == VL53L0X_ERROR_NONE) { - ModuleIdInt = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ModuleId); - - if (ModuleIdInt == 0) { - *Revision = 0; - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, ""); - } else { - *Revision = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, Revision); - ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, - ProductId); - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, - ProductId_tmp); - } - } - - LOG_FUNCTION_END(Status); - return Status; -} - - -VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev, - VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - uint8_t revision_id; - uint8_t Revision; - - Status = VL53L0X_check_part_used(Dev, &Revision, pVL53L0X_DeviceInfo); - - if (Status == VL53L0X_ERROR_NONE) { - if (Revision == 0) { - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, - VL53L0X_STRING_DEVICE_INFO_NAME_TS0); - } else if ((Revision <= 34) && (Revision != 32)) { - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, - VL53L0X_STRING_DEVICE_INFO_NAME_TS1); - } else if (Revision < 39) { - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, - VL53L0X_STRING_DEVICE_INFO_NAME_TS2); - } else { - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name, - VL53L0X_STRING_DEVICE_INFO_NAME_ES1); - } - - VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Type, - VL53L0X_STRING_DEVICE_INFO_TYPE); - - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_IDENTIFICATION_MODEL_ID, - &pVL53L0X_DeviceInfo->ProductType); - } - - if (Status == VL53L0X_ERROR_NONE) { - Status = VL53L0X_RdByte(Dev, - VL53L0X_REG_IDENTIFICATION_REVISION_ID, - &revision_id); - pVL53L0X_DeviceInfo->ProductRevisionMajor = 1; - pVL53L0X_DeviceInfo->ProductRevisionMinor = - (revision_id & 0xF0) >> 4; - } - - return Status; -} - - -VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode, - char *pDeviceErrorString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - switch (ErrorCode) { - case VL53L0X_DEVICEERROR_NONE: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_NONE); - break; - case VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE); - break; - case VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE); - break; - case VL53L0X_DEVICEERROR_NOVHVVALUEFOUND: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND); - break; - case VL53L0X_DEVICEERROR_MSRCNOTARGET: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET); - break; - case VL53L0X_DEVICEERROR_SNRCHECK: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_SNRCHECK); - break; - case VL53L0X_DEVICEERROR_RANGEPHASECHECK: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK); - break; - case VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK); - break; - case VL53L0X_DEVICEERROR_TCC: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_TCC); - break; - case VL53L0X_DEVICEERROR_PHASECONSISTENCY: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY); - break; - case VL53L0X_DEVICEERROR_MINCLIP: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_MINCLIP); - break; - case VL53L0X_DEVICEERROR_RANGECOMPLETE: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE); - break; - case VL53L0X_DEVICEERROR_ALGOUNDERFLOW: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW); - break; - case VL53L0X_DEVICEERROR_ALGOOVERFLOW: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW); - break; - case VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD); - break; - - default: - VL53L0X_COPYSTRING(pDeviceErrorString, - VL53L0X_STRING_UNKNOW_ERROR_CODE); - - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus, - char *pRangeStatusString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - switch (RangeStatus) { - case 0: - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_RANGEVALID); - break; - case 1: - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_SIGMA); - break; - case 2: - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_SIGNAL); - break; - case 3: - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_MINRANGE); - break; - case 4: - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_PHASE); - break; - case 5: - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_HW); - break; - - default: /**/ - VL53L0X_COPYSTRING(pRangeStatusString, - VL53L0X_STRING_RANGESTATUS_NONE); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode, - char *pPalErrorString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - switch (PalErrorCode) { - case VL53L0X_ERROR_NONE: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_NONE); - break; - case VL53L0X_ERROR_CALIBRATION_WARNING: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_CALIBRATION_WARNING); - break; - case VL53L0X_ERROR_MIN_CLIPPED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_MIN_CLIPPED); - break; - case VL53L0X_ERROR_UNDEFINED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_UNDEFINED); - break; - case VL53L0X_ERROR_INVALID_PARAMS: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_INVALID_PARAMS); - break; - case VL53L0X_ERROR_NOT_SUPPORTED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_NOT_SUPPORTED); - break; - case VL53L0X_ERROR_INTERRUPT_NOT_CLEARED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED); - break; - case VL53L0X_ERROR_RANGE_ERROR: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_RANGE_ERROR); - break; - case VL53L0X_ERROR_TIME_OUT: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_TIME_OUT); - break; - case VL53L0X_ERROR_MODE_NOT_SUPPORTED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED); - break; - case VL53L0X_ERROR_BUFFER_TOO_SMALL: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL); - break; - case VL53L0X_ERROR_GPIO_NOT_EXISTING: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING); - break; - case VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED); - break; - case VL53L0X_ERROR_CONTROL_INTERFACE: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_CONTROL_INTERFACE); - break; - case VL53L0X_ERROR_INVALID_COMMAND: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_INVALID_COMMAND); - break; - case VL53L0X_ERROR_DIVISION_BY_ZERO: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_DIVISION_BY_ZERO); - break; - case VL53L0X_ERROR_REF_SPAD_INIT: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_REF_SPAD_INIT); - break; - case VL53L0X_ERROR_NOT_IMPLEMENTED: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_ERROR_NOT_IMPLEMENTED); - break; - - default: - VL53L0X_COPYSTRING(pPalErrorString, - VL53L0X_STRING_UNKNOW_ERROR_CODE); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode, - char *pPalStateString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - switch (PalStateCode) { - case VL53L0X_STATE_POWERDOWN: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_POWERDOWN); - break; - case VL53L0X_STATE_WAIT_STATICINIT: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_WAIT_STATICINIT); - break; - case VL53L0X_STATE_STANDBY: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_STANDBY); - break; - case VL53L0X_STATE_IDLE: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_IDLE); - break; - case VL53L0X_STATE_RUNNING: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_RUNNING); - break; - case VL53L0X_STATE_UNKNOWN: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_UNKNOWN); - break; - case VL53L0X_STATE_ERROR: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_ERROR); - break; - - default: - VL53L0X_COPYSTRING(pPalStateString, - VL53L0X_STRING_STATE_UNKNOWN); - } - - LOG_FUNCTION_END(Status); - return Status; -} - -VL53L0X_Error VL53L0X_get_sequence_steps_info( - VL53L0X_SequenceStepId SequenceStepId, - char *pSequenceStepsString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - switch (SequenceStepId) { - case VL53L0X_SEQUENCESTEP_TCC: - VL53L0X_COPYSTRING(pSequenceStepsString, - VL53L0X_STRING_SEQUENCESTEP_TCC); - break; - case VL53L0X_SEQUENCESTEP_DSS: - VL53L0X_COPYSTRING(pSequenceStepsString, - VL53L0X_STRING_SEQUENCESTEP_DSS); - break; - case VL53L0X_SEQUENCESTEP_MSRC: - VL53L0X_COPYSTRING(pSequenceStepsString, - VL53L0X_STRING_SEQUENCESTEP_MSRC); - break; - case VL53L0X_SEQUENCESTEP_PRE_RANGE: - VL53L0X_COPYSTRING(pSequenceStepsString, - VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE); - break; - case VL53L0X_SEQUENCESTEP_FINAL_RANGE: - VL53L0X_COPYSTRING(pSequenceStepsString, - VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE); - break; - - default: - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - LOG_FUNCTION_END(Status); - - return Status; -} - - -VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev, - uint16_t LimitCheckId, - char *pLimitCheckString) -{ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - LOG_FUNCTION_START(""); - - switch (LimitCheckId) { - case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE); - break; - case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE); - break; - case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP); - break; - case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD); - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC); - break; - - case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE); - break; - - default: - VL53L0X_COPYSTRING(pLimitCheckString, - VL53L0X_STRING_UNKNOW_ERROR_CODE); - - } - - LOG_FUNCTION_END(Status); - return Status; -} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" deleted file mode 100644 index 9e2a78a0..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x.h" +++ /dev/null @@ -1,16 +0,0 @@ - -#ifndef __VL53L0X_H -#define __VL53L0X_H - - -// 初始化,包含硬件复位,芯片初次IIC通讯和设备验证,6步初始化校验,配置模式和时间。 -void vl53l0x_init(void); -// 开始测量 -void vl53l0x_start(void); -// 停止测量 -void vl53l0x_stop(void); -// 获取测量距离 -unsigned short get_distance(void); - -#endif - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" deleted file mode 100644 index 217fbe16..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/inc/vl53l0x_iic.h" +++ /dev/null @@ -1,66 +0,0 @@ - - -#ifndef __VL53L0X_IIC_H -#define __VL53L0X_IIC_H - -// hi3061M专用 -#include "main.h" //io相关头文件 -#include "clock.h" //延时函数相关头文件 -#include "debug.h" //串口调试输出 -// hi3061M专用 - -#include "vl53l0x_platform.h" - -#define uint8_t unsigned char - -// 这里需要改为自己MCU相关的延时函数 -#define vl53l0x_iic_delay(t) BASE_FUNC_DELAY_US(t) -// 这里需要改为自己MCU相关的延时函数 -#define print_log DBG_PRINTF - -// 上电复位默认IIC地址 -#define VL53L0X_IIC_ADDR 0x29 -// ID标识 -#define VL53L0X_MODULE_ID 0xEEAA - -// 下面的引脚配置需要改为与自己MCU相关的 -/*硬件复位/使能引脚*/ - #define VL53L0X_XSH(x) do{ x ? \ - HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_HIGH_LEVEL) : \ - HAL_GPIO_SetValue(&g_gpio2, GPIO_PIN_2, GPIO_LOW_LEVEL); \ - }while(0) - - -/*IIC引脚*/ -#define VL53L0X_IIC_SCL(x) do{ x ? \ - HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ - HAL_GPIO_SetValue(&g_gpio3, GPIO_PIN_4, GPIO_LOW_LEVEL); \ - }while(0) - -#define VL53L0X_IIC_SDA(x) do{ x ? \ - HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_HIGH_LEVEL) : \ - HAL_GPIO_SetValue(&g_gpio4, GPIO_PIN_4, GPIO_LOW_LEVEL); \ - }while(0) - -// IIC SDA引脚方向[输入(1)输出(0)] -#define VL53L0X_SDA_Direction(x) do{ x ? \ - HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_INPUT_MODE) : \ - HAL_GPIO_SetDirection(&g_gpio4, GPIO_PIN_4, GPIO_OUTPUT_MODE); \ - }while(0) -//IIC 输入模式下获取SDA的引脚值,用于读取数据或者获取ACK -#define VL53L0X_IIC_READ_SDA() HAL_GPIO_GetPinValue(&g_gpio4, GPIO_PIN_4) -// 上面的引脚配置需要改为与自己MCU相关的 - -/*vl53l0x IIC相关函数实现*/ -void vl53l0x_iic_start(void); -void vl53l0x_iic_stop(void); -uint8_t vl53l0x_iic_wait_ack(void); -void vl53l0x_iic_ack(void); -void vl53l0x_iic_nack(void); -void vl53l0x_iic_send_byte(uint8_t dat); -uint8_t vl53l0x_iic_read_byte(uint8_t ack); - - -void vl53l0x_hw_reset(void); -// -#endif diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" deleted file mode 100644 index 01ad2989..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x.c" +++ /dev/null @@ -1,159 +0,0 @@ - -#include "vl53l0x.h" -#include "vl53l0x_iic.h" -#include "vl53l0x_api.h" - - -#define CUSTOM_DEV_IIC_ADDDR (VL53L0X_IIC_ADDR) /*自定义IICַ地址*/ -#define DEMO_DEVICE_MODE VL53L0X_DEVICEMODE_CONTINUOUS_RANGING /* 连续测量模式 */ -#define DEMO_BUDGET_TIME (66*1000) /* 测量时间 */ - -/* VL53L0X设备结构体 */ -static VL53L0X_Dev_t demo_dev = { - .I2cDevAddr = VL53L0X_IIC_ADDR, /* 上电默认IIC通讯地址ַ*/ -}; - - -static void device_detect(VL53L0X_DEV dev, uint8_t iic_addr) -{ - uint16_t module_id = 0; - VL53L0X_Error status; - /** - * 获取设备ID,身份鉴别 - * 另外可以相当于一次通讯验证,IIC是否可以正常通讯 - * */ - status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &module_id); - // DBG_PRINTF("ATK-MS53L0 ID: %d,status: %d\r\n",module_id,status); - if (module_id != VL53L0X_MODULE_ID) - { - print_log("ATK-MS53L0 Detect Failed!\r\n"); - while (1) - { - // 如果通讯失败,就会卡在这个死循环中。 - } - } - /** - * 改变IIC设备地址 - * 如果你想改变IIC设备地址,有多个设备使用时,可用此API - * 上电默认的地址是0x29,可以自己设置IIC地址 - */ - if (iic_addr != dev->I2cDevAddr) - { - VL53L0X_SetDeviceAddress(dev, iic_addr << 1); - dev->I2cDevAddr = iic_addr; - print_log("Change IIC address success! IIC Address: 0x%x\r\n",iic_addr); - }else{ - print_log("Default IIC Address: 0x%x\r\n",iic_addr); - } -} - -/** - * 设备配置:效准和初始化 - * 根据手册在测量前有一系列初始化和效准过程,保证测量精度 - - */ -static void device_init(VL53L0X_DEV dev) -{ - uint8_t vhvsettings; - uint8_t phasecal; - uint32_t refspadcount; - uint8_t isaperturespads; - // 设备初始化 - VL53L0X_DataInit(dev); - // 加载特殊配置 - VL53L0X_StaticInit(dev); - // Spad(单光子雪崩二极管)效准,用来对返射会的IR光进行测量的 - VL53L0X_PerformRefSpadManagement(dev, &refspadcount, &isaperturespads); - /*温度效准*/ - // VL53L0X_PerformRefCalibration(dev, &vhvsettings, &phasecal); - /*偏移效准*/ - // VL53L0X_PerformOffsetCalibration(); - /*串扰效准*/ - // VL53L0X_PerformXTalkCalibration(); - - /**设置工作模式 - * 有三种工作模式 - * 单次测量 0 - * 连续测量 1 - * 连续延时测量 3 - */ - VL53L0X_SetDeviceMode(dev, DEMO_DEVICE_MODE); - - /**设置测量时间 - * 默认时间是33ms,最小的时间是20ms - * 这个会涉及到准确率,太快,准确率会有所下降 - * 增加测量时间会提高准确率 - * 测量时间增加到2倍,测量的标准差减少到根号2 - */ - VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev, DEMO_BUDGET_TIME); -} - -/** - */ -void vl53l0x_init(void) -{ - uint8_t ret; - VL53L0X_RangingMeasurementData_t data; - - vl53l0x_hw_reset(); //使能,设置 XSHUT引脚为高电平(低电平表示关闭) - device_detect(&demo_dev, CUSTOM_DEV_IIC_ADDDR); /*首次通讯验证和设备验证*/ - device_init(&demo_dev); /*设备初始化-会设置测试时间(精确相关)和设备工作模式*/ - - print_log("VL53L0X init Succedded!\r\n"); - - // /*开始测量*/ - // VL53L0X_StartMeasurement(&demo_dev); - - // while (1) - // { - // /*检查是否完成一次测量*/ - // do { - // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); - // } while (ret != 1); - // /**清除中断 - // * 如果使用中断的方式,通过连接中断引脚进行判断,进入中断后需要清除中断 - // * 这里使用的是轮询的方式,所以可以不需要 - // */ - // // VL53L0X_ClearInterruptMask(&demo_dev, 0); - - // /*获取测量结果*/ - // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); - // /*输出测量结果(单位mm)*/ - // DBG_PRINTF("Distance: %dmm\r\n", data.RangeMilliMeter); - // } -} -// 开始测量 -void vl53l0x_start(void){ - /*开始测量*/ - VL53L0X_StartMeasurement(&demo_dev); - print_log("VL53L0X start ranging!\r\n"); -} -// 停止测量---连续测量模式下 -void vl53l0x_stop(void){ - /*开始测量*/ - VL53L0X_StopMeasurement(&demo_dev); - print_log("VL53L0X stop ranging!\r\n"); -} -// 获取测量结果 单位mm -unsigned short get_distance(void){ - - uint8_t ret = 0; - VL53L0X_RangingMeasurementData_t data; - /*检查是否完成一次测量*/ - VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); - if(ret==1){ - /*获取测量结果*/ - VL53L0X_GetRangingMeasurementData(&demo_dev, &data); - return data.RangeMilliMeter; - } - - return 0; - // do { - // VL53L0X_GetMeasurementDataReady(&demo_dev, &ret); - // } while (ret != 1); - // /*获取测量结果*/ - // VL53L0X_GetRangingMeasurementData(&demo_dev, &data); - // return data.RangeMilliMeter; -} - - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" deleted file mode 100644 index 1eb486f9..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/mine/src/vl53l0x_iic.c" +++ /dev/null @@ -1,139 +0,0 @@ - - - -#include "vl53l0x_iic.h" - -// static inline void vl53l0x_iic_delay(unsigned int t_us) -// { -// // IIC的延时函数,根据自己的mcu进行替换 -// BASE_FUNC_DELAY_US(t_us); -// } - -void vl53l0x_iic_start(void) -{ - VL53L0X_IIC_SDA(1); - VL53L0X_IIC_SCL(1); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SDA(0); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(0); -} - -void vl53l0x_iic_stop(void) -{ - VL53L0X_IIC_SCL(0); - VL53L0X_IIC_SDA(0); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(1); - vl53l0x_iic_delay(1); - VL53L0X_IIC_SDA(1); - vl53l0x_iic_delay(4); -} - -uint8_t vl53l0x_iic_wait_ack(void) -{ - uint8_t waittime = 0; - uint8_t rack = 0; - VL53L0X_SDA_Direction(1); - VL53L0X_IIC_SDA(1); - vl53l0x_iic_delay(1); - VL53L0X_IIC_SCL(1); - vl53l0x_iic_delay(1); - - while (VL53L0X_IIC_READ_SDA()) - { - waittime++; - - if (waittime > 250) - { - VL53L0X_SDA_Direction(0); - vl53l0x_iic_stop(); - return 1; - } - } - VL53L0X_SDA_Direction(0); - VL53L0X_IIC_SCL(0); - - return rack; -} - -void vl53l0x_iic_ack(void) -{ - VL53L0X_IIC_SCL(0); - VL53L0X_IIC_SDA(0); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(1); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(0); -} - -void vl53l0x_iic_nack(void) -{ - VL53L0X_IIC_SCL(0); - VL53L0X_IIC_SDA(1); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(1); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(0); -} - -void vl53l0x_iic_send_byte(uint8_t dat) -{ - uint8_t t; - VL53L0X_IIC_SCL(0); - for (t=0; t<8; t++) - { - VL53L0X_IIC_SDA((dat & 0x80) >> 7); - dat <<= 1; - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(1); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(0); - vl53l0x_iic_delay(2); - - } - -} - -uint8_t vl53l0x_iic_read_byte(uint8_t ack) -{ - uint8_t i; - uint8_t dat = 0; - VL53L0X_SDA_Direction(1); - for (i = 0; i < 8; i++ ) - { - VL53L0X_IIC_SCL(0); - vl53l0x_iic_delay(2); - VL53L0X_IIC_SCL(1); - dat <<= 1; - - if (VL53L0X_IIC_READ_SDA()) - { - dat++; - } - vl53l0x_iic_delay(2); - } - VL53L0X_SDA_Direction(0); - if (ack == 0) - { - vl53l0x_iic_nack(); - } - else - { - vl53l0x_iic_ack(); - } - - return dat; -} - -/** - * VL53L0X 硬件复位,通过引脚设置关机再开机实现复位 - */ -void vl53l0x_hw_reset(void) -{ - // 复位引脚,考虑要不要接吧 改变引脚电平实现复位,0 到1 复位 - VL53L0X_XSH(0); - vl53l0x_iic_delay(30*1000) ;//延时30ms - VL53L0X_XSH(1); - vl53l0x_iic_delay(30*1000) ; -} diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" deleted file mode 100644 index 6c953c78..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_i2c_platform.h" +++ /dev/null @@ -1,409 +0,0 @@ -/* - * COPYRIGHT (C) STMicroelectronics 2014. All rights reserved. - * - * This software is the confidential and proprietary information of - * STMicroelectronics ("Confidential Information"). You shall not - * disclose such Confidential Information and shall use it only in - * accordance with the terms of the license agreement you entered into - * with STMicroelectronics - * - * Programming Golden Rule: Keep it Simple! - * - */ - -/** - * @file VL53L0X_platform.h - * @brief Function prototype definitions for Ewok Platform layer. - * - */ - - -#ifndef _VL53L0X_I2C_PLATFORM_H_ -#define _VL53L0X_I2C_PLATFORM_H_ - - -// 移植封装 -#include "vl53l0x_iic.h" -// 移植封装 - -#include "vl53l0x_def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Include uint8_t, unit16_t etc definitions - -#include -#include - - -/** - * @brief Typedef defining .\n - * The developer shoud modify this to suit the platform being deployed. - * - */ - -// enum {TRUE = true, FALSE = false}; - -/** - * @brief Typedef defining 8 bit unsigned char type.\n - * The developer shoud modify this to suit the platform being deployed. - * - */ - -#ifndef bool_t -typedef unsigned char bool_t; -#endif - - -#define I2C 0x01 -#define SPI 0x00 - -#define COMMS_BUFFER_SIZE 64 // MUST be the same size as the SV task buffer - -#define BYTES_PER_WORD 2 -#define BYTES_PER_DWORD 4 - -#define VL53L0X_MAX_STRING_LENGTH_PLT 256 - -/** - * @brief Initialise platform comms. - * - * @param comms_type - selects between I2C and SPI - * @param comms_speed_khz - unsigned short containing the I2C speed in kHz - * - * @return status - status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_comms_initialise(uint8_t comms_type, - uint16_t comms_speed_khz); - -/** - * @brief Close platform comms. - * - * @return status - status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_comms_close(void); - -/** - * @brief Cycle Power to Device - * - * @return status - status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_cycle_power(void); - - -/** - * @brief Writes the supplied byte buffer to the device - * - * Wrapper for SystemVerilog Write Multi task - * - * @code - * - * Example: - * - * uint8_t *spad_enables; - * - * int status = VL53L0X_write_multi(RET_SPAD_EN_0, spad_enables, 36); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param pdata - pointer to uint8_t buffer containing the data to be written - * @param count - number of bytes in the supplied byte buffer - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count); - - -/** - * @brief Reads the requested number of bytes from the device - * - * Wrapper for SystemVerilog Read Multi task - * - * @code - * - * Example: - * - * uint8_t buffer[COMMS_BUFFER_SIZE]; - * - * int status = status = VL53L0X_read_multi(DEVICE_ID, buffer, 2) - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param pdata - pointer to the uint8_t buffer to store read data - * @param count - number of uint8_t's to read - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_read_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count); - - -/** - * @brief Writes a single byte to the device - * - * Wrapper for SystemVerilog Write Byte task - * - * @code - * - * Example: - * - * uint8_t page_number = MAIN_SELECT_PAGE; - * - * int status = VL53L0X_write_byte(PAGE_SELECT, page_number); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param data - uint8_t data value to write - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data); - - -/** - * @brief Writes a single word (16-bit unsigned) to the device - * - * Manages the big-endian nature of the device (first byte written is the MS byte). - * Uses SystemVerilog Write Multi task. - * - * @code - * - * Example: - * - * uint16_t nvm_ctrl_pulse_width = 0x0004; - * - * int status = VL53L0X_write_word(NVM_CTRL__PULSE_WIDTH_MSB, nvm_ctrl_pulse_width); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param data - uin16_t data value write - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data); - - -/** - * @brief Writes a single dword (32-bit unsigned) to the device - * - * Manages the big-endian nature of the device (first byte written is the MS byte). - * Uses SystemVerilog Write Multi task. - * - * @code - * - * Example: - * - * uint32_t nvm_data = 0x0004; - * - * int status = VL53L0X_write_dword(NVM_CTRL__DATAIN_MMM, nvm_data); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param data - uint32_t data value to write - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_write_dword(uint8_t address, uint8_t index, uint32_t data); - - - -/** - * @brief Reads a single byte from the device - * - * Uses SystemVerilog Read Byte task. - * - * @code - * - * Example: - * - * uint8_t device_status = 0; - * - * int status = VL53L0X_read_byte(STATUS, &device_status); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param pdata - pointer to uint8_t data value - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata); - - -/** - * @brief Reads a single word (16-bit unsigned) from the device - * - * Manages the big-endian nature of the device (first byte read is the MS byte). - * Uses SystemVerilog Read Multi task. - * - * @code - * - * Example: - * - * uint16_t timeout = 0; - * - * int status = VL53L0X_read_word(TIMEOUT_OVERALL_PERIODS_MSB, &timeout); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param pdata - pointer to uint16_t data value - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata); - - -/** - * @brief Reads a single dword (32-bit unsigned) from the device - * - * Manages the big-endian nature of the device (first byte read is the MS byte). - * Uses SystemVerilog Read Multi task. - * - * @code - * - * Example: - * - * uint32_t range_1 = 0; - * - * int status = VL53L0X_read_dword(RANGE_1_MMM, &range_1); - * - * @endcode - * - * @param address - uint8_t device address value - * @param index - uint8_t register index value - * @param pdata - pointer to uint32_t data value - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata); - - -/** - * @brief Implements a programmable wait in us - * - * Wrapper for SystemVerilog Wait in micro seconds task - * - * @param wait_us - integer wait in micro seconds - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_platform_wait_us(int32_t wait_us); - - -/** - * @brief Implements a programmable wait in ms - * - * Wrapper for SystemVerilog Wait in milli seconds task - * - * @param wait_ms - integer wait in milli seconds - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_wait_ms(int32_t wait_ms); - - -/** - * @brief Set GPIO value - * - * @param level - input level - either 0 or 1 - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_set_gpio(uint8_t level); - - -/** - * @brief Get GPIO value - * - * @param plevel - uint8_t pointer to store GPIO level (0 or 1) - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_get_gpio(uint8_t *plevel); - -/** - * @brief Release force on GPIO - * - * @return status - SystemVerilog status 0 = ok, 1 = error - * - */ - -int32_t VL53L0X_release_gpio(void); - - -/** -* @brief Get the frequency of the timer used for ranging results time stamps -* -* @param[out] ptimer_freq_hz : pointer for timer frequency -* -* @return status : 0 = ok, 1 = error -* -*/ - -int32_t VL53L0X_get_timer_frequency(int32_t *ptimer_freq_hz); - -/** -* @brief Get the timer value in units of timer_freq_hz (see VL53L0X_get_timestamp_frequency()) -* -* @param[out] ptimer_count : pointer for timer count value -* -* @return status : 0 = ok, 1 = error -* -*/ - -int32_t VL53L0X_get_timer_value(int32_t *ptimer_count); - - - - - -#ifdef __cplusplus -} -#endif - -#endif //_VL53L0X_I2C_PLATFORM_H_ - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" deleted file mode 100644 index a6811fb6..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform.h" +++ /dev/null @@ -1,245 +0,0 @@ -/******************************************************************************* -Copyright � 2015, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -********************************************************************************/ - - -#ifndef _VL53L0X_PLATFORM_H_ -#define _VL53L0X_PLATFORM_H_ - - - - - -#include "vl53l0x_def.h" -#include "vl53l0x_platform_log.h" -#include "vl53l0x_i2c_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file vl53l0x_platform.h - * - * @brief All end user OS/platform/application porting - */ - -/** - * @defgroup VL53L0X_platform_group VL53L0X Platform Functions - * @brief VL53L0X Platform Functions - * @{ - */ - -/** - * @struct VL53L0X_Dev_t - * @brief Generic PAL device type that does link between API and platform abstraction layer - * - */ -typedef struct { - VL53L0X_DevData_t Data; /*!< embed ST Ewok Dev data as "Data"*/ - - /*!< user specific field */ - uint8_t I2cDevAddr; /*!< i2c device address user specific field */ - uint8_t comms_type; /*!< Type of comms : VL53L0X_COMMS_I2C or VL53L0X_COMMS_SPI */ - uint16_t comms_speed_khz; /*!< Comms speed [kHz] : typically 400kHz for I2C */ - -} VL53L0X_Dev_t; - - -/** - * @brief Declare the device Handle as a pointer of the structure @a VL53L0X_Dev_t. - * - */ -typedef VL53L0X_Dev_t* VL53L0X_DEV; - -/** - * @def PALDevDataGet - * @brief Get ST private structure @a VL53L0X_DevData_t data access - * - * @param Dev Device Handle - * @param field ST structure field name - * It maybe used and as real data "ref" not just as "get" for sub-structure item - * like PALDevDataGet(FilterData.field)[i] or PALDevDataGet(FilterData.MeasurementIndex)++ - */ -#define PALDevDataGet(Dev, field) (Dev->Data.field) - -/** - * @def PALDevDataSet(Dev, field, data) - * @brief Set ST private structure @a VL53L0X_DevData_t data field - * @param Dev Device Handle - * @param field ST structure field name - * @param data Data to be set - */ -#define PALDevDataSet(Dev, field, data) (Dev->Data.field)=(data) - - -/** - * @defgroup VL53L0X_registerAccess_group PAL Register Access Functions - * @brief PAL Register Access Functions - * @{ - */ - -/** - * Lock comms interface to serialize all commands to a shared I2C interface for a specific device - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev); - -/** - * Unlock comms interface to serialize all commands to a shared I2C interface for a specific device - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev); - - -/** - * Writes the supplied byte buffer to the device - * @param Dev Device Handle - * @param index The register index - * @param pdata Pointer to uint8_t buffer containing the data to be written - * @param count Number of bytes in the supplied byte buffer - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count); - -/** - * Reads the requested number of bytes from the device - * @param Dev Device Handle - * @param index The register index - * @param pdata Pointer to the uint8_t buffer to store read data - * @param count Number of uint8_t's to read - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count); - -/** - * Write single byte register - * @param Dev Device Handle - * @param index The register index - * @param data 8 bit register data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data); - -/** - * Write word register - * @param Dev Device Handle - * @param index The register index - * @param data 16 bit register data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data); - -/** - * Write double word (4 byte) register - * @param Dev Device Handle - * @param index The register index - * @param data 32 bit register data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data); - -/** - * Read single byte register - * @param Dev Device Handle - * @param index The register index - * @param data pointer to 8 bit data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data); - -/** - * Read word (2byte) register - * @param Dev Device Handle - * @param index The register index - * @param data pointer to 16 bit data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data); - -/** - * Read dword (4byte) register - * @param Dev Device Handle - * @param index The register index - * @param data pointer to 32 bit data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data); - -/** - * Threat safe Update (read/modify/write) single byte register - * - * Final_reg = (Initial_reg & and_data) |or_data - * - * @param Dev Device Handle - * @param index The register index - * @param AndData 8 bit and data - * @param OrData 8 bit or data - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData); - -/** @} end of VL53L0X_registerAccess_group */ - - -/** - * @brief execute delay in all polling API call - * - * A typical multi-thread or RTOs implementation is to sleep the task for some 5ms (with 100Hz max rate faster polling is not needed) - * if nothing specific is need you can define it as an empty/void macro - * @code - * #define VL53L0X_PollingDelay(...) (void)0 - * @endcode - * @param Dev Device Handle - * @return VL53L0X_ERROR_NONE Success - * @return "Other error code" See ::VL53L0X_Error - */ -VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev); /* usually best implemented as a real function */ - -/** @} end of VL53L0X_platform_group */ - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_PLATFORM_H_ */ - - - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" deleted file mode 100644 index 33895778..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_platform_log.h" +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************* -Copyright 2015, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -********************************************************************************/ - - -#ifndef _VL53L0X_PLATFORM_LOG_H_ -#define _VL53L0X_PLATFORM_LOG_H_ - -#include -#include -/* LOG Functions */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @file vl53l0x_platform_log.h - * - * @brief platform log function definition - */ - -//#define VL53L0X_LOG_ENABLE 0 - -enum { - TRACE_LEVEL_NONE, - TRACE_LEVEL_ERRORS, - TRACE_LEVEL_WARNING, - TRACE_LEVEL_INFO, - TRACE_LEVEL_DEBUG, - TRACE_LEVEL_ALL, - TRACE_LEVEL_IGNORE -}; - -enum { - TRACE_FUNCTION_NONE = 0, - TRACE_FUNCTION_I2C = 1, - TRACE_FUNCTION_ALL = 0x7fffffff //all bits except sign -}; - -enum { - TRACE_MODULE_NONE = 0x0, - TRACE_MODULE_API = 0x1, - TRACE_MODULE_PLATFORM = 0x2, - TRACE_MODULE_ALL = 0x7fffffff //all bits except sign -}; - - -#ifdef VL53L0X_LOG_ENABLE - -#include - -extern uint32_t _trace_level; - - - -int32_t VL53L0X_trace_config(char *filename, uint32_t modules, uint32_t level, uint32_t functions); - -void trace_print_module_function(uint32_t module, uint32_t level, uint32_t function, const char *format, ...); - - -//extern FILE * log_file; - -#define LOG_GET_TIME() (int)clock() - -#define _LOG_FUNCTION_START(module, fmt, ... ) \ - trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s "fmt"\n", LOG_GET_TIME(), __FUNCTION__, ##__VA_ARGS__); - -#define _LOG_FUNCTION_END(module, status, ... )\ - trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s %d\n", LOG_GET_TIME(), __FUNCTION__, (int)status, ##__VA_ARGS__) - -#define _LOG_FUNCTION_END_FMT(module, status, fmt, ... )\ - trace_print_module_function(module, _trace_level, TRACE_FUNCTION_ALL, "%ld %s %d "fmt"\n", LOG_GET_TIME(), __FUNCTION__, (int)status,##__VA_ARGS__) - -// __func__ is gcc only -//#define VL53L0X_ErrLog( fmt, ...) fprintf(stderr, "VL53L0X_ErrLog %s" fmt "\n", __func__, ##__VA_ARGS__) - -#else /* VL53L0X_LOG_ENABLE no logging */ - #define VL53L0X_ErrLog(...) (void)0 - #define _LOG_FUNCTION_START(module, fmt, ... ) (void)0 - #define _LOG_FUNCTION_END(module, status, ... ) (void)0 - #define _LOG_FUNCTION_END_FMT(module, status, fmt, ... ) (void)0 -#endif /* else */ - -#define VL53L0X_COPYSTRING(str, ...) strcpy(str, ##__VA_ARGS__) - -#ifdef __cplusplus -} -#endif - -#endif /* _VL53L0X_PLATFORM_LOG_H_ */ - - - diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" deleted file mode 100644 index 2f8adc98..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/inc/vl53l0x_types.h" +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************* -Copyright 2015, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(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 vl53l0x_types.h - * @brief VL53L0X types definition - */ - -#ifndef VL53L0X_TYPES_H_ -#define VL53L0X_TYPES_H_ - -/** @defgroup porting_type Basic type definition - * @ingroup VL53L0X_platform_group - * - * @brief file vl53l0x_types.h files hold basic type definition that may requires porting - * - * contains type that must be defined for the platform\n - * when target platform and compiler provide stdint.h and stddef.h it is enough to include it.\n - * If stdint.h is not available review and adapt all signed and unsigned 8/16/32 bits basic types. \n - * If stddef.h is not available review and adapt NULL definition . - */ -#include -#include - -#ifndef NULL -#error "Error NULL definition should be done. Please add required include " -#endif - - -#if ! defined(STDINT_H) && !defined(_GCC_STDINT_H) &&!defined(__STDINT_DECLS) && !defined(_GCC_WRAP_STDINT_H) - - #pragma message("Please review type definition of STDINT define for your platform and add to list above ") - - /* - * target platform do not provide stdint or use a different #define than above - * to avoid seeing the message below addapt the #define list above or implement - * all type and delete these pragma - */ - -/** \ingroup VL53L0X_portingType_group - * @{ - */ - - -typedef unsigned long long uint64_t; - - -/** @brief Typedef defining 32 bit unsigned int type.\n - * The developer should modify this to suit the platform being deployed. - */ -typedef unsigned int uint32_t; - -/** @brief Typedef defining 32 bit int type.\n - * The developer should modify this to suit the platform being deployed. - */ -typedef int int32_t; - -/** @brief Typedef defining 16 bit unsigned short type.\n - * The developer should modify this to suit the platform being deployed. - */ -typedef unsigned short uint16_t; - -/** @brief Typedef defining 16 bit short type.\n - * The developer should modify this to suit the platform being deployed. - */ -typedef short int16_t; - -/** @brief Typedef defining 8 bit unsigned char type.\n - * The developer should modify this to suit the platform being deployed. - */ -typedef unsigned char uint8_t; - -/** @brief Typedef defining 8 bit char type.\n - * The developer should modify this to suit the platform being deployed. - */ -typedef signed char int8_t; - -/** @} */ -#endif /* _STDINT_H */ - - -/** use where fractional values are expected - * - * Given a floating point value f it's .16 bit point is (int)(f*(1<<16))*/ -typedef uint32_t FixPoint1616_t; - -#endif /* VL53L0X_TYPES_H_ */ diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" deleted file mode 100644 index c056e6f5..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_i2c_platform.c" +++ /dev/null @@ -1,307 +0,0 @@ -/* - * COPYRIGHT (C) STMicroelectronics 2015. All rights reserved. - * - * This software is the confidential and proprietary information of - * STMicroelectronics ("Confidential Information"). You shall not - * disclose such Confidential Information and shall use it only in - * accordance with the terms of the license agreement you entered into - * with STMicroelectronics - * - * Programming Golden Rule: Keep it Simple! - * - */ - -/*! - * \file VL53L0X_platform.c - * \brief Code function defintions for Ewok Platform Layer - * - */ - -#include "clock.h" -#include "debug.h" -// #include -#include // sprintf(), vsnprintf(), printf() - -#ifdef _MSC_VER -#define snprintf _snprintf -#endif - -#include "vl53l0x_i2c_platform.h" -#include "vl53l0x_def.h" - -// #include "ranging_sensor_comms.h" -// #include "comms_platform.h" - -#include "vl53l0x_platform_log.h" - -#ifdef VL53L0X_LOG_ENABLE -#define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_PLATFORM, level, TRACE_FUNCTION_NONE, ##__VA_ARGS__) -#define trace_i2c(...) trace_print_module_function(TRACE_MODULE_NONE, TRACE_LEVEL_NONE, TRACE_FUNCTION_I2C, ##__VA_ARGS__) -#endif - - - -char debug_string[VL53L0X_MAX_STRING_LENGTH_PLT]; - - -#define MIN_COMMS_VERSION_MAJOR 1 -#define MIN_COMMS_VERSION_MINOR 8 -#define MIN_COMMS_VERSION_BUILD 1 -#define MIN_COMMS_VERSION_REVISION 0 - -#define STATUS_OK 0x00 -#define STATUS_FAIL 0x01 - -// bool_t _check_min_version(void) -// { - -// } - -// int32_t VL53L0X_comms_initialise(uint8_t comms_type, uint16_t comms_speed_khz) -// { - - -// return STATUS_OK; -// } - -// int32_t VL53L0X_comms_close(void) -// { -// int32_t status = STATUS_OK; - -// return status; -// } - -int32_t VL53L0X_write_multi(uint8_t address, uint8_t index, uint8_t *pdata, int32_t count) -{ - int32_t status = STATUS_OK; - - int32_t i; - - vl53l0x_iic_start(); - vl53l0x_iic_send_byte((address << 1) | 0); - if (vl53l0x_iic_wait_ack() == 1) - { - vl53l0x_iic_stop(); - return STATUS_FAIL; - } - vl53l0x_iic_send_byte(index); - if (vl53l0x_iic_wait_ack() == 1) - { - vl53l0x_iic_stop(); - return STATUS_FAIL; - } - for (i=0; i 1) ? 1 : 0); - count--; - pdata++; - } - vl53l0x_iic_stop(); - - - return status; -} - - -int32_t VL53L0X_write_byte(uint8_t address, uint8_t index, uint8_t data) -{ - int32_t status = STATUS_OK; - const int32_t cbyte_count = 1; - - status = VL53L0X_write_multi(address, index, &data, cbyte_count); - - return status; - -} - - -int32_t VL53L0X_write_word(uint8_t address, uint8_t index, uint16_t data) -{ - int32_t status = STATUS_OK; - - uint8_t buffer[BYTES_PER_WORD]; - - // Split 16-bit word into MS and LS uint8_t - buffer[0] = (uint8_t)(data >> 8); - buffer[1] = (uint8_t)(data & 0x00FF); - - status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_WORD); - - return status; - -} - - -int32_t VL53L0X_write_dword(uint8_t address, uint8_t index, uint32_t data) -{ - int32_t status = STATUS_OK; - uint8_t buffer[BYTES_PER_DWORD]; - - // Split 32-bit word into MS ... LS bytes - buffer[0] = (uint8_t) (data >> 24); - buffer[1] = (uint8_t)((data & 0x00FF0000) >> 16); - buffer[2] = (uint8_t)((data & 0x0000FF00) >> 8); - buffer[3] = (uint8_t) (data & 0x000000FF); - - status = VL53L0X_write_multi(address, index, buffer, BYTES_PER_DWORD); - - return status; - -} - - -int32_t VL53L0X_read_byte(uint8_t address, uint8_t index, uint8_t *pdata) -{ - int32_t status = STATUS_OK; - int32_t cbyte_count = 1; - - status = VL53L0X_read_multi(address, index, pdata, cbyte_count); - - return status; - -} - - -int32_t VL53L0X_read_word(uint8_t address, uint8_t index, uint16_t *pdata) -{ - int32_t status = STATUS_OK; - uint8_t buffer[BYTES_PER_WORD] = {0}; - - status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_WORD); - // DBG_PRINTF("status: %d\r\n",status); - *pdata = ((uint16_t)buffer[0]<<8) + (uint16_t)buffer[1]; - - return status; - -} - -int32_t VL53L0X_read_dword(uint8_t address, uint8_t index, uint32_t *pdata) -{ - int32_t status = STATUS_OK; - uint8_t buffer[BYTES_PER_DWORD]; - - status = VL53L0X_read_multi(address, index, buffer, BYTES_PER_DWORD); - *pdata = ((uint32_t)buffer[0]<<24) + ((uint32_t)buffer[1]<<16) + ((uint32_t)buffer[2]<<8) + (uint32_t)buffer[3]; - - return status; - -} - -int32_t VL53L0X_platform_wait_us(int32_t wait_us) -{ - int32_t status = STATUS_OK; - float wait_ms = (float)wait_us/1000.0f; - - BASE_FUNC_DELAY_US(wait_us); - -#ifdef VL53L0X_LOG_ENABLE - trace_i2c("Wait us : %6d\n", wait_us); -#endif - - return status; - -} - - -int32_t VL53L0X_wait_ms(int32_t wait_ms) -{ - int32_t status = STATUS_OK; - - BASE_FUNC_DELAY_MS(wait_ms); - - -#ifdef VL53L0X_LOG_ENABLE - trace_i2c("Wait ms : %6d\n", wait_ms); -#endif - - return status; - -} - - -// int32_t VL53L0X_set_gpio(uint8_t level) -// { -// int32_t status = STATUS_OK; -// //status = VL53L0X_set_gpio_sv(level); -// #ifdef VL53L0X_LOG_ENABLE -// trace_i2c("// Set GPIO = %d;\n", level); -// #endif - -// return status; - -// } - - -// int32_t VL53L0X_get_gpio(uint8_t *plevel) -// { -// int32_t status = STATUS_OK; - -// return status; -// } - - -// int32_t VL53L0X_release_gpio(void) -// { -// int32_t status = STATUS_OK; - -// } - -// int32_t VL53L0X_cycle_power(void) -// { -// int32_t status = STATUS_OK; - -// return status; -// } - - -// int32_t VL53L0X_get_timer_frequency(int32_t *ptimer_freq_hz) -// { -// *ptimer_freq_hz = 0; -// return STATUS_FAIL; -// } - - -// int32_t VL53L0X_get_timer_value(int32_t *ptimer_count) -// { -// *ptimer_count = 0; -// return STATUS_FAIL; -// } diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" deleted file mode 100644 index 2236329a..00000000 --- "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/user/BSP/platform/src/vl53l0x_platform.c" +++ /dev/null @@ -1,275 +0,0 @@ -/******************************************************************************* -Copyright � 2015, STMicroelectronics International N.V. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of STMicroelectronics nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND -NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED. -IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(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 VL53L0X_i2c.c - * - * Copyright (C) 2014 ST MicroElectronics - * - * provide variable word size byte/Word/dword VL6180x register access via i2c - * - */ -#include "vl53l0x_platform.h" -// #include "vl53l0x_i2c_platform.h" -#include "vl53l0x_api.h" -// #include - -#define LOG_FUNCTION_START(fmt, ... ) _LOG_FUNCTION_START(TRACE_MODULE_PLATFORM, fmt, ##__VA_ARGS__) -#define LOG_FUNCTION_END(status, ... ) _LOG_FUNCTION_END(TRACE_MODULE_PLATFORM, status, ##__VA_ARGS__) -#define LOG_FUNCTION_END_FMT(status, fmt, ... ) _LOG_FUNCTION_END_FMT(TRACE_MODULE_PLATFORM, status, fmt, ##__VA_ARGS__) - -/** - * @def I2C_BUFFER_CONFIG - * - * @brief Configure Device register I2C access - * - * @li 0 : one GLOBAL buffer \n - * Use one global buffer of MAX_I2C_XFER_SIZE byte in data space \n - * This solution is not multi-Device compliant nor multi-thread cpu safe \n - * It can be the best option for small 8/16 bit MCU without stack and limited ram (STM8s, 80C51 ...) - * - * @li 1 : ON_STACK/local \n - * Use local variable (on stack) buffer \n - * This solution is multi-thread with use of i2c resource lock or mutex see VL6180x_GetI2CAccess() \n - * - * @li 2 : User defined \n - * Per Device potentially dynamic allocated. Requires VL6180x_GetI2cBuffer() to be implemented. - * @ingroup Configuration - */ -#define I2C_BUFFER_CONFIG 1 -/** Maximum buffer size to be used in i2c */ -#define VL53L0X_MAX_I2C_XFER_SIZE 64 /* Maximum buffer size to be used in i2c */ - -#if I2C_BUFFER_CONFIG == 0 - /* GLOBAL config buffer */ - uint8_t i2c_global_buffer[VL53L0X_MAX_I2C_XFER_SIZE]; - - #define DECL_I2C_BUFFER - #define VL53L0X_GetLocalBuffer(Dev, n_byte) i2c_global_buffer - -#elif I2C_BUFFER_CONFIG == 1 - /* ON STACK */ - #define DECL_I2C_BUFFER uint8_t LocBuffer[VL53L0X_MAX_I2C_XFER_SIZE]; - #define VL53L0X_GetLocalBuffer(Dev, n_byte) LocBuffer -#elif I2C_BUFFER_CONFIG == 2 - /* user define buffer type declare DECL_I2C_BUFFER as access via VL53L0X_GetLocalBuffer */ - #define DECL_I2C_BUFFER -#else -#error "invalid I2C_BUFFER_CONFIG " -#endif - - -#define VL53L0X_I2C_USER_VAR /* none but could be for a flag var to get/pass to mutex interruptible return flags and try again */ -#define VL53L0X_GetI2CAccess(Dev) /* todo mutex acquire */ -#define VL53L0X_DoneI2CAcces(Dev) /* todo mutex release */ - - -VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - return Status; -} - -VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - - return Status; -} - -// the ranging_sensor_comms.dll will take care of the page selection -VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ - - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int = 0; - uint8_t deviceAddress; - - if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_write_multi(deviceAddress, index, pdata, count); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -// the ranging_sensor_comms.dll will take care of the page selection -VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count){ - VL53L0X_I2C_USER_VAR - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - if (count>=VL53L0X_MAX_I2C_XFER_SIZE){ - Status = VL53L0X_ERROR_INVALID_PARAMS; - } - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_read_multi(deviceAddress, index, pdata, count); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - - -VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_write_byte(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_write_word(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_write_dword(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - uint8_t data; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_read_byte(deviceAddress, index, &data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - if (Status == VL53L0X_ERROR_NONE) { - data = (data & AndData) | OrData; - status_int = VL53L0X_write_byte(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - } - - return Status; -} - -VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_read_byte(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_read_word(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data){ - VL53L0X_Error Status = VL53L0X_ERROR_NONE; - int32_t status_int; - uint8_t deviceAddress; - - deviceAddress = Dev->I2cDevAddr; - - status_int = VL53L0X_read_dword(deviceAddress, index, data); - - if (status_int != 0) - Status = VL53L0X_ERROR_CONTROL_INTERFACE; - - return Status; -} - -#define VL53L0X_POLLINGDELAY_LOOPNB 250 -VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev){ - VL53L0X_Error status = VL53L0X_ERROR_NONE; - // LOG_FUNCTION_START(""); - - // const DWORD cTimeout_ms = 1; - // HANDLE hEvent = CreateEvent(0, TRUE, FALSE, 0); - // if(hEvent != NULL) - // { - // WaitForSingleObject(hEvent,cTimeout_ms); - // } - - // LOG_FUNCTION_END(status); - return status; -} -- Gitee

  • +!wz)HYeN*lQvp#YldUq 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/main.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/user/main.o" new file mode 100644 index 0000000000000000000000000000000000000000..63a802018a9a29930f46f261b622b54915211c96 GIT binary patch literal 96424 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 Q*4(Q8xdp$cNGzHAUw~2{i2wiq literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/uart/src/uart_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/uart/src/uart_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..a6b95ab6711a4efc0a16a0dc745ce6c6bc19a9b9 GIT binary patch literal 52908 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 Wqln}%dm})7y^aU5rtm5-z5fGQ#Eu^T literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/wwdg/src/wwdg.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/wwdg/src/wwdg.o" new file mode 100644 index 0000000000000000000000000000000000000000..ef5f2bbbad812115dc70fbf8c8ec658556671b49 GIT binary patch literal 47776 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 I5S;J-0Bh*bz5oCK literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/wwdg/src/wwdg_ex.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/wwdg/src/wwdg_ex.o" new file mode 100644 index 0000000000000000000000000000000000000000..a416ecc7d420773e1ab31ab2f96ebcc85fa01faa GIT binary patch literal 12800 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/assert.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/assert.o" new file mode 100644 index 0000000000000000000000000000000000000000..203e28981020aa59e5586d477d63c60765fefa6b GIT binary patch literal 3976 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/clock.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/clock.o" new file mode 100644 index 0000000000000000000000000000000000000000..d22f790f6cfacb0e5dd84ba54465c588db984c63 GIT binary patch literal 11860 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/generalfunc.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/generalfunc.o" new file mode 100644 index 0000000000000000000000000000000000000000..0d707a1839bb1fd04af93d7ea04d1f10930870a7 GIT binary patch literal 24716 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 H;C%lFh#J!v literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/lock.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/lock.o" new file mode 100644 index 0000000000000000000000000000000000000000..58c5a603dc2247cfd942a946031df35758e476bb GIT binary patch literal 9520 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/reset.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/base/src/reset.o" new file mode 100644 index 0000000000000000000000000000000000000000..76e5e5c3dae8509adb693d448ed57e3002d96585 GIT binary patch literal 37288 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 Ml^9pH5M>trABs(r?EnA( literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/can/src/can.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/can/src/can.o" new file mode 100644 index 0000000000000000000000000000000000000000..9783f17c3de085eae5a8c5d594a9dc8547ae77cd GIT binary patch literal 60408 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/capm/src/capm.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/capm/src/capm.o" new file mode 100644 index 0000000000000000000000000000000000000000..0e93e8e540bcda73a069be8e219a8b7a73500408 GIT binary patch literal 126480 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�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 TZ1??}+?P)$WqW3(Bj)}eLd-$N literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/cfd/src/cfd.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/cfd/src/cfd.o" new file mode 100644 index 0000000000000000000000000000000000000000..5c453700aa1e4f3fdec12f0043162c22f158da50 GIT binary patch literal 61108 zcmeIbcYIXU7B+m&%!DE(G^Gn9aAF~tnF#@`K&XO%6e}7+3PjRO0%AwO-o=8*RqS1{ z_uhNGUVFW^YwsQ3=hid4)|Gx7}W}av5wbxp^tbNMNIdk~R)f(Oa3*I2YLKepFlUY(((U zGU%>d4vjUXN1brQ`8yu<&FJ~#a>|cfwxI=IEv##^p#}PwTe|Y20&nhv7WV}9y+60t z*mh&~zCYJm`x)r3*eYtbp{)@)UKiWeD~~zuQ^wbC;=AXr{HUkb?@|Bqh!=nhTlwRU zKdt>P*Obhih?3vtJ{rYx;Qno1&U?x0l|Ss_-|~mv^c(8`ersFXSM%C$ z7|(KOteKJ@e7Ami!HVCzpWW6UvmCPZW82_IQkm z>kH+MpV6EAcRvrUzkm4!7+q`09o_uFH|ZR)Q9svVLu>JZ73+_iSP}a%Ms&eMnN9C( zpxO0uw&j)SXxsXIPBHk|*5<&5Ue|T}t6uNhKy#4eb>*W!{&DDk@r<5BKG?P{>$IU) zM*YV0)^mYnM|_DqinU&ERjFfpqdLYz{yj%+dz77-l&mV{>zaw#@-?MvrpP?Gf5GoP zEBgHC8NJdS!`eqo{O{488vpZX*KR~7|I)U`U;gFtzNYku@qg}_5ijn%@>*Fjv%N(tRBK+=ZN!4> z<-U#Rxb1D-3&%b`&#YgjO{cc9Dlab>XUf*LTE<+6dVXE2IxE&=R-EvWH)vwTc^{b> z8i&nS9&K-C3Gu2YHynL;4Mm^*&ORTwk<~LF>#!L!Czg$@wAg>HnRU|gqfX%XA2qR} z`;RfHId|5|kB;%?zDV}Q#B&~%_xO;9)*pE`G3y<*k$TvhntE%dNWC>vq+YZ~7`lz; zCCrgT!W?9DG&t)emcSk#M;(b2UK2auC5JCwn?&10PECD_*RE}12#e~Q@YG2xo(F<&LL+&&2(eVp{7&1bWwVkq3zl!J>1ZEj?!g@<{L=;q?&m|ijK z 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 dxLth;)^RS(x>$lxpk=r)p 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 bZO!=pj}>Wh{&?;Y+T}cI%q%+5ae literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/crc/src/crc.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/crc/src/crc.o" new file mode 100644 index 0000000000000000000000000000000000000000..7484b8c927d956ab24ef205fe183f5bd9720dc7b GIT binary patch literal 70936 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 literal 0 HcmV?d00001 diff --git "a/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/crg/src/crg.o" "b/vendor/yibaina_3061M/demo/\346\231\272\350\203\275\345\212\251\346\211\213/intelligent_assistant/out/obj/drivers/crg/src/crg.o" new file mode 100644 index 0000000000000000000000000000000000000000..dee78e97984d6db800328808b9d975155c18ad12 GIT binary patch literal 151000 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