From a9c67372ad45e03a4cc9e97d657ed2ea51466ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Ryb=C3=A1rsky?= Date: Fri, 26 Jun 2026 00:25:59 +0200 Subject: [PATCH] init --- .cproject | 290 + .mrs/meshcorenortos.mrs-workspace | 27 + .project | 42 + .template | 27 + Core/core_riscv.c | 392 + Core/core_riscv.h | 599 + Debug/debug.c | 253 + Debug/debug.h | 55 + Ld/Link.ld | 1 + Peripheral/inc/ch32v30x.h | 6637 ++++++ Peripheral/inc/ch32v30x_adc.h | 230 + Peripheral/inc/ch32v30x_bkp.h | 99 + Peripheral/inc/ch32v30x_can.h | 376 + Peripheral/inc/ch32v30x_crc.h | 39 + Peripheral/inc/ch32v30x_dac.h | 122 + Peripheral/inc/ch32v30x_dbgmcu.h | 60 + Peripheral/inc/ch32v30x_dma.h | 270 + Peripheral/inc/ch32v30x_dvp.h | 69 + Peripheral/inc/ch32v30x_eth.h | 1338 ++ Peripheral/inc/ch32v30x_exti.h | 92 + Peripheral/inc/ch32v30x_flash.h | 148 + Peripheral/inc/ch32v30x_fsmc.h | 268 + Peripheral/inc/ch32v30x_gpio.h | 196 + Peripheral/inc/ch32v30x_i2c.h | 439 + Peripheral/inc/ch32v30x_iwdg.h | 58 + Peripheral/inc/ch32v30x_misc.h | 93 + Peripheral/inc/ch32v30x_opa.h | 77 + Peripheral/inc/ch32v30x_pwr.h | 77 + Peripheral/inc/ch32v30x_rcc.h | 464 + Peripheral/inc/ch32v30x_rng.h | 43 + Peripheral/inc/ch32v30x_rtc.h | 56 + Peripheral/inc/ch32v30x_sdio.h | 266 + Peripheral/inc/ch32v30x_spi.h | 231 + Peripheral/inc/ch32v30x_tim.h | 517 + Peripheral/inc/ch32v30x_usart.h | 195 + Peripheral/inc/ch32v30x_usb.h | 834 + Peripheral/inc/ch32v30x_wwdg.h | 44 + Peripheral/src/ch32v30x_adc.c | 1182 + Peripheral/src/ch32v30x_bkp.c | 244 + Peripheral/src/ch32v30x_can.c | 1297 ++ Peripheral/src/ch32v30x_crc.c | 100 + Peripheral/src/ch32v30x_dac.c | 304 + Peripheral/src/ch32v30x_dbgmcu.c | 129 + Peripheral/src/ch32v30x_dma.c | 692 + Peripheral/src/ch32v30x_dvp.c | 135 + Peripheral/src/ch32v30x_eth.c | 2524 +++ Peripheral/src/ch32v30x_exti.c | 182 + Peripheral/src/ch32v30x_flash.c | 1226 ++ Peripheral/src/ch32v30x_fsmc.c | 378 + Peripheral/src/ch32v30x_gpio.c | 895 + Peripheral/src/ch32v30x_i2c.c | 1012 + Peripheral/src/ch32v30x_iwdg.c | 123 + Peripheral/src/ch32v30x_misc.c | 105 + Peripheral/src/ch32v30x_opa.c | 86 + Peripheral/src/ch32v30x_pwr.c | 361 + Peripheral/src/ch32v30x_rcc.c | 1477 ++ Peripheral/src/ch32v30x_rng.c | 154 + Peripheral/src/ch32v30x_rtc.c | 315 + Peripheral/src/ch32v30x_sdio.c | 672 + Peripheral/src/ch32v30x_spi.c | 668 + Peripheral/src/ch32v30x_tim.c | 2362 ++ Peripheral/src/ch32v30x_usart.c | 783 + Peripheral/src/ch32v30x_wwdg.c | 141 + Startup/startup_ch32v30x_D8.S | 356 + Startup/startup_ch32v30x_D8C.S | 374 + User/ch32v30x_conf.h | 45 + User/ch32v30x_it.c | 46 + User/ch32v30x_it.h | 20 + User/lib/adc/temperature.c | 253 + User/lib/adc/temperature.h | 113 + User/lib/base64.c | 23 + User/lib/base64.h | 8 + User/lib/cifra/aes.c | 415 + User/lib/cifra/aes.h | 158 + User/lib/cifra/bitops.h | 294 + User/lib/cifra/blockwise.c | 195 + User/lib/cifra/blockwise.h | 147 + User/lib/cifra/cf_config.h | 59 + User/lib/cifra/chash.c | 28 + User/lib/cifra/chash.h | 137 + User/lib/cifra/handy.h | 86 + User/lib/cifra/hmac.c | 117 + User/lib/cifra/hmac.h | 82 + User/lib/cifra/prp.h | 64 + User/lib/cifra/sha2.h | 89 + User/lib/cifra/sha256.c | 177 + User/lib/cifra/tassert.h | 32 + User/lib/config.c | 274 + User/lib/config.h | 80 + User/lib/monocypher/monocypher-ed25519.c | 503 + User/lib/monocypher/monocypher-ed25519.h | 140 + User/lib/monocypher/monocypher.c | 2988 +++ User/lib/monocypher/monocypher.h | 321 + User/lib/rtc/rtc.c | 292 + User/lib/rtc/rtc.h | 95 + User/lib/telemetry/telemetry.c | 0 User/lib/telemetry/telemetry.h | 93 + User/main.c | 217 + User/meshcore/meshcore.c | 79 + User/meshcore/meshcore.h | 16 + User/meshcore/meshframing.c | 562 + User/meshcore/meshframing.h | 46 + User/meshcore/packets/ack.c | 43 + User/meshcore/packets/ack.h | 8 + User/meshcore/packets/advert.c | 302 + User/meshcore/packets/advert.h | 14 + User/meshcore/packets/anonymous.c | 234 + User/meshcore/packets/anonymous.h | 11 + User/meshcore/packets/control.c | 148 + User/meshcore/packets/control.h | 16 + User/meshcore/packets/custom.c | 3 + User/meshcore/packets/custom.h | 5 + User/meshcore/packets/encrypted.c | 837 + User/meshcore/packets/encrypted.h | 30 + User/meshcore/packets/group.c | 107 + User/meshcore/packets/group.h | 13 + User/meshcore/packets/multipart.c | 4 + User/meshcore/packets/multipart.h | 4 + User/meshcore/packets/trace.c | 4 + User/meshcore/packets/trace.h | 5 + User/meshcore/packetstructs.h | 248 + User/meshcore/stats.c | 6 + User/meshcore/stats.h | 11 + User/sx1262.c | 991 + User/sx1262.h | 452 + User/system_ch32v30x.c | 1036 + User/system_ch32v30x.h | 32 + User/util/hexdump.c | 39 + User/util/hexdump.h | 11 + User/util/log.h | 33 + meshcorenortos.launch | 62 + meshcorenortos.wvproj | 421 + obj/Core/core_riscv.d | 1 + obj/Core/core_riscv.o | Bin 0 -> 20792 bytes obj/Core/subdir.mk | 29 + obj/Debug/debug.d | 90 + obj/Debug/debug.o | Bin 0 -> 30800 bytes obj/Debug/subdir.mk | 29 + obj/Peripheral/src/ch32v30x_adc.d | 88 + obj/Peripheral/src/ch32v30x_adc.o | Bin 0 -> 84128 bytes obj/Peripheral/src/ch32v30x_bkp.d | 88 + obj/Peripheral/src/ch32v30x_bkp.o | Bin 0 -> 31292 bytes obj/Peripheral/src/ch32v30x_can.d | 88 + obj/Peripheral/src/ch32v30x_can.o | Bin 0 -> 95052 bytes obj/Peripheral/src/ch32v30x_crc.d | 88 + obj/Peripheral/src/ch32v30x_crc.o | Bin 0 -> 17636 bytes obj/Peripheral/src/ch32v30x_dac.d | 88 + obj/Peripheral/src/ch32v30x_dac.o | Bin 0 -> 31416 bytes obj/Peripheral/src/ch32v30x_dbgmcu.d | 88 + obj/Peripheral/src/ch32v30x_dbgmcu.o | Bin 0 -> 17536 bytes obj/Peripheral/src/ch32v30x_dma.d | 88 + obj/Peripheral/src/ch32v30x_dma.o | Bin 0 -> 33272 bytes obj/Peripheral/src/ch32v30x_dvp.d | 91 + obj/Peripheral/src/ch32v30x_dvp.o | Bin 0 -> 18672 bytes obj/Peripheral/src/ch32v30x_eth.d | 91 + obj/Peripheral/src/ch32v30x_eth.o | Bin 0 -> 172668 bytes obj/Peripheral/src/ch32v30x_exti.d | 88 + obj/Peripheral/src/ch32v30x_exti.o | Bin 0 -> 23464 bytes obj/Peripheral/src/ch32v30x_flash.d | 88 + obj/Peripheral/src/ch32v30x_flash.o | Bin 0 -> 105884 bytes obj/Peripheral/src/ch32v30x_fsmc.d | 88 + obj/Peripheral/src/ch32v30x_fsmc.o | Bin 0 -> 38360 bytes obj/Peripheral/src/ch32v30x_gpio.d | 88 + obj/Peripheral/src/ch32v30x_gpio.o | Bin 0 -> 61280 bytes obj/Peripheral/src/ch32v30x_i2c.d | 88 + obj/Peripheral/src/ch32v30x_i2c.o | Bin 0 -> 65412 bytes obj/Peripheral/src/ch32v30x_iwdg.d | 88 + obj/Peripheral/src/ch32v30x_iwdg.o | Bin 0 -> 18264 bytes obj/Peripheral/src/ch32v30x_misc.d | 88 + obj/Peripheral/src/ch32v30x_misc.o | Bin 0 -> 23744 bytes obj/Peripheral/src/ch32v30x_opa.d | 91 + obj/Peripheral/src/ch32v30x_opa.o | Bin 0 -> 17912 bytes obj/Peripheral/src/ch32v30x_pwr.d | 88 + obj/Peripheral/src/ch32v30x_pwr.o | Bin 0 -> 40168 bytes obj/Peripheral/src/ch32v30x_rcc.d | 88 + obj/Peripheral/src/ch32v30x_rcc.o | Bin 0 -> 90764 bytes obj/Peripheral/src/ch32v30x_rng.d | 91 + obj/Peripheral/src/ch32v30x_rng.o | Bin 0 -> 19012 bytes obj/Peripheral/src/ch32v30x_rtc.d | 88 + obj/Peripheral/src/ch32v30x_rtc.o | Bin 0 -> 36784 bytes obj/Peripheral/src/ch32v30x_sdio.d | 88 + obj/Peripheral/src/ch32v30x_sdio.o | Bin 0 -> 47324 bytes obj/Peripheral/src/ch32v30x_spi.d | 88 + obj/Peripheral/src/ch32v30x_spi.o | Bin 0 -> 52456 bytes obj/Peripheral/src/ch32v30x_tim.d | 88 + obj/Peripheral/src/ch32v30x_tim.o | Bin 0 -> 174412 bytes obj/Peripheral/src/ch32v30x_usart.d | 88 + obj/Peripheral/src/ch32v30x_usart.o | Bin 0 -> 59668 bytes obj/Peripheral/src/ch32v30x_wwdg.d | 88 + obj/Peripheral/src/ch32v30x_wwdg.o | Bin 0 -> 20296 bytes obj/Peripheral/src/subdir.mk | 104 + obj/Startup/startup_ch32v30x_D8C.d | 1 + obj/Startup/startup_ch32v30x_D8C.o | Bin 0 -> 10028 bytes obj/Startup/subdir.mk | 29 + obj/User/ch32v30x_it.d | 90 + obj/User/ch32v30x_it.o | Bin 0 -> 14600 bytes obj/User/lib/adc/subdir.mk | 29 + obj/User/lib/adc/temperature.d | 91 + obj/User/lib/adc/temperature.o | Bin 0 -> 40780 bytes obj/User/lib/base64.d | 3 + obj/User/lib/base64.o | Bin 0 -> 9096 bytes obj/User/lib/cifra/aes.d | 16 + obj/User/lib/cifra/aes.o | Bin 0 -> 80680 bytes obj/User/lib/cifra/blockwise.d | 11 + obj/User/lib/cifra/blockwise.o | Bin 0 -> 42684 bytes obj/User/lib/cifra/chash.d | 9 + obj/User/lib/cifra/chash.o | Bin 0 -> 16352 bytes obj/User/lib/cifra/hmac.d | 16 + obj/User/lib/cifra/hmac.o | Bin 0 -> 35244 bytes obj/User/lib/cifra/sha256.d | 16 + obj/User/lib/cifra/sha256.o | Bin 0 -> 42664 bytes obj/User/lib/cifra/subdir.mk | 41 + obj/User/lib/config.d | 117 + obj/User/lib/config.o | Bin 0 -> 67468 bytes obj/User/lib/monocypher/monocypher-ed25519.d | 8 + obj/User/lib/monocypher/monocypher-ed25519.o | Bin 0 -> 116872 bytes obj/User/lib/monocypher/monocypher.d | 4 + obj/User/lib/monocypher/monocypher.o | Bin 0 -> 901692 bytes obj/User/lib/monocypher/subdir.mk | 32 + obj/User/lib/rtc/rtc.d | 91 + obj/User/lib/rtc/rtc.o | Bin 0 -> 60172 bytes obj/User/lib/rtc/subdir.mk | 29 + obj/User/lib/subdir.mk | 32 + obj/User/lib/telemetry/subdir.mk | 29 + obj/User/lib/telemetry/telemetry.d | 1 + obj/User/lib/telemetry/telemetry.o | Bin 0 -> 1012 bytes obj/User/main.d | 165 + obj/User/main.o | Bin 0 -> 53048 bytes obj/User/meshcore/meshcore.d | 69 + obj/User/meshcore/meshcore.o | Bin 0 -> 28404 bytes obj/User/meshcore/meshframing.d | 127 + obj/User/meshcore/meshframing.o | Bin 0 -> 87616 bytes obj/User/meshcore/packets/ack.d | 31 + obj/User/meshcore/packets/ack.o | Bin 0 -> 22212 bytes obj/User/meshcore/packets/advert.d | 130 + obj/User/meshcore/packets/advert.o | Bin 0 -> 52612 bytes obj/User/meshcore/packets/anonymous.d | 130 + obj/User/meshcore/packets/anonymous.o | Bin 0 -> 56320 bytes obj/User/meshcore/packets/control.d | 37 + obj/User/meshcore/packets/control.o | Bin 0 -> 41480 bytes obj/User/meshcore/packets/custom.d | 4 + obj/User/meshcore/packets/custom.o | Bin 0 -> 2228 bytes obj/User/meshcore/packets/encrypted.d | 142 + obj/User/meshcore/packets/encrypted.o | Bin 0 -> 133464 bytes obj/User/meshcore/packets/group.d | 121 + obj/User/meshcore/packets/group.o | Bin 0 -> 35716 bytes obj/User/meshcore/packets/multipart.d | 7 + obj/User/meshcore/packets/multipart.o | Bin 0 -> 2236 bytes obj/User/meshcore/packets/subdir.mk | 53 + obj/User/meshcore/packets/trace.d | 7 + obj/User/meshcore/packets/trace.o | Bin 0 -> 2228 bytes obj/User/meshcore/stats.d | 6 + obj/User/meshcore/stats.o | Bin 0 -> 4780 bytes obj/User/meshcore/subdir.mk | 35 + obj/User/subdir.mk | 38 + obj/User/sx1262.d | 93 + obj/User/sx1262.o | Bin 0 -> 179668 bytes obj/User/system_ch32v30x.d | 88 + obj/User/system_ch32v30x.o | Bin 0 -> 27660 bytes obj/User/util/hexdump.d | 3 + obj/User/util/hexdump.o | Bin 0 -> 22672 bytes obj/User/util/subdir.mk | 29 + obj/makefile | 84 + obj/meshcorenortos.elf | Bin 0 -> 694156 bytes obj/meshcorenortos.hex | 3657 ++++ obj/meshcorenortos.lst | 19482 +++++++++++++++++ obj/meshcorenortos.map | 4201 ++++ obj/objects.mk | 9 + obj/sources.mk | 43 + 269 files changed, 78764 insertions(+) create mode 100644 .cproject create mode 100644 .mrs/meshcorenortos.mrs-workspace create mode 100644 .project create mode 100644 .template create mode 100644 Core/core_riscv.c create mode 100644 Core/core_riscv.h create mode 100644 Debug/debug.c create mode 100644 Debug/debug.h create mode 100644 Ld/Link.ld create mode 100644 Peripheral/inc/ch32v30x.h create mode 100644 Peripheral/inc/ch32v30x_adc.h create mode 100644 Peripheral/inc/ch32v30x_bkp.h create mode 100644 Peripheral/inc/ch32v30x_can.h create mode 100644 Peripheral/inc/ch32v30x_crc.h create mode 100644 Peripheral/inc/ch32v30x_dac.h create mode 100644 Peripheral/inc/ch32v30x_dbgmcu.h create mode 100644 Peripheral/inc/ch32v30x_dma.h create mode 100644 Peripheral/inc/ch32v30x_dvp.h create mode 100644 Peripheral/inc/ch32v30x_eth.h create mode 100644 Peripheral/inc/ch32v30x_exti.h create mode 100644 Peripheral/inc/ch32v30x_flash.h create mode 100644 Peripheral/inc/ch32v30x_fsmc.h create mode 100644 Peripheral/inc/ch32v30x_gpio.h create mode 100644 Peripheral/inc/ch32v30x_i2c.h create mode 100644 Peripheral/inc/ch32v30x_iwdg.h create mode 100644 Peripheral/inc/ch32v30x_misc.h create mode 100644 Peripheral/inc/ch32v30x_opa.h create mode 100644 Peripheral/inc/ch32v30x_pwr.h create mode 100644 Peripheral/inc/ch32v30x_rcc.h create mode 100644 Peripheral/inc/ch32v30x_rng.h create mode 100644 Peripheral/inc/ch32v30x_rtc.h create mode 100644 Peripheral/inc/ch32v30x_sdio.h create mode 100644 Peripheral/inc/ch32v30x_spi.h create mode 100644 Peripheral/inc/ch32v30x_tim.h create mode 100644 Peripheral/inc/ch32v30x_usart.h create mode 100644 Peripheral/inc/ch32v30x_usb.h create mode 100644 Peripheral/inc/ch32v30x_wwdg.h create mode 100644 Peripheral/src/ch32v30x_adc.c create mode 100644 Peripheral/src/ch32v30x_bkp.c create mode 100644 Peripheral/src/ch32v30x_can.c create mode 100644 Peripheral/src/ch32v30x_crc.c create mode 100644 Peripheral/src/ch32v30x_dac.c create mode 100644 Peripheral/src/ch32v30x_dbgmcu.c create mode 100644 Peripheral/src/ch32v30x_dma.c create mode 100644 Peripheral/src/ch32v30x_dvp.c create mode 100644 Peripheral/src/ch32v30x_eth.c create mode 100644 Peripheral/src/ch32v30x_exti.c create mode 100644 Peripheral/src/ch32v30x_flash.c create mode 100644 Peripheral/src/ch32v30x_fsmc.c create mode 100644 Peripheral/src/ch32v30x_gpio.c create mode 100644 Peripheral/src/ch32v30x_i2c.c create mode 100644 Peripheral/src/ch32v30x_iwdg.c create mode 100644 Peripheral/src/ch32v30x_misc.c create mode 100644 Peripheral/src/ch32v30x_opa.c create mode 100644 Peripheral/src/ch32v30x_pwr.c create mode 100644 Peripheral/src/ch32v30x_rcc.c create mode 100644 Peripheral/src/ch32v30x_rng.c create mode 100644 Peripheral/src/ch32v30x_rtc.c create mode 100644 Peripheral/src/ch32v30x_sdio.c create mode 100644 Peripheral/src/ch32v30x_spi.c create mode 100644 Peripheral/src/ch32v30x_tim.c create mode 100644 Peripheral/src/ch32v30x_usart.c create mode 100644 Peripheral/src/ch32v30x_wwdg.c create mode 100644 Startup/startup_ch32v30x_D8.S create mode 100644 Startup/startup_ch32v30x_D8C.S create mode 100644 User/ch32v30x_conf.h create mode 100644 User/ch32v30x_it.c create mode 100644 User/ch32v30x_it.h create mode 100644 User/lib/adc/temperature.c create mode 100644 User/lib/adc/temperature.h create mode 100644 User/lib/base64.c create mode 100644 User/lib/base64.h create mode 100644 User/lib/cifra/aes.c create mode 100644 User/lib/cifra/aes.h create mode 100644 User/lib/cifra/bitops.h create mode 100644 User/lib/cifra/blockwise.c create mode 100644 User/lib/cifra/blockwise.h create mode 100644 User/lib/cifra/cf_config.h create mode 100644 User/lib/cifra/chash.c create mode 100644 User/lib/cifra/chash.h create mode 100644 User/lib/cifra/handy.h create mode 100644 User/lib/cifra/hmac.c create mode 100644 User/lib/cifra/hmac.h create mode 100644 User/lib/cifra/prp.h create mode 100644 User/lib/cifra/sha2.h create mode 100644 User/lib/cifra/sha256.c create mode 100644 User/lib/cifra/tassert.h create mode 100644 User/lib/config.c create mode 100644 User/lib/config.h create mode 100644 User/lib/monocypher/monocypher-ed25519.c create mode 100644 User/lib/monocypher/monocypher-ed25519.h create mode 100644 User/lib/monocypher/monocypher.c create mode 100644 User/lib/monocypher/monocypher.h create mode 100644 User/lib/rtc/rtc.c create mode 100644 User/lib/rtc/rtc.h create mode 100644 User/lib/telemetry/telemetry.c create mode 100644 User/lib/telemetry/telemetry.h create mode 100644 User/main.c create mode 100644 User/meshcore/meshcore.c create mode 100644 User/meshcore/meshcore.h create mode 100644 User/meshcore/meshframing.c create mode 100644 User/meshcore/meshframing.h create mode 100644 User/meshcore/packets/ack.c create mode 100644 User/meshcore/packets/ack.h create mode 100644 User/meshcore/packets/advert.c create mode 100644 User/meshcore/packets/advert.h create mode 100644 User/meshcore/packets/anonymous.c create mode 100644 User/meshcore/packets/anonymous.h create mode 100644 User/meshcore/packets/control.c create mode 100644 User/meshcore/packets/control.h create mode 100644 User/meshcore/packets/custom.c create mode 100644 User/meshcore/packets/custom.h create mode 100644 User/meshcore/packets/encrypted.c create mode 100644 User/meshcore/packets/encrypted.h create mode 100644 User/meshcore/packets/group.c create mode 100644 User/meshcore/packets/group.h create mode 100644 User/meshcore/packets/multipart.c create mode 100644 User/meshcore/packets/multipart.h create mode 100644 User/meshcore/packets/trace.c create mode 100644 User/meshcore/packets/trace.h create mode 100644 User/meshcore/packetstructs.h create mode 100644 User/meshcore/stats.c create mode 100644 User/meshcore/stats.h create mode 100644 User/sx1262.c create mode 100644 User/sx1262.h create mode 100644 User/system_ch32v30x.c create mode 100644 User/system_ch32v30x.h create mode 100644 User/util/hexdump.c create mode 100644 User/util/hexdump.h create mode 100644 User/util/log.h create mode 100644 meshcorenortos.launch create mode 100644 meshcorenortos.wvproj create mode 100644 obj/Core/core_riscv.d create mode 100644 obj/Core/core_riscv.o create mode 100644 obj/Core/subdir.mk create mode 100644 obj/Debug/debug.d create mode 100644 obj/Debug/debug.o create mode 100644 obj/Debug/subdir.mk create mode 100644 obj/Peripheral/src/ch32v30x_adc.d create mode 100644 obj/Peripheral/src/ch32v30x_adc.o create mode 100644 obj/Peripheral/src/ch32v30x_bkp.d create mode 100644 obj/Peripheral/src/ch32v30x_bkp.o create mode 100644 obj/Peripheral/src/ch32v30x_can.d create mode 100644 obj/Peripheral/src/ch32v30x_can.o create mode 100644 obj/Peripheral/src/ch32v30x_crc.d create mode 100644 obj/Peripheral/src/ch32v30x_crc.o create mode 100644 obj/Peripheral/src/ch32v30x_dac.d create mode 100644 obj/Peripheral/src/ch32v30x_dac.o create mode 100644 obj/Peripheral/src/ch32v30x_dbgmcu.d create mode 100644 obj/Peripheral/src/ch32v30x_dbgmcu.o create mode 100644 obj/Peripheral/src/ch32v30x_dma.d create mode 100644 obj/Peripheral/src/ch32v30x_dma.o create mode 100644 obj/Peripheral/src/ch32v30x_dvp.d create mode 100644 obj/Peripheral/src/ch32v30x_dvp.o create mode 100644 obj/Peripheral/src/ch32v30x_eth.d create mode 100644 obj/Peripheral/src/ch32v30x_eth.o create mode 100644 obj/Peripheral/src/ch32v30x_exti.d create mode 100644 obj/Peripheral/src/ch32v30x_exti.o create mode 100644 obj/Peripheral/src/ch32v30x_flash.d create mode 100644 obj/Peripheral/src/ch32v30x_flash.o create mode 100644 obj/Peripheral/src/ch32v30x_fsmc.d create mode 100644 obj/Peripheral/src/ch32v30x_fsmc.o create mode 100644 obj/Peripheral/src/ch32v30x_gpio.d create mode 100644 obj/Peripheral/src/ch32v30x_gpio.o create mode 100644 obj/Peripheral/src/ch32v30x_i2c.d create mode 100644 obj/Peripheral/src/ch32v30x_i2c.o create mode 100644 obj/Peripheral/src/ch32v30x_iwdg.d create mode 100644 obj/Peripheral/src/ch32v30x_iwdg.o create mode 100644 obj/Peripheral/src/ch32v30x_misc.d create mode 100644 obj/Peripheral/src/ch32v30x_misc.o create mode 100644 obj/Peripheral/src/ch32v30x_opa.d create mode 100644 obj/Peripheral/src/ch32v30x_opa.o create mode 100644 obj/Peripheral/src/ch32v30x_pwr.d create mode 100644 obj/Peripheral/src/ch32v30x_pwr.o create mode 100644 obj/Peripheral/src/ch32v30x_rcc.d create mode 100644 obj/Peripheral/src/ch32v30x_rcc.o create mode 100644 obj/Peripheral/src/ch32v30x_rng.d create mode 100644 obj/Peripheral/src/ch32v30x_rng.o create mode 100644 obj/Peripheral/src/ch32v30x_rtc.d create mode 100644 obj/Peripheral/src/ch32v30x_rtc.o create mode 100644 obj/Peripheral/src/ch32v30x_sdio.d create mode 100644 obj/Peripheral/src/ch32v30x_sdio.o create mode 100644 obj/Peripheral/src/ch32v30x_spi.d create mode 100644 obj/Peripheral/src/ch32v30x_spi.o create mode 100644 obj/Peripheral/src/ch32v30x_tim.d create mode 100644 obj/Peripheral/src/ch32v30x_tim.o create mode 100644 obj/Peripheral/src/ch32v30x_usart.d create mode 100644 obj/Peripheral/src/ch32v30x_usart.o create mode 100644 obj/Peripheral/src/ch32v30x_wwdg.d create mode 100644 obj/Peripheral/src/ch32v30x_wwdg.o create mode 100644 obj/Peripheral/src/subdir.mk create mode 100644 obj/Startup/startup_ch32v30x_D8C.d create mode 100644 obj/Startup/startup_ch32v30x_D8C.o create mode 100644 obj/Startup/subdir.mk create mode 100644 obj/User/ch32v30x_it.d create mode 100644 obj/User/ch32v30x_it.o create mode 100644 obj/User/lib/adc/subdir.mk create mode 100644 obj/User/lib/adc/temperature.d create mode 100644 obj/User/lib/adc/temperature.o create mode 100644 obj/User/lib/base64.d create mode 100644 obj/User/lib/base64.o create mode 100644 obj/User/lib/cifra/aes.d create mode 100644 obj/User/lib/cifra/aes.o create mode 100644 obj/User/lib/cifra/blockwise.d create mode 100644 obj/User/lib/cifra/blockwise.o create mode 100644 obj/User/lib/cifra/chash.d create mode 100644 obj/User/lib/cifra/chash.o create mode 100644 obj/User/lib/cifra/hmac.d create mode 100644 obj/User/lib/cifra/hmac.o create mode 100644 obj/User/lib/cifra/sha256.d create mode 100644 obj/User/lib/cifra/sha256.o create mode 100644 obj/User/lib/cifra/subdir.mk create mode 100644 obj/User/lib/config.d create mode 100644 obj/User/lib/config.o create mode 100644 obj/User/lib/monocypher/monocypher-ed25519.d create mode 100644 obj/User/lib/monocypher/monocypher-ed25519.o create mode 100644 obj/User/lib/monocypher/monocypher.d create mode 100644 obj/User/lib/monocypher/monocypher.o create mode 100644 obj/User/lib/monocypher/subdir.mk create mode 100644 obj/User/lib/rtc/rtc.d create mode 100644 obj/User/lib/rtc/rtc.o create mode 100644 obj/User/lib/rtc/subdir.mk create mode 100644 obj/User/lib/subdir.mk create mode 100644 obj/User/lib/telemetry/subdir.mk create mode 100644 obj/User/lib/telemetry/telemetry.d create mode 100644 obj/User/lib/telemetry/telemetry.o create mode 100644 obj/User/main.d create mode 100644 obj/User/main.o create mode 100644 obj/User/meshcore/meshcore.d create mode 100644 obj/User/meshcore/meshcore.o create mode 100644 obj/User/meshcore/meshframing.d create mode 100644 obj/User/meshcore/meshframing.o create mode 100644 obj/User/meshcore/packets/ack.d create mode 100644 obj/User/meshcore/packets/ack.o create mode 100644 obj/User/meshcore/packets/advert.d create mode 100644 obj/User/meshcore/packets/advert.o create mode 100644 obj/User/meshcore/packets/anonymous.d create mode 100644 obj/User/meshcore/packets/anonymous.o create mode 100644 obj/User/meshcore/packets/control.d create mode 100644 obj/User/meshcore/packets/control.o create mode 100644 obj/User/meshcore/packets/custom.d create mode 100644 obj/User/meshcore/packets/custom.o create mode 100644 obj/User/meshcore/packets/encrypted.d create mode 100644 obj/User/meshcore/packets/encrypted.o create mode 100644 obj/User/meshcore/packets/group.d create mode 100644 obj/User/meshcore/packets/group.o create mode 100644 obj/User/meshcore/packets/multipart.d create mode 100644 obj/User/meshcore/packets/multipart.o create mode 100644 obj/User/meshcore/packets/subdir.mk create mode 100644 obj/User/meshcore/packets/trace.d create mode 100644 obj/User/meshcore/packets/trace.o create mode 100644 obj/User/meshcore/stats.d create mode 100644 obj/User/meshcore/stats.o create mode 100644 obj/User/meshcore/subdir.mk create mode 100644 obj/User/subdir.mk create mode 100644 obj/User/sx1262.d create mode 100644 obj/User/sx1262.o create mode 100644 obj/User/system_ch32v30x.d create mode 100644 obj/User/system_ch32v30x.o create mode 100644 obj/User/util/hexdump.d create mode 100644 obj/User/util/hexdump.o create mode 100644 obj/User/util/subdir.mk create mode 100644 obj/makefile create mode 100755 obj/meshcorenortos.elf create mode 100644 obj/meshcorenortos.hex create mode 100644 obj/meshcorenortos.lst create mode 100644 obj/meshcorenortos.map create mode 100644 obj/objects.mk create mode 100644 obj/sources.mk diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..f6bacf3 --- /dev/null +++ b/.cproject @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.mrs/meshcorenortos.mrs-workspace b/.mrs/meshcorenortos.mrs-workspace new file mode 100644 index 0000000..8cadd84 --- /dev/null +++ b/.mrs/meshcorenortos.mrs-workspace @@ -0,0 +1,27 @@ +{ + "folders": [ + { + "path": "." + }, + { + "name": "meshcorenortos", + "path": "/home/bruno/mounriver-studio-projects/meshcorenortos" + } + ], + "settings": { + "mrs.workspace.type": "project", + "mrs.init.arg": "", + "files.associations": { + "*.c": "c", + "*.h": "cpp", + "*.hxx": "cpp", + "*.hpp": "cpp", + "*.c++": "cpp", + "*.cpp": "cpp", + "*.cxx": "cpp", + "*.cc": "cpp", + "*.hh": "cpp", + "*.h++": "cpp" + } + } +} \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..6cc3b7d --- /dev/null +++ b/.project @@ -0,0 +1,42 @@ + + + meshcorenortos + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + + + 6 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-*.wvproj + + + + User + 6 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-FreeRTOSConfig.h + + + + \ No newline at end of file diff --git a/.template b/.template new file mode 100644 index 0000000..ee10337 --- /dev/null +++ b/.template @@ -0,0 +1,27 @@ +Vendor=WCH +Toolchain=RISC-V +Series=CH32V307 +RTOS=NoneOS +CalibrateSupport=false +CalibrateCommand= +MCU=CH32V307VCT6 +Link=WCH-Link +PeripheralVersion=2.9 +Description=Website: http://www.wch.cn/products/CH32V307.html?\nROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 100, GPIO PORTS: 80.\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools. +TempratureScope=CH32V307VCT6{-40℃~85℃} +ArtifactType=executable +Mcu Type=CH32V30x +Address=0x08000000 +Target Path=obj/meshcorenortos.hex +Exe Path= +Exe Arguments= +CLKSpeed=1 +DebugInterfaceMode=0 +Erase All=true +Program=true +Verify=true +Reset=true +SDIPrintf=false +Disable Power Output=false +Clear CodeFlash=false +Disable Code-Protect=false \ No newline at end of file diff --git a/Core/core_riscv.c b/Core/core_riscv.c new file mode 100644 index 0000000..f9ca871 --- /dev/null +++ b/Core/core_riscv.c @@ -0,0 +1,392 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : core_riscv.c +* Author : WCH +* Version : V1.0.1 +* Date : 2023/11/11 +* Description : RISC-V V4 Core Peripheral Access Layer Source File for CH32V30x +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include + +/* define compiler specific symbols */ +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */ + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + +#endif + + +/********************************************************************* + * @fn __get_FFLAGS + * + * @brief Return the Floating-Point Accrued Exceptions + * + * @return fflags value + */ +uint32_t __get_FFLAGS(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "fflags" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_FFLAGS + * + * @brief Set the Floating-Point Accrued Exceptions + * + * @param value - set FFLAGS value + * + * @return none + */ +void __set_FFLAGS(uint32_t value) +{ + __ASM volatile ("csrw fflags, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_FRM + * + * @brief Return the Floating-Point Dynamic Rounding Mode + * + * @return frm value + */ +uint32_t __get_FRM(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "frm" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_FRM + * + * @brief Set the Floating-Point Dynamic Rounding Mode + * + * @param value - set frm value + * + * @return none + */ +void __set_FRM(uint32_t value) +{ + __ASM volatile ("csrw frm, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_FCSR + * + * @brief Return the Floating-Point Control and Status Register + * + * @return fcsr value + */ +uint32_t __get_FCSR(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "fcsr" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_FCSR + * + * @brief Set the Floating-Point Dynamic Rounding Mode + * + * @param value - set fcsr value + * + * @return none + */ +void __set_FCSR(uint32_t value) +{ + __ASM volatile ("csrw fcsr, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MSTATUS + * + * @brief Return the Machine Status Register + * + * @return mstatus value + */ +uint32_t __get_MSTATUS(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mstatus" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MSTATUS + * + * @brief Set the Machine Status Register + * + * @param value - set mstatus value + * + * @return none + */ +void __set_MSTATUS(uint32_t value) +{ + __ASM volatile ("csrw mstatus, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MISA + * + * @brief Return the Machine ISA Register + * + * @return misa value + */ +uint32_t __get_MISA(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "misa" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MISA + * + * @brief Set the Machine ISA Register + * + * @param value - set misa value + * + * @return none + */ +void __set_MISA(uint32_t value) +{ + __ASM volatile ("csrw misa, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MTVEC + * + * @brief Return the Machine Trap-Vector Base-Address Register + * + * @return mtvec value + */ +uint32_t __get_MTVEC(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mtvec" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MTVEC + * + * @brief Set the Machine Trap-Vector Base-Address Register + * + * @param value - set mtvec value + * + * @return none + */ +void __set_MTVEC(uint32_t value) +{ + __ASM volatile ("csrw mtvec, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MSCRATCH + * + * @brief Return the Machine Seratch Register + * + * @return mscratch value + */ +uint32_t __get_MSCRATCH(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mscratch" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MSCRATCH + * + * @brief Set the Machine Seratch Register + * + * @param value - set mscratch value + * + * @return none + */ +void __set_MSCRATCH(uint32_t value) +{ + __ASM volatile ("csrw mscratch, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MEPC + * + * @brief Return the Machine Exception Program Register + * + * @return mepc value + */ +uint32_t __get_MEPC(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mepc" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MEPC + * + * @brief Set the Machine Exception Program Register + * + * @return mepc value + */ +void __set_MEPC(uint32_t value) +{ + __ASM volatile ("csrw mepc, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MCAUSE + * + * @brief Return the Machine Cause Register + * + * @return mcause value + */ +uint32_t __get_MCAUSE(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mcause" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MEPC + * + * @brief Set the Machine Cause Register + * + * @return mcause value + */ +void __set_MCAUSE(uint32_t value) +{ + __ASM volatile ("csrw mcause, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MTVAL + * + * @brief Return the Machine Trap Value Register + * + * @return mtval value + */ +uint32_t __get_MTVAL(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mtval" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __set_MTVAL + * + * @brief Set the Machine Trap Value Register + * + * @return mtval value + */ +void __set_MTVAL(uint32_t value) +{ + __ASM volatile ("csrw mtval, %0" : : "r" (value) ); +} + +/********************************************************************* + * @fn __get_MVENDORID + * + * @brief Return Vendor ID Register + * + * @return mvendorid value + */ +uint32_t __get_MVENDORID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mvendorid" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __get_MARCHID + * + * @brief Return Machine Architecture ID Register + * + * @return marchid value + */ +uint32_t __get_MARCHID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "marchid" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __get_MIMPID + * + * @brief Return Machine Implementation ID Register + * + * @return mimpid value + */ +uint32_t __get_MIMPID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mimpid" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __get_MHARTID + * + * @brief Return Hart ID Register + * + * @return mhartid value + */ +uint32_t __get_MHARTID(void) +{ + uint32_t result; + + __ASM volatile ( "csrr %0," "mhartid" : "=r" (result) ); + return (result); +} + +/********************************************************************* + * @fn __get_SP + * + * @brief Return SP Register + * + * @return SP value + */ +uint32_t __get_SP(void) +{ + uint32_t result; + + __ASM volatile ( "mv %0," "sp" : "=r"(result) : ); + return (result); +} + diff --git a/Core/core_riscv.h b/Core/core_riscv.h new file mode 100644 index 0000000..cd44ac3 --- /dev/null +++ b/Core/core_riscv.h @@ -0,0 +1,599 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : core_riscv.h +* Author : WCH +* Version : V1.0.2 +* Date : 2025/03/06 +* Description : RISC-V V4 Core Peripheral Access Layer Header File for CH32V30x +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CORE_RISCV_H__ +#define __CORE_RISCV_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* IO definitions */ +#ifdef __cplusplus + #define __I volatile /* defines 'read only' permissions */ +#else + #define __I volatile const /* defines 'read only' permissions */ +#endif +#define __O volatile /* defines 'write only' permissions */ +#define __IO volatile /* defines 'read / write' permissions */ + +/* Standard Peripheral Library old types (maintained for legacy purpose) */ +typedef __I uint64_t vuc64; /* Read Only */ +typedef __I uint32_t vuc32; /* Read Only */ +typedef __I uint16_t vuc16; /* Read Only */ +typedef __I uint8_t vuc8; /* Read Only */ + +typedef const uint64_t uc64; /* Read Only */ +typedef const uint32_t uc32; /* Read Only */ +typedef const uint16_t uc16; /* Read Only */ +typedef const uint8_t uc8; /* Read Only */ + +typedef __I int64_t vsc64; /* Read Only */ +typedef __I int32_t vsc32; /* Read Only */ +typedef __I int16_t vsc16; /* Read Only */ +typedef __I int8_t vsc8; /* Read Only */ + +typedef const int64_t sc64; /* Read Only */ +typedef const int32_t sc32; /* Read Only */ +typedef const int16_t sc16; /* Read Only */ +typedef const int8_t sc8; /* Read Only */ + +typedef __IO uint64_t vu64; +typedef __IO uint32_t vu32; +//typedef __IO uint16_t volatile uint16_t; +//typedef __IO uint8_t volatile uint8_t; + +typedef uint64_t u64; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + +typedef __IO int64_t vs64; +typedef __IO int32_t vs32; +typedef __IO int16_t vs16; +typedef __IO int8_t vs8; + +typedef int64_t s64; +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef enum {NoREADY = 0, READY = !NoREADY} ErrorStatus; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; + +#define RV_STATIC_INLINE static inline + +/* memory mapped structure for Program Fast Interrupt Controller (PFIC) */ +typedef struct{ + __I uint32_t ISR[8]; + __I uint32_t IPR[8]; + __IO uint32_t ITHRESDR; + __IO uint32_t RESERVED; + __IO uint32_t CFGR; + __I uint32_t GISR; + __IO uint8_t VTFIDR[4]; + uint8_t RESERVED0[12]; + __IO uint32_t VTFADDR[4]; + uint8_t RESERVED1[0x90]; + __O uint32_t IENR[8]; + uint8_t RESERVED2[0x60]; + __O uint32_t IRER[8]; + uint8_t RESERVED3[0x60]; + __O uint32_t IPSR[8]; + uint8_t RESERVED4[0x60]; + __O uint32_t IPRR[8]; + uint8_t RESERVED5[0x60]; + __IO uint32_t IACTR[8]; + uint8_t RESERVED6[0xE0]; + __IO uint8_t IPRIOR[256]; + uint8_t RESERVED7[0x810]; + __IO uint32_t SCTLR; +}PFIC_Type; + +/* memory mapped structure for SysTick */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t SR; + __IO uint64_t CNT; + __IO uint64_t CMP; +}SysTick_Type; + + +#define PFIC ((PFIC_Type *) 0xE000E000 ) +#define NVIC PFIC +#define NVIC_KEY1 ((uint32_t)0xFA050000) +#define NVIC_KEY2 ((uint32_t)0xBCAF0000) +#define NVIC_KEY3 ((uint32_t)0xBEEF0000) + +#define SysTick ((SysTick_Type *) 0xE000F000) + +/********************************************************************* + * @fn __enable_irq + * + * @brief Enable Global Interrupt + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __enable_irq() +{ + __asm volatile ("csrs 0x800, %0" : : "r" (0x88) ); +} + +/********************************************************************* + * @fn __disable_irq + * + * @brief Disable Global Interrupt + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __disable_irq() +{ + __asm volatile ("csrc 0x800, %0" : : "r" (0x88) ); + __asm volatile ("fence.i"); +} + +/********************************************************************* + * @fn __NOP + * + * @brief nop + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __NOP() +{ + __asm volatile ("nop"); +} + +/********************************************************************* + * @fn NVIC_EnableIRQ + * + * @brief Enable Interrupt + * + * @param IRQn - Interrupt Numbers + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->IENR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/********************************************************************* + * @fn NVIC_DisableIRQ + * + * @brief Disable Interrupt + * + * @param IRQn - Interrupt Numbers + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->IRER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); + __asm volatile ("fence.i"); +} + +/********************************************************************* + * @fn NVIC_GetStatusIRQ + * + * @brief Get Interrupt Enable State + * + * @param IRQn - Interrupt Numbers + * + * @return 1 - Interrupt Enable + * 0 - Interrupt Disable + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t NVIC_GetStatusIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + +/********************************************************************* + * @fn NVIC_GetPendingIRQ + * + * @brief Get Interrupt Pending State + * + * @param IRQn - Interrupt Numbers + * + * @return 1 - Interrupt Pending Enable + * 0 - Interrupt Pending Disable + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->IPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + +/********************************************************************* + * @fn NVIC_SetPendingIRQ + * + * @brief Set Interrupt Pending + * + * @param IRQn - Interrupt Numbers + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->IPSR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/********************************************************************* + * @fn NVIC_ClearPendingIRQ + * + * @brief Clear Interrupt Pending + * + * @param IRQn - Interrupt Numbers + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->IPRR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); +} + +/********************************************************************* + * @fn NVIC_GetActive + * + * @brief Get Interrupt Active State + * + * @param IRQn - Interrupt Numbers + * + * @return 1 - Interrupt Active + * 0 - Interrupt No Active + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IACTR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); +} + +/********************************************************************* + * @fn NVIC_SetPriority + * + * @brief Set Interrupt Priority + * + * @param IRQn - Interrupt Numbers + * interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) + * priority - bit[7:5] - Preemption Priority + * bit[4:0] - Reserve + * interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) + * priority - bit[7:6] - Preemption Priority + * bit[5] - Sub priority + * bit[4:0] - Reserve + * interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) + * priority - bit[7] - Preemption Priority + * bit[6:5] - Sub priority + * bit[4:0] - Reserve + * interrupt nesting disable(CSR-0x804 bit1 = 0) + * priority - bit[7:5] - Sub priority + * bit[4:0] - Reserve + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint8_t priority) +{ + NVIC->IPRIOR[(uint32_t)(IRQn)] = priority; +} + +/********************************************************************* + * @fn __WFI + * + * @brief Wait for Interrupt + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFI(void) +{ + NVIC->SCTLR &= ~(1<<3); // wfi + asm volatile ("wfi"); +} + +/********************************************************************* + * @fn _SEV + * + * @brief Set Event + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void _SEV(void) +{ + uint32_t t; + + t = NVIC->SCTLR; + NVIC->SCTLR |= (1<<3)|(1<<5); + NVIC->SCTLR = (NVIC->SCTLR & ~(1<<5)) | ( t & (1<<5)); +} + +/********************************************************************* + * @fn _WFE + * + * @brief Wait for Events + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void _WFE(void) +{ + NVIC->SCTLR |= (1<<3); + asm volatile ("wfi"); +} + +/********************************************************************* + * @fn __WFE + * + * @brief Wait for Events + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void __WFE(void) +{ + _SEV(); + _WFE(); + _WFE(); +} + +/********************************************************************* + * @fn SetVTFIRQ + * + * @brief Set VTF Interrupt + * + * @param add - VTF interrupt service function base address. + * IRQn -Interrupt Numbers + * num - VTF Interrupt Numbers + * NewState - DISABLE or ENABLE + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void SetVTFIRQ(uint32_t addr, IRQn_Type IRQn, uint8_t num, FunctionalState NewState) +{ + if(num > 3) return ; + + if (NewState != DISABLE) + { + NVIC->VTFIDR[num] = IRQn; + NVIC->VTFADDR[num] = ((addr&0xFFFFFFFE)|0x1); + } + else + { + NVIC->VTFIDR[num] = IRQn; + NVIC->VTFADDR[num] = ((addr&0xFFFFFFFE)&(~0x1)); + } +} + +/********************************************************************* + * @fn NVIC_SystemReset + * + * @brief Initiate a system reset request + * + * @return none + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_SystemReset(void) +{ + NVIC->CFGR = NVIC_KEY3|(1<<7); +} + +/********************************************************************* + * @fn __AMOADD_W + * + * @brief Atomic Add with 32bit value + * Atomically ADD 32bit value with value in memory using amoadd.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be ADDed + * + * @return return memory value + add value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOADD_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoadd.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOAND_W + * + * @brief Atomic And with 32bit value + * Atomically AND 32bit value with value in memory using amoand.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be ANDed + * + * @return return memory value & and value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOAND_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoand.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMAX_W + * + * @brief Atomic signed MAX with 32bit value + * Atomically signed max compare 32bit value with value in memory using amomax.d. + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return return the bigger value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOMAX_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amomax.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMAXU_W + * + * @brief Atomic unsigned MAX with 32bit value + * Atomically unsigned max compare 32bit value with value in memory using amomaxu.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return return the bigger value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOMAXU_W(volatile uint32_t *addr, uint32_t value) +{ + uint32_t result; + + __asm volatile ("amomaxu.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMIN_W + * + * @brief Atomic signed MIN with 32bit value + * Atomically signed min compare 32bit value with value in memory using amomin.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return return the smaller value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOMIN_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amomin.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOMINU_W + * + * @brief Atomic unsigned MIN with 32bit value + * Atomically unsigned min compare 32bit value with value in memory using amominu.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be compared + * + * @return return the smaller value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOMINU_W(volatile uint32_t *addr, uint32_t value) +{ + uint32_t result; + + __asm volatile ("amominu.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOOR_W + * + * @brief Atomic OR with 32bit value + * Atomically OR 32bit value with value in memory using amoor.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be ORed + * + * @return return memory value | and value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOOR_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoor.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/********************************************************************* + * @fn __AMOSWAP_W + * + * @brief Atomically swap new 32bit value into memory using amoswap.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * newval - New value to be stored into the address + * + * @return return the original value in memory + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE uint32_t __AMOSWAP_W(volatile uint32_t *addr, uint32_t newval) +{ + uint32_t result; + + __asm volatile ("amoswap.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(newval) : "memory"); + return result; +} + +/********************************************************************* + * @fn __AMOXOR_W + * + * @brief Atomic XOR with 32bit value + * Atomically XOR 32bit value with value in memory using amoxor.d. + * + * @param addr - Address pointer to data, address need to be 4byte aligned + * value - value to be XORed + * + * @return return memory value ^ and value + */ +__attribute__( ( always_inline ) ) RV_STATIC_INLINE int32_t __AMOXOR_W(volatile int32_t *addr, int32_t value) +{ + int32_t result; + + __asm volatile ("amoxor.w %0, %2, %1" : \ + "=r"(result), "+A"(*addr) : "r"(value) : "memory"); + return *addr; +} + +/* Core_Exported_Functions */ +extern uint32_t __get_FFLAGS(void); +extern void __set_FFLAGS(uint32_t value); +extern uint32_t __get_FRM(void); +extern void __set_FRM(uint32_t value); +extern uint32_t __get_FCSR(void); +extern void __set_FCSR(uint32_t value); +extern uint32_t __get_MSTATUS(void); +extern void __set_MSTATUS(uint32_t value); +extern uint32_t __get_MISA(void); +extern void __set_MISA(uint32_t value); +extern uint32_t __get_MTVEC(void); +extern void __set_MTVEC(uint32_t value); +extern uint32_t __get_MSCRATCH(void); +extern void __set_MSCRATCH(uint32_t value); +extern uint32_t __get_MEPC(void); +extern void __set_MEPC(uint32_t value); +extern uint32_t __get_MCAUSE(void); +extern void __set_MCAUSE(uint32_t value); +extern uint32_t __get_MTVAL(void); +extern void __set_MTVAL(uint32_t value); +extern uint32_t __get_MVENDORID(void); +extern uint32_t __get_MARCHID(void); +extern uint32_t __get_MIMPID(void); +extern uint32_t __get_MHARTID(void); +extern uint32_t __get_SP(void); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/Debug/debug.c b/Debug/debug.c new file mode 100644 index 0000000..e0eb24d --- /dev/null +++ b/Debug/debug.c @@ -0,0 +1,253 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : debug.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for UART +* Printf , Delay functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "debug.h" + +static uint8_t p_us = 0; +static uint16_t p_ms = 0; + +#define DEBUG_DATA0_ADDRESS ((volatile uint32_t*)0xE0000380) +#define DEBUG_DATA1_ADDRESS ((volatile uint32_t*)0xE0000384) + +/********************************************************************* + * @fn Delay_Init + * + * @brief Initializes Delay Funcation. + * + * @return none + */ +void Delay_Init(void) +{ + p_us = SystemCoreClock / 8000000; + p_ms = (uint16_t)p_us * 1000; +} + +/********************************************************************* + * @fn Delay_Us + * + * @brief Microsecond Delay Time. + * + * @param n - Microsecond number. + * + * @return None + */ +void Delay_Us(uint32_t n) +{ + uint32_t i; + + SysTick->SR &= ~(1 << 0); + i = (uint32_t)n * p_us; + + SysTick->CMP = i; + SysTick->CTLR |= (1 << 4); + SysTick->CTLR |= (1 << 5) | (1 << 0); + + while((SysTick->SR & (1 << 0)) != (1 << 0)) + ; + SysTick->CTLR &= ~(1 << 0); +} + +/********************************************************************* + * @fn Delay_Ms + * + * @brief Millisecond Delay Time. + * + * @param n - Millisecond number. + * + * @return None + */ +void Delay_Ms(uint32_t n) +{ + uint32_t i; + + SysTick->SR &= ~(1 << 0); + i = (uint32_t)n * p_ms; + + SysTick->CMP = i; + SysTick->CTLR |= (1 << 4); + SysTick->CTLR |= (1 << 5) | (1 << 0); + + while((SysTick->SR & (1 << 0)) != (1 << 0)) + ; + SysTick->CTLR &= ~(1 << 0); +} + +/********************************************************************* + * @fn USART_Printf_Init + * + * @brief Initializes the USARTx peripheral. + * + * @param baudrate - USART communication baud rate. + * + * @return None + */ +void USART_Printf_Init(uint32_t baudrate) +{ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + +#if(DEBUG == DEBUG_UART1) + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + +#elif(DEBUG == DEBUG_UART2) + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + +#elif(DEBUG == DEBUG_UART3) + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOB, &GPIO_InitStructure); + +#endif + + USART_InitStructure.USART_BaudRate = baudrate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx; + +#if(DEBUG == DEBUG_UART1) + USART_Init(USART1, &USART_InitStructure); + USART_Cmd(USART1, ENABLE); + +#elif(DEBUG == DEBUG_UART2) + USART_Init(USART2, &USART_InitStructure); + USART_Cmd(USART2, ENABLE); + +#elif(DEBUG == DEBUG_UART3) + USART_Init(USART3, &USART_InitStructure); + USART_Cmd(USART3, ENABLE); + +#endif +} + +/********************************************************************* + * @fn SDI_Printf_Enable + * + * @brief Initializes the SDI printf Function. + * + * @param None + * + * @return None + */ +void SDI_Printf_Enable(void) +{ + *(DEBUG_DATA0_ADDRESS) = 0; + Delay_Init(); + Delay_Ms(1); +} + +/********************************************************************* + * @fn _write + * + * @brief Support Printf Function + * + * @param *buf - UART send Data. + * size - Data length + * + * @return size: Data length + */ +__attribute__((used)) int _write(int fd, char *buf, int size) +{ + int i = 0; + +#if (SDI_PRINT == SDI_PR_OPEN) + int writeSize = size; + + do + { + + /** + * data0 data1 8 bytes + * data0 The lowest byte storage length, the maximum is 7 + * + */ + + while( (*(DEBUG_DATA0_ADDRESS) != 0u)) + { + + } + + if(writeSize>7) + { + *(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24); + *(DEBUG_DATA0_ADDRESS) = (7u) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24); + + i += 7; + writeSize -= 7; + } + else + { + *(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24); + *(DEBUG_DATA0_ADDRESS) = (writeSize) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24); + + writeSize = 0; + } + + } while (writeSize); + + +#else + for(i = 0; i < size; i++) + { +#if(DEBUG == DEBUG_UART1) + while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); + USART_SendData(USART1, *buf++); +#elif(DEBUG == DEBUG_UART2) + while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); + USART_SendData(USART2, *buf++); +#elif(DEBUG == DEBUG_UART3) + while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); + USART_SendData(USART3, *buf++); +#endif + } +#endif + return size; +} + +/********************************************************************* + * @fn _sbrk + * + * @brief Change the spatial position of data segment. + * + * @return size: Data length + */ +__attribute__((used)) void *_sbrk(ptrdiff_t incr) +{ + extern char _end[]; + extern char _heap_end[]; + static char *curbrk = _end; + + if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) + return NULL - 1; + + curbrk += incr; + return curbrk - incr; +} + + + diff --git a/Debug/debug.h b/Debug/debug.h new file mode 100644 index 0000000..03dd5bd --- /dev/null +++ b/Debug/debug.h @@ -0,0 +1,55 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : debug.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for UART +* Printf , Delay functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __DEBUG_H +#define __DEBUG_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "stdio.h" +#include "ch32v30x.h" + +/* UART Printf Definition */ +#define DEBUG_UART1 1 +#define DEBUG_UART2 2 +#define DEBUG_UART3 3 + +/* DEBUG UATR Definition */ +#ifndef DEBUG +#define DEBUG DEBUG_UART1 +#endif + +/* SDI Printf Definition */ +#define SDI_PR_CLOSE 0 +#define SDI_PR_OPEN 1 + +#ifndef SDI_PRINT +#define SDI_PRINT SDI_PR_CLOSE +#endif + + +void Delay_Init(void); +void Delay_Us (uint32_t n); +void Delay_Ms (uint32_t n); +void USART_Printf_Init(uint32_t baudrate); +void SDI_Printf_Enable(void); + +#ifdef __cplusplus +} +#endif + +#endif + + + diff --git a/Ld/Link.ld b/Ld/Link.ld new file mode 100644 index 0000000..c02eb65 --- /dev/null +++ b/Ld/Link.ld @@ -0,0 +1 @@ +ENTRY( _start ) __stack_size = 2048; PROVIDE( _stack_size = __stack_size ); MEMORY { /* CH32V30x_D8C - CH32V305RB-CH32V305FB CH32V30x_D8 - CH32V303CB-CH32V303RB */ /* FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K */ /* CH32V30x_D8C - CH32V307VC-CH32V307WC-CH32V307RC-CH32V305CC CH32V30x_D8 - CH32V303VC-CH32V303RC FLASH + RAM supports the following configuration For specific choices, please refer :CH32FV2x_V3xRM.PDF\Table 32-3 FLASH-192K + RAM-128K FLASH-224K + RAM-96K FLASH-256K + RAM-64K FLASH-288K + RAM-32K FLASH-128K + RAM-192K */ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 288K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K } SECTIONS { .init : { _sinit = .; . = ALIGN(4); KEEP(*(SORT_NONE(.init))) . = ALIGN(4); _einit = .; } >FLASH AT>FLASH .vector : { *(.vector); . = ALIGN(64); } >FLASH AT>FLASH .text : { . = ALIGN(4); *(.text) *(.text.*) *(.rodata) *(.rodata*) *(.gnu.linkonce.t.*) . = ALIGN(4); } >FLASH AT>FLASH .fini : { KEEP(*(SORT_NONE(.fini))) . = ALIGN(4); } >FLASH AT>FLASH PROVIDE( _etext = . ); PROVIDE( _eitcm = . ); .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); } >FLASH AT>FLASH .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) PROVIDE_HIDDEN (__init_array_end = .); } >FLASH AT>FLASH .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) PROVIDE_HIDDEN (__fini_array_end = .); } >FLASH AT>FLASH .ctors : { /* gcc uses crtbegin.o to find the start of the constructors, so we make sure it is first. Because this is a wildcard, it doesn't matter if the user does not actually link against crtbegin.o; the linker won't look for a file to match a wildcard. The wildcard also means that it doesn't matter which directory crtbegin.o is in. */ KEEP (*crtbegin.o(.ctors)) KEEP (*crtbegin?.o(.ctors)) /* We don't want to include the .ctor section from the crtend.o file until after the sorted ctors. The .ctor section from the crtend file contains the end of ctors marker and it must be last */ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >FLASH AT>FLASH .dtors : { KEEP (*crtbegin.o(.dtors)) KEEP (*crtbegin?.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >FLASH AT>FLASH .dalign : { . = ALIGN(4); PROVIDE(_data_vma = .); } >RAM AT>FLASH .dlalign : { . = ALIGN(4); PROVIDE(_data_lma = .); } >FLASH AT>FLASH .data : { *(.gnu.linkonce.r.*) *(.data .data.*) *(.gnu.linkonce.d.*) . = ALIGN(8); PROVIDE( __global_pointer$ = . + 0x800 ); *(.sdata .sdata.*) *(.sdata2.*) *(.gnu.linkonce.s.*) . = ALIGN(8); *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*) . = ALIGN(4); PROVIDE( _edata = .); } >RAM AT>FLASH .bss : { . = ALIGN(4); PROVIDE( _sbss = .); *(.sbss*) *(.gnu.linkonce.sb.*) *(.bss*) *(.gnu.linkonce.b.*) *(COMMON*) . = ALIGN(4); PROVIDE( _ebss = .); } >RAM AT>FLASH PROVIDE( _end = _ebss); PROVIDE( end = . ); .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size : { PROVIDE( _heap_end = . ); . = ALIGN(4); PROVIDE(_susrstack = . ); . = . + __stack_size; PROVIDE( _eusrstack = .); } >RAM } \ No newline at end of file diff --git a/Peripheral/inc/ch32v30x.h b/Peripheral/inc/ch32v30x.h new file mode 100644 index 0000000..765a018 --- /dev/null +++ b/Peripheral/inc/ch32v30x.h @@ -0,0 +1,6637 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x.h +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/09 +* Description : CH32V30x Device Peripheral Access Layer Header File. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_H +#define __CH32V30x_H + +#ifdef __cplusplus + extern "C" { +#endif + +#if !defined(CH32V30x_D8) && !defined(CH32V30x_D8C) +//#define CH32V30x_D8 /* CH32V303x */ +#define CH32V30x_D8C /* CH32V307x-CH32V305x-CH32V317x */ + +#endif + +#define __MPU_PRESENT 0 /* Other CH32 devices does not provide an MPU */ +#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */ + +#ifndef HSE_VALUE +#define HSE_VALUE ((uint32_t)8000000) /* Value of the External oscillator in Hz */ +#endif + +/* In the following line adjust the External High Speed oscillator (HSE) Startup Timeout value */ +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x1000) /* Time out for HSE start up */ + +#define HSI_VALUE ((uint32_t)8000000) /* Value of the Internal oscillator in Hz */ + +/* CH32V30x Standard Peripheral Library version number */ +#define __CH32V30x_STDPERIPH_VERSION_MAIN (0x02) /* [15:8] main version */ +#define __CH32V30x_STDPERIPH_VERSION_SUB (0x09) /* [7:0] sub version */ +#define __CH32V30x_STDPERIPH_VERSION ( (__CH32V30x_STDPERIPH_VERSION_MAIN << 8)\ + |(__CH32V30x_STDPERIPH_VERSION_SUB << 0)) + + +/* Interrupt Number Definition, according to the selected device */ +typedef enum IRQn +{ + /****** RISC-V Processor Exceptions Numbers *******************************************************/ + NonMaskableInt_IRQn = 2, /* 2 Non Maskable Interrupt */ + EXC_IRQn = 3, /* 3 Exception Interrupt */ + Ecall_M_Mode_IRQn = 5, /* 5 Ecall M Mode Interrupt */ + Ecall_U_Mode_IRQn = 8, /* 8 Ecall U Mode Interrupt */ + Break_Point_IRQn = 9, /* 9 Break Point Interrupt */ + SysTick_IRQn = 12, /* 12 System timer Interrupt */ + Software_IRQn = 14, /* 14 software Interrupt */ + + /****** RISC-V specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 16, /* Window WatchDog Interrupt */ + PVD_IRQn = 17, /* PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 18, /* Tamper Interrupt */ + RTC_IRQn = 19, /* RTC global Interrupt */ + FLASH_IRQn = 20, /* FLASH global Interrupt */ + RCC_IRQn = 21, /* RCC global Interrupt */ + EXTI0_IRQn = 22, /* EXTI Line0 Interrupt */ + EXTI1_IRQn = 23, /* EXTI Line1 Interrupt */ + EXTI2_IRQn = 24, /* EXTI Line2 Interrupt */ + EXTI3_IRQn = 25, /* EXTI Line3 Interrupt */ + EXTI4_IRQn = 26, /* EXTI Line4 Interrupt */ + DMA1_Channel1_IRQn = 27, /* DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 28, /* DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 29, /* DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 30, /* DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 31, /* DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 32, /* DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 33, /* DMA1 Channel 7 global Interrupt */ + ADC_IRQn = 34, /* ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 35, /* USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 36, /* USB Device Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 37, /* CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 38, /* CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 39, /* External Line[9:5] Interrupts */ + TIM1_BRK_IRQn = 40, /* TIM1 Break Interrupt */ + TIM1_UP_IRQn = 41, /* TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 42, /* TIM1 Trigger and Commutation Interrupt */ + TIM1_CC_IRQn = 43, /* TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 44, /* TIM2 global Interrupt */ + TIM3_IRQn = 45, /* TIM3 global Interrupt */ + TIM4_IRQn = 46, /* TIM4 global Interrupt */ + I2C1_EV_IRQn = 47, /* I2C1 Event Interrupt */ + I2C1_ER_IRQn = 48, /* I2C1 Error Interrupt */ + I2C2_EV_IRQn = 49, /* I2C2 Event Interrupt */ + I2C2_ER_IRQn = 50, /* I2C2 Error Interrupt */ + SPI1_IRQn = 51, /* SPI1 global Interrupt */ + SPI2_IRQn = 52, /* SPI2 global Interrupt */ + USART1_IRQn = 53, /* USART1 global Interrupt */ + USART2_IRQn = 54, /* USART2 global Interrupt */ + USART3_IRQn = 55, /* USART3 global Interrupt */ + EXTI15_10_IRQn = 56, /* External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 57, /* RTC Alarm through EXTI Line Interrupt */ + +#ifdef CH32V30x_D8 + TIM8_BRK_IRQn = 59, /* TIM8 Break Interrupt */ + TIM8_UP_IRQn = 60, /* TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 61, /* TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 62, /* TIM8 Capture Compare Interrupt */ + RNG_IRQn = 63, /* RNG global Interrupt */ + SDIO_IRQn = 65, /* SDIO global Interrupt */ + TIM5_IRQn = 66, /* TIM5 global Interrupt */ + SPI3_IRQn = 67, /* SPI3 global Interrupt */ + UART4_IRQn = 68, /* UART4 global Interrupt */ + UART5_IRQn = 69, /* UART5 global Interrupt */ + TIM6_IRQn = 70, /* TIM6 global Interrupt */ + TIM7_IRQn = 71, /* TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 72, /* DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 73, /* DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 74, /* DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 75, /* DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 76, /* DMA2 Channel 5 global Interrupt */ + USBFS_IRQn = 83, /* USBFS global Interrupt */ + UART6_IRQn = 87, /* UART6 global Interrupt */ + UART7_IRQn = 88, /* UART7 global Interrupt */ + UART8_IRQn = 89, /* UART8 global Interrupt */ + TIM9_BRK_IRQn = 90, /* TIM9 Break Interrupt */ + TIM9_UP_IRQn = 91, /* TIM9 Update Interrupt */ + TIM9_TRG_COM_IRQn = 92, /* TIM9 Trigger and Commutation Interrupt */ + TIM9_CC_IRQn = 93, /* TIM9 Capture Compare Interrupt */ + TIM10_BRK_IRQn = 94, /* TIM10 Break Interrupt */ + TIM10_UP_IRQn = 95, /* TIM10 Update Interrupt */ + TIM10_TRG_COM_IRQn = 96, /* TIM10 Trigger and Commutation Interrupt */ + TIM10_CC_IRQn = 97, /* TIM10 Capture Compare Interrupt */ + DMA2_Channel6_IRQn = 98, /* DMA2 Channel 6 global Interrupt */ + DMA2_Channel7_IRQn = 99, /* DMA2 Channel 7 global Interrupt */ + DMA2_Channel8_IRQn = 100, /* DMA2 Channel 8 global Interrupt */ + DMA2_Channel9_IRQn = 101, /* DMA2 Channel 9 global Interrupt */ + DMA2_Channel10_IRQn = 102, /* DMA2 Channel 10 global Interrupt */ + DMA2_Channel11_IRQn = 103, /* DMA2 Channel 11 global Interrupt */ + +#elif defined (CH32V30x_D8C) + USBWakeUp_IRQn = 58, /* USB Device WakeUp from suspend through EXTI Line Interrupt */ + TIM8_BRK_IRQn = 59, /* TIM8 Break Interrupt */ + TIM8_UP_IRQn = 60, /* TIM8 Update Interrupt */ + TIM8_TRG_COM_IRQn = 61, /* TIM8 Trigger and Commutation Interrupt */ + TIM8_CC_IRQn = 62, /* TIM8 Capture Compare Interrupt */ + RNG_IRQn = 63, /* RNG global Interrupt */ + SDIO_IRQn = 65, /* SDIO global Interrupt */ + TIM5_IRQn = 66, /* TIM5 global Interrupt */ + SPI3_IRQn = 67, /* SPI3 global Interrupt */ + UART4_IRQn = 68, /* UART4 global Interrupt */ + UART5_IRQn = 69, /* UART5 global Interrupt */ + TIM6_IRQn = 70, /* TIM6 global Interrupt */ + TIM7_IRQn = 71, /* TIM7 global Interrupt */ + DMA2_Channel1_IRQn = 72, /* DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 73, /* DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 74, /* DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 75, /* DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 76, /* DMA2 Channel 5 global Interrupt */ + ETH_IRQn = 77, /* ETH global Interrupt */ + ETH_WKUP_IRQn = 78, /* ETH WakeUp Interrupt */ + CAN2_TX_IRQn = 79, /* CAN2 TX Interrupts */ + CAN2_RX0_IRQn = 80, /* CAN2 RX0 Interrupts */ + CAN2_RX1_IRQn = 81, /* CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 82, /* CAN2 SCE Interrupt */ + USBFS_IRQn = 83, /* USBFS global Interrupt */ + USBHSWakeup_IRQn = 84, /* USBHS WakeUp Interrupt */ + USBHS_IRQn = 85, /* USBHS global Interrupt */ + DVP_IRQn = 86, /* DVP global Interrupt */ + UART6_IRQn = 87, /* UART6 global Interrupt */ + UART7_IRQn = 88, /* UART7 global Interrupt */ + UART8_IRQn = 89, /* UART8 global Interrupt */ + TIM9_BRK_IRQn = 90, /* TIM9 Break Interrupt */ + TIM9_UP_IRQn = 91, /* TIM9 Update Interrupt */ + TIM9_TRG_COM_IRQn = 92, /* TIM9 Trigger and Commutation Interrupt */ + TIM9_CC_IRQn = 93, /* TIM9 Capture Compare Interrupt */ + TIM10_BRK_IRQn = 94, /* TIM10 Break Interrupt */ + TIM10_UP_IRQn = 95, /* TIM10 Update Interrupt */ + TIM10_TRG_COM_IRQn = 96, /* TIM10 Trigger and Commutation Interrupt */ + TIM10_CC_IRQn = 97, /* TIM10 Capture Compare Interrupt */ + DMA2_Channel6_IRQn = 98, /* DMA2 Channel 6 global Interrupt */ + DMA2_Channel7_IRQn = 99, /* DMA2 Channel 7 global Interrupt */ + DMA2_Channel8_IRQn = 100, /* DMA2 Channel 8 global Interrupt */ + DMA2_Channel9_IRQn = 101, /* DMA2 Channel 9 global Interrupt */ + DMA2_Channel10_IRQn = 102, /* DMA2 Channel 10 global Interrupt */ + DMA2_Channel11_IRQn = 103, /* DMA2 Channel 11 global Interrupt */ + +#endif +} IRQn_Type; + +#define HardFault_IRQn EXC_IRQn +#define ADC1_2_IRQn ADC_IRQn + +#define SysTicK_IRQn SysTick_IRQn +#define OTG_FS_IRQn USBFS_IRQn +#define OTG_FS_IRQHandler USBFS_IRQHandler + +#define USBHD_IRQHandler USBFS_IRQHandler + +#define USBOTG_FS USBFSD +#define USBOTG_H_FS USBFSH + +#include +#include "core_riscv.h" +#include "system_ch32v30x.h" + + +/* Standard Peripheral Library old definitions (maintained for legacy purpose) */ +#define HSI_Value HSI_VALUE +#define HSE_Value HSE_VALUE +#define HSEStartUp_TimeOut HSE_STARTUP_TIMEOUT + +/* Analog to Digital Converter */ +typedef struct +{ + __IO uint32_t STATR; + __IO uint32_t CTLR1; + __IO uint32_t CTLR2; + __IO uint32_t SAMPTR1; + __IO uint32_t SAMPTR2; + __IO uint32_t IOFR1; + __IO uint32_t IOFR2; + __IO uint32_t IOFR3; + __IO uint32_t IOFR4; + __IO uint32_t WDHTR; + __IO uint32_t WDLTR; + __IO uint32_t RSQR1; + __IO uint32_t RSQR2; + __IO uint32_t RSQR3; + __IO uint32_t ISQR; + __IO uint32_t IDATAR1; + __IO uint32_t IDATAR2; + __IO uint32_t IDATAR3; + __IO uint32_t IDATAR4; + __IO uint32_t RDATAR; + uint32_t RESERVED0; + __IO uint32_t AUX; +} ADC_TypeDef; + +/* Backup Registers */ +typedef struct +{ + uint32_t RESERVED0; + __IO uint16_t DATAR1; + uint16_t RESERVED1; + __IO uint16_t DATAR2; + uint16_t RESERVED2; + __IO uint16_t DATAR3; + uint16_t RESERVED3; + __IO uint16_t DATAR4; + uint16_t RESERVED4; + __IO uint16_t DATAR5; + uint16_t RESERVED5; + __IO uint16_t DATAR6; + uint16_t RESERVED6; + __IO uint16_t DATAR7; + uint16_t RESERVED7; + __IO uint16_t DATAR8; + uint16_t RESERVED8; + __IO uint16_t DATAR9; + uint16_t RESERVED9; + __IO uint16_t DATAR10; + uint16_t RESERVED10; + __IO uint16_t OCTLR; + uint16_t RESERVED11; + __IO uint16_t TPCTLR; + uint16_t RESERVED12; + __IO uint16_t TPCSR; + uint16_t RESERVED13[5]; + __IO uint16_t DATAR11; + uint16_t RESERVED14; + __IO uint16_t DATAR12; + uint16_t RESERVED15; + __IO uint16_t DATAR13; + uint16_t RESERVED16; + __IO uint16_t DATAR14; + uint16_t RESERVED17; + __IO uint16_t DATAR15; + uint16_t RESERVED18; + __IO uint16_t DATAR16; + uint16_t RESERVED19; + __IO uint16_t DATAR17; + uint16_t RESERVED20; + __IO uint16_t DATAR18; + uint16_t RESERVED21; + __IO uint16_t DATAR19; + uint16_t RESERVED22; + __IO uint16_t DATAR20; + uint16_t RESERVED23; + __IO uint16_t DATAR21; + uint16_t RESERVED24; + __IO uint16_t DATAR22; + uint16_t RESERVED25; + __IO uint16_t DATAR23; + uint16_t RESERVED26; + __IO uint16_t DATAR24; + uint16_t RESERVED27; + __IO uint16_t DATAR25; + uint16_t RESERVED28; + __IO uint16_t DATAR26; + uint16_t RESERVED29; + __IO uint16_t DATAR27; + uint16_t RESERVED30; + __IO uint16_t DATAR28; + uint16_t RESERVED31; + __IO uint16_t DATAR29; + uint16_t RESERVED32; + __IO uint16_t DATAR30; + uint16_t RESERVED33; + __IO uint16_t DATAR31; + uint16_t RESERVED34; + __IO uint16_t DATAR32; + uint16_t RESERVED35; + __IO uint16_t DATAR33; + uint16_t RESERVED36; + __IO uint16_t DATAR34; + uint16_t RESERVED37; + __IO uint16_t DATAR35; + uint16_t RESERVED38; + __IO uint16_t DATAR36; + uint16_t RESERVED39; + __IO uint16_t DATAR37; + uint16_t RESERVED40; + __IO uint16_t DATAR38; + uint16_t RESERVED41; + __IO uint16_t DATAR39; + uint16_t RESERVED42; + __IO uint16_t DATAR40; + uint16_t RESERVED43; + __IO uint16_t DATAR41; + uint16_t RESERVED44; + __IO uint16_t DATAR42; + uint16_t RESERVED45; +} BKP_TypeDef; + +/* Controller Area Network TxMailBox */ +typedef struct +{ + __IO uint32_t TXMIR; + __IO uint32_t TXMDTR; + __IO uint32_t TXMDLR; + __IO uint32_t TXMDHR; +} CAN_TxMailBox_TypeDef; + +/* Controller Area Network FIFOMailBox */ +typedef struct +{ + __IO uint32_t RXMIR; + __IO uint32_t RXMDTR; + __IO uint32_t RXMDLR; + __IO uint32_t RXMDHR; +} CAN_FIFOMailBox_TypeDef; + +/* Controller Area Network FilterRegister */ +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/* Controller Area Network */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t STATR; + __IO uint32_t TSTATR; + __IO uint32_t RFIFO0; + __IO uint32_t RFIFO1; + __IO uint32_t INTENR; + __IO uint32_t ERRSR; + __IO uint32_t BTIMR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FCTLR; + __IO uint32_t FMCFGR; + uint32_t RESERVED2; + __IO uint32_t FSCFGR; + uint32_t RESERVED3; + __IO uint32_t FAFIFOR; + uint32_t RESERVED4; + __IO uint32_t FWR; + uint32_t RESERVED5[8]; + CAN_FilterRegister_TypeDef sFilterRegister[28]; +} CAN_TypeDef; + +/* CRC Calculation Unit */ +typedef struct +{ + __IO uint32_t DATAR; + __IO uint8_t IDATAR; + uint8_t RESERVED0; + uint16_t RESERVED1; + __IO uint32_t CTLR; +} CRC_TypeDef; + +/* Digital to Analog Converter */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t SWTR; + __IO uint32_t R12BDHR1; + __IO uint32_t L12BDHR1; + __IO uint32_t R8BDHR1; + __IO uint32_t R12BDHR2; + __IO uint32_t L12BDHR2; + __IO uint32_t R8BDHR2; + __IO uint32_t RD12BDHR; + __IO uint32_t LD12BDHR; + __IO uint32_t RD8BDHR; + __IO uint32_t DOR1; + __IO uint32_t DOR2; +} DAC_TypeDef; + +/* DMA Channel Controller */ +typedef struct +{ + __IO uint32_t CFGR; + __IO uint32_t CNTR; + __IO uint32_t PADDR; + __IO uint32_t MADDR; +} DMA_Channel_TypeDef; + +/* DMA Controller */ +typedef struct +{ + __IO uint32_t INTFR; + __IO uint32_t INTFCR; +} DMA_TypeDef; + +/* External Interrupt/Event Controller */ +typedef struct +{ + __IO uint32_t INTENR; + __IO uint32_t EVENR; + __IO uint32_t RTENR; + __IO uint32_t FTENR; + __IO uint32_t SWIEVR; + __IO uint32_t INTFR; +} EXTI_TypeDef; + +/* FLASH Registers */ +typedef struct +{ + __IO uint32_t ACTLR; + __IO uint32_t KEYR; + __IO uint32_t OBKEYR; + __IO uint32_t STATR; + __IO uint32_t CTLR; + __IO uint32_t ADDR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WPR; + __IO uint32_t MODEKEYR; +} FLASH_TypeDef; + +/* Option Bytes Registers */ +typedef struct +{ + __IO uint16_t RDPR; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRPR0; + __IO uint16_t WRPR1; + __IO uint16_t WRPR2; + __IO uint16_t WRPR3; +} OB_TypeDef; + +/* FSMC Bank1 Registers */ +typedef struct +{ + __IO uint32_t BTCR[8]; +} FSMC_Bank1_TypeDef; + +/* FSMC Bank1E Registers */ +typedef struct +{ + __IO uint32_t BWTR[7]; +} FSMC_Bank1E_TypeDef; + +/* FSMC Bank2 Registers */ +typedef struct +{ + __IO uint32_t PCR2; + __IO uint32_t SR2; + __IO uint32_t PMEM2; + __IO uint32_t PATT2; + uint32_t RESERVED0; + __IO uint32_t ECCR2; +} FSMC_Bank2_TypeDef; + +/* General Purpose I/O */ +typedef struct +{ + __IO uint32_t CFGLR; + __IO uint32_t CFGHR; + __IO uint32_t INDR; + __IO uint32_t OUTDR; + __IO uint32_t BSHR; + __IO uint32_t BCR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/* Alternate Function I/O */ +typedef struct +{ + __IO uint32_t ECR; + __IO uint32_t PCFR1; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t PCFR2; +} AFIO_TypeDef; + +/* Inter Integrated Circuit Interface */ +typedef struct +{ + __IO uint16_t CTLR1; + uint16_t RESERVED0; + __IO uint16_t CTLR2; + uint16_t RESERVED1; + __IO uint16_t OADDR1; + uint16_t RESERVED2; + __IO uint16_t OADDR2; + uint16_t RESERVED3; + __IO uint16_t DATAR; + uint16_t RESERVED4; + __IO uint16_t STAR1; + uint16_t RESERVED5; + __IO uint16_t STAR2; + uint16_t RESERVED6; + __IO uint16_t CKCFGR; + uint16_t RESERVED7; + __IO uint16_t RTR; + uint16_t RESERVED8; +} I2C_TypeDef; + +/* Independent WatchDog */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t PSCR; + __IO uint32_t RLDR; + __IO uint32_t STATR; +} IWDG_TypeDef; + +/* Power Control */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/* Reset and Clock Control */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t CFGR0; + __IO uint32_t INTR; + __IO uint32_t APB2PRSTR; + __IO uint32_t APB1PRSTR; + __IO uint32_t AHBPCENR; + __IO uint32_t APB2PCENR; + __IO uint32_t APB1PCENR; + __IO uint32_t BDCTLR; + __IO uint32_t RSTSCKR; + __IO uint32_t AHBRSTR; + __IO uint32_t CFGR2; +} RCC_TypeDef; + +/* Real-Time Clock */ +typedef struct +{ + __IO uint16_t CTLRH; + uint16_t RESERVED0; + __IO uint16_t CTLRL; + uint16_t RESERVED1; + __IO uint16_t PSCRH; + uint16_t RESERVED2; + __IO uint16_t PSCRL; + uint16_t RESERVED3; + __IO uint16_t DIVH; + uint16_t RESERVED4; + __IO uint16_t DIVL; + uint16_t RESERVED5; + __IO uint16_t CNTH; + uint16_t RESERVED6; + __IO uint16_t CNTL; + uint16_t RESERVED7; + __IO uint16_t ALRMH; + uint16_t RESERVED8; + __IO uint16_t ALRML; + uint16_t RESERVED9; +} RTC_TypeDef; + +/* SDIO Registers */ +typedef struct +{ + __IO uint32_t POWER; + __IO uint32_t CLKCR; + __IO uint32_t ARG; + __IO uint32_t CMD; + __I uint32_t RESPCMD; + __I uint32_t RESP1; + __I uint32_t RESP2; + __I uint32_t RESP3; + __I uint32_t RESP4; + __IO uint32_t DTIMER; + __IO uint32_t DLEN; + __IO uint32_t DCTRL; + __I uint32_t DCOUNT; + __I uint32_t STA; + __IO uint32_t ICR; + __IO uint32_t MASK; + uint32_t RESERVED0[2]; + __I uint32_t FIFOCNT; + uint32_t RESERVED1[5]; + __IO uint32_t DCTRL2; + uint32_t RESERVED2[7]; + __IO uint32_t FIFO; +} SDIO_TypeDef; + +/* Serial Peripheral Interface */ +typedef struct +{ + __IO uint16_t CTLR1; + uint16_t RESERVED0; + __IO uint16_t CTLR2; + uint16_t RESERVED1; + __IO uint16_t STATR; + uint16_t RESERVED2; + __IO uint16_t DATAR; + uint16_t RESERVED3; + __IO uint16_t CRCR; + uint16_t RESERVED4; + __IO uint16_t RCRCR; + uint16_t RESERVED5; + __IO uint16_t TCRCR; + uint16_t RESERVED6; + __IO uint16_t I2SCFGR; + uint16_t RESERVED7; + __IO uint16_t I2SPR; + uint16_t RESERVED8; + __IO uint16_t HSCR; + uint16_t RESERVED9; +} SPI_TypeDef; + +/* TIM */ +typedef struct +{ + __IO uint16_t CTLR1; + uint16_t RESERVED0; + __IO uint16_t CTLR2; + uint16_t RESERVED1; + __IO uint16_t SMCFGR; + uint16_t RESERVED2; + __IO uint16_t DMAINTENR; + uint16_t RESERVED3; + __IO uint16_t INTFR; + uint16_t RESERVED4; + __IO uint16_t SWEVGR; + uint16_t RESERVED5; + __IO uint16_t CHCTLR1; + uint16_t RESERVED6; + __IO uint16_t CHCTLR2; + uint16_t RESERVED7; + __IO uint16_t CCER; + uint16_t RESERVED8; + __IO uint16_t CNT; + uint16_t RESERVED9; + __IO uint16_t PSC; + uint16_t RESERVED10; + __IO uint16_t ATRLR; + uint16_t RESERVED11; + __IO uint16_t RPTCR; + uint16_t RESERVED12; + __IO uint16_t CH1CVR; + uint16_t RESERVED13; + __IO uint16_t CH2CVR; + uint16_t RESERVED14; + __IO uint16_t CH3CVR; + uint16_t RESERVED15; + __IO uint16_t CH4CVR; + uint16_t RESERVED16; + __IO uint16_t BDTR; + uint16_t RESERVED17; + __IO uint16_t DMACFGR; + uint16_t RESERVED18; + __IO uint16_t DMAADR; + uint16_t RESERVED19; + __IO uint16_t AUX; + uint16_t RESERVED20; +} TIM_TypeDef; + +/* Universal Synchronous Asynchronous Receiver Transmitter */ +typedef struct +{ + __IO uint16_t STATR; + uint16_t RESERVED0; + __IO uint16_t DATAR; + uint16_t RESERVED1; + __IO uint16_t BRR; + uint16_t RESERVED2; + __IO uint16_t CTLR1; + uint16_t RESERVED3; + __IO uint16_t CTLR2; + uint16_t RESERVED4; + __IO uint16_t CTLR3; + uint16_t RESERVED5; + __IO uint16_t GPR; + uint16_t RESERVED6; + __IO uint16_t CTLR4; + uint16_t RESERVED7; +} USART_TypeDef; + +/* Window WatchDog */ +typedef struct +{ + __IO uint32_t CTLR; + __IO uint32_t CFGR; + __IO uint32_t STATR; +} WWDG_TypeDef; + +/* Enhanced Registers */ +typedef struct +{ + __IO uint32_t EXTEN_CTR; + uint32_t RESERVED0; + __IO uint32_t EXTEN_CTR2; +} EXTEN_TypeDef; + +/* OPA Registers */ +typedef struct +{ + __IO uint32_t CR; +} OPA_TypeDef; + +/* RNG Registers */ +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t SR; + __IO uint32_t DR; +} RNG_TypeDef; + +/* DVP Registers */ +typedef struct +{ + __IO uint8_t CR0; + __IO uint8_t CR1; + __IO uint8_t IER; + __IO uint8_t Reserved0; + __IO uint16_t ROW_NUM; + __IO uint16_t COL_NUM; + __IO uint32_t DMA_BUF0; + __IO uint32_t DMA_BUF1; + __IO uint8_t IFR; + __IO uint8_t STATUS; + __IO uint16_t Reserved1; + __IO uint16_t ROW_CNT; + __IO uint16_t Reserved2; + __IO uint16_t HOFFCNT; + __IO uint16_t VST; + __IO uint16_t CAPCNT; + __IO uint16_t VLINE; + __IO uint32_t DR; +} DVP_TypeDef; + +/* USBHS Registers */ +typedef struct +{ + __IO uint8_t CONTROL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_AD; + __IO uint16_t FRAME_NO; + __IO uint8_t SUSPEND; + __IO uint8_t RESERVED0; + __IO uint8_t SPEED_TYPE; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t RESERVED1; + __IO uint32_t ENDP_CONFIG; + __IO uint32_t ENDP_TYPE; + __IO uint32_t BUF_MODE; + __IO uint32_t UEP0_DMA; + __IO uint32_t UEP1_RX_DMA; + __IO uint32_t UEP2_RX_DMA; + __IO uint32_t UEP3_RX_DMA; + __IO uint32_t UEP4_RX_DMA; + __IO uint32_t UEP5_RX_DMA; + __IO uint32_t UEP6_RX_DMA; + __IO uint32_t UEP7_RX_DMA; + __IO uint32_t UEP8_RX_DMA; + __IO uint32_t UEP9_RX_DMA; + __IO uint32_t UEP10_RX_DMA; + __IO uint32_t UEP11_RX_DMA; + __IO uint32_t UEP12_RX_DMA; + __IO uint32_t UEP13_RX_DMA; + __IO uint32_t UEP14_RX_DMA; + __IO uint32_t UEP15_RX_DMA; + __IO uint32_t UEP1_TX_DMA; + __IO uint32_t UEP2_TX_DMA; + __IO uint32_t UEP3_TX_DMA; + __IO uint32_t UEP4_TX_DMA; + __IO uint32_t UEP5_TX_DMA; + __IO uint32_t UEP6_TX_DMA; + __IO uint32_t UEP7_TX_DMA; + __IO uint32_t UEP8_TX_DMA; + __IO uint32_t UEP9_TX_DMA; + __IO uint32_t UEP10_TX_DMA; + __IO uint32_t UEP11_TX_DMA; + __IO uint32_t UEP12_TX_DMA; + __IO uint32_t UEP13_TX_DMA; + __IO uint32_t UEP14_TX_DMA; + __IO uint32_t UEP15_TX_DMA; + __IO uint16_t UEP0_MAX_LEN; + __IO uint16_t RESERVED2; + __IO uint16_t UEP1_MAX_LEN; + __IO uint16_t RESERVED3; + __IO uint16_t UEP2_MAX_LEN; + __IO uint16_t RESERVED4; + __IO uint16_t UEP3_MAX_LEN; + __IO uint16_t RESERVED5; + __IO uint16_t UEP4_MAX_LEN; + __IO uint16_t RESERVED6; + __IO uint16_t UEP5_MAX_LEN; + __IO uint16_t RESERVED7; + __IO uint16_t UEP6_MAX_LEN; + __IO uint16_t RESERVED8; + __IO uint16_t UEP7_MAX_LEN; + __IO uint16_t RESERVED9; + __IO uint16_t UEP8_MAX_LEN; + __IO uint16_t RESERVED10; + __IO uint16_t UEP9_MAX_LEN; + __IO uint16_t RESERVED11; + __IO uint16_t UEP10_MAX_LEN; + __IO uint16_t RESERVED12; + __IO uint16_t UEP11_MAX_LEN; + __IO uint16_t RESERVED13; + __IO uint16_t UEP12_MAX_LEN; + __IO uint16_t RESERVED14; + __IO uint16_t UEP13_MAX_LEN; + __IO uint16_t RESERVED15; + __IO uint16_t UEP14_MAX_LEN; + __IO uint16_t RESERVED16; + __IO uint16_t UEP15_MAX_LEN; + __IO uint16_t RESERVED17; + __IO uint16_t UEP0_TX_LEN; + __IO uint8_t UEP0_TX_CTRL; + __IO uint8_t UEP0_RX_CTRL; + __IO uint16_t UEP1_TX_LEN; + __IO uint8_t UEP1_TX_CTRL; + __IO uint8_t UEP1_RX_CTRL; + __IO uint16_t UEP2_TX_LEN; + __IO uint8_t UEP2_TX_CTRL; + __IO uint8_t UEP2_RX_CTRL; + __IO uint16_t UEP3_TX_LEN; + __IO uint8_t UEP3_TX_CTRL; + __IO uint8_t UEP3_RX_CTRL; + __IO uint16_t UEP4_TX_LEN; + __IO uint8_t UEP4_TX_CTRL; + __IO uint8_t UEP4_RX_CTRL; + __IO uint16_t UEP5_TX_LEN; + __IO uint8_t UEP5_TX_CTRL; + __IO uint8_t UEP5_RX_CTRL; + __IO uint16_t UEP6_TX_LEN; + __IO uint8_t UEP6_TX_CTRL; + __IO uint8_t UEP6_RX_CTRL; + __IO uint16_t UEP7_TX_LEN; + __IO uint8_t UEP7_TX_CTRL; + __IO uint8_t UEP7_RX_CTRL; + __IO uint16_t UEP8_TX_LEN; + __IO uint8_t UEP8_TX_CTRL; + __IO uint8_t UEP8_RX_CTRL; + __IO uint16_t UEP9_TX_LEN; + __IO uint8_t UEP9_TX_CTRL; + __IO uint8_t UEP9_RX_CTRL; + __IO uint16_t UEP10_TX_LEN; + __IO uint8_t UEP10_TX_CTRL; + __IO uint8_t UEP10_RX_CTRL; + __IO uint16_t UEP11_TX_LEN; + __IO uint8_t UEP11_TX_CTRL; + __IO uint8_t UEP11_RX_CTRL; + __IO uint16_t UEP12_TX_LEN; + __IO uint8_t UEP12_TX_CTRL; + __IO uint8_t UEP12_RX_CTRL; + __IO uint16_t UEP13_TX_LEN; + __IO uint8_t UEP13_TX_CTRL; + __IO uint8_t UEP13_RX_CTRL; + __IO uint16_t UEP14_TX_LEN; + __IO uint8_t UEP14_TX_CTRL; + __IO uint8_t UEP14_RX_CTRL; + __IO uint16_t UEP15_TX_LEN; + __IO uint8_t UEP15_TX_CTRL; + __IO uint8_t UEP15_RX_CTRL; +} USBHSD_TypeDef; + +typedef struct __attribute__((packed)) +{ + __IO uint8_t CONTROL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_AD; + __IO uint16_t FRAME_NO; + __IO uint8_t SUSPEND; + __IO uint8_t RESERVED0; + __IO uint8_t SPEED_TYPE; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t RESERVED1; + __IO uint32_t HOST_EP_CONFIG; + __IO uint32_t HOST_EP_TYPE; + __IO uint32_t RESERVED2; + __IO uint32_t RESERVED3; + __IO uint32_t RESERVED4; + __IO uint32_t HOST_RX_DMA; + __IO uint32_t RESERVED5; + __IO uint32_t RESERVED6; + __IO uint32_t RESERVED7; + __IO uint32_t RESERVED8; + __IO uint32_t RESERVED9; + __IO uint32_t RESERVED10; + __IO uint32_t RESERVED11; + __IO uint32_t RESERVED12; + __IO uint32_t RESERVED13; + __IO uint32_t RESERVED14; + __IO uint32_t RESERVED15; + __IO uint32_t RESERVED16; + __IO uint32_t RESERVED17; + __IO uint32_t RESERVED18; + __IO uint32_t RESERVED19; + __IO uint32_t HOST_TX_DMA; + __IO uint32_t RESERVED20; + __IO uint32_t RESERVED21; + __IO uint32_t RESERVED22; + __IO uint32_t RESERVED23; + __IO uint32_t RESERVED24; + __IO uint32_t RESERVED25; + __IO uint32_t RESERVED26; + __IO uint32_t RESERVED27; + __IO uint32_t RESERVED28; + __IO uint32_t RESERVED29; + __IO uint32_t RESERVED30; + __IO uint32_t RESERVED31; + __IO uint32_t RESERVED32; + __IO uint32_t RESERVED33; + __IO uint16_t HOST_RX_MAX_LEN; + __IO uint16_t RESERVED34; + __IO uint32_t RESERVED35; + __IO uint32_t RESERVED36; + __IO uint32_t RESERVED37; + __IO uint32_t RESERVED38; + __IO uint32_t RESERVED39; + __IO uint32_t RESERVED40; + __IO uint32_t RESERVED41; + __IO uint32_t RESERVED42; + __IO uint32_t RESERVED43; + __IO uint32_t RESERVED44; + __IO uint32_t RESERVED45; + __IO uint32_t RESERVED46; + __IO uint32_t RESERVED47; + __IO uint32_t RESERVED48; + __IO uint32_t RESERVED49; + __IO uint8_t HOST_EP_PID; + __IO uint8_t RESERVED50; + __IO uint8_t RESERVED51; + __IO uint8_t HOST_RX_CTRL; + __IO uint16_t HOST_TX_LEN; + __IO uint8_t HOST_TX_CTRL; + __IO uint8_t RESERVED52; + __IO uint16_t HOST_SPLIT_DATA; +} USBHSH_TypeDef; + + +/* USBOTG_FS Registers */ +typedef struct +{ + __IO uint8_t BASE_CTRL; + __IO uint8_t UDEV_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t Reserve1; + __IO uint8_t UEP4_1_MOD; + __IO uint8_t UEP2_3_MOD; + __IO uint8_t UEP5_6_MOD; + __IO uint8_t UEP7_MOD; + __IO uint32_t UEP0_DMA; + __IO uint32_t UEP1_DMA; + __IO uint32_t UEP2_DMA; + __IO uint32_t UEP3_DMA; + __IO uint32_t UEP4_DMA; + __IO uint32_t UEP5_DMA; + __IO uint32_t UEP6_DMA; + __IO uint32_t UEP7_DMA; + __IO uint16_t UEP0_TX_LEN; + __IO uint8_t UEP0_TX_CTRL; + __IO uint8_t UEP0_RX_CTRL; + __IO uint16_t UEP1_TX_LEN; + __IO uint8_t UEP1_TX_CTRL; + __IO uint8_t UEP1_RX_CTRL; + __IO uint16_t UEP2_TX_LEN; + __IO uint8_t UEP2_TX_CTRL; + __IO uint8_t UEP2_RX_CTRL; + __IO uint16_t UEP3_TX_LEN; + __IO uint8_t UEP3_TX_CTRL; + __IO uint8_t UEP3_RX_CTRL; + __IO uint16_t UEP4_TX_LEN; + __IO uint8_t UEP4_TX_CTRL; + __IO uint8_t UEP4_RX_CTRL; + __IO uint16_t UEP5_TX_LEN; + __IO uint8_t UEP5_TX_CTRL; + __IO uint8_t UEP5_RX_CTRL; + __IO uint16_t UEP6_TX_LEN; + __IO uint8_t UEP6_TX_CTRL; + __IO uint8_t UEP6_RX_CTRL; + __IO uint16_t UEP7_TX_LEN; + __IO uint8_t UEP7_TX_CTRL; + __IO uint8_t UEP7_RX_CTRL; + __IO uint32_t Reserve2; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; +}USBFSD_TypeDef; + +typedef struct __attribute__((packed)) +{ + __IO uint8_t BASE_CTRL; + __IO uint8_t HOST_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint16_t RX_LEN; + __IO uint16_t Reserve1; + __IO uint8_t Reserve2; + __IO uint8_t HOST_EP_MOD; + __IO uint16_t Reserve3; + __IO uint32_t Reserve4; + __IO uint32_t Reserve5; + __IO uint32_t HOST_RX_DMA; + __IO uint32_t HOST_TX_DMA; + __IO uint32_t Reserve6; + __IO uint32_t Reserve7; + __IO uint32_t Reserve8; + __IO uint32_t Reserve9; + __IO uint32_t Reserve10; + __IO uint16_t Reserve11; + __IO uint16_t HOST_SETUP; + __IO uint8_t HOST_EP_PID; + __IO uint8_t Reserve12; + __IO uint8_t Reserve13; + __IO uint8_t HOST_RX_CTRL; + __IO uint16_t HOST_TX_LEN; + __IO uint8_t HOST_TX_CTRL; + __IO uint8_t Reserve14; + __IO uint32_t Reserve15; + __IO uint32_t Reserve16; + __IO uint32_t Reserve17; + __IO uint32_t Reserve18; + __IO uint32_t Reserve19; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; +}USBFSH_TypeDef; + +/* Ethernet MAC */ +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1[2]; + __IO uint32_t MACSR; + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; + uint32_t RESERVED2[14]; + __IO uint32_t MACCFG0; + uint32_t RESERVED10[25]; + __IO uint32_t MMCCR; + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + uint32_t RESERVED8[567]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + uint32_t RESERVED9[9]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + + + +/* Peripheral memory map */ +#define FLASH_BASE ((uint32_t)0x08000000) /* FLASH base address in the alias region */ +#define SRAM_BASE ((uint32_t)0x20000000) /* SRAM base address in the alias region */ +#define PERIPH_BASE ((uint32_t)0x40000000) /* Peripheral base address in the alias region */ + +#define FSMC_R_BASE ((uint32_t)0xA0000000) /* FSMC registers base address */ + + +#define APB1PERIPH_BASE (PERIPH_BASE) +#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) +#define UART6_BASE (APB1PERIPH_BASE + 0x1800) +#define UART7_BASE (APB1PERIPH_BASE + 0x1C00) +#define UART8_BASE (APB1PERIPH_BASE + 0x2000) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) +#define BKP_BASE (APB1PERIPH_BASE + 0x6C00) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400) + +#define AFIO_BASE (APB2PERIPH_BASE + 0x0000) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2400) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2800) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800) +#define ADC3_BASE (APB2PERIPH_BASE + 0x3C00) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4C00) +#define TIM10_BASE (APB2PERIPH_BASE + 0x5000) +#define SDIO_BASE (APB2PERIPH_BASE + 0x8000) + +#define DMA1_BASE (AHBPERIPH_BASE + 0x0000) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x0008) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x001C) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x0030) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x0044) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x0058) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x006C) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x0080) +#define DMA2_BASE (AHBPERIPH_BASE + 0x0400) +#define DMA2_Channel1_BASE (AHBPERIPH_BASE + 0x0408) +#define DMA2_Channel2_BASE (AHBPERIPH_BASE + 0x041C) +#define DMA2_Channel3_BASE (AHBPERIPH_BASE + 0x0430) +#define DMA2_Channel4_BASE (AHBPERIPH_BASE + 0x0444) +#define DMA2_Channel5_BASE (AHBPERIPH_BASE + 0x0458) +#define DMA2_Channel6_BASE (AHBPERIPH_BASE + 0x046C) +#define DMA2_Channel7_BASE (AHBPERIPH_BASE + 0x0480) +#define DMA2_Channel8_BASE (AHBPERIPH_BASE + 0x0490) +#define DMA2_Channel9_BASE (AHBPERIPH_BASE + 0x04A0) +#define DMA2_Channel10_BASE (AHBPERIPH_BASE + 0x04B0) +#define DMA2_Channel11_BASE (AHBPERIPH_BASE + 0x04C0) +#define DMA2_EXTEN_BASE (AHBPERIPH_BASE + 0x04D0) +#define RCC_BASE (AHBPERIPH_BASE + 0x1000) +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x2000) +#define CRC_BASE (AHBPERIPH_BASE + 0x3000) +#define USBHS_BASE (AHBPERIPH_BASE + 0x3400) +#define EXTEN_BASE (AHBPERIPH_BASE + 0x3800) +#define OPA_BASE (AHBPERIPH_BASE + 0x3804) +#define RNG_BASE (AHBPERIPH_BASE + 0x3C00) + +#define ETH_BASE (AHBPERIPH_BASE + 0x8000) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100) +#define ETH_PTP_BASE (ETH_BASE + 0x0700) +#define ETH_DMA_BASE (ETH_BASE + 0x1000) + +#define USBFS_BASE ((uint32_t)0x50000000) +#define DVP_BASE ((uint32_t)0x50050000) + +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) +#define FSMC_Bank2_R_BASE (FSMC_R_BASE + 0x0060) + +#define OB_BASE ((uint32_t)0x1FFFF800) +#define FEATURE_SIGN ((uint32_t)0x1FFFF7D0) + +/* Peripheral declaration */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define UART6 ((USART_TypeDef *) UART6_BASE) +#define UART7 ((USART_TypeDef *) UART7_BASE) +#define UART8 ((USART_TypeDef *) UART8_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define BKP ((BKP_TypeDef *) BKP_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) + +#define AFIO ((AFIO_TypeDef *) AFIO_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define TKey1 ((ADC_TypeDef *) ADC1_BASE) +#define TKey2 ((ADC_TypeDef *) ADC2_BASE) +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) + +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_EXTEN ((DMA_TypeDef *) DMA2_EXTEN_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *) DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *) DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *) DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *) DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *) DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *) DMA1_Channel7_BASE) +#define DMA2_Channel1 ((DMA_Channel_TypeDef *) DMA2_Channel1_BASE) +#define DMA2_Channel2 ((DMA_Channel_TypeDef *) DMA2_Channel2_BASE) +#define DMA2_Channel3 ((DMA_Channel_TypeDef *) DMA2_Channel3_BASE) +#define DMA2_Channel4 ((DMA_Channel_TypeDef *) DMA2_Channel4_BASE) +#define DMA2_Channel5 ((DMA_Channel_TypeDef *) DMA2_Channel5_BASE) +#define DMA2_Channel6 ((DMA_Channel_TypeDef *) DMA2_Channel6_BASE) +#define DMA2_Channel7 ((DMA_Channel_TypeDef *) DMA2_Channel7_BASE) +#define DMA2_Channel8 ((DMA_Channel_TypeDef *) DMA2_Channel8_BASE) +#define DMA2_Channel9 ((DMA_Channel_TypeDef *) DMA2_Channel9_BASE) +#define DMA2_Channel10 ((DMA_Channel_TypeDef *) DMA2_Channel10_BASE) +#define DMA2_Channel11 ((DMA_Channel_TypeDef *) DMA2_Channel11_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define USBHSD ((USBHSD_TypeDef *) USBHS_BASE) +#define USBHSH ((USBHSH_TypeDef *) USBHS_BASE) +#define USBFSD ((USBFSD_TypeDef *)USBFS_BASE) +#define USBFSH ((USBFSH_TypeDef *)USBFS_BASE) +#define EXTEN ((EXTEN_TypeDef *) EXTEN_BASE) +#define OPA ((OPA_TypeDef *) OPA_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) + +#define DVP ((DVP_TypeDef *) DVP_BASE) + +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2 ((FSMC_Bank2_TypeDef *) FSMC_Bank2_R_BASE) + +#define OB ((OB_TypeDef *) OB_BASE) + +/******************************************************************************/ +/* Peripheral Registers Bits Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* Analog to Digital Converter */ +/******************************************************************************/ + +/******************** Bit definition for ADC_STATR register ********************/ +#define ADC_AWD ((uint8_t)0x01) /* Analog watchdog flag */ +#define ADC_EOC ((uint8_t)0x02) /* End of conversion */ +#define ADC_JEOC ((uint8_t)0x04) /* Injected channel end of conversion */ +#define ADC_JSTRT ((uint8_t)0x08) /* Injected channel Start flag */ +#define ADC_STRT ((uint8_t)0x10) /* Regular channel Start flag */ + +/******************* Bit definition for ADC_CTLR1 register ********************/ +#define ADC_AWDCH ((uint32_t)0x0000001F) /* AWDCH[4:0] bits (Analog watchdog channel select bits) */ +#define ADC_AWDCH_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_AWDCH_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_AWDCH_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_AWDCH_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_AWDCH_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_EOCIE ((uint32_t)0x00000020) /* Interrupt enable for EOC */ +#define ADC_AWDIE ((uint32_t)0x00000040) /* Analog Watchdog interrupt enable */ +#define ADC_JEOCIE ((uint32_t)0x00000080) /* Interrupt enable for injected channels */ +#define ADC_SCAN ((uint32_t)0x00000100) /* Scan mode */ +#define ADC_AWDSGL ((uint32_t)0x00000200) /* Enable the watchdog on a single channel in scan mode */ +#define ADC_JAUTO ((uint32_t)0x00000400) /* Automatic injected group conversion */ +#define ADC_DISCEN ((uint32_t)0x00000800) /* Discontinuous mode on regular channels */ +#define ADC_JDISCEN ((uint32_t)0x00001000) /* Discontinuous mode on injected channels */ + +#define ADC_DISCNUM ((uint32_t)0x0000E000) /* DISCNUM[2:0] bits (Discontinuous mode channel count) */ +#define ADC_DISCNUM_0 ((uint32_t)0x00002000) /* Bit 0 */ +#define ADC_DISCNUM_1 ((uint32_t)0x00004000) /* Bit 1 */ +#define ADC_DISCNUM_2 ((uint32_t)0x00008000) /* Bit 2 */ + +#define ADC_DUALMOD ((uint32_t)0x000F0000) /* DUALMOD[3:0] bits (Dual mode selection) */ +#define ADC_DUALMOD_0 ((uint32_t)0x00010000) /* Bit 0 */ +#define ADC_DUALMOD_1 ((uint32_t)0x00020000) /* Bit 1 */ +#define ADC_DUALMOD_2 ((uint32_t)0x00040000) /* Bit 2 */ +#define ADC_DUALMOD_3 ((uint32_t)0x00080000) /* Bit 3 */ + +#define ADC_JAWDEN ((uint32_t)0x00400000) /* Analog watchdog enable on injected channels */ +#define ADC_AWDEN ((uint32_t)0x00800000) /* Analog watchdog enable on regular channels */ + +#define ADC_TKENABLE ((uint32_t)0x01000000) /*TKEY enable*/ +#define ADC_TKITUNE ((uint32_t)0x02000000) +#define ADC_BUFEN ((uint32_t)0x04000000) + +#define ADC_PGA ((uint32_t)0x18000000) +#define ADC_PGA_0 ((uint32_t)0x08000000) +#define ADC_PGA_1 ((uint32_t)0x10000000) +/******************* Bit definition for ADC_CTLR2 register ********************/ +#define ADC_ADON ((uint32_t)0x00000001) /* A/D Converter ON / OFF */ +#define ADC_CONT ((uint32_t)0x00000002) /* Continuous Conversion */ +#define ADC_CAL ((uint32_t)0x00000004) /* A/D Calibration */ +#define ADC_RSTCAL ((uint32_t)0x00000008) /* Reset Calibration */ +#define ADC_DMA ((uint32_t)0x00000100) /* Direct Memory access mode */ +#define ADC_ALIGN ((uint32_t)0x00000800) /* Data Alignment */ + +#define ADC_JEXTSEL ((uint32_t)0x00007000) /* JEXTSEL[2:0] bits (External event select for injected group) */ +#define ADC_JEXTSEL_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define ADC_JEXTSEL_1 ((uint32_t)0x00002000) /* Bit 1 */ +#define ADC_JEXTSEL_2 ((uint32_t)0x00004000) /* Bit 2 */ + +#define ADC_JEXTTRIG ((uint32_t)0x00008000) /* External Trigger Conversion mode for injected channels */ + +#define ADC_EXTSEL ((uint32_t)0x000E0000) /* EXTSEL[2:0] bits (External Event Select for regular group) */ +#define ADC_EXTSEL_0 ((uint32_t)0x00020000) /* Bit 0 */ +#define ADC_EXTSEL_1 ((uint32_t)0x00040000) /* Bit 1 */ +#define ADC_EXTSEL_2 ((uint32_t)0x00080000) /* Bit 2 */ + +#define ADC_EXTTRIG ((uint32_t)0x00100000) /* External Trigger Conversion mode for regular channels */ +#define ADC_JSWSTART ((uint32_t)0x00200000) /* Start Conversion of injected channels */ +#define ADC_SWSTART ((uint32_t)0x00400000) /* Start Conversion of regular channels */ +#define ADC_TSVREFE ((uint32_t)0x00800000) /* Temperature Sensor and VREFINT Enable */ + +/****************** Bit definition for ADC_SAMPTR1 register *******************/ +#define ADC_SMP10 ((uint32_t)0x00000007) /* SMP10[2:0] bits (Channel 10 Sample time selection) */ +#define ADC_SMP10_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SMP10_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SMP10_2 ((uint32_t)0x00000004) /* Bit 2 */ + +#define ADC_SMP11 ((uint32_t)0x00000038) /* SMP11[2:0] bits (Channel 11 Sample time selection) */ +#define ADC_SMP11_0 ((uint32_t)0x00000008) /* Bit 0 */ +#define ADC_SMP11_1 ((uint32_t)0x00000010) /* Bit 1 */ +#define ADC_SMP11_2 ((uint32_t)0x00000020) /* Bit 2 */ + +#define ADC_SMP12 ((uint32_t)0x000001C0) /* SMP12[2:0] bits (Channel 12 Sample time selection) */ +#define ADC_SMP12_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define ADC_SMP12_1 ((uint32_t)0x00000080) /* Bit 1 */ +#define ADC_SMP12_2 ((uint32_t)0x00000100) /* Bit 2 */ + +#define ADC_SMP13 ((uint32_t)0x00000E00) /* SMP13[2:0] bits (Channel 13 Sample time selection) */ +#define ADC_SMP13_0 ((uint32_t)0x00000200) /* Bit 0 */ +#define ADC_SMP13_1 ((uint32_t)0x00000400) /* Bit 1 */ +#define ADC_SMP13_2 ((uint32_t)0x00000800) /* Bit 2 */ + +#define ADC_SMP14 ((uint32_t)0x00007000) /* SMP14[2:0] bits (Channel 14 Sample time selection) */ +#define ADC_SMP14_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define ADC_SMP14_1 ((uint32_t)0x00002000) /* Bit 1 */ +#define ADC_SMP14_2 ((uint32_t)0x00004000) /* Bit 2 */ + +#define ADC_SMP15 ((uint32_t)0x00038000) /* SMP15[2:0] bits (Channel 15 Sample time selection) */ +#define ADC_SMP15_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SMP15_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SMP15_2 ((uint32_t)0x00020000) /* Bit 2 */ + +#define ADC_SMP16 ((uint32_t)0x001C0000) /* SMP16[2:0] bits (Channel 16 Sample time selection) */ +#define ADC_SMP16_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define ADC_SMP16_1 ((uint32_t)0x00080000) /* Bit 1 */ +#define ADC_SMP16_2 ((uint32_t)0x00100000) /* Bit 2 */ + +#define ADC_SMP17 ((uint32_t)0x00E00000) /* SMP17[2:0] bits (Channel 17 Sample time selection) */ +#define ADC_SMP17_0 ((uint32_t)0x00200000) /* Bit 0 */ +#define ADC_SMP17_1 ((uint32_t)0x00400000) /* Bit 1 */ +#define ADC_SMP17_2 ((uint32_t)0x00800000) /* Bit 2 */ + +/****************** Bit definition for ADC_SAMPTR2 register *******************/ +#define ADC_SMP0 ((uint32_t)0x00000007) /* SMP0[2:0] bits (Channel 0 Sample time selection) */ +#define ADC_SMP0_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SMP0_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SMP0_2 ((uint32_t)0x00000004) /* Bit 2 */ + +#define ADC_SMP1 ((uint32_t)0x00000038) /* SMP1[2:0] bits (Channel 1 Sample time selection) */ +#define ADC_SMP1_0 ((uint32_t)0x00000008) /* Bit 0 */ +#define ADC_SMP1_1 ((uint32_t)0x00000010) /* Bit 1 */ +#define ADC_SMP1_2 ((uint32_t)0x00000020) /* Bit 2 */ + +#define ADC_SMP2 ((uint32_t)0x000001C0) /* SMP2[2:0] bits (Channel 2 Sample time selection) */ +#define ADC_SMP2_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define ADC_SMP2_1 ((uint32_t)0x00000080) /* Bit 1 */ +#define ADC_SMP2_2 ((uint32_t)0x00000100) /* Bit 2 */ + +#define ADC_SMP3 ((uint32_t)0x00000E00) /* SMP3[2:0] bits (Channel 3 Sample time selection) */ +#define ADC_SMP3_0 ((uint32_t)0x00000200) /* Bit 0 */ +#define ADC_SMP3_1 ((uint32_t)0x00000400) /* Bit 1 */ +#define ADC_SMP3_2 ((uint32_t)0x00000800) /* Bit 2 */ + +#define ADC_SMP4 ((uint32_t)0x00007000) /* SMP4[2:0] bits (Channel 4 Sample time selection) */ +#define ADC_SMP4_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define ADC_SMP4_1 ((uint32_t)0x00002000) /* Bit 1 */ +#define ADC_SMP4_2 ((uint32_t)0x00004000) /* Bit 2 */ + +#define ADC_SMP5 ((uint32_t)0x00038000) /* SMP5[2:0] bits (Channel 5 Sample time selection) */ +#define ADC_SMP5_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SMP5_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SMP5_2 ((uint32_t)0x00020000) /* Bit 2 */ + +#define ADC_SMP6 ((uint32_t)0x001C0000) /* SMP6[2:0] bits (Channel 6 Sample time selection) */ +#define ADC_SMP6_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define ADC_SMP6_1 ((uint32_t)0x00080000) /* Bit 1 */ +#define ADC_SMP6_2 ((uint32_t)0x00100000) /* Bit 2 */ + +#define ADC_SMP7 ((uint32_t)0x00E00000) /* SMP7[2:0] bits (Channel 7 Sample time selection) */ +#define ADC_SMP7_0 ((uint32_t)0x00200000) /* Bit 0 */ +#define ADC_SMP7_1 ((uint32_t)0x00400000) /* Bit 1 */ +#define ADC_SMP7_2 ((uint32_t)0x00800000) /* Bit 2 */ + +#define ADC_SMP8 ((uint32_t)0x07000000) /* SMP8[2:0] bits (Channel 8 Sample time selection) */ +#define ADC_SMP8_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define ADC_SMP8_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define ADC_SMP8_2 ((uint32_t)0x04000000) /* Bit 2 */ + +#define ADC_SMP9 ((uint32_t)0x38000000) /* SMP9[2:0] bits (Channel 9 Sample time selection) */ +#define ADC_SMP9_0 ((uint32_t)0x08000000) /* Bit 0 */ +#define ADC_SMP9_1 ((uint32_t)0x10000000) /* Bit 1 */ +#define ADC_SMP9_2 ((uint32_t)0x20000000) /* Bit 2 */ + +/****************** Bit definition for ADC_IOFR1 register *******************/ +#define ADC_JOFFSET1 ((uint16_t)0x0FFF) /* Data offset for injected channel 1 */ + +/****************** Bit definition for ADC_IOFR2 register *******************/ +#define ADC_JOFFSET2 ((uint16_t)0x0FFF) /* Data offset for injected channel 2 */ + +/****************** Bit definition for ADC_IOFR3 register *******************/ +#define ADC_JOFFSET3 ((uint16_t)0x0FFF) /* Data offset for injected channel 3 */ + +/****************** Bit definition for ADC_IOFR4 register *******************/ +#define ADC_JOFFSET4 ((uint16_t)0x0FFF) /* Data offset for injected channel 4 */ + +/******************* Bit definition for ADC_WDHTR register ********************/ +#define ADC_HT ((uint16_t)0x0FFF) /* Analog watchdog high threshold */ + +/******************* Bit definition for ADC_WDLTR register ********************/ +#define ADC_LT ((uint16_t)0x0FFF) /* Analog watchdog low threshold */ + +/******************* Bit definition for ADC_RSQR1 register *******************/ +#define ADC_SQ13 ((uint32_t)0x0000001F) /* SQ13[4:0] bits (13th conversion in regular sequence) */ +#define ADC_SQ13_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SQ13_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SQ13_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_SQ13_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_SQ13_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_SQ14 ((uint32_t)0x000003E0) /* SQ14[4:0] bits (14th conversion in regular sequence) */ +#define ADC_SQ14_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_SQ14_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_SQ14_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_SQ14_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_SQ14_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_SQ15 ((uint32_t)0x00007C00) /* SQ15[4:0] bits (15th conversion in regular sequence) */ +#define ADC_SQ15_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_SQ15_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_SQ15_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_SQ15_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_SQ15_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_SQ16 ((uint32_t)0x000F8000) /* SQ16[4:0] bits (16th conversion in regular sequence) */ +#define ADC_SQ16_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SQ16_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SQ16_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_SQ16_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_SQ16_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_L ((uint32_t)0x00F00000) /* L[3:0] bits (Regular channel sequence length) */ +#define ADC_L_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_L_1 ((uint32_t)0x00200000) /* Bit 1 */ +#define ADC_L_2 ((uint32_t)0x00400000) /* Bit 2 */ +#define ADC_L_3 ((uint32_t)0x00800000) /* Bit 3 */ + +/******************* Bit definition for ADC_RSQR2 register *******************/ +#define ADC_SQ7 ((uint32_t)0x0000001F) /* SQ7[4:0] bits (7th conversion in regular sequence) */ +#define ADC_SQ7_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SQ7_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SQ7_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_SQ7_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_SQ7_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_SQ8 ((uint32_t)0x000003E0) /* SQ8[4:0] bits (8th conversion in regular sequence) */ +#define ADC_SQ8_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_SQ8_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_SQ8_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_SQ8_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_SQ8_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_SQ9 ((uint32_t)0x00007C00) /* SQ9[4:0] bits (9th conversion in regular sequence) */ +#define ADC_SQ9_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_SQ9_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_SQ9_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_SQ9_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_SQ9_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_SQ10 ((uint32_t)0x000F8000) /* SQ10[4:0] bits (10th conversion in regular sequence) */ +#define ADC_SQ10_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SQ10_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SQ10_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_SQ10_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_SQ10_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_SQ11 ((uint32_t)0x01F00000) /* SQ11[4:0] bits (11th conversion in regular sequence) */ +#define ADC_SQ11_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_SQ11_1 ((uint32_t)0x00200000) /* Bit 1 */ +#define ADC_SQ11_2 ((uint32_t)0x00400000) /* Bit 2 */ +#define ADC_SQ11_3 ((uint32_t)0x00800000) /* Bit 3 */ +#define ADC_SQ11_4 ((uint32_t)0x01000000) /* Bit 4 */ + +#define ADC_SQ12 ((uint32_t)0x3E000000) /* SQ12[4:0] bits (12th conversion in regular sequence) */ +#define ADC_SQ12_0 ((uint32_t)0x02000000) /* Bit 0 */ +#define ADC_SQ12_1 ((uint32_t)0x04000000) /* Bit 1 */ +#define ADC_SQ12_2 ((uint32_t)0x08000000) /* Bit 2 */ +#define ADC_SQ12_3 ((uint32_t)0x10000000) /* Bit 3 */ +#define ADC_SQ12_4 ((uint32_t)0x20000000) /* Bit 4 */ + +/******************* Bit definition for ADC_RSQR3 register *******************/ +#define ADC_SQ1 ((uint32_t)0x0000001F) /* SQ1[4:0] bits (1st conversion in regular sequence) */ +#define ADC_SQ1_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_SQ1_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_SQ1_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_SQ1_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_SQ1_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_SQ2 ((uint32_t)0x000003E0) /* SQ2[4:0] bits (2nd conversion in regular sequence) */ +#define ADC_SQ2_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_SQ2_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_SQ2_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_SQ2_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_SQ2_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_SQ3 ((uint32_t)0x00007C00) /* SQ3[4:0] bits (3rd conversion in regular sequence) */ +#define ADC_SQ3_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_SQ3_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_SQ3_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_SQ3_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_SQ3_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_SQ4 ((uint32_t)0x000F8000) /* SQ4[4:0] bits (4th conversion in regular sequence) */ +#define ADC_SQ4_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_SQ4_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_SQ4_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_SQ4_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_SQ4_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_SQ5 ((uint32_t)0x01F00000) /* SQ5[4:0] bits (5th conversion in regular sequence) */ +#define ADC_SQ5_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_SQ5_1 ((uint32_t)0x00200000) /* Bit 1 */ +#define ADC_SQ5_2 ((uint32_t)0x00400000) /* Bit 2 */ +#define ADC_SQ5_3 ((uint32_t)0x00800000) /* Bit 3 */ +#define ADC_SQ5_4 ((uint32_t)0x01000000) /* Bit 4 */ + +#define ADC_SQ6 ((uint32_t)0x3E000000) /* SQ6[4:0] bits (6th conversion in regular sequence) */ +#define ADC_SQ6_0 ((uint32_t)0x02000000) /* Bit 0 */ +#define ADC_SQ6_1 ((uint32_t)0x04000000) /* Bit 1 */ +#define ADC_SQ6_2 ((uint32_t)0x08000000) /* Bit 2 */ +#define ADC_SQ6_3 ((uint32_t)0x10000000) /* Bit 3 */ +#define ADC_SQ6_4 ((uint32_t)0x20000000) /* Bit 4 */ + +/******************* Bit definition for ADC_ISQR register *******************/ +#define ADC_JSQ1 ((uint32_t)0x0000001F) /* JSQ1[4:0] bits (1st conversion in injected sequence) */ +#define ADC_JSQ1_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define ADC_JSQ1_1 ((uint32_t)0x00000002) /* Bit 1 */ +#define ADC_JSQ1_2 ((uint32_t)0x00000004) /* Bit 2 */ +#define ADC_JSQ1_3 ((uint32_t)0x00000008) /* Bit 3 */ +#define ADC_JSQ1_4 ((uint32_t)0x00000010) /* Bit 4 */ + +#define ADC_JSQ2 ((uint32_t)0x000003E0) /* JSQ2[4:0] bits (2nd conversion in injected sequence) */ +#define ADC_JSQ2_0 ((uint32_t)0x00000020) /* Bit 0 */ +#define ADC_JSQ2_1 ((uint32_t)0x00000040) /* Bit 1 */ +#define ADC_JSQ2_2 ((uint32_t)0x00000080) /* Bit 2 */ +#define ADC_JSQ2_3 ((uint32_t)0x00000100) /* Bit 3 */ +#define ADC_JSQ2_4 ((uint32_t)0x00000200) /* Bit 4 */ + +#define ADC_JSQ3 ((uint32_t)0x00007C00) /* JSQ3[4:0] bits (3rd conversion in injected sequence) */ +#define ADC_JSQ3_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define ADC_JSQ3_1 ((uint32_t)0x00000800) /* Bit 1 */ +#define ADC_JSQ3_2 ((uint32_t)0x00001000) /* Bit 2 */ +#define ADC_JSQ3_3 ((uint32_t)0x00002000) /* Bit 3 */ +#define ADC_JSQ3_4 ((uint32_t)0x00004000) /* Bit 4 */ + +#define ADC_JSQ4 ((uint32_t)0x000F8000) /* JSQ4[4:0] bits (4th conversion in injected sequence) */ +#define ADC_JSQ4_0 ((uint32_t)0x00008000) /* Bit 0 */ +#define ADC_JSQ4_1 ((uint32_t)0x00010000) /* Bit 1 */ +#define ADC_JSQ4_2 ((uint32_t)0x00020000) /* Bit 2 */ +#define ADC_JSQ4_3 ((uint32_t)0x00040000) /* Bit 3 */ +#define ADC_JSQ4_4 ((uint32_t)0x00080000) /* Bit 4 */ + +#define ADC_JL ((uint32_t)0x00300000) /* JL[1:0] bits (Injected Sequence length) */ +#define ADC_JL_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define ADC_JL_1 ((uint32_t)0x00200000) /* Bit 1 */ + +/******************* Bit definition for ADC_IDATAR1 register *******************/ +#define ADC_IDATAR1_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************* Bit definition for ADC_IDATAR2 register *******************/ +#define ADC_IDATAR2_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************* Bit definition for ADC_IDATAR3 register *******************/ +#define ADC_IDATAR3_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************* Bit definition for ADC_IDATAR4 register *******************/ +#define ADC_IDATAR4_JDATA ((uint16_t)0xFFFF) /* Injected data */ + +/******************** Bit definition for ADC_RDATAR register ********************/ +#define ADC_RDATAR_DATA ((uint32_t)0x0000FFFF) /* Regular data */ +#define ADC_RDATAR_ADC2DATA ((uint32_t)0xFFFF0000) /* ADC2 data */ + +/******************** Bit definition for ADC_AUX register ********************/ +#define ADC_SMP_SEL_0 ((uint32_t)0x00000001) /* channel_0 */ +#define ADC_SMP_SEL_1 ((uint32_t)0x00000002) /* channel_1 */ +#define ADC_SMP_SEL_2 ((uint32_t)0x00000004) /* channel_2 */ +#define ADC_SMP_SEL_3 ((uint32_t)0x00000008) /* channel_3 */ +#define ADC_SMP_SEL_4 ((uint32_t)0x00000010) /* channel_4 */ +#define ADC_SMP_SEL_5 ((uint32_t)0x00000020) /* channel_5 */ +#define ADC_SMP_SEL_6 ((uint32_t)0x00000040) /* channel_6 */ +#define ADC_SMP_SEL_7 ((uint32_t)0x00000080) /* channel_7 */ +#define ADC_SMP_SEL_8 ((uint32_t)0x00000100) /* channel_8 */ +#define ADC_SMP_SEL_9 ((uint32_t)0x00000200) /* channel_9 */ +#define ADC_SMP_SEL_10 ((uint32_t)0x00000400) /* channel_10 */ +#define ADC_SMP_SEL_11 ((uint32_t)0x00000800) /* channel_11 */ +#define ADC_SMP_SEL_12 ((uint32_t)0x00001000) /* channel_12 */ +#define ADC_SMP_SEL_13 ((uint32_t)0x00002000) /* channel_13 */ +#define ADC_SMP_SEL_14 ((uint32_t)0x00004000) /* channel_14 */ +#define ADC_SMP_SEL_15 ((uint32_t)0x00008000) /* channel_15 */ +#define ADC_SMP_SEL_16 ((uint32_t)0x00010000) /* channel_16 */ +#define ADC_SMP_SEL_17 ((uint32_t)0x00020000) /* channel_17 */ + +/******************************************************************************/ +/* Backup registers */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DATAR1 register ********************/ +#define BKP_DATAR1_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR2 register ********************/ +#define BKP_DATAR2_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR3 register ********************/ +#define BKP_DATAR3_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR4 register ********************/ +#define BKP_DATAR4_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR5 register ********************/ +#define BKP_DATAR5_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR6 register ********************/ +#define BKP_DATAR6_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR7 register ********************/ +#define BKP_DATAR7_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR8 register ********************/ +#define BKP_DATAR8_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR9 register ********************/ +#define BKP_DATAR9_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR10 register *******************/ +#define BKP_DATAR10_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR11 register *******************/ +#define BKP_DATAR11_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR12 register *******************/ +#define BKP_DATAR12_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR13 register *******************/ +#define BKP_DATAR13_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR14 register *******************/ +#define BKP_DATAR14_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR15 register *******************/ +#define BKP_DATAR15_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR16 register *******************/ +#define BKP_DATAR16_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR17 register *******************/ +#define BKP_DATAR17_D ((uint16_t)0xFFFF) /* Backup data */ + +/****************** Bit definition for BKP_DATAR18 register ********************/ +#define BKP_DATAR18_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR19 register *******************/ +#define BKP_DATAR19_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR20 register *******************/ +#define BKP_DATAR20_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR21 register *******************/ +#define BKP_DATAR21_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR22 register *******************/ +#define BKP_DATAR22_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR23 register *******************/ +#define BKP_DATAR23_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR24 register *******************/ +#define BKP_DATAR24_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR25 register *******************/ +#define BKP_DATAR25_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR26 register *******************/ +#define BKP_DATAR26_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR27 register *******************/ +#define BKP_DATAR27_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR28 register *******************/ +#define BKP_DATAR28_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR29 register *******************/ +#define BKP_DATAR29_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR30 register *******************/ +#define BKP_DATAR30_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR31 register *******************/ +#define BKP_DATAR31_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR32 register *******************/ +#define BKP_DATAR32_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR33 register *******************/ +#define BKP_DATAR33_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR34 register *******************/ +#define BKP_DATAR34_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR35 register *******************/ +#define BKP_DATAR35_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR36 register *******************/ +#define BKP_DATAR36_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR37 register *******************/ +#define BKP_DATAR37_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR38 register *******************/ +#define BKP_DATAR38_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR39 register *******************/ +#define BKP_DATAR39_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR40 register *******************/ +#define BKP_DATAR40_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR41 register *******************/ +#define BKP_DATAR41_D ((uint16_t)0xFFFF) /* Backup data */ + +/******************* Bit definition for BKP_DATAR42 register *******************/ +#define BKP_DATAR42_D ((uint16_t)0xFFFF) /* Backup data */ + +/****************** Bit definition for BKP_OCTLR register *******************/ +#define BKP_CAL ((uint16_t)0x007F) /* Calibration value */ +#define BKP_CCO ((uint16_t)0x0080) /* Calibration Clock Output */ +#define BKP_ASOE ((uint16_t)0x0100) /* Alarm or Second Output Enable */ +#define BKP_ASOS ((uint16_t)0x0200) /* Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_TPCTLR register ********************/ +#define BKP_TPE ((uint8_t)0x01) /* TAMPER pin enable */ +#define BKP_TPAL ((uint8_t)0x02) /* TAMPER pin active level */ + +/******************* Bit definition for BKP_TPCSR register ********************/ +#define BKP_CTE ((uint16_t)0x0001) /* Clear Tamper event */ +#define BKP_CTI ((uint16_t)0x0002) /* Clear Tamper Interrupt */ +#define BKP_TPIE ((uint16_t)0x0004) /* TAMPER Pin interrupt enable */ +#define BKP_TEF ((uint16_t)0x0100) /* Tamper Event Flag */ +#define BKP_TIF ((uint16_t)0x0200) /* Tamper Interrupt Flag */ + +/******************************************************************************/ +/* Controller Area Network */ +/******************************************************************************/ + +/******************* Bit definition for CAN_CTLR register ********************/ +#define CAN_CTLR_INRQ ((uint16_t)0x0001) /* Initialization Request */ +#define CAN_CTLR_SLEEP ((uint16_t)0x0002) /* Sleep Mode Request */ +#define CAN_CTLR_TXFP ((uint16_t)0x0004) /* Transmit FIFO Priority */ +#define CAN_CTLR_RFLM ((uint16_t)0x0008) /* Receive FIFO Locked Mode */ +#define CAN_CTLR_NART ((uint16_t)0x0010) /* No Automatic Retransmission */ +#define CAN_CTLR_AWUM ((uint16_t)0x0020) /* Automatic Wakeup Mode */ +#define CAN_CTLR_ABOM ((uint16_t)0x0040) /* Automatic Bus-Off Management */ +#define CAN_CTLR_TTCM ((uint16_t)0x0080) /* Time Triggered Communication Mode */ +#define CAN_CTLR_RESET ((uint16_t)0x8000) /* CAN software master reset */ +#define CAN_CTLR_DBF ((uint32_t)0x10000) + +/******************* Bit definition for CAN_STATR register ********************/ +#define CAN_STATR_INAK ((uint16_t)0x0001) /* Initialization Acknowledge */ +#define CAN_STATR_SLAK ((uint16_t)0x0002) /* Sleep Acknowledge */ +#define CAN_STATR_ERRI ((uint16_t)0x0004) /* Error Interrupt */ +#define CAN_STATR_WKUI ((uint16_t)0x0008) /* Wakeup Interrupt */ +#define CAN_STATR_SLAKI ((uint16_t)0x0010) /* Sleep Acknowledge Interrupt */ +#define CAN_STATR_TXM ((uint16_t)0x0100) /* Transmit Mode */ +#define CAN_STATR_RXM ((uint16_t)0x0200) /* Receive Mode */ +#define CAN_STATR_SAMP ((uint16_t)0x0400) /* Last Sample Point */ +#define CAN_STATR_RX ((uint16_t)0x0800) /* CAN Rx Signal */ + +/******************* Bit definition for CAN_TSTATR register ********************/ +#define CAN_TSTATR_RQCP0 ((uint32_t)0x00000001) /* Request Completed Mailbox0 */ +#define CAN_TSTATR_TXOK0 ((uint32_t)0x00000002) /* Transmission OK of Mailbox0 */ +#define CAN_TSTATR_ALST0 ((uint32_t)0x00000004) /* Arbitration Lost for Mailbox0 */ +#define CAN_TSTATR_TERR0 ((uint32_t)0x00000008) /* Transmission Error of Mailbox0 */ +#define CAN_TSTATR_ABRQ0 ((uint32_t)0x00000080) /* Abort Request for Mailbox0 */ +#define CAN_TSTATR_RQCP1 ((uint32_t)0x00000100) /* Request Completed Mailbox1 */ +#define CAN_TSTATR_TXOK1 ((uint32_t)0x00000200) /* Transmission OK of Mailbox1 */ +#define CAN_TSTATR_ALST1 ((uint32_t)0x00000400) /* Arbitration Lost for Mailbox1 */ +#define CAN_TSTATR_TERR1 ((uint32_t)0x00000800) /* Transmission Error of Mailbox1 */ +#define CAN_TSTATR_ABRQ1 ((uint32_t)0x00008000) /* Abort Request for Mailbox 1 */ +#define CAN_TSTATR_RQCP2 ((uint32_t)0x00010000) /* Request Completed Mailbox2 */ +#define CAN_TSTATR_TXOK2 ((uint32_t)0x00020000) /* Transmission OK of Mailbox 2 */ +#define CAN_TSTATR_ALST2 ((uint32_t)0x00040000) /* Arbitration Lost for mailbox 2 */ +#define CAN_TSTATR_TERR2 ((uint32_t)0x00080000) /* Transmission Error of Mailbox 2 */ +#define CAN_TSTATR_ABRQ2 ((uint32_t)0x00800000) /* Abort Request for Mailbox 2 */ +#define CAN_TSTATR_CODE ((uint32_t)0x03000000) /* Mailbox Code */ + +#define CAN_TSTATR_TME ((uint32_t)0x1C000000) /* TME[2:0] bits */ +#define CAN_TSTATR_TME0 ((uint32_t)0x04000000) /* Transmit Mailbox 0 Empty */ +#define CAN_TSTATR_TME1 ((uint32_t)0x08000000) /* Transmit Mailbox 1 Empty */ +#define CAN_TSTATR_TME2 ((uint32_t)0x10000000) /* Transmit Mailbox 2 Empty */ + +#define CAN_TSTATR_LOW ((uint32_t)0xE0000000) /* LOW[2:0] bits */ +#define CAN_TSTATR_LOW0 ((uint32_t)0x20000000) /* Lowest Priority Flag for Mailbox 0 */ +#define CAN_TSTATR_LOW1 ((uint32_t)0x40000000) /* Lowest Priority Flag for Mailbox 1 */ +#define CAN_TSTATR_LOW2 ((uint32_t)0x80000000) /* Lowest Priority Flag for Mailbox 2 */ + +/******************* Bit definition for CAN_RFIFO0 register *******************/ +#define CAN_RFIFO0_FMP0 ((uint8_t)0x03) /* FIFO 0 Message Pending */ +#define CAN_RFIFO0_FULL0 ((uint8_t)0x08) /* FIFO 0 Full */ +#define CAN_RFIFO0_FOVR0 ((uint8_t)0x10) /* FIFO 0 Overrun */ +#define CAN_RFIFO0_RFOM0 ((uint8_t)0x20) /* Release FIFO 0 Output Mailbox */ + +/******************* Bit definition for CAN_RFIFO1 register *******************/ +#define CAN_RFIFO1_FMP1 ((uint8_t)0x03) /* FIFO 1 Message Pending */ +#define CAN_RFIFO1_FULL1 ((uint8_t)0x08) /* FIFO 1 Full */ +#define CAN_RFIFO1_FOVR1 ((uint8_t)0x10) /* FIFO 1 Overrun */ +#define CAN_RFIFO1_RFOM1 ((uint8_t)0x20) /* Release FIFO 1 Output Mailbox */ + +/******************** Bit definition for CAN_INTENR register *******************/ +#define CAN_INTENR_TMEIE ((uint32_t)0x00000001) /* Transmit Mailbox Empty Interrupt Enable */ +#define CAN_INTENR_FMPIE0 ((uint32_t)0x00000002) /* FIFO Message Pending Interrupt Enable */ +#define CAN_INTENR_FFIE0 ((uint32_t)0x00000004) /* FIFO Full Interrupt Enable */ +#define CAN_INTENR_FOVIE0 ((uint32_t)0x00000008) /* FIFO Overrun Interrupt Enable */ +#define CAN_INTENR_FMPIE1 ((uint32_t)0x00000010) /* FIFO Message Pending Interrupt Enable */ +#define CAN_INTENR_FFIE1 ((uint32_t)0x00000020) /* FIFO Full Interrupt Enable */ +#define CAN_INTENR_FOVIE1 ((uint32_t)0x00000040) /* FIFO Overrun Interrupt Enable */ +#define CAN_INTENR_EWGIE ((uint32_t)0x00000100) /* Error Warning Interrupt Enable */ +#define CAN_INTENR_EPVIE ((uint32_t)0x00000200) /* Error Passive Interrupt Enable */ +#define CAN_INTENR_BOFIE ((uint32_t)0x00000400) /* Bus-Off Interrupt Enable */ +#define CAN_INTENR_LECIE ((uint32_t)0x00000800) /* Last Error Code Interrupt Enable */ +#define CAN_INTENR_ERRIE ((uint32_t)0x00008000) /* Error Interrupt Enable */ +#define CAN_INTENR_WKUIE ((uint32_t)0x00010000) /* Wakeup Interrupt Enable */ +#define CAN_INTENR_SLKIE ((uint32_t)0x00020000) /* Sleep Interrupt Enable */ + +/******************** Bit definition for CAN_ERRSR register *******************/ +#define CAN_ERRSR_EWGF ((uint32_t)0x00000001) /* Error Warning Flag */ +#define CAN_ERRSR_EPVF ((uint32_t)0x00000002) /* Error Passive Flag */ +#define CAN_ERRSR_BOFF ((uint32_t)0x00000004) /* Bus-Off Flag */ + +#define CAN_ERRSR_LEC ((uint32_t)0x00000070) /* LEC[2:0] bits (Last Error Code) */ +#define CAN_ERRSR_LEC_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define CAN_ERRSR_LEC_1 ((uint32_t)0x00000020) /* Bit 1 */ +#define CAN_ERRSR_LEC_2 ((uint32_t)0x00000040) /* Bit 2 */ + +#define CAN_ERRSR_TEC ((uint32_t)0x00FF0000) /* Least significant byte of the 9-bit Transmit Error Counter */ +#define CAN_ERRSR_REC ((uint32_t)0xFF000000) /* Receive Error Counter */ + +/******************* Bit definition for CAN_TTCTLR register ********************/ +#define CAN_TTCTLR_TIMCMV ((uint32_t)0x0000FFFF) +#define CAN_TTCTLR_TIMRST ((uint32_t)0x00010000) +#define CAN_TTCTLR_MODE ((uint32_t)0x00020000) + +/******************* Bit definition for CAN_TTCNT register ********************/ +#define CAN_TTCNT_TIMCNT ((uint32_t)0x0000FFFF) + +/****************** Bit definition for CAN_TXMI0R register ********************/ +#define CAN_TXMI0R_TXRQ ((uint32_t)0x00000001) /* Transmit Mailbox Request */ +#define CAN_TXMI0R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_TXMI0R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_TXMI0R_EXID ((uint32_t)0x001FFFF8) /* Extended Identifier */ +#define CAN_TXMI0R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/****************** Bit definition for CAN_TXMDT0R register *******************/ +#define CAN_TXMDT0R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_TXMDT0R_TGT ((uint32_t)0x00000100) /* Transmit Global Time */ +#define CAN_TXMDT0R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/****************** Bit definition for CAN_TXMDL0R register *******************/ +#define CAN_TXMDL0R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_TXMDL0R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_TXMDL0R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_TXMDL0R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/****************** Bit definition for CAN_TXMDH0R register *******************/ +#define CAN_TXMDH0R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_TXMDH0R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_TXMDH0R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_TXMDH0R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_TXMI1R register *******************/ +#define CAN_TXMI1R_TXRQ ((uint32_t)0x00000001) /* Transmit Mailbox Request */ +#define CAN_TXMI1R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_TXMI1R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_TXMI1R_EXID ((uint32_t)0x001FFFF8) /* Extended Identifier */ +#define CAN_TXMI1R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TXMDT1R register ******************/ +#define CAN_TXMDT1R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_TXMDT1R_TGT ((uint32_t)0x00000100) /* Transmit Global Time */ +#define CAN_TXMDT1R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_TXMDL1R register ******************/ +#define CAN_TXMDL1R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_TXMDL1R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_TXMDL1R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_TXMDL1R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_TXMDH1R register ******************/ +#define CAN_TXMDH1R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_TXMDH1R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_TXMDH1R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_TXMDH1R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_TXMI2R register *******************/ +#define CAN_TXMI2R_TXRQ ((uint32_t)0x00000001) /* Transmit Mailbox Request */ +#define CAN_TXMI2R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_TXMI2R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_TXMI2R_EXID ((uint32_t)0x001FFFF8) /* Extended identifier */ +#define CAN_TXMI2R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_TXMDT2R register ******************/ +#define CAN_TXMDT2R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_TXMDT2R_TGT ((uint32_t)0x00000100) /* Transmit Global Time */ +#define CAN_TXMDT2R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_TXMDL2R register ******************/ +#define CAN_TXMDL2R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_TXMDL2R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_TXMDL2R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_TXMDL2R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_TXMDH2R register ******************/ +#define CAN_TXMDH2R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_TXMDH2R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_TXMDH2R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_TXMDH2R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_RXMI0R register *******************/ +#define CAN_RXMI0R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_RXMI0R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_RXMI0R_EXID ((uint32_t)0x001FFFF8) /* Extended Identifier */ +#define CAN_RXMI0R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RXMDT0R register ******************/ +#define CAN_RXMDT0R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_RXMDT0R_FMI ((uint32_t)0x0000FF00) /* Filter Match Index */ +#define CAN_RXMDT0R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_RXMDL0R register ******************/ +#define CAN_RXMDL0R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_RXMDL0R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_RXMDL0R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_RXMDL0R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_RXMDH0R register ******************/ +#define CAN_RXMDH0R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_RXMDH0R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_RXMDH0R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_RXMDH0R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_RXMI1R register *******************/ +#define CAN_RXMI1R_RTR ((uint32_t)0x00000002) /* Remote Transmission Request */ +#define CAN_RXMI1R_IDE ((uint32_t)0x00000004) /* Identifier Extension */ +#define CAN_RXMI1R_EXID ((uint32_t)0x001FFFF8) /* Extended identifier */ +#define CAN_RXMI1R_STID ((uint32_t)0xFFE00000) /* Standard Identifier or Extended Identifier */ + +/******************* Bit definition for CAN_RXMDT1R register ******************/ +#define CAN_RXMDT1R_DLC ((uint32_t)0x0000000F) /* Data Length Code */ +#define CAN_RXMDT1R_FMI ((uint32_t)0x0000FF00) /* Filter Match Index */ +#define CAN_RXMDT1R_TIME ((uint32_t)0xFFFF0000) /* Message Time Stamp */ + +/******************* Bit definition for CAN_RXMDL1R register ******************/ +#define CAN_RXMDL1R_DATA0 ((uint32_t)0x000000FF) /* Data byte 0 */ +#define CAN_RXMDL1R_DATA1 ((uint32_t)0x0000FF00) /* Data byte 1 */ +#define CAN_RXMDL1R_DATA2 ((uint32_t)0x00FF0000) /* Data byte 2 */ +#define CAN_RXMDL1R_DATA3 ((uint32_t)0xFF000000) /* Data byte 3 */ + +/******************* Bit definition for CAN_RXMDH1R register ******************/ +#define CAN_RXMDH1R_DATA4 ((uint32_t)0x000000FF) /* Data byte 4 */ +#define CAN_RXMDH1R_DATA5 ((uint32_t)0x0000FF00) /* Data byte 5 */ +#define CAN_RXMDH1R_DATA6 ((uint32_t)0x00FF0000) /* Data byte 6 */ +#define CAN_RXMDH1R_DATA7 ((uint32_t)0xFF000000) /* Data byte 7 */ + +/******************* Bit definition for CAN_FCTLR register ********************/ +#define CAN_FCTLR_FINIT ((uint8_t)0x01) /* Filter Init Mode */ +#define CAN_FCTLR_CAN2SB ((uint16_t)0x3F00) + +/******************* Bit definition for CAN_FMCFGR register *******************/ +#define CAN_FMCFGR_FBM ((uint16_t)0x3FFF) /* Filter Mode */ +#define CAN_FMCFGR_FBM0 ((uint16_t)0x0001) /* Filter Init Mode bit 0 */ +#define CAN_FMCFGR_FBM1 ((uint16_t)0x0002) /* Filter Init Mode bit 1 */ +#define CAN_FMCFGR_FBM2 ((uint16_t)0x0004) /* Filter Init Mode bit 2 */ +#define CAN_FMCFGR_FBM3 ((uint16_t)0x0008) /* Filter Init Mode bit 3 */ +#define CAN_FMCFGR_FBM4 ((uint16_t)0x0010) /* Filter Init Mode bit 4 */ +#define CAN_FMCFGR_FBM5 ((uint16_t)0x0020) /* Filter Init Mode bit 5 */ +#define CAN_FMCFGR_FBM6 ((uint16_t)0x0040) /* Filter Init Mode bit 6 */ +#define CAN_FMCFGR_FBM7 ((uint16_t)0x0080) /* Filter Init Mode bit 7 */ +#define CAN_FMCFGR_FBM8 ((uint16_t)0x0100) /* Filter Init Mode bit 8 */ +#define CAN_FMCFGR_FBM9 ((uint16_t)0x0200) /* Filter Init Mode bit 9 */ +#define CAN_FMCFGR_FBM10 ((uint16_t)0x0400) /* Filter Init Mode bit 10 */ +#define CAN_FMCFGR_FBM11 ((uint16_t)0x0800) /* Filter Init Mode bit 11 */ +#define CAN_FMCFGR_FBM12 ((uint16_t)0x1000) /* Filter Init Mode bit 12 */ +#define CAN_FMCFGR_FBM13 ((uint16_t)0x2000) /* Filter Init Mode bit 13 */ +#define CAN_FMCFGR_FBM14 ((uint16_t)0x4000) /* Filter Init Mode bit 14 */ +#define CAN_FMCFGR_FBM15 ((uint16_t)0x8000) /* Filter Init Mode bit 15 */ +#define CAN_FMCFGR_FBM16 ((uint32_t)0x10000) /* Filter Init Mode bit 16 */ +#define CAN_FMCFGR_FBM17 ((uint32_t)0x20000) /* Filter Init Mode bit 17 */ +#define CAN_FMCFGR_FBM18 ((uint32_t)0x40000) /* Filter Init Mode bit 18 */ +#define CAN_FMCFGR_FBM19 ((uint32_t)0x80000) /* Filter Init Mode bit 19 */ +#define CAN_FMCFGR_FBM20 ((uint32_t)0x100000) /* Filter Init Mode bit 20 */ +#define CAN_FMCFGR_FBM21 ((uint32_t)0x200000) /* Filter Init Mode bit 21 */ +#define CAN_FMCFGR_FBM22 ((uint32_t)0x400000) /* Filter Init Mode bit 22 */ +#define CAN_FMCFGR_FBM23 ((uint32_t)0x800000) /* Filter Init Mode bit 23 */ +#define CAN_FMCFGR_FBM24 ((uint32_t)0x1000000) /* Filter Init Mode bit 24 */ +#define CAN_FMCFGR_FBM25 ((uint32_t)0x2000000) /* Filter Init Mode bit 25 */ +#define CAN_FMCFGR_FBM26 ((uint32_t)0x4000000) /* Filter Init Mode bit 26 */ +#define CAN_FMCFGR_FBM27 ((uint32_t)0x8000000) /* Filter Init Mode bit 27 */ + +/******************* Bit definition for CAN_FSCFGR register *******************/ +#define CAN_FSCFGR_FSC ((uint16_t)0x3FFF) /* Filter Scale Configuration */ +#define CAN_FSCFGR_FSC0 ((uint16_t)0x0001) /* Filter Scale Configuration bit 0 */ +#define CAN_FSCFGR_FSC1 ((uint16_t)0x0002) /* Filter Scale Configuration bit 1 */ +#define CAN_FSCFGR_FSC2 ((uint16_t)0x0004) /* Filter Scale Configuration bit 2 */ +#define CAN_FSCFGR_FSC3 ((uint16_t)0x0008) /* Filter Scale Configuration bit 3 */ +#define CAN_FSCFGR_FSC4 ((uint16_t)0x0010) /* Filter Scale Configuration bit 4 */ +#define CAN_FSCFGR_FSC5 ((uint16_t)0x0020) /* Filter Scale Configuration bit 5 */ +#define CAN_FSCFGR_FSC6 ((uint16_t)0x0040) /* Filter Scale Configuration bit 6 */ +#define CAN_FSCFGR_FSC7 ((uint16_t)0x0080) /* Filter Scale Configuration bit 7 */ +#define CAN_FSCFGR_FSC8 ((uint16_t)0x0100) /* Filter Scale Configuration bit 8 */ +#define CAN_FSCFGR_FSC9 ((uint16_t)0x0200) /* Filter Scale Configuration bit 9 */ +#define CAN_FSCFGR_FSC10 ((uint16_t)0x0400) /* Filter Scale Configuration bit 10 */ +#define CAN_FSCFGR_FSC11 ((uint16_t)0x0800) /* Filter Scale Configuration bit 11 */ +#define CAN_FSCFGR_FSC12 ((uint16_t)0x1000) /* Filter Scale Configuration bit 12 */ +#define CAN_FSCFGR_FSC13 ((uint16_t)0x2000) /* Filter Scale Configuration bit 13 */ +#define CAN_FSCFGR_FSC14 ((uint16_t)0x4000) /* Filter Scale Configuration bit 14 */ +#define CAN_FSCFGR_FSC15 ((uint16_t)0x8000) /* Filter Scale Configuration bit 15 */ +#define CAN_FSCFGR_FSC16 ((uint32_t)0x10000) /* Filter Scale Configuration bit 16 */ +#define CAN_FSCFGR_FSC17 ((uint32_t)0x20000) /* Filter Scale Configuration bit 17 */ +#define CAN_FSCFGR_FSC18 ((uint32_t)0x40000) /* Filter Scale Configuration bit 18 */ +#define CAN_FSCFGR_FSC19 ((uint32_t)0x80000) /* Filter Scale Configuration bit 19 */ +#define CAN_FSCFGR_FSC20 ((uint32_t)0x100000) /* Filter Scale Configuration bit 20 */ +#define CAN_FSCFGR_FSC21 ((uint32_t)0x200000) /* Filter Scale Configuration bit 21 */ +#define CAN_FSCFGR_FSC22 ((uint32_t)0x400000) /* Filter Scale Configuration bit 22 */ +#define CAN_FSCFGR_FSC23 ((uint32_t)0x800000) /* Filter Scale Configuration bit 23 */ +#define CAN_FSCFGR_FSC24 ((uint32_t)0x1000000) /* Filter Scale Configuration bit 24 */ +#define CAN_FSCFGR_FSC25 ((uint32_t)0x2000000) /* Filter Scale Configuration bit 25 */ +#define CAN_FSCFGR_FSC26 ((uint32_t)0x4000000) /* Filter Scale Configuration bit 26 */ +#define CAN_FSCFGR_FSC27 ((uint32_t)0x8000000) /* Filter Scale Configuration bit 27 */ + +/****************** Bit definition for CAN_FAFIFOR register *******************/ +#define CAN_FAFIFOR_FFA ((uint16_t)0x3FFF) /* Filter FIFO Assignment */ +#define CAN_FAFIFOR_FFA0 ((uint16_t)0x0001) /* Filter FIFO Assignment for Filter 0 */ +#define CAN_FAFIFOR_FFA1 ((uint16_t)0x0002) /* Filter FIFO Assignment for Filter 1 */ +#define CAN_FAFIFOR_FFA2 ((uint16_t)0x0004) /* Filter FIFO Assignment for Filter 2 */ +#define CAN_FAFIFOR_FFA3 ((uint16_t)0x0008) /* Filter FIFO Assignment for Filter 3 */ +#define CAN_FAFIFOR_FFA4 ((uint16_t)0x0010) /* Filter FIFO Assignment for Filter 4 */ +#define CAN_FAFIFOR_FFA5 ((uint16_t)0x0020) /* Filter FIFO Assignment for Filter 5 */ +#define CAN_FAFIFOR_FFA6 ((uint16_t)0x0040) /* Filter FIFO Assignment for Filter 6 */ +#define CAN_FAFIFOR_FFA7 ((uint16_t)0x0080) /* Filter FIFO Assignment for Filter 7 */ +#define CAN_FAFIFOR_FFA8 ((uint16_t)0x0100) /* Filter FIFO Assignment for Filter 8 */ +#define CAN_FAFIFOR_FFA9 ((uint16_t)0x0200) /* Filter FIFO Assignment for Filter 9 */ +#define CAN_FAFIFOR_FFA10 ((uint16_t)0x0400) /* Filter FIFO Assignment for Filter 10 */ +#define CAN_FAFIFOR_FFA11 ((uint16_t)0x0800) /* Filter FIFO Assignment for Filter 11 */ +#define CAN_FAFIFOR_FFA12 ((uint16_t)0x1000) /* Filter FIFO Assignment for Filter 12 */ +#define CAN_FAFIFOR_FFA13 ((uint16_t)0x2000) /* Filter FIFO Assignment for Filter 13 */ +#define CAN_FAFIFOR_FFA14 ((uint32_t)0x4000) /* Filter FIFO Assignment for Filter 14 */ +#define CAN_FAFIFOR_FFA15 ((uint32_t)0x8000) /* Filter FIFO Assignment for Filter 15 */ +#define CAN_FAFIFOR_FFA16 ((uint32_t)0x10000) /* Filter FIFO Assignment for Filter 16 */ +#define CAN_FAFIFOR_FFA17 ((uint32_t)0x20000) /* Filter FIFO Assignment for Filter 17 */ +#define CAN_FAFIFOR_FFA18 ((uint32_t)0x40000) /* Filter FIFO Assignment for Filter 18 */ +#define CAN_FAFIFOR_FFA19 ((uint32_t)0x80000) /* Filter FIFO Assignment for Filter 19 */ +#define CAN_FAFIFOR_FFA20 ((uint32_t)0x100000) /* Filter FIFO Assignment for Filter 20 */ +#define CAN_FAFIFOR_FFA21 ((uint32_t)0x200000) /* Filter FIFO Assignment for Filter 21 */ +#define CAN_FAFIFOR_FFA22 ((uint32_t)0x400000) /* Filter FIFO Assignment for Filter 22 */ +#define CAN_FAFIFOR_FFA23 ((uint32_t)0x800000) /* Filter FIFO Assignment for Filter 23 */ +#define CAN_FAFIFOR_FFA24 ((uint32_t)0x1000000) /* Filter FIFO Assignment for Filter 24 */ +#define CAN_FAFIFOR_FFA25 ((uint32_t)0x2000000) /* Filter FIFO Assignment for Filter 25 */ +#define CAN_FAFIFOR_FFA26 ((uint32_t)0x4000000) /* Filter FIFO Assignment for Filter 26 */ +#define CAN_FAFIFOR_FFA27 ((uint32_t)0x8000000) /* Filter FIFO Assignment for Filter 27 */ + +/******************* Bit definition for CAN_FWR register *******************/ +#define CAN_FWR_FACT ((uint16_t)0x3FFF) /* Filter Active */ +#define CAN_FWR_FACT0 ((uint16_t)0x0001) /* Filter 0 Active */ +#define CAN_FWR_FACT1 ((uint16_t)0x0002) /* Filter 1 Active */ +#define CAN_FWR_FACT2 ((uint16_t)0x0004) /* Filter 2 Active */ +#define CAN_FWR_FACT3 ((uint16_t)0x0008) /* Filter 3 Active */ +#define CAN_FWR_FACT4 ((uint16_t)0x0010) /* Filter 4 Active */ +#define CAN_FWR_FACT5 ((uint16_t)0x0020) /* Filter 5 Active */ +#define CAN_FWR_FACT6 ((uint16_t)0x0040) /* Filter 6 Active */ +#define CAN_FWR_FACT7 ((uint16_t)0x0080) /* Filter 7 Active */ +#define CAN_FWR_FACT8 ((uint16_t)0x0100) /* Filter 8 Active */ +#define CAN_FWR_FACT9 ((uint16_t)0x0200) /* Filter 9 Active */ +#define CAN_FWR_FACT10 ((uint16_t)0x0400) /* Filter 10 Active */ +#define CAN_FWR_FACT11 ((uint16_t)0x0800) /* Filter 11 Active */ +#define CAN_FWR_FACT12 ((uint16_t)0x1000) /* Filter 12 Active */ +#define CAN_FWR_FACT13 ((uint16_t)0x2000) /* Filter 13 Active */ +#define CAN_FWR_FACT14 ((uint16_t)0x4000) /* Filter 14 Active */ +#define CAN_FWR_FACT15 ((uint16_t)0x8000) /* Filter 15 Active */ +#define CAN_FWR_FACT16 ((uint32_t)0x10000) /* Filter 16 Active */ +#define CAN_FWR_FACT17 ((uint32_t)0x20000) /* Filter 17 Active */ +#define CAN_FWR_FACT18 ((uint32_t)0x40000) /* Filter 18 Active */ +#define CAN_FWR_FACT19 ((uint32_t)0x80000) /* Filter 19 Active */ +#define CAN_FWR_FACT20 ((uint32_t)0x100000) /* Filter 20 Active */ +#define CAN_FWR_FACT21 ((uint32_t)0x200000) /* Filter 21 Active */ +#define CAN_FWR_FACT22 ((uint32_t)0x400000) /* Filter 22 Active */ +#define CAN_FWR_FACT23 ((uint32_t)0x800000) /* Filter 23 Active */ +#define CAN_FWR_FACT24 ((uint32_t)0x1000000) /* Filter 24 Active */ +#define CAN_FWR_FACT25 ((uint32_t)0x2000000) /* Filter 25 Active */ +#define CAN_FWR_FACT26 ((uint32_t)0x4000000) /* Filter 26 Active */ +#define CAN_FWR_FACT27 ((uint32_t)0x8000000) /* Filter 27 Active */ + +/******************* Bit definition for CAN_F0R1 register *******************/ +#define CAN_F0R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F0R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F0R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F0R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F0R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F0R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F0R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F0R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F0R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F0R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F0R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F0R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F0R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F0R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F0R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F0R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F0R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F0R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F0R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F0R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F0R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F0R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F0R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F0R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F0R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F0R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F0R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F0R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F0R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F0R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F0R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F0R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F1R1 register *******************/ +#define CAN_F1R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F1R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F1R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F1R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F1R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F1R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F1R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F1R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F1R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F1R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F1R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F1R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F1R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F1R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F1R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F1R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F1R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F1R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F1R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F1R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F1R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F1R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F1R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F1R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F1R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F1R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F1R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F1R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F1R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F1R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F1R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F1R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F2R1 register *******************/ +#define CAN_F2R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F2R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F2R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F2R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F2R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F2R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F2R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F2R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F2R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F2R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F2R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F2R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F2R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F2R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F2R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F2R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F2R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F2R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F2R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F2R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F2R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F2R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F2R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F2R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F2R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F2R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F2R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F2R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F2R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F2R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F2R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F2R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F3R1 register *******************/ +#define CAN_F3R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F3R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F3R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F3R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F3R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F3R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F3R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F3R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F3R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F3R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F3R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F3R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F3R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F3R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F3R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F3R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F3R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F3R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F3R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F3R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F3R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F3R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F3R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F3R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F3R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F3R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F3R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F3R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F3R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F3R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F3R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F3R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F4R1 register *******************/ +#define CAN_F4R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F4R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F4R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F4R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F4R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F4R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F4R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F4R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F4R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F4R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F4R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F4R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F4R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F4R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F4R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F4R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F4R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F4R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F4R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F4R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F4R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F4R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F4R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F4R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F4R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F4R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F4R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F4R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F4R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F4R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F4R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F4R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F5R1 register *******************/ +#define CAN_F5R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F5R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F5R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F5R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F5R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F5R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F5R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F5R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F5R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F5R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F5R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F5R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F5R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F5R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F5R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F5R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F5R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F5R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F5R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F5R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F5R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F5R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F5R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F5R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F5R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F5R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F5R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F5R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F5R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F5R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F5R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F5R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F6R1 register *******************/ +#define CAN_F6R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F6R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F6R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F6R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F6R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F6R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F6R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F6R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F6R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F6R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F6R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F6R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F6R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F6R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F6R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F6R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F6R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F6R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F6R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F6R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F6R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F6R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F6R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F6R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F6R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F6R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F6R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F6R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F6R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F6R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F6R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F6R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F7R1 register *******************/ +#define CAN_F7R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F7R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F7R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F7R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F7R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F7R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F7R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F7R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F7R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F7R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F7R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F7R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F7R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F7R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F7R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F7R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F7R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F7R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F7R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F7R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F7R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F7R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F7R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F7R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F7R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F7R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F7R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F7R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F7R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F7R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F7R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F7R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F8R1 register *******************/ +#define CAN_F8R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F8R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F8R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F8R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F8R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F8R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F8R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F8R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F8R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F8R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F8R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F8R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F8R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F8R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F8R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F8R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F8R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F8R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F8R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F8R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F8R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F8R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F8R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F8R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F8R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F8R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F8R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F8R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F8R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F8R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F8R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F8R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F9R1 register *******************/ +#define CAN_F9R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F9R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F9R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F9R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F9R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F9R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F9R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F9R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F9R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F9R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F9R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F9R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F9R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F9R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F9R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F9R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F9R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F9R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F9R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F9R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F9R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F9R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F9R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F9R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F9R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F9R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F9R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F9R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F9R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F9R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F9R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F9R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F10R1 register ******************/ +#define CAN_F10R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F10R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F10R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F10R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F10R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F10R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F10R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F10R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F10R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F10R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F10R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F10R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F10R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F10R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F10R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F10R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F10R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F10R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F10R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F10R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F10R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F10R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F10R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F10R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F10R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F10R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F10R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F10R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F10R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F10R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F10R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F10R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F11R1 register ******************/ +#define CAN_F11R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F11R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F11R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F11R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F11R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F11R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F11R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F11R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F11R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F11R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F11R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F11R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F11R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F11R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F11R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F11R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F11R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F11R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F11R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F11R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F11R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F11R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F11R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F11R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F11R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F11R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F11R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F11R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F11R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F11R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F11R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F11R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F12R1 register ******************/ +#define CAN_F12R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F12R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F12R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F12R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F12R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F12R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F12R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F12R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F12R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F12R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F12R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F12R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F12R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F12R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F12R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F12R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F12R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F12R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F12R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F12R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F12R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F12R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F12R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F12R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F12R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F12R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F12R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F12R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F12R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F12R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F12R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F12R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F13R1 register ******************/ +#define CAN_F13R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F13R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F13R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F13R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F13R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F13R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F13R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F13R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F13R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F13R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F13R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F13R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F13R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F13R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F13R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F13R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F13R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F13R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F13R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F13R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F13R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F13R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F13R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F13R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F13R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F13R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F13R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F13R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F13R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F13R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F13R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F13R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F14R1 register ******************/ +#define CAN_F14R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F14R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F14R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F14R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F14R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F14R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F14R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F14R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F14R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F14R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F14R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F14R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F14R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F14R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F14R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F14R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F14R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F14R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F14R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F14R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F14R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F14R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F14R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F14R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F14R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F14R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F14R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F14R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F14R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F14R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F14R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F14R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + + +/******************* Bit definition for CAN_F15R1 register *******************/ +#define CAN_F15R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F15R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F15R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F15R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F15R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F15R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F15R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F15R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F15R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F15R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F15R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F15R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F15R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F15R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F15R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F15R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F15R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F15R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F15R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F15R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F15R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F15R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F15R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F15R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F15R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F15R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F15R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F15R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F15R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F15R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F15R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F15R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F16R1 register *******************/ +#define CAN_F16R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F16R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F16R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F16R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F16R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F16R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F16R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F16R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F16R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F16R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F16R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F16R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F16R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F16R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F16R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F16R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F16R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F16R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F16R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F16R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F16R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F16R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F16R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F16R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F16R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F16R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F16R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F16R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F16R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F16R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F16R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F16R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F17R1 register *******************/ +#define CAN_F17R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F17R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F17R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F17R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F17R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F17R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F17R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F17R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F17R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F17R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F17R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F17R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F17R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F17R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F17R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F17R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F17R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F17R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F17R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F17R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F17R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F17R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F17R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F17R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F17R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F17R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F17R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F17R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F17R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F17R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F17R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F17R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F18R1 register *******************/ +#define CAN_F18R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F18R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F18R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F18R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F18R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F18R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F18R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F18R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F18R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F18R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F18R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F18R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F18R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F18R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F18R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F18R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F18R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F18R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F18R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F18R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F18R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F18R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F18R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F18R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F18R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F18R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F18R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F18R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F18R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F18R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F18R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F18R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F19R1 register *******************/ +#define CAN_F19R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F19R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F19R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F19R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F19R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F19R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F19R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F19R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F19R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F19R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F19R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F19R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F19R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F19R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F19R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F19R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F19R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F19R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F19R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F19R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F19R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F19R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F19R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F19R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F19R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F19R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F19R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F19R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F19R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F19R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F19R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F19R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F20R1 register *******************/ +#define CAN_F20R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F20R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F20R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F20R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F20R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F20R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F20R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F20R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F20R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F20R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F20R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F20R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F20R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F20R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F20R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F20R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F20R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F20R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F20R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F20R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F20R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F20R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F20R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F20R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F20R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F20R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F20R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F20R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F20R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F20R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F20R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F20R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F21R1 register *******************/ +#define CAN_F21R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F21R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F21R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F21R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F21R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F21R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F21R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F21R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F21R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F21R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F21R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F21R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F21R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F21R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F21R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F21R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F21R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F21R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F21R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F21R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F21R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F21R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F21R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F21R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F21R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F21R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F21R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F21R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F21R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F21R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F21R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F21R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F22R1 register *******************/ +#define CAN_F22R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F22R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F22R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F22R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F22R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F22R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F22R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F22R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F22R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F22R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F22R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F22R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F22R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F22R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F22R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F22R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F22R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F22R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F22R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F22R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F22R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F22R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F22R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F22R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F22R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F22R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F22R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F22R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F22R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F22R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F22R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F22R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F23R1 register ******************/ +#define CAN_F23R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F23R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F23R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F23R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F23R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F23R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F23R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F23R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F23R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F23R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F23R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F23R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F23R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F23R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F23R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F23R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F23R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F23R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F23R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F23R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F23R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F23R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F23R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F23R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F23R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F23R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F23R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F23R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F23R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F23R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F23R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F23R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F24R1 register ******************/ +#define CAN_F24R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F24R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F24R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F24R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F24R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F24R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F24R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F24R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F24R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F24R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F24R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F24R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F24R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F24R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F24R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F24R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F24R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F24R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F24R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F24R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F24R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F24R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F24R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F24R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F24R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F24R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F24R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F24R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F24R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F24R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F24R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F24R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F25R1 register ******************/ +#define CAN_F25R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F25R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F25R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F25R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F25R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F25R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F25R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F25R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F25R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F25R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F25R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F25R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F25R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F25R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F25R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F25R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F25R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F25R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F25R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F25R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F25R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F25R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F25R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F25R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F25R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F25R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F25R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F25R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F25R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F25R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F25R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F25R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F26R1 register ******************/ +#define CAN_F26R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F26R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F26R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F26R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F26R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F26R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F26R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F26R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F26R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F26R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F26R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F26R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F26R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F26R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F26R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F26R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F26R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F26R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F26R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F26R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F26R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F26R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F26R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F26R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F26R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F26R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F26R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F26R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F26R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F26R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F26R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F26R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F27R1 register ******************/ +#define CAN_F27R1_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F27R1_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F27R1_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F27R1_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F27R1_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F27R1_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F27R1_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F27R1_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F27R1_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F27R1_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F27R1_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F27R1_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F27R1_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F27R1_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F27R1_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F27R1_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F27R1_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F27R1_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F27R1_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F27R1_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F27R1_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F27R1_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F27R1_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F27R1_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F27R1_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F27R1_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F27R1_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F27R1_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F27R1_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F27R1_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F27R1_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F27R1_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F0R2 register *******************/ +#define CAN_F0R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F0R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F0R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F0R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F0R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F0R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F0R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F0R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F0R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F0R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F0R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F0R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F0R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F0R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F0R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F0R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F0R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F0R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F0R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F0R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F0R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F0R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F0R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F0R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F0R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F0R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F0R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F0R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F0R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F0R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F0R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F0R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F1R2 register *******************/ +#define CAN_F1R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F1R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F1R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F1R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F1R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F1R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F1R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F1R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F1R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F1R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F1R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F1R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F1R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F1R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F1R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F1R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F1R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F1R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F1R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F1R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F1R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F1R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F1R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F1R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F1R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F1R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F1R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F1R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F1R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F1R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F1R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F1R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F2R2 register *******************/ +#define CAN_F2R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F2R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F2R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F2R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F2R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F2R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F2R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F2R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F2R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F2R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F2R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F2R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F2R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F2R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F2R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F2R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F2R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F2R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F2R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F2R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F2R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F2R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F2R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F2R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F2R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F2R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F2R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F2R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F2R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F2R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F2R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F2R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F3R2 register *******************/ +#define CAN_F3R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F3R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F3R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F3R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F3R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F3R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F3R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F3R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F3R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F3R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F3R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F3R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F3R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F3R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F3R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F3R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F3R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F3R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F3R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F3R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F3R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F3R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F3R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F3R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F3R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F3R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F3R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F3R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F3R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F3R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F3R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F3R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F4R2 register *******************/ +#define CAN_F4R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F4R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F4R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F4R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F4R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F4R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F4R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F4R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F4R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F4R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F4R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F4R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F4R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F4R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F4R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F4R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F4R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F4R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F4R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F4R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F4R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F4R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F4R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F4R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F4R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F4R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F4R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F4R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F4R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F4R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F4R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F4R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F5R2 register *******************/ +#define CAN_F5R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F5R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F5R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F5R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F5R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F5R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F5R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F5R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F5R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F5R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F5R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F5R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F5R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F5R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F5R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F5R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F5R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F5R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F5R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F5R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F5R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F5R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F5R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F5R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F5R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F5R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F5R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F5R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F5R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F5R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F5R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F5R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F6R2 register *******************/ +#define CAN_F6R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F6R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F6R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F6R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F6R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F6R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F6R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F6R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F6R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F6R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F6R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F6R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F6R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F6R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F6R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F6R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F6R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F6R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F6R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F6R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F6R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F6R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F6R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F6R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F6R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F6R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F6R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F6R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F6R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F6R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F6R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F6R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F7R2 register *******************/ +#define CAN_F7R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F7R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F7R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F7R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F7R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F7R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F7R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F7R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F7R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F7R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F7R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F7R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F7R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F7R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F7R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F7R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F7R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F7R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F7R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F7R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F7R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F7R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F7R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F7R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F7R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F7R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F7R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F7R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F7R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F7R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F7R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F7R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F8R2 register *******************/ +#define CAN_F8R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F8R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F8R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F8R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F8R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F8R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F8R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F8R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F8R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F8R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F8R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F8R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F8R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F8R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F8R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F8R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F8R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F8R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F8R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F8R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F8R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F8R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F8R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F8R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F8R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F8R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F8R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F8R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F8R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F8R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F8R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F8R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F9R2 register *******************/ +#define CAN_F9R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F9R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F9R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F9R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F9R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F9R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F9R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F9R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F9R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F9R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F9R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F9R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F9R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F9R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F9R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F9R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F9R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F9R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F9R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F9R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F9R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F9R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F9R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F9R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F9R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F9R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F9R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F9R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F9R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F9R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F9R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F9R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F10R2 register ******************/ +#define CAN_F10R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F10R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F10R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F10R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F10R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F10R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F10R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F10R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F10R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F10R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F10R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F10R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F10R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F10R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F10R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F10R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F10R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F10R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F10R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F10R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F10R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F10R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F10R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F10R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F10R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F10R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F10R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F10R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F10R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F10R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F10R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F10R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F11R2 register ******************/ +#define CAN_F11R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F11R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F11R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F11R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F11R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F11R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F11R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F11R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F11R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F11R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F11R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F11R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F11R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F11R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F11R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F11R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F11R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F11R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F11R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F11R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F11R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F11R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F11R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F11R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F11R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F11R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F11R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F11R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F11R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F11R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F11R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F11R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F12R2 register ******************/ +#define CAN_F12R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F12R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F12R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F12R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F12R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F12R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F12R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F12R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F12R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F12R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F12R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F12R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F12R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F12R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F12R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F12R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F12R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F12R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F12R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F12R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F12R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F12R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F12R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F12R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F12R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F12R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F12R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F12R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F12R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F12R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F12R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F12R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F13R2 register ******************/ +#define CAN_F13R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F13R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F13R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F13R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F13R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F13R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F13R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F13R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F13R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F13R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F13R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F13R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F13R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F13R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F13R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F13R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F13R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F13R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F13R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F13R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F13R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F13R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F13R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F13R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F13R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F13R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F13R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F13R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F13R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F13R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F13R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F13R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F14R2 register *******************/ +#define CAN_F14R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F14R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F14R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F14R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F14R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F14R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F14R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F14R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F14R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F14R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F14R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F14R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F14R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F14R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F14R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F14R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F14R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F14R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F14R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F14R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F14R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F14R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F14R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F14R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F14R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F14R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F14R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F14R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F14R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F14R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F14R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F14R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F15R2 register *******************/ +#define CAN_F15R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F15R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F15R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F15R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F15R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F15R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F15R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F15R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F15R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F15R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F15R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F15R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F15R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F15R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F15R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F15R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F15R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F15R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F15R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F15R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F15R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F15R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F15R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F15R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F15R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F15R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F15R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F15R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F15R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F15R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F15R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F15R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F16R2 register *******************/ +#define CAN_F16R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F16R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F16R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F16R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F16R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F16R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F16R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F16R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F16R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F16R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F16R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F16R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F16R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F16R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F16R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F16R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F16R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F16R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F16R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F16R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F16R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F16R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F16R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F16R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F16R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F16R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F16R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F16R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F16R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F16R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F16R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F16R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F17R2 register *******************/ +#define CAN_F17R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F17R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F17R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F17R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F17R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F17R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F17R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F17R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F17R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F17R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F17R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F17R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F17R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F17R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F17R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F17R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F17R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F17R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F17R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F17R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F17R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F17R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F17R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F17R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F17R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F17R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F17R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F17R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F17R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F17R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F17R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F17R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F18R2 register *******************/ +#define CAN_F18R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F18R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F18R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F18R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F18R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F18R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F18R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F18R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F18R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F18R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F18R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F18R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F18R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F18R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F18R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F18R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F18R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F18R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F18R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F18R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F18R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F18R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F18R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F18R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F18R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F18R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F18R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F18R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F18R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F18R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F18R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F18R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F19R2 register *******************/ +#define CAN_F19R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F19R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F19R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F19R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F19R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F19R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F19R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F19R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F19R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F19R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F19R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F19R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F19R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F19R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F19R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F19R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F19R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F19R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F19R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F19R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F19R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F19R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F19R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F19R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F19R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F19R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F19R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F19R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F19R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F19R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F19R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F19R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F20R2 register *******************/ +#define CAN_F20R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F20R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F20R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F20R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F20R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F20R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F20R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F20R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F20R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F20R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F20R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F20R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F20R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F20R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F20R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F20R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F20R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F20R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F20R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F20R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F20R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F20R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F20R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F20R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F20R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F20R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F20R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F20R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F20R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F20R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F20R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F20R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F21R2 register *******************/ +#define CAN_F21R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F21R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F21R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F21R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F21R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F21R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F21R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F21R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F21R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F21R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F21R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F21R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F21R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F21R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F21R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F21R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F21R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F21R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F21R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F21R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F21R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F21R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F21R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F21R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F21R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F21R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F21R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F21R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F21R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F21R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F21R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F21R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F22R2 register *******************/ +#define CAN_F22R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F22R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F22R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F22R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F22R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F22R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F22R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F22R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F22R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F22R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F22R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F22R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F22R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F22R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F22R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F22R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F22R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F22R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F22R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F22R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F22R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F22R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F22R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F22R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F22R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F22R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F22R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F22R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F22R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F22R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F22R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F22R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F23R2 register *******************/ +#define CAN_F23R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F23R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F23R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F23R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F23R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F23R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F23R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F23R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F23R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F23R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F23R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F23R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F23R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F23R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F23R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F23R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F23R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F23R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F23R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F23R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F23R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F23R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F23R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F23R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F23R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F23R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F23R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F23R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F23R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F23R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F23R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F23R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F24R2 register ******************/ +#define CAN_F24R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F24R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F24R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F24R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F24R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F24R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F24R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F24R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F24R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F24R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F24R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F24R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F24R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F24R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F24R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F24R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F24R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F24R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F24R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F24R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F24R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F24R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F24R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F24R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F24R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F24R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F24R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F24R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F24R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F24R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F24R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F24R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F25R2 register ******************/ +#define CAN_F25R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F25R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F25R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F25R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F25R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F25R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F25R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F25R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F25R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F25R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F25R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F25R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F25R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F25R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F25R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F25R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F25R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F25R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F25R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F25R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F25R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F25R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F25R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F25R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F25R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F25R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F25R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F25R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F25R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F25R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F25R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F25R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F26R2 register ******************/ +#define CAN_F26R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F26R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F26R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F26R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F26R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F26R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F26R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F26R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F26R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F26R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F26R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F26R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F26R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F26R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F26R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F26R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F26R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F26R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F26R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F26R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F26R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F26R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F26R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F26R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F26R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F26R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F26R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F26R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F26R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F26R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F26R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F26R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************* Bit definition for CAN_F27R2 register ******************/ +#define CAN_F27R2_FB0 ((uint32_t)0x00000001) /* Filter bit 0 */ +#define CAN_F27R2_FB1 ((uint32_t)0x00000002) /* Filter bit 1 */ +#define CAN_F27R2_FB2 ((uint32_t)0x00000004) /* Filter bit 2 */ +#define CAN_F27R2_FB3 ((uint32_t)0x00000008) /* Filter bit 3 */ +#define CAN_F27R2_FB4 ((uint32_t)0x00000010) /* Filter bit 4 */ +#define CAN_F27R2_FB5 ((uint32_t)0x00000020) /* Filter bit 5 */ +#define CAN_F27R2_FB6 ((uint32_t)0x00000040) /* Filter bit 6 */ +#define CAN_F27R2_FB7 ((uint32_t)0x00000080) /* Filter bit 7 */ +#define CAN_F27R2_FB8 ((uint32_t)0x00000100) /* Filter bit 8 */ +#define CAN_F27R2_FB9 ((uint32_t)0x00000200) /* Filter bit 9 */ +#define CAN_F27R2_FB10 ((uint32_t)0x00000400) /* Filter bit 10 */ +#define CAN_F27R2_FB11 ((uint32_t)0x00000800) /* Filter bit 11 */ +#define CAN_F27R2_FB12 ((uint32_t)0x00001000) /* Filter bit 12 */ +#define CAN_F27R2_FB13 ((uint32_t)0x00002000) /* Filter bit 13 */ +#define CAN_F27R2_FB14 ((uint32_t)0x00004000) /* Filter bit 14 */ +#define CAN_F27R2_FB15 ((uint32_t)0x00008000) /* Filter bit 15 */ +#define CAN_F27R2_FB16 ((uint32_t)0x00010000) /* Filter bit 16 */ +#define CAN_F27R2_FB17 ((uint32_t)0x00020000) /* Filter bit 17 */ +#define CAN_F27R2_FB18 ((uint32_t)0x00040000) /* Filter bit 18 */ +#define CAN_F27R2_FB19 ((uint32_t)0x00080000) /* Filter bit 19 */ +#define CAN_F27R2_FB20 ((uint32_t)0x00100000) /* Filter bit 20 */ +#define CAN_F27R2_FB21 ((uint32_t)0x00200000) /* Filter bit 21 */ +#define CAN_F27R2_FB22 ((uint32_t)0x00400000) /* Filter bit 22 */ +#define CAN_F27R2_FB23 ((uint32_t)0x00800000) /* Filter bit 23 */ +#define CAN_F27R2_FB24 ((uint32_t)0x01000000) /* Filter bit 24 */ +#define CAN_F27R2_FB25 ((uint32_t)0x02000000) /* Filter bit 25 */ +#define CAN_F27R2_FB26 ((uint32_t)0x04000000) /* Filter bit 26 */ +#define CAN_F27R2_FB27 ((uint32_t)0x08000000) /* Filter bit 27 */ +#define CAN_F27R2_FB28 ((uint32_t)0x10000000) /* Filter bit 28 */ +#define CAN_F27R2_FB29 ((uint32_t)0x20000000) /* Filter bit 29 */ +#define CAN_F27R2_FB30 ((uint32_t)0x40000000) /* Filter bit 30 */ +#define CAN_F27R2_FB31 ((uint32_t)0x80000000) /* Filter bit 31 */ + +/******************************************************************************/ +/* CRC Calculation Unit */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DATAR register *********************/ +#define CRC_DATAR_DR ((uint32_t)0xFFFFFFFF) /* Data register bits */ + + +/******************* Bit definition for CRC_IDATAR register ********************/ +#define CRC_IDR_IDATAR ((uint8_t)0xFF) /* General-purpose 8-bit data register bits */ + + +/******************** Bit definition for CRC_CTLR register ********************/ +#define CRC_CTLR_RESET ((uint8_t)0x01) /* RESET bit */ + +/******************************************************************************/ +/* Digital to Analog Converter */ +/******************************************************************************/ + +/******************** Bit definition for DAC_CTLR register ********************/ +#define DAC_EN1 ((uint32_t)0x00000001) /* DAC channel1 enable */ +#define DAC_BOFF1 ((uint32_t)0x00000002) /* DAC channel1 output buffer disable */ +#define DAC_TEN1 ((uint32_t)0x00000004) /* DAC channel1 Trigger enable */ + +#define DAC_TSEL1 ((uint32_t)0x00000038) /* TSEL1[2:0] (DAC channel1 Trigger selection) */ +#define DAC_TSEL1_0 ((uint32_t)0x00000008) /* Bit 0 */ +#define DAC_TSEL1_1 ((uint32_t)0x00000010) /* Bit 1 */ +#define DAC_TSEL1_2 ((uint32_t)0x00000020) /* Bit 2 */ + +#define DAC_WAVE1 ((uint32_t)0x000000C0) /* WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */ +#define DAC_WAVE1_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define DAC_WAVE1_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define DAC_MAMP1 ((uint32_t)0x00000F00) /* MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */ +#define DAC_MAMP1_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define DAC_MAMP1_1 ((uint32_t)0x00000200) /* Bit 1 */ +#define DAC_MAMP1_2 ((uint32_t)0x00000400) /* Bit 2 */ +#define DAC_MAMP1_3 ((uint32_t)0x00000800) /* Bit 3 */ + +#define DAC_DMAEN1 ((uint32_t)0x00001000) /* DAC channel1 DMA enable */ +#define DAC_EN2 ((uint32_t)0x00010000) /* DAC channel2 enable */ +#define DAC_BOFF2 ((uint32_t)0x00020000) /* DAC channel2 output buffer disable */ +#define DAC_TEN2 ((uint32_t)0x00040000) /* DAC channel2 Trigger enable */ + +#define DAC_TSEL2 ((uint32_t)0x00380000) /* TSEL2[2:0] (DAC channel2 Trigger selection) */ +#define DAC_TSEL2_0 ((uint32_t)0x00080000) /* Bit 0 */ +#define DAC_TSEL2_1 ((uint32_t)0x00100000) /* Bit 1 */ +#define DAC_TSEL2_2 ((uint32_t)0x00200000) /* Bit 2 */ + +#define DAC_WAVE2 ((uint32_t)0x00C00000) /* WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */ +#define DAC_WAVE2_0 ((uint32_t)0x00400000) /* Bit 0 */ +#define DAC_WAVE2_1 ((uint32_t)0x00800000) /* Bit 1 */ + +#define DAC_MAMP2 ((uint32_t)0x0F000000) /* MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */ +#define DAC_MAMP2_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define DAC_MAMP2_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define DAC_MAMP2_2 ((uint32_t)0x04000000) /* Bit 2 */ +#define DAC_MAMP2_3 ((uint32_t)0x08000000) /* Bit 3 */ + +#define DAC_DMAEN2 ((uint32_t)0x10000000) /* DAC channel2 DMA enabled */ + +/***************** Bit definition for DAC_SWTR register ******************/ +#define DAC_SWTRIG1 ((uint8_t)0x01) /* DAC channel1 software trigger */ +#define DAC_SWTRIG2 ((uint8_t)0x02) /* DAC channel2 software trigger */ + +/***************** Bit definition for DAC_R12BDHR1 register ******************/ +#define DAC_DHR12R1 ((uint16_t)0x0FFF) /* DAC channel1 12-bit Right aligned data */ + +/***************** Bit definition for DAC_L12BDHR1 register ******************/ +#define DAC_DHR12L1 ((uint16_t)0xFFF0) /* DAC channel1 12-bit Left aligned data */ + +/****************** Bit definition for DAC_R8BDHR1 register ******************/ +#define DAC_DHR8R1 ((uint8_t)0xFF) /* DAC channel1 8-bit Right aligned data */ + +/***************** Bit definition for DAC_R12BDHR2 register ******************/ +#define DAC_DHR12R2 ((uint16_t)0x0FFF) /* DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_L12BDHR2 register ******************/ +#define DAC_DHR12L2 ((uint16_t)0xFFF0) /* DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_R8BDHR2 register ******************/ +#define DAC_DHR8R2 ((uint8_t)0xFF) /* DAC channel2 8-bit Right aligned data */ + +/***************** Bit definition for DAC_RD12BDHR register ******************/ +#define DAC_RD12BDHR_DACC1DHR ((uint32_t)0x00000FFF) /* DAC channel1 12-bit Right aligned data */ +#define DAC_RD12BDHR_DACC2DHR ((uint32_t)0x0FFF0000) /* DAC channel2 12-bit Right aligned data */ + +/***************** Bit definition for DAC_LD12BDHR register ******************/ +#define DAC_LD12BDHR_DACC1DHR ((uint32_t)0x0000FFF0) /* DAC channel1 12-bit Left aligned data */ +#define DAC_LD12BDHR_DACC2DHR ((uint32_t)0xFFF00000) /* DAC channel2 12-bit Left aligned data */ + +/****************** Bit definition for DAC_RD8BDHR register ******************/ +#define DAC_RD8BDHR_DACC1DHR ((uint16_t)0x00FF) /* DAC channel1 8-bit Right aligned data */ +#define DAC_RD8BDHR_DACC2DHR ((uint16_t)0xFF00) /* DAC channel2 8-bit Right aligned data */ + +/******************* Bit definition for DAC_DOR1 register *******************/ +#define DAC_DACC1DOR ((uint16_t)0x0FFF) /* DAC channel1 data output */ + +/******************* Bit definition for DAC_DOR2 register *******************/ +#define DAC_DACC2DOR ((uint16_t)0x0FFF) /* DAC channel2 data output */ + +/******************************************************************************/ +/* DMA Controller */ +/******************************************************************************/ + +/******************* Bit definition for DMA_INTFR register ********************/ +#define DMA_GIF1 ((uint32_t)0x00000001) /* Channel 1 Global interrupt flag */ +#define DMA_TCIF1 ((uint32_t)0x00000002) /* Channel 1 Transfer Complete flag */ +#define DMA_HTIF1 ((uint32_t)0x00000004) /* Channel 1 Half Transfer flag */ +#define DMA_TEIF1 ((uint32_t)0x00000008) /* Channel 1 Transfer Error flag */ +#define DMA_GIF2 ((uint32_t)0x00000010) /* Channel 2 Global interrupt flag */ +#define DMA_TCIF2 ((uint32_t)0x00000020) /* Channel 2 Transfer Complete flag */ +#define DMA_HTIF2 ((uint32_t)0x00000040) /* Channel 2 Half Transfer flag */ +#define DMA_TEIF2 ((uint32_t)0x00000080) /* Channel 2 Transfer Error flag */ +#define DMA_GIF3 ((uint32_t)0x00000100) /* Channel 3 Global interrupt flag */ +#define DMA_TCIF3 ((uint32_t)0x00000200) /* Channel 3 Transfer Complete flag */ +#define DMA_HTIF3 ((uint32_t)0x00000400) /* Channel 3 Half Transfer flag */ +#define DMA_TEIF3 ((uint32_t)0x00000800) /* Channel 3 Transfer Error flag */ +#define DMA_GIF4 ((uint32_t)0x00001000) /* Channel 4 Global interrupt flag */ +#define DMA_TCIF4 ((uint32_t)0x00002000) /* Channel 4 Transfer Complete flag */ +#define DMA_HTIF4 ((uint32_t)0x00004000) /* Channel 4 Half Transfer flag */ +#define DMA_TEIF4 ((uint32_t)0x00008000) /* Channel 4 Transfer Error flag */ +#define DMA_GIF5 ((uint32_t)0x00010000) /* Channel 5 Global interrupt flag */ +#define DMA_TCIF5 ((uint32_t)0x00020000) /* Channel 5 Transfer Complete flag */ +#define DMA_HTIF5 ((uint32_t)0x00040000) /* Channel 5 Half Transfer flag */ +#define DMA_TEIF5 ((uint32_t)0x00080000) /* Channel 5 Transfer Error flag */ +#define DMA_GIF6 ((uint32_t)0x00100000) /* Channel 6 Global interrupt flag */ +#define DMA_TCIF6 ((uint32_t)0x00200000) /* Channel 6 Transfer Complete flag */ +#define DMA_HTIF6 ((uint32_t)0x00400000) /* Channel 6 Half Transfer flag */ +#define DMA_TEIF6 ((uint32_t)0x00800000) /* Channel 6 Transfer Error flag */ +#define DMA_GIF7 ((uint32_t)0x01000000) /* Channel 7 Global interrupt flag */ +#define DMA_TCIF7 ((uint32_t)0x02000000) /* Channel 7 Transfer Complete flag */ +#define DMA_HTIF7 ((uint32_t)0x04000000) /* Channel 7 Half Transfer flag */ +#define DMA_TEIF7 ((uint32_t)0x08000000) /* Channel 7 Transfer Error flag */ + +#define DMA_GIF8 ((uint32_t)0x00000001) /* Channel 8 Global interrupt flag */ +#define DMA_TCIF8 ((uint32_t)0x00000002) /* Channel 8 Transfer Complete flag */ +#define DMA_HTIF8 ((uint32_t)0x00000004) /* Channel 8 Half Transfer flag */ +#define DMA_TEIF8 ((uint32_t)0x00000008) /* Channel 8 Transfer Error flag */ +#define DMA_GIF9 ((uint32_t)0x00000010) /* Channel 9 Global interrupt flag */ +#define DMA_TCIF9 ((uint32_t)0x00000020) /* Channel 9 Transfer Complete flag */ +#define DMA_HTIF9 ((uint32_t)0x00000040) /* Channel 9 Half Transfer flag */ +#define DMA_TEIF9 ((uint32_t)0x00000080) /* Channel 9 Transfer Error flag */ +#define DMA_GIF10 ((uint32_t)0x00000100) /* Channel 10 Global interrupt flag */ +#define DMA_TCIF10 ((uint32_t)0x00000200) /* Channel 10 Transfer Complete flag */ +#define DMA_HTIF10 ((uint32_t)0x00000400) /* Channel 10 Half Transfer flag */ +#define DMA_TEIF10 ((uint32_t)0x00000800) /* Channel 10 Transfer Error flag */ +#define DMA_GIF11 ((uint32_t)0x00001000) /* Channel 11 Global interrupt flag */ +#define DMA_TCIF11 ((uint32_t)0x00002000) /* Channel 11 Transfer Complete flag */ +#define DMA_HTIF11 ((uint32_t)0x00004000) /* Channel 11 Half Transfer flag */ +#define DMA_TEIF11 ((uint32_t)0x00008000) /* Channel 11 Transfer Error flag */ + +/******************* Bit definition for DMA_INTFCR register *******************/ +#define DMA_CGIF1 ((uint32_t)0x00000001) /* Channel 1 Global interrupt clear */ +#define DMA_CTCIF1 ((uint32_t)0x00000002) /* Channel 1 Transfer Complete clear */ +#define DMA_CHTIF1 ((uint32_t)0x00000004) /* Channel 1 Half Transfer clear */ +#define DMA_CTEIF1 ((uint32_t)0x00000008) /* Channel 1 Transfer Error clear */ +#define DMA_CGIF2 ((uint32_t)0x00000010) /* Channel 2 Global interrupt clear */ +#define DMA_CTCIF2 ((uint32_t)0x00000020) /* Channel 2 Transfer Complete clear */ +#define DMA_CHTIF2 ((uint32_t)0x00000040) /* Channel 2 Half Transfer clear */ +#define DMA_CTEIF2 ((uint32_t)0x00000080) /* Channel 2 Transfer Error clear */ +#define DMA_CGIF3 ((uint32_t)0x00000100) /* Channel 3 Global interrupt clear */ +#define DMA_CTCIF3 ((uint32_t)0x00000200) /* Channel 3 Transfer Complete clear */ +#define DMA_CHTIF3 ((uint32_t)0x00000400) /* Channel 3 Half Transfer clear */ +#define DMA_CTEIF3 ((uint32_t)0x00000800) /* Channel 3 Transfer Error clear */ +#define DMA_CGIF4 ((uint32_t)0x00001000) /* Channel 4 Global interrupt clear */ +#define DMA_CTCIF4 ((uint32_t)0x00002000) /* Channel 4 Transfer Complete clear */ +#define DMA_CHTIF4 ((uint32_t)0x00004000) /* Channel 4 Half Transfer clear */ +#define DMA_CTEIF4 ((uint32_t)0x00008000) /* Channel 4 Transfer Error clear */ +#define DMA_CGIF5 ((uint32_t)0x00010000) /* Channel 5 Global interrupt clear */ +#define DMA_CTCIF5 ((uint32_t)0x00020000) /* Channel 5 Transfer Complete clear */ +#define DMA_CHTIF5 ((uint32_t)0x00040000) /* Channel 5 Half Transfer clear */ +#define DMA_CTEIF5 ((uint32_t)0x00080000) /* Channel 5 Transfer Error clear */ +#define DMA_CGIF6 ((uint32_t)0x00100000) /* Channel 6 Global interrupt clear */ +#define DMA_CTCIF6 ((uint32_t)0x00200000) /* Channel 6 Transfer Complete clear */ +#define DMA_CHTIF6 ((uint32_t)0x00400000) /* Channel 6 Half Transfer clear */ +#define DMA_CTEIF6 ((uint32_t)0x00800000) /* Channel 6 Transfer Error clear */ +#define DMA_CGIF7 ((uint32_t)0x01000000) /* Channel 7 Global interrupt clear */ +#define DMA_CTCIF7 ((uint32_t)0x02000000) /* Channel 7 Transfer Complete clear */ +#define DMA_CHTIF7 ((uint32_t)0x04000000) /* Channel 7 Half Transfer clear */ +#define DMA_CTEIF7 ((uint32_t)0x08000000) /* Channel 7 Transfer Error clear */ +#define DMA_CGIF8 ((uint32_t)0x10000000) /* Channel 8 Global interrupt clear */ +#define DMA_CTCIF8 ((uint32_t)0x20000000) /* Channel 8 Transfer Complete clear */ +#define DMA_CHTIF8 ((uint32_t)0x40000000) /* Channel 8 Half Transfer clear */ +#define DMA_CTEIF8 ((uint32_t)0x80000000) /* Channel 8 Transfer Error clear */ + +/******************* Bit definition for DMA_CFGR1 register *******************/ +#define DMA_CFGR1_EN ((uint16_t)0x0001) /* Channel enable*/ +#define DMA_CFGR1_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFGR1_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFGR1_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFGR1_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFGR1_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFGR1_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFGR1_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFGR1_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFGR1_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFGR1_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFGR1_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFGR1_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFGR1_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFGR1_PL ((uint16_t)0x3000) /* PL[1:0] bits(Channel Priority level) */ +#define DMA_CFGR1_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFGR1_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFGR1_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFGR2 register *******************/ +#define DMA_CFGR2_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFGR2_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFGR2_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFGR2_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFGR2_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFGR2_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFGR2_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFGR2_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFGR2_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFGR2_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFGR2_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFGR2_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFGR2_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFGR2_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFGR2_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFGR2_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFGR2_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFGR2_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFGR3 register *******************/ +#define DMA_CFGR3_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFGR3_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFGR3_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFGR3_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFGR3_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFGR3_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFGR3_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFGR3_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFGR3_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFGR3_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFGR3_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFGR3_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFGR3_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFGR3_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFGR3_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFGR3_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFGR3_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFGR3_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFG4 register *******************/ +#define DMA_CFG4_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG4_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG4_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG4_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG4_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG4_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG4_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG4_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG4_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG4_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG4_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG4_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG4_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG4_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG4_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG4_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG4_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG4_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/****************** Bit definition for DMA_CFG5 register *******************/ +#define DMA_CFG5_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG5_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG5_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG5_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG5_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG5_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG5_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG5_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG5_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG5_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG5_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG5_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG5_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG5_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG5_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG5_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG5_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG5_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode enable */ + +/******************* Bit definition for DMA_CFG6 register *******************/ +#define DMA_CFG6_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG6_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG6_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG6_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG6_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG6_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG6_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG6_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG6_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG6_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG6_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG6_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG6_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG6_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG6_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG6_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG6_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG6_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode */ + +/******************* Bit definition for DMA_CFG7 register *******************/ +#define DMA_CFG7_EN ((uint16_t)0x0001) /* Channel enable */ +#define DMA_CFG7_TCIE ((uint16_t)0x0002) /* Transfer complete interrupt enable */ +#define DMA_CFG7_HTIE ((uint16_t)0x0004) /* Half Transfer interrupt enable */ +#define DMA_CFG7_TEIE ((uint16_t)0x0008) /* Transfer error interrupt enable */ +#define DMA_CFG7_DIR ((uint16_t)0x0010) /* Data transfer direction */ +#define DMA_CFG7_CIRC ((uint16_t)0x0020) /* Circular mode */ +#define DMA_CFG7_PINC ((uint16_t)0x0040) /* Peripheral increment mode */ +#define DMA_CFG7_MINC ((uint16_t)0x0080) /* Memory increment mode */ + +#define DMA_CFG7_PSIZE ((uint16_t)0x0300) /* PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CFG7_PSIZE_0 ((uint16_t)0x0100) /* Bit 0 */ +#define DMA_CFG7_PSIZE_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define DMA_CFG7_MSIZE ((uint16_t)0x0C00) /* MSIZE[1:0] bits (Memory size) */ +#define DMA_CFG7_MSIZE_0 ((uint16_t)0x0400) /* Bit 0 */ +#define DMA_CFG7_MSIZE_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define DMA_CFG7_PL ((uint16_t)0x3000) /* PL[1:0] bits (Channel Priority level) */ +#define DMA_CFG7_PL_0 ((uint16_t)0x1000) /* Bit 0 */ +#define DMA_CFG7_PL_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define DMA_CFG7_MEM2MEM ((uint16_t)0x4000) /* Memory to memory mode enable */ + +/****************** Bit definition for DMA_CNTR1 register ******************/ +#define DMA_CNTR1_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR2 register ******************/ +#define DMA_CNTR2_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR3 register ******************/ +#define DMA_CNTR3_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR4 register ******************/ +#define DMA_CNTR4_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR5 register ******************/ +#define DMA_CNTR5_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR6 register ******************/ +#define DMA_CNTR6_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR7 register ******************/ +#define DMA_CNTR7_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_CNTR8 register ******************/ +#define DMA_CNTR8_NDT ((uint16_t)0xFFFF) /* Number of data to Transfer */ + +/****************** Bit definition for DMA_PADDR1 register *******************/ +#define DMA_PADDR1_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR2 register *******************/ +#define DMA_PADDR2_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR3 register *******************/ +#define DMA_PADDR3_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR4 register *******************/ +#define DMA_PADDR4_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR5 register *******************/ +#define DMA_PADDR5_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR6 register *******************/ +#define DMA_PADDR6_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR7 register *******************/ +#define DMA_PADDR7_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_PADDR8 register *******************/ +#define DMA_PADDR8_PA ((uint32_t)0xFFFFFFFF) /* Peripheral Address */ + +/****************** Bit definition for DMA_MADDR1 register *******************/ +#define DMA_MADDR1_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR2 register *******************/ +#define DMA_MADDR2_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR3 register *******************/ +#define DMA_MADDR3_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR4 register *******************/ +#define DMA_MADDR4_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR5 register *******************/ +#define DMA_MADDR5_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR6 register *******************/ +#define DMA_MADDR6_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR7 register *******************/ +#define DMA_MADDR7_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/****************** Bit definition for DMA_MADDR8 register *******************/ +#define DMA_MADDR8_MA ((uint32_t)0xFFFFFFFF) /* Memory Address */ + +/******************************************************************************/ +/* External Interrupt/Event Controller */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_INTENR register *******************/ +#define EXTI_INTENR_MR0 ((uint32_t)0x00000001) /* Interrupt Mask on line 0 */ +#define EXTI_INTENR_MR1 ((uint32_t)0x00000002) /* Interrupt Mask on line 1 */ +#define EXTI_INTENR_MR2 ((uint32_t)0x00000004) /* Interrupt Mask on line 2 */ +#define EXTI_INTENR_MR3 ((uint32_t)0x00000008) /* Interrupt Mask on line 3 */ +#define EXTI_INTENR_MR4 ((uint32_t)0x00000010) /* Interrupt Mask on line 4 */ +#define EXTI_INTENR_MR5 ((uint32_t)0x00000020) /* Interrupt Mask on line 5 */ +#define EXTI_INTENR_MR6 ((uint32_t)0x00000040) /* Interrupt Mask on line 6 */ +#define EXTI_INTENR_MR7 ((uint32_t)0x00000080) /* Interrupt Mask on line 7 */ +#define EXTI_INTENR_MR8 ((uint32_t)0x00000100) /* Interrupt Mask on line 8 */ +#define EXTI_INTENR_MR9 ((uint32_t)0x00000200) /* Interrupt Mask on line 9 */ +#define EXTI_INTENR_MR10 ((uint32_t)0x00000400) /* Interrupt Mask on line 10 */ +#define EXTI_INTENR_MR11 ((uint32_t)0x00000800) /* Interrupt Mask on line 11 */ +#define EXTI_INTENR_MR12 ((uint32_t)0x00001000) /* Interrupt Mask on line 12 */ +#define EXTI_INTENR_MR13 ((uint32_t)0x00002000) /* Interrupt Mask on line 13 */ +#define EXTI_INTENR_MR14 ((uint32_t)0x00004000) /* Interrupt Mask on line 14 */ +#define EXTI_INTENR_MR15 ((uint32_t)0x00008000) /* Interrupt Mask on line 15 */ +#define EXTI_INTENR_MR16 ((uint32_t)0x00010000) /* Interrupt Mask on line 16 */ +#define EXTI_INTENR_MR17 ((uint32_t)0x00020000) /* Interrupt Mask on line 17 */ +#define EXTI_INTENR_MR18 ((uint32_t)0x00040000) /* Interrupt Mask on line 18 */ +#define EXTI_INTENR_MR19 ((uint32_t)0x00080000) /* Interrupt Mask on line 19 */ +#define EXTI_INTENR_MR20 ((uint32_t)0x00100000) /* Interrupt Mask on line 20 */ + +/******************* Bit definition for EXTI_EVENR register *******************/ +#define EXTI_EVENR_MR0 ((uint32_t)0x00000001) /* Event Mask on line 0 */ +#define EXTI_EVENR_MR1 ((uint32_t)0x00000002) /* Event Mask on line 1 */ +#define EXTI_EVENR_MR2 ((uint32_t)0x00000004) /* Event Mask on line 2 */ +#define EXTI_EVENR_MR3 ((uint32_t)0x00000008) /* Event Mask on line 3 */ +#define EXTI_EVENR_MR4 ((uint32_t)0x00000010) /* Event Mask on line 4 */ +#define EXTI_EVENR_MR5 ((uint32_t)0x00000020) /* Event Mask on line 5 */ +#define EXTI_EVENR_MR6 ((uint32_t)0x00000040) /* Event Mask on line 6 */ +#define EXTI_EVENR_MR7 ((uint32_t)0x00000080) /* Event Mask on line 7 */ +#define EXTI_EVENR_MR8 ((uint32_t)0x00000100) /* Event Mask on line 8 */ +#define EXTI_EVENR_MR9 ((uint32_t)0x00000200) /* Event Mask on line 9 */ +#define EXTI_EVENR_MR10 ((uint32_t)0x00000400) /* Event Mask on line 10 */ +#define EXTI_EVENR_MR11 ((uint32_t)0x00000800) /* Event Mask on line 11 */ +#define EXTI_EVENR_MR12 ((uint32_t)0x00001000) /* Event Mask on line 12 */ +#define EXTI_EVENR_MR13 ((uint32_t)0x00002000) /* Event Mask on line 13 */ +#define EXTI_EVENR_MR14 ((uint32_t)0x00004000) /* Event Mask on line 14 */ +#define EXTI_EVENR_MR15 ((uint32_t)0x00008000) /* Event Mask on line 15 */ +#define EXTI_EVENR_MR16 ((uint32_t)0x00010000) /* Event Mask on line 16 */ +#define EXTI_EVENR_MR17 ((uint32_t)0x00020000) /* Event Mask on line 17 */ +#define EXTI_EVENR_MR18 ((uint32_t)0x00040000) /* Event Mask on line 18 */ +#define EXTI_EVENR_MR19 ((uint32_t)0x00080000) /* Event Mask on line 19 */ +#define EXTI_EVENR_MR20 ((uint32_t)0x00100000) /* Event Mask on line 20 */ + +/****************** Bit definition for EXTI_RTENR register *******************/ +#define EXTI_RTENR_TR0 ((uint32_t)0x00000001) /* Rising trigger event configuration bit of line 0 */ +#define EXTI_RTENR_TR1 ((uint32_t)0x00000002) /* Rising trigger event configuration bit of line 1 */ +#define EXTI_RTENR_TR2 ((uint32_t)0x00000004) /* Rising trigger event configuration bit of line 2 */ +#define EXTI_RTENR_TR3 ((uint32_t)0x00000008) /* Rising trigger event configuration bit of line 3 */ +#define EXTI_RTENR_TR4 ((uint32_t)0x00000010) /* Rising trigger event configuration bit of line 4 */ +#define EXTI_RTENR_TR5 ((uint32_t)0x00000020) /* Rising trigger event configuration bit of line 5 */ +#define EXTI_RTENR_TR6 ((uint32_t)0x00000040) /* Rising trigger event configuration bit of line 6 */ +#define EXTI_RTENR_TR7 ((uint32_t)0x00000080) /* Rising trigger event configuration bit of line 7 */ +#define EXTI_RTENR_TR8 ((uint32_t)0x00000100) /* Rising trigger event configuration bit of line 8 */ +#define EXTI_RTENR_TR9 ((uint32_t)0x00000200) /* Rising trigger event configuration bit of line 9 */ +#define EXTI_RTENR_TR10 ((uint32_t)0x00000400) /* Rising trigger event configuration bit of line 10 */ +#define EXTI_RTENR_TR11 ((uint32_t)0x00000800) /* Rising trigger event configuration bit of line 11 */ +#define EXTI_RTENR_TR12 ((uint32_t)0x00001000) /* Rising trigger event configuration bit of line 12 */ +#define EXTI_RTENR_TR13 ((uint32_t)0x00002000) /* Rising trigger event configuration bit of line 13 */ +#define EXTI_RTENR_TR14 ((uint32_t)0x00004000) /* Rising trigger event configuration bit of line 14 */ +#define EXTI_RTENR_TR15 ((uint32_t)0x00008000) /* Rising trigger event configuration bit of line 15 */ +#define EXTI_RTENR_TR16 ((uint32_t)0x00010000) /* Rising trigger event configuration bit of line 16 */ +#define EXTI_RTENR_TR17 ((uint32_t)0x00020000) /* Rising trigger event configuration bit of line 17 */ +#define EXTI_RTENR_TR18 ((uint32_t)0x00040000) /* Rising trigger event configuration bit of line 18 */ +#define EXTI_RTENR_TR19 ((uint32_t)0x00080000) /* Rising trigger event configuration bit of line 19 */ +#define EXTI_RTENR_TR20 ((uint32_t)0x00100000) /* Rising trigger event configuration bit of line 20 */ + +/****************** Bit definition for EXTI_FTENR register *******************/ +#define EXTI_FTENR_TR0 ((uint32_t)0x00000001) /* Falling trigger event configuration bit of line 0 */ +#define EXTI_FTENR_TR1 ((uint32_t)0x00000002) /* Falling trigger event configuration bit of line 1 */ +#define EXTI_FTENR_TR2 ((uint32_t)0x00000004) /* Falling trigger event configuration bit of line 2 */ +#define EXTI_FTENR_TR3 ((uint32_t)0x00000008) /* Falling trigger event configuration bit of line 3 */ +#define EXTI_FTENR_TR4 ((uint32_t)0x00000010) /* Falling trigger event configuration bit of line 4 */ +#define EXTI_FTENR_TR5 ((uint32_t)0x00000020) /* Falling trigger event configuration bit of line 5 */ +#define EXTI_FTENR_TR6 ((uint32_t)0x00000040) /* Falling trigger event configuration bit of line 6 */ +#define EXTI_FTENR_TR7 ((uint32_t)0x00000080) /* Falling trigger event configuration bit of line 7 */ +#define EXTI_FTENR_TR8 ((uint32_t)0x00000100) /* Falling trigger event configuration bit of line 8 */ +#define EXTI_FTENR_TR9 ((uint32_t)0x00000200) /* Falling trigger event configuration bit of line 9 */ +#define EXTI_FTENR_TR10 ((uint32_t)0x00000400) /* Falling trigger event configuration bit of line 10 */ +#define EXTI_FTENR_TR11 ((uint32_t)0x00000800) /* Falling trigger event configuration bit of line 11 */ +#define EXTI_FTENR_TR12 ((uint32_t)0x00001000) /* Falling trigger event configuration bit of line 12 */ +#define EXTI_FTENR_TR13 ((uint32_t)0x00002000) /* Falling trigger event configuration bit of line 13 */ +#define EXTI_FTENR_TR14 ((uint32_t)0x00004000) /* Falling trigger event configuration bit of line 14 */ +#define EXTI_FTENR_TR15 ((uint32_t)0x00008000) /* Falling trigger event configuration bit of line 15 */ +#define EXTI_FTENR_TR16 ((uint32_t)0x00010000) /* Falling trigger event configuration bit of line 16 */ +#define EXTI_FTENR_TR17 ((uint32_t)0x00020000) /* Falling trigger event configuration bit of line 17 */ +#define EXTI_FTENR_TR18 ((uint32_t)0x00040000) /* Falling trigger event configuration bit of line 18 */ +#define EXTI_FTENR_TR19 ((uint32_t)0x00080000) /* Falling trigger event configuration bit of line 19 */ +#define EXTI_FTENR_TR20 ((uint32_t)0x00100000) /* Falling trigger event configuration bit of line 20 */ + +/****************** Bit definition for EXTI_SWIEVR register ******************/ +#define EXTI_SWIEVR_SWIEVR0 ((uint32_t)0x00000001) /* Software Interrupt on line 0 */ +#define EXTI_SWIEVR_SWIEVR1 ((uint32_t)0x00000002) /* Software Interrupt on line 1 */ +#define EXTI_SWIEVR_SWIEVR2 ((uint32_t)0x00000004) /* Software Interrupt on line 2 */ +#define EXTI_SWIEVR_SWIEVR3 ((uint32_t)0x00000008) /* Software Interrupt on line 3 */ +#define EXTI_SWIEVR_SWIEVR4 ((uint32_t)0x00000010) /* Software Interrupt on line 4 */ +#define EXTI_SWIEVR_SWIEVR5 ((uint32_t)0x00000020) /* Software Interrupt on line 5 */ +#define EXTI_SWIEVR_SWIEVR6 ((uint32_t)0x00000040) /* Software Interrupt on line 6 */ +#define EXTI_SWIEVR_SWIEVR7 ((uint32_t)0x00000080) /* Software Interrupt on line 7 */ +#define EXTI_SWIEVR_SWIEVR8 ((uint32_t)0x00000100) /* Software Interrupt on line 8 */ +#define EXTI_SWIEVR_SWIEVR9 ((uint32_t)0x00000200) /* Software Interrupt on line 9 */ +#define EXTI_SWIEVR_SWIEVR10 ((uint32_t)0x00000400) /* Software Interrupt on line 10 */ +#define EXTI_SWIEVR_SWIEVR11 ((uint32_t)0x00000800) /* Software Interrupt on line 11 */ +#define EXTI_SWIEVR_SWIEVR12 ((uint32_t)0x00001000) /* Software Interrupt on line 12 */ +#define EXTI_SWIEVR_SWIEVR13 ((uint32_t)0x00002000) /* Software Interrupt on line 13 */ +#define EXTI_SWIEVR_SWIEVR14 ((uint32_t)0x00004000) /* Software Interrupt on line 14 */ +#define EXTI_SWIEVR_SWIEVR15 ((uint32_t)0x00008000) /* Software Interrupt on line 15 */ +#define EXTI_SWIEVR_SWIEVR16 ((uint32_t)0x00010000) /* Software Interrupt on line 16 */ +#define EXTI_SWIEVR_SWIEVR17 ((uint32_t)0x00020000) /* Software Interrupt on line 17 */ +#define EXTI_SWIEVR_SWIEVR18 ((uint32_t)0x00040000) /* Software Interrupt on line 18 */ +#define EXTI_SWIEVR_SWIEVR19 ((uint32_t)0x00080000) /* Software Interrupt on line 19 */ +#define EXTI_SWIEVR_SWIEVR20 ((uint32_t)0x00100000) /* Software Interrupt on line 20 */ + +/******************* Bit definition for EXTI_INTFR register ********************/ +#define EXTI_INTF_INTF0 ((uint32_t)0x00000001) /* Pending bit for line 0 */ +#define EXTI_INTF_INTF1 ((uint32_t)0x00000002) /* Pending bit for line 1 */ +#define EXTI_INTF_INTF2 ((uint32_t)0x00000004) /* Pending bit for line 2 */ +#define EXTI_INTF_INTF3 ((uint32_t)0x00000008) /* Pending bit for line 3 */ +#define EXTI_INTF_INTF4 ((uint32_t)0x00000010) /* Pending bit for line 4 */ +#define EXTI_INTF_INTF5 ((uint32_t)0x00000020) /* Pending bit for line 5 */ +#define EXTI_INTF_INTF6 ((uint32_t)0x00000040) /* Pending bit for line 6 */ +#define EXTI_INTF_INTF7 ((uint32_t)0x00000080) /* Pending bit for line 7 */ +#define EXTI_INTF_INTF8 ((uint32_t)0x00000100) /* Pending bit for line 8 */ +#define EXTI_INTF_INTF9 ((uint32_t)0x00000200) /* Pending bit for line 9 */ +#define EXTI_INTF_INTF10 ((uint32_t)0x00000400) /* Pending bit for line 10 */ +#define EXTI_INTF_INTF11 ((uint32_t)0x00000800) /* Pending bit for line 11 */ +#define EXTI_INTF_INTF12 ((uint32_t)0x00001000) /* Pending bit for line 12 */ +#define EXTI_INTF_INTF13 ((uint32_t)0x00002000) /* Pending bit for line 13 */ +#define EXTI_INTF_INTF14 ((uint32_t)0x00004000) /* Pending bit for line 14 */ +#define EXTI_INTF_INTF15 ((uint32_t)0x00008000) /* Pending bit for line 15 */ +#define EXTI_INTF_INTF16 ((uint32_t)0x00010000) /* Pending bit for line 16 */ +#define EXTI_INTF_INTF17 ((uint32_t)0x00020000) /* Pending bit for line 17 */ +#define EXTI_INTF_INTF18 ((uint32_t)0x00040000) /* Pending bit for line 18 */ +#define EXTI_INTF_INTF19 ((uint32_t)0x00080000) /* Pending bit for line 19 */ +#define EXTI_INTF_INTF20 ((uint32_t)0x00100000) /* Pending bit for line 20 */ + +/******************************************************************************/ +/* FLASH and Option Bytes Registers */ +/******************************************************************************/ + + +/******************* Bit definition for FLASH_ACTLR register ******************/ + +/****************** Bit definition for FLASH_KEYR register ******************/ +#define FLASH_KEYR_FKEYR ((uint32_t)0xFFFFFFFF) /* FPEC Key */ +#define FLASH_KEYR_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEYR_KEY2 ((uint32_t)0xCDEF89AB) + +/***************** Bit definition for FLASH_OBKEYR register ****************/ +#define FLASH_OBKEYR_OBKEYR ((uint32_t)0xFFFFFFFF) /* Option Byte Key */ + +/****************** Bit definition for FLASH_STATR register *******************/ +#define FLASH_STATR_BSY ((uint8_t)0x01) /* Busy */ +#define FLASH_STATR_WRBSY ((uint8_t)0x02) +#define FLASH_STATR_WRPRTERR ((uint8_t)0x10) /* Write Protection Error */ +#define FLASH_STATR_EOP ((uint8_t)0x20) /* End of operation */ +#define FLASH_STATR_EHMODS ((uint8_t)0x80) + +/******************* Bit definition for FLASH_CTLR register *******************/ +#define FLASH_CTLR_PG ((uint32_t)0x00000001) /* Programming */ +#define FLASH_CTLR_PER ((uint32_t)0x00000002) /* Sector Erase 4K */ +#define FLASH_CTLR_MER ((uint32_t)0x00000004) /* Mass Erase */ +#define FLASH_CTLR_OPTPG ((uint32_t)0x00000010) /* Option Byte Programming */ +#define FLASH_CTLR_OPTER ((uint32_t)0x00000020) /* Option Byte Erase */ +#define FLASH_CTLR_STRT ((uint32_t)0x00000040) /* Start */ +#define FLASH_CTLR_LOCK ((uint32_t)0x00000080) /* Lock */ +#define FLASH_CTLR_OPTWRE ((uint32_t)0x00000200) /* Option Bytes Write Enable */ +#define FLASH_CTLR_ERRIE ((uint32_t)0x00000400) /* Error Interrupt Enable */ +#define FLASH_CTLR_EOPIE ((uint32_t)0x00001000) /* End of operation interrupt enable */ +#define FLASH_CTLR_FAST_LOCK ((uint32_t)0x00008000) /* Fast Lock */ +#define FLASH_CTLR_PAGE_PG ((uint32_t)0x00010000) /* Page Programming 256Byte */ +#define FLASH_CTLR_PAGE_ER ((uint32_t)0x00020000) /* Page Erase 256Byte */ +#define FLASH_CTLR_PAGE_BER32 ((uint32_t)0x00040000) /* Block Erase 32K */ +#define FLASH_CTLR_PAGE_BER64 ((uint32_t)0x00080000) /* Block Erase 64K */ +#define FLASH_CTLR_PG_STRT ((uint32_t)0x00200000) /* Page Programming Start */ +#define FLASH_CTLR_RSENACT ((uint32_t)0x00400000) +#define FLASH_CTLR_EHMOD ((uint32_t)0x01000000) +#define FLASH_CTLR_SCKMOD ((uint32_t)0x02000000) + +/******************* Bit definition for FLASH_ADDR register *******************/ +#define FLASH_ADDR_FAR ((uint32_t)0xFFFFFFFF) /* Flash Address */ + +/****************** Bit definition for FLASH_OBR register *******************/ +#define FLASH_OBR_OPTERR ((uint16_t)0x0001) /* Option Byte Error */ +#define FLASH_OBR_RDPRT ((uint16_t)0x0002) /* Read protection */ + +#define FLASH_OBR_USER ((uint16_t)0x03FC) /* User Option Bytes */ +#define FLASH_OBR_WDG_SW ((uint16_t)0x0004) /* WDG_SW */ +#define FLASH_OBR_nRST_STOP ((uint16_t)0x0008) /* nRST_STOP */ +#define FLASH_OBR_nRST_STDBY ((uint16_t)0x0010) /* nRST_STDBY */ +#define FLASH_OBR_RAM_CODE_MOD ((uint16_t)0x0300) +#define FLASH_OBR_RAM_CODE_MOD_BIT1 ((uint16_t)0x0100) +#define FLASH_OBR_RAM_CODE_MOD_BIT2 ((uint16_t)0x0200) + +/****************** Bit definition for FLASH_WPR register ******************/ +#define FLASH_WPR_WRP ((uint32_t)0xFFFFFFFF) /* Write Protect */ + +/****************** Bit definition for FLASH_MODEKEYR register ******************/ +#define FLASH_MODEKEYR_KEY1 ((uint32_t)0x45670123) +#define FLASH_MODEKEYR_KEY2 ((uint32_t)0xCDEF89AB) + +/****************** Bit definition for FLASH_RDPR register *******************/ +#define FLASH_RDPR_RDPR ((uint32_t)0x000000FF) /* Read protection option byte */ +#define FLASH_RDPR_nRDPR ((uint32_t)0x0000FF00) /* Read protection complemented option byte */ + +/****************** Bit definition for FLASH_USER register ******************/ +#define FLASH_USER_USER ((uint32_t)0x00FF0000) /* User option byte */ +#define FLASH_USER_nUSER ((uint32_t)0xFF000000) /* User complemented option byte */ + +/****************** Bit definition for FLASH_Data0 register *****************/ +#define FLASH_Data0_Data0 ((uint32_t)0x000000FF) /* User data storage option byte */ +#define FLASH_Data0_nData0 ((uint32_t)0x0000FF00) /* User data storage complemented option byte */ + +/****************** Bit definition for FLASH_Data1 register *****************/ +#define FLASH_Data1_Data1 ((uint32_t)0x00FF0000) /* User data storage option byte */ +#define FLASH_Data1_nData1 ((uint32_t)0xFF000000) /* User data storage complemented option byte */ + +/****************** Bit definition for FLASH_WRPR0 register ******************/ +#define FLASH_WRPR0_WRPR0 ((uint32_t)0x000000FF) /* Flash memory write protection option bytes */ +#define FLASH_WRPR0_nWRPR0 ((uint32_t)0x0000FF00) /* Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRPR1 register ******************/ +#define FLASH_WRPR1_WRPR1 ((uint32_t)0x00FF0000) /* Flash memory write protection option bytes */ +#define FLASH_WRPR1_nWRPR1 ((uint32_t)0xFF000000) /* Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRPR2 register ******************/ +#define FLASH_WRPR2_WRPR2 ((uint32_t)0x000000FF) /* Flash memory write protection option bytes */ +#define FLASH_WRPR2_nWRPR2 ((uint32_t)0x0000FF00) /* Flash memory write protection complemented option bytes */ + +/****************** Bit definition for FLASH_WRPR3 register ******************/ +#define FLASH_WRPR3_WRPR3 ((uint32_t)0x00FF0000) /* Flash memory write protection option bytes */ +#define FLASH_WRPR3_nWRPR3 ((uint32_t)0xFF000000) /* Flash memory write protection complemented option bytes */ + +/******************************************************************************/ +/* General Purpose and Alternate Function I/O */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CFGLR register *******************/ +#define GPIO_CFGLR_MODE ((uint32_t)0x33333333) /* Port x mode bits */ + +#define GPIO_CFGLR_MODE0 ((uint32_t)0x00000003) /* MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CFGLR_MODE0_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define GPIO_CFGLR_MODE0_1 ((uint32_t)0x00000002) /* Bit 1 */ + +#define GPIO_CFGLR_MODE1 ((uint32_t)0x00000030) /* MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CFGLR_MODE1_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define GPIO_CFGLR_MODE1_1 ((uint32_t)0x00000020) /* Bit 1 */ + +#define GPIO_CFGLR_MODE2 ((uint32_t)0x00000300) /* MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CFGLR_MODE2_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define GPIO_CFGLR_MODE2_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define GPIO_CFGLR_MODE3 ((uint32_t)0x00003000) /* MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CFGLR_MODE3_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define GPIO_CFGLR_MODE3_1 ((uint32_t)0x00002000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE4 ((uint32_t)0x00030000) /* MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CFGLR_MODE4_0 ((uint32_t)0x00010000) /* Bit 0 */ +#define GPIO_CFGLR_MODE4_1 ((uint32_t)0x00020000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE5 ((uint32_t)0x00300000) /* MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CFGLR_MODE5_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define GPIO_CFGLR_MODE5_1 ((uint32_t)0x00200000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE6 ((uint32_t)0x03000000) /* MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CFGLR_MODE6_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define GPIO_CFGLR_MODE6_1 ((uint32_t)0x02000000) /* Bit 1 */ + +#define GPIO_CFGLR_MODE7 ((uint32_t)0x30000000) /* MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CFGLR_MODE7_0 ((uint32_t)0x10000000) /* Bit 0 */ +#define GPIO_CFGLR_MODE7_1 ((uint32_t)0x20000000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF ((uint32_t)0xCCCCCCCC) /* Port x configuration bits */ + +#define GPIO_CFGLR_CNF0 ((uint32_t)0x0000000C) /* CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CFGLR_CNF0_0 ((uint32_t)0x00000004) /* Bit 0 */ +#define GPIO_CFGLR_CNF0_1 ((uint32_t)0x00000008) /* Bit 1 */ + +#define GPIO_CFGLR_CNF1 ((uint32_t)0x000000C0) /* CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CFGLR_CNF1_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define GPIO_CFGLR_CNF1_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define GPIO_CFGLR_CNF2 ((uint32_t)0x00000C00) /* CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CFGLR_CNF2_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define GPIO_CFGLR_CNF2_1 ((uint32_t)0x00000800) /* Bit 1 */ + +#define GPIO_CFGLR_CNF3 ((uint32_t)0x0000C000) /* CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CFGLR_CNF3_0 ((uint32_t)0x00004000) /* Bit 0 */ +#define GPIO_CFGLR_CNF3_1 ((uint32_t)0x00008000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF4 ((uint32_t)0x000C0000) /* CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CFGLR_CNF4_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define GPIO_CFGLR_CNF4_1 ((uint32_t)0x00080000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF5 ((uint32_t)0x00C00000) /* CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CFGLR_CNF5_0 ((uint32_t)0x00400000) /* Bit 0 */ +#define GPIO_CFGLR_CNF5_1 ((uint32_t)0x00800000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF6 ((uint32_t)0x0C000000) /* CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CFGLR_CNF6_0 ((uint32_t)0x04000000) /* Bit 0 */ +#define GPIO_CFGLR_CNF6_1 ((uint32_t)0x08000000) /* Bit 1 */ + +#define GPIO_CFGLR_CNF7 ((uint32_t)0xC0000000) /* CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CFGLR_CNF7_0 ((uint32_t)0x40000000) /* Bit 0 */ +#define GPIO_CFGLR_CNF7_1 ((uint32_t)0x80000000) /* Bit 1 */ + +/******************* Bit definition for GPIO_CFGHR register *******************/ +#define GPIO_CFGHR_MODE ((uint32_t)0x33333333) /* Port x mode bits */ + +#define GPIO_CFGHR_MODE8 ((uint32_t)0x00000003) /* MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CFGHR_MODE8_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define GPIO_CFGHR_MODE8_1 ((uint32_t)0x00000002) /* Bit 1 */ + +#define GPIO_CFGHR_MODE9 ((uint32_t)0x00000030) /* MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CFGHR_MODE9_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define GPIO_CFGHR_MODE9_1 ((uint32_t)0x00000020) /* Bit 1 */ + +#define GPIO_CFGHR_MODE10 ((uint32_t)0x00000300) /* MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CFGHR_MODE10_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define GPIO_CFGHR_MODE10_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define GPIO_CFGHR_MODE11 ((uint32_t)0x00003000) /* MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CFGHR_MODE11_0 ((uint32_t)0x00001000) /* Bit 0 */ +#define GPIO_CFGHR_MODE11_1 ((uint32_t)0x00002000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE12 ((uint32_t)0x00030000) /* MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CFGHR_MODE12_0 ((uint32_t)0x00010000) /* Bit 0 */ +#define GPIO_CFGHR_MODE12_1 ((uint32_t)0x00020000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE13 ((uint32_t)0x00300000) /* MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CFGHR_MODE13_0 ((uint32_t)0x00100000) /* Bit 0 */ +#define GPIO_CFGHR_MODE13_1 ((uint32_t)0x00200000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE14 ((uint32_t)0x03000000) /* MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CFGHR_MODE14_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define GPIO_CFGHR_MODE14_1 ((uint32_t)0x02000000) /* Bit 1 */ + +#define GPIO_CFGHR_MODE15 ((uint32_t)0x30000000) /* MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CFGHR_MODE15_0 ((uint32_t)0x10000000) /* Bit 0 */ +#define GPIO_CFGHR_MODE15_1 ((uint32_t)0x20000000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF ((uint32_t)0xCCCCCCCC) /* Port x configuration bits */ + +#define GPIO_CFGHR_CNF8 ((uint32_t)0x0000000C) /* CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CFGHR_CNF8_0 ((uint32_t)0x00000004) /* Bit 0 */ +#define GPIO_CFGHR_CNF8_1 ((uint32_t)0x00000008) /* Bit 1 */ + +#define GPIO_CFGHR_CNF9 ((uint32_t)0x000000C0) /* CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CFGHR_CNF9_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define GPIO_CFGHR_CNF9_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define GPIO_CFGHR_CNF10 ((uint32_t)0x00000C00) /* CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CFGHR_CNF10_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define GPIO_CFGHR_CNF10_1 ((uint32_t)0x00000800) /* Bit 1 */ + +#define GPIO_CFGHR_CNF11 ((uint32_t)0x0000C000) /* CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CFGHR_CNF11_0 ((uint32_t)0x00004000) /* Bit 0 */ +#define GPIO_CFGHR_CNF11_1 ((uint32_t)0x00008000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF12 ((uint32_t)0x000C0000) /* CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CFGHR_CNF12_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define GPIO_CFGHR_CNF12_1 ((uint32_t)0x00080000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF13 ((uint32_t)0x00C00000) /* CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CFGHR_CNF13_0 ((uint32_t)0x00400000) /* Bit 0 */ +#define GPIO_CFGHR_CNF13_1 ((uint32_t)0x00800000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF14 ((uint32_t)0x0C000000) /* CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CFGHR_CNF14_0 ((uint32_t)0x04000000) /* Bit 0 */ +#define GPIO_CFGHR_CNF14_1 ((uint32_t)0x08000000) /* Bit 1 */ + +#define GPIO_CFGHR_CNF15 ((uint32_t)0xC0000000) /* CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CFGHR_CNF15_0 ((uint32_t)0x40000000) /* Bit 0 */ +#define GPIO_CFGHR_CNF15_1 ((uint32_t)0x80000000) /* Bit 1 */ + +/******************* Bit definition for GPIO_INDR register *******************/ +#define GPIO_INDR_IDR0 ((uint16_t)0x0001) /* Port input data, bit 0 */ +#define GPIO_INDR_IDR1 ((uint16_t)0x0002) /* Port input data, bit 1 */ +#define GPIO_INDR_IDR2 ((uint16_t)0x0004) /* Port input data, bit 2 */ +#define GPIO_INDR_IDR3 ((uint16_t)0x0008) /* Port input data, bit 3 */ +#define GPIO_INDR_IDR4 ((uint16_t)0x0010) /* Port input data, bit 4 */ +#define GPIO_INDR_IDR5 ((uint16_t)0x0020) /* Port input data, bit 5 */ +#define GPIO_INDR_IDR6 ((uint16_t)0x0040) /* Port input data, bit 6 */ +#define GPIO_INDR_IDR7 ((uint16_t)0x0080) /* Port input data, bit 7 */ +#define GPIO_INDR_IDR8 ((uint16_t)0x0100) /* Port input data, bit 8 */ +#define GPIO_INDR_IDR9 ((uint16_t)0x0200) /* Port input data, bit 9 */ +#define GPIO_INDR_IDR10 ((uint16_t)0x0400) /* Port input data, bit 10 */ +#define GPIO_INDR_IDR11 ((uint16_t)0x0800) /* Port input data, bit 11 */ +#define GPIO_INDR_IDR12 ((uint16_t)0x1000) /* Port input data, bit 12 */ +#define GPIO_INDR_IDR13 ((uint16_t)0x2000) /* Port input data, bit 13 */ +#define GPIO_INDR_IDR14 ((uint16_t)0x4000) /* Port input data, bit 14 */ +#define GPIO_INDR_IDR15 ((uint16_t)0x8000) /* Port input data, bit 15 */ + +/******************* Bit definition for GPIO_OUTDR register *******************/ +#define GPIO_OUTDR_ODR0 ((uint16_t)0x0001) /* Port output data, bit 0 */ +#define GPIO_OUTDR_ODR1 ((uint16_t)0x0002) /* Port output data, bit 1 */ +#define GPIO_OUTDR_ODR2 ((uint16_t)0x0004) /* Port output data, bit 2 */ +#define GPIO_OUTDR_ODR3 ((uint16_t)0x0008) /* Port output data, bit 3 */ +#define GPIO_OUTDR_ODR4 ((uint16_t)0x0010) /* Port output data, bit 4 */ +#define GPIO_OUTDR_ODR5 ((uint16_t)0x0020) /* Port output data, bit 5 */ +#define GPIO_OUTDR_ODR6 ((uint16_t)0x0040) /* Port output data, bit 6 */ +#define GPIO_OUTDR_ODR7 ((uint16_t)0x0080) /* Port output data, bit 7 */ +#define GPIO_OUTDR_ODR8 ((uint16_t)0x0100) /* Port output data, bit 8 */ +#define GPIO_OUTDR_ODR9 ((uint16_t)0x0200) /* Port output data, bit 9 */ +#define GPIO_OUTDR_ODR10 ((uint16_t)0x0400) /* Port output data, bit 10 */ +#define GPIO_OUTDR_ODR11 ((uint16_t)0x0800) /* Port output data, bit 11 */ +#define GPIO_OUTDR_ODR12 ((uint16_t)0x1000) /* Port output data, bit 12 */ +#define GPIO_OUTDR_ODR13 ((uint16_t)0x2000) /* Port output data, bit 13 */ +#define GPIO_OUTDR_ODR14 ((uint16_t)0x4000) /* Port output data, bit 14 */ +#define GPIO_OUTDR_ODR15 ((uint16_t)0x8000) /* Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSHR register *******************/ +#define GPIO_BSHR_BS0 ((uint32_t)0x00000001) /* Port x Set bit 0 */ +#define GPIO_BSHR_BS1 ((uint32_t)0x00000002) /* Port x Set bit 1 */ +#define GPIO_BSHR_BS2 ((uint32_t)0x00000004) /* Port x Set bit 2 */ +#define GPIO_BSHR_BS3 ((uint32_t)0x00000008) /* Port x Set bit 3 */ +#define GPIO_BSHR_BS4 ((uint32_t)0x00000010) /* Port x Set bit 4 */ +#define GPIO_BSHR_BS5 ((uint32_t)0x00000020) /* Port x Set bit 5 */ +#define GPIO_BSHR_BS6 ((uint32_t)0x00000040) /* Port x Set bit 6 */ +#define GPIO_BSHR_BS7 ((uint32_t)0x00000080) /* Port x Set bit 7 */ +#define GPIO_BSHR_BS8 ((uint32_t)0x00000100) /* Port x Set bit 8 */ +#define GPIO_BSHR_BS9 ((uint32_t)0x00000200) /* Port x Set bit 9 */ +#define GPIO_BSHR_BS10 ((uint32_t)0x00000400) /* Port x Set bit 10 */ +#define GPIO_BSHR_BS11 ((uint32_t)0x00000800) /* Port x Set bit 11 */ +#define GPIO_BSHR_BS12 ((uint32_t)0x00001000) /* Port x Set bit 12 */ +#define GPIO_BSHR_BS13 ((uint32_t)0x00002000) /* Port x Set bit 13 */ +#define GPIO_BSHR_BS14 ((uint32_t)0x00004000) /* Port x Set bit 14 */ +#define GPIO_BSHR_BS15 ((uint32_t)0x00008000) /* Port x Set bit 15 */ + +#define GPIO_BSHR_BR0 ((uint32_t)0x00010000) /* Port x Reset bit 0 */ +#define GPIO_BSHR_BR1 ((uint32_t)0x00020000) /* Port x Reset bit 1 */ +#define GPIO_BSHR_BR2 ((uint32_t)0x00040000) /* Port x Reset bit 2 */ +#define GPIO_BSHR_BR3 ((uint32_t)0x00080000) /* Port x Reset bit 3 */ +#define GPIO_BSHR_BR4 ((uint32_t)0x00100000) /* Port x Reset bit 4 */ +#define GPIO_BSHR_BR5 ((uint32_t)0x00200000) /* Port x Reset bit 5 */ +#define GPIO_BSHR_BR6 ((uint32_t)0x00400000) /* Port x Reset bit 6 */ +#define GPIO_BSHR_BR7 ((uint32_t)0x00800000) /* Port x Reset bit 7 */ +#define GPIO_BSHR_BR8 ((uint32_t)0x01000000) /* Port x Reset bit 8 */ +#define GPIO_BSHR_BR9 ((uint32_t)0x02000000) /* Port x Reset bit 9 */ +#define GPIO_BSHR_BR10 ((uint32_t)0x04000000) /* Port x Reset bit 10 */ +#define GPIO_BSHR_BR11 ((uint32_t)0x08000000) /* Port x Reset bit 11 */ +#define GPIO_BSHR_BR12 ((uint32_t)0x10000000) /* Port x Reset bit 12 */ +#define GPIO_BSHR_BR13 ((uint32_t)0x20000000) /* Port x Reset bit 13 */ +#define GPIO_BSHR_BR14 ((uint32_t)0x40000000) /* Port x Reset bit 14 */ +#define GPIO_BSHR_BR15 ((uint32_t)0x80000000) /* Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BCR register *******************/ +#define GPIO_BCR_BR0 ((uint16_t)0x0001) /* Port x Reset bit 0 */ +#define GPIO_BCR_BR1 ((uint16_t)0x0002) /* Port x Reset bit 1 */ +#define GPIO_BCR_BR2 ((uint16_t)0x0004) /* Port x Reset bit 2 */ +#define GPIO_BCR_BR3 ((uint16_t)0x0008) /* Port x Reset bit 3 */ +#define GPIO_BCR_BR4 ((uint16_t)0x0010) /* Port x Reset bit 4 */ +#define GPIO_BCR_BR5 ((uint16_t)0x0020) /* Port x Reset bit 5 */ +#define GPIO_BCR_BR6 ((uint16_t)0x0040) /* Port x Reset bit 6 */ +#define GPIO_BCR_BR7 ((uint16_t)0x0080) /* Port x Reset bit 7 */ +#define GPIO_BCR_BR8 ((uint16_t)0x0100) /* Port x Reset bit 8 */ +#define GPIO_BCR_BR9 ((uint16_t)0x0200) /* Port x Reset bit 9 */ +#define GPIO_BCR_BR10 ((uint16_t)0x0400) /* Port x Reset bit 10 */ +#define GPIO_BCR_BR11 ((uint16_t)0x0800) /* Port x Reset bit 11 */ +#define GPIO_BCR_BR12 ((uint16_t)0x1000) /* Port x Reset bit 12 */ +#define GPIO_BCR_BR13 ((uint16_t)0x2000) /* Port x Reset bit 13 */ +#define GPIO_BCR_BR14 ((uint16_t)0x4000) /* Port x Reset bit 14 */ +#define GPIO_BCR_BR15 ((uint16_t)0x8000) /* Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCK0 ((uint32_t)0x00000001) /* Port x Lock bit 0 */ +#define GPIO_LCK1 ((uint32_t)0x00000002) /* Port x Lock bit 1 */ +#define GPIO_LCK2 ((uint32_t)0x00000004) /* Port x Lock bit 2 */ +#define GPIO_LCK3 ((uint32_t)0x00000008) /* Port x Lock bit 3 */ +#define GPIO_LCK4 ((uint32_t)0x00000010) /* Port x Lock bit 4 */ +#define GPIO_LCK5 ((uint32_t)0x00000020) /* Port x Lock bit 5 */ +#define GPIO_LCK6 ((uint32_t)0x00000040) /* Port x Lock bit 6 */ +#define GPIO_LCK7 ((uint32_t)0x00000080) /* Port x Lock bit 7 */ +#define GPIO_LCK8 ((uint32_t)0x00000100) /* Port x Lock bit 8 */ +#define GPIO_LCK9 ((uint32_t)0x00000200) /* Port x Lock bit 9 */ +#define GPIO_LCK10 ((uint32_t)0x00000400) /* Port x Lock bit 10 */ +#define GPIO_LCK11 ((uint32_t)0x00000800) /* Port x Lock bit 11 */ +#define GPIO_LCK12 ((uint32_t)0x00001000) /* Port x Lock bit 12 */ +#define GPIO_LCK13 ((uint32_t)0x00002000) /* Port x Lock bit 13 */ +#define GPIO_LCK14 ((uint32_t)0x00004000) /* Port x Lock bit 14 */ +#define GPIO_LCK15 ((uint32_t)0x00008000) /* Port x Lock bit 15 */ +#define GPIO_LCKK ((uint32_t)0x00010000) /* Lock key */ + + +/****************** Bit definition for AFIO_ECR register *******************/ +#define AFIO_ECR_PIN ((uint8_t)0x0F) /* PIN[3:0] bits (Pin selection) */ +#define AFIO_ECR_PIN_0 ((uint8_t)0x01) /* Bit 0 */ +#define AFIO_ECR_PIN_1 ((uint8_t)0x02) /* Bit 1 */ +#define AFIO_ECR_PIN_2 ((uint8_t)0x04) /* Bit 2 */ +#define AFIO_ECR_PIN_3 ((uint8_t)0x08) /* Bit 3 */ + +#define AFIO_ECR_PIN_PX0 ((uint8_t)0x00) /* Pin 0 selected */ +#define AFIO_ECR_PIN_PX1 ((uint8_t)0x01) /* Pin 1 selected */ +#define AFIO_ECR_PIN_PX2 ((uint8_t)0x02) /* Pin 2 selected */ +#define AFIO_ECR_PIN_PX3 ((uint8_t)0x03) /* Pin 3 selected */ +#define AFIO_ECR_PIN_PX4 ((uint8_t)0x04) /* Pin 4 selected */ +#define AFIO_ECR_PIN_PX5 ((uint8_t)0x05) /* Pin 5 selected */ +#define AFIO_ECR_PIN_PX6 ((uint8_t)0x06) /* Pin 6 selected */ +#define AFIO_ECR_PIN_PX7 ((uint8_t)0x07) /* Pin 7 selected */ +#define AFIO_ECR_PIN_PX8 ((uint8_t)0x08) /* Pin 8 selected */ +#define AFIO_ECR_PIN_PX9 ((uint8_t)0x09) /* Pin 9 selected */ +#define AFIO_ECR_PIN_PX10 ((uint8_t)0x0A) /* Pin 10 selected */ +#define AFIO_ECR_PIN_PX11 ((uint8_t)0x0B) /* Pin 11 selected */ +#define AFIO_ECR_PIN_PX12 ((uint8_t)0x0C) /* Pin 12 selected */ +#define AFIO_ECR_PIN_PX13 ((uint8_t)0x0D) /* Pin 13 selected */ +#define AFIO_ECR_PIN_PX14 ((uint8_t)0x0E) /* Pin 14 selected */ +#define AFIO_ECR_PIN_PX15 ((uint8_t)0x0F) /* Pin 15 selected */ + +#define AFIO_ECR_PORT ((uint8_t)0x70) /* PORT[2:0] bits (Port selection) */ +#define AFIO_ECR_PORT_0 ((uint8_t)0x10) /* Bit 0 */ +#define AFIO_ECR_PORT_1 ((uint8_t)0x20) /* Bit 1 */ +#define AFIO_ECR_PORT_2 ((uint8_t)0x40) /* Bit 2 */ + +#define AFIO_ECR_PORT_PA ((uint8_t)0x00) /* Port A selected */ +#define AFIO_ECR_PORT_PB ((uint8_t)0x10) /* Port B selected */ +#define AFIO_ECR_PORT_PC ((uint8_t)0x20) /* Port C selected */ +#define AFIO_ECR_PORT_PD ((uint8_t)0x30) /* Port D selected */ +#define AFIO_ECR_PORT_PE ((uint8_t)0x40) /* Port E selected */ + +#define AFIO_ECR_EVOE ((uint8_t)0x80) /* Event Output Enable */ + +/****************** Bit definition for AFIO_PCFR1register *******************/ +#define AFIO_PCFR1_SPI1_REMAP ((uint32_t)0x00000001) /* SPI1 remapping */ +#define AFIO_PCFR1_I2C1_REMAP ((uint32_t)0x00000002) /* I2C1 remapping */ +#define AFIO_PCFR1_USART1_REMAP ((uint32_t)0x00000004) /* USART1 remapping */ +#define AFIO_PCFR1_USART2_REMAP ((uint32_t)0x00000008) /* USART2 remapping */ + +#define AFIO_PCFR1_USART3_REMAP ((uint32_t)0x00000030) /* USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_PCFR1_USART3_REMAP_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define AFIO_PCFR1_USART3_REMAP_1 ((uint32_t)0x00000020) /* Bit 1 */ + +#define AFIO_PCFR1_USART3_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_PCFR1_USART3_REMAP_PARTIALREMAP1 ((uint32_t)0x00000010) /* Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_PCFR1_USART3_REMAP_PARTIALREMAP2 ((uint32_t)0x00000020) +#define AFIO_PCFR1_USART3_REMAP_FULLREMAP ((uint32_t)0x00000030) /* Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_PCFR1_TIM1_REMAP ((uint32_t)0x000000C0) /* TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_PCFR1_TIM1_REMAP_0 ((uint32_t)0x00000040) /* Bit 0 */ +#define AFIO_PCFR1_TIM1_REMAP_1 ((uint32_t)0x00000080) /* Bit 1 */ + +#define AFIO_PCFR1_TIM1_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_PCFR1_TIM1_REMAP_PARTIALREMAP ((uint32_t)0x00000040) /* Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_PCFR1_TIM1_REMAP_FULLREMAP ((uint32_t)0x000000C0) /* Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_PCFR1_TIM2_REMAP ((uint32_t)0x00000300) /* TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_PCFR1_TIM2_REMAP_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define AFIO_PCFR1_TIM2_REMAP_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define AFIO_PCFR1_TIM2_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP1 ((uint32_t)0x00000100) /* Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_PCFR1_TIM2_REMAP_PARTIALREMAP2 ((uint32_t)0x00000200) /* Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_PCFR1_TIM2_REMAP_FULLREMAP ((uint32_t)0x00000300) /* Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_PCFR1_TIM3_REMAP ((uint32_t)0x00000C00) /* TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_PCFR1_TIM3_REMAP_0 ((uint32_t)0x00000400) /* Bit 0 */ +#define AFIO_PCFR1_TIM3_REMAP_1 ((uint32_t)0x00000800) /* Bit 1 */ + +#define AFIO_PCFR1_TIM3_REMAP_NOREMAP ((uint32_t)0x00000000) /* No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_PCFR1_TIM3_REMAP_PARTIALREMAP ((uint32_t)0x00000800) /* Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_PCFR1_TIM3_REMAP_FULLREMAP ((uint32_t)0x00000C00) /* Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_PCFR1_TIM4_REMAP ((uint32_t)0x00001000) /* TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_PCFR1_CAN_REMAP ((uint32_t)0x00006000) /* CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_PCFR1_CAN_REMAP_0 ((uint32_t)0x00002000) /* Bit 0 */ +#define AFIO_PCFR1_CAN_REMAP_1 ((uint32_t)0x00004000) /* Bit 1 */ + +#define AFIO_PCFR1_CAN_REMAP_REMAP1 ((uint32_t)0x00000000) /* CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_PCFR1_CAN_REMAP_REMAP2 ((uint32_t)0x00004000) /* CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_PCFR1_CAN_REMAP_REMAP3 ((uint32_t)0x00006000) /* CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_PCFR1_PD01_REMAP ((uint32_t)0x00008000) /* Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_PCFR1_TIM5CH4_IREMAP ((uint32_t)0x00010000) /* TIM5 Channel4 Internal Remap */ +#define AFIO_PCFR1_ADC1_ETRGINJ_REMAP ((uint32_t)0x00020000) /* ADC 1 External Trigger Injected Conversion remapping */ +#define AFIO_PCFR1_ADC1_ETRGREG_REMAP ((uint32_t)0x00040000) /* ADC 1 External Trigger Regular Conversion remapping */ +#define AFIO_PCFR1_ADC2_ETRGINJ_REMAP ((uint32_t)0x00080000) /* ADC 2 External Trigger Injected Conversion remapping */ +#define AFIO_PCFR1_ADC2_ETRGREG_REMAP ((uint32_t)0x00100000) /* ADC 2 External Trigger Regular Conversion remapping */ + +#define AFIO_PCFR1_ETH_REMAP ((uint32_t)0x00200000) + +#define AFIO_PCFR1_CAN2_REMAP ((uint32_t)0x00400000) + +#define AFIO_PCFR1_MII_RMII_REMAP ((uint32_t)0x00800000) + +#define AFIO_PCFR1_SWJ_CFG ((uint32_t)0x07000000) /* SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_PCFR1_SWJ_CFG_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define AFIO_PCFR1_SWJ_CFG_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define AFIO_PCFR1_SWJ_CFG_2 ((uint32_t)0x04000000) /* Bit 2 */ + +#define AFIO_PCFR1_SWJ_CFG_RESET ((uint32_t)0x00000000) /* Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_PCFR1_SWJ_CFG_NOJNTRST ((uint32_t)0x01000000) /* Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_PCFR1_SWJ_CFG_JTAGDISABLE ((uint32_t)0x02000000) /* JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_PCFR1_SWJ_CFG_DISABLE ((uint32_t)0x04000000) /* JTAG-DP Disabled and SW-DP Disabled */ + +#define AFIO_PCFR1_SPI3_REMAP ((uint32_t)0x10000000) + +#define AFIO_PCFR1_TIM2ITR1_REMAP ((uint32_t)0x20000000) + +#define AFIO_PCFR1_PTP_PPS_REMAP ((uint32_t)0x40000000) + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0 ((uint16_t)0x000F) /* EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1 ((uint16_t)0x00F0) /* EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2 ((uint16_t)0x0F00) /* EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3 ((uint16_t)0xF000) /* EXTI 3 configuration */ + +#define AFIO_EXTICR1_EXTI0_PA ((uint16_t)0x0000) /* PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB ((uint16_t)0x0001) /* PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC ((uint16_t)0x0002) /* PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD ((uint16_t)0x0003) /* PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE ((uint16_t)0x0004) /* PE[0] pin */ + +#define AFIO_EXTICR1_EXTI1_PA ((uint16_t)0x0000) /* PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB ((uint16_t)0x0010) /* PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC ((uint16_t)0x0020) /* PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD ((uint16_t)0x0030) /* PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE ((uint16_t)0x0040) /* PE[1] pin */ + +#define AFIO_EXTICR1_EXTI2_PA ((uint16_t)0x0000) /* PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB ((uint16_t)0x0100) /* PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC ((uint16_t)0x0200) /* PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD ((uint16_t)0x0300) /* PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE ((uint16_t)0x0400) /* PE[2] pin */ + +#define AFIO_EXTICR1_EXTI3_PA ((uint16_t)0x0000) /* PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB ((uint16_t)0x1000) /* PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC ((uint16_t)0x2000) /* PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD ((uint16_t)0x3000) /* PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE ((uint16_t)0x4000) /* PE[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4 ((uint16_t)0x000F) /* EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5 ((uint16_t)0x00F0) /* EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6 ((uint16_t)0x0F00) /* EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7 ((uint16_t)0xF000) /* EXTI 7 configuration */ + +#define AFIO_EXTICR2_EXTI4_PA ((uint16_t)0x0000) /* PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB ((uint16_t)0x0001) /* PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC ((uint16_t)0x0002) /* PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD ((uint16_t)0x0003) /* PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE ((uint16_t)0x0004) /* PE[4] pin */ + +#define AFIO_EXTICR2_EXTI5_PA ((uint16_t)0x0000) /* PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB ((uint16_t)0x0010) /* PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC ((uint16_t)0x0020) /* PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD ((uint16_t)0x0030) /* PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE ((uint16_t)0x0040) /* PE[5] pin */ + +#define AFIO_EXTICR2_EXTI6_PA ((uint16_t)0x0000) /* PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB ((uint16_t)0x0100) /* PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC ((uint16_t)0x0200) /* PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD ((uint16_t)0x0300) /* PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE ((uint16_t)0x0400) /* PE[6] pin */ + +#define AFIO_EXTICR2_EXTI7_PA ((uint16_t)0x0000) /* PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB ((uint16_t)0x1000) /* PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC ((uint16_t)0x2000) /* PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD ((uint16_t)0x3000) /* PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE ((uint16_t)0x4000) /* PE[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8 ((uint16_t)0x000F) /* EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9 ((uint16_t)0x00F0) /* EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10 ((uint16_t)0x0F00) /* EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11 ((uint16_t)0xF000) /* EXTI 11 configuration */ + +#define AFIO_EXTICR3_EXTI8_PA ((uint16_t)0x0000) /* PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB ((uint16_t)0x0001) /* PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC ((uint16_t)0x0002) /* PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD ((uint16_t)0x0003) /* PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE ((uint16_t)0x0004) /* PE[8] pin */ + +#define AFIO_EXTICR3_EXTI9_PA ((uint16_t)0x0000) /* PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB ((uint16_t)0x0010) /* PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC ((uint16_t)0x0020) /* PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD ((uint16_t)0x0030) /* PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE ((uint16_t)0x0040) /* PE[9] pin */ + +#define AFIO_EXTICR3_EXTI10_PA ((uint16_t)0x0000) /* PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB ((uint16_t)0x0100) /* PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC ((uint16_t)0x0200) /* PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD ((uint16_t)0x0300) /* PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE ((uint16_t)0x0400) /* PE[10] pin */ + +#define AFIO_EXTICR3_EXTI11_PA ((uint16_t)0x0000) /* PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB ((uint16_t)0x1000) /* PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC ((uint16_t)0x2000) /* PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD ((uint16_t)0x3000) /* PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE ((uint16_t)0x4000) /* PE[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12 ((uint16_t)0x000F) /* EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13 ((uint16_t)0x00F0) /* EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14 ((uint16_t)0x0F00) /* EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15 ((uint16_t)0xF000) /* EXTI 15 configuration */ + +#define AFIO_EXTICR4_EXTI12_PA ((uint16_t)0x0000) /* PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB ((uint16_t)0x0001) /* PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC ((uint16_t)0x0002) /* PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD ((uint16_t)0x0003) /* PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE ((uint16_t)0x0004) /* PE[12] pin */ + +#define AFIO_EXTICR4_EXTI13_PA ((uint16_t)0x0000) /* PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB ((uint16_t)0x0010) /* PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC ((uint16_t)0x0020) /* PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD ((uint16_t)0x0030) /* PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE ((uint16_t)0x0040) /* PE[13] pin */ + +#define AFIO_EXTICR4_EXTI14_PA ((uint16_t)0x0000) /* PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB ((uint16_t)0x0100) /* PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC ((uint16_t)0x0200) /* PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD ((uint16_t)0x0300) /* PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE ((uint16_t)0x0400) /* PE[14] pin *// + +#define AFIO_EXTICR4_EXTI15_PA ((uint16_t)0x0000) /* PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB ((uint16_t)0x1000) /* PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC ((uint16_t)0x2000) /* PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD ((uint16_t)0x3000) /* PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE ((uint16_t)0x4000) /* PE[15] pin */ + +/****************** Bit definition for AFIO_PCFR2register *******************/ +#define AFIO_PCFR2_TIM8_REMAP ((uint32_t)0x00000004) + +#define AFIO_PCFR2_TIM9_REMAP ((uint32_t)0x00000018) +#define AFIO_PCFR2_TIM9_REMAP_0 ((uint32_t)0x00000008) +#define AFIO_PCFR2_TIM9_REMAP_1 ((uint32_t)0x00000010) + +#define AFIO_PCFR2_TIM9_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_TIM9_REMAP_PARTIALREMAP ((uint32_t)0x00000008) +#define AFIO_PCFR2_TIM9_REMAP_FULLREMAP ((uint32_t)0x00000010) + +#define AFIO_PCFR2_TIM10_REMAP ((uint32_t)0x00000060) +#define AFIO_PCFR2_TIM10_REMAP_0 ((uint32_t)0x00000020) +#define AFIO_PCFR2_TIM10_REMAP_1 ((uint32_t)0x00000040) + +#define AFIO_PCFR2_TIM10_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_TIM10_REMAP_PARTIALREMAP ((uint32_t)0x00000020) +#define AFIO_PCFR2_TIM10_REMAP_FULLREMAP ((uint32_t)0x00000040) + +#define AFIO_PCFR2_FSMC_NADV_REMAP ((uint32_t)0x00000400) + + +#define AFIO_PCFR2_USART4_REMAP ((uint32_t)0x00030000) +#define AFIO_PCFR2_USART4_REMAP_0 ((uint32_t)0x00010000) +#define AFIO_PCFR2_USART4_REMAP_1 ((uint32_t)0x00020000) + +#define AFIO_PCFR2_USART4_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_USART4_REMAP_PARTIALREMAP ((uint32_t)0x00010000) +#define AFIO_PCFR2_USART4_REMAP_FULLREMAP ((uint32_t)0x00020000) + +#define AFIO_PCFR2_USART5_REMAP ((uint32_t)0x000C0000) +#define AFIO_PCFR2_USART5_REMAP_0 ((uint32_t)0x00040000) +#define AFIO_PCFR2_USART5_REMAP_1 ((uint32_t)0x00080000) + +#define AFIO_PCFR2_USART5_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_USART5_REMAP_PARTIALREMAP ((uint32_t)0x00040000) +#define AFIO_PCFR2_USART5_REMAP_FULLREMAP ((uint32_t)0x00080000) + +#define AFIO_PCFR2_USART6_REMAP ((uint32_t)0x00300000) +#define AFIO_PCFR2_USART6_REMAP_0 ((uint32_t)0x00100000) +#define AFIO_PCFR2_USART6_REMAP_1 ((uint32_t)0x00200000) + +#define AFIO_PCFR2_USART6_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_USART6_REMAP_PARTIALREMAP ((uint32_t)0x00100000) +#define AFIO_PCFR2_USART6_REMAP_FULLREMAP ((uint32_t)0x00200000) + +#define AFIO_PCFR2_USART7_REMAP ((uint32_t)0x00C00000) +#define AFIO_PCFR2_USART7_REMAP_0 ((uint32_t)0x00400000) +#define AFIO_PCFR2_USART7_REMAP_1 ((uint32_t)0x00800000) + +#define AFIO_PCFR2_USART7_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_USART7_REMAP_PARTIALREMAP ((uint32_t)0x00400000) +#define AFIO_PCFR2_USART7_REMAP_FULLREMAP ((uint32_t)0x00800000) + +#define AFIO_PCFR2_USART8_REMAP ((uint32_t)0x03000000) +#define AFIO_PCFR2_USART8_REMAP_0 ((uint32_t)0x01000000) +#define AFIO_PCFR2_USART8_REMAP_1 ((uint32_t)0x02000000) + +#define AFIO_PCFR2_USART8_REMAP_NOREMAP ((uint32_t)0x00000000) +#define AFIO_PCFR2_USART8_REMAP_PARTIALREMAP ((uint32_t)0x01000000) +#define AFIO_PCFR2_USART8_REMAP_FULLREMAP ((uint32_t)0x02000000) + +#define AFIO_PCFR2_USART1_REMAP ((uint32_t)0x04000000) + +/******************************************************************************/ +/* Independent WATCHDOG */ +/******************************************************************************/ + +/******************* Bit definition for IWDG_CTLR register ********************/ +#define IWDG_KEY ((uint16_t)0xFFFF) /* Key value (write only, read 0000h) */ + +/******************* Bit definition for IWDG_PSCR register ********************/ +#define IWDG_PR ((uint8_t)0x07) /* PR[2:0] (Prescaler divider) */ +#define IWDG_PR_0 ((uint8_t)0x01) /* Bit 0 */ +#define IWDG_PR_1 ((uint8_t)0x02) /* Bit 1 */ +#define IWDG_PR_2 ((uint8_t)0x04) /* Bit 2 */ + +/******************* Bit definition for IWDG_RLDR register *******************/ +#define IWDG_RL ((uint16_t)0x0FFF) /* Watchdog counter reload value */ + +/******************* Bit definition for IWDG_STATR register ********************/ +#define IWDG_PVU ((uint8_t)0x01) /* Watchdog prescaler value update */ +#define IWDG_RVU ((uint8_t)0x02) /* Watchdog counter reload value update */ + +/******************************************************************************/ +/* Inter-integrated Circuit Interface */ +/******************************************************************************/ + +/******************* Bit definition for I2C_CTLR1 register ********************/ +#define I2C_CTLR1_PE ((uint16_t)0x0001) /* Peripheral Enable */ +#define I2C_CTLR1_SMBUS ((uint16_t)0x0002) /* SMBus Mode */ +#define I2C_CTLR1_SMBTYPE ((uint16_t)0x0008) /* SMBus Type */ +#define I2C_CTLR1_ENARP ((uint16_t)0x0010) /* ARP Enable */ +#define I2C_CTLR1_ENPEC ((uint16_t)0x0020) /* PEC Enable */ +#define I2C_CTLR1_ENGC ((uint16_t)0x0040) /* General Call Enable */ +#define I2C_CTLR1_NOSTRETCH ((uint16_t)0x0080) /* Clock Stretching Disable (Slave mode) */ +#define I2C_CTLR1_START ((uint16_t)0x0100) /* Start Generation */ +#define I2C_CTLR1_STOP ((uint16_t)0x0200) /* Stop Generation */ +#define I2C_CTLR1_ACK ((uint16_t)0x0400) /* Acknowledge Enable */ +#define I2C_CTLR1_POS ((uint16_t)0x0800) /* Acknowledge/PEC Position (for data reception) */ +#define I2C_CTLR1_PEC ((uint16_t)0x1000) /* Packet Error Checking */ +#define I2C_CTLR1_ALERT ((uint16_t)0x2000) /* SMBus Alert */ +#define I2C_CTLR1_SWRST ((uint16_t)0x8000) /* Software Reset */ + +/******************* Bit definition for I2C_CTLR2 register ********************/ +#define I2C_CTLR2_FREQ ((uint16_t)0x003F) /* FREQ[5:0] bits (Peripheral Clock Frequency) */ +#define I2C_CTLR2_FREQ_0 ((uint16_t)0x0001) /* Bit 0 */ +#define I2C_CTLR2_FREQ_1 ((uint16_t)0x0002) /* Bit 1 */ +#define I2C_CTLR2_FREQ_2 ((uint16_t)0x0004) /* Bit 2 */ +#define I2C_CTLR2_FREQ_3 ((uint16_t)0x0008) /* Bit 3 */ +#define I2C_CTLR2_FREQ_4 ((uint16_t)0x0010) /* Bit 4 */ +#define I2C_CTLR2_FREQ_5 ((uint16_t)0x0020) /* Bit 5 */ + +#define I2C_CTLR2_ITERREN ((uint16_t)0x0100) /* Error Interrupt Enable */ +#define I2C_CTLR2_ITEVTEN ((uint16_t)0x0200) /* Event Interrupt Enable */ +#define I2C_CTLR2_ITBUFEN ((uint16_t)0x0400) /* Buffer Interrupt Enable */ +#define I2C_CTLR2_DMAEN ((uint16_t)0x0800) /* DMA Requests Enable */ +#define I2C_CTLR2_LAST ((uint16_t)0x1000) /* DMA Last Transfer */ + +/******************* Bit definition for I2C_OADDR1 register *******************/ +#define I2C_OADDR1_ADD0 ((uint16_t)0x0001) +#define I2C_OADDR1_ADD1_7 ((uint16_t)0x00FE) /* Interface Address */ +#define I2C_OADDR1_ADD8_9 ((uint16_t)0x0300) /* Interface Address */ + +#define I2C_OADDR1_ADD0 ((uint16_t)0x0001) /* Bit 0 */ +#define I2C_OADDR1_ADD1 ((uint16_t)0x0002) /* Bit 1 */ +#define I2C_OADDR1_ADD2 ((uint16_t)0x0004) /* Bit 2 */ +#define I2C_OADDR1_ADD3 ((uint16_t)0x0008) /* Bit 3 */ +#define I2C_OADDR1_ADD4 ((uint16_t)0x0010) /* Bit 4 */ +#define I2C_OADDR1_ADD5 ((uint16_t)0x0020) /* Bit 5 */ +#define I2C_OADDR1_ADD6 ((uint16_t)0x0040) /* Bit 6 */ +#define I2C_OADDR1_ADD7 ((uint16_t)0x0080) /* Bit 7 */ +#define I2C_OADDR1_ADD8 ((uint16_t)0x0100) /* Bit 8 */ +#define I2C_OADDR1_ADD9 ((uint16_t)0x0200) /* Bit 9 */ + +#define I2C_OADDR1_ADDMODE ((uint16_t)0x8000) /* Addressing Mode (Slave mode) */ + +/******************* Bit definition for I2C_OADDR2 register *******************/ +#define I2C_OADDR2_ENDUAL ((uint8_t)0x01) /* Dual addressing mode enable */ +#define I2C_OADDR2_ADD2 ((uint8_t)0xFE) /* Interface address */ + +/******************** Bit definition for I2C_DATAR register ********************/ +#define I2C_DR_DATAR ((uint8_t)0xFF) /* 8-bit Data Register */ + +/******************* Bit definition for I2C_STAR1 register ********************/ +#define I2C_STAR1_SB ((uint16_t)0x0001) /* Start Bit (Master mode) */ +#define I2C_STAR1_ADDR ((uint16_t)0x0002) /* Address sent (master mode)/matched (slave mode) */ +#define I2C_STAR1_BTF ((uint16_t)0x0004) /* Byte Transfer Finished */ +#define I2C_STAR1_ADD10 ((uint16_t)0x0008) /* 10-bit header sent (Master mode) */ +#define I2C_STAR1_STOPF ((uint16_t)0x0010) /* Stop detection (Slave mode) */ +#define I2C_STAR1_RXNE ((uint16_t)0x0040) /* Data Register not Empty (receivers) */ +#define I2C_STAR1_TXE ((uint16_t)0x0080) /* Data Register Empty (transmitters) */ +#define I2C_STAR1_BERR ((uint16_t)0x0100) /* Bus Error */ +#define I2C_STAR1_ARLO ((uint16_t)0x0200) /* Arbitration Lost (master mode) */ +#define I2C_STAR1_AF ((uint16_t)0x0400) /* Acknowledge Failure */ +#define I2C_STAR1_OVR ((uint16_t)0x0800) /* Overrun/Underrun */ +#define I2C_STAR1_PECERR ((uint16_t)0x1000) /* PEC Error in reception */ +#define I2C_STAR1_TIMEOUT ((uint16_t)0x4000) /* Timeout or Tlow Error */ +#define I2C_STAR1_SMBALERT ((uint16_t)0x8000) /* SMBus Alert */ + +/******************* Bit definition for I2C_STAR2 register ********************/ +#define I2C_STAR2_MSL ((uint16_t)0x0001) /* Master/Slave */ +#define I2C_STAR2_BUSY ((uint16_t)0x0002) /* Bus Busy */ +#define I2C_STAR2_TRA ((uint16_t)0x0004) /* Transmitter/Receiver */ +#define I2C_STAR2_GENCALL ((uint16_t)0x0010) /* General Call Address (Slave mode) */ +#define I2C_STAR2_SMBDEFAULT ((uint16_t)0x0020) /* SMBus Device Default Address (Slave mode) */ +#define I2C_STAR2_SMBHOST ((uint16_t)0x0040) /* SMBus Host Header (Slave mode) */ +#define I2C_STAR2_DUALF ((uint16_t)0x0080) /* Dual Flag (Slave mode) */ +#define I2C_STAR2_PEC ((uint16_t)0xFF00) /* Packet Error Checking Register */ + +/******************* Bit definition for I2C_CKCFGR register ********************/ +#define I2C_CKCFGR_CCR ((uint16_t)0x0FFF) /* Clock Control Register in Fast/Standard mode (Master mode) */ +#define I2C_CKCFGR_DUTY ((uint16_t)0x4000) /* Fast Mode Duty Cycle */ +#define I2C_CKCFGR_FS ((uint16_t)0x8000) /* I2C Master Mode Selection */ + +/****************** Bit definition for I2C_RTR register *******************/ +#define I2C_RTR_TRISE ((uint8_t)0x3F) /* Maximum Rise Time in Fast/Standard mode (Master mode) */ + + +/******************************************************************************/ +/* Power Control */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CTLR register ********************/ +#define PWR_CTLR_LPDS ((uint16_t)0x0001) /* Low-Power Deepsleep */ +#define PWR_CTLR_PDDS ((uint16_t)0x0002) /* Power Down Deepsleep */ +#define PWR_CTLR_CWUF ((uint16_t)0x0004) /* Clear Wakeup Flag */ +#define PWR_CTLR_CSBF ((uint16_t)0x0008) /* Clear Standby Flag */ +#define PWR_CTLR_PVDE ((uint16_t)0x0010) /* Power Voltage Detector Enable */ + +#define PWR_CTLR_PLS ((uint16_t)0x00E0) /* PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CTLR_PLS_0 ((uint16_t)0x0020) /* Bit 0 */ +#define PWR_CTLR_PLS_1 ((uint16_t)0x0040) /* Bit 1 */ +#define PWR_CTLR_PLS_2 ((uint16_t)0x0080) /* Bit 2 */ + +#define PWR_CTLR_PLS_MODE0 ((uint16_t)0x0000) +#define PWR_CTLR_PLS_MODE1 ((uint16_t)0x0020) +#define PWR_CTLR_PLS_MODE2 ((uint16_t)0x0040) +#define PWR_CTLR_PLS_MODE3 ((uint16_t)0x0060) +#define PWR_CTLR_PLS_MODE4 ((uint16_t)0x0080) +#define PWR_CTLR_PLS_MODE5 ((uint16_t)0x00A0) +#define PWR_CTLR_PLS_MODE6 ((uint16_t)0x00C0) +#define PWR_CTLR_PLS_MODE7 ((uint16_t)0x00E0) + +#define PWR_CTLR_PLS_2V2 PWR_CTLR_PLS_MODE0 +#define PWR_CTLR_PLS_2V3 PWR_CTLR_PLS_MODE1 +#define PWR_CTLR_PLS_2V4 PWR_CTLR_PLS_MODE2 +#define PWR_CTLR_PLS_2V5 PWR_CTLR_PLS_MODE3 +#define PWR_CTLR_PLS_2V6 PWR_CTLR_PLS_MODE4 +#define PWR_CTLR_PLS_2V7 PWR_CTLR_PLS_MODE5 +#define PWR_CTLR_PLS_2V8 PWR_CTLR_PLS_MODE6 +#define PWR_CTLR_PLS_2V9 PWR_CTLR_PLS_MODE7 + +#define PWR_CTLR_DBP ((uint16_t)0x0100) /* Disable Backup Domain write protection */ + +#define PWR_CTLR_R2KSTY ((uint32_t)0x10000) +#define PWR_CTLR_R30KSTY ((uint32_t)0x20000) +#define PWR_CTLR_R2KVBAT ((uint32_t)0x40000) +#define PWR_CTLR_R30KVBAT ((uint32_t)0x80000) +#define PWR_CTLR_RAMLV ((uint32_t)0x100000) + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF ((uint16_t)0x0001) /* Wakeup Flag */ +#define PWR_CSR_SBF ((uint16_t)0x0002) /* Standby Flag */ +#define PWR_CSR_PVDO ((uint16_t)0x0004) /* PVD Output */ +#define PWR_CSR_EWUP ((uint16_t)0x0100) /* Enable WKUP pin */ + + + +/******************************************************************************/ +/* Reset and Clock Control */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CTLR register ********************/ +#define RCC_HSION ((uint32_t)0x00000001) /* Internal High Speed clock enable */ +#define RCC_HSIRDY ((uint32_t)0x00000002) /* Internal High Speed clock ready flag */ +#define RCC_HSITRIM ((uint32_t)0x000000F8) /* Internal High Speed clock trimming */ +#define RCC_HSICAL ((uint32_t)0x0000FF00) /* Internal High Speed clock Calibration */ +#define RCC_HSEON ((uint32_t)0x00010000) /* External High Speed clock enable */ +#define RCC_HSERDY ((uint32_t)0x00020000) /* External High Speed clock ready flag */ +#define RCC_HSEBYP ((uint32_t)0x00040000) /* External High Speed clock Bypass */ +#define RCC_CSSON ((uint32_t)0x00080000) /* Clock Security System enable */ +#define RCC_PLLON ((uint32_t)0x01000000) /* PLL enable */ +#define RCC_PLLRDY ((uint32_t)0x02000000) /* PLL clock ready flag */ +#define RCC_PLL2ON ((uint32_t)0x04000000) +#define RCC_PLL2RDY ((uint32_t)0x08000000) +#define RCC_PLL3ON ((uint32_t)0x10000000) +#define RCC_PLL3RDY ((uint32_t)0x20000000) + +/******************* Bit definition for RCC_CFGR0 register *******************/ +#define RCC_SW ((uint32_t)0x00000003) /* SW[1:0] bits (System clock Switch) */ +#define RCC_SW_0 ((uint32_t)0x00000001) /* Bit 0 */ +#define RCC_SW_1 ((uint32_t)0x00000002) /* Bit 1 */ + +#define RCC_SW_HSI ((uint32_t)0x00000000) /* HSI selected as system clock */ +#define RCC_SW_HSE ((uint32_t)0x00000001) /* HSE selected as system clock */ +#define RCC_SW_PLL ((uint32_t)0x00000002) /* PLL selected as system clock */ + +#define RCC_SWS ((uint32_t)0x0000000C) /* SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_SWS_0 ((uint32_t)0x00000004) /* Bit 0 */ +#define RCC_SWS_1 ((uint32_t)0x00000008) /* Bit 1 */ + +#define RCC_SWS_HSI ((uint32_t)0x00000000) /* HSI oscillator used as system clock */ +#define RCC_SWS_HSE ((uint32_t)0x00000004) /* HSE oscillator used as system clock */ +#define RCC_SWS_PLL ((uint32_t)0x00000008) /* PLL used as system clock */ + +#define RCC_HPRE ((uint32_t)0x000000F0) /* HPRE[3:0] bits (AHB prescaler) */ +#define RCC_HPRE_0 ((uint32_t)0x00000010) /* Bit 0 */ +#define RCC_HPRE_1 ((uint32_t)0x00000020) /* Bit 1 */ +#define RCC_HPRE_2 ((uint32_t)0x00000040) /* Bit 2 */ +#define RCC_HPRE_3 ((uint32_t)0x00000080) /* Bit 3 */ + +#define RCC_HPRE_DIV1 ((uint32_t)0x00000000) /* SYSCLK not divided */ +#define RCC_HPRE_DIV2 ((uint32_t)0x00000080) /* SYSCLK divided by 2 */ +#define RCC_HPRE_DIV4 ((uint32_t)0x00000090) /* SYSCLK divided by 4 */ +#define RCC_HPRE_DIV8 ((uint32_t)0x000000A0) /* SYSCLK divided by 8 */ +#define RCC_HPRE_DIV16 ((uint32_t)0x000000B0) /* SYSCLK divided by 16 */ +#define RCC_HPRE_DIV64 ((uint32_t)0x000000C0) /* SYSCLK divided by 64 */ +#define RCC_HPRE_DIV128 ((uint32_t)0x000000D0) /* SYSCLK divided by 128 */ +#define RCC_HPRE_DIV256 ((uint32_t)0x000000E0) /* SYSCLK divided by 256 */ +#define RCC_HPRE_DIV512 ((uint32_t)0x000000F0) /* SYSCLK divided by 512 */ + +#define RCC_PPRE1 ((uint32_t)0x00000700) /* PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_PPRE1_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define RCC_PPRE1_1 ((uint32_t)0x00000200) /* Bit 1 */ +#define RCC_PPRE1_2 ((uint32_t)0x00000400) /* Bit 2 */ + +#define RCC_PPRE1_DIV1 ((uint32_t)0x00000000) /* HCLK not divided */ +#define RCC_PPRE1_DIV2 ((uint32_t)0x00000400) /* HCLK divided by 2 */ +#define RCC_PPRE1_DIV4 ((uint32_t)0x00000500) /* HCLK divided by 4 */ +#define RCC_PPRE1_DIV8 ((uint32_t)0x00000600) /* HCLK divided by 8 */ +#define RCC_PPRE1_DIV16 ((uint32_t)0x00000700) /* HCLK divided by 16 */ + +#define RCC_PPRE2 ((uint32_t)0x00003800) /* PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_PPRE2_0 ((uint32_t)0x00000800) /* Bit 0 */ +#define RCC_PPRE2_1 ((uint32_t)0x00001000) /* Bit 1 */ +#define RCC_PPRE2_2 ((uint32_t)0x00002000) /* Bit 2 */ + +#define RCC_PPRE2_DIV1 ((uint32_t)0x00000000) /* HCLK not divided */ +#define RCC_PPRE2_DIV2 ((uint32_t)0x00002000) /* HCLK divided by 2 */ +#define RCC_PPRE2_DIV4 ((uint32_t)0x00002800) /* HCLK divided by 4 */ +#define RCC_PPRE2_DIV8 ((uint32_t)0x00003000) /* HCLK divided by 8 */ +#define RCC_PPRE2_DIV16 ((uint32_t)0x00003800) /* HCLK divided by 16 */ + +#define RCC_ADCPRE ((uint32_t)0x0000C000) /* ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_ADCPRE_0 ((uint32_t)0x00004000) /* Bit 0 */ +#define RCC_ADCPRE_1 ((uint32_t)0x00008000) /* Bit 1 */ + +#define RCC_ADCPRE_DIV2 ((uint32_t)0x00000000) /* PCLK2 divided by 2 */ +#define RCC_ADCPRE_DIV4 ((uint32_t)0x00004000) /* PCLK2 divided by 4 */ +#define RCC_ADCPRE_DIV6 ((uint32_t)0x00008000) /* PCLK2 divided by 6 */ +#define RCC_ADCPRE_DIV8 ((uint32_t)0x0000C000) /* PCLK2 divided by 8 */ + +#define RCC_PLLSRC ((uint32_t)0x00010000) /* PLL entry clock source */ + +#define RCC_PLLXTPRE ((uint32_t)0x00020000) /* HSE divider for PLL entry */ + +#define RCC_PLLMULL ((uint32_t)0x003C0000) /* PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_PLLMULL_0 ((uint32_t)0x00040000) /* Bit 0 */ +#define RCC_PLLMULL_1 ((uint32_t)0x00080000) /* Bit 1 */ +#define RCC_PLLMULL_2 ((uint32_t)0x00100000) /* Bit 2 */ +#define RCC_PLLMULL_3 ((uint32_t)0x00200000) /* Bit 3 */ + +#define RCC_PLLSRC_HSI_Div2 ((uint32_t)0x00000000) /* HSI clock divided by 2 selected as PLL entry clock source */ +#define RCC_PLLSRC_HSE ((uint32_t)0x00010000) /* HSE clock selected as PLL entry clock source */ + +#define RCC_PLLXTPRE_HSE ((uint32_t)0x00000000) /* HSE clock not divided for PLL entry */ +#define RCC_PLLXTPRE_HSE_Div2 ((uint32_t)0x00020000) /* HSE clock divided by 2 for PLL entry */ + +/* CH32V303x */ +#define RCC_PLLMULL2 ((uint32_t)0x00000000) /* PLL input clock*2 */ +#define RCC_PLLMULL3 ((uint32_t)0x00040000) /* PLL input clock*3 */ +#define RCC_PLLMULL4 ((uint32_t)0x00080000) /* PLL input clock*4 */ +#define RCC_PLLMULL5 ((uint32_t)0x000C0000) /* PLL input clock*5 */ +#define RCC_PLLMULL6 ((uint32_t)0x00100000) /* PLL input clock*6 */ +#define RCC_PLLMULL7 ((uint32_t)0x00140000) /* PLL input clock*7 */ +#define RCC_PLLMULL8 ((uint32_t)0x00180000) /* PLL input clock*8 */ +#define RCC_PLLMULL9 ((uint32_t)0x001C0000) /* PLL input clock*9 */ +#define RCC_PLLMULL10 ((uint32_t)0x00200000) /* PLL input clock10 */ +#define RCC_PLLMULL11 ((uint32_t)0x00240000) /* PLL input clock*11 */ +#define RCC_PLLMULL12 ((uint32_t)0x00280000) /* PLL input clock*12 */ +#define RCC_PLLMULL13 ((uint32_t)0x002C0000) /* PLL input clock*13 */ +#define RCC_PLLMULL14 ((uint32_t)0x00300000) /* PLL input clock*14 */ +#define RCC_PLLMULL15 ((uint32_t)0x00340000) /* PLL input clock*15 */ +#define RCC_PLLMULL16 ((uint32_t)0x00380000) /* PLL input clock*16 */ +#define RCC_PLLMULL18 ((uint32_t)0x003C0000) /* PLL input clock*18 */ +/* CH32V307x-CH32V305x */ +#define RCC_PLLMULL18_EXTEN ((uint32_t)0x00000000) /* PLL input clock*18 */ +#define RCC_PLLMULL3_EXTEN ((uint32_t)0x00040000) /* PLL input clock*3 */ +#define RCC_PLLMULL4_EXTEN ((uint32_t)0x00080000) /* PLL input clock*4 */ +#define RCC_PLLMULL5_EXTEN ((uint32_t)0x000C0000) /* PLL input clock*5 */ +#define RCC_PLLMULL6_EXTEN ((uint32_t)0x00100000) /* PLL input clock*6 */ +#define RCC_PLLMULL7_EXTEN ((uint32_t)0x00140000) /* PLL input clock*7 */ +#define RCC_PLLMULL8_EXTEN ((uint32_t)0x00180000) /* PLL input clock*8 */ +#define RCC_PLLMULL9_EXTEN ((uint32_t)0x001C0000) /* PLL input clock*9 */ +#define RCC_PLLMULL10_EXTEN ((uint32_t)0x00200000) /* PLL input clock10 */ +#define RCC_PLLMULL11_EXTEN ((uint32_t)0x00240000) /* PLL input clock*11 */ +#define RCC_PLLMULL12_EXTEN ((uint32_t)0x00280000) /* PLL input clock*12 */ +#define RCC_PLLMULL13_EXTEN ((uint32_t)0x002C0000) /* PLL input clock*13 */ +#define RCC_PLLMULL14_EXTEN ((uint32_t)0x00300000) /* PLL input clock*14 */ +#define RCC_PLLMULL6_5_EXTEN ((uint32_t)0x00340000) /* PLL input clock*6.5 */ +#define RCC_PLLMULL15_EXTEN ((uint32_t)0x00380000) /* PLL input clock*15 */ +#define RCC_PLLMULL16_EXTEN ((uint32_t)0x003C0000) /* PLL input clock*16 */ + +#define RCC_USBPRE ((uint32_t)0x00400000) /* USB Device prescaler */ + +#define RCC_CFGR0_MCO ((uint32_t)0x0F000000) /* MCO[3:0] bits (Microcontroller Clock Output) */ +#define RCC_MCO_0 ((uint32_t)0x01000000) /* Bit 0 */ +#define RCC_MCO_1 ((uint32_t)0x02000000) /* Bit 1 */ +#define RCC_MCO_2 ((uint32_t)0x04000000) /* Bit 2 */ +#define RCC_MCO_3 ((uint32_t)0x08000000) /* Bit 3 */ + +#define RCC_MCO_NOCLOCK ((uint32_t)0x00000000) /* No clock */ +#define RCC_CFGR0_MCO_SYSCLK ((uint32_t)0x04000000) /* System clock selected as MCO source */ +#define RCC_CFGR0_MCO_HSI ((uint32_t)0x05000000) /* HSI clock selected as MCO source */ +#define RCC_CFGR0_MCO_HSE ((uint32_t)0x06000000) /* HSE clock selected as MCO source */ +#define RCC_CFGR0_MCO_PLL ((uint32_t)0x07000000) /* PLL clock divided by 2 selected as MCO source */ +#define RCC_CFGR0_MCO_PLL2 ((uint32_t)0x08000000) +#define RCC_CFGR0_MCO_PLL3D2 ((uint32_t)0x09000000) /* PLL3 clock divided by 2 selected as MCO source */ +#define RCC_CFGR0_MCO_XT1 ((uint32_t)0x0A000000) +#define RCC_CFGR0_MCO_PLL3 ((uint32_t)0x0B000000) + +#define RCC_CFGR0_ETHPRE ((uint32_t)0x10000000) +#define RCC_CFGR0_ADCDUTY ((uint32_t)0x80000000) +#define RCC_CFGR0_ADCDUTY_SEL ((uint32_t)0x40000000) + +/******************* Bit definition for RCC_INTR register ********************/ +#define RCC_LSIRDYF ((uint32_t)0x00000001) /* LSI Ready Interrupt flag */ +#define RCC_LSERDYF ((uint32_t)0x00000002) /* LSE Ready Interrupt flag */ +#define RCC_HSIRDYF ((uint32_t)0x00000004) /* HSI Ready Interrupt flag */ +#define RCC_HSERDYF ((uint32_t)0x00000008) /* HSE Ready Interrupt flag */ +#define RCC_PLLRDYF ((uint32_t)0x00000010) /* PLL Ready Interrupt flag */ +#define RCC_PLL2RDYF ((uint32_t)0x00000020) +#define RCC_PLL3RDYF ((uint32_t)0x00000040) +#define RCC_CSSF ((uint32_t)0x00000080) /* Clock Security System Interrupt flag */ +#define RCC_LSIRDYIE ((uint32_t)0x00000100) /* LSI Ready Interrupt Enable */ +#define RCC_LSERDYIE ((uint32_t)0x00000200) /* LSE Ready Interrupt Enable */ +#define RCC_HSIRDYIE ((uint32_t)0x00000400) /* HSI Ready Interrupt Enable */ +#define RCC_HSERDYIE ((uint32_t)0x00000800) /* HSE Ready Interrupt Enable */ +#define RCC_PLLRDYIE ((uint32_t)0x00001000) /* PLL Ready Interrupt Enable */ +#define RCC_PLL2RDYIE ((uint32_t)0x00002000) +#define RCC_PLL3RDYIE ((uint32_t)0x00004000) +#define RCC_LSIRDYC ((uint32_t)0x00010000) /* LSI Ready Interrupt Clear */ +#define RCC_LSERDYC ((uint32_t)0x00020000) /* LSE Ready Interrupt Clear */ +#define RCC_HSIRDYC ((uint32_t)0x00040000) /* HSI Ready Interrupt Clear */ +#define RCC_HSERDYC ((uint32_t)0x00080000) /* HSE Ready Interrupt Clear */ +#define RCC_PLLRDYC ((uint32_t)0x00100000) /* PLL Ready Interrupt Clear */ +#define RCC_PLL2RDYC ((uint32_t)0x00200000) +#define RCC_PLL3RDYC ((uint32_t)0x00400000) +#define RCC_CSSC ((uint32_t)0x00800000) /* Clock Security System Interrupt Clear */ + +/***************** Bit definition for RCC_APB2PRSTR register *****************/ +#define RCC_AFIORST ((uint32_t)0x00000001) /* Alternate Function I/O reset */ +#define RCC_IOPARST ((uint32_t)0x00000004) /* I/O port A reset */ +#define RCC_IOPBRST ((uint32_t)0x00000008) /* I/O port B reset */ +#define RCC_IOPCRST ((uint32_t)0x00000010) /* I/O port C reset */ +#define RCC_IOPDRST ((uint32_t)0x00000020) /* I/O port D reset */ +#define RCC_IOPERST ((uint32_t)0x00000040) +#define RCC_ADC1RST ((uint32_t)0x00000200) /* ADC 1 interface reset */ +#define RCC_ADC2RST ((uint32_t)0x00000400) /* ADC 2 interface reset */ +#define RCC_TIM1RST ((uint32_t)0x00000800) /* TIM1 Timer reset */ +#define RCC_SPI1RST ((uint32_t)0x00001000) /* SPI 1 reset */ +#define RCC_TIM8RST ((uint32_t)0x00002000) +#define RCC_USART1RST ((uint32_t)0x00004000) /* USART1 reset */ +#define RCC_TIM9RST ((uint32_t)0x00080000) +#define RCC_TIM10RST ((uint32_t)0x00100000) + +/***************** Bit definition for RCC_APB1PRSTR register *****************/ +#define RCC_TIM2RST ((uint32_t)0x00000001) /* Timer 2 reset */ +#define RCC_TIM3RST ((uint32_t)0x00000002) /* Timer 3 reset */ +#define RCC_TIM4RST ((uint32_t)0x00000004) /* Timer 4 reset */ +#define RCC_TIM5RST ((uint32_t)0x00000008) /* Timer 5 reset */ +#define RCC_TIM6RST ((uint32_t)0x00000010) /* Timer 6 reset */ +#define RCC_TIM7RST ((uint32_t)0x00000020) /* Timer 7 reset */ +#define RCC_USART6RST ((uint32_t)0x00000040) /* USART 2 reset */ +#define RCC_USART7RST ((uint32_t)0x00000080) /* USART 2 reset */ +#define RCC_USART8RST ((uint32_t)0x00000100) /* USART 2 reset */ +#define RCC_WWDGRST ((uint32_t)0x00000800) /* Window Watchdog reset */ +#define RCC_SPI2RST ((uint32_t)0x00004000) /* SPI 2 reset */ +#define RCC_SPI3RST ((uint32_t)0x00008000) /* SPI 3 reset */ +#define RCC_USART2RST ((uint32_t)0x00020000) /* USART 2 reset */ +#define RCC_USART3RST ((uint32_t)0x00040000) /* USART 3 reset */ +#define RCC_USART4RST ((uint32_t)0x00080000) /* USART 4 reset */ +#define RCC_USART5RST ((uint32_t)0x00100000) /* USART 5 reset */ +#define RCC_I2C1RST ((uint32_t)0x00200000) /* I2C 1 reset */ +#define RCC_I2C2RST ((uint32_t)0x00400000) /* I2C 2 reset */ +#define RCC_USBRST ((uint32_t)0x00800000) /* USB Device reset */ +#define RCC_CAN1RST ((uint32_t)0x02000000) /* CAN1 reset */ +#define RCC_CAN2RST ((uint32_t)0x04000000) /* CAN2 reset */ +#define RCC_BKPRST ((uint32_t)0x08000000) /* Backup interface reset */ +#define RCC_PWRRST ((uint32_t)0x10000000) /* Power interface reset */ +#define RCC_DACRST ((uint32_t)0x20000000) /* DAC reset */ + +/****************** Bit definition for RCC_AHBPCENR register ******************/ +#define RCC_DMA1EN ((uint16_t)0x0001) /* DMA1 clock enable */ +#define RCC_DMA2EN ((uint16_t)0x0002) +#define RCC_SRAMEN ((uint16_t)0x0004) /* SRAM interface clock enable */ +#define RCC_CRCEN ((uint16_t)0x0040) /* CRC clock enable */ +#define RCC_FSMCEN ((uint16_t)0x0100) +#define RCC_RNGEN ((uint16_t)0x0200) +#define RCC_SDIOEN ((uint16_t)0x0400) +#define RCC_USBHSEN ((uint16_t)0x0800) +#define RCC_OTGFSEN ((uint16_t)0x1000) +#define RCC_DVPEN ((uint16_t)0x2000) +#define RCC_ETHMACEN ((uint16_t)0x4000) +#define RCC_ETHMACTXEN ((uint16_t)0x8000) +#define RCC_ETHMACRXEN ((uint32_t)0x10000) +#define RCC_BLEC ((uint32_t)0x10000) +#define RCC_BLES ((uint32_t)0x20000) + +/****************** Bit definition for RCC_APB2PCENR register *****************/ +#define RCC_AFIOEN ((uint32_t)0x00000001) /* Alternate Function I/O clock enable */ +#define RCC_IOPAEN ((uint32_t)0x00000004) /* I/O port A clock enable */ +#define RCC_IOPBEN ((uint32_t)0x00000008) /* I/O port B clock enable */ +#define RCC_IOPCEN ((uint32_t)0x00000010) /* I/O port C clock enable */ +#define RCC_IOPDEN ((uint32_t)0x00000020) /* I/O port D clock enable */ +#define RCC_IOPEEN ((uint32_t)0x00000040) +#define RCC_ADC1EN ((uint32_t)0x00000200) /* ADC 1 interface clock enable */ +#define RCC_ADC2EN ((uint32_t)0x00000400) /* ADC 2 interface clock enable */ +#define RCC_TIM1EN ((uint32_t)0x00000800) /* TIM1 Timer clock enable */ +#define RCC_SPI1EN ((uint32_t)0x00001000) /* SPI 1 clock enable */ +#define RCC_TIM8EN ((uint32_t)0x00002000) +#define RCC_USART1EN ((uint32_t)0x00004000) /* USART1 clock enable */ +#define RCC_TIM9EN ((uint32_t)0x00080000) +#define RCC_TIM10EN ((uint32_t)0x00100000) + +/***************** Bit definition for RCC_APB1PCENR register ******************/ +#define RCC_TIM2EN ((uint32_t)0x00000001) /* Timer 2 clock enabled*/ +#define RCC_TIM3EN ((uint32_t)0x00000002) /* Timer 3 clock enable */ +#define RCC_TIM4EN ((uint32_t)0x00000004) +#define RCC_TIM5EN ((uint32_t)0x00000008) +#define RCC_TIM6EN ((uint32_t)0x00000010) +#define RCC_TIM7EN ((uint32_t)0x00000020) +#define RCC_USART6EN ((uint32_t)0x00000040) +#define RCC_USART7EN ((uint32_t)0x00000080) +#define RCC_USART8EN ((uint32_t)0x00000100) +#define RCC_WWDGEN ((uint32_t)0x00000800) /* Window Watchdog clock enable */ +#define RCC_SPI2EN ((uint32_t)0x00004000) +#define RCC_SPI3EN ((uint32_t)0x00008000) +#define RCC_USART2EN ((uint32_t)0x00020000) /* USART 2 clock enable */ +#define RCC_USART3EN ((uint32_t)0x00040000) +#define RCC_USART4EN ((uint32_t)0x00080000) +#define RCC_USART5EN ((uint32_t)0x00100000) +#define RCC_I2C1EN ((uint32_t)0x00200000) /* I2C 1 clock enable */ +#define RCC_I2C2EN ((uint32_t)0x00400000) +#define RCC_USBEN ((uint32_t)0x00800000) /* USB Device clock enable */ +#define RCC_CAN1EN ((uint32_t)0x02000000) +#define RCC_CAN2EN ((uint32_t)0x04000000) +#define RCC_BKPEN ((uint32_t)0x08000000) /* Backup interface clock enable */ +#define RCC_PWREN ((uint32_t)0x10000000) /* Power interface clock enable */ +#define RCC_DACEN ((uint32_t)0x20000000) + +/******************* Bit definition for RCC_BDCTLR register *******************/ +#define RCC_LSEON ((uint32_t)0x00000001) /* External Low Speed oscillator enable */ +#define RCC_LSERDY ((uint32_t)0x00000002) /* External Low Speed oscillator Ready */ +#define RCC_LSEBYP ((uint32_t)0x00000004) /* External Low Speed oscillator Bypass */ + +#define RCC_RTCSEL ((uint32_t)0x00000300) /* RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_RTCSEL_0 ((uint32_t)0x00000100) /* Bit 0 */ +#define RCC_RTCSEL_1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define RCC_RTCSEL_NOCLOCK ((uint32_t)0x00000000) /* No clock */ +#define RCC_RTCSEL_LSE ((uint32_t)0x00000100) /* LSE oscillator clock used as RTC clock */ +#define RCC_RTCSEL_LSI ((uint32_t)0x00000200) /* LSI oscillator clock used as RTC clock */ +#define RCC_RTCSEL_HSE ((uint32_t)0x00000300) + +#define RCC_RTCEN ((uint32_t)0x00008000) /* RTC clock enable */ +#define RCC_BDRST ((uint32_t)0x00010000) /* Backup domain software reset */ + +/******************* Bit definition for RCC_RSTSCKR register ********************/ +#define RCC_LSION ((uint32_t)0x00000001) /* Internal Low Speed oscillator enable */ +#define RCC_LSIRDY ((uint32_t)0x00000002) /* Internal Low Speed oscillator Ready */ +#define RCC_RMVF ((uint32_t)0x01000000) /* Remove reset flag */ +#define RCC_PINRSTF ((uint32_t)0x04000000) /* PIN reset flag */ +#define RCC_PORRSTF ((uint32_t)0x08000000) /* POR/PDR reset flag */ +#define RCC_SFTRSTF ((uint32_t)0x10000000) /* Software Reset flag */ +#define RCC_IWDGRSTF ((uint32_t)0x20000000) /* Independent Watchdog reset flag */ +#define RCC_WWDGRSTF ((uint32_t)0x40000000) /* Window watchdog reset flag */ +#define RCC_LPWRRSTF ((uint32_t)0x80000000) /* Low-Power reset flag */ + +/******************* Bit definition for RCC_AHBRSTR register ********************/ +#define RCC_OTGFSRST ((uint32_t)0x00001000) +#define RCC_DVPRST ((uint32_t)0x00002000) +#define RCC_ETHMACRST ((uint32_t)0x00004000) + +/******************* Bit definition for RCC_CFGR2 register ********************/ +#define RCC_PREDIV1 ((uint32_t)0x0000000F) +#define RCC_PREDIV1_0 ((uint32_t)0x00000001) +#define RCC_PREDIV1_1 ((uint32_t)0x00000002) +#define RCC_PREDIV1_2 ((uint32_t)0x00000004) +#define RCC_PREDIV1_3 ((uint32_t)0x00000008) + +#define RCC_PREDIV2 ((uint32_t)0x000000F0) +#define RCC_PREDIV2_0 ((uint32_t)0x00000010) +#define RCC_PREDIV2_1 ((uint32_t)0x00000020) +#define RCC_PREDIV2_2 ((uint32_t)0x00000040) +#define RCC_PREDIV2_3 ((uint32_t)0x00000080) + +#define RCC_PLL2MUL ((uint32_t)0x00000F00) +#define RCC_PLL2MUL_0 ((uint32_t)0x00000100) +#define RCC_PLL2MUL_1 ((uint32_t)0x00000200) +#define RCC_PLL2MUL_2 ((uint32_t)0x00000400) +#define RCC_PLL2MUL_3 ((uint32_t)0x00000800) + +#define RCC_PLL3MUL ((uint32_t)0x0000F000) +#define RCC_PLL3MUL_0 ((uint32_t)0x00001000) +#define RCC_PLL3MUL_1 ((uint32_t)0x00002000) +#define RCC_PLL3MUL_2 ((uint32_t)0x00004000) +#define RCC_PLL3MUL_3 ((uint32_t)0x00008000) + +#define RCC_PREDIV1SRC ((uint32_t)0x00010000) +#define RCC_I2S2SRC ((uint32_t)0x00020000) +#define RCC_I2S3SRC ((uint32_t)0x00040000) +#define RCC_RNGSRC ((uint32_t)0x00080000) + +#define RCC_ETH1GSRC ((uint32_t)0x00300000) +#define RCC_ETH1GSRC_0 ((uint32_t)0x00100000) +#define RCC_ETH1GSRC_1 ((uint32_t)0x00200000) + +#define RCC_ETH1GEN ((uint32_t)0x00400000) + +#define RCC_USBHSDIV ((uint32_t)0x07000000) +#define RCC_USBHSDIV_0 ((uint32_t)0x01000000) +#define RCC_USBHSDIV_1 ((uint32_t)0x02000000) +#define RCC_USBHSDIV_2 ((uint32_t)0x04000000) + +#define RCC_USBHSPLLSRC ((uint32_t)0x08000000) + +#define RCC_USBHSCLK ((uint32_t)0x30000000) +#define RCC_USBHSCLK_0 ((uint32_t)0x10000000) +#define RCC_USBHSCLK_1 ((uint32_t)0x20000000) + +#define RCC_USBHSPLL ((uint32_t)0x40000000) +#define RCC_USBFSSRC ((uint32_t)0x80000000) + +/******************* Bit definition for RCC_HSE_CAL_CTRL register ********************/ +#define RCC_HSEITRIM ((uint32_t)0x01000000) +#define RCC_HSEFAULT ((uint32_t)0x08000000) + +#define RCC_HSEC ((uint32_t)0x70000000) +#define RCC_HSEC_0 ((uint32_t)0x10000000) +#define RCC_HSEC_1 ((uint32_t)0x20000000) +#define RCC_HSEC_2 ((uint32_t)0x40000000) + +/******************* Bit definition for RCC_LSI32K_TUNE register ********************/ +#define RCC_HTUNE ((uint16_t)0x1000) +#define RCC_LTUNE ((uint16_t)0x0011) + +/******************* Bit definition for RCC_LSI32K_CAL_CFG register ********************/ +#define RCC_CNTVLU ((uint8_t)0x0F) +#define RCC_CNTVLU_0 ((uint8_t)0x01) +#define RCC_CNTVLU_1 ((uint8_t)0x02) +#define RCC_CNTVLU_2 ((uint8_t)0x04) +#define RCC_CNTVLU_3 ((uint8_t)0x08) +#define RCC_HALTMD ((uint8_t)0x10) +#define RCC_WKUPEN ((uint8_t)0x20) +#define RCC_LPEN ((uint8_t)0x40) + +/******************* Bit definition for RCC_LSI32K_CAL_STATR register ********************/ +#define RCC_CNTOV ((uint16_t)0x4000) +#define RCC_IFEND ((uint16_t)0x8000) + +/******************* Bit definition for RCC_LSI32K_CAL_CTRL register ********************/ +#define RCC_CALINTEN ((uint8_t)0x01) +#define RCC_CALEN ((uint8_t)0x02) +#define RCC_HALT ((uint8_t)0x80) + +/******************************************************************************/ +/* RNG */ +/******************************************************************************/ +/******************** Bit definition for RNG_CR register *******************/ +#define RNG_CR_RNGEN ((uint32_t)0x00000004) +#define RNG_CR_IE ((uint32_t)0x00000008) + +/******************** Bit definition for RNG_SR register *******************/ +#define RNG_SR_DRDY ((uint32_t)0x00000001) +#define RNG_SR_CECS ((uint32_t)0x00000002) +#define RNG_SR_SECS ((uint32_t)0x00000004) +#define RNG_SR_CEIS ((uint32_t)0x00000020) +#define RNG_SR_SEIS ((uint32_t)0x00000040) + +/******************************************************************************/ +/* Real-Time Clock */ +/******************************************************************************/ + +/******************* Bit definition for RTC_CTLRH register ********************/ +#define RTC_CTLRH_SECIE ((uint8_t)0x01) /* Second Interrupt Enable */ +#define RTC_CTLRH_ALRIE ((uint8_t)0x02) /* Alarm Interrupt Enable */ +#define RTC_CTLRH_OWIE ((uint8_t)0x04) /* OverfloW Interrupt Enable */ + +/******************* Bit definition for RTC_CTLRL register ********************/ +#define RTC_CTLRL_SECF ((uint8_t)0x01) /* Second Flag */ +#define RTC_CTLRL_ALRF ((uint8_t)0x02) /* Alarm Flag */ +#define RTC_CTLRL_OWF ((uint8_t)0x04) /* OverfloW Flag */ +#define RTC_CTLRL_RSF ((uint8_t)0x08) /* Registers Synchronized Flag */ +#define RTC_CTLRL_CNF ((uint8_t)0x10) /* Configuration Flag */ +#define RTC_CTLRL_RTOFF ((uint8_t)0x20) /* RTC operation OFF */ + +/******************* Bit definition for RTC_PSCH register *******************/ +#define RTC_PSCH_PRL ((uint16_t)0x000F) /* RTC Prescaler Reload Value High */ + +/******************* Bit definition for RTC_PRLL register *******************/ +#define RTC_PSCL_PRL ((uint16_t)0xFFFF) /* RTC Prescaler Reload Value Low */ + +/******************* Bit definition for RTC_DIVH register *******************/ +#define RTC_DIVH_RTC_DIV ((uint16_t)0x000F) /* RTC Clock Divider High */ + +/******************* Bit definition for RTC_DIVL register *******************/ +#define RTC_DIVL_RTC_DIV ((uint16_t)0xFFFF) /* RTC Clock Divider Low */ + +/******************* Bit definition for RTC_CNTH register *******************/ +#define RTC_CNTH_RTC_CNT ((uint16_t)0xFFFF) /* RTC Counter High */ + +/******************* Bit definition for RTC_CNTL register *******************/ +#define RTC_CNTL_RTC_CNT ((uint16_t)0xFFFF) /* RTC Counter Low */ + +/******************* Bit definition for RTC_ALRMH register *******************/ +#define RTC_ALRMH_RTC_ALRM ((uint16_t)0xFFFF) /* RTC Alarm High */ + +/******************* Bit definition for RTC_ALRML register *******************/ +#define RTC_ALRML_RTC_ALRM ((uint16_t)0xFFFF) /* RTC Alarm Low */ + +/******************************************************************************/ +/* Serial Peripheral Interface */ +/******************************************************************************/ + +/******************* Bit definition for SPI_CTLR1 register ********************/ +#define SPI_CTLR1_CPHA ((uint16_t)0x0001) /* Clock Phase */ +#define SPI_CTLR1_CPOL ((uint16_t)0x0002) /* Clock Polarity */ +#define SPI_CTLR1_MSTR ((uint16_t)0x0004) /* Master Selection */ + +#define SPI_CTLR1_BR ((uint16_t)0x0038) /* BR[2:0] bits (Baud Rate Control) */ +#define SPI_CTLR1_BR_0 ((uint16_t)0x0008) /* Bit 0 */ +#define SPI_CTLR1_BR_1 ((uint16_t)0x0010) /* Bit 1 */ +#define SPI_CTLR1_BR_2 ((uint16_t)0x0020) /* Bit 2 */ + +#define SPI_CTLR1_SPE ((uint16_t)0x0040) /* SPI Enable */ +#define SPI_CTLR1_LSBFIRST ((uint16_t)0x0080) /* Frame Format */ +#define SPI_CTLR1_SSI ((uint16_t)0x0100) /* Internal slave select */ +#define SPI_CTLR1_SSM ((uint16_t)0x0200) /* Software slave management */ +#define SPI_CTLR1_RXONLY ((uint16_t)0x0400) /* Receive only */ +#define SPI_CTLR1_DFF ((uint16_t)0x0800) /* Data Frame Format */ +#define SPI_CTLR1_CRCNEXT ((uint16_t)0x1000) /* Transmit CRC next */ +#define SPI_CTLR1_CRCEN ((uint16_t)0x2000) /* Hardware CRC calculation enable */ +#define SPI_CTLR1_BIDIOE ((uint16_t)0x4000) /* Output enable in bidirectional mode */ +#define SPI_CTLR1_BIDIMODE ((uint16_t)0x8000) /* Bidirectional data mode enable */ + +/******************* Bit definition for SPI_CTLR2 register ********************/ +#define SPI_CTLR2_RXDMAEN ((uint8_t)0x01) /* Rx Buffer DMA Enable */ +#define SPI_CTLR2_TXDMAEN ((uint8_t)0x02) /* Tx Buffer DMA Enable */ +#define SPI_CTLR2_SSOE ((uint8_t)0x04) /* SS Output Enable */ +#define SPI_CTLR2_ERRIE ((uint8_t)0x20) /* Error Interrupt Enable */ +#define SPI_CTLR2_RXNEIE ((uint8_t)0x40) /* RX buffer Not Empty Interrupt Enable */ +#define SPI_CTLR2_TXEIE ((uint8_t)0x80) /* Tx buffer Empty Interrupt Enable */ + +/******************** Bit definition for SPI_STATR register ********************/ +#define SPI_STATR_RXNE ((uint8_t)0x01) /* Receive buffer Not Empty */ +#define SPI_STATR_TXE ((uint8_t)0x02) /* Transmit buffer Empty */ +#define SPI_STATR_CHSIDE ((uint8_t)0x04) /* Channel side */ +#define SPI_STATR_UDR ((uint8_t)0x08) /* Underrun flag */ +#define SPI_STATR_CRCERR ((uint8_t)0x10) /* CRC Error flag */ +#define SPI_STATR_MODF ((uint8_t)0x20) /* Mode fault */ +#define SPI_STATR_OVR ((uint8_t)0x40) /* Overrun flag */ +#define SPI_STATR_BSY ((uint8_t)0x80) /* Busy flag */ + +/******************** Bit definition for SPI_DATAR register ********************/ +#define SPI_DATAR_DR ((uint16_t)0xFFFF) /* Data Register */ + +/******************* Bit definition for SPI_CRCR register ******************/ +#define SPI_CRCR_CRCPOLY ((uint16_t)0xFFFF) /* CRC polynomial register */ + +/****************** Bit definition for SPI_RCRCR register ******************/ +#define SPI_RCRCR_RXCRC ((uint16_t)0xFFFF) /* Rx CRC Register */ + +/****************** Bit definition for SPI_TCRCR register ******************/ +#define SPI_TCRCR_TXCRC ((uint16_t)0xFFFF) /* Tx CRC Register */ + +/****************** Bit definition for SPI_I2SCFGR register *****************/ +#define SPI_I2SCFGR_CHLEN ((uint16_t)0x0001) /* Channel length (number of bits per audio channel) */ + +#define SPI_I2SCFGR_DATLEN ((uint16_t)0x0006) /* DATLEN[1:0] bits (Data length to be transferred) */ +#define SPI_I2SCFGR_DATLEN_0 ((uint16_t)0x0002) /* Bit 0 */ +#define SPI_I2SCFGR_DATLEN_1 ((uint16_t)0x0004) /* Bit 1 */ + +#define SPI_I2SCFGR_CKPOL ((uint16_t)0x0008) /* steady state clock polarity */ + +#define SPI_I2SCFGR_I2SSTD ((uint16_t)0x0030) /* I2SSTD[1:0] bits (I2S standard selection) */ +#define SPI_I2SCFGR_I2SSTD_0 ((uint16_t)0x0010) /* Bit 0 */ +#define SPI_I2SCFGR_I2SSTD_1 ((uint16_t)0x0020) /* Bit 1 */ + +#define SPI_I2SCFGR_PCMSYNC ((uint16_t)0x0080) /* PCM frame synchronization */ + +#define SPI_I2SCFGR_I2SCFG ((uint16_t)0x0300) /* I2SCFG[1:0] bits (I2S configuration mode) */ +#define SPI_I2SCFGR_I2SCFG_0 ((uint16_t)0x0100) /* Bit 0 */ +#define SPI_I2SCFGR_I2SCFG_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define SPI_I2SCFGR_I2SE ((uint16_t)0x0400) /* I2S Enable */ +#define SPI_I2SCFGR_I2SMOD ((uint16_t)0x0800) /* I2S mode selection */ + +/****************** Bit definition for SPI_I2SPR register *******************/ +#define SPI_I2SPR_I2SDIV ((uint16_t)0x00FF) /* I2S Linear prescaler */ +#define SPI_I2SPR_ODD ((uint16_t)0x0100) /* Odd factor for the prescaler */ +#define SPI_I2SPR_MCKOE ((uint16_t)0x0200) /* Master Clock Output Enable */ + +/****************** Bit definition for SPI_HSCR register *******************/ +#define SPI_HSCR_HSRXEN ((uint16_t)0x0001) +#define SPI_HSCR_HSRXEN2 ((uint16_t)0x0004) + +/******************************************************************************/ +/* TIM */ +/******************************************************************************/ + +/******************* Bit definition for TIM_CTLR1 register ********************/ +#define TIM_CEN ((uint16_t)0x0001) /* Counter enable */ +#define TIM_UDIS ((uint16_t)0x0002) /* Update disable */ +#define TIM_URS ((uint16_t)0x0004) /* Update request source */ +#define TIM_OPM ((uint16_t)0x0008) /* One pulse mode */ +#define TIM_DIR ((uint16_t)0x0010) /* Direction */ + +#define TIM_CMS ((uint16_t)0x0060) /* CMS[1:0] bits (Center-aligned mode selection) */ +#define TIM_CMS_0 ((uint16_t)0x0020) /* Bit 0 */ +#define TIM_CMS_1 ((uint16_t)0x0040) /* Bit 1 */ + +#define TIM_ARPE ((uint16_t)0x0080) /* Auto-reload preload enable */ + +#define TIM_CTLR1_CKD ((uint16_t)0x0300) /* CKD[1:0] bits (clock division) */ +#define TIM_CKD_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_CKD_1 ((uint16_t)0x0200) /* Bit 1 */ + +/******************* Bit definition for TIM_CTLR2 register ********************/ +#define TIM_CCPC ((uint16_t)0x0001) /* Capture/Compare Preloaded Control */ +#define TIM_CCUS ((uint16_t)0x0004) /* Capture/Compare Control Update Selection */ +#define TIM_CCDS ((uint16_t)0x0008) /* Capture/Compare DMA Selection */ + +#define TIM_MMS ((uint16_t)0x0070) /* MMS[2:0] bits (Master Mode Selection) */ +#define TIM_MMS_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_MMS_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_MMS_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_TI1S ((uint16_t)0x0080) /* TI1 Selection */ +#define TIM_OIS1 ((uint16_t)0x0100) /* Output Idle state 1 (OC1 output) */ +#define TIM_OIS1N ((uint16_t)0x0200) /* Output Idle state 1 (OC1N output) */ +#define TIM_OIS2 ((uint16_t)0x0400) /* Output Idle state 2 (OC2 output) */ +#define TIM_OIS2N ((uint16_t)0x0800) /* Output Idle state 2 (OC2N output) */ +#define TIM_OIS3 ((uint16_t)0x1000) /* Output Idle state 3 (OC3 output) */ +#define TIM_OIS3N ((uint16_t)0x2000) /* Output Idle state 3 (OC3N output) */ +#define TIM_OIS4 ((uint16_t)0x4000) /* Output Idle state 4 (OC4 output) */ + +/******************* Bit definition for TIM_SMCFGR register *******************/ +#define TIM_SMS ((uint16_t)0x0007) /* SMS[2:0] bits (Slave mode selection) */ +#define TIM_SMS_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_SMS_1 ((uint16_t)0x0002) /* Bit 1 */ +#define TIM_SMS_2 ((uint16_t)0x0004) /* Bit 2 */ + +#define TIM_TS ((uint16_t)0x0070) /* TS[2:0] bits (Trigger selection) */ +#define TIM_TS_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_TS_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_TS_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_MSM ((uint16_t)0x0080) /* Master/slave mode */ + +#define TIM_ETF ((uint16_t)0x0F00) /* ETF[3:0] bits (External trigger filter) */ +#define TIM_ETF_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_ETF_1 ((uint16_t)0x0200) /* Bit 1 */ +#define TIM_ETF_2 ((uint16_t)0x0400) /* Bit 2 */ +#define TIM_ETF_3 ((uint16_t)0x0800) /* Bit 3 */ + +#define TIM_ETPS ((uint16_t)0x3000) /* ETPS[1:0] bits (External trigger prescaler) */ +#define TIM_ETPS_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_ETPS_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define TIM_ECE ((uint16_t)0x4000) /* External clock enable */ +#define TIM_ETP ((uint16_t)0x8000) /* External trigger polarity */ + +/******************* Bit definition for TIM_DMAINTENR register *******************/ +#define TIM_UIE ((uint16_t)0x0001) /* Update interrupt enable */ +#define TIM_CC1IE ((uint16_t)0x0002) /* Capture/Compare 1 interrupt enable */ +#define TIM_CC2IE ((uint16_t)0x0004) /* Capture/Compare 2 interrupt enable */ +#define TIM_CC3IE ((uint16_t)0x0008) /* Capture/Compare 3 interrupt enable */ +#define TIM_CC4IE ((uint16_t)0x0010) /* Capture/Compare 4 interrupt enable */ +#define TIM_COMIE ((uint16_t)0x0020) /* COM interrupt enable */ +#define TIM_TIE ((uint16_t)0x0040) /* Trigger interrupt enable */ +#define TIM_BIE ((uint16_t)0x0080) /* Break interrupt enable */ +#define TIM_UDE ((uint16_t)0x0100) /* Update DMA request enable */ +#define TIM_CC1DE ((uint16_t)0x0200) /* Capture/Compare 1 DMA request enable */ +#define TIM_CC2DE ((uint16_t)0x0400) /* Capture/Compare 2 DMA request enable */ +#define TIM_CC3DE ((uint16_t)0x0800) /* Capture/Compare 3 DMA request enable */ +#define TIM_CC4DE ((uint16_t)0x1000) /* Capture/Compare 4 DMA request enable */ +#define TIM_COMDE ((uint16_t)0x2000) /* COM DMA request enable */ +#define TIM_TDE ((uint16_t)0x4000) /* Trigger DMA request enable */ + +/******************** Bit definition for TIM_INTFR register ********************/ +#define TIM_UIF ((uint16_t)0x0001) /* Update interrupt Flag */ +#define TIM_CC1IF ((uint16_t)0x0002) /* Capture/Compare 1 interrupt Flag */ +#define TIM_CC2IF ((uint16_t)0x0004) /* Capture/Compare 2 interrupt Flag */ +#define TIM_CC3IF ((uint16_t)0x0008) /* Capture/Compare 3 interrupt Flag */ +#define TIM_CC4IF ((uint16_t)0x0010) /* Capture/Compare 4 interrupt Flag */ +#define TIM_COMIF ((uint16_t)0x0020) /* COM interrupt Flag */ +#define TIM_TIF ((uint16_t)0x0040) /* Trigger interrupt Flag */ +#define TIM_BIF ((uint16_t)0x0080) /* Break interrupt Flag */ +#define TIM_CC1OF ((uint16_t)0x0200) /* Capture/Compare 1 Overcapture Flag */ +#define TIM_CC2OF ((uint16_t)0x0400) /* Capture/Compare 2 Overcapture Flag */ +#define TIM_CC3OF ((uint16_t)0x0800) /* Capture/Compare 3 Overcapture Flag */ +#define TIM_CC4OF ((uint16_t)0x1000) /* Capture/Compare 4 Overcapture Flag */ + +/******************* Bit definition for TIM_SWEVGR register ********************/ +#define TIM_UG ((uint8_t)0x01) /* Update Generation */ +#define TIM_CC1G ((uint8_t)0x02) /* Capture/Compare 1 Generation */ +#define TIM_CC2G ((uint8_t)0x04) /* Capture/Compare 2 Generation */ +#define TIM_CC3G ((uint8_t)0x08) /* Capture/Compare 3 Generation */ +#define TIM_CC4G ((uint8_t)0x10) /* Capture/Compare 4 Generation */ +#define TIM_COMG ((uint8_t)0x20) /* Capture/Compare Control Update Generation */ +#define TIM_TG ((uint8_t)0x40) /* Trigger Generation */ +#define TIM_BG ((uint8_t)0x80) /* Break Generation */ + +/****************** Bit definition for TIM_CHCTLR1 register *******************/ +#define TIM_CC1S ((uint16_t)0x0003) /* CC1S[1:0] bits (Capture/Compare 1 Selection) */ +#define TIM_CC1S_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_CC1S_1 ((uint16_t)0x0002) /* Bit 1 */ + +#define TIM_OC1FE ((uint16_t)0x0004) /* Output Compare 1 Fast enable */ +#define TIM_OC1PE ((uint16_t)0x0008) /* Output Compare 1 Preload enable */ + +#define TIM_OC1M ((uint16_t)0x0070) /* OC1M[2:0] bits (Output Compare 1 Mode) */ +#define TIM_OC1M_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_OC1M_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_OC1M_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_OC1CE ((uint16_t)0x0080) /* Output Compare 1Clear Enable */ + +#define TIM_CC2S ((uint16_t)0x0300) /* CC2S[1:0] bits (Capture/Compare 2 Selection) */ +#define TIM_CC2S_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_CC2S_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define TIM_OC2FE ((uint16_t)0x0400) /* Output Compare 2 Fast enable */ +#define TIM_OC2PE ((uint16_t)0x0800) /* Output Compare 2 Preload enable */ + +#define TIM_OC2M ((uint16_t)0x7000) /* OC2M[2:0] bits (Output Compare 2 Mode) */ +#define TIM_OC2M_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_OC2M_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_OC2M_2 ((uint16_t)0x4000) /* Bit 2 */ + +#define TIM_OC2CE ((uint16_t)0x8000) /* Output Compare 2 Clear Enable */ + + +#define TIM_IC1PSC ((uint16_t)0x000C) /* IC1PSC[1:0] bits (Input Capture 1 Prescaler) */ +#define TIM_IC1PSC_0 ((uint16_t)0x0004) /* Bit 0 */ +#define TIM_IC1PSC_1 ((uint16_t)0x0008) /* Bit 1 */ + +#define TIM_IC1F ((uint16_t)0x00F0) /* IC1F[3:0] bits (Input Capture 1 Filter) */ +#define TIM_IC1F_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_IC1F_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_IC1F_2 ((uint16_t)0x0040) /* Bit 2 */ +#define TIM_IC1F_3 ((uint16_t)0x0080) /* Bit 3 */ + +#define TIM_IC2PSC ((uint16_t)0x0C00) /* IC2PSC[1:0] bits (Input Capture 2 Prescaler) */ +#define TIM_IC2PSC_0 ((uint16_t)0x0400) /* Bit 0 */ +#define TIM_IC2PSC_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define TIM_IC2F ((uint16_t)0xF000) /* IC2F[3:0] bits (Input Capture 2 Filter) */ +#define TIM_IC2F_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_IC2F_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_IC2F_2 ((uint16_t)0x4000) /* Bit 2 */ +#define TIM_IC2F_3 ((uint16_t)0x8000) /* Bit 3 */ + +/****************** Bit definition for TIM_CHCTLR2 register *******************/ +#define TIM_CC3S ((uint16_t)0x0003) /* CC3S[1:0] bits (Capture/Compare 3 Selection) */ +#define TIM_CC3S_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_CC3S_1 ((uint16_t)0x0002) /* Bit 1 */ + +#define TIM_OC3FE ((uint16_t)0x0004) /* Output Compare 3 Fast enable */ +#define TIM_OC3PE ((uint16_t)0x0008) /* Output Compare 3 Preload enable */ + +#define TIM_OC3M ((uint16_t)0x0070) /* OC3M[2:0] bits (Output Compare 3 Mode) */ +#define TIM_OC3M_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_OC3M_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_OC3M_2 ((uint16_t)0x0040) /* Bit 2 */ + +#define TIM_OC3CE ((uint16_t)0x0080) /* Output Compare 3 Clear Enable */ + +#define TIM_CC4S ((uint16_t)0x0300) /* CC4S[1:0] bits (Capture/Compare 4 Selection) */ +#define TIM_CC4S_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_CC4S_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define TIM_OC4FE ((uint16_t)0x0400) /* Output Compare 4 Fast enable */ +#define TIM_OC4PE ((uint16_t)0x0800) /* Output Compare 4 Preload enable */ + +#define TIM_OC4M ((uint16_t)0x7000) /* OC4M[2:0] bits (Output Compare 4 Mode) */ +#define TIM_OC4M_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_OC4M_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_OC4M_2 ((uint16_t)0x4000) /* Bit 2 */ + +#define TIM_OC4CE ((uint16_t)0x8000) /* Output Compare 4 Clear Enable */ + + +#define TIM_IC3PSC ((uint16_t)0x000C) /* IC3PSC[1:0] bits (Input Capture 3 Prescaler) */ +#define TIM_IC3PSC_0 ((uint16_t)0x0004) /* Bit 0 */ +#define TIM_IC3PSC_1 ((uint16_t)0x0008) /* Bit 1 */ + +#define TIM_IC3F ((uint16_t)0x00F0) /* IC3F[3:0] bits (Input Capture 3 Filter) */ +#define TIM_IC3F_0 ((uint16_t)0x0010) /* Bit 0 */ +#define TIM_IC3F_1 ((uint16_t)0x0020) /* Bit 1 */ +#define TIM_IC3F_2 ((uint16_t)0x0040) /* Bit 2 */ +#define TIM_IC3F_3 ((uint16_t)0x0080) /* Bit 3 */ + +#define TIM_IC4PSC ((uint16_t)0x0C00) /* IC4PSC[1:0] bits (Input Capture 4 Prescaler) */ +#define TIM_IC4PSC_0 ((uint16_t)0x0400) /* Bit 0 */ +#define TIM_IC4PSC_1 ((uint16_t)0x0800) /* Bit 1 */ + +#define TIM_IC4F ((uint16_t)0xF000) /* IC4F[3:0] bits (Input Capture 4 Filter) */ +#define TIM_IC4F_0 ((uint16_t)0x1000) /* Bit 0 */ +#define TIM_IC4F_1 ((uint16_t)0x2000) /* Bit 1 */ +#define TIM_IC4F_2 ((uint16_t)0x4000) /* Bit 2 */ +#define TIM_IC4F_3 ((uint16_t)0x8000) /* Bit 3 */ + +/******************* Bit definition for TIM_CCER register *******************/ +#define TIM_CC1E ((uint16_t)0x0001) /* Capture/Compare 1 output enable */ +#define TIM_CC1P ((uint16_t)0x0002) /* Capture/Compare 1 output Polarity */ +#define TIM_CC1NE ((uint16_t)0x0004) /* Capture/Compare 1 Complementary output enable */ +#define TIM_CC1NP ((uint16_t)0x0008) /* Capture/Compare 1 Complementary output Polarity */ +#define TIM_CC2E ((uint16_t)0x0010) /* Capture/Compare 2 output enable */ +#define TIM_CC2P ((uint16_t)0x0020) /* Capture/Compare 2 output Polarity */ +#define TIM_CC2NE ((uint16_t)0x0040) /* Capture/Compare 2 Complementary output enable */ +#define TIM_CC2NP ((uint16_t)0x0080) /* Capture/Compare 2 Complementary output Polarity */ +#define TIM_CC3E ((uint16_t)0x0100) /* Capture/Compare 3 output enable */ +#define TIM_CC3P ((uint16_t)0x0200) /* Capture/Compare 3 output Polarity */ +#define TIM_CC3NE ((uint16_t)0x0400) /* Capture/Compare 3 Complementary output enable */ +#define TIM_CC3NP ((uint16_t)0x0800) /* Capture/Compare 3 Complementary output Polarity */ +#define TIM_CC4E ((uint16_t)0x1000) /* Capture/Compare 4 output enable */ +#define TIM_CC4P ((uint16_t)0x2000) /* Capture/Compare 4 output Polarity */ + +/******************* Bit definition for TIM_CNT register ********************/ +#define TIM_CNT ((uint16_t)0xFFFF) /* Counter Value */ + +/******************* Bit definition for TIM_PSC register ********************/ +#define TIM_PSC ((uint16_t)0xFFFF) /* Prescaler Value */ + +/******************* Bit definition for TIM_ATRLR register ********************/ +#define TIM_ARR ((uint16_t)0xFFFF) /* actual auto-reload Value */ + +/******************* Bit definition for TIM_RPTCR register ********************/ +#define TIM_REP ((uint8_t)0xFF) /* Repetition Counter Value */ + +/******************* Bit definition for TIM_CH1CVR register *******************/ +#define TIM_CCR1 ((uint16_t)0xFFFF) /* Capture/Compare 1 Value */ + +/******************* Bit definition for TIM_CH2CVR register *******************/ +#define TIM_CCR2 ((uint16_t)0xFFFF) /* Capture/Compare 2 Value */ + +/******************* Bit definition for TIM_CH3CVR register *******************/ +#define TIM_CCR3 ((uint16_t)0xFFFF) /* Capture/Compare 3 Value */ + +/******************* Bit definition for TIM_CH4CVR register *******************/ +#define TIM_CCR4 ((uint16_t)0xFFFF) /* Capture/Compare 4 Value */ + +/******************* Bit definition for TIM_BDTR register *******************/ +#define TIM_DTG ((uint16_t)0x00FF) /* DTG[0:7] bits (Dead-Time Generator set-up) */ +#define TIM_DTG_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_DTG_1 ((uint16_t)0x0002) /* Bit 1 */ +#define TIM_DTG_2 ((uint16_t)0x0004) /* Bit 2 */ +#define TIM_DTG_3 ((uint16_t)0x0008) /* Bit 3 */ +#define TIM_DTG_4 ((uint16_t)0x0010) /* Bit 4 */ +#define TIM_DTG_5 ((uint16_t)0x0020) /* Bit 5 */ +#define TIM_DTG_6 ((uint16_t)0x0040) /* Bit 6 */ +#define TIM_DTG_7 ((uint16_t)0x0080) /* Bit 7 */ + +#define TIM_LOCK ((uint16_t)0x0300) /* LOCK[1:0] bits (Lock Configuration) */ +#define TIM_LOCK_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_LOCK_1 ((uint16_t)0x0200) /* Bit 1 */ + +#define TIM_OSSI ((uint16_t)0x0400) /* Off-State Selection for Idle mode */ +#define TIM_OSSR ((uint16_t)0x0800) /* Off-State Selection for Run mode */ +#define TIM_BKE ((uint16_t)0x1000) /* Break enable */ +#define TIM_BKP ((uint16_t)0x2000) /* Break Polarity */ +#define TIM_AOE ((uint16_t)0x4000) /* Automatic Output enable */ +#define TIM_MOE ((uint16_t)0x8000) /* Main Output enable */ + +/******************* Bit definition for TIM_DMACFGR register ********************/ +#define TIM_DBA ((uint16_t)0x001F) /* DBA[4:0] bits (DMA Base Address) */ +#define TIM_DBA_0 ((uint16_t)0x0001) /* Bit 0 */ +#define TIM_DBA_1 ((uint16_t)0x0002) /* Bit 1 */ +#define TIM_DBA_2 ((uint16_t)0x0004) /* Bit 2 */ +#define TIM_DBA_3 ((uint16_t)0x0008) /* Bit 3 */ +#define TIM_DBA_4 ((uint16_t)0x0010) /* Bit 4 */ + +#define TIM_DBL ((uint16_t)0x1F00) /* DBL[4:0] bits (DMA Burst Length) */ +#define TIM_DBL_0 ((uint16_t)0x0100) /* Bit 0 */ +#define TIM_DBL_1 ((uint16_t)0x0200) /* Bit 1 */ +#define TIM_DBL_2 ((uint16_t)0x0400) /* Bit 2 */ +#define TIM_DBL_3 ((uint16_t)0x0800) /* Bit 3 */ +#define TIM_DBL_4 ((uint16_t)0x1000) /* Bit 4 */ + +/******************* Bit definition for TIM_DMAADR register *******************/ +#define TIM_DMAR_DMAB ((uint16_t)0xFFFF) /* DMA register for burst accesses */ + +/******************* Bit definition for TIM_AUX register *******************/ +#define TIM_AUX_CAPCH2_ED ((uint16_t)0x0001) +#define TIM_AUX_CAPCH3_ED ((uint16_t)0x0002) +#define TIM_AUX_CAPCH4_ED ((uint16_t)0x0004) + +/******************************************************************************/ +/* Universal Synchronous Asynchronous Receiver Transmitter */ +/******************************************************************************/ + +/******************* Bit definition for USART_STATR register *******************/ +#define USART_STATR_PE ((uint16_t)0x0001) /* Parity Error */ +#define USART_STATR_FE ((uint16_t)0x0002) /* Framing Error */ +#define USART_STATR_NE ((uint16_t)0x0004) /* Noise Error Flag */ +#define USART_STATR_ORE ((uint16_t)0x0008) /* OverRun Error */ +#define USART_STATR_IDLE ((uint16_t)0x0010) /* IDLE line detected */ +#define USART_STATR_RXNE ((uint16_t)0x0020) /* Read Data Register Not Empty */ +#define USART_STATR_TC ((uint16_t)0x0040) /* Transmission Complete */ +#define USART_STATR_TXE ((uint16_t)0x0080) /* Transmit Data Register Empty */ +#define USART_STATR_LBD ((uint16_t)0x0100) /* LIN Break Detection Flag */ +#define USART_STATR_CTS ((uint16_t)0x0200) /* CTS Flag */ +#define USART_STATR_RX_BUSY ((uint16_t)0x0400) +#define USART_STATR_MS_ERR ((uint16_t)0x0800) + +/******************* Bit definition for USART_DATAR register *******************/ +#define USART_DATAR_DR ((uint16_t)0x01FF) /* Data value */ + +/****************** Bit definition for USART_BRR register *******************/ +#define USART_BRR_DIV_Fraction ((uint16_t)0x000F) /* Fraction of USARTDIV */ +#define USART_BRR_DIV_Mantissa ((uint16_t)0xFFF0) /* Mantissa of USARTDIV */ + +/****************** Bit definition for USART_CTLR1 register *******************/ +#define USART_CTLR1_SBK ((uint16_t)0x0001) /* Send Break */ +#define USART_CTLR1_RWU ((uint16_t)0x0002) /* Receiver wakeup */ +#define USART_CTLR1_RE ((uint16_t)0x0004) /* Receiver Enable */ +#define USART_CTLR1_TE ((uint16_t)0x0008) /* Transmitter Enable */ +#define USART_CTLR1_IDLEIE ((uint16_t)0x0010) /* IDLE Interrupt Enable */ +#define USART_CTLR1_RXNEIE ((uint16_t)0x0020) /* RXNE Interrupt Enable */ +#define USART_CTLR1_TCIE ((uint16_t)0x0040) /* Transmission Complete Interrupt Enable */ +#define USART_CTLR1_TXEIE ((uint16_t)0x0080) /* PE Interrupt Enable */ +#define USART_CTLR1_PEIE ((uint16_t)0x0100) /* PE Interrupt Enable */ +#define USART_CTLR1_PS ((uint16_t)0x0200) /* Parity Selection */ +#define USART_CTLR1_PCE ((uint16_t)0x0400) /* Parity Control Enable */ +#define USART_CTLR1_WAKE ((uint16_t)0x0800) /* Wakeup method */ +#define USART_CTLR1_M ((uint16_t)0x1000) /* Word length */ +#define USART_CTLR1_UE ((uint16_t)0x2000) /* USART Enable */ +#define USART_CTLR1_M_EXT_0 ((uint16_t)0x4000) +#define USART_CTLR1_M_EXT_1 ((uint16_t)0x8000) +#define USART_CTLR1_M_EXT5 ((uint16_t)0xC000) +#define USART_CTLR1_M_EXT6 ((uint16_t)0x8000) +#define USART_CTLR1_M_EXT7 ((uint16_t)0x4000) + +/****************** Bit definition for USART_CTLR2 register *******************/ +#define USART_CTLR2_ADD ((uint16_t)0x000F) /* Address of the USART node */ +#define USART_CTLR2_LBDL ((uint16_t)0x0020) /* LIN Break Detection Length */ +#define USART_CTLR2_LBDIE ((uint16_t)0x0040) /* LIN Break Detection Interrupt Enable */ +#define USART_CTLR2_LBCL ((uint16_t)0x0100) /* Last Bit Clock pulse */ +#define USART_CTLR2_CPHA ((uint16_t)0x0200) /* Clock Phase */ +#define USART_CTLR2_CPOL ((uint16_t)0x0400) /* Clock Polarity */ +#define USART_CTLR2_CLKEN ((uint16_t)0x0800) /* Clock Enable */ + +#define USART_CTLR2_STOP ((uint16_t)0x3000) /* STOP[1:0] bits (STOP bits) */ +#define USART_CTLR2_STOP_0 ((uint16_t)0x1000) /* Bit 0 */ +#define USART_CTLR2_STOP_1 ((uint16_t)0x2000) /* Bit 1 */ + +#define USART_CTLR2_LINEN ((uint16_t)0x4000) /* LIN mode enable */ + +/****************** Bit definition for USART_CTLR3 register *******************/ +#define USART_CTLR3_EIE ((uint16_t)0x0001) /* Error Interrupt Enable */ +#define USART_CTLR3_IREN ((uint16_t)0x0002) /* IrDA mode Enable */ +#define USART_CTLR3_IRLP ((uint16_t)0x0004) /* IrDA Low-Power */ +#define USART_CTLR3_HDSEL ((uint16_t)0x0008) /* Half-Duplex Selection */ +#define USART_CTLR3_NACK ((uint16_t)0x0010) /* Smartcard NACK enable */ +#define USART_CTLR3_SCEN ((uint16_t)0x0020) /* Smartcard mode enable */ +#define USART_CTLR3_DMAR ((uint16_t)0x0040) /* DMA Enable Receiver */ +#define USART_CTLR3_DMAT ((uint16_t)0x0080) /* DMA Enable Transmitter */ +#define USART_CTLR3_RTSE ((uint16_t)0x0100) /* RTS Enable */ +#define USART_CTLR3_CTSE ((uint16_t)0x0200) /* CTS Enable */ +#define USART_CTLR3_CTSIE ((uint16_t)0x0400) /* CTS Interrupt Enable */ +#define USART_CTLR3_ONEBIT ((uint16_t)0x0800) /* One Bit method */ + +/****************** Bit definition for USART_GPR register ******************/ +#define USART_GPR_PSC ((uint16_t)0x00FF) /* PSC[7:0] bits (Prescaler value) */ +#define USART_GPR_PSC_0 ((uint16_t)0x0001) /* Bit 0 */ +#define USART_GPR_PSC_1 ((uint16_t)0x0002) /* Bit 1 */ +#define USART_GPR_PSC_2 ((uint16_t)0x0004) /* Bit 2 */ +#define USART_GPR_PSC_3 ((uint16_t)0x0008) /* Bit 3 */ +#define USART_GPR_PSC_4 ((uint16_t)0x0010) /* Bit 4 */ +#define USART_GPR_PSC_5 ((uint16_t)0x0020) /* Bit 5 */ +#define USART_GPR_PSC_6 ((uint16_t)0x0040) /* Bit 6 */ +#define USART_GPR_PSC_7 ((uint16_t)0x0080) /* Bit 7 */ + +#define USART_GPR_GT ((uint16_t)0xFF00) /* Guard time value */ + +/****************** Bit definition for USART_CTLR4 register ******************/ +#define USART_CTLR4_MS_ERRIE ((uint16_t)0x0002) +#define USART_CTLR4_CHECK_SEL ((uint16_t)0x000C) +#define USART_CTLR4_CHECK_MARKENABLE ((uint16_t)0x0008) +#define USART_CTLR4_CHECK_APACEENABLE ((uint16_t)0x000C) + +/******************************************************************************/ +/* OPA */ +/******************************************************************************/ + +/******************* Bit definition for WWDG_CTLR register ********************/ +#define OPA_EN1 ((uint32_t)0x0001) +#define OPA_MODE1 ((uint32_t)0x0002) +#define OPA_NSEL1 ((uint32_t)0x0004) +#define OPA_PSEL1 ((uint32_t)0x0008) +#define OPA_EN2 ((uint32_t)0x0010) +#define OPA_MODE2 ((uint32_t)0x0020) +#define OPA_NSEL2 ((uint32_t)0x0040) +#define OPA_PSEL2 ((uint32_t)0x0080) +#define OPA_EN3 ((uint32_t)0x0100) +#define OPA_MODE3 ((uint32_t)0x0200) +#define OPA_NSEL3 ((uint32_t)0x0400) +#define OPA_PSEL3 ((uint32_t)0x0800) +#define OPA_EN4 ((uint32_t)0x1000) +#define OPA_MODE4 ((uint32_t)0x2000) +#define OPA_NSEL4 ((uint32_t)0x4000) +#define OPA_PSEL4 ((uint32_t)0x8000) + +/******************************************************************************/ +/* Window WATCHDOG */ +/******************************************************************************/ + +/******************* Bit definition for WWDG_CTLR register ********************/ +#define WWDG_CTLR_T ((uint8_t)0x7F) /* T[6:0] bits (7-Bit counter (MSB to LSB)) */ +#define WWDG_CTLR_T0 ((uint8_t)0x01) /* Bit 0 */ +#define WWDG_CTLR_T1 ((uint8_t)0x02) /* Bit 1 */ +#define WWDG_CTLR_T2 ((uint8_t)0x04) /* Bit 2 */ +#define WWDG_CTLR_T3 ((uint8_t)0x08) /* Bit 3 */ +#define WWDG_CTLR_T4 ((uint8_t)0x10) /* Bit 4 */ +#define WWDG_CTLR_T5 ((uint8_t)0x20) /* Bit 5 */ +#define WWDG_CTLR_T6 ((uint8_t)0x40) /* Bit 6 */ + +#define WWDG_CTLR_WDGA ((uint8_t)0x80) /* Activation bit */ + +/******************* Bit definition for WWDG_CFGR register *******************/ +#define WWDG_CFGR_W ((uint16_t)0x007F) /* W[6:0] bits (7-bit window value) */ +#define WWDG_CFGR_W0 ((uint16_t)0x0001) /* Bit 0 */ +#define WWDG_CFGR_W1 ((uint16_t)0x0002) /* Bit 1 */ +#define WWDG_CFGR_W2 ((uint16_t)0x0004) /* Bit 2 */ +#define WWDG_CFGR_W3 ((uint16_t)0x0008) /* Bit 3 */ +#define WWDG_CFGR_W4 ((uint16_t)0x0010) /* Bit 4 */ +#define WWDG_CFGR_W5 ((uint16_t)0x0020) /* Bit 5 */ +#define WWDG_CFGR_W6 ((uint16_t)0x0040) /* Bit 6 */ + +#define WWDG_CFGR_WDGTB ((uint16_t)0x0180) /* WDGTB[1:0] bits (Timer Base) */ +#define WWDG_CFGR_WDGTB0 ((uint16_t)0x0080) /* Bit 0 */ +#define WWDG_CFGR_WDGTB1 ((uint16_t)0x0100) /* Bit 1 */ + +#define WWDG_CFGR_EWI ((uint16_t)0x0200) /* Early Wakeup Interrupt */ + +/******************* Bit definition for WWDG_STATR register ********************/ +#define WWDG_STATR_EWIF ((uint8_t)0x01) /* Early Wakeup Interrupt Flag */ + +/******************************************************************************/ +/* ENHANCED FUNNCTION */ +/******************************************************************************/ + +/**************************** Enhanced CTLR1 register *****************************/ +#define EXTEN_USBD_LS ((uint32_t)0x00000001) /* Bit 0 */ +#define EXTEN_USBD_PU_EN ((uint32_t)0x00000002) /* Bit 1 */ +#define EXTEN_ETH_10M_EN ((uint32_t)0x00000004) /* Bit 2 */ +#define EXTEN_ETH_RGMII_SEL ((uint32_t)0x00000008) /* Bit 3 */ +#define EXTEN_PLL_HSI_PRE ((uint32_t)0x00000010) /* Bit 4 */ +#define EXTEN_LOCKUP_EN ((uint32_t)0x00000040) /* Bit 5 */ +#define EXTEN_LOCKUP_RSTF ((uint32_t)0x00000080) /* Bit 7 */ + +#define EXTEN_ULLDO_TRIM ((uint32_t)0x00000300) /* ULLDO_TRIM[1:0] bits */ +#define EXTEN_ULLDO_TRIM0 ((uint32_t)0x00000100) /* Bit 0 */ +#define EXTEN_ULLDO_TRIM1 ((uint32_t)0x00000200) /* Bit 1 */ + +#define EXTEN_LDO_TRIM ((uint32_t)0x00000C00) /* LDO_TRIM[1:0] bits */ +#define EXTEN_LDO_TRIM0 ((uint32_t)0x00000400) /* Bit 0 */ +#define EXTEN_LDO_TRIM1 ((uint32_t)0x00000800) /* Bit 1 */ +#define EXTEN_HSEKPLP ((uint32_t)0x00001000) + +/**************************** Enhanced CTLR2 register *****************************/ +#define EXTEN_CTLR2_OPA1_HSMD ((uint32_t)0x00000001) +#define EXTEN_CTLR2_OPA2_HSMD ((uint32_t)0x00000002) +#define EXTEN_CTLR2_OPA3_HSMD ((uint32_t)0x00000004) +#define EXTEN_CTLR2_OPA4_HSMD ((uint32_t)0x00000008) + +/**************************** Enhanced FEATURE_SIGN register *****************************/ + +#define FEATURE_SIGN_VLEVEL ((uint32_t)0x00000001) + +/******************************************************************************/ +/* DVP */ +/******************************************************************************/ + +/******************* Bit definition for DVP_CR0 register ********************/ +#define RB_DVP_ENABLE 0x01 // RW, DVP enable +#define RB_DVP_V_POLAR 0x02 // RW, DVP VSYNC polarity control: 1 = invert, 0 = not invert +#define RB_DVP_H_POLAR 0x04 // RW, DVP HSYNC polarity control: 1 = invert, 0 = not invert +#define RB_DVP_P_POLAR 0x08 // RW, DVP PCLK polarity control: 1 = invert, 0 = not invert +#define RB_DVP_MSK_DAT_MOD 0x30 +#define RB_DVP_D8_MOD 0x00 // RW, DVP 8bits data mode +#define RB_DVP_D10_MOD 0x10 // RW, DVP 10bits data mode +#define RB_DVP_D12_MOD 0x20 // RW, DVP 12bits data mode +#define RB_DVP_JPEG 0x40 // RW, DVP JPEG mode + +/******************* Bit definition for DVP_CR1 register ********************/ +#define RB_DVP_DMA_EN 0x01 // RW, DVP dma enable +#define RB_DVP_ALL_CLR 0x02 // RW, DVP all clear, high action +#define RB_DVP_RCV_CLR 0x04 // RW, DVP receive logic clear, high action +#define RB_DVP_BUF_TOG 0x08 // RW, DVP bug toggle by software, write 1 to toggle, ignored writing 0 +#define RB_DVP_CM 0x10 // RW, DVP capture mode +#define RB_DVP_CROP 0x20 // RW, DVP Crop feature enable +#define RB_DVP_FCRC 0xC0 // RW, DVP frame capture rate control: +#define DVP_RATE_100P 0x00 //00 = every frame captured (100%) +#define DVP_RATE_50P 0x40 //01 = every alternate frame captured (50%) +#define DVP_RATE_25P 0x80 //10 = one frame in four frame captured (25%) + +/******************* Bit definition for DVP_IER register ********************/ +#define RB_DVP_IE_STR_FRM 0x01 // RW, DVP frame start interrupt enable +#define RB_DVP_IE_ROW_DONE 0x02 // RW, DVP row received done interrupt enable +#define RB_DVP_IE_FRM_DONE 0x04 // RW, DVP frame received done interrupt enable +#define RB_DVP_IE_FIFO_OV 0x08 // RW, DVP receive fifo overflow interrupt enable +#define RB_DVP_IE_STP_FRM 0x10 // RW, DVP frame stop interrupt enable + +/******************* Bit definition for DVP_IFR register ********************/ +#define RB_DVP_IF_STR_FRM 0x01 // RW1, interrupt flag for DVP frame start +#define RB_DVP_IF_ROW_DONE 0x02 // RW1, interrupt flag for DVP row receive done +#define RB_DVP_IF_FRM_DONE 0x04 // RW1, interrupt flag for DVP frame receive done +#define RB_DVP_IF_FIFO_OV 0x08 // RW1, interrupt flag for DVP receive fifo overflow +#define RB_DVP_IF_STP_FRM 0x10 // RW1, interrupt flag for DVP frame stop + +/******************* Bit definition for DVP_STATUS register ********************/ +#define RB_DVP_FIFO_RDY 0x01 // RO, DVP receive fifo ready +#define RB_DVP_FIFO_FULL 0x02 // RO, DVP receive fifo full +#define RB_DVP_FIFO_OV 0x04 // RO, DVP receive fifo overflow +#define RB_DVP_MSK_FIFO_CNT 0x70 // RO, DVP receive fifo count + +/******************* Bit definition for DVP_ROW_CNT register ********************/ +#define RB_DVP_ROW_CNT ((uint16_t)0xFF) + +/******************* Bit definition for DVP_HOFFCNT register ********************/ +#define RB_DVP_HOFFCNT ((uint16_t)0xFF) + +/******************* Bit definition for DVP_VST register ********************/ +#define RB_DVP_VST ((uint16_t)0xFF) + +/******************* Bit definition for DVP_CAPCNT register ********************/ +#define RB_DVP_CAPCNT ((uint16_t)0xFF) + +/******************* Bit definition for DVP_VLINE register ********************/ +#define RB_DVP_VLINE ((uint16_t)0xFF) + +/******************* Bit definition for DVP_DR register ********************/ +#define RB_DVP_DR ((uint16_t)0xFF) + +/******************************************************************************/ +/* TKEY */ +/******************************************************************************/ + +/******************* Bit definition for TKEY_CHARGE1 register *******************/ +#define TKEY_CHARGE1_TKCG10 ((uint32_t)0x0007) +#define TKEY_CHARGE1_TKCG10_1C5 ((uint32_t)0x0000) +#define TKEY_CHARGE1_TKCG10_7C5 ((uint32_t)0x0001) +#define TKEY_CHARGE1_TKCG10_13C5 ((uint32_t)0x0002) +#define TKEY_CHARGE1_TKCG10_28C5 ((uint32_t)0x0003) +#define TKEY_CHARGE1_TKCG10_41C5 ((uint32_t)0x0004) +#define TKEY_CHARGE1_TKCG10_55C5 ((uint32_t)0x0005) +#define TKEY_CHARGE1_TKCG10_71C5 ((uint32_t)0x0006) +#define TKEY_CHARGE1_TKCG10_239C5 ((uint32_t)0x0007) + +#define TKEY_CHARGE1_TKCG11 ((uint32_t)0x0038) +#define TKEY_CHARGE1_TKCG11_1C5 ((uint32_t)0x0000) +#define TKEY_CHARGE1_TKCG11_7C5 ((uint32_t)0x0008) +#define TKEY_CHARGE1_TKCG11_13C5 ((uint32_t)0x0010) +#define TKEY_CHARGE1_TKCG11_28C5 ((uint32_t)0x0018) +#define TKEY_CHARGE1_TKCG11_41C5 ((uint32_t)0x0020) +#define TKEY_CHARGE1_TKCG11_55C5 ((uint32_t)0x0028) +#define TKEY_CHARGE1_TKCG11_71C5 ((uint32_t)0x0030) +#define TKEY_CHARGE1_TKCG11_239C5 ((uint32_t)0x0038) + +#define TKEY_CHARGE1_TKCG12 ((uint32_t)0x01C0) +#define TKEY_CHARGE1_TKCG12_1C5 ((uint32_t)0x0000) +#define TKEY_CHARGE1_TKCG12_7C5 ((uint32_t)0x0040) +#define TKEY_CHARGE1_TKCG12_13C5 ((uint32_t)0x0080) +#define TKEY_CHARGE1_TKCG12_28C5 ((uint32_t)0x00C0) +#define TKEY_CHARGE1_TKCG12_41C5 ((uint32_t)0x0100) +#define TKEY_CHARGE1_TKCG12_55C5 ((uint32_t)0x0140) +#define TKEY_CHARGE1_TKCG12_71C5 ((uint32_t)0x0180) +#define TKEY_CHARGE1_TKCG12_239C5 ((uint32_t)0x01C0) + +#define TKEY_CHARGE1_TKCG13 ((uint32_t)0x0E00) +#define TKEY_CHARGE1_TKCG13_1C5 ((uint32_t)0x0000) +#define TKEY_CHARGE1_TKCG13_7C5 ((uint32_t)0x0200) +#define TKEY_CHARGE1_TKCG13_13C5 ((uint32_t)0x0400) +#define TKEY_CHARGE1_TKCG13_28C5 ((uint32_t)0x0600) +#define TKEY_CHARGE1_TKCG13_41C5 ((uint32_t)0x0800) +#define TKEY_CHARGE1_TKCG13_55C5 ((uint32_t)0x0A00) +#define TKEY_CHARGE1_TKCG13_71C5 ((uint32_t)0x0C00) +#define TKEY_CHARGE1_TKCG13_239C5 ((uint32_t)0x0E00) + +#define TKEY_CHARGE1_TKCG14 ((uint32_t)0x7000) + +#define TKEY_CHARGE1_TKCG15 ((uint32_t)0x38000) +#define TKEY_CHARGE1_TKCG16 ((uint32_t)0x1C0000) +#define TKEY_CHARGE1_TKCG17 ((uint32_t)0xE00000) + + +#include "ch32v30x_conf.h" + + +#ifdef __cplusplus +} +#endif + +#endif + + + + diff --git a/Peripheral/inc/ch32v30x_adc.h b/Peripheral/inc/ch32v30x_adc.h new file mode 100644 index 0000000..b0034ed --- /dev/null +++ b/Peripheral/inc/ch32v30x_adc.h @@ -0,0 +1,230 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_adc.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* ADC firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_ADC_H +#define __CH32V30x_ADC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + + +/* ADC Init structure definition */ +typedef struct +{ + uint32_t ADC_Mode; /* Configures the ADC to operate in independent or + dual mode. + This parameter can be a value of @ref ADC_mode */ + + FunctionalState ADC_ScanConvMode; /* Specifies whether the conversion is performed in + Scan (multichannels) or Single (one channel) mode. + This parameter can be set to ENABLE or DISABLE */ + + FunctionalState ADC_ContinuousConvMode; /* Specifies whether the conversion is performed in + Continuous or Single mode. + This parameter can be set to ENABLE or DISABLE. */ + + uint32_t ADC_ExternalTrigConv; /* Defines the external trigger used to start the analog + to digital conversion of regular channels. This parameter + can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */ + + uint32_t ADC_DataAlign; /* Specifies whether the ADC data alignment is left or right. + This parameter can be a value of @ref ADC_data_align */ + + uint8_t ADC_NbrOfChannel; /* Specifies the number of ADC channels that will be converted + using the sequencer for regular channel group. + This parameter must range from 1 to 16. */ + + uint32_t ADC_OutputBuffer; /* Specifies whether the ADC channel output buffer is enabled or disabled. + This parameter can be a value of @ref ADC_OutputBuffer */ + + uint32_t ADC_Pga; /* Specifies the PGA gain multiple. + This parameter can be a value of @ref ADC_Pga */ +}ADC_InitTypeDef; + +/* ADC_mode */ +#define ADC_Mode_Independent ((uint32_t)0x00000000) +#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) +#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) +#define ADC_Mode_InjecSimult_FastInterl ((uint32_t)0x00030000) +#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) +#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) +#define ADC_Mode_RegSimult ((uint32_t)0x00060000) +#define ADC_Mode_FastInterl ((uint32_t)0x00070000) +#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) +#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) + +/* ADC_external_trigger_sources_for_regular_channels_conversion */ +#define ADC_ExternalTrigConv_T1_CC1 ((uint32_t)0x00000000) +#define ADC_ExternalTrigConv_T1_CC2 ((uint32_t)0x00020000) +#define ADC_ExternalTrigConv_T2_CC2 ((uint32_t)0x00060000) +#define ADC_ExternalTrigConv_T3_TRGO ((uint32_t)0x00080000) +#define ADC_ExternalTrigConv_T4_CC4 ((uint32_t)0x000A0000) +#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO ((uint32_t)0x000C0000) + +#define ADC_ExternalTrigConv_T1_CC3 ((uint32_t)0x00040000) +#define ADC_ExternalTrigConv_None ((uint32_t)0x000E0000) + +#define ADC_ExternalTrigConv_T3_CC1 ((uint32_t)0x00000000) +#define ADC_ExternalTrigConv_T2_CC3 ((uint32_t)0x00020000) +#define ADC_ExternalTrigConv_T8_CC1 ((uint32_t)0x00060000) +#define ADC_ExternalTrigConv_T8_TRGO ((uint32_t)0x00080000) +#define ADC_ExternalTrigConv_T5_CC1 ((uint32_t)0x000A0000) +#define ADC_ExternalTrigConv_T5_CC3 ((uint32_t)0x000C0000) + + +/* ADC_data_align */ +#define ADC_DataAlign_Right ((uint32_t)0x00000000) +#define ADC_DataAlign_Left ((uint32_t)0x00000800) + +/* ADC_channels */ +#define ADC_Channel_0 ((uint8_t)0x00) +#define ADC_Channel_1 ((uint8_t)0x01) +#define ADC_Channel_2 ((uint8_t)0x02) +#define ADC_Channel_3 ((uint8_t)0x03) +#define ADC_Channel_4 ((uint8_t)0x04) +#define ADC_Channel_5 ((uint8_t)0x05) +#define ADC_Channel_6 ((uint8_t)0x06) +#define ADC_Channel_7 ((uint8_t)0x07) +#define ADC_Channel_8 ((uint8_t)0x08) +#define ADC_Channel_9 ((uint8_t)0x09) +#define ADC_Channel_10 ((uint8_t)0x0A) +#define ADC_Channel_11 ((uint8_t)0x0B) +#define ADC_Channel_12 ((uint8_t)0x0C) +#define ADC_Channel_13 ((uint8_t)0x0D) +#define ADC_Channel_14 ((uint8_t)0x0E) +#define ADC_Channel_15 ((uint8_t)0x0F) +#define ADC_Channel_16 ((uint8_t)0x10) +#define ADC_Channel_17 ((uint8_t)0x11) + +#define ADC_Channel_TempSensor ((uint8_t)ADC_Channel_16) +#define ADC_Channel_Vrefint ((uint8_t)ADC_Channel_17) + +/*ADC_output_buffer*/ +#define ADC_OutputBuffer_Enable ((uint32_t)0x04000000) +#define ADC_OutputBuffer_Disable ((uint32_t)0x00000000) + +/*ADC_pga*/ +#define ADC_Pga_1 ((uint32_t)0x00000000) +#define ADC_Pga_4 ((uint32_t)0x08000000) +#define ADC_Pga_16 ((uint32_t)0x10000000) +#define ADC_Pga_64 ((uint32_t)0x18000000) + +/* ADC_sampling_time */ +#define ADC_SampleTime_1Cycles5 ((uint8_t)0x00) +#define ADC_SampleTime_7Cycles5 ((uint8_t)0x01) +#define ADC_SampleTime_13Cycles5 ((uint8_t)0x02) +#define ADC_SampleTime_28Cycles5 ((uint8_t)0x03) +#define ADC_SampleTime_41Cycles5 ((uint8_t)0x04) +#define ADC_SampleTime_55Cycles5 ((uint8_t)0x05) +#define ADC_SampleTime_71Cycles5 ((uint8_t)0x06) +#define ADC_SampleTime_239Cycles5 ((uint8_t)0x07) + +/* ADC_external_trigger_sources_for_injected_channels_conversion */ +#define ADC_ExternalTrigInjecConv_T2_TRGO ((uint32_t)0x00002000) +#define ADC_ExternalTrigInjecConv_T2_CC1 ((uint32_t)0x00003000) +#define ADC_ExternalTrigInjecConv_T3_CC4 ((uint32_t)0x00004000) +#define ADC_ExternalTrigInjecConv_T4_TRGO ((uint32_t)0x00005000) +#define ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 ((uint32_t)0x00006000) + +#define ADC_ExternalTrigInjecConv_T1_TRGO ((uint32_t)0x00000000) +#define ADC_ExternalTrigInjecConv_T1_CC4 ((uint32_t)0x00001000) +#define ADC_ExternalTrigInjecConv_None ((uint32_t)0x00007000) + +#define ADC_ExternalTrigInjecConv_T4_CC3 ((uint32_t)0x00002000) +#define ADC_ExternalTrigInjecConv_T8_CC2 ((uint32_t)0x00003000) +#define ADC_ExternalTrigInjecConv_T8_CC4 ((uint32_t)0x00004000) +#define ADC_ExternalTrigInjecConv_T5_TRGO ((uint32_t)0x00005000) +#define ADC_ExternalTrigInjecConv_T5_CC4 ((uint32_t)0x00006000) + + +/* ADC_injected_channel_selection */ +#define ADC_InjectedChannel_1 ((uint8_t)0x14) +#define ADC_InjectedChannel_2 ((uint8_t)0x18) +#define ADC_InjectedChannel_3 ((uint8_t)0x1C) +#define ADC_InjectedChannel_4 ((uint8_t)0x20) + +/* ADC_analog_watchdog_selection */ +#define ADC_AnalogWatchdog_SingleRegEnable ((uint32_t)0x00800200) +#define ADC_AnalogWatchdog_SingleInjecEnable ((uint32_t)0x00400200) +#define ADC_AnalogWatchdog_SingleRegOrInjecEnable ((uint32_t)0x00C00200) +#define ADC_AnalogWatchdog_AllRegEnable ((uint32_t)0x00800000) +#define ADC_AnalogWatchdog_AllInjecEnable ((uint32_t)0x00400000) +#define ADC_AnalogWatchdog_AllRegAllInjecEnable ((uint32_t)0x00C00000) +#define ADC_AnalogWatchdog_None ((uint32_t)0x00000000) + +/* ADC_interrupts_definition */ +#define ADC_IT_EOC ((uint16_t)0x0220) +#define ADC_IT_AWD ((uint16_t)0x0140) +#define ADC_IT_JEOC ((uint16_t)0x0480) + +/* ADC_flags_definition */ +#define ADC_FLAG_AWD ((uint8_t)0x01) +#define ADC_FLAG_EOC ((uint8_t)0x02) +#define ADC_FLAG_JEOC ((uint8_t)0x04) +#define ADC_FLAG_JSTRT ((uint8_t)0x08) +#define ADC_FLAG_STRT ((uint8_t)0x10) + + +void ADC_DeInit(ADC_TypeDef* ADCx); +void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); +void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); +void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); +void ADC_ResetCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_StartCalibration(ADC_TypeDef* ADCx); +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); +void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); +void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); +void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); +uint32_t ADC_GetDualModeConversionValue(void); +void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); +void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); +void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); +void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); +void ADC_TempSensorVrefintCmd(FunctionalState NewState); +FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); +ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); +void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); +s32 TempSensor_Volt_To_Temper(s32 Value); +void ADC_BufferCmd(ADC_TypeDef* ADCx, FunctionalState NewState); +int16_t Get_CalibrationValue(ADC_TypeDef* ADCx); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + diff --git a/Peripheral/inc/ch32v30x_bkp.h b/Peripheral/inc/ch32v30x_bkp.h new file mode 100644 index 0000000..898add4 --- /dev/null +++ b/Peripheral/inc/ch32v30x_bkp.h @@ -0,0 +1,99 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_bkp.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* BKP firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_BKP_H +#define __CH32V30x_BKP_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* Tamper_Pin_active_level */ +#define BKP_TamperPinLevel_High ((uint16_t)0x0000) +#define BKP_TamperPinLevel_Low ((uint16_t)0x0001) + +/* RTC_output_source_to_output_on_the_Tamper_pin */ +#define BKP_RTCOutputSource_None ((uint16_t)0x0000) +#define BKP_RTCOutputSource_CalibClock ((uint16_t)0x0080) +#define BKP_RTCOutputSource_Alarm ((uint16_t)0x0100) +#define BKP_RTCOutputSource_Second ((uint16_t)0x0300) + +/* Data_Backup_Register */ +#define BKP_DR1 ((uint16_t)0x0004) +#define BKP_DR2 ((uint16_t)0x0008) +#define BKP_DR3 ((uint16_t)0x000C) +#define BKP_DR4 ((uint16_t)0x0010) +#define BKP_DR5 ((uint16_t)0x0014) +#define BKP_DR6 ((uint16_t)0x0018) +#define BKP_DR7 ((uint16_t)0x001C) +#define BKP_DR8 ((uint16_t)0x0020) +#define BKP_DR9 ((uint16_t)0x0024) +#define BKP_DR10 ((uint16_t)0x0028) +#define BKP_DR11 ((uint16_t)0x0040) +#define BKP_DR12 ((uint16_t)0x0044) +#define BKP_DR13 ((uint16_t)0x0048) +#define BKP_DR14 ((uint16_t)0x004C) +#define BKP_DR15 ((uint16_t)0x0050) +#define BKP_DR16 ((uint16_t)0x0054) +#define BKP_DR17 ((uint16_t)0x0058) +#define BKP_DR18 ((uint16_t)0x005C) +#define BKP_DR19 ((uint16_t)0x0060) +#define BKP_DR20 ((uint16_t)0x0064) +#define BKP_DR21 ((uint16_t)0x0068) +#define BKP_DR22 ((uint16_t)0x006C) +#define BKP_DR23 ((uint16_t)0x0070) +#define BKP_DR24 ((uint16_t)0x0074) +#define BKP_DR25 ((uint16_t)0x0078) +#define BKP_DR26 ((uint16_t)0x007C) +#define BKP_DR27 ((uint16_t)0x0080) +#define BKP_DR28 ((uint16_t)0x0084) +#define BKP_DR29 ((uint16_t)0x0088) +#define BKP_DR30 ((uint16_t)0x008C) +#define BKP_DR31 ((uint16_t)0x0090) +#define BKP_DR32 ((uint16_t)0x0094) +#define BKP_DR33 ((uint16_t)0x0098) +#define BKP_DR34 ((uint16_t)0x009C) +#define BKP_DR35 ((uint16_t)0x00A0) +#define BKP_DR36 ((uint16_t)0x00A4) +#define BKP_DR37 ((uint16_t)0x00A8) +#define BKP_DR38 ((uint16_t)0x00AC) +#define BKP_DR39 ((uint16_t)0x00B0) +#define BKP_DR40 ((uint16_t)0x00B4) +#define BKP_DR41 ((uint16_t)0x00B8) +#define BKP_DR42 ((uint16_t)0x00BC) + + +void BKP_DeInit(void); +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel); +void BKP_TamperPinCmd(FunctionalState NewState); +void BKP_ITConfig(FunctionalState NewState); +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data); +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR); +FlagStatus BKP_GetFlagStatus(void); +void BKP_ClearFlag(void); +ITStatus BKP_GetITStatus(void); +void BKP_ClearITPendingBit(void); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/Peripheral/inc/ch32v30x_can.h b/Peripheral/inc/ch32v30x_can.h new file mode 100644 index 0000000..21f7bf0 --- /dev/null +++ b/Peripheral/inc/ch32v30x_can.h @@ -0,0 +1,376 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_can.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* CAN firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_CAN_H +#define __CH32V30x_CAN_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* CAN init structure definition */ +typedef struct +{ + uint16_t CAN_Prescaler; /* Specifies the length of a time quantum. + It ranges from 1 to 1024. */ + + uint8_t CAN_Mode; /* Specifies the CAN operating mode. + This parameter can be a value of + @ref CAN_operating_mode */ + + uint8_t CAN_SJW; /* Specifies the maximum number of time quanta + the CAN hardware is allowed to lengthen or + shorten a bit to perform resynchronization. + This parameter can be a value of + @ref CAN_synchronisation_jump_width */ + + uint8_t CAN_BS1; /* Specifies the number of time quanta in Bit + Segment 1. This parameter can be a value of + @ref CAN_time_quantum_in_bit_segment_1 */ + + uint8_t CAN_BS2; /* Specifies the number of time quanta in Bit + Segment 2. + This parameter can be a value of + @ref CAN_time_quantum_in_bit_segment_2 */ + + FunctionalState CAN_TTCM; /* Enable or disable the time triggered + communication mode. This parameter can be set + either to ENABLE or DISABLE. */ + + FunctionalState CAN_ABOM; /* Enable or disable the automatic bus-off + management. This parameter can be set either + to ENABLE or DISABLE. */ + + FunctionalState CAN_AWUM; /* Enable or disable the automatic wake-up mode. + This parameter can be set either to ENABLE or + DISABLE. */ + + FunctionalState CAN_NART; /* Enable or disable the no-automatic + retransmission mode. This parameter can be + set either to ENABLE or DISABLE. */ + + FunctionalState CAN_RFLM; /* Enable or disable the Receive FIFO Locked mode. + This parameter can be set either to ENABLE + or DISABLE. */ + + FunctionalState CAN_TXFP; /* Enable or disable the transmit FIFO priority. + This parameter can be set either to ENABLE + or DISABLE. */ +} CAN_InitTypeDef; + +/* CAN filter init structure definition */ +typedef struct +{ + uint16_t CAN_FilterIdHigh; /* Specifies the filter identification number (MSBs for a 32-bit + configuration, first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterIdLow; /* Specifies the filter identification number (LSBs for a 32-bit + configuration, second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdHigh; /* Specifies the filter mask number or identification number, + according to the mode (MSBs for a 32-bit configuration, + first one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterMaskIdLow; /* Specifies the filter mask number or identification number, + according to the mode (LSBs for a 32-bit configuration, + second one for a 16-bit configuration). + This parameter can be a value between 0x0000 and 0xFFFF */ + + uint16_t CAN_FilterFIFOAssignment; /* Specifies the FIFO (0 or 1) which will be assigned to the filter. + This parameter can be a value of @ref CAN_filter_FIFO */ + + uint8_t CAN_FilterNumber; /* Specifies the filter which will be initialized. It ranges from 0 to 13. */ + + uint8_t CAN_FilterMode; /* Specifies the filter mode to be initialized. + This parameter can be a value of @ref CAN_filter_mode */ + + uint8_t CAN_FilterScale; /* Specifies the filter scale. + This parameter can be a value of @ref CAN_filter_scale */ + + FunctionalState CAN_FilterActivation; /* Enable or disable the filter. + This parameter can be set either to ENABLE or DISABLE. */ +} CAN_FilterInitTypeDef; + +/* CAN Tx message structure definition */ +typedef struct +{ + uint32_t StdId; /* Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /* Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /* Specifies the type of identifier for the message that + will be transmitted. This parameter can be a value + of @ref CAN_identifier_type */ + + uint8_t RTR; /* Specifies the type of frame for the message that will + be transmitted. This parameter can be a value of + @ref CAN_remote_transmission_request */ + + uint8_t DLC; /* Specifies the length of the frame that will be + transmitted. This parameter can be a value between + 0 to 8 */ + + uint8_t Data[8]; /* Contains the data to be transmitted. It ranges from 0 + to 0xFF. */ +} CanTxMsg; + +/* CAN Rx message structure definition */ +typedef struct +{ + uint32_t StdId; /* Specifies the standard identifier. + This parameter can be a value between 0 to 0x7FF. */ + + uint32_t ExtId; /* Specifies the extended identifier. + This parameter can be a value between 0 to 0x1FFFFFFF. */ + + uint8_t IDE; /* Specifies the type of identifier for the message that + will be received. This parameter can be a value of + @ref CAN_identifier_type */ + + uint8_t RTR; /* Specifies the type of frame for the received message. + This parameter can be a value of + @ref CAN_remote_transmission_request */ + + uint8_t DLC; /* Specifies the length of the frame that will be received. + This parameter can be a value between 0 to 8 */ + + uint8_t Data[8]; /* Contains the data to be received. It ranges from 0 to + 0xFF. */ + + uint8_t FMI; /* Specifies the index of the filter the message stored in + the mailbox passes through. This parameter can be a + value between 0 to 0xFF */ +} CanRxMsg; + +/* CAN_sleep_constants */ +#define CAN_InitStatus_Failed ((uint8_t)0x00) /* CAN initialization failed */ +#define CAN_InitStatus_Success ((uint8_t)0x01) /* CAN initialization OK */ + +/* CAN_Mode */ +#define CAN_Mode_Normal ((uint8_t)0x00) /* normal mode */ +#define CAN_Mode_LoopBack ((uint8_t)0x01) /* loopback mode */ +#define CAN_Mode_Silent ((uint8_t)0x02) /* silent mode */ +#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /* loopback combined with silent mode */ + +/* CAN_Operating_Mode */ +#define CAN_OperatingMode_Initialization ((uint8_t)0x00) /* Initialization mode */ +#define CAN_OperatingMode_Normal ((uint8_t)0x01) /* Normal mode */ +#define CAN_OperatingMode_Sleep ((uint8_t)0x02) /* sleep mode */ + +/* CAN_Mode_Status */ +#define CAN_ModeStatus_Failed ((uint8_t)0x00) /* CAN entering the specific mode failed */ +#define CAN_ModeStatus_Success ((uint8_t)!CAN_ModeStatus_Failed) /* CAN entering the specific mode Succeed */ + +/* CAN_synchronisation_jump_width */ +#define CAN_SJW_1tq ((uint8_t)0x00) /* 1 time quantum */ +#define CAN_SJW_2tq ((uint8_t)0x01) /* 2 time quantum */ +#define CAN_SJW_3tq ((uint8_t)0x02) /* 3 time quantum */ +#define CAN_SJW_4tq ((uint8_t)0x03) /* 4 time quantum */ + +/* CAN_time_quantum_in_bit_segment_1 */ +#define CAN_BS1_1tq ((uint8_t)0x00) /* 1 time quantum */ +#define CAN_BS1_2tq ((uint8_t)0x01) /* 2 time quantum */ +#define CAN_BS1_3tq ((uint8_t)0x02) /* 3 time quantum */ +#define CAN_BS1_4tq ((uint8_t)0x03) /* 4 time quantum */ +#define CAN_BS1_5tq ((uint8_t)0x04) /* 5 time quantum */ +#define CAN_BS1_6tq ((uint8_t)0x05) /* 6 time quantum */ +#define CAN_BS1_7tq ((uint8_t)0x06) /* 7 time quantum */ +#define CAN_BS1_8tq ((uint8_t)0x07) /* 8 time quantum */ +#define CAN_BS1_9tq ((uint8_t)0x08) /* 9 time quantum */ +#define CAN_BS1_10tq ((uint8_t)0x09) /* 10 time quantum */ +#define CAN_BS1_11tq ((uint8_t)0x0A) /* 11 time quantum */ +#define CAN_BS1_12tq ((uint8_t)0x0B) /* 12 time quantum */ +#define CAN_BS1_13tq ((uint8_t)0x0C) /* 13 time quantum */ +#define CAN_BS1_14tq ((uint8_t)0x0D) /* 14 time quantum */ +#define CAN_BS1_15tq ((uint8_t)0x0E) /* 15 time quantum */ +#define CAN_BS1_16tq ((uint8_t)0x0F) /* 16 time quantum */ + +/* CAN_time_quantum_in_bit_segment_2 */ +#define CAN_BS2_1tq ((uint8_t)0x00) /* 1 time quantum */ +#define CAN_BS2_2tq ((uint8_t)0x01) /* 2 time quantum */ +#define CAN_BS2_3tq ((uint8_t)0x02) /* 3 time quantum */ +#define CAN_BS2_4tq ((uint8_t)0x03) /* 4 time quantum */ +#define CAN_BS2_5tq ((uint8_t)0x04) /* 5 time quantum */ +#define CAN_BS2_6tq ((uint8_t)0x05) /* 6 time quantum */ +#define CAN_BS2_7tq ((uint8_t)0x06) /* 7 time quantum */ +#define CAN_BS2_8tq ((uint8_t)0x07) /* 8 time quantum */ + +/* CAN_filter_mode */ +#define CAN_FilterMode_IdMask ((uint8_t)0x00) /* identifier/mask mode */ +#define CAN_FilterMode_IdList ((uint8_t)0x01) /* identifier list mode */ + +/* CAN_filter_scale */ +#define CAN_FilterScale_16bit ((uint8_t)0x00) /* Two 16-bit filters */ +#define CAN_FilterScale_32bit ((uint8_t)0x01) /* One 32-bit filter */ + +/* CAN_filter_FIFO */ +#define CAN_Filter_FIFO0 ((uint8_t)0x00) /* Filter FIFO 0 assignment for filter x */ +#define CAN_Filter_FIFO1 ((uint8_t)0x01) /* Filter FIFO 1 assignment for filter x */ + +/* CAN_identifier_type */ +#define CAN_Id_Standard ((uint32_t)0x00000000) /* Standard Id */ +#define CAN_Id_Extended ((uint32_t)0x00000004) /* Extended Id */ + +/* CAN_remote_transmission_request */ +#define CAN_RTR_Data ((uint32_t)0x00000000) /* Data frame */ +#define CAN_RTR_Remote ((uint32_t)0x00000002) /* Remote frame */ + +/* CAN_transmit_constants */ +#define CAN_TxStatus_Failed ((uint8_t)0x00)/* CAN transmission failed */ +#define CAN_TxStatus_Ok ((uint8_t)0x01) /* CAN transmission succeeded */ +#define CAN_TxStatus_Pending ((uint8_t)0x02) /* CAN transmission pending */ +#define CAN_TxStatus_NoMailBox ((uint8_t)0x04) /* CAN cell did not provide an empty mailbox */ + +/* CAN_receive_FIFO_number_constants */ +#define CAN_FIFO0 ((uint8_t)0x00) /* CAN FIFO 0 used to receive */ +#define CAN_FIFO1 ((uint8_t)0x01) /* CAN FIFO 1 used to receive */ + +/* CAN_sleep_constants */ +#define CAN_Sleep_Failed ((uint8_t)0x00) /* CAN did not enter the sleep mode */ +#define CAN_Sleep_Ok ((uint8_t)0x01) /* CAN entered the sleep mode */ + +/* CAN_wake_up_constants */ +#define CAN_WakeUp_Failed ((uint8_t)0x00) /* CAN did not leave the sleep mode */ +#define CAN_WakeUp_Ok ((uint8_t)0x01) /* CAN leaved the sleep mode */ + +/* CAN_Error_Code_constants */ +#define CAN_ErrorCode_NoErr ((uint8_t)0x00) /* No Error */ +#define CAN_ErrorCode_StuffErr ((uint8_t)0x10) /* Stuff Error */ +#define CAN_ErrorCode_FormErr ((uint8_t)0x20) /* Form Error */ +#define CAN_ErrorCode_ACKErr ((uint8_t)0x30) /* Acknowledgment Error */ +#define CAN_ErrorCode_BitRecessiveErr ((uint8_t)0x40) /* Bit Recessive Error */ +#define CAN_ErrorCode_BitDominantErr ((uint8_t)0x50) /* Bit Dominant Error */ +#define CAN_ErrorCode_CRCErr ((uint8_t)0x60) /* CRC Error */ +#define CAN_ErrorCode_SoftwareSetErr ((uint8_t)0x70) /* Software Set Error */ + + +/* CAN_flags */ +/* If the flag is 0x3XXXXXXX, it means that it can be used with CAN_GetFlagStatus() + * and CAN_ClearFlag() functions. + * If the flag is 0x1XXXXXXX, it means that it can only be used with CAN_GetFlagStatus() function. +*/ +/* Transmit Flags */ +#define CAN_FLAG_RQCP0 ((uint32_t)0x38000001) /* Request MailBox0 Flag */ +#define CAN_FLAG_RQCP1 ((uint32_t)0x38000100) /* Request MailBox1 Flag */ +#define CAN_FLAG_RQCP2 ((uint32_t)0x38010000) /* Request MailBox2 Flag */ + +/* Receive Flags */ +#define CAN_FLAG_FMP0 ((uint32_t)0x12000003) /* FIFO 0 Message Pending Flag */ +#define CAN_FLAG_FF0 ((uint32_t)0x32000008) /* FIFO 0 Full Flag */ +#define CAN_FLAG_FOV0 ((uint32_t)0x32000010) /* FIFO 0 Overrun Flag */ +#define CAN_FLAG_FMP1 ((uint32_t)0x14000003) /* FIFO 1 Message Pending Flag */ +#define CAN_FLAG_FF1 ((uint32_t)0x34000008) /* FIFO 1 Full Flag */ +#define CAN_FLAG_FOV1 ((uint32_t)0x34000010) /* FIFO 1 Overrun Flag */ + +/* Operating Mode Flags */ +#define CAN_FLAG_WKU ((uint32_t)0x31000008) /* Wake up Flag */ +#define CAN_FLAG_SLAK ((uint32_t)0x31000012) /* Sleep acknowledge Flag */ +/* Note: + *When SLAK intterupt is disabled (SLKIE=0), no polling on SLAKI is possible. + *In this case the SLAK bit can be polled. +*/ + +/* Error Flags */ +#define CAN_FLAG_EWG ((uint32_t)0x10F00001) /* Error Warning Flag */ +#define CAN_FLAG_EPV ((uint32_t)0x10F00002) /* Error Passive Flag */ +#define CAN_FLAG_BOF ((uint32_t)0x10F00004) /* Bus-Off Flag */ +#define CAN_FLAG_LEC ((uint32_t)0x30F00070) /* Last error code Flag */ + + +/* CAN_interrupts */ +#define CAN_IT_TME ((uint32_t)0x00000001) /* Transmit mailbox empty Interrupt*/ + +/* Receive Interrupts */ +#define CAN_IT_FMP0 ((uint32_t)0x00000002) /* FIFO 0 message pending Interrupt*/ +#define CAN_IT_FF0 ((uint32_t)0x00000004) /* FIFO 0 full Interrupt*/ +#define CAN_IT_FOV0 ((uint32_t)0x00000008) /* FIFO 0 overrun Interrupt*/ +#define CAN_IT_FMP1 ((uint32_t)0x00000010) /* FIFO 1 message pending Interrupt*/ +#define CAN_IT_FF1 ((uint32_t)0x00000020) /* FIFO 1 full Interrupt*/ +#define CAN_IT_FOV1 ((uint32_t)0x00000040) /* FIFO 1 overrun Interrupt*/ + +/* Operating Mode Interrupts */ +#define CAN_IT_WKU ((uint32_t)0x00010000) /* Wake-up Interrupt*/ +#define CAN_IT_SLK ((uint32_t)0x00020000) /* Sleep acknowledge Interrupt*/ + +/* Error Interrupts */ +#define CAN_IT_EWG ((uint32_t)0x00000100) /* Error warning Interrupt*/ +#define CAN_IT_EPV ((uint32_t)0x00000200) /* Error passive Interrupt*/ +#define CAN_IT_BOF ((uint32_t)0x00000400) /* Bus-off Interrupt*/ +#define CAN_IT_LEC ((uint32_t)0x00000800) /* Last error code Interrupt*/ +#define CAN_IT_ERR ((uint32_t)0x00008000) /* Error Interrupt*/ + +/* Flags named as Interrupts : kept only for FW compatibility */ +#define CAN_IT_RQCP0 CAN_IT_TME +#define CAN_IT_RQCP1 CAN_IT_TME +#define CAN_IT_RQCP2 CAN_IT_TME + +/* CAN_Legacy */ +#define CANINITFAILED CAN_InitStatus_Failed +#define CANINITOK CAN_InitStatus_Success +#define CAN_FilterFIFO0 CAN_Filter_FIFO0 +#define CAN_FilterFIFO1 CAN_Filter_FIFO1 +#define CAN_ID_STD CAN_Id_Standard +#define CAN_ID_EXT CAN_Id_Extended +#define CAN_RTR_DATA CAN_RTR_Data +#define CAN_RTR_REMOTE CAN_RTR_Remote +#define CANTXFAILE CAN_TxStatus_Failed +#define CANTXOK CAN_TxStatus_Ok +#define CANTXPENDING CAN_TxStatus_Pending +#define CAN_NO_MB CAN_TxStatus_NoMailBox +#define CANSLEEPFAILED CAN_Sleep_Failed +#define CANSLEEPOK CAN_Sleep_Ok +#define CANWAKEUPFAILED CAN_WakeUp_Failed +#define CANWAKEUPOK CAN_WakeUp_Ok + + +void CAN_DeInit(CAN_TypeDef* CANx); +uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct); +void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct); +void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct); +void CAN_SlaveStartBank(uint8_t CAN_BankNumber); +void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState); +void CAN_TTComModeCmd(CAN_TypeDef* CANx, FunctionalState NewState); +uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage); +uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox); +void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox); +void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage); +void CAN_FIFORelease(CAN_TypeDef* CANx, uint8_t FIFONumber); +uint8_t CAN_MessagePending(CAN_TypeDef* CANx, uint8_t FIFONumber); +uint8_t CAN_OperatingModeRequest(CAN_TypeDef* CANx, uint8_t CAN_OperatingMode); +uint8_t CAN_Sleep(CAN_TypeDef* CANx); +uint8_t CAN_WakeUp(CAN_TypeDef* CANx); +uint8_t CAN_GetLastErrorCode(CAN_TypeDef* CANx); +uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef* CANx); +uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef* CANx); +void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState); +FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG); +void CAN_ClearFlag(CAN_TypeDef* CANx, uint32_t CAN_FLAG); +ITStatus CAN_GetITStatus(CAN_TypeDef* CANx, uint32_t CAN_IT); +void CAN_ClearITPendingBit(CAN_TypeDef* CANx, uint32_t CAN_IT); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/Peripheral/inc/ch32v30x_crc.h b/Peripheral/inc/ch32v30x_crc.h new file mode 100644 index 0000000..026378f --- /dev/null +++ b/Peripheral/inc/ch32v30x_crc.h @@ -0,0 +1,39 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_crc.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* CRC firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_CRC_H +#define __CH32V30x_CRC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + + +void CRC_ResetDR(void); +uint32_t CRC_CalcCRC(uint32_t Data); +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength); +uint32_t CRC_GetCRC(void); +void CRC_SetIDRegister(uint8_t IDValue); +uint8_t CRC_GetIDRegister(void); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/Peripheral/inc/ch32v30x_dac.h b/Peripheral/inc/ch32v30x_dac.h new file mode 100644 index 0000000..ae7d7a8 --- /dev/null +++ b/Peripheral/inc/ch32v30x_dac.h @@ -0,0 +1,122 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dac.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* DAC firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_DAC_H +#define __CH32V30x_DAC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* DAC Init structure definition */ +typedef struct +{ + uint32_t DAC_Trigger; /* Specifies the external trigger for the selected DAC channel. + This parameter can be a value of @ref DAC_trigger_selection */ + + uint32_t DAC_WaveGeneration; /* Specifies whether DAC channel noise waves or triangle waves + are generated, or whether no wave is generated. + This parameter can be a value of @ref DAC_wave_generation */ + + uint32_t DAC_LFSRUnmask_TriangleAmplitude; /* Specifies the LFSR mask for noise wave generation or + the maximum amplitude triangle generation for the DAC channel. + This parameter can be a value of @ref DAC_lfsrunmask_triangleamplitude */ + + uint32_t DAC_OutputBuffer; /* Specifies whether the DAC channel output buffer is enabled or disabled. + This parameter can be a value of @ref DAC_output_buffer */ +}DAC_InitTypeDef; + + +/* DAC_trigger_selection */ +#define DAC_Trigger_None ((uint32_t)0x00000000) /* Conversion is automatic once the DAC1_DHRxxxx register + has been loaded, and not by external trigger */ +#define DAC_Trigger_T6_TRGO ((uint32_t)0x00000004) /* TIM6 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T8_TRGO ((uint32_t)0x0000000C) /* TIM8 TRGO selected as external conversion trigger for DAC channel + only in High-density devices*/ +#define DAC_Trigger_T7_TRGO ((uint32_t)0x00000014) /* TIM7 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T5_TRGO ((uint32_t)0x0000001C) /* TIM5 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T2_TRGO ((uint32_t)0x00000024) /* TIM2 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_T4_TRGO ((uint32_t)0x0000002C) /* TIM4 TRGO selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Ext_IT9 ((uint32_t)0x00000034) /* EXTI Line9 event selected as external conversion trigger for DAC channel */ +#define DAC_Trigger_Software ((uint32_t)0x0000003C) /* Conversion started by software trigger for DAC channel */ + +/* DAC_wave_generation */ +#define DAC_WaveGeneration_None ((uint32_t)0x00000000) +#define DAC_WaveGeneration_Noise ((uint32_t)0x00000040) +#define DAC_WaveGeneration_Triangle ((uint32_t)0x00000080) + + +/* DAC_lfsrunmask_triangleamplitude */ +#define DAC_LFSRUnmask_Bit0 ((uint32_t)0x00000000) /* Unmask DAC channel LFSR bit0 for noise wave generation */ +#define DAC_LFSRUnmask_Bits1_0 ((uint32_t)0x00000100) /* Unmask DAC channel LFSR bit[1:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits2_0 ((uint32_t)0x00000200) /* Unmask DAC channel LFSR bit[2:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits3_0 ((uint32_t)0x00000300) /* Unmask DAC channel LFSR bit[3:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits4_0 ((uint32_t)0x00000400) /* Unmask DAC channel LFSR bit[4:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits5_0 ((uint32_t)0x00000500) /* Unmask DAC channel LFSR bit[5:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits6_0 ((uint32_t)0x00000600) /* Unmask DAC channel LFSR bit[6:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits7_0 ((uint32_t)0x00000700) /* Unmask DAC channel LFSR bit[7:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits8_0 ((uint32_t)0x00000800) /* Unmask DAC channel LFSR bit[8:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits9_0 ((uint32_t)0x00000900) /* Unmask DAC channel LFSR bit[9:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits10_0 ((uint32_t)0x00000A00) /* Unmask DAC channel LFSR bit[10:0] for noise wave generation */ +#define DAC_LFSRUnmask_Bits11_0 ((uint32_t)0x00000B00) /* Unmask DAC channel LFSR bit[11:0] for noise wave generation */ +#define DAC_TriangleAmplitude_1 ((uint32_t)0x00000000) /* Select max triangle amplitude of 1 */ +#define DAC_TriangleAmplitude_3 ((uint32_t)0x00000100) /* Select max triangle amplitude of 3 */ +#define DAC_TriangleAmplitude_7 ((uint32_t)0x00000200) /* Select max triangle amplitude of 7 */ +#define DAC_TriangleAmplitude_15 ((uint32_t)0x00000300) /* Select max triangle amplitude of 15 */ +#define DAC_TriangleAmplitude_31 ((uint32_t)0x00000400) /* Select max triangle amplitude of 31 */ +#define DAC_TriangleAmplitude_63 ((uint32_t)0x00000500) /* Select max triangle amplitude of 63 */ +#define DAC_TriangleAmplitude_127 ((uint32_t)0x00000600) /* Select max triangle amplitude of 127 */ +#define DAC_TriangleAmplitude_255 ((uint32_t)0x00000700) /* Select max triangle amplitude of 255 */ +#define DAC_TriangleAmplitude_511 ((uint32_t)0x00000800) /* Select max triangle amplitude of 511 */ +#define DAC_TriangleAmplitude_1023 ((uint32_t)0x00000900) /* Select max triangle amplitude of 1023 */ +#define DAC_TriangleAmplitude_2047 ((uint32_t)0x00000A00) /* Select max triangle amplitude of 2047 */ +#define DAC_TriangleAmplitude_4095 ((uint32_t)0x00000B00) /* Select max triangle amplitude of 4095 */ + +/* DAC_output_buffer */ +#define DAC_OutputBuffer_Enable ((uint32_t)0x00000000) +#define DAC_OutputBuffer_Disable ((uint32_t)0x00000002) + +/* DAC_Channel_selection */ +#define DAC_Channel_1 ((uint32_t)0x00000000) +#define DAC_Channel_2 ((uint32_t)0x00000010) + +/* DAC_data_alignment */ +#define DAC_Align_12b_R ((uint32_t)0x00000000) +#define DAC_Align_12b_L ((uint32_t)0x00000004) +#define DAC_Align_8b_R ((uint32_t)0x00000008) + +/* DAC_wave_generation */ +#define DAC_Wave_Noise ((uint32_t)0x00000040) +#define DAC_Wave_Triangle ((uint32_t)0x00000080) + + +void DAC_DeInit(void); +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct); +void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct); +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState); +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState); +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState); +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data); +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1); +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_dbgmcu.h b/Peripheral/inc/ch32v30x_dbgmcu.h new file mode 100644 index 0000000..fbb0ff0 --- /dev/null +++ b/Peripheral/inc/ch32v30x_dbgmcu.h @@ -0,0 +1,60 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dbgmcu.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* DBGMCU firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_DBGMCU_H +#define __CH32V30x_DBGMCU_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +#define DBGMCU_SLEEP ((uint32_t)0x00000001) +#define DBGMCU_STOP ((uint32_t)0x00000002) +#define DBGMCU_STANDBY ((uint32_t)0x00000004) +#define DBGMCU_IWDG_STOP ((uint32_t)0x00000100) +#define DBGMCU_WWDG_STOP ((uint32_t)0x00000200) +#define DBGMCU_I2C1_SMBUS_TIMEOUT ((uint32_t)0x00000400) +#define DBGMCU_I2C2_SMBUS_TIMEOUT ((uint32_t)0x00000800) +#define DBGMCU_TIM1_STOP ((uint32_t)0x00001000) +#define DBGMCU_TIM2_STOP ((uint32_t)0x00002000) +#define DBGMCU_TIM3_STOP ((uint32_t)0x00004000) +#define DBGMCU_TIM4_STOP ((uint32_t)0x00008000) +#define DBGMCU_TIM5_STOP ((uint32_t)0x00010000) +#define DBGMCU_TIM6_STOP ((uint32_t)0x00020000) +#define DBGMCU_TIM7_STOP ((uint32_t)0x00040000) +#define DBGMCU_TIM8_STOP ((uint32_t)0x00080000) +#define DBGMCU_CAN1_STOP ((uint32_t)0x00100000) +#define DBGMCU_CAN2_STOP ((uint32_t)0x00200000) +#define DBGMCU_TIM9_STOP ((uint32_t)0x00400000) +#define DBGMCU_TIM10_STOP ((uint32_t)0x00800000) + +uint32_t DBGMCU_GetREVID(void); +uint32_t DBGMCU_GetDEVID(void); +uint32_t __get_DEBUG_CR(void); +void __set_DEBUG_CR(uint32_t value); +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState); +uint32_t DBGMCU_GetCHIPID( void ); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + diff --git a/Peripheral/inc/ch32v30x_dma.h b/Peripheral/inc/ch32v30x_dma.h new file mode 100644 index 0000000..848e9fc --- /dev/null +++ b/Peripheral/inc/ch32v30x_dma.h @@ -0,0 +1,270 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dma.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* DMA firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_DMA_H +#define __CH32V30x_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* DMA Init structure definition */ +typedef struct +{ + uint32_t DMA_PeripheralBaseAddr; /* Specifies the peripheral base address for DMAy Channelx. */ + + uint32_t DMA_MemoryBaseAddr; /* Specifies the memory base address for DMAy Channelx. */ + + uint32_t DMA_DIR; /* Specifies if the peripheral is the source or destination. + This parameter can be a value of @ref DMA_data_transfer_direction */ + + uint32_t DMA_BufferSize; /* Specifies the buffer size, in data unit, of the specified Channel. + The data unit is equal to the configuration set in DMA_PeripheralDataSize + or DMA_MemoryDataSize members depending in the transfer direction. */ + + uint32_t DMA_PeripheralInc; /* Specifies whether the Peripheral address register is incremented or not. + This parameter can be a value of @ref DMA_peripheral_incremented_mode */ + + uint32_t DMA_MemoryInc; /* Specifies whether the memory address register is incremented or not. + This parameter can be a value of @ref DMA_memory_incremented_mode */ + + uint32_t DMA_PeripheralDataSize; /* Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_peripheral_data_size */ + + uint32_t DMA_MemoryDataSize; /* Specifies the Memory data width. + This parameter can be a value of @ref DMA_memory_data_size */ + + uint32_t DMA_Mode; /* Specifies the operation mode of the DMAy Channelx. + This parameter can be a value of @ref DMA_circular_normal_mode. + @note: The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Channel */ + + uint32_t DMA_Priority; /* Specifies the software priority for the DMAy Channelx. + This parameter can be a value of @ref DMA_priority_level */ + + uint32_t DMA_M2M; /* Specifies if the DMAy Channelx will be used in memory-to-memory transfer. + This parameter can be a value of @ref DMA_memory_to_memory */ +}DMA_InitTypeDef; + +/* DMA_data_transfer_direction */ +#define DMA_DIR_PeripheralDST ((uint32_t)0x00000010) +#define DMA_DIR_PeripheralSRC ((uint32_t)0x00000000) + +/* DMA_peripheral_incremented_mode */ +#define DMA_PeripheralInc_Enable ((uint32_t)0x00000040) +#define DMA_PeripheralInc_Disable ((uint32_t)0x00000000) + +/* DMA_memory_incremented_mode */ +#define DMA_MemoryInc_Enable ((uint32_t)0x00000080) +#define DMA_MemoryInc_Disable ((uint32_t)0x00000000) + +/* DMA_peripheral_data_size */ +#define DMA_PeripheralDataSize_Byte ((uint32_t)0x00000000) +#define DMA_PeripheralDataSize_HalfWord ((uint32_t)0x00000100) +#define DMA_PeripheralDataSize_Word ((uint32_t)0x00000200) + +/* DMA_memory_data_size */ +#define DMA_MemoryDataSize_Byte ((uint32_t)0x00000000) +#define DMA_MemoryDataSize_HalfWord ((uint32_t)0x00000400) +#define DMA_MemoryDataSize_Word ((uint32_t)0x00000800) + +/* DMA_circular_normal_mode */ +#define DMA_Mode_Circular ((uint32_t)0x00000020) +#define DMA_Mode_Normal ((uint32_t)0x00000000) + +/* DMA_priority_level */ +#define DMA_Priority_VeryHigh ((uint32_t)0x00003000) +#define DMA_Priority_High ((uint32_t)0x00002000) +#define DMA_Priority_Medium ((uint32_t)0x00001000) +#define DMA_Priority_Low ((uint32_t)0x00000000) + +/* DMA_memory_to_memory */ +#define DMA_M2M_Enable ((uint32_t)0x00004000) +#define DMA_M2M_Disable ((uint32_t)0x00000000) + +/* DMA_interrupts_definition */ +#define DMA_IT_TC ((uint32_t)0x00000002) +#define DMA_IT_HT ((uint32_t)0x00000004) +#define DMA_IT_TE ((uint32_t)0x00000008) + +#define DMA1_IT_GL1 ((uint32_t)0x00000001) +#define DMA1_IT_TC1 ((uint32_t)0x00000002) +#define DMA1_IT_HT1 ((uint32_t)0x00000004) +#define DMA1_IT_TE1 ((uint32_t)0x00000008) +#define DMA1_IT_GL2 ((uint32_t)0x00000010) +#define DMA1_IT_TC2 ((uint32_t)0x00000020) +#define DMA1_IT_HT2 ((uint32_t)0x00000040) +#define DMA1_IT_TE2 ((uint32_t)0x00000080) +#define DMA1_IT_GL3 ((uint32_t)0x00000100) +#define DMA1_IT_TC3 ((uint32_t)0x00000200) +#define DMA1_IT_HT3 ((uint32_t)0x00000400) +#define DMA1_IT_TE3 ((uint32_t)0x00000800) +#define DMA1_IT_GL4 ((uint32_t)0x00001000) +#define DMA1_IT_TC4 ((uint32_t)0x00002000) +#define DMA1_IT_HT4 ((uint32_t)0x00004000) +#define DMA1_IT_TE4 ((uint32_t)0x00008000) +#define DMA1_IT_GL5 ((uint32_t)0x00010000) +#define DMA1_IT_TC5 ((uint32_t)0x00020000) +#define DMA1_IT_HT5 ((uint32_t)0x00040000) +#define DMA1_IT_TE5 ((uint32_t)0x00080000) +#define DMA1_IT_GL6 ((uint32_t)0x00100000) +#define DMA1_IT_TC6 ((uint32_t)0x00200000) +#define DMA1_IT_HT6 ((uint32_t)0x00400000) +#define DMA1_IT_TE6 ((uint32_t)0x00800000) +#define DMA1_IT_GL7 ((uint32_t)0x01000000) +#define DMA1_IT_TC7 ((uint32_t)0x02000000) +#define DMA1_IT_HT7 ((uint32_t)0x04000000) +#define DMA1_IT_TE7 ((uint32_t)0x08000000) + +#define DMA2_IT_GL1 ((uint32_t)0x10000001) +#define DMA2_IT_TC1 ((uint32_t)0x10000002) +#define DMA2_IT_HT1 ((uint32_t)0x10000004) +#define DMA2_IT_TE1 ((uint32_t)0x10000008) +#define DMA2_IT_GL2 ((uint32_t)0x10000010) +#define DMA2_IT_TC2 ((uint32_t)0x10000020) +#define DMA2_IT_HT2 ((uint32_t)0x10000040) +#define DMA2_IT_TE2 ((uint32_t)0x10000080) +#define DMA2_IT_GL3 ((uint32_t)0x10000100) +#define DMA2_IT_TC3 ((uint32_t)0x10000200) +#define DMA2_IT_HT3 ((uint32_t)0x10000400) +#define DMA2_IT_TE3 ((uint32_t)0x10000800) +#define DMA2_IT_GL4 ((uint32_t)0x10001000) +#define DMA2_IT_TC4 ((uint32_t)0x10002000) +#define DMA2_IT_HT4 ((uint32_t)0x10004000) +#define DMA2_IT_TE4 ((uint32_t)0x10008000) +#define DMA2_IT_GL5 ((uint32_t)0x10010000) +#define DMA2_IT_TC5 ((uint32_t)0x10020000) +#define DMA2_IT_HT5 ((uint32_t)0x10040000) +#define DMA2_IT_TE5 ((uint32_t)0x10080000) +#define DMA2_IT_GL6 ((uint32_t)0x10100000) +#define DMA2_IT_TC6 ((uint32_t)0x10200000) +#define DMA2_IT_HT6 ((uint32_t)0x10400000) +#define DMA2_IT_TE6 ((uint32_t)0x10800000) +#define DMA2_IT_GL7 ((uint32_t)0x11000000) +#define DMA2_IT_TC7 ((uint32_t)0x12000000) +#define DMA2_IT_HT7 ((uint32_t)0x14000000) +#define DMA2_IT_TE7 ((uint32_t)0x18000000) + +#define DMA2_IT_GL8 ((uint32_t)0x20000001) +#define DMA2_IT_TC8 ((uint32_t)0x20000002) +#define DMA2_IT_HT8 ((uint32_t)0x20000004) +#define DMA2_IT_TE8 ((uint32_t)0x20000008) +#define DMA2_IT_GL9 ((uint32_t)0x20000010) +#define DMA2_IT_TC9 ((uint32_t)0x20000020) +#define DMA2_IT_HT9 ((uint32_t)0x20000040) +#define DMA2_IT_TE9 ((uint32_t)0x20000080) +#define DMA2_IT_GL10 ((uint32_t)0x20000100) +#define DMA2_IT_TC10 ((uint32_t)0x20000200) +#define DMA2_IT_HT10 ((uint32_t)0x20000400) +#define DMA2_IT_TE10 ((uint32_t)0x20000800) +#define DMA2_IT_GL11 ((uint32_t)0x20001000) +#define DMA2_IT_TC11 ((uint32_t)0x20002000) +#define DMA2_IT_HT11 ((uint32_t)0x20004000) +#define DMA2_IT_TE11 ((uint32_t)0x20008000) + +/* DMA_flags_definition */ +#define DMA1_FLAG_GL1 ((uint32_t)0x00000001) +#define DMA1_FLAG_TC1 ((uint32_t)0x00000002) +#define DMA1_FLAG_HT1 ((uint32_t)0x00000004) +#define DMA1_FLAG_TE1 ((uint32_t)0x00000008) +#define DMA1_FLAG_GL2 ((uint32_t)0x00000010) +#define DMA1_FLAG_TC2 ((uint32_t)0x00000020) +#define DMA1_FLAG_HT2 ((uint32_t)0x00000040) +#define DMA1_FLAG_TE2 ((uint32_t)0x00000080) +#define DMA1_FLAG_GL3 ((uint32_t)0x00000100) +#define DMA1_FLAG_TC3 ((uint32_t)0x00000200) +#define DMA1_FLAG_HT3 ((uint32_t)0x00000400) +#define DMA1_FLAG_TE3 ((uint32_t)0x00000800) +#define DMA1_FLAG_GL4 ((uint32_t)0x00001000) +#define DMA1_FLAG_TC4 ((uint32_t)0x00002000) +#define DMA1_FLAG_HT4 ((uint32_t)0x00004000) +#define DMA1_FLAG_TE4 ((uint32_t)0x00008000) +#define DMA1_FLAG_GL5 ((uint32_t)0x00010000) +#define DMA1_FLAG_TC5 ((uint32_t)0x00020000) +#define DMA1_FLAG_HT5 ((uint32_t)0x00040000) +#define DMA1_FLAG_TE5 ((uint32_t)0x00080000) +#define DMA1_FLAG_GL6 ((uint32_t)0x00100000) +#define DMA1_FLAG_TC6 ((uint32_t)0x00200000) +#define DMA1_FLAG_HT6 ((uint32_t)0x00400000) +#define DMA1_FLAG_TE6 ((uint32_t)0x00800000) +#define DMA1_FLAG_GL7 ((uint32_t)0x01000000) +#define DMA1_FLAG_TC7 ((uint32_t)0x02000000) +#define DMA1_FLAG_HT7 ((uint32_t)0x04000000) +#define DMA1_FLAG_TE7 ((uint32_t)0x08000000) + +#define DMA2_FLAG_GL1 ((uint32_t)0x10000001) +#define DMA2_FLAG_TC1 ((uint32_t)0x10000002) +#define DMA2_FLAG_HT1 ((uint32_t)0x10000004) +#define DMA2_FLAG_TE1 ((uint32_t)0x10000008) +#define DMA2_FLAG_GL2 ((uint32_t)0x10000010) +#define DMA2_FLAG_TC2 ((uint32_t)0x10000020) +#define DMA2_FLAG_HT2 ((uint32_t)0x10000040) +#define DMA2_FLAG_TE2 ((uint32_t)0x10000080) +#define DMA2_FLAG_GL3 ((uint32_t)0x10000100) +#define DMA2_FLAG_TC3 ((uint32_t)0x10000200) +#define DMA2_FLAG_HT3 ((uint32_t)0x10000400) +#define DMA2_FLAG_TE3 ((uint32_t)0x10000800) +#define DMA2_FLAG_GL4 ((uint32_t)0x10001000) +#define DMA2_FLAG_TC4 ((uint32_t)0x10002000) +#define DMA2_FLAG_HT4 ((uint32_t)0x10004000) +#define DMA2_FLAG_TE4 ((uint32_t)0x10008000) +#define DMA2_FLAG_GL5 ((uint32_t)0x10010000) +#define DMA2_FLAG_TC5 ((uint32_t)0x10020000) +#define DMA2_FLAG_HT5 ((uint32_t)0x10040000) +#define DMA2_FLAG_TE5 ((uint32_t)0x10080000) +#define DMA2_FLAG_GL6 ((uint32_t)0x10100000) +#define DMA2_FLAG_TC6 ((uint32_t)0x10200000) +#define DMA2_FLAG_HT6 ((uint32_t)0x10400000) +#define DMA2_FLAG_TE6 ((uint32_t)0x10800000) +#define DMA2_FLAG_GL7 ((uint32_t)0x11000000) +#define DMA2_FLAG_TC7 ((uint32_t)0x12000000) +#define DMA2_FLAG_HT7 ((uint32_t)0x14000000) +#define DMA2_FLAG_TE7 ((uint32_t)0x18000000) + +#define DMA2_FLAG_GL8 ((uint32_t)0x20000001) +#define DMA2_FLAG_TC8 ((uint32_t)0x20000002) +#define DMA2_FLAG_HT8 ((uint32_t)0x20000004) +#define DMA2_FLAG_TE8 ((uint32_t)0x20000008) +#define DMA2_FLAG_GL9 ((uint32_t)0x20000010) +#define DMA2_FLAG_TC9 ((uint32_t)0x20000020) +#define DMA2_FLAG_HT9 ((uint32_t)0x20000040) +#define DMA2_FLAG_TE9 ((uint32_t)0x20000080) +#define DMA2_FLAG_GL10 ((uint32_t)0x20000100) +#define DMA2_FLAG_TC10 ((uint32_t)0x20000200) +#define DMA2_FLAG_HT10 ((uint32_t)0x20000400) +#define DMA2_FLAG_TE10 ((uint32_t)0x20000800) +#define DMA2_FLAG_GL11 ((uint32_t)0x20001000) +#define DMA2_FLAG_TC11 ((uint32_t)0x20002000) +#define DMA2_FLAG_HT11 ((uint32_t)0x20004000) +#define DMA2_FLAG_TE11 ((uint32_t)0x20008000) + + +void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); +void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); +void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); +void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); +void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); +void DMA_ClearFlag(uint32_t DMAy_FLAG); +ITStatus DMA_GetITStatus(uint32_t DMAy_IT); +void DMA_ClearITPendingBit(uint32_t DMAy_IT); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_dvp.h b/Peripheral/inc/ch32v30x_dvp.h new file mode 100644 index 0000000..fde0693 --- /dev/null +++ b/Peripheral/inc/ch32v30x_dvp.h @@ -0,0 +1,69 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dvp.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* DVP firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_DVP_H +#define __CH32V30x_DVP_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* DVP Data Mode */ +typedef enum +{ + Video_Mode = 0, + JPEG_Mode, +}DVP_Data_ModeTypeDef; + + +/* DVP DMA */ +typedef enum +{ + DVP_DMA_Disable = 0, + DVP_DMA_Enable, +}DVP_DMATypeDef; + +/* DVP FLAG and FIFO Reset */ +typedef enum +{ + DVP_FLAG_FIFO_RESET_Disable = 0, + DVP_FLAG_FIFO_RESET_Enable, +}DVP_FLAG_FIFO_RESETTypeDef; + +/* DVP RX Reset */ +typedef enum +{ + DVP_RX_RESET_Disable = 0, + DVP_RX_RESET_Enable, +}DVP_RX_RESETTypeDef; + + + +void DVP_INTCfg( uint8_t s, uint8_t i ); +void DVP_Mode( uint8_t s, DVP_Data_ModeTypeDef i); +void DVP_Cfg( DVP_DMATypeDef s, DVP_FLAG_FIFO_RESETTypeDef i, DVP_RX_RESETTypeDef j); + + + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + diff --git a/Peripheral/inc/ch32v30x_eth.h b/Peripheral/inc/ch32v30x_eth.h new file mode 100644 index 0000000..88dfafd --- /dev/null +++ b/Peripheral/inc/ch32v30x_eth.h @@ -0,0 +1,1338 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_eth.h +* Author : WCH +* Version : V1.0.1 +* Date : 2025/01/08 +* Description : This file contains all the functions prototypes for the +* ETH firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_ETH_H +#define __CH32V30x_ETH_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + + +#define PHY_10BASE_T_LINKED 1 +#define PHY_10BASE_T_NOT_LINKED 0 + +#define DMA_TPS_Mask ((uint32_t)0x00700000) +#define DMA_RPS_Mask ((uint32_t)0x000E0000) + +/* ETH Init structure definition */ +typedef struct { + uint32_t ETH_AutoNegotiation; /* Selects or not the AutoNegotiation mode for the external PHY + The AutoNegotiation allows an automatic setting of the Speed (10/100Mbps) + and the mode (half/full-duplex). + This parameter can be a value of @ref ETH_AutoNegotiation */ + + uint32_t ETH_Watchdog; /* Selects or not the Watchdog timer + When enabled, the MAC allows no more then 2048 bytes to be received. + When disabled, the MAC can receive up to 16384 bytes. + This parameter can be a value of @ref ETH_watchdog */ + + uint32_t ETH_Jabber; /* Selects or not Jabber timer + When enabled, the MAC allows no more then 2048 bytes to be sent. + When disabled, the MAC can send up to 16384 bytes. + This parameter can be a value of @ref ETH_Jabber */ + + uint32_t ETH_InterFrameGap; /* Selects the minimum IFG between frames during transmission + This parameter can be a value of @ref ETH_Inter_Frame_Gap */ + + uint32_t ETH_CarrierSense; /* Selects or not the Carrier Sense + This parameter can be a value of @ref ETH_Carrier_Sense */ + + uint32_t ETH_Speed; /* Sets the Ethernet speed: 10/100 Mbps + This parameter can be a value of @ref ETH_Speed */ + + uint32_t ETH_ReceiveOwn; /* Selects or not the ReceiveOwn + ReceiveOwn allows the reception of frames when the TX_EN signal is asserted + in Half-Duplex mode + This parameter can be a value of @ref ETH_Receive_Own */ + + uint32_t ETH_LoopbackMode; /* Selects or not the internal MAC MII Loopback mode + This parameter can be a value of @ref ETH_Loop_Back_Mode */ + + uint32_t ETH_Mode; /* Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode + This parameter can be a value of @ref ETH_Duplex_Mode */ + + uint32_t ETH_ChecksumOffload; /* Selects or not the IPv4 checksum checking for received frame payloads' TCP/UDP/ICMP headers. + This parameter can be a value of @ref ETH_Checksum_Offload */ + + uint32_t ETH_RetryTransmission; /* Selects or not the MAC attempt retries transmission, based on the settings of BL, + when a colision occurs (Half-Duplex mode) + This parameter can be a value of @ref ETH_Retry_Transmission */ + + uint32_t ETH_AutomaticPadCRCStrip; /* Selects or not the Automatic MAC Pad/CRC Stripping + This parameter can be a value of @ref ETH_Automatic_Pad_CRC_Strip */ + + uint32_t ETH_BackOffLimit; /* Selects the BackOff limit value + This parameter can be a value of @ref ETH_Back_Off_Limit */ + + uint32_t ETH_DeferralCheck; /* Selects or not the deferral check function (Half-Duplex mode) + This parameter can be a value of @ref ETH_Deferral_Check */ + + uint32_t ETH_ReceiveAll; /* Selects or not all frames reception by the MAC (No fitering) + This parameter can be a value of @ref ETH_Receive_All */ + + uint32_t ETH_SourceAddrFilter; /* Selects the Source Address Filter mode + This parameter can be a value of @ref ETH_Source_Addr_Filter */ + + uint32_t ETH_PassControlFrames; /* Sets the forwarding mode of the control frames (including unicast and multicast PAUSE frames) + This parameter can be a value of @ref ETH_Pass_Control_Frames */ + + uint32_t ETH_BroadcastFramesReception; /* Selects or not the reception of Broadcast Frames + This parameter can be a value of @ref ETH_Broadcast_Frames_Reception */ + + uint32_t ETH_DestinationAddrFilter; /* Sets the destination filter mode for both unicast and multicast frames + This parameter can be a value of @ref ETH_Destination_Addr_Filter */ + + uint32_t ETH_PromiscuousMode; /* Selects or not the Promiscuous Mode + This parameter can be a value of @ref ETH_Promiscuous_Mode */ + + uint32_t ETH_MulticastFramesFilter; /* Selects the Multicast Frames filter mode: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter + This parameter can be a value of @ref ETH_Multicast_Frames_Filter */ + + uint32_t ETH_UnicastFramesFilter; /* Selects the Unicast Frames filter mode: HashTableFilter/PerfectFilter/PerfectHashTableFilter + This parameter can be a value of @ref ETH_Unicast_Frames_Filter */ + + uint32_t ETH_HashTableHigh; /* This field holds the higher 32 bits of Hash table. */ + + uint32_t ETH_HashTableLow; /* This field holds the lower 32 bits of Hash table. */ + + uint32_t ETH_PauseTime; /* This field holds the value to be used in the Pause Time field in the + transmit control frame */ + + uint32_t ETH_ZeroQuantaPause; /* Selects or not the automatic generation of Zero-Quanta Pause Control frames + This parameter can be a value of @ref ETH_Zero_Quanta_Pause */ + + uint32_t ETH_PauseLowThreshold; /* This field configures the threshold of the PAUSE to be checked for + automatic retransmission of PAUSE Frame + This parameter can be a value of @ref ETH_Pause_Low_Threshold */ + + uint32_t ETH_UnicastPauseFrameDetect; /* Selects or not the MAC detection of the Pause frames (with MAC Address0 + unicast address and unique multicast address) + This parameter can be a value of @ref ETH_Unicast_Pause_Frame_Detect */ + + uint32_t ETH_ReceiveFlowControl; /* Enables or disables the MAC to decode the received Pause frame and + disable its transmitter for a specified time (Pause Time) + This parameter can be a value of @ref ETH_Receive_Flow_Control */ + + uint32_t ETH_TransmitFlowControl; /* Enables or disables the MAC to transmit Pause frames (Full-Duplex mode) + or the MAC back-pressure operation (Half-Duplex mode) + This parameter can be a value of @ref ETH_Transmit_Flow_Control */ + + uint32_t ETH_VLANTagComparison; /* Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for + comparison and filtering + This parameter can be a value of @ref ETH_VLAN_Tag_Comparison */ + + uint32_t ETH_VLANTagIdentifier; /* Holds the VLAN tag identifier for receive frames */ + + uint32_t ETH_DropTCPIPChecksumErrorFrame; /* Selects or not the Dropping of TCP/IP Checksum Error Frames + This parameter can be a value of @ref ETH_Drop_TCP_IP_Checksum_Error_Frame */ + + uint32_t ETH_ReceiveStoreForward; /* Enables or disables the Receive store and forward mode + This parameter can be a value of @ref ETH_Receive_Store_Forward */ + + uint32_t ETH_FlushReceivedFrame; /* Enables or disables the flushing of received frames + This parameter can be a value of @ref ETH_Flush_Received_Frame */ + + uint32_t ETH_TransmitStoreForward; /* Enables or disables Transmit store and forward mode + This parameter can be a value of @ref ETH_Transmit_Store_Forward */ + + uint32_t ETH_TransmitThresholdControl; /* Selects or not the Transmit Threshold Control + This parameter can be a value of @ref ETH_Transmit_Threshold_Control */ + + uint32_t ETH_ForwardErrorFrames; /* Selects or not the forward to the DMA of erroneous frames + This parameter can be a value of @ref ETH_Forward_Error_Frames */ + + uint32_t ETH_ForwardUndersizedGoodFrames; /* Enables or disables the Rx FIFO to forward Undersized frames (frames with no Error + and length less than 64 bytes) including pad-bytes and CRC) + This parameter can be a value of @ref ETH_Forward_Undersized_Good_Frames */ + + uint32_t ETH_ReceiveThresholdControl; /* Selects the threshold level of the Receive FIFO + This parameter can be a value of @ref ETH_Receive_Threshold_Control */ + + uint32_t ETH_SecondFrameOperate; /* Selects or not the Operate on second frame mode, which allows the DMA to process a second + frame of Transmit data even before obtaining the status for the first frame. + This parameter can be a value of @ref ETH_Second_Frame_Operate */ + + uint32_t ETH_AddressAlignedBeats; /* Enables or disables the Address Aligned Beats + This parameter can be a value of @ref ETH_Address_Aligned_Beats */ + + uint32_t ETH_FixedBurst; /* Enables or disables the AHB Master interface fixed burst transfers + This parameter can be a value of @ref ETH_Fixed_Burst */ + + uint32_t ETH_RxDMABurstLength; /* Indicates the maximum number of beats to be transferred in one Rx DMA transaction + This parameter can be a value of @ref ETH_Rx_DMA_Burst_Length */ + + uint32_t ETH_TxDMABurstLength; /* Indicates sthe maximum number of beats to be transferred in one Tx DMA transaction + This parameter can be a value of @ref ETH_Tx_DMA_Burst_Length */ + + uint32_t ETH_DescriptorSkipLength; /* Specifies the number of word to skip between two unchained descriptors (Ring mode) */ + + uint32_t ETH_DMAArbitration; /* Selects the DMA Tx/Rx arbitration + This parameter can be a value of @ref ETH_DMA_Arbitration */ +}ETH_InitTypeDef; + + + +/* ETH delay.Just for Ethernet */ +#define _eth_delay_ ETH_Delay /* Default _eth_delay_ function with less precise timing */ + +/* definition for Ethernet frame */ +#define ETH_MAX_PACKET_SIZE 1524 /* ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14 /* 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4 /* Ethernet CRC */ +#define ETH_EXTRA 2 /* Extra bytes in some cases */ +#define VLAN_TAG 4 /* optional 802.1q VLAN Tag */ +#define MIN_ETH_PAYLOAD 46 /* Minimum Ethernet payload size */ +#define MAX_ETH_PAYLOAD 1500 /* Maximum Ethernet payload size */ +#define JUMBO_FRAME_PAYLOAD 9000 /* Jumbo frame payload size */ + +/* ETH DMA structure definition */ +typedef struct +{ + uint32_t volatile Status; /* Status */ + uint32_t ControlBufferSize; /* Control and Buffer1, Buffer2 lengths */ + uint32_t Buffer1Addr; /* Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /* Buffer2 or next descriptor address pointer */ +} ETH_DMADESCTypeDef; + +/** + DMA Tx Desciptor + ----------------------------------------------------------------------------------------------- + TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] | + ----------------------------------------------------------------------------------------------- + TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] | + ----------------------------------------------------------------------------------------------- + TDES2 | Buffer1 Address [31:0] | + ----------------------------------------------------------------------------------------------- + TDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + ------------------------------------------------------------------------------------------------ +*/ + + +/* Bit or field definition of TDES0 register (DMA Tx descriptor status register)*/ +#define ETH_DMATxDesc_OWN ((uint32_t)0x80000000) /* OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMATxDesc_IC ((uint32_t)0x40000000) /* Interrupt on Completion */ +#define ETH_DMATxDesc_LS ((uint32_t)0x20000000) /* Last Segment */ +#define ETH_DMATxDesc_FS ((uint32_t)0x10000000) /* First Segment */ +#define ETH_DMATxDesc_DC ((uint32_t)0x08000000) /* Disable CRC */ +#define ETH_DMATxDesc_DP ((uint32_t)0x04000000) /* Disable Padding */ +#define ETH_DMATxDesc_TTSE ((uint32_t)0x02000000) /* Transmit Time Stamp Enable */ +#define ETH_DMATxDesc_CIC ((uint32_t)0x00C00000) /* Checksum Insertion Control: 4 cases */ +#define ETH_DMATxDesc_CIC_ByPass ((uint32_t)0x00000000) /* Do Nothing: Checksum Engine is bypassed */ +#define ETH_DMATxDesc_CIC_IPV4Header ((uint32_t)0x00400000) /* IPV4 header Checksum Insertion */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment ((uint32_t)0x00800000) /* TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full ((uint32_t)0x00C00000) /* TCP/UDP/ICMP Checksum Insertion fully calculated */ +#define ETH_DMATxDesc_TER ((uint32_t)0x00200000) /* Transmit End of Ring */ +#define ETH_DMATxDesc_TCH ((uint32_t)0x00100000) /* Second Address Chained */ +#define ETH_DMATxDesc_TTSS ((uint32_t)0x00020000) /* Tx Time Stamp Status */ +#define ETH_DMATxDesc_IHE ((uint32_t)0x00010000) /* IP Header Error */ +#define ETH_DMATxDesc_ES ((uint32_t)0x00008000) /* Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ +#define ETH_DMATxDesc_JT ((uint32_t)0x00004000) /* Jabber Timeout */ +#define ETH_DMATxDesc_FF ((uint32_t)0x00002000) /* Frame Flushed: DMA/MTL flushed the frame due to SW flush */ +#define ETH_DMATxDesc_PCE ((uint32_t)0x00001000) /* Payload Checksum Error */ +#define ETH_DMATxDesc_LCA ((uint32_t)0x00000800) /* Loss of Carrier: carrier lost during tramsmission */ +#define ETH_DMATxDesc_NC ((uint32_t)0x00000400) /* No Carrier: no carrier signal from the tranceiver */ +#define ETH_DMATxDesc_LCO ((uint32_t)0x00000200) /* Late Collision: transmission aborted due to collision */ +#define ETH_DMATxDesc_EC ((uint32_t)0x00000100) /* Excessive Collision: transmission aborted after 16 collisions */ +#define ETH_DMATxDesc_VF ((uint32_t)0x00000080) /* VLAN Frame */ +#define ETH_DMATxDesc_CC ((uint32_t)0x00000078) /* Collision Count */ +#define ETH_DMATxDesc_ED ((uint32_t)0x00000004) /* Excessive Deferral */ +#define ETH_DMATxDesc_UF ((uint32_t)0x00000002) /* Underflow Error: late data arrival from the memory */ +#define ETH_DMATxDesc_DB ((uint32_t)0x00000001) /* Deferred Bit */ + +/* Field definition of TDES1 register */ +#define ETH_DMATxDesc_TBS2 ((uint32_t)0x1FFF0000) /* Transmit Buffer2 Size */ +#define ETH_DMATxDesc_TBS1 ((uint32_t)0x00001FFF) /* Transmit Buffer1 Size */ + +/* Field definition of TDES2 register */ +#define ETH_DMATxDesc_B1AP ((uint32_t)0xFFFFFFFF) /* Buffer1 Address Pointer */ + +/* Field definition of TDES3 register */ +#define ETH_DMATxDesc_B2AP ((uint32_t)0xFFFFFFFF) /* Buffer2 Address Pointer */ + +/** + DMA Rx Desciptor + --------------------------------------------------------------------------------------------------------------------- + RDES0 | OWN(31) | Status [30:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES2 | Buffer1 Address [31:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + ---------------------------------------------------------------------------------------------------------------------- +*/ + +/* Bit or field definition of RDES0 register (DMA Rx descriptor status register) */ +#define ETH_DMARxDesc_OWN ((uint32_t)0x80000000) /* OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARxDesc_AFM ((uint32_t)0x40000000) /* DA Filter Fail for the rx frame */ +#define ETH_DMARxDesc_FL ((uint32_t)0x3FFF0000) /* Receive descriptor frame length */ +#define ETH_DMARxDesc_ES ((uint32_t)0x00008000) /* Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ +#define ETH_DMARxDesc_DE ((uint32_t)0x00004000) /* Desciptor error: no more descriptors for receive frame */ +#define ETH_DMARxDesc_SAF ((uint32_t)0x00002000) /* SA Filter Fail for the received frame */ +#define ETH_DMARxDesc_LE ((uint32_t)0x00001000) /* Frame size not matching with length field */ +#define ETH_DMARxDesc_OE ((uint32_t)0x00000800) /* Overflow Error: Frame was damaged due to buffer overflow */ +#define ETH_DMARxDesc_VLAN ((uint32_t)0x00000400) /* VLAN Tag: received frame is a VLAN frame */ +#define ETH_DMARxDesc_FS ((uint32_t)0x00000200) /* First descriptor of the frame */ +#define ETH_DMARxDesc_LS ((uint32_t)0x00000100) /* Last descriptor of the frame */ +#define ETH_DMARxDesc_IPV4HCE ((uint32_t)0x00000080) /* IPC Checksum Error: Rx Ipv4 header checksum error */ +#define ETH_DMARxDesc_LC ((uint32_t)0x00000040) /* Late collision occurred during reception */ +#define ETH_DMARxDesc_FT ((uint32_t)0x00000020) /* Frame type - Ethernet, otherwise 802.3 */ +#define ETH_DMARxDesc_RWT ((uint32_t)0x00000010) /* Receive Watchdog Timeout: watchdog timer expired during reception */ +#define ETH_DMARxDesc_RE ((uint32_t)0x00000008) /* Receive error: error reported by MII interface */ +#define ETH_DMARxDesc_DBE ((uint32_t)0x00000004) /* Dribble bit error: frame contains non int multiple of 8 bits */ +#define ETH_DMARxDesc_CE ((uint32_t)0x00000002) /* CRC error */ +#define ETH_DMARxDesc_MAMPCE ((uint32_t)0x00000001) /* Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ + +/* Bit or field definition of RDES1 register */ +#define ETH_DMARxDesc_DIC ((uint32_t)0x80000000) /* Disable Interrupt on Completion */ +#define ETH_DMARxDesc_RBS2 ((uint32_t)0x1FFF0000) /* Receive Buffer2 Size */ +#define ETH_DMARxDesc_RER ((uint32_t)0x00008000) /* Receive End of Ring */ +#define ETH_DMARxDesc_RCH ((uint32_t)0x00004000) /* Second Address Chained */ +#define ETH_DMARxDesc_RBS1 ((uint32_t)0x00001FFF) /* Receive Buffer1 Size */ + +/* Field definition of RDES2 register */ +#define ETH_DMARxDesc_B1AP ((uint32_t)0xFFFFFFFF) /* Buffer1 Address Pointer */ + +/* Field definition of RDES3 register */ +#define ETH_DMARxDesc_B2AP ((uint32_t)0xFFFFFFFF) /* Buffer2 Address Pointer */ + +/* Timeout threshold of Reading or writing PHY registers */ +#define PHY_READ_TO ((uint32_t)0x004FFFFF) +#define PHY_WRITE_TO ((uint32_t)0x0004FFFF) + +/* Delay time after reset PHY */ +#define PHY_ResetDelay ((uint32_t)0x000FFFFF) + +/* Delay time after configure PHY */ +#define PHY_ConfigDelay ((uint32_t)0x00FFFFFF) + +/* PHY basic register */ +#define PHY_BCR 0x0 /*PHY transceiver Basic Control Register */ +#define PHY_BSR 0x01 /*PHY transceiver Basic Status Register*/ +#define PHY_ANAR 0x04 /* Auto-Negotiation Advertisement Register */ +#define PHY_ANLPAR 0x05 /* Auto-Negotiation Link Partner Base Page Ability Register*/ +#define PHY_ANER 0x06 /* Auto-Negotiation Expansion Register */ +#define PHY_BMCR PHY_BCR +#define PHY_BMSR PHY_BSR +#define PHY_STATUS 0x10 +#define PHY_MDIX 0x1E + +/* Bit or field definition for PHY basic control register */ +#define PHY_Reset ((uint16_t)0x8000) /* PHY Reset */ +#define PHY_Loopback ((uint16_t)0x4000) /* Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /* Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /* Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /* Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /* Set the half-duplex mode at 10 Mb/s */ +#define PHY_AutoNegotiation ((uint16_t)0x1000) /* Enable auto-negotiation function */ +#define PHY_Restart_AutoNegotiation ((uint16_t)0x0200) /* Restart auto-negotiation function */ +#define PHY_Powerdown ((uint16_t)0x0800) /* Select the power down mode */ +#define PHY_Isolate ((uint16_t)0x0400) /* Isolate PHY from MII */ + +/* Bit or field definition for PHY basic status register */ +#define PHY_AutoNego_Complete ((uint16_t)0x0020) /* Auto-Negotioation process completed */ +#define PHY_Linked_Status ((uint16_t)0x0004) /* Valid link established */ +#define PHY_Jabber_detection ((uint16_t)0x0002) /* Jabber condition detected */ +#define PHY_RMII_Mode ((uint16_t)0x0020) /* RMII */ + + +/* Internal 10BASE-T PHY 50R*4 pull-up resistance enable or disable */ +#define ETH_Internal_Pull_Up_Res_Enable ((uint32_t)0x00100000) +#define ETH_Internal_Pull_Up_Res_Disable ((uint32_t)0x00000000) + +/* MAC autoNegotiation enable or disable */ +#define ETH_AutoNegotiation_Enable ((uint32_t)0x00000001) +#define ETH_AutoNegotiation_Disable ((uint32_t)0x00000000) + +/* MAC watchdog enable or disable */ +#define ETH_Watchdog_Enable ((uint32_t)0x00000000) +#define ETH_Watchdog_Disable ((uint32_t)0x00800000) + +/* Bit description - MAC jabber enable or disable */ +#define ETH_Jabber_Enable ((uint32_t)0x00000000) +#define ETH_Jabber_Disable ((uint32_t)0x00400000) + +/* Value of minimum IFG between frames during transmission */ +#define ETH_InterFrameGap_96Bit ((uint32_t)0x00000000) /* minimum IFG between frames during transmission is 96Bit */ +#define ETH_InterFrameGap_88Bit ((uint32_t)0x00020000) /* minimum IFG between frames during transmission is 88Bit */ +#define ETH_InterFrameGap_80Bit ((uint32_t)0x00040000) /* minimum IFG between frames during transmission is 80Bit */ +#define ETH_InterFrameGap_72Bit ((uint32_t)0x00060000) /* minimum IFG between frames during transmission is 72Bit */ +#define ETH_InterFrameGap_64Bit ((uint32_t)0x00080000) /* minimum IFG between frames during transmission is 64Bit */ +#define ETH_InterFrameGap_56Bit ((uint32_t)0x000A0000) /* minimum IFG between frames during transmission is 56Bit */ +#define ETH_InterFrameGap_48Bit ((uint32_t)0x000C0000) /* minimum IFG between frames during transmission is 48Bit */ +#define ETH_InterFrameGap_40Bit ((uint32_t)0x000E0000) /* minimum IFG between frames during transmission is 40Bit */ + +/* MAC carrier sense enable or disable */ +#define ETH_CarrierSense_Enable ((uint32_t)0x00000000) +#define ETH_CarrierSense_Disable ((uint32_t)0x00010000) + +/* MAC speed */ +#define ETH_Speed_10M ((uint32_t)0x00000000) +#define ETH_Speed_100M ((uint32_t)0x00004000) +#define ETH_Speed_1000M ((uint32_t)0x00008000) + +/* MAC receive own enable or disable */ +#define ETH_ReceiveOwn_Enable ((uint32_t)0x00000000) +#define ETH_ReceiveOwn_Disable ((uint32_t)0x00002000) + +/* MAC Loopback mode enable or disable */ +#define ETH_LoopbackMode_Enable ((uint32_t)0x00001000) +#define ETH_LoopbackMode_Disable ((uint32_t)0x00000000) + +/* MAC fullDuplex or halfDuplex */ +#define ETH_Mode_FullDuplex ((uint32_t)0x00000800) +#define ETH_Mode_HalfDuplex ((uint32_t)0x00000000) + +/* MAC offload checksum enable or disable */ +#define ETH_ChecksumOffload_Enable ((uint32_t)0x00000400) +#define ETH_ChecksumOffload_Disable ((uint32_t)0x00000000) + +/* MAC transmission retry enable or disable */ +#define ETH_RetryTransmission_Enable ((uint32_t)0x00000000) +#define ETH_RetryTransmission_Disable ((uint32_t)0x00000200) + +/* MAC automatic pad CRC strip enable or disable */ +#define ETH_AutomaticPadCRCStrip_Enable ((uint32_t)0x00000080) +#define ETH_AutomaticPadCRCStrip_Disable ((uint32_t)0x00000000) + +/* MAC backoff limitation */ +#define ETH_BackOffLimit_10 ((uint32_t)0x00000000) +#define ETH_BackOffLimit_8 ((uint32_t)0x00000020) +#define ETH_BackOffLimit_4 ((uint32_t)0x00000040) +#define ETH_BackOffLimit_1 ((uint32_t)0x00000060) + +/* MAC deferral check enable or disable */ +#define ETH_DeferralCheck_Enable ((uint32_t)0x00000010) +#define ETH_DeferralCheck_Disable ((uint32_t)0x00000000) + +/* Bit description : MAC receive all frame enable or disable */ +#define ETH_ReceiveAll_Enable ((uint32_t)0x80000000) +#define ETH_ReceiveAll_Disable ((uint32_t)0x00000000) + +/* MAC backoff limitation */ +#define ETH_SourceAddrFilter_Normal_Enable ((uint32_t)0x00000200) +#define ETH_SourceAddrFilter_Inverse_Enable ((uint32_t)0x00000300) +#define ETH_SourceAddrFilter_Disable ((uint32_t)0x00000000) + +/* MAC Pass control frames */ +#define ETH_PassControlFrames_BlockAll ((uint32_t)0x00000040) /* MAC filters all control frames from reaching the application */ +#define ETH_PassControlFrames_ForwardAll ((uint32_t)0x00000080) /* MAC forwards all control frames to application even if they fail the Address Filter */ +#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /* MAC forwards control frames that pass the Address Filter. */ + +/* MAC broadcast frames reception */ +#define ETH_BroadcastFramesReception_Enable ((uint32_t)0x00000000) +#define ETH_BroadcastFramesReception_Disable ((uint32_t)0x00000020) + +/* MAC destination address filter */ +#define ETH_DestinationAddrFilter_Normal ((uint32_t)0x00000000) +#define ETH_DestinationAddrFilter_Inverse ((uint32_t)0x00000008) + +/* MAC Promiscuous mode enable or disable */ +#define ETH_PromiscuousMode_Enable ((uint32_t)0x00000001) +#define ETH_PromiscuousMode_Disable ((uint32_t)0x00000000) + +/* MAC multicast frames filter */ +#define ETH_MulticastFramesFilter_PerfectHashTable ((uint32_t)0x00000404) +#define ETH_MulticastFramesFilter_HashTable ((uint32_t)0x00000004) +#define ETH_MulticastFramesFilter_Perfect ((uint32_t)0x00000000) +#define ETH_MulticastFramesFilter_None ((uint32_t)0x00000010) + +/* MAC unicast frames filter */ +#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402) +#define ETH_UnicastFramesFilter_HashTable ((uint32_t)0x00000002) +#define ETH_UnicastFramesFilter_Perfect ((uint32_t)0x00000000) + +/* Bit description : MAC zero quanta pause */ +#define ETH_ZeroQuantaPause_Enable ((uint32_t)0x00000000) +#define ETH_ZeroQuantaPause_Disable ((uint32_t)0x00000080) + +/* Field description : MAC pause low threshold */ +#define ETH_PauseLowThreshold_Minus4 ((uint32_t)0x00000000) /* Pause time minus 4 slot times */ +#define ETH_PauseLowThreshold_Minus28 ((uint32_t)0x00000010) /* Pause time minus 28 slot times */ +#define ETH_PauseLowThreshold_Minus144 ((uint32_t)0x00000020) /* Pause time minus 144 slot times */ +#define ETH_PauseLowThreshold_Minus256 ((uint32_t)0x00000030) /* Pause time minus 256 slot times */ + +/* MAC unicast pause frame detect enable or disable*/ +#define ETH_UnicastPauseFrameDetect_Enable ((uint32_t)0x00000008) +#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000) + +/* MAC receive flow control frame enable or disable */ +#define ETH_ReceiveFlowControl_Enable ((uint32_t)0x00000004) +#define ETH_ReceiveFlowControl_Disable ((uint32_t)0x00000000) + +/* MAC transmit flow control enable or disable */ +#define ETH_TransmitFlowControl_Enable ((uint32_t)0x00000002) +#define ETH_TransmitFlowControl_Disable ((uint32_t)0x00000000) + +/* MAC VLAN tag comparison */ +#define ETH_VLANTagComparison_12Bit ((uint32_t)0x00010000) +#define ETH_VLANTagComparison_16Bit ((uint32_t)0x00000000) + +/* MAC flag */ +#define ETH_MAC_FLAG_TST ((uint32_t)0x00000200) /* Time stamp trigger flag (on MAC) */ +#define ETH_MAC_FLAG_MMCT ((uint32_t)0x00000040) /* MMC transmit flag */ +#define ETH_MAC_FLAG_MMCR ((uint32_t)0x00000020) /* MMC receive flag */ +#define ETH_MAC_FLAG_MMC ((uint32_t)0x00000010) /* MMC flag (on MAC) */ +#define ETH_MAC_FLAG_PMT ((uint32_t)0x00000008) /* PMT flag (on MAC) */ + +/* MAC interrupt */ +#define ETH_MAC_IT_TST ((uint32_t)0x00000200) /* Time stamp trigger interrupt (on MAC) */ +#define ETH_MAC_IT_MMCT ((uint32_t)0x00000040) /* MMC transmit interrupt */ +#define ETH_MAC_IT_MMCR ((uint32_t)0x00000020) /* MMC receive interrupt */ +#define ETH_MAC_IT_MMC ((uint32_t)0x00000010) /* MMC interrupt (on MAC) */ +#define ETH_MAC_IT_PMT ((uint32_t)0x00000008) /* PMT interrupt (on MAC) */ + +/* MAC address */ +#define ETH_MAC_Address0 ((uint32_t)0x00000000) +#define ETH_MAC_Address1 ((uint32_t)0x00000008) +#define ETH_MAC_Address2 ((uint32_t)0x00000010) +#define ETH_MAC_Address3 ((uint32_t)0x00000018) + +/* MAC address filter select */ +#define ETH_MAC_AddressFilter_SA ((uint32_t)0x00000000) +#define ETH_MAC_AddressFilter_DA ((uint32_t)0x00000008) + +/* MAC address mask */ +#define ETH_MAC_AddressMask_Byte6 ((uint32_t)0x20000000) /* Mask MAC Address high reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte5 ((uint32_t)0x10000000) /* Mask MAC Address high reg bits [7:0] */ +#define ETH_MAC_AddressMask_Byte4 ((uint32_t)0x08000000) /* Mask MAC Address low reg bits [31:24] */ +#define ETH_MAC_AddressMask_Byte3 ((uint32_t)0x04000000) /* Mask MAC Address low reg bits [23:16] */ +#define ETH_MAC_AddressMask_Byte2 ((uint32_t)0x02000000) /* Mask MAC Address low reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte1 ((uint32_t)0x01000000) /* Mask MAC Address low reg bits [70] */ + + +/******************************************************************************/ +/* */ +/* MAC Descriptor Register */ +/* */ +/******************************************************************************/ + +/* DMA descriptor segment */ +#define ETH_DMATxDesc_LastSegment ((uint32_t)0x40000000) /* Last Segment */ +#define ETH_DMATxDesc_FirstSegment ((uint32_t)0x20000000) /* First Segment */ + +/* DMA descriptor checksum setting */ +#define ETH_DMATxDesc_ChecksumByPass ((uint32_t)0x00000000) /* Checksum engine bypass */ +#define ETH_DMATxDesc_ChecksumIPV4Header ((uint32_t)0x00400000) /* IPv4 header checksum insertion */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment ((uint32_t)0x00800000) /* TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull ((uint32_t)0x00C00000) /* TCP/UDP/ICMP checksum fully in hardware including pseudo header */ + +/* DMA RX & TX buffer */ +#define ETH_DMARxDesc_Buffer1 ((uint32_t)0x00000000) /* DMA Rx Desc Buffer1 */ +#define ETH_DMARxDesc_Buffer2 ((uint32_t)0x00000001) /* DMA Rx Desc Buffer2 */ + + +/******************************************************************************/ +/* */ +/* ETH DMA Register */ +/* */ +/******************************************************************************/ + +/* DMA drop TCPIP checksum error frame enable or disable */ +#define ETH_DropTCPIPChecksumErrorFrame_Enable ((uint32_t)0x00000000) +#define ETH_DropTCPIPChecksumErrorFrame_Disable ((uint32_t)0x04000000) + +/* DMA receive store forward enable or disable */ +#define ETH_ReceiveStoreForward_Enable ((uint32_t)0x02000000) +#define ETH_ReceiveStoreForward_Disable ((uint32_t)0x00000000) + +/* DMA flush received frame enable or disable */ +#define ETH_FlushReceivedFrame_Enable ((uint32_t)0x00000000) +#define ETH_FlushReceivedFrame_Disable ((uint32_t)0x01000000) + +/* DMA transmit store forward enable or disable */ +#define ETH_TransmitStoreForward_Enable ((uint32_t)0x00200000) +#define ETH_TransmitStoreForward_Disable ((uint32_t)0x00000000) + +/* DMA transmit threshold control */ +#define ETH_TransmitThresholdControl_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Transmit FIFO is 64 Bytes */ +#define ETH_TransmitThresholdControl_128Bytes ((uint32_t)0x00004000) /* threshold level of the MTL Transmit FIFO is 128 Bytes */ +#define ETH_TransmitThresholdControl_192Bytes ((uint32_t)0x00008000) /* threshold level of the MTL Transmit FIFO is 192 Bytes */ +#define ETH_TransmitThresholdControl_256Bytes ((uint32_t)0x0000C000) /* threshold level of the MTL Transmit FIFO is 256 Bytes */ +#define ETH_TransmitThresholdControl_40Bytes ((uint32_t)0x00010000) /* threshold level of the MTL Transmit FIFO is 40 Bytes */ +#define ETH_TransmitThresholdControl_32Bytes ((uint32_t)0x00014000) /* threshold level of the MTL Transmit FIFO is 32 Bytes */ +#define ETH_TransmitThresholdControl_24Bytes ((uint32_t)0x00018000) /* threshold level of the MTL Transmit FIFO is 24 Bytes */ +#define ETH_TransmitThresholdControl_16Bytes ((uint32_t)0x0001C000) /* threshold level of the MTL Transmit FIFO is 16 Bytes */ + +/* DMA forward error frames */ +#define ETH_ForwardErrorFrames_Enable ((uint32_t)0x00000080) +#define ETH_ForwardErrorFrames_Disable ((uint32_t)0x00000000) + +/* DMA forward undersized good frames enable or disable */ +#define ETH_ForwardUndersizedGoodFrames_Enable ((uint32_t)0x00000040) +#define ETH_ForwardUndersizedGoodFrames_Disable ((uint32_t)0x00000000) + +/* DMA receive threshold control */ +#define ETH_ReceiveThresholdControl_64Bytes ((uint32_t)0x00000000) /* threshold level of the MTL Receive FIFO is 64 Bytes */ +#define ETH_ReceiveThresholdControl_32Bytes ((uint32_t)0x00000008) /* threshold level of the MTL Receive FIFO is 32 Bytes */ +#define ETH_ReceiveThresholdControl_96Bytes ((uint32_t)0x00000010) /* threshold level of the MTL Receive FIFO is 96 Bytes */ +#define ETH_ReceiveThresholdControl_128Bytes ((uint32_t)0x00000018) /* threshold level of the MTL Receive FIFO is 128 Bytes */ + +/* DMA second frame operate enable or disable */ +#define ETH_SecondFrameOperate_Enable ((uint32_t)0x00000004) +#define ETH_SecondFrameOperate_Disable ((uint32_t)0x00000000) + +/* Address aligned beats enable or disable */ +#define ETH_AddressAlignedBeats_Enable ((uint32_t)0x02000000) +#define ETH_AddressAlignedBeats_Disable ((uint32_t)0x00000000) + +/* DMA Fixed burst enable or disable */ +#define ETH_FixedBurst_Enable ((uint32_t)0x00010000) +#define ETH_FixedBurst_Disable ((uint32_t)0x00000000) + + +/* RX DMA burst length */ +#define ETH_RxDMABurstLength_1Beat ((uint32_t)0x00020000) /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ +#define ETH_RxDMABurstLength_2Beat ((uint32_t)0x00040000) /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ +#define ETH_RxDMABurstLength_4Beat ((uint32_t)0x00080000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_8Beat ((uint32_t)0x00100000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_16Beat ((uint32_t)0x00200000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_32Beat ((uint32_t)0x00400000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01020000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01040000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01080000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01100000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01200000) /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ +#define ETH_RxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01400000) /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ + + +/* TX DMA burst length */ +#define ETH_TxDMABurstLength_1Beat ((uint32_t)0x00000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ +#define ETH_TxDMABurstLength_2Beat ((uint32_t)0x00000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ +#define ETH_TxDMABurstLength_4Beat ((uint32_t)0x00000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_8Beat ((uint32_t)0x00000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_16Beat ((uint32_t)0x00001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_32Beat ((uint32_t)0x00002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ +#define ETH_TxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ + +/* DMA arbitration_round robin */ +#define ETH_DMAArbitration_RoundRobin_RxTx_1_1 ((uint32_t)0x00000000) +#define ETH_DMAArbitration_RoundRobin_RxTx_2_1 ((uint32_t)0x00004000) +#define ETH_DMAArbitration_RoundRobin_RxTx_3_1 ((uint32_t)0x00008000) +#define ETH_DMAArbitration_RoundRobin_RxTx_4_1 ((uint32_t)0x0000C000) +#define ETH_DMAArbitration_RxPriorTx ((uint32_t)0x00000002) + +/* DMA interrupt FALG */ +#define ETH_DMA_FLAG_TST ((uint32_t)0x20000000) /* Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_FLAG_PMT ((uint32_t)0x10000000) /* PMT interrupt (on DMA) */ +#define ETH_DMA_FLAG_MMC ((uint32_t)0x08000000) /* MMC interrupt (on DMA) */ +#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMA_FLAG_ReadWriteError ((uint32_t)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ +#define ETH_DMA_FLAG_AccessError ((uint32_t)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ +#define ETH_DMA_FLAG_NIS ((uint32_t)0x00010000) /* Normal interrupt summary flag */ +#define ETH_DMA_FLAG_AIS ((uint32_t)0x00008000) /* Abnormal interrupt summary flag */ +#define ETH_DMA_FLAG_ER ((uint32_t)0x00004000) /* Early receive flag */ +#define ETH_DMA_FLAG_FBE ((uint32_t)0x00002000) /* Fatal bus error flag */ +#define ETH_DMA_FLAG_ET ((uint32_t)0x00000400) /* Early transmit flag */ +#define ETH_DMA_FLAG_RWT ((uint32_t)0x00000200) /* Receive watchdog timeout flag */ +#define ETH_DMA_FLAG_RPS ((uint32_t)0x00000100) /* Receive process stopped flag */ +#define ETH_DMA_FLAG_RBU ((uint32_t)0x00000080) /* Receive buffer unavailable flag */ +#define ETH_DMA_FLAG_R ((uint32_t)0x00000040) /* Receive flag */ +#define ETH_DMA_FLAG_TU ((uint32_t)0x00000020) /* Underflow flag */ +#define ETH_DMA_FLAG_RO ((uint32_t)0x00000010) /* Overflow flag */ +#define ETH_DMA_FLAG_TJT ((uint32_t)0x00000008) /* Transmit jabber timeout flag */ +#define ETH_DMA_FLAG_TBU ((uint32_t)0x00000004) /* Transmit buffer unavailable flag */ +#define ETH_DMA_FLAG_TPS ((uint32_t)0x00000002) /* Transmit process stopped flag */ +#define ETH_DMA_FLAG_T ((uint32_t)0x00000001) /* Transmit flag */ + +/* DMA interrupt */ +#define ETH_DMA_IT_PHYLINK ((uint32_t)0x80000000) /* Internal PHY link status change interrupt */ +#define ETH_DMA_IT_TST ((uint32_t)0x20000000) /* Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_IT_PMT ((uint32_t)0x10000000) /* PMT interrupt (on DMA) */ +#define ETH_DMA_IT_MMC ((uint32_t)0x08000000) /* MMC interrupt (on DMA) */ +#define ETH_DMA_IT_NIS ((uint32_t)0x00010000) /* Normal interrupt summary */ +#define ETH_DMA_IT_AIS ((uint32_t)0x00008000) /* Abnormal interrupt summary */ +#define ETH_DMA_IT_ER ((uint32_t)0x00004000) /* Early receive interrupt */ +#define ETH_DMA_IT_FBE ((uint32_t)0x00002000) /* Fatal bus error interrupt */ +#define ETH_DMA_IT_ET ((uint32_t)0x00000400) /* Early transmit interrupt */ +#define ETH_DMA_IT_RWT ((uint32_t)0x00000200) /* Receive watchdog timeout interrupt */ +#define ETH_DMA_IT_RPS ((uint32_t)0x00000100) /* Receive process stopped interrupt */ +#define ETH_DMA_IT_RBU ((uint32_t)0x00000080) /* Receive buffer unavailable interrupt */ +#define ETH_DMA_IT_R ((uint32_t)0x00000040) /* Receive interrupt */ +#define ETH_DMA_IT_TU ((uint32_t)0x00000020) /* Underflow interrupt */ +#define ETH_DMA_IT_RO ((uint32_t)0x00000010) /* Overflow interrupt */ +#define ETH_DMA_IT_TJT ((uint32_t)0x00000008) /* Transmit jabber timeout interrupt */ +#define ETH_DMA_IT_TBU ((uint32_t)0x00000004) /* Transmit buffer unavailable interrupt */ +#define ETH_DMA_IT_TPS ((uint32_t)0x00000002) /* Transmit process stopped interrupt */ +#define ETH_DMA_IT_T ((uint32_t)0x00000001) /* Transmit interrupt */ + +/* DMA transmit process */ +#define ETH_DMA_TransmitProcess_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ +#define ETH_DMA_TransmitProcess_Fetching ((uint32_t)0x00100000) /* Running - fetching the Tx descriptor */ +#define ETH_DMA_TransmitProcess_Waiting ((uint32_t)0x00200000) /* Running - waiting for status */ +#define ETH_DMA_TransmitProcess_Reading ((uint32_t)0x00300000) /* Running - reading the data from host memory */ +#define ETH_DMA_TransmitProcess_Suspended ((uint32_t)0x00600000) /* Suspended - Tx Desciptor unavailabe */ +#define ETH_DMA_TransmitProcess_Closing ((uint32_t)0x00700000) /* Running - closing Rx descriptor */ + +/* DMA receive Process */ +#define ETH_DMA_ReceiveProcess_Stopped ((uint32_t)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ +#define ETH_DMA_ReceiveProcess_Fetching ((uint32_t)0x00020000) /* Running - fetching the Rx descriptor */ +#define ETH_DMA_ReceiveProcess_Waiting ((uint32_t)0x00060000) /* Running - waiting for packet */ +#define ETH_DMA_ReceiveProcess_Suspended ((uint32_t)0x00080000) /* Suspended - Rx Desciptor unavailable */ +#define ETH_DMA_ReceiveProcess_Closing ((uint32_t)0x000A0000) /* Running - closing descriptor */ +#define ETH_DMA_ReceiveProcess_Queuing ((uint32_t)0x000E0000) /* Running - queuing the recieve frame into host memory */ + +/* DMA overflow */ +#define ETH_DMA_Overflow_RxFIFOCounter ((uint32_t)0x10000000) /* Overflow bit for FIFO overflow counter */ +#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000) /* Overflow bit for missed frame counter */ + + +/********************************************************************************* +* Ethernet PMT defines +**********************************************************************************/ + +/* PMT flag */ +#define ETH_PMT_FLAG_WUFFRPR ((uint32_t)0x80000000) /* Wake-Up Frame Filter Register Poniter Reset */ +#define ETH_PMT_FLAG_WUFR ((uint32_t)0x00000040) /* Wake-Up Frame Received */ +#define ETH_PMT_FLAG_MPR ((uint32_t)0x00000020) /* Magic Packet Received */ + +/********************************************************************************* +* Ethernet MMC defines +**********************************************************************************/ + +/* MMC TX interrupt flag */ +#define ETH_MMC_IT_TGF ((uint32_t)0x00200000) /* When Tx good frame counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFMSC ((uint32_t)0x00008000) /* When Tx good multi col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFSC ((uint32_t)0x00004000) /* When Tx good single col counter reaches half the maximum value */ + +/* MMC RX interrupt flag */ +#define ETH_MMC_IT_RGUF ((uint32_t)0x10020000) /* When Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMC_IT_RFAE ((uint32_t)0x10000040) /* When Rx alignment error counter reaches half the maximum value */ +#define ETH_MMC_IT_RFCE ((uint32_t)0x10000020) /* When Rx crc error counter reaches half the maximum value */ + + +/* MMC description */ +#define ETH_MMCCR ((uint32_t)0x00000100) /* MMC CR register */ +#define ETH_MMCRIR ((uint32_t)0x00000104) /* MMC RIR register */ +#define ETH_MMCTIR ((uint32_t)0x00000108) /* MMC TIR register */ +#define ETH_MMCRIMR ((uint32_t)0x0000010C) /* MMC RIMR register */ +#define ETH_MMCTIMR ((uint32_t)0x00000110) /* MMC TIMR register */ +#define ETH_MMCTGFSCCR ((uint32_t)0x0000014C) /* MMC TGFSCCR register */ +#define ETH_MMCTGFMSCCR ((uint32_t)0x00000150) /* MMC TGFMSCCR register */ +#define ETH_MMCTGFCR ((uint32_t)0x00000168) /* MMC TGFCR register */ +#define ETH_MMCRFCECR ((uint32_t)0x00000194) /* MMC RFCECR register */ +#define ETH_MMCRFAECR ((uint32_t)0x00000198) /* MMC RFAECR register */ +#define ETH_MMCRGUFCR ((uint32_t)0x000001C4) /* MMC RGUFCR register */ + + +/********************************************************************************* +* Ethernet PTP defines +**********************************************************************************/ + +/* PTP fine update method or coarse Update method */ +#define ETH_PTP_FineUpdate ((uint32_t)0x00000001) /* Fine Update method */ +#define ETH_PTP_CoarseUpdate ((uint32_t)0x00000000) /* Coarse Update method */ + + +/* PTP time stamp control */ +#define ETH_PTP_FLAG_TSARU ((uint32_t)0x00000020) /* Addend Register Update */ +#define ETH_PTP_FLAG_TSITE ((uint32_t)0x00000010) /* Time Stamp Interrupt Trigger */ +#define ETH_PTP_FLAG_TSSTU ((uint32_t)0x00000008) /* Time Stamp Update */ +#define ETH_PTP_FLAG_TSSTI ((uint32_t)0x00000004) /* Time Stamp Initialize */ + +/* PTP positive/negative time value */ +#define ETH_PTP_PositiveTime ((uint32_t)0x00000000) /* Positive time value */ +#define ETH_PTP_NegativeTime ((uint32_t)0x80000000) /* Negative time value */ + + +/******************************************************************************/ +/* */ +/* PTP Register */ +/* */ +/******************************************************************************/ +#define ETH_PTPTSCR ((uint32_t)0x00000700) /* PTP TSCR register */ +#define ETH_PTPSSIR ((uint32_t)0x00000704) /* PTP SSIR register */ +#define ETH_PTPTSHR ((uint32_t)0x00000708) /* PTP TSHR register */ +#define ETH_PTPTSLR ((uint32_t)0x0000070C) /* PTP TSLR register */ +#define ETH_PTPTSHUR ((uint32_t)0x00000710) /* PTP TSHUR register */ +#define ETH_PTPTSLUR ((uint32_t)0x00000714) /* PTP TSLUR register */ +#define ETH_PTPTSAR ((uint32_t)0x00000718) /* PTP TSAR register */ +#define ETH_PTPTTHR ((uint32_t)0x0000071C) /* PTP TTHR register */ +#define ETH_PTPTTLR ((uint32_t)0x00000720) /* PTP TTLR register */ + +#define ETH_DMASR_TSTS ((unsigned int)0x20000000) /* Time-stamp trigger status */ +#define ETH_DMASR_PMTS ((unsigned int)0x10000000) /* PMT status */ +#define ETH_DMASR_MMCS ((unsigned int)0x08000000) /* MMC status */ +#define ETH_DMASR_EBS ((unsigned int)0x03800000) /* Error bits status */ + #define ETH_DMASR_EBS_DescAccess ((unsigned int)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ + #define ETH_DMASR_EBS_ReadTransf ((unsigned int)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ + #define ETH_DMASR_EBS_DataTransfTx ((unsigned int)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMASR_TPS ((unsigned int)0x00700000) /* Transmit process state */ + #define ETH_DMASR_TPS_Stopped ((unsigned int)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ + #define ETH_DMASR_TPS_Fetching ((unsigned int)0x00100000) /* Running - fetching the Tx descriptor */ + #define ETH_DMASR_TPS_Waiting ((unsigned int)0x00200000) /* Running - waiting for status */ + #define ETH_DMASR_TPS_Reading ((unsigned int)0x00300000) /* Running - reading the data from host memory */ + #define ETH_DMASR_TPS_Suspended ((unsigned int)0x00600000) /* Suspended - Tx Descriptor unavailabe */ + #define ETH_DMASR_TPS_Closing ((unsigned int)0x00700000) /* Running - closing Rx descriptor */ +#define ETH_DMASR_RPS ((unsigned int)0x000E0000) /* Receive process state */ + #define ETH_DMASR_RPS_Stopped ((unsigned int)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ + #define ETH_DMASR_RPS_Fetching ((unsigned int)0x00020000) /* Running - fetching the Rx descriptor */ + #define ETH_DMASR_RPS_Waiting ((unsigned int)0x00060000) /* Running - waiting for packet */ + #define ETH_DMASR_RPS_Suspended ((unsigned int)0x00080000) /* Suspended - Rx Descriptor unavailable */ + #define ETH_DMASR_RPS_Closing ((unsigned int)0x000A0000) /* Running - closing descriptor */ + #define ETH_DMASR_RPS_Queuing ((unsigned int)0x000E0000) /* Running - queuing the recieve frame into host memory */ +#define ETH_DMASR_NIS ((unsigned int)0x00010000) /* Normal interrupt summary */ +#define ETH_DMASR_AIS ((unsigned int)0x00008000) /* Abnormal interrupt summary */ +#define ETH_DMASR_ERS ((unsigned int)0x00004000) /* Early receive status */ +#define ETH_DMASR_FBES ((unsigned int)0x00002000) /* Fatal bus error status */ +#define ETH_DMASR_ETS ((unsigned int)0x00000400) /* Early transmit status */ +#define ETH_DMASR_RWTS ((unsigned int)0x00000200) /* Receive watchdog timeout status */ +#define ETH_DMASR_RPSS ((unsigned int)0x00000100) /* Receive process stopped status */ +#define ETH_DMASR_RBUS ((unsigned int)0x00000080) /* Receive buffer unavailable status */ +#define ETH_DMASR_RS ((unsigned int)0x00000040) /* Receive status */ +#define ETH_DMASR_TUS ((unsigned int)0x00000020) /* Transmit underflow status */ +#define ETH_DMASR_ROS ((unsigned int)0x00000010) /* Receive overflow status */ +#define ETH_DMASR_TJTS ((unsigned int)0x00000008) /* Transmit jabber timeout status */ +#define ETH_DMASR_TBUS ((unsigned int)0x00000004) /* Transmit buffer unavailable status */ +#define ETH_DMASR_TPSS ((unsigned int)0x00000002) /* Transmit process stopped status */ +#define ETH_DMASR_TS ((unsigned int)0x00000001) /* Transmit status */ + + +/******************************************************************************/ +/* */ +/* ETH MAC Register */ +/* */ +/******************************************************************************/ +#define ETH_MACCR_WD ((unsigned int)0x00800000) /* Watchdog disable */ +#define ETH_MACCR_JD ((unsigned int)0x00400000) /* Jabber disable */ +#define ETH_MACCR_IFG ((unsigned int)0x000E0000) /* Inter-frame gap */ +#define ETH_MACCR_IFG_96Bit ((unsigned int)0x00000000) /* Minimum IFG between frames during transmission is 96Bit */ + #define ETH_MACCR_IFG_88Bit ((unsigned int)0x00020000) /* Minimum IFG between frames during transmission is 88Bit */ + #define ETH_MACCR_IFG_80Bit ((unsigned int)0x00040000) /* Minimum IFG between frames during transmission is 80Bit */ + #define ETH_MACCR_IFG_72Bit ((unsigned int)0x00060000) /* Minimum IFG between frames during transmission is 72Bit */ + #define ETH_MACCR_IFG_64Bit ((unsigned int)0x00080000) /* Minimum IFG between frames during transmission is 64Bit */ + #define ETH_MACCR_IFG_56Bit ((unsigned int)0x000A0000) /* Minimum IFG between frames during transmission is 56Bit */ + #define ETH_MACCR_IFG_48Bit ((unsigned int)0x000C0000) /* Minimum IFG between frames during transmission is 48Bit */ + #define ETH_MACCR_IFG_40Bit ((unsigned int)0x000E0000) /* Minimum IFG between frames during transmission is 40Bit */ +#define ETH_MACCR_CSD ((unsigned int)0x00010000) /* Carrier sense disable (during transmission) */ +#define ETH_MACCR_FES ((unsigned int)0x00004000) /* Fast ethernet speed */ +#define ETH_MACCR_ROD ((unsigned int)0x00002000) /* Receive own disable */ +#define ETH_MACCR_LM ((unsigned int)0x00001000) /* loopback mode */ +#define ETH_MACCR_DM ((unsigned int)0x00000800) /* Duplex mode */ +#define ETH_MACCR_IPCO ((unsigned int)0x00000400) /* IP Checksum offload */ +#define ETH_MACCR_RD ((unsigned int)0x00000200) /* Retry disable */ +#define ETH_MACCR_APCS ((unsigned int)0x00000080) /* Automatic Pad/CRC stripping */ +#define ETH_MACCR_BL ((unsigned int)0x00000060) /* Back-off limit: random integer number (r) of slot time delays before reschedulinga transmission attempt during retries after a collision: 0 =< r <2^k */ + #define ETH_MACCR_BL_10 ((unsigned int)0x00000000) /* k = min (n, 10) */ + #define ETH_MACCR_BL_8 ((unsigned int)0x00000020) /* k = min (n, 8) */ + #define ETH_MACCR_BL_4 ((unsigned int)0x00000040) /* k = min (n, 4) */ + #define ETH_MACCR_BL_1 ((unsigned int)0x00000060) /* k = min (n, 1) */ +#define ETH_MACCR_DC ((unsigned int)0x00000010) /* Defferal check */ +#define ETH_MACCR_TE ((unsigned int)0x00000008) /* Transmitter enable */ +#define ETH_MACCR_RE ((unsigned int)0x00000004) /* Receiver enable */ + +#define ETH_MACFFR_RA ((unsigned int)0x80000000) /* Receive all */ +#define ETH_MACFFR_HPF ((unsigned int)0x00000400) /* Hash or perfect filter */ +#define ETH_MACFFR_SAF ((unsigned int)0x00000200) /* Source address filter enable */ +#define ETH_MACFFR_SAIF ((unsigned int)0x00000100) /* SA inverse filtering */ +#define ETH_MACFFR_PCF ((unsigned int)0x000000C0) /* Pass control frames: 3 cases */ + #define ETH_MACFFR_PCF_BlockAll ((unsigned int)0x00000040) /* MAC filters all control frames from reaching the application */ + #define ETH_MACFFR_PCF_ForwardAll ((unsigned int)0x00000080) /* MAC forwards all control frames to application even if they fail the Address Filter */ + #define ETH_MACFFR_PCF_ForwardPassedAddrFilter ((unsigned int)0x000000C0) /* MAC forwards control frames that pass the Address Filter. */ +#define ETH_MACFFR_BFD ((unsigned int)0x00000020) /* Broadcast frame disable */ +#define ETH_MACFFR_PAM ((unsigned int)0x00000010) /* Pass all mutlicast */ +#define ETH_MACFFR_DAIF ((unsigned int)0x00000008) /* DA Inverse filtering */ +#define ETH_MACFFR_HM ((unsigned int)0x00000004) /* Hash multicast */ +#define ETH_MACFFR_HU ((unsigned int)0x00000002) /* Hash unicast */ +#define ETH_MACFFR_PM ((unsigned int)0x00000001) /* Promiscuous mode */ + +#define ETH_MACHTHR_HTH ((unsigned int)0xFFFFFFFF) /* Hash table high */ +#define ETH_MACHTLR_HTL ((unsigned int)0xFFFFFFFF) /* Hash table low */ + +#define ETH_MACMIIAR_PA ((unsigned int)0x0000F800) /* Physical layer address */ +#define ETH_MACMIIAR_MR ((unsigned int)0x000007C0) /* MII register in the selected PHY */ +#define ETH_MACMIIAR_CR ((unsigned int)0x0000001C) /* CR clock range: 6 cases */ + #define ETH_MACMIIAR_CR_Div42 ((unsigned int)0x00000000) /* HCLK:60-100 MHz; MDC clock= HCLK/42 */ + #define ETH_MACMIIAR_CR_Div16 ((unsigned int)0x00000008) /* HCLK:20-35 MHz; MDC clock= HCLK/16 */ + #define ETH_MACMIIAR_CR_Div26 ((unsigned int)0x0000000C) /* HCLK:35-60 MHz; MDC clock= HCLK/26 */ +#define ETH_MACMIIAR_MW ((unsigned int)0x00000002) /* MII write */ +#define ETH_MACMIIAR_MB ((unsigned int)0x00000001) /* MII busy */ +#define ETH_MACMIIDR_MD ((unsigned int)0x0000FFFF) /* MII data: read/write data from/to PHY */ +#define ETH_MACFCR_PT ((unsigned int)0xFFFF0000) /* Pause time */ +#define ETH_MACFCR_ZQPD ((unsigned int)0x00000080) /* Zero-quanta pause disable */ +#define ETH_MACFCR_PLT ((unsigned int)0x00000030) /* Pause low threshold: 4 cases */ + #define ETH_MACFCR_PLT_Minus4 ((unsigned int)0x00000000) /* Pause time minus 4 slot times */ + #define ETH_MACFCR_PLT_Minus28 ((unsigned int)0x00000010) /* Pause time minus 28 slot times */ + #define ETH_MACFCR_PLT_Minus144 ((unsigned int)0x00000020) /* Pause time minus 144 slot times */ + #define ETH_MACFCR_PLT_Minus256 ((unsigned int)0x00000030) /* Pause time minus 256 slot times */ +#define ETH_MACFCR_UPFD ((unsigned int)0x00000008) /* Unicast pause frame detect */ +#define ETH_MACFCR_RFCE ((unsigned int)0x00000004) /* Receive flow control enable */ +#define ETH_MACFCR_TFCE ((unsigned int)0x00000002) /* Transmit flow control enable */ +#define ETH_MACFCR_FCBBPA ((unsigned int)0x00000001) /* Flow control busy/backpressure activate */ + +#define ETH_MACVLANTR_VLANTC ((unsigned int)0x00010000) /* 12-bit VLAN tag comparison */ +#define ETH_MACVLANTR_VLANTI ((unsigned int)0x0000FFFF) /* VLAN tag identifier (for receive frames) */ + +#define ETH_MACRWUFFR_D ((unsigned int)0xFFFFFFFF) /* Wake-up frame filter register data */ +/* Eight sequential Writes to this address (offset 0x28) will write all Wake-UpFrame Filter Registers. +Eight sequential Reads from this address (offset 0x28) will read all Wake-UpFrame Filter Registers. */ + +/* +Wake-UpFrame Filter Reg0 : Filter 0 Byte Mask +Wake-UpFrame Filter Reg1 : Filter 1 Byte Mask +Wake-UpFrame Filter Reg2 : Filter 2 Byte Mask +Wake-UpFrame Filter Reg3 : Filter 3 Byte Mask +Wake-UpFrame Filter Reg4 : RSVD - Filter3 Command - RSVD - Filter2 Command - + RSVD - Filter1 Command - RSVD - Filter0 Command +Wake-UpFrame Filter Re5 : Filter3 Offset - Filter2 Offset - Filter1 Offset - Filter0 Offset +Wake-UpFrame Filter Re6 : Filter1 CRC16 - Filter0 CRC16 +Wake-UpFrame Filter Re7 : Filter3 CRC16 - Filter2 CRC16 */ + +#define ETH_MACPMTCSR_WFFRPR ((unsigned int)0x80000000) /* Wake-Up Frame Filter Register Pointer Reset */ +#define ETH_MACPMTCSR_GU ((unsigned int)0x00000200) /* Global Unicast */ +#define ETH_MACPMTCSR_WFR ((unsigned int)0x00000040) /* Wake-Up Frame Received */ +#define ETH_MACPMTCSR_MPR ((unsigned int)0x00000020) /* Magic Packet Received */ +#define ETH_MACPMTCSR_WFE ((unsigned int)0x00000004) /* Wake-Up Frame Enable */ +#define ETH_MACPMTCSR_MPE ((unsigned int)0x00000002) /* Magic Packet Enable */ +#define ETH_MACPMTCSR_PD ((unsigned int)0x00000001) /* Power Down */ + +#define ETH_MACSR_TSTS ((unsigned int)0x00000200) /* Time stamp trigger status */ +#define ETH_MACSR_MMCTS ((unsigned int)0x00000040) /* MMC transmit status */ +#define ETH_MACSR_MMMCRS ((unsigned int)0x00000020) /* MMC receive status */ +#define ETH_MACSR_MMCS ((unsigned int)0x00000010) /* MMC status */ +#define ETH_MACSR_PMTS ((unsigned int)0x00000008) /* PMT status */ + +#define ETH_MACIMR_TSTIM ((unsigned int)0x00000200) /* Time stamp trigger interrupt mask */ +#define ETH_MACIMR_PMTIM ((unsigned int)0x00000008) /* PMT interrupt mask */ + +#define ETH_MACA0HR_MACA0H ((unsigned int)0x0000FFFF) /* MAC address0 high */ + +#define ETH_MACA0LR_MACA0L ((unsigned int)0xFFFFFFFF) /* MAC address0 low */ + +#define ETH_MACA1HR_AE ((unsigned int)0x80000000) /* Address enable */ +#define ETH_MACA1HR_SA ((unsigned int)0x40000000) /* Source address */ +#define ETH_MACA1HR_MBC ((unsigned int)0x3F000000) /* Mask byte control: bits to mask for comparison of the MAC Address bytes */ + #define ETH_MACA1HR_MBC_HBits15_8 ((unsigned int)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA1HR_MBC_HBits7_0 ((unsigned int)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA1HR_MBC_LBits31_24 ((unsigned int)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA1HR_MBC_LBits23_16 ((unsigned int)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA1HR_MBC_LBits15_8 ((unsigned int)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA1HR_MBC_LBits7_0 ((unsigned int)0x01000000) /* Mask MAC Address low reg bits [7:0] */ +#define ETH_MACA1HR_MACA1H ((unsigned int)0x0000FFFF) /* MAC address1 high */ + +#define ETH_MACA1LR_MACA1L ((unsigned int)0xFFFFFFFF) /* MAC address1 low */ + +#define ETH_MACA2HR_AE ((unsigned int)0x80000000) /* Address enable */ +#define ETH_MACA2HR_SA ((unsigned int)0x40000000) /* Source address */ +#define ETH_MACA2HR_MBC ((unsigned int)0x3F000000) /* Mask byte control */ + #define ETH_MACA2HR_MBC_HBits15_8 ((unsigned int)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA2HR_MBC_HBits7_0 ((unsigned int)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA2HR_MBC_LBits31_24 ((unsigned int)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA2HR_MBC_LBits23_16 ((unsigned int)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA2HR_MBC_LBits15_8 ((unsigned int)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA2HR_MBC_LBits7_0 ((unsigned int)0x01000000) /* Mask MAC Address low reg bits [70] */ + +#define ETH_MACA2HR_MACA2H ((unsigned int)0x0000FFFF) /* MAC address1 high */ +#define ETH_MACA2LR_MACA2L ((unsigned int)0xFFFFFFFF) /* MAC address2 low */ + +#define ETH_MACA3HR_AE ((unsigned int)0x80000000) /* Address enable */ +#define ETH_MACA3HR_SA ((unsigned int)0x40000000) /* Source address */ +#define ETH_MACA3HR_MBC ((unsigned int)0x3F000000) /* Mask byte control */ + #define ETH_MACA3HR_MBC_HBits15_8 ((unsigned int)0x20000000) /* Mask MAC Address high reg bits [15:8] */ + #define ETH_MACA3HR_MBC_HBits7_0 ((unsigned int)0x10000000) /* Mask MAC Address high reg bits [7:0] */ + #define ETH_MACA3HR_MBC_LBits31_24 ((unsigned int)0x08000000) /* Mask MAC Address low reg bits [31:24] */ + #define ETH_MACA3HR_MBC_LBits23_16 ((unsigned int)0x04000000) /* Mask MAC Address low reg bits [23:16] */ + #define ETH_MACA3HR_MBC_LBits15_8 ((unsigned int)0x02000000) /* Mask MAC Address low reg bits [15:8] */ + #define ETH_MACA3HR_MBC_LBits7_0 ((unsigned int)0x01000000) /* Mask MAC Address low reg bits [70] */ +#define ETH_MACA3HR_MACA3H ((unsigned int)0x0000FFFF) /* MAC address3 high */ +#define ETH_MACA3LR_MACA3L ((unsigned int)0xFFFFFFFF) /* MAC address3 low */ + +/******************************************************************************/ +/* */ +/* ETH MMC Register */ +/* */ +/******************************************************************************/ +#define ETH_MMCCR_MCFHP ((unsigned int)0x00000020) /* MMC counter Full-Half preset */ +#define ETH_MMCCR_MCP ((unsigned int)0x00000010) /* MMC counter preset */ +#define ETH_MMCCR_MCF ((unsigned int)0x00000008) /* MMC Counter Freeze */ +#define ETH_MMCCR_ROR ((unsigned int)0x00000004) /* Reset on Read */ +#define ETH_MMCCR_CSR ((unsigned int)0x00000002) /* Counter Stop Rollover */ +#define ETH_MMCCR_CR ((unsigned int)0x00000001) /* Counters Reset */ + +#define ETH_MMCRIR_RGUFS ((unsigned int)0x00020000) /* Set when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIR_RFAES ((unsigned int)0x00000040) /* Set when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIR_RFCES ((unsigned int)0x00000020) /* Set when Rx crc error counter reaches half the maximum value */ + +#define ETH_MMCTIR_TGFS ((unsigned int)0x00200000) /* Set when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFMSCS ((unsigned int)0x00008000) /* Set when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIR_TGFSCS ((unsigned int)0x00004000) /* Set when Tx good single col counter reaches half the maximum value */ + +#define ETH_MMCRIMR_RGUFM ((unsigned int)0x00020000) /* Mask the interrupt when Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFAEM ((unsigned int)0x00000040) /* Mask the interrupt when when Rx alignment error counter reaches half the maximum value */ +#define ETH_MMCRIMR_RFCEM ((unsigned int)0x00000020) /* Mask the interrupt when Rx crc error counter reaches half the maximum value */ + +#define ETH_MMCTIMR_TGFM ((unsigned int)0x00200000) /* Mask the interrupt when Tx good frame count counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFMSCM ((unsigned int)0x00008000) /* Mask the interrupt when Tx good multi col counter reaches half the maximum value */ +#define ETH_MMCTIMR_TGFSCM ((unsigned int)0x00004000) /* Mask the interrupt when Tx good single col counter reaches half the maximum value */ + +#define ETH_MMCTGFSCCR_TGFSCC ((unsigned int)0xFFFFFFFF) /* Number of successfully transmitted frames after a single collision in Half-duplex mode. */ + +#define ETH_MMCTGFMSCCR_TGFMSCC ((unsigned int)0xFFFFFFFF) /* Number of successfully transmitted frames after more than a single collision in Half-duplex mode. */ + +#define ETH_MMCTGFCR_TGFC ((unsigned int)0xFFFFFFFF) /* Number of good frames transmitted. */ + +#define ETH_MMCRFCECR_RFCEC ((unsigned int)0xFFFFFFFF) /* Number of frames received with CRC error. */ + +#define ETH_MMCRFAECR_RFAEC ((unsigned int)0xFFFFFFFF) /* Number of frames received with alignment (dribble) error */ + +#define ETH_MMCRGUFCR_RGUFC ((unsigned int)0xFFFFFFFF) /* Number of good unicast frames received. */ + + +/******************************************************************************/ +/* */ +/* ETH Precise Clock Protocol Register */ +/* */ +/******************************************************************************/ +#define ETH_PTPTSCR_TSCNT ((unsigned int)0x00030000) /* Time stamp clock node type */ +#define ETH_PTPTSSR_TSSMRME ((unsigned int)0x00008000) /* Time stamp snapshot for message relevant to master enable */ +#define ETH_PTPTSSR_TSSEME ((unsigned int)0x00004000) /* Time stamp snapshot for event message enable */ +#define ETH_PTPTSSR_TSSIPV4FE ((unsigned int)0x00002000) /* Time stamp snapshot for IPv4 frames enable */ +#define ETH_PTPTSSR_TSSIPV6FE ((unsigned int)0x00001000) /* Time stamp snapshot for IPv6 frames enable */ +#define ETH_PTPTSSR_TSSPTPOEFE ((unsigned int)0x00000800) /* Time stamp snapshot for PTP over ethernet frames enable */ +#define ETH_PTPTSSR_TSPTPPSV2E ((unsigned int)0x00000400) /* Time stamp PTP packet snooping for version2 format enable */ +#define ETH_PTPTSSR_TSSSR ((unsigned int)0x00000200) /* Time stamp Sub-seconds rollover */ +#define ETH_PTPTSSR_TSSARFE ((unsigned int)0x00000100) /* Time stamp snapshot for all received frames enable */ + +#define ETH_PTPTSCR_TSARU ((unsigned int)0x00000020) /* Addend register update */ +#define ETH_PTPTSCR_TSITE ((unsigned int)0x00000010) /* Time stamp interrupt trigger enable */ +#define ETH_PTPTSCR_TSSTU ((unsigned int)0x00000008) /* Time stamp update */ +#define ETH_PTPTSCR_TSSTI ((unsigned int)0x00000004) /* Time stamp initialize */ +#define ETH_PTPTSCR_TSFCU ((unsigned int)0x00000002) /* Time stamp fine or coarse update */ +#define ETH_PTPTSCR_TSE ((unsigned int)0x00000001) /* Time stamp enable */ + +#define ETH_PTPSSIR_STSSI ((unsigned int)0x000000FF) /* System time Sub-second increment value */ + +#define ETH_PTPTSHR_STS ((unsigned int)0xFFFFFFFF) /* System Time second */ + +#define ETH_PTPTSLR_STPNS ((unsigned int)0x80000000) /* System Time Positive or negative time */ +#define ETH_PTPTSLR_STSS ((unsigned int)0x7FFFFFFF) /* System Time sub-seconds */ + +#define ETH_PTPTSHUR_TSUS ((unsigned int)0xFFFFFFFF) /* Time stamp update seconds */ + +#define ETH_PTPTSLUR_TSUPNS ((unsigned int)0x80000000) /* Time stamp update Positive or negative time */ +#define ETH_PTPTSLUR_TSUSS ((unsigned int)0x7FFFFFFF) /* Time stamp update sub-seconds */ + +#define ETH_PTPTSAR_TSA ((unsigned int)0xFFFFFFFF) /* Time stamp addend */ + +#define ETH_PTPTTHR_TTSH ((unsigned int)0xFFFFFFFF) /* Target time stamp high */ + +#define ETH_PTPTTLR_TTSL ((unsigned int)0xFFFFFFFF) /* Target time stamp low */ + +#define ETH_PTPTSSR_TSTTR ((unsigned int)0x00000020) /* Time stamp target time reached */ +#define ETH_PTPTSSR_TSSO ((unsigned int)0x00000010) /* Time stamp seconds overflow */ + +/******************************************************************************/ +/* */ +/* ETH DMA Register */ +/* */ +/******************************************************************************/ +#define ETH_DMABMR_AAB ((unsigned int)0x02000000) /* Address-Aligned beats */ +#define ETH_DMABMR_FPM ((unsigned int)0x01000000) /* 4xPBL mode */ +#define ETH_DMABMR_USP ((unsigned int)0x00800000) /* Use separate PBL */ +#define ETH_DMABMR_RDP ((unsigned int)0x007E0000) /* RxDMA PBL */ + #define ETH_DMABMR_RDP_1Beat ((unsigned int)0x00020000) /* maximum number of beats to be transferred in one RxDMA transaction is 1 */ + #define ETH_DMABMR_RDP_2Beat ((unsigned int)0x00040000) /* maximum number of beats to be transferred in one RxDMA transaction is 2 */ + #define ETH_DMABMR_RDP_4Beat ((unsigned int)0x00080000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_8Beat ((unsigned int)0x00100000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_16Beat ((unsigned int)0x00200000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_32Beat ((unsigned int)0x00400000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_4Beat ((unsigned int)0x01020000) /* maximum number of beats to be transferred in one RxDMA transaction is 4 */ + #define ETH_DMABMR_RDP_4xPBL_8Beat ((unsigned int)0x01040000) /* maximum number of beats to be transferred in one RxDMA transaction is 8 */ + #define ETH_DMABMR_RDP_4xPBL_16Beat ((unsigned int)0x01080000) /* maximum number of beats to be transferred in one RxDMA transaction is 16 */ + #define ETH_DMABMR_RDP_4xPBL_32Beat ((unsigned int)0x01100000) /* maximum number of beats to be transferred in one RxDMA transaction is 32 */ + #define ETH_DMABMR_RDP_4xPBL_64Beat ((unsigned int)0x01200000) /* maximum number of beats to be transferred in one RxDMA transaction is 64 */ + #define ETH_DMABMR_RDP_4xPBL_128Beat ((unsigned int)0x01400000) /* maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define ETH_DMABMR_FB ((unsigned int)0x00010000) /* Fixed Burst */ +#define ETH_DMABMR_RTPR ((unsigned int)0x0000C000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_1_1 ((unsigned int)0x00000000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_2_1 ((unsigned int)0x00004000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_3_1 ((unsigned int)0x00008000) /* Rx Tx priority ratio */ + #define ETH_DMABMR_RTPR_4_1 ((unsigned int)0x0000C000) /* Rx Tx priority ratio */ +#define ETH_DMABMR_PBL ((unsigned int)0x00003F00) /* Programmable burst length */ + #define ETH_DMABMR_PBL_1Beat ((unsigned int)0x00000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ + #define ETH_DMABMR_PBL_2Beat ((unsigned int)0x00000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ + #define ETH_DMABMR_PBL_4Beat ((unsigned int)0x00000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_8Beat ((unsigned int)0x00000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_16Beat ((unsigned int)0x00001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_32Beat ((unsigned int)0x00002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_4Beat ((unsigned int)0x01000100) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ + #define ETH_DMABMR_PBL_4xPBL_8Beat ((unsigned int)0x01000200) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ + #define ETH_DMABMR_PBL_4xPBL_16Beat ((unsigned int)0x01000400) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ + #define ETH_DMABMR_PBL_4xPBL_32Beat ((unsigned int)0x01000800) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ + #define ETH_DMABMR_PBL_4xPBL_64Beat ((unsigned int)0x01001000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ + #define ETH_DMABMR_PBL_4xPBL_128Beat ((unsigned int)0x01002000) /* maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define ETH_DMABMR_EDE ((unsigned int)0x00000080) /* Enhanced Descriptor Enable */ +#define ETH_DMABMR_DSL ((unsigned int)0x0000007C) /* Descriptor Skip Length */ +#define ETH_DMABMR_DA ((unsigned int)0x00000002) /* DMA arbitration scheme */ +#define ETH_DMABMR_SR ((unsigned int)0x00000001) /* Software reset */ + +#define ETH_DMATPDR_TPD ((unsigned int)0xFFFFFFFF) /* Transmit poll demand */ + +#define ETH_DMARPDR_RPD ((unsigned int)0xFFFFFFFF) /* Receive poll demand */ + +#define ETH_DMARDLAR_SRL ((unsigned int)0xFFFFFFFF) /* Start of receive list */ + +#define ETH_DMATDLAR_STL ((unsigned int)0xFFFFFFFF) /* Start of transmit list */ + +#define ETH_DMASR_TSTS ((unsigned int)0x20000000) /* Time-stamp trigger status */ +#define ETH_DMASR_PMTS ((unsigned int)0x10000000) /* PMT status */ +#define ETH_DMASR_MMCS ((unsigned int)0x08000000) /* MMC status */ +#define ETH_DMASR_EBS ((unsigned int)0x03800000) /* Error bits status */ + #define ETH_DMASR_EBS_DescAccess ((unsigned int)0x02000000) /* Error bits 0-data buffer, 1-desc. access */ + #define ETH_DMASR_EBS_ReadTransf ((unsigned int)0x01000000) /* Error bits 0-write trnsf, 1-read transfr */ + #define ETH_DMASR_EBS_DataTransfTx ((unsigned int)0x00800000) /* Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMASR_TPS ((unsigned int)0x00700000) /* Transmit process state */ + #define ETH_DMASR_TPS_Stopped ((unsigned int)0x00000000) /* Stopped - Reset or Stop Tx Command issued */ + #define ETH_DMASR_TPS_Fetching ((unsigned int)0x00100000) /* Running - fetching the Tx descriptor */ + #define ETH_DMASR_TPS_Waiting ((unsigned int)0x00200000) /* Running - waiting for status */ + #define ETH_DMASR_TPS_Reading ((unsigned int)0x00300000) /* Running - reading the data from host memory */ + #define ETH_DMASR_TPS_Suspended ((unsigned int)0x00600000) /* Suspended - Tx Descriptor unavailabe */ + #define ETH_DMASR_TPS_Closing ((unsigned int)0x00700000) /* Running - closing Rx descriptor */ +#define ETH_DMASR_RPS ((unsigned int)0x000E0000) /* Receive process state */ + #define ETH_DMASR_RPS_Stopped ((unsigned int)0x00000000) /* Stopped - Reset or Stop Rx Command issued */ + #define ETH_DMASR_RPS_Fetching ((unsigned int)0x00020000) /* Running - fetching the Rx descriptor */ + #define ETH_DMASR_RPS_Waiting ((unsigned int)0x00060000) /* Running - waiting for packet */ + #define ETH_DMASR_RPS_Suspended ((unsigned int)0x00080000) /* Suspended - Rx Descriptor unavailable */ + #define ETH_DMASR_RPS_Closing ((unsigned int)0x000A0000) /* Running - closing descriptor */ + #define ETH_DMASR_RPS_Queuing ((unsigned int)0x000E0000) /* Running - queuing the recieve frame into host memory */ +#define ETH_DMASR_NIS ((unsigned int)0x00010000) /* Normal interrupt summary */ +#define ETH_DMASR_AIS ((unsigned int)0x00008000) /* Abnormal interrupt summary */ +#define ETH_DMASR_ERS ((unsigned int)0x00004000) /* Early receive status */ +#define ETH_DMASR_FBES ((unsigned int)0x00002000) /* Fatal bus error status */ +#define ETH_DMASR_ETS ((unsigned int)0x00000400) /* Early transmit status */ +#define ETH_DMASR_RWTS ((unsigned int)0x00000200) /* Receive watchdog timeout status */ +#define ETH_DMASR_RPSS ((unsigned int)0x00000100) /* Receive process stopped status */ +#define ETH_DMASR_RBUS ((unsigned int)0x00000080) /* Receive buffer unavailable status */ +#define ETH_DMASR_RS ((unsigned int)0x00000040) /* Receive status */ +#define ETH_DMASR_TUS ((unsigned int)0x00000020) /* Transmit underflow status */ +#define ETH_DMASR_ROS ((unsigned int)0x00000010) /* Receive overflow status */ +#define ETH_DMASR_TJTS ((unsigned int)0x00000008) /* Transmit jabber timeout status */ +#define ETH_DMASR_TBUS ((unsigned int)0x00000004) /* Transmit buffer unavailable status */ +#define ETH_DMASR_TPSS ((unsigned int)0x00000002) /* Transmit process stopped status */ +#define ETH_DMASR_TS ((unsigned int)0x00000001) /* Transmit status */ + +#define ETH_DMAOMR_DTCEFD ((unsigned int)0x04000000) /* Disable Dropping of TCP/IP checksum error frames */ +#define ETH_DMAOMR_RSF ((unsigned int)0x02000000) /* Receive store and forward */ +#define ETH_DMAOMR_DFRF ((unsigned int)0x01000000) /* Disable flushing of received frames */ +#define ETH_DMAOMR_TSF ((unsigned int)0x00200000) /* Transmit store and forward */ +#define ETH_DMAOMR_FTF ((unsigned int)0x00100000) /* Flush transmit FIFO */ +#define ETH_DMAOMR_TTC ((unsigned int)0x0001C000) /* Transmit threshold control */ + #define ETH_DMAOMR_TTC_64Bytes ((unsigned int)0x00000000) /* threshold level of the MTL Transmit FIFO is 64 Bytes */ + #define ETH_DMAOMR_TTC_128Bytes ((unsigned int)0x00004000) /* threshold level of the MTL Transmit FIFO is 128 Bytes */ + #define ETH_DMAOMR_TTC_192Bytes ((unsigned int)0x00008000) /* threshold level of the MTL Transmit FIFO is 192 Bytes */ + #define ETH_DMAOMR_TTC_256Bytes ((unsigned int)0x0000C000) /* threshold level of the MTL Transmit FIFO is 256 Bytes */ + #define ETH_DMAOMR_TTC_40Bytes ((unsigned int)0x00010000) /* threshold level of the MTL Transmit FIFO is 40 Bytes */ + #define ETH_DMAOMR_TTC_32Bytes ((unsigned int)0x00014000) /* threshold level of the MTL Transmit FIFO is 32 Bytes */ + #define ETH_DMAOMR_TTC_24Bytes ((unsigned int)0x00018000) /* threshold level of the MTL Transmit FIFO is 24 Bytes */ + #define ETH_DMAOMR_TTC_16Bytes ((unsigned int)0x0001C000) /* threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define ETH_DMAOMR_ST ((unsigned int)0x00002000) /* Start/stop transmission command */ +#define ETH_DMAOMR_FEF ((unsigned int)0x00000080) /* Forward error frames */ +#define ETH_DMAOMR_FUGF ((unsigned int)0x00000040) /* Forward undersized good frames */ +#define ETH_DMAOMR_RTC ((unsigned int)0x00000018) /* receive threshold control */ + #define ETH_DMAOMR_RTC_64Bytes ((unsigned int)0x00000000) /* threshold level of the MTL Receive FIFO is 64 Bytes */ + #define ETH_DMAOMR_RTC_32Bytes ((unsigned int)0x00000008) /* threshold level of the MTL Receive FIFO is 32 Bytes */ + #define ETH_DMAOMR_RTC_96Bytes ((unsigned int)0x00000010) /* threshold level of the MTL Receive FIFO is 96 Bytes */ + #define ETH_DMAOMR_RTC_128Bytes ((unsigned int)0x00000018) /* threshold level of the MTL Receive FIFO is 128 Bytes */ +#define ETH_DMAOMR_OSF ((unsigned int)0x00000004) /* operate on second frame */ +#define ETH_DMAOMR_SR ((unsigned int)0x00000002) /* Start/stop receive */ + +#define ETH_DMAIER_NISE ((unsigned int)0x00010000) /* Normal interrupt summary enable */ +#define ETH_DMAIER_AISE ((unsigned int)0x00008000) /* Abnormal interrupt summary enable */ +#define ETH_DMAIER_ERIE ((unsigned int)0x00004000) /* Early receive interrupt enable */ +#define ETH_DMAIER_FBEIE ((unsigned int)0x00002000) /* Fatal bus error interrupt enable */ +#define ETH_DMAIER_ETIE ((unsigned int)0x00000400) /* Early transmit interrupt enable */ +#define ETH_DMAIER_RWTIE ((unsigned int)0x00000200) /* Receive watchdog timeout interrupt enable */ +#define ETH_DMAIER_RPSIE ((unsigned int)0x00000100) /* Receive process stopped interrupt enable */ +#define ETH_DMAIER_RBUIE ((unsigned int)0x00000080) /* Receive buffer unavailable interrupt enable */ +#define ETH_DMAIER_RIE ((unsigned int)0x00000040) /* Receive interrupt enable */ +#define ETH_DMAIER_TUIE ((unsigned int)0x00000020) /* Transmit Underflow interrupt enable */ +#define ETH_DMAIER_ROIE ((unsigned int)0x00000010) /* Receive Overflow interrupt enable */ +#define ETH_DMAIER_TJTIE ((unsigned int)0x00000008) /* Transmit jabber timeout interrupt enable */ +#define ETH_DMAIER_TBUIE ((unsigned int)0x00000004) /* Transmit buffer unavailable interrupt enable */ +#define ETH_DMAIER_TPSIE ((unsigned int)0x00000002) /* Transmit process stopped interrupt enable */ +#define ETH_DMAIER_TIE ((unsigned int)0x00000001) /* Transmit interrupt enable */ + +#define ETH_DMAMFBOCR_OFOC ((unsigned int)0x10000000) /* Overflow bit for FIFO overflow counter */ +#define ETH_DMAMFBOCR_MFA ((unsigned int)0x0FFE0000) /* Number of frames missed by the application */ +#define ETH_DMAMFBOCR_OMFC ((unsigned int)0x00010000) /* Overflow bit for missed frame counter */ +#define ETH_DMAMFBOCR_MFC ((unsigned int)0x0000FFFF) /* Number of frames missed by the controller */ + +#define ETH_DMACHTDR_HTDAP ((unsigned int)0xFFFFFFFF) /* Host transmit descriptor address pointer */ +#define ETH_DMACHRDR_HRDAP ((unsigned int)0xFFFFFFFF) /* Host receive descriptor address pointer */ +#define ETH_DMACHTBAR_HTBAP ((unsigned int)0xFFFFFFFF) /* Host transmit buffer address pointer */ +#define ETH_DMACHRBAR_HRBAP ((unsigned int)0xFFFFFFFF) /* Host receive buffer address pointer */ + + +#define ETH_MAC_ADDR_HBASE (ETH_MAC_BASE + 0x40) /* ETHERNET MAC address high offset */ +#define ETH_MAC_ADDR_LBASE (ETH_MAC_BASE + 0x44) /* ETHERNET MAC address low offset */ + +/* ETHERNET MACMIIAR register Mask */ +#define MACMIIAR_CR_MASK ((uint32_t)0xFFFFFFE3) + +/* ETHERNET MACCR register Mask */ +#define MACCR_CLEAR_MASK ((uint32_t)0xFF20810F) + +/* ETHERNET MACFCR register Mask */ +#define MACFCR_CLEAR_MASK ((uint32_t)0x0000FF41) + +/* ETHERNET DMAOMR register Mask */ +#define DMAOMR_CLEAR_MASK ((uint32_t)0xF8DE3F23) + +/* ETHERNET Remote Wake-up frame register length */ +#define ETH_WAKEUP_REGISTER_LENGTH 8 + +/* ETHERNET Missed frames counter Shift */ +#define ETH_DMA_RX_OVERFLOW_MISSEDFRAMES_COUNTERSHIFT 17 + +/* ETHERNET DMA Tx descriptors Collision Count Shift */ +#define ETH_DMATXDESC_COLLISION_COUNTSHIFT 3 + +/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */ +#define ETH_DMATXDESC_BUFFER2_SIZESHIFT 16 + +/* ETHERNET DMA Rx descriptors Frame Length Shift */ +#define ETH_DMARXDESC_FRAME_LENGTHSHIFT 16 + +/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */ +#define ETH_DMARXDESC_BUFFER2_SIZESHIFT 16 + +/* ETHERNET errors */ +#define ETH_ERROR ((uint32_t)0) +#define ETH_SUCCESS ((uint32_t)1) + + +void ETH_DeInit(void); +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct); +void ETH_SoftwareReset(void); +FlagStatus ETH_GetSoftwareResetStatus(void); +FlagStatus ETH_GetlinkStaus (void); +void ETH_Start(void); +uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength); +void delay_clk (uint32_t nCount); +void printf_dmasr (void); +void print_dmasr_tbus(void); +void print_dmasr_rps(void); +void print_dmasr_tps(void); +uint32_t ETH_HandleRxPkt(uint8_t *ppkt); +uint32_t ETH_GetRxPktSize(void); +void ETH_DropRxPkt(void); +uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg); +uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue); +uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState); + +void ETH_MACTransmissionCmd(FunctionalState NewState); +void ETH_MACReceptionCmd(FunctionalState NewState); +FlagStatus ETH_GetFlowControlBusyStatus(void); +void ETH_InitiatePauseControlFrame(void); +void ETH_BackPressureActivationCmd(FunctionalState NewState); +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG); +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT); +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState); +void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr); +void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr); +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState); +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter); +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte); + +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount); +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount); +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag); +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment); +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum); +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2); +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount); +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount); +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag); +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc); +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc); +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer); + +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG); +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG); +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT); +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT); +uint32_t ETH_GetTransmitProcessState(void); +uint32_t ETH_GetReceiveProcessState(void); +void ETH_FlushTransmitFIFO(void); +FlagStatus ETH_GetFlushTransmitFIFOStatus(void); +void ETH_DMATransmissionCmd(FunctionalState NewState); +void ETH_DMAReceptionCmd(FunctionalState NewState); +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState); +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow); +uint32_t ETH_GetRxOverflowMissedFrameCounter(void); +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void); +uint32_t ETH_GetCurrentTxDescStartAddress(void); +uint32_t ETH_GetCurrentRxDescStartAddress(void); +uint32_t ETH_GetCurrentTxBufferAddress(void); +uint32_t ETH_GetCurrentRxBufferAddress(void); +void ETH_ResumeDMATransmission(void); +void ETH_ResumeDMAReception(void); + +void ETH_ResetWakeUpFrameFilterRegisterPointer(void); +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer); +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState); +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG); +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState); +void ETH_MagicPacketDetectionCmd(FunctionalState NewState); +void ETH_PowerDownCmd(FunctionalState NewState); + +void ETH_MMCCounterFreezeCmd(FunctionalState NewState); +void ETH_MMCResetOnReadCmd(FunctionalState NewState); +void ETH_MMCCounterRolloverCmd(FunctionalState NewState); +void ETH_MMCCountersReset(void); +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState); +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT); +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg); + +uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab); +uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab); +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount); +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount); +void ETH_EnablePTPTimeStampAddend(void); +void ETH_EnablePTPTimeStampInterruptTrigger(void); +void ETH_EnablePTPTimeStampUpdate(void); +void ETH_InitializePTPTimeStamp(void); +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod); +void ETH_PTPTimeStampCmd(FunctionalState NewState); +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG); +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue); +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue); +void ETH_SetPTPTimeStampAddend(uint32_t Value); +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue); +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg); +void RGMII_TXC_Delay(uint8_t clock_polarity,uint8_t delay_time); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_exti.h b/Peripheral/inc/ch32v30x_exti.h new file mode 100644 index 0000000..1e65983 --- /dev/null +++ b/Peripheral/inc/ch32v30x_exti.h @@ -0,0 +1,92 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_exti.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* EXTI firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_EXTI_H +#define __CH32V30x_EXTI_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* EXTI mode enumeration */ +typedef enum +{ + EXTI_Mode_Interrupt = 0x00, + EXTI_Mode_Event = 0x04 +}EXTIMode_TypeDef; + +/* EXTI Trigger enumeration */ +typedef enum +{ + EXTI_Trigger_Rising = 0x08, + EXTI_Trigger_Falling = 0x0C, + EXTI_Trigger_Rising_Falling = 0x10 +}EXTITrigger_TypeDef; + +/* EXTI Init Structure definition */ +typedef struct +{ + uint32_t EXTI_Line; /* Specifies the EXTI lines to be enabled or disabled. + This parameter can be any combination of @ref EXTI_Lines */ + + EXTIMode_TypeDef EXTI_Mode; /* Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + EXTITrigger_TypeDef EXTI_Trigger; /* Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTIMode_TypeDef */ + + FunctionalState EXTI_LineCmd; /* Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ +}EXTI_InitTypeDef; + + +/* EXTI_Lines */ +#define EXTI_Line0 ((uint32_t)0x00001) /* External interrupt line 0 */ +#define EXTI_Line1 ((uint32_t)0x00002) /* External interrupt line 1 */ +#define EXTI_Line2 ((uint32_t)0x00004) /* External interrupt line 2 */ +#define EXTI_Line3 ((uint32_t)0x00008) /* External interrupt line 3 */ +#define EXTI_Line4 ((uint32_t)0x00010) /* External interrupt line 4 */ +#define EXTI_Line5 ((uint32_t)0x00020) /* External interrupt line 5 */ +#define EXTI_Line6 ((uint32_t)0x00040) /* External interrupt line 6 */ +#define EXTI_Line7 ((uint32_t)0x00080) /* External interrupt line 7 */ +#define EXTI_Line8 ((uint32_t)0x00100) /* External interrupt line 8 */ +#define EXTI_Line9 ((uint32_t)0x00200) /* External interrupt line 9 */ +#define EXTI_Line10 ((uint32_t)0x00400) /* External interrupt line 10 */ +#define EXTI_Line11 ((uint32_t)0x00800) /* External interrupt line 11 */ +#define EXTI_Line12 ((uint32_t)0x01000) /* External interrupt line 12 */ +#define EXTI_Line13 ((uint32_t)0x02000) /* External interrupt line 13 */ +#define EXTI_Line14 ((uint32_t)0x04000) /* External interrupt line 14 */ +#define EXTI_Line15 ((uint32_t)0x08000) /* External interrupt line 15 */ +#define EXTI_Line16 ((uint32_t)0x10000) /* External interrupt line 16 Connected to the PVD Output */ +#define EXTI_Line17 ((uint32_t)0x20000) /* External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_Line18 ((uint32_t)0x40000) /* External interrupt line 18 Connected to the USBD/USBFS OTG + Wakeup from suspend event */ +#define EXTI_Line19 ((uint32_t)0x80000) /* External interrupt line 19 Connected to the Ethernet Wakeup event */ +#define EXTI_Line20 ((uint32_t)0x100000) /* External interrupt line 20 Connected to the USBHS Wakeup event */ + +void EXTI_DeInit(void); +void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct); +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line); +void EXTI_ClearFlag(uint32_t EXTI_Line); +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); +void EXTI_ClearITPendingBit(uint32_t EXTI_Line); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_flash.h b/Peripheral/inc/ch32v30x_flash.h new file mode 100644 index 0000000..bac3871 --- /dev/null +++ b/Peripheral/inc/ch32v30x_flash.h @@ -0,0 +1,148 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_flash.h +* Author : WCH +* Version : V1.0.0 +* Date : 2024/05/24 +* Description : This file contains all the functions prototypes for the FLASH +* firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_FLASH_H +#define __CH32V30x_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* FLASH Status */ +typedef enum +{ + FLASH_BUSY = 1, + FLASH_ERROR_PG, + FLASH_ERROR_WRP, + FLASH_COMPLETE, + FLASH_TIMEOUT, + FLASH_OP_RANGE_ERROR = 0xFD, + FLASH_ALIGN_ERROR = 0xFE, + FLASH_ADR_RANGE_ERROR = 0xFF, +}FLASH_Status; + + +/* Write Protect */ +#define FLASH_WRProt_Sectors0 ((uint32_t)0x00000001) /* Write protection of setor 0 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors1 ((uint32_t)0x00000002) /* Write protection of setor 1 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors2 ((uint32_t)0x00000004) /* Write protection of setor 2 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors3 ((uint32_t)0x00000008) /* Write protection of setor 3 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors4 ((uint32_t)0x00000010) /* Write protection of setor 4 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors5 ((uint32_t)0x00000020) /* Write protection of setor 5 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors6 ((uint32_t)0x00000040) /* Write protection of setor 6 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors7 ((uint32_t)0x00000080) /* Write protection of setor 7 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors8 ((uint32_t)0x00000100) /* Write protection of setor 8 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors9 ((uint32_t)0x00000200) /* Write protection of setor 9 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors10 ((uint32_t)0x00000400) /* Write protection of setor 10 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors11 ((uint32_t)0x00000800) /* Write protection of setor 11 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors12 ((uint32_t)0x00001000) /* Write protection of setor 12 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors13 ((uint32_t)0x00002000) /* Write protection of setor 13 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors14 ((uint32_t)0x00004000) /* Write protection of setor 14 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors15 ((uint32_t)0x00008000) /* Write protection of setor 15 ,4K bytes/sector */ +#define FLASH_WRProt_Sectorint16_t ((uint32_t)0x00010000) /* Write protection of setor 16 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors17 ((uint32_t)0x00020000) /* Write protection of setor 17 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors18 ((uint32_t)0x00040000) /* Write protection of setor 18 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors19 ((uint32_t)0x00080000) /* Write protection of setor 19 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors20 ((uint32_t)0x00100000) /* Write protection of setor 20 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors21 ((uint32_t)0x00200000) /* Write protection of setor 21 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors22 ((uint32_t)0x00400000) /* Write protection of setor 22 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors23 ((uint32_t)0x00800000) /* Write protection of setor 23 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors24 ((uint32_t)0x01000000) /* Write protection of setor 24 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors25 ((uint32_t)0x02000000) /* Write protection of setor 25 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors26 ((uint32_t)0x04000000) /* Write protection of setor 26 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors27 ((uint32_t)0x08000000) /* Write protection of setor 27 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors28 ((uint32_t)0x10000000) /* Write protection of setor 28 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors29 ((uint32_t)0x20000000) /* Write protection of setor 29 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors30 ((uint32_t)0x40000000) /* Write protection of setor 30 ,4K bytes/sector */ +#define FLASH_WRProt_Sectors31to127 ((uint32_t)0x80000000) /* Write protection of page 31 to 127 */ + +#define FLASH_WRProt_AllSectors ((uint32_t)0xFFFFFFFF) /* Write protection of all Sectors */ + +/* Option_Bytes_IWatchdog */ +#define OB_IWDG_SW ((uint16_t)0x0001) /* Software IWDG selected */ +#define OB_IWDG_HW ((uint16_t)0x0000) /* Hardware IWDG selected */ + +/* Option_Bytes_nRST_STOP */ +#define OB_STOP_NoRST ((uint16_t)0x0002) /* No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint16_t)0x0000) /* Reset generated when entering in STOP */ + +/* Option_Bytes_nRST_STDBY */ +#define OB_STDBY_NoRST ((uint16_t)0x0004) /* No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint16_t)0x0000) /* Reset generated when entering in STANDBY */ + +/* FLASH_Interrupts */ +#define FLASH_IT_ERROR ((uint32_t)0x00000400) /* FPEC error interrupt source */ +#define FLASH_IT_EOP ((uint32_t)0x00001000) /* End of FLASH Operation Interrupt source */ +#define FLASH_IT_BANK1_ERROR FLASH_IT_ERROR /* FPEC BANK1 error interrupt source */ +#define FLASH_IT_BANK1_EOP FLASH_IT_EOP /* End of FLASH BANK1 Operation Interrupt source */ + +/* FLASH_Flags */ +#define FLASH_FLAG_BSY ((uint32_t)0x00000001) /* FLASH Busy flag */ +#define FLASH_FLAG_EOP ((uint32_t)0x00000020) /* FLASH End of Operation flag */ +#define FLASH_FLAG_WRPRTERR ((uint32_t)0x00000010) /* FLASH Write protected error flag */ +#define FLASH_FLAG_OPTERR ((uint32_t)0x80000001) /* FLASH Option Byte error flag */ + +#define FLASH_FLAG_BANK1_BSY FLASH_FLAG_BSY /* FLASH BANK1 Busy flag*/ +#define FLASH_FLAG_BANK1_EOP FLASH_FLAG_EOP /* FLASH BANK1 End of Operation flag */ +#define FLASH_FLAG_BANK1_WRPRTERR FLASH_FLAG_WRPRTERR /* FLASH BANK1 Write protected error flag */ + +/* FLASH_Access_CLK */ +#define FLASH_Access_SYSTEM_HALF ((uint32_t)0x00000000) /* FLASH Access Clock = SYSTEM/2 */ +#define FLASH_Access_SYSTEM ((uint32_t)0x02000000) /* FLASH Access Clock = SYSTEM */ + + +/*Functions used for all devices*/ +void FLASH_Unlock(void); +void FLASH_Lock(void); +FLASH_Status FLASH_ErasePage(uint32_t Page_Address); +FLASH_Status FLASH_EraseAllPages(void); +FLASH_Status FLASH_EraseOptionBytes(void); +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Sectors); +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState); +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY); +uint32_t FLASH_GetUserOptionByte(void); +uint32_t FLASH_GetWriteProtectionOptionByte(void); +FlagStatus FLASH_GetReadOutProtectionStatus(void); +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState); +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG); +void FLASH_ClearFlag(uint32_t FLASH_FLAG); +FLASH_Status FLASH_GetStatus(void); +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout); +void FLASH_Unlock_Fast(void); +void FLASH_Lock_Fast(void); +void FLASH_ErasePage_Fast(uint32_t Page_Address); +void FLASH_EraseBlock_32K_Fast(uint32_t Block_Address); +void FLASH_ProgramPage_Fast(uint32_t Page_Address, uint32_t* pbuf); +void FLASH_Access_Clock_Cfg(uint32_t FLASH_Access_CLK); +void FLASH_Enhance_Mode(FunctionalState NewState); + +/* New function used for all devices */ +void FLASH_UnlockBank1(void); +void FLASH_LockBank1(void); +FLASH_Status FLASH_EraseAllBank1Pages(void); +FLASH_Status FLASH_GetBank1Status(void); +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout); +FLASH_Status FLASH_ROM_ERASE(uint32_t StartAddr, uint32_t Length); +FLASH_Status FLASH_ROM_WRITE(uint32_t StartAddr, uint32_t *pbuf, uint32_t Length); + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/Peripheral/inc/ch32v30x_fsmc.h b/Peripheral/inc/ch32v30x_fsmc.h new file mode 100644 index 0000000..be50861 --- /dev/null +++ b/Peripheral/inc/ch32v30x_fsmc.h @@ -0,0 +1,268 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_fsmc.h +* Author : WCH +* Version : V1.0.1 +* Date : 2025/03/06 +* Description : This file contains all the functions prototypes for the FSMC +* firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_FSMC_H +#define __CH32V30x_FSMC_H + +#ifdef __cplusplus + extern "C" { +#endif + + +#include "ch32v30x.h" + + +/* FSMC Init structure definition */ +typedef struct +{ + uint32_t FSMC_AddressSetupTime; /* Defines the number of HCLK cycles to configure + the duration of the address setup time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories. */ + + uint32_t FSMC_AddressHoldTime; /* Defines the number of HCLK cycles to configure + the duration of the address hold time. + This parameter can be a value between 0 and 0xF. + @note: It is not used with synchronous NOR Flash memories.*/ + + uint32_t FSMC_DataSetupTime; /* Defines the number of HCLK cycles to configure + the duration of the data setup time. + This parameter can be a value between 0 and 0xFF. + @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */ + + uint32_t FSMC_BusTurnAroundDuration; /* Defines the number of HCLK cycles to configure + the duration of the bus turnaround. + This parameter can be a value between 0 and 0xF. + @note: It is only used for multiplexed NOR Flash memories. */ + + uint32_t FSMC_CLKDivision; /* Defines the period of CLK clock output signal, expressed in number of HCLK cycles. + This parameter can be a value between 1 and 0xF. + @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */ + + uint32_t FSMC_DataLatency; /* Defines the number of memory clock cycles to issue + to the memory before getting the first data. + The value of this parameter depends on the memory type as shown below: + - It must be set to 0 in case of a CRAM + - It is don't care in asynchronous NOR, SRAM or ROM accesses + - It may assume a value between 0 and 0xF in NOR Flash memories + with synchronous burst mode enable */ + + uint32_t FSMC_AccessMode; /* Specifies the asynchronous access mode. + This parameter can be a value of @ref FSMC_Access_Mode */ +}FSMC_NORSRAMTimingInitTypeDef; + + +typedef struct +{ + uint32_t FSMC_Bank; /* Specifies the NOR/SRAM memory bank that will be used. + This parameter can be a value of @ref FSMC_NORSRAM_Bank */ + + uint32_t FSMC_DataAddressMux; /* Specifies whether the address and data values are + multiplexed on the databus or not. + This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */ + + uint32_t FSMC_MemoryType; /* Specifies the type of external memory attached to + the corresponding memory bank. + This parameter can be a value of @ref FSMC_Memory_Type */ + + uint32_t FSMC_MemoryDataWidth; /* Specifies the external memory device width. + This parameter can be a value of @ref FSMC_Data_Width */ + + uint32_t FSMC_BurstAccessMode; /* Enables or disables the burst access mode for Flash memory, + valid only with synchronous burst Flash memories. + This parameter can be a value of @ref FSMC_Burst_Access_Mode */ + + uint32_t FSMC_AsynchronousWait; /* Enables or disables wait signal during asynchronous transfers, + valid only with asynchronous Flash memories. + This parameter can be a value of @ref FSMC_AsynchronousWait */ + + uint32_t FSMC_WaitSignalPolarity; /* Specifies the wait signal polarity, valid only when accessing + the Flash memory in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */ + + uint32_t FSMC_WaitSignalActive; /* Specifies if the wait signal is asserted by the memory one + clock cycle before the wait state or during the wait state, + valid only when accessing memories in burst mode. + This parameter can be a value of @ref FSMC_Wait_Timing */ + + uint32_t FSMC_WriteOperation; /* Enables or disables the write operation in the selected bank by the FSMC. + This parameter can be a value of @ref FSMC_Write_Operation */ + + uint32_t FSMC_WaitSignal; /* Enables or disables the wait-state insertion via wait + signal, valid for Flash memory access in burst mode. + This parameter can be a value of @ref FSMC_Wait_Signal */ + + uint32_t FSMC_ExtendedMode; /* Enables or disables the extended mode. + This parameter can be a value of @ref FSMC_Extended_Mode */ + + uint32_t FSMC_WriteBurst; /* Enables or disables the write burst operation. + This parameter can be a value of @ref FSMC_Write_Burst */ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /* Timing Parameters for write and read access if the ExtendedMode is not used*/ + + FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /* Timing Parameters for write access if the ExtendedMode is used*/ +}FSMC_NORSRAMInitTypeDef; + + +typedef struct +{ + uint32_t FSMC_SetupTime; /* Defines the number of HCLK cycles to setup address before + the command assertion for NAND-Flash read or write access + to common/Attribute or I/O memory space (depending on + the memory space timing to be configured). + This parameter can be a value between 0 and 0xFF.*/ + + uint32_t FSMC_WaitSetupTime; /* Defines the minimum number of HCLK cycles to assert the + command for NAND-Flash read or write access to + common/Attribute or I/O memory space (depending on the + memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HoldSetupTime; /* Defines the number of HCLK clock cycles to hold address + (and data for write access) after the command deassertion + for NAND-Flash read or write access to common/Attribute + or I/O memory space (depending on the memory space timing + to be configured). + This parameter can be a number between 0x00 and 0xFF */ + + uint32_t FSMC_HiZSetupTime; /* Defines the number of HCLK clock cycles during which the + databus is kept in HiZ after the start of a NAND-Flash + write access to common/Attribute or I/O memory space (depending + on the memory space timing to be configured). + This parameter can be a number between 0x00 and 0xFF */ +}FSMC_NAND_PCCARDTimingInitTypeDef; + + +typedef struct +{ + uint32_t FSMC_Bank; /* Specifies the NAND memory bank that will be used. + This parameter can be a value of @ref FSMC_NAND_Bank */ + + uint32_t FSMC_Waitfeature; /* Enables or disables the Wait feature for the NAND Memory Bank. + This parameter can be any value of @ref FSMC_Wait_feature */ + + uint32_t FSMC_MemoryDataWidth; /* Specifies the external memory device width. + This parameter can be any value of @ref FSMC_Data_Width */ + + uint32_t FSMC_ECC; /* Enables or disables the ECC computation. + This parameter can be any value of @ref FSMC_ECC */ + + uint32_t FSMC_ECCPageSize; /* Defines the page size for the extended ECC. + This parameter can be any value of @ref FSMC_ECC_Page_Size */ + + uint32_t FSMC_TCLRSetupTime; /* Defines the number of HCLK cycles to configure the + delay between CLE low and RE low. + This parameter can be a value between 0 and 0xFF. */ + + uint32_t FSMC_TARSetupTime; /* Defines the number of HCLK cycles to configure the + delay between ALE low and RE low. + This parameter can be a number between 0x0 and 0xFF */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /* FSMC Common Space Timing */ + + FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /* FSMC Attribute Space Timing */ +}FSMC_NANDInitTypeDef; + + +/* FSMC_NORSRAM_Bank */ +#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000) + +/* FSMC_NAND_Bank */ +#define FSMC_Bank2_NAND ((uint32_t)0x00000010) + +/* FSMC_Data_Address_Bus_Multiplexing */ +#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000) +#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002) + +/* FSMC_Memory_Type */ +#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000) +#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004) +#define FSMC_MemoryType_NOR ((uint32_t)0x00000008) + +/* FSMC_Data_Width */ +#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000) +#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010) + +/* FSMC_Burst_Access_Mode */ +#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000) +#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100) + +/* FSMC_AsynchronousWait */ +#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000) +#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000) + +/* FSMC_Wait_Signal_Polarity */ +#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000) +#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200) + +/* FSMC_Wait_Timing */ +#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000) +#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800) + +/* FSMC_Write_Operation */ +#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000) +#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000) + +/* FSMC_Wait_Signal */ +#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000) +#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000) + +/* FSMC_Extended_Mode */ +#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000) +#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000) + +/* FSMC_Write_Burst */ +#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000) +#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000) + +/* FSMC_Access_Mode */ +#define FSMC_AccessMode_A ((uint32_t)0x00000000) +#define FSMC_AccessMode_B ((uint32_t)0x10000000) +#define FSMC_AccessMode_C ((uint32_t)0x20000000) +#define FSMC_AccessMode_D ((uint32_t)0x30000000) + +/* FSMC_Wait_feature */ +#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000) +#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002) + +/* FSMC_ECC */ +#define FSMC_ECC_Disable ((uint32_t)0x00000000) +#define FSMC_ECC_Enable ((uint32_t)0x00000040) + +/* FSMC_ECC_Page_Size */ +#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000) +#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000) +#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000) +#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000) +#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000) +#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000) + +#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040) + + +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank); +void FSMC_NANDDeInit(uint32_t FSMC_Bank); +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct); +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState); +uint32_t FSMC_GetECC(uint32_t FSMC_Bank); +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Peripheral/inc/ch32v30x_gpio.h b/Peripheral/inc/ch32v30x_gpio.h new file mode 100644 index 0000000..f261140 --- /dev/null +++ b/Peripheral/inc/ch32v30x_gpio.h @@ -0,0 +1,196 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_gpio.h +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/09 +* Description : This file contains all the functions prototypes for the +* GPIO firmware library. +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_GPIO_H +#define __CH32V30x_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* Output Maximum frequency selection */ +typedef enum +{ + GPIO_Speed_10MHz = 1, + GPIO_Speed_2MHz, + GPIO_Speed_50MHz +}GPIOSpeed_TypeDef; + +/* Configuration Mode enumeration */ +typedef enum +{ GPIO_Mode_AIN = 0x0, + GPIO_Mode_IN_FLOATING = 0x04, + GPIO_Mode_IPD = 0x28, + GPIO_Mode_IPU = 0x48, + GPIO_Mode_Out_OD = 0x14, + GPIO_Mode_Out_PP = 0x10, + GPIO_Mode_AF_OD = 0x1C, + GPIO_Mode_AF_PP = 0x18 +}GPIOMode_TypeDef; + +/* GPIO Init structure definition */ +typedef struct +{ + uint16_t GPIO_Pin; /* Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + GPIOSpeed_TypeDef GPIO_Speed; /* Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIOSpeed_TypeDef */ + + GPIOMode_TypeDef GPIO_Mode; /* Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIOMode_TypeDef */ +}GPIO_InitTypeDef; + +/* Bit_SET and Bit_RESET enumeration */ +typedef enum +{ + Bit_RESET = 0, + Bit_SET +}BitAction; + +/* GPIO_pins_define */ +#define GPIO_Pin_0 ((uint16_t)0x0001) /* Pin 0 selected */ +#define GPIO_Pin_1 ((uint16_t)0x0002) /* Pin 1 selected */ +#define GPIO_Pin_2 ((uint16_t)0x0004) /* Pin 2 selected */ +#define GPIO_Pin_3 ((uint16_t)0x0008) /* Pin 3 selected */ +#define GPIO_Pin_4 ((uint16_t)0x0010) /* Pin 4 selected */ +#define GPIO_Pin_5 ((uint16_t)0x0020) /* Pin 5 selected */ +#define GPIO_Pin_6 ((uint16_t)0x0040) /* Pin 6 selected */ +#define GPIO_Pin_7 ((uint16_t)0x0080) /* Pin 7 selected */ +#define GPIO_Pin_8 ((uint16_t)0x0100) /* Pin 8 selected */ +#define GPIO_Pin_9 ((uint16_t)0x0200) /* Pin 9 selected */ +#define GPIO_Pin_10 ((uint16_t)0x0400) /* Pin 10 selected */ +#define GPIO_Pin_11 ((uint16_t)0x0800) /* Pin 11 selected */ +#define GPIO_Pin_12 ((uint16_t)0x1000) /* Pin 12 selected */ +#define GPIO_Pin_13 ((uint16_t)0x2000) /* Pin 13 selected */ +#define GPIO_Pin_14 ((uint16_t)0x4000) /* Pin 14 selected */ +#define GPIO_Pin_15 ((uint16_t)0x8000) /* Pin 15 selected */ +#define GPIO_Pin_All ((uint16_t)0xFFFF) /* All pins selected */ + +/* GPIO_Remap_define */ +/* PCFR1 */ +#define GPIO_Remap_SPI1 ((uint32_t)0x00000001) /* SPI1 Alternate Function mapping */ +#define GPIO_Remap_I2C1 ((uint32_t)0x00000002) /* I2C1 Alternate Function mapping */ +#define GPIO_Remap_USART1 ((uint32_t)0x00000004) /* USART1 Alternate Function mapping low bit */ +#define GPIO_Remap_USART2 ((uint32_t)0x00000008) /* USART2 Alternate Function mapping */ +#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) /* USART3 Partial Alternate Function mapping */ +#define GPIO_PartialRemap1_USART3 ((uint32_t)0x00140020) /* USART3 Partial1 Alternate Function mapping */ +#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) /* USART3 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM1 ((uint32_t)0x00160040) /* TIM1 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM1 ((uint32_t)0x001600C0) /* TIM1 Full Alternate Function mapping */ +#define GPIO_PartialRemap1_TIM2 ((uint32_t)0x00180100) /* TIM2 Partial1 Alternate Function mapping */ +#define GPIO_PartialRemap2_TIM2 ((uint32_t)0x00180200) /* TIM2 Partial2 Alternate Function mapping */ +#define GPIO_FullRemap_TIM2 ((uint32_t)0x00180300) /* TIM2 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM3 ((uint32_t)0x001A0800) /* TIM3 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM3 ((uint32_t)0x001A0C00) /* TIM3 Full Alternate Function mapping */ +#define GPIO_Remap_TIM4 ((uint32_t)0x00001000) /* TIM4 Alternate Function mapping */ +#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) /* CAN1 Alternate Function mapping */ +#define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000) /* CAN1 Alternate Function mapping */ +#define GPIO_Remap_PD0PD1 ((uint32_t)0x00008000) /* PD0 and PD1 Alternate Function mapping */ +#define GPIO_Remap_TIM5CH4_LSI ((uint32_t)0x00200001) /* LSI connected to TIM5 Channel4 input capture for calibration */ +#define GPIO_Remap_ADC1_ETRGINJ ((uint32_t)0x00200002) /* ADC1 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC1_ETRGREG ((uint32_t)0x00200004) /* ADC1 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGINJ ((uint32_t)0x00200008) /* ADC2 External Trigger Injected Conversion remapping */ +#define GPIO_Remap_ADC2_ETRGREG ((uint32_t)0x00200010) /* ADC2 External Trigger Regular Conversion remapping */ +#define GPIO_Remap_ETH ((uint32_t)0x00200020) /* Ethernet remapping (only for Connectivity line devices) */ +#define GPIO_Remap_CAN2 ((uint32_t)0x00200040) /* CAN2 remapping (only for Connectivity line devices) */ +#define GPIO_Remap_MII_RMII_SEL ((uint32_t)0x00200080) /* MII or RMII selection */ +#define GPIO_Remap_SWJ_Disable ((uint32_t)0x00300400) /* Full SWJ Disabled */ +#define GPIO_Remap_SPI3 ((uint32_t)0x00201000) /* SPI3/I2S3 Alternate Function mapping (only for Connectivity line devices) */ +#define GPIO_Remap_TIM2ITR1_PTP_SOF ((uint32_t)0x00202000) /* Ethernet PTP output or USB OTG SOF (Start of Frame) connected + to TIM2 Internal Trigger 1 for calibration + (only for Connectivity line devices) */ +#define GPIO_Remap_PTP_PPS ((uint32_t)0x00204000) /* Ethernet MAC PPS_PTS output on PB05 (only for Connectivity line devices) */ +#define GPIO_Remap_PD01 GPIO_Remap_PD0PD1 + +/* PCFR2 */ +#define GPIO_Remap_TIM8 ((uint32_t)0x80000004) /* TIM8 Alternate Function mapping */ +#define GPIO_PartialRemap_TIM9 ((uint32_t)0x80130008) /* TIM9 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM9 ((uint32_t)0x80130010) /* TIM9 Full Alternate Function mapping */ +#define GPIO_PartialRemap_TIM10 ((uint32_t)0x80150020) /* TIM10 Partial Alternate Function mapping */ +#define GPIO_FullRemap_TIM10 ((uint32_t)0x80150040) /* TIM10 Full Alternate Function mapping */ +#define GPIO_Remap_FSMC_NADV ((uint32_t)0x80000400) /* FSMC_NADV Alternate Function mapping */ +#define GPIO_PartialRemap_USART4 ((uint32_t)0x80300001) /* USART4 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART4 ((uint32_t)0x80300002) /* USART4 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART5 ((uint32_t)0x80320004) /* USART5 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART5 ((uint32_t)0x80320008) /* USART5 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART6 ((uint32_t)0x80340010) /* USART6 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART6 ((uint32_t)0x80340020) /* USART6 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART7 ((uint32_t)0x80360040) /* USART7 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART7 ((uint32_t)0x80360080) /* USART7 Full Alternate Function mapping */ +#define GPIO_PartialRemap_USART8 ((uint32_t)0x80380100) /* USART8 Partial Alternate Function mapping */ +#define GPIO_FullRemap_USART8 ((uint32_t)0x80380200) /* USART8 Full Alternate Function mapping */ +#define GPIO_Remap_USART1_HighBit ((uint32_t)0x80200400) /* USART1 Alternate Function mapping high bit */ + + +/* GPIO_Port_Sources */ +#define GPIO_PortSourceGPIOA ((uint8_t)0x00) +#define GPIO_PortSourceGPIOB ((uint8_t)0x01) +#define GPIO_PortSourceGPIOC ((uint8_t)0x02) +#define GPIO_PortSourceGPIOD ((uint8_t)0x03) +#define GPIO_PortSourceGPIOE ((uint8_t)0x04) + +/* GPIO_Pin_sources */ +#define GPIO_PinSource0 ((uint8_t)0x00) +#define GPIO_PinSource1 ((uint8_t)0x01) +#define GPIO_PinSource2 ((uint8_t)0x02) +#define GPIO_PinSource3 ((uint8_t)0x03) +#define GPIO_PinSource4 ((uint8_t)0x04) +#define GPIO_PinSource5 ((uint8_t)0x05) +#define GPIO_PinSource6 ((uint8_t)0x06) +#define GPIO_PinSource7 ((uint8_t)0x07) +#define GPIO_PinSource8 ((uint8_t)0x08) +#define GPIO_PinSource9 ((uint8_t)0x09) +#define GPIO_PinSource10 ((uint8_t)0x0A) +#define GPIO_PinSource11 ((uint8_t)0x0B) +#define GPIO_PinSource12 ((uint8_t)0x0C) +#define GPIO_PinSource13 ((uint8_t)0x0D) +#define GPIO_PinSource14 ((uint8_t)0x0E) +#define GPIO_PinSource15 ((uint8_t)0x0F) + +/* Ethernet_Media_Interface */ +#define GPIO_ETH_MediaInterface_MII ((u32)0x00000000) +#define GPIO_ETH_MediaInterface_RMII ((u32)0x00000001) + + +void GPIO_DeInit(GPIO_TypeDef* GPIOx); +void GPIO_AFIODeInit(void); +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); +void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); +void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal); +void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); +void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_EventOutputCmd(FunctionalState NewState); +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState); +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + diff --git a/Peripheral/inc/ch32v30x_i2c.h b/Peripheral/inc/ch32v30x_i2c.h new file mode 100644 index 0000000..7b4b1a2 --- /dev/null +++ b/Peripheral/inc/ch32v30x_i2c.h @@ -0,0 +1,439 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_i2c.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* I2C firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_I2C_H +#define __CH32V30x_I2C_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* I2C Init structure definition */ +typedef struct +{ + uint32_t I2C_ClockSpeed; /* Specifies the clock frequency. + This parameter must be set to a value lower than 400kHz */ + + uint16_t I2C_Mode; /* Specifies the I2C mode. + This parameter can be a value of @ref I2C_mode */ + + uint16_t I2C_DutyCycle; /* Specifies the I2C fast mode duty cycle. + This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ + + uint16_t I2C_OwnAddress1; /* Specifies the first device own address. + This parameter can be a 7-bit or 10-bit address. */ + + uint16_t I2C_Ack; /* Enables or disables the acknowledgement. + This parameter can be a value of @ref I2C_acknowledgement */ + + uint16_t I2C_AcknowledgedAddress; /* Specifies if 7-bit or 10-bit address is acknowledged. + This parameter can be a value of @ref I2C_acknowledged_address */ +}I2C_InitTypeDef; + +/* I2C_mode */ +#define I2C_Mode_I2C ((uint16_t)0x0000) +#define I2C_Mode_SMBusDevice ((uint16_t)0x0002) +#define I2C_Mode_SMBusHost ((uint16_t)0x000A) + +/* I2C_duty_cycle_in_fast_mode */ +#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /* I2C fast mode Tlow/Thigh = 16/9 */ +#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /* I2C fast mode Tlow/Thigh = 2 */ + +/* I2C_acknowledgement */ +#define I2C_Ack_Enable ((uint16_t)0x0400) +#define I2C_Ack_Disable ((uint16_t)0x0000) + +/* I2C_transfer_direction */ +#define I2C_Direction_Transmitter ((uint8_t)0x00) +#define I2C_Direction_Receiver ((uint8_t)0x01) + +/* I2C_acknowledged_address */ +#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000) +#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000) + +/* I2C_registers */ +#define I2C_Register_CTLR1 ((uint8_t)0x00) +#define I2C_Register_CTLR2 ((uint8_t)0x04) +#define I2C_Register_OADDR1 ((uint8_t)0x08) +#define I2C_Register_OADDR2 ((uint8_t)0x0C) +#define I2C_Register_DATAR ((uint8_t)0x10) +#define I2C_Register_STAR1 ((uint8_t)0x14) +#define I2C_Register_STAR2 ((uint8_t)0x18) +#define I2C_Register_CKCFGR ((uint8_t)0x1C) +#define I2C_Register_RTR ((uint8_t)0x20) + +/* I2C_SMBus_alert_pin_level */ +#define I2C_SMBusAlert_Low ((uint16_t)0x2000) +#define I2C_SMBusAlert_High ((uint16_t)0xDFFF) + +/* I2C_PEC_position */ +#define I2C_PECPosition_Next ((uint16_t)0x0800) +#define I2C_PECPosition_Current ((uint16_t)0xF7FF) + +/* I2C_NACK_position */ +#define I2C_NACKPosition_Next ((uint16_t)0x0800) +#define I2C_NACKPosition_Current ((uint16_t)0xF7FF) + +/* I2C_interrupts_definition */ +#define I2C_IT_BUF ((uint16_t)0x0400) +#define I2C_IT_EVT ((uint16_t)0x0200) +#define I2C_IT_ERR ((uint16_t)0x0100) + +/* I2C_interrupts_definition */ +#define I2C_IT_SMBALERT ((uint32_t)0x01008000) +#define I2C_IT_TIMEOUT ((uint32_t)0x01004000) +#define I2C_IT_PECERR ((uint32_t)0x01001000) +#define I2C_IT_OVR ((uint32_t)0x01000800) +#define I2C_IT_AF ((uint32_t)0x01000400) +#define I2C_IT_ARLO ((uint32_t)0x01000200) +#define I2C_IT_BERR ((uint32_t)0x01000100) +#define I2C_IT_TXE ((uint32_t)0x06000080) +#define I2C_IT_RXNE ((uint32_t)0x06000040) +#define I2C_IT_STOPF ((uint32_t)0x02000010) +#define I2C_IT_ADD10 ((uint32_t)0x02000008) +#define I2C_IT_BTF ((uint32_t)0x02000004) +#define I2C_IT_ADDR ((uint32_t)0x02000002) +#define I2C_IT_SB ((uint32_t)0x02000001) + +/* SR2 register flags */ +#define I2C_FLAG_DUALF ((uint32_t)0x00800000) +#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000) +#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000) +#define I2C_FLAG_GENCALL ((uint32_t)0x00100000) +#define I2C_FLAG_TRA ((uint32_t)0x00040000) +#define I2C_FLAG_BUSY ((uint32_t)0x00020000) +#define I2C_FLAG_MSL ((uint32_t)0x00010000) + +/* SR1 register flags */ +#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000) +#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000) +#define I2C_FLAG_PECERR ((uint32_t)0x10001000) +#define I2C_FLAG_OVR ((uint32_t)0x10000800) +#define I2C_FLAG_AF ((uint32_t)0x10000400) +#define I2C_FLAG_ARLO ((uint32_t)0x10000200) +#define I2C_FLAG_BERR ((uint32_t)0x10000100) +#define I2C_FLAG_TXE ((uint32_t)0x10000080) +#define I2C_FLAG_RXNE ((uint32_t)0x10000040) +#define I2C_FLAG_STOPF ((uint32_t)0x10000010) +#define I2C_FLAG_ADD10 ((uint32_t)0x10000008) +#define I2C_FLAG_BTF ((uint32_t)0x10000004) +#define I2C_FLAG_ADDR ((uint32_t)0x10000002) +#define I2C_FLAG_SB ((uint32_t)0x10000001) + + +/****************I2C Master Events (Events grouped in order of communication)********************/ + +/******************************************************************************************************************** + * @brief Start communicate + * + * After master use I2C_GenerateSTART() function sending the START condition,the master + * has to wait for event 5(the Start condition has been correctly + * released on the I2C bus ). + * + */ +/* EVT5 */ +#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */ + +/******************************************************************************************************************** + * @brief Address Acknowledge + * + * When start condition correctly released on the bus(check EVT5), the + * master use I2C_Send7bitAddress() function sends the address of the slave(s) with which it will communicate + * it also determines master as transmitter or Receiver. Then the master has to wait that a slave acknowledges + * his address. If an acknowledge is sent on the bus, one of the following events will be set: + * + * + * + * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED + * event is set. + * + * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED + * is set + * + * 3) In case of 10-Bit addressing mode, the master (after generating the START + * and checking on EVT5) use I2C_SendData() function send the header of 10-bit addressing mode. + * Then master wait EVT9. EVT9 means that the 10-bit addressing header has been correctly sent + * on the bus. Then master should use the function I2C_Send7bitAddress() to send the second part + * of the 10-bit address (LSB) . Then master should wait for event 6. + * + * + */ + +/* EVT6 */ +#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */ +#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */ +/*EVT9 */ +#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */ + +/******************************************************************************************************************** + * @brief Communication events + * + * If START condition has generated and slave address + * been acknowledged. then the master has to check one of the following events for + * communication procedures: + * + * 1) Master Receiver mode: The master has to wait on the event EVT7 then use + * I2C_ReceiveData() function to read the data received from the slave . + * + * 2) Master Transmitter mode: The master use I2C_SendData() function to send data + * then to wait on event EVT8 or EVT8_2. + * These two events are similar: + * - EVT8 means that the data has been written in the data register and is + * being shifted out. + * - EVT8_2 means that the data has been physically shifted out and output + * on the bus. + * In most cases, using EVT8 is sufficient for the application. + * Using EVT8_2 will leads to a slower communication speed but will more reliable . + * EVT8_2 is also more suitable than EVT8 for testing on the last data transmission + * + * + * Note: + * In case the user software does not guarantee that this event EVT7 is managed before + * the current byte end of transfer, then user may check on I2C_EVENT_MASTER_BYTE_RECEIVED + * and I2C_FLAG_BTF flag at the same time .But in this case the communication may be slower. + * + * + */ + +/* Master Receive mode */ +/* EVT7 */ +#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */ + +/* Master Transmitter mode*/ +/* EVT8 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */ +/* EVT8_2 */ +#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */ + + +/******************I2C Slave Events (Events grouped in order of communication)******************/ + +/******************************************************************************************************************** + * @brief Start Communicate events + * + * Wait on one of these events at the start of the communication. It means that + * the I2C peripheral detected a start condition of master device generate on the bus. + * If the acknowledge feature is enabled through function I2C_AcknowledgeConfig()),The peripheral generates an ACK condition on the bus. + * + * + * + * a) In normal case (only one address managed by the slave), when the address + * sent by the master matches the own address of the peripheral (configured by + * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set + * (where XXX could be TRANSMITTER or RECEIVER). + * + * b) In case the address sent by the master matches the second address of the + * peripheral (configured by the function I2C_OwnAddress2Config() and enabled + * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED + * (where XXX could be TRANSMITTER or RECEIVER) are set. + * + * c) In case the address sent by the master is General Call (address 0x00) and + * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd()) + * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED. + * + */ + +/* EVT1 */ +/* a) Case of One Single Address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */ + +/* b) Case of Dual address managed by the slave */ +#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */ +#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */ + +/* c) Case of General Call enabled for the slave */ +#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */ + +/******************************************************************************************************************** + * @brief Communication events + * + * Wait on one of these events when EVT1 has already been checked : + * + * - Slave Receiver mode: + * - EVT2--The device is expecting to receive a data byte . + * - EVT4--The device is expecting the end of the communication: master + * sends a stop condition and data transmission is stopped. + * + * - Slave Transmitter mode: + * - EVT3--When a byte has been transmitted by the slave and the Master is expecting + * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and + * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. If the user software doesn't guarantee + * the EVT3 is managed before the current byte end of transfer The second one can optionally + * be used. + * - EVT3_2--When the master sends a NACK to tell slave device that data transmission + * shall end . The slave device has to stop sending + * data bytes and wait a Stop condition from bus. + * + * Note: + * If the user software does not guarantee that the event 2 is + * managed before the current byte end of transfer, User may check on I2C_EVENT_SLAVE_BYTE_RECEIVED + * and I2C_FLAG_BTF flag at the same time . + * In this case the communication will be slower. + * + */ + +/* Slave Receiver mode*/ +/* EVT2 */ +#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */ +/* EVT4 */ +#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */ + +/* Slave Transmitter mode*/ +/* EVT3 */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */ +#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */ +/*EVT3_2 */ +#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */ + + +void I2C_DeInit(I2C_TypeDef* I2Cx); +void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct); +void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct); +void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); +void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState); +void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data); +uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx); +void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); +uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register); +void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition); +void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert); +void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition); +void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState); +uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx); +void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState); +void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle); + + +/***************************************************************************************** + * + * I2C State Monitoring Functions + * + **************************************************************************************** + * This I2C driver provides three different ways for I2C state monitoring + * profit the application requirements and constraints: + * + * + * a) First way: + * Using I2C_CheckEvent() function: + * It compares the status registers (STARR1 and STAR2) content to a given event + * (can be the combination of more flags). + * If the current status registers includes the given flags will return SUCCESS. + * and if the current status registers miss flags will returns ERROR. + * - When to use: + * - This function is suitable for most applications as well as for startup + * activity since the events are fully described in the product reference manual + * (CH32FV2x-V3xRM). + * - It is also suitable for users who need to define their own events. + * - Limitations: + * - If an error occurs besides to the monitored error, + * the I2C_CheckEvent() function may return SUCCESS despite the communication + * in corrupted state. it is suggeted to use error interrupts to monitor the error + * events and handle them in IRQ handler. + * + * + * Note: + * The following functions are recommended for error management: : + * - I2C_ITConfig() main function of configure and enable the error interrupts. + * - I2Cx_ER_IRQHandler() will be called when the error interrupt happen. + * Where x is the peripheral instance (I2C1, I2C2 ...) + * - I2Cx_ER_IRQHandler() will call I2C_GetFlagStatus() or I2C_GetITStatus() functions + * to determine which error occurred. + * - I2C_ClearFlag() \ I2C_ClearITPendingBit() \ I2C_SoftwareResetCmd() + * \ I2C_GenerateStop() will be use to clear the error flag and source, + * and return to correct communication status. + * + * + * b) Second way: + * Using the function to get a single word(uint32_t) composed of status register 1 and register 2. + * (Status Register 2 value is shifted left by 16 bits and concatenated to Status Register 1). + * - When to use: + * + * - This function is suitable for the same applications above but it + * don't have the limitations of I2C_GetFlagStatus() function . + * The returned value could be compared to events already defined in the + * library (CH32V30x_i2c.h) or to custom values defined by user. + * - This function can be used to monitor the status of multiple flags simultaneously. + * - Contrary to the I2C_CheckEvent () function, this function can choose the time to + * accept the event according to the user's needs (when all event flags are set and + * no other flags are set, or only when the required flags are set) + * + * - Limitations: + * - User may need to define his own events. + * - Same remark concerning the error management is applicable for this + * function if user decides to check only regular communication flags (and + * ignores error flags). + * + * + * c) Third way: + * Using the function I2C_GetFlagStatus() get the status of + * one single flag . + * - When to use: + * - This function could be used for specific applications or in debug phase. + * - It is suitable when only one flag checking is needed . + * + * - Limitations: + * - Call this function to access the status register. Some flag bits may be cleared. + * - Function may need to be called twice or more in order to monitor one single event. + */ + + + +/********************************************************* + * + * a) Basic state monitoring(First way) + ******************************************************** + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT); +/********************************************************* + * + * b) Advanced state monitoring(Second way:) + ******************************************************** + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx); +/********************************************************* + * + * c) Flag-based state monitoring(Third way) + ********************************************************* + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); + +void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG); +ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT); +void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + + diff --git a/Peripheral/inc/ch32v30x_iwdg.h b/Peripheral/inc/ch32v30x_iwdg.h new file mode 100644 index 0000000..e506d75 --- /dev/null +++ b/Peripheral/inc/ch32v30x_iwdg.h @@ -0,0 +1,58 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_iwdg.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* IWDG firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_IWDG_H +#define __CH32V30x_IWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* IWDG_WriteAccess */ +#define IWDG_WriteAccess_Enable ((uint16_t)0x5555) +#define IWDG_WriteAccess_Disable ((uint16_t)0x0000) + +/* IWDG_prescaler */ +#define IWDG_Prescaler_4 ((uint8_t)0x00) +#define IWDG_Prescaler_8 ((uint8_t)0x01) +#define IWDG_Prescaler_16 ((uint8_t)0x02) +#define IWDG_Prescaler_32 ((uint8_t)0x03) +#define IWDG_Prescaler_64 ((uint8_t)0x04) +#define IWDG_Prescaler_128 ((uint8_t)0x05) +#define IWDG_Prescaler_256 ((uint8_t)0x06) + +/* IWDG_Flag */ +#define IWDG_FLAG_PVU ((uint16_t)0x0001) +#define IWDG_FLAG_RVU ((uint16_t)0x0002) + + +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); +void IWDG_SetReload(uint16_t Reload); +void IWDG_ReloadCounter(void); +void IWDG_Enable(void); +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + diff --git a/Peripheral/inc/ch32v30x_misc.h b/Peripheral/inc/ch32v30x_misc.h new file mode 100644 index 0000000..ad37278 --- /dev/null +++ b/Peripheral/inc/ch32v30x_misc.h @@ -0,0 +1,93 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_misc.h +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file contains all the functions prototypes for the +* miscellaneous firmware library functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30X_MISC_H +#define __CH32V30X_MISC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* CSR_INTSYSCR_INEST_definition */ +#define INTSYSCR_INEST_NoEN 0x00 /* interrupt nesting disable(CSR-0x804 bit1 = 0) */ +#define INTSYSCR_INEST_EN_2Level 0x01 /* interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) */ +#define INTSYSCR_INEST_EN_4Level 0x02 /* interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) */ +#define INTSYSCR_INEST_EN_8Level 0x03 /* interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) */ + +/* Check the configuration of CSR(0x804) in the startup file(.S) + * interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) + * priority - bit[7:5] - Preemption Priority + * bit[4:0] - Reserve + * interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) + * priority - bit[7:6] - Preemption Priority + * bit[5] - Sub priority + * bit[4:0] - Reserve + * interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) + * priority - bit[7] - Preemption Priority + * bit[6:5] - Sub priority + * bit[4:0] - Reserve + * interrupt nesting disable(CSR-0x804 bit1 = 0) + * priority - bit[7:5] - Sub priority + * bit[4:0] - Reserve + */ + +#ifndef INTSYSCR_INEST +#define INTSYSCR_INEST INTSYSCR_INEST_EN_4Level +#endif + +/* NVIC Init Structure definition + * interrupt nesting disable(CSR-0x804 bit1 = 0) + * NVIC_IRQChannelPreemptionPriority - range is 0. + * NVIC_IRQChannelSubPriority - range from 0 to 7. + * + * interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) + * NVIC_IRQChannelPreemptionPriority - range from 0 to 1. + * NVIC_IRQChannelSubPriority - range from 0 to 3. + * + * interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) + * NVIC_IRQChannelPreemptionPriority - range from 0 to 3. + * NVIC_IRQChannelSubPriority - range from 0 to 1. + * + * interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) + * NVIC_IRQChannelPreemptionPriority - range from 0 to 7. + * NVIC_IRQChannelSubPriority - range range is 0. + */ +typedef struct +{ + uint8_t NVIC_IRQChannel; + uint8_t NVIC_IRQChannelPreemptionPriority; + uint8_t NVIC_IRQChannelSubPriority; + FunctionalState NVIC_IRQChannelCmd; +} NVIC_InitTypeDef; + +/* Preemption_Priority_Group */ +#if (INTSYSCR_INEST == INTSYSCR_INEST_NoEN) +#define NVIC_PriorityGroup_0 ((uint32_t)0x00) /* interrupt nesting disable(CSR-0x804 bit1 = 0) */ +#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_2Level) +#define NVIC_PriorityGroup_1 ((uint32_t)0x01) /* interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) */ +#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_8Level) +#define NVIC_PriorityGroup_3 ((uint32_t)0x03) /* interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) */ +#else +#define NVIC_PriorityGroup_2 ((uint32_t)0x02) /* interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) */ +#endif + +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); +void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_opa.h b/Peripheral/inc/ch32v30x_opa.h new file mode 100644 index 0000000..40e71b8 --- /dev/null +++ b/Peripheral/inc/ch32v30x_opa.h @@ -0,0 +1,77 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_opa.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* OPA firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_OPA_H +#define __CH32V30x_OPA_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +#define OPA_PSEL_OFFSET 3 +#define OPA_NSEL_OFFSET 2 +#define OPA_MODE_OFFSET 1 + + +/* OPA member enumeration */ +typedef enum +{ + OPA1=0, + OPA2, + OPA3, + OPA4 +}OPA_Num_TypeDef; + +/* OPA PSEL enumeration */ +typedef enum +{ + CHP0=0, + CHP1 +}OPA_PSEL_TypeDef; + +/* OPA NSEL enumeration */ +typedef enum +{ + CHN0=0, + CHN1 +}OPA_NSEL_TypeDef; + +/* OPA out channel enumeration */ +typedef enum +{ + OUT_IO_OUT0=0, + OUT_IO_OUT1 +}OPA_Mode_TypeDef; + +/* OPA Init Structure definition */ +typedef struct +{ + OPA_Num_TypeDef OPA_NUM; /* Specifies the members of OPA */ + OPA_PSEL_TypeDef PSEL; /* Specifies the positive channel of OPA */ + OPA_NSEL_TypeDef NSEL; /* Specifies the negative channel of OPA */ + OPA_Mode_TypeDef Mode; /* Specifies the mode of OPA */ +}OPA_InitTypeDef; + + +void OPA_DeInit(void); +void OPA_Init(OPA_InitTypeDef* OPA_InitStruct); +void OPA_StructInit(OPA_InitTypeDef* OPA_InitStruct); +void OPA_Cmd(OPA_Num_TypeDef OPA_NUM, FunctionalState NewState); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_pwr.h b/Peripheral/inc/ch32v30x_pwr.h new file mode 100644 index 0000000..7b726e0 --- /dev/null +++ b/Peripheral/inc/ch32v30x_pwr.h @@ -0,0 +1,77 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_pwr.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the PWR +* firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_PWR_H +#define __CH32V30x_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* PVD_detection_level */ +#define PWR_PVDLevel_MODE0 ((uint32_t)0x00000000) +#define PWR_PVDLevel_MODE1 ((uint32_t)0x00000020) +#define PWR_PVDLevel_MODE2 ((uint32_t)0x00000040) +#define PWR_PVDLevel_MODE3 ((uint32_t)0x00000060) +#define PWR_PVDLevel_MODE4 ((uint32_t)0x00000080) +#define PWR_PVDLevel_MODE5 ((uint32_t)0x000000A0) +#define PWR_PVDLevel_MODE6 ((uint32_t)0x000000C0) +#define PWR_PVDLevel_MODE7 ((uint32_t)0x000000E0) + + + +#define PWR_PVDLevel_2V2 PWR_PVDLevel_MODE0 +#define PWR_PVDLevel_2V3 PWR_PVDLevel_MODE1 +#define PWR_PVDLevel_2V4 PWR_PVDLevel_MODE2 +#define PWR_PVDLevel_2V5 PWR_PVDLevel_MODE3 +#define PWR_PVDLevel_2V6 PWR_PVDLevel_MODE4 +#define PWR_PVDLevel_2V7 PWR_PVDLevel_MODE5 +#define PWR_PVDLevel_2V8 PWR_PVDLevel_MODE6 +#define PWR_PVDLevel_2V9 PWR_PVDLevel_MODE7 + +/* Regulator_state_is_STOP_mode */ +#define PWR_Regulator_ON ((uint32_t)0x00000000) +#define PWR_Regulator_LowPower ((uint32_t)0x00000001) + +/* STOP_mode_entry */ +#define PWR_STOPEntry_WFI ((uint8_t)0x01) +#define PWR_STOPEntry_WFE ((uint8_t)0x02) + +/* PWR_Flag */ +#define PWR_FLAG_WU ((uint32_t)0x00000001) +#define PWR_FLAG_SB ((uint32_t)0x00000002) +#define PWR_FLAG_PVDO ((uint32_t)0x00000004) + + +void PWR_DeInit(void); +void PWR_BackupAccessCmd(FunctionalState NewState); +void PWR_PVDCmd(FunctionalState NewState); +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel); +void PWR_WakeUpPinCmd(FunctionalState NewState); +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); +void PWR_EnterSTANDBYMode(void); +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG); +void PWR_ClearFlag(uint32_t PWR_FLAG); +void PWR_EnterSTANDBYMode_RAM(void); +void PWR_EnterSTANDBYMode_RAM_LV(void); +void PWR_EnterSTANDBYMode_RAM_VBAT_EN(void); +void PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN(void); +void PWR_EnterSTOPMode_RAM_LV(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_rcc.h b/Peripheral/inc/ch32v30x_rcc.h new file mode 100644 index 0000000..a43a12b --- /dev/null +++ b/Peripheral/inc/ch32v30x_rcc.h @@ -0,0 +1,464 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_rcc.h +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file provides all the RCC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_RCC_H +#define __CH32V30x_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* RCC_Exported_Types */ +typedef struct +{ + uint32_t SYSCLK_Frequency; /* returns SYSCLK clock frequency expressed in Hz */ + uint32_t HCLK_Frequency; /* returns HCLK clock frequency expressed in Hz */ + uint32_t PCLK1_Frequency; /* returns PCLK1 clock frequency expressed in Hz */ + uint32_t PCLK2_Frequency; /* returns PCLK2 clock frequency expressed in Hz */ + uint32_t ADCCLK_Frequency; /* returns ADCCLK clock frequency expressed in Hz */ +}RCC_ClocksTypeDef; + +/* HSE_configuration */ +#define RCC_HSE_OFF ((uint32_t)0x00000000) +#define RCC_HSE_ON ((uint32_t)0x00010000) +#define RCC_HSE_Bypass ((uint32_t)0x00040000) + +/* PLL_entry_clock_source */ +#define RCC_PLLSource_HSI_Div2 ((uint32_t)0x00000000) + +#ifdef CH32V30x_D8 +#define RCC_PLLSource_HSE_Div1 ((uint32_t)0x00010000) +#define RCC_PLLSource_HSE_Div2 ((uint32_t)0x00030000) + +#else +#define RCC_PLLSource_PREDIV1 ((uint32_t)0x00010000) + +#endif + +/* PLL_multiplication_factor */ +#ifdef CH32V30x_D8 +#define RCC_PLLMul_2 ((uint32_t)0x00000000) +#define RCC_PLLMul_3 ((uint32_t)0x00040000) +#define RCC_PLLMul_4 ((uint32_t)0x00080000) +#define RCC_PLLMul_5 ((uint32_t)0x000C0000) +#define RCC_PLLMul_6 ((uint32_t)0x00100000) +#define RCC_PLLMul_7 ((uint32_t)0x00140000) +#define RCC_PLLMul_8 ((uint32_t)0x00180000) +#define RCC_PLLMul_9 ((uint32_t)0x001C0000) +#define RCC_PLLMul_10 ((uint32_t)0x00200000) +#define RCC_PLLMul_11 ((uint32_t)0x00240000) +#define RCC_PLLMul_12 ((uint32_t)0x00280000) +#define RCC_PLLMul_13 ((uint32_t)0x002C0000) +#define RCC_PLLMul_14 ((uint32_t)0x00300000) +#define RCC_PLLMul_15 ((uint32_t)0x00340000) +#define RCC_PLLMul_16 ((uint32_t)0x00380000) +#define RCC_PLLMul_18 ((uint32_t)0x003C0000) + +#else +#define RCC_PLLMul_18_EXTEN ((uint32_t)0x00000000) +#define RCC_PLLMul_3_EXTEN ((uint32_t)0x00040000) +#define RCC_PLLMul_4_EXTEN ((uint32_t)0x00080000) +#define RCC_PLLMul_5_EXTEN ((uint32_t)0x000C0000) +#define RCC_PLLMul_6_EXTEN ((uint32_t)0x00100000) +#define RCC_PLLMul_7_EXTEN ((uint32_t)0x00140000) +#define RCC_PLLMul_8_EXTEN ((uint32_t)0x00180000) +#define RCC_PLLMul_9_EXTEN ((uint32_t)0x001C0000) +#define RCC_PLLMul_10_EXTEN ((uint32_t)0x00200000) +#define RCC_PLLMul_11_EXTEN ((uint32_t)0x00240000) +#define RCC_PLLMul_12_EXTEN ((uint32_t)0x00280000) +#define RCC_PLLMul_13_EXTEN ((uint32_t)0x002C0000) +#define RCC_PLLMul_14_EXTEN ((uint32_t)0x00300000) +#define RCC_PLLMul_6_5_EXTEN ((uint32_t)0x00340000) +#define RCC_PLLMul_15_EXTEN ((uint32_t)0x00380000) +#define RCC_PLLMul_16_EXTEN ((uint32_t)0x003C0000) + +#endif + +/* PREDIV1_division_factor */ +#ifdef CH32V30x_D8C +#define RCC_PREDIV1_Div1 ((uint32_t)0x00000000) +#define RCC_PREDIV1_Div2 ((uint32_t)0x00000001) +#define RCC_PREDIV1_Div3 ((uint32_t)0x00000002) +#define RCC_PREDIV1_Div4 ((uint32_t)0x00000003) +#define RCC_PREDIV1_Div5 ((uint32_t)0x00000004) +#define RCC_PREDIV1_Div6 ((uint32_t)0x00000005) +#define RCC_PREDIV1_Div7 ((uint32_t)0x00000006) +#define RCC_PREDIV1_Div8 ((uint32_t)0x00000007) +#define RCC_PREDIV1_Div9 ((uint32_t)0x00000008) +#define RCC_PREDIV1_Div10 ((uint32_t)0x00000009) +#define RCC_PREDIV1_Div11 ((uint32_t)0x0000000A) +#define RCC_PREDIV1_Div12 ((uint32_t)0x0000000B) +#define RCC_PREDIV1_Div13 ((uint32_t)0x0000000C) +#define RCC_PREDIV1_Div14 ((uint32_t)0x0000000D) +#define RCC_PREDIV1_Div15 ((uint32_t)0x0000000E) +#define RCC_PREDIV1_Div16 ((uint32_t)0x0000000F) + +#endif + +/* PREDIV1_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_PREDIV1_Source_HSE ((uint32_t)0x00000000) +#define RCC_PREDIV1_Source_PLL2 ((uint32_t)0x00010000) + +#endif + +/* PREDIV2_division_factor */ +#ifdef CH32V30x_D8C +#define RCC_PREDIV2_Div1 ((uint32_t)0x00000000) +#define RCC_PREDIV2_Div2 ((uint32_t)0x00000010) +#define RCC_PREDIV2_Div3 ((uint32_t)0x00000020) +#define RCC_PREDIV2_Div4 ((uint32_t)0x00000030) +#define RCC_PREDIV2_Div5 ((uint32_t)0x00000040) +#define RCC_PREDIV2_Div6 ((uint32_t)0x00000050) +#define RCC_PREDIV2_Div7 ((uint32_t)0x00000060) +#define RCC_PREDIV2_Div8 ((uint32_t)0x00000070) +#define RCC_PREDIV2_Div9 ((uint32_t)0x00000080) +#define RCC_PREDIV2_Div10 ((uint32_t)0x00000090) +#define RCC_PREDIV2_Div11 ((uint32_t)0x000000A0) +#define RCC_PREDIV2_Div12 ((uint32_t)0x000000B0) +#define RCC_PREDIV2_Div13 ((uint32_t)0x000000C0) +#define RCC_PREDIV2_Div14 ((uint32_t)0x000000D0) +#define RCC_PREDIV2_Div15 ((uint32_t)0x000000E0) +#define RCC_PREDIV2_Div16 ((uint32_t)0x000000F0) + +#endif + +/* PLL2_multiplication_factor */ +#ifdef CH32V30x_D8C +#define RCC_PLL2Mul_2_5 ((uint32_t)0x00000000) +#define RCC_PLL2Mul_12_5 ((uint32_t)0x00000100) +#define RCC_PLL2Mul_4 ((uint32_t)0x00000200) +#define RCC_PLL2Mul_5 ((uint32_t)0x00000300) +#define RCC_PLL2Mul_6 ((uint32_t)0x00000400) +#define RCC_PLL2Mul_7 ((uint32_t)0x00000500) +#define RCC_PLL2Mul_8 ((uint32_t)0x00000600) +#define RCC_PLL2Mul_9 ((uint32_t)0x00000700) +#define RCC_PLL2Mul_10 ((uint32_t)0x00000800) +#define RCC_PLL2Mul_11 ((uint32_t)0x00000900) +#define RCC_PLL2Mul_12 ((uint32_t)0x00000A00) +#define RCC_PLL2Mul_13 ((uint32_t)0x00000B00) +#define RCC_PLL2Mul_14 ((uint32_t)0x00000C00) +#define RCC_PLL2Mul_15 ((uint32_t)0x00000D00) +#define RCC_PLL2Mul_16 ((uint32_t)0x00000E00) +#define RCC_PLL2Mul_20 ((uint32_t)0x00000F00) + +#endif + +/* PLL3_multiplication_factor */ +#ifdef CH32V30x_D8C +#define RCC_PLL3Mul_2_5 ((uint32_t)0x00000000) +#define RCC_PLL3Mul_12_5 ((uint32_t)0x00001000) +#define RCC_PLL3Mul_4 ((uint32_t)0x00002000) +#define RCC_PLL3Mul_5 ((uint32_t)0x00003000) +#define RCC_PLL3Mul_6 ((uint32_t)0x00004000) +#define RCC_PLL3Mul_7 ((uint32_t)0x00005000) +#define RCC_PLL3Mul_8 ((uint32_t)0x00006000) +#define RCC_PLL3Mul_9 ((uint32_t)0x00007000) +#define RCC_PLL3Mul_10 ((uint32_t)0x00008000) +#define RCC_PLL3Mul_11 ((uint32_t)0x00009000) +#define RCC_PLL3Mul_12 ((uint32_t)0x0000A000) +#define RCC_PLL3Mul_13 ((uint32_t)0x0000B000) +#define RCC_PLL3Mul_14 ((uint32_t)0x0000C000) +#define RCC_PLL3Mul_15 ((uint32_t)0x0000D000) +#define RCC_PLL3Mul_16 ((uint32_t)0x0000E000) +#define RCC_PLL3Mul_20 ((uint32_t)0x0000F000) + +#endif + +/* System_clock_source */ +#define RCC_SYSCLKSource_HSI ((uint32_t)0x00000000) +#define RCC_SYSCLKSource_HSE ((uint32_t)0x00000001) +#define RCC_SYSCLKSource_PLLCLK ((uint32_t)0x00000002) + +/* AHB_clock_source */ +#define RCC_SYSCLK_Div1 ((uint32_t)0x00000000) +#define RCC_SYSCLK_Div2 ((uint32_t)0x00000080) +#define RCC_SYSCLK_Div4 ((uint32_t)0x00000090) +#define RCC_SYSCLK_Div8 ((uint32_t)0x000000A0) +#define RCC_SYSCLK_Div16 ((uint32_t)0x000000B0) +#define RCC_SYSCLK_Div64 ((uint32_t)0x000000C0) +#define RCC_SYSCLK_Div128 ((uint32_t)0x000000D0) +#define RCC_SYSCLK_Div256 ((uint32_t)0x000000E0) +#define RCC_SYSCLK_Div512 ((uint32_t)0x000000F0) + +/* APB1_APB2_clock_source */ +#define RCC_HCLK_Div1 ((uint32_t)0x00000000) +#define RCC_HCLK_Div2 ((uint32_t)0x00000400) +#define RCC_HCLK_Div4 ((uint32_t)0x00000500) +#define RCC_HCLK_Div8 ((uint32_t)0x00000600) +#define RCC_HCLK_Div16 ((uint32_t)0x00000700) + +/* RCC_Interrupt_source */ +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_CSS ((uint8_t)0x80) + +#ifdef CH32V30x_D8C +#define RCC_IT_PLL2RDY ((uint8_t)0x20) +#define RCC_IT_PLL3RDY ((uint8_t)0x40) + +#endif + +/* USBFS_clock_source */ +#define RCC_USBFSCLKSource_PLLCLK_Div1 ((uint8_t)0x00) +#define RCC_USBFSCLKSource_PLLCLK_Div2 ((uint8_t)0x01) +#define RCC_USBFSCLKSource_PLLCLK_Div3 ((uint8_t)0x02) + +#define RCC_OTGFSCLKSource_PLLCLK_Div1 RCC_USBFSCLKSource_PLLCLK_Div1 +#define RCC_OTGFSCLKSource_PLLCLK_Div2 RCC_USBFSCLKSource_PLLCLK_Div2 +#define RCC_OTGFSCLKSource_PLLCLK_Div3 RCC_USBFSCLKSource_PLLCLK_Div3 + +/* I2S2_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_I2S2CLKSource_SYSCLK ((uint8_t)0x00) +#define RCC_I2S2CLKSource_PLL3_VCO ((uint8_t)0x01) + +#endif + +/* I2S3_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_I2S3CLKSource_SYSCLK ((uint8_t)0x00) +#define RCC_I2S3CLKSource_PLL3_VCO ((uint8_t)0x01) + +#endif + +/* ADC_clock_source */ +#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) +#define RCC_PCLK2_Div4 ((uint32_t)0x00004000) +#define RCC_PCLK2_Div6 ((uint32_t)0x00008000) +#define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) + +/* LSE_configuration */ +#define RCC_LSE_OFF ((uint8_t)0x00) +#define RCC_LSE_ON ((uint8_t)0x01) +#define RCC_LSE_Bypass ((uint8_t)0x04) + +/* RTC_clock_source */ +#define RCC_RTCCLKSource_LSE ((uint32_t)0x00000100) +#define RCC_RTCCLKSource_LSI ((uint32_t)0x00000200) +#define RCC_RTCCLKSource_HSE_Div128 ((uint32_t)0x00000300) + +/* AHB_peripheral */ +#define RCC_AHBPeriph_DMA1 ((uint32_t)0x00000001) +#define RCC_AHBPeriph_DMA2 ((uint32_t)0x00000002) +#define RCC_AHBPeriph_SRAM ((uint32_t)0x00000004) +#define RCC_AHBPeriph_CRC ((uint32_t)0x00000040) +#define RCC_AHBPeriph_FSMC ((uint32_t)0x00000100) +#define RCC_AHBPeriph_RNG ((uint32_t)0x00000200) +#define RCC_AHBPeriph_SDIO ((uint32_t)0x00000400) +#define RCC_AHBPeriph_USBHS ((uint32_t)0x00000800) +#define RCC_AHBPeriph_USBFS ((uint32_t)0x00001000) +#define RCC_AHBPeriph_DVP ((uint32_t)0x00002000) +#define RCC_AHBPeriph_ETH_MAC ((uint32_t)0x00004000) +#define RCC_AHBPeriph_ETH_MAC_Tx ((uint32_t)0x00008000) +#define RCC_AHBPeriph_ETH_MAC_Rx ((uint32_t)0x00010000) +#define RCC_AHBPeriph_OTG_FS RCC_AHBPeriph_USBFS + +/* APB2_peripheral */ +#define RCC_APB2Periph_AFIO ((uint32_t)0x00000001) +#define RCC_APB2Periph_GPIOA ((uint32_t)0x00000004) +#define RCC_APB2Periph_GPIOB ((uint32_t)0x00000008) +#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) +#define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020) +#define RCC_APB2Periph_GPIOE ((uint32_t)0x00000040) +#define RCC_APB2Periph_ADC1 ((uint32_t)0x00000200) +#define RCC_APB2Periph_ADC2 ((uint32_t)0x00000400) +#define RCC_APB2Periph_TIM1 ((uint32_t)0x00000800) +#define RCC_APB2Periph_SPI1 ((uint32_t)0x00001000) +#define RCC_APB2Periph_TIM8 ((uint32_t)0x00002000) +#define RCC_APB2Periph_USART1 ((uint32_t)0x00004000) +#define RCC_APB2Periph_TIM9 ((uint32_t)0x00080000) +#define RCC_APB2Periph_TIM10 ((uint32_t)0x00100000) + +/* APB1_peripheral */ +#define RCC_APB1Periph_TIM2 ((uint32_t)0x00000001) +#define RCC_APB1Periph_TIM3 ((uint32_t)0x00000002) +#define RCC_APB1Periph_TIM4 ((uint32_t)0x00000004) +#define RCC_APB1Periph_TIM5 ((uint32_t)0x00000008) +#define RCC_APB1Periph_TIM6 ((uint32_t)0x00000010) +#define RCC_APB1Periph_TIM7 ((uint32_t)0x00000020) +#define RCC_APB1Periph_UART6 ((uint32_t)0x00000040) +#define RCC_APB1Periph_UART7 ((uint32_t)0x00000080) +#define RCC_APB1Periph_UART8 ((uint32_t)0x00000100) +#define RCC_APB1Periph_WWDG ((uint32_t)0x00000800) +#define RCC_APB1Periph_SPI2 ((uint32_t)0x00004000) +#define RCC_APB1Periph_SPI3 ((uint32_t)0x00008000) +#define RCC_APB1Periph_USART2 ((uint32_t)0x00020000) +#define RCC_APB1Periph_USART3 ((uint32_t)0x00040000) +#define RCC_APB1Periph_UART4 ((uint32_t)0x00080000) +#define RCC_APB1Periph_UART5 ((uint32_t)0x00100000) +#define RCC_APB1Periph_I2C1 ((uint32_t)0x00200000) +#define RCC_APB1Periph_I2C2 ((uint32_t)0x00400000) +#define RCC_APB1Periph_USB ((uint32_t)0x00800000) +#define RCC_APB1Periph_CAN1 ((uint32_t)0x02000000) +#define RCC_APB1Periph_CAN2 ((uint32_t)0x04000000) +#define RCC_APB1Periph_BKP ((uint32_t)0x08000000) +#define RCC_APB1Periph_PWR ((uint32_t)0x10000000) +#define RCC_APB1Periph_DAC ((uint32_t)0x20000000) + +/* Clock_source_to_output_on_MCO_pin */ +#define RCC_MCO_NoClock ((uint8_t)0x00) +#define RCC_MCO_SYSCLK ((uint8_t)0x04) +#define RCC_MCO_HSI ((uint8_t)0x05) +#define RCC_MCO_HSE ((uint8_t)0x06) +#define RCC_MCO_PLLCLK_Div2 ((uint8_t)0x07) + +#ifdef CH32V30x_D8C +#define RCC_MCO_PLL2CLK ((uint8_t)0x08) +#define RCC_MCO_PLL3CLK_Div2 ((uint8_t)0x09) +#define RCC_MCO_XT1 ((uint8_t)0x0A) +#define RCC_MCO_PLL3CLK ((uint8_t)0x0B) + +#endif + +/* RCC_Flag */ +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_LSERDY ((uint8_t)0x41) +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) + +#ifdef CH32V30x_D8C +#define RCC_FLAG_PLL2RDY ((uint8_t)0x3B) +#define RCC_FLAG_PLL3RDY ((uint8_t)0x3D) + +#endif + +/* SysTick_clock_source */ +#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB) +#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004) + +/* RNG_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_RNGCLKSource_SYSCLK ((uint32_t)0x00) +#define RCC_RNGCLKSource_PLL3_VCO ((uint32_t)0x01) + +#endif + +/* ETH1G_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_ETH1GCLKSource_PLL2_VCO ((uint32_t)0x00) +#define RCC_ETH1GCLKSource_PLL3_VCO ((uint32_t)0x01) +#define RCC_ETH1GCLKSource_PB1_IN ((uint32_t)0x02) + +#endif + +/* USBFS_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_USBPLL_Div1 ((uint32_t)0x00) +#define RCC_USBPLL_Div2 ((uint32_t)0x01) +#define RCC_USBPLL_Div3 ((uint32_t)0x02) +#define RCC_USBPLL_Div4 ((uint32_t)0x03) +#define RCC_USBPLL_Div5 ((uint32_t)0x04) +#define RCC_USBPLL_Div6 ((uint32_t)0x05) +#define RCC_USBPLL_Div7 ((uint32_t)0x06) +#define RCC_USBPLL_Div8 ((uint32_t)0x07) + +#endif + +/* USBHSPLL_clock_source */ +#ifdef CH32V30x_D8C +#define RCC_HSBHSPLLCLKSource_HSE ((uint32_t)0x00) +#define RCC_HSBHSPLLCLKSource_HSI ((uint32_t)0x01) + +#endif + +/* USBHSPLLCKREF_clock_select */ +#ifdef CH32V30x_D8C +#define RCC_USBHSPLLCKREFCLK_3M ((uint32_t)0x00) +#define RCC_USBHSPLLCKREFCLK_4M ((uint32_t)0x01) +#define RCC_USBHSPLLCKREFCLK_8M ((uint32_t)0x02) +#define RCC_USBHSPLLCKREFCLK_5M ((uint32_t)0x03) + +#endif + +/* OTGUSBCLK48M_clock_source */ +#define RCC_USBCLK48MCLKSource_PLLCLK ((uint32_t)0x00) +#define RCC_USBCLK48MCLKSource_USBPHY ((uint32_t)0x01) + + +void RCC_DeInit(void); +void RCC_HSEConfig(uint32_t RCC_HSE); +ErrorStatus RCC_WaitForHSEStartUp(void); +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue); +void RCC_HSICmd(FunctionalState NewState); +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul); +void RCC_PLLCmd(FunctionalState NewState); +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource); +uint8_t RCC_GetSYSCLKSource(void); +void RCC_HCLKConfig(uint32_t RCC_SYSCLK); +void RCC_PCLK1Config(uint32_t RCC_HCLK); +void RCC_PCLK2Config(uint32_t RCC_HCLK); +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState); +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); +void RCC_LSEConfig(uint8_t RCC_LSE); +void RCC_LSICmd(FunctionalState NewState); +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource); +void RCC_RTCCLKCmd(FunctionalState NewState); +void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks); +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); +void RCC_BackupResetCmd(FunctionalState NewState); +void RCC_ClockSecuritySystemCmd(FunctionalState NewState); +void RCC_MCOConfig(uint8_t RCC_MCO); +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); +void RCC_ClearFlag(void); +ITStatus RCC_GetITStatus(uint8_t RCC_IT); +void RCC_ClearITPendingBit(uint8_t RCC_IT); +void RCC_ADCCLKADJcmd(FunctionalState NewState); +void RCC_USBFSCLKConfig(uint32_t RCC_USBFSCLKSource); +void RCC_USBCLK48MConfig(uint32_t RCC_USBCLK48MSource); +#define RCC_OTGFSCLKConfig RCC_USBFSCLKConfig + +#ifdef CH32V30x_D8C +void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div); +void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div); +void RCC_PLL2Config(uint32_t RCC_PLL2Mul); +void RCC_PLL2Cmd(FunctionalState NewState); +void RCC_PLL3Config(uint32_t RCC_PLL3Mul); +void RCC_PLL3Cmd(FunctionalState NewState); +void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource); +void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource); +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); +void RCC_RNGCLKConfig(uint32_t RCC_RNGCLKSource); +void RCC_ETH1GCLKConfig(uint32_t RCC_ETH1GCLKSource); +void RCC_ETH1G_125Mcmd(FunctionalState NewState); +void RCC_USBHSConfig(uint32_t RCC_USBHS); +void RCC_USBHSPLLCLKConfig(uint32_t RCC_USBHSPLLCLKSource); +void RCC_USBHSPLLCKREFCLKConfig(uint32_t RCC_USBHSPLLCKREFCLKSource); +void RCC_USBHSPHYPLLALIVEcmd(FunctionalState NewState); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif + + + + + diff --git a/Peripheral/inc/ch32v30x_rng.h b/Peripheral/inc/ch32v30x_rng.h new file mode 100644 index 0000000..3163c89 --- /dev/null +++ b/Peripheral/inc/ch32v30x_rng.h @@ -0,0 +1,43 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_rng.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* RNG firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_RNG_H +#define __CH32V30x_RNG_H + +#ifdef __cplusplus + extern "C" { +#endif +#include "ch32v30x.h" + + /* RNG_flags_definition*/ +#define RNG_FLAG_DRDY ((uint8_t)0x0001) /* Data ready */ +#define RNG_FLAG_CECS ((uint8_t)0x0002) /* Clock error current status */ +#define RNG_FLAG_SECS ((uint8_t)0x0004) /* Seed error current status */ + +/* RNG_interrupts_definition */ +#define RNG_IT_CEI ((uint8_t)0x20) /* Clock error interrupt */ +#define RNG_IT_SEI ((uint8_t)0x40) /* Seed error interrupt */ + + +void RNG_Cmd(FunctionalState NewState); +uint32_t RNG_GetRandomNumber(void); +void RNG_ITConfig(FunctionalState NewState); +FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG); +void RNG_ClearFlag(uint8_t RNG_FLAG); +ITStatus RNG_GetITStatus(uint8_t RNG_IT); +void RNG_ClearITPendingBit(uint8_t RNG_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Peripheral/inc/ch32v30x_rtc.h b/Peripheral/inc/ch32v30x_rtc.h new file mode 100644 index 0000000..3e17385 --- /dev/null +++ b/Peripheral/inc/ch32v30x_rtc.h @@ -0,0 +1,56 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_rtc.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the RTC +* firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_RTC_H +#define __CH32V30x_RTC_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + + +/* RTC_interrupts_define */ +#define RTC_IT_OW ((uint16_t)0x0004) /* Overflow interrupt */ +#define RTC_IT_ALR ((uint16_t)0x0002) /* Alarm interrupt */ +#define RTC_IT_SEC ((uint16_t)0x0001) /* Second interrupt */ + +/* RTC_interrupts_flags */ +#define RTC_FLAG_RTOFF ((uint16_t)0x0020) /* RTC Operation OFF flag */ +#define RTC_FLAG_RSF ((uint16_t)0x0008) /* Registers Synchronized flag */ +#define RTC_FLAG_OW ((uint16_t)0x0004) /* Overflow flag */ +#define RTC_FLAG_ALR ((uint16_t)0x0002) /* Alarm flag */ +#define RTC_FLAG_SEC ((uint16_t)0x0001) /* Second flag */ + + +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState); +void RTC_EnterConfigMode(void); +void RTC_ExitConfigMode(void); +uint32_t RTC_GetCounter(void); +void RTC_SetCounter(uint32_t CounterValue); +void RTC_SetPrescaler(uint32_t PrescalerValue); +void RTC_SetAlarm(uint32_t AlarmValue); +uint32_t RTC_GetDivider(void); +void RTC_WaitForLastTask(void); +void RTC_WaitForSynchro(void); +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG); +void RTC_ClearFlag(uint16_t RTC_FLAG); +ITStatus RTC_GetITStatus(uint16_t RTC_IT); +void RTC_ClearITPendingBit(uint16_t RTC_IT); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/inc/ch32v30x_sdio.h b/Peripheral/inc/ch32v30x_sdio.h new file mode 100644 index 0000000..6f3cfa8 --- /dev/null +++ b/Peripheral/inc/ch32v30x_sdio.h @@ -0,0 +1,266 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_sdio.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the SDIO +* firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_SDIO_H +#define __CH32V30x_SDIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* SDIO Init structure definition */ +typedef struct +{ + uint32_t SDIO_ClockEdge; /* Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref SDIO_Clock_Edge */ + + uint32_t SDIO_ClockBypass; /* Specifies whether the SDIO Clock divider bypass is + enabled or disabled. + This parameter can be a value of @ref SDIO_Clock_Bypass */ + + uint32_t SDIO_ClockPowerSave; /* Specifies whether SDIO Clock output is enabled or + disabled when the bus is idle. + This parameter can be a value of @ref SDIO_Clock_Power_Save */ + + uint32_t SDIO_BusWide; /* Specifies the SDIO bus width. + This parameter can be a value of @ref SDIO_Bus_Wide */ + + uint32_t SDIO_HardwareFlowControl; /* Specifies whether the SDIO hardware flow control is enabled or disabled. + This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ + + uint8_t SDIO_ClockDiv; /* Specifies the clock frequency of the SDIO controller. + This parameter can be a value between 0x00 and 0xFF. */ + +} SDIO_InitTypeDef; + + +typedef struct +{ + uint32_t SDIO_Argument; /* Specifies the SDIO command argument which is sent + to a card as part of a command message. If a command + contains an argument, it must be loaded into this register + before writing the command to the command register */ + + uint32_t SDIO_CmdIndex; /* Specifies the SDIO command index. It must be lower than 0x40. */ + + uint32_t SDIO_Response; /* Specifies the SDIO response type. + This parameter can be a value of @ref SDIO_Response_Type */ + + uint32_t SDIO_Wait; /* Specifies whether SDIO wait-for-interrupt request is enabled or disabled. + This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ + + uint32_t SDIO_CPSM; /* Specifies whether SDIO Command path state machine (CPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_CPSM_State */ +} SDIO_CmdInitTypeDef; + +typedef struct +{ + uint32_t SDIO_DataTimeOut; /* Specifies the data timeout period in card bus clock periods. */ + + uint32_t SDIO_DataLength; /* Specifies the number of data bytes to be transferred. */ + + uint32_t SDIO_DataBlockSize; /* Specifies the data block size for block transfer. + This parameter can be a value of @ref SDIO_Data_Block_Size */ + + uint32_t SDIO_TransferDir; /* Specifies the data transfer direction, whether the transfer + is a read or write. + This parameter can be a value of @ref SDIO_Transfer_Direction */ + + uint32_t SDIO_TransferMode; /* Specifies whether data transfer is in stream or block mode. + This parameter can be a value of @ref SDIO_Transfer_Type */ + + uint32_t SDIO_DPSM; /* Specifies whether SDIO Data path state machine (DPSM) + is enabled or disabled. + This parameter can be a value of @ref SDIO_DPSM_State */ +} SDIO_DataInitTypeDef; + + +/* SDIO_Clock_Edge */ +#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) +#define SDIO_ClockEdge_Falling ((uint32_t)0x00002000) + +/* SDIO_Clock_Bypass */ +#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) +#define SDIO_ClockBypass_Enable ((uint32_t)0x00000400) + +/* SDIO_Clock_Power_Save */ +#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) +#define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200) + +/* SDIO_Bus_Wide */ +#define SDIO_BusWide_1b ((uint32_t)0x00000000) +#define SDIO_BusWide_4b ((uint32_t)0x00000800) +#define SDIO_BusWide_8b ((uint32_t)0x00001000) + +/* SDIO_Hardware_Flow_Control */ +#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) +#define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000) + +/* SDIO_Power_State */ +#define SDIO_PowerState_OFF ((uint32_t)0x00000000) +#define SDIO_PowerState_ON ((uint32_t)0x00000003) + +/* SDIO_Interrupt_sources */ +#define SDIO_IT_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_IT_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_IT_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_IT_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_IT_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_IT_RXOVERR ((uint32_t)0x00000020) +#define SDIO_IT_CMDREND ((uint32_t)0x00000040) +#define SDIO_IT_CMDSENT ((uint32_t)0x00000080) +#define SDIO_IT_DATAEND ((uint32_t)0x00000100) +#define SDIO_IT_STBITERR ((uint32_t)0x00000200) +#define SDIO_IT_DBCKEND ((uint32_t)0x00000400) +#define SDIO_IT_CMDACT ((uint32_t)0x00000800) +#define SDIO_IT_TXACT ((uint32_t)0x00001000) +#define SDIO_IT_RXACT ((uint32_t)0x00002000) +#define SDIO_IT_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_IT_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_IT_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_IT_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_IT_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_IT_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_IT_TXDAVL ((uint32_t)0x00100000) +#define SDIO_IT_RXDAVL ((uint32_t)0x00200000) +#define SDIO_IT_SDIOIT ((uint32_t)0x00400000) +#define SDIO_IT_CEATAEND ((uint32_t)0x00800000) + +/* SDIO_Response_Type */ +#define SDIO_Response_No ((uint32_t)0x00000000) +#define SDIO_Response_Short ((uint32_t)0x00000040) +#define SDIO_Response_Long ((uint32_t)0x000000C0) + +/* SDIO_Wait_Interrupt_State */ +#define SDIO_Wait_No ((uint32_t)0x00000000) +#define SDIO_Wait_IT ((uint32_t)0x00000100) +#define SDIO_Wait_Pend ((uint32_t)0x00000200) + +/* SDIO_CPSM_State */ +#define SDIO_CPSM_Disable ((uint32_t)0x00000000) +#define SDIO_CPSM_Enable ((uint32_t)0x00000400) + +/* SDIO_Response_Registers */ +#define SDIO_RESP1 ((uint32_t)0x00000000) +#define SDIO_RESP2 ((uint32_t)0x00000004) +#define SDIO_RESP3 ((uint32_t)0x00000008) +#define SDIO_RESP4 ((uint32_t)0x0000000C) + +/* SDIO_Data_Block_Size */ +#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) +#define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) +#define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) +#define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) +#define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) +#define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) +#define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) +#define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) +#define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) +#define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) +#define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) +#define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) +#define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) +#define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) +#define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0) + +/* SDIO_Transfer_Direction */ +#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) +#define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002) + +/* SDIO_Transfer_Type */ +#define SDIO_TransferMode_Block ((uint32_t)0x00000000) +#define SDIO_TransferMode_Stream ((uint32_t)0x00000004) + +/* SDIO_DPSM_State */ +#define SDIO_DPSM_Disable ((uint32_t)0x00000000) +#define SDIO_DPSM_Enable ((uint32_t)0x00000001) + +/* SDIO_Flags */ +#define SDIO_FLAG_CCRCFAIL ((uint32_t)0x00000001) +#define SDIO_FLAG_DCRCFAIL ((uint32_t)0x00000002) +#define SDIO_FLAG_CTIMEOUT ((uint32_t)0x00000004) +#define SDIO_FLAG_DTIMEOUT ((uint32_t)0x00000008) +#define SDIO_FLAG_TXUNDERR ((uint32_t)0x00000010) +#define SDIO_FLAG_RXOVERR ((uint32_t)0x00000020) +#define SDIO_FLAG_CMDREND ((uint32_t)0x00000040) +#define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080) +#define SDIO_FLAG_DATAEND ((uint32_t)0x00000100) +#define SDIO_FLAG_STBITERR ((uint32_t)0x00000200) +#define SDIO_FLAG_DBCKEND ((uint32_t)0x00000400) +#define SDIO_FLAG_CMDACT ((uint32_t)0x00000800) +#define SDIO_FLAG_TXACT ((uint32_t)0x00001000) +#define SDIO_FLAG_RXACT ((uint32_t)0x00002000) +#define SDIO_FLAG_TXFIFOHE ((uint32_t)0x00004000) +#define SDIO_FLAG_RXFIFOHF ((uint32_t)0x00008000) +#define SDIO_FLAG_TXFIFOF ((uint32_t)0x00010000) +#define SDIO_FLAG_RXFIFOF ((uint32_t)0x00020000) +#define SDIO_FLAG_TXFIFOE ((uint32_t)0x00040000) +#define SDIO_FLAG_RXFIFOE ((uint32_t)0x00080000) +#define SDIO_FLAG_TXDAVL ((uint32_t)0x00100000) +#define SDIO_FLAG_RXDAVL ((uint32_t)0x00200000) +#define SDIO_FLAG_SDIOIT ((uint32_t)0x00400000) +#define SDIO_FLAG_CEATAEND ((uint32_t)0x00800000) + +/* SDIO_Read_Wait_Mode */ +#define SDIO_ReadWaitMode_CLK ((uint32_t)0x00000001) +#define SDIO_ReadWaitMode_DATA2 ((uint32_t)0x00000000) + +#define SDIO_DataControl_DTEN ((uint32_t)0x00000001) +#define SDIO_DataControl_DTDIR ((uint32_t)0x00000002) +#define SDIO_DataControl_DTMODE ((uint32_t)0x00000004) +#define SDIO_DataControl_DMAEN ((uint32_t)0x00000008) +#define SDIO_DataControl_DBLOCKSIZE ((uint32_t)0x000000F0) +#define SDIO_DataControl_RWSTART ((uint32_t)0x00000100) +#define SDIO_DataControl_RWSTOP ((uint32_t)0x00000200) +#define SDIO_DataControl_RWMOD ((uint32_t)0x00000400) +#define SDIO_DataControl_SDIOEN ((uint32_t)0x00000800) + + +void SDIO_DeInit(void); +void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct); +void SDIO_ClockCmd(FunctionalState NewState); +void SDIO_SetPowerState(uint32_t SDIO_PowerState); +uint32_t SDIO_GetPowerState(void); +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState); +void SDIO_DMACmd(FunctionalState NewState); +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct); +uint8_t SDIO_GetCommandResponse(void); +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); +void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct); +uint32_t SDIO_GetDataCounter(void); +uint32_t SDIO_ReadData(void); +void SDIO_WriteData(uint32_t Data); +uint32_t SDIO_GetFIFOCount(void); +void SDIO_StartSDIOReadWait(FunctionalState NewState); +void SDIO_StopSDIOReadWait(FunctionalState NewState); +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); +void SDIO_SetSDIOOperation(FunctionalState NewState); +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState); +void SDIO_CommandCompletionCmd(FunctionalState NewState); +void SDIO_CEATAITCmd(FunctionalState NewState); +void SDIO_SendCEATACmd(FunctionalState NewState); +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG); +void SDIO_ClearFlag(uint32_t SDIO_FLAG); +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT); +void SDIO_ClearITPendingBit(uint32_t SDIO_IT); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Peripheral/inc/ch32v30x_spi.h b/Peripheral/inc/ch32v30x_spi.h new file mode 100644 index 0000000..46493a5 --- /dev/null +++ b/Peripheral/inc/ch32v30x_spi.h @@ -0,0 +1,231 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_spi.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* SPI firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_SPI_H +#define __CH32V30x_SPI_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* SPI Init structure definition */ +typedef struct +{ + uint16_t SPI_Direction; /* Specifies the SPI unidirectional or bidirectional data mode. + This parameter can be a value of @ref SPI_data_direction */ + + uint16_t SPI_Mode; /* Specifies the SPI operating mode. + This parameter can be a value of @ref SPI_mode */ + + uint16_t SPI_DataSize; /* Specifies the SPI data size. + This parameter can be a value of @ref SPI_data_size */ + + uint16_t SPI_CPOL; /* Specifies the serial clock steady state. + This parameter can be a value of @ref SPI_Clock_Polarity */ + + uint16_t SPI_CPHA; /* Specifies the clock active edge for the bit capture. + This parameter can be a value of @ref SPI_Clock_Phase */ + + uint16_t SPI_NSS; /* Specifies whether the NSS signal is managed by + hardware (NSS pin) or by software using the SSI bit. + This parameter can be a value of @ref SPI_Slave_Select_management */ + + uint16_t SPI_BaudRatePrescaler; /* Specifies the Baud Rate prescaler value which will be + used to configure the transmit and receive SCK clock. + This parameter can be a value of @ref SPI_BaudRate_Prescaler. + @note The communication clock is derived from the master + clock. The slave clock does not need to be set. */ + + uint16_t SPI_FirstBit; /* Specifies whether data transfers start from MSB or LSB bit. + This parameter can be a value of @ref SPI_MSB_LSB_transmission */ + + uint16_t SPI_CRCPolynomial; /* Specifies the polynomial used for the CRC calculation. */ +}SPI_InitTypeDef; + +/* I2S Init structure definition */ +typedef struct +{ + + uint16_t I2S_Mode; /* Specifies the I2S operating mode. + This parameter can be a value of @ref I2S_Mode */ + + uint16_t I2S_Standard; /* Specifies the standard used for the I2S communication. + This parameter can be a value of @ref I2S_Standard */ + + uint16_t I2S_DataFormat; /* Specifies the data format for the I2S communication. + This parameter can be a value of @ref I2S_Data_Format */ + + uint16_t I2S_MCLKOutput; /* Specifies whether the I2S MCLK output is enabled or not. + This parameter can be a value of @ref I2S_MCLK_Output */ + + uint32_t I2S_AudioFreq; /* Specifies the frequency selected for the I2S communication. + This parameter can be a value of @ref I2S_Audio_Frequency */ + + uint16_t I2S_CPOL; /* Specifies the idle state of the I2S clock. + This parameter can be a value of @ref I2S_Clock_Polarity */ +}I2S_InitTypeDef; + +/* SPI_data_direction */ +#define SPI_Direction_2Lines_FullDuplex ((uint16_t)0x0000) +#define SPI_Direction_2Lines_RxOnly ((uint16_t)0x0400) +#define SPI_Direction_1Line_Rx ((uint16_t)0x8000) +#define SPI_Direction_1Line_Tx ((uint16_t)0xC000) + +/* SPI_mode */ +#define SPI_Mode_Master ((uint16_t)0x0104) +#define SPI_Mode_Slave ((uint16_t)0x0000) + +/* SPI_data_size */ +#define SPI_DataSize_16b ((uint16_t)0x0800) +#define SPI_DataSize_8b ((uint16_t)0x0000) + +/* SPI_Clock_Polarity */ +#define SPI_CPOL_Low ((uint16_t)0x0000) +#define SPI_CPOL_High ((uint16_t)0x0002) + +/* SPI_Clock_Phase */ +#define SPI_CPHA_1Edge ((uint16_t)0x0000) +#define SPI_CPHA_2Edge ((uint16_t)0x0001) + +/* SPI_Slave_Select_management */ +#define SPI_NSS_Soft ((uint16_t)0x0200) +#define SPI_NSS_Hard ((uint16_t)0x0000) + +/* SPI_BaudRate_Prescaler */ +#define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) +#define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) +#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) +#define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) +#define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) +#define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) +#define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) +#define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) + +/* SPI_MSB_LSB_transmission */ +#define SPI_FirstBit_MSB ((uint16_t)0x0000) +#define SPI_FirstBit_LSB ((uint16_t)0x0080) + +/* I2S_Mode */ +#define I2S_Mode_SlaveTx ((uint16_t)0x0000) +#define I2S_Mode_SlaveRx ((uint16_t)0x0100) +#define I2S_Mode_MasterTx ((uint16_t)0x0200) +#define I2S_Mode_MasterRx ((uint16_t)0x0300) + +/* I2S_Standard */ +#define I2S_Standard_Phillips ((uint16_t)0x0000) +#define I2S_Standard_MSB ((uint16_t)0x0010) +#define I2S_Standard_LSB ((uint16_t)0x0020) +#define I2S_Standard_PCMShort ((uint16_t)0x0030) +#define I2S_Standard_PCMLong ((uint16_t)0x00B0) + +/* I2S_Data_Format */ +#define I2S_DataFormat_16b ((uint16_t)0x0000) +#define I2S_DataFormat_16bextended ((uint16_t)0x0001) +#define I2S_DataFormat_24b ((uint16_t)0x0003) +#define I2S_DataFormat_32b ((uint16_t)0x0005) + +/* I2S_MCLK_Output */ +#define I2S_MCLKOutput_Enable ((uint16_t)0x0200) +#define I2S_MCLKOutput_Disable ((uint16_t)0x0000) + +/* I2S_Audio_Frequency */ +#define I2S_AudioFreq_192k ((uint32_t)192000) +#define I2S_AudioFreq_96k ((uint32_t)96000) +#define I2S_AudioFreq_48k ((uint32_t)48000) +#define I2S_AudioFreq_44k ((uint32_t)44100) +#define I2S_AudioFreq_32k ((uint32_t)32000) +#define I2S_AudioFreq_22k ((uint32_t)22050) +#define I2S_AudioFreq_16k ((uint32_t)16000) +#define I2S_AudioFreq_11k ((uint32_t)11025) +#define I2S_AudioFreq_8k ((uint32_t)8000) +#define I2S_AudioFreq_Default ((uint32_t)2) + +/* I2S_Clock_Polarity */ +#define I2S_CPOL_Low ((uint16_t)0x0000) +#define I2S_CPOL_High ((uint16_t)0x0008) + +/* SPI_I2S_DMA_transfer_requests */ +#define SPI_I2S_DMAReq_Tx ((uint16_t)0x0002) +#define SPI_I2S_DMAReq_Rx ((uint16_t)0x0001) + +/* SPI_NSS_internal_software_management */ +#define SPI_NSSInternalSoft_Set ((uint16_t)0x0100) +#define SPI_NSSInternalSoft_Reset ((uint16_t)0xFEFF) + +/* SPI_CRC_Transmit_Receive */ +#define SPI_CRC_Tx ((uint8_t)0x00) +#define SPI_CRC_Rx ((uint8_t)0x01) + +/* SPI_direction_transmit_receive */ +#define SPI_Direction_Rx ((uint16_t)0xBFFF) +#define SPI_Direction_Tx ((uint16_t)0x4000) + +/* SPI_I2S_interrupts_definition */ +#define SPI_I2S_IT_TXE ((uint8_t)0x71) +#define SPI_I2S_IT_RXNE ((uint8_t)0x60) +#define SPI_I2S_IT_ERR ((uint8_t)0x50) +#define SPI_I2S_IT_OVR ((uint8_t)0x56) +#define SPI_IT_MODF ((uint8_t)0x55) +#define SPI_IT_CRCERR ((uint8_t)0x54) +#define I2S_IT_UDR ((uint8_t)0x53) + +/* SPI_I2S_flags_definition */ +#define SPI_I2S_FLAG_RXNE ((uint16_t)0x0001) +#define SPI_I2S_FLAG_TXE ((uint16_t)0x0002) +#define I2S_FLAG_CHSIDE ((uint16_t)0x0004) +#define I2S_FLAG_UDR ((uint16_t)0x0008) +#define SPI_FLAG_CRCERR ((uint16_t)0x0010) +#define SPI_FLAG_MODF ((uint16_t)0x0020) +#define SPI_I2S_FLAG_OVR ((uint16_t)0x0040) +#define SPI_I2S_FLAG_BSY ((uint16_t)0x0080) + + +void SPI_I2S_DeInit(SPI_TypeDef* SPIx); +void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); +void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); +void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); +void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct); +void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); +void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); +void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft); +void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState); +void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); +void SPI_TransmitCRC(SPI_TypeDef* SPIx); +void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState); +uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC); +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx); +void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction); +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); +void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + + + diff --git a/Peripheral/inc/ch32v30x_tim.h b/Peripheral/inc/ch32v30x_tim.h new file mode 100644 index 0000000..06f36d0 --- /dev/null +++ b/Peripheral/inc/ch32v30x_tim.h @@ -0,0 +1,517 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_tim.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the +* TIM firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_TIM_H +#define __CH32V30x_TIM_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + +/* TIM Time Base Init structure definition */ +typedef struct +{ + uint16_t TIM_Prescaler; /* Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_CounterMode; /* Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint16_t TIM_Period; /* Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter must be a number between 0x0000 and 0xFFFF. */ + + uint16_t TIM_ClockDivision; /* Specifies the clock division. + This parameter can be a value of @ref TIM_Clock_Division_CKD */ + + uint8_t TIM_RepetitionCounter; /* Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + This parameter must be a number between 0x00 and 0xFF. + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_TimeBaseInitTypeDef; + +/* TIM Output Compare Init structure definition */ +typedef struct +{ + uint16_t TIM_OCMode; /* Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint16_t TIM_OutputState; /* Specifies the TIM Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_state */ + + uint16_t TIM_OutputNState; /* Specifies the TIM complementary Output Compare state. + This parameter can be a value of @ref TIM_Output_Compare_N_state + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_Pulse; /* Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between 0x0000 and 0xFFFF */ + + uint16_t TIM_OCPolarity; /* Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint16_t TIM_OCNPolarity; /* Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCIdleState; /* Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ + + uint16_t TIM_OCNIdleState; /* Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for TIM1 and TIM8. */ +} TIM_OCInitTypeDef; + +/* TIM Input Capture Init structure definition */ +typedef struct +{ + uint16_t TIM_Channel; /* Specifies the TIM channel. + This parameter can be a value of @ref TIM_Channel */ + + uint16_t TIM_ICPolarity; /* Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint16_t TIM_ICSelection; /* Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint16_t TIM_ICPrescaler; /* Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint16_t TIM_ICFilter; /* Specifies the input capture filter. + This parameter can be a number between 0x0 and 0xF */ +} TIM_ICInitTypeDef; + +/* BDTR structure definition */ +typedef struct +{ + uint16_t TIM_OSSRState; /* Specifies the Off-State selection used in Run mode. + This parameter can be a value of @ref OSSR_Off_State_Selection_for_Run_mode_state */ + + uint16_t TIM_OSSIState; /* Specifies the Off-State used in Idle state. + This parameter can be a value of @ref OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint16_t TIM_LOCKLevel; /* Specifies the LOCK level parameters. + This parameter can be a value of @ref Lock_level */ + + uint16_t TIM_DeadTime; /* Specifies the delay time between the switching-off and the + switching-on of the outputs. + This parameter can be a number between 0x00 and 0xFF */ + + uint16_t TIM_Break; /* Specifies whether the TIM Break input is enabled or not. + This parameter can be a value of @ref Break_Input_enable_disable */ + + uint16_t TIM_BreakPolarity; /* Specifies the TIM Break Input pin polarity. + This parameter can be a value of @ref Break_Polarity */ + + uint16_t TIM_AutomaticOutput; /* Specifies whether the TIM Automatic Output feature is enabled or not. + This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ +} TIM_BDTRInitTypeDef; + +/* TIM_Output_Compare_and_PWM_modes */ +#define TIM_OCMode_Timing ((uint16_t)0x0000) +#define TIM_OCMode_Active ((uint16_t)0x0010) +#define TIM_OCMode_Inactive ((uint16_t)0x0020) +#define TIM_OCMode_Toggle ((uint16_t)0x0030) +#define TIM_OCMode_PWM1 ((uint16_t)0x0060) +#define TIM_OCMode_PWM2 ((uint16_t)0x0070) + +/* TIM_One_Pulse_Mode */ +#define TIM_OPMode_Single ((uint16_t)0x0008) +#define TIM_OPMode_Repetitive ((uint16_t)0x0000) + +/* TIM_Channel */ +#define TIM_Channel_1 ((uint16_t)0x0000) +#define TIM_Channel_2 ((uint16_t)0x0004) +#define TIM_Channel_3 ((uint16_t)0x0008) +#define TIM_Channel_4 ((uint16_t)0x000C) + +/* TIM_Clock_Division_CKD */ +#define TIM_CKD_DIV1 ((uint16_t)0x0000) +#define TIM_CKD_DIV2 ((uint16_t)0x0100) +#define TIM_CKD_DIV4 ((uint16_t)0x0200) + +/* TIM_Counter_Mode */ +#define TIM_CounterMode_Up ((uint16_t)0x0000) +#define TIM_CounterMode_Down ((uint16_t)0x0010) +#define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) +#define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) +#define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) + +/* TIM_Output_Compare_Polarity */ +#define TIM_OCPolarity_High ((uint16_t)0x0000) +#define TIM_OCPolarity_Low ((uint16_t)0x0002) + +/* TIM_Output_Compare_N_Polarity */ +#define TIM_OCNPolarity_High ((uint16_t)0x0000) +#define TIM_OCNPolarity_Low ((uint16_t)0x0008) + +/* TIM_Output_Compare_state */ +#define TIM_OutputState_Disable ((uint16_t)0x0000) +#define TIM_OutputState_Enable ((uint16_t)0x0001) + +/* TIM_Output_Compare_N_state */ +#define TIM_OutputNState_Disable ((uint16_t)0x0000) +#define TIM_OutputNState_Enable ((uint16_t)0x0004) + +/* TIM_Capture_Compare_state */ +#define TIM_CCx_Enable ((uint16_t)0x0001) +#define TIM_CCx_Disable ((uint16_t)0x0000) + +/* TIM_Capture_Compare_N_state */ +#define TIM_CCxN_Enable ((uint16_t)0x0004) +#define TIM_CCxN_Disable ((uint16_t)0x0000) + +/* Break_Input_enable_disable */ +#define TIM_Break_Enable ((uint16_t)0x1000) +#define TIM_Break_Disable ((uint16_t)0x0000) + +/* Break_Polarity */ +#define TIM_BreakPolarity_Low ((uint16_t)0x0000) +#define TIM_BreakPolarity_High ((uint16_t)0x2000) + +/* TIM_AOE_Bit_Set_Reset */ +#define TIM_AutomaticOutput_Enable ((uint16_t)0x4000) +#define TIM_AutomaticOutput_Disable ((uint16_t)0x0000) + +/* Lock_level */ +#define TIM_LOCKLevel_OFF ((uint16_t)0x0000) +#define TIM_LOCKLevel_1 ((uint16_t)0x0100) +#define TIM_LOCKLevel_2 ((uint16_t)0x0200) +#define TIM_LOCKLevel_3 ((uint16_t)0x0300) + +/* OSSI_Off_State_Selection_for_Idle_mode_state */ +#define TIM_OSSIState_Enable ((uint16_t)0x0400) +#define TIM_OSSIState_Disable ((uint16_t)0x0000) + +/* OSSR_Off_State_Selection_for_Run_mode_state */ +#define TIM_OSSRState_Enable ((uint16_t)0x0800) +#define TIM_OSSRState_Disable ((uint16_t)0x0000) + +/* TIM_Output_Compare_Idle_State */ +#define TIM_OCIdleState_Set ((uint16_t)0x0100) +#define TIM_OCIdleState_Reset ((uint16_t)0x0000) + +/* TIM_Output_Compare_N_Idle_State */ +#define TIM_OCNIdleState_Set ((uint16_t)0x0200) +#define TIM_OCNIdleState_Reset ((uint16_t)0x0000) + +/* TIM_Input_Capture_Polarity */ +#define TIM_ICPolarity_Rising ((uint16_t)0x0000) +#define TIM_ICPolarity_Falling ((uint16_t)0x0002) +#define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) + +/* TIM_Input_Capture_Selection */ +#define TIM_ICSelection_DirectTI ((uint16_t)0x0001) /* TIM Input 1, 2, 3 or 4 is selected to be + connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSelection_IndirectTI ((uint16_t)0x0002) /* TIM Input 1, 2, 3 or 4 is selected to be + connected to IC2, IC1, IC4 or IC3, respectively. */ +#define TIM_ICSelection_TRC ((uint16_t)0x0003) /* TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */ + +/* TIM_Input_Capture_Prescaler */ +#define TIM_ICPSC_DIV1 ((uint16_t)0x0000) /* Capture performed each time an edge is detected on the capture input. */ +#define TIM_ICPSC_DIV2 ((uint16_t)0x0004) /* Capture performed once every 2 events. */ +#define TIM_ICPSC_DIV4 ((uint16_t)0x0008) /* Capture performed once every 4 events. */ +#define TIM_ICPSC_DIV8 ((uint16_t)0x000C) /* Capture performed once every 8 events. */ + +/* TIM_interrupt_sources */ +#define TIM_IT_Update ((uint16_t)0x0001) +#define TIM_IT_CC1 ((uint16_t)0x0002) +#define TIM_IT_CC2 ((uint16_t)0x0004) +#define TIM_IT_CC3 ((uint16_t)0x0008) +#define TIM_IT_CC4 ((uint16_t)0x0010) +#define TIM_IT_COM ((uint16_t)0x0020) +#define TIM_IT_Trigger ((uint16_t)0x0040) +#define TIM_IT_Break ((uint16_t)0x0080) + +/* TIM_DMA_Base_address */ +#define TIM_DMABase_CR1 ((uint16_t)0x0000) +#define TIM_DMABase_CR2 ((uint16_t)0x0001) +#define TIM_DMABase_SMCR ((uint16_t)0x0002) +#define TIM_DMABase_DIER ((uint16_t)0x0003) +#define TIM_DMABase_SR ((uint16_t)0x0004) +#define TIM_DMABase_EGR ((uint16_t)0x0005) +#define TIM_DMABase_CCMR1 ((uint16_t)0x0006) +#define TIM_DMABase_CCMR2 ((uint16_t)0x0007) +#define TIM_DMABase_CCER ((uint16_t)0x0008) +#define TIM_DMABase_CNT ((uint16_t)0x0009) +#define TIM_DMABase_PSC ((uint16_t)0x000A) +#define TIM_DMABase_ARR ((uint16_t)0x000B) +#define TIM_DMABase_RCR ((uint16_t)0x000C) +#define TIM_DMABase_CCR1 ((uint16_t)0x000D) +#define TIM_DMABase_CCR2 ((uint16_t)0x000E) +#define TIM_DMABase_CCR3 ((uint16_t)0x000F) +#define TIM_DMABase_CCR4 ((uint16_t)0x0010) +#define TIM_DMABase_BDTR ((uint16_t)0x0011) +#define TIM_DMABase_DCR ((uint16_t)0x0012) + +/* TIM_DMA_Burst_Length */ +#define TIM_DMABurstLength_1Transfer ((uint16_t)0x0000) +#define TIM_DMABurstLength_2Transfers ((uint16_t)0x0100) +#define TIM_DMABurstLength_3Transfers ((uint16_t)0x0200) +#define TIM_DMABurstLength_4Transfers ((uint16_t)0x0300) +#define TIM_DMABurstLength_5Transfers ((uint16_t)0x0400) +#define TIM_DMABurstLength_6Transfers ((uint16_t)0x0500) +#define TIM_DMABurstLength_7Transfers ((uint16_t)0x0600) +#define TIM_DMABurstLength_8Transfers ((uint16_t)0x0700) +#define TIM_DMABurstLength_9Transfers ((uint16_t)0x0800) +#define TIM_DMABurstLength_10Transfers ((uint16_t)0x0900) +#define TIM_DMABurstLength_11Transfers ((uint16_t)0x0A00) +#define TIM_DMABurstLength_12Transfers ((uint16_t)0x0B00) +#define TIM_DMABurstLength_13Transfers ((uint16_t)0x0C00) +#define TIM_DMABurstLength_14Transfers ((uint16_t)0x0D00) +#define TIM_DMABurstLength_15Transfers ((uint16_t)0x0E00) +#define TIM_DMABurstLength_16Transfers ((uint16_t)0x0F00) +#define TIM_DMABurstLength_17Transfers ((uint16_t)0x1000) +#define TIM_DMABurstLength_18Transfers ((uint16_t)0x1100) + +/* TIM_DMA_sources */ +#define TIM_DMA_Update ((uint16_t)0x0100) +#define TIM_DMA_CC1 ((uint16_t)0x0200) +#define TIM_DMA_CC2 ((uint16_t)0x0400) +#define TIM_DMA_CC3 ((uint16_t)0x0800) +#define TIM_DMA_CC4 ((uint16_t)0x1000) +#define TIM_DMA_COM ((uint16_t)0x2000) +#define TIM_DMA_Trigger ((uint16_t)0x4000) + +/* TIM_External_Trigger_Prescaler */ +#define TIM_ExtTRGPSC_OFF ((uint16_t)0x0000) +#define TIM_ExtTRGPSC_DIV2 ((uint16_t)0x1000) +#define TIM_ExtTRGPSC_DIV4 ((uint16_t)0x2000) +#define TIM_ExtTRGPSC_DIV8 ((uint16_t)0x3000) + +/* TIM_Internal_Trigger_Selection */ +#define TIM_TS_ITR0 ((uint16_t)0x0000) +#define TIM_TS_ITR1 ((uint16_t)0x0010) +#define TIM_TS_ITR2 ((uint16_t)0x0020) +#define TIM_TS_ITR3 ((uint16_t)0x0030) +#define TIM_TS_TI1F_ED ((uint16_t)0x0040) +#define TIM_TS_TI1FP1 ((uint16_t)0x0050) +#define TIM_TS_TI2FP2 ((uint16_t)0x0060) +#define TIM_TS_ETRF ((uint16_t)0x0070) + +/* TIM_TIx_External_Clock_Source */ +#define TIM_TIxExternalCLK1Source_TI1 ((uint16_t)0x0050) +#define TIM_TIxExternalCLK1Source_TI2 ((uint16_t)0x0060) +#define TIM_TIxExternalCLK1Source_TI1ED ((uint16_t)0x0040) + +/* TIM_External_Trigger_Polarity */ +#define TIM_ExtTRGPolarity_Inverted ((uint16_t)0x8000) +#define TIM_ExtTRGPolarity_NonInverted ((uint16_t)0x0000) + +/* TIM_Prescaler_Reload_Mode */ +#define TIM_PSCReloadMode_Update ((uint16_t)0x0000) +#define TIM_PSCReloadMode_Immediate ((uint16_t)0x0001) + +/* TIM_Forced_Action */ +#define TIM_ForcedAction_Active ((uint16_t)0x0050) +#define TIM_ForcedAction_InActive ((uint16_t)0x0040) + +/* TIM_Encoder_Mode */ +#define TIM_EncoderMode_TI1 ((uint16_t)0x0001) +#define TIM_EncoderMode_TI2 ((uint16_t)0x0002) +#define TIM_EncoderMode_TI12 ((uint16_t)0x0003) + +/* TIM_Event_Source */ +#define TIM_EventSource_Update ((uint16_t)0x0001) +#define TIM_EventSource_CC1 ((uint16_t)0x0002) +#define TIM_EventSource_CC2 ((uint16_t)0x0004) +#define TIM_EventSource_CC3 ((uint16_t)0x0008) +#define TIM_EventSource_CC4 ((uint16_t)0x0010) +#define TIM_EventSource_COM ((uint16_t)0x0020) +#define TIM_EventSource_Trigger ((uint16_t)0x0040) +#define TIM_EventSource_Break ((uint16_t)0x0080) + +/* TIM_Update_Source */ +#define TIM_UpdateSource_Global ((uint16_t)0x0000) /* Source of update is the counter overflow/underflow + or the setting of UG bit, or an update generation + through the slave mode controller. */ +#define TIM_UpdateSource_Regular ((uint16_t)0x0001) /* Source of update is counter overflow/underflow. */ + +/* TIM_Output_Compare_Preload_State */ +#define TIM_OCPreload_Enable ((uint16_t)0x0008) +#define TIM_OCPreload_Disable ((uint16_t)0x0000) + +/* TIM_Output_Compare_Fast_State */ +#define TIM_OCFast_Enable ((uint16_t)0x0004) +#define TIM_OCFast_Disable ((uint16_t)0x0000) + +/* TIM_Output_Compare_Clear_State */ +#define TIM_OCClear_Enable ((uint16_t)0x0080) +#define TIM_OCClear_Disable ((uint16_t)0x0000) + +/* TIM_Trigger_Output_Source */ +#define TIM_TRGOSource_Reset ((uint16_t)0x0000) +#define TIM_TRGOSource_Enable ((uint16_t)0x0010) +#define TIM_TRGOSource_Update ((uint16_t)0x0020) +#define TIM_TRGOSource_OC1 ((uint16_t)0x0030) +#define TIM_TRGOSource_OC1Ref ((uint16_t)0x0040) +#define TIM_TRGOSource_OC2Ref ((uint16_t)0x0050) +#define TIM_TRGOSource_OC3Ref ((uint16_t)0x0060) +#define TIM_TRGOSource_OC4Ref ((uint16_t)0x0070) + +/* TIM_Slave_Mode */ +#define TIM_SlaveMode_Reset ((uint16_t)0x0004) +#define TIM_SlaveMode_Gated ((uint16_t)0x0005) +#define TIM_SlaveMode_Trigger ((uint16_t)0x0006) +#define TIM_SlaveMode_External1 ((uint16_t)0x0007) + +/* TIM_Master_Slave_Mode */ +#define TIM_MasterSlaveMode_Enable ((uint16_t)0x0080) +#define TIM_MasterSlaveMode_Disable ((uint16_t)0x0000) + +/* TIM_Flags */ +#define TIM_FLAG_Update ((uint16_t)0x0001) +#define TIM_FLAG_CC1 ((uint16_t)0x0002) +#define TIM_FLAG_CC2 ((uint16_t)0x0004) +#define TIM_FLAG_CC3 ((uint16_t)0x0008) +#define TIM_FLAG_CC4 ((uint16_t)0x0010) +#define TIM_FLAG_COM ((uint16_t)0x0020) +#define TIM_FLAG_Trigger ((uint16_t)0x0040) +#define TIM_FLAG_Break ((uint16_t)0x0080) +#define TIM_FLAG_CC1OF ((uint16_t)0x0200) +#define TIM_FLAG_CC2OF ((uint16_t)0x0400) +#define TIM_FLAG_CC3OF ((uint16_t)0x0800) +#define TIM_FLAG_CC4OF ((uint16_t)0x1000) + +/* TIM_Legacy */ +#define TIM_DMABurstLength_1Byte TIM_DMABurstLength_1Transfer +#define TIM_DMABurstLength_2Bytes TIM_DMABurstLength_2Transfers +#define TIM_DMABurstLength_3Bytes TIM_DMABurstLength_3Transfers +#define TIM_DMABurstLength_4Bytes TIM_DMABurstLength_4Transfers +#define TIM_DMABurstLength_5Bytes TIM_DMABurstLength_5Transfers +#define TIM_DMABurstLength_6Bytes TIM_DMABurstLength_6Transfers +#define TIM_DMABurstLength_7Bytes TIM_DMABurstLength_7Transfers +#define TIM_DMABurstLength_8Bytes TIM_DMABurstLength_8Transfers +#define TIM_DMABurstLength_9Bytes TIM_DMABurstLength_9Transfers +#define TIM_DMABurstLength_10Bytes TIM_DMABurstLength_10Transfers +#define TIM_DMABurstLength_11Bytes TIM_DMABurstLength_11Transfers +#define TIM_DMABurstLength_12Bytes TIM_DMABurstLength_12Transfers +#define TIM_DMABurstLength_13Bytes TIM_DMABurstLength_13Transfers +#define TIM_DMABurstLength_14Bytes TIM_DMABurstLength_14Transfers +#define TIM_DMABurstLength_15Bytes TIM_DMABurstLength_15Transfers +#define TIM_DMABurstLength_16Bytes TIM_DMABurstLength_16Transfers +#define TIM_DMABurstLength_17Bytes TIM_DMABurstLength_17Transfers +#define TIM_DMABurstLength_18Bytes TIM_DMABurstLength_18Transfers + + +void TIM_DeInit(TIM_TypeDef* TIMx); +void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct); +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); +void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct); +void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct); +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct); +void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); +void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource); +void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength); +void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState); +void TIM_InternalClockConfig(TIM_TypeDef* TIMx); +void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter); +void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); +void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter); +void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); +void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); +void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); +void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity); +void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction); +void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); +void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast); +void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear); +void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity); +void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity); +void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); +void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN); +void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode); +void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource); +void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState); +void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode); +void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource); +void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode); +void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode); +void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter); +void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload); +void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); +void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2); +void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3); +void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4); +void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC); +void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD); +uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx); +uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx); +uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); +uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); +FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG); +ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT); +void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + + diff --git a/Peripheral/inc/ch32v30x_usart.h b/Peripheral/inc/ch32v30x_usart.h new file mode 100644 index 0000000..8dc9bb7 --- /dev/null +++ b/Peripheral/inc/ch32v30x_usart.h @@ -0,0 +1,195 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_usart.h +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file contains all the functions prototypes for the +* USART firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_USART_H +#define __CH32V30x_USART_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + + +/* USART Init Structure definition */ +typedef struct +{ + uint32_t USART_BaudRate; /* This member configures the USART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate))) + - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */ + + uint16_t USART_WordLength; /* Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_Word_Length */ + + uint16_t USART_StopBits; /* Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_Stop_Bits */ + + uint16_t USART_Parity; /* Specifies the parity mode. + This parameter can be a value of @ref USART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint16_t USART_Mode; /* Specifies wether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_Mode */ + + uint16_t USART_HardwareFlowControl; /* Specifies wether the hardware flow control mode is enabled + or disabled. + This parameter can be a value of @ref USART_Hardware_Flow_Control */ +} USART_InitTypeDef; + +/* USART Clock Init Structure definition */ +typedef struct +{ + + uint16_t USART_Clock; /* Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_Clock */ + + uint16_t USART_CPOL; /* Specifies the steady state value of the serial clock. + This parameter can be a value of @ref USART_Clock_Polarity */ + + uint16_t USART_CPHA; /* Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_Clock_Phase */ + + uint16_t USART_LastBit; /* Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. + This parameter can be a value of @ref USART_Last_Bit */ +} USART_ClockInitTypeDef; + +/* USART_Word_Length */ +#define USART_WordLength_8b ((uint16_t)0x0000) +#define USART_WordLength_9b ((uint16_t)0x1000) + +/* USART_Stop_Bits */ +#define USART_StopBits_1 ((uint16_t)0x0000) +#define USART_StopBits_0_5 ((uint16_t)0x1000) +#define USART_StopBits_2 ((uint16_t)0x2000) +#define USART_StopBits_1_5 ((uint16_t)0x3000) + +/* USART_Parity */ +#define USART_Parity_No ((uint16_t)0x0000) +#define USART_Parity_Even ((uint16_t)0x0400) +#define USART_Parity_Odd ((uint16_t)0x0600) + +/* USART_Mode */ +#define USART_Mode_Rx ((uint16_t)0x0004) +#define USART_Mode_Tx ((uint16_t)0x0008) + +/* USART_Hardware_Flow_Control */ +#define USART_HardwareFlowControl_None ((uint16_t)0x0000) +#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) +#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) +#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) + +/* USART_Clock */ +#define USART_Clock_Disable ((uint16_t)0x0000) +#define USART_Clock_Enable ((uint16_t)0x0800) + +/* USART_Clock_Polarity */ +#define USART_CPOL_Low ((uint16_t)0x0000) +#define USART_CPOL_High ((uint16_t)0x0400) + +/* USART_Clock_Phase */ +#define USART_CPHA_1Edge ((uint16_t)0x0000) +#define USART_CPHA_2Edge ((uint16_t)0x0200) + +/* USART_Last_Bit */ +#define USART_LastBit_Disable ((uint16_t)0x0000) +#define USART_LastBit_Enable ((uint16_t)0x0100) + +/* USART_Interrupt_definition */ +#define USART_IT_PE ((uint16_t)0x0028) +#define USART_IT_TXE ((uint16_t)0x0727) +#define USART_IT_TC ((uint16_t)0x0626) +#define USART_IT_RXNE ((uint16_t)0x0525) +#define USART_IT_ORE_RX ((uint16_t)0x0325) +#define USART_IT_IDLE ((uint16_t)0x0424) +#define USART_IT_LBD ((uint16_t)0x0846) +#define USART_IT_CTS ((uint16_t)0x096A) +#define USART_IT_ERR ((uint16_t)0x0060) +#define USART_IT_ORE_ER ((uint16_t)0x0360) +#define USART_IT_NE ((uint16_t)0x0260) +#define USART_IT_FE ((uint16_t)0x0160) + +#define USART_IT_ORE USART_IT_ORE_ER + +/* USART_DMA_Requests */ +#define USART_DMAReq_Tx ((uint16_t)0x0080) +#define USART_DMAReq_Rx ((uint16_t)0x0040) + +/* USART_WakeUp_methods */ +#define USART_WakeUp_IdleLine ((uint16_t)0x0000) +#define USART_WakeUp_AddressMark ((uint16_t)0x0800) + +/* USART_LIN_Break_Detection_Length */ +#define USART_LINBreakDetectLength_10b ((uint16_t)0x0000) +#define USART_LINBreakDetectLength_11b ((uint16_t)0x0020) + +/* USART_IrDA_Low_Power */ +#define USART_IrDAMode_LowPower ((uint16_t)0x0004) +#define USART_IrDAMode_Normal ((uint16_t)0x0000) + +/* USART_Flags */ +#define USART_FLAG_CTS ((uint16_t)0x0200) +#define USART_FLAG_LBD ((uint16_t)0x0100) +#define USART_FLAG_TXE ((uint16_t)0x0080) +#define USART_FLAG_TC ((uint16_t)0x0040) +#define USART_FLAG_RXNE ((uint16_t)0x0020) +#define USART_FLAG_IDLE ((uint16_t)0x0010) +#define USART_FLAG_ORE ((uint16_t)0x0008) +#define USART_FLAG_NE ((uint16_t)0x0004) +#define USART_FLAG_FE ((uint16_t)0x0002) +#define USART_FLAG_PE ((uint16_t)0x0001) + + +void USART_DeInit(USART_TypeDef* USARTx); +void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); +void USART_StructInit(USART_InitTypeDef* USART_InitStruct); +void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct); +void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState); +void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState); +void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address); +void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp); +void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength); +void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); +uint16_t USART_ReceiveData(USART_TypeDef* USARTx); +void USART_SendBreak(USART_TypeDef* USARTx); +void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime); +void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler); +void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState); +void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode); +void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState); +FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); +void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG); +ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT); +void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); + +#ifdef __cplusplus +} +#endif + +#endif + + + + + + + diff --git a/Peripheral/inc/ch32v30x_usb.h b/Peripheral/inc/ch32v30x_usb.h new file mode 100644 index 0000000..2fb5475 --- /dev/null +++ b/Peripheral/inc/ch32v30x_usb.h @@ -0,0 +1,834 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : system_ch32v30x.h +* Author : WCH +* Version : V1.0.0 +* Date : 2024/05/22 +* Description : CH32V30x Device Peripheral Access Layer System Header File. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ + +#ifndef __CH32V30x_USB_H +#define __CH32V30x_USB_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*******************************************************************************/ +/* Header File */ +#include "stdint.h" + +/*******************************************************************************/ +/* USB Communication Related Macro Definition */ +/* USB Endpoint0 Size */ +#ifndef DEFAULT_ENDP0_SIZE +#define DEFAULT_ENDP0_SIZE 8 // default maximum packet size for endpoint 0 +#endif +#ifndef MAX_PACKET_SIZE +#define MAX_PACKET_SIZE 64 // maximum packet size +#endif + +/* USB PID */ +#ifndef USB_PID_SETUP +#define USB_PID_NULL 0x00 +#define USB_PID_SOF 0x05 +#define USB_PID_SETUP 0x0D +#define USB_PID_IN 0x09 +#define USB_PID_OUT 0x01 +#define USB_PID_NYET 0x06 +#define USB_PID_ACK 0x02 +#define USB_PID_NAK 0x0A +#define USB_PID_STALL 0x0E +#define USB_PID_DATA0 0x03 +#define USB_PID_DATA1 0x0B +#define USB_PID_DATA2 0x07 +#define USB_PID_MDATA 0x0F +#define USB_PID_PRE 0x0C +#endif + +/* USB standard device request code */ +#ifndef USB_GET_DESCRIPTOR +#define USB_GET_STATUS 0x00 +#define USB_CLEAR_FEATURE 0x01 +#define USB_SET_FEATURE 0x03 +#define USB_SET_ADDRESS 0x05 +#define USB_GET_DESCRIPTOR 0x06 +#define USB_SET_DESCRIPTOR 0x07 +#define USB_GET_CONFIGURATION 0x08 +#define USB_SET_CONFIGURATION 0x09 +#define USB_GET_INTERFACE 0x0A +#define USB_SET_INTERFACE 0x0B +#define USB_SYNCH_FRAME 0x0C +#endif + +#define DEF_STRING_DESC_LANG 0x00 +#define DEF_STRING_DESC_MANU 0x01 +#define DEF_STRING_DESC_PROD 0x02 +#define DEF_STRING_DESC_SERN 0x03 + +/* USB hub class request code */ +#ifndef HUB_GET_DESCRIPTOR +#define HUB_GET_STATUS 0x00 +#define HUB_CLEAR_FEATURE 0x01 +#define HUB_GET_STATE 0x02 +#define HUB_SET_FEATURE 0x03 +#define HUB_GET_DESCRIPTOR 0x06 +#define HUB_SET_DESCRIPTOR 0x07 +#endif + +/* USB HID class request code */ +#ifndef HID_GET_REPORT +#define HID_GET_REPORT 0x01 +#define HID_GET_IDLE 0x02 +#define HID_GET_PROTOCOL 0x03 +#define HID_SET_REPORT 0x09 +#define HID_SET_IDLE 0x0A +#define HID_SET_PROTOCOL 0x0B +#endif + +/* USB CDC Class request code */ +#ifndef CDC_GET_LINE_CODING +#define CDC_GET_LINE_CODING 0x21 /* This request allows the host to find out the currently configured line coding */ +#define CDC_SET_LINE_CODING 0x20 /* Configures DTE rate, stop-bits, parity, and number-of-character */ +#define CDC_SET_LINE_CTLSTE 0x22 /* This request generates RS-232/V.24 style control signals */ +#define CDC_SEND_BREAK 0x23 /* Sends special carrier modulation used to specify RS-232 style break */ +#endif + +/* Bit Define for USB Request Type */ +#ifndef USB_REQ_TYP_MASK +#define USB_REQ_TYP_IN 0x80 +#define USB_REQ_TYP_OUT 0x00 +#define USB_REQ_TYP_READ 0x80 +#define USB_REQ_TYP_WRITE 0x00 +#define USB_REQ_TYP_MASK 0x60 +#define USB_REQ_TYP_STANDARD 0x00 +#define USB_REQ_TYP_CLASS 0x20 +#define USB_REQ_TYP_VENDOR 0x40 +#define USB_REQ_TYP_RESERVED 0x60 +#define USB_REQ_RECIP_MASK 0x1F +#define USB_REQ_RECIP_DEVICE 0x00 +#define USB_REQ_RECIP_INTERF 0x01 +#define USB_REQ_RECIP_ENDP 0x02 +#define USB_REQ_RECIP_OTHER 0x03 +#define USB_REQ_FEAT_REMOTE_WAKEUP 0x01 +#define USB_REQ_FEAT_ENDP_HALT 0x00 +#endif + +/* USB Descriptor Type */ +#ifndef USB_DESCR_TYP_DEVICE +#define USB_DESCR_TYP_DEVICE 0x01 +#define USB_DESCR_TYP_CONFIG 0x02 +#define USB_DESCR_TYP_STRING 0x03 +#define USB_DESCR_TYP_INTERF 0x04 +#define USB_DESCR_TYP_ENDP 0x05 +#define USB_DESCR_TYP_QUALIF 0x06 +#define USB_DESCR_TYP_SPEED 0x07 +#define USB_DESCR_TYP_OTG 0x09 +#define USB_DESCR_TYP_BOS 0X0F +#define USB_DESCR_TYP_HID 0x21 +#define USB_DESCR_TYP_REPORT 0x22 +#define USB_DESCR_TYP_PHYSIC 0x23 +#define USB_DESCR_TYP_CS_INTF 0x24 +#define USB_DESCR_TYP_CS_ENDP 0x25 +#define USB_DESCR_TYP_HUB 0x29 +#endif + +/* USB Device Class */ +#ifndef USB_DEV_CLASS_HUB +#define USB_DEV_CLASS_RESERVED 0x00 +#define USB_DEV_CLASS_AUDIO 0x01 +#define USB_DEV_CLASS_COMMUNIC 0x02 +#define USB_DEV_CLASS_HID 0x03 +#define USB_DEV_CLASS_MONITOR 0x04 +#define USB_DEV_CLASS_PHYSIC_IF 0x05 +#define USB_DEV_CLASS_POWER 0x06 +#define USB_DEV_CLASS_IMAGE 0x06 +#define USB_DEV_CLASS_PRINTER 0x07 +#define USB_DEV_CLASS_STORAGE 0x08 +#define USB_DEV_CLASS_HUB 0x09 +#define USB_DEV_CLASS_VEN_SPEC 0xFF +#endif + +/* USB Hub Class Request */ +#ifndef HUB_GET_HUB_DESCRIPTOR +#define HUB_CLEAR_HUB_FEATURE 0x20 +#define HUB_CLEAR_PORT_FEATURE 0x23 +#define HUB_GET_BUS_STATE 0xA3 +#define HUB_GET_HUB_DESCRIPTOR 0xA0 +#define HUB_GET_HUB_STATUS 0xA0 +#define HUB_GET_PORT_STATUS 0xA3 +#define HUB_SET_HUB_DESCRIPTOR 0x20 +#define HUB_SET_HUB_FEATURE 0x20 +#define HUB_SET_PORT_FEATURE 0x23 +#endif + +/* Hub Class Feature Selectors */ +#ifndef HUB_PORT_RESET +#define HUB_C_HUB_LOCAL_POWER 0 +#define HUB_C_HUB_OVER_CURRENT 1 +#define HUB_PORT_CONNECTION 0 +#define HUB_PORT_ENABLE 1 +#define HUB_PORT_SUSPEND 2 +#define HUB_PORT_OVER_CURRENT 3 +#define HUB_PORT_RESET 4 +#define HUB_PORT_POWER 8 +#define HUB_PORT_LOW_SPEED 9 +#define HUB_C_PORT_CONNECTION 16 +#define HUB_C_PORT_ENABLE 17 +#define HUB_C_PORT_SUSPEND 18 +#define HUB_C_PORT_OVER_CURRENT 19 +#define HUB_C_PORT_RESET 20 +#endif + +/* USB UDisk */ +#ifndef USB_BO_CBW_SIZE +#define USB_BO_CBW_SIZE 0x1F +#define USB_BO_CSW_SIZE 0x0D +#endif +#ifndef USB_BO_CBW_SIG0 +#define USB_BO_CBW_SIG0 0x55 +#define USB_BO_CBW_SIG1 0x53 +#define USB_BO_CBW_SIG2 0x42 +#define USB_BO_CBW_SIG3 0x43 +#define USB_BO_CSW_SIG0 0x55 +#define USB_BO_CSW_SIG1 0x53 +#define USB_BO_CSW_SIG2 0x42 +#define USB_BO_CSW_SIG3 0x53 +#endif + + +/******************************************************************************/ +/* USBHS Clock Configuration Related Macro Definition */ +#define USB_CLK_SRC 0x80000000 +#define USBHS_PLL_ALIVE 0x40000000 +#define USBHS_PLL_CKREF_MASK 0x30000000 +#define USBHS_PLL_CKREF_3M 0x00000000 +#define USBHS_PLL_CKREF_4M 0x10000000 +#define USBHS_PLL_CKREF_8M 0x20000000 +#define USBHS_PLL_CKREF_5M 0x30000000 +#define USBHS_PLL_SRC 0x08000000 +#define USBHS_PLL_SRC_PRE_MASK 0x07000000 +#define USBHS_PLL_SRC_PRE_DIV1 0x00000000 +#define USBHS_PLL_SRC_PRE_DIV2 0x01000000 +#define USBHS_PLL_SRC_PRE_DIV3 0x02000000 +#define USBHS_PLL_SRC_PRE_DIV4 0x03000000 +#define USBHS_PLL_SRC_PRE_DIV5 0x04000000 +#define USBHS_PLL_SRC_PRE_DIV6 0x05000000 +#define USBHS_PLL_SRC_PRE_DIV7 0x06000000 +#define USBHS_PLL_SRC_PRE_DIV8 0x07000000 + + +/*******************************************************************************/ +/* USBHS Related Register Macro Definition */ + +/* R8_USB_CTRL */ +#define USBHS_UC_HOST_MODE 0x80 +#define USBHS_UC_SPEED_TYPE 0x60 +#define USBHS_UC_SPEED_LOW 0x40 +#define USBHS_UC_SPEED_FULL 0x00 +#define USBHS_UC_SPEED_HIGH 0x20 +#define USBHS_UC_DEV_PU_EN 0x10 +#define USBHS_UC_INT_BUSY 0x08 +#define USBHS_UC_RESET_SIE 0x04 +#define USBHS_UC_CLR_ALL 0x02 +#define USBHS_UC_DMA_EN 0x01 + +/* R8_USB_INT_EN */ +#define USBHS_UIE_DEV_NAK 0x80 +#define USBHS_UIE_ISO_ACT 0x40 +#define USBHS_UIE_SETUP_ACT 0x20 +#define USBHS_UIE_FIFO_OV 0x10 +#define USBHS_UIE_SOF_ACT 0x08 +#define USBHS_UIE_SUSPEND 0x04 +#define USBHS_UIE_TRANSFER 0x02 +#define USBHS_UIE_DETECT 0x01 +#define USBHS_UIE_BUS_RST 0x01 + +/* R16_USB_DEV_AD */ +#define USBHS_MASK_USB_ADDR 0x7F + +/* R16_USB_FRAME_NO */ +#define USBHS_MICRO_FRAME_NUM 0xE000 +#define USBHS_SOF_FRAME_NUM 0x07FF + +/* R8_USB_SUSPEND */ +#define USBHS_USB_LINESTATE 0x30 +#define USBHS_USB_WAKEUP_ST 0x04 +#define USBHS_USB_SYS_MOD 0x03 + +/* R8_USB_SPEED_TYPE */ +#define USBHS_USB_SPEED_TYPE 0x03 +#define USBHS_USB_SPEED_LOW 0x02 +#define USBHS_USB_SPEED_FULL 0x00 +#define USBHS_USB_SPEED_HIGH 0x01 + +/* R8_USB_MIS_ST */ +#define USBHS_UMS_SOF_PRES 0x80 +#define USBHS_UMS_SOF_ACT 0x40 +#define USBHS_UMS_SIE_FREE 0x20 +#define USBHS_UMS_R_FIFO_RDY 0x10 +#define USBHS_UMS_BUS_RESET 0x08 +#define USBHS_UMS_SUSPEND 0x04 +#define USBHS_UMS_DEV_ATTACH 0x02 +#define USBHS_UMS_SPLIT_CAN 0x01 + +/* R8_USB_INT_FG */ +#define USBHS_UIF_ISO_ACT 0x40 +#define USBHS_UIF_SETUP_ACT 0x20 +#define USBHS_UIF_FIFO_OV 0x10 +#define USBHS_UIF_HST_SOF 0x08 +#define USBHS_UIF_SUSPEND 0x04 +#define USBHS_UIF_TRANSFER 0x02 +#define USBHS_UIF_DETECT 0x01 +#define USBHS_UIF_BUS_RST 0x01 + +/* R8_USB_INT_ST */ +#define USBHS_UIS_IS_NAK 0x80 +#define USBHS_UIS_TOG_OK 0x40 +#define USBHS_UIS_TOKEN_MASK 0x30 +#define USBHS_UIS_TOKEN_OUT 0x00 +#define USBHS_UIS_TOKEN_SOF 0x10 +#define USBHS_UIS_TOKEN_IN 0x20 +#define USBHS_UIS_TOKEN_SETUP 0x30 +#define USBHS_UIS_ENDP_MASK 0x0F +#define USBHS_UIS_H_RES_MASK 0x0F + +/* R16_USB_RX_LEN */ +#define USBHS_USB_RX_LEN 0xFFFF + +/* R32_UEP_CONFIG */ +#define USBHS_UEP15_R_EN 0x80000000 +#define USBHS_UEP14_R_EN 0x40000000 +#define USBHS_UEP13_R_EN 0x20000000 +#define USBHS_UEP12_R_EN 0x10000000 +#define USBHS_UEP11_R_EN 0x08000000 +#define USBHS_UEP10_R_EN 0x04000000 +#define USBHS_UEP9_R_EN 0x02000000 +#define USBHS_UEP8_R_EN 0x01000000 +#define USBHS_UEP7_R_EN 0x00800000 +#define USBHS_UEP6_R_EN 0x00400000 +#define USBHS_UEP5_R_EN 0x00200000 +#define USBHS_UEP4_R_EN 0x00100000 +#define USBHS_UEP3_R_EN 0x00080000 +#define USBHS_UEP2_R_EN 0x00040000 +#define USBHS_UEP1_R_EN 0x00020000 +#define USBHS_UEP0_R_EN 0x00010000 +#define USBHS_UEP15_T_EN 0x00008000 +#define USBHS_UEP14_T_EN 0x00004000 +#define USBHS_UEP13_T_EN 0x00002000 +#define USBHS_UEP12_T_EN 0x00001000 +#define USBHS_UEP11_T_EN 0x00000800 +#define USBHS_UEP10_T_EN 0x00000400 +#define USBHS_UEP9_T_EN 0x00000200 +#define USBHS_UEP8_T_EN 0x00000100 +#define USBHS_UEP7_T_EN 0x00000080 +#define USBHS_UEP6_T_EN 0x00000040 +#define USBHS_UEP5_T_EN 0x00000020 +#define USBHS_UEP4_T_EN 0x00000010 +#define USBHS_UEP3_T_EN 0x00000008 +#define USBHS_UEP2_T_EN 0x00000004 +#define USBHS_UEP1_T_EN 0x00000002 +#define USBHS_UEP0_T_EN 0x00000001 + +/* R32_UEP_TYPE */ +#define USBHS_UEP15_R_TYPE 0x80000000 +#define USBHS_UEP14_R_TYPE 0x40000000 +#define USBHS_UEP13_R_TYPE 0x20000000 +#define USBHS_UEP12_R_TYPE 0x10000000 +#define USBHS_UEP11_R_TYPE 0x08000000 +#define USBHS_UEP10_R_TYPE 0x04000000 +#define USBHS_UEP9_R_TYPE 0x02000000 +#define USBHS_UEP8_R_TYPE 0x01000000 +#define USBHS_UEP7_R_TYPE 0x00800000 +#define USBHS_UEP6_R_TYPE 0x00400000 +#define USBHS_UEP5_R_TYPE 0x00200000 +#define USBHS_UEP4_R_TYPE 0x00100000 +#define USBHS_UEP3_R_TYPE 0x00080000 +#define USBHS_UEP2_R_TYPE 0x00040000 +#define USBHS_UEP1_R_TYPE 0x00020000 +#define USBHS_UEP0_R_TYPE 0x00010000 +#define USBHS_UEP15_T_TYPE 0x00008000 +#define USBHS_UEP14_T_TYPE 0x00004000 +#define USBHS_UEP13_T_TYPE 0x00002000 +#define USBHS_UEP12_T_TYPE 0x00001000 +#define USBHS_UEP11_T_TYPE 0x00000800 +#define USBHS_UEP10_T_TYPE 0x00000400 +#define USBHS_UEP9_T_TYPE 0x00000200 +#define USBHS_UEP8_T_TYPE 0x00000100 +#define USBHS_UEP7_T_TYPE 0x00000080 +#define USBHS_UEP6_T_TYPE 0x00000040 +#define USBHS_UEP5_T_TYPE 0x00000020 +#define USBHS_UEP4_T_TYPE 0x00000010 +#define USBHS_UEP3_T_TYPE 0x00000008 +#define USBHS_UEP2_T_TYPE 0x00000004 +#define USBHS_UEP1_T_TYPE 0x00000002 +#define USBHS_UEP0_T_TYPE 0x00000001 + +/* R32_UEP_BUF_MOD */ +#define USBHS_UEP15_ISO_BUF_MOD 0x80000000 +#define USBHS_UEP14_ISO_BUF_MOD 0x40000000 +#define USBHS_UEP13_ISO_BUF_MOD 0x20000000 +#define USBHS_UEP12_ISO_BUF_MOD 0x10000000 +#define USBHS_UEP11_ISO_BUF_MOD 0x08000000 +#define USBHS_UEP10_ISO_BUF_MOD 0x04000000 +#define USBHS_UEP9_ISO_BUF_MOD 0x02000000 +#define USBHS_UEP8_ISO_BUF_MOD 0x01000000 +#define USBHS_UEP7_ISO_BUF_MOD 0x00800000 +#define USBHS_UEP6_ISO_BUF_MOD 0x00400000 +#define USBHS_UEP5_ISO_BUF_MOD 0x00200000 +#define USBHS_UEP4_ISO_BUF_MOD 0x00100000 +#define USBHS_UEP3_ISO_BUF_MOD 0x00080000 +#define USBHS_UEP2_ISO_BUF_MOD 0x00040000 +#define USBHS_UEP1_ISO_BUF_MOD 0x00020000 +#define USBHS_UEP0_ISO_BUF_MOD 0x00010000 +#define USBHS_UEP15_BUF_MOD 0x00008000 +#define USBHS_UEP14_BUF_MOD 0x00004000 +#define USBHS_UEP13_BUF_MOD 0x00002000 +#define USBHS_UEP12_BUF_MOD 0x00001000 +#define USBHS_UEP11_BUF_MOD 0x00000800 +#define USBHS_UEP10_BUF_MOD 0x00000400 +#define USBHS_UEP9_BUF_MOD 0x00000200 +#define USBHS_UEP8_BUF_MOD 0x00000100 +#define USBHS_UEP7_BUF_MOD 0x00000080 +#define USBHS_UEP6_BUF_MOD 0x00000040 +#define USBHS_UEP5_BUF_MOD 0x00000020 +#define USBHS_UEP4_BUF_MOD 0x00000010 +#define USBHS_UEP3_BUF_MOD 0x00000008 +#define USBHS_UEP2_BUF_MOD 0x00000004 +#define USBHS_UEP1_BUF_MOD 0x00000002 +#define USBHS_UEP0_BUF_MOD 0x00000001 + +/* R32_UEP0_DMA */ +#define USBHS_UEP0_DMA 0x0000FFFF + +/* R32_UEPn_TX_DMA, n=1-15 */ +#define USBHS_UEPn_TX_DMA 0x0000FFFF + +/* R32_UEPn_RX_DMA, n=1-15 */ +#define USBHS_UEPn_RX_DMA 0x0000FFFF + +/* R16_UEPn_MAX_LEN, n=0-15 */ +#define USBHS_UEPn_MAX_LEN 0x07FF + +/* R16_UEPn_T_LEN, n=0-15 */ +#define USBHS_UEPn_T_LEN 0x07FF + +/* R8_UEPn_TX_CTRL, n=0-15 */ +#define USBHS_UEP_T_TOG_AUTO 0x20 +#define USBHS_UEP_T_TOG_MASK 0x18 +#define USBHS_UEP_T_TOG_DATA0 0x00 +#define USBHS_UEP_T_TOG_DATA1 0x08 +#define USBHS_UEP_T_TOG_DATA2 0x10 +#define USBHS_UEP_T_TOG_MDATA 0x18 +#define USBHS_UEP_T_RES_MASK 0x03 +#define USBHS_UEP_T_RES_ACK 0x00 +#define USBHS_UEP_T_RES_NYET 0x01 +#define USBHS_UEP_T_RES_NAK 0x02 +#define USBHS_UEP_T_RES_STALL 0x03 + +/* R8_UEPn_TX_CTRL, n=0-15 */ +#define USBHS_UEP_R_TOG_AUTO 0x20 +#define USBHS_UEP_R_TOG_MASK 0x18 +#define USBHS_UEP_R_TOG_DATA0 0x00 +#define USBHS_UEP_R_TOG_DATA1 0x08 +#define USBHS_UEP_R_TOG_DATA2 0x10 +#define USBHS_UEP_R_TOG_MDATA 0x18 +#define USBHS_UEP_R_RES_MASK 0x03 +#define USBHS_UEP_R_RES_ACK 0x00 +#define USBHS_UEP_R_RES_NYET 0x01 +#define USBHS_UEP_R_RES_NAK 0x02 +#define USBHS_UEP_R_RES_STALL 0x03 + +/* R8_UHOST_CTRL */ +#define USBHS_UH_SOF_EN 0x80 +#define USBHS_UH_SOF_FREE 0x40 +#define USBHS_UH_PHY_SUSPENDM 0x10 +#define USBHS_UH_REMOTE_WKUP 0x08 +#define USBHS_UH_TX_BUS_RESUME 0x04 +#define USBHS_UH_TX_BUS_SUSPEND 0x02 +#define USBHS_UH_TX_BUS_RESET 0x01 + +/* R32_UH_CONFIG */ +#define USBHS_UH_EP_RX_EN 0x00040000 +#define USBHS_UH_EP_TX_EN 0x00000008 + +/* R32_UH_EP_TYPE */ +#define USBHS_UH_EP_RX_TYPE 0x00040000 +#define USBHS_UH_EP_TX_TYPE 0x00000008 + +/* R32_UH_RX_DMA */ +#define USBHS_UH_RX_DMA 0x0000FFFC + +/* R32_UH_TX_DMA */ +#define USBHS_UH_TX_DMA 0x0000FFFF + +/* R16_UH_RX_MAX_LEN */ +#define USBHS_UH_RX_MAX_LEN 0x07FF + +/* R8_UH_EP_PID */ +#define USBHS_UH_TOKEN_MASK 0xF0 +#define USBHS_UH_ENDP_MASK 0x0F + +/* R8_UH_RX_CTRL */ +#define USBHS_UH_R_DATA_NO 0x40 +#define USBHS_UH_R_TOG_AUTO 0x20 +#define USBHS_UH_R_TOG_MASK 0x18 +#define USBHS_UH_R_TOG_DATA0 0x00 +#define USBHS_UH_R_TOG_DATA1 0x08 +#define USBHS_UH_R_TOG_DATA2 0x10 +#define USBHS_UH_R_TOG_MDATA 0x18 +#define USBHS_UH_R_RES_NO 0x04 +#define USBHS_UH_R_RES_MASK 0x03 +#define USBHS_UH_R_RES_ACK 0x00 +#define USBHS_UH_R_RES_NYET 0x01 +#define USBHS_UH_R_RES_NAK 0x02 +#define USBHS_UH_R_RES_STALL 0x03 + +/* R16_UH_TX_LEN */ +#define USBHS_UH_TX_LEN 0x07FF + +/* R8_UH_TX_CTRL */ +#define USBHS_UH_T_DATA_NO 0x40 +#define USBHS_UH_T_AUTO_TOG 0x20 +#define USBHS_UH_T_TOG_MASK 0x18 +#define USBHS_UH_T_TOG_DATA0 0x00 +#define USBHS_UH_T_TOG_DATA1 0x08 +#define USBHS_UH_T_TOG_DATA2 0x10 +#define USBHS_UH_T_TOG_MDATA 0x18 +#define USBHS_UH_T_RES_NO 0x04 +#define USBHS_UH_T_RES_MASK 0x03 +#define USBHS_UH_T_RES_ACK 0x00 +#define USBHS_UH_T_RES_NYET 0x01 +#define USBHS_UH_T_RES_NAK 0x02 +#define USBHS_UH_T_RES_STALL 0x03 + +/* R16_UH_SPLIT_DATA */ +#define USBHS_UH_SPLIT_DATA 0x0FFF + + +/*******************************************************************************/ +/* USBFS Related Register Macro Definition */ + +/* R8_USB_CTRL */ +#define USBFS_UC_HOST_MODE 0x80 +#define USBFS_UC_LOW_SPEED 0x40 +#define USBFS_UC_DEV_PU_EN 0x20 +#define USBFS_UC_SYS_CTRL_MASK 0x30 +#define USBFS_UC_SYS_CTRL0 0x00 +#define USBFS_UC_SYS_CTRL1 0x10 +#define USBFS_UC_SYS_CTRL2 0x20 +#define USBFS_UC_SYS_CTRL3 0x30 +#define USBFS_UC_INT_BUSY 0x08 +#define USBFS_UC_RESET_SIE 0x04 +#define USBFS_UC_CLR_ALL 0x02 +#define USBFS_UC_DMA_EN 0x01 + +/* R8_USB_INT_EN */ +#define USBFS_UIE_DEV_SOF 0x80 +#define USBFS_UIE_DEV_NAK 0x40 +#define USBFS_1WIRE_MODE 0x20 +#define USBFS_UIE_FIFO_OV 0x10 +#define USBFS_UIE_HST_SOF 0x08 +#define USBFS_UIE_SUSPEND 0x04 +#define USBFS_UIE_TRANSFER 0x02 +#define USBFS_UIE_DETECT 0x01 +#define USBFS_UIE_BUS_RST 0x01 + +/* R8_USB_DEV_AD */ +#define USBFS_UDA_GP_BIT 0x80 +#define USBFS_USB_ADDR_MASK 0x7F + +/* R8_USB_MIS_ST */ +#define USBFS_UMS_SOF_PRES 0x80 +#define USBFS_UMS_SOF_ACT 0x40 +#define USBFS_UMS_SIE_FREE 0x20 +#define USBFS_UMS_R_FIFO_RDY 0x10 +#define USBFS_UMS_BUS_RESET 0x08 +#define USBFS_UMS_SUSPEND 0x04 +#define USBFS_UMS_DM_LEVEL 0x02 +#define USBFS_UMS_DEV_ATTACH 0x01 + +/* R8_USB_INT_FG */ +#define USBFS_U_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received +#define USBFS_U_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK +#define USBFS_U_SIE_FREE 0x20 // RO, indicate USB SIE free status +#define USBFS_UIF_FIFO_OV 0x10 // FIFO overflow interrupt flag for USB, direct bit address clear or write 1 to clear +#define USBFS_UIF_HST_SOF 0x08 // host SOF timer interrupt flag for USB host, direct bit address clear or write 1 to clear +#define USBFS_UIF_SUSPEND 0x04 // USB suspend or resume event interrupt flag, direct bit address clear or write 1 to clear +#define USBFS_UIF_TRANSFER 0x02 // USB transfer completion interrupt flag, direct bit address clear or write 1 to clear +#define USBFS_UIF_DETECT 0x01 // device detected event interrupt flag for USB host mode, direct bit address clear or write 1 to clear +#define USBFS_UIF_BUS_RST 0x01 // bus reset event interrupt flag for USB device mode, direct bit address clear or write 1 to clear + +/* R8_USB_INT_ST */ +#define USBFS_UIS_IS_NAK 0x80 // RO, indicate current USB transfer is NAK received for USB device mode +#define USBFS_UIS_TOG_OK 0x40 // RO, indicate current USB transfer toggle is OK +#define USBFS_UIS_TOKEN_MASK 0x30 // RO, bit mask of current token PID code received for USB device mode +#define USBFS_UIS_TOKEN_OUT 0x00 +#define USBFS_UIS_TOKEN_SOF 0x10 +#define USBFS_UIS_TOKEN_IN 0x20 +#define USBFS_UIS_TOKEN_SETUP 0x30 +// bUIS_TOKEN1 & bUIS_TOKEN0: current token PID code received for USB device mode +// 00: OUT token PID received +// 01: SOF token PID received +// 10: IN token PID received +// 11: SETUP token PID received +#define USBFS_UIS_ENDP_MASK 0x0F // RO, bit mask of current transfer endpoint number for USB device mode +#define USBFS_UIS_H_RES_MASK 0x0F // RO, bit mask of current transfer handshake response for USB host mode: 0000=no response, time out from device, others=handshake response PID received + +/* R32_USB_OTG_CR */ +#define USBFS_CR_SESS_VTH 0x20 +#define USBFS_CR_VBUS_VTH 0x10 +#define USBFS_CR_OTG_EN 0x08 +#define USBFS_CR_IDPU 0x04 +#define USBFS_CR_CHARGE_VBUS 0x02 +#define USBFS_CR_DISCHAR_VBUS 0x01 + +/* R32_USB_OTG_SR */ +#define USBFS_SR_ID_DIG 0x08 +#define USBFS_SR_SESS_END 0x04 +#define USBFS_SR_SESS_VLD 0x02 +#define USBFS_SR_VBUS_VLD 0x01 + +/* R8_UDEV_CTRL */ +#define USBFS_UD_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable +#define USBFS_UD_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level +#define USBFS_UD_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level +#define USBFS_UD_LOW_SPEED 0x04 // enable USB physical port low speed: 0=full speed, 1=low speed +#define USBFS_UD_GP_BIT 0x02 // general purpose bit +#define USBFS_UD_PORT_EN 0x01 // enable USB physical port I/O: 0=disable, 1=enable + +/* R8_UEP4_1_MOD */ +#define USBFS_UEP1_RX_EN 0x80 // enable USB endpoint 1 receiving (OUT) +#define USBFS_UEP1_TX_EN 0x40 // enable USB endpoint 1 transmittal (IN) +#define USBFS_UEP1_BUF_MOD 0x10 // buffer mode of USB endpoint 1 +#define USBFS_UEP4_RX_EN 0x08 // enable USB endpoint 4 receiving (OUT) +#define USBFS_UEP4_TX_EN 0x04 // enable USB endpoint 4 transmittal (IN) +#define USBFS_UEP4_BUF_MOD 0x01 + +/* R8_UEP2_3_MOD */ +#define USBFS_UEP3_RX_EN 0x80 // enable USB endpoint 3 receiving (OUT) +#define USBFS_UEP3_TX_EN 0x40 // enable USB endpoint 3 transmittal (IN) +#define USBFS_UEP3_BUF_MOD 0x10 // buffer mode of USB endpoint 3 +#define USBFS_UEP2_RX_EN 0x08 // enable USB endpoint 2 receiving (OUT) +#define USBFS_UEP2_TX_EN 0x04 // enable USB endpoint 2 transmittal (IN) +#define USBFS_UEP2_BUF_MOD 0x01 // buffer mode of USB endpoint 2 + +/* R8_UEP5_6_MOD */ +#define USBFS_UEP6_RX_EN 0x80 // enable USB endpoint 6 receiving (OUT) +#define USBFS_UEP6_TX_EN 0x40 // enable USB endpoint 6 transmittal (IN) +#define USBFS_UEP6_BUF_MOD 0x10 // buffer mode of USB endpoint 6 +#define USBFS_UEP5_RX_EN 0x08 // enable USB endpoint 5 receiving (OUT) +#define USBFS_UEP5_TX_EN 0x04 // enable USB endpoint 5 transmittal (IN) +#define USBFS_UEP5_BUF_MOD 0x01 // buffer mode of USB endpoint 5 + +/* R8_UEP7_MOD */ +#define USBFS_UEP7_RX_EN 0x08 // enable USB endpoint 7 receiving (OUT) +#define USBFS_UEP7_TX_EN 0x04 // enable USB endpoint 7 transmittal (IN) +#define USBFS_UEP7_BUF_MOD 0x01 // buffer mode of USB endpoint 7 + +/* R8_UEPn_TX_CTRL */ +#define USBFS_UEP_T_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle +#define USBFS_UEP_T_TOG 0x04 // prepared data toggle flag of USB endpoint X transmittal (IN): 0=DATA0, 1=DATA1 +#define USBFS_UEP_T_RES_MASK 0x03 // bit mask of handshake response type for USB endpoint X transmittal (IN) +#define USBFS_UEP_T_RES_ACK 0x00 +#define USBFS_UEP_T_RES_NONE 0x01 +#define USBFS_UEP_T_RES_NAK 0x02 +#define USBFS_UEP_T_RES_STALL 0x03 +// bUEP_T_RES1 & bUEP_T_RES0: handshake response type for USB endpoint X transmittal (IN) +// 00: DATA0 or DATA1 then expecting ACK (ready) +// 01: DATA0 or DATA1 then expecting no response, time out from host, for non-zero endpoint isochronous transactions +// 10: NAK (busy) +// 11: STALL (error) +// host aux setup + +/* R8_UEPn_RX_CTRL, n=0-7 */ +#define USBFS_UEP_R_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion on endpoint 1/2/3: 0=manual toggle, 1=automatic toggle +#define USBFS_UEP_R_TOG 0x04 // expected data toggle flag of USB endpoint X receiving (OUT): 0=DATA0, 1=DATA1 +#define USBFS_UEP_R_RES_MASK 0x03 // bit mask of handshake response type for USB endpoint X receiving (OUT) +#define USBFS_UEP_R_RES_ACK 0x00 +#define USBFS_UEP_R_RES_NONE 0x01 +#define USBFS_UEP_R_RES_NAK 0x02 +#define USBFS_UEP_R_RES_STALL 0x03 +// RB_UEP_R_RES1 & RB_UEP_R_RES0: handshake response type for USB endpoint X receiving (OUT) +// 00: ACK (ready) +// 01: no response, time out to host, for non-zero endpoint isochronous transactions +// 10: NAK (busy) +// 11: STALL (error) + +/* R8_UHOST_CTRL */ +#define USBFS_UH_PD_DIS 0x80 // disable USB UDP/UDM pulldown resistance: 0=enable pulldown, 1=disable +#define USBFS_UH_DP_PIN 0x20 // ReadOnly: indicate current UDP pin level +#define USBFS_UH_DM_PIN 0x10 // ReadOnly: indicate current UDM pin level +#define USBFS_UH_LOW_SPEED 0x04 // enable USB port low speed: 0=full speed, 1=low speed +#define USBFS_UH_BUS_RESET 0x02 // control USB bus reset: 0=normal, 1=force bus reset +#define USBFS_UH_PORT_EN 0x01 // enable USB port: 0=disable, 1=enable port, automatic disabled if USB device detached + +/* R32_UH_EP_MOD */ +#define USBFS_UH_EP_TX_EN 0x40 // enable USB host OUT endpoint transmittal +#define USBFS_UH_EP_TBUF_MOD 0x10 // buffer mode of USB host OUT endpoint +// bUH_EP_TX_EN & bUH_EP_TBUF_MOD: USB host OUT endpoint buffer mode, buffer start address is UH_TX_DMA +// 0 x: disable endpoint and disable buffer +// 1 0: 64 bytes buffer for transmittal (OUT endpoint) +// 1 1: dual 64 bytes buffer by toggle bit bUH_T_TOG selection for transmittal (OUT endpoint), total=128bytes +#define USBFS_UH_EP_RX_EN 0x08 // enable USB host IN endpoint receiving +#define USBFS_UH_EP_RBUF_MOD 0x01 // buffer mode of USB host IN endpoint +// bUH_EP_RX_EN & bUH_EP_RBUF_MOD: USB host IN endpoint buffer mode, buffer start address is UH_RX_DMA +// 0 x: disable endpoint and disable buffer +// 1 0: 64 bytes buffer for receiving (IN endpoint) +// 1 1: dual 64 bytes buffer by toggle bit bUH_R_TOG selection for receiving (IN endpoint), total=128bytes + +/* R16_UH_SETUP */ +#define USBFS_UH_PRE_PID_EN 0x0400 // USB host PRE PID enable for low speed device via hub +#define USBFS_UH_SOF_EN 0x0004 // USB host automatic SOF enable + +/* R8_UH_EP_PID */ +#define USBFS_UH_TOKEN_MASK 0xF0 // bit mask of token PID for USB host transfer +#define USBFS_UH_ENDP_MASK 0x0F // bit mask of endpoint number for USB host transfer + +/* R8_UH_RX_CTRL */ +#define USBFS_UH_R_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle +#define USBFS_UH_R_TOG 0x04 // expected data toggle flag of host receiving (IN): 0=DATA0, 1=DATA1 +#define USBFS_UH_R_RES 0x01 // prepared handshake response type for host receiving (IN): 0=ACK (ready), 1=no response, time out to device, for isochronous transactions + +/* R8_UH_TX_CTRL */ +#define USBFS_UH_T_AUTO_TOG 0x08 // enable automatic toggle after successful transfer completion: 0=manual toggle, 1=automatic toggle +#define USBFS_UH_T_TOG 0x04 // prepared data toggle flag of host transmittal (SETUP/OUT): 0=DATA0, 1=DATA1 +#define USBFS_UH_T_RES 0x01 // expected handshake response type for host transmittal (SETUP/OUT): 0=ACK (ready), 1=no response, time out from device, for isochronous transactions + + +/*******************************************************************************/ +/* Struct Definition */ + +/* USB Setup Request */ +typedef struct __attribute__((packed)) _USB_SETUP_REQ +{ + uint8_t bRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USB_SETUP_REQ, *PUSB_SETUP_REQ; + +/* USB Device Descriptor */ +typedef struct __attribute__((packed)) _USB_DEVICE_DESCR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} USB_DEV_DESCR, *PUSB_DEV_DESCR; + +/* USB Configuration Descriptor */ +typedef struct __attribute__((packed)) _USB_CONFIG_DESCR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t MaxPower; +} USB_CFG_DESCR, *PUSB_CFG_DESCR; + +/* USB Interface Descriptor */ +typedef struct __attribute__((packed)) _USB_INTERF_DESCR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} USB_ITF_DESCR, *PUSB_ITF_DESCR; + +/* USB Endpoint Descriptor */ +typedef struct __attribute__((packed)) _USB_ENDPOINT_DESCR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint8_t wMaxPacketSizeL; + uint8_t wMaxPacketSizeH; + uint8_t bInterval; +} USB_ENDP_DESCR, *PUSB_ENDP_DESCR; + +/* USB Configuration Descriptor Set */ +typedef struct __attribute__((packed)) _USB_CONFIG_DESCR_LONG +{ + USB_CFG_DESCR cfg_descr; + USB_ITF_DESCR itf_descr; + USB_ENDP_DESCR endp_descr[ 1 ]; +} USB_CFG_DESCR_LONG, *PUSB_CFG_DESCR_LONG; + +/* USB HUB Descriptor */ +typedef struct __attribute__((packed)) _USB_HUB_DESCR +{ + uint8_t bDescLength; + uint8_t bDescriptorType; + uint8_t bNbrPorts; + uint8_t wHubCharacteristicsL; + uint8_t wHubCharacteristicsH; + uint8_t bPwrOn2PwrGood; + uint8_t bHubContrCurrent; + uint8_t DeviceRemovable; + uint8_t PortPwrCtrlMask; +} USB_HUB_DESCR, *PUSB_HUB_DESCR; + +/* USB HID Descriptor */ +typedef struct __attribute__((packed)) _USB_HID_DESCR +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdHID; + uint8_t bCountryCode; + uint8_t bNumDescriptors; + uint8_t bDescriptorTypeX; + uint8_t wDescriptorLengthL; + uint8_t wDescriptorLengthH; +} USB_HID_DESCR, *PUSB_HID_DESCR; + +/* USB UDisk */ +typedef struct __attribute__((packed)) _UDISK_BOC_CBW +{ + uint32_t mCBW_Sig; + uint32_t mCBW_Tag; + uint32_t mCBW_DataLen; + uint8_t mCBW_Flag; + uint8_t mCBW_LUN; + uint8_t mCBW_CB_Len; + uint8_t mCBW_CB_Buf[ 16 ]; +} UDISK_BOC_CBW, *PXUDISK_BOC_CBW; + +/* USB UDisk */ +typedef struct __attribute__((packed)) _UDISK_BOC_CSW +{ + uint32_t mCBW_Sig; + uint32_t mCBW_Tag; + uint32_t mCSW_Residue; + uint8_t mCSW_Status; +} UDISK_BOC_CSW, *PXUDISK_BOC_CSW; + + +#ifdef __cplusplus +} +#endif + +#endif /* __CH32V30x_USB_H */ diff --git a/Peripheral/inc/ch32v30x_wwdg.h b/Peripheral/inc/ch32v30x_wwdg.h new file mode 100644 index 0000000..809b2ec --- /dev/null +++ b/Peripheral/inc/ch32v30x_wwdg.h @@ -0,0 +1,44 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_wwdg.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains all the functions prototypes for the WWDG +* firmware library. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_WWDG_H +#define __CH32V30x_WWDG_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "ch32v30x.h" + + +/* WWDG_Prescaler */ +#define WWDG_Prescaler_1 ((uint32_t)0x00000000) +#define WWDG_Prescaler_2 ((uint32_t)0x00000080) +#define WWDG_Prescaler_4 ((uint32_t)0x00000100) +#define WWDG_Prescaler_8 ((uint32_t)0x00000180) + + +void WWDG_DeInit(void); +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); +void WWDG_SetWindowValue(uint8_t WindowValue); +void WWDG_EnableIT(void); +void WWDG_SetCounter(uint8_t Counter); +void WWDG_Enable(uint8_t Counter); +FlagStatus WWDG_GetFlagStatus(void); +void WWDG_ClearFlag(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Peripheral/src/ch32v30x_adc.c b/Peripheral/src/ch32v30x_adc.c new file mode 100644 index 0000000..54ed35e --- /dev/null +++ b/Peripheral/src/ch32v30x_adc.c @@ -0,0 +1,1182 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_adc.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the ADC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_adc.h" +#include "ch32v30x_rcc.h" + +/* ADC DISCNUM mask */ +#define CTLR1_DISCNUM_Reset ((uint32_t)0xFFFF1FFF) + +/* ADC DISCEN mask */ +#define CTLR1_DISCEN_Set ((uint32_t)0x00000800) +#define CTLR1_DISCEN_Reset ((uint32_t)0xFFFFF7FF) + +/* ADC JAUTO mask */ +#define CTLR1_JAUTO_Set ((uint32_t)0x00000400) +#define CTLR1_JAUTO_Reset ((uint32_t)0xFFFFFBFF) + +/* ADC JDISCEN mask */ +#define CTLR1_JDISCEN_Set ((uint32_t)0x00001000) +#define CTLR1_JDISCEN_Reset ((uint32_t)0xFFFFEFFF) + +/* ADC AWDCH mask */ +#define CTLR1_AWDCH_Reset ((uint32_t)0xFFFFFFE0) + +/* ADC Analog watchdog enable mode mask */ +#define CTLR1_AWDMode_Reset ((uint32_t)0xFF3FFDFF) + +/* CTLR1 register Mask */ +#define CTLR1_CLEAR_Mask ((uint32_t)0xE0F0FEFF) + +/* ADC ADON mask */ +#define CTLR2_ADON_Set ((uint32_t)0x00000001) +#define CTLR2_ADON_Reset ((uint32_t)0xFFFFFFFE) + +/* ADC DMA mask */ +#define CTLR2_DMA_Set ((uint32_t)0x00000100) +#define CTLR2_DMA_Reset ((uint32_t)0xFFFFFEFF) + +/* ADC RSTCAL mask */ +#define CTLR2_RSTCAL_Set ((uint32_t)0x00000008) + +/* ADC CAL mask */ +#define CTLR2_CAL_Set ((uint32_t)0x00000004) + +/* ADC SWSTART mask */ +#define CTLR2_SWSTART_Set ((uint32_t)0x00400000) + +/* ADC EXTTRIG mask */ +#define CTLR2_EXTTRIG_Set ((uint32_t)0x00100000) +#define CTLR2_EXTTRIG_Reset ((uint32_t)0xFFEFFFFF) + +/* ADC Software start mask */ +#define CTLR2_EXTTRIG_SWSTART_Set ((uint32_t)0x00500000) +#define CTLR2_EXTTRIG_SWSTART_Reset ((uint32_t)0xFFAFFFFF) + +/* ADC JEXTSEL mask */ +#define CTLR2_JEXTSEL_Reset ((uint32_t)0xFFFF8FFF) + +/* ADC JEXTTRIG mask */ +#define CTLR2_JEXTTRIG_Set ((uint32_t)0x00008000) +#define CTLR2_JEXTTRIG_Reset ((uint32_t)0xFFFF7FFF) + +/* ADC JSWSTART mask */ +#define CTLR2_JSWSTART_Set ((uint32_t)0x00200000) + +/* ADC injected software start mask */ +#define CTLR2_JEXTTRIG_JSWSTART_Set ((uint32_t)0x00208000) +#define CTLR2_JEXTTRIG_JSWSTART_Reset ((uint32_t)0xFFDF7FFF) + +/* ADC TSPD mask */ +#define CTLR2_TSVREFE_Set ((uint32_t)0x00800000) +#define CTLR2_TSVREFE_Reset ((uint32_t)0xFF7FFFFF) + +/* CTLR2 register Mask */ +#define CTLR2_CLEAR_Mask ((uint32_t)0xFFF1F7FD) + +/* ADC SQx mask */ +#define RSQR3_SQ_Set ((uint32_t)0x0000001F) +#define RSQR2_SQ_Set ((uint32_t)0x0000001F) +#define RSQR1_SQ_Set ((uint32_t)0x0000001F) + +/* RSQR1 register Mask */ +#define RSQR1_CLEAR_Mask ((uint32_t)0xFF0FFFFF) + +/* ADC JSQx mask */ +#define ISQR_JSQ_Set ((uint32_t)0x0000001F) + +/* ADC JL mask */ +#define ISQR_JL_Set ((uint32_t)0x00300000) +#define ISQR_JL_Reset ((uint32_t)0xFFCFFFFF) + +/* ADC SMPx mask */ +#define SAMPTR1_SMP_Set ((uint32_t)0x00000007) +#define SAMPTR2_SMP_Set ((uint32_t)0x00000007) + +/* ADC IDATARx registers offset */ +#define IDATAR_Offset ((uint8_t)0x28) + +/* ADC1 RDATAR register base address */ +#define RDATAR_ADDRESS ((uint32_t)0x4001244C) + +/********************************************************************* + * @fn ADC_DeInit + * + * @brief Deinitializes the ADCx peripheral registers to their default + * reset values. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return none + */ +void ADC_DeInit(ADC_TypeDef *ADCx) +{ + if(ADCx == ADC1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); + } + else if(ADCx == ADC2) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2, DISABLE); + } +} + +/********************************************************************* + * @fn ADC_Init + * + * @brief Initializes the ADCx peripheral according to the specified + * parameters in the ADC_InitStruct. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_InitStruct - pointer to an ADC_InitTypeDef structure that + * contains the configuration information for the specified ADC + * peripheral. + * + * @return none + */ +void ADC_Init(ADC_TypeDef *ADCx, ADC_InitTypeDef *ADC_InitStruct) +{ + uint32_t tmpreg1 = 0; + uint8_t tmpreg2 = 0; + + tmpreg1 = ADCx->CTLR1; + tmpreg1 &= CTLR1_CLEAR_Mask; + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_Mode | (uint32_t)ADC_InitStruct->ADC_OutputBuffer | + (uint32_t)ADC_InitStruct->ADC_Pga | ((uint32_t)ADC_InitStruct->ADC_ScanConvMode << 8)); + ADCx->CTLR1 = tmpreg1; + + tmpreg1 = ADCx->CTLR2; + tmpreg1 &= CTLR2_CLEAR_Mask; + tmpreg1 |= (uint32_t)(ADC_InitStruct->ADC_DataAlign | ADC_InitStruct->ADC_ExternalTrigConv | + ((uint32_t)ADC_InitStruct->ADC_ContinuousConvMode << 1)); + ADCx->CTLR2 = tmpreg1; + + tmpreg1 = ADCx->RSQR1; + tmpreg1 &= RSQR1_CLEAR_Mask; + tmpreg2 |= (uint8_t)(ADC_InitStruct->ADC_NbrOfChannel - (uint8_t)1); + tmpreg1 |= (uint32_t)tmpreg2 << 20; + ADCx->RSQR1 = tmpreg1; +} + +/********************************************************************* + * @fn ADC_StructInit + * + * @brief Fills each ADC_InitStruct member with its default value. + * + * @param ADC_InitStruct - pointer to an ADC_InitTypeDef structure that + * contains the configuration information for the specified ADC + * peripheral. + * + * @return none + */ +void ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct) +{ + ADC_InitStruct->ADC_Mode = ADC_Mode_Independent; + ADC_InitStruct->ADC_ScanConvMode = DISABLE; + ADC_InitStruct->ADC_ContinuousConvMode = DISABLE; + ADC_InitStruct->ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; + ADC_InitStruct->ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStruct->ADC_NbrOfChannel = 1; +} + +/********************************************************************* + * @fn ADC_Cmd + * + * @brief Enables or disables the specified ADC peripheral. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_Cmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_ADON_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_ADON_Reset; + } +} + +/********************************************************************* + * @fn ADC_DMACmd + * + * @brief Enables or disables the specified ADC DMA request. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_DMACmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_DMA_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_DMA_Reset; + } +} + +/********************************************************************* + * @fn ADC_ITConfig + * + * @brief Enables or disables the specified ADC interrupts. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_IT - specifies the ADC interrupt sources to be enabled or disabled. + * ADC_IT_EOC - End of conversion interrupt mask. + * ADC_IT_AWD - Analog watchdog interrupt mask. + * ADC_IT_JEOC - End of injected conversion interrupt mask. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_ITConfig(ADC_TypeDef *ADCx, uint16_t ADC_IT, FunctionalState NewState) +{ + uint8_t itmask = 0; + + itmask = (uint8_t)ADC_IT; + + if(NewState != DISABLE) + { + ADCx->CTLR1 |= itmask; + } + else + { + ADCx->CTLR1 &= (~(uint32_t)itmask); + } +} + +/********************************************************************* + * @fn ADC_ResetCalibration + * + * @brief Resets the selected ADC calibration registers. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return none + */ +void ADC_ResetCalibration(ADC_TypeDef *ADCx) +{ + ADCx->CTLR2 |= CTLR2_RSTCAL_Set; +} + +/********************************************************************* + * @fn ADC_GetResetCalibrationStatus + * + * @brief Gets the selected ADC reset calibration registers status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_RSTCAL_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_StartCalibration + * + * @brief Starts the selected ADC calibration process. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return None + */ +void ADC_StartCalibration(ADC_TypeDef *ADCx) +{ + ADCx->CTLR2 |= CTLR2_CAL_Set; +} + +/********************************************************************* + * @fn ADC_GetCalibrationStatus + * + * @brief Gets the selected ADC calibration status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_CAL_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_SoftwareStartConvCmd + * + * @brief Enables or disables the selected ADC software start conversion. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_SoftwareStartConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_EXTTRIG_SWSTART_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_EXTTRIG_SWSTART_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetSoftwareStartConvStatus + * + * @brief Gets the selected ADC Software start conversion Status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_SWSTART_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_DiscModeChannelCountConfig + * + * @brief Configures the discontinuous mode for the selected ADC regular + * group channel. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * Number - specifies the discontinuous mode regular channel + * count value(1-8). + * + * @return None + */ +void ADC_DiscModeChannelCountConfig(ADC_TypeDef *ADCx, uint8_t Number) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + + tmpreg1 = ADCx->CTLR1; + tmpreg1 &= CTLR1_DISCNUM_Reset; + tmpreg2 = Number - 1; + tmpreg1 |= tmpreg2 << 13; + ADCx->CTLR1 = tmpreg1; +} + +/********************************************************************* + * @fn ADC_DiscModeCmd + * + * @brief Enables or disables the discontinuous mode on regular group + * channel for the specified ADC. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_DiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= CTLR1_DISCEN_Set; + } + else + { + ADCx->CTLR1 &= CTLR1_DISCEN_Reset; + } +} + +/********************************************************************* + * @fn ADC_RegularChannelConfig + * + * @brief Configures for the selected ADC regular channel its corresponding + * rank in the sequencer and its sample time. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_Channel - the ADC channel to configure. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * Rank - The rank in the regular group sequencer. + * This parameter must be between 1 to 16. + * ADC_SampleTime - The sample time value to be set for the selected channel. + * ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles. + * ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles. + * ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles. + * ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles. + * ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles. + * ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles. + * ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles. + * ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles. + * + * @return None + */ +void ADC_RegularChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + + if(ADC_Channel > ADC_Channel_9) + { + tmpreg1 = ADCx->SAMPTR1; + tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR1 = tmpreg1; + } + else + { + tmpreg1 = ADCx->SAMPTR2; + tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR2 = tmpreg1; + } + + if(Rank < 7) + { + tmpreg1 = ADCx->RSQR3; + tmpreg2 = RSQR3_SQ_Set << (5 * (Rank - 1)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1)); + tmpreg1 |= tmpreg2; + ADCx->RSQR3 = tmpreg1; + } + else if(Rank < 13) + { + tmpreg1 = ADCx->RSQR2; + tmpreg2 = RSQR2_SQ_Set << (5 * (Rank - 7)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7)); + tmpreg1 |= tmpreg2; + ADCx->RSQR2 = tmpreg1; + } + else + { + tmpreg1 = ADCx->RSQR1; + tmpreg2 = RSQR1_SQ_Set << (5 * (Rank - 13)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13)); + tmpreg1 |= tmpreg2; + ADCx->RSQR1 = tmpreg1; + } +} + +/********************************************************************* + * @fn ADC_ExternalTrigConvCmd + * + * @brief Enables or disables the ADCx conversion through external trigger. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_ExternalTrigConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_EXTTRIG_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_EXTTRIG_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetConversionValue + * + * @brief Returns the last ADCx conversion result data for regular channel. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return ADCx->RDATAR - The Data conversion value. + */ +uint16_t ADC_GetConversionValue(ADC_TypeDef *ADCx) +{ + return (uint16_t)ADCx->RDATAR; +} + +/********************************************************************* + * @fn ADC_GetDualModeConversionValue + * + * @brief Returns the last ADC1 and ADC2 conversion result data in dual mode. + * + * @return RDATAR_ADDRESS - The Data conversion value. + */ +uint32_t ADC_GetDualModeConversionValue(void) +{ + return (*(__IO uint32_t *)RDATAR_ADDRESS); +} + +/********************************************************************* + * @fn ADC_AutoInjectedConvCmd + * + * @brief Enables or disables the selected ADC automatic injected group + * conversion after regular one. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_AutoInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= CTLR1_JAUTO_Set; + } + else + { + ADCx->CTLR1 &= CTLR1_JAUTO_Reset; + } +} + +/********************************************************************* + * @fn ADC_InjectedDiscModeCmd + * + * @brief Enables or disables the discontinuous mode for injected group + * channel for the specified ADC. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_InjectedDiscModeCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= CTLR1_JDISCEN_Set; + } + else + { + ADCx->CTLR1 &= CTLR1_JDISCEN_Reset; + } +} + +/********************************************************************* + * @fn ADC_ExternalTrigInjectedConvConfig + * + * @brief Configures the ADCx external trigger for injected channels conversion. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_ExternalTrigInjecConv - specifies the ADC trigger to start + * injected conversion. + * ADC_ExternalTrigInjecConv_T1_TRGO - Timer1 TRGO event selected. + * ADC_ExternalTrigInjecConv_T1_CC4 - Timer1 capture compare4 selected. + * ADC_ExternalTrigInjecConv_T2_TRGO - Timer2 TRGO event selected. + * ADC_ExternalTrigInjecConv_T2_CC1 - Timer2 capture compare1 selected. + * ADC_ExternalTrigInjecConv_T3_CC4 - Timer3 capture compare4 selected. + * ADC_ExternalTrigInjecConv_T4_TRGO - Timer4 TRGO event selected. + * ADC_ExternalTrigInjecConv_Ext_IT15_TIM8_CC4 - External interrupt + * line 15 event selected. + * ADC_ExternalTrigInjecConv_None: Injected conversion started + * by software and not by external trigger. + * + * @return None + */ +void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef *ADCx, uint32_t ADC_ExternalTrigInjecConv) +{ + uint32_t tmpreg = 0; + + tmpreg = ADCx->CTLR2; + tmpreg &= CTLR2_JEXTSEL_Reset; + tmpreg |= ADC_ExternalTrigInjecConv; + ADCx->CTLR2 = tmpreg; +} + +/********************************************************************* + * @fn ADC_ExternalTrigInjectedConvCmd + * + * @brief Enables or disables the ADCx injected channels conversion through + * external trigger. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_JEXTTRIG_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_JEXTTRIG_Reset; + } +} + +/********************************************************************* + * @fn ADC_SoftwareStartInjectedConvCmd + * + * @brief Enables or disables the selected ADC start of the injected + * channels conversion. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return None + */ +void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR2 |= CTLR2_JEXTTRIG_JSWSTART_Set; + } + else + { + ADCx->CTLR2 &= CTLR2_JEXTTRIG_JSWSTART_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetSoftwareStartInjectedConvCmdStatus + * + * @brief Gets the selected ADC Software start injected conversion Status. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef *ADCx) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->CTLR2 & CTLR2_JSWSTART_Set) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_InjectedChannelConfig + * + * @brief Configures for the selected ADC injected channel its corresponding + * rank in the sequencer and its sample time. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_Channel - the ADC channel to configure. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * Rank - The rank in the regular group sequencer. + * This parameter must be between 1 to 4. + * ADC_SampleTime - The sample time value to be set for the selected channel. + * ADC_SampleTime_1Cycles5 - Sample time equal to 1.5 cycles. + * ADC_SampleTime_7Cycles5 - Sample time equal to 7.5 cycles. + * ADC_SampleTime_13Cycles5 - Sample time equal to 13.5 cycles. + * ADC_SampleTime_28Cycles5 - Sample time equal to 28.5 cycles. + * ADC_SampleTime_41Cycles5 - Sample time equal to 41.5 cycles. + * ADC_SampleTime_55Cycles5 - Sample time equal to 55.5 cycles. + * ADC_SampleTime_71Cycles5 - Sample time equal to 71.5 cycles. + * ADC_SampleTime_239Cycles5 - Sample time equal to 239.5 cycles. + * + * @return None + */ +void ADC_InjectedChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0, tmpreg3 = 0; + + if(ADC_Channel > ADC_Channel_9) + { + tmpreg1 = ADCx->SAMPTR1; + tmpreg2 = SAMPTR1_SMP_Set << (3 * (ADC_Channel - 10)); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10)); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR1 = tmpreg1; + } + else + { + tmpreg1 = ADCx->SAMPTR2; + tmpreg2 = SAMPTR2_SMP_Set << (3 * ADC_Channel); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel); + tmpreg1 |= tmpreg2; + ADCx->SAMPTR2 = tmpreg1; + } + + tmpreg1 = ADCx->ISQR; + tmpreg3 = (tmpreg1 & ISQR_JL_Set) >> 20; + tmpreg2 = ISQR_JSQ_Set << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + tmpreg1 &= ~tmpreg2; + tmpreg2 = (uint32_t)ADC_Channel << (5 * (uint8_t)((Rank + 3) - (tmpreg3 + 1))); + tmpreg1 |= tmpreg2; + ADCx->ISQR = tmpreg1; +} + +/********************************************************************* + * @fn ADC_InjectedSequencerLengthConfig + * + * @brief Configures the sequencer length for injected channels. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * Length - The sequencer length. + * This parameter must be a number between 1 to 4. + * + * @return None + */ +void ADC_InjectedSequencerLengthConfig(ADC_TypeDef *ADCx, uint8_t Length) +{ + uint32_t tmpreg1 = 0; + uint32_t tmpreg2 = 0; + + tmpreg1 = ADCx->ISQR; + tmpreg1 &= ISQR_JL_Reset; + tmpreg2 = Length - 1; + tmpreg1 |= tmpreg2 << 20; + ADCx->ISQR = tmpreg1; +} + +/********************************************************************* + * @fn ADC_SetInjectedOffset + * + * @brief Set the injected channels conversion value offset. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_InjectedChannel: the ADC injected channel to set its offset. + * ADC_InjectedChannel_1 - Injected Channel1 selected. + * ADC_InjectedChannel_2 - Injected Channel2 selected. + * ADC_InjectedChannel_3 - Injected Channel3 selected. + * ADC_InjectedChannel_4 - Injected Channel4 selected. + * Offset - the offset value for the selected ADC injected channel. + * This parameter must be a 12bit value. + * + * @return None + */ +void ADC_SetInjectedOffset(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel; + + *(__IO uint32_t *)tmp = (uint32_t)Offset; +} + +/********************************************************************* + * @fn ADC_GetInjectedConversionValue + * + * @brief Returns the ADC injected channel conversion result. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_InjectedChannel - the ADC injected channel to set its offset. + * ADC_InjectedChannel_1 - Injected Channel1 selected. + * ADC_InjectedChannel_2 - Injected Channel2 selected. + * ADC_InjectedChannel_3 - Injected Channel3 selected. + * ADC_InjectedChannel_4 - Injected Channel4 selected. + * + * @return tmp - The Data conversion value. + */ +uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef *ADCx, uint8_t ADC_InjectedChannel) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)ADCx; + tmp += ADC_InjectedChannel + IDATAR_Offset; + + return (uint16_t)(*(__IO uint32_t *)tmp); +} + +/********************************************************************* + * @fn ADC_AnalogWatchdogCmd + * + * @brief Enables or disables the analog watchdog on single/all regular + * or injected channels. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_AnalogWatchdog - the ADC analog watchdog configuration. + * ADC_AnalogWatchdog_SingleRegEnable - Analog watchdog on a + * single regular channel. + * ADC_AnalogWatchdog_SingleInjecEnable - Analog watchdog on a + * single injected channel. + * ADC_AnalogWatchdog_SingleRegOrInjecEnable - Analog watchdog + * on a single regular or injected channel. + * ADC_AnalogWatchdog_AllRegEnable - Analog watchdog on all + * regular channel. + * ADC_AnalogWatchdog_AllInjecEnable - Analog watchdog on all + * injected channel. + * ADC_AnalogWatchdog_AllRegAllInjecEnable - Analog watchdog on + * all regular and injected channels. + * ADC_AnalogWatchdog_None - No channel guarded by the analog + * watchdog. + * + * @return none + */ +void ADC_AnalogWatchdogCmd(ADC_TypeDef *ADCx, uint32_t ADC_AnalogWatchdog) +{ + uint32_t tmpreg = 0; + + tmpreg = ADCx->CTLR1; + tmpreg &= CTLR1_AWDMode_Reset; + tmpreg |= ADC_AnalogWatchdog; + ADCx->CTLR1 = tmpreg; +} + +/********************************************************************* + * @fn ADC_AnalogWatchdogThresholdsConfig + * + * @brief Configures the high and low thresholds of the analog watchdog. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * HighThreshold - the ADC analog watchdog High threshold value. + * This parameter must be a 12bit value. + * LowThreshold - the ADC analog watchdog Low threshold value. + * This parameter must be a 12bit value. + * + * @return none + */ +void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef *ADCx, uint16_t HighThreshold, + uint16_t LowThreshold) +{ + ADCx->WDHTR = HighThreshold; + ADCx->WDLTR = LowThreshold; +} + +/********************************************************************* + * @fn ADC_AnalogWatchdogSingleChannelConfig + * + * @brief Configures the analog watchdog guarded single channel. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_Channel - the ADC channel to configure. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * + * @return None + */ +void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef *ADCx, uint8_t ADC_Channel) +{ + uint32_t tmpreg = 0; + + tmpreg = ADCx->CTLR1; + tmpreg &= CTLR1_AWDCH_Reset; + tmpreg |= ADC_Channel; + ADCx->CTLR1 = tmpreg; +} + +/********************************************************************* + * @fn ADC_TempSensorVrefintCmd + * + * @brief Enables or disables the temperature sensor and Vrefint channel. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_TempSensorVrefintCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADC1->CTLR2 |= CTLR2_TSVREFE_Set; + } + else + { + ADC1->CTLR2 &= CTLR2_TSVREFE_Reset; + } +} + +/********************************************************************* + * @fn ADC_GetFlagStatus + * + * @brief Checks whether the specified ADC flag is set or not. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_FLAG - specifies the flag to check. + * ADC_FLAG_AWD - Analog watchdog flag. + * ADC_FLAG_EOC - End of conversion flag. + * ADC_FLAG_JEOC - End of injected group conversion flag. + * ADC_FLAG_JSTRT - Start of injected group conversion flag. + * ADC_FLAG_STRT - Start of regular group conversion flag. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus ADC_GetFlagStatus(ADC_TypeDef *ADCx, uint8_t ADC_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((ADCx->STATR & ADC_FLAG) != (uint8_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_ClearFlag + * + * @brief Clears the ADCx's pending flags. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_FLAG - specifies the flag to clear. + * ADC_FLAG_AWD - Analog watchdog flag. + * ADC_FLAG_EOC - End of conversion flag. + * ADC_FLAG_JEOC - End of injected group conversion flag. + * ADC_FLAG_JSTRT - Start of injected group conversion flag. + * ADC_FLAG_STRT - Start of regular group conversion flag. + * + * @return none + */ +void ADC_ClearFlag(ADC_TypeDef *ADCx, uint8_t ADC_FLAG) +{ + ADCx->STATR = ~(uint32_t)ADC_FLAG; +} + +/********************************************************************* + * @fn ADC_GetITStatus + * + * @brief Checks whether the specified ADC interrupt has occurred or not. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_IT - specifies the ADC interrupt source to check. + * ADC_IT_EOC - End of conversion interrupt mask. + * ADC_IT_AWD - Analog watchdog interrupt mask. + * ADC_IT_JEOC - End of injected conversion interrupt mask. + * + * @return FlagStatus: SET or RESET. + */ +ITStatus ADC_GetITStatus(ADC_TypeDef *ADCx, uint16_t ADC_IT) +{ + ITStatus bitstatus = RESET; + uint32_t itmask = 0, enablestatus = 0; + + itmask = ADC_IT >> 8; + enablestatus = (ADCx->CTLR1 & (uint8_t)ADC_IT); + + if(((ADCx->STATR & itmask) != (uint32_t)RESET) && enablestatus) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ADC_ClearITPendingBit + * + * @brief Clears the ADCx's interrupt pending bits. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * ADC_IT - specifies the ADC interrupt pending bit to clear. + * ADC_IT_EOC - End of conversion interrupt mask. + * ADC_IT_AWD - Analog watchdog interrupt mask. + * ADC_IT_JEOC - End of injected conversion interrupt mask. + * + * @return none + */ +void ADC_ClearITPendingBit(ADC_TypeDef *ADCx, uint16_t ADC_IT) +{ + uint8_t itmask = 0; + + itmask = (uint8_t)(ADC_IT >> 8); + ADCx->STATR = ~(uint32_t)itmask; +} + +/********************************************************************* + * @fn TempSensor_Volt_To_Temper + * + * @brief Internal Temperature Sensor Voltage to temperature. + * + * @param Value - Voltage Value(mv). + * + * @return Temper - Temperature Value. + */ +s32 TempSensor_Volt_To_Temper(s32 Value) +{ + s32 Temper, Refer_Volt, Refer_Temper; + s32 k = 43; + + Refer_Volt = (s32)((*(u32 *)0x1FFFF720) & 0x0000FFFF); + Refer_Temper = (s32)(((*(u32 *)0x1FFFF720) >> 16) & 0x0000FFFF); + + Temper = Refer_Temper - ((Value - Refer_Volt) * 10 + (k >> 1)) / k; + + return Temper; +} + +/********************************************************************* + * @fn ADC_BufferCmd + * + * @brief Enables or disables the ADCx buffer. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ADC_BufferCmd(ADC_TypeDef *ADCx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ADCx->CTLR1 |= (1 << 26); + } + else + { + ADCx->CTLR1 &= ~(1 << 26); + } +} + +/********************************************************************* + * @fn Get_CalibrationValue + * + * @brief Get ADCx Calibration Value. + * + * @param ADCx - where x can be 1 or 2 to select the ADC peripheral. + * + * @return CalibrationValue + */ +int16_t Get_CalibrationValue(ADC_TypeDef *ADCx) +{ + __IO uint8_t i, j; + uint16_t buf[10]; + __IO uint16_t t; + + for(i = 0; i < 10; i++) + { + ADC_ResetCalibration(ADCx); + while(ADC_GetResetCalibrationStatus(ADCx)) + ; + ADC_StartCalibration(ADCx); + while(ADC_GetCalibrationStatus(ADCx)) + ; + buf[i] = ADCx->RDATAR; + } + + for(i = 0; i < 10; i++) + { + for(j = 0; j < 9; j++) + { + if(buf[j] > buf[j + 1]) + { + t = buf[j]; + buf[j] = buf[j + 1]; + buf[j + 1] = t; + } + } + } + + t = 0; + for(i = 0; i < 6; i++) + { + t += buf[i + 2]; + } + + t = (t / 6) + ((t % 6) / 3); + + return (int16_t)(2048 - (int16_t)t); +} diff --git a/Peripheral/src/ch32v30x_bkp.c b/Peripheral/src/ch32v30x_bkp.c new file mode 100644 index 0000000..b76b997 --- /dev/null +++ b/Peripheral/src/ch32v30x_bkp.c @@ -0,0 +1,244 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_bkp.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file provides all the BKP firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_bkp.h" +#include "ch32v30x_rcc.h" + +/* BKP registers bit mask */ + +/* OCTLR register bit mask */ +#define OCTLR_CAL_MASK ((uint16_t)0xFF80) +#define OCTLR_MASK ((uint16_t)0xFC7F) + +/********************************************************************* + * @fn BKP_DeInit + * + * @brief Deinitializes the BKP peripheral registers to their default reset values. + * + * @return none + */ +void BKP_DeInit(void) +{ + RCC_BackupResetCmd(ENABLE); + RCC_BackupResetCmd(DISABLE); +} + +/********************************************************************* + * @fn BKP_TamperPinLevelConfig + * + * @brief Configures the Tamper Pin active level. + * + * @param BKP_TamperPinLevel: specifies the Tamper Pin active level. + * BKP_TamperPinLevel_High - Tamper pin active on high level. + * BKP_TamperPinLevel_Low - Tamper pin active on low level. + * + * @return none + */ +void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel) +{ + if(BKP_TamperPinLevel) + { + BKP->TPCTLR |= (1 << 1); + } + else + { + BKP->TPCTLR &= ~(1 << 1); + } +} + +/********************************************************************* + * @fn BKP_TamperPinCmd + * + * @brief Enables or disables the Tamper Pin activation. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void BKP_TamperPinCmd(FunctionalState NewState) +{ + if(NewState) + { + BKP->TPCTLR |= (1 << 0); + } + else + { + BKP->TPCTLR &= ~(1 << 0); + } +} + +/********************************************************************* + * @fn BKP_ITConfig + * + * @brief Enables or disables the Tamper Pin Interrupt. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void BKP_ITConfig(FunctionalState NewState) +{ + if(NewState) + { + BKP->TPCSR |= (1 << 2); + } + else + { + BKP->TPCSR &= ~(1 << 2); + } +} + +/********************************************************************* + * @fn BKP_RTCOutputConfig + * + * @brief Select the RTC output source to output on the Tamper pin. + * + * @param BKP_RTCOutputSource - specifies the RTC output source. + * BKP_RTCOutputSource_None - no RTC output on the Tamper pin. + * BKP_RTCOutputSource_CalibClock - output the RTC clock with + * frequency divided by 64 on the Tamper pin. + * BKP_RTCOutputSource_Alarm - output the RTC Alarm pulse signal + * on the Tamper pin. + * BKP_RTCOutputSource_Second - output the RTC Second pulse + * signal on the Tamper pin. + * + * @return none + */ +void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource) +{ + uint16_t tmpreg = 0; + + tmpreg = BKP->OCTLR; + tmpreg &= OCTLR_MASK; + tmpreg |= BKP_RTCOutputSource; + BKP->OCTLR = tmpreg; +} + +/********************************************************************* + * @fn BKP_SetRTCCalibrationValue + * + * @brief Sets RTC Clock Calibration value. + * + * @param CalibrationValue - specifies the RTC Clock Calibration value. + * This parameter must be a number between 0 and 0x7F. + * + * @return none + */ +void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue) +{ + uint16_t tmpreg = 0; + + tmpreg = BKP->OCTLR; + tmpreg &= OCTLR_CAL_MASK; + tmpreg |= CalibrationValue; + BKP->OCTLR = tmpreg; +} + +/********************************************************************* + * @fn BKP_WriteBackupRegister + * + * @brief Writes user data to the specified Data Backup Register. + * + * @param BKP_DR - specifies the Data Backup Register. + * Data - data to write. + * + * @return none + */ +void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + *(__IO uint32_t *)tmp = Data; +} + +/********************************************************************* + * @fn BKP_ReadBackupRegister + * + * @brief Reads data from the specified Data Backup Register. + * + * @param BKP_DR - specifies the Data Backup Register. + * This parameter can be BKP_DRx where x=[1, 42]. + * + * @return none + */ +uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)BKP_BASE; + tmp += BKP_DR; + + return (*(__IO uint16_t *)tmp); +} + +/********************************************************************* + * @fn BKP_GetFlagStatus + * + * @brief Checks whether the Tamper Pin Event flag is set or not. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus BKP_GetFlagStatus(void) +{ + if(BKP->TPCSR & (1 << 8)) + { + return SET; + } + else + { + return RESET; + } +} + +/********************************************************************* + * @fn BKP_ClearFlag + * + * @brief Clears Tamper Pin Event pending flag. + * + * @return none + */ +void BKP_ClearFlag(void) +{ + BKP->TPCSR |= BKP_CTE; +} + +/********************************************************************* + * @fn BKP_GetITStatus + * + * @brief Checks whether the Tamper Pin Interrupt has occurred or not. + * + * @return ITStatus - SET or RESET. + */ +ITStatus BKP_GetITStatus(void) +{ + if(BKP->TPCSR & (1 << 9)) + { + return SET; + } + else + { + return RESET; + } +} + +/********************************************************************* + * @fn BKP_ClearITPendingBit + * + * @brief Clears Tamper Pin Interrupt pending bit. + * + * @return none + */ +void BKP_ClearITPendingBit(void) +{ + BKP->TPCSR |= BKP_CTI; +} diff --git a/Peripheral/src/ch32v30x_can.c b/Peripheral/src/ch32v30x_can.c new file mode 100644 index 0000000..e1da1f8 --- /dev/null +++ b/Peripheral/src/ch32v30x_can.c @@ -0,0 +1,1297 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_can.c +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/06 +* Description : This file provides all the CAN firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_can.h" +#include "ch32v30x_rcc.h" + +/* CAN CTLR Register bits */ +#define CTLR_DBF ((uint32_t)0x00010000) + +/* CAN Mailbox Transmit Request */ +#define TMIDxR_TXRQ ((uint32_t)0x00000001) + +/* CAN FCTLR Register bits */ +#define FCTLR_FINIT ((uint32_t)0x00000001) + +/* Time out for INAK bit */ +#define INAK_TIMEOUT ((uint32_t)0x0000FFFF) +/* Time out for SLAK bit */ +#define SLAK_TIMEOUT ((uint32_t)0x0000FFFF) + +/* Flags in TSTATR register */ +#define CAN_FLAGS_TSTATR ((uint32_t)0x08000000) +/* Flags in RFIFO1 register */ +#define CAN_FLAGS_RFIFO1 ((uint32_t)0x04000000) +/* Flags in RFIFO0 register */ +#define CAN_FLAGS_RFIFO0 ((uint32_t)0x02000000) +/* Flags in STATR register */ +#define CAN_FLAGS_STATR ((uint32_t)0x01000000) +/* Flags in ERRSR register */ +#define CAN_FLAGS_ERRSR ((uint32_t)0x00F00000) + +/* Mailboxes definition */ +#define CAN_TXMAILBOX_0 ((uint8_t)0x00) +#define CAN_TXMAILBOX_1 ((uint8_t)0x01) +#define CAN_TXMAILBOX_2 ((uint8_t)0x02) + +#define CAN_MODE_MASK ((uint32_t)0x00000003) + +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit); + +/********************************************************************* + * @fn CAN_DeInit + * + * @brief Deinitializes the CAN peripheral registers to their default reset + * values. + * + * @param CANx - where x can be 1 or 2 to select the CAN peripheral. + * + * @return none + */ +void CAN_DeInit(CAN_TypeDef *CANx) +{ + if(CANx == CAN1) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, DISABLE); + } + else + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN2, DISABLE); + } +} + +/********************************************************************* + * @fn CAN_Init + * + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_InitStruct - pointer to a CAN_InitTypeDef structure that + * contains the configuration information for the CAN peripheral. + * + * @return InitStatus - CAN InitStatus state. + * CAN_InitStatus_Failed. + * CAN_InitStatus_Success. + */ +uint8_t CAN_Init(CAN_TypeDef *CANx, CAN_InitTypeDef *CAN_InitStruct) +{ + uint8_t InitStatus = CAN_InitStatus_Failed; + uint32_t wait_ack = 0x00000000; + uint32_t chipid = DBGMCU_GetCHIPID(); + uint32_t chippackid = (chipid >> 4) & 0xf; + if(chippackid >= 4 && chippackid <= 7) + { + if(CAN1 == CANx) + { + (*(__IO uint32_t *)(0x40021010)) |= 0x2000000; + (*(__IO uint32_t *)(0x40021010)) &= ~(0x2000000); + }else if(CAN2 == CANx) + { + (*(__IO uint32_t *)(0x40021010)) |= 0x4000000; + (*(__IO uint32_t *)(0x40021010)) &= ~(0x4000000); + } + + CANx->CTLR &= ~0x2; + CANx->CTLR |= 0x1; + + while(!(CANx->STATR & 0x1) && (wait_ack != 0x0000FFFF)) + { + wait_ack++; + } + + if((CANx->STATR & 0x1)) + { + CANx->BTIMR = ( uint32_t)0xC1100000| \ + ((uint32_t)SystemCoreClock/(((((*(__IO uint32_t *)(0x40021004)) >> 8) & 0x7) < 0x4) ? 1 : (uint32_t)0x2<<(((*(__IO uint32_t *)(0x40021004)) >> 8) & 0x3))/4000000 - 1); + } + else + { + return CAN_InitStatus_Failed; + } + CANx->CTLR &= ~0x1; + wait_ack = 0; + while((CANx->STATR & 0x1) && (wait_ack != 0x0000FFFF)) + { + wait_ack++; + } + + if((CANx->STATR & 0x1)){ + return CAN_InitStatus_Failed; + } + + (*(__IO uint32_t *)(0x4000660C)) |= 0x3; + (*(__IO uint32_t *)(0x40006640)) = 0x0; + (*(__IO uint32_t *)(0x40006644)) = 0x0; + (*(__IO uint32_t *)(0x40006648)) = 0x0; + (*(__IO uint32_t *)(0x4000664C)) = 0x0; + (*(__IO uint32_t *)(0x4000661C)) |= 0x3; + (*(__IO uint32_t *)(0x40006600)) &= ~0x1; + CAN_SlaveStartBank(1); + if(CAN1 == CANx) + { + (*(__IO uint32_t *)(0x40006580)) |= 0x3; + while(!((*(__IO uint32_t *)(0x4000640C)) & 0x3)); + (*(__IO uint32_t *)(0x4000640C)) = 0x38; + }else if (CAN2 == CANx) + { + (*(__IO uint32_t *)(0x40006980)) |= 0x3; + while(!((*(__IO uint32_t *)(0x4000680C)) & 0x3)); + (*(__IO uint32_t *)(0x4000680C)) = 0x38; + } + + if(CAN1 == CANx) + { + (*(__IO uint32_t *)(0x40021010)) |= 0x2000000; + (*(__IO uint32_t *)(0x40021010)) &= ~(0x2000000); + }else if(CAN2 == CANx) + { + (*(__IO uint32_t *)(0x40021010)) |= 0x4000000; + (*(__IO uint32_t *)(0x40021010)) &= ~(0x4000000); + } + + (*(__IO uint32_t *)(0x40006600)) |= 0x1; + (*(__IO uint32_t *)(0x4000660C)) |= 0x3; + (*(__IO uint32_t *)(0x4000661C)) |= 0x3; + (*(__IO uint32_t *)(0x40006600)) &= ~0x1; + CAN_SlaveStartBank(1); + wait_ack = 0; + } + + CANx->CTLR &= (~(uint32_t)CAN_CTLR_SLEEP); + CANx->CTLR |= CAN_CTLR_INRQ; + + while(((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + if((CANx->STATR & CAN_STATR_INAK) != CAN_STATR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + if(CAN_InitStruct->CAN_TTCM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_TTCM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_TTCM; + } + + if(CAN_InitStruct->CAN_ABOM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_ABOM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_ABOM; + } + + if(CAN_InitStruct->CAN_AWUM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_AWUM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_AWUM; + } + + if(CAN_InitStruct->CAN_NART == ENABLE) + { + CANx->CTLR |= CAN_CTLR_NART; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_NART; + } + + if(CAN_InitStruct->CAN_RFLM == ENABLE) + { + CANx->CTLR |= CAN_CTLR_RFLM; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_RFLM; + } + + if(CAN_InitStruct->CAN_TXFP == ENABLE) + { + CANx->CTLR |= CAN_CTLR_TXFP; + } + else + { + CANx->CTLR &= ~(uint32_t)CAN_CTLR_TXFP; + } + + CANx->BTIMR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | + ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | + ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | + ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | + ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1); + CANx->CTLR &= ~(uint32_t)CAN_CTLR_INRQ; + wait_ack = 0; + + while(((CANx->STATR & CAN_STATR_INAK) == CAN_STATR_INAK) && (wait_ack != INAK_TIMEOUT)) + { + wait_ack++; + } + + if((CANx->STATR & CAN_STATR_INAK) == CAN_STATR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + InitStatus = CAN_InitStatus_Success; + } + } + + return InitStatus; +} + +/********************************************************************* + * @fn CAN_FilterInit + * + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_FilterInitStruct. + * + * @param CAN_FilterInitStruct - pointer to a CAN_FilterInitTypeDef + * structure that contains the configuration information. + * + * @return none + */ +void CAN_FilterInit(CAN_FilterInitTypeDef *CAN_FilterInitStruct) +{ + uint32_t filter_number_bit_pos = 0; + + filter_number_bit_pos = ((uint32_t)1) << CAN_FilterInitStruct->CAN_FilterNumber; + CAN1->FCTLR |= FCTLR_FINIT; + CAN1->FWR &= ~(uint32_t)filter_number_bit_pos; + + if(CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_16bit) + { + CAN1->FSCFGR &= ~(uint32_t)filter_number_bit_pos; + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh); + } + + if(CAN_FilterInitStruct->CAN_FilterScale == CAN_FilterScale_32bit) + { + CAN1->FSCFGR |= filter_number_bit_pos; + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR1 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterIdLow); + + CAN1->sFilterRegister[CAN_FilterInitStruct->CAN_FilterNumber].FR2 = + ((0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdHigh) << 16) | + (0x0000FFFF & (uint32_t)CAN_FilterInitStruct->CAN_FilterMaskIdLow); + } + + if(CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdMask) + { + CAN1->FMCFGR &= ~(uint32_t)filter_number_bit_pos; + } + else + { + CAN1->FMCFGR |= (uint32_t)filter_number_bit_pos; + } + + if(CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO0) + { + CAN1->FAFIFOR &= ~(uint32_t)filter_number_bit_pos; + } + + if(CAN_FilterInitStruct->CAN_FilterFIFOAssignment == CAN_Filter_FIFO1) + { + CAN1->FAFIFOR |= (uint32_t)filter_number_bit_pos; + } + + if(CAN_FilterInitStruct->CAN_FilterActivation == ENABLE) + { + CAN1->FWR |= filter_number_bit_pos; + } + + CAN1->FCTLR &= ~FCTLR_FINIT; +} + +/********************************************************************* + * @fn CAN_StructInit + * + * @brief Fills each CAN_InitStruct member with its default value. + * + * @param CAN_InitStruct - pointer to a CAN_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void CAN_StructInit(CAN_InitTypeDef *CAN_InitStruct) +{ + CAN_InitStruct->CAN_TTCM = DISABLE; + CAN_InitStruct->CAN_ABOM = DISABLE; + CAN_InitStruct->CAN_AWUM = DISABLE; + CAN_InitStruct->CAN_NART = DISABLE; + CAN_InitStruct->CAN_RFLM = DISABLE; + CAN_InitStruct->CAN_TXFP = DISABLE; + CAN_InitStruct->CAN_Mode = CAN_Mode_Normal; + CAN_InitStruct->CAN_SJW = CAN_SJW_1tq; + CAN_InitStruct->CAN_BS1 = CAN_BS1_4tq; + CAN_InitStruct->CAN_BS2 = CAN_BS2_3tq; + CAN_InitStruct->CAN_Prescaler = 1; +} + +/********************************************************************* + * @fn CAN_SlaveStartBank + * + * @brief This function applies only to CH32 Connectivity line devices. + * + * @param CAN_BankNumber - Select the start slave bank filter from 1..27. + * + * @return none + */ +void CAN_SlaveStartBank(uint8_t CAN_BankNumber) +{ + CAN1->FCTLR |= FCTLR_FINIT; + CAN1->FCTLR &= (uint32_t)0xFFFFC0F1; + CAN1->FCTLR |= (uint32_t)(CAN_BankNumber) << 8; + CAN1->FCTLR &= ~FCTLR_FINIT; +} + +/********************************************************************* + * @fn CAN_DBGFreeze + * + * @brief Enables or disables the DBG Freeze for CAN. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void CAN_DBGFreeze(CAN_TypeDef *CANx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + CANx->CTLR |= CTLR_DBF; + } + else + { + CANx->CTLR &= ~CTLR_DBF; + } +} + +/********************************************************************* + * @fn CAN_TTComModeCmd + * + * @brief Enables or disabes the CAN Time TriggerOperation communication mode. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * NewState - ENABLE or DISABLE. + * Note- + * DLC must be programmed as 8 in order Time Stamp (2 bytes) to be + * sent over the CAN bus. + * + * @return none + */ +void CAN_TTComModeCmd(CAN_TypeDef *CANx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + CANx->CTLR |= CAN_CTLR_TTCM; + + CANx->sTxMailBox[0].TXMDTR |= ((uint32_t)CAN_TXMDT0R_TGT); + CANx->sTxMailBox[1].TXMDTR |= ((uint32_t)CAN_TXMDT1R_TGT); + CANx->sTxMailBox[2].TXMDTR |= ((uint32_t)CAN_TXMDT2R_TGT); + } + else + { + CANx->CTLR &= (uint32_t)(~(uint32_t)CAN_CTLR_TTCM); + + CANx->sTxMailBox[0].TXMDTR &= ((uint32_t)~CAN_TXMDT0R_TGT); + CANx->sTxMailBox[1].TXMDTR &= ((uint32_t)~CAN_TXMDT1R_TGT); + CANx->sTxMailBox[2].TXMDTR &= ((uint32_t)~CAN_TXMDT2R_TGT); + } +} + +/********************************************************************* + * @fn CAN_Transmit + * + * @brief Initiates the transmission of a message. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * TxMessage - pointer to a structure which contains CAN Id, CAN + * DLC and CAN data. + * + * @return transmit_mailbox - The number of the mailbox that is used for + * transmission or CAN_TxStatus_NoMailBox if there is no empty mailbox. + */ +uint8_t CAN_Transmit(CAN_TypeDef *CANx, CanTxMsg *TxMessage) +{ + uint8_t transmit_mailbox = 0; + + if((CANx->TSTATR & CAN_TSTATR_TME0) == CAN_TSTATR_TME0) + { + transmit_mailbox = 0; + } + else if((CANx->TSTATR & CAN_TSTATR_TME1) == CAN_TSTATR_TME1) + { + transmit_mailbox = 1; + } + else if((CANx->TSTATR & CAN_TSTATR_TME2) == CAN_TSTATR_TME2) + { + transmit_mailbox = 2; + } + else + { + transmit_mailbox = CAN_TxStatus_NoMailBox; + } + + if(transmit_mailbox != CAN_TxStatus_NoMailBox) + { + CANx->sTxMailBox[transmit_mailbox].TXMIR &= TMIDxR_TXRQ; + if(TxMessage->IDE == CAN_Id_Standard) + { + CANx->sTxMailBox[transmit_mailbox].TXMIR |= ((TxMessage->StdId << 21) | + TxMessage->RTR); + } + else + { + CANx->sTxMailBox[transmit_mailbox].TXMIR |= ((TxMessage->ExtId << 3) | + TxMessage->IDE | + TxMessage->RTR); + } + + TxMessage->DLC &= (uint8_t)0x0000000F; + CANx->sTxMailBox[transmit_mailbox].TXMDTR &= (uint32_t)0xFFFFFFF0; + CANx->sTxMailBox[transmit_mailbox].TXMDTR |= TxMessage->DLC; + + CANx->sTxMailBox[transmit_mailbox].TXMDLR = (((uint32_t)TxMessage->Data[3] << 24) | + ((uint32_t)TxMessage->Data[2] << 16) | + ((uint32_t)TxMessage->Data[1] << 8) | + ((uint32_t)TxMessage->Data[0])); + CANx->sTxMailBox[transmit_mailbox].TXMDHR = (((uint32_t)TxMessage->Data[7] << 24) | + ((uint32_t)TxMessage->Data[6] << 16) | + ((uint32_t)TxMessage->Data[5] << 8) | + ((uint32_t)TxMessage->Data[4])); + CANx->sTxMailBox[transmit_mailbox].TXMIR |= TMIDxR_TXRQ; + } + + return transmit_mailbox; +} + +/********************************************************************* + * @fn CAN_TransmitStatus + * + * @brief Checks the transmission of a message. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * TransmitMailbox - the number of the mailbox that is used for + * transmission. + * + * @return state - + * CAN_TxStatus_Ok. + * CAN_TxStatus_Failed. + */ +uint8_t CAN_TransmitStatus(CAN_TypeDef *CANx, uint8_t TransmitMailbox) +{ + uint32_t state = 0; + + switch(TransmitMailbox) + { + case(CAN_TXMAILBOX_0): + state = CANx->TSTATR & (CAN_TSTATR_RQCP0 | CAN_TSTATR_TXOK0 | CAN_TSTATR_TME0); + break; + + case(CAN_TXMAILBOX_1): + state = CANx->TSTATR & (CAN_TSTATR_RQCP1 | CAN_TSTATR_TXOK1 | CAN_TSTATR_TME1); + break; + + case(CAN_TXMAILBOX_2): + state = CANx->TSTATR & (CAN_TSTATR_RQCP2 | CAN_TSTATR_TXOK2 | CAN_TSTATR_TME2); + break; + + default: + state = CAN_TxStatus_Failed; + break; + } + + switch(state) + { + case(0x0): + state = CAN_TxStatus_Pending; + break; + + case(CAN_TSTATR_RQCP0 | CAN_TSTATR_TME0): + state = CAN_TxStatus_Failed; + break; + + case(CAN_TSTATR_RQCP1 | CAN_TSTATR_TME1): + state = CAN_TxStatus_Failed; + break; + + case(CAN_TSTATR_RQCP2 | CAN_TSTATR_TME2): + state = CAN_TxStatus_Failed; + break; + + case(CAN_TSTATR_RQCP0 | CAN_TSTATR_TXOK0 | CAN_TSTATR_TME0): + state = CAN_TxStatus_Ok; + break; + + case(CAN_TSTATR_RQCP1 | CAN_TSTATR_TXOK1 | CAN_TSTATR_TME1): + state = CAN_TxStatus_Ok; + break; + + case(CAN_TSTATR_RQCP2 | CAN_TSTATR_TXOK2 | CAN_TSTATR_TME2): + state = CAN_TxStatus_Ok; + break; + + default: + state = CAN_TxStatus_Failed; + break; + } + + return (uint8_t)state; +} + +/********************************************************************* + * @fn CAN_CancelTransmit + * + * @brief Cancels a transmit request. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * Mailbox - Mailbox number. + * CAN_TXMAILBOX_0. + * CAN_TXMAILBOX_1. + * CAN_TXMAILBOX_2. + * + * @return none + */ +void CAN_CancelTransmit(CAN_TypeDef *CANx, uint8_t Mailbox) +{ + switch(Mailbox) + { + case(CAN_TXMAILBOX_0): + CANx->TSTATR |= CAN_TSTATR_ABRQ0; + break; + + case(CAN_TXMAILBOX_1): + CANx->TSTATR |= CAN_TSTATR_ABRQ1; + break; + + case(CAN_TXMAILBOX_2): + CANx->TSTATR |= CAN_TSTATR_ABRQ2; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn CAN_Receive + * + * @brief Receives a message. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * FIFONumber - Receive FIFO number. + * CAN_FIFO0. + * CAN_FIFO1. + * RxMessage - pointer to a structure receive message which contains + * CAN Id, CAN DLC, CAN datas and FMI number. + * + * @return none + */ +void CAN_Receive(CAN_TypeDef *CANx, uint8_t FIFONumber, CanRxMsg *RxMessage) +{ + RxMessage->IDE = (uint8_t)0x04 & CANx->sFIFOMailBox[FIFONumber].RXMIR; + + if(RxMessage->IDE == CAN_Id_Standard) + { + RxMessage->StdId = (uint32_t)0x000007FF & (CANx->sFIFOMailBox[FIFONumber].RXMIR >> 21); + } + else + { + RxMessage->ExtId = (uint32_t)0x1FFFFFFF & (CANx->sFIFOMailBox[FIFONumber].RXMIR >> 3); + } + + RxMessage->RTR = (uint8_t)0x02 & CANx->sFIFOMailBox[FIFONumber].RXMIR; + RxMessage->DLC = (uint8_t)0x0F & CANx->sFIFOMailBox[FIFONumber].RXMDTR; + RxMessage->FMI = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDTR >> 8); + RxMessage->Data[0] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RXMDLR; + RxMessage->Data[1] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 8); + RxMessage->Data[2] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 16); + RxMessage->Data[3] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDLR >> 24); + RxMessage->Data[4] = (uint8_t)0xFF & CANx->sFIFOMailBox[FIFONumber].RXMDHR; + RxMessage->Data[5] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 8); + RxMessage->Data[6] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 16); + RxMessage->Data[7] = (uint8_t)0xFF & (CANx->sFIFOMailBox[FIFONumber].RXMDHR >> 24); + + if(FIFONumber == CAN_FIFO0) + { + CANx->RFIFO0 |= CAN_RFIFO0_RFOM0; + } + else + { + CANx->RFIFO1 |= CAN_RFIFO1_RFOM1; + } +} + +/********************************************************************* + * @fn CAN_FIFORelease + * + * @brief Releases the specified FIFO. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * FIFONumber - Receive FIFO number. + * CAN_FIFO0. + * CAN_FIFO1. + * + * @return none + */ +void CAN_FIFORelease(CAN_TypeDef *CANx, uint8_t FIFONumber) +{ + if(FIFONumber == CAN_FIFO0) + { + CANx->RFIFO0 |= CAN_RFIFO0_RFOM0; + } + else + { + CANx->RFIFO1 |= CAN_RFIFO1_RFOM1; + } +} + +/********************************************************************* + * @fn CAN_MessagePending + * + * @brief Returns the number of pending messages. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * FIFONumber - Receive FIFO number. + * CAN_FIFO0. + * CAN_FIFO1. + * + * @return message_pending: which is the number of pending message. + */ +uint8_t CAN_MessagePending(CAN_TypeDef *CANx, uint8_t FIFONumber) +{ + uint8_t message_pending = 0; + + if(FIFONumber == CAN_FIFO0) + { + message_pending = (uint8_t)(CANx->RFIFO0 & (uint32_t)0x03); + } + else if(FIFONumber == CAN_FIFO1) + { + message_pending = (uint8_t)(CANx->RFIFO1 & (uint32_t)0x03); + } + else + { + message_pending = 0; + } + + return message_pending; +} + +/********************************************************************* + * @fn CAN_OperatingModeRequest + * + * @brief Select the CAN Operation mode. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_OperatingMode - CAN Operating Mode. + * CAN_OperatingMode_Initialization. + * CAN_OperatingMode_Normal. + * CAN_OperatingMode_Sleep. + * + * @return status - + * CAN_ModeStatus_Failed - CAN failed entering the specific mode. + * CAN_ModeStatus_Success - CAN Succeed entering the specific mode. + */ +uint8_t CAN_OperatingModeRequest(CAN_TypeDef *CANx, uint8_t CAN_OperatingMode) +{ + uint8_t status = CAN_ModeStatus_Failed; + uint32_t timeout = INAK_TIMEOUT; + + if(CAN_OperatingMode == CAN_OperatingMode_Initialization) + { + CANx->CTLR = (uint32_t)((CANx->CTLR & (uint32_t)(~(uint32_t)CAN_CTLR_SLEEP)) | CAN_CTLR_INRQ); + + while(((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_INAK) && (timeout != 0)) + { + timeout--; + } + if((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_INAK) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else if(CAN_OperatingMode == CAN_OperatingMode_Normal) + { + CANx->CTLR &= (uint32_t)(~(CAN_CTLR_SLEEP | CAN_CTLR_INRQ)); + + while(((CANx->STATR & CAN_MODE_MASK) != 0) && (timeout != 0)) + { + timeout--; + } + if((CANx->STATR & CAN_MODE_MASK) != 0) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else if(CAN_OperatingMode == CAN_OperatingMode_Sleep) + { + CANx->CTLR = (uint32_t)((CANx->CTLR & (uint32_t)(~(uint32_t)CAN_CTLR_INRQ)) | CAN_CTLR_SLEEP); + + while(((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_SLAK) && (timeout != 0)) + { + timeout--; + } + if((CANx->STATR & CAN_MODE_MASK) != CAN_STATR_SLAK) + { + status = CAN_ModeStatus_Failed; + } + else + { + status = CAN_ModeStatus_Success; + } + } + else + { + status = CAN_ModeStatus_Failed; + } + + return (uint8_t)status; +} + +/********************************************************************* + * @fn CAN_Sleep + * + * @brief Enters the low power mode. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return sleepstatus - + * CAN_Sleep_Ok. + * CAN_Sleep_Failed. + */ +uint8_t CAN_Sleep(CAN_TypeDef *CANx) +{ + uint8_t sleepstatus = CAN_Sleep_Failed; + + CANx->CTLR = (((CANx->CTLR) & (uint32_t)(~(uint32_t)CAN_CTLR_INRQ)) | CAN_CTLR_SLEEP); + + if((CANx->STATR & (CAN_STATR_SLAK | CAN_STATR_INAK)) == CAN_STATR_SLAK) + { + sleepstatus = CAN_Sleep_Ok; + } + + return (uint8_t)sleepstatus; +} + +/********************************************************************* + * @fn CAN_WakeUp + * + * @brief Wakes the CAN up. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return wakeupstatus - + * CAN_WakeUp_Ok. + * CAN_WakeUp_Failed. + */ +uint8_t CAN_WakeUp(CAN_TypeDef *CANx) +{ + uint32_t wait_slak = SLAK_TIMEOUT; + uint8_t wakeupstatus = CAN_WakeUp_Failed; + + CANx->CTLR &= ~(uint32_t)CAN_CTLR_SLEEP; + + while(((CANx->STATR & CAN_STATR_SLAK) == CAN_STATR_SLAK) && (wait_slak != 0x00)) + { + wait_slak--; + } + if((CANx->STATR & CAN_STATR_SLAK) != CAN_STATR_SLAK) + { + wakeupstatus = CAN_WakeUp_Ok; + } + + return (uint8_t)wakeupstatus; +} + +/********************************************************************* + * @fn CAN_GetLastErrorCode + * + * @brief Returns the CANx's last error code (LEC). + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return errorcode - specifies the Error code. + * CAN_ErrorCode_NoErr - No Error. + * CAN_ErrorCode_StuffErr - Stuff Error. + * CAN_ErrorCode_FormErr - Form Error. + * CAN_ErrorCode_ACKErr - Acknowledgment Error. + * CAN_ErrorCode_BitRecessiveErr - Bit Recessive Error. + * CAN_ErrorCode_BitDominantErr - Bit Dominant Error. + * CAN_ErrorCode_CRCErr - CRC Error. + * CAN_ErrorCode_SoftwareSetErr - Software Set Error. + */ +uint8_t CAN_GetLastErrorCode(CAN_TypeDef *CANx) +{ + uint8_t errorcode = 0; + + errorcode = (((uint8_t)CANx->ERRSR) & (uint8_t)CAN_ERRSR_LEC); + + return errorcode; +} + +/********************************************************************* + * @fn CAN_GetReceiveErrorCounter + * + * @brief Returns the CANx Receive Error Counter (REC). + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * Note- + * In case of an error during reception, this counter is incremented + * by 1 or by 8 depending on the error condition as defined by the CAN + * standard. After every successful reception, the counter is + * decremented by 1 or reset to 120 if its value was higher than 128. + * When the counter value exceeds 127, the CAN controller enters the + * error passive state. + * @return counter - CAN Receive Error Counter. + */ +uint8_t CAN_GetReceiveErrorCounter(CAN_TypeDef *CANx) +{ + uint8_t counter = 0; + + counter = (uint8_t)((CANx->ERRSR & CAN_ERRSR_REC) >> 24); + + return counter; +} + +/********************************************************************* + * @fn CAN_GetLSBTransmitErrorCounter + * + * @brief Returns the LSB of the 9-bit CANx Transmit Error Counter(TEC). + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * + * @return counter - LSB of the 9-bit CAN Transmit Error Counter. + */ +uint8_t CAN_GetLSBTransmitErrorCounter(CAN_TypeDef *CANx) +{ + uint8_t counter = 0; + + counter = (uint8_t)((CANx->ERRSR & CAN_ERRSR_TEC) >> 16); + + return counter; +} + +/********************************************************************* + * @fn CAN_ITConfig + * + * @brief Enables or disables the specified CANx interrupts. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_IT - specifies the CAN interrupt sources to be enabled or disabled. + * CAN_IT_TME. + * CAN_IT_FMP0. + * CAN_IT_FF0. + * CAN_IT_FOV0. + * CAN_IT_FMP1. + * CAN_IT_FF1. + * CAN_IT_FOV1. + * CAN_IT_EWG. + * CAN_IT_EPV. + * CAN_IT_LEC. + * CAN_IT_ERR. + * CAN_IT_WKU. + * CAN_IT_SLK. + * NewState - ENABLE or DISABLE. + * + * @return counter - LSB of the 9-bit CAN Transmit Error Counter. + */ +void CAN_ITConfig(CAN_TypeDef *CANx, uint32_t CAN_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + CANx->INTENR |= CAN_IT; + } + else + { + CANx->INTENR &= ~CAN_IT; + } +} + +/********************************************************************* + * @fn CAN_GetFlagStatus + * + * @brief Checks whether the specified CAN flag is set or not. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_FLAG - specifies the flag to check. + * CAN_FLAG_EWG. + * CAN_FLAG_EPV. + * CAN_FLAG_BOF. + * CAN_FLAG_RQCP0. + * CAN_FLAG_RQCP1. + * CAN_FLAG_RQCP2. + * CAN_FLAG_FMP1. + * CAN_FLAG_FF1. + * CAN_FLAG_FOV1. + * CAN_FLAG_FMP0. + * CAN_FLAG_FF0. + * CAN_FLAG_FOV0. + * CAN_FLAG_WKU. + * CAN_FLAG_SLAK. + * CAN_FLAG_LEC. + * NewState - ENABLE or DISABLE. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus CAN_GetFlagStatus(CAN_TypeDef *CANx, uint32_t CAN_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((CAN_FLAG & CAN_FLAGS_ERRSR) != (uint32_t)RESET) + { + if((CANx->ERRSR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_STATR) != (uint32_t)RESET) + { + if((CANx->STATR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_TSTATR) != (uint32_t)RESET) + { + if((CANx->TSTATR & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else if((CAN_FLAG & CAN_FLAGS_RFIFO0) != (uint32_t)RESET) + { + if((CANx->RFIFO0 & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((uint32_t)(CANx->RFIFO1 & (CAN_FLAG & 0x000FFFFF)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/********************************************************************* + * @fn CAN_ClearFlag + * + * @brief Clears the CAN's pending flags. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_FLAG - specifies the flag to clear. + * CAN_FLAG_RQCP0. + * CAN_FLAG_RQCP1. + * CAN_FLAG_RQCP2. + * CAN_FLAG_FF1. + * CAN_FLAG_FOV1. + * CAN_FLAG_FF0. + * CAN_FLAG_FOV0. + * CAN_FLAG_WKU. + * CAN_FLAG_SLAK. + * CAN_FLAG_LEC. + * + * @return none + */ +void CAN_ClearFlag(CAN_TypeDef *CANx, uint32_t CAN_FLAG) +{ + uint32_t flagtmp = 0; + + if(CAN_FLAG == CAN_FLAG_LEC) + { + CANx->ERRSR = (uint32_t)RESET; + } + else + { + flagtmp = CAN_FLAG & 0x000FFFFF; + + if((CAN_FLAG & CAN_FLAGS_RFIFO0) != (uint32_t)RESET) + { + CANx->RFIFO0 = (uint32_t)(flagtmp); + } + else if((CAN_FLAG & CAN_FLAGS_RFIFO1) != (uint32_t)RESET) + { + CANx->RFIFO1 = (uint32_t)(flagtmp); + } + else if((CAN_FLAG & CAN_FLAGS_TSTATR) != (uint32_t)RESET) + { + CANx->TSTATR = (uint32_t)(flagtmp); + } + else + { + CANx->STATR = (uint32_t)(flagtmp); + } + } +} + +/********************************************************************* + * @fn CAN_GetITStatus + * + * @brief Checks whether the specified CANx interrupt has occurred or not. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_IT - specifies the CAN interrupt source to check. + * CAN_IT_TME. + * CAN_IT_FMP0. + * CAN_IT_FF0. + * CAN_IT_FOV0. + * CAN_IT_FMP1. + * CAN_IT_FF1. + * CAN_IT_FOV1. + * CAN_IT_WKU. + * CAN_IT_SLK. + * CAN_IT_EWG. + * CAN_IT_EPV. + * CAN_IT_BOF. + * CAN_IT_LEC. + * CAN_IT_ERR. + * + * @return ITStatus - SET or RESET. + */ +ITStatus CAN_GetITStatus(CAN_TypeDef *CANx, uint32_t CAN_IT) +{ + ITStatus itstatus = RESET; + + if((CANx->INTENR & CAN_IT) != RESET) + { + switch(CAN_IT) + { + case CAN_IT_TME: + itstatus = CheckITStatus(CANx->TSTATR, CAN_TSTATR_RQCP0 | CAN_TSTATR_RQCP1 | CAN_TSTATR_RQCP2); + break; + + case CAN_IT_FMP0: + itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FMP0); + break; + + case CAN_IT_FF0: + itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FULL0); + break; + + case CAN_IT_FOV0: + itstatus = CheckITStatus(CANx->RFIFO0, CAN_RFIFO0_FOVR0); + break; + + case CAN_IT_FMP1: + itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FMP1); + break; + + case CAN_IT_FF1: + itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FULL1); + break; + + case CAN_IT_FOV1: + itstatus = CheckITStatus(CANx->RFIFO1, CAN_RFIFO1_FOVR1); + break; + + case CAN_IT_WKU: + itstatus = CheckITStatus(CANx->STATR, CAN_STATR_WKUI); + break; + + case CAN_IT_SLK: + itstatus = CheckITStatus(CANx->STATR, CAN_STATR_SLAKI); + break; + + case CAN_IT_EWG: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_EWGF); + break; + + case CAN_IT_EPV: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_EPVF); + break; + + case CAN_IT_BOF: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_BOFF); + break; + + case CAN_IT_LEC: + itstatus = CheckITStatus(CANx->ERRSR, CAN_ERRSR_LEC); + break; + + case CAN_IT_ERR: + itstatus = CheckITStatus(CANx->STATR, CAN_STATR_ERRI); + break; + + default: + itstatus = RESET; + break; + } + } + else + { + itstatus = RESET; + } + + return itstatus; +} + +/********************************************************************* + * @fn CAN_ClearITPendingBit + * + * @brief Clears the CANx's interrupt pending bits. + * + * @param CANx - where x can be 1 to select the CAN peripheral. + * CAN_IT - specifies the interrupt pending bit to clear. + * CAN_IT_TME. + * CAN_IT_FF0. + * CAN_IT_FOV0. + * CAN_IT_FF1. + * CAN_IT_FOV1. + * CAN_IT_WKU. + * CAN_IT_SLK. + * CAN_IT_EWG. + * CAN_IT_EPV. + * CAN_IT_BOF. + * CAN_IT_LEC. + * CAN_IT_ERR. + * + * @return none + */ +void CAN_ClearITPendingBit(CAN_TypeDef *CANx, uint32_t CAN_IT) +{ + switch(CAN_IT) + { + case CAN_IT_TME: + CANx->TSTATR = CAN_TSTATR_RQCP0 | CAN_TSTATR_RQCP1 | CAN_TSTATR_RQCP2; + break; + + case CAN_IT_FF0: + CANx->RFIFO0 = CAN_RFIFO0_FULL0; + break; + + case CAN_IT_FOV0: + CANx->RFIFO0 = CAN_RFIFO0_FOVR0; + break; + + case CAN_IT_FF1: + CANx->RFIFO1 = CAN_RFIFO1_FULL1; + break; + + case CAN_IT_FOV1: + CANx->RFIFO1 = CAN_RFIFO1_FOVR1; + break; + + case CAN_IT_WKU: + CANx->STATR = CAN_STATR_WKUI; + break; + + case CAN_IT_SLK: + CANx->STATR = CAN_STATR_SLAKI; + break; + + case CAN_IT_EWG: + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_EPV: + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_BOF: + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_LEC: + CANx->ERRSR = RESET; + CANx->STATR = CAN_STATR_ERRI; + break; + + case CAN_IT_ERR: + CANx->ERRSR = RESET; + CANx->STATR = CAN_STATR_ERRI; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn CheckITStatus + * + * @brief Checks whether the CAN interrupt has occurred or not. + * + * @param CAN_Reg - specifies the CAN interrupt register to check + * It_Bit - specifies the interrupt source bit to check. + * + * @return ITStatus - SET or RESET. + */ +static ITStatus CheckITStatus(uint32_t CAN_Reg, uint32_t It_Bit) +{ + ITStatus pendingbitstatus = RESET; + + if((CAN_Reg & It_Bit) != (uint32_t)RESET) + { + pendingbitstatus = SET; + } + else + { + pendingbitstatus = RESET; + } + + return pendingbitstatus; +} diff --git a/Peripheral/src/ch32v30x_crc.c b/Peripheral/src/ch32v30x_crc.c new file mode 100644 index 0000000..d44ad21 --- /dev/null +++ b/Peripheral/src/ch32v30x_crc.c @@ -0,0 +1,100 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_crc.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the CRC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_crc.h" + +/********************************************************************* + * @fn CRC_ResetDR + * + * @brief Resets the CRC Data register (DR). + * + * @return none + */ +void CRC_ResetDR(void) +{ + CRC->CTLR = CRC_CTLR_RESET; +} + +/********************************************************************* + * @fn CRC_CalcCRC + * + * @brief Computes the 32-bit CRC of a given data word(32-bit). + * + * @param Data - data word(32-bit) to compute its CRC. + * + * @return 32-bit CRC. + */ +uint32_t CRC_CalcCRC(uint32_t Data) +{ + CRC->DATAR = Data; + + return (CRC->DATAR); +} + +/********************************************************************* + * @fn CRC_CalcBlockCRC + * + * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). + * + * @param pBuffer - pointer to the buffer containing the data to be computed. + * BufferLength - length of the buffer to be computed. + * + * @return 32-bit CRC. + */ +uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength) +{ + uint32_t index = 0; + + for(index = 0; index < BufferLength; index++) + { + CRC->DATAR = pBuffer[index]; + } + + return (CRC->DATAR); +} + +/********************************************************************* + * @fn CRC_GetCRC + * + * @brief Returns the current CRC value. + * + * @return 32-bit CRC. + */ +uint32_t CRC_GetCRC(void) +{ + return (CRC->DATAR); +} + +/********************************************************************* + * @fn CRC_SetIDRegister + * + * @brief Stores a 8-bit data in the Independent Data(ID) register. + * + * @param IDValue - 8-bit value to be stored in the ID register. + * + * @return none + */ +void CRC_SetIDRegister(uint8_t IDValue) +{ + CRC->IDATAR = IDValue; +} + +/********************************************************************* + * @fn CRC_GetIDRegister + * + * @brief Returns the 8-bit data stored in the Independent Data(ID) register. + * + * @return 8-bit value of the ID register. + */ +uint8_t CRC_GetIDRegister(void) +{ + return (CRC->IDATAR); +} diff --git a/Peripheral/src/ch32v30x_dac.c b/Peripheral/src/ch32v30x_dac.c new file mode 100644 index 0000000..529ece7 --- /dev/null +++ b/Peripheral/src/ch32v30x_dac.c @@ -0,0 +1,304 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dac.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the DAC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_dac.h" +#include "ch32v30x_rcc.h" + +/* CTLR register Mask */ +#define CTLR_CLEAR_MASK ((uint32_t)0x00000FFE) + +/* DAC Dual Channels SWTR masks */ +#define DUAL_SWTR_SET ((uint32_t)0x00000003) +#define DUAL_SWTR_RESET ((uint32_t)0xFFFFFFFC) + +/* DHR registers offsets */ +#define DHR12R1_OFFSET ((uint32_t)0x00000008) +#define DHR12R2_OFFSET ((uint32_t)0x00000014) +#define DHR12RD_OFFSET ((uint32_t)0x00000020) + +/* DOR register offset */ +#define DOR_OFFSET ((uint32_t)0x0000002C) + +/********************************************************************* + * @fn DAC_DeInit + * + * @brief Deinitializes the DAC peripheral registers to their default reset values. + * + * @return none + */ +void DAC_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_DAC, DISABLE); +} + +/********************************************************************* + * @fn DAC_Init + * + * @brief Initializes the DAC peripheral according to the specified parameters in + * the DAC_InitStruct. + * + * @param DAC_Channel - the selected DAC channel. + * DAC_Channel_1 - DAC Channel1 selected + * DAC_Channel_2 - DAC Channel2 selected + * DAC_InitStruct - pointer to a DAC_InitTypeDef structure. + * + * @return none + */ +void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef *DAC_InitStruct) +{ + uint32_t tmpreg1 = 0, tmpreg2 = 0; + + tmpreg1 = DAC->CTLR; + tmpreg1 &= ~(CTLR_CLEAR_MASK << DAC_Channel); + tmpreg2 = (DAC_InitStruct->DAC_Trigger | DAC_InitStruct->DAC_WaveGeneration | + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude | DAC_InitStruct->DAC_OutputBuffer); + tmpreg1 |= tmpreg2 << DAC_Channel; + DAC->CTLR = tmpreg1; +} + +/********************************************************************* + * @fn DAC_StructInit + * + * @brief Fills each DAC_InitStruct member with its default value. + * + * @param DAC_InitStruct - pointer to a DAC_InitTypeDef structure which will be initialized. + * + * @return none + */ +void DAC_StructInit(DAC_InitTypeDef *DAC_InitStruct) +{ + DAC_InitStruct->DAC_Trigger = DAC_Trigger_None; + DAC_InitStruct->DAC_WaveGeneration = DAC_WaveGeneration_None; + DAC_InitStruct->DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; + DAC_InitStruct->DAC_OutputBuffer = DAC_OutputBuffer_Enable; +} + +/********************************************************************* + * @fn DAC_Cmd + * + * @brief Enables or disables the specified DAC channel. + * + * @param DAC_Channel - the selected DAC channel. + * DAC_Channel_1 - DAC Channel1 selected + * DAC_Channel_2 - DAC Channel2 selected + * NewState - new state of the DAC channel(ENABLE or DISABLE). + * + * @return none + */ +void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DAC->CTLR |= (DAC_EN1 << DAC_Channel); + } + else + { + DAC->CTLR &= ~(DAC_EN1 << DAC_Channel); + } +} + +/********************************************************************* + * @fn DAC_DMACmd + * + * @brief Enables or disables the specified DAC channel DMA request. + * + * @param DAC_Channel - the selected DAC channel. + * DAC_Channel_1 - DAC Channel1 selected + * DAC_Channel_2 - DAC Channel2 selected + * NewState - new state of the DAC channel(ENABLE or DISABLE). + * + * @return none + */ +void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DAC->CTLR |= (DAC_DMAEN1 << DAC_Channel); + } + else + { + DAC->CTLR &= ~(DAC_DMAEN1 << DAC_Channel); + } +} + +/********************************************************************* + * @fn DAC_SoftwareTriggerCmd + * + * @brief Enables or disables the selected DAC channel software trigger. + * + * @param DAC_Channel - the selected DAC channel. + * DAC_Channel_1 - DAC Channel1 selected + * DAC_Channel_2 - DAC Channel2 selected + * NewState - new state of the DAC channel(ENABLE or DISABLE). + * + * @return none + */ +void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DAC->SWTR |= (uint32_t)DAC_SWTRIG1 << (DAC_Channel >> 4); + } + else + { + DAC->SWTR &= ~((uint32_t)DAC_SWTRIG1 << (DAC_Channel >> 4)); + } +} + +/********************************************************************* + * @fn DAC_DualSoftwareTriggerCmd + * + * @brief Enables or disables the two DAC channel software trigger. + * + * @param NewState - new state of the DAC channel(ENABLE or DISABLE). + * + * @return none + */ +void DAC_DualSoftwareTriggerCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DAC->SWTR |= DUAL_SWTR_SET; + } + else + { + DAC->SWTR &= DUAL_SWTR_RESET; + } +} + +/********************************************************************* + * @fn DAC_WaveGenerationCmd + * + * @brief Enables or disables the selected DAC channel wave generation. + * + * @param DAC_Channel - the selected DAC channel. + * DAC_Channel_1 - DAC Channel1 selected + * DAC_Channel_2 - DAC Channel2 selected + * DAC_Wave - Specifies the wave type to enable or disable. + * DAC_Wave_Noise - noise wave generation + * DAC_Wave_Triangle - triangle wave generation + * NewState - new state of the DAC channel(ENABLE or DISABLE). + * + * @return none + */ +void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DAC->CTLR |= DAC_Wave << DAC_Channel; + } + else + { + DAC->CTLR &= ~(DAC_Wave << DAC_Channel); + } +} + +/********************************************************************* + * @fn DAC_SetChannel1Data + * + * @brief Set the specified data holding register value for DAC channel1. + * + * @param DAC_Align - Specifies the data alignment for DAC channel1. + * DAC_Align_8b_R - 8bit right data alignment selected + * DAC_Align_12b_L - 12bit left data alignment selected + * DAC_Align_12b_R - 12bit right data alignment selected + * Data - Data to be loaded in the selected data holding register. + * + * @return none + */ +void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R1_OFFSET + DAC_Align; + + *(__IO uint32_t *)tmp = Data; +} + +/********************************************************************* + * @fn DAC_SetChannel2Data + * + * @brief Set the specified data holding register value for DAC channel2. + * + * @param DAC_Align - Specifies the data alignment for DAC channel1. + * DAC_Align_8b_R - 8bit right data alignment selected + * DAC_Align_12b_L - 12bit left data alignment selected + * DAC_Align_12b_R - 12bit right data alignment selected + * Data - Data to be loaded in the selected data holding register. + * + * @return none + */ +void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12R2_OFFSET + DAC_Align; + + *(__IO uint32_t *)tmp = Data; +} + +/********************************************************************* + * @fn DAC_SetDualChannelData + * + * @brief Set the specified data holding register value for two DAC. + * + * @param DAC_Align - Specifies the data alignment for DAC channel1. + * DAC_Align_8b_R - 8bit right data alignment selected + * DAC_Align_12b_L - 12bit left data alignment selected + * DAC_Align_12b_R - 12bit right data alignment selected + * Data - Data to be loaded in the selected data holding register. + * Data1 - Data for DAC Channel1. + * Data2 - Data for DAC Channel2 + * + * @return none + */ +void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1) +{ + uint32_t data = 0, tmp = 0; + + if(DAC_Align == DAC_Align_8b_R) + { + data = ((uint32_t)Data2 << 8) | Data1; + } + else + { + data = ((uint32_t)Data2 << 16) | Data1; + } + + tmp = (uint32_t)DAC_BASE; + tmp += DHR12RD_OFFSET + DAC_Align; + + *(__IO uint32_t *)tmp = data; +} + +/********************************************************************* + * @fn DAC_GetDataOutputValue + * + * @brief Returns the last data output value of the selected DAC channel. + * + * @param DAC_Channel - the selected DAC channel. + * DAC_Channel_1 - DAC Channel1 selected + * DAC_Channel_2 - DAC Channel2 selected + * + * @return none + */ +uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)DAC_BASE; + tmp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2); + + return (uint16_t)(*(__IO uint32_t *)tmp); +} diff --git a/Peripheral/src/ch32v30x_dbgmcu.c b/Peripheral/src/ch32v30x_dbgmcu.c new file mode 100644 index 0000000..326dc1c --- /dev/null +++ b/Peripheral/src/ch32v30x_dbgmcu.c @@ -0,0 +1,129 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dbgmcu.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/05/28 +* Description : This file provides all the DBGMCU firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_dbgmcu.h" + +#define IDCODE_DEVID_MASK ((uint32_t)0x0000FFFF) + +/********************************************************************* + * @fn DBGMCU_GetREVID + * + * @brief Returns the device revision identifier. + * + * @return Revision identifier. + */ +uint32_t DBGMCU_GetREVID(void) +{ + return ((*(uint32_t *)0x1FFFF704) & IDCODE_DEVID_MASK); +} + +/********************************************************************* + * @fn DBGMCU_GetDEVID + * + * @brief Returns the device identifier. + * + * @return Device identifier. + */ +uint32_t DBGMCU_GetDEVID(void) +{ + return ((*(uint32_t *)0x1FFFF704) >> 16); +} + +/********************************************************************* + * @fn __get_DEBUG_CR + * + * @brief Return the DEBUGE Control Register + * + * @return DEBUGE Control value + */ +uint32_t __get_DEBUG_CR(void) +{ + uint32_t result; + + __asm volatile("csrr %0,""0x7C0" : "=r"(result)); + return (result); +} + +/********************************************************************* + * @fn __set_DEBUG_CR + * + * @brief Set the DEBUGE Control Register + * + * @param value - set DEBUGE Control value + * + * @return none + */ +void __set_DEBUG_CR(uint32_t value) +{ + __asm volatile("csrw 0x7C0, %0" : : "r"(value)); +} + + +/********************************************************************* + * @fn DBGMCU_Config + * + * @brief Configures the specified peripheral and low power mode behavior + * when the MCU under Debug mode. + * + * @param DBGMCU_Periph - specifies the peripheral and low power mode. + * DBGMCU_IWDG_STOP - Debug IWDG stopped when Core is halted + * DBGMCU_WWDG_STOP - Debug WWDG stopped when Core is halted + * DBGMCU_TIM1_STOP - TIM1 counter stopped when Core is halted + * DBGMCU_TIM2_STOP - TIM2 counter stopped when Core is halted + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void DBGMCU_Config(uint32_t DBGMCU_Periph, FunctionalState NewState) +{ + uint32_t val; + + if(NewState != DISABLE) + { + __set_DEBUG_CR(DBGMCU_Periph); + } + else + { + val = __get_DEBUG_CR(); + val &= ~(uint32_t)DBGMCU_Periph; + __set_DEBUG_CR(val); + } + +} + +/********************************************************************* + * @fn DBGMCU_GetCHIPID + * + * @brief Returns the CHIP identifier. + * + * @return Device identifier. + * ChipID List- + * CH32V303CBT6-0x303305x4 + * CH32V303RBT6-0x303205x4 + * CH32V303RCT6-0x303105x4 + * CH32V303VCT6-0x303005x4 + * CH32V305FBP6-0x305205x8 + * CH32V305RBT6-0x305005x8 + * CH32V305GBU6-0x305B05x8 + * CH32V305CCT6-0x305C05x8 + * CH32V307WCU6-0x307305x8 + * CH32V307FBP6-0x307205x8 + * CH32V307RCT6-0x307105x8 + * CH32V307VCT6-0x307005x8 + * CH32V317VCT6-0x3170B5X8 + * CH32V317WCU6-0x3173B5X8 + * CH32V317TCU6-0x3175B5X8 + */ +uint32_t DBGMCU_GetCHIPID( void ) +{ + return( *( uint32_t * )0x1FFFF704 ); +} + diff --git a/Peripheral/src/ch32v30x_dma.c b/Peripheral/src/ch32v30x_dma.c new file mode 100644 index 0000000..1b5cbe8 --- /dev/null +++ b/Peripheral/src/ch32v30x_dma.c @@ -0,0 +1,692 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dma.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the DMA firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_dma.h" +#include "ch32v30x_rcc.h" + +/* DMA1 Channelx interrupt pending bit masks */ +#define DMA1_Channel1_IT_Mask ((uint32_t)(DMA_GIF1 | DMA_TCIF1 | DMA_HTIF1 | DMA_TEIF1)) +#define DMA1_Channel2_IT_Mask ((uint32_t)(DMA_GIF2 | DMA_TCIF2 | DMA_HTIF2 | DMA_TEIF2)) +#define DMA1_Channel3_IT_Mask ((uint32_t)(DMA_GIF3 | DMA_TCIF3 | DMA_HTIF3 | DMA_TEIF3)) +#define DMA1_Channel4_IT_Mask ((uint32_t)(DMA_GIF4 | DMA_TCIF4 | DMA_HTIF4 | DMA_TEIF4)) +#define DMA1_Channel5_IT_Mask ((uint32_t)(DMA_GIF5 | DMA_TCIF5 | DMA_HTIF5 | DMA_TEIF5)) +#define DMA1_Channel6_IT_Mask ((uint32_t)(DMA_GIF6 | DMA_TCIF6 | DMA_HTIF6 | DMA_TEIF6)) +#define DMA1_Channel7_IT_Mask ((uint32_t)(DMA_GIF7 | DMA_TCIF7 | DMA_HTIF7 | DMA_TEIF7)) + +/* DMA2 Channelx interrupt pending bit masks */ +#define DMA2_Channel1_IT_Mask ((uint32_t)(DMA_GIF1 | DMA_TCIF1 | DMA_HTIF1 | DMA_TEIF1)) +#define DMA2_Channel2_IT_Mask ((uint32_t)(DMA_GIF2 | DMA_TCIF2 | DMA_HTIF2 | DMA_TEIF2)) +#define DMA2_Channel3_IT_Mask ((uint32_t)(DMA_GIF3 | DMA_TCIF3 | DMA_HTIF3 | DMA_TEIF3)) +#define DMA2_Channel4_IT_Mask ((uint32_t)(DMA_GIF4 | DMA_TCIF4 | DMA_HTIF4 | DMA_TEIF4)) +#define DMA2_Channel5_IT_Mask ((uint32_t)(DMA_GIF5 | DMA_TCIF5 | DMA_HTIF5 | DMA_TEIF5)) +#define DMA2_Channel6_IT_Mask ((uint32_t)(DMA_GIF6 | DMA_TCIF6 | DMA_HTIF6 | DMA_TEIF6)) +#define DMA2_Channel7_IT_Mask ((uint32_t)(DMA_GIF7 | DMA_TCIF7 | DMA_HTIF7 | DMA_TEIF7)) +#define DMA2_Channel8_IT_Mask ((uint32_t)(DMA_GIF8 | DMA_TCIF8 | DMA_HTIF8 | DMA_TEIF8)) +#define DMA2_Channel9_IT_Mask ((uint32_t)(DMA_GIF9 | DMA_TCIF9 | DMA_HTIF9 | DMA_TEIF9)) +#define DMA2_Channel10_IT_Mask ((uint32_t)(DMA_GIF10 | DMA_TCIF10 | DMA_HTIF10 | DMA_TEIF10)) +#define DMA2_Channel11_IT_Mask ((uint32_t)(DMA_GIF11 | DMA_TCIF11 | DMA_HTIF11 | DMA_TEIF11)) + +/* DMA2 FLAG mask */ +#define FLAG_Mask ((uint32_t)0x10000000) +#define DMA2_EXTEN_FLAG_Mask ((uint32_t)0x20000000) + +/* DMA registers Masks */ +#define CFGR_CLEAR_Mask ((uint32_t)0xFFFF800F) + +/********************************************************************* + * @fn DMA_DeInit + * + * @brief Deinitializes the DMAy Channelx registers to their default + * reset values. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * + * @return none + */ +void DMA_DeInit(DMA_Channel_TypeDef *DMAy_Channelx) +{ + DMAy_Channelx->CFGR &= (uint16_t)(~DMA_CFGR1_EN); + DMAy_Channelx->CFGR = 0; + DMAy_Channelx->CNTR = 0; + DMAy_Channelx->PADDR = 0; + DMAy_Channelx->MADDR = 0; + if(DMAy_Channelx == DMA1_Channel1) + { + DMA1->INTFCR |= DMA1_Channel1_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel2) + { + DMA1->INTFCR |= DMA1_Channel2_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel3) + { + DMA1->INTFCR |= DMA1_Channel3_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel4) + { + DMA1->INTFCR |= DMA1_Channel4_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel5) + { + DMA1->INTFCR |= DMA1_Channel5_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel6) + { + DMA1->INTFCR |= DMA1_Channel6_IT_Mask; + } + else if(DMAy_Channelx == DMA1_Channel7) + { + DMA1->INTFCR |= DMA1_Channel7_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel1) + { + DMA2->INTFCR |= DMA2_Channel1_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel2) + { + DMA2->INTFCR |= DMA2_Channel2_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel3) + { + DMA2->INTFCR |= DMA2_Channel3_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel4) + { + DMA2->INTFCR |= DMA2_Channel4_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel5) + { + DMA2->INTFCR |= DMA2_Channel5_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel6) + { + DMA2->INTFCR |= DMA2_Channel6_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel7) + { + DMA2->INTFCR |= DMA2_Channel7_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel8) + { + DMA2_EXTEN->INTFCR |= DMA2_Channel8_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel9) + { + DMA2_EXTEN->INTFCR |= DMA2_Channel9_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel10) + { + DMA2_EXTEN->INTFCR |= DMA2_Channel10_IT_Mask; + } + else if(DMAy_Channelx == DMA2_Channel11) + { + DMA2_EXTEN->INTFCR |= DMA2_Channel11_IT_Mask; + } +} + +/********************************************************************* + * @fn DMA_Init + * + * @brief Initializes the DMAy Channelx according to the specified + * parameters in the DMA_InitStruct. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DMA_InitStruct - pointer to a DMA_InitTypeDef structure that contains + * contains the configuration information for the specified DMA Channel. + * + * @return none + */ +void DMA_Init(DMA_Channel_TypeDef *DMAy_Channelx, DMA_InitTypeDef *DMA_InitStruct) +{ + uint32_t tmpreg = 0; + + tmpreg = DMAy_Channelx->CFGR; + tmpreg &= CFGR_CLEAR_Mask; + tmpreg |= DMA_InitStruct->DMA_DIR | DMA_InitStruct->DMA_Mode | + DMA_InitStruct->DMA_PeripheralInc | DMA_InitStruct->DMA_MemoryInc | + DMA_InitStruct->DMA_PeripheralDataSize | DMA_InitStruct->DMA_MemoryDataSize | + DMA_InitStruct->DMA_Priority | DMA_InitStruct->DMA_M2M; + + DMAy_Channelx->CFGR = tmpreg; + DMAy_Channelx->CNTR = DMA_InitStruct->DMA_BufferSize; + DMAy_Channelx->PADDR = DMA_InitStruct->DMA_PeripheralBaseAddr; + DMAy_Channelx->MADDR = DMA_InitStruct->DMA_MemoryBaseAddr; +} + +/********************************************************************* + * @fn DMA_StructInit + * + * @brief Fills each DMA_InitStruct member with its default value. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DMA_InitStruct - pointer to a DMA_InitTypeDef structure that contains + * contains the configuration information for the specified DMA Channel. + * + * @return none + */ +void DMA_StructInit(DMA_InitTypeDef *DMA_InitStruct) +{ + DMA_InitStruct->DMA_PeripheralBaseAddr = 0; + DMA_InitStruct->DMA_MemoryBaseAddr = 0; + DMA_InitStruct->DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_InitStruct->DMA_BufferSize = 0; + DMA_InitStruct->DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStruct->DMA_MemoryInc = DMA_MemoryInc_Disable; + DMA_InitStruct->DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStruct->DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStruct->DMA_Mode = DMA_Mode_Normal; + DMA_InitStruct->DMA_Priority = DMA_Priority_Low; + DMA_InitStruct->DMA_M2M = DMA_M2M_Disable; +} + +/********************************************************************* + * @fn DMA_Cmd + * + * @brief Enables or disables the specified DMAy Channelx. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * NewState - new state of the DMAy Channelx(ENABLE or DISABLE). + * + * @return none + */ +void DMA_Cmd(DMA_Channel_TypeDef *DMAy_Channelx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMAy_Channelx->CFGR |= DMA_CFGR1_EN; + } + else + { + DMAy_Channelx->CFGR &= (uint16_t)(~DMA_CFGR1_EN); + } +} + +/********************************************************************* + * @fn DMA_ITConfig + * + * @brief Enables or disables the specified DMAy Channelx interrupts. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DMA_IT - specifies the DMA interrupts sources to be enabled + * or disabled. + * DMA_IT_TC - Transfer complete interrupt mask + * DMA_IT_HT - Half transfer interrupt mask + * DMA_IT_TE - Transfer error interrupt mask + * NewState - new state of the DMAy Channelx(ENABLE or DISABLE). + * + * @return none + */ +void DMA_ITConfig(DMA_Channel_TypeDef *DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMAy_Channelx->CFGR |= DMA_IT; + } + else + { + DMAy_Channelx->CFGR &= ~DMA_IT; + } +} + +/********************************************************************* + * @fn DMA_SetCurrDataCounter + * + * @brief Sets the number of data units in the current DMAy Channelx transfer. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * DataNumber - The number of data units in the current DMAy Channelx + * transfer. + * + * @return none + */ +void DMA_SetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx, uint16_t DataNumber) +{ + DMAy_Channelx->CNTR = DataNumber; +} + +/********************************************************************* + * @fn DMA_GetCurrDataCounter + * + * @brief Returns the number of remaining data units in the current + * DMAy Channelx transfer. + * + * @param DMAy_Channelx - here y can be 1 or 2 to select the DMA and x can be + * 1 to 7 for DMA1 and 1 to 11 for DMA2 to select the DMA Channel. + * + * @return DataNumber - The number of remaining data units in the current + * DMAy Channelx transfer. + */ +uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef *DMAy_Channelx) +{ + return ((uint16_t)(DMAy_Channelx->CNTR)); +} + +/********************************************************************* + * @fn DMA_GetFlagStatus + * + * @brief Checks whether the specified DMAy Channelx flag is set or not. + * + * @param DMAy_FLAG - specifies the flag to check. + * DMA1_FLAG_GL1 - DMA1 Channel1 global flag. + * DMA1_FLAG_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_FLAG_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_FLAG_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_FLAG_GL2 - DMA1 Channel2 global flag. + * DMA1_FLAG_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_FLAG_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_FLAG_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_FLAG_GL3 - DMA1 Channel3 global flag. + * DMA1_FLAG_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_FLAG_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_FLAG_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_FLAG_GL4 - DMA1 Channel4 global flag. + * DMA1_FLAG_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_FLAG_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_FLAG_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_FLAG_GL5 - DMA1 Channel5 global flag. + * DMA1_FLAG_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_FLAG_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_FLAG_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_FLAG_GL6 - DMA1 Channel6 global flag. + * DMA1_FLAG_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_FLAG_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_FLAG_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_FLAG_GL7 - DMA1 Channel7 global flag. + * DMA1_FLAG_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_FLAG_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_FLAG_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_FLAG_GL1 - DMA2 Channel1 global flag. + * DMA2_FLAG_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_FLAG_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_FLAG_TE1 - DMA2 Channel1 transfer error flag. + * DMA2_FLAG_GL2 - DMA2 Channel2 global flag. + * DMA2_FLAG_TC2 - DMA2 Channel2 transfer complete flag. + * DMA2_FLAG_HT2 - DMA2 Channel2 half transfer flag. + * DMA2_FLAG_TE2 - DMA2 Channel2 transfer error flag. + * DMA2_FLAG_GL3 - DMA2 Channel3 global flag. + * DMA2_FLAG_TC3 - DMA2 Channel3 transfer complete flag. + * DMA2_FLAG_HT3 - DMA2 Channel3 half transfer flag. + * DMA2_FLAG_TE3 - DMA2 Channel3 transfer error flag. + * DMA2_FLAG_GL4 - DMA2 Channel4 global flag. + * DMA2_FLAG_TC4 - DMA2 Channel4 transfer complete flag. + * DMA2_FLAG_HT4 - DMA2 Channel4 half transfer flag. + * DMA2_FLAG_TE4 - DMA2 Channel4 transfer error flag. + * DMA2_FLAG_GL5 - DMA2 Channel5 global flag. + * DMA2_FLAG_TC5 - DMA2 Channel5 transfer complete flag. + * DMA2_FLAG_HT5 - DMA2 Channel5 half transfer flag. + * DMA2_FLAG_TE5 - DMA2 Channel5 transfer error flag. + * DMA2_FLAG_GL6 - DMA2 Channel6 global flag. + * DMA2_FLAG_TC6 - DMA2 Channel6 transfer complete flag. + * DMA2_FLAG_HT6 - DMA2 Channel6 half transfer flag. + * DMA2_FLAG_TE6 - DMA2 Channel6 transfer error flag. + * DMA2_FLAG_GL7 - DMA2 Channel7 global flag. + * DMA2_FLAG_TC7 - DMA2 Channel7 transfer complete flag. + * DMA2_FLAG_HT7 - DMA2 Channel7 half transfer flag. + * DMA2_FLAG_TE7 - DMA2 Channel7 transfer error flag. + * DMA2_FLAG_GL8 - DMA2 Channel8 global flag. + * DMA2_FLAG_TC8 - DMA2 Channel8 transfer complete flag. + * DMA2_FLAG_HT8 - DMA2 Channel8 half transfer flag. + * DMA2_FLAG_TE8 - DMA2 Channel8 transfer error flag. + * DMA2_FLAG_GL9 - DMA2 Channel9 global flag. + * DMA2_FLAG_TC9 - DMA2 Channel9 transfer complete flag. + * DMA2_FLAG_HT9 - DMA2 Channel9 half transfer flag. + * DMA2_FLAG_TE9 - DMA2 Channel9 transfer error flag. + * DMA2_FLAG_GL10 - DMA2 Channel10 global flag. + * DMA2_FLAG_TC10 - DMA2 Channel10 transfer complete flag. + * DMA2_FLAG_HT10 - DMA2 Channel10 half transfer flag. + * DMA2_FLAG_TE10 - DMA2 Channel10 transfer error flag. + * DMA2_FLAG_GL11 - DMA2 Channel11 global flag. + * DMA2_FLAG_TC11 - DMA2 Channel11 transfer complete flag. + * DMA2_FLAG_HT11 - DMA2 Channel11 half transfer flag. + * DMA2_FLAG_TE11 - DMA2 Channel11 transfer error flag. + * + * @return The new state of DMAy_FLAG (SET or RESET). + */ +FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + if((DMAy_FLAG & FLAG_Mask) == FLAG_Mask) + { + tmpreg = DMA2->INTFR; + } + else if((DMAy_FLAG & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask) + { + tmpreg = DMA2_EXTEN->INTFR; + } + else + { + tmpreg = DMA1->INTFR; + } + + if((tmpreg & DMAy_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn DMA_ClearFlag + * + * @brief Clears the DMAy Channelx's pending flags. + * + * @param DMAy_FLAG - specifies the flag to check. + * DMA1_FLAG_GL1 - DMA1 Channel1 global flag. + * DMA1_FLAG_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_FLAG_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_FLAG_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_FLAG_GL2 - DMA1 Channel2 global flag. + * DMA1_FLAG_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_FLAG_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_FLAG_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_FLAG_GL3 - DMA1 Channel3 global flag. + * DMA1_FLAG_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_FLAG_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_FLAG_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_FLAG_GL4 - DMA1 Channel4 global flag. + * DMA1_FLAG_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_FLAG_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_FLAG_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_FLAG_GL5 - DMA1 Channel5 global flag. + * DMA1_FLAG_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_FLAG_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_FLAG_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_FLAG_GL6 - DMA1 Channel6 global flag. + * DMA1_FLAG_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_FLAG_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_FLAG_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_FLAG_GL7 - DMA1 Channel7 global flag. + * DMA1_FLAG_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_FLAG_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_FLAG_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_FLAG_GL1 - DMA2 Channel1 global flag. + * DMA2_FLAG_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_FLAG_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_FLAG_TE1 - DMA2 Channel1 transfer error flag. + * DMA2_FLAG_GL2 - DMA2 Channel2 global flag. + * DMA2_FLAG_TC2 - DMA2 Channel2 transfer complete flag. + * DMA2_FLAG_HT2 - DMA2 Channel2 half transfer flag. + * DMA2_FLAG_TE2 - DMA2 Channel2 transfer error flag. + * DMA2_FLAG_GL3 - DMA2 Channel3 global flag. + * DMA2_FLAG_TC3 - DMA2 Channel3 transfer complete flag. + * DMA2_FLAG_HT3 - DMA2 Channel3 half transfer flag. + * DMA2_FLAG_TE3 - DMA2 Channel3 transfer error flag. + * DMA2_FLAG_GL4 - DMA2 Channel4 global flag. + * DMA2_FLAG_TC4 - DMA2 Channel4 transfer complete flag. + * DMA2_FLAG_HT4 - DMA2 Channel4 half transfer flag. + * DMA2_FLAG_TE4 - DMA2 Channel4 transfer error flag. + * DMA2_FLAG_GL5 - DMA2 Channel5 global flag. + * DMA2_FLAG_TC5 - DMA2 Channel5 transfer complete flag. + * DMA2_FLAG_HT5 - DMA2 Channel5 half transfer flag. + * DMA2_FLAG_TE5 - DMA2 Channel5 transfer error flag. + * DMA2_FLAG_GL6 - DMA2 Channel6 global flag. + * DMA2_FLAG_TC6 - DMA2 Channel6 transfer complete flag. + * DMA2_FLAG_HT6 - DMA2 Channel6 half transfer flag. + * DMA2_FLAG_TE6 - DMA2 Channel6 transfer error flag. + * DMA2_FLAG_GL7 - DMA2 Channel7 global flag. + * DMA2_FLAG_TC7 - DMA2 Channel7 transfer complete flag. + * DMA2_FLAG_HT7 - DMA2 Channel7 half transfer flag. + * DMA2_FLAG_TE7 - DMA2 Channel7 transfer error flag. + * DMA2_FLAG_GL8 - DMA2 Channel8 global flag. + * DMA2_FLAG_TC8 - DMA2 Channel8 transfer complete flag. + * DMA2_FLAG_HT8 - DMA2 Channel8 half transfer flag. + * DMA2_FLAG_TE8 - DMA2 Channel8 transfer error flag. + * DMA2_FLAG_GL9 - DMA2 Channel9 global flag. + * DMA2_FLAG_TC9 - DMA2 Channel9 transfer complete flag. + * DMA2_FLAG_HT9 - DMA2 Channel9 half transfer flag. + * DMA2_FLAG_TE9 - DMA2 Channel9 transfer error flag. + * DMA2_FLAG_GL10 - DMA2 Channel10 global flag. + * DMA2_FLAG_TC10 - DMA2 Channel10 transfer complete flag. + * DMA2_FLAG_HT10 - DMA2 Channel10 half transfer flag. + * DMA2_FLAG_TE10 - DMA2 Channel10 transfer error flag. + * DMA2_FLAG_GL11 - DMA2 Channel11 global flag. + * DMA2_FLAG_TC11 - DMA2 Channel11 transfer complete flag. + * DMA2_FLAG_HT11 - DMA2 Channel11 half transfer flag. + * DMA2_FLAG_TE11 - DMA2 Channel11 transfer error flag. + * + * @return none + */ +void DMA_ClearFlag(uint32_t DMAy_FLAG) +{ + if((DMAy_FLAG & FLAG_Mask) == FLAG_Mask) + { + DMA2->INTFCR = DMAy_FLAG; + } + else if((DMAy_FLAG & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask) + { + DMA2_EXTEN->INTFCR = DMAy_FLAG; + } + else + { + DMA1->INTFCR = DMAy_FLAG; + } +} + +/********************************************************************* + * @fn DMA_GetITStatus + * + * @brief Checks whether the specified DMAy Channelx interrupt has + * occurred or not. + * + * @param DMAy_IT - specifies the DMAy interrupt source to check. + * DMA1_IT_GL1 - DMA1 Channel1 global flag. + * DMA1_IT_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_IT_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_IT_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_IT_GL2 - DMA1 Channel2 global flag. + * DMA1_IT_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_IT_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_IT_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_IT_GL3 - DMA1 Channel3 global flag. + * DMA1_IT_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_IT_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_IT_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_IT_GL4 - DMA1 Channel4 global flag. + * DMA1_IT_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_IT_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_IT_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_IT_GL5 - DMA1 Channel5 global flag. + * DMA1_IT_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_IT_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_IT_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_IT_GL6 - DMA1 Channel6 global flag. + * DMA1_IT_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_IT_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_IT_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_IT_GL7 - DMA1 Channel7 global flag. + * DMA1_IT_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_IT_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_IT_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_IT_GL1 - DMA2 Channel1 global flag. + * DMA2_IT_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_IT_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_IT_TE1 - DMA2 Channel1 transfer error flag. + * DMA2_IT_GL2 - DMA2 Channel2 global flag. + * DMA2_IT_TC2 - DMA2 Channel2 transfer complete flag. + * DMA2_IT_HT2 - DMA2 Channel2 half transfer flag. + * DMA2_IT_TE2 - DMA2 Channel2 transfer error flag. + * DMA2_IT_GL3 - DMA2 Channel3 global flag. + * DMA2_IT_TC3 - DMA2 Channel3 transfer complete flag. + * DMA2_IT_HT3 - DMA2 Channel3 half transfer flag. + * DMA2_IT_TE3 - DMA2 Channel3 transfer error flag. + * DMA2_IT_GL4 - DMA2 Channel4 global flag. + * DMA2_IT_TC4 - DMA2 Channel4 transfer complete flag. + * DMA2_IT_HT4 - DMA2 Channel4 half transfer flag. + * DMA2_IT_TE4 - DMA2 Channel4 transfer error flag. + * DMA2_IT_GL5 - DMA2 Channel5 global flag. + * DMA2_IT_TC5 - DMA2 Channel5 transfer complete flag. + * DMA2_IT_HT5 - DMA2 Channel5 half transfer flag. + * DMA2_IT_TE5 - DMA2 Channel5 transfer error flag. + * DMA2_IT_GL6 - DMA2 Channel6 global flag. + * DMA2_IT_TC6 - DMA2 Channel6 transfer complete flag. + * DMA2_IT_HT6 - DMA2 Channel6 half transfer flag. + * DMA2_IT_TE6 - DMA2 Channel6 transfer error flag. + * DMA2_IT_GL7 - DMA2 Channel7 global flag. + * DMA2_IT_TC7 - DMA2 Channel7 transfer complete flag. + * DMA2_IT_HT7 - DMA2 Channel7 half transfer flag. + * DMA2_IT_TE7 - DMA2 Channel7 transfer error flag. + * DMA2_IT_GL8 - DMA2 Channel8 global flag. + * DMA2_IT_TC8 - DMA2 Channel8 transfer complete flag. + * DMA2_IT_HT8 - DMA2 Channel8 half transfer flag. + * DMA2_IT_TE8 - DMA2 Channel8 transfer error flag. + * DMA2_IT_GL9 - DMA2 Channel9 global flag. + * DMA2_IT_TC9 - DMA2 Channel9 transfer complete flag. + * DMA2_IT_HT9 - DMA2 Channel9 half transfer flag. + * DMA2_IT_TE9 - DMA2 Channel9 transfer error flag. + * DMA2_IT_GL10 - DMA2 Channel10 global flag. + * DMA2_IT_TC10 - DMA2 Channel10 transfer complete flag. + * DMA2_IT_HT10 - DMA2 Channel10 half transfer flag. + * DMA2_IT_TE10 - DMA2 Channel10 transfer error flag. + * DMA2_IT_GL11 - DMA2 Channel11 global flag. + * DMA2_IT_TC11 - DMA2 Channel11 transfer complete flag. + * DMA2_IT_HT11 - DMA2 Channel11 half transfer flag. + * DMA2_IT_TE11 - DMA2 Channel11 transfer error flag. + * + * @return The new state of DMAy_IT (SET or RESET). + */ +ITStatus DMA_GetITStatus(uint32_t DMAy_IT) +{ + ITStatus bitstatus = RESET; + uint32_t tmpreg = 0; + + if((DMAy_IT & FLAG_Mask) == FLAG_Mask) + { + tmpreg = DMA2->INTFR; + } + else if((DMAy_IT & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask) + { + tmpreg = DMA2_EXTEN->INTFR; + } + else + { + tmpreg = DMA1->INTFR; + } + + if((tmpreg & DMAy_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn DMA_ClearITPendingBit + * + * @brief Clears the DMAy Channelx's interrupt pending bits. + * + * @param DMAy_IT - specifies the DMAy interrupt source to check. + * DMA1_IT_GL1 - DMA1 Channel1 global flag. + * DMA1_IT_TC1 - DMA1 Channel1 transfer complete flag. + * DMA1_IT_HT1 - DMA1 Channel1 half transfer flag. + * DMA1_IT_TE1 - DMA1 Channel1 transfer error flag. + * DMA1_IT_GL2 - DMA1 Channel2 global flag. + * DMA1_IT_TC2 - DMA1 Channel2 transfer complete flag. + * DMA1_IT_HT2 - DMA1 Channel2 half transfer flag. + * DMA1_IT_TE2 - DMA1 Channel2 transfer error flag. + * DMA1_IT_GL3 - DMA1 Channel3 global flag. + * DMA1_IT_TC3 - DMA1 Channel3 transfer complete flag. + * DMA1_IT_HT3 - DMA1 Channel3 half transfer flag. + * DMA1_IT_TE3 - DMA1 Channel3 transfer error flag. + * DMA1_IT_GL4 - DMA1 Channel4 global flag. + * DMA1_IT_TC4 - DMA1 Channel4 transfer complete flag. + * DMA1_IT_HT4 - DMA1 Channel4 half transfer flag. + * DMA1_IT_TE4 - DMA1 Channel4 transfer error flag. + * DMA1_IT_GL5 - DMA1 Channel5 global flag. + * DMA1_IT_TC5 - DMA1 Channel5 transfer complete flag. + * DMA1_IT_HT5 - DMA1 Channel5 half transfer flag. + * DMA1_IT_TE5 - DMA1 Channel5 transfer error flag. + * DMA1_IT_GL6 - DMA1 Channel6 global flag. + * DMA1_IT_TC6 - DMA1 Channel6 transfer complete flag. + * DMA1_IT_HT6 - DMA1 Channel6 half transfer flag. + * DMA1_IT_TE6 - DMA1 Channel6 transfer error flag. + * DMA1_IT_GL7 - DMA1 Channel7 global flag. + * DMA1_IT_TC7 - DMA1 Channel7 transfer complete flag. + * DMA1_IT_HT7 - DMA1 Channel7 half transfer flag. + * DMA1_IT_TE7 - DMA1 Channel7 transfer error flag. + * DMA2_IT_GL1 - DMA2 Channel1 global flag. + * DMA2_IT_TC1 - DMA2 Channel1 transfer complete flag. + * DMA2_IT_HT1 - DMA2 Channel1 half transfer flag. + * DMA2_IT_TE1 - DMA2 Channel1 transfer error flag. + * DMA2_IT_GL2 - DMA2 Channel2 global flag. + * DMA2_IT_TC2 - DMA2 Channel2 transfer complete flag. + * DMA2_IT_HT2 - DMA2 Channel2 half transfer flag. + * DMA2_IT_TE2 - DMA2 Channel2 transfer error flag. + * DMA2_IT_GL3 - DMA2 Channel3 global flag. + * DMA2_IT_TC3 - DMA2 Channel3 transfer complete flag. + * DMA2_IT_HT3 - DMA2 Channel3 half transfer flag. + * DMA2_IT_TE3 - DMA2 Channel3 transfer error flag. + * DMA2_IT_GL4 - DMA2 Channel4 global flag. + * DMA2_IT_TC4 - DMA2 Channel4 transfer complete flag. + * DMA2_IT_HT4 - DMA2 Channel4 half transfer flag. + * DMA2_IT_TE4 - DMA2 Channel4 transfer error flag. + * DMA2_IT_GL5 - DMA2 Channel5 global flag. + * DMA2_IT_TC5 - DMA2 Channel5 transfer complete flag. + * DMA2_IT_HT5 - DMA2 Channel5 half transfer flag. + * DMA2_IT_TE5 - DMA2 Channel5 transfer error flag. + * DMA2_IT_GL6 - DMA2 Channel6 global flag. + * DMA2_IT_TC6 - DMA2 Channel6 transfer complete flag. + * DMA2_IT_HT6 - DMA2 Channel6 half transfer flag. + * DMA2_IT_TE6 - DMA2 Channel6 transfer error flag. + * DMA2_IT_GL7 - DMA2 Channel7 global flag. + * DMA2_IT_TC7 - DMA2 Channel7 transfer complete flag. + * DMA2_IT_HT7 - DMA2 Channel7 half transfer flag. + * DMA2_IT_TE7 - DMA2 Channel7 transfer error flag. + * DMA2_IT_GL8 - DMA2 Channel8 global flag. + * DMA2_IT_TC8 - DMA2 Channel8 transfer complete flag. + * DMA2_IT_HT8 - DMA2 Channel8 half transfer flag. + * DMA2_IT_TE8 - DMA2 Channel8 transfer error flag. + * DMA2_IT_GL9 - DMA2 Channel9 global flag. + * DMA2_IT_TC9 - DMA2 Channel9 transfer complete flag. + * DMA2_IT_HT9 - DMA2 Channel9 half transfer flag. + * DMA2_IT_TE9 - DMA2 Channel9 transfer error flag. + * DMA2_IT_GL10 - DMA2 Channel10 global flag. + * DMA2_IT_TC10 - DMA2 Channel10 transfer complete flag. + * DMA2_IT_HT10 - DMA2 Channel10 half transfer flag. + * DMA2_IT_TE10 - DMA2 Channel10 transfer error flag. + * DMA2_IT_GL11 - DMA2 Channel11 global flag. + * DMA2_IT_TC11 - DMA2 Channel11 transfer complete flag. + * DMA2_IT_HT11 - DMA2 Channel11 half transfer flag. + * DMA2_IT_TE11 - DMA2 Channel11 transfer error flag. + * + * @return none + */ +void DMA_ClearITPendingBit(uint32_t DMAy_IT) +{ + if((DMAy_IT & FLAG_Mask) == FLAG_Mask) + { + DMA2->INTFCR = DMAy_IT; + } + else if((DMAy_IT & DMA2_EXTEN_FLAG_Mask) == DMA2_EXTEN_FLAG_Mask) + { + DMA2_EXTEN->INTFCR = DMAy_IT; + } + else + { + DMA1->INTFCR = DMAy_IT; + } +} diff --git a/Peripheral/src/ch32v30x_dvp.c b/Peripheral/src/ch32v30x_dvp.c new file mode 100644 index 0000000..225f981 --- /dev/null +++ b/Peripheral/src/ch32v30x_dvp.c @@ -0,0 +1,135 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_dvp.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the DVP firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_dvp.h" + +/********************************************************************* + * @fn DVP_INTCfg + * + * @brief DVP interrupt configuration + * + * @param s - interrupt enable + * ENABLE + * DISABLE + * i - interrupt type + * RB_DVP_IE_STP_FRM + * RB_DVP_IE_FIFO_OV + * RB_DVP_IE_FRM_DONE + * RB_DVP_IE_ROW_DONE + * RB_DVP_IE_STR_FRM + * + * @return none + */ +void DVP_INTCfg(uint8_t s, uint8_t i) +{ + if(s) + { + DVP->IER |= i; + } + else + { + DVP->IER &= ~i; + } +} + +/********************************************************************* + * @fn DVP_Mode + * + * @brief DVP mode + * + * @param s - data bit width + * RB_DVP_D8_MOD + * RB_DVP_D10_MOD + * RB_DVP_D12_MOD + * i - interrupt type + * Video_Mode + * JPEG_Mode + * + * @return none + */ +void DVP_Mode(uint8_t s, DVP_Data_ModeTypeDef i) +{ + DVP->CR0 &= ~RB_DVP_MSK_DAT_MOD; + + if(s) + { + DVP->CR0 |= s; + } + else + { + DVP->CR0 &= ~(3 << 4); + } + + if(i) + { + DVP->CR0 |= RB_DVP_JPEG; + } + else + { + DVP->CR0 &= ~RB_DVP_JPEG; + } +} + +/********************************************************************* + * @fn DVP_Cfg + * + * @brief DVP configuration + * + * @param s - DMA enable control + * DVP_DMA_Enable + * DVP_DMA_Disable + * i - DVP all clear + * DVP_FLAG_FIFO_RESET_Enable + * DVP_FLAG_FIFO_RESET_Disable + * j - receive reset enable + * DVP_RX_RESET_Enable + * DVP_RX_RESET_Disable + * + * @return none + */ +void DVP_Cfg(DVP_DMATypeDef s, DVP_FLAG_FIFO_RESETTypeDef i, DVP_RX_RESETTypeDef j) +{ + switch(s) + { + case DVP_DMA_Enable: + DVP->CR1 |= RB_DVP_DMA_EN; + break; + case DVP_DMA_Disable: + DVP->CR1 &= ~RB_DVP_DMA_EN; + break; + default: + break; + } + + switch(i) + { + case DVP_RX_RESET_Enable: + DVP->CR1 |= RB_DVP_ALL_CLR; + break; + case DVP_RX_RESET_Disable: + DVP->CR1 &= ~RB_DVP_ALL_CLR; + break; + default: + break; + } + + switch(j) + { + case DVP_RX_RESET_Enable: + DVP->CR1 |= RB_DVP_RCV_CLR; + break; + case DVP_RX_RESET_Disable: + DVP->CR1 &= ~RB_DVP_RCV_CLR; + break; + default: + break; + } +} diff --git a/Peripheral/src/ch32v30x_eth.c b/Peripheral/src/ch32v30x_eth.c new file mode 100644 index 0000000..2e98991 --- /dev/null +++ b/Peripheral/src/ch32v30x_eth.c @@ -0,0 +1,2524 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_eth.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the ETH firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_eth.h" +#include "ch32v30x_rcc.h" + +ETH_DMADESCTypeDef *DMATxDescToSet; +ETH_DMADESCTypeDef *DMARxDescToGet; +ETH_DMADESCTypeDef *DMAPTPTxDescToSet; +ETH_DMADESCTypeDef *DMAPTPRxDescToGet; + +/********************************************************************* + * @fn ETH_DeInit + * + * @brief ETH hardware initialize again. + * + * @return none + */ +#ifdef CH32V30x_D8C +void ETH_DeInit(void) +{ + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ETH_MAC, ENABLE); + RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ETH_MAC, DISABLE); +} + +#endif + +/********************************************************************* + * @fn ETH_StructInit + * + * @brief Fills each ETH_InitStruct member with its default value. + * + * @param ETH_InitStruct - pointer to a ETH_InitTypeDef structure + * which will be initialized. + * + * @return none + */ +void ETH_StructInit(ETH_InitTypeDef *ETH_InitStruct) +{ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; + ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable; + ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable; + ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit; + ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable; + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable; + ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable; + ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable; + ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10; + ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable; + ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable; + ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable; + ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll; + ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal; + ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStruct->ETH_HashTableHigh = 0x0; + ETH_InitStruct->ETH_HashTableLow = 0x0; + ETH_InitStruct->ETH_PauseTime = 0x0; + ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable; + ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4; + ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable; + ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable; + ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable; + ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit; + ETH_InitStruct->ETH_VLANTagIdentifier = 0x0; + /*------------------------ DMA -----------------------------------*/ + ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable; + ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; + ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Enable; + ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; + ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes; + ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; + ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes; + ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable; + ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; + ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Disable; + ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_1Beat; + ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_1Beat; + ETH_InitStruct->ETH_DescriptorSkipLength = 0x0; + ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1; +} + +/********************************************************************* + * @fn ETH_Start + * + * @brief Enables ENET MAC and DMA reception/transmission. + * + * @return none + */ +void ETH_Start(void) +{ + ETH_MACTransmissionCmd(ENABLE); + ETH_FlushTransmitFIFO(); + ETH_MACReceptionCmd(ENABLE); + ETH_DMATransmissionCmd(ENABLE); + ETH_DMAReceptionCmd(ENABLE); +} + +/********************************************************************* + * @fn ETH_HandleTxPkt + * + * @brief Transmits a packet, from application buffer, pointed by ppkt. + * + * @param ppkt - pointer to the application's packet buffer to transmit. + * FrameLength - Tx Packet size. + * + * @return ETH_ERROR - in case of Tx desc owned by DMA. + * ETH_SUCCESS - for correct transmission. + */ +uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength) +{ + uint32_t offset = 0; + + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + return ETH_ERROR; + } + + for(offset = 0; offset < FrameLength; offset++) + { + (*(__IO uint8_t *)((DMATxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset)); + } + + DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + + if((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + ETH->DMASR = ETH_DMASR_TBUS; + ETH->DMATPDR = 0; + } + + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + DMATxDescToSet = (ETH_DMADESCTypeDef *)(DMATxDescToSet->Buffer2NextDescAddr); + } + else + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + DMATxDescToSet = (ETH_DMADESCTypeDef *)(ETH->DMATDLAR); + } + else + { + DMATxDescToSet = (ETH_DMADESCTypeDef *)((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + return ETH_SUCCESS; +} + +/********************************************************************* + * @fn ETH_HandleRxPkt + * + * @brief Receives a packet and copies it to memory pointed by ppkt. + * + * @param ppkt - pointer to the application packet receive buffer. + * + * @return ETH_ERROR - if there is error in reception + * framelength - received packet size if packet reception is correct + */ +uint32_t ETH_HandleRxPkt(uint8_t *ppkt) +{ + uint32_t offset = 0, framelength = 0; + + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + return ETH_ERROR; + } + + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT) - 4; + + for(offset = 0; offset < framelength; offset++) + { + (*(ppkt + offset)) = (*(__IO uint8_t *)((DMARxDescToGet->Buffer1Addr) + offset)); + } + } + else + { + framelength = ETH_ERROR; + } + + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + + if((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + ETH->DMASR = ETH_DMASR_RBUS; + ETH->DMARPDR = 0; + } + + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)(DMARxDescToGet->Buffer2NextDescAddr); + } + else + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)(ETH->DMARDLAR); + } + else + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + return (framelength); +} + +/********************************************************************* + * @fn ETH_GetRxPktSize + * + * @brief Get the size of received the received packet. + * + * @return framelength - received packet size + */ +uint32_t ETH_GetRxPktSize(void) +{ + uint32_t frameLength = 0; + if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + frameLength = ETH_GetDMARxDescFrameLength(DMARxDescToGet); + } + + return frameLength; +} + +/********************************************************************* + * @fn ETH_DropRxPkt + * + * @brief Drop a Received packet. + * + * @return none + */ +void ETH_DropRxPkt(void) +{ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)(DMARxDescToGet->Buffer2NextDescAddr); + } + else + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)(ETH->DMARDLAR); + } + else + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } +} + +/********************************************************************* + * @fn ETH_ReadPHYRegister + * + * @brief Read a PHY register. + * + * @param PHYAddress - PHY device address, is the index of one of supported 32 PHY devices. + * PHYReg - PHY register address, is the index of one of the 32 PHY register. + * + * @return ETH_ERROR - in case of timeout. + * MAC MIIDR register value - Data read from the selected PHY register. + */ +uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg) +{ + uint32_t tmpreg = 0; + __IO uint32_t timeout = 0; + + tmpreg = ETH->MACMIIAR; + tmpreg &= ~MACMIIAR_CR_MASK; + tmpreg |= (((uint32_t)PHYAddress << 11) & ETH_MACMIIAR_PA); + tmpreg |= (((uint32_t)PHYReg << 6) & ETH_MACMIIAR_MR); + tmpreg &= ~ETH_MACMIIAR_MW; + tmpreg |= ETH_MACMIIAR_MB; + ETH->MACMIIAR = tmpreg; + + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO)); + + if(timeout == PHY_READ_TO) + { + return (uint16_t)ETH_ERROR; + } + + return (uint16_t)(ETH->MACMIIDR); +} + +/********************************************************************* + * @fn ETH_WritePHYRegister + * + * @brief Write to a PHY register. + * + * @param PHYAddress - PHY device address, is the index of one of supported 32 PHY devices. + * PHYReg - PHY register address, is the index of one of the 32 PHY register. + * PHYValue - the value to write. + * + * @return ETH_ERROR - in case of timeout. + * ETH_SUCCESS - for correct write + */ +uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue) +{ + uint32_t tmpreg = 0; + __IO uint32_t timeout = 0; + + tmpreg = ETH->MACMIIAR; + tmpreg &= ~MACMIIAR_CR_MASK; + tmpreg |= (((uint32_t)PHYAddress << 11) & ETH_MACMIIAR_PA); + tmpreg |= (((uint32_t)PHYReg << 6) & ETH_MACMIIAR_MR); + tmpreg |= ETH_MACMIIAR_MW; + tmpreg |= ETH_MACMIIAR_MB; + ETH->MACMIIDR = PHYValue; + ETH->MACMIIAR = tmpreg; + + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO)); + + if(timeout >= PHY_WRITE_TO) + { + return ETH_ERROR; + } + + return ETH_SUCCESS; +} + +/********************************************************************* + * @fn ETH_PHYLoopBackCmd + * + * @brief Enables or disables the PHY loopBack mode. + * + * @param PHYAddress - PHY device address, is the index of one of supported 32 PHY devices. + * NewState - new state of the PHY loopBack mode. + * + * @return ETH_ERROR - in case of bad PHY configuration. + * ETH_SUCCESS - for correct PHY configuration. + */ +uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState) +{ + uint16_t tmpreg = 0; + + tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_BCR); + + if(NewState != DISABLE) + { + tmpreg |= PHY_Loopback; + } + else + { + tmpreg &= (uint16_t)(~(uint16_t)PHY_Loopback); + } + + if(ETH_WritePHYRegister(PHYAddress, PHY_BCR, tmpreg) != (uint32_t)RESET) + { + return ETH_SUCCESS; + } + else + { + return ETH_ERROR; + } +} + +/********************************************************************* + * @fn ETH_MACTransmissionCmd + * + * @brief Enables or disables the MAC transmission. + * + * @param NewState - new state of the MAC transmission. + * + * @return none + */ +void ETH_MACTransmissionCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACCR |= ETH_MACCR_TE; + } + else + { + ETH->MACCR &= ~ETH_MACCR_TE; + } +} + +/********************************************************************* + * @fn ETH_MACReceptionCmd + * + * @brief Enables or disables the MAC reception. + * + * @param NewState - new state of the MAC reception. + * + * @return none + */ +void ETH_MACReceptionCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACCR |= ETH_MACCR_RE; + } + else + { + ETH->MACCR &= ~ETH_MACCR_RE; + } +} + +/********************************************************************* + * @fn ETH_GetFlowControlBusyStatus + * + * @brief Enables or disables the MAC reception. + * + * @return The new state of flow control busy status bit (SET or RESET). + */ +FlagStatus ETH_GetFlowControlBusyStatus(void) +{ + FlagStatus bitstatus = RESET; + + if((ETH->MACFCR & ETH_MACFCR_FCBBPA) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_InitiatePauseControlFrame + * + * @brief Initiate a Pause Control Frame (Full-duplex only). + * + * @return none + */ +void ETH_InitiatePauseControlFrame(void) +{ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; +} + +/********************************************************************* + * @fn ETH_BackPressureActivationCmd + * + * @brief Enables or disables the MAC BackPressure operation activation (Half-duplex only). + * + * @param NewState - new state of the MAC BackPressure operation activation. + * + * @return none + */ +void ETH_BackPressureActivationCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACFCR |= ETH_MACFCR_FCBBPA; + } + else + { + ETH->MACFCR &= ~ETH_MACFCR_FCBBPA; + } +} + +/********************************************************************* + * @fn ETH_GetMACFlagStatus + * + * @brief Checks whether the specified ETHERNET MAC flag is set or not. + * + * @param ETH_MAC_FLAG - specifies the flag to check. + * + * @return The new state of ETHERNET MAC flag (SET or RESET). + */ +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((ETH->MACSR & ETH_MAC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_GetMACITStatus + * + * @brief Checks whether the specified ETHERNET MAC interrupt has occurred or not. + * + * @param ETH_MAC_IT - specifies the interrupt source to check. + * + * @return The new state of ETHERNET MAC interrupt (SET or RESET). + */ +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT) +{ + FlagStatus bitstatus = RESET; + + if((ETH->MACSR & ETH_MAC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_MACITConfig + * + * @brief Enables or disables the specified ETHERNET MAC interrupts. + * + * @param ETH_MAC_IT - specifies the interrupt source to check. + * NewState - new state of the specified ETHERNET MAC interrupts. + * + * @return none + */ +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACIMR &= (~(uint32_t)ETH_MAC_IT); + } + else + { + ETH->MACIMR |= ETH_MAC_IT; + } +} + +/********************************************************************* + * @fn ETH_MACAddressConfig + * + * @brief Configures the selected MAC address. + * + * @param MacAddr - The MAC addres to configure. + * ETH_MAC_Address0 - MAC Address0 + * ETH_MAC_Address1 - MAC Address1 + * ETH_MAC_Address2 - MAC Address2 + * ETH_MAC_Address3 - MAC Address3 + * Addr - Pointer on MAC address buffer data (6 bytes). + * + * @return none + */ +void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + + tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4]; + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) = tmpreg; + tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0]; + + (*(__IO uint32_t *)(ETH_MAC_ADDR_LBASE + MacAddr)) = tmpreg; +} + +/********************************************************************* + * @fn ETH_GetMACAddress + * + * @brief Get the selected MAC address. + * + * @param MacAddr - The MAC address to return. + * ETH_MAC_Address0 - MAC Address0 + * ETH_MAC_Address1 - MAC Address1 + * ETH_MAC_Address2 - MAC Address2 + * ETH_MAC_Address3 - MAC Address3 + * Addr - Pointer on MAC address buffer data (6 bytes). + * + * @return none + */ +void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + + tmpreg = (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)); + + Addr[5] = ((tmpreg >> 8) & (uint8_t)0xFF); + Addr[4] = (tmpreg & (uint8_t)0xFF); + tmpreg = (*(__IO uint32_t *)(ETH_MAC_ADDR_LBASE + MacAddr)); + Addr[3] = ((tmpreg >> 24) & (uint8_t)0xFF); + Addr[2] = ((tmpreg >> 16) & (uint8_t)0xFF); + Addr[1] = ((tmpreg >> 8) & (uint8_t)0xFF); + Addr[0] = (tmpreg & (uint8_t)0xFF); +} + +/********************************************************************* + * @fn ETH_MACAddressPerfectFilterCmd + * + * @brief Enables or disables the Address filter module uses the specified. + * + * @param MacAddr - The MAC address to return. + * ETH_MAC_Address0 - MAC Address0 + * ETH_MAC_Address1 - MAC Address1 + * ETH_MAC_Address2 - MAC Address2 + * ETH_MAC_Address3 - MAC Address3 + * NewState - new state of the specified ETHERNET MAC address use. + * + * @return none + */ +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) |= ETH_MACA1HR_AE; + } + else + { + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) &= (~(uint32_t)ETH_MACA1HR_AE); + } +} + +/********************************************************************* + * @fn ETH_MACAddressFilterConfig + * + * @brief Set the filter type for the specified ETHERNET MAC address. + * + * @param MacAddr - specifies the ETHERNET MAC address. + * ETH_MAC_Address0 - MAC Address0 + * ETH_MAC_Address1 - MAC Address1 + * ETH_MAC_Address2 - MAC Address2 + * ETH_MAC_Address3 - MAC Address3 + * Filter - specifies the used frame received field for comparaison. + * ETH_MAC_AddressFilter_SA - MAC Address is used to compare with the + * SA fields of the received frame. + * ETH_MAC_AddressFilter_DA - MAC Address is used to compare with the + * DA fields of the received frame. + * + * @return none + */ +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter) +{ + if(Filter != ETH_MAC_AddressFilter_DA) + { + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) |= ETH_MACA1HR_SA; + } + else + { + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) &= (~(uint32_t)ETH_MACA1HR_SA); + } +} + +/********************************************************************* + * @fn ETH_MACAddressMaskBytesFilterConfig + * + * @brief Set the filter type for the specified ETHERNET MAC address. + * + * @param MacAddr - specifies the ETHERNET MAC address. + * ETH_MAC_Address1 - MAC Address1 + * ETH_MAC_Address2 - MAC Address2 + * ETH_MAC_Address3 - MAC Address3 + * MaskByte - specifies the used address bytes for comparaison + * ETH_MAC_AddressMask_Byte5 - Mask MAC Address high reg bits [7:0]. + * ETH_MAC_AddressMask_Byte4 - Mask MAC Address low reg bits [31:24]. + * ETH_MAC_AddressMask_Byte3 - Mask MAC Address low reg bits [23:16]. + * ETH_MAC_AddressMask_Byte2 - Mask MAC Address low reg bits [15:8]. + * ETH_MAC_AddressMask_Byte1 - Mask MAC Address low reg bits [7:0]. + * + * @return none + */ +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte) +{ + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) &= (~(uint32_t)ETH_MACA1HR_MBC); + (*(__IO uint32_t *)(ETH_MAC_ADDR_HBASE + MacAddr)) |= MaskByte; +} + +/********************************************************************* + * @fn ETH_DMATxDescChainInit + * + * @brief Initializes the DMA Tx descriptors in chain mode. + * + * @param DMATxDescTab - Pointer on the first Tx desc list + * TxBuff - Pointer on the first TxBuffer list + * TxBuffCount - Number of the used Tx desc in the list + * + * @return none + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + DMATxDescToSet = DMATxDescTab; + + for(i = 0; i < TxBuffCount; i++) + { + DMATxDesc = DMATxDescTab + i; + DMATxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_IC; + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i * ETH_MAX_PACKET_SIZE]); + + if(i < (TxBuffCount - 1)) + { + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab + i + 1); + } + else + { + DMATxDesc->Buffer2NextDescAddr = (uint32_t)DMATxDescTab; + } + } + + ETH->DMATDLAR = (uint32_t)DMATxDescTab; +} + +/********************************************************************* + * @fn ETH_DMATxDescRingInit + * + * @brief Initializes the DMA Tx descriptors in ring mode. + * + * @param DMATxDescTab - Pointer on the first Tx desc list. + * TxBuff1 - Pointer on the first TxBuffer1 list. + * TxBuff2 - Pointer on the first TxBuffer2 list. + * TxBuffCount - Number of the used Tx desc in the list. + * + * @return none + */ +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + DMATxDescToSet = DMATxDescTab; + + for(i = 0; i < TxBuffCount; i++) + { + DMATxDesc = DMATxDescTab + i; + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff1[i * ETH_MAX_PACKET_SIZE]); + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(&TxBuff2[i * ETH_MAX_PACKET_SIZE]); + + if(i == (TxBuffCount - 1)) + { + DMATxDesc->Status = ETH_DMATxDesc_TER; + } + } + + ETH->DMATDLAR = (uint32_t)DMATxDescTab; +} + +/********************************************************************* + * @fn ETH_GetDMATxDescFlagStatus + * + * @brief Checks whether the specified ETHERNET DMA Tx Desc flag is set or not. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor + * ETH_DMATxDescFlag - specifies the flag to check. + * ETH_DMATxDesc_OWN - OWN bit - descriptor is owned by DMA engine + * ETH_DMATxDesc_IC - Interrupt on completetion + * ETH_DMATxDesc_LS - Last Segment + * ETH_DMATxDesc_FS - First Segment + * ETH_DMATxDesc_DC - Disable CRC + * ETH_DMATxDesc_DP - Disable Pad + * ETH_DMATxDesc_TTSE - Transmit Time Stamp Enable + * ETH_DMATxDesc_TER - Transmit End of Ring + * ETH_DMATxDesc_TCH - Second Address Chained + * ETH_DMATxDesc_TTSS - Tx Time Stamp Status + * ETH_DMATxDesc_IHE - IP Header Error + * ETH_DMATxDesc_ES - Error summary + * ETH_DMATxDesc_JT - Jabber Timeout + * ETH_DMATxDesc_FF - Frame Flushed - DMA/MTL flushed the frame due to SW flush + * ETH_DMATxDesc_PCE - Payload Checksum Error + * ETH_DMATxDesc_LCA - Loss of Carrier - carrier lost during tramsmission + * ETH_DMATxDesc_NC - No Carrier - no carrier signal from the tranceiver + * ETH_DMATxDesc_LCO - Late Collision - transmission aborted due to collision + * ETH_DMATxDesc_EC - Excessive Collision - transmission aborted after 16 collisions + * ETH_DMATxDesc_VF - VLAN Frame + * ETH_DMATxDesc_CC - Collision Count + * ETH_DMATxDesc_ED - Excessive Deferral + * ETH_DMATxDesc_UF - Underflow Error - late data arrival from the memory + * ETH_DMATxDesc_DB - Deferred Bit + * + * @return The new state of ETH_DMATxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag) +{ + FlagStatus bitstatus = RESET; + + if((DMATxDesc->Status & ETH_DMATxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_GetDMATxDescCollisionCount + * + * @brief Returns the specified ETHERNET DMA Tx Desc collision count. + * + * @param pointer on a DMA Tx descriptor. + * + * @return The Transmit descriptor collision counter value. + */ +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc) +{ + return ((DMATxDesc->Status & ETH_DMATxDesc_CC) >> ETH_DMATXDESC_COLLISION_COUNTSHIFT); +} + +/********************************************************************* + * @fn ETH_SetDMATxDescOwnBit + * + * @brief Set the specified DMA Tx Desc Own bit. + * + * @param DMATxDesc - Pointer on a Tx desc + * + * @return none + */ +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc) +{ + DMATxDesc->Status |= ETH_DMATxDesc_OWN; +} + +/********************************************************************* + * @fn ETH_DMATxDescTransmitITConfig + * + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * + * @param Pointer on a Tx desc. + * NewState - new state of the DMA Tx Desc transmit interrupt. + * + * @return none + */ +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMATxDesc->Status |= ETH_DMATxDesc_IC; + } + else + { + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_IC); + } +} + +/********************************************************************* + * @fn ETH_DMATxDescFrameSegmentConfig + * + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * + * @param PDMATxDesc - Pointer on a Tx desc. + * ETH_DMATxDesc_FirstSegment - actual Tx desc contain first segment. + * + * @return none + */ +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment) +{ + DMATxDesc->Status |= DMATxDesc_FrameSegment; +} + +/********************************************************************* + * @fn ETH_DMATxDescChecksumInsertionConfig + * + * @brief Selects the specified ETHERNET DMA Tx Desc Checksum Insertion. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor. + * DMATxDesc_Checksum - specifies is the DMA Tx desc checksum insertion. + * + * @return none + */ +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum) +{ + DMATxDesc->Status |= DMATxDesc_Checksum; +} + +/********************************************************************* + * @fn ETH_DMATxDescCRCCmd + * + * @brief Enables or disables the DMA Tx Desc CRC. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor + * NewState - new state of the specified DMA Tx Desc CRC. + * + * @return none + */ +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DC); + } + else + { + DMATxDesc->Status |= ETH_DMATxDesc_DC; + } +} + +/********************************************************************* + * @fn ETH_DMATxDescEndOfRingCmd + * + * @brief Enables or disables the DMA Tx Desc end of ring. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor. + * NewState - new state of the specified DMA Tx Desc end of ring. + * + * @return none + */ +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMATxDesc->Status |= ETH_DMATxDesc_TER; + } + else + { + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TER); + } +} + +/********************************************************************* + * @fn ETH_DMATxDescSecondAddressChainedCmd + * + * @brief Enables or disables the DMA Tx Desc second address chained. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor + * NewState - new state of the specified DMA Tx Desc second address chained. + * + * @return none + */ +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMATxDesc->Status |= ETH_DMATxDesc_TCH; + } + else + { + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TCH); + } +} + +/********************************************************************* + * @fn ETH_DMATxDescShortFramePaddingCmd + * + * @brief Enables or disables the DMA Tx Desc padding for frame shorter than 64 bytes. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor. + * NewState - new state of the specified DMA Tx Desc padding for frame shorter than 64 bytes. + * + * @return none + */ +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DP); + } + else + { + DMATxDesc->Status |= ETH_DMATxDesc_DP; + } +} + +/********************************************************************* + * @fn ETH_DMATxDescTimeStampCmd + * + * @brief Enables or disables the DMA Tx Desc time stamp. + * + * @param DMATxDesc - pointer on a DMA Tx descriptor + * NewState - new state of the specified DMA Tx Desc time stamp. + * + * @return none + */ +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMATxDesc->Status |= ETH_DMATxDesc_TTSE; + } + else + { + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TTSE); + } +} + +/********************************************************************* + * @fn ETH_DMATxDescBufferSizeConfig + * + * @brief Configures the specified DMA Tx Desc buffer1 and buffer2 sizes. + * + * @param DMATxDesc - Pointer on a Tx desc. + * BufferSize1 - specifies the Tx desc buffer1 size. + * RxBuff2 - Pointer on the first RxBuffer2 list + * BufferSize2 - specifies the Tx desc buffer2 size (put "0" if not used). + * + * @return none + */ +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2) +{ + DMATxDesc->ControlBufferSize |= (BufferSize1 | (BufferSize2 << ETH_DMATXDESC_BUFFER2_SIZESHIFT)); +} + +/********************************************************************* + * @fn ETH_DMARxDescChainInit + * + * @brief Initializes the DMA Rx descriptors in chain mode. + * + * @param DMARxDescTab - Pointer on the first Rx desc list. + * RxBuff - Pointer on the first RxBuffer list. + * RxBuffCount - Number of the used Rx desc in the list. + * + * @return none + */ +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + DMARxDescToGet = DMARxDescTab; + + for(i = 0; i < RxBuffCount; i++) + { + DMARxDesc = DMARxDescTab + i; + DMARxDesc->Status = ETH_DMARxDesc_OWN; + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i * ETH_MAX_PACKET_SIZE]); + + if(i < (RxBuffCount - 1)) + { + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab + i + 1); + } + else + { + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + } + + ETH->DMARDLAR = (uint32_t)DMARxDescTab; +} + +/********************************************************************* + * @fn ETH_DMARxDescRingInit + * + * @brief Initializes the DMA Rx descriptors in ring mode. + * + * @param DMARxDescTab - Pointer on the first Rx desc list. + * RxBuff1 - Pointer on the first RxBuffer1 list. + * RxBuff2 - Pointer on the first RxBuffer2 list + * RxBuffCount - Number of the used Rx desc in the list. + * + * @return none + */ +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + DMARxDescToGet = DMARxDescTab; + + for(i = 0; i < RxBuffCount; i++) + { + DMARxDesc = DMARxDescTab + i; + DMARxDesc->Status = ETH_DMARxDesc_OWN; + DMARxDesc->ControlBufferSize = ETH_MAX_PACKET_SIZE; + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff1[i * ETH_MAX_PACKET_SIZE]); + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(&RxBuff2[i * ETH_MAX_PACKET_SIZE]); + + if(i == (RxBuffCount - 1)) + { + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + } + + ETH->DMARDLAR = (uint32_t)DMARxDescTab; +} + +/********************************************************************* + * @fn ETH_GetDMARxDescFlagStatus + * + * @brief Checks whether the specified ETHERNET Rx Desc flag is set or not. + * + * @param DMARxDesc - pointer on a DMA Rx descriptor. + * ETH_DMARxDescFlag - specifies the flag to check. + * ETH_DMARxDesc_OWN - OWN bit: descriptor is owned by DMA engine + * ETH_DMARxDesc_AFM - DA Filter Fail for the rx frame + * ETH_DMARxDesc_ES - Error summary + * ETH_DMARxDesc_DE - Desciptor error: no more descriptors for receive frame + * ETH_DMARxDesc_SAF - SA Filter Fail for the received frame + * ETH_DMARxDesc_LE - Frame size not matching with length field + * ETH_DMARxDesc_OE - Overflow Error: Frame was damaged due to buffer overflow + * ETH_DMARxDesc_VLAN - VLAN Tag: received frame is a VLAN frame + * ETH_DMARxDesc_FS - First descriptor of the frame + * ETH_DMARxDesc_LS - Last descriptor of the frame + * ETH_DMARxDesc_IPV4HCE - IPC Checksum Error/Giant Frame: Rx Ipv4 header checksum error + * ETH_DMARxDesc_LC - Late collision occurred during reception + * ETH_DMARxDesc_FT - Frame type - Ethernet, otherwise 802.3 + * ETH_DMARxDesc_RWT - Receive Watchdog Timeout: watchdog timer expired during reception + * ETH_DMARxDesc_RE - Receive error: error reported by MII interface + * ETH_DMARxDesc_DE - Dribble bit error: frame contains non int multiple of 8 bits + * ETH_DMARxDesc_CE - CRC error + * ETH_DMARxDesc_MAMPCE - Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error + * + * @return The new state of ETH_DMARxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag) +{ + FlagStatus bitstatus = RESET; + + if((DMARxDesc->Status & ETH_DMARxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_SetDMARxDescOwnBit + * + * @brief Set the specified DMA Rx Desc Own bit. + * + * @param DMARxDesc - Pointer on a Rx desc + * + * @return none + */ +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc) +{ + DMARxDesc->Status |= ETH_DMARxDesc_OWN; +} + +/********************************************************************* + * @fn ETH_GetDMARxDescFrameLength + * + * @brief Returns the specified DMA Rx Desc frame length. + * + * @param DMARxDesc - pointer on a DMA Rx descriptor + * + * @return The Rx descriptor received frame length. + */ +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc) +{ + return ((DMARxDesc->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT); +} + +/********************************************************************* + * @fn ETH_DMARxDescReceiveITConfig + * + * @brief Enables or disables the specified DMA Rx Desc receive interrupt. + * + * @param DMARxDesc - Pointer on a Rx desc + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMARxDesc->ControlBufferSize &= (~(uint32_t)ETH_DMARxDesc_DIC); + } + else + { + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC; + } +} + +/********************************************************************* + * @fn ETH_DMARxDescEndOfRingCmd + * + * @brief Enables or disables the DMA Rx Desc end of ring. + * + * @param DMARxDesc - pointer on a DMA Rx descriptor. + * NewState - new state of the specified DMA Rx Desc end of ring. + * + * @return none + */ +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + else + { + DMARxDesc->ControlBufferSize &= (~(uint32_t)ETH_DMARxDesc_RER); + } +} + +/********************************************************************* + * @fn ETH_DMARxDescSecondAddressChainedCmd + * + * @brief Returns the specified ETHERNET DMA Rx Desc buffer size. + * + * @param DMARxDesc - pointer on a DMA Rx descriptor. + * NewState - new state of the specified DMA Rx Desc second address chained. + * + * @return none + */ +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RCH; + } + else + { + DMARxDesc->ControlBufferSize &= (~(uint32_t)ETH_DMARxDesc_RCH); + } +} + +/********************************************************************* + * @fn ETH_GetDMARxDescBufferSize + * + * @brief Returns the specified ETHERNET DMA Rx Desc buffer size. + * + * @param DMARxDesc - pointer on a DMA Rx descriptor. + * DMARxDesc_Buffer - specifies the DMA Rx Desc buffer. + * ETH_DMARxDesc_Buffer1 - DMA Rx Desc Buffer1 + * ETH_DMARxDesc_Buffer2 - DMA Rx Desc Buffer2 + * + * @return The Receive descriptor frame length. + */ +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer) +{ + if(DMARxDesc_Buffer != ETH_DMARxDesc_Buffer1) + { + return ((DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS2) >> ETH_DMARXDESC_BUFFER2_SIZESHIFT); + } + else + { + return (DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS1); + } +} + +/********************************************************************* + * @fn ETH_SoftwareReset + * + * @brief Resets all MAC subsystem internal registers and logic. + * + * @return none + */ +void ETH_SoftwareReset(void) +{ + ETH->DMABMR |= ETH_DMABMR_SR; +} + +/********************************************************************* + * @fn ETH_GetSoftwareResetStatus + * + * @brief Checks whether the ETHERNET software reset bit is set or not. + * + * @return The new state of DMA Bus Mode register SR bit (SET or RESET). + */ +FlagStatus ETH_GetSoftwareResetStatus(void) +{ + FlagStatus bitstatus = RESET; + if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_GetlinkStaus + * + * @brief Checks whether the internal 10BASE-T PHY is link or not. + * + * @return Internal 10BASE-T PHY is link or not. + */ +FlagStatus ETH_GetlinkStaus(void) +{ + FlagStatus bitstatus = RESET; + + if((ETH->DMASR & 0x80000000) != (uint32_t)RESET) + { + bitstatus = PHY_10BASE_T_LINKED; + } + else + { + bitstatus = PHY_10BASE_T_NOT_LINKED; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_GetDMAFlagStatus + * + * @brief Checks whether the specified ETHERNET DMA flag is set or not. + * + * @param ETH_DMA_FLAG - specifies the flag to check. + * ETH_DMA_FLAG_TST - Time-stamp trigger flag + * ETH_DMA_FLAG_PMT - PMT flag + * ETH_DMA_FLAG_MMC - MMC flag + * ETH_DMA_FLAG_DataTransferError - Error bits 0-data buffer, 1-desc. access + * ETH_DMA_FLAG_ReadWriteError - Error bits 0-write trnsf, 1-read transfr + * ETH_DMA_FLAG_AccessError - Error bits 0-Rx DMA, 1-Tx DMA + * ETH_DMA_FLAG_NIS - Normal interrupt summary flag + * ETH_DMA_FLAG_AIS - Abnormal interrupt summary flag + * ETH_DMA_FLAG_ER - Early receive flag + * ETH_DMA_FLAG_FBE - Fatal bus error flag + * ETH_DMA_FLAG_ET - Early transmit flag + * ETH_DMA_FLAG_RWT - Receive watchdog timeout flag + * ETH_DMA_FLAG_RPS - Receive process stopped flag + * ETH_DMA_FLAG_RBU - Receive buffer unavailable flag + * ETH_DMA_FLAG_R - Receive flag + * ETH_DMA_FLAG_TU - Underflow flag + * ETH_DMA_FLAG_RO - Overflow flag + * ETH_DMA_FLAG_TJT - Transmit jabber timeout flag + * ETH_DMA_FLAG_TBU - Transmit buffer unavailable flag + * ETH_DMA_FLAG_TPS - Transmit process stopped flag + * ETH_DMA_FLAG_T - Transmit flag + * + * @return Internal 10BASE-T PHY is link or not. + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_DMAClearFlag + * + * @brief Checks whether the specified ETHERNET DMA interrupt has occured or not. + * + * @param ETH_DMA_FLAG - specifies the flag to clear. + * ETH_DMA_FLAG_NIS - Normal interrupt summary flag + * ETH_DMA_FLAG_AIS - Abnormal interrupt summary flag + * ETH_DMA_FLAG_ER - Early receive flag + * ETH_DMA_FLAG_FBE - Fatal bus error flag + * ETH_DMA_FLAG_ETI - Early transmit flag + * ETH_DMA_FLAG_RWT - Receive watchdog timeout flag + * ETH_DMA_FLAG_RPS - Receive process stopped flag + * ETH_DMA_FLAG_RBU - Receive buffer unavailable flag + * ETH_DMA_FLAG_R - Receive flag + * ETH_DMA_FLAG_TU - Transmit Underflow flag + * ETH_DMA_FLAG_RO - Receive Overflow flag + * ETH_DMA_FLAG_TJT - Transmit jabber timeout flag + * ETH_DMA_FLAG_TBU - Transmit buffer unavailable flag + * ETH_DMA_FLAG_TPS - Transmit process stopped flag + * ETH_DMA_FLAG_T - Transmit flag + * + * @return none + */ +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG) +{ + ETH->DMASR = (uint32_t)ETH_DMA_FLAG; +} + +/********************************************************************* + * @fn ETH_GetDMAITStatus + * + * @brief Checks whether the specified ETHERNET DMA interrupt has occured or not. + * + * @param ETH_DMA_IT - specifies the interrupt pending bit to clear. + * ETH_DMA_IT_TST - Time-stamp trigger interrupt + * ETH_DMA_IT_PMT - PMT interrupt + * ETH_DMA_IT_MMC - MMC interrupt + * ETH_DMA_IT_NIS - Normal interrupt summary + * ETH_DMA_IT_AIS - Abnormal interrupt summary + * ETH_DMA_IT_ER - Early receive interrupt + * ETH_DMA_IT_FBE - Fatal bus error interrupt + * ETH_DMA_IT_ET - Early transmit interrupt + * ETH_DMA_IT_RWT - Receive watchdog timeout interrupt + * ETH_DMA_IT_RPS - Receive process stopped interrupt + * ETH_DMA_IT_RBU - Receive buffer unavailable interrupt + * ETH_DMA_IT_R - Receive interrupt + * ETH_DMA_IT_TU - Underflow interrupt + * ETH_DMA_IT_RO - Overflow interrupt + * ETH_DMA_IT_TJT - Transmit jabber timeout interrupt + * ETH_DMA_IT_TBU - Transmit buffer unavailable interrupt + * ETH_DMA_IT_TPS - Transmit process stopped interrupt + * ETH_DMA_IT_T - Transmit interrupt + * + * @return The new state of ETH_DMA_IT (SET or RESET). + */ +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT) +{ + ITStatus bitstatus = RESET; + + if((ETH->DMASR & ETH_DMA_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_DMAClearITPendingBit + * + * @brief Clears the ETHERNET"s DMA IT pending bit. + * + * @param ETH_DMA_IT - specifies the interrupt pending bit to clear. + * ETH_DMA_IT_NIS - Normal interrupt summary + * ETH_DMA_IT_AIS - Abnormal interrupt summary + * ETH_DMA_IT_ER - Early receive interrupt + * ETH_DMA_IT_FBE - Fatal bus error interrupt + * ETH_DMA_IT_ETI - Early transmit interrupt + * ETH_DMA_IT_RWT - Receive watchdog timeout interrupt + * ETH_DMA_IT_RPS - Receive process stopped interrupt + * ETH_DMA_IT_RBU - Receive buffer unavailable interrupt + * ETH_DMA_IT_R - Receive interrupt + * ETH_DMA_IT_TU - Transmit Underflow interrupt + * ETH_DMA_IT_RO - Receive Overflow interrupt + * ETH_DMA_IT_TJT - Transmit jabber timeout interrupt + * ETH_DMA_IT_TBU - Transmit buffer unavailable interrupt + * ETH_DMA_IT_TPS - Transmit process stopped interrupt + * ETH_DMA_IT_T - Transmit interrupt + * + * @return none + */ +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT) +{ + ETH->DMASR = (uint32_t)ETH_DMA_IT; +} + +/********************************************************************* + * @fn ETH_GetTransmitProcessState + * + * @brief Returns the ETHERNET DMA Transmit Process State. + * + * @return The new ETHERNET DMA Transmit Process State - + * ETH_DMA_TransmitProcess_Stopped - Stopped - Reset or Stop Tx Command issued + * ETH_DMA_TransmitProcess_Fetching - Running - fetching the Tx descriptor + * ETH_DMA_TransmitProcess_Waiting - Running - waiting for status + * ETH_DMA_TransmitProcess_Reading - unning - reading the data from host memory + * ETH_DMA_TransmitProcess_Suspended - Suspended - Tx Desciptor unavailabe + * ETH_DMA_TransmitProcess_Closing - Running - closing Rx descriptor + */ +uint32_t ETH_GetTransmitProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_TS)); +} + +/********************************************************************* + * @fn ETH_GetReceiveProcessState + * + * @brief Returns the ETHERNET DMA Receive Process State. + * + * @return The new ETHERNET DMA Receive Process State: + * ETH_DMA_ReceiveProcess_Stopped - Stopped - Reset or Stop Rx Command issued + * ETH_DMA_ReceiveProcess_Fetching - Running - fetching the Rx descriptor + * ETH_DMA_ReceiveProcess_Waiting - Running - waiting for packet + * ETH_DMA_ReceiveProcess_Suspended - Suspended - Rx Desciptor unavailable + * ETH_DMA_ReceiveProcess_Closing - Running - closing descriptor + * ETH_DMA_ReceiveProcess_Queuing - Running - queuing the recieve frame into host memory + */ +uint32_t ETH_GetReceiveProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_RS)); +} + +/********************************************************************* + * @fn ETH_FlushTransmitFIFO + * + * @brief Clears the ETHERNET transmit FIFO. + * + * @return none + */ +void ETH_FlushTransmitFIFO(void) +{ + ETH->DMAOMR |= ETH_DMAOMR_FTF; +} + +/********************************************************************* + * @fn ETH_GetFlushTransmitFIFOStatus + * + * @brief Checks whether the ETHERNET transmit FIFO bit is cleared or not. + * + * @return The new state of ETHERNET flush transmit FIFO bit (SET or RESET). + */ +FlagStatus ETH_GetFlushTransmitFIFOStatus(void) +{ + FlagStatus bitstatus = RESET; + if((ETH->DMAOMR & ETH_DMAOMR_FTF) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_DMATransmissionCmd + * + * @brief Enables or disables the DMA transmission. + * + * @param NewState - new state of the DMA transmission. + * + * @return none + */ +void ETH_DMATransmissionCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->DMAOMR |= ETH_DMAOMR_ST; + } + else + { + ETH->DMAOMR &= ~ETH_DMAOMR_ST; + } +} + +/********************************************************************* + * @fn ETH_DMAReceptionCmd + * + * @brief Enables or disables the DMA reception. + * + * @param NewState - new state of the DMA reception. + * + * @return none + */ +void ETH_DMAReceptionCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->DMAOMR |= ETH_DMAOMR_SR; + } + else + { + ETH->DMAOMR &= ~ETH_DMAOMR_SR; + } +} + +/********************************************************************* + * @fn ETH_DMAITConfig + * + * @brief Enables or disables the specified ETHERNET DMA interrupts. + * + * @param ETH_DMA_IT - specifies the ETHERNET DMA interrupt sources to be enabled or disabled. + * ETH_DMA_IT_NIS - Normal interrupt summary + * ETH_DMA_IT_AIS - Abnormal interrupt summary + * ETH_DMA_IT_ER - Early receive interrupt + * ETH_DMA_IT_FBE - Fatal bus error interrupt + * ETH_DMA_IT_ET - Early transmit interrupt + * ETH_DMA_IT_RWT - Receive watchdog timeout interrupt + * ETH_DMA_IT_RPS - Receive process stopped interrupt + * ETH_DMA_IT_RBU - Receive buffer unavailable interrupt + * ETH_DMA_IT_R - Receive interrupt + * ETH_DMA_IT_TU - Underflow interrupt + * ETH_DMA_IT_RO - Overflow interrupt + * ETH_DMA_IT_TJT - Transmit jabber timeout interrupt + * ETH_DMA_IT_TBU - Transmit buffer unavailable interrupt + * ETH_DMA_IT_TPS - Transmit process stopped interrupt + * ETH_DMA_IT_T - Transmit interrupt + * ETH_DMA_Overflow_RxFIFOCounter - Overflow for FIFO Overflow Counter + * ETH_DMA_Overflow_MissedFrameCounter - Overflow for Missed Frame Counter + * NewState - new state of the specified ETHERNET DMA interrupts. + * + * @return new state of the specified ETHERNET DMA interrupts. + */ +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->DMAIER |= ETH_DMA_IT; + } + else + { + ETH->DMAIER &= (~(uint32_t)ETH_DMA_IT); + } +} + +/********************************************************************* + * @fn ETH_GetDMAOverflowStatus + * + * @brief Checks whether the specified ETHERNET DMA overflow flag is set or not. + * + * @param ETH_DMA_Overflow - specifies the DMA overflow flag to check. + * ETH_DMA_Overflow_RxFIFOCounter - Overflow for FIFO Overflow Counter + * ETH_DMA_Overflow_MissedFrameCounter - Overflow for Missed Frame Counter + * + * @return The new state of ETHERNET DMA overflow Flag (SET or RESET). + */ +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow) +{ + FlagStatus bitstatus = RESET; + + if((ETH->DMAMFBOCR & ETH_DMA_Overflow) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_GetRxOverflowMissedFrameCounter + * + * @brief Get the ETHERNET DMA Rx Overflow Missed Frame Counter value. + * + * @return The value of Rx overflow Missed Frame Counter. + */ +uint32_t ETH_GetRxOverflowMissedFrameCounter(void) +{ + return ((uint32_t)((ETH->DMAMFBOCR & ETH_DMAMFBOCR_MFA) >> ETH_DMA_RX_OVERFLOW_MISSEDFRAMES_COUNTERSHIFT)); +} + +/********************************************************************* + * @fn ETH_GetBufferUnavailableMissedFrameCounter + * + * @brief Get the ETHERNET DMA Buffer Unavailable Missed Frame Counter value. + * + * @return The value of Buffer unavailable Missed Frame Counter. + */ +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void) +{ + return ((uint32_t)(ETH->DMAMFBOCR) & ETH_DMAMFBOCR_MFC); +} + +/********************************************************************* + * @fn ETH_GetCurrentTxDescStartAddress + * + * @brief Get the ETHERNET DMA DMACHTDR register value. + * + * @return The value of the current Tx desc start address. + */ +uint32_t ETH_GetCurrentTxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHTDR)); +} + +/********************************************************************* + * @fn ETH_GetCurrentRxDescStartAddress + * + * @brief Get the ETHERNET DMA DMACHRDR register value. + * + * @return The value of the current Rx desc start address. + */ +uint32_t ETH_GetCurrentRxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHRDR)); +} + +/********************************************************************* + * @fn ETH_GetCurrentTxBufferAddress + * + * @brief Get the ETHERNET DMA DMACHTBAR register value. + * + * @return The value of the current Tx buffer address. + */ +uint32_t ETH_GetCurrentTxBufferAddress(void) +{ + return (DMATxDescToSet->Buffer1Addr); +} + +/********************************************************************* + * @fn ETH_GetCurrentRxBufferAddress + * + * @brief Get the ETHERNET DMA DMACHRBAR register value. + * + * @return The value of the current Rx buffer address. + */ +uint32_t ETH_GetCurrentRxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHRBAR)); +} + +/********************************************************************* + * @fn ETH_ResumeDMATransmission + * + * @brief Resumes the DMA Transmission by writing to the DmaTxPollDemand register + * + * @return none + */ +void ETH_ResumeDMATransmission(void) +{ + ETH->DMATPDR = 0; +} + +/********************************************************************* + * @fn ETH_ResumeDMAReception + * + * @brief Resumes the DMA Transmission by writing to the DmaRxPollDemand register. + * + * @return none + */ +void ETH_ResumeDMAReception(void) +{ + ETH->DMARPDR = 0; +} + +/********************************************************************* + * @fn ETH_ResetWakeUpFrameFilterRegisterPointer + * + * @brief Reset Wakeup frame filter register pointer. + * + * @return none + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void) +{ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFFRPR; +} + +/********************************************************************* + * @fn ETH_SetWakeUpFrameFilterRegister + * + * @brief Populates the remote wakeup frame registers. + * + * @param Buffer - Pointer on remote WakeUp Frame Filter Register buffer data (8 words). + * + * @return none + */ +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer) +{ + uint32_t i = 0; + + for(i = 0; i < ETH_WAKEUP_REGISTER_LENGTH; i++) + { + ETH->MACRWUFFR = Buffer[i]; + } +} + +/********************************************************************* + * @fn ETH_GlobalUnicastWakeUpCmd + * + * @brief Enables or disables any unicast packet filtered by the MAC address. + * + * @param NewState - new state of the MAC Global Unicast Wake-Up. + * + * @return none + */ +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACPMTCSR |= ETH_MACPMTCSR_GU; + } + else + { + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_GU; + } +} + +/********************************************************************* + * @fn ETH_GetPMTFlagStatus + * + * @brief Checks whether the specified ETHERNET PMT flag is set or not. + * + * @param ETH_PMT_FLAG - specifies the flag to check. + * + * @return The new state of ETHERNET PMT Flag (SET or RESET). + */ +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((ETH->MACPMTCSR & ETH_PMT_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_WakeUpFrameDetectionCmd + * + * @brief Enables or disables the MAC Wake-Up Frame Detection. + * + * @param NewState - new state of the MAC Wake-Up Frame Detection. + * + * @return none + */ +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFE; + } + else + { + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_WFE; + } +} + +/********************************************************************* + * @fn ETH_MagicPacketDetectionCmd + * + * @brief Enables or disables the MAC Magic Packet Detection. + * + * @param NewState - new state of the MAC Magic Packet Detection. + * + * @return none + */ +void ETH_MagicPacketDetectionCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACPMTCSR |= ETH_MACPMTCSR_MPE; + } + else + { + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_MPE; + } +} + +/********************************************************************* + * @fn ETH_PowerDownCmd + * + * @brief Enables or disables the MAC Power Down. + * + * @param NewState - new state of the MAC Power Down. + * + * @return none + */ +void ETH_PowerDownCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MACPMTCSR |= ETH_MACPMTCSR_PD; + } + else + { + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_PD; + } +} + +/********************************************************************* + * @fn ETH_MMCCounterFreezeCmd + * + * @brief Enables or disables the MMC Counter Freeze. + * + * @param NewState - new state of the MMC Counter Freeze. + * + * @return none + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MMCCR |= ETH_MMCCR_MCF; + } + else + { + ETH->MMCCR &= ~ETH_MMCCR_MCF; + } +} + +/********************************************************************* + * @fn ETH_MMCResetOnReadCmd + * + * @brief Enables or disables the MMC Reset On Read. + * + * @param NewState - new state of the MMC Reset On Read. + * + * @return none + */ +void ETH_MMCResetOnReadCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MMCCR |= ETH_MMCCR_ROR; + } + else + { + ETH->MMCCR &= ~ETH_MMCCR_ROR; + } +} + +/********************************************************************* + * @fn ETH_MMCCounterRolloverCmd + * + * @brief Enables or disables the MMC Counter Stop Rollover. + * + * @param NewState - new state of the MMC Counter Stop Rollover. + * + * @return none + */ +void ETH_MMCCounterRolloverCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->MMCCR &= ~ETH_MMCCR_CSR; + } + else + { + ETH->MMCCR |= ETH_MMCCR_CSR; + } +} + +/********************************************************************* + * @fn ETH_MMCCountersReset + * + * @brief Resets the MMC Counters. + * + * @return none + */ +void ETH_MMCCountersReset(void) +{ + ETH->MMCCR |= ETH_MMCCR_CR; +} + +/********************************************************************* + * @fn ETH_MMCITConfig + * + * @brief Enables or disables the specified ETHERNET MMC interrupts. + * + * @param ETH_MMC_IT - specifies the ETHERNET MMC interrupt. + * ETH_MMC_IT_TGF - When Tx good frame counter reaches half the maximum value. + * ETH_MMC_IT_TGFMSC - When Tx good multi col counter reaches half the maximum value. + * ETH_MMC_IT_TGFSC - When Tx good single col counter reaches half the maximum value. + * ETH_MMC_IT_RGUF - When Rx good unicast frames counter reaches half the maximum value. + * ETH_MMC_IT_RFAE - When Rx alignment error counter reaches half the maximum value. + * ETH_MMC_IT_RFCE - When Rx crc error counter reaches half the maximum value. + * NewState - new state of the specified ETHERNET MMC interrupts. + * + * @return none + */ +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState) +{ + if((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + ETH_MMC_IT &= 0xEFFFFFFF; + + if(NewState != DISABLE) + { + ETH->MMCRIMR &= (~(uint32_t)ETH_MMC_IT); + } + else + { + ETH->MMCRIMR |= ETH_MMC_IT; + } + } + else + { + if(NewState != DISABLE) + { + ETH->MMCTIMR &= (~(uint32_t)ETH_MMC_IT); + } + else + { + ETH->MMCTIMR |= ETH_MMC_IT; + } + } +} + +/********************************************************************* + * @fn ETH_GetMMCITStatus + * + * @brief Checks whether the specified ETHERNET MMC IT is set or not. + * + * @param ETH_MMC_IT - specifies the ETHERNET MMC interrupt. + * ETH_MMC_IT_TxFCGC - When Tx good frame counter reaches half the maximum value. + * ETH_MMC_IT_TxMCGC - When Tx good multi col counter reaches half the maximum value. + * ETH_MMC_IT_TxSCGC - When Tx good single col counter reaches half the maximum value . + * ETH_MMC_IT_RxUGFC - When Rx good unicast frames counter reaches half the maximum value. + * ETH_MMC_IT_RxAEC - When Rx alignment error counter reaches half the maximum value. + * ETH_MMC_IT_RxCEC - When Rx crc error counter reaches half the maximum value. + * + * @return The value of ETHERNET MMC IT (SET or RESET). + */ +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT) +{ + ITStatus bitstatus = RESET; + + if((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + if((((ETH->MMCRIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((((ETH->MMCTIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/********************************************************************* + * @fn ETH_GetMMCRegister + * + * @brief Get the specified ETHERNET MMC register value. + * + * @param ETH_MMCReg - specifies the ETHERNET MMC register. + * ETH_MMCCR - MMC CR register + * ETH_MMCRIR - MMC RIR register + * ETH_MMCTIR - MMC TIR register + * ETH_MMCRIMR - MMC RIMR register + * ETH_MMCTIMR - MMC TIMR register + * ETH_MMCTGFSCCR - MMC TGFSCCR register + * ETH_MMCTGFMSCCR - MMC TGFMSCCR register + * ETH_MMCTGFCR - MMC TGFCR register + * ETH_MMCRFCECR - MMC RFCECR register + * ETH_MMCRFAECR - MMC RFAECR register + * ETH_MMCRGUFCR - MMC RGUFCRregister + * + * @return The value of ETHERNET MMC Register value. + */ +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg) +{ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_MMCReg)); +} + +/********************************************************************* + * @fn ETH_EnablePTPTimeStampAddend + * + * @brief Updated the PTP block for fine correction with the Time Stamp Addend register value. + * + * @return none + */ +void ETH_EnablePTPTimeStampAddend(void) +{ + ETH->PTPTSCR |= ETH_PTPTSCR_TSARU; +} + +/********************************************************************* + * @fn ETH_EnablePTPTimeStampInterruptTrigger + * + * @brief Enable the PTP Time Stamp interrupt trigger + * + * @return none + */ +void ETH_EnablePTPTimeStampInterruptTrigger(void) +{ + ETH->PTPTSCR |= ETH_PTPTSCR_TSITE; +} + +/********************************************************************* + * @fn ETH_EnablePTPTimeStampUpdate + * + * @brief Updated the PTP system time with the Time Stamp Update register value. + * + * @return none + */ +void ETH_EnablePTPTimeStampUpdate(void) +{ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU; +} + +/********************************************************************* + * @fn ETH_InitializePTPTimeStamp + * + * @brief Initialize the PTP Time Stamp. + * + * @return none + */ +void ETH_InitializePTPTimeStamp(void) +{ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI; +} + +/********************************************************************* + * @fn ETH_PTPUpdateMethodConfig + * + * @brief Selects the PTP Update method. + * + * @param UpdateMethod - the PTP Update method. + * + * @return none + */ +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod) +{ + if(UpdateMethod != ETH_PTP_CoarseUpdate) + { + ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU; + } + else + { + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSFCU); + } +} + +/********************************************************************* + * @fn ETH_PTPTimeStampCmd + * + * @brief Enables or disables the PTP time stamp for transmit and receive frames. + * + * @param NewState - new state of the PTP time stamp for transmit and receive frames. + * + * @return none + */ +void ETH_PTPTimeStampCmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + ETH->PTPTSCR |= ETH_PTPTSCR_TSE; + } + else + { + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSE); + } +} + +/********************************************************************* + * @fn ETH_GetPTPFlagStatus + * + * @brief Checks whether the specified ETHERNET PTP flag is set or not. + * + * @param The new state of ETHERNET PTP Flag (SET or RESET). + * + * @return none + */ +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((ETH->PTPTSCR & ETH_PTP_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn ETH_SetPTPSubSecondIncrement + * + * @brief Sets the system time Sub-Second Increment value. + * + * @param SubSecondValue - specifies the PTP Sub-Second Increment Register value. + * + * @return none + */ +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue) +{ + ETH->PTPSSIR = SubSecondValue; +} + +/********************************************************************* + * @fn ETH_SetPTPTimeStampUpdate + * + * @brief Sets the Time Stamp update sign and values. + * + * @param Sign - specifies the PTP Time update value sign. + * SecondValue - specifies the PTP Time update second value. + * SubSecondValue - specifies the PTP Time update sub-second value. + * + * @return none + */ +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue) +{ + ETH->PTPTSHUR = SecondValue; + ETH->PTPTSLUR = Sign | SubSecondValue; +} + +/********************************************************************* + * @fn ETH_SetPTPTimeStampAddend + * + * @brief Sets the Time Stamp Addend value. + * + * @param Value - specifies the PTP Time Stamp Addend Register value. + * + * @return none + */ +void ETH_SetPTPTimeStampAddend(uint32_t Value) +{ + /* Set the PTP Time Stamp Addend Register */ + ETH->PTPTSAR = Value; +} + +/********************************************************************* + * @fn ETH_SetPTPTargetTime + * + * @brief Sets the Target Time registers values. + * + * @param HighValue - specifies the PTP Target Time High Register value. + * LowValue - specifies the PTP Target Time Low Register value. + * + * @return none + */ +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue) +{ + ETH->PTPTTHR = HighValue; + ETH->PTPTTLR = LowValue; +} + +/********************************************************************* + * @fn ETH_GetPTPRegister + * + * @brief Get the specified ETHERNET PTP register value. + * + * @param ETH_PTPReg - specifies the ETHERNET PTP register. + * ETH_PTPTSCR - Sub-Second Increment Register + * ETH_PTPSSIR - Sub-Second Increment Register + * ETH_PTPTSHR - Time Stamp High Register + * ETH_PTPTSLR - Time Stamp Low Register + * ETH_PTPTSHUR - Time Stamp High Update Register + * ETH_PTPTSLUR - Time Stamp Low Update Register + * ETH_PTPTSAR - Time Stamp Addend Register + * ETH_PTPTTHR - Target Time High Register + * ETH_PTPTTLR - Target Time Low Register + * + * @return The value of ETHERNET PTP Register value. + */ +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg) +{ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_PTPReg)); +} + +/********************************************************************* + * @fn ETH_DMAPTPTxDescChainInit + * + * @brief Initializes the DMA Tx descriptors in chain mode with PTP. + * + * @param DMATxDescTab - Pointer on the first Tx desc list. + * DMAPTPTxDescTab - Pointer on the first PTP Tx desc list. + * TxBuff - Pointer on the first TxBuffer list. + * TxBuffCount - Number of the used Tx desc in the list. + * + * @return none. + */ +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, + uint8_t *TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + DMATxDescToSet = DMATxDescTab; + DMAPTPTxDescToSet = DMAPTPTxDescTab; + + for(i = 0; i < TxBuffCount; i++) + { + DMATxDesc = DMATxDescTab + i; + DMATxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_TTSE; + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i * ETH_MAX_PACKET_SIZE]); + + if(i < (TxBuffCount - 1)) + { + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab + i + 1); + } + else + { + DMATxDesc->Buffer2NextDescAddr = (uint32_t)DMATxDescTab; + } + + (&DMAPTPTxDescTab[i])->Buffer1Addr = DMATxDesc->Buffer1Addr; + (&DMAPTPTxDescTab[i])->Buffer2NextDescAddr = DMATxDesc->Buffer2NextDescAddr; + } + + (&DMAPTPTxDescTab[i - 1])->Status = (uint32_t)DMAPTPTxDescTab; + + ETH->DMATDLAR = (uint32_t)DMATxDescTab; +} + +/********************************************************************* + * @fn ETH_DMAPTPRxDescChainInit + * + * @brief Initializes the DMA Rx descriptors in chain mode. + * + * @param DMARxDescTab - Pointer on the first Rx desc list. + * DMAPTPRxDescTab - Pointer on the first PTP Rx desc list. + * RxBuff - Pointer on the first RxBuffer list. + * RxBuffCount - Number of the used Rx desc in the list. + * + * @return none. + */ +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, + uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + DMARxDescToGet = DMARxDescTab; + DMAPTPRxDescToGet = DMAPTPRxDescTab; + + for(i = 0; i < RxBuffCount; i++) + { + DMARxDesc = DMARxDescTab + i; + DMARxDesc->Status = ETH_DMARxDesc_OWN; + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i * ETH_MAX_PACKET_SIZE]); + + if(i < (RxBuffCount - 1)) + { + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab + i + 1); + } + else + { + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + + (&DMAPTPRxDescTab[i])->Buffer1Addr = DMARxDesc->Buffer1Addr; + (&DMAPTPRxDescTab[i])->Buffer2NextDescAddr = DMARxDesc->Buffer2NextDescAddr; + } + + (&DMAPTPRxDescTab[i - 1])->Status = (uint32_t)DMAPTPRxDescTab; + ETH->DMARDLAR = (uint32_t)DMARxDescTab; +} + +/********************************************************************* + * @fn ETH_HandlePTPTxPkt + * + * @brief Transmits a packet, from application buffer, pointed by ppkt with Time Stamp values. + * + * @param ppkt - pointer to application packet buffer to transmit. + * FrameLength - Tx Packet size. + * PTPTxTab - Pointer on the first PTP Tx table to store Time stamp values. + * + * @return none. + */ +uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab) +{ + uint32_t offset = 0, timeout = 0; + + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + return ETH_ERROR; + } + + for(offset = 0; offset < FrameLength; offset++) + { + (*(__IO uint8_t *)((DMAPTPTxDescToSet->Buffer1Addr) + offset)) = (*(ppkt + offset)); + } + + DMATxDescToSet->ControlBufferSize = (FrameLength & (uint32_t)0x1FFF); + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + + if((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + ETH->DMASR = ETH_DMASR_TBUS; + ETH->DMATPDR = 0; + } + + do + { + timeout++; + } while(!(DMATxDescToSet->Status & ETH_DMATxDesc_TTSS) && (timeout < 0xFFFF)); + + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + + DMATxDescToSet->Status &= ~ETH_DMATxDesc_TTSS; + *PTPTxTab++ = DMATxDescToSet->Buffer1Addr; + *PTPTxTab = DMATxDescToSet->Buffer2NextDescAddr; + + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + DMATxDescToSet = (ETH_DMADESCTypeDef *)(DMAPTPTxDescToSet->Buffer2NextDescAddr); + if(DMAPTPTxDescToSet->Status != 0) + { + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef *)(DMAPTPTxDescToSet->Status); + } + else + { + DMAPTPTxDescToSet++; + } + } + else + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + DMATxDescToSet = (ETH_DMADESCTypeDef *)(ETH->DMATDLAR); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef *)(ETH->DMATDLAR); + } + else + { + DMATxDescToSet = (ETH_DMADESCTypeDef *)((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef *)((uint32_t)DMAPTPTxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + return ETH_SUCCESS; +} + +/********************************************************************* + * @fn ETH_HandlePTPRxPkt + * + * @brief Receives a packet and copies it to memory pointed by ppkt with Time Stamp values. + * + * @param ppkt - pointer to application packet receive buffer. + * PTPRxTab - Pointer on the first PTP Rx table to store Time stamp values. + * + * @return ETH_ERROR - if there is error in reception. + * framelength - received packet size if packet reception is correct. + */ +uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab) +{ + uint32_t offset = 0, framelength = 0; + + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + return ETH_ERROR; + } + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT) - 4; + + for(offset = 0; offset < framelength; offset++) + { + (*(ppkt + offset)) = (*(__IO uint8_t *)((DMAPTPRxDescToGet->Buffer1Addr) + offset)); + } + } + else + { + framelength = ETH_ERROR; + } + + if((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + ETH->DMASR = ETH_DMASR_RBUS; + ETH->DMARPDR = 0; + } + + *PTPRxTab++ = DMARxDescToGet->Buffer1Addr; + *PTPRxTab = DMARxDescToGet->Buffer2NextDescAddr; + DMARxDescToGet->Status |= ETH_DMARxDesc_OWN; + + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)(DMAPTPRxDescToGet->Buffer2NextDescAddr); + if(DMAPTPRxDescToGet->Status != 0) + { + DMAPTPRxDescToGet = (ETH_DMADESCTypeDef *)(DMAPTPRxDescToGet->Status); + } + else + { + DMAPTPRxDescToGet++; + } + } + else + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)(ETH->DMARDLAR); + } + else + { + DMARxDescToGet = (ETH_DMADESCTypeDef *)((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + return (framelength); +} + +/********************************************************************* + * @fn RGMII_TXC_Delay + * + * @brief Delay time. + * + * @return none + */ +void RGMII_TXC_Delay(uint8_t clock_polarity, uint8_t delay_time) +{ + if(clock_polarity) + { + ETH->MACCR |= (uint32_t)(1 << 1); + } + else + { + ETH->MACCR &= ~(uint32_t)(1 << 1); + } + if(delay_time <= 7) + { + ETH->MACCR &= ~(uint32_t)(7 << 29); + ETH->MACCR |= (uint32_t)(delay_time << 29); + } +} diff --git a/Peripheral/src/ch32v30x_exti.c b/Peripheral/src/ch32v30x_exti.c new file mode 100644 index 0000000..7f10cbf --- /dev/null +++ b/Peripheral/src/ch32v30x_exti.c @@ -0,0 +1,182 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_exti.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the EXTI firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_exti.h" + +/* No interrupt selected */ +#define EXTI_LINENONE ((uint32_t)0x00000) + +/********************************************************************* + * @fn EXTI_DeInit + * + * @brief Deinitializes the EXTI peripheral registers to their default + * reset values. + * + * @return none. + */ +void EXTI_DeInit(void) +{ + EXTI->INTENR = 0x00000000; + EXTI->EVENR = 0x00000000; + EXTI->RTENR = 0x00000000; + EXTI->FTENR = 0x00000000; + EXTI->INTFR = 0x000FFFFF; +} + +/********************************************************************* + * @fn EXTI_Init + * + * @brief Initializes the EXTI peripheral according to the specified + * parameters in the EXTI_InitStruct. + * + * @param EXTI_InitStruct - pointer to a EXTI_InitTypeDef structure + * + * @return none. + */ +void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct) +{ + uint32_t tmp = 0; + + tmp = (uint32_t)EXTI_BASE; + if(EXTI_InitStruct->EXTI_LineCmd != DISABLE) + { + EXTI->INTENR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->EVENR &= ~EXTI_InitStruct->EXTI_Line; + tmp += EXTI_InitStruct->EXTI_Mode; + *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line; + EXTI->RTENR &= ~EXTI_InitStruct->EXTI_Line; + EXTI->FTENR &= ~EXTI_InitStruct->EXTI_Line; + if(EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) + { + EXTI->RTENR |= EXTI_InitStruct->EXTI_Line; + EXTI->FTENR |= EXTI_InitStruct->EXTI_Line; + } + else + { + tmp = (uint32_t)EXTI_BASE; + tmp += EXTI_InitStruct->EXTI_Trigger; + *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line; + } + } + else + { + tmp += EXTI_InitStruct->EXTI_Mode; + *(__IO uint32_t *)tmp &= ~EXTI_InitStruct->EXTI_Line; + } +} + +/********************************************************************* + * @fn EXTI_StructInit + * + * @brief Fills each EXTI_InitStruct member with its reset value. + * + * @param EXTI_InitStruct - pointer to a EXTI_InitTypeDef structure + * + * @return none. + */ +void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct) +{ + EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; + EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStruct->EXTI_LineCmd = DISABLE; +} + +/********************************************************************* + * @fn EXTI_GenerateSWInterrupt + * + * @brief Generates a Software interrupt. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return none. + */ +void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) +{ + EXTI->SWIEVR |= EXTI_Line; +} + +/********************************************************************* + * @fn EXTI_GetFlagStatus + * + * @brief Checks whether the specified EXTI line flag is set or not. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return The new state of EXTI_Line (SET or RESET). + */ +FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) +{ + FlagStatus bitstatus = RESET; + if((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn EXTI_ClearFlag + * + * @brief Clears the EXTI's line pending flags. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return None + */ +void EXTI_ClearFlag(uint32_t EXTI_Line) +{ + EXTI->INTFR = EXTI_Line; +} + +/********************************************************************* + * @fn EXTI_GetITStatus + * + * @brief Checks whether the specified EXTI line is asserted or not. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return The new state of EXTI_Line (SET or RESET). + */ +ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + enablestatus = EXTI->INTENR & EXTI_Line; + if(((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn EXTI_ClearITPendingBit + * + * @brief Clears the EXTI's line pending bits. + * + * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. + * + * @return none + */ +void EXTI_ClearITPendingBit(uint32_t EXTI_Line) +{ + EXTI->INTFR = EXTI_Line; +} diff --git a/Peripheral/src/ch32v30x_flash.c b/Peripheral/src/ch32v30x_flash.c new file mode 100644 index 0000000..cf09230 --- /dev/null +++ b/Peripheral/src/ch32v30x_flash.c @@ -0,0 +1,1226 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_flash.c +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/14 +* Description : This file provides all the FLASH firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_flash.h" + +/* Flash Control Register bits */ +#define CR_PG_Set ((uint32_t)0x00000001) +#define CR_PG_Reset ((uint32_t)0xFFFFFFFE) +#define CR_PER_Set ((uint32_t)0x00000002) +#define CR_PER_Reset ((uint32_t)0xFFFFFFFD) +#define CR_MER_Set ((uint32_t)0x00000004) +#define CR_MER_Reset ((uint32_t)0xFFFFFFFB) +#define CR_OPTPG_Set ((uint32_t)0x00000010) +#define CR_OPTPG_Reset ((uint32_t)0xFFFFFFEF) +#define CR_OPTER_Set ((uint32_t)0x00000020) +#define CR_OPTER_Reset ((uint32_t)0xFFFFFFDF) +#define CR_STRT_Set ((uint32_t)0x00000040) +#define CR_LOCK_Set ((uint32_t)0x00000080) +#define CR_FLOCK_Set ((uint32_t)0x00008000) +#define CR_PAGE_PG ((uint32_t)0x00010000) +#define CR_PAGE_ER ((uint32_t)0x00020000) +#define CR_BER32 ((uint32_t)0x00040000) +#define CR_PG_STRT ((uint32_t)0x00200000) + +/* FLASH Status Register bits */ +#define SR_BSY ((uint32_t)0x00000001) +#define SR_WR_BSY ((uint32_t)0x00000002) +#define SR_WRPRTERR ((uint32_t)0x00000010) +#define SR_EOP ((uint32_t)0x00000020) + +/* FLASH Mask */ +#define RDPRT_Mask ((uint32_t)0x00000002) +#define WRP0_Mask ((uint32_t)0x000000FF) +#define WRP1_Mask ((uint32_t)0x0000FF00) +#define WRP2_Mask ((uint32_t)0x00FF0000) +#define WRP3_Mask ((uint32_t)0xFF000000) +#define OB_USER_BFB2 ((uint16_t)0x0008) + +/* FLASH Keys */ +#define RDP_Key ((uint16_t)0x00A5) +#define FLASH_KEY1 ((uint32_t)0x45670123) +#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) + +/* FLASH BANK address */ +#define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF) + +/* Delay definition */ +#define EraseTimeout ((uint32_t)0x00130000) +#define ProgramTimeout ((uint32_t)0x00005000) + +/* Flash Program Valid Address */ +#define ValidAddrStart (FLASH_BASE) +#define ValidAddrEnd (FLASH_BASE + 0x78000) + +/* FLASH Size */ +#define Size_256B 0x100 +#define Size_4KB 0x1000 +#define Size_32KB 0x8000 + +#define FLASH_EraseAll_Delay(t) ({for(uint32_t i = 0; iKEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/********************************************************************* + * @fn FLASH_UnlockBank1 + * + * @brief Unlocks the FLASH Bank1 Program Erase Controller. + * equivalent to FLASH_Unlock function. + * + * @return none + */ +void FLASH_UnlockBank1(void) +{ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; +} + +/********************************************************************* + * @fn FLASH_Lock + * + * @brief Locks the FLASH Program Erase Controller. + * + * @return none + */ +void FLASH_Lock(void) +{ + FLASH->CTLR |= CR_LOCK_Set; +} + +/********************************************************************* + * @fn FLASH_LockBank1 + * + * @brief Locks the FLASH Bank1 Program Erase Controller. + * + * @return none + */ +void FLASH_LockBank1(void) +{ + FLASH->CTLR |= CR_LOCK_Set; +} + +/********************************************************************* + * @fn FLASH_ErasePage + * + * @brief Erases a specified FLASH page(page size 4KB). + * + * @param Page_Address - The page address to be erased. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ErasePage(uint32_t Page_Address) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_PER_Set; + FLASH->ADDR = Page_Address; + FLASH->CTLR |= CR_STRT_Set; + + status = FLASH_WaitForLastOperation(EraseTimeout); + + FLASH->CTLR &= CR_PER_Reset; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_EraseAllPages + * + * @brief Erases all FLASH pages. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllPages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_MER_Set; + FLASH->CTLR |= CR_STRT_Set; + + status = FLASH_WaitForLastOperation(EraseTimeout); + + FLASH->CTLR &= CR_MER_Reset; + } + FLASH_EraseAll_Delay(300000); + return status; +} + +/********************************************************************* + * @fn FLASH_EraseAllBank1Pages + * + * @brief Erases all Bank1 FLASH pages. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseAllBank1Pages(void) +{ + FLASH_Status status = FLASH_COMPLETE; + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_MER_Set; + FLASH->CTLR |= CR_STRT_Set; + + status = FLASH_WaitForLastBank1Operation(EraseTimeout); + + FLASH->CTLR &= CR_MER_Reset; + } + FLASH_EraseAll_Delay(300000); + return status; +} + +/********************************************************************* + * @fn FLASH_EraseOptionBytes + * + * @brief Erases the FLASH option bytes. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EraseOptionBytes(void) +{ + uint16_t rdptmp = RDP_Key; + uint32_t Address = 0x1FFFF800; + __IO uint8_t i; + + FLASH_Status status = FLASH_COMPLETE; + if(FLASH_GetReadOutProtectionStatus() != RESET) + { + rdptmp = 0x00; + } + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + status = FLASH_WaitForLastOperation(EraseTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR &= CR_OPTER_Reset; + FLASH->CTLR |= CR_OPTPG_Set; + OB->RDPR = (uint16_t)rdptmp; + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status != FLASH_TIMEOUT) + { + FLASH->CTLR &= CR_OPTPG_Reset; + } + } + else + { + if(status != FLASH_TIMEOUT) + { + FLASH->CTLR &= CR_OPTPG_Reset; + } + } + + /* Write 0xFF */ + FLASH->CTLR |= CR_OPTPG_Set; + + for(i = 0; i < 8; i++) + { + *(uint16_t *)(Address + 2 * i) = 0x00FF; + while(FLASH->STATR & SR_BSY) + ; + } + + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_ProgramWord + * + * @brief Programs a word at a specified address. + * + * @param Address - specifies the address to be programmed. + * Data - specifies the data to be programmed. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + __IO uint32_t tmp = 0; + + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_PG_Set; + + *(__IO uint16_t *)Address = (uint16_t)Data; + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + tmp = Address + 2; + *(__IO uint16_t *)tmp = Data >> 16; + status = FLASH_WaitForLastOperation(ProgramTimeout); + FLASH->CTLR &= CR_PG_Reset; + } + else + { + FLASH->CTLR &= CR_PG_Reset; + } + } + + return status; +} + +/********************************************************************* + * @fn FLASH_ProgramHalfWord + * + * @brief Programs a half word at a specified address. + * + * @param Address - specifies the address to be programmed. + * Data - specifies the data to be programmed. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->CTLR |= CR_PG_Set; + *(__IO uint16_t *)Address = Data; + status = FLASH_WaitForLastOperation(ProgramTimeout); + FLASH->CTLR &= CR_PG_Reset; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_ProgramOptionByteData + * + * @brief Programs a half word at a specified Option Byte Data address. + * + * @param Address - specifies the address to be programmed. + * Data - specifies the data to be programmed. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + status = FLASH_WaitForLastOperation(ProgramTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + /* Read optionbytes */ + for(i = 0; i < 8; i++) + { + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + pbuf[((Address - 0x1FFFF800) / 2)] = ((((uint16_t) ~(Data)) << 8) | ((uint16_t)Data)); + + FLASH->CTLR |= CR_OPTPG_Set; + + for(i = 0; i < 8; i++) + { + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY) + ; + } + + FLASH->CTLR &= ~CR_OPTPG_Set; + } + + return status; +} + +/********************************************************************* + * @fn FLASH_EnableWriteProtection + * + * @brief Write protects the desired sectors + * + * @param FLASH_Sectors - specifies the address of the pages to be write protected. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Sectors) +{ + uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF; + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + FLASH_Sectors = (uint32_t)(~FLASH_Sectors); + WRP0_Data = (uint16_t)(FLASH_Sectors & WRP0_Mask); + WRP1_Data = (uint16_t)((FLASH_Sectors & WRP1_Mask) >> 8); + WRP2_Data = (uint16_t)((FLASH_Sectors & WRP2_Mask) >> 16); + WRP3_Data = (uint16_t)((FLASH_Sectors & WRP3_Mask) >> 24); + + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + /* Read optionbytes */ + for(i = 0; i < 8; i++) + { + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + pbuf[4] = WRP0_Data; + pbuf[5] = WRP1_Data; + pbuf[6] = WRP2_Data; + pbuf[7] = WRP3_Data; + + FLASH->CTLR |= CR_OPTPG_Set; + for(i = 0; i < 8; i++) + { + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY) + ; + } + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_ReadOutProtection + * + * @brief Enables or disables the read out protection. + * + * @param Newstate - new state of the ReadOut Protection(ENABLE or DISABLE). + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + + status = FLASH_WaitForLastOperation(EraseTimeout); + if(status == FLASH_COMPLETE) + { + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + + /* Read optionbytes */ + for(i = 0; i < 8; i++) + { + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + if(NewState == DISABLE) + pbuf[0] = 0x5AA5; + else + pbuf[0] = 0x00FF; + + FLASH->CTLR |= CR_OPTPG_Set; + for(i = 0; i < 8; i++) + { + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY) + ; + } + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_UserOptionByteConfig + * + * @brief Programs the FLASH User Option Byte - IWDG_SW / RST_STOP / RST_STDBY. + * + * @param OB_IWDG - Selects the IWDG mode + * OB_IWDG_SW - Software IWDG selected + * OB_IWDG_HW - Hardware IWDG selected + * OB_STOP - Reset event when entering STOP mode. + * OB_STOP_NoRST - No reset generated when entering in STOP + * OB_STOP_RST - Reset generated when entering in STOP + * OB_STDBY - Reset event when entering Standby mode. + * OB_STDBY_NoRST - No reset generated when entering in STANDBY + * OB_STDBY_RST - Reset generated when entering in STANDBY + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + */ +FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY) +{ + FLASH_Status status = FLASH_COMPLETE; + uint32_t Addr = 0x1FFFF800; + __IO uint8_t i; + uint16_t pbuf[8]; + uint16_t temp; + + FLASH->OBKEYR = FLASH_KEY1; + FLASH->OBKEYR = FLASH_KEY2; + status = FLASH_WaitForLastOperation(ProgramTimeout); + + if(status == FLASH_COMPLETE) + { + /* Read optionbytes */ + for(i = 0; i < 8; i++) + { + pbuf[i] = *(uint16_t *)(Addr + 2 * i); + } + + temp=pbuf[1]&(~0x7); + + /* Erase optionbytes */ + FLASH->CTLR |= CR_OPTER_Set; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_OPTER_Set; + + /* Write optionbytes */ + pbuf[1] = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)temp))); + + FLASH->CTLR |= CR_OPTPG_Set; + for(i = 0; i < 8; i++) + { + *(uint16_t *)(Addr + 2 * i) = pbuf[i]; + while(FLASH->STATR & SR_BSY) + ; + } + FLASH->CTLR &= ~CR_OPTPG_Set; + } + return status; +} + +/********************************************************************* + * @fn FLASH_GetUserOptionByte + * + * @brief Returns the FLASH User Option Bytes values. + * + * @return The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1) + * and RST_STDBY(Bit2). + */ +uint32_t FLASH_GetUserOptionByte(void) +{ + return (uint32_t)(FLASH->OBR >> 2); +} + +/********************************************************************* + * @fn FLASH_GetWriteProtectionOptionByte + * + * @brief Returns the FLASH Write Protection Option Bytes Register value. + * + * @return The FLASH Write Protection Option Bytes Register value. + */ +uint32_t FLASH_GetWriteProtectionOptionByte(void) +{ + return (uint32_t)(FLASH->WPR); +} + +/********************************************************************* + * @fn FLASH_GetReadOutProtectionStatus + * + * @brief Checks whether the FLASH Read Out Protection Status is set or not. + * + * @return FLASH ReadOut Protection Status(SET or RESET) + */ +FlagStatus FLASH_GetReadOutProtectionStatus(void) +{ + FlagStatus readoutstatus = RESET; + if((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET) + { + readoutstatus = SET; + } + else + { + readoutstatus = RESET; + } + return readoutstatus; +} + +/********************************************************************* + * @fn FLASH_ITConfig + * + * @brief Enables or disables the specified FLASH interrupts. + * + * @param FLASH_IT - specifies the FLASH interrupt sources to be enabled or disabled. + * FLASH_IT_ERROR - FLASH Error Interrupt + * FLASH_IT_EOP - FLASH end of operation Interrupt + * NewState - new state of the specified Flash interrupts(ENABLE or DISABLE). + * + * @return FLASH Prefetch Buffer Status (SET or RESET). + */ +void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + FLASH->CTLR |= FLASH_IT; + } + else + { + FLASH->CTLR &= ~(uint32_t)FLASH_IT; + } +} + +/********************************************************************* + * @fn FLASH_GetFlagStatus + * + * @brief Checks whether the specified FLASH flag is set or not. + * + * @param FLASH_FLAG - specifies the FLASH flag to check. + * FLASH_FLAG_BSY - FLASH Busy flag + * FLASH_FLAG_WRPRTERR - FLASH Write protected error flag + * FLASH_FLAG_EOP - FLASH End of Operation flag + * FLASH_FLAG_OPTERR - FLASH Option Byte error flag + * + * @return The new state of FLASH_FLAG (SET or RESET). + */ +FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG) +{ + FlagStatus bitstatus = RESET; + + if(FLASH_FLAG == FLASH_FLAG_OPTERR) + { + if((FLASH->OBR & (1 << 0)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + if((FLASH->STATR & FLASH_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + return bitstatus; +} + +/********************************************************************* + * @fn FLASH_ClearFlag + * + * @brief Clears the FLASH's pending flags. + * + * @param FLASH_FLAG - specifies the FLASH flags to clear. + * FLASH_FLAG_WRPRTERR - FLASH Write protected error flag + * FLASH_FLAG_EOP - FLASH End of Operation flag + * + * @return none + */ +void FLASH_ClearFlag(uint32_t FLASH_FLAG) +{ + FLASH->STATR = FLASH_FLAG; +} + +/********************************************************************* + * @fn FLASH_GetStatus + * + * @brief Returns the FLASH Status. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_GetStatus(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->STATR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->STATR & FLASH_FLAG_WRPRTERR) != 0) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + return flashstatus; +} + +/********************************************************************* + * @fn FLASH_GetBank1Status + * + * @brief Returns the FLASH Bank1 Status. + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_GetBank1Status(void) +{ + FLASH_Status flashstatus = FLASH_COMPLETE; + + if((FLASH->STATR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY) + { + flashstatus = FLASH_BUSY; + } + else + { + if((FLASH->STATR & FLASH_FLAG_BANK1_WRPRTERR) != 0) + { + flashstatus = FLASH_ERROR_WRP; + } + else + { + flashstatus = FLASH_COMPLETE; + } + } + return flashstatus; +} + +/********************************************************************* + * @fn FLASH_WaitForLastOperation + * + * @brief Waits for a Flash operation to complete or a TIMEOUT to occur. + * + * @param Timeout - FLASH programming Timeout + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_GetBank1Status(); + while((status == FLASH_BUSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00) + { + status = FLASH_TIMEOUT; + } + return status; +} + +/********************************************************************* + * @fn FLASH_WaitForLastBank1Operation + * + * @brief Waits for a Flash operation on Bank1 to complete or a TIMEOUT to occur. + * + * @param Timeout - FLASH programming Timeout + * + * @return FLASH Status - The returned value can be: FLASH_BUSY, FLASH_ERROR_PG, + * FLASH_ERROR_WRP or FLASH_COMPLETE. + */ +FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout) +{ + FLASH_Status status = FLASH_COMPLETE; + + status = FLASH_GetBank1Status(); + while((status == FLASH_FLAG_BANK1_BSY) && (Timeout != 0x00)) + { + status = FLASH_GetBank1Status(); + Timeout--; + } + if(Timeout == 0x00) + { + status = FLASH_TIMEOUT; + } + return status; +} + +/********************************************************************* + * @fn FLASH_Unlock_Fast + * + * @brief Unlocks the Fast Program Erase Mode. + * + * @return none + */ +void FLASH_Unlock_Fast(void) +{ + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; + + /* Fast program mode unlock */ + FLASH->MODEKEYR = FLASH_KEY1; + FLASH->MODEKEYR = FLASH_KEY2; +} + +/********************************************************************* + * @fn FLASH_Lock_Fast + * + * @brief Locks the Fast Program Erase Mode. + * + * @return none + */ +void FLASH_Lock_Fast(void) +{ + FLASH->CTLR |= CR_FLOCK_Set; +} + +/********************************************************************* + * @fn FLASH_ErasePage_Fast + * + * @brief Erases a specified FLASH page (1page = 256Byte). + * + * @param Page_Address - The page address to be erased. + * + * @return none + */ +void FLASH_ErasePage_Fast(uint32_t Page_Address) +{ + Page_Address &= 0xFFFFFF00; + + FLASH->CTLR |= CR_PAGE_ER; + FLASH->ADDR = Page_Address; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_PAGE_ER; +} + +/********************************************************************* + * @fn FLASH_EraseBlock_32K_Fast + * + * @brief Erases a specified FLASH Block (1Block = 32KByte). + * + * @param Block_Address - The block address to be erased. + * + * @return none + */ +void FLASH_EraseBlock_32K_Fast(uint32_t Block_Address) +{ + Block_Address &= 0xFFFF8000; + + FLASH->CTLR |= CR_BER32; + FLASH->ADDR = Block_Address; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_BER32; +} + +/********************************************************************* + * @fn FLASH_ProgramPage_Fast + * + * @brief Program a specified FLASH page (1page = 256Byte). + * + * @param Page_Address - The page address to be programed. + * + * @return none + */ +void FLASH_ProgramPage_Fast(uint32_t Page_Address, uint32_t *pbuf) +{ + uint8_t size = 64; + + Page_Address &= 0xFFFFFF00; + + FLASH->CTLR |= CR_PAGE_PG; + while(FLASH->STATR & SR_BSY) + ; + while(FLASH->STATR & SR_WR_BSY) + ; + + while(size) + { + *(uint32_t *)Page_Address = *(uint32_t *)pbuf; + Page_Address += 4; + pbuf += 1; + size -= 1; + while(FLASH->STATR & SR_WR_BSY) + ; + } + + FLASH->CTLR |= CR_PG_STRT; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_PAGE_PG; +} + +/********************************************************************* + * @fn FLASH_Access_Clock_Cfg + * + * @brief Config FLASH Access Clock(Need to unlock ) + * + * @param FLASH_Access_CLK - + * FLASH_Access_SYSTEM_HALF - System clock/2 + * FLASH_Access_SYSTEM - System clock + * + * @return none + */ +void FLASH_Access_Clock_Cfg(uint32_t FLASH_Access_CLK) +{ + FLASH->CTLR &= ~(1 << 25); + FLASH->CTLR |= FLASH_Access_CLK; +} + +/********************************************************************* + * @fn FLASH_Enhance_Mode + * + * @brief Read FLASH Enhance Mode + * + * @param Newstate - new state of the ReadOut Protection(ENABLE or DISABLE). + * + * @return none + */ +void FLASH_Enhance_Mode(FunctionalState NewState) +{ + if(NewState) + { + FLASH->CTLR |= (1 << 24); + } + else + { + FLASH->CTLR &= ~(1 << 24); + FLASH->CTLR |= (1 << 22); + } +} + +/********************************************************************* + * @fn ROM_ERASE + * + * @brief Select erases a specified FLASH . + * + * @param StartAddr - Erases Flash start address(StartAddr%256 == 0). + * Cnt - Erases count. + * Erase_Size - Erases size select.The returned value can be: + * Size_32KB, Size_4KB, Size_256B. + * + * @return none. + */ +static void ROM_ERASE(uint32_t StartAddr, uint32_t Cnt, uint32_t Erase_Size) +{ + do{ + if(Erase_Size == Size_32KB) + { + FLASH->CTLR |= CR_BER32; + } + else if(Erase_Size == Size_4KB) + { + FLASH->CTLR |= CR_PER_Set; + } + else if(Erase_Size == Size_256B) + { + FLASH->CTLR |= CR_PAGE_ER; + } + + FLASH->ADDR = StartAddr; + FLASH->CTLR |= CR_STRT_Set; + while(FLASH->STATR & SR_BSY) + ; + + if(Erase_Size == Size_32KB) + { + FLASH->CTLR &= ~CR_BER32; + StartAddr += Size_32KB; + } + else if(Erase_Size == Size_4KB) + { + FLASH->CTLR &= ~CR_PER_Set; + StartAddr += Size_4KB; + } + else if(Erase_Size == Size_256B) + { + FLASH->CTLR &= ~CR_PAGE_ER; + StartAddr += Size_256B; + } + }while(--Cnt); +} + +/********************************************************************* + * @fn FLASH_ROM_ERASE + * + * @brief Erases a specified FLASH . + * + * @param StartAddr - Erases Flash start address(StartAddr%256 == 0). + * Length - Erases Flash start Length(Length%256 == 0). + * + * @return FLASH Status - The returned value can be: FLASH_ADR_RANGE_ERROR, + * FLASH_ALIGN_ERROR, FLASH_OP_RANGE_ERROR or FLASH_COMPLETE. + */ +FLASH_Status FLASH_ROM_ERASE(uint32_t StartAddr, uint32_t Length) +{ + uint32_t Addr0 = 0, Addr1 = 0, Length0 = 0, Length1 = 0; + + FLASH_Status status = FLASH_COMPLETE; + + if((StartAddr < ValidAddrStart) || (StartAddr >= ValidAddrEnd)) + { + return FLASH_ADR_RANGE_ERROR; + } + + if((StartAddr + Length) > ValidAddrEnd) + { + return FLASH_OP_RANGE_ERROR; + } + + if((StartAddr & (Size_256B-1)) || (Length & (Size_256B-1)) || (Length == 0)) + { + return FLASH_ALIGN_ERROR; + } + + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; + + /* Fast mode unlock */ + FLASH->MODEKEYR = FLASH_KEY1; + FLASH->MODEKEYR = FLASH_KEY2; + + Addr0 = StartAddr; + + if(Length >= Size_32KB) + { + Length0 = Size_32KB - (Addr0 & (Size_32KB - 1)); + Addr1 = StartAddr + Length0; + Length1 = Length - Length0; + } + else if(Length >= Size_4KB) + { + Length0 = Size_4KB - (Addr0 & (Size_4KB - 1)); + Addr1 = StartAddr + Length0; + Length1 = Length - Length0; + } + else if(Length >= Size_256B) + { + Length0 = Length; + } + + /* Erase 32KB */ + if(Length0 >= Size_32KB)//front + { + Length = Length0; + if(Addr0 & (Size_32KB - 1)) + { + Length0 = Size_32KB - (Addr0 & (Size_32KB - 1)); + } + else + { + Length0 = 0; + } + + ROM_ERASE((Addr0 + Length0), ((Length - Length0) >> 15), Size_32KB); + } + + if(Length1 >= Size_32KB)//back + { + StartAddr = Addr1; + Length = Length1; + + if((Addr1 + Length1) & (Size_32KB - 1)) + { + Addr1 = ((StartAddr + Length1) & (~(Size_32KB - 1))); + Length1 = (StartAddr + Length1) & (Size_32KB - 1); + } + else + { + Length1 = 0; + } + + ROM_ERASE(StartAddr, ((Length - Length1) >> 15), Size_32KB); + } + + /* Erase 4KB */ + if(Length0 >= Size_4KB) //front + { + Length = Length0; + if(Addr0 & (Size_4KB - 1)) + { + Length0 = Size_4KB - (Addr0 & (Size_4KB - 1)); + } + else + { + Length0 = 0; + } + + ROM_ERASE((Addr0 + Length0), ((Length - Length0) >> 12), Size_4KB); + } + + if(Length1 >= Size_4KB) //back + { + StartAddr = Addr1; + Length = Length1; + + if((Addr1 + Length1) & (Size_4KB - 1)) + { + Addr1 = ((StartAddr + Length1) & (~(Size_4KB - 1))); + Length1 = (StartAddr + Length1) & (Size_4KB - 1); + } + else + { + Length1 = 0; + } + + ROM_ERASE(StartAddr, ((Length - Length1) >> 12), Size_4KB); + } + + /* Erase 256B */ + if(Length0)//front + { + ROM_ERASE(Addr0, (Length0 >> 8), Size_256B); + } + + if(Length1)//back + { + ROM_ERASE(Addr1, (Length1 >> 8), Size_256B); + } + + FLASH->CTLR |= CR_FLOCK_Set; + FLASH->CTLR |= CR_LOCK_Set; + + return status; +} + +/********************************************************************* + * @fn FLASH_ROM_WRITE + * + * @brief Writes a specified FLASH . + * + * @param StartAddr - Writes Flash start address(StartAddr%256 == 0). + * Length - Writes Flash start Length(Length%256 == 0). + * pbuf - Writes Flash value buffer. + * + * @return FLASH Status - The returned value can be: FLASH_ADR_RANGE_ERROR, + * FLASH_ALIGN_ERROR, FLASH_OP_RANGE_ERROR or FLASH_COMPLETE. + */ +FLASH_Status FLASH_ROM_WRITE(uint32_t StartAddr, uint32_t *pbuf, uint32_t Length) +{ + uint32_t i; + uint8_t size; + + FLASH_Status status = FLASH_COMPLETE; + + if((StartAddr < ValidAddrStart) || (StartAddr >= ValidAddrEnd)) + { + return FLASH_ADR_RANGE_ERROR; + } + + if((StartAddr + Length) > ValidAddrEnd) + { + return FLASH_OP_RANGE_ERROR; + } + + if((StartAddr & (Size_256B-1)) || (Length & (Size_256B-1)) || (Length == 0)) + { + return FLASH_ALIGN_ERROR; + } + + i = Length >> 8; + + /* Authorize the FPEC of Bank1 Access */ + FLASH->KEYR = FLASH_KEY1; + FLASH->KEYR = FLASH_KEY2; + + /* Fast program mode unlock */ + FLASH->MODEKEYR = FLASH_KEY1; + FLASH->MODEKEYR = FLASH_KEY2; + + do{ + FLASH->CTLR |= CR_PAGE_PG; + while(FLASH->STATR & SR_BSY) + ; + while(FLASH->STATR & SR_WR_BSY) + ; + size = 64; + while(size) + { + *(uint32_t *)StartAddr = *(uint32_t *)pbuf; + StartAddr += 4; + pbuf += 1; + size -= 1; + while(FLASH->STATR & SR_WR_BSY) + ; + } + + FLASH->CTLR |= CR_PG_STRT; + while(FLASH->STATR & SR_BSY) + ; + FLASH->CTLR &= ~CR_PAGE_PG; + }while(--i); + + FLASH->CTLR |= CR_FLOCK_Set; + FLASH->CTLR |= CR_LOCK_Set; + + return status; +} diff --git a/Peripheral/src/ch32v30x_fsmc.c b/Peripheral/src/ch32v30x_fsmc.c new file mode 100644 index 0000000..343307d --- /dev/null +++ b/Peripheral/src/ch32v30x_fsmc.c @@ -0,0 +1,378 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_fsmc.c +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/06 +* Description : This file provides all the FSMC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_fsmc.h" +#include "ch32v30x_rcc.h" + +/* FSMC BCRx Mask */ +#define BCR_MBKEN_Set ((uint32_t)0x00000001) +#define BCR_MBKEN_Reset ((uint32_t)0x000FFFFE) +#define BCR_FACCEN_Set ((uint32_t)0x00000040) + +/* FSMC PCRx Mask */ +#define PCR_PBKEN_Set ((uint32_t)0x00000004) +#define PCR_PBKEN_Reset ((uint32_t)0x000FFFFB) +#define PCR_ECCEN_Set ((uint32_t)0x00000040) +#define PCR_ECCEN_Reset ((uint32_t)0x000FFFBF) +#define PCR_MemoryType_NAND ((uint32_t)0x00000008) + +/********************************************************************* + * @fn FSMC_NORSRAMDeInit + * + * @brief Deinitializes the FSMC NOR/SRAM Banks registers to their default + * reset values. + * + * @param FSMC_Bank- + * FSMC_Bank1_NORSRAM1 - FSMC Bank1 NOR/SRAM1. + * + * @return none + */ +void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank) +{ + if(FSMC_Bank == FSMC_Bank1_NORSRAM1) + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030DB; + } + else + { + FSMC_Bank1->BTCR[FSMC_Bank] = 0x000030D2; + } + FSMC_Bank1->BTCR[FSMC_Bank + 1] = 0x0FFFFFFF; + FSMC_Bank1E->BWTR[FSMC_Bank] = 0x0FFFFFFF; +} + +/********************************************************************* + * @fn FSMC_NANDDeInit + * + * @brief Deinitializes the FSMC NAND Banks registers to their default + * reset values. + * + * @param FSMC_Bank - + * FSMC_Bank2_NAND - FSMC Bank2 NAND. + * + * @return none + */ +void FSMC_NANDDeInit(uint32_t FSMC_Bank) +{ + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 = 0x00000018; + FSMC_Bank2->SR2 = 0x00000040; + FSMC_Bank2->PMEM2 = 0xFCFCFCFC; + FSMC_Bank2->PATT2 = 0xFCFCFCFC; + } +} + +/********************************************************************* + * @fn FSMC_NORSRAMInit + * + * @brief Initializes the FSMC NOR/SRAM Banks according to the specified + * parameters in the FSMC_NORSRAMInitStruct. + * + * @param SMC_NORSRAMInitStruct:pointer to a FSMC_NORSRAMInitTypeDef + * structure that contains the configuration information for the FSMC NOR/SRAM + * specified Banks. + * + * @return none + */ +void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef *FSMC_NORSRAMInitStruct) +{ + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_DataAddressMux | + FSMC_NORSRAMInitStruct->FSMC_MemoryType | + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth | + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode | + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity | + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive | + FSMC_NORSRAMInitStruct->FSMC_WriteOperation | + FSMC_NORSRAMInitStruct->FSMC_WaitSignal | + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode | + FSMC_NORSRAMInitStruct->FSMC_WriteBurst; + + if(FSMC_NORSRAMInitStruct->FSMC_MemoryType == FSMC_MemoryType_NOR) + { + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank] |= (uint32_t)BCR_FACCEN_Set; + } + + FSMC_Bank1->BTCR[FSMC_NORSRAMInitStruct->FSMC_Bank + 1] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime << 8) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration << 16) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision << 20) | + (FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency << 24) | + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode; + + if(FSMC_NORSRAMInitStruct->FSMC_ExtendedMode == FSMC_ExtendedMode_Enable) + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = + (uint32_t)FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime << 4) | + (FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime << 8) | + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode; + } + else + { + FSMC_Bank1E->BWTR[FSMC_NORSRAMInitStruct->FSMC_Bank] = 0x0FFFFFFF; + } +} + +/********************************************************************* + * @fn FSMC_NANDInit + * + * @brief Initializes the FSMC NAND Banks according to the specified + * parameters in the FSMC_NANDInitStruct. + * + * @param FSMC_NANDInitStruct - pointer to a FSMC_NANDInitTypeDef + * structure that contains the configuration information for the FSMC + * NAND specified Banks. + * + * @return none + */ +void FSMC_NANDInit(FSMC_NANDInitTypeDef *FSMC_NANDInitStruct) +{ + uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; + + tmppcr = (uint32_t)FSMC_NANDInitStruct->FSMC_Waitfeature | + PCR_MemoryType_NAND | + FSMC_NANDInitStruct->FSMC_MemoryDataWidth | + FSMC_NANDInitStruct->FSMC_ECC | + FSMC_NANDInitStruct->FSMC_ECCPageSize | + (FSMC_NANDInitStruct->FSMC_TCLRSetupTime << 9) | + (FSMC_NANDInitStruct->FSMC_TARSetupTime << 13); + + tmppmem = (uint32_t)FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime << 16) | + (FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + tmppatt = (uint32_t)FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime << 8) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime << 16) | + (FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime << 24); + + if(FSMC_NANDInitStruct->FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 = tmppcr; + FSMC_Bank2->PMEM2 = tmppmem; + FSMC_Bank2->PATT2 = tmppatt; + } +} + +/********************************************************************* + * @fn FSMC_NORSRAMStructInit + * + * @brief Fills each FSMC_NORSRAMInitStruct member with its default value. + * + * @param FSMC_NORSRAMInitStruct - pointer to a FSMC_NORSRAMInitTypeDef + * structure which will be initialized. + * + * @return none + */ +void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef *FSMC_NORSRAMInitStruct) +{ + FSMC_NORSRAMInitStruct->FSMC_Bank = FSMC_Bank1_NORSRAM1; + FSMC_NORSRAMInitStruct->FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; + FSMC_NORSRAMInitStruct->FSMC_MemoryType = FSMC_MemoryType_SRAM; + FSMC_NORSRAMInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NORSRAMInitStruct->FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; + FSMC_NORSRAMInitStruct->FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; + FSMC_NORSRAMInitStruct->FSMC_WriteOperation = FSMC_WriteOperation_Enable; + FSMC_NORSRAMInitStruct->FSMC_WaitSignal = FSMC_WaitSignal_Enable; + FSMC_NORSRAMInitStruct->FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; + FSMC_NORSRAMInitStruct->FSMC_WriteBurst = FSMC_WriteBurst_Disable; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_CLKDivision = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_DataLatency = 0xF; + FSMC_NORSRAMInitStruct->FSMC_ReadWriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressSetupTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AddressHoldTime = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_DataSetupTime = 0xFF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_BusTurnAroundDuration = 0xF; + FSMC_NORSRAMInitStruct->FSMC_WriteTimingStruct->FSMC_AccessMode = FSMC_AccessMode_A; +} + +/********************************************************************* + * @fn FSMC_NANDStructInit + * + * @brief Fills each FSMC_NANDInitStruct member with its default value. + * + * @param FSMC_NANDInitStruct - pointer to a FSMC_NANDInitTypeDef + * structure which will be initialized. + * + * @return none + */ +void FSMC_NANDStructInit(FSMC_NANDInitTypeDef *FSMC_NANDInitStruct) +{ + FSMC_NANDInitStruct->FSMC_Bank = FSMC_Bank2_NAND; + FSMC_NANDInitStruct->FSMC_Waitfeature = FSMC_Waitfeature_Disable; + FSMC_NANDInitStruct->FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; + FSMC_NANDInitStruct->FSMC_ECC = FSMC_ECC_Disable; + FSMC_NANDInitStruct->FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes; + FSMC_NANDInitStruct->FSMC_TCLRSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_TARSetupTime = 0x0; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_CommonSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_SetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_WaitSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HoldSetupTime = 0xFC; + FSMC_NANDInitStruct->FSMC_AttributeSpaceTimingStruct->FSMC_HiZSetupTime = 0xFC; +} + +/********************************************************************* + * @fn FSMC_NORSRAMCmd + * + * @brief Enables or disables the specified NOR/SRAM Memory Bank. + * + * @param FSMC_Bank - specifies the FSMC Bank to be used + * FSMC_Bank1_NORSRAM1 - FSMC Bank1 NOR/SRAM1 + * FSMC_Bank1_NORSRAM2 - FSMC Bank1 NOR/SRAM2 + * FSMC_Bank1_NORSRAM3 - FSMC Bank1 NOR/SRAM3 + * FSMC_Bank1_NORSRAM4 - FSMC Bank1 NOR/SRAM4 + * NewState:ENABLE or DISABLE. + * + * @return none + */ +void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + FSMC_Bank1->BTCR[FSMC_Bank] |= BCR_MBKEN_Set; + } + else + { + FSMC_Bank1->BTCR[FSMC_Bank] &= BCR_MBKEN_Reset; + } +} + +/********************************************************************* + * @fn FSMC_NANDCmd + * + * @brief Enables or disables the specified NAND Memory Bank. + * + * @param FSMC_Bank - specifies the FSMC Bank to be used + * FSMC_Bank2_NAND - FSMC Bank2 NAND + * NewStat - ENABLE or DISABLE. + * + * @return none + */ +void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_PBKEN_Set; + } + } + else + { + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_PBKEN_Reset; + } + } +} + +/********************************************************************* + * @fn FSMC_NANDECCCmd + * + * @brief Enables or disables the FSMC NAND ECC feature. + * + * @param FSMC_Bank - specifies the FSMC Bank to be used + * FSMC_Bank2_NAND - FSMC Bank2 NAND + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 |= PCR_ECCEN_Set; + } + } + else + { + if(FSMC_Bank == FSMC_Bank2_NAND) + { + FSMC_Bank2->PCR2 &= PCR_ECCEN_Reset; + } + } +} + +/********************************************************************* + * @fn FSMC_GetECC + * + * @brief Returns the error correction code register value. + * + * @param FSMC_Bank - specifies the FSMC Bank to be used + * FSMC_Bank2_NAND - FSMC Bank2 NAND + * NewState - ENABLE or DISABLE. + * + * @return eccval - The Error Correction Code (ECC) value. + */ +uint32_t FSMC_GetECC(uint32_t FSMC_Bank) +{ + uint32_t eccval = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + eccval = FSMC_Bank2->ECCR2; + } + + return (eccval); +} + +/********************************************************************* + * @fn FSMC_GetFlagStatus + * + * @brief Checks whether the specified FSMC flag is set or not. + * + * @param FSMC_Bank - specifies the FSMC Bank to be used + * FSMC_Bank2_NAND - FSMC Bank2 NAND + * FSMC_FLAG - specifies the flag to check. + * FSMC_FLAG_FEMPT - Fifo empty Flag. + * NewState - ENABLE or DISABLE. + * + * @return FlagStatus - The new state of FSMC_FLAG (SET or RESET). + */ +FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG) +{ + FlagStatus bitstatus = RESET; + uint32_t tmpsr = 0x00000000; + + if(FSMC_Bank == FSMC_Bank2_NAND) + { + tmpsr = FSMC_Bank2->SR2; + } + + if((tmpsr & FSMC_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} diff --git a/Peripheral/src/ch32v30x_gpio.c b/Peripheral/src/ch32v30x_gpio.c new file mode 100644 index 0000000..b5a0169 --- /dev/null +++ b/Peripheral/src/ch32v30x_gpio.c @@ -0,0 +1,895 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_gpio.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/05/06 +* Description : This file provides all the GPIO firmware functions. +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_gpio.h" +#include "ch32v30x_rcc.h" + +/* MASK */ +#define ECR_PORTPINCONFIG_MASK ((uint16_t)0xFF80) +#define LSB_MASK ((uint16_t)0xFFFF) +#define DBGAFR_POSITION_MASK ((uint32_t)0x000F0000) +#define DBGAFR_SWJCFG_MASK ((uint32_t)0xF0FFFFFF) +#define DBGAFR_LOCATION_MASK ((uint32_t)0x00200000) +#define DBGAFR_NUMBITS_MASK ((uint32_t)0x00100000) + +/********************************************************************* + * @fn GPIO_DeInit + * + * @brief Deinitializes the GPIOx peripheral registers to their default + * reset values. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @return none + */ +void GPIO_DeInit(GPIO_TypeDef *GPIOx) +{ + if(GPIOx == GPIOA) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE); + } + else if(GPIOx == GPIOB) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE); + } + else if(GPIOx == GPIOC) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE); + } + else if(GPIOx == GPIOD) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE); + } + else if(GPIOx == GPIOE) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE); + } +} + +/********************************************************************* + * @fn GPIO_AFIODeInit + * + * @brief Deinitializes the Alternate Functions (remap, event control + * and EXTI configuration) registers to their default reset values. + * + * @return none + */ +void GPIO_AFIODeInit(void) +{ + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE); +} + +/********************************************************************* + * @fn GPIO_Init + * + * @brief GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure that + * contains the configuration information for the specified GPIO peripheral. + * + * @return none + */ +void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct) +{ + uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00; + uint32_t tmpreg = 0x00, pinmask = 0x00; + + currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F); + + if((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00) + { + currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed; + } + + if(((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00) + { + tmpreg = GPIOx->CFGLR; + + for(pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = ((uint32_t)0x01) << pinpos; + currentpin = (GPIO_InitStruct->GPIO_Pin) & pos; + + if(currentpin == pos) + { + pos = pinpos << 2; + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + tmpreg |= (currentmode << pos); + + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BCR = (((uint32_t)0x01) << pinpos); + } + else + { + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSHR = (((uint32_t)0x01) << pinpos); + } + } + } + } + GPIOx->CFGLR = tmpreg; + } + + if(GPIO_InitStruct->GPIO_Pin > 0x00FF) + { + tmpreg = GPIOx->CFGHR; + + for(pinpos = 0x00; pinpos < 0x08; pinpos++) + { + pos = (((uint32_t)0x01) << (pinpos + 0x08)); + currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos); + + if(currentpin == pos) + { + pos = pinpos << 2; + pinmask = ((uint32_t)0x0F) << pos; + tmpreg &= ~pinmask; + tmpreg |= (currentmode << pos); + + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD) + { + GPIOx->BCR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + + if(GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU) + { + GPIOx->BSHR = (((uint32_t)0x01) << (pinpos + 0x08)); + } + } + } + GPIOx->CFGHR = tmpreg; + } +} + +/********************************************************************* + * @fn GPIO_StructInit + * + * @brief Fills each GPIO_InitStruct member with its default + * + * @param GPIO_InitStruct - pointer to a GPIO_InitTypeDef structure + * which will be initialized. + * + * @return none + */ +void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct) +{ + GPIO_InitStruct->GPIO_Pin = GPIO_Pin_All; + GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN_FLOATING; +} + +/********************************************************************* + * @fn GPIO_ReadInputDataBit + * + * @brief GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @param GPIO_Pin - specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * + * @return The input port pin value. + */ +uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + if((GPIOx->INDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn GPIO_ReadInputData + * + * @brief Reads the specified GPIO input data port. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @return The output port pin value. + */ +uint16_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx) +{ + return ((uint16_t)GPIOx->INDR); +} + +/********************************************************************* + * @fn GPIO_ReadOutputDataBit + * + * @brief Reads the specified output data port bit. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bit to read. + * This parameter can be GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint8_t bitstatus = 0x00; + + if((GPIOx->OUTDR & GPIO_Pin) != (uint32_t)Bit_RESET) + { + bitstatus = (uint8_t)Bit_SET; + } + else + { + bitstatus = (uint8_t)Bit_RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn GPIO_ReadOutputData + * + * @brief Reads the specified GPIO output data port. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * + * @return GPIO output port pin value. + */ +uint16_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx) +{ + return ((uint16_t)GPIOx->OUTDR); +} + +/********************************************************************* + * @fn GPIO_SetBits + * + * @brief Sets the selected data port bits. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + GPIOx->BSHR = GPIO_Pin; +} + +/********************************************************************* + * @fn GPIO_ResetBits + * + * @brief Clears the selected data port bits. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bits to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + GPIOx->BCR = GPIO_Pin; +} + +/********************************************************************* + * @fn GPIO_WriteBit + * + * @brief Sets or clears the selected data port bit. + * + * @param GPIO_Pin - specifies the port bit to be written. + * This parameter can be one of GPIO_Pin_x where x can be (0..15). + * BitVal - specifies the value to be written to the selected bit. + * Bit_RESET - to clear the port pin. + * Bit_SET - to set the port pin. + * + * @return none + */ +void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, BitAction BitVal) +{ + if(BitVal != Bit_RESET) + { + GPIOx->BSHR = GPIO_Pin; + } + else + { + GPIOx->BCR = GPIO_Pin; + } +} + +/********************************************************************* + * @fn GPIO_Write + * + * @brief Writes data to the specified GPIO data port. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * PortVal - specifies the value to be written to the port output data register. + * + * @return none + */ +void GPIO_Write(GPIO_TypeDef *GPIOx, uint16_t PortVal) +{ + GPIOx->OUTDR = PortVal; +} + +/********************************************************************* + * @fn GPIO_PinLockConfig + * + * @brief Locks GPIO Pins configuration registers. + * + * @param GPIOx - where x can be (A..G) to select the GPIO peripheral. + * GPIO_Pin - specifies the port bit to be written. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * + * @return none + */ +void GPIO_PinLockConfig(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) +{ + uint32_t tmp = 0x00010000; + + tmp |= GPIO_Pin; + GPIOx->LCKR = tmp; + GPIOx->LCKR = GPIO_Pin; + GPIOx->LCKR = tmp; + tmp = GPIOx->LCKR; + tmp = GPIOx->LCKR; +} + +/********************************************************************* + * @fn GPIO_EventOutputConfig + * + * @brief Selects the GPIO pin used as Event output. + * + * @param GPIO_PortSource - selects the GPIO port to be used as source + * for Event output. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..E). + * GPIO_PinSource - specifies the pin for the Event output. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * + * @return none + */ +void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmpreg = 0x00; + + tmpreg = AFIO->ECR; + tmpreg &= ECR_PORTPINCONFIG_MASK; + tmpreg |= (uint32_t)GPIO_PortSource << 0x04; + tmpreg |= GPIO_PinSource; + AFIO->ECR = tmpreg; +} + +/********************************************************************* + * @fn GPIO_EventOutputCmd + * + * @brief Enables or disables the Event Output. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void GPIO_EventOutputCmd(FunctionalState NewState) +{ + if(NewState) + { + AFIO->ECR |= (1 << 7); + } + else + { + AFIO->ECR &= ~(1 << 7); + } +} + +/********************************************************************* + * @fn GPIO_PinRemapConfig + * + * @brief Changes the mapping of the specified pin. + * + * @param GPIO_Remap - selects the pin to remap. + * GPIO_Remap_SPI1 - SPI1 Alternate Function mapping + * GPIO_Remap_SPI3 - SPI3 Alternate Function mapping(CH32V30X_D8,CH32V30X_D8C) + * GPIO_Remap_I2C1 - I2C1 Alternate Function mapping + * GPIO_Remap_USART1 - USART1 Alternate Function mapping + * GPIO_Remap_USART2 - USART2 Alternate Function mapping + * GPIO_PartialRemap_USART3 - USART3 Partial Alternate Function mapping + * GPIO_PartialRemap1_USART3 - USART3 Partial1 Alternate Function mapping + * GPIO_FullRemap_USART3 - USART3 Full Alternate Function mapping + * GPIO_PartialRemap_TIM1 - TIM1 Partial Alternate Function mapping + * GPIO_FullRemap_TIM1 - TIM1 Full Alternate Function mapping + * GPIO_PartialRemap1_TIM2 - TIM2 Partial1 Alternate Function mapping + * GPIO_PartialRemap2_TIM2 - TIM2 Partial2 Alternate Function mapping + * GPIO_FullRemap_TIM2 - TIM2 Full Alternate Function mapping + * GPIO_PartialRemap_TIM3 - TIM3 Partial Alternate Function mapping + * GPIO_FullRemap_TIM3 - TIM3 Full Alternate Function mapping + * GPIO_Remap_TIM4 - TIM4 Alternate Function mapping + * GPIO_Remap1_CAN1 - CAN1 Alternate Function mapping + * GPIO_Remap2_CAN1 - CAN1 Alternate Function mapping + * GPIO_Remap_PD0PD1 - PD0 and PD1 Alternate Function mapping + * GPIO_Remap_ADC1_ETRGINJ - ADC1 External Trigger Injected Conversion remapping + * GPIO_Remap_ADC1_ETRGREG - ADC1 External Trigger Regular Conversion remapping + * GPIO_Remap_ADC2_ETRGINJ - ADC2 External Trigger Injected Conversion remapping + * GPIO_Remap_ADC2_ETRGREG - ADC2 External Trigger Regular Conversion remapping + * GPIO_Remap_ETH - Ethernet remapping + * GPIO_Remap_CAN2 - CAN2 remapping + * GPIO_Remap_MII_RMII_SEL - MII or RMII selection + * GPIO_Remap_SWJ_Disable - Full SWJ Disabled + * GPIO_Remap_TIM2ITR1_PTP_SOF - Ethernet PTP output or USB OTG SOF (Start of Frame) connected + * to TIM2 Internal Trigger 1 for calibration + * GPIO_Remap_TIM2ITR1_PTP_SOF - Ethernet PTP output or USB OTG SOF (Start of Frame) + * GPIO_Remap_TIM8 - TIM8 Alternate Function mapping + * GPIO_PartialRemap_TIM9 - TIM9 Partial Alternate Function mapping + * GPIO_FullRemap_TIM9 - TIM9 Full Alternate Function mapping + * GPIO_PartialRemap_TIM10 - TIM10 Partial Alternate Function mapping + * GPIO_FullRemap_TIM10 - TIM10 Full Alternate Function mapping + * GPIO_Remap_FSMC_NADV - FSMC_NADV Alternate Function mapping + * GPIO_PartialRemap_USART4 - USART4 Partial Alternate Function mapping + * GPIO_FullRemap_USART4 - USART4 Full Alternate Function mapping + * GPIO_PartialRemap_USART5 - USART5 Partial Alternate Function mapping + * GPIO_FullRemap_USART5 - USART5 Full Alternate Function mapping + * GPIO_PartialRemap_USART6 - USART6 Partial Alternate Function mapping + * GPIO_FullRemap_USART6 - USART6 Full Alternate Function mapping + * GPIO_PartialRemap_USART7 - USART7 Partial Alternate Function mapping + * GPIO_FullRemap_USART7 - USART7 Full Alternate Function mapping + * GPIO_PartialRemap_USART8 - USART8 Partial Alternate Function mapping + * GPIO_FullRemap_USART8 - USART8 Full Alternate Function mapping + * GPIO_Remap_USART1_HighBit - USART1 Alternate Function mapping high bit + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) +{ + uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00; + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + tmpreg = AFIO->PCFR2; + } + else + { + tmpreg = AFIO->PCFR1; + } + + tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10; + tmp = GPIO_Remap & LSB_MASK; + + /* Clear bit */ + if((GPIO_Remap & 0x80000000) == 0x80000000) + { /* PCFR2 */ + if((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) /* [31:16] 2bit */ + { + tmp1 = ((uint32_t)0x03) << (tmpmask + 0x10); + tmpreg &= ~tmp1; + } + else if((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) /* [15:0] 2bit */ + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + } + else /* [31:0] 1bit */ + { + tmpreg &= ~(tmp << (((GPIO_Remap & 0x7FFFFFFF)>> 0x15) * 0x10)); + } + } + else + { /* PCFR1 */ + if((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) /* [26:24] 3bit SWD_JTAG */ + { + tmpreg &= DBGAFR_SWJCFG_MASK; + AFIO->PCFR1 &= DBGAFR_SWJCFG_MASK; + } + else if((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK) /* [15:0] 2bit */ + { + tmp1 = ((uint32_t)0x03) << tmpmask; + tmpreg &= ~tmp1; + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + else /* [31:0] 1bit */ + { + tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15) * 0x10)); + tmpreg |= ~DBGAFR_SWJCFG_MASK; + } + } + + /* Set bit */ + if(NewState != DISABLE) + { + tmpreg |= (tmp << (((GPIO_Remap & 0x7FFFFFFF)>> 0x15) * 0x10)); + } + + if((GPIO_Remap & 0x80000000) == 0x80000000) + { + AFIO->PCFR2 = tmpreg; + } + else + { + AFIO->PCFR1 = tmpreg; + } +} + +/********************************************************************* + * @fn GPIO_EXTILineConfig + * + * @brief Selects the GPIO pin used as EXTI Line. + * + * @param GPIO_PortSource - selects the GPIO port to be used as source for EXTI lines. + * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G). + * GPIO_PinSource - specifies the EXTI line to be configured. + * This parameter can be GPIO_PinSourcex where x can be (0..15). + * + * @return none + */ +void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) +{ + uint32_t tmp = 0x00; + + tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); + AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; + AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); +} + +/********************************************************************* + * @fn GPIO_ETH_MediaInterfaceConfig + * + * @brief Selects the Ethernet media interface. + * + * @param GPIO_ETH_MediaInterface - specifies the Media Interface mode. + * GPIO_ETH_MediaInterface_MII - MII mode + * GPIO_ETH_MediaInterface_RMII - RMII mode + * + * @return none + */ +void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) +{ + if(GPIO_ETH_MediaInterface) + { + AFIO->PCFR1 |= (1 << 23); + } + else + { + AFIO->PCFR1 &= ~(1 << 23); + } +} +/********************************************************************* + * @fn GPIO_IPD_Unused + * + * @brief Configure unused GPIO as input pull-down. + * + * @param none + * + * @return none + */ +void GPIO_IPD_Unused(void) +{ + GPIO_InitTypeDef GPIO_InitStructure = {0}; + uint32_t chip = 0; + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC|\ + RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE); + chip = *( uint32_t * )0x1FFFF704 & (~0x000000F0); + switch(chip) + { +#ifdef CH32V30x_D8 + case 0x30330504: //CH32V303CBT6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30320504: //CH32V303RBT6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30310504: //CH32V303RCT6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30300504: //CH32V303VCT6 + { + break; + } +#elif defined (CH32V30x_D8C) + case 0x30520508: //CH32V305FBP6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_8|GPIO_Pin_9; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x305C0508: //CH32V305CCT6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30500508: //CH32V305RBT6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30710508: //CH32V307RCT6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_2|GPIO_Pin_3\ + |GPIO_Pin_4|GPIO_Pin_5\ + |GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30730508: //CH32V307WCU6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13|GPIO_Pin_14\ + |GPIO_Pin_15; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x3173B508: //CH32V317WCU6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7\ + |GPIO_Pin_8|GPIO_Pin_9; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x3175B508: //CH32V317TCU6 + { + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7|GPIO_Pin_8\ + |GPIO_Pin_9|GPIO_Pin_10\ + |GPIO_Pin_11|GPIO_Pin_12\ + |GPIO_Pin_13; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOC, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9\ + |GPIO_Pin_10|GPIO_Pin_11\ + |GPIO_Pin_12|GPIO_Pin_13\ + |GPIO_Pin_14|GPIO_Pin_15\ + |GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6\ + |GPIO_Pin_7; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOD, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2\ + |GPIO_Pin_3|GPIO_Pin_4\ + |GPIO_Pin_5|GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(GPIOE, &GPIO_InitStructure); + break; + } + case 0x30700508: //CH32V307VCT6 + { + break; + } + case 0x3170B508: //CH32V317VCT6 + { + break; + } +#endif + default: + { + break; + } + } +} diff --git a/Peripheral/src/ch32v30x_i2c.c b/Peripheral/src/ch32v30x_i2c.c new file mode 100644 index 0000000..05c9b43 --- /dev/null +++ b/Peripheral/src/ch32v30x_i2c.c @@ -0,0 +1,1012 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_i2c.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file provides all the I2C firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_i2c.h" +#include "ch32v30x_rcc.h" + +/* I2C SPE mask */ +#define CTLR1_PE_Set ((uint16_t)0x0001) +#define CTLR1_PE_Reset ((uint16_t)0xFFFE) + +/* I2C START mask */ +#define CTLR1_START_Set ((uint16_t)0x0100) +#define CTLR1_START_Reset ((uint16_t)0xFEFF) + +/* I2C STOP mask */ +#define CTLR1_STOP_Set ((uint16_t)0x0200) +#define CTLR1_STOP_Reset ((uint16_t)0xFDFF) + +/* I2C ACK mask */ +#define CTLR1_ACK_Set ((uint16_t)0x0400) +#define CTLR1_ACK_Reset ((uint16_t)0xFBFF) + +/* I2C ENGC mask */ +#define CTLR1_ENGC_Set ((uint16_t)0x0040) +#define CTLR1_ENGC_Reset ((uint16_t)0xFFBF) + +/* I2C SWRST mask */ +#define CTLR1_SWRST_Set ((uint16_t)0x8000) +#define CTLR1_SWRST_Reset ((uint16_t)0x7FFF) + +/* I2C PEC mask */ +#define CTLR1_PEC_Set ((uint16_t)0x1000) +#define CTLR1_PEC_Reset ((uint16_t)0xEFFF) + +/* I2C ENPEC mask */ +#define CTLR1_ENPEC_Set ((uint16_t)0x0020) +#define CTLR1_ENPEC_Reset ((uint16_t)0xFFDF) + +/* I2C ENARP mask */ +#define CTLR1_ENARP_Set ((uint16_t)0x0010) +#define CTLR1_ENARP_Reset ((uint16_t)0xFFEF) + +/* I2C NOSTRETCH mask */ +#define CTLR1_NOSTRETCH_Set ((uint16_t)0x0080) +#define CTLR1_NOSTRETCH_Reset ((uint16_t)0xFF7F) + +/* I2C registers Masks */ +#define CTLR1_CLEAR_Mask ((uint16_t)0xFBF5) + +/* I2C DMAEN mask */ +#define CTLR2_DMAEN_Set ((uint16_t)0x0800) +#define CTLR2_DMAEN_Reset ((uint16_t)0xF7FF) + +/* I2C LAST mask */ +#define CTLR2_LAST_Set ((uint16_t)0x1000) +#define CTLR2_LAST_Reset ((uint16_t)0xEFFF) + +/* I2C FREQ mask */ +#define CTLR2_FREQ_Reset ((uint16_t)0xFFC0) + +/* I2C ADD0 mask */ +#define OADDR1_ADD0_Set ((uint16_t)0x0001) +#define OADDR1_ADD0_Reset ((uint16_t)0xFFFE) + +/* I2C ENDUAL mask */ +#define OADDR2_ENDUAL_Set ((uint16_t)0x0001) +#define OADDR2_ENDUAL_Reset ((uint16_t)0xFFFE) + +/* I2C ADD2 mask */ +#define OADDR2_ADD2_Reset ((uint16_t)0xFF01) + +/* I2C F/S mask */ +#define CKCFGR_FS_Set ((uint16_t)0x8000) + +/* I2C CCR mask */ +#define CKCFGR_CCR_Set ((uint16_t)0x0FFF) + +/* I2C FLAG mask */ +#define FLAG_Mask ((uint32_t)0x00FFFFFF) + +/* I2C Interrupt Enable mask */ +#define ITEN_Mask ((uint32_t)0x07000000) + +/********************************************************************* + * @fn I2C_DeInit + * + * @brief Deinitializes the I2Cx peripheral registers to their default + * reset values. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return none + */ +void I2C_DeInit(I2C_TypeDef *I2Cx) +{ + if(I2Cx == I2C1) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + } + else + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE); + } +} + +/********************************************************************* + * @fn I2C_Init + * + * @brief Initializes the I2Cx peripheral according to the specified + * parameters in the I2C_InitStruct. + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_InitStruct - pointer to a I2C_InitTypeDef structure that + * contains the configuration information for the specified I2C peripheral. + * + * @return none + */ +void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitTypeDef *I2C_InitStruct) +{ + uint16_t tmpreg = 0, freqrange = 0; + uint16_t result = 0x04; + uint32_t pclk1 = 8000000; + + RCC_ClocksTypeDef rcc_clocks; + + tmpreg = I2Cx->CTLR2; + tmpreg &= CTLR2_FREQ_Reset; + RCC_GetClocksFreq(&rcc_clocks); + pclk1 = rcc_clocks.PCLK1_Frequency; + freqrange = (uint16_t)(pclk1 / 1000000); + if(freqrange >= 60) + { + freqrange = 60; + } + tmpreg |= freqrange; + I2Cx->CTLR2 = tmpreg; + + I2Cx->CTLR1 &= CTLR1_PE_Reset; + tmpreg = 0; + + if(I2C_InitStruct->I2C_ClockSpeed <= 100000) + { + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1)); + + if(result < 0x04) + { + result = 0x04; + } + + tmpreg |= result; + I2Cx->RTR = freqrange + 1; + } + else + { + if(I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2) + { + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3)); + } + else + { + result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25)); + result |= I2C_DutyCycle_16_9; + } + + if((result & CKCFGR_CCR_Set) == 0) + { + result |= (uint16_t)0x0001; + } + + tmpreg |= (uint16_t)(result | CKCFGR_FS_Set); + I2Cx->RTR = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1); + } + + I2Cx->CKCFGR = tmpreg; + I2Cx->CTLR1 |= CTLR1_PE_Set; + + tmpreg = I2Cx->CTLR1; + tmpreg &= CTLR1_CLEAR_Mask; + tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack); + I2Cx->CTLR1 = tmpreg; + + I2Cx->OADDR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1); +} + +/********************************************************************* + * @fn I2C_StructInit + * + * @brief Fills each I2C_InitStruct member with its default value. + * + * @param I2C_InitStruct - pointer to an I2C_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void I2C_StructInit(I2C_InitTypeDef *I2C_InitStruct) +{ + I2C_InitStruct->I2C_ClockSpeed = 5000; + I2C_InitStruct->I2C_Mode = I2C_Mode_I2C; + I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStruct->I2C_OwnAddress1 = 0; + I2C_InitStruct->I2C_Ack = I2C_Ack_Disable; + I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; +} + +/********************************************************************* + * @fn I2C_Cmd + * + * @brief Enables or disables the specified I2C peripheral. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_Cmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_PE_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_PE_Reset; + } +} + +/********************************************************************* + * @fn I2C_DMACmd + * + * @brief Enables or disables the specified I2C DMA requests. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_DMACmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR2 |= CTLR2_DMAEN_Set; + } + else + { + I2Cx->CTLR2 &= CTLR2_DMAEN_Reset; + } +} + +/********************************************************************* + * @fn I2C_DMALastTransferCmd + * + * @brief Specifies if the next DMA transfer will be the last one. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_DMALastTransferCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR2 |= CTLR2_LAST_Set; + } + else + { + I2Cx->CTLR2 &= CTLR2_LAST_Reset; + } +} + +/********************************************************************* + * @fn I2C_GenerateSTART + * + * @brief Generates I2Cx communication START condition. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_GenerateSTART(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_START_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_START_Reset; + } +} + +/********************************************************************* + * @fn I2C_GenerateSTOP + * + * @brief Generates I2Cx communication STOP condition. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_GenerateSTOP(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_STOP_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_STOP_Reset; + } +} + +/********************************************************************* + * @fn I2C_AcknowledgeConfig + * + * @brief Enables or disables the specified I2C acknowledge feature. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_AcknowledgeConfig(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ACK_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ACK_Reset; + } +} + +/********************************************************************* + * @fn I2C_OwnAddress2Config + * + * @brief Configures the specified I2C own address2. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * Address - specifies the 7bit I2C own address2. + * + * @return none + */ +void I2C_OwnAddress2Config(I2C_TypeDef *I2Cx, uint8_t Address) +{ + uint16_t tmpreg = 0; + + tmpreg = I2Cx->OADDR2; + tmpreg &= OADDR2_ADD2_Reset; + tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE); + I2Cx->OADDR2 = tmpreg; +} + +/********************************************************************* + * @fn I2C_DualAddressCmd + * + * @brief Enables or disables the specified I2C dual addressing mode. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_DualAddressCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->OADDR2 |= OADDR2_ENDUAL_Set; + } + else + { + I2Cx->OADDR2 &= OADDR2_ENDUAL_Reset; + } +} + +/********************************************************************* + * @fn I2C_GeneralCallCmd + * + * @brief Enables or disables the specified I2C general call feature. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_GeneralCallCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ENGC_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ENGC_Reset; + } +} + +/********************************************************************* + * @fn I2C_ITConfig + * + * @brief Enables or disables the specified I2C interrupts. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_IT - specifies the I2C interrupts sources to be enabled or disabled. + * I2C_IT_BUF - Buffer interrupt mask. + * I2C_IT_EVT - Event interrupt mask. + * I2C_IT_ERR - Error interrupt mask. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_ITConfig(I2C_TypeDef *I2Cx, uint16_t I2C_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR2 |= I2C_IT; + } + else + { + I2Cx->CTLR2 &= (uint16_t)~I2C_IT; + } +} + +/********************************************************************* + * @fn I2C_SendData + * + * @brief Sends a data byte through the I2Cx peripheral. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * Data - Byte to be transmitted. + * + * @return none + */ +void I2C_SendData(I2C_TypeDef *I2Cx, uint8_t Data) +{ + I2Cx->DATAR = Data; +} + +/********************************************************************* + * @fn I2C_ReceiveData + * + * @brief Returns the most recent received data by the I2Cx peripheral. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return The value of the received data. + */ +uint8_t I2C_ReceiveData(I2C_TypeDef *I2Cx) +{ + return (uint8_t)I2Cx->DATAR; +} + +/********************************************************************* + * @fn I2C_Send7bitAddress + * + * @brief Transmits the address byte to select the slave device. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * Address - specifies the slave address which will be transmitted. + * I2C_Direction - specifies whether the I2C device will be a + * Transmitter or a Receiver. + * I2C_Direction_Transmitter - Transmitter mode. + * I2C_Direction_Receiver - Receiver mode. + * + * @return none + */ +void I2C_Send7bitAddress(I2C_TypeDef *I2Cx, uint8_t Address, uint8_t I2C_Direction) +{ + if(I2C_Direction != I2C_Direction_Transmitter) + { + Address |= OADDR1_ADD0_Set; + } + else + { + Address &= OADDR1_ADD0_Reset; + } + + I2Cx->DATAR = Address; +} + +/********************************************************************* + * @fn I2C_ReadRegister + * + * @brief Reads the specified I2C register and returns its value. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_Register - specifies the register to read. + * I2C_Register_CTLR1. + * I2C_Register_CTLR2. + * I2C_Register_OADDR1. + * I2C_Register_OADDR2. + * I2C_Register_DATAR. + * I2C_Register_STAR1. + * I2C_Register_STAR2. + * I2C_Register_CKCFGR. + * I2C_Register_RTR. + * + * @return none + */ +uint16_t I2C_ReadRegister(I2C_TypeDef *I2Cx, uint8_t I2C_Register) +{ + __IO uint32_t tmp = 0; + + tmp = (uint32_t)I2Cx; + tmp += I2C_Register; + + return (*(__IO uint16_t *)tmp); +} + +/********************************************************************* + * @fn I2C_SoftwareResetCmd + * + * @brief Enables or disables the specified I2C software reset. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_SoftwareResetCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_SWRST_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_SWRST_Reset; + } +} + +/********************************************************************* + * @fn I2C_NACKPositionConfig + * + * @brief Selects the specified I2C NACK position in master receiver mode. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_NACKPosition - specifies the NACK position. + * I2C_NACKPosition_Next - indicates that the next byte will be + * the last received byte. + * I2C_NACKPosition_Current - indicates that current byte is the + * last received byte. + * Note- + * This function configures the same bit (POS) as I2C_PECPositionConfig() + * but is intended to be used in I2C mode while I2C_PECPositionConfig() + * is intended to used in SMBUS mode. + * @return none + */ +void I2C_NACKPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_NACKPosition) +{ + if(I2C_NACKPosition == I2C_NACKPosition_Next) + { + I2Cx->CTLR1 |= I2C_NACKPosition_Next; + } + else + { + I2Cx->CTLR1 &= I2C_NACKPosition_Current; + } +} + +/********************************************************************* + * @fn I2C_SMBusAlertConfig + * + * @brief Drives the SMBusAlert pin high or low for the specified I2C. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_SMBusAlert - specifies SMBAlert pin level. + * I2C_SMBusAlert_Low - SMBAlert pin driven low. + * I2C_SMBusAlert_High - SMBAlert pin driven high. + * + * @return none + */ +void I2C_SMBusAlertConfig(I2C_TypeDef *I2Cx, uint16_t I2C_SMBusAlert) +{ + if(I2C_SMBusAlert == I2C_SMBusAlert_Low) + { + I2Cx->CTLR1 |= I2C_SMBusAlert_Low; + } + else + { + I2Cx->CTLR1 &= I2C_SMBusAlert_High; + } +} + +/********************************************************************* + * @fn I2C_TransmitPEC + * + * @brief Enables or disables the specified I2C PEC transfer. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_TransmitPEC(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_PEC_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_PEC_Reset; + } +} + +/********************************************************************* + * @fn I2C_PECPositionConfig + * + * @brief Selects the specified I2C PEC position. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_PECPosition - specifies the PEC position. + * I2C_PECPosition_Next - indicates that the next byte is PEC. + * I2C_PECPosition_Current - indicates that current byte is PEC. + * + * @return none + */ +void I2C_PECPositionConfig(I2C_TypeDef *I2Cx, uint16_t I2C_PECPosition) +{ + if(I2C_PECPosition == I2C_PECPosition_Next) + { + I2Cx->CTLR1 |= I2C_PECPosition_Next; + } + else + { + I2Cx->CTLR1 &= I2C_PECPosition_Current; + } +} + +/********************************************************************* + * @fn I2C_CalculatePEC + * + * @brief Enables or disables the PEC value calculation of the transferred bytes. + * + * @param I2Cx- where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_CalculatePEC(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ENPEC_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ENPEC_Reset; + } +} + +/********************************************************************* + * @fn I2C_GetPEC + * + * @brief Returns the PEC value for the specified I2C. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return The PEC value. + */ +uint8_t I2C_GetPEC(I2C_TypeDef *I2Cx) +{ + return ((I2Cx->STAR2) >> 8); +} + +/********************************************************************* + * @fn I2C_ARPCmd + * + * @brief Enables or disables the specified I2C ARP. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return The PEC value. + */ +void I2C_ARPCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + I2Cx->CTLR1 |= CTLR1_ENARP_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_ENARP_Reset; + } +} + +/********************************************************************* + * @fn I2C_StretchClockCmd + * + * @brief Enables or disables the specified I2C Clock stretching. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2C_StretchClockCmd(I2C_TypeDef *I2Cx, FunctionalState NewState) +{ + if(NewState == DISABLE) + { + I2Cx->CTLR1 |= CTLR1_NOSTRETCH_Set; + } + else + { + I2Cx->CTLR1 &= CTLR1_NOSTRETCH_Reset; + } +} + +/********************************************************************* + * @fn I2C_FastModeDutyCycleConfig + * + * @brief Selects the specified I2C fast mode duty cycle. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_DutyCycle - specifies the fast mode duty cycle. + * I2C_DutyCycle_2 - I2C fast mode Tlow/Thigh = 2. + * I2C_DutyCycle_16_9 - I2C fast mode Tlow/Thigh = 16/9. + * + * @return none + */ +void I2C_FastModeDutyCycleConfig(I2C_TypeDef *I2Cx, uint16_t I2C_DutyCycle) +{ + if(I2C_DutyCycle != I2C_DutyCycle_16_9) + { + I2Cx->CKCFGR &= I2C_DutyCycle_2; + } + else + { + I2Cx->CKCFGR |= I2C_DutyCycle_16_9; + } +} + +/********************************************************************* + * @fn I2C_CheckEvent + * + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * + * @param I2Cx- where x can be 1 or 2 to select the I2C peripheral. + * I2C_EVENT: specifies the event to be checked. + * I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED - EVT1. + * I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED - EVT1. + * I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED - EVT1. + * I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED - EVT1. + * I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED - EVT1. + * I2C_EVENT_SLAVE_BYTE_RECEIVED - EVT2. + * (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) - EVT2. + * (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) - EVT2. + * I2C_EVENT_SLAVE_BYTE_TRANSMITTED - EVT3. + * (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) - EVT3. + * (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) - EVT3. + * I2C_EVENT_SLAVE_ACK_FAILURE - EVT3_2. + * I2C_EVENT_SLAVE_STOP_DETECTED - EVT4. + * I2C_EVENT_MASTER_MODE_SELECT - EVT5. + * I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED - EVT6. + * I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED - EVT6. + * I2C_EVENT_MASTER_BYTE_RECEIVED - EVT7. + * I2C_EVENT_MASTER_BYTE_TRANSMITTING - EVT8. + * I2C_EVENT_MASTER_BYTE_TRANSMITTED - EVT8_2. + * I2C_EVENT_MASTER_MODE_ADDRESS10 - EVT9. + * + * @return ErrorStatus - READY or NoREADY. + */ +ErrorStatus I2C_CheckEvent(I2C_TypeDef *I2Cx, uint32_t I2C_EVENT) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + ErrorStatus status = NoREADY; + + flag1 = I2Cx->STAR1; + flag2 = I2Cx->STAR2; + flag2 = flag2 << 16; + + lastevent = (flag1 | flag2) & FLAG_Mask; + + if((lastevent & I2C_EVENT) == I2C_EVENT) + { + status = READY; + } + else + { + status = NoREADY; + } + + return status; +} + +/********************************************************************* + * @fn I2C_GetLastEvent + * + * @brief Returns the last I2Cx Event. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * + * @return none + */ +uint32_t I2C_GetLastEvent(I2C_TypeDef *I2Cx) +{ + uint32_t lastevent = 0; + uint32_t flag1 = 0, flag2 = 0; + + flag1 = I2Cx->STAR1; + flag2 = I2Cx->STAR2; + flag2 = flag2 << 16; + lastevent = (flag1 | flag2) & FLAG_Mask; + + return lastevent; +} + +/********************************************************************* + * @fn I2C_GetFlagStatus + * + * @brief Checks whether the last I2Cx Event is equal to the one passed + * as parameter. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_FLAG - specifies the flag to check. + * I2C_FLAG_DUALF - Dual flag (Slave mode). + * I2C_FLAG_SMBHOST - SMBus host header (Slave mode). + * I2C_FLAG_SMBDEFAULT - SMBus default header (Slave mode). + * I2C_FLAG_GENCALL - General call header flag (Slave mode). + * I2C_FLAG_TRA - Transmitter/Receiver flag. + * I2C_FLAG_BUSY - Bus busy flag. + * I2C_FLAG_MSL - Master/Slave flag. + * I2C_FLAG_SMBALERT - SMBus Alert flag. + * I2C_FLAG_TIMEOUT - Timeout or Tlow error flag. + * I2C_FLAG_PECERR - PEC error in reception flag. + * I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode). + * I2C_FLAG_AF - Acknowledge failure flag. + * I2C_FLAG_ARLO - Arbitration lost flag (Master mode). + * I2C_FLAG_BERR - Bus error flag. + * I2C_FLAG_TXE - Data register empty flag (Transmitter). + * I2C_FLAG_RXNE- Data register not empty (Receiver) flag. + * I2C_FLAG_STOPF - Stop detection flag (Slave mode). + * I2C_FLAG_ADD10 - 10-bit header sent flag (Master mode). + * I2C_FLAG_BTF - Byte transfer finished flag. + * I2C_FLAG_ADDR - Address sent flag (Master mode) "ADSL" + * Address matched flag (Slave mode)"ENDA". + * I2C_FLAG_SB - Start bit flag (Master mode). + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus I2C_GetFlagStatus(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG) +{ + FlagStatus bitstatus = RESET; + __IO uint32_t i2creg = 0, i2cxbase = 0; + + i2cxbase = (uint32_t)I2Cx; + i2creg = I2C_FLAG >> 28; + I2C_FLAG &= FLAG_Mask; + + if(i2creg != 0) + { + i2cxbase += 0x14; + } + else + { + I2C_FLAG = (uint32_t)(I2C_FLAG >> 16); + i2cxbase += 0x18; + } + + if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn I2C_ClearFlag + * + * @brief Clears the I2Cx's pending flags. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_FLAG - specifies the flag to clear. + * I2C_FLAG_SMBALERT - SMBus Alert flag. + * I2C_FLAG_TIMEOUT - Timeout or Tlow error flag. + * I2C_FLAG_PECERR - PEC error in reception flag. + * I2C_FLAG_OVR - Overrun/Underrun flag (Slave mode). + * I2C_FLAG_AF - Acknowledge failure flag. + * I2C_FLAG_ARLO - Arbitration lost flag (Master mode). + * I2C_FLAG_BERR - Bus error flag. + * Note- + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_STAR1 register (I2C_GetFlagStatus()) followed by a write operation + * to I2C_CTLR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_SATR1 (I2C_GetFlagStatus()) followed by writing the + * second byte of the address in DATAR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_SATR1 register (I2C_GetFlagStatus()) followed by a + * read/write to I2C_DATAR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_SATR1 register (I2C_GetFlagStatus()) followed by a read operation to + * I2C_SATR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared software sequence: a read operation to I2C_STAR1 + * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DATAR + * register (I2C_SendData()). + * @return none + */ +void I2C_ClearFlag(I2C_TypeDef *I2Cx, uint32_t I2C_FLAG) +{ + uint32_t flagpos = 0; + + flagpos = I2C_FLAG & FLAG_Mask; + I2Cx->STAR1 = (uint16_t)~flagpos; +} + +/********************************************************************* + * @fn I2C_GetITStatus + * + * @brief Checks whether the specified I2C interrupt has occurred or not. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * II2C_IT - specifies the interrupt source to check. + * I2C_IT_SMBALERT - SMBus Alert flag. + * I2C_IT_TIMEOUT - Timeout or Tlow error flag. + * I2C_IT_PECERR - PEC error in reception flag. + * I2C_IT_OVR - Overrun/Underrun flag (Slave mode). + * I2C_IT_AF - Acknowledge failure flag. + * I2C_IT_ARLO - Arbitration lost flag (Master mode). + * I2C_IT_BERR - Bus error flag. + * I2C_IT_TXE - Data register empty flag (Transmitter). + * I2C_IT_RXNE - Data register not empty (Receiver) flag. + * I2C_IT_STOPF - Stop detection flag (Slave mode). + * I2C_IT_ADD10 - 10-bit header sent flag (Master mode). + * I2C_IT_BTF - Byte transfer finished flag. + * I2C_IT_ADDR - Address sent flag (Master mode) "ADSL" Address matched + * flag (Slave mode)"ENDAD". + * I2C_IT_SB - Start bit flag (Master mode). + * + * @return none + */ +ITStatus I2C_GetITStatus(I2C_TypeDef *I2Cx, uint32_t I2C_IT) +{ + ITStatus bitstatus = RESET; + uint32_t enablestatus = 0; + + enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CTLR2)); + I2C_IT &= FLAG_Mask; + + if(((I2Cx->STAR1 & I2C_IT) != (uint32_t)RESET) && enablestatus) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn I2C_ClearITPendingBit + * + * @brief Clears the I2Cx interrupt pending bits. + * + * @param I2Cx - where x can be 1 or 2 to select the I2C peripheral. + * I2C_IT - specifies the interrupt pending bit to clear. + * I2C_IT_SMBALERT - SMBus Alert interrupt. + * I2C_IT_TIMEOUT - Timeout or Tlow error interrupt. + * I2C_IT_PECERR - PEC error in reception interrupt. + * I2C_IT_OVR - Overrun/Underrun interrupt (Slave mode). + * I2C_IT_AF - Acknowledge failure interrupt. + * I2C_IT_ARLO - Arbitration lost interrupt (Master mode). + * I2C_IT_BERR - Bus error interrupt. + * Note- + * - STOPF (STOP detection) is cleared by software sequence: a read operation + * to I2C_STAR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_CTLR1 register (I2C_Cmd() to re-enable the I2C peripheral). + * - ADD10 (10-bit header sent) is cleared by software sequence: a read + * operation to I2C_STAR1 (I2C_GetITStatus()) followed by writing the second + * byte of the address in I2C_DATAR register. + * - BTF (Byte Transfer Finished) is cleared by software sequence: a read + * operation to I2C_STAR1 register (I2C_GetITStatus()) followed by a + * read/write to I2C_DATAR register (I2C_SendData()). + * - ADDR (Address sent) is cleared by software sequence: a read operation to + * I2C_STAR1 register (I2C_GetITStatus()) followed by a read operation to + * I2C_STAR2 register ((void)(I2Cx->SR2)). + * - SB (Start Bit) is cleared by software sequence: a read operation to + * I2C_STAR1 register (I2C_GetITStatus()) followed by a write operation to + * I2C_DATAR register (I2C_SendData()). + * + * @return none + */ +void I2C_ClearITPendingBit(I2C_TypeDef *I2Cx, uint32_t I2C_IT) +{ + uint32_t flagpos = 0; + + flagpos = I2C_IT & FLAG_Mask; + I2Cx->STAR1 = (uint16_t)~flagpos; +} diff --git a/Peripheral/src/ch32v30x_iwdg.c b/Peripheral/src/ch32v30x_iwdg.c new file mode 100644 index 0000000..5877d8d --- /dev/null +++ b/Peripheral/src/ch32v30x_iwdg.c @@ -0,0 +1,123 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_iwdg.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file provides all the IWDG firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_iwdg.h" + +/* CTLR register bit mask */ +#define CTLR_KEY_Reload ((uint16_t)0xAAAA) +#define CTLR_KEY_Enable ((uint16_t)0xCCCC) + +/********************************************************************* + * @fn IWDG_WriteAccessCmd + * + * @brief Enables or disables write access to IWDG_PSCR and IWDG_RLDR registers. + * + * @param WDG_WriteAccess - new state of write access to IWDG_PSCR and + * IWDG_RLDR registers. + * IWDG_WriteAccess_Enable - Enable write access to IWDG_PSCR and + * IWDG_RLDR registers. + * IWDG_WriteAccess_Disable - Disable write access to IWDG_PSCR + * and IWDG_RLDR registers. + * + * @return none + */ +void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) +{ + IWDG->CTLR = IWDG_WriteAccess; +} + +/********************************************************************* + * @fn IWDG_SetPrescaler + * + * @brief Sets IWDG Prescaler value. + * + * @param IWDG_Prescaler - specifies the IWDG Prescaler value. + * IWDG_Prescaler_4 - IWDG prescaler set to 4. + * IWDG_Prescaler_8 - IWDG prescaler set to 8. + * IWDG_Prescaler_16 - IWDG prescaler set to 16. + * IWDG_Prescaler_32 - IWDG prescaler set to 32. + * IWDG_Prescaler_64 - IWDG prescaler set to 64. + * IWDG_Prescaler_128 - IWDG prescaler set to 128. + * IWDG_Prescaler_256 - IWDG prescaler set to 256. + * + * @return none + */ +void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) +{ + IWDG->PSCR = IWDG_Prescaler; +} + +/********************************************************************* + * @fn IWDG_SetReload + * + * @brief Sets IWDG Reload value. + * + * @param Reload - specifies the IWDG Reload value. + * This parameter must be a number between 0 and 0x0FFF. + * + * @return none + */ +void IWDG_SetReload(uint16_t Reload) +{ + IWDG->RLDR = Reload; +} + +/********************************************************************* + * @fn IWDG_ReloadCounter + * + * @brief Reloads IWDG counter with value defined in the reload register. + * + * @return none + */ +void IWDG_ReloadCounter(void) +{ + IWDG->CTLR = CTLR_KEY_Reload; +} + +/********************************************************************* + * @fn IWDG_Enable + * + * @brief Enables IWDG (write access to IWDG_PSCR and IWDG_RLDR registers disabled). + * + * @return none + */ +void IWDG_Enable(void) +{ + IWDG->CTLR = CTLR_KEY_Enable; + while((RCC->RSTSCKR & 0x2)==RESET); +} + +/********************************************************************* + * @fn IWDG_GetFlagStatus + * + * @brief Checks whether the specified IWDG flag is set or not. + * + * @param IWDG_FLAG - specifies the flag to check. + * IWDG_FLAG_PVU - Prescaler Value Update on going. + * IWDG_FLAG_RVU - Reload Value Update on going. + * + * @return none + */ +FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((IWDG->STATR & IWDG_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} diff --git a/Peripheral/src/ch32v30x_misc.c b/Peripheral/src/ch32v30x_misc.c new file mode 100644 index 0000000..f8c7cfd --- /dev/null +++ b/Peripheral/src/ch32v30x_misc.c @@ -0,0 +1,105 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_misc.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : This file provides all the miscellaneous firmware functions . +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_misc.h" + +__IO uint32_t NVIC_Priority_Group = 0; + +/********************************************************************* + * @fn NVIC_PriorityGroupConfig + * + * @brief Configures the priority grouping - pre-emption priority and subpriority. + * + * @param NVIC_PriorityGroup - specifies the priority grouping bits length. + * NVIC_PriorityGroup_0 - 0 bits for pre-emption priority + * 3 bits for subpriority + * NVIC_PriorityGroup_1 - 1 bits for pre-emption priority + * 2 bits for subpriority + * NVIC_PriorityGroup_2 - 2 bits for pre-emption priority + * 1 bits for subpriority + * NVIC_PriorityGroup_3 - 3 bits for pre-emption priority + * 0 bits for subpriority + * + * @return none + */ +void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) +{ + NVIC_Priority_Group = NVIC_PriorityGroup; +} + +/********************************************************************* + * @fn NVIC_Init + * + * @brief Initializes the NVIC peripheral according to the specified parameters in + * the NVIC_InitStruct. + * + * @param NVIC_InitStruct - pointer to a NVIC_InitTypeDef structure that contains the + * configuration information for the specified NVIC peripheral. + * interrupt nesting disable(CSR-0x804 bit1 = 0) + * NVIC_IRQChannelPreemptionPriority - range is 0. + * NVIC_IRQChannelSubPriority - range from 0 to 7. + * + * interrupt nesting enable-2 Level(CSR-0x804 bit1 = 1 bit[3:2] = 1) + * NVIC_IRQChannelPreemptionPriority - range from 0 to 1. + * NVIC_IRQChannelSubPriority - range from 0 to 3. + * + * interrupt nesting enable-4 Level(CSR-0x804 bit1 = 1 bit[3:2] = 2) + * NVIC_IRQChannelPreemptionPriority - range from 0 to 3. + * NVIC_IRQChannelSubPriority - range from 0 to 1. + * + * interrupt nesting enable-8 Level(CSR-0x804 bit1 = 1 bit[3:2] = 3) + * NVIC_IRQChannelPreemptionPriority - range from 0 to 7. + * NVIC_IRQChannelSubPriority - range range is 0. + * + * @return none + */ +void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct) +{ +#if (INTSYSCR_INEST == INTSYSCR_INEST_NoEN) + if(NVIC_Priority_Group == NVIC_PriorityGroup_0) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, NVIC_InitStruct->NVIC_IRQChannelSubPriority << 4); + } +#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_2Level) + if(NVIC_Priority_Group == NVIC_PriorityGroup_1) + { + if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority < 2) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 7) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 5)); + } + } +#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_4Level) + if(NVIC_Priority_Group == NVIC_PriorityGroup_2) + { + if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority < 4) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 6) | (NVIC_InitStruct->NVIC_IRQChannelSubPriority << 5)); + } + } +#elif (INTSYSCR_INEST == INTSYSCR_INEST_EN_8Level) + if(NVIC_Priority_Group == NVIC_PriorityGroup_3) + { + if(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority < 8) + { + NVIC_SetPriority(NVIC_InitStruct->NVIC_IRQChannel, (NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << 5) ); + } + } +#endif + + if(NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) + { + NVIC_EnableIRQ(NVIC_InitStruct->NVIC_IRQChannel); + } + else + { + NVIC_DisableIRQ(NVIC_InitStruct->NVIC_IRQChannel); + } +} diff --git a/Peripheral/src/ch32v30x_opa.c b/Peripheral/src/ch32v30x_opa.c new file mode 100644 index 0000000..ed84c00 --- /dev/null +++ b/Peripheral/src/ch32v30x_opa.c @@ -0,0 +1,86 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_opa.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the OPA firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_opa.h" + +#define OPA_MASK ((uint32_t)0x000F) +#define OPA_Total_NUM 4 + +/********************************************************************* + * @fn OPA_DeInit + * + * @brief Deinitializes the OPA peripheral registers to their default + * reset values. + * + * @return none + */ +void OPA_DeInit(void) +{ + OPA->CR = 0; +} + +/********************************************************************* + * @fn OPA_Init + * + * @brief Initializes the OPA peripheral according to the specified + * parameters in the OPA_InitStruct. + * + * @param OPA_InitStruct - pointer to a OPA_InitTypeDef structure + * + * @return none + */ +void OPA_Init(OPA_InitTypeDef *OPA_InitStruct) +{ + uint32_t tmp = 0; + tmp = OPA->CR; + tmp &= ~(OPA_MASK << (OPA_InitStruct->OPA_NUM * OPA_Total_NUM)); + tmp |= (((OPA_InitStruct->PSEL << OPA_PSEL_OFFSET) | (OPA_InitStruct->NSEL << OPA_NSEL_OFFSET) | (OPA_InitStruct->Mode << OPA_MODE_OFFSET)) << (OPA_InitStruct->OPA_NUM * OPA_Total_NUM)); + OPA->CR = tmp; +} + +/********************************************************************* + * @fn OPA_StructInit + * + * @brief Fills each OPA_StructInit member with its reset value. + * + * @param OPA_StructInit - pointer to a OPA_InitTypeDef structure + * + * @return none + */ +void OPA_StructInit(OPA_InitTypeDef *OPA_InitStruct) +{ + OPA_InitStruct->Mode = OUT_IO_OUT1; + OPA_InitStruct->PSEL = CHP0; + OPA_InitStruct->NSEL = CHN0; + OPA_InitStruct->OPA_NUM = OPA1; +} + +/********************************************************************* + * @fn OPA_Cmd + * + * @brief Enables or disables the specified OPA peripheral. + * + * @param OPA_NUM - Select OPA + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void OPA_Cmd(OPA_Num_TypeDef OPA_NUM, FunctionalState NewState) +{ + if(NewState == ENABLE) + { + OPA->CR |= (1 << (OPA_NUM * OPA_Total_NUM)); + } + else + { + OPA->CR &= ~(1 << (OPA_NUM * OPA_Total_NUM)); + } +} diff --git a/Peripheral/src/ch32v30x_pwr.c b/Peripheral/src/ch32v30x_pwr.c new file mode 100644 index 0000000..28351c0 --- /dev/null +++ b/Peripheral/src/ch32v30x_pwr.c @@ -0,0 +1,361 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_pwr.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the PWR firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_pwr.h" +#include "ch32v30x_rcc.h" + +/* PWR registers bit mask */ +/* CTLR register bit mask */ +#define CTLR_DS_MASK ((uint32_t)0xFFFFFFFC) +#define CTLR_PLS_MASK ((uint32_t)0xFFFFFF1F) + +/********************************************************************* + * @fn PWR_DeInit + * + * @brief Deinitializes the PWR peripheral registers to their default + * reset values. + * + * @return none + */ +void PWR_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE); +} + +/********************************************************************* + * @fn PWR_BackupAccessCmd + * + * @brief Enables or disables access to the RTC and backup registers. + * + * @param NewState - new state of the access to the RTC and backup registers, + * This parameter can be: ENABLE or DISABLE. + * + * @return none + */ +void PWR_BackupAccessCmd(FunctionalState NewState) +{ + if(NewState) + { + PWR->CTLR |= (1 << 8); + } + else + { + PWR->CTLR &= ~(1 << 8); + } +} + +/********************************************************************* + * @fn PWR_PVDCmd + * + * @brief Enables or disables the Power Voltage Detector(PVD). + * + * @param NewState - new state of the PVD(ENABLE or DISABLE). + * + * @return none + */ +void PWR_PVDCmd(FunctionalState NewState) +{ + if(NewState) + { + PWR->CTLR |= (1 << 4); + } + else + { + PWR->CTLR &= ~(1 << 4); + } +} + +/********************************************************************* + * @fn PWR_PVDLevelConfig + * + * @brief Configures the voltage threshold detected by the Power Voltage + * Detector(PVD). + * + * @param PWR_PVDLevel - specifies the PVD detection level + * PWR_PVDLevel_MODE0 - PVD detection level set to mode 0. + * PWR_PVDLevel_MODE1 - PVD detection level set to mode 1. + * PWR_PVDLevel_MODE2 - PVD detection level set to mode 2. + * PWR_PVDLevel_MODE3 - PVD detection level set to mode 3. + * PWR_PVDLevel_MODE4 - PVD detection level set to mode 4. + * PWR_PVDLevel_MODE5 - PVD detection level set to mode 5. + * PWR_PVDLevel_MODE6 - PVD detection level set to mode 6. + * PWR_PVDLevel_MODE7 - PVD detection level set to mode 7. + * + * @return none + */ +void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + tmpreg &= CTLR_PLS_MASK; + tmpreg |= PWR_PVDLevel; + PWR->CTLR = tmpreg; +} + +/********************************************************************* + * @fn PWR_WakeUpPinCmd + * + * @brief Enables or disables the WakeUp Pin functionality. + * + * @param NewState - new state of the WakeUp Pin functionality + * (ENABLE or DISABLE). + * + * @return none + */ +void PWR_WakeUpPinCmd(FunctionalState NewState) +{ + if(NewState) + { + PWR->CSR |= (1 << 8); + } + else + { + PWR->CSR &= ~(1 << 8); + } +} + +/********************************************************************* + * @fn PWR_EnterSTOPMode + * + * @brief Enters STOP mode. + * + * @param PWR_Regulator - specifies the regulator state in STOP mode. + * PWR_Regulator_ON - STOP mode with regulator ON + * PWR_Regulator_LowPower - STOP mode with regulator in low power mode + * PWR_STOPEntry - specifies if STOP mode in entered with WFI or WFE instruction. + * PWR_STOPEntry_WFI - enter STOP mode with WFI instruction + * PWR_STOPEntry_WFE - enter STOP mode with WFE instruction + * + * @return none + */ +void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + tmpreg &= CTLR_DS_MASK; + tmpreg |= PWR_Regulator; + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + __WFI(); + } + else + { + __WFE(); + } + + NVIC->SCTLR &= ~(1 << 2); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode + * + * @brief Enters STANDBY mode. + * + * @return none + */ +void PWR_EnterSTANDBYMode(void) +{ + PWR->CTLR |= PWR_CTLR_CWUF; + PWR->CTLR |= PWR_CTLR_PDDS; + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_GetFlagStatus + * + * @brief Checks whether the specified PWR flag is set or not. + * + * @param PWR_FLAG - specifies the flag to check. + * PWR_FLAG_WU - Wake Up flag + * PWR_FLAG_SB - StandBy flag + * PWR_FLAG_PVDO - PVD Output + * + * @return The new state of PWR_FLAG (SET or RESET). + */ +FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((PWR->CSR & PWR_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn PWR_ClearFlag + * + * @brief Clears the PWR's pending flags. + * + * @param PWR_FLAG - specifies the flag to clear. + * PWR_FLAG_WU - Wake Up flag + * PWR_FLAG_SB - StandBy flag + * + * @return none + */ +void PWR_ClearFlag(uint32_t PWR_FLAG) +{ + PWR->CTLR |= PWR_FLAG << 2; +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM + * + * @brief Enters STANDBY mode with RAM data retention function on. + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + + //2K+30K in standby w power. + tmpreg |= (0x1 << 16) | (0x1 << 17); + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM_LV + * + * @brief Enters STANDBY mode with RAM data retention function and LV mode on. + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM_LV(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + + //2K+30K in standby power. + tmpreg |= (0x1 << 16) | (0x1 << 17); + //2K+30K in standby LV . + tmpreg |= (0x1 << 20); + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM_VBAT_EN + * + * @brief Enters STANDBY mode with RAM data retention function on (VBAT Enable). + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM_VBAT_EN(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + + //2K+30K in standby power (VBAT Enable). + tmpreg |= (0x1 << 18) | (0x1 << 19); + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + +/********************************************************************* + * @fn PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN + * + * @brief Enters STANDBY mode with RAM data retention function and LV mode on(VBAT Enable). + * + * @return none + */ +void PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN(void) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + + tmpreg |= PWR_CTLR_CWUF; + tmpreg |= PWR_CTLR_PDDS; + + //2K+30K in standby power (VBAT Enable). + tmpreg |= (0x1 << 18) | (0x1 << 19); + //2K+30K in standby LV . + tmpreg |= (0x1 << 20); + + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + __WFI(); +} + + +/********************************************************************* + * @fn PWR_EnterSTOPMode_RAM_LV + * + * @brief Enters STOP mode with RAM data retention function and LV mode on. + * + * @param PWR_Regulator - specifies the regulator state in STOP mode. + * PWR_Regulator_LowPower - STOP mode with regulator in low power mode + * PWR_STOPEntry - specifies if STOP mode in entered with WFI or WFE instruction. + * PWR_STOPEntry_WFI - enter STOP mode with WFI instruction + * PWR_STOPEntry_WFE - enter STOP mode with WFE instruction + * + * @return none + */ +void PWR_EnterSTOPMode_RAM_LV(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry) +{ + uint32_t tmpreg = 0; + tmpreg = PWR->CTLR; + tmpreg &= CTLR_DS_MASK; + tmpreg |= PWR_Regulator; + + tmpreg |= (0x1 << 20); + PWR->CTLR = tmpreg; + + NVIC->SCTLR |= (1 << 2); + + if(PWR_STOPEntry == PWR_STOPEntry_WFI) + { + __WFI(); + } + else + { + __WFE(); + } + + NVIC->SCTLR &= ~(1 << 2); +} diff --git a/Peripheral/src/ch32v30x_rcc.c b/Peripheral/src/ch32v30x_rcc.c new file mode 100644 index 0000000..2062e47 --- /dev/null +++ b/Peripheral/src/ch32v30x_rcc.c @@ -0,0 +1,1477 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_rcc.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/05/28 +* Description : This file provides all the RCC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_rcc.h" + +/* RCC registers bit address in the alias region */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) + +/* BDCTLR Register */ +#define BDCTLR_OFFSET (RCC_OFFSET + 0x20) + +/* RCC registers bit mask */ + +/* CTLR register bit mask */ +#define CTLR_HSEBYP_Reset ((uint32_t)0xFFFBFFFF) +#define CTLR_HSEBYP_Set ((uint32_t)0x00040000) +#define CTLR_HSEON_Reset ((uint32_t)0xFFFEFFFF) +#define CTLR_HSEON_Set ((uint32_t)0x00010000) +#define CTLR_HSITRIM_Mask ((uint32_t)0xFFFFFF07) + +#define CFGR0_PLL_Mask ((uint32_t)0xFFC0FFFF) +#define CFGR0_PLL_Mask_1 ((uint32_t)0xFFC2FFFF) + +#define CFGR0_PLLMull_Mask ((uint32_t)0x003C0000) +#define CFGR0_PLLSRC_Mask ((uint32_t)0x00010000) +#define CFGR0_PLLXTPRE_Mask ((uint32_t)0x00020000) +#define CFGR0_SWS_Mask ((uint32_t)0x0000000C) +#define CFGR0_SW_Mask ((uint32_t)0xFFFFFFFC) +#define CFGR0_HPRE_Reset_Mask ((uint32_t)0xFFFFFF0F) +#define CFGR0_HPRE_Set_Mask ((uint32_t)0x000000F0) +#define CFGR0_PPRE1_Reset_Mask ((uint32_t)0xFFFFF8FF) +#define CFGR0_PPRE1_Set_Mask ((uint32_t)0x00000700) +#define CFGR0_PPRE2_Reset_Mask ((uint32_t)0xFFFFC7FF) +#define CFGR0_PPRE2_Set_Mask ((uint32_t)0x00003800) +#define CFGR0_ADCPRE_Reset_Mask ((uint32_t)0xFFFF3FFF) +#define CFGR0_ADCPRE_Set_Mask ((uint32_t)0x0000C000) + +/* RSTSCKR register bit mask */ +#define RSTSCKR_RMVF_Set ((uint32_t)0x01000000) + +/* CFGR2 register bit mask */ +#define CFGR2_PREDIV1SRC ((uint32_t)0x00010000) +#define CFGR2_PREDIV1 ((uint32_t)0x0000000F) +#define CFGR2_PREDIV2 ((uint32_t)0x000000F0) +#define CFGR2_PLL2MUL ((uint32_t)0x00000F00) +#define CFGR2_PLL3MUL ((uint32_t)0x0000F000) + +/* RCC Flag Mask */ +#define FLAG_Mask ((uint8_t)0x1F) + +/* INTR register byte 2 (Bits[15:8]) base address */ +#define INTR_BYTE2_ADDRESS ((uint32_t)0x40021009) + +/* INTR register byte 3 (Bits[23:16]) base address */ +#define INTR_BYTE3_ADDRESS ((uint32_t)0x4002100A) + +/* CFGR0 register byte 4 (Bits[31:24]) base address */ +#define CFGR0_BYTE4_ADDRESS ((uint32_t)0x40021007) + +/* BDCTLR register base address */ +#define BDCTLR_ADDRESS (PERIPH_BASE + BDCTLR_OFFSET) + +static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9}; +static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8}; + +/********************************************************************* + * @fn RCC_DeInit + * + * @brief Resets the RCC clock configuration to the default reset state. + * Note- + * HSE can not be stopped if it is used directly or through the PLL as system clock. + * @return none + */ +void RCC_DeInit(void) +{ + RCC->CTLR |= (uint32_t)0x00000001; + +#ifdef CH32V30x_D8C + RCC->CFGR0 &= (uint32_t)0xF8FF0000; +#else + RCC->CFGR0 &= (uint32_t)0xF0FF0000; +#endif + + RCC->CTLR &= (uint32_t)0xFEF6FFFF; + RCC->CTLR &= (uint32_t)0xFFFBFFFF; + RCC->CFGR0 &= (uint32_t)0xFF80FFFF; + +#ifdef CH32V30x_D8C + RCC->CTLR &= (uint32_t)0xEBFFFFFF; + RCC->INTR = 0x00FF0000; + RCC->CFGR2 = 0x00000000; +#else + RCC->INTR = 0x009F0000; +#endif +} + +/********************************************************************* + * @fn RCC_HSEConfig + * + * @brief Configures the External High Speed oscillator (HSE). + * + * @param RCC_HSE - + * RCC_HSE_OFF - HSE oscillator OFF. + * RCC_HSE_ON - HSE oscillator ON. + * RCC_HSE_Bypass - HSE oscillator bypassed with external clock. + * Note- + * HSE can not be stopped if it is used directly or through the PLL as system clock. + * @return none + */ +void RCC_HSEConfig(uint32_t RCC_HSE) +{ + RCC->CTLR &= CTLR_HSEON_Reset; + RCC->CTLR &= CTLR_HSEBYP_Reset; + + switch(RCC_HSE) + { + case RCC_HSE_ON: + RCC->CTLR |= CTLR_HSEON_Set; + break; + + case RCC_HSE_Bypass: + RCC->CTLR |= CTLR_HSEBYP_Set | CTLR_HSEON_Set; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn RCC_WaitForHSEStartUp + * + * @brief Waits for HSE start-up. + * + * @return READY - HSE oscillator is stable and ready to use. + * NoREADY - HSE oscillator not yet ready. + */ +ErrorStatus RCC_WaitForHSEStartUp(void) +{ + __IO uint32_t StartUpCounter = 0; + + ErrorStatus status = NoREADY; + FlagStatus HSEStatus = RESET; + + do + { + HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY); + StartUpCounter++; + } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET)); + + if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET) + { + status = READY; + } + else + { + status = NoREADY; + } + + return (status); +} + +/********************************************************************* + * @fn RCC_AdjustHSICalibrationValue + * + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * + * @param HSICalibrationValue - specifies the calibration trimming value. + * This parameter must be a number between 0 and 0x1F. + * + * @return none + */ +void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CTLR; + tmpreg &= CTLR_HSITRIM_Mask; + tmpreg |= (uint32_t)HSICalibrationValue << 3; + RCC->CTLR = tmpreg; +} + +/********************************************************************* + * @fn RCC_HSICmd + * + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_HSICmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1 << 0); + } + else + { + RCC->CTLR &= ~(1 << 0); + } +} + +/********************************************************************* + * @fn RCC_PLLConfig + * + * @brief Configures the PLL clock source and multiplication factor. + * + * @param RCC_PLLSource - specifies the PLL entry clock source. + * RCC_PLLSource_HSI_Div2 - HSI oscillator clock divided by 2 + * selected as PLL clock entry. + * RCC_PLLSource_PREDIV1 - PREDIV1 clock selected as PLL clock + * entry. + * RCC_PLLMul - specifies the PLL multiplication factor. + * This parameter can be RCC_PLLMul_x where x:[2,16]. + * For CH32V307 - + * RCC_PLLMul_18_EXTEN + * RCC_PLLMul_3_EXTEN + * RCC_PLLMul_4_EXTEN + * RCC_PLLMul_5_EXTEN + * RCC_PLLMul_6_EXTEN + * RCC_PLLMul_7_EXTEN + * RCC_PLLMul_8_EXTEN + * RCC_PLLMul_9_EXTEN + * RCC_PLLMul_10_EXTEN + * RCC_PLLMul_11_EXTEN + * RCC_PLLMul_12_EXTEN + * RCC_PLLMul_13_EXTEN + * RCC_PLLMul_14_EXTEN + * RCC_PLLMul_6_5_EXTEN + * RCC_PLLMul_15_EXTEN + * RCC_PLLMul_16_EXTEN + * For other CH32V30x - + * RCC_PLLMul_2 + * RCC_PLLMul_3 + * RCC_PLLMul_4 + * RCC_PLLMul_5 + * RCC_PLLMul_6 + * RCC_PLLMul_7 + * RCC_PLLMul_8 + * RCC_PLLMul_9 + * RCC_PLLMul_10 + * RCC_PLLMul_11 + * RCC_PLLMul_12 + * RCC_PLLMul_13 + * RCC_PLLMul_14 + * RCC_PLLMul_15 + * RCC_PLLMul_16 + * RCC_PLLMul_18 + * + * @return none + */ +void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + + if(((*(uint32_t *)0x1FFFF70C) & (1 << 14)) != (1 << 14)) + { /* for other CH32V30x */ + tmpreg &= CFGR0_PLL_Mask; + } + else + { /* for CH32V307 */ + tmpreg &= CFGR0_PLL_Mask_1; + } + + tmpreg |= RCC_PLLSource | RCC_PLLMul; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PLLCmd + * + * @brief Enables or disables the PLL. + * Note-The PLL can not be disabled if it is used as system clock. + * + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_PLLCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1 << 24); + } + else + { + RCC->CTLR &= ~(1 << 24); + } +} + +/********************************************************************* + * @fn RCC_SYSCLKConfig + * + * @brief Configures the system clock (SYSCLK). + * + * @param RCC_SYSCLKSource - specifies the clock source used as system clock. + * RCC_SYSCLKSource_HSI - HSI selected as system clock. + * RCC_SYSCLKSource_HSE - HSE selected as system clock. + * RCC_SYSCLKSource_PLLCLK - PLL selected as system clock. + * + * @return none + */ +void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_SW_Mask; + tmpreg |= RCC_SYSCLKSource; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_GetSYSCLKSource + * + * @brief Returns the clock source used as system clock. + * + * @return 0x00 - HSI used as system clock. + * 0x04 - HSE used as system clock. + * 0x08 - PLL used as system clock. + */ +uint8_t RCC_GetSYSCLKSource(void) +{ + return ((uint8_t)(RCC->CFGR0 & CFGR0_SWS_Mask)); +} + +/********************************************************************* + * @fn RCC_HCLKConfig + * + * @brief Configures the AHB clock (HCLK). + * + * @param RCC_SYSCLK - defines the AHB clock divider. This clock is derived from + * the system clock (SYSCLK). + * RCC_SYSCLK_Div1 - AHB clock = SYSCLK. + * RCC_SYSCLK_Div2 - AHB clock = SYSCLK/2. + * RCC_SYSCLK_Div4 - AHB clock = SYSCLK/4. + * RCC_SYSCLK_Div8 - AHB clock = SYSCLK/8. + * RCC_SYSCLK_Div16 - AHB clock = SYSCLK/16. + * RCC_SYSCLK_Div64 - AHB clock = SYSCLK/64. + * RCC_SYSCLK_Div128 - AHB clock = SYSCLK/128. + * RCC_SYSCLK_Div256 - AHB clock = SYSCLK/256. + * RCC_SYSCLK_Div512 - AHB clock = SYSCLK/512. + * + * @return none + */ +void RCC_HCLKConfig(uint32_t RCC_SYSCLK) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_HPRE_Reset_Mask; + tmpreg |= RCC_SYSCLK; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PCLK1Config + * + * @brief Configures the Low Speed APB clock (PCLK1). + * + * @param RCC_HCLK - defines the APB1 clock divider. This clock is derived from + * the AHB clock (HCLK). + * RCC_HCLK_Div1 - APB1 clock = HCLK. + * RCC_HCLK_Div2 - APB1 clock = HCLK/2. + * RCC_HCLK_Div4 - APB1 clock = HCLK/4. + * RCC_HCLK_Div8 - APB1 clock = HCLK/8. + * RCC_HCLK_Div16 - APB1 clock = HCLK/16. + * + * @return none + */ +void RCC_PCLK1Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_PPRE1_Reset_Mask; + tmpreg |= RCC_HCLK; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PCLK2Config + * + * @brief Configures the High Speed APB clock (PCLK2). + * + * @param RCC_HCLK - defines the APB2 clock divider. This clock is derived from + * the AHB clock (HCLK). + * RCC_HCLK_Div1 - APB2 clock = HCLK. + * RCC_HCLK_Div2 - APB2 clock = HCLK/2. + * RCC_HCLK_Div4 - APB2 clock = HCLK/4. + * RCC_HCLK_Div8 - APB2 clock = HCLK/8. + * RCC_HCLK_Div16 - APB2 clock = HCLK/16. + * + * @return none + */ +void RCC_PCLK2Config(uint32_t RCC_HCLK) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_PPRE2_Reset_Mask; + tmpreg |= RCC_HCLK << 3; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_ITConfig + * + * @brief Enables or disables the specified RCC interrupts. + * + * @param RCC_IT - specifies the RCC interrupt sources to be enabled or disabled. + * RCC_IT_LSIRDY - LSI ready interrupt. + * RCC_IT_LSERDY - LSE ready interrupt. + * RCC_IT_HSIRDY - HSI ready interrupt. + * RCC_IT_HSERDY - HSE ready interrupt. + * RCC_IT_PLLRDY - PLL ready interrupt. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + *(__IO uint8_t *)INTR_BYTE2_ADDRESS |= RCC_IT; + } + else + { + *(__IO uint8_t *)INTR_BYTE2_ADDRESS &= (uint8_t)~RCC_IT; + } +} + +/********************************************************************* + * @fn RCC_ADCCLKConfig + * + * @brief Configures the ADC clock (ADCCLK). + * + * @param RCC_PCLK2 - defines the ADC clock divider. This clock is derived from + * the APB2 clock (PCLK2). + * RCC_PCLK2_Div2 - ADC clock = PCLK2/2. + * RCC_PCLK2_Div4 - ADC clock = PCLK2/4. + * RCC_PCLK2_Div6 - ADC clock = PCLK2/6. + * RCC_PCLK2_Div8 - ADC clock = PCLK2/8. + * + * @return none + */ +void RCC_ADCCLKConfig(uint32_t RCC_PCLK2) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR0; + tmpreg &= CFGR0_ADCPRE_Reset_Mask; + tmpreg |= RCC_PCLK2; + RCC->CFGR0 = tmpreg; +} + +/********************************************************************* + * @fn RCC_LSEConfig + * + * @brief Configures the External Low Speed oscillator (LSE). + * + * @param RCC_LSE - specifies the new state of the LSE. + * RCC_LSE_OFF - LSE oscillator OFF. + * RCC_LSE_ON - LSE oscillator ON. + * RCC_LSE_Bypass - LSE oscillator bypassed with external clock. + * + * @return none + */ +void RCC_LSEConfig(uint8_t RCC_LSE) +{ + *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_OFF; + *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_OFF; + + switch(RCC_LSE) + { + case RCC_LSE_ON: + *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_ON; + break; + + case RCC_LSE_Bypass: + *(__IO uint8_t *)BDCTLR_ADDRESS = RCC_LSE_Bypass | RCC_LSE_ON; + break; + + default: + break; + } +} + +/********************************************************************* + * @fn RCC_LSICmd + * + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * Note- + * LSI can not be disabled if the IWDG is running. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_LSICmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->RSTSCKR |= (1 << 0); + } + else + { + RCC->RSTSCKR &= ~(1 << 0); + } +} + +/********************************************************************* + * @fn RCC_RTCCLKConfig + * + * @brief Once the RTC clock is selected it can't be changed unless the Backup domain is reset. + * + * @param RCC_RTCCLKSource - specifies the RTC clock source. + * RCC_RTCCLKSource_LSE - LSE selected as RTC clock. + * RCC_RTCCLKSource_LSI - LSI selected as RTC clock. + * RCC_RTCCLKSource_HSE_Div128 - HSE clock divided by 128 selected as RTC clock. + * Note- + * Once the RTC clock is selected it can't be changed unless the Backup domain is reset. + * @return none + */ +void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource) +{ + RCC->BDCTLR |= RCC_RTCCLKSource; +} + +/********************************************************************* + * @fn RCC_RTCCLKCmd + * + * @brief This function must be used only after the RTC clock was selected + * using the RCC_RTCCLKConfig function. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_RTCCLKCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->BDCTLR |= (1 << 15); + } + else + { + RCC->BDCTLR &= ~(1 << 15); + } +} + +/********************************************************************* + * @fn RCC_GetClocksFreq + * + * @brief The result of this function could be not correct when using + * fractional value for HSE crystal. + * + * @param RCC_Clocks - pointer to a RCC_ClocksTypeDef structure which will hold + * the clocks frequencies. + * + * @return none + */ +void RCC_GetClocksFreq(RCC_ClocksTypeDef *RCC_Clocks) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, presc = 0; + uint8_t Pll_6_5 = 0; + +#ifdef CH32V30x_D8C + uint8_t Pll2mull = 0; + +#endif + + tmp = RCC->CFGR0 & CFGR0_SWS_Mask; + + switch(tmp) + { + case 0x00: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + + case 0x04: + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE; + break; + + case 0x08: + pllmull = RCC->CFGR0 & CFGR0_PLLMull_Mask; + pllsource = RCC->CFGR0 & CFGR0_PLLSRC_Mask; + + pllmull = (pllmull >> 18) + 2; + + if(((*(uint32_t *)0x1FFFF70C) & (1 << 14)) != (1 << 14)) + { /* for other CH32V30x */ + if(pllmull == 17) + pllmull = 18; + } + else + { /* for CH32V307 */ + if(pllmull == 2) + pllmull = 18; + if(pllmull == 15) + { + pllmull = 13; /* *6.5 */ + Pll_6_5 = 1; + } + if(pllmull == 16) + pllmull = 15; + if(pllmull == 17) + pllmull = 16; + } + + if(pllsource == 0x00) + { + if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE) + { + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE)*pllmull; + } + else + { + RCC_Clocks->SYSCLK_Frequency = (HSI_VALUE >> 1) * pllmull; + } + } + else + { +#ifdef CH32V30x_D8 + if((RCC->CFGR0 & CFGR0_PLLXTPRE_Mask) != (uint32_t)RESET) + { + RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE >> 1) * pllmull; + } + else + { + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE * pllmull; + } +#else + if(RCC->CFGR2 & (1<<16)){ /* PLL2 */ + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE/(((RCC->CFGR2 & 0xF0)>>4) + 1); /* PREDIV2 */ + + Pll2mull = (uint8_t)((RCC->CFGR2 & 0xF00)>>8); + + if(Pll2mull == 0) RCC_Clocks->SYSCLK_Frequency = (RCC_Clocks->SYSCLK_Frequency * 5)>>1; + else if(Pll2mull == 1) RCC_Clocks->SYSCLK_Frequency = (RCC_Clocks->SYSCLK_Frequency * 25)>>1; + else if(Pll2mull == 15) RCC_Clocks->SYSCLK_Frequency = RCC_Clocks->SYSCLK_Frequency * 20; + else RCC_Clocks->SYSCLK_Frequency = RCC_Clocks->SYSCLK_Frequency * (Pll2mull + 2); + + RCC_Clocks->SYSCLK_Frequency = RCC_Clocks->SYSCLK_Frequency/((RCC->CFGR2 & 0xF) + 1); /* PREDIV1 */ + } + else{/* HSE */ + RCC_Clocks->SYSCLK_Frequency = HSE_VALUE/((RCC->CFGR2 & 0xF) + 1); /* PREDIV1 */ + } + + RCC_Clocks->SYSCLK_Frequency = RCC_Clocks->SYSCLK_Frequency * pllmull; + +#endif + } + + if(Pll_6_5 == 1) + RCC_Clocks->SYSCLK_Frequency = (RCC_Clocks->SYSCLK_Frequency / 2); + + break; + + default: + RCC_Clocks->SYSCLK_Frequency = HSI_VALUE; + break; + } + + tmp = RCC->CFGR0 & CFGR0_HPRE_Set_Mask; + tmp = tmp >> 4; + presc = APBAHBPrescTable[tmp]; + RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc; + tmp = RCC->CFGR0 & CFGR0_PPRE1_Set_Mask; + tmp = tmp >> 8; + presc = APBAHBPrescTable[tmp]; + RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + tmp = RCC->CFGR0 & CFGR0_PPRE2_Set_Mask; + tmp = tmp >> 11; + presc = APBAHBPrescTable[tmp]; + RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc; + tmp = RCC->CFGR0 & CFGR0_ADCPRE_Set_Mask; + tmp = tmp >> 14; + presc = ADCPrescTable[tmp]; + RCC_Clocks->ADCCLK_Frequency = RCC_Clocks->PCLK2_Frequency / presc; +} + +/********************************************************************* + * @fn RCC_AHBPeriphClockCmd + * + * @brief Enables or disables the AHB peripheral clock. + * + * @param RCC_AHBPeriph - specifies the AHB peripheral to gates its clock. + * RCC_AHBPeriph_DMA1. + * RCC_AHBPeriph_DMA2. + * RCC_AHBPeriph_SRAM. + * RCC_AHBPeriph_CRC. + * RCC_AHBPeriph_FSMC + * RCC_AHBPeriph_RNG + * RCC_AHBPeriph_SDIO + * RCC_AHBPeriph_USBHS + * RCC_AHBPeriph_USBFS + * RCC_AHBPeriph_DVP + * RCC_AHBPeriph_ETH_MAC + * RCC_AHBPeriph_ETH_MAC_Tx + * RCC_AHBPeriph_ETH_MAC_Rx + * Note- + * SRAM clock can be disabled only during sleep mode. + * NewState: ENABLE or DISABLE. + * + * @return none + */ +void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->AHBPCENR |= RCC_AHBPeriph; + } + else + { + RCC->AHBPCENR &= ~RCC_AHBPeriph; + } +} + +/********************************************************************* + * @fn RCC_APB2PeriphClockCmd + * + * @brief Enables or disables the High Speed APB (APB2) peripheral clock. + * + * @param RCC_APB2Periph - specifies the APB2 peripheral to gates its clock. + * RCC_APB2Periph_AFIO. + * RCC_APB2Periph_GPIOA. + * RCC_APB2Periph_GPIOB. + * RCC_APB2Periph_GPIOC. + * RCC_APB2Periph_GPIOD. + * RCC_APB2Periph_GPIOE + * RCC_APB2Periph_ADC1. + * RCC_APB2Periph_ADC2 + * RCC_APB2Periph_TIM1. + * RCC_APB2Periph_SPI1. + * RCC_APB2Periph_TIM8 + * RCC_APB2Periph_USART1. + * RCC_APB2Periph_TIM9 + * RCC_APB2Periph_TIM10 + * NewState - ENABLE or DISABLE + * + * @return none + */ +void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->APB2PCENR |= RCC_APB2Periph; + } + else + { + RCC->APB2PCENR &= ~RCC_APB2Periph; + } +} + +/********************************************************************* + * @fn RCC_APB1PeriphClockCmd + * + * @brief Enables or disables the Low Speed APB (APB1) peripheral clock. + * + * @param RCC_APB1Periph - specifies the APB1 peripheral to gates its clock. + * RCC_APB1Periph_TIM2. + * RCC_APB1Periph_TIM3. + * RCC_APB1Periph_TIM4. + * RCC_APB1Periph_TIM5 + * RCC_APB1Periph_TIM6 + * RCC_APB1Periph_TIM7 + * RCC_APB1Periph_UART6 + * RCC_APB1Periph_UART7 + * RCC_APB1Periph_UART8 + * RCC_APB1Periph_WWDG. + * RCC_APB1Periph_SPI2. + * RCC_APB1Periph_SPI3. + * RCC_APB1Periph_USART2. + * RCC_APB1Periph_USART3. + * RCC_APB1Periph_UART4 + * RCC_APB1Periph_UART5 + * RCC_APB1Periph_I2C1. + * RCC_APB1Periph_I2C2. + * RCC_APB1Periph_USB. + * RCC_APB1Periph_CAN1. + * RCC_APB1Periph_BKP. + * RCC_APB1Periph_PWR. + * RCC_APB1Periph_DAC. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->APB1PCENR |= RCC_APB1Periph; + } + else + { + RCC->APB1PCENR &= ~RCC_APB1Periph; + } +} + +/********************************************************************* + * @fn RCC_APB2PeriphResetCmd + * + * @brief Forces or releases High Speed APB (APB2) peripheral reset. + * + * @param RCC_APB2Periph - specifies the APB2 peripheral to reset. + * RCC_APB2Periph_AFIO. + * RCC_APB2Periph_GPIOA. + * RCC_APB2Periph_GPIOB. + * RCC_APB2Periph_GPIOC. + * RCC_APB2Periph_GPIOD. + * RCC_APB2Periph_GPIOE + * RCC_APB2Periph_ADC1. + * RCC_APB2Periph_ADC2 + * RCC_APB2Periph_TIM1. + * RCC_APB2Periph_SPI1. + * RCC_APB2Periph_TIM8 + * RCC_APB2Periph_USART1. + * RCC_APB2Periph_TIM9 + * RCC_APB2Periph_TIM10 + * NewState - ENABLE or DISABLE + * + * @return none + */ +void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->APB2PRSTR |= RCC_APB2Periph; + } + else + { + RCC->APB2PRSTR &= ~RCC_APB2Periph; + } +} + +/********************************************************************* + * @fn RCC_APB1PeriphResetCmd + * + * @brief Forces or releases Low Speed APB (APB1) peripheral reset. + * + * @param RCC_APB1Periph - specifies the APB1 peripheral to reset. + * RCC_APB1Periph_TIM2. + * RCC_APB1Periph_TIM3. + * RCC_APB1Periph_TIM4. + * RCC_APB1Periph_TIM5 + * RCC_APB1Periph_TIM6 + * RCC_APB1Periph_TIM7 + * RCC_APB1Periph_UART6 + * RCC_APB1Periph_UART7 + * RCC_APB1Periph_UART8 + * RCC_APB1Periph_WWDG. + * RCC_APB1Periph_SPI2. + * RCC_APB1Periph_SPI3. + * RCC_APB1Periph_USART2. + * RCC_APB1Periph_USART3. + * RCC_APB1Periph_UART4 + * RCC_APB1Periph_UART5 + * RCC_APB1Periph_I2C1. + * RCC_APB1Periph_I2C2. + * RCC_APB1Periph_USB. + * RCC_APB1Periph_CAN1. + * RCC_APB1Periph_BKP. + * RCC_APB1Periph_PWR. + * RCC_APB1Periph_DAC. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->APB1PRSTR |= RCC_APB1Periph; + } + else + { + RCC->APB1PRSTR &= ~RCC_APB1Periph; + } +} + +/********************************************************************* + * @fn RCC_BackupResetCmd + * + * @brief Forces or releases the Backup domain reset. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_BackupResetCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->BDCTLR |= (1 << 16); + } + else + { + RCC->BDCTLR &= ~(1 << 16); + } +} + +/********************************************************************* + * @fn RCC_ClockSecuritySystemCmd + * + * @brief Enables or disables the Clock Security System. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_ClockSecuritySystemCmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1 << 19); + } + else + { + RCC->CTLR &= ~(1 << 19); + } +} + +/********************************************************************* + * @fn RCC_MCOConfig + * + * @brief Selects the clock source to output on MCO pin. + * + * @param RCC_MCO - specifies the clock source to output. + * RCC_MCO_NoClock - No clock selected. + * RCC_MCO_SYSCLK - System clock selected. + * RCC_MCO_HSI - HSI oscillator clock selected. + * RCC_MCO_HSE - HSE oscillator clock selected. + * RCC_MCO_PLLCLK_Div2 - PLL clock divided by 2 selected. + * RCC_MCO_PLL2CLK - PLL2 clock selected + * RCC_MCO_PLL3CLK_Div2 - PLL3 clock divided by 2 selected + * RCC_MCO_XT1 - External 3-25 MHz oscillator clock selected + * RCC_MCO_PLL3CLK - PLL3 clock selected + * + * @return none + */ +void RCC_MCOConfig(uint8_t RCC_MCO) +{ + *(__IO uint8_t *)CFGR0_BYTE4_ADDRESS = RCC_MCO; +} + +/********************************************************************* + * @fn RCC_GetFlagStatus + * + * @brief Checks whether the specified RCC flag is set or not. + * + * @param RCC_FLAG - specifies the flag to check. + * RCC_FLAG_HSIRDY - HSI oscillator clock ready. + * RCC_FLAG_HSERDY - HSE oscillator clock ready. + * RCC_FLAG_PLLRDY - PLL clock ready. + * RCC_FLAG_PLL2RDY - PLL2 clock ready. + * RCC_FLAG_PLL3RDY - PLL3 clock ready. + * RCC_FLAG_LSERDY - LSE oscillator clock ready. + * RCC_FLAG_LSIRDY - LSI oscillator clock ready. + * RCC_FLAG_PINRST - Pin reset. + * RCC_FLAG_PORRST - POR/PDR reset. + * RCC_FLAG_SFTRST - Software reset. + * RCC_FLAG_IWDGRST - Independent Watchdog reset. + * RCC_FLAG_WWDGRST - Window Watchdog reset. + * RCC_FLAG_LPWRRST - Low Power reset. + * + * @return FlagStatus - SET or RESET. + */ +FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG) +{ + uint32_t tmp = 0; + uint32_t statusreg = 0; + + FlagStatus bitstatus = RESET; + tmp = RCC_FLAG >> 5; + + if(tmp == 1) + { + statusreg = RCC->CTLR; + } + else if(tmp == 2) + { + statusreg = RCC->BDCTLR; + } + else + { + statusreg = RCC->RSTSCKR; + } + + tmp = RCC_FLAG & FLAG_Mask; + + if((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn RCC_ClearFlag + * + * @brief Clears the RCC reset flags. + * Note- + * The reset flags are: RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, + * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST + * @return none + */ +void RCC_ClearFlag(void) +{ + RCC->RSTSCKR |= RSTSCKR_RMVF_Set; +} + +/********************************************************************* + * @fn RCC_GetITStatus + * + * @brief Checks whether the specified RCC interrupt has occurred or not. + * + * @param RCC_IT - specifies the RCC interrupt source to check. + * RCC_IT_LSIRDY - LSI ready interrupt. + * RCC_IT_LSERDY - LSE ready interrupt. + * RCC_IT_HSIRDY - HSI ready interrupt. + * RCC_IT_HSERDY - HSE ready interrupt. + * RCC_IT_PLLRDY - PLL ready interrupt. + * RCC_IT_PLL2RDY - PLL2 ready interrupt. + * RCC_IT_PLL3RDY - PLL3 ready interrupt. + * RCC_IT_CSS - Clock Security System interrupt. + * + * @return ITStatus - SET or RESET. + */ + +ITStatus RCC_GetITStatus(uint8_t RCC_IT) +{ + ITStatus bitstatus = RESET; + + if((RCC->INTR & RCC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn RCC_ClearITPendingBit + * + * @brief Clears the RCC's interrupt pending bits. + * + * @param RCC_IT - specifies the interrupt pending bit to clear. + * RCC_IT_LSIRDY - LSI ready interrupt. + * RCC_IT_LSERDY - LSE ready interrupt. + * RCC_IT_HSIRDY - HSI ready interrupt. + * RCC_IT_HSERDY - HSE ready interrupt. + * RCC_IT_PLLRDY - PLL ready interrupt. + * RCC_IT_PLL2RDY - PLL2 ready interrupt. + * RCC_IT_PLL3RDY - PLL3 ready interrupt. + * RCC_IT_CSS - Clock Security System interrupt. + * + * @return none + */ +void RCC_ClearITPendingBit(uint8_t RCC_IT) +{ + *(__IO uint8_t *)INTR_BYTE3_ADDRESS = RCC_IT; +} + +/********************************************************************* + * @fn RCC_PREDIV1Config + * + * @brief Configures the PREDIV1 division factor. + * + * @param RCC_PREDIV1_Source - specifies the PREDIV1 clock source. + * RCC_PREDIV1_Source_HSE - HSE selected as PREDIV1 clock + * RCC_PREDIV1_Source_PLL2 - PLL2 selected as PREDIV1 clock + * RCC_PREDIV1_Div - specifies the PREDIV1 clock division factor. + * This parameter can be RCC_PREDIV1_Divx where x[1,16] + * Note- + * - This function must be used only when the PLL is disabled. + * + * @return none + */ +void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR2; + tmpreg &= ~(CFGR2_PREDIV1 | CFGR2_PREDIV1SRC); + tmpreg |= RCC_PREDIV1_Source | RCC_PREDIV1_Div; + RCC->CFGR2 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PREDIV2Config + * + * @brief Configures the PREDIV2 division factor. + * + * @param RCC_PREDIV2_Div - specifies the PREDIV2 clock division factor. + * This parameter can be RCC_PREDIV2_Divx where x:[1,16] + * Note- + * - This function must be used only when both PLL2 and PLL3 are disabled. + * + * @return none + */ +void RCC_PREDIV2Config(uint32_t RCC_PREDIV2_Div) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR2; + tmpreg &= ~CFGR2_PREDIV2; + tmpreg |= RCC_PREDIV2_Div; + RCC->CFGR2 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PLL2Config + * + * @brief Configures the PLL2 multiplication factor. + * + * @param RCC_PLL2Mul - specifies the PLL2 multiplication factor. + * This parameter can be RCC_PLL2Mul_x where x:{[4,16], 2.5, 12.5, 20} + * Note- + * - This function must be used only when the PLL2 is disabled. + * + * @return none + */ +void RCC_PLL2Config(uint32_t RCC_PLL2Mul) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR2; + tmpreg &= ~CFGR2_PLL2MUL; + tmpreg |= RCC_PLL2Mul; + RCC->CFGR2 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PLL2Cmd + * + * @brief Enables or disables the PLL2. + * + * @param NewState - new state of the PLL2. This parameter can be + * ENABLE or DISABLE. + * Note- + * - The PLL2 can not be disabled if it is used indirectly as system clock + * (i.e. it is used as PLL clock entry that is used as System clock). + * + * @return none + */ +void RCC_PLL2Cmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1 << 26); + } + else + { + RCC->CTLR &= ~(1 << 26); + } +} + +/********************************************************************* + * @fn RCC_PLL3Config + * + * @brief Configures the PLL3 multiplication factor. + * + * @param RCC_PLL3Mul - specifies the PLL3 multiplication factor. + * This parameter can be RCC_PLL3Mul_x where x:{[4,16], 2.5, 12.5, 20} + * Note- + * - This function must be used only when the PLL3 is disabled. + * + * @return none + */ +void RCC_PLL3Config(uint32_t RCC_PLL3Mul) +{ + uint32_t tmpreg = 0; + + tmpreg = RCC->CFGR2; + tmpreg &= ~CFGR2_PLL3MUL; + tmpreg |= RCC_PLL3Mul; + RCC->CFGR2 = tmpreg; +} + +/********************************************************************* + * @fn RCC_PLL3Cmd + * + * @brief Enables or disables the PLL3. + * + * @param NewState - new state of the PLL2. This parameter can be + * ENABLE or DISABLE. + * + * @return none + */ +void RCC_PLL3Cmd(FunctionalState NewState) +{ + if(NewState) + { + RCC->CTLR |= (1 << 28); + } + else + { + RCC->CTLR &= ~(1 << 28); + } +} + +/********************************************************************* + * @fn RCC_USBFSCLKConfig + * + * @brief Configures the USB OTG FS clock (USBFSCLK). + * + * @param RCC_USBFSCLKSource - specifies the USB OTG FS clock source. + * RCC_USBFSCLKSource_PLLCLK_Div1 - PLL clock divided by 1 + * selected as USB OTG FS clock source + * RCC_USBFSCLKSource_PLLCLK_Div2 - PLL clock divided by 2 + * selected as USB OTG FS clock source + * RCC_USBFSCLKSource_PLLCLK_Div3 - PLL clock divided by 3 + * selected as USB OTG FS clock source + * + * @return none + */ +void RCC_USBFSCLKConfig(uint32_t RCC_USBFSCLKSource) +{ + RCC->CFGR0 &= ~(3 << 22); + RCC->CFGR0 |= RCC_USBFSCLKSource << 22; +} + +/********************************************************************* + * @fn RCC_I2S2CLKConfig + * + * @brief Configures the I2S2 clock source(I2S2CLK). + * + * @param RCC_I2S2CLKSource - specifies the I2S2 clock source. + * RCC_I2S2CLKSource_SYSCLK - system clock selected as I2S2 clock entry + * RCC_I2S2CLKSource_PLL3_VCO - PLL3 VCO clock selected as I2S2 clock entry + * Note- + * - This function must be called before enabling I2S2 APB clock. + * @return none + */ +void RCC_I2S2CLKConfig(uint32_t RCC_I2S2CLKSource) +{ + RCC->CFGR2 &= ~(1 << 17); + RCC->CFGR2 |= RCC_I2S2CLKSource << 17; +} + +/********************************************************************* + * @fn RCC_I2S3CLKConfig + * + * @brief Configures the I2S3 clock source(I2S2CLK). + * + * @param RCC_I2S3CLKSource - specifies the I2S3 clock source. + * RCC_I2S3CLKSource_SYSCLK - system clock selected as I2S3 clock entry + * RCC_I2S3CLKSource_PLL3_VCO - PLL3 VCO clock selected as I2S3 clock entry + * Note- + * - This function must be called before enabling I2S3 APB clock. + * @return none + */ +void RCC_I2S3CLKConfig(uint32_t RCC_I2S3CLKSource) +{ + RCC->CFGR2 &= ~(1 << 18); + RCC->CFGR2 |= RCC_I2S3CLKSource << 18; +} + +/********************************************************************* + * @fn RCC_AHBPeriphResetCmd + * + * @brief Forces or releases AHB peripheral reset. + * + * @param RCC_AHBPeriph - specifies the AHB peripheral to reset. + * RCC_AHBPeriph_USBFS + * RCC_AHBPeriph_ETH_MAC + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_AHBPeriphResetCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->AHBRSTR |= RCC_AHBPeriph; + } + else + { + RCC->AHBRSTR &= ~RCC_AHBPeriph; + } +} + +/********************************************************************* + * @fn RCC_ADCCLKADJcmd + * + * @brief Enable ADC clock duty cycle adjustment. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_ADCCLKADJcmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->CFGR0 |= (1 << 31); + } + else + { + RCC->CFGR0 &= ~(1 << 31); + } +} + +/********************************************************************* + * @fn RCC_RNGCLKConfig + * + * @brief Configures the RNG clock source. + * + * @param RCC_RNGCLKSource - specifies the RNG clock source. + * RCC_RNGCLKSource_SYSCLK - system clock selected as RNG clock entry + * RCC_RNGCLKSource_PLL3_VCO - PLL3 VCO clock selected as RNG clock entry + * + * @return none + */ +void RCC_RNGCLKConfig(uint32_t RCC_RNGCLKSource) +{ + RCC->CFGR2 &= ~(1 << 19); + RCC->CFGR2 |= RCC_RNGCLKSource << 19; +} + +/********************************************************************* + * @fn RCC_ETH1GCLKConfig + * + * @brief Configures the ETH1G clock source. + * + * @param RCC_RNGCLKSource - specifies the ETH1G clock source. + * RCC_ETH1GCLKSource_PLL2_VCO - system clock selected as ETH1G clock entry + * RCC_ETH1GCLKSource_PLL3_VCO - PLL3 VCO clock selected as ETH1G clock entry + * RCC_ETH1GCLKSource_PB1_IN - GPIO PB1 input clock selected as ETH1G clock entry + * + * @return none + */ +void RCC_ETH1GCLKConfig(uint32_t RCC_ETH1GCLKSource) +{ + RCC->CFGR2 &= ~(3 << 20); + RCC->CFGR2 |= RCC_ETH1GCLKSource << 20; +} + +/********************************************************************* + * @fn RCC_ETH1G_125Mcmd + * + * @brief Enable ETH1G 125M. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_ETH1G_125Mcmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->CFGR2 |= (1 << 22); + } + else + { + RCC->CFGR2 &= ~(1 << 22); + } +} + +/********************************************************************* + * @fn RCC_USBHSConfig + * + * @brief Configures the USBHS clock. + * + * @param RCC_USBHS - defines the USBHS clock divider. + * RCC_USBPLL_Div1 - USBHS clock = USBPLL. + * RCC_USBPLL_Div2 - USBHS clock = USBPLL/2. + * RCC_USBPLL_Div3 - USBHS clock = USBPLL/3. + * RCC_USBPLL_Div4 - USBHS clock = USBPLL/4. + * RCC_USBPLL_Div5 - USBHS clock = USBPLL/5. + * RCC_USBPLL_Div6 - USBHS clock = USBPLL/6. + * RCC_USBPLL_Div7 - USBHS clock = USBPLL/7. + * RCC_USBPLL_Div8 - USBHS clock = USBPLL/8. + * + * @return none + */ +void RCC_USBHSConfig(uint32_t RCC_USBHS) +{ + RCC->CFGR2 &= ~(7 << 24); + RCC->CFGR2 |= RCC_USBHS << 24; +} + +/********************************************************************* + * @fn RCC_USBHSPLLCLKConfig + * + * @brief Configures the USBHSPLL clock source. + * + * @param RCC_HSBHSPLLCLKSource - specifies the USBHSPLL clock source. + * RCC_HSBHSPLLCLKSource_HSE - HSE clock selected as USBHSPLL clock entry + * RCC_HSBHSPLLCLKSource_HSI - HSI clock selected as USBHSPLL clock entry + * + * @return none + */ +void RCC_USBHSPLLCLKConfig(uint32_t RCC_USBHSPLLCLKSource) +{ + RCC->CFGR2 &= ~(1 << 27); + RCC->CFGR2 |= RCC_USBHSPLLCLKSource << 27; +} + +/********************************************************************* + * @fn RCC_USBHSPLLCKREFCLKConfig + * + * @brief Configures the USBHSPLL reference clock. + * + * @param RCC_USBHSPLLCKREFCLKSource - Select reference clock. + * RCC_USBHSPLLCKREFCLK_3M - reference clock 3Mhz. + * RCC_USBHSPLLCKREFCLK_4M - reference clock 4Mhz. + * RCC_USBHSPLLCKREFCLK_8M - reference clock 8Mhz. + * RCC_USBHSPLLCKREFCLK_5M - reference clock 5Mhz. + * + * @return none + */ +void RCC_USBHSPLLCKREFCLKConfig(uint32_t RCC_USBHSPLLCKREFCLKSource) +{ + RCC->CFGR2 &= ~(3 << 28); + RCC->CFGR2 |= RCC_USBHSPLLCKREFCLKSource << 28; +} + +/********************************************************************* + * @fn RCC_USBHSPHYPLLALIVEcmd + * + * @brief Enable USBHS PHY control. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RCC_USBHSPHYPLLALIVEcmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RCC->CFGR2 |= (1 << 30); + } + else + { + RCC->CFGR2 &= ~(1 << 30); + } +} + +/********************************************************************* + * @fn RCC_USBCLK48MConfig + * + * @brief Configures the USB clock 48MHz source. + * + * @param RCC_USBCLK48MSource - specifies the USB clock 48MHz source. + * RCC_USBCLK48MCLKSource_PLLCLK - PLLCLK clock selected as USB clock 48MHz clock entry + * RCC_USBCLK48MCLKSource_USBPHY - USBPHY clock selected as USB clock 48MHz clock entry + * + * @return none + */ +void RCC_USBCLK48MConfig(uint32_t RCC_USBCLK48MSource) +{ + RCC->CFGR2 &= ~(1 << 31); + RCC->CFGR2 |= RCC_USBCLK48MSource << 31; +} diff --git a/Peripheral/src/ch32v30x_rng.c b/Peripheral/src/ch32v30x_rng.c new file mode 100644 index 0000000..faea0ab --- /dev/null +++ b/Peripheral/src/ch32v30x_rng.c @@ -0,0 +1,154 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_rng.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the RNG firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_rng.h" +#include "ch32v30x_rcc.h" + +/********************************************************************* + * @fn RNG_Cmd + * + * @brief Enables or disables the RNG peripheral. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void RNG_Cmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RNG->CR |= RNG_CR_RNGEN; + } + else + { + RNG->CR &= ~RNG_CR_RNGEN; + } +} + +/********************************************************************* + * @fn RNG_GetRandomNumber + * + * @brief Returns a 32-bit random number. + * + * @return 32-bit random number. + */ +uint32_t RNG_GetRandomNumber(void) +{ + return RNG->DR; +} + +/********************************************************************* + * @fn RNG_ITConfig + * + * @brief Enables or disables the RNG interrupt. + * + * @param NewState - ENABLE or DISABLE. + * + * @return 32-bit random number. + */ +void RNG_ITConfig(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RNG->CR |= RNG_CR_IE; + } + else + { + RNG->CR &= ~RNG_CR_IE; + } +} + +/********************************************************************* + * @fn RNG_GetFlagStatus + * + * @brief Checks whether the specified RNG flag is set or not. + * + * @param RNG_FLAG - specifies the RNG flag to check. + * RNG_FLAG_DRDY - Data Ready flag. + * RNG_FLAG_CECS - Clock Error Current flag. + * RNG_FLAG_SECS - Seed Error Current flag. + * + * @return 32-bit random number. + */ +FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((RNG->SR & RNG_FLAG) != (uint8_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn RNG_ClearFlag + * + * @brief Clears the RNG flags. + * + * @param RNG_FLAG - specifies the flag to clear. + * RNG_FLAG_CECS - Clock Error Current flag. + * RNG_FLAG_SECS - Seed Error Current flag. + * + * @return 32-bit random number. + */ +void RNG_ClearFlag(uint8_t RNG_FLAG) +{ + RNG->SR = ~(uint32_t)(((uint32_t)RNG_FLAG) << 4); +} + +/********************************************************************* + * @fn RNG_GetFlagStatus + * + * @brief Checks whether the specified RNG interrupt has occurred or not. + * + * @param RNG_IT - specifies the RNG interrupt source to check. + * RNG_IT_CEI - Clock Error Interrupt. + * RNG_IT_SEI - Seed Error Interrupt. + * + * @return bitstatus:SET or RESET. + */ +ITStatus RNG_GetITStatus(uint8_t RNG_IT) +{ + ITStatus bitstatus = RESET; + + if((RNG->SR & RNG_IT) != (uint8_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn RNG_ClearITPendingBit + * + * @brief Clears the RNG interrupt pending bit(s). + * + * @param RNG_IT - specifies the RNG interrupt pending bit(s) to clear. + * RNG_IT_CEI - Clock Error Interrupt. + * RNG_IT_SEI - Seed Error Interrupt. + * + * @return None + */ +void RNG_ClearITPendingBit(uint8_t RNG_IT) +{ + RNG->SR = (uint8_t)~RNG_IT; +} diff --git a/Peripheral/src/ch32v30x_rtc.c b/Peripheral/src/ch32v30x_rtc.c new file mode 100644 index 0000000..0f9ba6d --- /dev/null +++ b/Peripheral/src/ch32v30x_rtc.c @@ -0,0 +1,315 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_rtc.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the RTC firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_rtc.h" + +/* RTC_Private_Defines */ +#define RTC_LSB_MASK ((uint32_t)0x0000FFFF) /* RTC LSB Mask */ +#define PRLH_MSB_MASK ((uint32_t)0x000F0000) /* RTC Prescaler MSB Mask */ + +/********************************************************************* + * @fn RTC_ITConfig + * + * @brief Enables or disables the specified RTC interrupts. + * + * @param RTC_IT - specifies the RTC interrupts sources to be enabled or disabled. + * RTC_IT_OW - Overflow interrupt + * RTC_IT_ALR - Alarm interrupt + * RTC_IT_SEC - Second interrupt + * + * @return NewState - new state of the specified RTC interrupts(ENABLE or DISABLE). + */ +void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + RTC->CTLRH |= RTC_IT; + } + else + { + RTC->CTLRH &= (uint16_t)~RTC_IT; + } +} + +/********************************************************************* + * @fn RTC_EnterConfigMode + * + * @brief Enters the RTC configuration mode. + * + * @return none + */ +void RTC_EnterConfigMode(void) +{ + RTC->CTLRL |= RTC_CTLRL_CNF; +} + +/********************************************************************* + * @fn RTC_ExitConfigMode + * + * @brief Exits from the RTC configuration mode. + * + * @return none + */ +void RTC_ExitConfigMode(void) +{ + RTC->CTLRL &= (uint16_t) ~((uint16_t)RTC_CTLRL_CNF); +} + +/********************************************************************* + * @fn RTC_GetCounter + * + * @brief Gets the RTC counter value + * + * @return RTC counter value + */ +uint32_t RTC_GetCounter(void) +{ + uint16_t high1a = 0, high1b = 0, high2a = 0, high2b = 0; + uint16_t low1 = 0, low2 = 0; + + do{ + high1a = RTC->CNTH; + high1b = RTC->CNTH; + }while( high1a != high1b ); + + do{ + low1 = RTC->CNTL; + low2 = RTC->CNTL; + }while( low1 != low2 ); + + do{ + high2a = RTC->CNTH; + high2b = RTC->CNTH; + }while( high2a != high2b ); + + if(high1b != high2b) + { + do{ + low1 = RTC->CNTL; + low2 = RTC->CNTL; + }while( low1 != low2 ); + } + + return (((uint32_t)high2b << 16) | low2); +} + +/********************************************************************* + * @fn RTC_SetCounter + * + * @brief Sets the RTC counter value. + * + * @param CounterValue - RTC counter new value. + * + * @return RTC counter value + */ +void RTC_SetCounter(uint32_t CounterValue) +{ + RTC_EnterConfigMode(); + RTC->CNTH = CounterValue >> 16; + RTC->CNTL = (CounterValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/********************************************************************* + * @fn RTC_SetPrescaler + * + * @brief Sets the RTC prescaler value + * + * @param PrescalerValue - RTC prescaler new value + * + * @return none + */ +void RTC_SetPrescaler(uint32_t PrescalerValue) +{ + RTC_EnterConfigMode(); + RTC->PSCRH = (PrescalerValue & PRLH_MSB_MASK) >> 16; + RTC->PSCRL = (PrescalerValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/********************************************************************* + * @fn RTC_SetAlarm + * + * @brief Sets the RTC alarm value + * + * @param AlarmValue - RTC alarm new value + * + * @return none + */ +void RTC_SetAlarm(uint32_t AlarmValue) +{ + RTC_EnterConfigMode(); + RTC->ALRMH = AlarmValue >> 16; + RTC->ALRML = (AlarmValue & RTC_LSB_MASK); + RTC_ExitConfigMode(); +} + +/********************************************************************* + * @fn RTC_GetDivider + * + * @brief Gets the RTC divider value + * + * @return RTC Divider value + */ +uint32_t RTC_GetDivider(void) +{ + uint16_t high1a = 0, high1b = 0, high2a = 0, high2b = 0; + uint16_t low1 = 0, low2 = 0; + + do{ + high1a = RTC->DIVH; + high1b = RTC->DIVH; + }while( high1a != high1b ); + + do{ + low1 = RTC->DIVL; + low2 = RTC->DIVL; + }while( low1 != low2 ); + + do{ + high2a = RTC->DIVH; + high2b = RTC->DIVH; + }while( high2a != high2b ); + + if(high1b != high2b) + { + do{ + low1 = RTC->DIVL; + low2 = RTC->DIVL; + }while( low1 != low2 ); + } + + return ((((uint32_t)high2b & (uint32_t)0x000F) << 16) | low2); +} + +/********************************************************************* + * @fn RTC_WaitForLastTask + * + * @brief Waits until last write operation on RTC registers has finished + * Note- + * This function must be called before any write to RTC registers. + * @return none + */ +void RTC_WaitForLastTask(void) +{ + while((RTC->CTLRL & RTC_FLAG_RTOFF) == (uint16_t)RESET) + { + } +} + +/********************************************************************* + * @fn RTC_WaitForSynchro + * + * @brief Waits until the RTC registers are synchronized with RTC APB clock + * Note- + * This function must be called before any read operation after an APB reset + * or an APB clock stop. + * + * @return none + */ +void RTC_WaitForSynchro(void) +{ + RTC->CTLRL &= (uint16_t)~RTC_FLAG_RSF; + while((RTC->CTLRL & RTC_FLAG_RSF) == (uint16_t)RESET) + { + } +} + +/********************************************************************* + * @fn RTC_GetFlagStatus + * + * @brief Checks whether the specified RTC flag is set or not + * + * @param RTC_FLAG- specifies the flag to check + * RTC_FLAG_RTOFF - RTC Operation OFF flag + * RTC_FLAG_RSF - Registers Synchronized flag + * RTC_FLAG_OW - Overflow flag + * RTC_FLAG_ALR - Alarm flag + * RTC_FLAG_SEC - Second flag + * + * @return The new state of RTC_FLAG (SET or RESET) + */ +FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG) +{ + FlagStatus bitstatus = RESET; + if((RTC->CTLRL & RTC_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn RTC_ClearFlag + * + * @brief Clears the RTC's pending flags + * + * @param RTC_FLAG - specifies the flag to clear + * RTC_FLAG_RSF - Registers Synchronized flag + * RTC_FLAG_OW - Overflow flag + * RTC_FLAG_ALR - Alarm flag + * RTC_FLAG_SEC - Second flag + * + * @return none + */ +void RTC_ClearFlag(uint16_t RTC_FLAG) +{ + RTC->CTLRL &= (uint16_t)~RTC_FLAG; +} + +/********************************************************************* + * @fn RTC_GetITStatus + * + * @brief Checks whether the specified RTC interrupt has occurred or not + * + * @param RTC_IT - specifies the RTC interrupts sources to check + * RTC_FLAG_OW - Overflow interrupt + * RTC_FLAG_ALR - Alarm interrupt + * RTC_FLAG_SEC - Second interrupt + * + * @return The new state of the RTC_IT (SET or RESET) + */ +ITStatus RTC_GetITStatus(uint16_t RTC_IT) +{ + ITStatus bitstatus = RESET; + + bitstatus = (ITStatus)(RTC->CTLRL & RTC_IT); + if(((RTC->CTLRH & RTC_IT) != (uint16_t)RESET) && (bitstatus != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn RTC_ClearITPendingBit + * + * @brief Clears the RTC's interrupt pending bits + * + * @param RTC_IT - specifies the interrupt pending bit to clear + * RTC_FLAG_OW - Overflow interrupt + * RTC_FLAG_ALR - Alarm interrupt + * RTC_FLAG_SEC - Second interrupt + * + * @return none + */ +void RTC_ClearITPendingBit(uint16_t RTC_IT) +{ + RTC->CTLRL &= (uint16_t)~RTC_IT; +} diff --git a/Peripheral/src/ch32v30x_sdio.c b/Peripheral/src/ch32v30x_sdio.c new file mode 100644 index 0000000..ae54bb1 --- /dev/null +++ b/Peripheral/src/ch32v30x_sdio.c @@ -0,0 +1,672 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_SDIO.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the SDIO firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_sdio.h" +#include "ch32v30x_rcc.h" + +#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) + +/* CLKCR register clear mask */ +#define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100) + +/* SDIO PWRCTRL Mask */ +#define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC) + +/* SDIO DCTRL Clear Mask */ +#define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08) + +/* CMD Register clear mask */ +#define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800) + +/* SDIO RESP Registers Address */ +#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) + +/********************************************************************* + * @fn SDIO_DeInit + * + * @brief Deinitializes the SDIO peripheral registers to their default + * reset values. + * + * @return RTC counter value + */ +void SDIO_DeInit(void) +{ + SDIO->POWER = 0x00000000; + SDIO->CLKCR = 0x00000000; + SDIO->ARG = 0x00000000; + SDIO->CMD = 0x00000000; + SDIO->DTIMER = 0x00000000; + SDIO->DLEN = 0x00000000; + SDIO->DCTRL = 0x00000000; + SDIO->ICR = 0x00C007FF; + SDIO->MASK = 0x00000000; +} + +/********************************************************************* + * @fn SDIO_Init + * + * @brief Initializes the SDIO peripheral according to the specified + * parameters in the SDIO_InitStruct. + * + * @param SDIO_InitStruct - pointer to a SDIO_InitTypeDef structure + * that contains the configuration information for the SDIO peripheral. + * + * @return None + */ +void SDIO_Init(SDIO_InitTypeDef *SDIO_InitStruct) +{ + uint32_t tmpreg = 0; + + tmpreg = SDIO->CLKCR; + tmpreg &= CLKCR_CLEAR_MASK; + tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave | + SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide | + SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl); + + SDIO->CLKCR = tmpreg; +} + +/********************************************************************* + * @fn SDIO_StructInit + * + * @brief Fills each SDIO_InitStruct member with its default value. + * + * @param SDIO_InitStruct - pointer to an SDIO_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void SDIO_StructInit(SDIO_InitTypeDef *SDIO_InitStruct) +{ + SDIO_InitStruct->SDIO_ClockDiv = 0x00; + SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising; + SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable; + SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; + SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b; + SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; +} + +/********************************************************************* + * @fn SDIO_ClockCmd + * + * @brief Enables or disables the SDIO Clock. + * + * @param SDIO_InitStruct - pointer to an SDIO_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void SDIO_ClockCmd(FunctionalState NewState) +{ + if(NewState) + SDIO->CLKCR |= (1 << 8); + else + SDIO->CLKCR &= ~(1 << 8); +} + +/********************************************************************* + * @fn SDIO_SetPowerState + * + * @brief Sets the power status of the controller. + * + * @param SDIO_PowerState - new state of the Power state. + * SDIO_PowerState_OFF + * SDIO_PowerState_ON + * + * @return none + */ +void SDIO_SetPowerState(uint32_t SDIO_PowerState) +{ + SDIO->POWER &= PWR_PWRCTRL_MASK; + SDIO->POWER |= SDIO_PowerState; +} + +/********************************************************************* + * @fn SDIO_GetPowerState + * + * @brief Gets the power status of the controller. + * + * @param CounterValue - RTC counter new value. + * + * @return power state - + * 0x00 - Power OFF + * 0x02 - Power UP + * 0x03 - Power ON + */ +uint32_t SDIO_GetPowerState(void) +{ + return (SDIO->POWER & (~PWR_PWRCTRL_MASK)); +} + +/********************************************************************* + * @fn SDIO_ITConfig + * + * @brief Enables or disables the SDIO interrupts. + * + * @param DIO_IT - specifies the SDIO interrupt sources to be enabled or disabled. + * SDIO_IT_CCRCFAIL + * SDIO_IT_DCRCFAIL + * SDIO_IT_CTIMEOUT + * SDIO_IT_DTIMEOUT + * SDIO_IT_TXUNDERR + * SDIO_IT_RXOVERR + * SDIO_IT_CMDREND + * SDIO_IT_CMDSENT + * SDIO_IT_DATAEND + * SDIO_IT_STBITERR + * SDIO_IT_DBCKEND + * SDIO_IT_CMDACT + * SDIO_IT_TXACT + * SDIO_IT_RXACT + * SDIO_IT_TXFIFOHE + * SDIO_IT_RXFIFOHF + * SDIO_IT_TXFIFOF + * SDIO_IT_RXFIFOF + * SDIO_IT_TXFIFOE + * SDIO_IT_RXFIFOE + * SDIO_IT_TXDAVL + * SDIO_IT_RXDAVL + * SDIO_IT_SDIOIT + * SDIO_IT_CEATAEND + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SDIO->MASK |= SDIO_IT; + } + else + { + SDIO->MASK &= ~SDIO_IT; + } +} + +/********************************************************************* + * @fn SDIO_DMACmd + * + * @brief Enables or disables the SDIO DMA request. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_DMACmd(FunctionalState NewState) +{ + if(NewState) + SDIO->DCTRL |= (1 << 3); + else + SDIO->DCTRL &= ~(1 << 3); +} + +/********************************************************************* + * @fn SDIO_SendCommand + * + * @brief Initializes the SDIO Command according to the specified + * parameters in the SDIO_CmdInitStruct and send the command. + * @param SDIO_CmdInitStruct - pointer to a SDIO_CmdInitTypeDef + * structure that contains the configuration information for + * ddthe SDIO command. + * + * @return none + */ +void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +{ + uint32_t tmpreg = 0; + + SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument; + + tmpreg = SDIO->CMD; + tmpreg &= CMD_CLEAR_MASK; + tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM; + + SDIO->CMD = tmpreg; +} + +/********************************************************************* + * @fn SDIO_CmdStructInit + * + * @brief Fills each SDIO_CmdInitStruct member with its default value. + * + * @param SDIO_CmdInitStruct - pointer to an SDIO_CmdInitTypeDef + * structure which will be initialized. + * + * @return none + */ +void SDIO_CmdStructInit(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) +{ + SDIO_CmdInitStruct->SDIO_Argument = 0x00; + SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00; + SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No; + SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No; + SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable; +} + +/********************************************************************* + * @fn SDIO_GetCommandResponse + * + * @brief Returns command index of last command for which response received. + * + * @return Returns the command index of the last command response received. + */ +uint8_t SDIO_GetCommandResponse(void) +{ + return (uint8_t)(SDIO->RESPCMD); +} + +/********************************************************************* + * @fn SDIO_GetResponse + * + * @brief Returns response received from the card for the last command. + * + * @param SDIO_RESP - Specifies the SDIO response register. + * SDIO_RESP1 - Response Register 1 + * SDIO_RESP2 - Response Register 2 + * SDIO_RESP3 - Response Register 3 + * SDIO_RESP4 - Response Register 4 + * + * @return Returns the command index of the last command response received. + */ +uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) +{ + __IO uint32_t tmp = 0; + + tmp = SDIO_RESP_ADDR + SDIO_RESP; + + return (*(__IO uint32_t *)tmp); +} + +/********************************************************************* + * @fn SDIO_DataConfig + * + * @brief Initializes the SDIO data path according to the specified + * + * @param SDIO_DataInitStruct - pointer to a SDIO_DataInitTypeDef structure that + * contains the configuration information for the SDIO command. + * + * @return none + */ +void SDIO_DataConfig(SDIO_DataInitTypeDef *SDIO_DataInitStruct) +{ + uint32_t tmpreg = 0; + + SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut; + SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength; + tmpreg = SDIO->DCTRL; + tmpreg &= DCTRL_CLEAR_MASK; + tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM; + + SDIO->DCTRL = tmpreg; +} + +/********************************************************************* + * @fn SDIO_DataStructInit + * + * @brief Fills each SDIO_DataInitStruct member with its default value. + * + * @param SDIO_DataInitStruct - pointer to an SDIO_DataInitTypeDef + * structure which will be initialized. + * + * @return RTC counter value + */ +void SDIO_DataStructInit(SDIO_DataInitTypeDef *SDIO_DataInitStruct) +{ + SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF; + SDIO_DataInitStruct->SDIO_DataLength = 0x00; + SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b; + SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard; + SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block; + SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable; +} + +/********************************************************************* + * @fn SDIO_GetDataCounter + * + * @brief Returns number of remaining data bytes to be transferred. + * + * @return Number of remaining data bytes to be transferred + */ +uint32_t SDIO_GetDataCounter(void) +{ + return SDIO->DCOUNT; +} + +/********************************************************************* + * @fn SDIO_ReadData + * + * @brief Read one data word from Rx FIFO. + * + * @return Data received + */ +uint32_t SDIO_ReadData(void) +{ + return SDIO->FIFO; +} + +/********************************************************************* + * @fn SDIO_WriteData + * + * @brief Write one data word to Tx FIFO. + * + * @param Data - 32-bit data word to write. + * + * @return RTC counter value + */ +void SDIO_WriteData(uint32_t Data) +{ + SDIO->FIFO = Data; +} + +/********************************************************************* + * @fn SDIO_GetFIFOCount + * + * @brief Returns the number of words left to be written to or read from FIFO. + * + * @return Remaining number of words. + */ +uint32_t SDIO_GetFIFOCount(void) +{ + return SDIO->FIFOCNT; +} + +/********************************************************************* + * @fn SDIO_StartSDIOReadWait + * + * @brief Starts the SD I/O Read Wait operation. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_StartSDIOReadWait(FunctionalState NewState) +{ + if(NewState) + SDIO->DCTRL |= (1 << 8); + else + SDIO->DCTRL &= ~(1 << 8); +} + +/********************************************************************* + * @fn SDIO_StopSDIOReadWait + * + * @brief Stops the SD I/O Read Wait operation. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_StopSDIOReadWait(FunctionalState NewState) +{ + if(NewState) + SDIO->DCTRL |= (1 << 9); + else + SDIO->DCTRL &= ~(1 << 9); +} + +/********************************************************************* + * @fn SDIO_SetSDIOReadWaitMode + * + * @brief Sets one of the two options of inserting read wait interval. + * + * @param SDIO_ReadWaitMode - SD I/O Read Wait operation mode. + * SDIO_ReadWaitMode_CLK - Read Wait control by stopping SDIOCLK + * SDIO_ReadWaitMode_DATA2 - Read Wait control using SDIO_DATA2 + * + * @return none + */ +void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) +{ + if(SDIO_ReadWaitMode) + SDIO->DCTRL |= (1 << 10); + else + SDIO->DCTRL &= ~(1 << 10); +} + +/********************************************************************* + * @fn SDIO_SetSDIOOperation + * + * @brief Enables or disables the SD I/O Mode Operation. + * + * @param NewState: ENABLE or DISABLE. + * + * @return none + */ +void SDIO_SetSDIOOperation(FunctionalState NewState) +{ + if(NewState) + SDIO->DCTRL |= (1 << 11); + else + SDIO->DCTRL &= ~(1 << 11); +} + +/********************************************************************* + * @fn SDIO_SendSDIOSuspendCmd + * + * @brief Enables or disables the SD I/O Mode suspend command sending. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_SendSDIOSuspendCmd(FunctionalState NewState) +{ + if(NewState) + SDIO->CMD |= (1 << 11); + else + SDIO->CMD &= ~(1 << 11); +} + +/********************************************************************* + * @fn SDIO_CommandCompletionCmd + * + * @brief Enables or disables the command completion signal. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_CommandCompletionCmd(FunctionalState NewState) +{ + if(NewState) + SDIO->CMD |= (1 << 12); + else + SDIO->CMD &= ~(1 << 12); +} + +/********************************************************************* + * @fn SDIO_CEATAITCmd + * + * @brief Enables or disables the CE-ATA interrupt. + * + * @param NewState - ENABLE or DISABLE. + * + * @return none + */ +void SDIO_CEATAITCmd(FunctionalState NewState) +{ + if(NewState) + SDIO->CMD |= (1 << 13); + else + SDIO->CMD &= ~(1 << 13); +} + +/********************************************************************* + * @fn SDIO_SendCEATACmd + * + * @brief Sends CE-ATA command (CMD61). + * + * @param NewState - ENABLE or DISABLE. + * + * @return RTC counter value + */ +void SDIO_SendCEATACmd(FunctionalState NewState) +{ + if(NewState) + SDIO->CMD |= (1 << 14); + else + SDIO->CMD &= ~(1 << 14); +} + +/********************************************************************* + * @fn SDIO_GetFlagStatus + * + * @brief Checks whether the specified SDIO flag is set or not. + * + * @param SDIO_FLAG - specifies the flag to check. + * SDIO_FLAG_CCRCFAIL - Command response received (CRC check failed) + * SDIO_FLAG_DCRCFAIL - Data block sent/received (CRC check failed) + * SDIO_FLAG_CTIMEOUT - Command response timeout + * SDIO_FLAG_DTIMEOUT - Data timeout + * SDIO_FLAG_TXUNDERR - Transmit FIFO underrun error + * SDIO_FLAG_RXOVERR - Received FIFO overrun error + * SDIO_FLAG_CMDREND - Command response received (CRC check passed) + * SDIO_FLAG_CMDSENT - Command sent (no response required) + * SDIO_FLAG_DATAEND - Data end (data counter, SDIDCOUNT, is zero) + * SDIO_FLAG_STBITERR - Start bit not detected on all data signals + * in wide bus mode. + * SDIO_FLAG_DBCKEND - Data block sent/received (CRC check passed) + * SDIO_FLAG_CMDACT - Command transfer in progress + * SDIO_FLAG_TXACT - Data transmit in progress + * SDIO_FLAG_RXACT - Data receive in progress + * SDIO_FLAG_TXFIFOHE - Transmit FIFO Half Empty + * SDIO_FLAG_RXFIFOHF - Receive FIFO Half Full + * SDIO_FLAG_TXFIFOF - Transmit FIFO full + * SDIO_FLAG_RXFIFOF - Receive FIFO full + * SDIO_FLAG_TXFIFOE - Transmit FIFO empty + * SDIO_FLAG_RXFIFOE - Receive FIFO empty + * SDIO_FLAG_TXDAVL - Data available in transmit FIFO + * SDIO_FLAG_RXDAVL - Data available in receive FIFO + * SDIO_FLAG_SDIOIT - SD I/O interrupt received + * SDIO_FLAG_CEATAEND - CE-ATA command completion signal received + * for CMD61 + * + * @return ITStatus - SET or RESET + */ +FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn SDIO_ClearFlag + * + * @brief Clears the SDIO's pending flags. + * + * @param SDIO_FLAG - specifies the flag to clear. + * SDIO_FLAG_CCRCFAIL - Command response received (CRC check failed) + * SDIO_FLAG_DCRCFAIL - Data block sent/received (CRC check failed) + * SDIO_FLAG_CTIMEOUT - Command response timeout + * SDIO_FLAG_DTIMEOUT - Data timeout + * SDIO_FLAG_TXUNDERR - Transmit FIFO underrun error + * SDIO_FLAG_RXOVERR - Received FIFO overrun error + * SDIO_FLAG_CMDREND - Command response received (CRC check passed) + * SDIO_FLAG_CMDSENT - Command sent (no response required) + * SDIO_FLAG_DATAEND - Data end (data counter, SDIDCOUNT, is zero) + * SDIO_FLAG_STBITERR - Start bit not detected on all data signals + * in wide bus mode + * SDIO_FLAG_DBCKEND - Data block sent/received (CRC check passed) + * SDIO_FLAG_SDIOIT - SD I/O interrupt received + * SDIO_FLAG_CEATAEND - CE-ATA command completion signal received for CMD61 + * + * @return none + */ +void SDIO_ClearFlag(uint32_t SDIO_FLAG) +{ + SDIO->ICR = SDIO_FLAG; +} + +/********************************************************************* + * @fn SDIO_GetITStatus + * + * @brief Checks whether the specified SDIO interrupt has occurred or not. + * + * @param SDIO_IT: specifies the SDIO interrupt source to check. + * SDIO_IT_CCRCFAIL - Command response received (CRC check failed) interrupt + * SDIO_IT_DCRCFAIL - Data block sent/received (CRC check failed) interrupt + * SDIO_IT_CTIMEOUT - Command response timeout interrupt + * SDIO_IT_DTIMEOUT - Data timeout interrupt + * SDIO_IT_TXUNDERR - Transmit FIFO underrun error interrupt + * SDIO_IT_RXOVERR - Received FIFO overrun error interrupt + * SDIO_IT_CMDREND - Command response received (CRC check passed) interrupt + * SDIO_IT_CMDSENT - Command sent (no response required) interrupt + * SDIO_IT_DATAEND - Data end (data counter, SDIDCOUNT, is zero) interrupt + * SDIO_IT_STBITERR - Start bit not detected on all data signals in wide + * bus mode interrupt + * SDIO_IT_DBCKEND - Data block sent/received (CRC check passed) interrupt + * SDIO_IT_CMDACT - Command transfer in progress interrupt + * SDIO_IT_TXACT - Data transmit in progress interrupt + * SDIO_IT_RXACT - Data receive in progress interrupt + * SDIO_IT_TXFIFOHE - Transmit FIFO Half Empty interrupt + * SDIO_IT_RXFIFOHF - Receive FIFO Half Full interrupt + * SDIO_IT_TXFIFOF - Transmit FIFO full interrupt + * SDIO_IT_RXFIFOF - Receive FIFO full interrupt + * SDIO_IT_TXFIFOE - Transmit FIFO empty interrupt + * SDIO_IT_RXFIFOE - Receive FIFO empty interrupt + * SDIO_IT_TXDAVL - Data available in transmit FIFO interrupt + * SDIO_IT_RXDAVL - Data available in receive FIFO interrupt + * SDIO_IT_SDIOIT - SD I/O interrupt received interrupt + * SDIO_IT_CEATAEND - CE-ATA command completion signal received for CMD61 interrupt + * + * @return ITStatus:SET or RESET + */ +ITStatus SDIO_GetITStatus(uint32_t SDIO_IT) +{ + ITStatus bitstatus = RESET; + + if((SDIO->STA & SDIO_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn SDIO_ClearITPendingBit + * + * @brief Clears the SDIO's interrupt pending bits. + * + * @param SDIO_IT - specifies the interrupt pending bit to clear. + * SDIO_IT_CCRCFAIL - Command response received (CRC check failed) interrupt + * SDIO_IT_DCRCFAIL - Data block sent/received (CRC check failed) interrupt + * SDIO_IT_CTIMEOUT - Command response timeout interrupt + * SDIO_IT_DTIMEOUT - Data timeout interrupt + * SDIO_IT_TXUNDERR - Transmit FIFO underrun error interrupt + * SDIO_IT_RXOVERR - Received FIFO overrun error interrupt + * SDIO_IT_CMDREND - Command response received (CRC check passed) interrupt + * SDIO_IT_CMDSENT - Command sent (no response required) interrupt + * SDIO_IT_DATAEND - Data end (data counter, SDIDCOUNT, is zero) interrupt + * SDIO_IT_STBITERR - Start bit not detected on all data signals in wide + * bus mode interrupt + * SDIO_IT_SDIOIT - SD I/O interrupt received interrupt + * SDIO_IT_CEATAEND - CE-ATA command completion signal received for CMD61 + * + * @return RTC counter value + */ +void SDIO_ClearITPendingBit(uint32_t SDIO_IT) +{ + SDIO->ICR = SDIO_IT; +} diff --git a/Peripheral/src/ch32v30x_spi.c b/Peripheral/src/ch32v30x_spi.c new file mode 100644 index 0000000..6b1fc6b --- /dev/null +++ b/Peripheral/src/ch32v30x_spi.c @@ -0,0 +1,668 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_spi.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the SPI firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_spi.h" +#include "ch32v30x_rcc.h" + +/* SPI SPE mask */ +#define CTLR1_SPE_Set ((uint16_t)0x0040) +#define CTLR1_SPE_Reset ((uint16_t)0xFFBF) + +/* I2S I2SE mask */ +#define I2SCFGR_I2SE_Set ((uint16_t)0x0400) +#define I2SCFGR_I2SE_Reset ((uint16_t)0xFBFF) + +/* SPI CRCNext mask */ +#define CTLR1_CRCNext_Set ((uint16_t)0x1000) + +/* SPI CRCEN mask */ +#define CTLR1_CRCEN_Set ((uint16_t)0x2000) +#define CTLR1_CRCEN_Reset ((uint16_t)0xDFFF) + +/* SPI SSOE mask */ +#define CTLR2_SSOE_Set ((uint16_t)0x0004) +#define CTLR2_SSOE_Reset ((uint16_t)0xFFFB) + +/* SPI registers Masks */ +#define CTLR1_CLEAR_Mask ((uint16_t)0x3040) +#define I2SCFGR_CLEAR_Mask ((uint16_t)0xF040) + +/* SPI or I2S mode selection masks */ +#define SPI_Mode_Select ((uint16_t)0xF7FF) +#define I2S_Mode_Select ((uint16_t)0x0800) + +/* I2S clock source selection masks */ +#define I2S2_CLOCK_SRC ((uint32_t)(0x00020000)) +#define I2S3_CLOCK_SRC ((uint32_t)(0x00040000)) +#define I2S_MUL_MASK ((uint32_t)(0x0000F000)) +#define I2S_DIV_MASK ((uint32_t)(0x000000F0)) + +/********************************************************************* + * @fn SPI_I2S_DeInit + * + * @brief Deinitializes the SPIx peripheral registers to their default + * reset values (Affects also the I2Ss). + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return none + */ +void SPI_I2S_DeInit(SPI_TypeDef *SPIx) +{ + if(SPIx == SPI1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE); + } + else if(SPIx == SPI2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE); + } + else + { + if(SPIx == SPI3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, DISABLE); + } + } +} + +/********************************************************************* + * @fn SPI_Init + * + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the SPI_InitStruct. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_InitStruct - pointer to a SPI_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral. + * + * @return none + */ +void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct) +{ + uint16_t tmpreg = 0; + + tmpreg = SPIx->CTLR1; + tmpreg &= CTLR1_CLEAR_Mask; + tmpreg |= (uint16_t)((uint32_t)SPI_InitStruct->SPI_Direction | SPI_InitStruct->SPI_Mode | + SPI_InitStruct->SPI_DataSize | SPI_InitStruct->SPI_CPOL | + SPI_InitStruct->SPI_CPHA | SPI_InitStruct->SPI_NSS | + SPI_InitStruct->SPI_BaudRatePrescaler | SPI_InitStruct->SPI_FirstBit); + + SPIx->CTLR1 = tmpreg; + SPIx->I2SCFGR &= SPI_Mode_Select; + SPIx->CRCR = SPI_InitStruct->SPI_CRCPolynomial; +} + +/********************************************************************* + * @fn I2S_Init + * + * @brief Initializes the SPIx peripheral according to the specified + * parameters in the I2S_InitStruct. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * (configured in I2S mode). + * I2S_InitStruct - pointer to an I2S_InitTypeDef structure that + * contains the configuration information for the specified SPI peripheral + * configured in I2S mode. + * + * @return none + */ +void I2S_Init(SPI_TypeDef *SPIx, I2S_InitTypeDef *I2S_InitStruct) +{ + uint16_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; + uint32_t tmp = 0; + RCC_ClocksTypeDef RCC_Clocks; + uint32_t sourceclock = 0; + + SPIx->I2SCFGR &= I2SCFGR_CLEAR_Mask; + SPIx->I2SPR = 0x0002; + tmpreg = SPIx->I2SCFGR; + + if(I2S_InitStruct->I2S_AudioFreq == I2S_AudioFreq_Default) + { + i2sodd = (uint16_t)0; + i2sdiv = (uint16_t)2; + } + else + { + if(I2S_InitStruct->I2S_DataFormat == I2S_DataFormat_16b) + { + packetlength = 1; + } + else + { + packetlength = 2; + } + + if(((uint32_t)SPIx) == SPI2_BASE) + { + tmp = I2S2_CLOCK_SRC; + } + else + { + tmp = I2S3_CLOCK_SRC; + } + + RCC_GetClocksFreq(&RCC_Clocks); + + sourceclock = RCC_Clocks.SYSCLK_Frequency; + + if(I2S_InitStruct->I2S_MCLKOutput == I2S_MCLKOutput_Enable) + { + tmp = (uint16_t)(((((sourceclock / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + else + { + tmp = (uint16_t)(((((sourceclock / (32 * packetlength)) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); + } + + tmp = tmp / 10; + i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); + i2sdiv = (uint16_t)((tmp - i2sodd) / 2); + i2sodd = (uint16_t)(i2sodd << 8); + } + + if((i2sdiv < 2) || (i2sdiv > 0xFF)) + { + i2sdiv = 2; + i2sodd = 0; + } + + SPIx->I2SPR = (uint16_t)(i2sdiv | (uint16_t)(i2sodd | (uint16_t)I2S_InitStruct->I2S_MCLKOutput)); + tmpreg |= (uint16_t)(I2S_Mode_Select | (uint16_t)(I2S_InitStruct->I2S_Mode | + (uint16_t)(I2S_InitStruct->I2S_Standard | (uint16_t)(I2S_InitStruct->I2S_DataFormat | + (uint16_t)I2S_InitStruct->I2S_CPOL)))); + SPIx->I2SCFGR = tmpreg; +} + +/********************************************************************* + * @fn SPI_StructInit + * + * @brief Fills each SPI_InitStruct member with its default value. + * + * @param SPI_InitStruct - pointer to a SPI_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct) +{ + SPI_InitStruct->SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStruct->SPI_Mode = SPI_Mode_Slave; + SPI_InitStruct->SPI_DataSize = SPI_DataSize_8b; + SPI_InitStruct->SPI_CPOL = SPI_CPOL_Low; + SPI_InitStruct->SPI_CPHA = SPI_CPHA_1Edge; + SPI_InitStruct->SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; + SPI_InitStruct->SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStruct->SPI_CRCPolynomial = 7; +} + +/********************************************************************* + * @fn I2S_StructInit + * + * @brief Fills each I2S_InitStruct member with its default value. + * + * @param I2S_InitStruct - pointer to a I2S_InitTypeDef structure which + * will be initialized. + * + * @return none + */ +void I2S_StructInit(I2S_InitTypeDef *I2S_InitStruct) +{ + I2S_InitStruct->I2S_Mode = I2S_Mode_SlaveTx; + I2S_InitStruct->I2S_Standard = I2S_Standard_Phillips; + I2S_InitStruct->I2S_DataFormat = I2S_DataFormat_16b; + I2S_InitStruct->I2S_MCLKOutput = I2S_MCLKOutput_Disable; + I2S_InitStruct->I2S_AudioFreq = I2S_AudioFreq_Default; + I2S_InitStruct->I2S_CPOL = I2S_CPOL_Low; +} + +/********************************************************************* + * @fn SPI_Cmd + * + * @brief Enables or disables the specified SPI peripheral. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void SPI_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR1 |= CTLR1_SPE_Set; + } + else + { + SPIx->CTLR1 &= CTLR1_SPE_Reset; + } +} + +/********************************************************************* + * @fn I2S_Cmd + * + * @brief Enables or disables the specified SPI peripheral (in I2S mode). + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void I2S_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->I2SCFGR |= I2SCFGR_I2SE_Set; + } + else + { + SPIx->I2SCFGR &= I2SCFGR_I2SE_Reset; + } +} + +/********************************************************************* + * @fn SPI_I2S_ITConfig + * + * @brief Enables or disables the specified SPI/I2S interrupts. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_IT - specifies the SPI/I2S interrupt source to be + * enabled or disabled. + * SPI_I2S_IT_TXE - Tx buffer empty interrupt mask. + * SPI_I2S_IT_RXNE - Rx buffer not empty interrupt mask. + * SPI_I2S_IT_ERR - Error interrupt mask. + * NewState: ENABLE or DISABLE. + * @return none + */ +void SPI_I2S_ITConfig(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState) +{ + uint16_t itpos = 0, itmask = 0; + + itpos = SPI_I2S_IT >> 4; + itmask = (uint16_t)1 << (uint16_t)itpos; + + if(NewState != DISABLE) + { + SPIx->CTLR2 |= itmask; + } + else + { + SPIx->CTLR2 &= (uint16_t)~itmask; + } +} + +/********************************************************************* + * @fn SPI_I2S_DMACmd + * + * @brief Enables or disables the SPIx/I2Sx DMA interface. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_DMAReq - specifies the SPI/I2S DMA transfer request to + * be enabled or disabled. + * SPI_I2S_DMAReq_Tx - Tx buffer DMA transfer request. + * SPI_I2S_DMAReq_Rx - Rx buffer DMA transfer request. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void SPI_I2S_DMACmd(SPI_TypeDef *SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR2 |= SPI_I2S_DMAReq; + } + else + { + SPIx->CTLR2 &= (uint16_t)~SPI_I2S_DMAReq; + } +} + +/********************************************************************* + * @fn SPI_I2S_SendData + * + * @brief Transmits a Data through the SPIx/I2Sx peripheral. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * Data - Data to be transmitted. + * + * @return none + */ +void SPI_I2S_SendData(SPI_TypeDef *SPIx, uint16_t Data) +{ + SPIx->DATAR = Data; +} + +/********************************************************************* + * @fn SPI_I2S_ReceiveData + * + * @brief Returns the most recent received data by the SPIx/I2Sx peripheral. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * Data - Data to be transmitted. + * + * @return SPIx->DATAR - The value of the received data. + */ +uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx) +{ + return SPIx->DATAR; +} + +/********************************************************************* + * @fn SPI_NSSInternalSoftwareConfig + * + * @brief Configures internally by software the NSS pin for the selected SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_NSSInternalSoft - + * SPI_NSSInternalSoft_Set - Set NSS pin internally. + * SPI_NSSInternalSoft_Reset - Reset NSS pin internally. + * + * @return none + */ +void SPI_NSSInternalSoftwareConfig(SPI_TypeDef *SPIx, uint16_t SPI_NSSInternalSoft) +{ + if(SPI_NSSInternalSoft != SPI_NSSInternalSoft_Reset) + { + SPIx->CTLR1 |= SPI_NSSInternalSoft_Set; + } + else + { + SPIx->CTLR1 &= SPI_NSSInternalSoft_Reset; + } +} + +/********************************************************************* + * @fn SPI_SSOutputCmd + * + * @brief Enables or disables the SS output for the selected SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - new state of the SPIx SS output. + * + * @return none + */ +void SPI_SSOutputCmd(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR2 |= CTLR2_SSOE_Set; + } + else + { + SPIx->CTLR2 &= CTLR2_SSOE_Reset; + } +} + +/********************************************************************* + * @fn SPI_DataSizeConfig + * + * @brief Configures the data size for the selected SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_DataSize - specifies the SPI data size. + * SPI_DataSize_16b - Set data frame format to 16bit. + * SPI_DataSize_8b - Set data frame format to 8bit. + * + * @return none + */ +void SPI_DataSizeConfig(SPI_TypeDef *SPIx, uint16_t SPI_DataSize) +{ + SPIx->CTLR1 &= (uint16_t)~SPI_DataSize_16b; + SPIx->CTLR1 |= SPI_DataSize; +} + +/********************************************************************* + * @fn SPI_TransmitCRC + * + * @brief Transmit the SPIx CRC value. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return none + */ +void SPI_TransmitCRC(SPI_TypeDef *SPIx) +{ + SPIx->CTLR1 |= CTLR1_CRCNext_Set; +} + +/********************************************************************* + * @fn SPI_CalculateCRC + * + * @brief Enables or disables the CRC value calculation of the transferred bytes. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * NewState - new state of the SPIx CRC value calculation. + * + * @return none + */ +void SPI_CalculateCRC(SPI_TypeDef *SPIx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + SPIx->CTLR1 |= CTLR1_CRCEN_Set; + } + else + { + SPIx->CTLR1 &= CTLR1_CRCEN_Reset; + } +} + +/********************************************************************* + * @fn SPI_GetCRC + * + * @brief Returns the transmit or the receive CRC register value for the specified SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_CRC - specifies the CRC register to be read. + * SPI_CRC_Tx - Selects Tx CRC register. + * SPI_CRC_Rx - Selects Rx CRC register. + * + * @return crcreg: The selected CRC register value. + */ +uint16_t SPI_GetCRC(SPI_TypeDef *SPIx, uint8_t SPI_CRC) +{ + uint16_t crcreg = 0; + + if(SPI_CRC != SPI_CRC_Rx) + { + crcreg = SPIx->TCRCR; + } + else + { + crcreg = SPIx->RCRCR; + } + + return crcreg; +} + +/********************************************************************* + * @fn SPI_GetCRCPolynomial + * + * @brief Returns the CRC Polynomial register value for the specified SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * + * @return SPIx->CRCR - The CRC Polynomial register value. + */ +uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx) +{ + return SPIx->CRCR; +} + +/********************************************************************* + * @fn SPI_BiDirectionalLineConfig + * + * @brief Selects the data transfer direction in bi-directional mode + * for the specified SPI. + * + * @param SPIx - where x can be 1, 2 or 3 to select the SPI peripheral. + * SPI_Direction - specifies the data transfer direction in + * bi-directional mode. + * SPI_Direction_Tx - Selects Tx transmission direction. + * SPI_Direction_Rx - Selects Rx receive direction. + * + * @return none + */ +void SPI_BiDirectionalLineConfig(SPI_TypeDef *SPIx, uint16_t SPI_Direction) +{ + if(SPI_Direction == SPI_Direction_Tx) + { + SPIx->CTLR1 |= SPI_Direction_Tx; + } + else + { + SPIx->CTLR1 &= SPI_Direction_Rx; + } +} + +/********************************************************************* + * @fn SPI_I2S_GetFlagStatus + * + * @brief Checks whether the specified SPI/I2S flag is set or not. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_FLAG - specifies the SPI/I2S flag to check. + * SPI_I2S_FLAG_TXE - Transmit buffer empty flag. + * SPI_I2S_FLAG_RXNE - Receive buffer not empty flag. + * SPI_I2S_FLAG_BSY - Busy flag. + * SPI_I2S_FLAG_OVR - Overrun flag. + * SPI_FLAG_MODF - Mode Fault flag. + * SPI_FLAG_CRCERR - CRC Error flag. + * I2S_FLAG_UDR - Underrun Error flag. + * I2S_FLAG_CHSIDE - Channel Side flag. + * + * @return FlagStatus: SET or RESET. + */ +FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((SPIx->STATR & SPI_I2S_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn SPI_I2S_ClearFlag + * + * @brief Clears the SPIx CRC Error (CRCERR) flag. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_FLAG - specifies the SPI flag to clear. + * SPI_FLAG_CRCERR - CRC Error flag. + * Note- + * - OVR (OverRun error) flag is cleared by software sequence: a read + * operation to SPI_DATAR register (SPI_I2S_ReceiveData()) followed by a read + * operation to SPI_STATR register (SPI_I2S_GetFlagStatus()). + * - UDR (UnderRun error) flag is cleared by a read operation to + * SPI_STATR register (SPI_I2S_GetFlagStatus()). + * - MODF (Mode Fault) flag is cleared by software sequence: a read/write + * operation to SPI_STATR register (SPI_I2S_GetFlagStatus()) followed by a + * write operation to SPI_CTLR1 register (SPI_Cmd() to enable the SPI). + * @return FlagStatus: SET or RESET. + */ +void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG) +{ + SPIx->STATR = (uint16_t)~SPI_I2S_FLAG; +} + +/********************************************************************* + * @fn SPI_I2S_GetITStatus + * + * @brief Checks whether the specified SPI/I2S interrupt has occurred or not. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * - 2 or 3 in I2S mode. + * SPI_I2S_IT - specifies the SPI/I2S interrupt source to check.. + * SPI_I2S_IT_TXE - Transmit buffer empty interrupt. + * SPI_I2S_IT_RXNE - Receive buffer not empty interrupt. + * SPI_I2S_IT_OVR - Overrun interrupt. + * SPI_IT_MODF - Mode Fault interrupt. + * SPI_IT_CRCERR - CRC Error interrupt. + * I2S_IT_UDR - Underrun Error interrupt. + * + * @return FlagStatus: SET or RESET. + */ +ITStatus SPI_I2S_GetITStatus(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itpos = 0, itmask = 0, enablestatus = 0; + + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + itmask = SPI_I2S_IT >> 4; + itmask = 0x01 << itmask; + enablestatus = (SPIx->CTLR2 & itmask); + + if(((SPIx->STATR & itpos) != (uint16_t)RESET) && enablestatus) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn SPI_I2S_ClearITPendingBit + * + * @brief Clears the SPIx CRC Error (CRCERR) interrupt pending bit. + * + * @param SPIx - where x can be + * - 1, 2 or 3 in SPI mode. + * SPI_I2S_IT - specifies the SPI interrupt pending bit to clear. + * SPI_IT_CRCERR - CRC Error interrupt. + * Note- + * - OVR (OverRun Error) interrupt pending bit is cleared by software + * sequence: a read operation to SPI_DATAR register (SPI_I2S_ReceiveData()) + * followed by a read operation to SPI_STATR register (SPI_I2S_GetITStatus()). + * - UDR (UnderRun Error) interrupt pending bit is cleared by a read + * operation to SPI_STATR register (SPI_I2S_GetITStatus()). + * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_STATR register (SPI_I2S_GetITStatus()) + * followed by a write operation to SPI_CTLR1 register (SPI_Cmd() to enable + * the SPI). + * @return none + */ +void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT) +{ + uint16_t itpos = 0; + + itpos = 0x01 << (SPI_I2S_IT & 0x0F); + SPIx->STATR = (uint16_t)~itpos; +} diff --git a/Peripheral/src/ch32v30x_tim.c b/Peripheral/src/ch32v30x_tim.c new file mode 100644 index 0000000..0ac663d --- /dev/null +++ b/Peripheral/src/ch32v30x_tim.c @@ -0,0 +1,2362 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_tim.c +* Author : WCH +* Version : V1.0.1 +* Date : 2025/07/04 +* Description : This file provides all the TIM firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_tim.h" +#include "ch32v30x_rcc.h" + +/* TIM registers bit mask */ +#define SMCFGR_ETR_Mask ((uint16_t)0x00FF) +#define CHCTLR_Offset ((uint16_t)0x0018) +#define CCER_CCE_Set ((uint16_t)0x0001) +#define CCER_CCNE_Set ((uint16_t)0x0004) + +static void TI1_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI2_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI3_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); +static void TI4_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter); + +/********************************************************************* + * @fn TIM_DeInit + * + * @brief Deinitializes the TIMx peripheral registers to their default + * reset values. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * + * @return none + */ +void TIM_DeInit(TIM_TypeDef *TIMx) +{ + if(TIMx == TIM1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE); + } + else if(TIMx == TIM8) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE); + } + else if(TIMx == TIM9) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE); + } + else if(TIMx == TIM10) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE); + } + else if(TIMx == TIM2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE); + } + else if(TIMx == TIM3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE); + } + else if(TIMx == TIM4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE); + } + else if(TIMx == TIM5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE); + } + else if(TIMx == TIM6) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE); + } + else if(TIMx == TIM7) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE); + } +} + +/********************************************************************* + * @fn TIM_TimeBaseInit + * + * @brief Initializes the TIMx Time Base Unit peripheral according to + * the specified parameters in the TIM_TimeBaseInitStruct. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * TIM_TimeBaseInitStruct - pointer to a TIM_TimeBaseInitTypeDef + * structure. + * + * @return none + */ +void TIM_TimeBaseInit(TIM_TypeDef *TIMx, TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct) +{ + uint16_t tmpcr1 = 0; + uint32_t temper1 = 0; + temper1 = ((*( uint32_t * )0x1FFFF704) & 0x000000F0) >> 4; + tmpcr1 = TIMx->CTLR1; + + if(((temper1>=4)&&(temper1<=8))&&((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10))) + { + tmpcr1 |= 1<<13; + } + + if((TIMx == TIM1) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || + (TIMx == TIM5) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10)) + { + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_DIR | TIM_CMS))); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; + } + + if((TIMx != TIM6) && (TIMx != TIM7)) + { + tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CTLR1_CKD)); + tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; + } + + TIMx->CTLR1 = tmpcr1; + TIMx->ATRLR = TIM_TimeBaseInitStruct->TIM_Period; + TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10)) + { + TIMx->RPTCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; + } + + TIMx->SWEVGR = TIM_PSCReloadMode_Immediate; +} + +/********************************************************************* + * @fn TIM_OC1Init + * + * @brief Initializes the TIMx Channel1 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC1Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CC1E); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR1; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC1M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC1S)); + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1P)); + tmpccer |= TIM_OCInitStruct->TIM_OCPolarity; + tmpccer |= TIM_OCInitStruct->TIM_OutputState; + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10)) + { + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1NP)); + tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity; + + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC1NE)); + tmpccer |= TIM_OCInitStruct->TIM_OutputNState; + + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS1)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS1N)); + + tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState; + tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState; + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR1 = tmpccmrx; + TIMx->CH1CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC2Init + * + * @brief Initializes the TIMx Channel2 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC2Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC2E)); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR1; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC2M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC2S)); + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2P)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10)) + { + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2NP)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC2NE)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4); + + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS2)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS2N)); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2); + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR1 = tmpccmrx; + TIMx->CH2CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC3Init + * + * @brief Initializes the TIMx Channel3 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC3Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC3E)); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR2; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC3M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC3S)); + tmpccmrx |= TIM_OCInitStruct->TIM_OCMode; + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3P)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10)) + { + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3NP)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC3NE)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS3)); + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS3N)); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4); + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR2 = tmpccmrx; + TIMx->CH3CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC4Init + * + * @brief Initializes the TIMx Channel4 according to the specified + * parameters in the TIM_OCInitStruct. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OC4Init(TIM_TypeDef *TIMx, TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0; + + TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CC4E)); + tmpccer = TIMx->CCER; + tmpcr2 = TIMx->CTLR2; + tmpccmrx = TIMx->CHCTLR2; + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_OC4M)); + tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CC4S)); + tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8); + tmpccer &= (uint16_t)(~((uint16_t)TIM_CC4P)); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12); + tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12); + + if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM9) || (TIMx == TIM10)) + { + tmpcr2 &= (uint16_t)(~((uint16_t)TIM_OIS4)); + tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6); + } + + TIMx->CTLR2 = tmpcr2; + TIMx->CHCTLR2 = tmpccmrx; + TIMx->CH4CVR = TIM_OCInitStruct->TIM_Pulse; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_ICInit + * + * @brief IInitializes the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct. + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure. + * + * @return none + */ +void TIM_ICInit(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct) +{ + if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_2) + { + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_3) + { + TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, + TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/********************************************************************* + * @fn TIM_PWMIConfig + * + * @brief Configures the TIM peripheral according to the specified + * parameters in the TIM_ICInitStruct to measure an external + * PWM signal. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure. + * + * @return none + */ +void TIM_PWMIConfig(TIM_TypeDef *TIMx, TIM_ICInitTypeDef *TIM_ICInitStruct) +{ + uint16_t icoppositepolarity = TIM_ICPolarity_Rising; + uint16_t icoppositeselection = TIM_ICSelection_DirectTI; + + if(TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising) + { + icoppositepolarity = TIM_ICPolarity_Falling; + } + else + { + icoppositepolarity = TIM_ICPolarity_Rising; + } + + if(TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI) + { + icoppositeselection = TIM_ICSelection_IndirectTI; + } + else + { + icoppositeselection = TIM_ICSelection_DirectTI; + } + + if(TIM_ICInitStruct->TIM_Channel == TIM_Channel_1) + { + TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } + else + { + TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection, + TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter); + TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler); + } +} + +/********************************************************************* + * @fn TIM_BDTRConfig + * + * @brief Configures the: Break feature, dead time, Lock level, the OSSI, + * the OSSR State and the AOE(automatic output enable). + * + * @param TIMx - where x can be (1 8 9 10) to select the TIM peripheral. + * TIM_BDTRInitStruct - pointer to a TIM_BDTRInitTypeDef structure. + * + * @return none + */ +void TIM_BDTRConfig(TIM_TypeDef *TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) +{ + TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState | + TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime | + TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity | + TIM_BDTRInitStruct->TIM_AutomaticOutput; +} + +/********************************************************************* + * @fn TIM_TimeBaseStructInit + * + * @brief Fills each TIM_TimeBaseInitStruct member with its default value. + * + * @param TIM_TimeBaseInitStruct - pointer to a TIM_TimeBaseInitTypeDef structure. + * + * @return none + */ +void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef *TIM_TimeBaseInitStruct) +{ + TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF; + TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000; + TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000; +} + +/********************************************************************* + * @fn TIM_OCStructInit + * + * @brief Fills each TIM_OCInitStruct member with its default value. + * + * @param TIM_OCInitStruct - pointer to a TIM_OCInitTypeDef structure. + * + * @return none + */ +void TIM_OCStructInit(TIM_OCInitTypeDef *TIM_OCInitStruct) +{ + TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing; + TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable; + TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable; + TIM_OCInitStruct->TIM_Pulse = 0x0000; + TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High; + TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset; + TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset; +} + +/********************************************************************* + * @fn TIM_ICStructInit + * + * @brief Fills each TIM_ICInitStruct member with its default value. + * + * @param TIM_ICInitStruct - pointer to a TIM_ICInitTypeDef structure. + * + * @return none + */ +void TIM_ICStructInit(TIM_ICInitTypeDef *TIM_ICInitStruct) +{ + TIM_ICInitStruct->TIM_Channel = TIM_Channel_1; + TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising; + TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI; + TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1; + TIM_ICInitStruct->TIM_ICFilter = 0x00; +} + +/********************************************************************* + * @fn TIM_BDTRStructInit + * + * @brief Fills each TIM_BDTRInitStruct member with its default value. + * + * @param TIM_BDTRInitStruct - pointer to a TIM_BDTRInitTypeDef structure. + * + * @return none + */ +void TIM_BDTRStructInit(TIM_BDTRInitTypeDef *TIM_BDTRInitStruct) +{ + TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable; + TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable; + TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF; + TIM_BDTRInitStruct->TIM_DeadTime = 0x00; + TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable; + TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low; + TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; +} + +/********************************************************************* + * @fn TIM_Cmd + * + * @brief Enables or disables the specified TIM peripheral. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_Cmd(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR1 |= TIM_CEN; + } + else + { + TIMx->CTLR1 &= (uint16_t)(~((uint16_t)TIM_CEN)); + } +} + +/********************************************************************* + * @fn TIM_CtrlPWMOutputs + * + * @brief Enables or disables the TIM peripheral Main Outputs. + * + * @param TIMx - where x can be 1/8/9/10 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_CtrlPWMOutputs(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->BDTR |= TIM_MOE; + } + else + { + TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_MOE)); + } +} + +/********************************************************************* + * @fn TIM_ITConfig + * + * @brief Enables or disables the specified TIM interrupts. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * TIM_IT - specifies the TIM interrupts sources to be enabled or disabled. + * TIM_IT_Update - TIM update Interrupt source. + * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source. + * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source + * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source. + * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source. + * TIM_IT_COM - TIM Commutation Interrupt source. + * TIM_IT_Trigger - TIM Trigger Interrupt source. + * TIM_IT_Break - TIM Break Interrupt source. + * TIM6/TIM7 only have TIM_IT_Update. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_ITConfig(TIM_TypeDef *TIMx, uint16_t TIM_IT, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->DMAINTENR |= TIM_IT; + } + else + { + TIMx->DMAINTENR &= (uint16_t)~TIM_IT; + } +} + +/********************************************************************* + * @fn TIM_GenerateEvent + * + * @brief Configures the TIMx event to be generate by software. + * + * @param TIMx - where x can be 1 to 10 to general Event. + * TIM_EventSource + * TIM_EventSource_Update - Update Event. + * TIM_EventSource_CC1 - TIM Capture Compare 1 Event. + * TIM_EventSource_CC2 - TIM Capture Compare 2 Event. + * TIM_EventSource_CC3 - TIM Capture Compare 3 Event. + * TIM_EventSource_CC4 - TIM Capture Compare 4 Event. + * TIM_EventSource_COM - TIM Commutation Event. + * TIM_EventSource_Trigger - TIM Trigger Event. + * TIM_EventSource_Break - TIM Break Event. + * TIM6/TIM7 only have TIM_EventSource_Update. + * @return none + */ +void TIM_GenerateEvent(TIM_TypeDef *TIMx, uint16_t TIM_EventSource) +{ + TIMx->SWEVGR = TIM_EventSource; +} + +/********************************************************************* + * @fn TIM_DMAConfig + * + * @brief Configures the TIMx's DMA interface. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_DMABase: DMA Base address. + * TIM_DMABase_CR. + * TIM_DMABase_CR2. + * TIM_DMABase_SMCR. + * TIM_DMABase_DIER. + * TIM1_DMABase_SR. + * TIM_DMABase_EGR. + * TIM_DMABase_CCMR1. + * TIM_DMABase_CCMR2. + * TIM_DMABase_CCER. + * TIM_DMABase_CNT. + * TIM_DMABase_PSC. + * TIM_DMABase_CCR1. + * TIM_DMABase_CCR2. + * TIM_DMABase_CCR3. + * TIM_DMABase_CCR4. + * TIM_DMABase_BDTR. + * TIM_DMABase_DCR. + * TIM_DMABurstLength - DMA Burst length. + * TIM_DMABurstLength_1Transfer. + * TIM_DMABurstLength_18Transfers. + * + * @return none + */ +void TIM_DMAConfig(TIM_TypeDef *TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength) +{ + TIMx->DMACFGR = TIM_DMABase | TIM_DMABurstLength; +} + +/********************************************************************* + * @fn TIM_DMACmd + * + * @brief Enables or disables the TIMx's DMA Requests. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * TIM_DMASource - specifies the DMA Request sources. + * TIM_DMA_Update - TIM update Interrupt source. + * TIM_DMA_CC1 - TIM Capture Compare 1 DMA source. + * TIM_DMA_CC2 - TIM Capture Compare 2 DMA source. + * TIM_DMA_CC3 - TIM Capture Compare 3 DMA source. + * TIM_DMA_CC4 - TIM Capture Compare 4 DMA source. + * TIM_DMA_COM - TIM Commutation DMA source. + * TIM_DMA_Trigger - TIM Trigger DMA source. + * TIM6/TIM7 only have TIM_DMA_Update + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_DMACmd(TIM_TypeDef *TIMx, uint16_t TIM_DMASource, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->DMAINTENR |= TIM_DMASource; + } + else + { + TIMx->DMAINTENR &= (uint16_t)~TIM_DMASource; + } +} + +/********************************************************************* + * @fn TIM_InternalClockConfig + * + * @brief Configures the TIMx internal Clock. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * + * @return none + */ +void TIM_InternalClockConfig(TIM_TypeDef *TIMx) +{ + TIMx->SMCFGR &= (uint16_t)(~((uint16_t)TIM_SMS)); +} + +/********************************************************************* + * @fn TIM_ITRxExternalClockConfig + * + * @brief Configures the TIMx Internal Trigger as External Clock. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_InputTriggerSource: Trigger source. + * TIM_TS_ITR0 - Internal Trigger 0. + * TIM_TS_ITR1 - Internal Trigger 1. + * TIM_TS_ITR2 - Internal Trigger 2. + * TIM_TS_ITR3 - Internal Trigger 3. + * + * @return none + */ +void TIM_ITRxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource) +{ + TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource); + TIMx->SMCFGR |= TIM_SlaveMode_External1; +} + +/********************************************************************* + * @fn TIM_TIxExternalClockConfig + * + * @brief Configures the TIMx Trigger as External Clock. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_TIxExternalCLKSource - Trigger source. + * TIM_TIxExternalCLK1Source_TI1ED - TI1 Edge Detector. + * TIM_TIxExternalCLK1Source_TI1 - Filtered Timer Input 1. + * TIM_TIxExternalCLK1Source_TI2 - Filtered Timer Input 2. + * TIM_ICPolarity - specifies the TIx Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_DMA_COM - TIM Commutation DMA source. + * TIM_DMA_Trigger - TIM Trigger DMA source. + * ICFilter - specifies the filter value. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_TIxExternalClockConfig(TIM_TypeDef *TIMx, uint16_t TIM_TIxExternalCLKSource, + uint16_t TIM_ICPolarity, uint16_t ICFilter) +{ + if(TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2) + { + TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + else + { + TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter); + } + + TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource); + TIMx->SMCFGR |= TIM_SlaveMode_External1; +} + +/********************************************************************* + * @fn TIM_ETRClockMode1Config + * + * @brief Configures the External clock Mode1. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ExtTRGPrescaler - The external Trigger Prescaler. + * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF. + * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2. + * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4. + * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8. + * TIM_ExtTRGPolarity - The external Trigger Polarity. + * TIM_ExtTRGPolarity_Inverted - active low or falling edge active. + * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active. + * ExtTRGFilter - External Trigger Filter. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_ETRClockMode1Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + tmpsmcr = TIMx->SMCFGR; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS)); + tmpsmcr |= TIM_SlaveMode_External1; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS)); + tmpsmcr |= TIM_TS_ETRF; + TIMx->SMCFGR = tmpsmcr; +} + +/********************************************************************* + * @fn TIM_ETRClockMode2Config + * + * @brief Configures the External clock Mode2. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ExtTRGPrescaler - The external Trigger Prescaler. + * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF. + * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2. + * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4. + * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8. + * TIM_ExtTRGPolarity - The external Trigger Polarity. + * TIM_ExtTRGPolarity_Inverted - active low or falling edge active. + * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active. + * ExtTRGFilter - External Trigger Filter. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_ETRClockMode2Config(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, + uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter) +{ + TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter); + TIMx->SMCFGR |= TIM_ECE; +} + +/********************************************************************* + * @fn TIM_ETRConfig + * + * @brief Configures the TIMx External Trigger (ETR). + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ExtTRGPrescaler - The external Trigger Prescaler. + * TIM_ExtTRGPSC_OFF - ETRP Prescaler OFF. + * TIM_ExtTRGPSC_DIV2 - ETRP frequency divided by 2. + * TIM_ExtTRGPSC_DIV4 - ETRP frequency divided by 4. + * TIM_ExtTRGPSC_DIV8 - ETRP frequency divided by 8. + * TIM_ExtTRGPolarity - The external Trigger Polarity. + * TIM_ExtTRGPolarity_Inverted - active low or falling edge active. + * TIM_ExtTRGPolarity_NonInverted - active high or rising edge active. + * ExtTRGFilter - External Trigger Filter. + * This parameter must be a value between 0x0 and 0xF. + * + * @return none + */ +void TIM_ETRConfig(TIM_TypeDef *TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, + uint16_t ExtTRGFilter) +{ + uint16_t tmpsmcr = 0; + + tmpsmcr = TIMx->SMCFGR; + tmpsmcr &= SMCFGR_ETR_Mask; + tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8))); + TIMx->SMCFGR = tmpsmcr; +} + +/********************************************************************* + * @fn TIM_PrescalerConfig + * + * @brief Configures the TIMx Prescaler. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * Prescaler - specifies the Prescaler Register value. + * TIM_PSCReloadMode - specifies the TIM Prescaler Reload mode. + * TIM_PSCReloadMode - specifies the TIM Prescaler Reload mode. + * TIM_PSCReloadMode_Update - The Prescaler is loaded at the update event. + * TIM_PSCReloadMode_Immediate - The Prescaler is loaded immediately. + * + * @return none + */ +void TIM_PrescalerConfig(TIM_TypeDef *TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode) +{ + TIMx->PSC = Prescaler; + TIMx->SWEVGR = TIM_PSCReloadMode; +} + +/********************************************************************* + * @fn TIM_CounterModeConfig + * + * @brief Specifies the TIMx Counter Mode to be used. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_CounterMode - specifies the Counter Mode to be used. + * TIM_CounterMode_Up - TIM Up Counting Mode. + * TIM_CounterMode_Down - TIM Down Counting Mode. + * TIM_CounterMode_CenterAligned1 - TIM Center Aligned Mode1. + * TIM_CounterMode_CenterAligned2 - TIM Center Aligned Mode2. + * TIM_CounterMode_CenterAligned3 - TIM Center Aligned Mode3. + * + * @return none + */ +void TIM_CounterModeConfig(TIM_TypeDef *TIMx, uint16_t TIM_CounterMode) +{ + uint16_t tmpcr1 = 0; + + tmpcr1 = TIMx->CTLR1; + tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_DIR | TIM_CMS))); + tmpcr1 |= TIM_CounterMode; + TIMx->CTLR1 = tmpcr1; +} + +/********************************************************************* + * @fn TIM_SelectInputTrigger + * + * @brief Selects the Input Trigger source. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_InputTriggerSource - The Input Trigger source. + * TIM_TS_ITR0 - Internal Trigger 0. + * TIM_TS_ITR1 - Internal Trigger 1. + * TIM_TS_ITR2 - Internal Trigger 2. + * TIM_TS_ITR3 - Internal Trigger 3. + * TIM_TS_TI1F_ED - TI1 Edge Detector. + * TIM_TS_TI1FP1 - Filtered Timer Input 1. + * TIM_TS_TI2FP2 - Filtered Timer Input 2. + * TIM_TS_ETRF - External Trigger input. + * + * @return none + */ +void TIM_SelectInputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_InputTriggerSource) +{ + uint16_t tmpsmcr = 0; + + tmpsmcr = TIMx->SMCFGR; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_TS)); + tmpsmcr |= TIM_InputTriggerSource; + TIMx->SMCFGR = tmpsmcr; +} + +/********************************************************************* + * @fn TIM_EncoderInterfaceConfig + * + * @brief Configures the TIMx Encoder Interface. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_EncoderMode - specifies the TIMx Encoder Mode. + * TIM_EncoderMode_TI1 - Counter counts on TI1FP1 edge depending + * on TI2FP2 level. + * TIM_EncoderMode_TI2 - Counter counts on TI2FP2 edge depending + * on TI1FP1 level. + * TIM_EncoderMode_TI12 - Counter counts on both TI1FP1 and + * TI2FP2 edges depending. + * TIM_IC1Polarity - specifies the IC1 Polarity. + * TIM_ICPolarity_Falling - IC Falling edge. + * TTIM_ICPolarity_Rising - IC Rising edge. + * TIM_IC2Polarity - specifies the IC2 Polarity. + * TIM_ICPolarity_Falling - IC Falling edge. + * TIM_ICPolarity_Rising - IC Rising edge. + * + * @return none + */ +void TIM_EncoderInterfaceConfig(TIM_TypeDef *TIMx, uint16_t TIM_EncoderMode, + uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) +{ + uint16_t tmpsmcr = 0; + uint16_t tmpccmr1 = 0; + uint16_t tmpccer = 0; + + tmpsmcr = TIMx->SMCFGR; + tmpccmr1 = TIMx->CHCTLR1; + tmpccer = TIMx->CCER; + tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMS)); + tmpsmcr |= TIM_EncoderMode; + tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1S)) & (uint16_t)(~((uint16_t)TIM_CC2S))); + tmpccmr1 |= TIM_CC1S_0 | TIM_CC2S_0; + tmpccer &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1P)) & ((uint16_t) ~((uint16_t)TIM_CC2P))); + tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4)); + TIMx->SMCFGR = tmpsmcr; + TIMx->CHCTLR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_ForcedOC1Config + * + * @brief Forces the TIMx output 1 waveform to active or inactive level. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC1REF. + * TIM_ForcedAction_InActive - Force inactive level on OC1REF. + * + * @return none + */ +void TIM_ForcedOC1Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1M); + tmpccmr1 |= TIM_ForcedAction; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ForcedOC2Config + * + * @brief Forces the TIMx output 2 waveform to active or inactive level. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC2REF. + * TIM_ForcedAction_InActive - Force inactive level on OC2REF. + * + * @return none + */ +void TIM_ForcedOC2Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2M); + tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ForcedOC3Config + * + * @brief Forces the TIMx output 3 waveform to active or inactive level. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC3REF. + * TIM_ForcedAction_InActive - Force inactive level on OC3REF. + * + * @return none + */ +void TIM_ForcedOC3Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3M); + tmpccmr2 |= TIM_ForcedAction; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ForcedOC4Config + * + * @brief Forces the TIMx output 4 waveform to active or inactive level. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_ForcedAction - specifies the forced Action to be set to the + * output waveform. + * TIM_ForcedAction_Active - Force active level on OC4REF. + * TIM_ForcedAction_InActive - Force inactive level on OC4REF. + * + * @return none + */ +void TIM_ForcedOC4Config(TIM_TypeDef *TIMx, uint16_t TIM_ForcedAction) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4M); + tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ARRPreloadConfig + * + * @brief Enables or disables TIMx peripheral Preload register on ARR. + * + * @param TIMx - where x can be 1 to 10 to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_ARRPreloadConfig(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR1 |= TIM_ARPE; + } + else + { + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_ARPE); + } +} + +/********************************************************************* + * @fn TIM_SelectCOM + * + * @brief Selects the TIM peripheral Commutation event. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_SelectCOM(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_CCUS; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCUS); + } +} + +/********************************************************************* + * @fn TIM_SelectCCDMA + * + * @brief Selects the TIMx peripheral Capture Compare DMA source. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_SelectCCDMA(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_CCDS; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCDS); + } +} + +/********************************************************************* + * @fn TIM_CCPreloadControl + * + * @brief DSets or Resets the TIM peripheral Capture Compare Preload Control bit. + * reset values (Affects also the I2Ss). + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_CCPreloadControl(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_CCPC; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_CCPC); + } +} + +/********************************************************************* + * @fn TIM_OC1PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR1. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC1PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1PE); + tmpccmr1 |= TIM_OCPreload; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC2PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR2. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC2PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2PE); + tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC3PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR3. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC3PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3PE); + tmpccmr2 |= TIM_OCPreload; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC4PreloadConfig + * + * @brief Enables or disables the TIMx peripheral Preload register on CCR4. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCPreload - new state of the TIMx peripheral Preload register. + * TIM_OCPreload_Enable. + * TIM_OCPreload_Disable. + * + * @return none + */ +void TIM_OC4PreloadConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPreload) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4PE); + tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC1FastConfig + * + * @brief Configures the TIMx Output Compare 1 Fast feature. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC1FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1FE); + tmpccmr1 |= TIM_OCFast; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC2FastConfig + * + * @brief Configures the TIMx Output Compare 2 Fast feature. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC2FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2FE); + tmpccmr1 |= (uint16_t)(TIM_OCFast << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_OC3FastConfig + * + * @brief Configures the TIMx Output Compare 3 Fast feature. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC3FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3FE); + tmpccmr2 |= TIM_OCFast; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC4FastConfig + * + * @brief Configures the TIMx Output Compare 4 Fast feature. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCFast - new state of the Output Compare Fast Enable Bit. + * TIM_OCFast_Enable - TIM output compare fast enable. + * TIM_OCFast_Disable - TIM output compare fast disable. + * + * @return none + */ +void TIM_OC4FastConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCFast) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4FE); + tmpccmr2 |= (uint16_t)(TIM_OCFast << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ClearOC1Ref + * + * @brief Clears or safeguards the OCREF1 signal on an external event. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC1Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC1CE); + tmpccmr1 |= TIM_OCClear; + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ClearOC2Ref + * + * @brief Clears or safeguards the OCREF2 signal on an external event. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC2Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr1 = 0; + + tmpccmr1 = TIMx->CHCTLR1; + tmpccmr1 &= (uint16_t) ~((uint16_t)TIM_OC2CE); + tmpccmr1 |= (uint16_t)(TIM_OCClear << 8); + TIMx->CHCTLR1 = tmpccmr1; +} + +/********************************************************************* + * @fn TIM_ClearOC3Ref + * + * @brief Clears or safeguards the OCREF3 signal on an external event. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC3Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC3CE); + tmpccmr2 |= TIM_OCClear; + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_ClearOC4Ref + * + * @brief Clears or safeguards the OCREF4 signal on an external event. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCClear - new state of the Output Compare Clear Enable Bit. + * TIM_OCClear_Enable - TIM Output clear enable. + * TIM_OCClear_Disable - TIM Output clear disable. + * + * @return none + */ +void TIM_ClearOC4Ref(TIM_TypeDef *TIMx, uint16_t TIM_OCClear) +{ + uint16_t tmpccmr2 = 0; + + tmpccmr2 = TIMx->CHCTLR2; + tmpccmr2 &= (uint16_t) ~((uint16_t)TIM_OC4CE); + tmpccmr2 |= (uint16_t)(TIM_OCClear << 8); + TIMx->CHCTLR2 = tmpccmr2; +} + +/********************************************************************* + * @fn TIM_OC1PolarityConfig + * + * @brief Configures the TIMx channel 1 polarity. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCPolarity - specifies the OC1 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC1PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC1P); + tmpccer |= TIM_OCPolarity; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC1NPolarityConfig + * + * @brief Configures the TIMx channel 1 polarity. + * + * @param TIMx - where x can be (1 8 9 10) to select the TIM peripheral. + * TIM_OCNPolarity - specifies the OC1N Polarity. + * TIM_OCNPolarity_High - Output Compare active high. + * TIM_OCNPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC1NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC1NP); + tmpccer |= TIM_OCNPolarity; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC2PolarityConfig + * + * @brief Configures the TIMx channel 2 polarity. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) to select the TIM peripheral. + * TIM_OCPolarity - specifies the OC2 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC2PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC2P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 4); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC2NPolarityConfig + * + * @brief Configures the TIMx channel 2 polarity. + * + * @param TIMx - where x can be (1 8 9 10) to select the TIM peripheral. + * TIM_OCNPolarity - specifies the OC1N Polarity. + * TIM_OCNPolarity_High - Output Compare active high. + * TIM_OCNPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC2NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC2NP); + tmpccer |= (uint16_t)(TIM_OCNPolarity << 4); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC3PolarityConfig + * + * @brief Configures the TIMx Channel 3 polarity. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10)to select the TIM peripheral. + * TIM_OCPolarit - specifies the OC3 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC3PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC3P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 8); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC3NPolarityConfig + * + * @brief Configures the TIMx Channel 3N polarity. + * + * @param TIMx - where x can be (1 8 9 10) to select the TIM peripheral. + * TIM_OCNPolarity - specifies the OC2N Polarity. + * TIM_OCNPolarity_High - Output Compare active high. + * TIM_OCNPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC3NPolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCNPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC3NP); + tmpccer |= (uint16_t)(TIM_OCNPolarity << 8); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_OC4PolarityConfig + * + * @brief Configures the TIMx Channel 4 polarity. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10)to select the TIM peripheral. + * TIM_OCPolarit - specifies the OC3 Polarity. + * TIM_OCPolarity_High - Output Compare active high. + * TIM_OCPolarity_Low - Output Compare active low. + * + * @return none + */ +void TIM_OC4PolarityConfig(TIM_TypeDef *TIMx, uint16_t TIM_OCPolarity) +{ + uint16_t tmpccer = 0; + + tmpccer = TIMx->CCER; + tmpccer &= (uint16_t) ~((uint16_t)TIM_CC4P); + tmpccer |= (uint16_t)(TIM_OCPolarity << 12); + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TIM_CCxCmd + * + * @brief Enables or disables the TIM Capture Compare Channel x. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_Channel - specifies the TIM Channel. + * TIM_Channel_1 - TIM Channel 1. + * TIM_Channel_2 - TIM Channel 2. + * TIM_Channel_3 - TIM Channel 3. + * TIM_Channel_4 - TIM Channel 4. + * TIM_CCx - specifies the TIM Channel CCxE bit new state. + * TIM_CCx_Enable. + * TIM_CCx_Disable. + * + * @return none + */ +void TIM_CCxCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx) +{ + uint16_t tmp = 0; + + tmp = CCER_CCE_Set << TIM_Channel; + TIMx->CCER &= (uint16_t)~tmp; + TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel); +} + +/********************************************************************* + * @fn TIM_CCxNCmd + * + * @brief Enables or disables the TIM Capture Compare Channel xN. + * + * @param TIMx - where x can be (1 8 9 10) select the TIM peripheral. + * TIM_Channel - specifies the TIM Channel. + * TIM_Channel_1 - TIM Channel 1. + * TIM_Channel_2 - TIM Channel 2. + * TIM_Channel_3 - TIM Channel 3. + * TIM_CCxN - specifies the TIM Channel CCxNE bit new state. + * TIM_CCxN_Enable. + * TIM_CCxN_Disable. + * + * @return none + */ +void TIM_CCxNCmd(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN) +{ + uint16_t tmp = 0; + + tmp = CCER_CCNE_Set << TIM_Channel; + TIMx->CCER &= (uint16_t)~tmp; + TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel); +} + +/********************************************************************* + * @fn TIM_SelectOCxM + * + * @brief Selects the TIM Output Compare Mode. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_Channel - specifies the TIM Channel. + * TIM_Channel_1 - TIM Channel 1. + * TIM_Channel_2 - TIM Channel 2. + * TIM_Channel_3 - TIM Channel 3. + * TIM_Channel_4 - TIM Channel 4. + * TIM_OCMode - specifies the TIM Output Compare Mode. + * TIM_OCMode_Timing. + * TIM_OCMode_Active. + * TIM_OCMode_Toggle. + * TIM_OCMode_PWM1. + * TIM_OCMode_PWM2. + * TIM_ForcedAction_Active. + * TIM_ForcedAction_InActive. + * + * @return none + */ +void TIM_SelectOCxM(TIM_TypeDef *TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) +{ + uint32_t tmp = 0; + uint16_t tmp1 = 0; + + tmp = (uint32_t)TIMx; + tmp += CHCTLR_Offset; + tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel; + TIMx->CCER &= (uint16_t)~tmp1; + + if((TIM_Channel == TIM_Channel_1) || (TIM_Channel == TIM_Channel_3)) + { + tmp += (TIM_Channel >> 1); + *(__IO uint32_t *)tmp &= (uint32_t) ~((uint32_t)TIM_OC1M); + *(__IO uint32_t *)tmp |= TIM_OCMode; + } + else + { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4) >> (uint16_t)1; + *(__IO uint32_t *)tmp &= (uint32_t) ~((uint32_t)TIM_OC2M); + *(__IO uint32_t *)tmp |= (uint16_t)(TIM_OCMode << 8); + } +} + +/********************************************************************* + * @fn TIM_UpdateDisableConfig + * + * @brief Enables or Disables the TIMx Update event. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_UpdateDisableConfig(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR1 |= TIM_UDIS; + } + else + { + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_UDIS); + } +} + +/********************************************************************* + * @fn TIM_UpdateRequestConfig + * + * @brief Configures the TIMx Update Request Interrupt source. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_UpdateSource - specifies the Update source. + * TIM_UpdateSource_Regular. + * TIM_UpdateSource_Global. + * + * @return none + */ +void TIM_UpdateRequestConfig(TIM_TypeDef *TIMx, uint16_t TIM_UpdateSource) +{ + if(TIM_UpdateSource != TIM_UpdateSource_Global) + { + TIMx->CTLR1 |= TIM_URS; + } + else + { + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_URS); + } +} + +/********************************************************************* + * @fn TIM_SelectHallSensor + * + * @brief Enables or disables the TIMx's Hall sensor interface. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void TIM_SelectHallSensor(TIM_TypeDef *TIMx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + TIMx->CTLR2 |= TIM_TI1S; + } + else + { + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_TI1S); + } +} + +/********************************************************************* + * @fn TIM_SelectOnePulseMode + * + * @brief Selects the TIMx's One Pulse Mode. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_OPMode - specifies the OPM Mode to be used. + * TIM_OPMode_Single. + * TIM_OPMode_Repetitive. + * + * @return none + */ +void TIM_SelectOnePulseMode(TIM_TypeDef *TIMx, uint16_t TIM_OPMode) +{ + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_OPM); + TIMx->CTLR1 |= TIM_OPMode; +} + +/********************************************************************* + * @fn TIM_SelectOutputTrigger + * + * @brief Selects the TIMx Trigger Output Mode. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_TRGOSource - specifies the Trigger Output source. + * TIM_TRGOSource_Reset - The UG bit in the TIM_EGR register is + * used as the trigger output (TRGO). + * TIM_TRGOSource_Enable - The Counter Enable CEN is used as the + * trigger output (TRGO). + * TIM_TRGOSource_Update - The update event is selected as the + * trigger output (TRGO). + * TIM_TRGOSource_OC1 - The trigger output sends a positive pulse + * when the CC1IF flag is to be set, as soon as a capture or compare match occurs (TRGO). + * TIM_TRGOSource_OC1Ref - OC1REF signal is used as the trigger output (TRGO). + * TIM_TRGOSource_OC2Ref - OC2REF signal is used as the trigger output (TRGO). + * TIM_TRGOSource_OC3Ref - OC3REF signal is used as the trigger output (TRGO). + * TIM_TRGOSource_OC4Ref - OC4REF signal is used as the trigger output (TRGO). + * TIM6/TIM7 only have TIM_TRGOSource_Reset/TIM_TRGOSource_Enable/TIM_TRGOSource_Update + * @return none + */ +void TIM_SelectOutputTrigger(TIM_TypeDef *TIMx, uint16_t TIM_TRGOSource) +{ + TIMx->CTLR2 &= (uint16_t) ~((uint16_t)TIM_MMS); + TIMx->CTLR2 |= TIM_TRGOSource; +} + +/********************************************************************* + * @fn TIM_SelectSlaveMode + * + * @brief Selects the TIMx Slave Mode. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_SlaveMode - specifies the Timer Slave Mode. + * TIM_SlaveMode_Reset - Rising edge of the selected trigger + * signal (TRGI) re-initializes. + * TIM_SlaveMode_Gated - The counter clock is enabled when the + * trigger signal (TRGI) is high. + * TIM_SlaveMode_Trigger - The counter starts at a rising edge + * of the trigger TRGI. + * TIM_SlaveMode_External1 - Rising edges of the selected trigger + * (TRGI) clock the counter. + * + * @return none + */ +void TIM_SelectSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_SlaveMode) +{ + TIMx->SMCFGR &= (uint16_t) ~((uint16_t)TIM_SMS); + TIMx->SMCFGR |= TIM_SlaveMode; +} + +/********************************************************************* + * @fn TIM_SelectMasterSlaveMode + * + * @brief Sets or Resets the TIMx Master/Slave Mode. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_MasterSlaveMode - specifies the Timer Master Slave Mode. + * TIM_MasterSlaveMode_Enable - synchronization between the current + * timer and its slaves (through TRGO). + * TIM_MasterSlaveMode_Disable - No action. + * + * @return none + */ +void TIM_SelectMasterSlaveMode(TIM_TypeDef *TIMx, uint16_t TIM_MasterSlaveMode) +{ + TIMx->SMCFGR &= (uint16_t) ~((uint16_t)TIM_MSM); + TIMx->SMCFGR |= TIM_MasterSlaveMode; +} + +/********************************************************************* + * @fn TIM_SetCounter + * + * @brief Sets the TIMx Counter Register value. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * Counter - specifies the Counter register new value. + * + * @return none + */ +void TIM_SetCounter(TIM_TypeDef *TIMx, uint16_t Counter) +{ + TIMx->CNT = Counter; +} + +/********************************************************************* + * @fn TIM_SetAutoreload + * + * @brief Sets the TIMx Autoreload Register value. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * Autoreload - specifies the Autoreload register new value. + * + * @return none + */ +void TIM_SetAutoreload(TIM_TypeDef *TIMx, uint16_t Autoreload) +{ + TIMx->ATRLR = Autoreload; +} + +/********************************************************************* + * @fn TIM_SetCompare1 + * + * @brief Sets the TIMx Capture Compare1 Register value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare1(TIM_TypeDef *TIMx, uint16_t Compare1) +{ + TIMx->CH1CVR = Compare1; +} + +/********************************************************************* + * @fn TIM_SetCompare2 + * + * @brief Sets the TIMx Capture Compare2 Register value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare2(TIM_TypeDef *TIMx, uint16_t Compare2) +{ + TIMx->CH2CVR = Compare2; +} + +/********************************************************************* + * @fn TIM_SetCompare3 + * + * @brief Sets the TIMx Capture Compare3 Register value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare3(TIM_TypeDef *TIMx, uint16_t Compare3) +{ + TIMx->CH3CVR = Compare3; +} + +/********************************************************************* + * @fn TIM_SetCompare4 + * + * @brief Sets the TIMx Capture Compare4 Register value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * Compare1 - specifies the Capture Compare1 register new value. + * + * @return none + */ +void TIM_SetCompare4(TIM_TypeDef *TIMx, uint16_t Compare4) +{ + TIMx->CH4CVR = Compare4; +} + +/********************************************************************* + * @fn TIM_SetIC1Prescaler + * + * @brief Sets the TIMx Input Capture 1 prescaler. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC1Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR1 &= (uint16_t) ~((uint16_t)TIM_IC1PSC); + TIMx->CHCTLR1 |= TIM_ICPSC; +} + +/********************************************************************* + * @fn TIM_SetIC2Prescaler + * + * @brief Sets the TIMx Input Capture 2 prescaler. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC2Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR1 &= (uint16_t) ~((uint16_t)TIM_IC2PSC); + TIMx->CHCTLR1 |= (uint16_t)(TIM_ICPSC << 8); +} + +/********************************************************************* + * @fn TIM_SetIC3Prescaler + * + * @brief Sets the TIMx Input Capture 3 prescaler. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC3Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR2 &= (uint16_t) ~((uint16_t)TIM_IC3PSC); + TIMx->CHCTLR2 |= TIM_ICPSC; +} + +/********************************************************************* + * @fn TIM_SetIC4Prescaler + * + * @brief Sets the TIMx Input Capture 4 prescaler. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_ICPSC - specifies the Input Capture1 prescaler new value. + * TIM_ICPSC_DIV1 - no prescaler. + * TIM_ICPSC_DIV2 - capture is done once every 2 events. + * TIM_ICPSC_DIV4 - capture is done once every 4 events. + * TIM_ICPSC_DIV8 - capture is done once every 8 events. + * + * @return none + */ +void TIM_SetIC4Prescaler(TIM_TypeDef *TIMx, uint16_t TIM_ICPSC) +{ + TIMx->CHCTLR2 &= (uint16_t) ~((uint16_t)TIM_IC4PSC); + TIMx->CHCTLR2 |= (uint16_t)(TIM_ICPSC << 8); +} + +/********************************************************************* + * @fn TIM_SetClockDivision + * + * @brief Sets the TIMx Clock Division value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * TIM_CKD - specifies the clock division value. + * TIM_CKD_DIV1 - TDTS = Tck_tim. + * TIM_CKD_DIV2 - TDTS = 2*Tck_tim. + * TIM_CKD_DIV4 - TDTS = 4*Tck_tim. + * + * @return none + */ +void TIM_SetClockDivision(TIM_TypeDef *TIMx, uint16_t TIM_CKD) +{ + TIMx->CTLR1 &= (uint16_t) ~((uint16_t)TIM_CTLR1_CKD); + TIMx->CTLR1 |= TIM_CKD; +} + +/********************************************************************* + * @fn TIM_GetCapture1 + * + * @brief Gets the TIMx Input Capture 1 value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * + * @return TIMx->CH1CVR - Capture Compare 1 Register value. + */ +uint16_t TIM_GetCapture1(TIM_TypeDef *TIMx) +{ + return TIMx->CH1CVR; +} + +/********************************************************************* + * @fn TIM_GetCapture2 + * + * @brief Gets the TIMx Input Capture 2 value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * + * @return TIMx->CH2CVR - Capture Compare 2 Register value. + */ +uint16_t TIM_GetCapture2(TIM_TypeDef *TIMx) +{ + return TIMx->CH2CVR; +} + +/********************************************************************* + * @fn TIM_GetCapture3 + * + * @brief Gets the TIMx Input Capture 3 value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * + * @return TIMx->CH3CVR - Capture Compare 3 Register value. + */ +uint16_t TIM_GetCapture3(TIM_TypeDef *TIMx) +{ + return TIMx->CH3CVR; +} + +/********************************************************************* + * @fn TIM_GetCapture4 + * + * @brief Gets the TIMx Input Capture 4 value. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * + * @return TIMx->CH4CVR - Capture Compare 4 Register value. + */ +uint16_t TIM_GetCapture4(TIM_TypeDef *TIMx) +{ + return TIMx->CH4CVR; +} + +/********************************************************************* + * @fn TIM_GetCounter + * + * @brief Gets the TIMx Counter value. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * + * @return TIMx->CNT - Counter Register value. + */ +uint16_t TIM_GetCounter(TIM_TypeDef *TIMx) +{ + return TIMx->CNT; +} + +/********************************************************************* + * @fn TIM_GetPrescaler + * + * @brief Gets the TIMx Prescaler value. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * + * @return TIMx->PSC - Prescaler Register value. + */ +uint16_t TIM_GetPrescaler(TIM_TypeDef *TIMx) +{ + return TIMx->PSC; +} + +/********************************************************************* + * @fn TIM_GetFlagStatus + * + * @brief Checks whether the specified TIM flag is set or not. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_FLAG - specifies the flag to check. + * TIM_FLAG_Update - TIM update Flag. + * TIM_FLAG_CC1 - TIM Capture Compare 1 Flag. + * TIM_FLAG_CC2 - TIM Capture Compare 2 Flag. + * TIM_FLAG_CC3 - TIM Capture Compare 3 Flag. + * TIM_FLAG_CC4 - TIM Capture Compare 4 Flag. + * TIM_FLAG_COM - TIM Commutation Flag. + * TIM_FLAG_Trigger - TIM Trigger Flag. + * TIM_FLAG_Break - TIM Break Flag. + * TIM_FLAG_CC1OF - TIM Capture Compare 1 overcapture Flag. + * TIM_FLAG_CC2OF - TIM Capture Compare 2 overcapture Flag. + * TIM_FLAG_CC3OF - TIM Capture Compare 3 overcapture Flag. + * TIM_FLAG_CC4OF - TIM Capture Compare 4 overcapture Flag. + * TIM6/TIM7 only have TIM_FLAG_Update - TIM update Flag. + * + * @return none + */ +FlagStatus TIM_GetFlagStatus(TIM_TypeDef *TIMx, uint16_t TIM_FLAG) +{ + ITStatus bitstatus = RESET; + + if((TIMx->INTFR & TIM_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn TIM_ClearFlag + * + * @brief Clears the TIMx's pending flags. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_FLAG - specifies the flag to check. + * TIM_FLAG_Update - TIM update Flag. + * TIM_FLAG_CC1 - TIM Capture Compare 1 Flag. + * TIM_FLAG_CC2 - TIM Capture Compare 2 Flag. + * TIM_FLAG_CC3 - TIM Capture Compare 3 Flag. + * TIM_FLAG_CC4 - TIM Capture Compare 4 Flag. + * TIM_FLAG_COM - TIM Commutation Flag. + * TIM_FLAG_Trigger - TIM Trigger Flag. + * TIM_FLAG_Break - TIM Break Flag. + * TIM_FLAG_CC1OF - TIM Capture Compare 1 overcapture Flag. + * TIM_FLAG_CC2OF - TIM Capture Compare 2 overcapture Flag. + * TIM_FLAG_CC3OF - TIM Capture Compare 3 overcapture Flag. + * TIM_FLAG_CC4OF - TIM Capture Compare 4 overcapture Flag. + * TIM6/TIM7 only have TIM_FLAG_Update - TIM update Flag. + * + * @return none + */ +void TIM_ClearFlag(TIM_TypeDef *TIMx, uint16_t TIM_FLAG) +{ + TIMx->INTFR = (uint16_t)~TIM_FLAG; +} + +/********************************************************************* + * @fn TIM_GetITStatus + * + * @brief Checks whether the TIM interrupt has occurred or not. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_IT - specifies the TIM interrupt source to check. + * TIM_IT_Update - TIM update Interrupt source. + * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source. + * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source. + * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source. + * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source. + * TIM_IT_COM - TIM Commutation Interrupt source. + * TIM_IT_Trigger - TIM Trigger Interrupt source. + * TIM_IT_Break - TIM Break Interrupt source. + * TIM6/TIM7 only have TIM_IT_Update - TIM update Interrupt source. + * + * @return none + */ +ITStatus TIM_GetITStatus(TIM_TypeDef *TIMx, uint16_t TIM_IT) +{ + ITStatus bitstatus = RESET; + uint16_t itstatus = 0x0, itenable = 0x0; + + itstatus = TIMx->INTFR & TIM_IT; + + itenable = TIMx->DMAINTENR & TIM_IT; + if((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn TIM_ClearITPendingBit + * + * @brief Clears the TIMx's interrupt pending bits. + * + * @param TIMx - where x can be 1 to 10 select the TIM peripheral. + * TIM_IT - specifies the TIM interrupt source to check. + * TIM_IT_Update - TIM update Interrupt source. + * TIM_IT_CC1 - TIM Capture Compare 1 Interrupt source. + * TIM_IT_CC2 - TIM Capture Compare 2 Interrupt source. + * TIM_IT_CC3 - TIM Capture Compare 3 Interrupt source. + * TIM_IT_CC4 - TIM Capture Compare 4 Interrupt source. + * TIM_IT_COM - TIM Commutation Interrupt source. + * TIM_IT_Trigger - TIM Trigger Interrupt source. + * TIM_IT_Break - TIM Break Interrupt source. + * TIM6/TIM7 only have TIM_IT_Update - TIM update Interrupt source. + * + * @return none + */ +void TIM_ClearITPendingBit(TIM_TypeDef *TIMx, uint16_t TIM_IT) +{ + TIMx->INTFR = (uint16_t)~TIM_IT; +} + +/********************************************************************* + * @fn TI1_Config + * + * @brief Configure the TI1 as Input. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI1_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC1E); + tmpccmr1 = TIMx->CHCTLR1; + tmpccer = TIMx->CCER; + tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC1S)) & ((uint16_t) ~((uint16_t)TIM_IC1F))); + tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC1P)); + tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CC1E); + + TIMx->CHCTLR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TI2_Config + * + * @brief Configure the TI2 as Input. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI2_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC2E); + tmpccmr1 = TIMx->CHCTLR1; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 4); + tmpccmr1 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC2S)) & ((uint16_t) ~((uint16_t)TIM_IC2F))); + tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12); + tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8); + + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC2P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC2E); + + TIMx->CHCTLR1 = tmpccmr1; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TI3_Config + * + * @brief Configure the TI3 as Input. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI3_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC3E); + tmpccmr2 = TIMx->CHCTLR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 8); + tmpccmr2 &= (uint16_t)(((uint16_t) ~((uint16_t)TIM_CC3S)) & ((uint16_t) ~((uint16_t)TIM_IC3F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4)); + + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC3P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC3E); + + TIMx->CHCTLR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} + +/********************************************************************* + * @fn TI4_Config + * + * @brief Configure the TI4 as Input. + * + * @param TIMx - where x can be (1 2 3 4 5 8 9 10) select the TIM peripheral. + * IM_ICPolarity - The Input Polarity. + * TIM_ICPolarity_Rising. + * TIM_ICPolarity_Falling. + * TIM_ICSelection - specifies the input to be used. + * TIM_ICSelection_DirectTI - TIM Input 1 is selected to be + * connected to IC1. + * TIM_ICSelection_IndirectTI - TIM Input 1 is selected to be + * connected to IC2. + * TIM_ICSelection_TRC - TIM Input 1 is selected to be connected + * to TRC. + * TIM_ICFilter - Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * + * @return none + */ +static void TI4_Config(TIM_TypeDef *TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection, + uint16_t TIM_ICFilter) +{ + uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0; + + TIMx->CCER &= (uint16_t) ~((uint16_t)TIM_CC4E); + tmpccmr2 = TIMx->CHCTLR2; + tmpccer = TIMx->CCER; + tmp = (uint16_t)(TIM_ICPolarity << 12); + tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CC4S) & ((uint16_t) ~((uint16_t)TIM_IC4F))); + tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8); + tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12); + + tmpccer &= (uint16_t) ~((uint16_t)(TIM_CC4P)); + tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CC4E); + + TIMx->CHCTLR2 = tmpccmr2; + TIMx->CCER = tmpccer; +} diff --git a/Peripheral/src/ch32v30x_usart.c b/Peripheral/src/ch32v30x_usart.c new file mode 100644 index 0000000..2e6513c --- /dev/null +++ b/Peripheral/src/ch32v30x_usart.c @@ -0,0 +1,783 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_usart.c +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/12 +* Description : This file provides all the USART firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_usart.h" +#include "ch32v30x_rcc.h" + +/* USART_Private_Defines */ +#define CTLR1_UE_Set ((uint16_t)0x2000) /* USART Enable Mask */ +#define CTLR1_UE_Reset ((uint16_t)0xDFFF) /* USART Disable Mask */ + +#define CTLR1_WAKE_Mask ((uint16_t)0xF7FF) /* USART WakeUp Method Mask */ + +#define CTLR1_RWU_Set ((uint16_t)0x0002) /* USART mute mode Enable Mask */ +#define CTLR1_RWU_Reset ((uint16_t)0xFFFD) /* USART mute mode Enable Mask */ +#define CTLR1_SBK_Set ((uint16_t)0x0001) /* USART Break Character send Mask */ +#define CTLR1_CLEAR_Mask ((uint16_t)0xE9F3) /* USART CTLR1 Mask */ +#define CTLR2_Address_Mask ((uint16_t)0xFFF0) /* USART address Mask */ + +#define CTLR2_LINEN_Set ((uint16_t)0x4000) /* USART LIN Enable Mask */ +#define CTLR2_LINEN_Reset ((uint16_t)0xBFFF) /* USART LIN Disable Mask */ + +#define CTLR2_LBDL_Mask ((uint16_t)0xFFDF) /* USART LIN Break detection Mask */ +#define CTLR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /* USART CTLR2 STOP Bits Mask */ +#define CTLR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /* USART CTLR2 Clock Mask */ + +#define CTLR3_SCEN_Set ((uint16_t)0x0020) /* USART SC Enable Mask */ +#define CTLR3_SCEN_Reset ((uint16_t)0xFFDF) /* USART SC Disable Mask */ + +#define CTLR3_NACK_Set ((uint16_t)0x0010) /* USART SC NACK Enable Mask */ +#define CTLR3_NACK_Reset ((uint16_t)0xFFEF) /* USART SC NACK Disable Mask */ + +#define CTLR3_HDSEL_Set ((uint16_t)0x0008) /* USART Half-Duplex Enable Mask */ +#define CTLR3_HDSEL_Reset ((uint16_t)0xFFF7) /* USART Half-Duplex Disable Mask */ + +#define CTLR3_IRLP_Mask ((uint16_t)0xFFFB) /* USART IrDA LowPower mode Mask */ +#define CTLR3_CLEAR_Mask ((uint16_t)0xFCFF) /* USART CTLR3 Mask */ + +#define CTLR3_IREN_Set ((uint16_t)0x0002) /* USART IrDA Enable Mask */ +#define CTLR3_IREN_Reset ((uint16_t)0xFFFD) /* USART IrDA Disable Mask */ +#define GPR_LSB_Mask ((uint16_t)0x00FF) /* Guard Time Register LSB Mask */ +#define GPR_MSB_Mask ((uint16_t)0xFF00) /* Guard Time Register MSB Mask */ +#define IT_Mask ((uint16_t)0x001F) /* USART Interrupt Mask */ + +/********************************************************************* + * @fn USART_DeInit + * + * @brief Deinitializes the USARTx peripheral registers to their default + * reset values. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * + * @return none + */ +void USART_DeInit(USART_TypeDef *USARTx) +{ + if(USARTx == USART1) + { + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); + } + else if(USARTx == USART2) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); + } + else if(USARTx == USART3) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); + } + else if(USARTx == UART4) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); + } + else if(USARTx == UART5) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); + } + else if(USARTx == UART6) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART6, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART6, DISABLE); + } + else if(USARTx == UART7) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART7, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART7, DISABLE); + } + else if(USARTx == UART8) + { + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART8, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART8, DISABLE); + } +} + +/********************************************************************* + * @fn USART_Init + * + * @brief Initializes the USARTx peripheral according to the specified + * parameters in the USART_InitStruct. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_InitStruct - pointer to a USART_InitTypeDef structure + * that contains the configuration information for the specified + * USART peripheral. + * + * @return none + */ +void USART_Init(USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct) +{ + uint32_t tmpreg = 0x00, apbclock = 0x00; + uint32_t integerdivider = 0x00; + uint32_t fractionaldivider = 0x00; + uint32_t usartxbase = 0; + RCC_ClocksTypeDef RCC_ClocksStatus; + + if(USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) + { + } + + usartxbase = (uint32_t)USARTx; + tmpreg = USARTx->CTLR2; + tmpreg &= CTLR2_STOP_CLEAR_Mask; + tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; + + USARTx->CTLR2 = (uint16_t)tmpreg; + tmpreg = USARTx->CTLR1; + tmpreg &= CTLR1_CLEAR_Mask; + tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity | + USART_InitStruct->USART_Mode; + USARTx->CTLR1 = (uint16_t)tmpreg; + + tmpreg = USARTx->CTLR3; + tmpreg &= CTLR3_CLEAR_Mask; + tmpreg |= USART_InitStruct->USART_HardwareFlowControl; + USARTx->CTLR3 = (uint16_t)tmpreg; + + RCC_GetClocksFreq(&RCC_ClocksStatus); + + if(usartxbase == USART1_BASE) + { + apbclock = RCC_ClocksStatus.PCLK2_Frequency; + } + else + { + apbclock = RCC_ClocksStatus.PCLK1_Frequency; + } + + integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); + tmpreg = (integerdivider / 100) << 4; + fractionaldivider = integerdivider - (100 * (tmpreg >> 4)); + tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); + USARTx->BRR = (uint16_t)tmpreg; +} + +/********************************************************************* + * @fn USART_StructInit + * + * @brief Fills each USART_InitStruct member with its default value. + * + * @param USART_InitStruct: pointer to a USART_InitTypeDef structure + * which will be initialized. + * + * @return none + */ +void USART_StructInit(USART_InitTypeDef *USART_InitStruct) +{ + USART_InitStruct->USART_BaudRate = 9600; + USART_InitStruct->USART_WordLength = USART_WordLength_8b; + USART_InitStruct->USART_StopBits = USART_StopBits_1; + USART_InitStruct->USART_Parity = USART_Parity_No; + USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; +} + +/********************************************************************* + * @fn USART_ClockInit + * + * @brief Initializes the USARTx peripheral Clock according to the + * specified parameters in the USART_ClockInitStruct . + * + * @param USARTx - where x can be 1, 2, 3 to select the USART peripheral. + * USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef + * structure that contains the configuration information for the specified + * USART peripheral. + * + * @return none + */ +void USART_ClockInit(USART_TypeDef *USARTx, USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + uint32_t tmpreg = 0x00; + + tmpreg = USARTx->CTLR2; + tmpreg &= CTLR2_CLOCK_CLEAR_Mask; + tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL | + USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit; + USARTx->CTLR2 = (uint16_t)tmpreg; +} + +/********************************************************************* + * @fn USART_ClockStructInit + * + * @brief Fills each USART_ClockStructInit member with its default value. + * + * @param USART_ClockInitStruct - pointer to a USART_ClockInitTypeDef + * structure which will be initialized. + * + * @return none + */ +void USART_ClockStructInit(USART_ClockInitTypeDef *USART_ClockInitStruct) +{ + USART_ClockInitStruct->USART_Clock = USART_Clock_Disable; + USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low; + USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge; + USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable; +} + +/********************************************************************* + * @fn USART_Cmd + * + * @brief Enables or disables the specified USART peripheral. + * reset values (Affects also the I2Ss). + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState: ENABLE or DISABLE. + * + * @return none + */ +void USART_Cmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR1 |= CTLR1_UE_Set; + } + else + { + USARTx->CTLR1 &= CTLR1_UE_Reset; + } +} + +/********************************************************************* + * @fn USART_ITConfig + * + * @brief Enables or disables the specified USART interrupts. + * reset values (Affects also the I2Ss). + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_IT - specifies the USART interrupt sources to be enabled or disabled. + * USART_IT_LBD - LIN Break detection interrupt. + * USART_IT_TXE - Transmit Data Register empty interrupt. + * USART_IT_TC - Transmission complete interrupt. + * USART_IT_RXNE - Receive Data register not empty interrupt. + * USART_IT_IDLE - Idle line detection interrupt. + * USART_IT_PE - Parity Error interrupt. + * USART_IT_ERR - Error interrupt. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_ITConfig(USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState) +{ + uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; + uint32_t usartxbase = 0x00; + + usartxbase = (uint32_t)USARTx; + usartreg = (((uint8_t)USART_IT) >> 0x05); + itpos = USART_IT & IT_Mask; + itmask = (((uint32_t)0x01) << itpos); + + if(usartreg == 0x01) + { + usartxbase += 0x0C; + } + else if(usartreg == 0x02) + { + usartxbase += 0x10; + } + else + { + usartxbase += 0x14; + } + + if(NewState != DISABLE) + { + *(__IO uint32_t *)usartxbase |= itmask; + } + else + { + *(__IO uint32_t *)usartxbase &= ~itmask; + } +} + +/********************************************************************* + * @fn USART_DMACmd + * + * @brief Enables or disables the USART DMA interface. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_DMAReq - specifies the DMA request. + * USART_DMAReq_Tx - USART DMA transmit request. + * USART_DMAReq_Rx - USART DMA receive request. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_DMACmd(USART_TypeDef *USARTx, uint16_t USART_DMAReq, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= USART_DMAReq; + } + else + { + USARTx->CTLR3 &= (uint16_t)~USART_DMAReq; + } +} + +/********************************************************************* + * @fn USART_SetAddress + * + * @brief Sets the address of the USART node. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_Address - Indicates the address of the USART node. + * + * @return none + */ +void USART_SetAddress(USART_TypeDef *USARTx, uint8_t USART_Address) +{ + USARTx->CTLR2 &= CTLR2_Address_Mask; + USARTx->CTLR2 |= USART_Address; +} + +/********************************************************************* + * @fn USART_WakeUpConfig + * + * @brief Selects the USART WakeUp method. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_WakeUp - specifies the USART wakeup method. + * USART_WakeUp_IdleLine - WakeUp by an idle line detection. + * USART_WakeUp_AddressMark - WakeUp by an address mark. + * + * @return none + */ +void USART_WakeUpConfig(USART_TypeDef *USARTx, uint16_t USART_WakeUp) +{ + USARTx->CTLR1 &= CTLR1_WAKE_Mask; + USARTx->CTLR1 |= USART_WakeUp; +} + +/********************************************************************* + * @fn USART_ReceiverWakeUpCmd + * + * @brief Determines if the USART is in mute mode or not. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_ReceiverWakeUpCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR1 |= CTLR1_RWU_Set; + } + else + { + USARTx->CTLR1 &= CTLR1_RWU_Reset; + } +} + +/********************************************************************* + * @fn USART_LINBreakDetectLengthConfig + * + * @brief Sets the USART LIN Break detection length. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_LINBreakDetectLength - specifies the LIN break detection length. + * USART_LINBreakDetectLength_10b - 10-bit break detection. + * USART_LINBreakDetectLength_11b - 11-bit break detection. + * + * @return none + */ +void USART_LINBreakDetectLengthConfig(USART_TypeDef *USARTx, uint16_t USART_LINBreakDetectLength) +{ + USARTx->CTLR2 &= CTLR2_LBDL_Mask; + USARTx->CTLR2 |= USART_LINBreakDetectLength; +} + +/********************************************************************* + * @fn USART_LINCmd + * + * @brief Enables or disables the USART LIN mode. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_LINCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR2 |= CTLR2_LINEN_Set; + } + else + { + USARTx->CTLR2 &= CTLR2_LINEN_Reset; + } +} + +/********************************************************************* + * @fn USART_SendData + * + * @brief Transmits single data through the USARTx peripheral. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * Data - the data to transmit. + * + * @return none + */ +void USART_SendData(USART_TypeDef *USARTx, uint16_t Data) +{ + USARTx->DATAR = (Data & (uint16_t)0x01FF); +} + +/********************************************************************* + * @fn USART_ReceiveData + * + * @brief Returns the most recent received data by the USARTx peripheral. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * + * @return The received data. + */ +uint16_t USART_ReceiveData(USART_TypeDef *USARTx) +{ + return (uint16_t)(USARTx->DATAR & (uint16_t)0x01FF); +} + +/********************************************************************* + * @fn USART_SendBreak + * + * @brief Transmits break characters. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * + * @return none + */ +void USART_SendBreak(USART_TypeDef *USARTx) +{ + USARTx->CTLR1 |= CTLR1_SBK_Set; +} + +/********************************************************************* + * @fn USART_SetGuardTime + * + * @brief Sets the specified USART guard time. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_GuardTime - specifies the guard time. + * + * @return none + */ +void USART_SetGuardTime(USART_TypeDef *USARTx, uint8_t USART_GuardTime) +{ + USARTx->GPR &= GPR_LSB_Mask; + USARTx->GPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08); +} + +/********************************************************************* + * @fn USART_SetPrescaler + * + * @brief Sets the system clock prescaler. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_Prescaler - specifies the prescaler clock. + * + * @return none + */ +void USART_SetPrescaler(USART_TypeDef *USARTx, uint8_t USART_Prescaler) +{ + USARTx->GPR &= GPR_MSB_Mask; + USARTx->GPR |= USART_Prescaler; +} + +/********************************************************************* + * @fn USART_SmartCardCmd + * + * @brief Enables or disables the USART Smart Card mode. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_SmartCardCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_SCEN_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_SCEN_Reset; + } +} + +/********************************************************************* + * @fn USART_SmartCardNACKCmd + * + * @brief Enables or disables NACK transmission. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_SmartCardNACKCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_NACK_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_NACK_Reset; + } +} + +/********************************************************************* + * @fn USART_HalfDuplexCmd + * + * @brief Enables or disables the USART Half Duplex communication. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_HalfDuplexCmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_HDSEL_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_HDSEL_Reset; + } +} + +/********************************************************************* + * @fn USART_IrDAConfig + * + * @brief Configures the USART's IrDA interface. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_IrDAMode - specifies the IrDA mode. + * USART_IrDAMode_LowPower. + * USART_IrDAMode_Normal. + * + * @return none + */ +void USART_IrDAConfig(USART_TypeDef *USARTx, uint16_t USART_IrDAMode) +{ + USARTx->CTLR3 &= CTLR3_IRLP_Mask; + USARTx->CTLR3 |= USART_IrDAMode; +} + +/********************************************************************* + * @fn USART_IrDACmd + * + * @brief Enables or disables the USART's IrDA interface. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * NewState - ENABLE or DISABLE. + * + * @return none + */ +void USART_IrDACmd(USART_TypeDef *USARTx, FunctionalState NewState) +{ + if(NewState != DISABLE) + { + USARTx->CTLR3 |= CTLR3_IREN_Set; + } + else + { + USARTx->CTLR3 &= CTLR3_IREN_Reset; + } +} + +/********************************************************************* + * @fn USART_GetFlagStatus + * + * @brief Checks whether the specified USART flag is set or not. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_FLAG - specifies the flag to check. + * USART_FLAG_LBD - LIN Break detection flag. + * USART_FLAG_TXE - Transmit data register empty flag. + * USART_FLAG_TC - Transmission Complete flag. + * USART_FLAG_RXNE - Receive data register not empty flag. + * USART_FLAG_IDLE - Idle Line detection flag. + * USART_FLAG_ORE - OverRun Error flag. + * USART_FLAG_NE - Noise Error flag. + * USART_FLAG_FE - Framing Error flag. + * USART_FLAG_PE - Parity Error flag. + * + * @return bitstatus: SET or RESET + */ +FlagStatus USART_GetFlagStatus(USART_TypeDef *USARTx, uint16_t USART_FLAG) +{ + FlagStatus bitstatus = RESET; + + if((USARTx->STATR & USART_FLAG) != (uint16_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/********************************************************************* + * @fn USART_ClearFlag + * + * @brief Clears the USARTx's pending flags. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_FLAG - specifies the flag to clear. + * USART_FLAG_LBD - LIN Break detection flag. + * USART_FLAG_TC - Transmission Complete flag. + * USART_FLAG_RXNE - Receive data register not empty flag. + * Note- + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_STATR register (USART_GetFlagStatus()) + * followed by a read operation to USART_DATAR register (USART_ReceiveData()). + * - RXNE flag can be also cleared by a read to the USART_DATAR register + * (USART_ReceiveData()). + * - TC flag can be also cleared by software sequence: a read operation to + * USART_STATR register (USART_GetFlagStatus()) followed by a write operation + * to USART_DATAR register (USART_SendData()). + * - TXE flag is cleared only by a write to the USART_DATAR register + * (USART_SendData()). + * @return none + */ +void USART_ClearFlag(USART_TypeDef *USARTx, uint16_t USART_FLAG) +{ + + USARTx->STATR = (uint16_t)~USART_FLAG; +} + +/********************************************************************* + * @fn USART_GetITStatus + * + * @brief Checks whether the specified USART interrupt has occurred or not. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_IT - specifies the USART interrupt source to check. + * USART_IT_LBD - LIN Break detection interrupt. + * USART_IT_TXE - Tansmit Data Register empty interrupt. + * USART_IT_TC - Transmission complete interrupt. + * USART_IT_RXNE - Receive Data register not empty interrupt. + * USART_IT_IDLE - Idle line detection interrupt. + * USART_IT_ORE_RX - OverRun Error interrupt if the RXNEIE bit is set. + * USART_IT_ORE_ER - OverRun Error interrupt if the EIE bit is set. + * USART_IT_NE - Noise Error interrupt. + * USART_IT_FE - Framing Error interrupt. + * USART_IT_PE - Parity Error interrupt. + * + * @return bitstatus: SET or RESET. + */ +ITStatus USART_GetITStatus(USART_TypeDef *USARTx, uint16_t USART_IT) +{ + uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00; + ITStatus bitstatus = RESET; + + usartreg = (((uint8_t)USART_IT) >> 0x05); + itmask = USART_IT & IT_Mask; + itmask = (uint32_t)0x01 << itmask; + + if(usartreg == 0x01) + { + itmask &= USARTx->CTLR1; + } + else if(usartreg == 0x02) + { + itmask &= USARTx->CTLR2; + } + else + { + itmask &= USARTx->CTLR3; + } + + bitpos = USART_IT >> 0x08; + bitpos = (uint32_t)0x01 << bitpos; + bitpos &= USARTx->STATR; + + if((itmask != (uint16_t)RESET) && (bitpos != (uint16_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + return bitstatus; +} + +/********************************************************************* + * @fn USART_ClearITPendingBit + * + * @brief Clears the USARTx's interrupt pending bits. + * + * @param USARTx - where x can be 1 to 3 to select the USART peripheral. + * UARTx where x can be 4 to 8 to select the UART peripheral. + * USART_IT - specifies the interrupt pending bit to clear. + * USART_IT_LBD - LIN Break detection interrupt. + * USART_IT_TC - Transmission complete interrupt. + * USART_IT_RXNE - Receive Data register not empty interrupt. + * Note- + * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun + * error) and IDLE (Idle line detected) pending bits are cleared by + * software sequence: a read operation to USART_STATR register + * (USART_GetITStatus()) followed by a read operation to USART_DATAR register + * (USART_ReceiveData()). + * - RXNE pending bit can be also cleared by a read to the USART_DATAR register + * (USART_ReceiveData()). + * - TC pending bit can be also cleared by software sequence: a read + * operation to USART_STATR register (USART_GetITStatus()) followed by a write + * operation to USART_DATAR register (USART_SendData()). + * - TXE pending bit is cleared only by a write to the USART_DATAR register + * (USART_SendData()). + * @return none + */ +void USART_ClearITPendingBit(USART_TypeDef *USARTx, uint16_t USART_IT) +{ + uint16_t bitpos = 0x00, itmask = 0x00; + + bitpos = USART_IT >> 0x08; + itmask = ((uint16_t)0x01 << (uint16_t)bitpos); + USARTx->STATR = (uint16_t)~itmask; +} diff --git a/Peripheral/src/ch32v30x_wwdg.c b/Peripheral/src/ch32v30x_wwdg.c new file mode 100644 index 0000000..e027893 --- /dev/null +++ b/Peripheral/src/ch32v30x_wwdg.c @@ -0,0 +1,141 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_wwdg.c +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file provides all the WWDG firmware functions. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_wwdg.h" +#include "ch32v30x_rcc.h" + +/* CTLR register bit mask */ +#define CTLR_WDGA_Set ((uint32_t)0x00000080) + +/* CFGR register bit mask */ +#define CFGR_WDGTB_Mask ((uint32_t)0xFFFFFE7F) +#define CFGR_W_Mask ((uint32_t)0xFFFFFF80) +#define BIT_Mask ((uint8_t)0x7F) + +/********************************************************************* + * @fn WWDG_DeInit + * + * @brief Deinitializes the WWDG peripheral registers to their default reset values + * + * @return none + */ +void WWDG_DeInit(void) +{ + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, DISABLE); +} + +/********************************************************************* + * @fn WWDG_SetPrescaler + * + * @brief Sets the WWDG Prescaler + * + * @param WWDG_Prescaler - specifies the WWDG Prescaler + * WWDG_Prescaler_1 - WWDG counter clock = (PCLK1/4096)/1 + * WWDG_Prescaler_2 - WWDG counter clock = (PCLK1/4096)/2 + * WWDG_Prescaler_4 - WWDG counter clock = (PCLK1/4096)/4 + * WWDG_Prescaler_8 - WWDG counter clock = (PCLK1/4096)/8 + * + * @return none + */ +void WWDG_SetPrescaler(uint32_t WWDG_Prescaler) +{ + uint32_t tmpreg = 0; + tmpreg = WWDG->CFGR & CFGR_WDGTB_Mask; + tmpreg |= WWDG_Prescaler; + WWDG->CFGR = tmpreg; +} + +/********************************************************************* + * @fn WWDG_SetWindowValue + * + * @brief Sets the WWDG window value + * + * @param WindowValue - specifies the window value to be compared to the + * downcounter,which must be lower than 0x80 + * + * @return none + */ +void WWDG_SetWindowValue(uint8_t WindowValue) +{ + __IO uint32_t tmpreg = 0; + + tmpreg = WWDG->CFGR & CFGR_W_Mask; + + tmpreg |= WindowValue & (uint32_t)BIT_Mask; + + WWDG->CFGR = tmpreg; +} + +/********************************************************************* + * @fn WWDG_EnableIT + * + * @brief Enables the WWDG Early Wakeup interrupt(EWI) + * + * @return none + */ +void WWDG_EnableIT(void) +{ + WWDG->CFGR |= (1 << 9); +} + +/********************************************************************* + * @fn WWDG_SetCounter + * + * @brief Sets the WWDG counter value + * + * @param Counter - specifies the watchdog counter value,which must be a + * number between 0x40 and 0x7F + * + * @return none + */ +void WWDG_SetCounter(uint8_t Counter) +{ + WWDG->CTLR = Counter & BIT_Mask; +} + +/********************************************************************* + * @fn WWDG_Enable + * + * @brief Enables WWDG and load the counter value + * + * @param Counter - specifies the watchdog counter value,which must be a + * number between 0x40 and 0x7F + * @return none + */ +void WWDG_Enable(uint8_t Counter) +{ + WWDG->CTLR = CTLR_WDGA_Set | Counter; +} + +/********************************************************************* + * @fn WWDG_GetFlagStatus + * + * @brief Checks whether the Early Wakeup interrupt flag is set or not + * + * @return The new state of the Early Wakeup interrupt flag (SET or RESET) + */ +FlagStatus WWDG_GetFlagStatus(void) +{ + return (FlagStatus)(WWDG->STATR); +} + +/********************************************************************* + * @fn WWDG_ClearFlag + * + * @brief Clears Early Wakeup interrupt flag + * + * @return none + */ +void WWDG_ClearFlag(void) +{ + WWDG->STATR = (uint32_t)RESET; +} diff --git a/Startup/startup_ch32v30x_D8.S b/Startup/startup_ch32v30x_D8.S new file mode 100644 index 0000000..f3ec0ab --- /dev/null +++ b/Startup/startup_ch32v30x_D8.S @@ -0,0 +1,356 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : startup_ch32v30x_D8.s +* Author : WCH +* Version : V1.0.2 +* Date : 2025/03/06 +* Description : CH32V303x vector table for eclipse toolchain. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ + + .section .init,"ax",@progbits + .global _start + .align 1 +_start: + j handle_reset + + .section .vector,"ax",@progbits + .align 1 +_vector_base: + .option norvc; + .word _start + .word 0 + .word NMI_Handler /* NMI */ + .word HardFault_Handler /* Hard Fault */ + .word 0 + .word Ecall_M_Mode_Handler /* Ecall M Mode */ + .word 0 + .word 0 + .word Ecall_U_Mode_Handler /* Ecall U Mode */ + .word Break_Point_Handler /* Break Point */ + .word 0 + .word 0 + .word SysTick_Handler /* SysTick */ + .word 0 + .word SW_Handler /* SW */ + .word 0 + /* External Interrupts */ + .word WWDG_IRQHandler /* Window Watchdog */ + .word PVD_IRQHandler /* PVD through EXTI Line detect */ + .word TAMPER_IRQHandler /* TAMPER */ + .word RTC_IRQHandler /* RTC */ + .word FLASH_IRQHandler /* Flash */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line 0 */ + .word EXTI1_IRQHandler /* EXTI Line 1 */ + .word EXTI2_IRQHandler /* EXTI Line 2 */ + .word EXTI3_IRQHandler /* EXTI Line 3 */ + .word EXTI4_IRQHandler /* EXTI Line 4 */ + .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ + .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ + .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ + .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ + .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ + .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ + .word ADC1_2_IRQHandler /* ADC1_2 */ + .word USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ + .word USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* EXTI Line 9..5 */ + .word TIM1_BRK_IRQHandler /* TIM1 Break */ + .word TIM1_UP_IRQHandler /* TIM1 Update */ + .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* EXTI Line 15..10 */ + .word RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ + .word 0 + .word TIM8_BRK_IRQHandler /* TIM8 Break */ + .word TIM8_UP_IRQHandler /* TIM8 Update */ + .word TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word RNG_IRQHandler /* RNG */ + .word 0 + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_IRQHandler /* TIM6 */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word USBFS_IRQHandler /* USBFS */ + .word 0 + .word 0 + .word 0 + .word UART6_IRQHandler /* UART6 */ + .word UART7_IRQHandler /* UART7 */ + .word UART8_IRQHandler /* UART8 */ + .word TIM9_BRK_IRQHandler /* TIM9 Break */ + .word TIM9_UP_IRQHandler /* TIM9 Update */ + .word TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */ + .word TIM9_CC_IRQHandler /* TIM9 Capture Compare */ + .word TIM10_BRK_IRQHandler /* TIM10 Break */ + .word TIM10_UP_IRQHandler /* TIM10 Update */ + .word TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */ + .word TIM10_CC_IRQHandler /* TIM10 Capture Compare */ + .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .word DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */ + .word DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */ + .word DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */ + .word DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */ + + .option rvc; + .section .text.vector_handler, "ax", @progbits + .weak NMI_Handler /* NMI */ + .weak HardFault_Handler /* Hard Fault */ + .weak Ecall_M_Mode_Handler /* Ecall M Mode */ + .weak Ecall_U_Mode_Handler /* Ecall U Mode */ + .weak Break_Point_Handler /* Break Point */ + .weak SysTick_Handler /* SysTick */ + .weak SW_Handler /* SW */ + .weak WWDG_IRQHandler /* Window Watchdog */ + .weak PVD_IRQHandler /* PVD through EXTI Line detect */ + .weak TAMPER_IRQHandler /* TAMPER */ + .weak RTC_IRQHandler /* RTC */ + .weak FLASH_IRQHandler /* Flash */ + .weak RCC_IRQHandler /* RCC */ + .weak EXTI0_IRQHandler /* EXTI Line 0 */ + .weak EXTI1_IRQHandler /* EXTI Line 1 */ + .weak EXTI2_IRQHandler /* EXTI Line 2 */ + .weak EXTI3_IRQHandler /* EXTI Line 3 */ + .weak EXTI4_IRQHandler /* EXTI Line 4 */ + .weak DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .weak DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ + .weak DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ + .weak DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ + .weak DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ + .weak DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ + .weak DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ + .weak ADC1_2_IRQHandler /* ADC1_2 */ + .weak USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ + .weak USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ + .weak CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .weak CAN1_SCE_IRQHandler /* CAN1 SCE */ + .weak EXTI9_5_IRQHandler /* EXTI Line 9..5 */ + .weak TIM1_BRK_IRQHandler /* TIM1 Break */ + .weak TIM1_UP_IRQHandler /* TIM1 Update */ + .weak TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ + .weak TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .weak TIM2_IRQHandler /* TIM2 */ + .weak TIM3_IRQHandler /* TIM3 */ + .weak TIM4_IRQHandler /* TIM4 */ + .weak I2C1_EV_IRQHandler /* I2C1 Event */ + .weak I2C1_ER_IRQHandler /* I2C1 Error */ + .weak I2C2_EV_IRQHandler /* I2C2 Event */ + .weak I2C2_ER_IRQHandler /* I2C2 Error */ + .weak SPI1_IRQHandler /* SPI1 */ + .weak SPI2_IRQHandler /* SPI2 */ + .weak USART1_IRQHandler /* USART1 */ + .weak USART2_IRQHandler /* USART2 */ + .weak USART3_IRQHandler /* USART3 */ + .weak EXTI15_10_IRQHandler /* EXTI Line 15..10 */ + .weak RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ + .weak TIM8_BRK_IRQHandler /* TIM8 Break */ + .weak TIM8_UP_IRQHandler /* TIM8 Update */ + .weak TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */ + .weak TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .weak RNG_IRQHandler /* RNG */ + .weak SDIO_IRQHandler /* SDIO */ + .weak TIM5_IRQHandler /* TIM5 */ + .weak SPI3_IRQHandler /* SPI3 */ + .weak UART4_IRQHandler /* UART4 */ + .weak UART5_IRQHandler /* UART5 */ + .weak TIM6_IRQHandler /* TIM6 */ + .weak TIM7_IRQHandler /* TIM7 */ + .weak DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .weak DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .weak DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .weak DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .weak DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .weak USBFS_IRQHandler /* USBFS */ + .weak UART6_IRQHandler /* UART6 */ + .weak UART7_IRQHandler /* UART7 */ + .weak UART8_IRQHandler /* UART8 */ + .weak TIM9_BRK_IRQHandler /* TIM9 Break */ + .weak TIM9_UP_IRQHandler /* TIM9 Update */ + .weak TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */ + .weak TIM9_CC_IRQHandler /* TIM9 Capture Compare */ + .weak TIM10_BRK_IRQHandler /* TIM10 Break */ + .weak TIM10_UP_IRQHandler /* TIM10 Update */ + .weak TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */ + .weak TIM10_CC_IRQHandler /* TIM10 Capture Compare */ + .weak DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .weak DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .weak DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */ + .weak DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */ + .weak DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */ + .weak DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */ + +NMI_Handler: +HardFault_Handler: +Ecall_M_Mode_Handler: +Ecall_U_Mode_Handler: +Break_Point_Handler: +SysTick_Handler: +SW_Handler: +WWDG_IRQHandler: +PVD_IRQHandler: +TAMPER_IRQHandler: +RTC_IRQHandler: +FLASH_IRQHandler: +RCC_IRQHandler: +EXTI0_IRQHandler: +EXTI1_IRQHandler: +EXTI2_IRQHandler: +EXTI3_IRQHandler: +EXTI4_IRQHandler: +DMA1_Channel1_IRQHandler: +DMA1_Channel2_IRQHandler: +DMA1_Channel3_IRQHandler: +DMA1_Channel4_IRQHandler: +DMA1_Channel5_IRQHandler: +DMA1_Channel6_IRQHandler: +DMA1_Channel7_IRQHandler: +ADC1_2_IRQHandler: +USB_HP_CAN1_TX_IRQHandler: +USB_LP_CAN1_RX0_IRQHandler: +CAN1_RX1_IRQHandler: +CAN1_SCE_IRQHandler: +EXTI9_5_IRQHandler: +TIM1_BRK_IRQHandler: +TIM1_UP_IRQHandler: +TIM1_TRG_COM_IRQHandler: +TIM1_CC_IRQHandler: +TIM2_IRQHandler: +TIM3_IRQHandler: +TIM4_IRQHandler: +I2C1_EV_IRQHandler: +I2C1_ER_IRQHandler: +I2C2_EV_IRQHandler: +I2C2_ER_IRQHandler: +SPI1_IRQHandler: +SPI2_IRQHandler: +USART1_IRQHandler: +USART2_IRQHandler: +USART3_IRQHandler: +EXTI15_10_IRQHandler: +RTCAlarm_IRQHandler: +TIM8_BRK_IRQHandler: +TIM8_UP_IRQHandler: +TIM8_TRG_COM_IRQHandler: +TIM8_CC_IRQHandler: +RNG_IRQHandler: +SDIO_IRQHandler: +TIM5_IRQHandler: +SPI3_IRQHandler: +UART4_IRQHandler: +UART5_IRQHandler: +TIM6_IRQHandler: +TIM7_IRQHandler: +DMA2_Channel1_IRQHandler: +DMA2_Channel2_IRQHandler: +DMA2_Channel3_IRQHandler: +DMA2_Channel4_IRQHandler: +DMA2_Channel5_IRQHandler: +USBFS_IRQHandler: +UART6_IRQHandler: +UART7_IRQHandler: +UART8_IRQHandler: +TIM9_BRK_IRQHandler: +TIM9_UP_IRQHandler: +TIM9_TRG_COM_IRQHandler: +TIM9_CC_IRQHandler: +TIM10_BRK_IRQHandler: +TIM10_UP_IRQHandler: +TIM10_TRG_COM_IRQHandler: +TIM10_CC_IRQHandler: +DMA2_Channel6_IRQHandler: +DMA2_Channel7_IRQHandler: +DMA2_Channel8_IRQHandler: +DMA2_Channel9_IRQHandler: +DMA2_Channel10_IRQHandler: +DMA2_Channel11_IRQHandler: +1: + j 1b + + .section .text.handle_reset,"ax",@progbits + .weak handle_reset + .align 1 +handle_reset: +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + la sp, _eusrstack + +/* Load data section from flash to RAM */ + la a0, _data_lma + la a1, _data_vma + la a2, _edata + bgeu a1, a2, 2f +1: + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: +/* Clear bss section */ + la a0, _sbss + la a1, _ebss + bgeu a0, a1, 2f +1: + sw zero, (a0) + addi a0, a0, 4 + bltu a0, a1, 1b +2: +/* Configure pipelining and instruction prediction */ + li t0, 0x1f + csrw 0xbc0, t0 +/* Enable interrupt nesting and hardware stack */ + li t0, 0x0b + csrw 0x804, t0 +/* Enable floating point and global interrupt, configure privileged mode */ + li t0, 0x6088 + csrw mstatus, t0 +/* Configure the interrupt vector table recognition mode and entry address mode */ + la t0, _vector_base + ori t0, t0, 3 + csrw mtvec, t0 + + jal SystemInit + la t0, main + csrw mepc, t0 + mret + + + + diff --git a/Startup/startup_ch32v30x_D8C.S b/Startup/startup_ch32v30x_D8C.S new file mode 100644 index 0000000..17c4f8e --- /dev/null +++ b/Startup/startup_ch32v30x_D8C.S @@ -0,0 +1,374 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : startup_ch32v30x_D8C.s +* Author : WCH +* Version : V1.0.1 +* Date : 2025/04/06 +* Description : CH32V307x-CH32V305x vector table for eclipse toolchain. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ + + .section .init,"ax",@progbits + .global _start + .align 1 +_start: + j handle_reset + + .section .vector,"ax",@progbits + .align 1 +_vector_base: + .option norvc; + .word _start + .word 0 + .word NMI_Handler /* NMI */ + .word HardFault_Handler /* Hard Fault */ + .word 0 + .word Ecall_M_Mode_Handler /* Ecall M Mode */ + .word 0 + .word 0 + .word Ecall_U_Mode_Handler /* Ecall U Mode */ + .word Break_Point_Handler /* Break Point */ + .word 0 + .word 0 + .word SysTick_Handler /* SysTick */ + .word 0 + .word SW_Handler /* SW */ + .word 0 + /* External Interrupts */ + .word WWDG_IRQHandler /* Window Watchdog */ + .word PVD_IRQHandler /* PVD through EXTI Line detect */ + .word TAMPER_IRQHandler /* TAMPER */ + .word RTC_IRQHandler /* RTC */ + .word FLASH_IRQHandler /* Flash */ + .word RCC_IRQHandler /* RCC */ + .word EXTI0_IRQHandler /* EXTI Line 0 */ + .word EXTI1_IRQHandler /* EXTI Line 1 */ + .word EXTI2_IRQHandler /* EXTI Line 2 */ + .word EXTI3_IRQHandler /* EXTI Line 3 */ + .word EXTI4_IRQHandler /* EXTI Line 4 */ + .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ + .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ + .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ + .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ + .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ + .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ + .word ADC1_2_IRQHandler /* ADC1_2 */ + .word USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ + .word USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ + .word CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* CAN1 SCE */ + .word EXTI9_5_IRQHandler /* EXTI Line 9..5 */ + .word TIM1_BRK_IRQHandler /* TIM1 Break */ + .word TIM1_UP_IRQHandler /* TIM1 Update */ + .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ + .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .word TIM2_IRQHandler /* TIM2 */ + .word TIM3_IRQHandler /* TIM3 */ + .word TIM4_IRQHandler /* TIM4 */ + .word I2C1_EV_IRQHandler /* I2C1 Event */ + .word I2C1_ER_IRQHandler /* I2C1 Error */ + .word I2C2_EV_IRQHandler /* I2C2 Event */ + .word I2C2_ER_IRQHandler /* I2C2 Error */ + .word SPI1_IRQHandler /* SPI1 */ + .word SPI2_IRQHandler /* SPI2 */ + .word USART1_IRQHandler /* USART1 */ + .word USART2_IRQHandler /* USART2 */ + .word USART3_IRQHandler /* USART3 */ + .word EXTI15_10_IRQHandler /* EXTI Line 15..10 */ + .word RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ + .word USBWakeUp_IRQHandler /* USB Wakeup from suspend */ + .word TIM8_BRK_IRQHandler /* TIM8 Break */ + .word TIM8_UP_IRQHandler /* TIM8 Update */ + .word TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */ + .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .word RNG_IRQHandler /* RNG */ + .word 0 + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_IRQHandler /* TIM6 */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .word ETH_IRQHandler /* ETH */ + .word ETH_WKUP_IRQHandler /* ETH WakeUp */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word USBFS_IRQHandler /* USBFS */ + .word USBHSWakeup_IRQHandler /* USBHS Wakeup */ + .word USBHS_IRQHandler /* USBHS */ + .word DVP_IRQHandler /* DVP */ + .word UART6_IRQHandler /* UART6 */ + .word UART7_IRQHandler /* UART7 */ + .word UART8_IRQHandler /* UART8 */ + .word TIM9_BRK_IRQHandler /* TIM9 Break */ + .word TIM9_UP_IRQHandler /* TIM9 Update */ + .word TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */ + .word TIM9_CC_IRQHandler /* TIM9 Capture Compare */ + .word TIM10_BRK_IRQHandler /* TIM10 Break */ + .word TIM10_UP_IRQHandler /* TIM10 Update */ + .word TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */ + .word TIM10_CC_IRQHandler /* TIM10 Capture Compare */ + .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .word DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */ + .word DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */ + .word DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */ + .word DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */ + + .option rvc; + .section .text.vector_handler, "ax", @progbits + .weak NMI_Handler /* NMI */ + .weak HardFault_Handler /* Hard Fault */ + .weak Ecall_M_Mode_Handler /* Ecall M Mode */ + .weak Ecall_U_Mode_Handler /* Ecall U Mode */ + .weak Break_Point_Handler /* Break Point */ + .weak SysTick_Handler /* SysTick */ + .weak SW_Handler /* SW */ + .weak WWDG_IRQHandler /* Window Watchdog */ + .weak PVD_IRQHandler /* PVD through EXTI Line detect */ + .weak TAMPER_IRQHandler /* TAMPER */ + .weak RTC_IRQHandler /* RTC */ + .weak FLASH_IRQHandler /* Flash */ + .weak RCC_IRQHandler /* RCC */ + .weak EXTI0_IRQHandler /* EXTI Line 0 */ + .weak EXTI1_IRQHandler /* EXTI Line 1 */ + .weak EXTI2_IRQHandler /* EXTI Line 2 */ + .weak EXTI3_IRQHandler /* EXTI Line 3 */ + .weak EXTI4_IRQHandler /* EXTI Line 4 */ + .weak DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ + .weak DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ + .weak DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ + .weak DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ + .weak DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ + .weak DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ + .weak DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ + .weak ADC1_2_IRQHandler /* ADC1_2 */ + .weak USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */ + .weak USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */ + .weak CAN1_RX1_IRQHandler /* CAN1 RX1 */ + .weak CAN1_SCE_IRQHandler /* CAN1 SCE */ + .weak EXTI9_5_IRQHandler /* EXTI Line 9..5 */ + .weak TIM1_BRK_IRQHandler /* TIM1 Break */ + .weak TIM1_UP_IRQHandler /* TIM1 Update */ + .weak TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ + .weak TIM1_CC_IRQHandler /* TIM1 Capture Compare */ + .weak TIM2_IRQHandler /* TIM2 */ + .weak TIM3_IRQHandler /* TIM3 */ + .weak TIM4_IRQHandler /* TIM4 */ + .weak I2C1_EV_IRQHandler /* I2C1 Event */ + .weak I2C1_ER_IRQHandler /* I2C1 Error */ + .weak I2C2_EV_IRQHandler /* I2C2 Event */ + .weak I2C2_ER_IRQHandler /* I2C2 Error */ + .weak SPI1_IRQHandler /* SPI1 */ + .weak SPI2_IRQHandler /* SPI2 */ + .weak USART1_IRQHandler /* USART1 */ + .weak USART2_IRQHandler /* USART2 */ + .weak USART3_IRQHandler /* USART3 */ + .weak EXTI15_10_IRQHandler /* EXTI Line 15..10 */ + .weak RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ + .weak USBWakeUp_IRQHandler /* USB Wakeup from suspend */ + .weak TIM8_BRK_IRQHandler /* TIM8 Break */ + .weak TIM8_UP_IRQHandler /* TIM8 Update */ + .weak TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */ + .weak TIM8_CC_IRQHandler /* TIM8 Capture Compare */ + .weak RNG_IRQHandler /* RNG */ + .weak SDIO_IRQHandler /* SDIO */ + .weak TIM5_IRQHandler /* TIM5 */ + .weak SPI3_IRQHandler /* SPI3 */ + .weak UART4_IRQHandler /* UART4 */ + .weak UART5_IRQHandler /* UART5 */ + .weak TIM6_IRQHandler /* TIM6 */ + .weak TIM7_IRQHandler /* TIM7 */ + .weak DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */ + .weak DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */ + .weak DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */ + .weak DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */ + .weak DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */ + .weak ETH_IRQHandler /* ETH */ + .weak ETH_WKUP_IRQHandler /* ETH WakeUp */ + .weak CAN2_TX_IRQHandler /* CAN2 TX */ + .weak CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .weak CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .weak CAN2_SCE_IRQHandler /* CAN2 SCE */ + .weak USBFS_IRQHandler /* USBFS */ + .weak USBHSWakeup_IRQHandler /* USBHS Wakeup */ + .weak USBHS_IRQHandler /* USBHS */ + .weak DVP_IRQHandler /* DVP */ + .weak UART6_IRQHandler /* UART6 */ + .weak UART7_IRQHandler /* UART7 */ + .weak UART8_IRQHandler /* UART8 */ + .weak TIM9_BRK_IRQHandler /* TIM9 Break */ + .weak TIM9_UP_IRQHandler /* TIM9 Update */ + .weak TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */ + .weak TIM9_CC_IRQHandler /* TIM9 Capture Compare */ + .weak TIM10_BRK_IRQHandler /* TIM10 Break */ + .weak TIM10_UP_IRQHandler /* TIM10 Update */ + .weak TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */ + .weak TIM10_CC_IRQHandler /* TIM10 Capture Compare */ + .weak DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */ + .weak DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */ + .weak DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */ + .weak DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */ + .weak DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */ + .weak DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */ + +NMI_Handler: +HardFault_Handler: +Ecall_M_Mode_Handler: +Ecall_U_Mode_Handler: +Break_Point_Handler: +SysTick_Handler: +SW_Handler: +WWDG_IRQHandler: +PVD_IRQHandler: +TAMPER_IRQHandler: +RTC_IRQHandler: +FLASH_IRQHandler: +RCC_IRQHandler: +EXTI0_IRQHandler: +EXTI1_IRQHandler: +EXTI2_IRQHandler: +EXTI3_IRQHandler: +EXTI4_IRQHandler: +DMA1_Channel1_IRQHandler: +DMA1_Channel2_IRQHandler: +DMA1_Channel3_IRQHandler: +DMA1_Channel4_IRQHandler: +DMA1_Channel5_IRQHandler: +DMA1_Channel6_IRQHandler: +DMA1_Channel7_IRQHandler: +ADC1_2_IRQHandler: +USB_HP_CAN1_TX_IRQHandler: +USB_LP_CAN1_RX0_IRQHandler: +CAN1_RX1_IRQHandler: +CAN1_SCE_IRQHandler: +EXTI9_5_IRQHandler: +TIM1_BRK_IRQHandler: +TIM1_UP_IRQHandler: +TIM1_TRG_COM_IRQHandler: +TIM1_CC_IRQHandler: +TIM2_IRQHandler: +TIM3_IRQHandler: +TIM4_IRQHandler: +I2C1_EV_IRQHandler: +I2C1_ER_IRQHandler: +I2C2_EV_IRQHandler: +I2C2_ER_IRQHandler: +SPI1_IRQHandler: +SPI2_IRQHandler: +USART1_IRQHandler: +USART2_IRQHandler: +USART3_IRQHandler: +EXTI15_10_IRQHandler: +RTCAlarm_IRQHandler: +USBWakeUp_IRQHandler: +TIM8_BRK_IRQHandler: +TIM8_UP_IRQHandler: +TIM8_TRG_COM_IRQHandler: +TIM8_CC_IRQHandler: +RNG_IRQHandler: +SDIO_IRQHandler: +TIM5_IRQHandler: +SPI3_IRQHandler: +UART4_IRQHandler: +UART5_IRQHandler: +TIM6_IRQHandler: +TIM7_IRQHandler: +DMA2_Channel1_IRQHandler: +DMA2_Channel2_IRQHandler: +DMA2_Channel3_IRQHandler: +DMA2_Channel4_IRQHandler: +DMA2_Channel5_IRQHandler: +ETH_IRQHandler: +ETH_WKUP_IRQHandler: +CAN2_TX_IRQHandler: +CAN2_RX0_IRQHandler: +CAN2_RX1_IRQHandler: +CAN2_SCE_IRQHandler: +USBFS_IRQHandler: +USBHSWakeup_IRQHandler: +USBHS_IRQHandler: +DVP_IRQHandler: +UART6_IRQHandler: +UART7_IRQHandler: +UART8_IRQHandler: +TIM9_BRK_IRQHandler: +TIM9_UP_IRQHandler: +TIM9_TRG_COM_IRQHandler: +TIM9_CC_IRQHandler: +TIM10_BRK_IRQHandler: +TIM10_UP_IRQHandler: +TIM10_TRG_COM_IRQHandler: +TIM10_CC_IRQHandler: +DMA2_Channel6_IRQHandler: +DMA2_Channel7_IRQHandler: +DMA2_Channel8_IRQHandler: +DMA2_Channel9_IRQHandler: +DMA2_Channel10_IRQHandler: +DMA2_Channel11_IRQHandler: +1: + j 1b + + .section .text.handle_reset,"ax",@progbits + .weak handle_reset + .align 1 +handle_reset: +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + la sp, _eusrstack + +/* Load data section from flash to RAM */ + la a0, _data_lma + la a1, _data_vma + la a2, _edata + bgeu a1, a2, 2f +1: + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: +/* Clear bss section */ + la a0, _sbss + la a1, _ebss + bgeu a0, a1, 2f +1: + sw zero, (a0) + addi a0, a0, 4 + bltu a0, a1, 1b +2: +/* Configure pipelining and instruction prediction */ + li t0, 0x1f + csrw 0xbc0, t0 +/* Enable interrupt nesting and hardware stack */ + li t0, 0x0b + csrw 0x804, t0 +/* Enable floating point and global interrupt, configure privileged mode */ + li t0, 0x6088 + csrw mstatus, t0 +/* Configure the interrupt vector table recognition mode and entry address mode */ + la t0, _vector_base + ori t0, t0, 3 + csrw mtvec, t0 + + jal SystemInit + la t0, main + csrw mepc, t0 + mret + + diff --git a/User/ch32v30x_conf.h b/User/ch32v30x_conf.h new file mode 100644 index 0000000..bfd19b3 --- /dev/null +++ b/User/ch32v30x_conf.h @@ -0,0 +1,45 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_conf.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : Library configuration file. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_CONF_H +#define __CH32V30x_CONF_H + +#include "ch32v30x_adc.h" +#include "ch32v30x_bkp.h" +#include "ch32v30x_can.h" +#include "ch32v30x_crc.h" +#include "ch32v30x_dac.h" +#include "ch32v30x_dbgmcu.h" +#include "ch32v30x_dma.h" +#include "ch32v30x_exti.h" +#include "ch32v30x_flash.h" +#include "ch32v30x_fsmc.h" +#include "ch32v30x_gpio.h" +#include "ch32v30x_i2c.h" +#include "ch32v30x_iwdg.h" +#include "ch32v30x_pwr.h" +#include "ch32v30x_rcc.h" +#include "ch32v30x_rtc.h" +#include "ch32v30x_sdio.h" +#include "ch32v30x_spi.h" +#include "ch32v30x_tim.h" +#include "ch32v30x_usart.h" +#include "ch32v30x_wwdg.h" +#include "ch32v30x_it.h" +#include "ch32v30x_misc.h" + + +#endif /* __CH32V30x_CONF_H */ + + + + + diff --git a/User/ch32v30x_it.c b/User/ch32v30x_it.c new file mode 100644 index 0000000..6f31e0b --- /dev/null +++ b/User/ch32v30x_it.c @@ -0,0 +1,46 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_it.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : Main Interrupt Service Routines. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x_it.h" + +void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); +void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); + +/********************************************************************* + * @fn NMI_Handler + * + * @brief This function handles NMI exception. + * + * @return none + */ +void NMI_Handler(void) +{ + while (1) + { + } +} + +/********************************************************************* + * @fn HardFault_Handler + * + * @brief This function handles Hard Fault exception. + * + * @return none + */ +void HardFault_Handler(void) +{ + NVIC_SystemReset(); + while (1) + { + } +} + + diff --git a/User/ch32v30x_it.h b/User/ch32v30x_it.h new file mode 100644 index 0000000..d9b111a --- /dev/null +++ b/User/ch32v30x_it.h @@ -0,0 +1,20 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : ch32v30x_it.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : This file contains the headers of the interrupt handlers. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __CH32V30x_IT_H +#define __CH32V30x_IT_H + +#include "debug.h" + + +#endif /* __CH32V30x_IT_H */ + + diff --git a/User/lib/adc/temperature.c b/User/lib/adc/temperature.c new file mode 100644 index 0000000..d8026aa --- /dev/null +++ b/User/lib/adc/temperature.c @@ -0,0 +1,253 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : temperature.c +* Author : WCH +* Version : V1.0.0 +* Date : 2023/11/17 +* Description : Temperature program body. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ + +/* + *@Note + *Internal temperature sensor routine: + *Through the ADC channel 16, the output voltage value and temperature value of the internal + *temperature sensor are collected. + * + */ + +#include "debug.h" +#include "lib/telemetry/telemetry.h" + +/* Global Variable */ +int16_t Calibrattion_Val = 0; + +/********************************************************************* + * @fn ADC_Function_Init + * + * @brief Initializes ADC collection. + * + * @return none + */ +void ADC_Function_Init(void) +{ + ADC_InitTypeDef ADC_InitStructure={0}; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); + RCC_ADCCLKConfig(RCC_PCLK2_Div8); + + ADC_DeInit(ADC1); + ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; + ADC_InitStructure.ADC_ScanConvMode = DISABLE; + ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; + ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; + ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; + ADC_InitStructure.ADC_NbrOfChannel = 1; + ADC_Init(ADC1, &ADC_InitStructure); + + ADC_Cmd(ADC1, ENABLE); + + ADC_BufferCmd(ADC1, DISABLE); //disable buffer + ADC_ResetCalibration(ADC1); + while(ADC_GetResetCalibrationStatus(ADC1)); + ADC_StartCalibration(ADC1); + while(ADC_GetCalibrationStatus(ADC1)); + Calibrattion_Val = Get_CalibrationValue(ADC1); + + ADC_BufferCmd(ADC1, ENABLE); //enable buffer + + ADC_TempSensorVrefintCmd(ENABLE); +} + +/********************************************************************* + * @fn Get_ADC_Val + * + * @brief Returns ADCx conversion result data. + * + * @param ch - ADC channel. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * + * @return none + */ +uint16_t Get_ADC_Val(uint8_t ch) +{ + uint16_t val; + + ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); + ADC_SoftwareStartConvCmd(ADC1, ENABLE); + + while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); + + val = ADC_GetConversionValue(ADC1); + + return val; +} + +/********************************************************************* + * @fn Get_ADC_Average + * + * @brief Returns ADCx conversion result average data. + * + * @param ch - ADC channel. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * + * @return val - The Data conversion value. + */ +uint16_t Get_ADC_Average(uint8_t ch,uint8_t times) +{ + u32 temp_val=0; + uint8_t t; + uint16_t val; + + for(t=0;t4095||val==4095) return 4095; + return (val+Calibrattion_Val); +} + +s32 TempSensor_Volt_To_Temper_x10(s32 Value) +{ + s32 Temper_x10; + s32 Refer_Volt, Refer_Temper; + s32 k = 43; // slope in mV/¡ãC + + // Read factory calibration values + Refer_Volt = (s32)((*(u32 *)0x1FFFF720) & 0x0000FFFF); // mV at reference temp + Refer_Temper = (s32)(((*(u32 *)0x1FFFF720) >> 16) & 0x0000FFFF); // ¡ãC + + // Compute temperature in decicelsius + // Formula: T_x10 = Tref*10 - ((V - Vref)*100 + k/2) / k + // Multiply (V - Vref) by 100 to get tenths of ¡ãC + Temper_x10 = Refer_Temper * 10 - ((Value - Refer_Volt) * 100 + (k / 2)) / k; + + return Temper_x10; +} + + +s32 getTemperature(void) +{ + uint16_t ADC_val; + s32 val_mv; + + ADC_val = Get_ADC_Average( ADC_Channel_TempSensor, 10 ); + + ADC_val = Get_ConversionVal(ADC_val); + + val_mv = (ADC_val*3300/4096); + + return TempSensor_Volt_To_Temper(val_mv); +} + +int16_t getDeciTemperature(void) +{ + uint16_t ADC_val; + s32 val_mv; + + ADC_val = Get_ADC_Average( ADC_Channel_TempSensor, 10 ); + + ADC_val = Get_ConversionVal(ADC_val); + + val_mv = (ADC_val*3300/4096); + + s32 temp_x10 = TempSensor_Volt_To_Temper_x10(val_mv); + + int16_t temp16 = (int16_t)temp_x10; // store in 2 bytes + return temp16; +} + +s32 getVoltage(void) +{ + uint16_t ADC_val; + s32 val_mv; + + ADC_val = Get_ADC_Average( ADC_Channel_1, 10 ); + + ADC_val = Get_ConversionVal(ADC_val); + + + val_mv = (ADC_val*3300/4096); + + return val_mv; +} + +// Helper: convert signed 24-bit int to 3 bytes (big-endian) +void int24_to_bytes(int32_t value, uint8_t *bytes) { + if (value < 0) value += 0x1000000; // 2's complement for 24-bit + bytes[0] = (value >> 16) & 0xFF; + bytes[1] = (value >> 8) & 0xFF; + bytes[2] = value & 0xFF; +} + +// Encode GPS into CayenneLPP payload +void encode_gps(uint8_t channel, int32_t lat, int32_t lon, int32_t alt, uint8_t *payload) { + payload[0] = channel; + payload[1] = LPP_GPS; // GPS type + + //int32_t latInt = lat * 10000; + //int32_t lonInt = lon * 10000; + //int32_t altInt = alt * 100; + + int24_to_bytes(lat, &payload[2]); + int24_to_bytes(lon, &payload[5]); + int24_to_bytes(alt, &payload[8]); + //int24_to_bytes(latInt, &payload[2]); + //int24_to_bytes(lonInt, &payload[5]); + //int24_to_bytes(altInt, &payload[8]); +} \ No newline at end of file diff --git a/User/lib/adc/temperature.h b/User/lib/adc/temperature.h new file mode 100644 index 0000000..3ebf256 --- /dev/null +++ b/User/lib/adc/temperature.h @@ -0,0 +1,113 @@ +#ifndef TEMPERATURE_HEADER +#define TEMPERATURE_HEADER + +/********************************** (C) COPYRIGHT ******************************* +* File Name : temperature.c +* Author : WCH +* Version : V1.0.0 +* Date : 2023/11/17 +* Description : Temperature program body. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ + +/* + *@Note + *Internal temperature sensor routine: + *Through the ADC channel 16, the output voltage value and temperature value of the internal + *temperature sensor are collected. + * + */ + +/* Global Variable */ +extern int16_t Calibrattion_Val; + +/********************************************************************* + * @fn ADC_Function_Init + * + * @brief Initializes ADC collection. + * + * @return none + */ +void ADC_Function_Init(void); + +/********************************************************************* + * @fn Get_ADC_Val + * + * @brief Returns ADCx conversion result data. + * + * @param ch - ADC channel. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * + * @return none + */ +uint16_t Get_ADC_Val(uint8_t ch); + +/********************************************************************* + * @fn Get_ADC_Average + * + * @brief Returns ADCx conversion result average data. + * + * @param ch - ADC channel. + * ADC_Channel_0 - ADC Channel0 selected. + * ADC_Channel_1 - ADC Channel1 selected. + * ADC_Channel_2 - ADC Channel2 selected. + * ADC_Channel_3 - ADC Channel3 selected. + * ADC_Channel_4 - ADC Channel4 selected. + * ADC_Channel_5 - ADC Channel5 selected. + * ADC_Channel_6 - ADC Channel6 selected. + * ADC_Channel_7 - ADC Channel7 selected. + * ADC_Channel_8 - ADC Channel8 selected. + * ADC_Channel_9 - ADC Channel9 selected. + * ADC_Channel_10 - ADC Channel10 selected. + * ADC_Channel_11 - ADC Channel11 selected. + * ADC_Channel_12 - ADC Channel12 selected. + * ADC_Channel_13 - ADC Channel13 selected. + * ADC_Channel_14 - ADC Channel14 selected. + * ADC_Channel_15 - ADC Channel15 selected. + * ADC_Channel_16 - ADC Channel16 selected. + * ADC_Channel_17 - ADC Channel17 selected. + * + * @return val - The Data conversion value. + */ +uint16_t Get_ADC_Average(uint8_t ch,uint8_t times); + +/********************************************************************* + * @fn Get_ConversionVal + * + * @brief Get Conversion Value. + * + * @param val - Sampling value + * + * @return val+Calibrattion_Val - Conversion Value. + */ +uint16_t Get_ConversionVal(int16_t val); + +int32_t getTemperature(void); + +int16_t getDeciTemperature(void); + +int32_t getVoltage(void); + +void encode_gps(uint8_t channel, int32_t lat, int32_t lon, int32_t alt, uint8_t *payload); + +#endif \ No newline at end of file diff --git a/User/lib/base64.c b/User/lib/base64.c new file mode 100644 index 0000000..a9a97ef --- /dev/null +++ b/User/lib/base64.c @@ -0,0 +1,23 @@ +#include "base64.h" + +static const char b64_enc_table[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +void base64_encode (const uint8_t *in, size_t ilen, char *out) { + size_t out_len = 0; + for (size_t i = 0; i < ilen; i += 3) { + uint32_t triple = 0; + int remain = ilen - i; + + triple |= in[i] << 16; + if (remain > 1) + triple |= in[i + 1] << 8; + if (remain > 2) + triple |= in[i + 2]; + + out[out_len++] = b64_enc_table[(triple >> 18) & 0x3F]; + out[out_len++] = b64_enc_table[(triple >> 12) & 0x3F]; + out[out_len++] = (remain > 1) ? b64_enc_table[(triple >> 6) & 0x3F] : '='; + out[out_len++] = (remain > 2) ? b64_enc_table[triple & 0x3F] : '='; + } +} diff --git a/User/lib/base64.h b/User/lib/base64.h new file mode 100644 index 0000000..70f79e6 --- /dev/null +++ b/User/lib/base64.h @@ -0,0 +1,8 @@ +#ifndef BASE64_HEADER_FILE +#define BASE64_HEADER_FILE +#include +#include + +void base64_encode (const uint8_t *in, size_t ilen, char *out); + +#endif \ No newline at end of file diff --git a/User/lib/cifra/aes.c b/User/lib/cifra/aes.c new file mode 100644 index 0000000..bbdad88 --- /dev/null +++ b/User/lib/cifra/aes.c @@ -0,0 +1,415 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#include +#include + +#include "cf_config.h" +#include "aes.h" +#include "handy.h" +#include "bitops.h" +#include "tassert.h" + +static const uint8_t S[256] = + { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, + 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, + 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, + 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, + 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, + 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, + 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, + 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, + 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, + 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, + 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, + 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, + 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, + 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, + 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, + 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, + 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, + 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; + +static const uint8_t Rcon[11] = + { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36}; + +#ifdef INLINE_FUNCS +static inline uint32_t word4 (uint8_t b0, uint8_t b1, uint8_t b2, uint8_t b3) { + return b0 << 24 | b1 << 16 | b2 << 8 | b3; +} + +static inline uint8_t byte (uint32_t w, unsigned x) { + /* nb. bytes are numbered 0 (leftmost, top) + * to 3 (rightmost). */ + x = 3 - x; + return (w >> (x * 8)) & 0xff; +} + +static uint32_t round_constant (uint32_t i) { + return Rcon[i] << 24; +} + +static uint32_t rot_word (uint32_t w) { + /* Takes + * word [a0,a1,a2,a3] + * returns + * word [a1,a2,a3,a0] + * + */ + return rotl32 (w, 8); +} +#endif + +#define word4(a, b, c, d) (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | (d)) +#define byte(w, x) ((w >> ((3 - (x)) << 3)) & 0xff) +#define round_constant(i) ((uint32_t)(Rcon[i]) << 24) +#define rot_word(w) rotl32 ((w), 8) + +static uint32_t sub_word (uint32_t w, const uint8_t *sbox) { + uint8_t a = byte (w, 0), + b = byte (w, 1), + c = byte (w, 2), + d = byte (w, 3); +#if CF_CACHE_SIDE_CHANNEL_PROTECTION + select_u8x4 (&a, &b, &c, &d, sbox, 256); +#else + a = sbox[a]; + b = sbox[b]; + c = sbox[c]; + d = sbox[d]; +#endif + return word4 (a, b, c, d); +} + +static void aes_schedule (cf_aes_context *ctx, const uint8_t *key, size_t nkey) { + size_t i, + nb = AES_BLOCKSZ / 4, + nk = nkey / 4, + n = nb * (ctx->rounds + 1); + uint32_t *w = ctx->ks; + + /* First words are just the key. */ + for (i = 0; i < nk; i++) { + w[i] = read32_be (key + i * 4); + } + + uint32_t i_div_nk = 1; + uint32_t i_mod_nk = 0; + + for (; i < n; i++, i_mod_nk++) { + uint32_t temp = w[i - 1]; + + if (i_mod_nk == nk) { + i_div_nk++; + i_mod_nk = 0; + } + + if (i_mod_nk == 0) + temp = sub_word (rot_word (temp), S) ^ round_constant (i_div_nk); + else if (nk > 6 && i_mod_nk == 4) + temp = sub_word (temp, S); + + w[i] = w[i - nk] ^ temp; + } +} + +void cf_aes_init (cf_aes_context *ctx, const uint8_t *key, size_t nkey) { + memset (ctx, 0, sizeof *ctx); + + switch (nkey) { +#if CF_AES_MAXROUNDS >= AES128_ROUNDS + case 16: + ctx->rounds = AES128_ROUNDS; + aes_schedule (ctx, key, nkey); + break; +#endif + +#if CF_AES_MAXROUNDS >= AES192_ROUNDS + case 24: + ctx->rounds = AES192_ROUNDS; + aes_schedule (ctx, key, nkey); + break; +#endif + +#if CF_AES_MAXROUNDS >= AES256_ROUNDS + case 32: + ctx->rounds = AES256_ROUNDS; + aes_schedule (ctx, key, nkey); + break; +#endif + + default: + abort(); + } +} + +static void add_round_key (uint32_t state[4], const uint32_t rk[4]) { + state[0] ^= rk[0]; + state[1] ^= rk[1]; + state[2] ^= rk[2]; + state[3] ^= rk[3]; +} + +static void sub_block (uint32_t state[4]) { + state[0] = sub_word (state[0], S); + state[1] = sub_word (state[1], S); + state[2] = sub_word (state[2], S); + state[3] = sub_word (state[3], S); +} + +static void shift_rows (uint32_t state[4]) { + uint32_t u, v, x, y; + + u = word4 (byte (state[0], 0), + byte (state[1], 1), + byte (state[2], 2), + byte (state[3], 3)); + + v = word4 (byte (state[1], 0), + byte (state[2], 1), + byte (state[3], 2), + byte (state[0], 3)); + + x = word4 (byte (state[2], 0), + byte (state[3], 1), + byte (state[0], 2), + byte (state[1], 3)); + + y = word4 (byte (state[3], 0), + byte (state[0], 1), + byte (state[1], 2), + byte (state[2], 3)); + + state[0] = u; + state[1] = v; + state[2] = x; + state[3] = y; +} + +static uint32_t gf_poly_mul2 (uint32_t x) { + return ((x & 0x7f7f7f7f) << 1) ^ + (((x & 0x80808080) >> 7) * 0x1b); +} + +static uint32_t mix_column (uint32_t x) { + uint32_t x2 = gf_poly_mul2 (x); + return x2 ^ rotr32 (x ^ x2, 24) ^ rotr32 (x, 16) ^ rotr32 (x, 8); +} + +static void mix_columns (uint32_t state[4]) { + state[0] = mix_column (state[0]); + state[1] = mix_column (state[1]); + state[2] = mix_column (state[2]); + state[3] = mix_column (state[3]); +} + +void cf_aes_encrypt (const cf_aes_context *ctx, + const uint8_t in[AES_BLOCKSZ], + uint8_t out[AES_BLOCKSZ]) { + assert (ctx->rounds == AES128_ROUNDS || + ctx->rounds == AES192_ROUNDS || + ctx->rounds == AES256_ROUNDS); + + uint32_t state[4] = { + read32_be (in + 0), + read32_be (in + 4), + read32_be (in + 8), + read32_be (in + 12)}; + + const uint32_t *round_keys = ctx->ks; + add_round_key (state, round_keys); + round_keys += 4; + + for (uint32_t round = 1; round < ctx->rounds; round++) { + sub_block (state); + shift_rows (state); + mix_columns (state); + add_round_key (state, round_keys); + round_keys += 4; + } + + sub_block (state); + shift_rows (state); + add_round_key (state, round_keys); + + write32_be (state[0], out + 0); + write32_be (state[1], out + 4); + write32_be (state[2], out + 8); + write32_be (state[3], out + 12); +} + +#if CF_AES_ENCRYPT_ONLY == 0 +static const uint8_t S_inv[256] = + { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, + 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, + 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, + 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, + 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, + 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, + 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, + 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, + 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, + 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, + 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, + 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, + 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, + 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, + 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, + 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, + 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, + 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d}; + +static void inv_sub_block (uint32_t state[4]) { + state[0] = sub_word (state[0], S_inv); + state[1] = sub_word (state[1], S_inv); + state[2] = sub_word (state[2], S_inv); + state[3] = sub_word (state[3], S_inv); +} + +static void inv_shift_rows (uint32_t state[4]) { + uint32_t u, v, x, y; + + u = word4 (byte (state[0], 0), + byte (state[3], 1), + byte (state[2], 2), + byte (state[1], 3)); + + v = word4 (byte (state[1], 0), + byte (state[0], 1), + byte (state[3], 2), + byte (state[2], 3)); + + x = word4 (byte (state[2], 0), + byte (state[1], 1), + byte (state[0], 2), + byte (state[3], 3)); + + y = word4 (byte (state[3], 0), + byte (state[2], 1), + byte (state[1], 2), + byte (state[0], 3)); + + state[0] = u; + state[1] = v; + state[2] = x; + state[3] = y; +} + +static uint32_t inv_mix_column (uint32_t x) { + uint32_t x2 = gf_poly_mul2 (x), + x4 = gf_poly_mul2 (x2), + x9 = x ^ gf_poly_mul2 (x4), + x11 = x2 ^ x9, + x13 = x4 ^ x9; + + return x ^ x2 ^ x13 ^ rotr32 (x11, 24) ^ rotr32 (x13, 16) ^ rotr32 (x9, 8); +} + +static void inv_mix_columns (uint32_t state[4]) { + state[0] = inv_mix_column (state[0]); + state[1] = inv_mix_column (state[1]); + state[2] = inv_mix_column (state[2]); + state[3] = inv_mix_column (state[3]); +} + +void cf_aes_decrypt (const cf_aes_context *ctx, + const uint8_t in[AES_BLOCKSZ], + uint8_t out[AES_BLOCKSZ]) { + assert (ctx->rounds == AES128_ROUNDS || + ctx->rounds == AES192_ROUNDS || + ctx->rounds == AES256_ROUNDS); + + uint32_t state[4] = { + read32_be (in + 0), + read32_be (in + 4), + read32_be (in + 8), + read32_be (in + 12)}; + + const uint32_t *round_keys = &ctx->ks[ctx->rounds << 2]; + add_round_key (state, round_keys); + round_keys -= 4; + + for (uint32_t round = ctx->rounds - 1; round != 0; round--) { + inv_shift_rows (state); + inv_sub_block (state); + add_round_key (state, round_keys); + inv_mix_columns (state); + round_keys -= 4; + } + + inv_shift_rows (state); + inv_sub_block (state); + add_round_key (state, round_keys); + + write32_be (state[0], out + 0); + write32_be (state[1], out + 4); + write32_be (state[2], out + 8); + write32_be (state[3], out + 12); +} +#else +void cf_aes_decrypt (const cf_aes_context *ctx, + const uint8_t in[AES_BLOCKSZ], + uint8_t out[AES_BLOCKSZ]) { + abort(); +} +#endif + +void cf_aes_finish (cf_aes_context *ctx) { + mem_clean (ctx, sizeof *ctx); +} + +const cf_prp cf_aes = { + .blocksz = AES_BLOCKSZ, + .encrypt = (cf_prp_block)cf_aes_encrypt, + .decrypt = (cf_prp_block)cf_aes_decrypt}; + +int aes_encrypt_ecb (const uint8_t *key, const uint8_t keyLen, const uint8_t *input, size_t ilen, + uint8_t *output) { + if (ilen % 16 != 0) + return -1; + + cf_aes_context ctx; + cf_aes_init (&ctx, key, keyLen); + + for (size_t i = 0; i < ilen; i += 16) { + cf_aes_encrypt (&ctx, input + i, output + i); + } + + cf_aes_finish (&ctx); + return 0; +} + +int aes_decrypt_ecb (const uint8_t *key, const uint8_t keyLen, const uint8_t *input, size_t ilen, + uint8_t *output) { + if (ilen % 16 != 0) + return -1; + + cf_aes_context ctx; + cf_aes_init (&ctx, key, keyLen); + + for (size_t i = 0; i < ilen; i += 16) { + cf_aes_decrypt (&ctx, input + i, output + i); + } + + + cf_aes_finish (&ctx); + return 0; +} diff --git a/User/lib/cifra/aes.h b/User/lib/cifra/aes.h new file mode 100644 index 0000000..c6e9c72 --- /dev/null +++ b/User/lib/cifra/aes.h @@ -0,0 +1,158 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +/** + * The AES block cipher + * ==================== + * + * This is a small, simple implementation of AES. Key expansion is done + * first, filling in a :c:type:`cf_aes_context`. Then encryption and + * decryption can be performed as desired. + * + * Usually you don't want to use AES directly; you should use it via + * a :doc:`block cipher mode `. + */ + +#ifndef AES_H +#define AES_H + +#include +#include + +#include "prp.h" + +/* .. c:macro:: AES_BLOCKSZ + * AES has a 128-bit block size. This quantity is in bytes. + */ +#define AES_BLOCKSZ 16 + +/* --- Size configuration --- */ + +/* .. c:macro:: AES128_ROUNDS + * .. c:macro:: AES192_ROUNDS + * .. c:macro:: AES256_ROUNDS + * + * Round counts for different key sizes. + */ +#define AES128_ROUNDS 10 +#define AES192_ROUNDS 12 +#define AES256_ROUNDS 14 + +/* .. c:macro:: CF_AES_MAXROUNDS + * + * You can reduce the maximum number of rounds this implementation + * supports. This reduces the storage needed by :c:type:`cf_aes_context`. + * + * The default is :c:macro:`AES256_ROUNDS` and is good for all key + * sizes. + */ +#ifndef CF_AES_MAXROUNDS +# define CF_AES_MAXROUNDS AES256_ROUNDS +#endif + +/* .. c:macro:: CF_AES_ENCRYPT_ONLY + * + * Define this to 1 if you don't need to decrypt anything. + * This saves space. :c:func:`cf_aes_decrypt` calls `abort(3)`. + */ +#ifndef CF_AES_ENCRYPT_ONLY +# define CF_AES_ENCRYPT_ONLY 0 +#endif + +/* .. c:type:: cf_aes_context + * This type represents an expanded AES key. Create one + * using :c:func:`cf_aes_init`, make use of one using + * :c:func:`cf_aes_encrypt` or :c:func:`cf_aes_decrypt`. + * + * The contents of this structure are equivalent to the + * original key material. You should clean the + * contents of this structure with :c:func:`cf_aes_finish` + * when you're done. + * + * .. c:member:: cf_aes_context.rounds + * + * Number of rounds to use, set by :c:func:`cf_aes_init`. + * + * This depends on the original key size, and will be + * :c:macro:`AES128_ROUNDS`, :c:macro:`AES192_ROUNDS` or + * :c:macro:`AES256_ROUNDS`. + * + * .. c:member:: cf_aes_context.ks + * + * Expanded key material. Filled in by :c:func:`cf_aes_init`. + */ +typedef struct +{ + uint32_t rounds; + uint32_t ks[AES_BLOCKSZ / 4 * (CF_AES_MAXROUNDS + 1)]; +} cf_aes_context; + +/* .. c:function:: $DECL + * This function does AES key expansion. It destroys + * existing contents of :c:data:`ctx`. + * + * :param ctx: expanded key context, filled in by this function. + * :param key: pointer to key material, of :c:data:`nkey` bytes. + * :param nkey: length of key material. Must be `16`, `24` or `32`. + */ +extern void cf_aes_init(cf_aes_context *ctx, + const uint8_t *key, + size_t nkey); + +/* .. c:function:: $DECL + * Encrypts the given block, from :c:data:`in` to :c:data:`out`. + * These may alias. + * + * Fails at runtime if :c:data:`ctx` is invalid. + * + * :param ctx: expanded key context + * :param in: input block (read) + * :param out: output block (written) + */ +extern void cf_aes_encrypt(const cf_aes_context *ctx, + const uint8_t in[AES_BLOCKSZ], + uint8_t out[AES_BLOCKSZ]); + +/* .. c:function:: $DECL + * Decrypts the given block, from :c:data:`in` to :c:data:`out`. + * These may alias. + * + * Fails at runtime if :c:data:`ctx` is invalid. + * + * :param ctx: expanded key context + * :param in: input block (read) + * :param out: output block (written) + */ +extern void cf_aes_decrypt(const cf_aes_context *ctx, + const uint8_t in[AES_BLOCKSZ], + uint8_t out[AES_BLOCKSZ]); + +/* .. c:function:: $DECL + * Erase scheduled key material. + * + * Call this when you're done to erase the round keys. */ +extern void cf_aes_finish(cf_aes_context *ctx); + +/* .. c:var:: const cf_prp cf_aes + * Abstract interface to AES. See :c:type:`cf_prp` for + * more information. */ +extern const cf_prp cf_aes; + +int aes_decrypt_ecb (const uint8_t *key, const uint8_t keyLen, const uint8_t *input, size_t ilen, + uint8_t *output); + +int aes_encrypt_ecb (const uint8_t *key, const uint8_t keyLen, const uint8_t *input, size_t ilen, + uint8_t *output); + +#endif diff --git a/User/lib/cifra/bitops.h b/User/lib/cifra/bitops.h new file mode 100644 index 0000000..d0e6942 --- /dev/null +++ b/User/lib/cifra/bitops.h @@ -0,0 +1,294 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef BITOPS_H +#define BITOPS_H + +#include +#include + +/* Assorted bitwise and common operations used in ciphers. */ + +/** Circularly rotate right x by n bits. + * 0 > n > 32. */ +static inline uint32_t rotr32(uint32_t x, unsigned n) +{ + return (x >> n) | (x << (32 - n)); +} + +/** Circularly rotate left x by n bits. + * 0 > n > 32. */ +static inline uint32_t rotl32(uint32_t x, unsigned n) +{ + return (x << n) | (x >> (32 - n)); +} + +/** Circularly rotate right x by n bits. + * 0 > n > 64. */ +static inline uint64_t rotr64(uint64_t x, unsigned n) +{ + return (x >> n) | (x << (64 - n)); +} + +/** Circularly rotate left x by n bits. + * 0 > n > 64. */ +static inline uint64_t rotl64(uint64_t x, unsigned n) +{ + return (x << n) | (x >> (64 - n)); +} + +/** Read 4 bytes from buf, as a 32-bit big endian quantity. */ +static inline uint32_t read32_be(const uint8_t buf[4]) +{ + return (buf[0] << 24) | + (buf[1] << 16) | + (buf[2] << 8) | + (buf[3]); +} + +/** Read 4 bytes from buf, as a 32-bit little endian quantity. */ +static inline uint32_t read32_le(const uint8_t buf[4]) +{ + return (buf[3] << 24) | + (buf[2] << 16) | + (buf[1] << 8) | + (buf[0]); +} + +/** Read 8 bytes from buf, as a 64-bit big endian quantity. */ +static inline uint64_t read64_be(const uint8_t buf[8]) +{ + uint32_t hi = read32_be(buf), + lo = read32_be(buf + 4); + return ((uint64_t)hi) << 32 | + lo; +} + +/** Read 8 bytes from buf, as a 64-bit little endian quantity. */ +static inline uint64_t read64_le(const uint8_t buf[8]) +{ + uint32_t hi = read32_le(buf + 4), + lo = read32_le(buf); + return ((uint64_t)hi) << 32 | + lo; +} + +/** Encode v as a 32-bit big endian quantity into buf. */ +static inline void write32_be(uint32_t v, uint8_t buf[4]) +{ + *buf++ = (v >> 24) & 0xff; + *buf++ = (v >> 16) & 0xff; + *buf++ = (v >> 8) & 0xff; + *buf = v & 0xff; +} + +/** Encode v as a 32-bit little endian quantity into buf. */ +static inline void write32_le(uint32_t v, uint8_t buf[4]) +{ + *buf++ = v & 0xff; + *buf++ = (v >> 8) & 0xff; + *buf++ = (v >> 16) & 0xff; + *buf = (v >> 24) & 0xff; +} + +/** Encode v as a 64-bit big endian quantity into buf. */ +static inline void write64_be(uint64_t v, uint8_t buf[8]) +{ + *buf++ = (v >> 56) & 0xff; + *buf++ = (v >> 48) & 0xff; + *buf++ = (v >> 40) & 0xff; + *buf++ = (v >> 32) & 0xff; + *buf++ = (v >> 24) & 0xff; + *buf++ = (v >> 16) & 0xff; + *buf++ = (v >> 8) & 0xff; + *buf = v & 0xff; +} + +/** Encode v as a 64-bit little endian quantity into buf. */ +static inline void write64_le(uint64_t v, uint8_t buf[8]) +{ + *buf++ = v & 0xff; + *buf++ = (v >> 8) & 0xff; + *buf++ = (v >> 16) & 0xff; + *buf++ = (v >> 24) & 0xff; + *buf++ = (v >> 32) & 0xff; + *buf++ = (v >> 40) & 0xff; + *buf++ = (v >> 48) & 0xff; + *buf = (v >> 56) & 0xff; +} + +/** out = in ^ b8. + * out and in may alias. */ +static inline void xor_b8(uint8_t *out, const uint8_t *in, uint8_t b8, size_t len) +{ + for (size_t i = 0; i < len; i++) + out[i] = in[i] ^ b8; +} + +/** out = x ^ y. + * out, x and y may alias. */ +static inline void xor_bb(uint8_t *out, const uint8_t *x, const uint8_t *y, size_t len) +{ + for (size_t i = 0; i < len; i++) + out[i] = x[i] ^ y[i]; +} + +/* out ^= x + * out and x may alias. */ +static inline void xor_words(uint32_t *out, const uint32_t *x, size_t nwords) +{ + for (size_t i = 0; i < nwords; i++) + out[i] ^= x[i]; +} + +/** Produce 0xffffffff if x == y, zero otherwise, without branching. */ +static inline uint32_t mask_u32(uint32_t x, uint32_t y) +{ + uint32_t diff = x ^ y; + uint32_t diff_is_zero = ~diff & (diff - 1); + return - (diff_is_zero >> 31); +} + +/** Product 0xff if x == y, zero otherwise, without branching. */ +static inline uint8_t mask_u8(uint32_t x, uint32_t y) +{ + uint32_t diff = x ^ y; + uint8_t diff_is_zero = ~diff & (diff - 1); + return - (diff_is_zero >> 7); +} + +/** Select the ith entry from the given table of n values, in a side channel-silent + * way. */ +static inline uint32_t select_u32(uint32_t i, volatile const uint32_t *tab, uint32_t n) +{ + uint32_t r = 0; + + for (uint32_t ii = 0; ii < n; ii++) + { + uint32_t mask = mask_u32(i, ii); + r = (r & ~mask) | (tab[ii] & mask); + } + + return r; +} + +/** Select the ith entry from the given table of n values, in a side channel-silent + * way. */ +static inline uint8_t select_u8(uint32_t i, volatile const uint8_t *tab, uint32_t n) +{ + uint8_t r = 0; + + for (uint32_t ii = 0; ii < n; ii++) + { + uint8_t mask = mask_u8(i, ii); + r = (r & ~mask) | (tab[ii] & mask); + } + + return r; +} + +/** Select the ath, bth, cth and dth entries from the given table of n values, + * placing the results into a, b, c and d. */ +static inline void select_u8x4(uint8_t *a, uint8_t *b, uint8_t *c, uint8_t *d, + volatile const uint8_t *tab, uint32_t n) +{ + uint8_t ra = 0, + rb = 0, + rc = 0, + rd = 0; + uint8_t mask; + + for (uint32_t i = 0; i < n; i++) + { + uint8_t item = tab[i]; + + mask = mask_u8(*a, i); ra = (ra & ~mask) | (item & mask); + mask = mask_u8(*b, i); rb = (rb & ~mask) | (item & mask); + mask = mask_u8(*c, i); rc = (rc & ~mask) | (item & mask); + mask = mask_u8(*d, i); rd = (rd & ~mask) | (item & mask); + } + + *a = ra; + *b = rb; + *c = rc; + *d = rd; +} + +/** out ^= if0 or if1, depending on the value of bit. */ +static inline void select_xor128(uint32_t out[4], + const uint32_t if0[4], + const uint32_t if1[4], + uint8_t bit) +{ + uint32_t mask1 = mask_u32(bit, 1); + uint32_t mask0 = ~mask1; + + out[0] ^= (if0[0] & mask0) | (if1[0] & mask1); + out[1] ^= (if0[1] & mask0) | (if1[1] & mask1); + out[2] ^= (if0[2] & mask0) | (if1[2] & mask1); + out[3] ^= (if0[3] & mask0) | (if1[3] & mask1); +} + +/** Increments the integer stored at v (of non-zero length len) + * with the least significant byte first. */ +static inline void incr_le(uint8_t *v, size_t len) +{ + size_t i = 0; + while (1) + { + if (++v[i] != 0) + return; + i++; + if (i == len) + return; + } +} + +/** Increments the integer stored at v (of non-zero length len) + * with the most significant byte last. */ +static inline void incr_be(uint8_t *v, size_t len) +{ + len--; + while (1) + { + if (++v[len] != 0) + return; + if (len == 0) + return; + len--; + } +} + +/** Copies len bytes from in to out, with in shifted left by offset bits + * to the right. */ +static inline void copy_bytes_unaligned(uint8_t *out, const uint8_t *in, size_t len, uint8_t offset) +{ + uint8_t byte_off = offset / 8; + uint8_t bit_off = offset & 7; + uint8_t rmask = (1 << bit_off) - 1; + uint8_t lmask = ~rmask; + + for (size_t i = 0; i < len; i++) + { + out[i] = (in[i + byte_off] << bit_off) & lmask; + out[i] |= (in[i + byte_off + 1] >> (8 - bit_off)) & rmask; + } +} + +static inline uint32_t count_trailing_zeroes(uint32_t x) +{ + return (uint32_t) __builtin_ctzl(x); +} + +#endif diff --git a/User/lib/cifra/blockwise.c b/User/lib/cifra/blockwise.c new file mode 100644 index 0000000..182c8c5 --- /dev/null +++ b/User/lib/cifra/blockwise.c @@ -0,0 +1,195 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#include "blockwise.h" +#include "bitops.h" +#include "handy.h" +#include "tassert.h" + +#include + +void cf_blockwise_accumulate(uint8_t *partial, size_t *npartial, size_t nblock, + const void *inp, size_t nbytes, + cf_blockwise_in_fn process, + void *ctx) +{ + cf_blockwise_accumulate_final(partial, npartial, nblock, + inp, nbytes, + process, process, ctx); +} + +void cf_blockwise_accumulate_final(uint8_t *partial, size_t *npartial, size_t nblock, + const void *inp, size_t nbytes, + cf_blockwise_in_fn process, + cf_blockwise_in_fn process_final, + void *ctx) +{ + const uint8_t *bufin = inp; + assert(partial && *npartial < nblock); + assert(inp || !nbytes); + assert(process && ctx); + + /* If we have partial data, copy in to buffer. */ + if (*npartial && nbytes) + { + size_t space = nblock - *npartial; + size_t taken = MIN(space, nbytes); + + memcpy(partial + *npartial, bufin, taken); + + bufin += taken; + nbytes -= taken; + *npartial += taken; + + /* If that gives us a full block, process it. */ + if (*npartial == nblock) + { + if (nbytes == 0) + process_final(ctx, partial); + else + process(ctx, partial); + *npartial = 0; + } + } + + /* now nbytes < nblock or *npartial == 0. */ + + /* If we have a full block of data, process it directly. */ + while (nbytes >= nblock) + { + /* Partial buffer must be empty, or we're ignoring extant data */ + assert(*npartial == 0); + + if (nbytes == nblock) + process_final(ctx, bufin); + else + process(ctx, bufin); + bufin += nblock; + nbytes -= nblock; + } + + /* Finally, if we have remaining data, buffer it. */ + while (nbytes) + { + size_t space = nblock - *npartial; + size_t taken = MIN(space, nbytes); + + memcpy(partial + *npartial, bufin, taken); + + bufin += taken; + nbytes -= taken; + *npartial += taken; + + /* If we started with *npartial, we must have copied it + * in first. */ + assert(*npartial < nblock); + } +} + +void cf_blockwise_xor(uint8_t *partial, size_t *npartial, size_t nblock, + const void *inp, void *outp, size_t nbytes, + cf_blockwise_out_fn process, void *ctx) +{ + const uint8_t *inb = inp; + uint8_t *outb = outp; + + assert(partial && *npartial < nblock); + assert(inp || !nbytes); + assert(process && ctx); + + while (nbytes) + { + /* If we're out of material, and need more, produce a block. */ + if (*npartial == 0) + { + process(ctx, partial); + *npartial = nblock; + } + + size_t offset = nblock - *npartial; + size_t taken = MIN(*npartial, nbytes); + xor_bb(outb, inb, partial + offset, taken); + *npartial -= taken; + nbytes -= taken; + outb += taken; + inb += taken; + } +} + +void cf_blockwise_acc_byte(uint8_t *partial, size_t *npartial, + size_t nblock, + uint8_t byte, size_t nbytes, + cf_blockwise_in_fn process, + void *ctx) +{ + /* only memset the whole of the block once */ + int filled = 0; + + while (nbytes) + { + size_t start = *npartial; + size_t count = MIN(nbytes, nblock - start); + + if (!filled) + memset(partial + start, byte, count); + + if (start == 0 && count == nblock) + filled = 1; + + if (start + count == nblock) + { + process(ctx, partial); + *npartial = 0; + } else { + *npartial += count; + } + + nbytes -= count; + } +} + +void cf_blockwise_acc_pad(uint8_t *partial, size_t *npartial, + size_t nblock, + uint8_t fbyte, uint8_t mbyte, uint8_t lbyte, + size_t nbytes, + cf_blockwise_in_fn process, + void *ctx) +{ + + switch (nbytes) + { + case 0: break; + case 1: fbyte ^= lbyte; + cf_blockwise_accumulate(partial, npartial, nblock, &fbyte, 1, process, ctx); + break; + case 2: + cf_blockwise_accumulate(partial, npartial, nblock, &fbyte, 1, process, ctx); + cf_blockwise_accumulate(partial, npartial, nblock, &lbyte, 1, process, ctx); + break; + default: + cf_blockwise_accumulate(partial, npartial, nblock, &fbyte, 1, process, ctx); + + /* If the middle and last bytes differ, then process the last byte separately. + * Otherwise, just extend the middle block size. */ + if (lbyte != mbyte) + { + cf_blockwise_acc_byte(partial, npartial, nblock, mbyte, nbytes - 2, process, ctx); + cf_blockwise_accumulate(partial, npartial, nblock, &lbyte, 1, process, ctx); + } else { + cf_blockwise_acc_byte(partial, npartial, nblock, mbyte, nbytes - 1, process, ctx); + } + + break; + } +} diff --git a/User/lib/cifra/blockwise.h b/User/lib/cifra/blockwise.h new file mode 100644 index 0000000..a20ff95 --- /dev/null +++ b/User/lib/cifra/blockwise.h @@ -0,0 +1,147 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef BLOCKWISE_H +#define BLOCKWISE_H + +#include +#include + +/* Processing function for cf_blockwise_accumulate. */ +typedef void (*cf_blockwise_in_fn)(void *ctx, const uint8_t *data); + +/* Processing function for cf_blockwise_xor. */ +typedef void (*cf_blockwise_out_fn)(void *ctx, uint8_t *data); + +/* This function manages the common abstraction of accumulating input in + * a buffer, and processing it when a full block is available. + * + * partial is the buffer (maintained by the caller) + * on entry, npartial is the currently valid count of used bytes on + * the front of partial. + * on exit, npartial is updated to reflect the status of partial. + * nblock is the blocksize to accumulate -- partial must be at least + * this long! + * input is the new data to process, of length nbytes. + * process is the processing function, passed ctx and a pointer + * to the data to process (always exactly nblock bytes long!) + * which may not neccessarily be the same as partial. + */ +void cf_blockwise_accumulate(uint8_t *partial, size_t *npartial, + size_t nblock, + const void *input, size_t nbytes, + cf_blockwise_in_fn process, + void *ctx); + +/* This function manages the common abstraction of accumulating input in + * a buffer, and processing it when a full block is available. + * This version supports calling a different processing function for + * the last block. + * + * partial is the buffer (maintained by the caller) + * on entry, npartial is the currently valid count of used bytes on + * the front of partial. + * on exit, npartial is updated to reflect the status of partial. + * nblock is the blocksize to accumulate -- partial must be at least + * this long! + * input is the new data to process, of length nbytes. + * process is the processing function, passed ctx and a pointer + * to the data to process (always exactly nblock bytes long!) + * which may not neccessarily be the same as partial. + * process_final is called last (but may not be called at all if + * all input is buffered). + */ +void cf_blockwise_accumulate_final(uint8_t *partial, size_t *npartial, + size_t nblock, + const void *input, size_t nbytes, + cf_blockwise_in_fn process, + cf_blockwise_in_fn process_final, + void *ctx); + +/* This function manages XORing an input stream with a keystream + * to produce an output stream. The keystream is produced in blocks + * (ala a block cipher in counter mode). + * + * partial is the keystream buffer (maintained by the caller) + * on entry, *npartial is the currently valid count of bytes in partial: + * unused bytes are at the *end*. So *npartial = 4 means the last four + * bytes of partial are usable as keystream. + * on exit, npartial is updated to reflect the new state of partial. + * nblock is the blocksize to accumulate -- partial must be at least + * this long! + * input is the new data to process, of length nbytes. + * output is where to write input xored with the keystream -- also length + * nbytes. + * process is the processing function, passed ctx and partial which it + * should fill with fresh key stream. + */ +void cf_blockwise_xor(uint8_t *partial, size_t *npartial, + size_t nblock, + const void *input, void *output, size_t nbytes, + cf_blockwise_out_fn newblock, + void *ctx); + +/* This function processes a single byte a number of times. It's useful + * for padding, and more efficient than calling cf_blockwise_accumulate + * a bunch of times. + * + * partial is the buffer (maintained by the caller) + * on entry, npartial is the currently valid count of used bytes on + * the front of partial. + * on exit, npartial is updated to reflect the status of partial. + * nblock is the blocksize to accumulate -- partial must be at least + * this long! + * process is the processing function, passed ctx and a pointer + * to the data to process (always exactly nblock bytes long!) + * which may not neccessarily be the same as partial. + * byte is the byte to process, nbytes times. + */ +void cf_blockwise_acc_byte(uint8_t *partial, size_t *npartial, + size_t nblock, + uint8_t byte, size_t nbytes, + cf_blockwise_in_fn process, + void *ctx); + +/* This function attempts to process patterns of bytes common in + * block cipher padding. + * + * This takes three bytes: + * - a first byte, fbyte, + * - a middle byte, mbyte, + * - a last byte, lbyte. + * + * If nbytes is zero, nothing happens. + * If nbytes is one, the byte fbyte ^ lbyte is processed. + * If nbytes is two, the fbyte then lbyte are processed. + * If nbytes is three or more, fbyte, then one or more mbytes, then fbyte + * is processed. + * + * partial is the buffer (maintained by the caller) + * on entry, npartial is the currently valid count of used bytes on + * the front of partial. + * on exit, npartial is updated to reflect the status of partial. + * nblock is the blocksize to accumulate -- partial must be at least + * this long! + * process is the processing function, passed ctx and a pointer + * to the data to process (always exactly nblock bytes long!) + * which may not neccessarily be the same as partial. + */ +void cf_blockwise_acc_pad(uint8_t *partial, size_t *npartial, + size_t nblock, + uint8_t fbyte, uint8_t mbyte, uint8_t lbyte, + size_t nbytes, + cf_blockwise_in_fn process, + void *ctx); + +#endif diff --git a/User/lib/cifra/cf_config.h b/User/lib/cifra/cf_config.h new file mode 100644 index 0000000..ceb7e8d --- /dev/null +++ b/User/lib/cifra/cf_config.h @@ -0,0 +1,59 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef CF_CONFIG_H +#define CF_CONFIG_H + +/** + * Library configuration + * ===================== + */ + +/* .. c:macro:: CF_SIDE_CHANNEL_PROTECTION + * Define this as 1 if you need all available side channel protections. + * **This option may alter the ABI**. + * + * This has a non-trivial performance penalty. Where a + * side-channel free option is cheap or free (like checking + * a MAC) this is always done in a side-channel free way. + * + * The default is **on** for all available protections. + */ +#ifndef CF_SIDE_CHANNEL_PROTECTION +# define CF_SIDE_CHANNEL_PROTECTION 1 +#endif + +/* .. c:macro:: CF_TIME_SIDE_CHANNEL_PROTECTION + * Define this as 1 if you need timing/branch prediction side channel + * protection. + * + * You probably want this. The default is on. */ +#ifndef CF_TIME_SIDE_CHANNEL_PROTECTION +# define CF_TIME_SIDE_CHANNEL_PROTECTION CF_SIDE_CHANNEL_PROTECTION +#endif + +/* .. c:macro:: CF_CACHE_SIDE_CHANNEL_PROTECTION + * Define this as 1 if you need cache side channel protection. + * + * If you have a microcontroller with no cache, you can turn this off + * without negative effects. + * + * The default is on. This will have some performance impact, + * especially on AES. + */ +#ifndef CF_CACHE_SIDE_CHANNEL_PROTECTION +# define CF_CACHE_SIDE_CHANNEL_PROTECTION CF_SIDE_CHANNEL_PROTECTION +#endif + +#endif diff --git a/User/lib/cifra/chash.c b/User/lib/cifra/chash.c new file mode 100644 index 0000000..4ee5d76 --- /dev/null +++ b/User/lib/cifra/chash.c @@ -0,0 +1,28 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#include "chash.h" +#include "handy.h" +#include "tassert.h" + +void cf_hash(const cf_chash *h, const void *m, size_t nm, uint8_t *out) +{ + cf_chash_ctx ctx; + assert(h); + h->init(&ctx); + h->update(&ctx, m, nm); + h->digest(&ctx, out); + mem_clean(&ctx, sizeof ctx); +} + diff --git a/User/lib/cifra/chash.h b/User/lib/cifra/chash.h new file mode 100644 index 0000000..a06209f --- /dev/null +++ b/User/lib/cifra/chash.h @@ -0,0 +1,137 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef CHASH_H +#define CHASH_H + +#include +#include + +/** + * General hash function description + * ================================= + * This allows us to make use of hash functions without depending + * on a specific one. This is useful in implementing, for example, + * :doc:`HMAC `. + */ + +/* .. c:type:: cf_chash_init + * Hashing initialisation function type. + * + * Functions of this type should initialise the context in preparation + * for hashing a message with `cf_chash_update` functions. + * + * :rtype: void + * :param ctx: hash function-specific context structure. + */ +typedef void (*cf_chash_init)(void *ctx); + +/* .. c:type:: cf_chash_update + * Hashing data processing function type. + * + * Functions of this type hash `count` bytes of data at `data`, + * updating the contents of `ctx`. + * + * :rtype: void + * :param ctx: hash function-specific context structure. + * :param data: input data to hash. + * :param count: number of bytes to hash. + */ +typedef void (*cf_chash_update)(void *ctx, const void *data, size_t count); + +/* .. c:type:: cf_chash_digest + * Hashing completion function type. + * + * Functions of this type complete a hashing operation, + * writing :c:member:`cf_chash.hashsz` bytes to `hash`. + * + * This function does not change `ctx` -- any padding which needs doing + * must be done seperately (in a copy of `ctx`, say). + * + * This means you can interlave `_update` and `_digest` calls to + * learn `H(A)` and `H(A || B)` without hashing `A` twice. + * + * :rtype: void + * :param ctx: hash function-specific context structure. + * :param hash: location to write hash result. + */ +typedef void (*cf_chash_digest)(const void *ctx, uint8_t *hash); + +/* .. c:type:: cf_chash + * This type describes an incremental hash function in an abstract way. + * + * .. c:member:: cf_chash.hashsz + * The hash function's output, in bytes. + * + * .. c:member:: cf_chash.blocksz + * The hash function's internal block size, in bytes. + * + * .. c:member:: cf_chash.init + * Context initialisation function. + * + * .. c:member:: cf_chash:update + * Data processing function. + * + * .. c:member:: cf_chash:digest + * Completion function. + * + */ +typedef struct +{ + size_t hashsz; + size_t blocksz; + + cf_chash_init init; + cf_chash_update update; + cf_chash_digest digest; +} cf_chash; + +/* .. c:macro:: CF_CHASH_MAXCTX + * The maximum size of a :c:type:`cf_chash_ctx`. This allows + * use to put a structure in automatic storage that can + * store working data for any supported hash function. */ +#define CF_CHASH_MAXCTX 390 + +/* .. c:macro:: CF_CHASH_MAXBLK + * Maximum hash function block size (in bytes). */ +#define CF_CHASH_MAXBLK 128 + +/* .. c:macro:: CF_MAXHASH + * Maximum hash function output (in bytes). */ +#define CF_MAXHASH 64 + +/* .. c:type:: cf_chash_ctx + * A type usable with any `cf_chash` as a context. */ +typedef union +{ + uint8_t ctx[CF_CHASH_MAXCTX]; + uint16_t uint16_t; + uint32_t u32; + uint64_t u64; +} cf_chash_ctx; + +/* .. c:function:: $DECL + * One shot hashing: `out = h(m)`. + * + * Using the hash function `h`, `nm` bytes at `m` are hashed and `h->hashsz` bytes + * of result is written to the buffer `out`. + * + * :param h: hash function description. + * :param m: message buffer. + * :param nm: message length. + * :param out: hash result buffer (written). + */ +void cf_hash(const cf_chash *h, const void *m, size_t nm, uint8_t *out); + +#endif diff --git a/User/lib/cifra/handy.h b/User/lib/cifra/handy.h new file mode 100644 index 0000000..a9b2d9d --- /dev/null +++ b/User/lib/cifra/handy.h @@ -0,0 +1,86 @@ +#ifndef HANDY_H +#define HANDY_H + +#include +#include +#include + +/* + * Handy CPP defines and C inline functions. + */ + +/* Evaluates to the number of items in array-type variable arr. */ +#define ARRAYCOUNT(arr) (sizeof arr / sizeof arr[0]) + +/* Normal MIN/MAX macros. Evaluate argument expressions only once. */ +#ifndef MIN + #define MIN(x, y) \ + ({ typeof (x) __x = (x); \ + typeof (y) __y = (y); \ + __x < __y ? __x : __y; }) +#endif +#ifndef MAX + #define MAX(x, y) \ + ({ typeof (x) __x = (x); \ + typeof (y) __y = (y); \ + __x > __y ? __x : __y; }) +#endif + +/* Swap two values. Uses GCC type inference magic. */ +#ifndef SWAP + #define SWAP(x, y) \ + do { \ + typeof (x) __tmp = (x); \ + (x) = (y); \ + (y) = __tmp; \ + } while (0) +#endif + +/** Stringify its argument. */ +#define STRINGIFY(x) STRINGIFY_(x) +#define STRINGIFY_(x) #x + +/* Error handling macros. + * + * These expect a zero = success, non-zero = error convention. + */ + +/** Error: return. + * + * If the expression fails, return the error from this function. */ +#define ER(expr) do { typeof (expr) err_ = (expr); if (err_) return err_; } while (0) + +/** Error: goto. + * + * If the expression fails, goto x_err. Assumes defn of label + * x_err and 'error_type err'. */ +#define EG(expr) do { err = (expr); if (err) goto x_err; } while (0) + +/** Like memset(ptr, 0, len), but not allowed to be removed by + * compilers. */ +static inline void mem_clean(volatile void *v, size_t len) +{ + if (len) + { + memset((void *) v, 0, len); + (void) *((volatile uint8_t *) v); + } +} + +/** Returns 1 if len bytes at va equal len bytes at vb, 0 if they do not. + * Does not leak length of common prefix through timing. */ +static inline unsigned mem_eq(const void *va, const void *vb, size_t len) +{ + const volatile uint8_t *a = va; + const volatile uint8_t *b = vb; + uint8_t diff = 0; + + while (len--) + { + diff |= *a++ ^ *b++; + } + + return !diff; +} + +#endif diff --git a/User/lib/cifra/hmac.c b/User/lib/cifra/hmac.c new file mode 100644 index 0000000..4038acd --- /dev/null +++ b/User/lib/cifra/hmac.c @@ -0,0 +1,117 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#include "hmac.h" +#include "chash.h" +#include "bitops.h" +#include "handy.h" +#include "tassert.h" +#include "sha2.h" + +#include + +void cf_hmac_init(cf_hmac_ctx *ctx, + const cf_chash *hash, + const uint8_t *key, size_t nkey) +{ + assert(ctx); + assert(hash); + + mem_clean(ctx, sizeof *ctx); + ctx->hash = hash; + + /* Prepare key: */ + uint8_t k[CF_CHASH_MAXBLK]; + + /* Shorten long keys. */ + if (nkey > hash->blocksz) + { + /* Standard doesn't cover case where blocksz < hashsz. + * FIPS186-1 seems to want to append a negative number of zero bytes. + * In any case, we only have a k buffer of CF_CHASH_MAXBLK! */ + assert(hash->hashsz <= hash->blocksz); + + cf_hash(hash, key, nkey, k); + key = k; + nkey = hash->hashsz; + } + + /* Right zero-pad short keys. */ + if (k != key) + memcpy(k, key, nkey); + if (hash->blocksz > nkey) + memset(k + nkey, 0, hash->blocksz - nkey); + + /* Start inner hash computation */ + uint8_t blk[CF_CHASH_MAXBLK]; + + xor_b8(blk, k, 0x36, hash->blocksz); + hash->init(&ctx->inner); + hash->update(&ctx->inner, blk, hash->blocksz); + + /* And outer. */ + xor_b8(blk, k, 0x5c, hash->blocksz); + hash->init(&ctx->outer); + hash->update(&ctx->outer, blk, hash->blocksz); + + mem_clean(blk, sizeof blk); + mem_clean(k, sizeof k); +} + +void cf_hmac_update(cf_hmac_ctx *ctx, const void *data, size_t ndata) +{ + assert(ctx && ctx->hash); + + ctx->hash->update(&ctx->inner, data, ndata); +} + +void cf_hmac_finish(cf_hmac_ctx *ctx, uint8_t *out) +{ + assert(ctx && ctx->hash); + assert(out); + + uint8_t innerh[CF_MAXHASH]; + ctx->hash->digest(&ctx->inner, innerh); + + ctx->hash->update(&ctx->outer, innerh, ctx->hash->hashsz); + ctx->hash->digest(&ctx->outer, out); + + mem_clean(ctx, sizeof *ctx); +} + +void cf_hmac(const uint8_t *key, size_t nkey, + const uint8_t *msg, size_t nmsg, + uint8_t *out, + const cf_chash *hash) +{ + cf_hmac_ctx ctx; + + assert(out); + assert(hash); + + cf_hmac_init(&ctx, hash, key, nkey); + cf_hmac_update(&ctx, msg, nmsg); + cf_hmac_finish(&ctx, out); +} + +// HMAC-SHA256 +int hmac_sha256 (const uint8_t *key, size_t keylen, + const uint8_t *input, size_t ilen, + uint8_t *output) { + cf_hmac_ctx ctx; + cf_hmac_init (&ctx, &cf_sha256, key, keylen); + cf_hmac_update (&ctx, input, ilen); + cf_hmac_finish (&ctx, output); + return 0; +} diff --git a/User/lib/cifra/hmac.h b/User/lib/cifra/hmac.h new file mode 100644 index 0000000..863c9d1 --- /dev/null +++ b/User/lib/cifra/hmac.h @@ -0,0 +1,82 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef HMAC_H +#define HMAC_H + +#include +#include + +#include "chash.h" + +/** + * HMAC + * ==== + * This is a one-shot and incremental interface to computing + * HMAC with any hash function. + * + * (Note: HMAC with SHA3 is possible, but is probably not a + * sensible thing to want.) + */ + +/* .. c:type:: cf_hmac_ctx + * HMAC incremental interface context. + * + * .. c:member:: cf_hmac_ctx.hash + * Hash function description. + * + * .. c:member:: cf_hmac_ctx.inner + * Inner hash computation. + * + * .. c:member:: cf_hmac_ctx.outer + * Outer hash computation. + */ +typedef struct +{ + const cf_chash *hash; + cf_chash_ctx inner; + cf_chash_ctx outer; +} cf_hmac_ctx; + +/* .. c:function:: $DECL + * Set up ctx for computing a HMAC using the given hash and key. */ +void cf_hmac_init(cf_hmac_ctx *ctx, + const cf_chash *hash, + const uint8_t *key, size_t nkey); + +/* .. c:function:: $DECL + * Input data. */ +void cf_hmac_update(cf_hmac_ctx *ctx, + const void *data, size_t ndata); + +/* .. c:function:: $DECL + * Finish and compute HMAC. + * `ctx->hash->hashsz` bytes are written to `out`. */ +void cf_hmac_finish(cf_hmac_ctx *ctx, uint8_t *out); + +/* .. c:function:: $DECL + * One shot interface: compute `HMAC_hash(key, msg)`, writing the + * answer (which is `hash->hashsz` long) to `out`. + * + * This function does not fail. */ +void cf_hmac(const uint8_t *key, size_t nkey, + const uint8_t *msg, size_t nmsg, + uint8_t *out, + const cf_chash *hash); + +int hmac_sha256 (const uint8_t *key, size_t keylen, + const uint8_t *input, size_t ilen, + uint8_t *output); + +#endif diff --git a/User/lib/cifra/prp.h b/User/lib/cifra/prp.h new file mode 100644 index 0000000..1aa7258 --- /dev/null +++ b/User/lib/cifra/prp.h @@ -0,0 +1,64 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef PRP_H +#define PRP_H + +#include +#include + +/** + * General block cipher description + * ================================ + * This allows us to implement block cipher modes which can work + * with different block ciphers. + */ + +/* .. c:type:: cf_prp_block + * Block processing function type. + * + * The `in` and `out` blocks may alias. + * + * :rtype: void + * :param ctx: block cipher-specific context object. + * :param in: input block. + * :param out: output block. + */ +typedef void (*cf_prp_block)(void *ctx, const uint8_t *in, uint8_t *out); + +/* .. c:type:: cf_prp + * Describes an PRP in a general way. + * + * .. c:member:: cf_prp.blocksz + * Block size in bytes. Must be no more than :c:macro:`CF_MAXBLOCK`. + * + * .. c:member:: cf_prp.encrypt + * Block encryption function. + * + * .. c:member:: cf_prp.decrypt + * Block decryption function. + */ +typedef struct +{ + size_t blocksz; + cf_prp_block encrypt; + cf_prp_block decrypt; +} cf_prp; + +/* .. c:macro:: CF_MAXBLOCK + * The maximum block cipher blocksize we support, in bytes. + */ +#define CF_MAXBLOCK 16 + +#endif diff --git a/User/lib/cifra/sha2.h b/User/lib/cifra/sha2.h new file mode 100644 index 0000000..117a6a1 --- /dev/null +++ b/User/lib/cifra/sha2.h @@ -0,0 +1,89 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef SHA2_H +#define SHA2_H + +#include +#include + +#include "chash.h" + +/** + * SHA224/SHA256 + * ============= + */ + +/* .. c:macro:: CF_SHA256_HASHSZ + * The output size of SHA256: 32 bytes. */ +#define CF_SHA256_HASHSZ 32 + +/* .. c:macro:: CF_SHA256_BLOCKSZ + * The block size of SHA256: 64 bytes. */ +#define CF_SHA256_BLOCKSZ 64 + +/* .. c:type:: cf_sha256_context + * Incremental SHA256 hashing context. + * + * .. c:member:: cf_sha256_context.H + * Intermediate values. + * + * .. c:member:: cf_sha256_context.partial + * Unprocessed input. + * + * .. c:member:: cf_sha256_context.npartial + * Number of bytes of unprocessed input. + * + * .. c:member:: cf_sha256_context.blocks + * Number of full blocks processed. + */ +typedef struct +{ + uint32_t H[8]; /* State. */ + uint8_t partial[CF_SHA256_BLOCKSZ]; /* Partial block of input. */ + uint32_t blocks; /* Number of full blocks processed into H. */ + size_t npartial; /* Number of bytes in prefix of partial. */ +} cf_sha256_context; + +/* .. c:function:: $DECL + * Sets up `ctx` ready to hash a new message. + */ +extern void cf_sha256_init(cf_sha256_context *ctx); + +/* .. c:function:: $DECL + * Hashes `nbytes` at `data`. Copies the data if there isn't enough to make + * a full block. + */ +extern void cf_sha256_update(cf_sha256_context *ctx, const void *data, size_t nbytes); + +/* .. c:function:: $DECL + * Finishes the hash operation, writing `CF_SHA256_HASHSZ` bytes to `hash`. + * + * This leaves `ctx` unchanged. + */ +extern void cf_sha256_digest(const cf_sha256_context *ctx, uint8_t hash[CF_SHA256_HASHSZ]); + +/* .. c:function:: $DECL + * Finishes the hash operation, writing `CF_SHA256_HASHSZ` bytes to `hash`. + * + * This destroys `ctx`, but uses less stack than :c:func:`cf_sha256_digest`. + */ +extern void cf_sha256_digest_final(cf_sha256_context *ctx, uint8_t hash[CF_SHA256_HASHSZ]); + +/* .. c:var:: cf_sha256 + * Abstract interface to SHA256. See :c:type:`cf_chash` for more information. + */ +extern const cf_chash cf_sha256; + +#endif diff --git a/User/lib/cifra/sha256.c b/User/lib/cifra/sha256.c new file mode 100644 index 0000000..7d77e39 --- /dev/null +++ b/User/lib/cifra/sha256.c @@ -0,0 +1,177 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#include + +#include "sha2.h" +#include "blockwise.h" +#include "bitops.h" +#include "handy.h" +#include "tassert.h" + +static const uint32_t K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +# define CH(x, y, z) (((x) & (y)) ^ (~(x) & (z))) +# define MAJ(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) +# define BSIG0(x) (rotr32((x), 2) ^ rotr32((x), 13) ^ rotr32((x), 22)) +# define BSIG1(x) (rotr32((x), 6) ^ rotr32((x), 11) ^ rotr32((x), 25)) +# define SSIG0(x) (rotr32((x), 7) ^ rotr32((x), 18) ^ ((x) >> 3)) +# define SSIG1(x) (rotr32((x), 17) ^ rotr32((x), 19) ^ ((x) >> 10)) + +void cf_sha256_init(cf_sha256_context *ctx) +{ + memset(ctx, 0, sizeof *ctx); + ctx->H[0] = 0x6a09e667; + ctx->H[1] = 0xbb67ae85; + ctx->H[2] = 0x3c6ef372; + ctx->H[3] = 0xa54ff53a; + ctx->H[4] = 0x510e527f; + ctx->H[5] = 0x9b05688c; + ctx->H[6] = 0x1f83d9ab; + ctx->H[7] = 0x5be0cd19; +} + +static void sha256_update_block(void *vctx, const uint8_t *inp) +{ + cf_sha256_context *ctx = vctx; + + /* This is a 16-word window into the whole W array. */ + uint32_t W[16]; + + uint32_t a = ctx->H[0], + b = ctx->H[1], + c = ctx->H[2], + d = ctx->H[3], + e = ctx->H[4], + f = ctx->H[5], + g = ctx->H[6], + h = ctx->H[7], + Wt; + + for (size_t t = 0; t < 64; t++) + { + /* For W[0..16] we process the input into W. + * For W[16..64] we compute the next W value: + * + * W[t] = SSIG1(W[t - 2]) + W[t - 7] + SSIG0(W[t - 15]) + W[t - 16]; + * + * But all W indices are reduced mod 16 into our window. + */ + if (t < 16) + { + W[t] = Wt = read32_be(inp); + inp += 4; + } else { + Wt = SSIG1(W[(t - 2) % 16]) + + W[(t - 7) % 16] + + SSIG0(W[(t - 15) % 16]) + + W[(t - 16) % 16]; + W[t % 16] = Wt; + } + + uint32_t T1 = h + BSIG1(e) + CH(e, f, g) + K[t] + Wt; + uint32_t T2 = BSIG0(a) + MAJ(a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + ctx->H[0] += a; + ctx->H[1] += b; + ctx->H[2] += c; + ctx->H[3] += d; + ctx->H[4] += e; + ctx->H[5] += f; + ctx->H[6] += g; + ctx->H[7] += h; + + ctx->blocks++; +} + +void cf_sha256_update(cf_sha256_context *ctx, const void *data, size_t nbytes) +{ + cf_blockwise_accumulate(ctx->partial, &ctx->npartial, sizeof ctx->partial, + data, nbytes, + sha256_update_block, ctx); +} + +void cf_sha256_digest(const cf_sha256_context *ctx, uint8_t hash[CF_SHA256_HASHSZ]) +{ + cf_sha256_context ours = *ctx; + cf_sha256_digest_final(&ours, hash); +} + +void cf_sha256_digest_final(cf_sha256_context *ctx, uint8_t hash[CF_SHA256_HASHSZ]) +{ + uint64_t digested_bytes = ctx->blocks; + digested_bytes = digested_bytes * CF_SHA256_BLOCKSZ + ctx->npartial; + uint64_t digested_bits = digested_bytes * 8; + + size_t padbytes = CF_SHA256_BLOCKSZ - ((digested_bytes + 8) % CF_SHA256_BLOCKSZ); + + /* Hash 0x80 00 ... block first. */ + cf_blockwise_acc_pad(ctx->partial, &ctx->npartial, sizeof ctx->partial, + 0x80, 0x00, 0x00, padbytes, + sha256_update_block, ctx); + + /* Now hash length. */ + uint8_t buf[8]; + write64_be(digested_bits, buf); + cf_sha256_update(ctx, buf, 8); + + /* We ought to have got our padding calculation right! */ + assert(ctx->npartial == 0); + + write32_be(ctx->H[0], hash + 0); + write32_be(ctx->H[1], hash + 4); + write32_be(ctx->H[2], hash + 8); + write32_be(ctx->H[3], hash + 12); + write32_be(ctx->H[4], hash + 16); + write32_be(ctx->H[5], hash + 20); + write32_be(ctx->H[6], hash + 24); + write32_be(ctx->H[7], hash + 28); + + memset(ctx, 0, sizeof *ctx); +} + +const cf_chash cf_sha256 = { + .hashsz = CF_SHA256_HASHSZ, + .blocksz = CF_SHA256_BLOCKSZ, + .init = (cf_chash_init) cf_sha256_init, + .update = (cf_chash_update) cf_sha256_update, + .digest = (cf_chash_digest) cf_sha256_digest +}; + diff --git a/User/lib/cifra/tassert.h b/User/lib/cifra/tassert.h new file mode 100644 index 0000000..58ebb4c --- /dev/null +++ b/User/lib/cifra/tassert.h @@ -0,0 +1,32 @@ +/* + * cifra - embedded cryptography library + * Written in 2014 by Joseph Birr-Pixton + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to the + * public domain worldwide. This software is distributed without any + * warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see + * . + */ + +#ifndef TASSERT_H +#define TASSERT_H + +/* Tiny assert + * ----------- + * + * This is an assert(3) definition which doesn't include any + * strings, but just branches to abort(3) on failure. + */ + +#ifndef FULL_FAT_ASSERT +# include +# define assert(expr) do { if (!(expr)) abort(); } while (0) +#else +# include +#endif + +#endif diff --git a/User/lib/config.c b/User/lib/config.c new file mode 100644 index 0000000..30a0838 --- /dev/null +++ b/User/lib/config.c @@ -0,0 +1,274 @@ +#include "config.h" +#include "ch32v30x_flash.h" +#include "ch32v30x_rng.h" +#include "lib/cifra/sha2.h" +#include "lib/monocypher/monocypher-ed25519.h" +#include "sx1262.h" +#include "util/hexdump.h" +#include "util/log.h" + +PersistentData_t persistent; + +LoRaSettings currentLoRaSettings; + +#define TAG "Config" + +NodeEntry *getNextNode() { + uint32_t oldest_timestamp = UINT32_MAX; + NodeEntry *selectedNode = &(persistent.contacts[0]); + for (int i = 0; i < CONTACT_COUNT; i++) { + NodeEntry *curNode = &(persistent.contacts[i]); + if (curNode->flags & NODE_ENTRY_FAV_FLAG) { + continue; + } + if (curNode->last_seen_lt == 0) { + selectedNode = curNode; + break; + } + if (curNode->last_seen_lt < oldest_timestamp) { + oldest_timestamp = curNode->last_seen_lt; + selectedNode = curNode; + } + } + return selectedNode; +} + +NodeEntry *getNode (uint8_t hash) { + NodeEntry *selectedNode = NULL; + for (int i = 0; i < CONTACT_COUNT; i++) { + NodeEntry *curNode = &(persistent.contacts[i]); + if (curNode->pubKey[0] == hash) { + selectedNode = curNode; + break; + } + } + return selectedNode; +} + +NodeEntry *getNodePrefix (const uint8_t *hash) { + NodeEntry *selectedNode = NULL; + for (int i = 0; i < CONTACT_COUNT; i++) { + NodeEntry *curNode = &(persistent.contacts[i]); + if (memcmp (curNode->pubKey, hash, 4)) { + selectedNode = curNode; + break; + } + } + return selectedNode; +} + +Channel *getChannel (uint8_t hash, uint8_t ignoreCount) { + Channel *selectedChannel = NULL; + Channel *finalChannel = NULL; + uint8_t matchCount = 0; + for (int i = 0; i < ChannelCount; i++) { + Channel *curChannel = &(persistent.channels[i]); + if (curChannel->hash == hash) { + selectedChannel = curChannel; + if (++matchCount > ignoreCount) { + finalChannel = selectedChannel; + break; + } + } + } + return finalChannel; +} + +void addChannel (char *name, const uint8_t *key) { + + uint32_t oldest_timestamp = UINT32_MAX; + Channel *selectedChannel = &(persistent.channels[0]); + for (int i = 0; i < ChannelCount; i++) { + Channel *curChan = &(persistent.channels[i]); + + if (curChan->timestamp == 0) { + selectedChannel = curChan; + MESH_LOGD (TAG, "Deciding on channel index %d because of timestamp 0, name is %s", i, name); + break; + } + if (strlen (curChan->name) == 0) { + selectedChannel = curChan; + MESH_LOGD (TAG, "Deciding on channel index %d because of name len 0, name is %s", i, name); + break; + } + + if (curChan->timestamp < oldest_timestamp) { + oldest_timestamp = curChan->timestamp; + selectedChannel = curChan; + } + } + + + memset (selectedChannel->name, 0, sizeof (selectedChannel->name)); + strncpy (selectedChannel->name, name, sizeof (selectedChannel->name)); + memcpy (selectedChannel->key, key, sizeof (selectedChannel->key)); + // Buffer for the digest + uint8_t hash[CF_SHA256_HASHSZ]; + + // Context + cf_sha256_context ctx; + + // 1. Initialize + cf_sha256_init (&ctx); + + // 2. Feed in your data + cf_sha256_update (&ctx, selectedChannel->key, sizeof (selectedChannel->key)); + + // 3. Compute digest + cf_sha256_digest (&ctx, hash); + selectedChannel->hash = hash[0]; + selectedChannel->timestamp = RTC_GetCounter(); +} + +void printNodeDB() { + puts ("Node database:"); + for (int i = 0; i < CONTACT_COUNT; i++) { + const NodeEntry *node = &(persistent.contacts[i]); + if (node->last_seen_lt == 0) + continue; // skip inactive nodes + + iprintf ("Node %d:\n", i); + iprintf (" Name: %s\n", node->name); + hexdump ("Pubkey", node->pubKey, sizeof (node->pubKey)); + hexdump ("Secret", node->secret, sizeof (node->secret)); + iprintf ("\n"); + + iprintf (" GPS: lat=%d, lon=%d\n", node->gps_latitude, node->gps_longitude); + iprintf (" Path: ... (not expanded, add if needed)\n"); + iprintf (" Flags: 0x%02X\n", node->flags); + iprintf (" Type: 0x%02X\n", node->type); + iprintf (" Authenticated: %s\n", node->authenticated ? "Yes" : "No"); + iprintf (" Last Seen (remote ts): %d\n", node->last_seen_rt); + iprintf (" Last Seen (local ts): %d\n", node->last_seen_lt); + iprintf (" Sync timestamp: %d\n", node->sync_timestamp); + iprintf ("--------------------------------------\n"); + } +} + +void loadConfig() { + memcpy (&persistent, FLASH_USER_PAGE_ADDR, sizeof (persistent)); + memcpy(¤tLoRaSettings, &(persistent.loraSettings), sizeof(currentLoRaSettings)); + uint32_t crcSum = *((uint32_t *)(((uint8_t *)&persistent) + (sizeof (persistent) - 2))); + memset ((((uint8_t *)&persistent) + (sizeof (persistent) - sizeof (crcSum))), 0, 4); + CRC_ResetDR(); + uint32_t currentSum = CRC_CalcBlockCRC ((uint32_t *)&persistent, sizeof (persistent) - 2); + + if (currentSum != crcSum) { + memset (&persistent, 0, sizeof (persistent)); + } +} + +void saveConfig() { + CRC_ResetDR(); + uint32_t currentSum = CRC_CalcBlockCRC ((uint32_t *)&persistent, sizeof (persistent) - 2); + memcpy ((((uint8_t *)&persistent) + (sizeof (persistent) - sizeof (currentSum))), (uint8_t *)currentSum, 4); + FLASH_Unlock(); + FLASH_ErasePage_Fast (1919); + FLASH_ProgramPage_Fast (1919, (uint32_t *)&persistent); + FLASH_Lock(); +} + +void genSeed (uint8_t *seedOut) { + RCC_AHBPeriphClockCmd (RCC_AHBPeriph_RNG, ENABLE); + RNG_Cmd (ENABLE); + uint32_t random; + for (uint8_t i = 0; i < 8; i++) { + while (RNG_GetFlagStatus (RNG_FLAG_DRDY) == RESET) { + Delay_Ms(10); + } + random = RNG_GetRandomNumber(); + + memcpy (&(seedOut[i * 4]), &random, sizeof (random)); + } + RCC_AHBPeriphClockCmd (RCC_AHBPeriph_RNG, DISABLE); + RNG_Cmd (DISABLE); +} + +const uint8_t publicChannelPSK[16] = {0x8b, 0x33, 0x87, 0xe9, 0xc5, 0xcd, 0xea, 0x6a, 0xc9, 0xe5, 0xed, 0xba, 0xa1, 0x15, 0xcd, 0x72}; +const uint8_t BRNTestChannelPSK[16] = {0x44, 0x81, 0xda, 0x0e, 0x4e, 0x03, 0xc4, 0x9e, 0x84, 0x77, 0x25, 0xd8, 0x3a, 0x93, 0xbf, 0x80}; + +const char *getStringRole (uint8_t role) { + switch (role) { + case NODE_TYPE_CHAT_NODE: + return "Chat node"; + + case NODE_TYPE_REPEATER: + return "Repeater"; + + case NODE_TYPE_ROOM_SERVER: + return "Room server"; + + case NODE_TYPE_SENSOR: + return "Sensor"; + + default: + return "Unknown"; + } +} + +void populateDefaults() { + + uint8_t seed[32]; + //memcpy(seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz4", 32); //chat node identity + //memcpy (seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxz3", 32); // repeater identity + memcpy (seed, "vFt0FRugSOeqnkshImMCVfgHM5vBxy1", 32); // repeater identity + // genSeed(seed); //random identity + + crypto_ed25519_key_pair(persistent.privkey, persistent.pubkey, seed); + + + persistent.nodeType = NODE_TYPE_CHAT_NODE; + //persistent.nodeType = NODE_TYPE_REPEATER; + memset (persistent.password, 0, sizeof (persistent.password)); + strcpy (persistent.password, "hesielko"); + //strcpy (persistent.nodeName, "BRN WCHNode RISCV"); + strcpy (persistent.nodeName, "BRN WCH Mini"); + + persistent.adcMultiplier = 0; + + persistent.loraSettings.txPowerInDbm = 20; + persistent.loraSettings.frequencyInHz = 869554000; + persistent.loraSettings.spreadingFactor = 8; + persistent.loraSettings.bandwidth = SX126X_LORA_BW_62_5; + persistent.loraSettings.codingRate = SX126X_LORA_CR_4_8; + persistent.loraSettings.preambleLength = 16; + persistent.loraSettings.tcxoVoltage = 2200; // ebyte + // persistent.tcxoVoltage = 1800; // heltec + + memcpy(¤tLoRaSettings, &(persistent.loraSettings), sizeof(currentLoRaSettings)); + + addChannel ("Public", publicChannelPSK); + addChannel ("BRNTest", BRNTestChannelPSK); + + persistent.doRepeat = 1; + persistent.allowReadOnly = 1; + + + persistent.latitude = 48190900; + persistent.longitude = 17030300; + persistent.altitude = 23400; +} + +void LoraApply() { + + MESH_LOGW (TAG, "LoraInit"); + LoRaInit(); + + + char useRegulatorLDO = 0; + + LoRaDebugPrint (0); + uint16_t loraBeginStat = LoRaBegin (currentLoRaSettings.frequencyInHz, currentLoRaSettings.txPowerInDbm, currentLoRaSettings.tcxoVoltage, useRegulatorLDO); + if (loraBeginStat != 0) { + MESH_LOGE (TAG, "Does not recognize the module"); + while (1) { + Delay_Ms(1000); + MESH_LOGE (TAG, "CRITICAL: LoRa not found, halted"); + } + } + + char crcOn = 1; + char invertIrq = 0; + + LoRaConfig (currentLoRaSettings.spreadingFactor, currentLoRaSettings.bandwidth, currentLoRaSettings.codingRate, currentLoRaSettings.preambleLength, 0, crcOn, invertIrq); +} \ No newline at end of file diff --git a/User/lib/config.h b/User/lib/config.h new file mode 100644 index 0000000..3fdefd9 --- /dev/null +++ b/User/lib/config.h @@ -0,0 +1,80 @@ +#ifndef CONFIG_HEADER +#define CONFIG_HEADER +#include "stdint.h" +#include "string.h" +#include "meshcore/packetstructs.h" + +#define FLASH_USER_PAGE_ADDR ((const void *)(0x08077F00)) + +#define ChannelCount 8 +//#define CONTACT_COUNT 100 +#define CONTACT_COUNT 16 + +#define VERSION "v0.0.1 - BRN Systems RISC-V" + +#define BOARD "WCH CH32V307" + +typedef struct LoRaSettings { + int8_t txPowerInDbm; + uint32_t frequencyInHz; + uint8_t spreadingFactor; + uint8_t bandwidth; + uint8_t codingRate; + uint16_t preambleLength; + uint16_t tcxoVoltage; +} LoRaSettings; + +extern LoRaSettings currentLoRaSettings; + +typedef struct { + uint32_t magic; // e.g. 0xDEADBEEF + + uint8_t privkey[32]; // Ed25519 private + uint8_t pubkey[32]; // Ed25519 public + + uint8_t nodeType; + char nodeName[32]; + + int32_t latitude; + int32_t longitude; + int32_t altitude; + + LoRaSettings loraSettings; + + Channel channels[ChannelCount]; + NodeEntry contacts[CONTACT_COUNT]; + + uint8_t password[16]; + uint8_t guestPassword[16]; + + uint8_t doRepeat; + uint8_t allowReadOnly; + uint16_t adcMultiplier; + uint16_t airtimeFactor; + uint32_t crc32; // integrity check +} PersistentData_t; + +extern PersistentData_t persistent; + +void saveConfig(); +void loadConfig(); + +void printNodeDB(); + +NodeEntry *getNextNode(); + +NodeEntry *getNode (uint8_t hash); + +Channel *getChannel (uint8_t hash, uint8_t ignoreCount); + +void addChannel (char *name, const uint8_t *key); + +NodeEntry *getNodePrefix (const uint8_t *hash); + +const char *getStringRole (uint8_t role); + +void populateDefaults(); + +void LoraApply(); + +#endif \ No newline at end of file diff --git a/User/lib/monocypher/monocypher-ed25519.c b/User/lib/monocypher/monocypher-ed25519.c new file mode 100644 index 0000000..8619117 --- /dev/null +++ b/User/lib/monocypher/monocypher-ed25519.c @@ -0,0 +1,503 @@ +// Monocypher version 4.0.3 +// +// This file is dual-licensed. Choose whichever licence you want from +// the two licences listed below. +// +// The first licence is a regular 2-clause BSD licence. The second licence +// is the CC-0 from Creative Commons. It is intended to release Monocypher +// to the public domain. The BSD licence serves as a fallback option. +// +// SPDX-License-Identifier: BSD-2-Clause OR CC0-1.0 +// +// ------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019, Loup Vaillant +// All rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ------------------------------------------------------------------------ +// +// Written in 2017-2019 by Loup Vaillant +// +// To the extent possible under law, the author(s) have dedicated all copyright +// and related neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication along +// with this software. If not, see +// + +#include "monocypher-ed25519.h" + +#ifdef MONOCYPHER_CPP_NAMESPACE +namespace MONOCYPHER_CPP_NAMESPACE { +#endif + +///////////////// +/// Utilities /// +///////////////// +#define FOR(i, min, max) for (size_t i = min; i < max; i++) +#define COPY(dst, src, size) FOR(_i_, 0, size) (dst)[_i_] = (src)[_i_] +#define ZERO(buf, size) FOR(_i_, 0, size) (buf)[_i_] = 0 +#define WIPE_CTX(ctx) crypto_wipe(ctx , sizeof(*(ctx))) +#define WIPE_BUFFER(buffer) crypto_wipe(buffer, sizeof(buffer)) +#define MIN(a, b) ((a) <= (b) ? (a) : (b)) +typedef uint8_t u8; +typedef uint64_t u64; + +// Returns the smallest positive integer y such that +// (x + y) % pow_2 == 0 +// Basically, it's how many bytes we need to add to "align" x. +// Only works when pow_2 is a power of 2. +// Note: we use ~x+1 instead of -x to avoid compiler warnings +static size_t align(size_t x, size_t pow_2) +{ + return (~x + 1) & (pow_2 - 1); +} + +static u64 load64_be(const u8 s[8]) +{ + return((u64)s[0] << 56) + | ((u64)s[1] << 48) + | ((u64)s[2] << 40) + | ((u64)s[3] << 32) + | ((u64)s[4] << 24) + | ((u64)s[5] << 16) + | ((u64)s[6] << 8) + | (u64)s[7]; +} + +static void store64_be(u8 out[8], u64 in) +{ + out[0] = (u8)(in >> 56); + out[1] = (u8)(in >> 48); + out[2] = (u8)(in >> 40); + out[3] = (u8)(in >> 32); + out[4] = (u8)(in >> 24); + out[5] = (u8)(in >> 16); + out[6] = (u8)(in >> 8); + out[7] = (u8) in ; +} + +static void load64_be_buf (u64 *dst, const u8 *src, size_t size) { + FOR(i, 0, size) { dst[i] = load64_be(src + i*8); } +} + +/////////////// +/// SHA 512 /// +/////////////// +static u64 rot(u64 x, int c ) { return (x >> c) | (x << (64 - c)); } +static u64 ch (u64 x, u64 y, u64 z) { return (x & y) ^ (~x & z); } +static u64 maj(u64 x, u64 y, u64 z) { return (x & y) ^ ( x & z) ^ (y & z); } +static u64 big_sigma0(u64 x) { return rot(x, 28) ^ rot(x, 34) ^ rot(x, 39); } +static u64 big_sigma1(u64 x) { return rot(x, 14) ^ rot(x, 18) ^ rot(x, 41); } +static u64 lit_sigma0(u64 x) { return rot(x, 1) ^ rot(x, 8) ^ (x >> 7); } +static u64 lit_sigma1(u64 x) { return rot(x, 19) ^ rot(x, 61) ^ (x >> 6); } + +static const u64 K[80] = { + 0x428a2f98d728ae22,0x7137449123ef65cd,0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc, + 0x3956c25bf348b538,0x59f111f1b605d019,0x923f82a4af194f9b,0xab1c5ed5da6d8118, + 0xd807aa98a3030242,0x12835b0145706fbe,0x243185be4ee4b28c,0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f,0x80deb1fe3b1696b1,0x9bdc06a725c71235,0xc19bf174cf692694, + 0xe49b69c19ef14ad2,0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65, + 0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5, + 0x983e5152ee66dfab,0xa831c66d2db43210,0xb00327c898fb213f,0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2,0xd5a79147930aa725,0x06ca6351e003826f,0x142929670a0e6e70, + 0x27b70a8546d22ffc,0x2e1b21385c26c926,0x4d2c6dfc5ac42aed,0x53380d139d95b3df, + 0x650a73548baf63de,0x766a0abb3c77b2a8,0x81c2c92e47edaee6,0x92722c851482353b, + 0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30, + 0xd192e819d6ef5218,0xd69906245565a910,0xf40e35855771202a,0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8,0x1e376c085141ab53,0x2748774cdf8eeb99,0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb,0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc,0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec, + 0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b, + 0xca273eceea26619c,0xd186b8c721c0c207,0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178, + 0x06f067aa72176fba,0x0a637dc5a2c898a6,0x113f9804bef90dae,0x1b710b35131c471b, + 0x28db77f523047d84,0x32caab7b40c72493,0x3c9ebe0a15c9bebc,0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6,0x597f299cfc657e2a,0x5fcb6fab3ad6faec,0x6c44198c4a475817 +}; + +static void sha512_compress(crypto_sha512_ctx *ctx) +{ + u64 a = ctx->hash[0]; u64 b = ctx->hash[1]; + u64 c = ctx->hash[2]; u64 d = ctx->hash[3]; + u64 e = ctx->hash[4]; u64 f = ctx->hash[5]; + u64 g = ctx->hash[6]; u64 h = ctx->hash[7]; + + FOR (j, 0, 16) { + u64 in = K[j] + ctx->input[j]; + u64 t1 = big_sigma1(e) + ch (e, f, g) + h + in; + u64 t2 = big_sigma0(a) + maj(a, b, c); + h = g; g = f; f = e; e = d + t1; + d = c; c = b; b = a; a = t1 + t2; + } + size_t i16 = 0; + FOR(i, 1, 5) { + i16 += 16; + FOR (j, 0, 16) { + ctx->input[j] += lit_sigma1(ctx->input[(j- 2) & 15]); + ctx->input[j] += lit_sigma0(ctx->input[(j-15) & 15]); + ctx->input[j] += ctx->input[(j- 7) & 15]; + u64 in = K[i16 + j] + ctx->input[j]; + u64 t1 = big_sigma1(e) + ch (e, f, g) + h + in; + u64 t2 = big_sigma0(a) + maj(a, b, c); + h = g; g = f; f = e; e = d + t1; + d = c; c = b; b = a; a = t1 + t2; + } + } + + ctx->hash[0] += a; ctx->hash[1] += b; + ctx->hash[2] += c; ctx->hash[3] += d; + ctx->hash[4] += e; ctx->hash[5] += f; + ctx->hash[6] += g; ctx->hash[7] += h; +} + +// Write 1 input byte +static void sha512_set_input(crypto_sha512_ctx *ctx, u8 input) +{ + size_t word = ctx->input_idx >> 3; + size_t byte = ctx->input_idx & 7; + ctx->input[word] |= (u64)input << (8 * (7 - byte)); +} + +// Increment a 128-bit "word". +static void sha512_incr(u64 x[2], u64 y) +{ + x[1] += y; + if (x[1] < y) { + x[0]++; + } +} + +void crypto_sha512_init(crypto_sha512_ctx *ctx) +{ + ctx->hash[0] = 0x6a09e667f3bcc908; + ctx->hash[1] = 0xbb67ae8584caa73b; + ctx->hash[2] = 0x3c6ef372fe94f82b; + ctx->hash[3] = 0xa54ff53a5f1d36f1; + ctx->hash[4] = 0x510e527fade682d1; + ctx->hash[5] = 0x9b05688c2b3e6c1f; + ctx->hash[6] = 0x1f83d9abfb41bd6b; + ctx->hash[7] = 0x5be0cd19137e2179; + ctx->input_size[0] = 0; + ctx->input_size[1] = 0; + ctx->input_idx = 0; + ZERO(ctx->input, 16); +} + +void crypto_sha512_update(crypto_sha512_ctx *ctx, + const u8 *message, size_t message_size) +{ + // Avoid undefined NULL pointer increments with empty messages + if (message_size == 0) { + return; + } + + // Align ourselves with word boundaries + if ((ctx->input_idx & 7) != 0) { + size_t nb_bytes = MIN(align(ctx->input_idx, 8), message_size); + FOR (i, 0, nb_bytes) { + sha512_set_input(ctx, message[i]); + ctx->input_idx++; + } + message += nb_bytes; + message_size -= nb_bytes; + } + + // Align ourselves with block boundaries + if ((ctx->input_idx & 127) != 0) { + size_t nb_words = MIN(align(ctx->input_idx, 128), message_size) >> 3; + load64_be_buf(ctx->input + (ctx->input_idx >> 3), message, nb_words); + ctx->input_idx += nb_words << 3; + message += nb_words << 3; + message_size -= nb_words << 3; + } + + // Compress block if needed + if (ctx->input_idx == 128) { + sha512_incr(ctx->input_size, 1024); // size is in bits + sha512_compress(ctx); + ctx->input_idx = 0; + ZERO(ctx->input, 16); + } + + // Process the message block by block + FOR (i, 0, message_size >> 7) { // number of blocks + load64_be_buf(ctx->input, message, 16); + sha512_incr(ctx->input_size, 1024); // size is in bits + sha512_compress(ctx); + ctx->input_idx = 0; + ZERO(ctx->input, 16); + message += 128; + } + message_size &= 127; + + if (message_size != 0) { + // Remaining words + size_t nb_words = message_size >> 3; + load64_be_buf(ctx->input, message, nb_words); + ctx->input_idx += nb_words << 3; + message += nb_words << 3; + message_size -= nb_words << 3; + + // Remaining bytes + FOR (i, 0, message_size) { + sha512_set_input(ctx, message[i]); + ctx->input_idx++; + } + } +} + +void crypto_sha512_final(crypto_sha512_ctx *ctx, u8 hash[64]) +{ + // Add padding bit + if (ctx->input_idx == 0) { + ZERO(ctx->input, 16); + } + sha512_set_input(ctx, 128); + + // Update size + sha512_incr(ctx->input_size, ctx->input_idx * 8); + + // Compress penultimate block (if any) + if (ctx->input_idx > 111) { + sha512_compress(ctx); + ZERO(ctx->input, 14); + } + // Compress last block + ctx->input[14] = ctx->input_size[0]; + ctx->input[15] = ctx->input_size[1]; + sha512_compress(ctx); + + // Copy hash to output (big endian) + FOR (i, 0, 8) { + store64_be(hash + i*8, ctx->hash[i]); + } + + WIPE_CTX(ctx); +} + +void crypto_sha512(u8 hash[64], const u8 *message, size_t message_size) +{ + crypto_sha512_ctx ctx; + crypto_sha512_init (&ctx); + crypto_sha512_update(&ctx, message, message_size); + crypto_sha512_final (&ctx, hash); +} + +//////////////////// +/// HMAC SHA 512 /// +//////////////////// +void crypto_sha512_hmac_init(crypto_sha512_hmac_ctx *ctx, + const u8 *key, size_t key_size) +{ + // hash key if it is too long + if (key_size > 128) { + crypto_sha512(ctx->key, key, key_size); + key = ctx->key; + key_size = 64; + } + // Compute inner key: padded key XOR 0x36 + FOR (i, 0, key_size) { ctx->key[i] = key[i] ^ 0x36; } + FOR (i, key_size, 128) { ctx->key[i] = 0x36; } + // Start computing inner hash + crypto_sha512_init (&ctx->ctx); + crypto_sha512_update(&ctx->ctx, ctx->key, 128); +} + +void crypto_sha512_hmac_update(crypto_sha512_hmac_ctx *ctx, + const u8 *message, size_t message_size) +{ + crypto_sha512_update(&ctx->ctx, message, message_size); +} + +void crypto_sha512_hmac_final(crypto_sha512_hmac_ctx *ctx, u8 hmac[64]) +{ + // Finish computing inner hash + crypto_sha512_final(&ctx->ctx, hmac); + // Compute outer key: padded key XOR 0x5c + FOR (i, 0, 128) { + ctx->key[i] ^= 0x36 ^ 0x5c; + } + // Compute outer hash + crypto_sha512_init (&ctx->ctx); + crypto_sha512_update(&ctx->ctx, ctx->key , 128); + crypto_sha512_update(&ctx->ctx, hmac, 64); + crypto_sha512_final (&ctx->ctx, hmac); // outer hash + WIPE_CTX(ctx); +} + +void crypto_sha512_hmac(u8 hmac[64], const u8 *key, size_t key_size, + const u8 *message, size_t message_size) +{ + crypto_sha512_hmac_ctx ctx; + crypto_sha512_hmac_init (&ctx, key, key_size); + crypto_sha512_hmac_update(&ctx, message, message_size); + crypto_sha512_hmac_final (&ctx, hmac); +} + +//////////////////// +/// HKDF SHA 512 /// +//////////////////// +void crypto_sha512_hkdf_expand(u8 *okm, size_t okm_size, + const u8 *prk, size_t prk_size, + const u8 *info, size_t info_size) +{ + int not_first = 0; + u8 ctr = 1; + u8 blk[64]; + + while (okm_size > 0) { + size_t out_size = MIN(okm_size, sizeof(blk)); + + crypto_sha512_hmac_ctx ctx; + crypto_sha512_hmac_init(&ctx, prk , prk_size); + if (not_first) { + // For some reason HKDF uses some kind of CBC mode. + // For some reason CTR mode alone wasn't enough. + // Like what, they didn't trust HMAC in 2010? Really?? + crypto_sha512_hmac_update(&ctx, blk , sizeof(blk)); + } + crypto_sha512_hmac_update(&ctx, info, info_size); + crypto_sha512_hmac_update(&ctx, &ctr, 1); + crypto_sha512_hmac_final(&ctx, blk); + + COPY(okm, blk, out_size); + + not_first = 1; + okm += out_size; + okm_size -= out_size; + ctr++; + } + WIPE_BUFFER(blk); +} + +void crypto_sha512_hkdf(u8 *okm , size_t okm_size, + const u8 *ikm , size_t ikm_size, + const u8 *salt, size_t salt_size, + const u8 *info, size_t info_size) +{ + // Extract + u8 prk[64]; + crypto_sha512_hmac(prk, salt, salt_size, ikm, ikm_size); + + // Expand + crypto_sha512_hkdf_expand(okm, okm_size, prk, sizeof(prk), info, info_size); + + WIPE_BUFFER(prk); +} + +/////////////// +/// Ed25519 /// +/////////////// +void crypto_ed25519_key_pair(u8 secret_key[64], u8 public_key[32], u8 seed[32]) +{ + u8 a[64]; + COPY(a, seed, 32); // a[ 0..31] = seed + crypto_wipe(seed, 32); + COPY(secret_key, a, 32); // secret key = seed + crypto_sha512(a, a, 32); // a[ 0..31] = scalar + crypto_eddsa_trim_scalar(a, a); // a[ 0..31] = trimmed scalar + crypto_eddsa_scalarbase(public_key, a); // public key = [trimmed scalar]B + COPY(secret_key + 32, public_key, 32); // secret key includes public half + WIPE_BUFFER(a); +} + +static void hash_reduce(u8 h[32], + const u8 *a, size_t a_size, + const u8 *b, size_t b_size, + const u8 *c, size_t c_size, + const u8 *d, size_t d_size) +{ + u8 hash[64]; + crypto_sha512_ctx ctx; + crypto_sha512_init (&ctx); + crypto_sha512_update(&ctx, a, a_size); + crypto_sha512_update(&ctx, b, b_size); + crypto_sha512_update(&ctx, c, c_size); + crypto_sha512_update(&ctx, d, d_size); + crypto_sha512_final (&ctx, hash); + crypto_eddsa_reduce(h, hash); +} + +static void ed25519_dom_sign(u8 signature[64], const u8 secret_key[64], + const u8 *dom, size_t dom_size, + const u8 *message, size_t message_size) +{ + u8 a[64]; // secret scalar and prefix + u8 r[32]; // secret deterministic "random" nonce + u8 h[32]; // publically verifiable hash of the message (not wiped) + u8 R[32]; // first half of the signature (allows overlapping inputs) + const u8 *pk = secret_key + 32; + + crypto_sha512(a, secret_key, 32); + crypto_eddsa_trim_scalar(a, a); + hash_reduce(r, dom, dom_size, a + 32, 32, message, message_size, 0, 0); + crypto_eddsa_scalarbase(R, r); + hash_reduce(h, dom, dom_size, R, 32, pk, 32, message, message_size); + COPY(signature, R, 32); + crypto_eddsa_mul_add(signature + 32, h, a, r); + + WIPE_BUFFER(a); + WIPE_BUFFER(r); +} + +void crypto_ed25519_sign(u8 signature [64], const u8 secret_key[64], + const u8 *message, size_t message_size) +{ + ed25519_dom_sign(signature, secret_key, 0, 0, message, message_size); +} + +int crypto_ed25519_check(const u8 signature[64], const u8 public_key[32], + const u8 *msg, size_t msg_size) +{ + u8 h_ram[32]; + hash_reduce(h_ram, signature, 32, public_key, 32, msg, msg_size, 0, 0); + return crypto_eddsa_check_equation(signature, public_key, h_ram); +} + +static const u8 domain[34] = "SigEd25519 no Ed25519 collisions\1"; + +void crypto_ed25519_ph_sign(uint8_t signature[64], const uint8_t secret_key[64], + const uint8_t message_hash[64]) +{ + ed25519_dom_sign(signature, secret_key, domain, sizeof(domain), + message_hash, 64); +} + +int crypto_ed25519_ph_check(const uint8_t sig[64], const uint8_t pk[32], + const uint8_t msg_hash[64]) +{ + u8 h_ram[32]; + hash_reduce(h_ram, domain, sizeof(domain), sig, 32, pk, 32, msg_hash, 64); + return crypto_eddsa_check_equation(sig, pk, h_ram); +} + + +#ifdef MONOCYPHER_CPP_NAMESPACE +} +#endif diff --git a/User/lib/monocypher/monocypher-ed25519.h b/User/lib/monocypher/monocypher-ed25519.h new file mode 100644 index 0000000..9ad1c54 --- /dev/null +++ b/User/lib/monocypher/monocypher-ed25519.h @@ -0,0 +1,140 @@ +// Monocypher version 4.0.3 +// +// This file is dual-licensed. Choose whichever licence you want from +// the two licences listed below. +// +// The first licence is a regular 2-clause BSD licence. The second licence +// is the CC-0 from Creative Commons. It is intended to release Monocypher +// to the public domain. The BSD licence serves as a fallback option. +// +// SPDX-License-Identifier: BSD-2-Clause OR CC0-1.0 +// +// ------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019, Loup Vaillant +// All rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ------------------------------------------------------------------------ +// +// Written in 2017-2019 by Loup Vaillant +// +// To the extent possible under law, the author(s) have dedicated all copyright +// and related neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication along +// with this software. If not, see +// + +#ifndef ED25519_H +#define ED25519_H + +#include "monocypher.h" + +#ifdef MONOCYPHER_CPP_NAMESPACE +namespace MONOCYPHER_CPP_NAMESPACE { +#elif defined(__cplusplus) +extern "C" { +#endif + +//////////////////////// +/// Type definitions /// +//////////////////////// + +// Do not rely on the size or content on any of those types, +// they may change without notice. +typedef struct { + uint64_t hash[8]; + uint64_t input[16]; + uint64_t input_size[2]; + size_t input_idx; +} crypto_sha512_ctx; + +typedef struct { + uint8_t key[128]; + crypto_sha512_ctx ctx; +} crypto_sha512_hmac_ctx; + + +// SHA 512 +// ------- +void crypto_sha512_init (crypto_sha512_ctx *ctx); +void crypto_sha512_update(crypto_sha512_ctx *ctx, + const uint8_t *message, size_t message_size); +void crypto_sha512_final (crypto_sha512_ctx *ctx, uint8_t hash[64]); +void crypto_sha512(uint8_t hash[64], + const uint8_t *message, size_t message_size); + +// SHA 512 HMAC +// ------------ +void crypto_sha512_hmac_init(crypto_sha512_hmac_ctx *ctx, + const uint8_t *key, size_t key_size); +void crypto_sha512_hmac_update(crypto_sha512_hmac_ctx *ctx, + const uint8_t *message, size_t message_size); +void crypto_sha512_hmac_final(crypto_sha512_hmac_ctx *ctx, uint8_t hmac[64]); +void crypto_sha512_hmac(uint8_t hmac[64], + const uint8_t *key , size_t key_size, + const uint8_t *message, size_t message_size); + +// SHA 512 HKDF +// ------------ +void crypto_sha512_hkdf_expand(uint8_t *okm, size_t okm_size, + const uint8_t *prk, size_t prk_size, + const uint8_t *info, size_t info_size); +void crypto_sha512_hkdf(uint8_t *okm , size_t okm_size, + const uint8_t *ikm , size_t ikm_size, + const uint8_t *salt, size_t salt_size, + const uint8_t *info, size_t info_size); + +// Ed25519 +// ------- +// Signatures (EdDSA with curve25519 + SHA-512) +// -------------------------------------------- +void crypto_ed25519_key_pair(uint8_t secret_key[64], + uint8_t public_key[32], + uint8_t seed[32]); +void crypto_ed25519_sign(uint8_t signature [64], + const uint8_t secret_key[64], + const uint8_t *message, size_t message_size); +int crypto_ed25519_check(const uint8_t signature [64], + const uint8_t public_key[32], + const uint8_t *message, size_t message_size); + +// Pre-hash variants +void crypto_ed25519_ph_sign(uint8_t signature [64], + const uint8_t secret_key [64], + const uint8_t message_hash[64]); +int crypto_ed25519_ph_check(const uint8_t signature [64], + const uint8_t public_key [32], + const uint8_t message_hash[64]); + +#ifdef __cplusplus +} +#endif + +#endif // ED25519_H diff --git a/User/lib/monocypher/monocypher.c b/User/lib/monocypher/monocypher.c new file mode 100644 index 0000000..fe5bbdc --- /dev/null +++ b/User/lib/monocypher/monocypher.c @@ -0,0 +1,2988 @@ +// Monocypher version 4.0.3 +// +// This file is dual-licensed. Choose whichever licence you want from +// the two licences listed below. +// +// The first licence is a regular 2-clause BSD licence. The second licence +// is the CC-0 from Creative Commons. It is intended to release Monocypher +// to the public domain. The BSD licence serves as a fallback option. +// +// SPDX-License-Identifier: BSD-2-Clause OR CC0-1.0 +// +// ------------------------------------------------------------------------ +// +// Copyright (c) 2017-2020, Loup Vaillant +// All rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ------------------------------------------------------------------------ +// +// Written in 2017-2020 by Loup Vaillant +// +// To the extent possible under law, the author(s) have dedicated all copyright +// and related neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication along +// with this software. If not, see +// + +#include "monocypher.h" + +#ifdef MONOCYPHER_CPP_NAMESPACE +namespace MONOCYPHER_CPP_NAMESPACE { +#endif + +///////////////// +/// Utilities /// +///////////////// +#define FOR_T(type, i, start, end) for (type i = (start); i < (end); i++) +#define FOR(i, start, end) FOR_T(size_t, i, start, end) +#define COPY(dst, src, size) FOR(_i_, 0, size) (dst)[_i_] = (src)[_i_] +#define ZERO(buf, size) FOR(_i_, 0, size) (buf)[_i_] = 0 +#define WIPE_CTX(ctx) crypto_wipe(ctx , sizeof(*(ctx))) +#define WIPE_BUFFER(buffer) crypto_wipe(buffer, sizeof(buffer)) +#define MIN(a, b) ((a) <= (b) ? (a) : (b)) +#define MAX(a, b) ((a) >= (b) ? (a) : (b)) + +typedef int8_t i8; +typedef uint8_t u8; +typedef int16_t i16; +typedef uint32_t u32; +typedef int32_t i32; +typedef int64_t i64; +typedef uint64_t u64; + +static const u8 zero[128] = {0}; + +// returns the smallest positive integer y such that +// (x + y) % pow_2 == 0 +// Basically, y is the "gap" missing to align x. +// Only works when pow_2 is a power of 2. +// Note: we use ~x+1 instead of -x to avoid compiler warnings +static size_t gap(size_t x, size_t pow_2) +{ + return (~x + 1) & (pow_2 - 1); +} + +static u32 load24_le(const u8 s[3]) +{ + return + ((u32)s[0] << 0) | + ((u32)s[1] << 8) | + ((u32)s[2] << 16); +} + +static u32 load32_le(const u8 s[4]) +{ + return + ((u32)s[0] << 0) | + ((u32)s[1] << 8) | + ((u32)s[2] << 16) | + ((u32)s[3] << 24); +} + +static u64 load64_le(const u8 s[8]) +{ + return load32_le(s) | ((u64)load32_le(s+4) << 32); +} + +static void store32_le(u8 out[4], u32 in) +{ + out[0] = (u8)(in ); + out[1] = (u8)(in >> 8); + out[2] = (u8)(in >> 16); + out[3] = (u8)(in >> 24); +} + +static void store64_le(u8 out[8], u64 in) +{ + store32_le(out , (u32)(in )); + store32_le(out + 4, (u32)(in >> 32)); +} + +static void load32_le_buf (u32 *dst, const u8 *src, size_t size) { + FOR(i, 0, size) { dst[i] = load32_le(src + i*4); } +} +static void load64_le_buf (u64 *dst, const u8 *src, size_t size) { + FOR(i, 0, size) { dst[i] = load64_le(src + i*8); } +} +static void store32_le_buf(u8 *dst, const u32 *src, size_t size) { + FOR(i, 0, size) { store32_le(dst + i*4, src[i]); } +} +static void store64_le_buf(u8 *dst, const u64 *src, size_t size) { + FOR(i, 0, size) { store64_le(dst + i*8, src[i]); } +} + +static u64 rotr64(u64 x, u64 n) { return (x >> n) ^ (x << (64 - n)); } +static u32 rotl32(u32 x, u32 n) { return (x << n) ^ (x >> (32 - n)); } + +static int neq0(u64 diff) +{ + // constant time comparison to zero + // return diff != 0 ? -1 : 0 + u64 half = (diff >> 32) | ((u32)diff); // half < 2^32 + u64 eq0 = 1 & ((half - 1) >> 32); // half == 0 ? 1 : 0 + return (int)eq0 - 1; // half == 0 ? 0 : -1 +} + +static u64 x16(const u8 a[16], const u8 b[16]) +{ + return (load64_le(a + 0) ^ load64_le(b + 0)) + | (load64_le(a + 8) ^ load64_le(b + 8)); +} +static u64 x32(const u8 a[32],const u8 b[32]){return x16(a,b)| x16(a+16, b+16);} +static u64 x64(const u8 a[64],const u8 b[64]){return x32(a,b)| x32(a+32, b+32);} +int crypto_verify16(const u8 a[16], const u8 b[16]){ return neq0(x16(a, b)); } +int crypto_verify32(const u8 a[32], const u8 b[32]){ return neq0(x32(a, b)); } +int crypto_verify64(const u8 a[64], const u8 b[64]){ return neq0(x64(a, b)); } + +void crypto_wipe(void *secret, size_t size) +{ + volatile u8 *v_secret = (u8*)secret; + ZERO(v_secret, size); +} + +///////////////// +/// Chacha 20 /// +///////////////// +#define QUARTERROUND(a, b, c, d) \ + a += b; d = rotl32(d ^ a, 16); \ + c += d; b = rotl32(b ^ c, 12); \ + a += b; d = rotl32(d ^ a, 8); \ + c += d; b = rotl32(b ^ c, 7) + +static void chacha20_rounds(u32 out[16], const u32 in[16]) +{ + // The temporary variables make Chacha20 10% faster. + u32 t0 = in[ 0]; u32 t1 = in[ 1]; u32 t2 = in[ 2]; u32 t3 = in[ 3]; + u32 t4 = in[ 4]; u32 t5 = in[ 5]; u32 t6 = in[ 6]; u32 t7 = in[ 7]; + u32 t8 = in[ 8]; u32 t9 = in[ 9]; u32 t10 = in[10]; u32 t11 = in[11]; + u32 t12 = in[12]; u32 t13 = in[13]; u32 t14 = in[14]; u32 t15 = in[15]; + + FOR (i, 0, 10) { // 20 rounds, 2 rounds per loop. + QUARTERROUND(t0, t4, t8 , t12); // column 0 + QUARTERROUND(t1, t5, t9 , t13); // column 1 + QUARTERROUND(t2, t6, t10, t14); // column 2 + QUARTERROUND(t3, t7, t11, t15); // column 3 + QUARTERROUND(t0, t5, t10, t15); // diagonal 0 + QUARTERROUND(t1, t6, t11, t12); // diagonal 1 + QUARTERROUND(t2, t7, t8 , t13); // diagonal 2 + QUARTERROUND(t3, t4, t9 , t14); // diagonal 3 + } + out[ 0] = t0; out[ 1] = t1; out[ 2] = t2; out[ 3] = t3; + out[ 4] = t4; out[ 5] = t5; out[ 6] = t6; out[ 7] = t7; + out[ 8] = t8; out[ 9] = t9; out[10] = t10; out[11] = t11; + out[12] = t12; out[13] = t13; out[14] = t14; out[15] = t15; +} + +static const u8 *chacha20_constant = (const u8*)"expand 32-byte k"; // 16 bytes + +void crypto_chacha20_h(u8 out[32], const u8 key[32], const u8 in [16]) +{ + u32 block[16]; + load32_le_buf(block , chacha20_constant, 4); + load32_le_buf(block + 4, key , 8); + load32_le_buf(block + 12, in , 4); + + chacha20_rounds(block, block); + + // prevent reversal of the rounds by revealing only half of the buffer. + store32_le_buf(out , block , 4); // constant + store32_le_buf(out+16, block+12, 4); // counter and nonce + WIPE_BUFFER(block); +} + +u64 crypto_chacha20_djb(u8 *cipher_text, const u8 *plain_text, + size_t text_size, const u8 key[32], const u8 nonce[8], + u64 ctr) +{ + u32 input[16]; + load32_le_buf(input , chacha20_constant, 4); + load32_le_buf(input + 4, key , 8); + load32_le_buf(input + 14, nonce , 2); + input[12] = (u32) ctr; + input[13] = (u32)(ctr >> 32); + + // Whole blocks + u32 pool[16]; + size_t nb_blocks = text_size >> 6; + FOR (i, 0, nb_blocks) { + chacha20_rounds(pool, input); + if (plain_text != NULL) { + FOR (j, 0, 16) { + u32 p = pool[j] + input[j]; + store32_le(cipher_text, p ^ load32_le(plain_text)); + cipher_text += 4; + plain_text += 4; + } + } else { + FOR (j, 0, 16) { + u32 p = pool[j] + input[j]; + store32_le(cipher_text, p); + cipher_text += 4; + } + } + input[12]++; + if (input[12] == 0) { + input[13]++; + } + } + text_size &= 63; + + // Last (incomplete) block + if (text_size > 0) { + if (plain_text == NULL) { + plain_text = zero; + } + chacha20_rounds(pool, input); + u8 tmp[64]; + FOR (i, 0, 16) { + store32_le(tmp + i*4, pool[i] + input[i]); + } + FOR (i, 0, text_size) { + cipher_text[i] = tmp[i] ^ plain_text[i]; + } + WIPE_BUFFER(tmp); + } + ctr = input[12] + ((u64)input[13] << 32) + (text_size > 0); + + WIPE_BUFFER(pool); + WIPE_BUFFER(input); + return ctr; +} + +u32 crypto_chacha20_ietf(u8 *cipher_text, const u8 *plain_text, + size_t text_size, + const u8 key[32], const u8 nonce[12], u32 ctr) +{ + u64 big_ctr = ctr + ((u64)load32_le(nonce) << 32); + return (u32)crypto_chacha20_djb(cipher_text, plain_text, text_size, + key, nonce + 4, big_ctr); +} + +u64 crypto_chacha20_x(u8 *cipher_text, const u8 *plain_text, + size_t text_size, + const u8 key[32], const u8 nonce[24], u64 ctr) +{ + u8 sub_key[32]; + crypto_chacha20_h(sub_key, key, nonce); + ctr = crypto_chacha20_djb(cipher_text, plain_text, text_size, + sub_key, nonce + 16, ctr); + WIPE_BUFFER(sub_key); + return ctr; +} + +///////////////// +/// Poly 1305 /// +///////////////// + +// h = (h + c) * r +// preconditions: +// ctx->h <= 4_ffffffff_ffffffff_ffffffff_ffffffff +// ctx->r <= 0ffffffc_0ffffffc_0ffffffc_0fffffff +// end <= 1 +// Postcondition: +// ctx->h <= 4_ffffffff_ffffffff_ffffffff_ffffffff +static void poly_blocks(crypto_poly1305_ctx *ctx, const u8 *in, + size_t nb_blocks, unsigned end) +{ + // Local all the things! + const u32 r0 = ctx->r[0]; + const u32 r1 = ctx->r[1]; + const u32 r2 = ctx->r[2]; + const u32 r3 = ctx->r[3]; + const u32 rr0 = (r0 >> 2) * 5; // lose 2 bits... + const u32 rr1 = (r1 >> 2) + r1; // rr1 == (r1 >> 2) * 5 + const u32 rr2 = (r2 >> 2) + r2; // rr1 == (r2 >> 2) * 5 + const u32 rr3 = (r3 >> 2) + r3; // rr1 == (r3 >> 2) * 5 + const u32 rr4 = r0 & 3; // ...recover 2 bits + u32 h0 = ctx->h[0]; + u32 h1 = ctx->h[1]; + u32 h2 = ctx->h[2]; + u32 h3 = ctx->h[3]; + u32 h4 = ctx->h[4]; + + FOR (i, 0, nb_blocks) { + // h + c, without carry propagation + const u64 s0 = (u64)h0 + load32_le(in); in += 4; + const u64 s1 = (u64)h1 + load32_le(in); in += 4; + const u64 s2 = (u64)h2 + load32_le(in); in += 4; + const u64 s3 = (u64)h3 + load32_le(in); in += 4; + const u32 s4 = h4 + end; + + // (h + c) * r, without carry propagation + const u64 x0 = s0*r0+ s1*rr3+ s2*rr2+ s3*rr1+ s4*rr0; + const u64 x1 = s0*r1+ s1*r0 + s2*rr3+ s3*rr2+ s4*rr1; + const u64 x2 = s0*r2+ s1*r1 + s2*r0 + s3*rr3+ s4*rr2; + const u64 x3 = s0*r3+ s1*r2 + s2*r1 + s3*r0 + s4*rr3; + const u32 x4 = s4*rr4; + + // partial reduction modulo 2^130 - 5 + const u32 u5 = (u32)(x3 >> 32) + x4; // u5 <= 7ffffff5 + const u64 u0 = (u32)(u5 >> 2) * 5 + (x0 & 0xffffffff); + const u64 u1 = (u32)(u0 >> 32) + (x1 & 0xffffffff) + (x0 >> 32); + const u64 u2 = (u32)(u1 >> 32) + (x2 & 0xffffffff) + (x1 >> 32); + const u64 u3 = (u32)(u2 >> 32) + (x3 & 0xffffffff) + (x2 >> 32); + const u32 u4 = (u32)(u3 >> 32) + (u5 & 3); // u4 <= 4 + + // Update the hash + h0 = u0 & 0xffffffff; + h1 = u1 & 0xffffffff; + h2 = u2 & 0xffffffff; + h3 = u3 & 0xffffffff; + h4 = u4; + } + ctx->h[0] = h0; + ctx->h[1] = h1; + ctx->h[2] = h2; + ctx->h[3] = h3; + ctx->h[4] = h4; +} + +void crypto_poly1305_init(crypto_poly1305_ctx *ctx, const u8 key[32]) +{ + ZERO(ctx->h, 5); // Initial hash is zero + ctx->c_idx = 0; + // load r and pad (r has some of its bits cleared) + load32_le_buf(ctx->r , key , 4); + load32_le_buf(ctx->pad, key+16, 4); + FOR (i, 0, 1) { ctx->r[i] &= 0x0fffffff; } + FOR (i, 1, 4) { ctx->r[i] &= 0x0ffffffc; } +} + +void crypto_poly1305_update(crypto_poly1305_ctx *ctx, + const u8 *message, size_t message_size) +{ + // Avoid undefined NULL pointer increments with empty messages + if (message_size == 0) { + return; + } + + // Align ourselves with block boundaries + size_t aligned = MIN(gap(ctx->c_idx, 16), message_size); + FOR (i, 0, aligned) { + ctx->c[ctx->c_idx] = *message; + ctx->c_idx++; + message++; + message_size--; + } + + // If block is complete, process it + if (ctx->c_idx == 16) { + poly_blocks(ctx, ctx->c, 1, 1); + ctx->c_idx = 0; + } + + // Process the message block by block + size_t nb_blocks = message_size >> 4; + poly_blocks(ctx, message, nb_blocks, 1); + message += nb_blocks << 4; + message_size &= 15; + + // remaining bytes (we never complete a block here) + FOR (i, 0, message_size) { + ctx->c[ctx->c_idx] = message[i]; + ctx->c_idx++; + } +} + +void crypto_poly1305_final(crypto_poly1305_ctx *ctx, u8 mac[16]) +{ + // Process the last block (if any) + // We move the final 1 according to remaining input length + // (this will add less than 2^130 to the last input block) + if (ctx->c_idx != 0) { + ZERO(ctx->c + ctx->c_idx, 16 - ctx->c_idx); + ctx->c[ctx->c_idx] = 1; + poly_blocks(ctx, ctx->c, 1, 0); + } + + // check if we should subtract 2^130-5 by performing the + // corresponding carry propagation. + u64 c = 5; + FOR (i, 0, 4) { + c += ctx->h[i]; + c >>= 32; + } + c += ctx->h[4]; + c = (c >> 2) * 5; // shift the carry back to the beginning + // c now indicates how many times we should subtract 2^130-5 (0 or 1) + FOR (i, 0, 4) { + c += (u64)ctx->h[i] + ctx->pad[i]; + store32_le(mac + i*4, (u32)c); + c = c >> 32; + } + WIPE_CTX(ctx); +} + +void crypto_poly1305(u8 mac[16], const u8 *message, + size_t message_size, const u8 key[32]) +{ + crypto_poly1305_ctx ctx; + crypto_poly1305_init (&ctx, key); + crypto_poly1305_update(&ctx, message, message_size); + crypto_poly1305_final (&ctx, mac); +} + +//////////////// +/// BLAKE2 b /// +//////////////// +static const u64 iv[8] = { + 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, + 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, 0x9b05688c2b3e6c1f, + 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, +}; + +static void blake2b_compress(crypto_blake2b_ctx *ctx, int is_last_block) +{ + static const u8 sigma[12][16] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, + { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, + { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 }, + { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, + { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 }, + { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, + { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 }, + { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, + { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, + { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }, + }; + + // increment input offset + u64 *x = ctx->input_offset; + size_t y = ctx->input_idx; + x[0] += y; + if (x[0] < y) { + x[1]++; + } + + // init work vector + u64 v0 = ctx->hash[0]; u64 v8 = iv[0]; + u64 v1 = ctx->hash[1]; u64 v9 = iv[1]; + u64 v2 = ctx->hash[2]; u64 v10 = iv[2]; + u64 v3 = ctx->hash[3]; u64 v11 = iv[3]; + u64 v4 = ctx->hash[4]; u64 v12 = iv[4] ^ ctx->input_offset[0]; + u64 v5 = ctx->hash[5]; u64 v13 = iv[5] ^ ctx->input_offset[1]; + u64 v6 = ctx->hash[6]; u64 v14 = iv[6] ^ (u64)~(is_last_block - 1); + u64 v7 = ctx->hash[7]; u64 v15 = iv[7]; + + // mangle work vector + u64 *input = ctx->input; +#define BLAKE2_G(a, b, c, d, x, y) \ + a += b + x; d = rotr64(d ^ a, 32); \ + c += d; b = rotr64(b ^ c, 24); \ + a += b + y; d = rotr64(d ^ a, 16); \ + c += d; b = rotr64(b ^ c, 63) +#define BLAKE2_ROUND(i) \ + BLAKE2_G(v0, v4, v8 , v12, input[sigma[i][ 0]], input[sigma[i][ 1]]); \ + BLAKE2_G(v1, v5, v9 , v13, input[sigma[i][ 2]], input[sigma[i][ 3]]); \ + BLAKE2_G(v2, v6, v10, v14, input[sigma[i][ 4]], input[sigma[i][ 5]]); \ + BLAKE2_G(v3, v7, v11, v15, input[sigma[i][ 6]], input[sigma[i][ 7]]); \ + BLAKE2_G(v0, v5, v10, v15, input[sigma[i][ 8]], input[sigma[i][ 9]]); \ + BLAKE2_G(v1, v6, v11, v12, input[sigma[i][10]], input[sigma[i][11]]); \ + BLAKE2_G(v2, v7, v8 , v13, input[sigma[i][12]], input[sigma[i][13]]); \ + BLAKE2_G(v3, v4, v9 , v14, input[sigma[i][14]], input[sigma[i][15]]) + +#ifdef BLAKE2_NO_UNROLLING + FOR (i, 0, 12) { + BLAKE2_ROUND(i); + } +#else + BLAKE2_ROUND(0); BLAKE2_ROUND(1); BLAKE2_ROUND(2); BLAKE2_ROUND(3); + BLAKE2_ROUND(4); BLAKE2_ROUND(5); BLAKE2_ROUND(6); BLAKE2_ROUND(7); + BLAKE2_ROUND(8); BLAKE2_ROUND(9); BLAKE2_ROUND(10); BLAKE2_ROUND(11); +#endif + + // update hash + ctx->hash[0] ^= v0 ^ v8; ctx->hash[1] ^= v1 ^ v9; + ctx->hash[2] ^= v2 ^ v10; ctx->hash[3] ^= v3 ^ v11; + ctx->hash[4] ^= v4 ^ v12; ctx->hash[5] ^= v5 ^ v13; + ctx->hash[6] ^= v6 ^ v14; ctx->hash[7] ^= v7 ^ v15; +} + +void crypto_blake2b_keyed_init(crypto_blake2b_ctx *ctx, size_t hash_size, + const u8 *key, size_t key_size) +{ + // initial hash + COPY(ctx->hash, iv, 8); + ctx->hash[0] ^= 0x01010000 ^ (key_size << 8) ^ hash_size; + + ctx->input_offset[0] = 0; // beginning of the input, no offset + ctx->input_offset[1] = 0; // beginning of the input, no offset + ctx->hash_size = hash_size; + ctx->input_idx = 0; + ZERO(ctx->input, 16); + + // if there is a key, the first block is that key (padded with zeroes) + if (key_size > 0) { + u8 key_block[128] = {0}; + COPY(key_block, key, key_size); + // same as calling crypto_blake2b_update(ctx, key_block , 128) + load64_le_buf(ctx->input, key_block, 16); + ctx->input_idx = 128; + WIPE_BUFFER(key_block); + } +} + +void crypto_blake2b_init(crypto_blake2b_ctx *ctx, size_t hash_size) +{ + crypto_blake2b_keyed_init(ctx, hash_size, 0, 0); +} + +void crypto_blake2b_update(crypto_blake2b_ctx *ctx, + const u8 *message, size_t message_size) +{ + // Avoid undefined NULL pointer increments with empty messages + if (message_size == 0) { + return; + } + + // Align with word boundaries + if ((ctx->input_idx & 7) != 0) { + size_t nb_bytes = MIN(gap(ctx->input_idx, 8), message_size); + size_t word = ctx->input_idx >> 3; + size_t byte = ctx->input_idx & 7; + FOR (i, 0, nb_bytes) { + ctx->input[word] |= (u64)message[i] << ((byte + i) << 3); + } + ctx->input_idx += nb_bytes; + message += nb_bytes; + message_size -= nb_bytes; + } + + // Align with block boundaries (faster than byte by byte) + if ((ctx->input_idx & 127) != 0) { + size_t nb_words = MIN(gap(ctx->input_idx, 128), message_size) >> 3; + load64_le_buf(ctx->input + (ctx->input_idx >> 3), message, nb_words); + ctx->input_idx += nb_words << 3; + message += nb_words << 3; + message_size -= nb_words << 3; + } + + // Process block by block + size_t nb_blocks = message_size >> 7; + FOR (i, 0, nb_blocks) { + if (ctx->input_idx == 128) { + blake2b_compress(ctx, 0); + } + load64_le_buf(ctx->input, message, 16); + message += 128; + ctx->input_idx = 128; + } + message_size &= 127; + + if (message_size != 0) { + // Compress block & flush input buffer as needed + if (ctx->input_idx == 128) { + blake2b_compress(ctx, 0); + ctx->input_idx = 0; + } + if (ctx->input_idx == 0) { + ZERO(ctx->input, 16); + } + // Fill remaining words (faster than byte by byte) + size_t nb_words = message_size >> 3; + load64_le_buf(ctx->input, message, nb_words); + ctx->input_idx += nb_words << 3; + message += nb_words << 3; + message_size -= nb_words << 3; + + // Fill remaining bytes + FOR (i, 0, message_size) { + size_t word = ctx->input_idx >> 3; + size_t byte = ctx->input_idx & 7; + ctx->input[word] |= (u64)message[i] << (byte << 3); + ctx->input_idx++; + } + } +} + +void crypto_blake2b_final(crypto_blake2b_ctx *ctx, u8 *hash) +{ + blake2b_compress(ctx, 1); // compress the last block + size_t hash_size = MIN(ctx->hash_size, 64); + size_t nb_words = hash_size >> 3; + store64_le_buf(hash, ctx->hash, nb_words); + FOR (i, nb_words << 3, hash_size) { + hash[i] = (ctx->hash[i >> 3] >> (8 * (i & 7))) & 0xff; + } + WIPE_CTX(ctx); +} + +void crypto_blake2b_keyed(u8 *hash, size_t hash_size, + const u8 *key, size_t key_size, + const u8 *message, size_t message_size) +{ + crypto_blake2b_ctx ctx; + crypto_blake2b_keyed_init(&ctx, hash_size, key, key_size); + crypto_blake2b_update (&ctx, message, message_size); + crypto_blake2b_final (&ctx, hash); +} + +void crypto_blake2b(u8 *hash, size_t hash_size, const u8 *msg, size_t msg_size) +{ + crypto_blake2b_keyed(hash, hash_size, 0, 0, msg, msg_size); +} + +////////////// +/// Argon2 /// +////////////// +// references to R, Z, Q etc. come from the spec + +// Argon2 operates on 1024 byte blocks. +typedef struct { u64 a[128]; } blk; + +// updates a BLAKE2 hash with a 32 bit word, little endian. +static void blake_update_32(crypto_blake2b_ctx *ctx, u32 input) +{ + u8 buf[4]; + store32_le(buf, input); + crypto_blake2b_update(ctx, buf, 4); + WIPE_BUFFER(buf); +} + +static void blake_update_32_buf(crypto_blake2b_ctx *ctx, + const u8 *buf, u32 size) +{ + blake_update_32(ctx, size); + crypto_blake2b_update(ctx, buf, size); +} + + +static void copy_block(blk *o,const blk*in){FOR(i, 0, 128) o->a[i] = in->a[i];} +static void xor_block(blk *o,const blk*in){FOR(i, 0, 128) o->a[i] ^= in->a[i];} + +// Hash with a virtually unlimited digest size. +// Doesn't extract more entropy than the base hash function. +// Mainly used for filling a whole kilobyte block with pseudo-random bytes. +// (One could use a stream cipher with a seed hash as the key, but +// this would introduce another dependency —and point of failure.) +static void extended_hash(u8 *digest, u32 digest_size, + const u8 *input , u32 input_size) +{ + crypto_blake2b_ctx ctx; + crypto_blake2b_init (&ctx, MIN(digest_size, 64)); + blake_update_32 (&ctx, digest_size); + crypto_blake2b_update(&ctx, input, input_size); + crypto_blake2b_final (&ctx, digest); + + if (digest_size > 64) { + // the conversion to u64 avoids integer overflow on + // ludicrously big hash sizes. + u32 r = (u32)(((u64)digest_size + 31) >> 5) - 2; + u32 i = 1; + u32 in = 0; + u32 out = 32; + while (i < r) { + // Input and output overlap. This is intentional + crypto_blake2b(digest + out, 64, digest + in, 64); + i += 1; + in += 32; + out += 32; + } + crypto_blake2b(digest + out, digest_size - (32 * r), digest + in , 64); + } +} + +#define LSB(x) ((u64)(u32)x) +#define G(a, b, c, d) \ + a += b + ((LSB(a) * LSB(b)) << 1); d ^= a; d = rotr64(d, 32); \ + c += d + ((LSB(c) * LSB(d)) << 1); b ^= c; b = rotr64(b, 24); \ + a += b + ((LSB(a) * LSB(b)) << 1); d ^= a; d = rotr64(d, 16); \ + c += d + ((LSB(c) * LSB(d)) << 1); b ^= c; b = rotr64(b, 63) +#define ROUND(v0, v1, v2, v3, v4, v5, v6, v7, \ + v8, v9, v10, v11, v12, v13, v14, v15) \ + G(v0, v4, v8, v12); G(v1, v5, v9, v13); \ + G(v2, v6, v10, v14); G(v3, v7, v11, v15); \ + G(v0, v5, v10, v15); G(v1, v6, v11, v12); \ + G(v2, v7, v8, v13); G(v3, v4, v9, v14) + +// Core of the compression function G. Computes Z from R in place. +static void g_rounds(blk *b) +{ + // column rounds (work_block = Q) + for (int i = 0; i < 128; i += 16) { + ROUND(b->a[i ], b->a[i+ 1], b->a[i+ 2], b->a[i+ 3], + b->a[i+ 4], b->a[i+ 5], b->a[i+ 6], b->a[i+ 7], + b->a[i+ 8], b->a[i+ 9], b->a[i+10], b->a[i+11], + b->a[i+12], b->a[i+13], b->a[i+14], b->a[i+15]); + } + // row rounds (b = Z) + for (int i = 0; i < 16; i += 2) { + ROUND(b->a[i ], b->a[i+ 1], b->a[i+ 16], b->a[i+ 17], + b->a[i+32], b->a[i+33], b->a[i+ 48], b->a[i+ 49], + b->a[i+64], b->a[i+65], b->a[i+ 80], b->a[i+ 81], + b->a[i+96], b->a[i+97], b->a[i+112], b->a[i+113]); + } +} + +const crypto_argon2_extras crypto_argon2_no_extras = { 0, 0, 0, 0 }; + +void crypto_argon2(u8 *hash, u32 hash_size, void *work_area, + crypto_argon2_config config, + crypto_argon2_inputs inputs, + crypto_argon2_extras extras) +{ + const u32 segment_size = config.nb_blocks / config.nb_lanes / 4; + const u32 lane_size = segment_size * 4; + const u32 nb_blocks = lane_size * config.nb_lanes; // rounding down + + // work area seen as blocks (must be suitably aligned) + blk *blocks = (blk*)work_area; + { + u8 initial_hash[72]; // 64 bytes plus 2 words for future hashes + crypto_blake2b_ctx ctx; + crypto_blake2b_init (&ctx, 64); + blake_update_32 (&ctx, config.nb_lanes ); // p: number of "threads" + blake_update_32 (&ctx, hash_size); + blake_update_32 (&ctx, config.nb_blocks); + blake_update_32 (&ctx, config.nb_passes); + blake_update_32 (&ctx, 0x13); // v: version number + blake_update_32 (&ctx, config.algorithm); // y: Argon2i, Argon2d... + blake_update_32_buf (&ctx, inputs.pass, inputs.pass_size); + blake_update_32_buf (&ctx, inputs.salt, inputs.salt_size); + blake_update_32_buf (&ctx, extras.key, extras.key_size); + blake_update_32_buf (&ctx, extras.ad, extras.ad_size); + crypto_blake2b_final(&ctx, initial_hash); // fill 64 first bytes only + + // fill first 2 blocks of each lane + u8 hash_area[1024]; + FOR_T(u32, l, 0, config.nb_lanes) { + FOR_T(u32, i, 0, 2) { + store32_le(initial_hash + 64, i); // first additional word + store32_le(initial_hash + 68, l); // second additional word + extended_hash(hash_area, 1024, initial_hash, 72); + load64_le_buf(blocks[l * lane_size + i].a, hash_area, 128); + } + } + + WIPE_BUFFER(initial_hash); + WIPE_BUFFER(hash_area); + } + + // Argon2i and Argon2id start with constant time indexing + int constant_time = config.algorithm != CRYPTO_ARGON2_D; + + // Fill (and re-fill) the rest of the blocks + // + // Note: even though each segment within the same slice can be + // computed in parallel, (one thread per lane), we are computing + // them sequentially, because Monocypher doesn't support threads. + // + // Yet optimal performance (and therefore security) requires one + // thread per lane. The only reason Monocypher supports multiple + // lanes is compatibility. + blk tmp; + FOR_T(u32, pass, 0, config.nb_passes) { + FOR_T(u32, slice, 0, 4) { + // On the first slice of the first pass, + // blocks 0 and 1 are already filled, hence pass_offset. + u32 pass_offset = pass == 0 && slice == 0 ? 2 : 0; + u32 slice_offset = slice * segment_size; + + // Argon2id switches back to non-constant time indexing + // after the first two slices of the first pass + if (slice == 2 && config.algorithm == CRYPTO_ARGON2_ID) { + constant_time = 0; + } + + // Each iteration of the following loop may be performed in + // a separate thread. All segments must be fully completed + // before we start filling the next slice. + FOR_T(u32, segment, 0, config.nb_lanes) { + blk index_block; + u32 index_ctr = 1; + FOR_T (u32, block, pass_offset, segment_size) { + // Current and previous blocks + u32 lane_offset = segment * lane_size; + blk *segment_start = blocks + lane_offset + slice_offset; + blk *current = segment_start + block; + blk *previous = + block == 0 && slice_offset == 0 + ? segment_start + lane_size - 1 + : segment_start + block - 1; + + u64 index_seed; + if (constant_time) { + if (block == pass_offset || (block % 128) == 0) { + // Fill or refresh deterministic indices block + + // seed the beginning of the block... + ZERO(index_block.a, 128); + index_block.a[0] = pass; + index_block.a[1] = segment; + index_block.a[2] = slice; + index_block.a[3] = nb_blocks; + index_block.a[4] = config.nb_passes; + index_block.a[5] = config.algorithm; + index_block.a[6] = index_ctr; + index_ctr++; + + // ... then shuffle it + copy_block(&tmp, &index_block); + g_rounds (&index_block); + xor_block (&index_block, &tmp); + copy_block(&tmp, &index_block); + g_rounds (&index_block); + xor_block (&index_block, &tmp); + } + index_seed = index_block.a[block % 128]; + } else { + index_seed = previous->a[0]; + } + + // Establish the reference set. *Approximately* comprises: + // - The last 3 slices (if they exist yet) + // - The already constructed blocks in the current segment + u32 next_slice = ((slice + 1) % 4) * segment_size; + u32 window_start = pass == 0 ? 0 : next_slice; + u32 nb_segments = pass == 0 ? slice : 3; + u32 lane = + pass == 0 && slice == 0 + ? segment + : (u32)(index_seed >> 32) % config.nb_lanes; + u32 window_size = + nb_segments * segment_size + + (lane == segment ? block-1 : + block == 0 ? (u32)-1 : 0); + + // Find reference block + u64 j1 = index_seed & 0xffffffff; // block selector + u64 x = (j1 * j1) >> 32; + u64 y = (window_size * x) >> 32; + u64 z = (window_size - 1) - y; + u32 ref = (u32)((window_start + z) % lane_size); + u32 index = lane * lane_size + ref; + blk *reference = blocks + index; + + // Shuffle the previous & reference block + // into the current block + copy_block(&tmp, previous); + xor_block (&tmp, reference); + if (pass == 0) { copy_block(current, &tmp); } + else { xor_block (current, &tmp); } + g_rounds (&tmp); + xor_block (current, &tmp); + } + } + } + } + + // Wipe temporary block + volatile u64* p = tmp.a; + ZERO(p, 128); + + // XOR last blocks of each lane + blk *last_block = blocks + lane_size - 1; + FOR_T (u32, lane, 1, config.nb_lanes) { + blk *next_block = last_block + lane_size; + xor_block(next_block, last_block); + last_block = next_block; + } + + // Serialize last block + u8 final_block[1024]; + store64_le_buf(final_block, last_block->a, 128); + + // Wipe work area + p = (u64*)work_area; + ZERO(p, 128 * nb_blocks); + + // Hash the very last block with H' into the output hash + extended_hash(hash, hash_size, final_block, 1024); + WIPE_BUFFER(final_block); +} + +//////////////////////////////////// +/// Arithmetic modulo 2^255 - 19 /// +//////////////////////////////////// +// Originally taken from SUPERCOP's ref10 implementation. +// A bit bigger than TweetNaCl, over 4 times faster. + +// field element +typedef i32 fe[10]; + +// field constants +// +// fe_one : 1 +// sqrtm1 : sqrt(-1) +// d : -121665 / 121666 +// D2 : 2 * -121665 / 121666 +// lop_x, lop_y: low order point in Edwards coordinates +// ufactor : -sqrt(-1) * 2 +// A2 : 486662^2 (A squared) +static const fe fe_one = {1}; +static const fe sqrtm1 = { + -32595792, -7943725, 9377950, 3500415, 12389472, + -272473, -25146209, -2005654, 326686, 11406482, +}; +static const fe d = { + -10913610, 13857413, -15372611, 6949391, 114729, + -8787816, -6275908, -3247719, -18696448, -12055116, +}; +static const fe D2 = { + -21827239, -5839606, -30745221, 13898782, 229458, + 15978800, -12551817, -6495438, 29715968, 9444199, +}; +static const fe lop_x = { + 21352778, 5345713, 4660180, -8347857, 24143090, + 14568123, 30185756, -12247770, -33528939, 8345319, +}; +static const fe lop_y = { + -6952922, -1265500, 6862341, -7057498, -4037696, + -5447722, 31680899, -15325402, -19365852, 1569102, +}; +static const fe ufactor = { + -1917299, 15887451, -18755900, -7000830, -24778944, + 544946, -16816446, 4011309, -653372, 10741468, +}; +static const fe A2 = { + 12721188, 3529, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static void fe_0(fe h) { ZERO(h , 10); } +static void fe_1(fe h) { h[0] = 1; ZERO(h+1, 9); } + +static void fe_copy(fe h,const fe f ){FOR(i,0,10) h[i] = f[i]; } +static void fe_neg (fe h,const fe f ){FOR(i,0,10) h[i] = -f[i]; } +static void fe_add (fe h,const fe f,const fe g){FOR(i,0,10) h[i] = f[i] + g[i];} +static void fe_sub (fe h,const fe f,const fe g){FOR(i,0,10) h[i] = f[i] - g[i];} + +// Some compilers, when inlining fe_cswap() or fe_ccopy(), may introduce +// a timing leak. It happens when it notices `b` has only 2 possible +// values, and either replace the arithmetic by a secret dependent +// branch, or (as has been observed), swap pointers instead of values, +// which intruduces a secret dependent index. +// +// We apply two mitigations here: +// - Add `volatile` in the mask declaration. +// - Unroll the copy loop (costs couple hundred bytes of binary code). +// +// As of June 2026, those mitigation work when applied separately or +// together. Applying them both is currently overkill, but may help +// delay the day compilers grow clever enough to defeat it. (The true +// fix is in the semantics of the language itself: C currently has no +// way to specify constant time code). +// +// Note (Loup): as of June 2026, the problem has yet to surface in +// fe_cswap(), but since this is almost the same code as fe_ccopy() I +// believe it is more prudent to apply the precaution there too. +static void fe_cswap(fe f, fe g, int b) +{ + volatile i32 mask = -b; // -1 = 0xffffffff + i32 x0 = (f[0] ^ g[0]) & mask; f[0] = f[0] ^ x0; g[0] = g[0] ^ x0; + i32 x1 = (f[1] ^ g[1]) & mask; f[1] = f[1] ^ x1; g[1] = g[1] ^ x1; + i32 x2 = (f[2] ^ g[2]) & mask; f[2] = f[2] ^ x2; g[2] = g[2] ^ x2; + i32 x3 = (f[3] ^ g[3]) & mask; f[3] = f[3] ^ x3; g[3] = g[3] ^ x3; + i32 x4 = (f[4] ^ g[4]) & mask; f[4] = f[4] ^ x4; g[4] = g[4] ^ x4; + i32 x5 = (f[5] ^ g[5]) & mask; f[5] = f[5] ^ x5; g[5] = g[5] ^ x5; + i32 x6 = (f[6] ^ g[6]) & mask; f[6] = f[6] ^ x6; g[6] = g[6] ^ x6; + i32 x7 = (f[7] ^ g[7]) & mask; f[7] = f[7] ^ x7; g[7] = g[7] ^ x7; + i32 x8 = (f[8] ^ g[8]) & mask; f[8] = f[8] ^ x8; g[8] = g[8] ^ x8; + i32 x9 = (f[9] ^ g[9]) & mask; f[9] = f[9] ^ x9; g[9] = g[9] ^ x9; +} + +static void fe_ccopy(fe f, const fe g, int b) +{ + volatile i32 mask = -b; // -1 = 0xffffffff + i32 x0 = (f[0] ^ g[0]) & mask; f[0] = f[0] ^ x0; + i32 x1 = (f[1] ^ g[1]) & mask; f[1] = f[1] ^ x1; + i32 x2 = (f[2] ^ g[2]) & mask; f[2] = f[2] ^ x2; + i32 x3 = (f[3] ^ g[3]) & mask; f[3] = f[3] ^ x3; + i32 x4 = (f[4] ^ g[4]) & mask; f[4] = f[4] ^ x4; + i32 x5 = (f[5] ^ g[5]) & mask; f[5] = f[5] ^ x5; + i32 x6 = (f[6] ^ g[6]) & mask; f[6] = f[6] ^ x6; + i32 x7 = (f[7] ^ g[7]) & mask; f[7] = f[7] ^ x7; + i32 x8 = (f[8] ^ g[8]) & mask; f[8] = f[8] ^ x8; + i32 x9 = (f[9] ^ g[9]) & mask; f[9] = f[9] ^ x9; +} + + +// Signed carry propagation +// ------------------------ +// +// Let t be a number. It can be uniquely decomposed thus: +// +// t = h*2^26 + l +// such that -2^25 <= l < 2^25 +// +// Let c = (t + 2^25) / 2^26 (rounded down) +// c = (h*2^26 + l + 2^25) / 2^26 (rounded down) +// c = h + (l + 2^25) / 2^26 (rounded down) +// c = h (exactly) +// Because 0 <= l + 2^25 < 2^26 +// +// Let u = t - c*2^26 +// u = h*2^26 + l - h*2^26 +// u = l +// Therefore, -2^25 <= u < 2^25 +// +// Additionally, if |t| < x, then |h| < x/2^26 (rounded down) +// +// Notations: +// - In C, 1<<25 means 2^25. +// - In C, x>>25 means floor(x / (2^25)). +// - All of the above applies with 25 & 24 as well as 26 & 25. +// +// +// Note on negative right shifts +// ----------------------------- +// +// In C, x >> n, where x is a negative integer, is implementation +// defined. In practice, all platforms do arithmetic shift, which is +// equivalent to division by 2^26, rounded down. Some compilers, like +// GCC, even guarantee it. +// +// If we ever stumble upon a platform that does not propagate the sign +// bit (we won't), visible failures will show at the slightest test, and +// the signed shifts can be replaced by the following: +// +// typedef struct { i64 x:39; } s25; +// typedef struct { i64 x:38; } s26; +// i64 shift25(i64 x) { s25 s; s.x = ((u64)x)>>25; return s.x; } +// i64 shift26(i64 x) { s26 s; s.x = ((u64)x)>>26; return s.x; } +// +// Current compilers cannot optimise this, causing a 30% drop in +// performance. Fairly expensive for something that never happens. +// +// +// Precondition +// ------------ +// +// |t0| < 2^63 +// |t1|..|t9| < 2^62 +// +// Algorithm +// --------- +// c = t0 + 2^25 / 2^26 -- |c| <= 2^36 +// t0 -= c * 2^26 -- |t0| <= 2^25 +// t1 += c -- |t1| <= 2^63 +// +// c = t4 + 2^25 / 2^26 -- |c| <= 2^36 +// t4 -= c * 2^26 -- |t4| <= 2^25 +// t5 += c -- |t5| <= 2^63 +// +// c = t1 + 2^24 / 2^25 -- |c| <= 2^38 +// t1 -= c * 2^25 -- |t1| <= 2^24 +// t2 += c -- |t2| <= 2^63 +// +// c = t5 + 2^24 / 2^25 -- |c| <= 2^38 +// t5 -= c * 2^25 -- |t5| <= 2^24 +// t6 += c -- |t6| <= 2^63 +// +// c = t2 + 2^25 / 2^26 -- |c| <= 2^37 +// t2 -= c * 2^26 -- |t2| <= 2^25 < 1.1 * 2^25 (final t2) +// t3 += c -- |t3| <= 2^63 +// +// c = t6 + 2^25 / 2^26 -- |c| <= 2^37 +// t6 -= c * 2^26 -- |t6| <= 2^25 < 1.1 * 2^25 (final t6) +// t7 += c -- |t7| <= 2^63 +// +// c = t3 + 2^24 / 2^25 -- |c| <= 2^38 +// t3 -= c * 2^25 -- |t3| <= 2^24 < 1.1 * 2^24 (final t3) +// t4 += c -- |t4| <= 2^25 + 2^38 < 2^39 +// +// c = t7 + 2^24 / 2^25 -- |c| <= 2^38 +// t7 -= c * 2^25 -- |t7| <= 2^24 < 1.1 * 2^24 (final t7) +// t8 += c -- |t8| <= 2^63 +// +// c = t4 + 2^25 / 2^26 -- |c| <= 2^13 +// t4 -= c * 2^26 -- |t4| <= 2^25 < 1.1 * 2^25 (final t4) +// t5 += c -- |t5| <= 2^24 + 2^13 < 1.1 * 2^24 (final t5) +// +// c = t8 + 2^25 / 2^26 -- |c| <= 2^37 +// t8 -= c * 2^26 -- |t8| <= 2^25 < 1.1 * 2^25 (final t8) +// t9 += c -- |t9| <= 2^63 +// +// c = t9 + 2^24 / 2^25 -- |c| <= 2^38 +// t9 -= c * 2^25 -- |t9| <= 2^24 < 1.1 * 2^24 (final t9) +// t0 += c * 19 -- |t0| <= 2^25 + 2^38*19 < 2^44 +// +// c = t0 + 2^25 / 2^26 -- |c| <= 2^18 +// t0 -= c * 2^26 -- |t0| <= 2^25 < 1.1 * 2^25 (final t0) +// t1 += c -- |t1| <= 2^24 + 2^18 < 1.1 * 2^24 (final t1) +// +// Postcondition +// ------------- +// |t0|, |t2|, |t4|, |t6|, |t8| < 1.1 * 2^25 +// |t1|, |t3|, |t5|, |t7|, |t9| < 1.1 * 2^24 +#define FE_CARRY \ + i64 c; \ + c = (t0 + ((i64)1<<25)) >> 26; t0 -= c * ((i64)1 << 26); t1 += c; \ + c = (t4 + ((i64)1<<25)) >> 26; t4 -= c * ((i64)1 << 26); t5 += c; \ + c = (t1 + ((i64)1<<24)) >> 25; t1 -= c * ((i64)1 << 25); t2 += c; \ + c = (t5 + ((i64)1<<24)) >> 25; t5 -= c * ((i64)1 << 25); t6 += c; \ + c = (t2 + ((i64)1<<25)) >> 26; t2 -= c * ((i64)1 << 26); t3 += c; \ + c = (t6 + ((i64)1<<25)) >> 26; t6 -= c * ((i64)1 << 26); t7 += c; \ + c = (t3 + ((i64)1<<24)) >> 25; t3 -= c * ((i64)1 << 25); t4 += c; \ + c = (t7 + ((i64)1<<24)) >> 25; t7 -= c * ((i64)1 << 25); t8 += c; \ + c = (t4 + ((i64)1<<25)) >> 26; t4 -= c * ((i64)1 << 26); t5 += c; \ + c = (t8 + ((i64)1<<25)) >> 26; t8 -= c * ((i64)1 << 26); t9 += c; \ + c = (t9 + ((i64)1<<24)) >> 25; t9 -= c * ((i64)1 << 25); t0 += c * 19; \ + c = (t0 + ((i64)1<<25)) >> 26; t0 -= c * ((i64)1 << 26); t1 += c; \ + h[0]=(i32)t0; h[1]=(i32)t1; h[2]=(i32)t2; h[3]=(i32)t3; h[4]=(i32)t4; \ + h[5]=(i32)t5; h[6]=(i32)t6; h[7]=(i32)t7; h[8]=(i32)t8; h[9]=(i32)t9 + +// Decodes a field element from a byte buffer. +// mask specifies how many bits we ignore. +// Traditionally we ignore 1. It's useful for EdDSA, +// which uses that bit to denote the sign of x. +// Elligator however uses positive representatives, +// which means ignoring 2 bits instead. +static void fe_frombytes_mask(fe h, const u8 s[32], unsigned nb_mask) +{ + u32 mask = 0xffffff >> nb_mask; + i64 t0 = load32_le(s); // t0 < 2^32 + i64 t1 = load24_le(s + 4) << 6; // t1 < 2^30 + i64 t2 = load24_le(s + 7) << 5; // t2 < 2^29 + i64 t3 = load24_le(s + 10) << 3; // t3 < 2^27 + i64 t4 = load24_le(s + 13) << 2; // t4 < 2^26 + i64 t5 = load32_le(s + 16); // t5 < 2^32 + i64 t6 = load24_le(s + 20) << 7; // t6 < 2^31 + i64 t7 = load24_le(s + 23) << 5; // t7 < 2^29 + i64 t8 = load24_le(s + 26) << 4; // t8 < 2^28 + i64 t9 = (load24_le(s + 29) & mask) << 2; // t9 < 2^25 + FE_CARRY; // Carry precondition OK +} + +static void fe_frombytes(fe h, const u8 s[32]) +{ + fe_frombytes_mask(h, s, 1); +} + + +// Precondition +// |h[0]|, |h[2]|, |h[4]|, |h[6]|, |h[8]| < 1.1 * 2^25 +// |h[1]|, |h[3]|, |h[5]|, |h[7]|, |h[9]| < 1.1 * 2^24 +// +// Therefore, |h| < 2^255-19 +// There are two possibilities: +// +// - If h is positive, all we need to do is reduce its individual +// limbs down to their tight positive range. +// - If h is negative, we also need to add 2^255-19 to it. +// Or just remove 19 and chop off any excess bit. +static void fe_tobytes(u8 s[32], const fe h) +{ + i32 t[10]; + COPY(t, h, 10); + i32 q = (19 * t[9] + (((i32) 1) << 24)) >> 25; + // |t9| < 1.1 * 2^24 + // -1.1 * 2^24 < t9 < 1.1 * 2^24 + // -21 * 2^24 < 19 * t9 < 21 * 2^24 + // -2^29 < 19 * t9 + 2^24 < 2^29 + // -2^29 / 2^25 < (19 * t9 + 2^24) / 2^25 < 2^29 / 2^25 + // -16 < (19 * t9 + 2^24) / 2^25 < 16 + FOR (i, 0, 5) { + q += t[2*i ]; q >>= 26; // q = 0 or -1 + q += t[2*i+1]; q >>= 25; // q = 0 or -1 + } + // q = 0 iff h >= 0 + // q = -1 iff h < 0 + // Adding q * 19 to h reduces h to its proper range. + q *= 19; // Shift carry back to the beginning + FOR (i, 0, 5) { + t[i*2 ] += q; q = t[i*2 ] >> 26; t[i*2 ] -= q * ((i32)1 << 26); + t[i*2+1] += q; q = t[i*2+1] >> 25; t[i*2+1] -= q * ((i32)1 << 25); + } + // h is now fully reduced, and q represents the excess bit. + + store32_le(s + 0, ((u32)t[0] >> 0) | ((u32)t[1] << 26)); + store32_le(s + 4, ((u32)t[1] >> 6) | ((u32)t[2] << 19)); + store32_le(s + 8, ((u32)t[2] >> 13) | ((u32)t[3] << 13)); + store32_le(s + 12, ((u32)t[3] >> 19) | ((u32)t[4] << 6)); + store32_le(s + 16, ((u32)t[5] >> 0) | ((u32)t[6] << 25)); + store32_le(s + 20, ((u32)t[6] >> 7) | ((u32)t[7] << 19)); + store32_le(s + 24, ((u32)t[7] >> 13) | ((u32)t[8] << 12)); + store32_le(s + 28, ((u32)t[8] >> 20) | ((u32)t[9] << 6)); + + WIPE_BUFFER(t); +} + +// Precondition +// ------------- +// |f0|, |f2|, |f4|, |f6|, |f8| < 1.65 * 2^26 +// |f1|, |f3|, |f5|, |f7|, |f9| < 1.65 * 2^25 +// +// |g0|, |g2|, |g4|, |g6|, |g8| < 1.65 * 2^26 +// |g1|, |g3|, |g5|, |g7|, |g9| < 1.65 * 2^25 +static void fe_mul_small(fe h, const fe f, i32 g) +{ + i64 t0 = f[0] * (i64) g; i64 t1 = f[1] * (i64) g; + i64 t2 = f[2] * (i64) g; i64 t3 = f[3] * (i64) g; + i64 t4 = f[4] * (i64) g; i64 t5 = f[5] * (i64) g; + i64 t6 = f[6] * (i64) g; i64 t7 = f[7] * (i64) g; + i64 t8 = f[8] * (i64) g; i64 t9 = f[9] * (i64) g; + // |t0|, |t2|, |t4|, |t6|, |t8| < 1.65 * 2^26 * 2^31 < 2^58 + // |t1|, |t3|, |t5|, |t7|, |t9| < 1.65 * 2^25 * 2^31 < 2^57 + + FE_CARRY; // Carry precondition OK +} + +// Precondition +// ------------- +// |f0|, |f2|, |f4|, |f6|, |f8| < 1.65 * 2^26 +// |f1|, |f3|, |f5|, |f7|, |f9| < 1.65 * 2^25 +// +// |g0|, |g2|, |g4|, |g6|, |g8| < 1.65 * 2^26 +// |g1|, |g3|, |g5|, |g7|, |g9| < 1.65 * 2^25 +static void fe_mul(fe h, const fe f, const fe g) +{ + // Everything is unrolled and put in temporary variables. + // We could roll the loop, but that would make curve25519 twice as slow. + i32 f0 = f[0]; i32 f1 = f[1]; i32 f2 = f[2]; i32 f3 = f[3]; i32 f4 = f[4]; + i32 f5 = f[5]; i32 f6 = f[6]; i32 f7 = f[7]; i32 f8 = f[8]; i32 f9 = f[9]; + i32 g0 = g[0]; i32 g1 = g[1]; i32 g2 = g[2]; i32 g3 = g[3]; i32 g4 = g[4]; + i32 g5 = g[5]; i32 g6 = g[6]; i32 g7 = g[7]; i32 g8 = g[8]; i32 g9 = g[9]; + i32 F1 = f1*2; i32 F3 = f3*2; i32 F5 = f5*2; i32 F7 = f7*2; i32 F9 = f9*2; + i32 G1 = g1*19; i32 G2 = g2*19; i32 G3 = g3*19; + i32 G4 = g4*19; i32 G5 = g5*19; i32 G6 = g6*19; + i32 G7 = g7*19; i32 G8 = g8*19; i32 G9 = g9*19; + // |F1|, |F3|, |F5|, |F7|, |F9| < 1.65 * 2^26 + // |G0|, |G2|, |G4|, |G6|, |G8| < 2^31 + // |G1|, |G3|, |G5|, |G7|, |G9| < 2^30 + + i64 t0 = f0*(i64)g0 + F1*(i64)G9 + f2*(i64)G8 + F3*(i64)G7 + f4*(i64)G6 + + F5*(i64)G5 + f6*(i64)G4 + F7*(i64)G3 + f8*(i64)G2 + F9*(i64)G1; + i64 t1 = f0*(i64)g1 + f1*(i64)g0 + f2*(i64)G9 + f3*(i64)G8 + f4*(i64)G7 + + f5*(i64)G6 + f6*(i64)G5 + f7*(i64)G4 + f8*(i64)G3 + f9*(i64)G2; + i64 t2 = f0*(i64)g2 + F1*(i64)g1 + f2*(i64)g0 + F3*(i64)G9 + f4*(i64)G8 + + F5*(i64)G7 + f6*(i64)G6 + F7*(i64)G5 + f8*(i64)G4 + F9*(i64)G3; + i64 t3 = f0*(i64)g3 + f1*(i64)g2 + f2*(i64)g1 + f3*(i64)g0 + f4*(i64)G9 + + f5*(i64)G8 + f6*(i64)G7 + f7*(i64)G6 + f8*(i64)G5 + f9*(i64)G4; + i64 t4 = f0*(i64)g4 + F1*(i64)g3 + f2*(i64)g2 + F3*(i64)g1 + f4*(i64)g0 + + F5*(i64)G9 + f6*(i64)G8 + F7*(i64)G7 + f8*(i64)G6 + F9*(i64)G5; + i64 t5 = f0*(i64)g5 + f1*(i64)g4 + f2*(i64)g3 + f3*(i64)g2 + f4*(i64)g1 + + f5*(i64)g0 + f6*(i64)G9 + f7*(i64)G8 + f8*(i64)G7 + f9*(i64)G6; + i64 t6 = f0*(i64)g6 + F1*(i64)g5 + f2*(i64)g4 + F3*(i64)g3 + f4*(i64)g2 + + F5*(i64)g1 + f6*(i64)g0 + F7*(i64)G9 + f8*(i64)G8 + F9*(i64)G7; + i64 t7 = f0*(i64)g7 + f1*(i64)g6 + f2*(i64)g5 + f3*(i64)g4 + f4*(i64)g3 + + f5*(i64)g2 + f6*(i64)g1 + f7*(i64)g0 + f8*(i64)G9 + f9*(i64)G8; + i64 t8 = f0*(i64)g8 + F1*(i64)g7 + f2*(i64)g6 + F3*(i64)g5 + f4*(i64)g4 + + F5*(i64)g3 + f6*(i64)g2 + F7*(i64)g1 + f8*(i64)g0 + F9*(i64)G9; + i64 t9 = f0*(i64)g9 + f1*(i64)g8 + f2*(i64)g7 + f3*(i64)g6 + f4*(i64)g5 + + f5*(i64)g4 + f6*(i64)g3 + f7*(i64)g2 + f8*(i64)g1 + f9*(i64)g0; + // t0 < 0.67 * 2^61 + // t1 < 0.41 * 2^61 + // t2 < 0.52 * 2^61 + // t3 < 0.32 * 2^61 + // t4 < 0.38 * 2^61 + // t5 < 0.22 * 2^61 + // t6 < 0.23 * 2^61 + // t7 < 0.13 * 2^61 + // t8 < 0.09 * 2^61 + // t9 < 0.03 * 2^61 + + FE_CARRY; // Everything below 2^62, Carry precondition OK +} + +// Precondition +// ------------- +// |f0|, |f2|, |f4|, |f6|, |f8| < 1.65 * 2^26 +// |f1|, |f3|, |f5|, |f7|, |f9| < 1.65 * 2^25 +// +// Note: we could use fe_mul() for this, but this is significantly faster +static void fe_sq(fe h, const fe f) +{ + i32 f0 = f[0]; i32 f1 = f[1]; i32 f2 = f[2]; i32 f3 = f[3]; i32 f4 = f[4]; + i32 f5 = f[5]; i32 f6 = f[6]; i32 f7 = f[7]; i32 f8 = f[8]; i32 f9 = f[9]; + i32 f0_2 = f0*2; i32 f1_2 = f1*2; i32 f2_2 = f2*2; i32 f3_2 = f3*2; + i32 f4_2 = f4*2; i32 f5_2 = f5*2; i32 f6_2 = f6*2; i32 f7_2 = f7*2; + i32 f5_38 = f5*38; i32 f6_19 = f6*19; i32 f7_38 = f7*38; + i32 f8_19 = f8*19; i32 f9_38 = f9*38; + // |f0_2| , |f2_2| , |f4_2| , |f6_2| , |f8_2| < 1.65 * 2^27 + // |f1_2| , |f3_2| , |f5_2| , |f7_2| , |f9_2| < 1.65 * 2^26 + // |f5_38|, |f6_19|, |f7_38|, |f8_19|, |f9_38| < 2^31 + + i64 t0 = f0 *(i64)f0 + f1_2*(i64)f9_38 + f2_2*(i64)f8_19 + + f3_2*(i64)f7_38 + f4_2*(i64)f6_19 + f5 *(i64)f5_38; + i64 t1 = f0_2*(i64)f1 + f2 *(i64)f9_38 + f3_2*(i64)f8_19 + + f4 *(i64)f7_38 + f5_2*(i64)f6_19; + i64 t2 = f0_2*(i64)f2 + f1_2*(i64)f1 + f3_2*(i64)f9_38 + + f4_2*(i64)f8_19 + f5_2*(i64)f7_38 + f6 *(i64)f6_19; + i64 t3 = f0_2*(i64)f3 + f1_2*(i64)f2 + f4 *(i64)f9_38 + + f5_2*(i64)f8_19 + f6 *(i64)f7_38; + i64 t4 = f0_2*(i64)f4 + f1_2*(i64)f3_2 + f2 *(i64)f2 + + f5_2*(i64)f9_38 + f6_2*(i64)f8_19 + f7 *(i64)f7_38; + i64 t5 = f0_2*(i64)f5 + f1_2*(i64)f4 + f2_2*(i64)f3 + + f6 *(i64)f9_38 + f7_2*(i64)f8_19; + i64 t6 = f0_2*(i64)f6 + f1_2*(i64)f5_2 + f2_2*(i64)f4 + + f3_2*(i64)f3 + f7_2*(i64)f9_38 + f8 *(i64)f8_19; + i64 t7 = f0_2*(i64)f7 + f1_2*(i64)f6 + f2_2*(i64)f5 + + f3_2*(i64)f4 + f8 *(i64)f9_38; + i64 t8 = f0_2*(i64)f8 + f1_2*(i64)f7_2 + f2_2*(i64)f6 + + f3_2*(i64)f5_2 + f4 *(i64)f4 + f9 *(i64)f9_38; + i64 t9 = f0_2*(i64)f9 + f1_2*(i64)f8 + f2_2*(i64)f7 + + f3_2*(i64)f6 + f4 *(i64)f5_2; + // t0 < 0.67 * 2^61 + // t1 < 0.41 * 2^61 + // t2 < 0.52 * 2^61 + // t3 < 0.32 * 2^61 + // t4 < 0.38 * 2^61 + // t5 < 0.22 * 2^61 + // t6 < 0.23 * 2^61 + // t7 < 0.13 * 2^61 + // t8 < 0.09 * 2^61 + // t9 < 0.03 * 2^61 + + FE_CARRY; +} + +// Parity check. Returns 0 if even, 1 if odd +static int fe_isodd(const fe f) +{ + u8 s[32]; + fe_tobytes(s, f); + u8 isodd = s[0] & 1; + WIPE_BUFFER(s); + return isodd; +} + +// Returns 1 if equal, 0 if not equal +static int fe_isequal(const fe f, const fe g) +{ + u8 fs[32]; + u8 gs[32]; + fe_tobytes(fs, f); + fe_tobytes(gs, g); + int isdifferent = crypto_verify32(fs, gs); + WIPE_BUFFER(fs); + WIPE_BUFFER(gs); + return 1 + isdifferent; +} + +// Inverse square root. +// Returns true if x is a square, false otherwise. +// After the call: +// isr = sqrt(1/x) if x is a non-zero square. +// isr = sqrt(sqrt(-1)/x) if x is not a square. +// isr = 0 if x is zero. +// We do not guarantee the sign of the square root. +// +// Notes: +// Let quartic = x^((p-1)/4) +// +// x^((p-1)/2) = chi(x) +// quartic^2 = chi(x) +// quartic = sqrt(chi(x)) +// quartic = 1 or -1 or sqrt(-1) or -sqrt(-1) +// +// Note that x is a square if quartic is 1 or -1 +// There are 4 cases to consider: +// +// if quartic = 1 (x is a square) +// then x^((p-1)/4) = 1 +// x^((p-5)/4) * x = 1 +// x^((p-5)/4) = 1/x +// x^((p-5)/8) = sqrt(1/x) or -sqrt(1/x) +// +// if quartic = -1 (x is a square) +// then x^((p-1)/4) = -1 +// x^((p-5)/4) * x = -1 +// x^((p-5)/4) = -1/x +// x^((p-5)/8) = sqrt(-1) / sqrt(x) +// x^((p-5)/8) * sqrt(-1) = sqrt(-1)^2 / sqrt(x) +// x^((p-5)/8) * sqrt(-1) = -1/sqrt(x) +// x^((p-5)/8) * sqrt(-1) = -sqrt(1/x) or sqrt(1/x) +// +// if quartic = sqrt(-1) (x is not a square) +// then x^((p-1)/4) = sqrt(-1) +// x^((p-5)/4) * x = sqrt(-1) +// x^((p-5)/4) = sqrt(-1)/x +// x^((p-5)/8) = sqrt(sqrt(-1)/x) or -sqrt(sqrt(-1)/x) +// +// Note that the product of two non-squares is always a square: +// For any non-squares a and b, chi(a) = -1 and chi(b) = -1. +// Since chi(x) = x^((p-1)/2), chi(a)*chi(b) = chi(a*b) = 1. +// Therefore a*b is a square. +// +// Since sqrt(-1) and x are both non-squares, their product is a +// square, and we can compute their square root. +// +// if quartic = -sqrt(-1) (x is not a square) +// then x^((p-1)/4) = -sqrt(-1) +// x^((p-5)/4) * x = -sqrt(-1) +// x^((p-5)/4) = -sqrt(-1)/x +// x^((p-5)/8) = sqrt(-sqrt(-1)/x) +// x^((p-5)/8) = sqrt( sqrt(-1)/x) * sqrt(-1) +// x^((p-5)/8) * sqrt(-1) = sqrt( sqrt(-1)/x) * sqrt(-1)^2 +// x^((p-5)/8) * sqrt(-1) = sqrt( sqrt(-1)/x) * -1 +// x^((p-5)/8) * sqrt(-1) = -sqrt(sqrt(-1)/x) or sqrt(sqrt(-1)/x) +static int invsqrt(fe isr, const fe x) +{ + fe t0, t1, t2; + + // t0 = x^((p-5)/8) + // Can be achieved with a simple double & add ladder, + // but it would be slower. + fe_sq(t0, x); + fe_sq(t1,t0); fe_sq(t1, t1); fe_mul(t1, x, t1); + fe_mul(t0, t0, t1); + fe_sq(t0, t0); fe_mul(t0, t1, t0); + fe_sq(t1, t0); FOR (i, 1, 5) { fe_sq(t1, t1); } fe_mul(t0, t1, t0); + fe_sq(t1, t0); FOR (i, 1, 10) { fe_sq(t1, t1); } fe_mul(t1, t1, t0); + fe_sq(t2, t1); FOR (i, 1, 20) { fe_sq(t2, t2); } fe_mul(t1, t2, t1); + fe_sq(t1, t1); FOR (i, 1, 10) { fe_sq(t1, t1); } fe_mul(t0, t1, t0); + fe_sq(t1, t0); FOR (i, 1, 50) { fe_sq(t1, t1); } fe_mul(t1, t1, t0); + fe_sq(t2, t1); FOR (i, 1, 100) { fe_sq(t2, t2); } fe_mul(t1, t2, t1); + fe_sq(t1, t1); FOR (i, 1, 50) { fe_sq(t1, t1); } fe_mul(t0, t1, t0); + fe_sq(t0, t0); FOR (i, 1, 2) { fe_sq(t0, t0); } fe_mul(t0, t0, x); + + // quartic = x^((p-1)/4) + i32 *quartic = t1; + fe_sq (quartic, t0); + fe_mul(quartic, quartic, x); + + i32 *check = t2; + fe_0 (check); int z0 = fe_isequal(x , check); + fe_1 (check); int p1 = fe_isequal(quartic, check); + fe_neg(check, check ); int m1 = fe_isequal(quartic, check); + fe_neg(check, sqrtm1); int ms = fe_isequal(quartic, check); + + // if quartic == -1 or sqrt(-1) + // then isr = x^((p-1)/4) * sqrt(-1) + // else isr = x^((p-1)/4) + fe_mul(isr, t0, sqrtm1); + fe_ccopy(isr, t0, 1 - (m1 | ms)); + + WIPE_BUFFER(t0); + WIPE_BUFFER(t1); + WIPE_BUFFER(t2); + return p1 | m1 | z0; +} + +// Inverse in terms of inverse square root. +// Requires two additional squarings to get rid of the sign. +// +// 1/x = x * (+invsqrt(x^2))^2 +// = x * (-invsqrt(x^2))^2 +// +// A fully optimised exponentiation by p-1 would save 6 field +// multiplications, but it would require more code. +static void fe_invert(fe out, const fe x) +{ + fe tmp; + fe_sq(tmp, x); + invsqrt(tmp, tmp); + fe_sq(tmp, tmp); + fe_mul(out, tmp, x); + WIPE_BUFFER(tmp); +} + +// trim a scalar for scalar multiplication +void crypto_eddsa_trim_scalar(u8 out[32], const u8 in[32]) +{ + COPY(out, in, 32); + out[ 0] &= 248; + out[31] &= 127; + out[31] |= 64; +} + +// get bit from scalar at position i +static int scalar_bit(const u8 s[32], int i) +{ + if (i < 0) { return 0; } // handle -1 for sliding windows + return (s[i>>3] >> (i&7)) & 1; +} + +/////////////// +/// X-25519 /// Taken from SUPERCOP's ref10 implementation. +/////////////// +static void scalarmult(u8 q[32], const u8 scalar[32], const u8 p[32], + int nb_bits) +{ + // computes the scalar product + fe x1; + fe_frombytes(x1, p); + + // computes the actual scalar product (the result is in x2 and z2) + fe x2, z2, x3, z3, t0, t1; + // Montgomery ladder + // In projective coordinates, to avoid divisions: x = X / Z + // We don't care about the y coordinate, it's only 1 bit of information + fe_1(x2); fe_0(z2); // "zero" point + fe_copy(x3, x1); fe_1(z3); // "one" point + int swap = 0; + for (int pos = nb_bits-1; pos >= 0; --pos) { + // constant time conditional swap before ladder step + int b = scalar_bit(scalar, pos); + swap ^= b; // xor trick avoids swapping at the end of the loop + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + swap = b; // anticipates one last swap after the loop + + // Montgomery ladder step: replaces (P2, P3) by (P2*2, P2+P3) + // with differential addition + fe_sub(t0, x3, z3); + fe_sub(t1, x2, z2); + fe_add(x2, x2, z2); + fe_add(z2, x3, z3); + fe_mul(z3, t0, x2); + fe_mul(z2, z2, t1); + fe_sq (t0, t1 ); + fe_sq (t1, x2 ); + fe_add(x3, z3, z2); + fe_sub(z2, z3, z2); + fe_mul(x2, t1, t0); + fe_sub(t1, t1, t0); + fe_sq (z2, z2 ); + fe_mul_small(z3, t1, 121666); + fe_sq (x3, x3 ); + fe_add(t0, t0, z3); + fe_mul(z3, x1, z2); + fe_mul(z2, t1, t0); + } + // last swap is necessary to compensate for the xor trick + // Note: after this swap, P3 == P2 + P1. + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + + // normalises the coordinates: x == X / Z + fe_invert(z2, z2); + fe_mul(x2, x2, z2); + fe_tobytes(q, x2); + + WIPE_BUFFER(x1); + WIPE_BUFFER(x2); WIPE_BUFFER(z2); WIPE_BUFFER(t0); + WIPE_BUFFER(x3); WIPE_BUFFER(z3); WIPE_BUFFER(t1); +} + +void crypto_x25519(u8 raw_shared_secret[32], + const u8 your_secret_key [32], + const u8 their_public_key [32]) +{ + // restrict the possible scalar values + u8 e[32]; + crypto_eddsa_trim_scalar(e, your_secret_key); + scalarmult(raw_shared_secret, e, their_public_key, 255); + WIPE_BUFFER(e); +} + +void crypto_x25519_public_key(u8 public_key[32], + const u8 secret_key[32]) +{ + static const u8 base_point[32] = {9}; + crypto_x25519(public_key, secret_key, base_point); +} + +/////////////////////////// +/// Arithmetic modulo L /// +/////////////////////////// +static const u32 L[8] = { + 0x5cf5d3ed, 0x5812631a, 0xa2f79cd6, 0x14def9de, + 0x00000000, 0x00000000, 0x00000000, 0x10000000, +}; + +// p = a*b + p +static void multiply(u32 p[16], const u32 a[8], const u32 b[8]) +{ + FOR (i, 0, 8) { + u64 carry = 0; + FOR (j, 0, 8) { + carry += p[i+j] + (u64)a[i] * b[j]; + p[i+j] = (u32)carry; + carry >>= 32; + } + p[i+8] = (u32)carry; + } +} + +static int is_above_l(const u32 x[8]) +{ + // We work with L directly, in a 2's complement encoding + // (-L == ~L + 1) + u64 carry = 1; + FOR (i, 0, 8) { + carry += (u64)x[i] + (~L[i] & 0xffffffff); + carry >>= 32; + } + return (int)carry; // carry is either 0 or 1 +} + +// Final reduction modulo L, by conditionally removing L. +// if x < l , then r = x +// if l <= x 2*l, then r = x-l +// otherwise the result will be wrong +static void remove_l(u32 r[8], const u32 x[8]) +{ + u64 carry = (u64)is_above_l(x); + u32 mask = ~(u32)carry + 1; // carry == 0 or 1 + FOR (i, 0, 8) { + carry += (u64)x[i] + (~L[i] & mask); + r[i] = (u32)carry; + carry >>= 32; + } +} + +// Full reduction modulo L (Barrett reduction) +static void mod_l(u8 reduced[32], const u32 x[16]) +{ + static const u32 r[9] = { + 0x0a2c131b,0xed9ce5a3,0x086329a7,0x2106215d, + 0xffffffeb,0xffffffff,0xffffffff,0xffffffff,0xf, + }; + // xr = x * r + u32 xr[25] = {0}; + FOR (i, 0, 9) { + u64 carry = 0; + FOR (j, 0, 16) { + carry += xr[i+j] + (u64)r[i] * x[j]; + xr[i+j] = (u32)carry; + carry >>= 32; + } + xr[i+16] = (u32)carry; + } + // xr = floor(xr / 2^512) * L + // Since the result is guaranteed to be below 2*L, + // it is enough to only compute the first 256 bits. + // The division is performed by saying xr[i+16]. (16 * 32 = 512) + ZERO(xr, 8); + FOR (i, 0, 8) { + u64 carry = 0; + FOR (j, 0, 8-i) { + carry += xr[i+j] + (u64)xr[i+16] * L[j]; + xr[i+j] = (u32)carry; + carry >>= 32; + } + } + // xr = x - xr + u64 carry = 1; + FOR (i, 0, 8) { + carry += (u64)x[i] + (~xr[i] & 0xffffffff); + xr[i] = (u32)carry; + carry >>= 32; + } + // Final reduction modulo L (conditional subtraction) + remove_l(xr, xr); + store32_le_buf(reduced, xr, 8); + + WIPE_BUFFER(xr); +} + +void crypto_eddsa_reduce(u8 reduced[32], const u8 expanded[64]) +{ + u32 x[16]; + load32_le_buf(x, expanded, 16); + mod_l(reduced, x); + WIPE_BUFFER(x); +} + +// r = (a * b) + c +void crypto_eddsa_mul_add(u8 r[32], + const u8 a[32], const u8 b[32], const u8 c[32]) +{ + u32 A[8]; load32_le_buf(A, a, 8); + u32 B[8]; load32_le_buf(B, b, 8); + u32 p[16]; load32_le_buf(p, c, 8); ZERO(p + 8, 8); + multiply(p, A, B); + mod_l(r, p); + WIPE_BUFFER(p); + WIPE_BUFFER(A); + WIPE_BUFFER(B); +} + +/////////////// +/// Ed25519 /// +/////////////// + +// Point (group element, ge) in a twisted Edwards curve, +// in extended projective coordinates. +// ge : x = X/Z, y = Y/Z, T = XY/Z +// ge_cached : Yp = X+Y, Ym = X-Y, T2 = T*D2 +// ge_precomp: Z = 1 +typedef struct { fe X; fe Y; fe Z; fe T; } ge; +typedef struct { fe Yp; fe Ym; fe Z; fe T2; } ge_cached; +typedef struct { fe Yp; fe Ym; fe T2; } ge_precomp; + +static void ge_zero(ge *p) +{ + fe_0(p->X); + fe_1(p->Y); + fe_1(p->Z); + fe_0(p->T); +} + +static void ge_tobytes(u8 s[32], const ge *h) +{ + fe recip, x, y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= (u8)fe_isodd(x) << 7; + + WIPE_BUFFER(recip); + WIPE_BUFFER(x); + WIPE_BUFFER(y); +} + +// h = -s, where s is a point encoded in 32 bytes +// +// Variable time! Inputs must not be secret! +// => Use only to *check* signatures. +// +// From the specifications: +// The encoding of s contains y and the sign of x +// x = sqrt((y^2 - 1) / (d*y^2 + 1)) +// In extended coordinates: +// X = x, Y = y, Z = 1, T = x*y +// +// Note that num * den is a square iff num / den is a square +// If num * den is not a square, the point was not on the curve. +// From the above: +// Let num = y^2 - 1 +// Let den = d*y^2 + 1 +// x = sqrt((y^2 - 1) / (d*y^2 + 1)) +// x = sqrt(num / den) +// x = sqrt(num^2 / (num * den)) +// x = num * sqrt(1 / (num * den)) +// +// Therefore, we can just compute: +// num = y^2 - 1 +// den = d*y^2 + 1 +// isr = invsqrt(num * den) // abort if not square +// x = num * isr +// Finally, negate x if its sign is not as specified. +static int ge_frombytes_neg_vartime(ge *h, const u8 s[32]) +{ + fe_frombytes(h->Y, s); + fe_1(h->Z); + fe_sq (h->T, h->Y); // t = y^2 + fe_mul(h->X, h->T, d ); // x = d*y^2 + fe_sub(h->T, h->T, h->Z); // t = y^2 - 1 + fe_add(h->X, h->X, h->Z); // x = d*y^2 + 1 + fe_mul(h->X, h->T, h->X); // x = (y^2 - 1) * (d*y^2 + 1) + int is_square = invsqrt(h->X, h->X); + if (!is_square) { + return -1; // Not on the curve, abort + } + fe_mul(h->X, h->T, h->X); // x = sqrt((y^2 - 1) / (d*y^2 + 1)) + if (fe_isodd(h->X) == (s[31] >> 7)) { + fe_neg(h->X, h->X); + } + fe_mul(h->T, h->X, h->Y); + return 0; +} + +static void ge_cache(ge_cached *c, const ge *p) +{ + fe_add (c->Yp, p->Y, p->X); + fe_sub (c->Ym, p->Y, p->X); + fe_copy(c->Z , p->Z ); + fe_mul (c->T2, p->T, D2 ); +} + +// Internal buffers are not wiped! Inputs must not be secret! +// => Use only to *check* signatures. +static void ge_add(ge *s, const ge *p, const ge_cached *q) +{ + fe a, b; + fe_add(a , p->Y, p->X ); + fe_sub(b , p->Y, p->X ); + fe_mul(a , a , q->Yp); + fe_mul(b , b , q->Ym); + fe_add(s->Y, a , b ); + fe_sub(s->X, a , b ); + + fe_add(s->Z, p->Z, p->Z ); + fe_mul(s->Z, s->Z, q->Z ); + fe_mul(s->T, p->T, q->T2); + fe_add(a , s->Z, s->T ); + fe_sub(b , s->Z, s->T ); + + fe_mul(s->T, s->X, s->Y); + fe_mul(s->X, s->X, b ); + fe_mul(s->Y, s->Y, a ); + fe_mul(s->Z, a , b ); +} + +// Internal buffers are not wiped! Inputs must not be secret! +// => Use only to *check* signatures. +static void ge_sub(ge *s, const ge *p, const ge_cached *q) +{ + ge_cached neg; + fe_copy(neg.Ym, q->Yp); + fe_copy(neg.Yp, q->Ym); + fe_copy(neg.Z , q->Z ); + fe_neg (neg.T2, q->T2); + ge_add(s, p, &neg); +} + +static void ge_madd(ge *s, const ge *p, const ge_precomp *q, fe a, fe b) +{ + fe_add(a , p->Y, p->X ); + fe_sub(b , p->Y, p->X ); + fe_mul(a , a , q->Yp); + fe_mul(b , b , q->Ym); + fe_add(s->Y, a , b ); + fe_sub(s->X, a , b ); + + fe_add(s->Z, p->Z, p->Z ); + fe_mul(s->T, p->T, q->T2); + fe_add(a , s->Z, s->T ); + fe_sub(b , s->Z, s->T ); + + fe_mul(s->T, s->X, s->Y); + fe_mul(s->X, s->X, b ); + fe_mul(s->Y, s->Y, a ); + fe_mul(s->Z, a , b ); +} + +// Internal buffers are not wiped! Inputs must not be secret! +// => Use only to *check* signatures. +static void ge_msub(ge *s, const ge *p, const ge_precomp *q, fe a, fe b) +{ + ge_precomp neg; + fe_copy(neg.Ym, q->Yp); + fe_copy(neg.Yp, q->Ym); + fe_neg (neg.T2, q->T2); + ge_madd(s, p, &neg, a, b); +} + +static void ge_double(ge *s, const ge *p, ge *q) +{ + fe_sq (q->X, p->X); + fe_sq (q->Y, p->Y); + fe_sq (q->Z, p->Z); // qZ = pZ^2 + fe_mul_small(q->Z, q->Z, 2); // qZ = pZ^2 * 2 + fe_add(q->T, p->X, p->Y); + fe_sq (s->T, q->T); + fe_add(q->T, q->Y, q->X); + fe_sub(q->Y, q->Y, q->X); + fe_sub(q->X, s->T, q->T); + fe_sub(q->Z, q->Z, q->Y); + + fe_mul(s->X, q->X , q->Z); + fe_mul(s->Y, q->T , q->Y); + fe_mul(s->Z, q->Y , q->Z); + fe_mul(s->T, q->X , q->T); +} + +// 5-bit signed window in cached format (Niels coordinates, Z=1) +static const ge_precomp b_window[8] = { + {{25967493,-14356035,29566456,3660896,-12694345, + 4014787,27544626,-11754271,-6079156,2047605,}, + {-12545711,934262,-2722910,3049990,-727428, + 9406986,12720692,5043384,19500929,-15469378,}, + {-8738181,4489570,9688441,-14785194,10184609, + -12363380,29287919,11864899,-24514362,-4438546,},}, + {{15636291,-9688557,24204773,-7912398,616977, + -16685262,27787600,-14772189,28944400,-1550024,}, + {16568933,4717097,-11556148,-1102322,15682896, + -11807043,16354577,-11775962,7689662,11199574,}, + {30464156,-5976125,-11779434,-15670865,23220365, + 15915852,7512774,10017326,-17749093,-9920357,},}, + {{10861363,11473154,27284546,1981175,-30064349, + 12577861,32867885,14515107,-15438304,10819380,}, + {4708026,6336745,20377586,9066809,-11272109, + 6594696,-25653668,12483688,-12668491,5581306,}, + {19563160,16186464,-29386857,4097519,10237984, + -4348115,28542350,13850243,-23678021,-15815942,},}, + {{5153746,9909285,1723747,-2777874,30523605, + 5516873,19480852,5230134,-23952439,-15175766,}, + {-30269007,-3463509,7665486,10083793,28475525, + 1649722,20654025,16520125,30598449,7715701,}, + {28881845,14381568,9657904,3680757,-20181635, + 7843316,-31400660,1370708,29794553,-1409300,},}, + {{-22518993,-6692182,14201702,-8745502,-23510406, + 8844726,18474211,-1361450,-13062696,13821877,}, + {-6455177,-7839871,3374702,-4740862,-27098617, + -10571707,31655028,-7212327,18853322,-14220951,}, + {4566830,-12963868,-28974889,-12240689,-7602672, + -2830569,-8514358,-10431137,2207753,-3209784,},}, + {{-25154831,-4185821,29681144,7868801,-6854661, + -9423865,-12437364,-663000,-31111463,-16132436,}, + {25576264,-2703214,7349804,-11814844,16472782, + 9300885,3844789,15725684,171356,6466918,}, + {23103977,13316479,9739013,-16149481,817875, + -15038942,8965339,-14088058,-30714912,16193877,},}, + {{-33521811,3180713,-2394130,14003687,-16903474, + -16270840,17238398,4729455,-18074513,9256800,}, + {-25182317,-4174131,32336398,5036987,-21236817, + 11360617,22616405,9761698,-19827198,630305,}, + {-13720693,2639453,-24237460,-7406481,9494427, + -5774029,-6554551,-15960994,-2449256,-14291300,},}, + {{-3151181,-5046075,9282714,6866145,-31907062, + -863023,-18940575,15033784,25105118,-7894876,}, + {-24326370,15950226,-31801215,-14592823,-11662737, + -5090925,1573892,-2625887,2198790,-15804619,}, + {-3099351,10324967,-2241613,7453183,-5446979, + -2735503,-13812022,-16236442,-32461234,-12290683,},}, +}; + +// Incremental sliding windows (left to right) +// Based on Roberto Maria Avanzi[2005] +typedef struct { + i16 next_index; // position of the next signed digit + i8 next_digit; // next signed digit (odd number below 2^window_width) + u8 next_check; // point at which we must check for a new window +} slide_ctx; + +static void slide_init(slide_ctx *ctx, const u8 scalar[32]) +{ + // scalar is guaranteed to be below L, either because we checked (s), + // or because we reduced it modulo L (h_ram). L is under 2^253, so + // so bits 253 to 255 are guaranteed to be zero. No need to test them. + // + // Note however that L is very close to 2^252, so bit 252 is almost + // always zero. If we were to start at bit 251, the tests wouldn't + // catch the off-by-one error (constructing one that does would be + // prohibitively expensive). + // + // We should still check bit 252, though. + int i = 252; + while (i > 0 && scalar_bit(scalar, i) == 0) { + i--; + } + ctx->next_check = (u8)(i + 1); + ctx->next_index = -1; + ctx->next_digit = -1; +} + +static int slide_step(slide_ctx *ctx, int width, int i, const u8 scalar[32]) +{ + if (i == ctx->next_check) { + if (scalar_bit(scalar, i) == scalar_bit(scalar, i - 1)) { + ctx->next_check--; + } else { + // compute digit of next window + int w = MIN(width, i + 1); + int v = -(scalar_bit(scalar, i) << (w-1)); + FOR_T (int, j, 0, w-1) { + v += scalar_bit(scalar, i-(w-1)+j) << j; + } + v += scalar_bit(scalar, i-w); + int lsb = v & (~v + 1); // smallest bit of v + int s = // log2(lsb) + (((lsb & 0xAA) != 0) << 0) | + (((lsb & 0xCC) != 0) << 1) | + (((lsb & 0xF0) != 0) << 2); + ctx->next_index = (i16)(i-(w-1)+s); + ctx->next_digit = (i8) (v >> s ); + ctx->next_check -= (u8) w; + } + } + return i == ctx->next_index ? ctx->next_digit: 0; +} + +#define P_W_WIDTH 3 // Affects the size of the stack +#define B_W_WIDTH 5 // Affects the size of the binary +#define P_W_SIZE (1<<(P_W_WIDTH-2)) + +int crypto_eddsa_check_equation(const u8 signature[64], const u8 public_key[32], + const u8 h[32]) +{ + ge minus_A; // -public_key + ge minus_R; // -first_half_of_signature + const u8 *s = signature + 32; + + // Check that A and R are on the curve + // Check that 0 <= S < L (prevents malleability) + // *Allow* non-cannonical encoding for A and R + { + u32 s32[8]; + load32_le_buf(s32, s, 8); + if (ge_frombytes_neg_vartime(&minus_A, public_key) || + ge_frombytes_neg_vartime(&minus_R, signature) || + is_above_l(s32)) { + return -1; + } + } + + // look-up table for minus_A + ge_cached lutA[P_W_SIZE]; + { + ge minus_A2, tmp; + ge_double(&minus_A2, &minus_A, &tmp); + ge_cache(&lutA[0], &minus_A); + FOR (i, 1, P_W_SIZE) { + ge_add(&tmp, &minus_A2, &lutA[i-1]); + ge_cache(&lutA[i], &tmp); + } + } + + // sum = [s]B - [h]A + // Merged double and add ladder, fused with sliding + slide_ctx h_slide; slide_init(&h_slide, h); + slide_ctx s_slide; slide_init(&s_slide, s); + int i = MAX(h_slide.next_check, s_slide.next_check); + ge *sum = &minus_A; // reuse minus_A for the sum + ge_zero(sum); + while (i >= 0) { + ge tmp; + ge_double(sum, sum, &tmp); + int h_digit = slide_step(&h_slide, P_W_WIDTH, i, h); + int s_digit = slide_step(&s_slide, B_W_WIDTH, i, s); + if (h_digit > 0) { ge_add(sum, sum, &lutA[ h_digit / 2]); } + if (h_digit < 0) { ge_sub(sum, sum, &lutA[-h_digit / 2]); } + fe t1, t2; + if (s_digit > 0) { ge_madd(sum, sum, b_window + s_digit/2, t1, t2); } + if (s_digit < 0) { ge_msub(sum, sum, b_window + -s_digit/2, t1, t2); } + i--; + } + + // Compare [8](sum-R) and the zero point + // The multiplication by 8 eliminates any low-order component + // and ensures consistency with batched verification. + ge_cached cached; + u8 check[32]; + static const u8 zero_point[32] = {1}; // Point of order 1 + ge_cache(&cached, &minus_R); + ge_add(sum, sum, &cached); + ge_double(sum, sum, &minus_R); // reuse minus_R as temporary + ge_double(sum, sum, &minus_R); // reuse minus_R as temporary + ge_double(sum, sum, &minus_R); // reuse minus_R as temporary + ge_tobytes(check, sum); + return crypto_verify32(check, zero_point); +} + +// 5-bit signed comb in cached format (Niels coordinates, Z=1) +static const ge_precomp b_comb_low[8] = { + {{-6816601,-2324159,-22559413,124364,18015490, + 8373481,19993724,1979872,-18549925,9085059,}, + {10306321,403248,14839893,9633706,8463310, + -8354981,-14305673,14668847,26301366,2818560,}, + {-22701500,-3210264,-13831292,-2927732,-16326337, + -14016360,12940910,177905,12165515,-2397893,},}, + {{-12282262,-7022066,9920413,-3064358,-32147467, + 2927790,22392436,-14852487,2719975,16402117,}, + {-7236961,-4729776,2685954,-6525055,-24242706, + -15940211,-6238521,14082855,10047669,12228189,}, + {-30495588,-12893761,-11161261,3539405,-11502464, + 16491580,-27286798,-15030530,-7272871,-15934455,},}, + {{17650926,582297,-860412,-187745,-12072900, + -10683391,-20352381,15557840,-31072141,-5019061,}, + {-6283632,-2259834,-4674247,-4598977,-4089240, + 12435688,-31278303,1060251,6256175,10480726,}, + {-13871026,2026300,-21928428,-2741605,-2406664, + -8034988,7355518,15733500,-23379862,7489131,},}, + {{6883359,695140,23196907,9644202,-33430614, + 11354760,-20134606,6388313,-8263585,-8491918,}, + {-7716174,-13605463,-13646110,14757414,-19430591, + -14967316,10359532,-11059670,-21935259,12082603,}, + {-11253345,-15943946,10046784,5414629,24840771, + 8086951,-6694742,9868723,15842692,-16224787,},}, + {{9639399,11810955,-24007778,-9320054,3912937, + -9856959,996125,-8727907,-8919186,-14097242,}, + {7248867,14468564,25228636,-8795035,14346339, + 8224790,6388427,-7181107,6468218,-8720783,}, + {15513115,15439095,7342322,-10157390,18005294, + -7265713,2186239,4884640,10826567,7135781,},}, + {{-14204238,5297536,-5862318,-6004934,28095835, + 4236101,-14203318,1958636,-16816875,3837147,}, + {-5511166,-13176782,-29588215,12339465,15325758, + -15945770,-8813185,11075932,-19608050,-3776283,}, + {11728032,9603156,-4637821,-5304487,-7827751, + 2724948,31236191,-16760175,-7268616,14799772,},}, + {{-28842672,4840636,-12047946,-9101456,-1445464, + 381905,-30977094,-16523389,1290540,12798615,}, + {27246947,-10320914,14792098,-14518944,5302070, + -8746152,-3403974,-4149637,-27061213,10749585,}, + {25572375,-6270368,-15353037,16037944,1146292, + 32198,23487090,9585613,24714571,-1418265,},}, + {{19844825,282124,-17583147,11004019,-32004269, + -2716035,6105106,-1711007,-21010044,14338445,}, + {8027505,8191102,-18504907,-12335737,25173494, + -5923905,15446145,7483684,-30440441,10009108,}, + {-14134701,-4174411,10246585,-14677495,33553567, + -14012935,23366126,15080531,-7969992,7663473,},}, +}; + +static const ge_precomp b_comb_high[8] = { + {{33055887,-4431773,-521787,6654165,951411, + -6266464,-5158124,6995613,-5397442,-6985227,}, + {4014062,6967095,-11977872,3960002,8001989, + 5130302,-2154812,-1899602,-31954493,-16173976,}, + {16271757,-9212948,23792794,731486,-25808309, + -3546396,6964344,-4767590,10976593,10050757,},}, + {{2533007,-4288439,-24467768,-12387405,-13450051, + 14542280,12876301,13893535,15067764,8594792,}, + {20073501,-11623621,3165391,-13119866,13188608, + -11540496,-10751437,-13482671,29588810,2197295,}, + {-1084082,11831693,6031797,14062724,14748428, + -8159962,-20721760,11742548,31368706,13161200,},}, + {{2050412,-6457589,15321215,5273360,25484180, + 124590,-18187548,-7097255,-6691621,-14604792,}, + {9938196,2162889,-6158074,-1711248,4278932, + -2598531,-22865792,-7168500,-24323168,11746309,}, + {-22691768,-14268164,5965485,9383325,20443693, + 5854192,28250679,-1381811,-10837134,13717818,},}, + {{-8495530,16382250,9548884,-4971523,-4491811, + -3902147,6182256,-12832479,26628081,10395408,}, + {27329048,-15853735,7715764,8717446,-9215518, + -14633480,28982250,-5668414,4227628,242148,}, + {-13279943,-7986904,-7100016,8764468,-27276630, + 3096719,29678419,-9141299,3906709,11265498,},}, + {{11918285,15686328,-17757323,-11217300,-27548967, + 4853165,-27168827,6807359,6871949,-1075745,}, + {-29002610,13984323,-27111812,-2713442,28107359, + -13266203,6155126,15104658,3538727,-7513788,}, + {14103158,11233913,-33165269,9279850,31014152, + 4335090,-1827936,4590951,13960841,12787712,},}, + {{1469134,-16738009,33411928,13942824,8092558, + -8778224,-11165065,1437842,22521552,-2792954,}, + {31352705,-4807352,-25327300,3962447,12541566, + -9399651,-27425693,7964818,-23829869,5541287,}, + {-25732021,-6864887,23848984,3039395,-9147354, + 6022816,-27421653,10590137,25309915,-1584678,},}, + {{-22951376,5048948,31139401,-190316,-19542447, + -626310,-17486305,-16511925,-18851313,-12985140,}, + {-9684890,14681754,30487568,7717771,-10829709, + 9630497,30290549,-10531496,-27798994,-13812825,}, + {5827835,16097107,-24501327,12094619,7413972, + 11447087,28057551,-1793987,-14056981,4359312,},}, + {{26323183,2342588,-21887793,-1623758,-6062284, + 2107090,-28724907,9036464,-19618351,-13055189,}, + {-29697200,14829398,-4596333,14220089,-30022969, + 2955645,12094100,-13693652,-5941445,7047569,}, + {-3201977,14413268,-12058324,-16417589,-9035655, + -7224648,9258160,1399236,30397584,-5684634,},}, +}; + +static void lookup_add(ge *p, ge_precomp *tmp_c, fe tmp_a, fe tmp_b, + const ge_precomp comb[8], const u8 scalar[32], int i) +{ + u8 teeth = (u8)((scalar_bit(scalar, i) ) + + (scalar_bit(scalar, i + 32) << 1) + + (scalar_bit(scalar, i + 64) << 2) + + (scalar_bit(scalar, i + 96) << 3)); + u8 high = teeth >> 3; + u8 index = (teeth ^ (high - 1)) & 7; + FOR (j, 0, 8) { + i32 select = 1 & (((j ^ index) - 1) >> 8); + fe_ccopy(tmp_c->Yp, comb[j].Yp, select); + fe_ccopy(tmp_c->Ym, comb[j].Ym, select); + fe_ccopy(tmp_c->T2, comb[j].T2, select); + } + fe_neg(tmp_a, tmp_c->T2); + fe_cswap(tmp_c->T2, tmp_a , high ^ 1); + fe_cswap(tmp_c->Yp, tmp_c->Ym, high ^ 1); + ge_madd(p, p, tmp_c, tmp_a, tmp_b); +} + +// p = [scalar]B, where B is the base point +static void ge_scalarmult_base(ge *p, const u8 scalar[32]) +{ + // twin 4-bits signed combs, from Mike Hamburg's + // Fast and compact elliptic-curve cryptography (2012) + // 1 / 2 modulo L + static const u8 half_mod_L[32] = { + 247,233,122,46,141,49,9,44,107,206,123,81,239,124,111,10, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8, + }; + // (2^256 - 1) / 2 modulo L + static const u8 half_ones[32] = { + 142,74,204,70,186,24,118,107,184,231,190,57,250,173,119,99, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7, + }; + + // All bits set form: 1 means 1, 0 means -1 + u8 s_scalar[32]; + crypto_eddsa_mul_add(s_scalar, scalar, half_mod_L, half_ones); + + // Double and add ladder + fe tmp_a, tmp_b; // temporaries for addition + ge_precomp tmp_c; // temporary for comb lookup + ge tmp_d; // temporary for doubling + fe_1(tmp_c.Yp); + fe_1(tmp_c.Ym); + fe_0(tmp_c.T2); + + // Save a double on the first iteration + ge_zero(p); + lookup_add(p, &tmp_c, tmp_a, tmp_b, b_comb_low , s_scalar, 31); + lookup_add(p, &tmp_c, tmp_a, tmp_b, b_comb_high, s_scalar, 31+128); + // Regular double & add for the rest + for (int i = 30; i >= 0; i--) { + ge_double(p, p, &tmp_d); + lookup_add(p, &tmp_c, tmp_a, tmp_b, b_comb_low , s_scalar, i); + lookup_add(p, &tmp_c, tmp_a, tmp_b, b_comb_high, s_scalar, i+128); + } + // Note: we could save one addition at the end if we assumed the + // scalar fit in 252 bits. Which it does in practice if it is + // selected at random. However, non-random, non-hashed scalars + // *can* overflow 252 bits in practice. Better account for that + // than leaving that kind of subtle corner case. + + WIPE_BUFFER(tmp_a); WIPE_CTX(&tmp_d); + WIPE_BUFFER(tmp_b); WIPE_CTX(&tmp_c); + WIPE_BUFFER(s_scalar); +} + +void crypto_eddsa_scalarbase(u8 point[32], const u8 scalar[32]) +{ + ge P; + ge_scalarmult_base(&P, scalar); + ge_tobytes(point, &P); + WIPE_CTX(&P); +} + +void crypto_eddsa_key_pair(u8 secret_key[64], u8 public_key[32], u8 seed[32]) +{ + // To allow overlaps, observable writes happen in this order: + // 1. seed + // 2. secret_key + // 3. public_key + u8 a[64]; + COPY(a, seed, 32); + crypto_wipe(seed, 32); + COPY(secret_key, a, 32); + crypto_blake2b(a, 64, a, 32); + crypto_eddsa_trim_scalar(a, a); + crypto_eddsa_scalarbase(secret_key + 32, a); + COPY(public_key, secret_key + 32, 32); + WIPE_BUFFER(a); +} + +static void hash_reduce(u8 h[32], + const u8 *a, size_t a_size, + const u8 *b, size_t b_size, + const u8 *c, size_t c_size) +{ + u8 hash[64]; + crypto_blake2b_ctx ctx; + crypto_blake2b_init (&ctx, 64); + crypto_blake2b_update(&ctx, a, a_size); + crypto_blake2b_update(&ctx, b, b_size); + crypto_blake2b_update(&ctx, c, c_size); + crypto_blake2b_final (&ctx, hash); + crypto_eddsa_reduce(h, hash); +} + +// Digital signature of a message with from a secret key. +// +// The secret key comprises two parts: +// - The seed that generates the key (secret_key[ 0..31]) +// - The public key (secret_key[32..63]) +// +// The seed and the public key are bundled together to make sure users +// don't use mismatched seeds and public keys, which would instantly +// leak the secret scalar and allow forgeries (allowing this to happen +// has resulted in critical vulnerabilities in the wild). +// +// The seed is hashed to derive the secret scalar and a secret prefix. +// The sole purpose of the prefix is to generate a secret random nonce. +// The properties of that nonce must be as follows: +// - Unique: we need a different one for each message. +// - Secret: third parties must not be able to predict it. +// - Random: any detectable bias would break all security. +// +// There are two ways to achieve these properties. The obvious one is +// to simply generate a random number. Here that would be a parameter +// (Monocypher doesn't have an RNG). It works, but then users may reuse +// the nonce by accident, which _also_ leaks the secret scalar and +// allows forgeries. This has happened in the wild too. +// +// This is no good, so instead we generate that nonce deterministically +// by reducing modulo L a hash of the secret prefix and the message. +// The secret prefix makes the nonce unpredictable, the message makes it +// unique, and the hash/reduce removes all bias. +// +// The cost of that safety is hashing the message twice. If that cost +// is unacceptable, there are two alternatives: +// +// - Signing a hash of the message instead of the message itself. This +// is fine as long as the hash is collision resistant. It is not +// compatible with existing "pure" signatures, but at least it's safe. +// +// - Using a random nonce. Please exercise **EXTREME CAUTION** if you +// ever do that. It is absolutely **critical** that the nonce is +// really an unbiased random number between 0 and L-1, never reused, +// and wiped immediately. +// +// To lower the likelihood of complete catastrophe if the RNG is +// either flawed or misused, you can hash the RNG output together with +// the secret prefix and the beginning of the message, and use the +// reduction of that hash instead of the RNG output itself. It's not +// foolproof (you'd need to hash the whole message) but it helps. +// +// Signing a message involves the following operations: +// +// scalar, prefix = HASH(secret_key) +// r = HASH(prefix || message) % L +// R = [r]B +// h = HASH(R || public_key || message) % L +// S = ((h * a) + r) % L +// signature = R || S +void crypto_eddsa_sign(u8 signature [64], const u8 secret_key[64], + const u8 *message, size_t message_size) +{ + u8 a[64]; // secret scalar and prefix + u8 r[32]; // secret deterministic "random" nonce + u8 h[32]; // publically verifiable hash of the message (not wiped) + u8 R[32]; // first half of the signature (allows overlapping inputs) + + crypto_blake2b(a, 64, secret_key, 32); + crypto_eddsa_trim_scalar(a, a); + hash_reduce(r, a + 32, 32, message, message_size, 0, 0); + crypto_eddsa_scalarbase(R, r); + hash_reduce(h, R, 32, secret_key + 32, 32, message, message_size); + COPY(signature, R, 32); + crypto_eddsa_mul_add(signature + 32, h, a, r); + + WIPE_BUFFER(a); + WIPE_BUFFER(r); +} + +// To check the signature R, S of the message M with the public key A, +// there are 3 steps: +// +// compute h = HASH(R || A || message) % L +// check that A is on the curve. +// check that R == [s]B - [h]A +// +// The last two steps are done in crypto_eddsa_check_equation() +int crypto_eddsa_check(const u8 signature[64], const u8 public_key[32], + const u8 *message, size_t message_size) +{ + u8 h[32]; + hash_reduce(h, signature, 32, public_key, 32, message, message_size); + return crypto_eddsa_check_equation(signature, public_key, h); +} + +///////////////////////// +/// EdDSA <--> X25519 /// +///////////////////////// +void crypto_eddsa_to_x25519(u8 x25519[32], const u8 eddsa[32]) +{ + // (u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x) + // Only converting y to u, the sign of x is ignored. + fe t1, t2; + fe_frombytes(t2, eddsa); + fe_add(t1, fe_one, t2); + fe_sub(t2, fe_one, t2); + fe_invert(t2, t2); + fe_mul(t1, t1, t2); + fe_tobytes(x25519, t1); + WIPE_BUFFER(t1); + WIPE_BUFFER(t2); +} + +void crypto_x25519_to_eddsa(u8 eddsa[32], const u8 x25519[32]) +{ + // (x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1)) + // Only converting u to y, x is assumed positive. + fe t1, t2; + fe_frombytes(t2, x25519); + fe_sub(t1, t2, fe_one); + fe_add(t2, t2, fe_one); + fe_invert(t2, t2); + fe_mul(t1, t1, t2); + fe_tobytes(eddsa, t1); + WIPE_BUFFER(t1); + WIPE_BUFFER(t2); +} + +///////////////////////////////////////////// +/// Dirty ephemeral public key generation /// +///////////////////////////////////////////// + +// Those functions generates a public key, *without* clearing the +// cofactor. Sending that key over the network leaks 3 bits of the +// private key. Use only to generate ephemeral keys that will be hidden +// with crypto_curve_to_hidden(). +// +// The public key is otherwise compatible with crypto_x25519(), which +// properly clears the cofactor. +// +// Note that the distribution of the resulting public keys is almost +// uniform. Flipping the sign of the v coordinate (not provided by this +// function), covers the entire key space almost perfectly, where +// "almost" means a 2^-128 bias (undetectable). This uniformity is +// needed to ensure the proper randomness of the resulting +// representatives (once we apply crypto_curve_to_hidden()). +// +// Recall that Curve25519 has order C = 2^255 + e, with e < 2^128 (not +// to be confused with the prime order of the main subgroup, L, which is +// 8 times less than that). +// +// Generating all points would require us to multiply a point of order C +// (the base point plus any point of order 8) by all scalars from 0 to +// C-1. Clamping limits us to scalars between 2^254 and 2^255 - 1. But +// by negating the resulting point at random, we also cover scalars from +// -2^255 + 1 to -2^254 (which modulo C is congruent to e+1 to 2^254 + e). +// +// In practice: +// - Scalars from 0 to e + 1 are never generated +// - Scalars from 2^255 to 2^255 + e are never generated +// - Scalars from 2^254 + 1 to 2^254 + e are generated twice +// +// Since e < 2^128, detecting this bias requires observing over 2^100 +// representatives from a given source (this will never happen), *and* +// recovering enough of the private key to determine that they do, or do +// not, belong to the biased set (this practically requires solving +// discrete logarithm, which is conjecturally intractable). +// +// In practice, this means the bias is impossible to detect. + +// s + (x*L) % 8*L +// Guaranteed to fit in 256 bits iff s fits in 255 bits. +// L < 2^253 +// x%8 < 2^3 +// L * (x%8) < 2^255 +// s < 2^255 +// s + L * (x%8) < 2^256 +static void add_xl(u8 s[32], u8 x) +{ + u64 mod8 = x & 7; + u64 carry = 0; + FOR (i , 0, 8) { + carry = carry + load32_le(s + 4*i) + L[i] * mod8; + store32_le(s + 4*i, (u32)carry); + carry >>= 32; + } +} + +// "Small" dirty ephemeral key. +// Use if you need to shrink the size of the binary, and can afford to +// slow down by a factor of two (compared to the fast version) +// +// This version works by decoupling the cofactor from the main factor. +// +// - The trimmed scalar determines the main factor +// - The clamped bits of the scalar determine the cofactor. +// +// Cofactor and main factor are combined into a single scalar, which is +// then multiplied by a point of order 8*L (unlike the base point, which +// has prime order). That "dirty" base point is the addition of the +// regular base point (9), and a point of order 8. +void crypto_x25519_dirty_small(u8 public_key[32], const u8 secret_key[32]) +{ + // Base point of order 8*L + // Raw scalar multiplication with it does not clear the cofactor, + // and the resulting public key will reveal 3 bits of the scalar. + // + // The low order component of this base point has been chosen + // to yield the same results as crypto_x25519_dirty_fast(). + static const u8 dirty_base_point[32] = { + 0xd8, 0x86, 0x1a, 0xa2, 0x78, 0x7a, 0xd9, 0x26, + 0x8b, 0x74, 0x74, 0xb6, 0x82, 0xe3, 0xbe, 0xc3, + 0xce, 0x36, 0x9a, 0x1e, 0x5e, 0x31, 0x47, 0xa2, + 0x6d, 0x37, 0x7c, 0xfd, 0x20, 0xb5, 0xdf, 0x75, + }; + // separate the main factor & the cofactor of the scalar + u8 scalar[32]; + crypto_eddsa_trim_scalar(scalar, secret_key); + + // Separate the main factor and the cofactor + // + // The scalar is trimmed, so its cofactor is cleared. The three + // least significant bits however still have a main factor. We must + // remove it for X25519 compatibility. + // + // cofactor = lsb * L (modulo 8*L) + // combined = scalar + cofactor (modulo 8*L) + add_xl(scalar, secret_key[0]); + scalarmult(public_key, scalar, dirty_base_point, 256); + WIPE_BUFFER(scalar); +} + +// Select low order point +// We're computing the [cofactor]lop scalar multiplication, where: +// +// cofactor = tweak & 7. +// lop = (lop_x, lop_y) +// lop_x = sqrt((sqrt(d + 1) + 1) / d) +// lop_y = -lop_x * sqrtm1 +// +// The low order point has order 8. There are 4 such points. We've +// chosen the one whose both coordinates are positive (below p/2). +// The 8 low order points are as follows: +// +// [0]lop = ( 0 , 1 ) +// [1]lop = ( lop_x , lop_y) +// [2]lop = ( sqrt(-1), -0 ) +// [3]lop = ( lop_x , -lop_y) +// [4]lop = (-0 , -1 ) +// [5]lop = (-lop_x , -lop_y) +// [6]lop = (-sqrt(-1), 0 ) +// [7]lop = (-lop_x , lop_y) +// +// The x coordinate is either 0, sqrt(-1), lop_x, or their opposite. +// The y coordinate is either 0, -1 , lop_y, or their opposite. +// The pattern for both is the same, except for a rotation of 2 (modulo 8) +// +// This helper function captures the pattern, and we can use it thus: +// +// select_lop(x, lop_x, sqrtm1, cofactor); +// select_lop(y, lop_y, fe_one, cofactor + 2); +// +// This is faster than an actual scalar multiplication, +// and requires less code than naive constant time look up. +static void select_lop(fe out, const fe x, const fe k, u8 cofactor) +{ + fe tmp; + fe_0(out); + fe_ccopy(out, k , (cofactor >> 1) & 1); // bit 1 + fe_ccopy(out, x , (cofactor >> 0) & 1); // bit 0 + fe_neg (tmp, out); + fe_ccopy(out, tmp, (cofactor >> 2) & 1); // bit 2 + WIPE_BUFFER(tmp); +} + +// "Fast" dirty ephemeral key +// We use this one by default. +// +// This version works by performing a regular scalar multiplication, +// then add a low order point. The scalar multiplication is done in +// Edwards space for more speed (*2 compared to the "small" version). +// The cost is a bigger binary for programs that don't also sign messages. +void crypto_x25519_dirty_fast(u8 public_key[32], const u8 secret_key[32]) +{ + // Compute clean scalar multiplication + u8 scalar[32]; + ge pk; + crypto_eddsa_trim_scalar(scalar, secret_key); + ge_scalarmult_base(&pk, scalar); + + // Compute low order point + fe t1, t2; + select_lop(t1, lop_x, sqrtm1, secret_key[0]); + select_lop(t2, lop_y, fe_one, secret_key[0] + 2); + ge_precomp low_order_point; + fe_add(low_order_point.Yp, t2, t1); + fe_sub(low_order_point.Ym, t2, t1); + fe_mul(low_order_point.T2, t2, t1); + fe_mul(low_order_point.T2, low_order_point.T2, D2); + + // Add low order point to the public key + ge_madd(&pk, &pk, &low_order_point, t1, t2); + + // Convert to Montgomery u coordinate (we ignore the sign) + fe_add(t1, pk.Z, pk.Y); + fe_sub(t2, pk.Z, pk.Y); + fe_invert(t2, t2); + fe_mul(t1, t1, t2); + + fe_tobytes(public_key, t1); + + WIPE_BUFFER(t1); WIPE_CTX(&pk); + WIPE_BUFFER(t2); WIPE_CTX(&low_order_point); + WIPE_BUFFER(scalar); +} + +/////////////////// +/// Elligator 2 /// +/////////////////// +static const fe A = {486662}; + +// Elligator direct map +// +// Computes the point corresponding to a representative, encoded in 32 +// bytes (little Endian). Since positive representatives fits in 254 +// bits, The two most significant bits are ignored. +// +// From the paper: +// w = -A / (fe(1) + non_square * r^2) +// e = chi(w^3 + A*w^2 + w) +// u = e*w - (fe(1)-e)*(A//2) +// v = -e * sqrt(u^3 + A*u^2 + u) +// +// We ignore v because we don't need it for X25519 (the Montgomery +// ladder only uses u). +// +// Note that e is either 0, 1 or -1 +// if e = 0 u = 0 and v = 0 +// if e = 1 u = w +// if e = -1 u = -w - A = w * non_square * r^2 +// +// Let r1 = non_square * r^2 +// Let r2 = 1 + r1 +// Note that r2 cannot be zero, -1/non_square is not a square. +// We can (tediously) verify that: +// w^3 + A*w^2 + w = (A^2*r1 - r2^2) * A / r2^3 +// Therefore: +// chi(w^3 + A*w^2 + w) = chi((A^2*r1 - r2^2) * (A / r2^3)) +// chi(w^3 + A*w^2 + w) = chi((A^2*r1 - r2^2) * (A / r2^3)) * 1 +// chi(w^3 + A*w^2 + w) = chi((A^2*r1 - r2^2) * (A / r2^3)) * chi(r2^6) +// chi(w^3 + A*w^2 + w) = chi((A^2*r1 - r2^2) * (A / r2^3) * r2^6) +// chi(w^3 + A*w^2 + w) = chi((A^2*r1 - r2^2) * A * r2^3) +// Corollary: +// e = 1 if (A^2*r1 - r2^2) * A * r2^3) is a non-zero square +// e = -1 if (A^2*r1 - r2^2) * A * r2^3) is not a square +// Note that w^3 + A*w^2 + w (and therefore e) can never be zero: +// w^3 + A*w^2 + w = w * (w^2 + A*w + 1) +// w^3 + A*w^2 + w = w * (w^2 + A*w + A^2/4 - A^2/4 + 1) +// w^3 + A*w^2 + w = w * (w + A/2)^2 - A^2/4 + 1) +// which is zero only if: +// w = 0 (impossible) +// (w + A/2)^2 = A^2/4 - 1 (impossible, because A^2/4-1 is not a square) +// +// Let isr = invsqrt((A^2*r1 - r2^2) * A * r2^3) +// isr = sqrt(1 / ((A^2*r1 - r2^2) * A * r2^3)) if e = 1 +// isr = sqrt(sqrt(-1) / ((A^2*r1 - r2^2) * A * r2^3)) if e = -1 +// +// if e = 1 +// let u1 = -A * (A^2*r1 - r2^2) * A * r2^2 * isr^2 +// u1 = w +// u1 = u +// +// if e = -1 +// let ufactor = -non_square * sqrt(-1) * r^2 +// let vfactor = sqrt(ufactor) +// let u2 = -A * (A^2*r1 - r2^2) * A * r2^2 * isr^2 * ufactor +// u2 = w * -1 * -non_square * r^2 +// u2 = w * non_square * r^2 +// u2 = u +void crypto_elligator_map(u8 curve[32], const u8 hidden[32]) +{ + fe r, u, t1, t2, t3; + fe_frombytes_mask(r, hidden, 2); // r is encoded in 254 bits. + fe_sq(r, r); + fe_add(t1, r, r); + fe_add(u, t1, fe_one); + fe_sq (t2, u); + fe_mul(t3, A2, t1); + fe_sub(t3, t3, t2); + fe_mul(t3, t3, A); + fe_mul(t1, t2, u); + fe_mul(t1, t3, t1); + int is_square = invsqrt(t1, t1); + fe_mul(u, r, ufactor); + fe_ccopy(u, fe_one, is_square); + fe_sq (t1, t1); + fe_mul(u, u, A); + fe_mul(u, u, t3); + fe_mul(u, u, t2); + fe_mul(u, u, t1); + fe_neg(u, u); + fe_tobytes(curve, u); + + WIPE_BUFFER(t1); WIPE_BUFFER(r); + WIPE_BUFFER(t2); WIPE_BUFFER(u); + WIPE_BUFFER(t3); +} + +// Elligator inverse map +// +// Computes the representative of a point, if possible. If not, it does +// nothing and returns -1. Note that the success of the operation +// depends only on the point (more precisely its u coordinate). The +// tweak parameter is used only upon success +// +// The tweak should be a random byte. Beyond that, its contents are an +// implementation detail. Currently, the tweak comprises: +// - Bit 1 : sign of the v coordinate (0 if positive, 1 if negative) +// - Bit 2-5: not used +// - Bits 6-7: random padding +// +// From the paper: +// Let sq = -non_square * u * (u+A) +// if sq is not a square, or u = -A, there is no mapping +// Assuming there is a mapping: +// if v is positive: r = sqrt(-u / (non_square * (u+A))) +// if v is negative: r = sqrt(-(u+A) / (non_square * u )) +// +// We compute isr = invsqrt(-non_square * u * (u+A)) +// if it wasn't a square, abort. +// else, isr = sqrt(-1 / (non_square * u * (u+A)) +// +// If v is positive, we return isr * u: +// isr * u = sqrt(-1 / (non_square * u * (u+A)) * u +// isr * u = sqrt(-u / (non_square * (u+A)) +// +// If v is negative, we return isr * (u+A): +// isr * (u+A) = sqrt(-1 / (non_square * u * (u+A)) * (u+A) +// isr * (u+A) = sqrt(-(u+A) / (non_square * u) +int crypto_elligator_rev(u8 hidden[32], const u8 public_key[32], u8 tweak) +{ + fe t1, t2, t3; + fe_frombytes(t1, public_key); // t1 = u + + fe_add(t2, t1, A); // t2 = u + A + fe_mul(t3, t1, t2); + fe_mul_small(t3, t3, -2); + int is_square = invsqrt(t3, t3); // t3 = sqrt(-1 / non_square * u * (u+A)) + if (is_square) { + // The only variable time bit. This ultimately reveals how many + // tries it took us to find a representable key. + // This does not affect security as long as we try keys at random. + + fe_ccopy (t1, t2, tweak & 1); // multiply by u if v is positive, + fe_mul (t3, t1, t3); // multiply by u+A otherwise + fe_mul_small(t1, t3, 2); + fe_neg (t2, t3); + fe_ccopy (t3, t2, fe_isodd(t1)); + fe_tobytes(hidden, t3); + + // Pad with two random bits + hidden[31] |= tweak & 0xc0; + } + + WIPE_BUFFER(t1); + WIPE_BUFFER(t2); + WIPE_BUFFER(t3); + return is_square - 1; +} + +void crypto_elligator_key_pair(u8 hidden[32], u8 secret_key[32], u8 seed[32]) +{ + u8 pk [32]; // public key + u8 buf[64]; // seed + representative + COPY(buf + 32, seed, 32); + do { + crypto_chacha20_djb(buf, 0, 64, buf+32, zero, 0); + crypto_x25519_dirty_fast(pk, buf); // or the "small" version + } while(crypto_elligator_rev(buf+32, pk, buf[32])); + // Note that the return value of crypto_elligator_rev() is + // independent from its tweak parameter. + // Therefore, buf[32] is not actually reused. Either we loop one + // more time and buf[32] is used for the new seed, or we succeeded, + // and buf[32] becomes the tweak parameter. + + crypto_wipe(seed, 32); + COPY(hidden , buf + 32, 32); + COPY(secret_key, buf , 32); + WIPE_BUFFER(buf); + WIPE_BUFFER(pk); +} + +/////////////////////// +/// Scalar division /// +/////////////////////// + +// Montgomery reduction. +// Divides x by (2^256), and reduces the result modulo L +// +// Precondition: +// x < L * 2^256 +// Constants: +// r = 2^256 (makes division by r trivial) +// k = (r * (1/r) - 1) // L (1/r is computed modulo L ) +// Algorithm: +// s = (x * k) % r +// t = x + s*L (t is always a multiple of r) +// u = (t/r) % L (u is always below 2*L, conditional subtraction is enough) +static void redc(u32 u[8], u32 x[16]) +{ + static const u32 k[8] = { + 0x12547e1b, 0xd2b51da3, 0xfdba84ff, 0xb1a206f2, + 0xffa36bea, 0x14e75438, 0x6fe91836, 0x9db6c6f2, + }; + + // s = x * k (modulo 2^256) + // This is cheaper than the full multiplication. + u32 s[8] = {0}; + FOR (i, 0, 8) { + u64 carry = 0; + FOR (j, 0, 8-i) { + carry += s[i+j] + (u64)x[i] * k[j]; + s[i+j] = (u32)carry; + carry >>= 32; + } + } + u32 t[16] = {0}; + multiply(t, s, L); + + // t = t + x + u64 carry = 0; + FOR (i, 0, 16) { + carry += (u64)t[i] + x[i]; + t[i] = (u32)carry; + carry >>= 32; + } + + // u = (t / 2^256) % L + // Note that t / 2^256 is always below 2*L, + // So a constant time conditional subtraction is enough + remove_l(u, t+8); + + WIPE_BUFFER(s); + WIPE_BUFFER(t); +} + +void crypto_x25519_inverse(u8 blind_salt [32], const u8 private_key[32], + const u8 curve_point[32]) +{ + static const u8 Lm2[32] = { // L - 2 + 0xeb, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + }; + // 1 in Montgomery form + u32 m_inv [8] = { + 0x8d98951d, 0xd6ec3174, 0x737dcf70, 0xc6ef5bf4, + 0xfffffffe, 0xffffffff, 0xffffffff, 0x0fffffff, + }; + + u8 scalar[32]; + crypto_eddsa_trim_scalar(scalar, private_key); + + // Convert the scalar in Montgomery form + // m_scl = scalar * 2^256 (modulo L) + u32 m_scl[8]; + { + u32 tmp[16]; + ZERO(tmp, 8); + load32_le_buf(tmp+8, scalar, 8); + mod_l(scalar, tmp); + load32_le_buf(m_scl, scalar, 8); + WIPE_BUFFER(tmp); // Wipe ASAP to save stack space + } + + // Compute the inverse + u32 product[16]; + for (int i = 252; i >= 0; i--) { + ZERO(product, 16); + multiply(product, m_inv, m_inv); + redc(m_inv, product); + if (scalar_bit(Lm2, i)) { + ZERO(product, 16); + multiply(product, m_inv, m_scl); + redc(m_inv, product); + } + } + // Convert the inverse *out* of Montgomery form + // scalar = m_inv / 2^256 (modulo L) + COPY(product, m_inv, 8); + ZERO(product + 8, 8); + redc(m_inv, product); + store32_le_buf(scalar, m_inv, 8); // the *inverse* of the scalar + + // Clear the cofactor of scalar: + // cleared = scalar * (3*L + 1) (modulo 8*L) + // cleared = scalar + scalar * 3 * L (modulo 8*L) + // Note that (scalar * 3) is reduced modulo 8, so we only need the + // first byte. + add_xl(scalar, scalar[0] * 3); + + // Recall that 8*L < 2^256. However it is also very close to + // 2^255. If we spanned the ladder over 255 bits, random tests + // wouldn't catch the off-by-one error. + scalarmult(blind_salt, scalar, curve_point, 256); + + WIPE_BUFFER(scalar); WIPE_BUFFER(m_scl); + WIPE_BUFFER(product); WIPE_BUFFER(m_inv); +} + +//////////////////////////////// +/// Authenticated encryption /// +//////////////////////////////// +static void lock_auth(u8 mac[16], const u8 auth_key[32], + const u8 *ad , size_t ad_size, + const u8 *cipher_text, size_t text_size) +{ + u8 sizes[16]; // Not secret, not wiped + store64_le(sizes + 0, ad_size); + store64_le(sizes + 8, text_size); + crypto_poly1305_ctx poly_ctx; // auto wiped... + crypto_poly1305_init (&poly_ctx, auth_key); + crypto_poly1305_update(&poly_ctx, ad , ad_size); + crypto_poly1305_update(&poly_ctx, zero , gap(ad_size, 16)); + crypto_poly1305_update(&poly_ctx, cipher_text, text_size); + crypto_poly1305_update(&poly_ctx, zero , gap(text_size, 16)); + crypto_poly1305_update(&poly_ctx, sizes , 16); + crypto_poly1305_final (&poly_ctx, mac); // ...here +} + +void crypto_aead_init_x(crypto_aead_ctx *ctx, + u8 const key[32], const u8 nonce[24]) +{ + crypto_chacha20_h(ctx->key, key, nonce); + COPY(ctx->nonce, nonce + 16, 8); + ctx->counter = 0; +} + +void crypto_aead_init_djb(crypto_aead_ctx *ctx, + const u8 key[32], const u8 nonce[8]) +{ + COPY(ctx->key , key , 32); + COPY(ctx->nonce, nonce, 8); + ctx->counter = 0; +} + +void crypto_aead_init_ietf(crypto_aead_ctx *ctx, + const u8 key[32], const u8 nonce[12]) +{ + COPY(ctx->key , key , 32); + COPY(ctx->nonce, nonce + 4, 8); + ctx->counter = (u64)load32_le(nonce) << 32; +} + +void crypto_aead_write(crypto_aead_ctx *ctx, u8 *cipher_text, u8 mac[16], + const u8 *ad, size_t ad_size, + const u8 *plain_text, size_t text_size) +{ + u8 auth_key[64]; // the last 32 bytes are used for rekeying. + crypto_chacha20_djb(auth_key, 0, 64, ctx->key, ctx->nonce, ctx->counter); + crypto_chacha20_djb(cipher_text, plain_text, text_size, + ctx->key, ctx->nonce, ctx->counter + 1); + lock_auth(mac, auth_key, ad, ad_size, cipher_text, text_size); + COPY(ctx->key, auth_key + 32, 32); + WIPE_BUFFER(auth_key); +} + +int crypto_aead_read(crypto_aead_ctx *ctx, u8 *plain_text, const u8 mac[16], + const u8 *ad, size_t ad_size, + const u8 *cipher_text, size_t text_size) +{ + u8 auth_key[64]; // the last 32 bytes are used for rekeying. + u8 real_mac[16]; + crypto_chacha20_djb(auth_key, 0, 64, ctx->key, ctx->nonce, ctx->counter); + lock_auth(real_mac, auth_key, ad, ad_size, cipher_text, text_size); + int mismatch = crypto_verify16(mac, real_mac); + if (!mismatch) { + crypto_chacha20_djb(plain_text, cipher_text, text_size, + ctx->key, ctx->nonce, ctx->counter + 1); + COPY(ctx->key, auth_key + 32, 32); + } + WIPE_BUFFER(auth_key); + WIPE_BUFFER(real_mac); + return mismatch; +} + +void crypto_aead_lock(u8 *cipher_text, u8 mac[16], const u8 key[32], + const u8 nonce[24], const u8 *ad, size_t ad_size, + const u8 *plain_text, size_t text_size) +{ + crypto_aead_ctx ctx; + crypto_aead_init_x(&ctx, key, nonce); + crypto_aead_write(&ctx, cipher_text, mac, ad, ad_size, + plain_text, text_size); + crypto_wipe(&ctx, sizeof(ctx)); +} + +int crypto_aead_unlock(u8 *plain_text, const u8 mac[16], const u8 key[32], + const u8 nonce[24], const u8 *ad, size_t ad_size, + const u8 *cipher_text, size_t text_size) +{ + crypto_aead_ctx ctx; + crypto_aead_init_x(&ctx, key, nonce); + int mismatch = crypto_aead_read(&ctx, plain_text, mac, ad, ad_size, + cipher_text, text_size); + crypto_wipe(&ctx, sizeof(ctx)); + return mismatch; +} + +#ifdef MONOCYPHER_CPP_NAMESPACE +} +#endif diff --git a/User/lib/monocypher/monocypher.h b/User/lib/monocypher/monocypher.h new file mode 100644 index 0000000..291b8b9 --- /dev/null +++ b/User/lib/monocypher/monocypher.h @@ -0,0 +1,321 @@ +// Monocypher version 4.0.3 +// +// This file is dual-licensed. Choose whichever licence you want from +// the two licences listed below. +// +// The first licence is a regular 2-clause BSD licence. The second licence +// is the CC-0 from Creative Commons. It is intended to release Monocypher +// to the public domain. The BSD licence serves as a fallback option. +// +// SPDX-License-Identifier: BSD-2-Clause OR CC0-1.0 +// +// ------------------------------------------------------------------------ +// +// Copyright (c) 2017-2019, Loup Vaillant +// All rights reserved. +// +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the +// distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// ------------------------------------------------------------------------ +// +// Written in 2017-2019 by Loup Vaillant +// +// To the extent possible under law, the author(s) have dedicated all copyright +// and related neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// +// You should have received a copy of the CC0 Public Domain Dedication along +// with this software. If not, see +// + +#ifndef MONOCYPHER_H +#define MONOCYPHER_H + +#include +#include + +#ifdef MONOCYPHER_CPP_NAMESPACE +namespace MONOCYPHER_CPP_NAMESPACE { +#elif defined(__cplusplus) +extern "C" { +#endif + +// Constant time comparisons +// ------------------------- + +// Return 0 if a and b are equal, -1 otherwise +int crypto_verify16(const uint8_t a[16], const uint8_t b[16]); +int crypto_verify32(const uint8_t a[32], const uint8_t b[32]); +int crypto_verify64(const uint8_t a[64], const uint8_t b[64]); + + +// Erase sensitive data +// -------------------- +void crypto_wipe(void *secret, size_t size); + + +// Authenticated encryption +// ------------------------ +void crypto_aead_lock(uint8_t *cipher_text, + uint8_t mac [16], + const uint8_t key [32], + const uint8_t nonce[24], + const uint8_t *ad, size_t ad_size, + const uint8_t *plain_text, size_t text_size); +int crypto_aead_unlock(uint8_t *plain_text, + const uint8_t mac [16], + const uint8_t key [32], + const uint8_t nonce[24], + const uint8_t *ad, size_t ad_size, + const uint8_t *cipher_text, size_t text_size); + +// Authenticated stream +// -------------------- +typedef struct { + uint64_t counter; + uint8_t key[32]; + uint8_t nonce[8]; +} crypto_aead_ctx; + +void crypto_aead_init_x(crypto_aead_ctx *ctx, + const uint8_t key[32], const uint8_t nonce[24]); +void crypto_aead_init_djb(crypto_aead_ctx *ctx, + const uint8_t key[32], const uint8_t nonce[8]); +void crypto_aead_init_ietf(crypto_aead_ctx *ctx, + const uint8_t key[32], const uint8_t nonce[12]); + +void crypto_aead_write(crypto_aead_ctx *ctx, + uint8_t *cipher_text, + uint8_t mac[16], + const uint8_t *ad , size_t ad_size, + const uint8_t *plain_text, size_t text_size); +int crypto_aead_read(crypto_aead_ctx *ctx, + uint8_t *plain_text, + const uint8_t mac[16], + const uint8_t *ad , size_t ad_size, + const uint8_t *cipher_text, size_t text_size); + + +// General purpose hash (BLAKE2b) +// ------------------------------ + +// Direct interface +void crypto_blake2b(uint8_t *hash, size_t hash_size, + const uint8_t *message, size_t message_size); + +void crypto_blake2b_keyed(uint8_t *hash, size_t hash_size, + const uint8_t *key, size_t key_size, + const uint8_t *message, size_t message_size); + +// Incremental interface +typedef struct { + // Do not rely on the size or contents of this type, + // for they may change without notice. + uint64_t hash[8]; + uint64_t input_offset[2]; + uint64_t input[16]; + size_t input_idx; + size_t hash_size; +} crypto_blake2b_ctx; + +void crypto_blake2b_init(crypto_blake2b_ctx *ctx, size_t hash_size); +void crypto_blake2b_keyed_init(crypto_blake2b_ctx *ctx, size_t hash_size, + const uint8_t *key, size_t key_size); +void crypto_blake2b_update(crypto_blake2b_ctx *ctx, + const uint8_t *message, size_t message_size); +void crypto_blake2b_final(crypto_blake2b_ctx *ctx, uint8_t *hash); + + +// Password key derivation (Argon2) +// -------------------------------- +#define CRYPTO_ARGON2_D 0 +#define CRYPTO_ARGON2_I 1 +#define CRYPTO_ARGON2_ID 2 + +typedef struct { + uint32_t algorithm; // Argon2d, Argon2i, Argon2id + uint32_t nb_blocks; // memory hardness, >= 8 * nb_lanes + uint32_t nb_passes; // CPU hardness, >= 1 (>= 3 recommended for Argon2i) + uint32_t nb_lanes; // parallelism level (single threaded anyway) +} crypto_argon2_config; + +typedef struct { + const uint8_t *pass; + const uint8_t *salt; + uint32_t pass_size; + uint32_t salt_size; // 16 bytes recommended +} crypto_argon2_inputs; + +typedef struct { + const uint8_t *key; // may be NULL if no key + const uint8_t *ad; // may be NULL if no additional data + uint32_t key_size; // 0 if no key (32 bytes recommended otherwise) + uint32_t ad_size; // 0 if no additional data +} crypto_argon2_extras; + +extern const crypto_argon2_extras crypto_argon2_no_extras; + +void crypto_argon2(uint8_t *hash, uint32_t hash_size, void *work_area, + crypto_argon2_config config, + crypto_argon2_inputs inputs, + crypto_argon2_extras extras); + + +// Key exchange (X-25519) +// ---------------------- + +// Shared secrets are not quite random. +// Hash them to derive an actual shared key. +void crypto_x25519_public_key(uint8_t public_key[32], + const uint8_t secret_key[32]); +void crypto_x25519(uint8_t raw_shared_secret[32], + const uint8_t your_secret_key [32], + const uint8_t their_public_key [32]); + +// Conversion to EdDSA +void crypto_x25519_to_eddsa(uint8_t eddsa[32], const uint8_t x25519[32]); + +// scalar "division" +// Used for OPRF. Be aware that exponential blinding is less secure +// than Diffie-Hellman key exchange. +void crypto_x25519_inverse(uint8_t blind_salt [32], + const uint8_t private_key[32], + const uint8_t curve_point[32]); + +// "Dirty" versions of x25519_public_key(). +// Use with crypto_elligator_rev(). +// Leaks 3 bits of the private key. +void crypto_x25519_dirty_small(uint8_t pk[32], const uint8_t sk[32]); +void crypto_x25519_dirty_fast (uint8_t pk[32], const uint8_t sk[32]); + + +// Signatures +// ---------- + +// EdDSA with curve25519 + BLAKE2b +void crypto_eddsa_key_pair(uint8_t secret_key[64], + uint8_t public_key[32], + uint8_t seed[32]); +void crypto_eddsa_sign(uint8_t signature [64], + const uint8_t secret_key[64], + const uint8_t *message, size_t message_size); +int crypto_eddsa_check(const uint8_t signature [64], + const uint8_t public_key[32], + const uint8_t *message, size_t message_size); + +// Conversion to X25519 +void crypto_eddsa_to_x25519(uint8_t x25519[32], const uint8_t eddsa[32]); + +// EdDSA building blocks +void crypto_eddsa_trim_scalar(uint8_t out[32], const uint8_t in[32]); +void crypto_eddsa_reduce(uint8_t reduced[32], const uint8_t expanded[64]); +void crypto_eddsa_mul_add(uint8_t r[32], + const uint8_t a[32], + const uint8_t b[32], + const uint8_t c[32]); +void crypto_eddsa_scalarbase(uint8_t point[32], const uint8_t scalar[32]); +int crypto_eddsa_check_equation(const uint8_t signature[64], + const uint8_t public_key[32], + const uint8_t h_ram[32]); + + +// Chacha20 +// -------- + +// Specialised hash. +// Used to hash X25519 shared secrets. +void crypto_chacha20_h(uint8_t out[32], + const uint8_t key[32], + const uint8_t in [16]); + +// Unauthenticated stream cipher. +// Don't forget to add authentication. +uint64_t crypto_chacha20_djb(uint8_t *cipher_text, + const uint8_t *plain_text, + size_t text_size, + const uint8_t key[32], + const uint8_t nonce[8], + uint64_t ctr); +uint32_t crypto_chacha20_ietf(uint8_t *cipher_text, + const uint8_t *plain_text, + size_t text_size, + const uint8_t key[32], + const uint8_t nonce[12], + uint32_t ctr); +uint64_t crypto_chacha20_x(uint8_t *cipher_text, + const uint8_t *plain_text, + size_t text_size, + const uint8_t key[32], + const uint8_t nonce[24], + uint64_t ctr); + + +// Poly 1305 +// --------- + +// This is a *one time* authenticator. +// Disclosing the mac reveals the key. +// See crypto_lock() on how to use it properly. + +// Direct interface +void crypto_poly1305(uint8_t mac[16], + const uint8_t *message, size_t message_size, + const uint8_t key[32]); + +// Incremental interface +typedef struct { + // Do not rely on the size or contents of this type, + // for they may change without notice. + uint8_t c[16]; // chunk of the message + size_t c_idx; // How many bytes are there in the chunk. + uint32_t r [4]; // constant multiplier (from the secret key) + uint32_t pad[4]; // random number added at the end (from the secret key) + uint32_t h [5]; // accumulated hash +} crypto_poly1305_ctx; + +void crypto_poly1305_init (crypto_poly1305_ctx *ctx, const uint8_t key[32]); +void crypto_poly1305_update(crypto_poly1305_ctx *ctx, + const uint8_t *message, size_t message_size); +void crypto_poly1305_final (crypto_poly1305_ctx *ctx, uint8_t mac[16]); + + +// Elligator 2 +// ----------- + +// Elligator mappings proper +void crypto_elligator_map(uint8_t curve [32], const uint8_t hidden[32]); +int crypto_elligator_rev(uint8_t hidden[32], const uint8_t curve [32], + uint8_t tweak); + +// Easy to use key pair generation +void crypto_elligator_key_pair(uint8_t hidden[32], uint8_t secret_key[32], + uint8_t seed[32]); + +#ifdef __cplusplus +} +#endif + +#endif // MONOCYPHER_H diff --git a/User/lib/rtc/rtc.c b/User/lib/rtc/rtc.c new file mode 100644 index 0000000..fa5b8b4 --- /dev/null +++ b/User/lib/rtc/rtc.c @@ -0,0 +1,292 @@ +#include "ch32v30x_misc.h" +#include "stdint.h" +#include "rtc.h" + +_calendar_obj calendar; + + +uint8_t const table_week[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5}; +const uint8_t mon_table[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + +/********************************************************************* + * @fn RTC_NVIC_Config + * + * @brief Initializes RTC Int. + * + * @return none + */ +void RTC_NVIC_Config (void) { + NVIC_InitTypeDef NVIC_InitStructure = {0}; + NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init (&NVIC_InitStructure); +} + +/********************************************************************* + * @fn Is_Leap_Year + * + * @brief Judging whether it is a leap year. + * + * @param year + * + * @return 1 - Yes + * 0 - No + */ +uint8_t Is_Leap_Year (uint16_t year) { + if (year % 4 == 0) { + if (year % 100 == 0) { + if (year % 400 == 0) + return 1; + else + return 0; + } else + return 1; + } else + return 0; +} + +static uint8_t month_from_str(const char *m) { + static const char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; + for (uint8_t i = 0; i < 12; i++) { + if (m[0] == months[i*3] && + m[1] == months[i*3 + 1] && + m[2] == months[i*3 + 2]) + return i + 1; // 1¨C12 + } + return 0; // should never happen +} + +void RTC_Set_From_BuildTime(void) { + const char *date = __DATE__; + const char *time = __TIME__; + + uint16_t year = + (date[7] - '0') * 1000 + + (date[8] - '0') * 100 + + (date[9] - '0') * 10 + + (date[10] - '0'); + + uint8_t month = month_from_str(date); + uint8_t day = + (date[4] == ' ' ? 0 : (date[4] - '0') * 10) + + (date[5] - '0'); + + uint8_t hour = + (time[0] - '0') * 10 + (time[1] - '0') - 1; + uint8_t min = + (time[3] - '0') * 10 + (time[4] - '0'); + uint8_t sec = + (time[6] - '0') * 10 + (time[7] - '0'); + + RTC_Set(year, month, day, hour, min, sec); +} + + +/********************************************************************* + * @fn RTC_Set + * + * @brief Set Time. + * + * @param Struct of _calendar_obj + * + * @return 1 - error + * 0 - success + */ +uint8_t RTC_Set (uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec) { + uint16_t t; + u32 seccount = 0; + if (syear < 1970 || syear > 2099) + return 1; + for (t = 1970; t < syear; t++) { + if (Is_Leap_Year (t)) + seccount += 31622400; + else + seccount += 31536000; + } + smon -= 1; + for (t = 0; t < smon; t++) { + seccount += (u32)mon_table[t] * 86400; + if (Is_Leap_Year (syear) && t == 1) + seccount += 86400; + } + seccount += (u32)(sday - 1) * 86400; + seccount += (u32)hour * 3600; + seccount += (u32)min * 60; + seccount += sec; + + RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); + PWR_BackupAccessCmd (ENABLE); + RTC_SetCounter (seccount); + RTC_WaitForLastTask(); + return 0; +} + +/********************************************************************* + * @fn RTC_Alarm_Set + * + * @brief Set Alarm Time. + * + * @param Struct of _calendar_obj + * + * @return 1 - error + * 0 - success + */ +uint8_t RTC_Alarm_Set (uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec) { + uint16_t t; + u32 seccount = 0; + if (syear < 1970 || syear > 2099) + return 1; + for (t = 1970; t < syear; t++) { + if (Is_Leap_Year (t)) + seccount += 31622400; + else + seccount += 31536000; + } + smon -= 1; + for (t = 0; t < smon; t++) { + seccount += (u32)mon_table[t] * 86400; + if (Is_Leap_Year (syear) && t == 1) + seccount += 86400; + } + seccount += (u32)(sday - 1) * 86400; + seccount += (u32)hour * 3600; + seccount += (u32)min * 60; + seccount += sec; + + RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); + PWR_BackupAccessCmd (ENABLE); + RTC_SetAlarm (seccount); + RTC_WaitForLastTask(); + + return 0; +} + +/********************************************************************* + * @fn RTC_Get_Week + * + * @brief Get the current day of the week. + * + * @param year/month/day + * + * @return week + */ +uint8_t RTC_Get_Week (uint16_t year, uint8_t month, uint8_t day) { + uint16_t temp2; + uint8_t yearH, yearL; + + yearH = year / 100; + yearL = year % 100; + if (yearH > 19) + yearL += 100; + temp2 = yearL + yearL / 4; + temp2 = temp2 % 7; + temp2 = temp2 + day + table_week[month - 1]; + if (yearL % 4 == 0 && month < 3) + temp2--; + return (temp2 % 7); +} + +/********************************************************************* + * @fn RTC_Get + * + * @brief Get current time. + * + * @return 1 - error + * 0 - success + */ +uint8_t RTC_Get (void) { + static uint16_t daycnt = 0; + u32 timecount = 0; + u32 temp = 0; + uint16_t temp1 = 0; + timecount = RTC_GetCounter(); + temp = timecount / 86400; + if (daycnt != temp) { + daycnt = temp; + temp1 = 1970; + while (temp >= 365) { + if (Is_Leap_Year (temp1)) { + if (temp >= 366) + temp -= 366; + else { + break; + } + } else + temp -= 365; + temp1++; + } + calendar.w_year = temp1; + temp1 = 0; + while (temp >= 28) { + if (Is_Leap_Year (calendar.w_year) && temp1 == 1) { + if (temp >= 29) + temp -= 29; + else + break; + } else { + if (temp >= mon_table[temp1]) + temp -= mon_table[temp1]; + else + break; + } + temp1++; + } + calendar.w_month = temp1 + 1; + calendar.w_date = temp + 1; + } + temp = timecount % 86400; + calendar.hour = temp / 3600; + calendar.min = (temp % 3600) / 60; + calendar.sec = (temp % 3600) % 60; + calendar.week = RTC_Get_Week (calendar.w_year, calendar.w_month, calendar.w_date); + return 0; +} + +/********************************************************************* + * @fn RTC_Init + * + * @brief Initializes RTC collection. + * + * @return 1 - Init Fail + * 0 - Init Success + */ +uint8_t RTC_Init (void) { + uint8_t temp = 0; + RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); + PWR_BackupAccessCmd (ENABLE); + RTC_ClearITPendingBit (RTC_IT_ALR); + RTC_ClearITPendingBit (RTC_IT_SEC); + + /* Is it the first configuration */ + + BKP_DeInit(); + RCC_LSEConfig (RCC_LSE_ON); + while (RCC_GetFlagStatus (RCC_FLAG_LSERDY) == RESET && temp < 250) { + temp++; + Delay_Ms(20); + } + if (temp >= 250) + return 1; + RCC_RTCCLKConfig (RCC_RTCCLKSource_LSE); + RCC_RTCCLKCmd (ENABLE); + RTC_WaitForLastTask(); + RTC_WaitForSynchro(); + RTC_ITConfig (RTC_IT_SEC, DISABLE); + RTC_ITConfig (RTC_IT_ALR, DISABLE); + RTC_ITConfig (RTC_IT_OW, DISABLE); + RTC_WaitForLastTask(); + RTC_EnterConfigMode(); + RTC_SetPrescaler (32767); + RTC_WaitForLastTask(); + //RTC_Set (2025, 9, 7, 11, 33, 30); /* Setup Time */ + RTC_Set_From_BuildTime(); + RTC_ExitConfigMode(); + BKP_WriteBackupRegister (BKP_DR1, 0XA1A1); + + RTC_NVIC_Config(); + RTC_Get(); + + return 0; +} \ No newline at end of file diff --git a/User/lib/rtc/rtc.h b/User/lib/rtc/rtc.h new file mode 100644 index 0000000..5851172 --- /dev/null +++ b/User/lib/rtc/rtc.h @@ -0,0 +1,95 @@ +#include "stdint.h" + +typedef struct +{ + volatile uint8_t hour; + volatile uint8_t min; + volatile uint8_t sec; + + volatile uint16_t w_year; + volatile uint8_t w_month; + volatile uint8_t w_date; + volatile uint8_t week; +} _calendar_obj; + +extern _calendar_obj calendar; + + +extern uint8_t const table_week[12]; +extern const uint8_t mon_table[12]; + +/********************************************************************* + * @fn RTC_NVIC_Config + * + * @brief Initializes RTC Int. + * + * @return none + */ +void RTC_NVIC_Config (void); +/********************************************************************* + * @fn Is_Leap_Year + * + * @brief Judging whether it is a leap year. + * + * @param year + * + * @return 1 - Yes + * 0 - No + */ +uint8_t Is_Leap_Year (uint16_t year); + +void RTC_Set_From_BuildTime(void); + +/********************************************************************* + * @fn RTC_Set + * + * @brief Set Time. + * + * @param Struct of _calendar_obj + * + * @return 1 - error + * 0 - success + */ +uint8_t RTC_Set (uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec) ; + +/********************************************************************* + * @fn RTC_Alarm_Set + * + * @brief Set Alarm Time. + * + * @param Struct of _calendar_obj + * + * @return 1 - error + * 0 - success + */ +uint8_t RTC_Alarm_Set (uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec) ; +/********************************************************************* + * @fn RTC_Get_Week + * + * @brief Get the current day of the week. + * + * @param year/month/day + * + * @return week + */ +uint8_t RTC_Get_Week (uint16_t year, uint8_t month, uint8_t day) ; + +/********************************************************************* + * @fn RTC_Get + * + * @brief Get current time. + * + * @return 1 - error + * 0 - success + */ +uint8_t RTC_Get (void) ; + +/********************************************************************* + * @fn RTC_Init + * + * @brief Initializes RTC collection. + * + * @return 1 - Init Fail + * 0 - Init Success + */ +uint8_t RTC_Init (void); \ No newline at end of file diff --git a/User/lib/telemetry/telemetry.c b/User/lib/telemetry/telemetry.c new file mode 100644 index 0000000..e69de29 diff --git a/User/lib/telemetry/telemetry.h b/User/lib/telemetry/telemetry.h new file mode 100644 index 0000000..447093b --- /dev/null +++ b/User/lib/telemetry/telemetry.h @@ -0,0 +1,93 @@ +#ifndef TELEMETRY_HEADER +#define TELEMETRY_HEADER + +#define TELEM_CHANNEL_SELF 1 // LPP data channel for 'self' device + +#define LPP_DIGITAL_INPUT 0 // 1 byte +#define LPP_DIGITAL_OUTPUT 1 // 1 byte +#define LPP_ANALOG_INPUT 2 // 2 bytes, 0.01 signed +#define LPP_ANALOG_OUTPUT 3 // 2 bytes, 0.01 signed +#define LPP_GENERIC_SENSOR 100 // 4 bytes, unsigned +#define LPP_LUMINOSITY 101 // 2 bytes, 1 lux unsigned +#define LPP_PRESENCE 102 // 1 byte, bool +#define LPP_TEMPERATURE 103 // 2 bytes, 0.1¡ãC signed +#define LPP_RELATIVE_HUMIDITY 104 // 1 byte, 0.5% unsigned +#define LPP_ACCELEROMETER 113 // 2 bytes per axis, 0.001G +#define LPP_BAROMETRIC_PRESSURE 115 // 2 bytes 0.1hPa unsigned +#define LPP_VOLTAGE 116 // 2 bytes 0.01V unsigned +#define LPP_CURRENT 117 // 2 bytes 0.001A unsigned +#define LPP_FREQUENCY 118 // 4 bytes 1Hz unsigned +#define LPP_PERCENTAGE 120 // 1 byte 1-100% unsigned +#define LPP_ALTITUDE 121 // 2 byte 1m signed +#define LPP_CONCENTRATION 125 // 2 bytes, 1 ppm unsigned +#define LPP_POWER 128 // 2 byte, 1W, unsigned +#define LPP_DISTANCE 130 // 4 byte, 0.001m, unsigned +#define LPP_ENERGY 131 // 4 byte, 0.001kWh, unsigned +#define LPP_DIRECTION 132 // 2 bytes, 1deg, unsigned +#define LPP_UNIXTIME 133 // 4 bytes, unsigned +#define LPP_GYROMETER 134 // 2 bytes per axis, 0.01 ¡ã/s +#define LPP_COLOUR 135 // 1 byte per RGB Color +#define LPP_GPS 136 // 3 byte lon/lat 0.0001 ¡ã, 3 bytes alt 0.01 meter +#define LPP_SWITCH 142 // 1 byte, 0/1 +#define LPP_POLYLINE 240 // 1 byte size, 1 byte delta factor, 3 byte lon/lat 0.0001¡ã * factor, n (size-8) bytes deltas + +// Only Data Size +#define LPP_DIGITAL_INPUT_SIZE 1 +#define LPP_DIGITAL_OUTPUT_SIZE 1 +#define LPP_ANALOG_INPUT_SIZE 2 +#define LPP_ANALOG_OUTPUT_SIZE 2 +#define LPP_GENERIC_SENSOR_SIZE 4 +#define LPP_LUMINOSITY_SIZE 2 +#define LPP_PRESENCE_SIZE 1 +#define LPP_TEMPERATURE_SIZE 2 +#define LPP_RELATIVE_HUMIDITY_SIZE 1 +#define LPP_ACCELEROMETER_SIZE 6 +#define LPP_BAROMETRIC_PRESSURE_SIZE 2 +#define LPP_VOLTAGE_SIZE 2 +#define LPP_CURRENT_SIZE 2 +#define LPP_FREQUENCY_SIZE 4 +#define LPP_PERCENTAGE_SIZE 1 +#define LPP_ALTITUDE_SIZE 2 +#define LPP_POWER_SIZE 2 +#define LPP_DISTANCE_SIZE 4 +#define LPP_ENERGY_SIZE 4 +#define LPP_DIRECTION_SIZE 2 +#define LPP_UNIXTIME_SIZE 4 +#define LPP_GYROMETER_SIZE 6 +#define LPP_GPS_SIZE 9 +#define LPP_SWITCH_SIZE 1 +#define LPP_CONCENTRATION_SIZE 2 +#define LPP_COLOUR_SIZE 3 +#define LPP_MIN_POLYLINE_SIZE 8 + + +// Multipliers +#define LPP_DIGITAL_INPUT_MULT 1 +#define LPP_DIGITAL_OUTPUT_MULT 1 +#define LPP_ANALOG_INPUT_MULT 100 +#define LPP_ANALOG_OUTPUT_MULT 100 +#define LPP_GENERIC_SENSOR_MULT 1 +#define LPP_LUMINOSITY_MULT 1 +#define LPP_PRESENCE_MULT 1 +#define LPP_TEMPERATURE_MULT 10 +#define LPP_RELATIVE_HUMIDITY_MULT 2 +#define LPP_ACCELEROMETER_MULT 1000 +#define LPP_BAROMETRIC_PRESSURE_MULT 10 +#define LPP_VOLTAGE_MULT 100 +#define LPP_CURRENT_MULT 1000 +#define LPP_FREQUENCY_MULT 1 +#define LPP_PERCENTAGE_MULT 1 +#define LPP_ALTITUDE_MULT 1 +#define LPP_POWER_MULT 1 +#define LPP_DISTANCE_MULT 1000 +#define LPP_ENERGY_MULT 1000 +#define LPP_DIRECTION_MULT 1 +#define LPP_UNIXTIME_MULT 1 +#define LPP_GYROMETER_MULT 100 +#define LPP_GPS_LAT_LON_MULT 10000 +#define LPP_GPS_ALT_MULT 100 +#define LPP_SWITCH_MULT 1 +#define LPP_CONCENTRATION_MULT 1 +#define LPP_COLOUR_MULT 1 + +#endif \ No newline at end of file diff --git a/User/main.c b/User/main.c new file mode 100644 index 0000000..665fb65 --- /dev/null +++ b/User/main.c @@ -0,0 +1,217 @@ +/********************************** (C) COPYRIGHT ******************************* + * File Name : main.c + * Author : WCH + * Version : V1.0.0 + * Date : 2021/06/06 + * Description : Main program body. + ********************************************************************************* + * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. + * Attention: This software (modified or not) and binary are used for + * microcontroller manufactured by Nanjing Qinheng Microelectronics. + *******************************************************************************/ + +/* + *@Note + *task1 and task2 alternate printing + */ + +#include "ch32v30x_rng.h" +#include "meshcore/meshframing.h" +#include "meshcore/packets/advert.h" +#include "meshcore/packets/control.h" +#include "meshcore/packets/encrypted.h" +#include "meshcore/packets/group.h" + +#include "meshcore/packetstructs.h" +#include "sx1262.h" +#include "util/hexdump.h" +#include "util/log.h" +#include "string.h" +#include "meshcore/meshcore.h" +#include "lib/config.h" +#include "lib/rtc/rtc.h" +#include "lib/monocypher/monocypher-ed25519.h" +#include "meshcore/stats.h" +#include "lib/adc/temperature.h" + +#define TAG "MeshCore" + + +static TIM_TypeDef *runtimeTIM = TIM2; // use TIM2 for example + +void vConfigureTimerForRunTimeStats (void) { + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + // Reset the timer + TIM_DeInit (runtimeTIM); + + // Set timer for max period, upcounting + TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // Assuming 72 MHz clock -> 1 MHz timer tick (1 ?s) + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // Max 16-bit value + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; + + TIM_TimeBaseInit (runtimeTIM, &TIM_TimeBaseStructure); + TIM_Cmd (runtimeTIM, ENABLE); +} + +uint32_t ulGetRunTimeCounterValue (void) { + return TIM_GetCounter (runtimeTIM); +} + +/********************************************************************* + * @fn task1_task + * + * @brief task1 program. + * + * @param *pvParameters - Parameters point of task1 + * + * @return none + */ + +// uint8_t bufIn[260]; + +uint8_t bootedUp = 0; + +/********************************************************************* + * @fn main + * + * @brief ; program. + * + * @return none + */ + +int main (void) { + + NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2); + SystemCoreClockUpdate(); + Delay_Init(); + + + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + + RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init (GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init (GPIOA, &GPIO_InitStructure); + + USART_InitStructure.USART_BaudRate = 115200; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + + USART_Init (USART1, &USART_InitStructure); + USART_Cmd (USART1, ENABLE); + + printf("hello there"); + + + + MESH_LOGD (TAG, "SystemClk:%d\r\n", SystemCoreClock); + MESH_LOGD (TAG, "ChipID:%08x\r\n", DBGMCU_GetCHIPID()); + + while (1) { + // loadConfig(); + populateDefaults(); + + LoraApply(); + + ADC_Function_Init(); + RTC_Init(); + startupTime = RTC_GetCounter(); + memset (&stats, 0, sizeof (stats)); + + + /* + DiscoverRequestPayload discReq; + discReq.prefixOnly = 0; + discReq.since = 0; + discReq.tag = RTC_GetCounter(); + discReq.typeFilter = 0xFF; + sendDiscoverRequest (&discReq); + + */ + sendAdvert (0); + bootedUp = 1; + uint64_t ticker = 0; + + while (1) { + if (USART_GetFlagStatus (USART1, USART_FLAG_RXNE) == SET) { + char x; + x = USART_ReceiveData (USART1); + if (x == 'M') { + MESH_LOGI (TAG, "Sending message\n"); + char tempBuf[180]; + sniprintf (tempBuf, 180, "SySTick is %llu", ticker); + makeSendGroupMessage (tempBuf, 1); + } + if (x == '0') { + MESH_LOGI (TAG, "Sending zero hop advert\n"); + sendAdvert (0); + } + if (x == 'F') { + MESH_LOGI (TAG, "Sending flood advert\n"); + sendAdvert (1); + } + if (x == 'N') { + printNodeDB(); + } + if (x == 'D') { + PlainTextMessagePayload plainTextMessage; + plainTextMessage.timestamp = RTC_GetCounter(); + plainTextMessage.textType = 0; + plainTextMessage.attempt = 0; + snprintf (plainTextMessage.message, sizeof (plainTextMessage.message), "Sending message at SySTick is %llu", ticker); + iprintf ("Sending a direct message to the first node\n"); + sendEncryptedTextMessage (&(persistent.contacts[0]), &plainTextMessage); + } + if (x == 'C') { + for (uint8_t i = 0; i < ChannelCount; i++) { + Channel *channel = &(persistent.channels[i]); + if (strlen (channel->name) == 0) { + continue; + } + if (channel->timestamp == 0) { + continue; + } + iprintf ("Channel index %d, named %s, timestamp is %d, hash is %d\n", i, channel->name, channel->timestamp, channel->hash); + hexdump ("Pubkey", channel->key, sizeof (channel->key)); + } + } + } + + int8_t rssi, snr, rawsnr; + FrameStruct frame; + if (ReadFrame (&frame, &rssi, &snr, &rawsnr)) { + hexdump ("Whole frame", frame.payload, frame.payloadLen); + stats.lastSNR = rawsnr; + // stats.lastSNR = snr; //TODO figure out which to use + stats.lastRSSI = rssi; + MESH_LOGI (TAG, "rssi=%d[dBm] snr=%d[dB] rawsnr=%d[quarter dB]", rssi, snr, rawsnr); + // frame = decodeFrame (bufIn, rxLen); + processFrame (&frame); + if (persistent.doRepeat) { + retransmitFrame (&frame); + } + memset (&frame, 0, sizeof (FrameStruct)); // prepare for the next round + } + + int lost = GetPacketLost(); + if (lost != 0) { + MESH_LOGW (TAG, "%d packets lost", lost); + } + ticker++; + } + } +} diff --git a/User/meshcore/meshcore.c b/User/meshcore/meshcore.c new file mode 100644 index 0000000..ae2d643 --- /dev/null +++ b/User/meshcore/meshcore.c @@ -0,0 +1,79 @@ +#include "meshcore.h" +#include "lib/monocypher/monocypher-ed25519.h" +#include "meshcore/packets/advert.h" +#include "meshcore/packets/anonymous.h" +#include "meshcore/packets/control.h" +#include "meshcore/packets/encrypted.h" +#include "meshcore/packets/group.h" +#include "meshcore/stats.h" +#include "lib/base64.h" +#include "lib/cifra/aes.h" +#include "lib/cifra/sha2.h" +#include "lib/cifra/hmac.h" +#include "lib/config.h" +#include "meshframing.h" +#include "meshcore/packetstructs.h" + +#define TAG "MeshCore" + +// requires at least a 256 byte data + + +void processFrame (FrameStruct *frame) { + printframeHeader (frame); + if (frame->header & PAYLOAD_VERSION_3) { // more than the version 0 + MESH_LOGW (TAG, "Frame too new, got version %d instead of 0", (frame->header & PAYLOAD_VERSION_3) >> 6); + } + + unsigned char frameType = frame->header & PAYLOAD_TYPE_MASK; + + unsigned char index = 0; + + stats.packetsReceivedCount++; + + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_FLOOD || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + stats.receivedFloodCount++; + } + + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_DIRECT || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT) { + stats.receivedDirectCount++; + } + + + if (frameType == PAYLOAD_TYPE_ANON_REQ) { + decodeAnonReq (frame); + + } else if (frameType == PAYLOAD_TYPE_PATH || frameType == PAYLOAD_TYPE_REQ || frameType == PAYLOAD_TYPE_RESPONSE || frameType == PAYLOAD_TYPE_TXT_MSG) { + iprintf (" Typexd: 0x%02X\n", frameType); + decodeEncryptedPayload (frame); + + } else if (frameType == PAYLOAD_TYPE_ACK) { + uint32_t checkSum = frame->payload[index++]; + checkSum |= frame->payload[index++] << 8; + checkSum |= frame->payload[index++] << 16; + checkSum |= frame->payload[index++] << 24; + // TODO add checking + + } else if (frameType == PAYLOAD_TYPE_ADVERT) { + decodeAdvertisement (frame); + } else if (frameType == PAYLOAD_TYPE_GRP_TXT || frameType == PAYLOAD_TYPE_GRP_DATA) { + decodeGroupMessage (frame); + } else if (frameType == PAYLOAD_TYPE_TRACE) { + + } else if (frameType == PAYLOAD_TYPE_MULTIPART) { + + } else if (frameType == PAYLOAD_TYPE_CONTROL) { + if (frame->path.pathLen == 0) { + decodeControlFrame (frame); + } + frame->header = 0xFF; + + } else if (frameType == PAYLOAD_TYPE_RAW_CUSTOM) { + // not implemented + } else { + stats.packetsReceivedCount--; + } + MESH_LOGD (TAG, "Processed frame"); +} diff --git a/User/meshcore/meshcore.h b/User/meshcore/meshcore.h new file mode 100644 index 0000000..011118f --- /dev/null +++ b/User/meshcore/meshcore.h @@ -0,0 +1,16 @@ +#ifndef MESHCORE_HEADER +#define MESHCORE_HEADER + +#include "packetstructs.h" +#include "string.h" +#include "sx1262.h" +#include "lib/cifra/aes.h" +#include "lib/cifra/sha2.h" +#include "lib/cifra/hmac.h" +#include "util/log.h" +#include +#include "stdio.h" + +void processFrame (FrameStruct *frame); + +#endif \ No newline at end of file diff --git a/User/meshcore/meshframing.c b/User/meshcore/meshframing.c new file mode 100644 index 0000000..0eec6c9 --- /dev/null +++ b/User/meshcore/meshframing.c @@ -0,0 +1,562 @@ +#include "meshframing.h" +#include "ch32v30x_gpio.h" +#include "lib/config.h" +#include "meshcore/stats.h" +#include "string.h" +#include "stdio.h" +#include "sx1262.h" +#include "util/hexdump.h" +#include "util/log.h" +#include "lib/cifra/sha2.h" + +#define TAG "Meshframing" + +int ReadFrame (FrameStruct *frame, int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr) { + uint16_t irqRegs = GetIrqStatus(); + // uint8_t status = GetStatus(); + + if (irqRegs & SX126X_IRQ_RX_DONE) { + // ClearIrqStatus(SX126X_IRQ_RX_DONE); + ClearIrqStatus (SX126X_IRQ_ALL); + + uint8_t offset = 0; + uint8_t payloadLength = 0; + GetRxBufferStatus (&payloadLength, &offset); + + if (payloadLength == 0) { + return 0; + } + + GetPacketStatus (rssiPacket, snrPacket, rawSnr); + + memset (frame, 0, sizeof (FrameStruct)); + WaitForIdle (BUSY_WAIT, "start ReadBuffer", 1); + + uint8_t cmd[3] = {SX126X_CMD_READ_BUFFER, offset, SX126X_CMD_NOP}; + + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 0); + + uint16_t curPayloadIndex = 0; + uint8_t pathIndex = 0; + uint8_t transportIndex = 0; + uint8_t state = 0; // 0=header, 1=transport, 2=pathLen, 3=path, 4=payload + + for (uint16_t i = 0; i < payloadLength + sizeof (cmd); i++) { + uint8_t out = (i < sizeof (cmd)) ? cmd[i] : 0xFF; + + // Wait TX ready + while (!SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE)); + SPI_I2S_SendData (SPI1, out); + + // Wait RX ready + while (!SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE)); + uint8_t in = (uint8_t)SPI_I2S_ReceiveData (SPI1); + + // Only process payload bytes + if (i >= sizeof (cmd)) { + switch (state) { + case 0: // header + frame->header = in; + state = ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) + ? 1 + : 2; + break; + + case 1: // transportCodes[4] + frame->transportCodes[transportIndex++] = in; + if (transportIndex >= 4) + state = 2; + break; + + case 2: // pathLen + frame->path.pathLen = in; + if (frame->path.pathLen > 64) { + frame->path.pathLen = 64; + } + pathIndex = 0; + state = (frame->path.pathLen > 0) ? 3 : 4; + break; + + case 3: // path + frame->path.path[pathIndex++] = in; + if (pathIndex >= frame->path.pathLen) + state = 4; + break; + + case 4: // payload + frame->payload[curPayloadIndex++] = in; + break; + } + } + } + + frame->payloadLen = curPayloadIndex; + + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 1); + + WaitForIdle (BUSY_WAIT, "end ReadBuffer", 0); + return payloadLength; + } + return 0; +} + +/* +FrameStruct decodeFrame (unsigned char *data, unsigned char dataLen) { + FrameStruct frame; + memset (&frame, 0, sizeof (frame)); + unsigned char index = 0; + frame.header = data[index++]; + if ((frame.header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || + (frame.header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + memcpy (frame.transportCodes, data + index, 4); + index += 4; + } + frame.path.pathLen = data[index++]; + + memcpy (frame.path.path, data + index, frame.path.pathLen); + index += frame.path.pathLen; + frame.payloadLen = dataLen - index; + memcpy (frame.payload, data + index, frame.payloadLen); + + return frame; +} +*/ +void printframeHeader (const FrameStruct *frame) { + switch (frame->header & ROUTE_TYPE_MASK) { + case ROUTE_TYPE_TRANSPORT_FLOOD: + iprintf ("transport flood"); + break; + + case ROUTE_TYPE_FLOOD: + iprintf ("flood"); + break; + + case ROUTE_TYPE_DIRECT: + iprintf ("direct"); + break; + + case ROUTE_TYPE_TRANSPORT_DIRECT: + iprintf ("transport direct"); + break; + } + + iprintf (", payload type is "); + + switch (frame->header & PAYLOAD_TYPE_MASK) { + case PAYLOAD_TYPE_REQ: + iprintf ("request"); + break; + + case PAYLOAD_TYPE_RESPONSE: + iprintf ("response"); + break; + + case PAYLOAD_TYPE_TXT_MSG: + iprintf ("text message"); + break; + + case PAYLOAD_TYPE_ACK: + iprintf ("acknowledgement"); + break; + + case PAYLOAD_TYPE_ADVERT: + iprintf ("advert"); + break; + + case PAYLOAD_TYPE_GRP_TXT: + iprintf ("group text"); + break; + + case PAYLOAD_TYPE_GRP_DATA: + iprintf ("group data"); + break; + + case PAYLOAD_TYPE_ANON_REQ: + iprintf ("anon request"); + break; + + case PAYLOAD_TYPE_PATH: + iprintf ("path"); + break; + + case PAYLOAD_TYPE_TRACE: + iprintf ("trace"); + break; + + case PAYLOAD_TYPE_MULTIPART: + iprintf ("multipart"); + break; + + case PAYLOAD_TYPE_CONTROL: + iprintf ("control"); + break; + + case PAYLOAD_TYPE_RAW_CUSTOM: + iprintf ("raw"); + break; + } + char version[2]; + version[0] = (frame->header >> 6) + '0'; + version[1] = 0; + + iprintf (", payload version is %s ", version); + + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + iprintf ("Transport codes: %d %d\n", *((uint16_t *)frame->transportCodes), + *((uint16_t *)&(frame->transportCodes[2]))); + } + iprintf ("Path is %d nodes long", frame->path.pathLen); + + for (uint8_t pathIndex = 0; pathIndex < frame->path.pathLen; pathIndex++) { + iprintf ("node %d - %02X, ", pathIndex, frame->path.path[pathIndex]); + } + putchar ('\n'); +} + +void LoRaTransmit (const FrameStruct *frame) { + addToNotReTX(frame); + uint16_t len = 2; // header + path_len + + if ( + ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT) || + ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) + ) { + len += 4; + } + + len += frame->path.pathLen; + len += frame->payloadLen; + + if (len > 255) { + MESH_LOGE(TAG, "%d is too big for sx1262", len); + } + + uint16_t irqStatus; + char rv = 0; + + size_t outCounter = 0; + + if (txActive == 0) { + txActive = 1; + + if (PacketParams[2] == 0x00) { // explicit header, variable length + PacketParams[3] = len; + } + + WriteCommand (SX126X_CMD_SET_PACKET_PARAMS, PacketParams, 6); + ClearIrqStatus (SX126X_IRQ_ALL); + + WaitForIdle (BUSY_WAIT, "start WriteBuffer", 1); + + uint8_t cmdBuf[2] = {SX126X_CMD_WRITE_BUFFER, 0x00}; + uint8_t cmdLen = sizeof (cmdBuf); + + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 0); + + uint16_t payloadIndex = 0; + uint8_t state = 0; + uint8_t pathIndex = 0; + uint8_t transportIndex = 0; + + for (uint16_t i = 0; i < len + cmdLen; i++) { + uint8_t out = 0xFF; + + if (i < cmdLen) { + out = cmdBuf[i]; + } else { + switch (state) { + case 0: // header + out = frame->header; + outCounter = 0; + state = ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) + ? 1 + : 2; + break; + + case 1: // transport codes + out = frame->transportCodes[transportIndex++]; + if (transportIndex >= 4) + state = 2; + break; + + case 2: // path length + out = frame->path.pathLen; + pathIndex = 0; + state = (frame->path.pathLen > 0) ? 3 : 4; + break; + + case 3: // path + out = frame->path.path[pathIndex++]; + if (pathIndex >= frame->path.pathLen) + state = 4; + break; + + case 4: // payload + out = frame->payload[payloadIndex++]; + break; + } + } + + while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET); + outCounter++; + SPI_I2S_SendData (SPI1, out); + + while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE) == RESET); + (void)SPI_I2S_ReceiveData (SPI1); // discard + } + + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 1); + + WaitForIdle (BUSY_WAIT, "end WriteBuffer", 0); + + MESH_LOGD(TAG, + "TX payloadLen=%u pathLen=%u totalLen=%u header=0x%02X", + frame->payloadLen, + frame->path.pathLen, + len, + frame->header); + + + MESH_LOGD(TAG, "Starting tx mode, sent %d, should %d", outCounter, len); + + SetTx (3000); + + MESH_LOGD(TAG, "SetTx running"); + + irqStatus = GetIrqStatus(); + while (!(irqStatus & (SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT))) { + Delay_Ms(10); + irqStatus = GetIrqStatus(); + if (debugPrint) { + MESH_LOGD(TAG, "irq: 0x%04X", irqStatus); + } + } + + MESH_LOGD(TAG, "Finished tx"); + txActive = 0; + SetRx (0xFFFFFF); + + if (irqStatus & SX126X_IRQ_TX_DONE) { + rv = 1; + } + } + + if (rv == 0) { + txLost++; + } +} + +/* +void sendFrame (const FrameStruct *frame) { + uint8_t txBuf[256]; + size_t offset = 0; + + txBuf[offset++] = frame->header; + + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + memcpy (txBuf + offset, frame->transportCodes, 4); + offset += 4; + } + + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_FLOOD || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + stats.sentFloodCount++; + } + + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_DIRECT || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_DIRECT) { + stats.sentDirectCount++; + } + + stats.packetsSentCount++; + + uint8_t pathLen = frame->path.pathLen; + + + if (pathLen > 64) { + pathLen = 64; + } + + txBuf[offset++] = pathLen; + + memcpy (txBuf + offset, frame->path.path, pathLen); + hexdump ("TxDump Path", frame->path.path, frame->path.pathLen); + offset += pathLen; + + uint16_t maxPayloadLen = 256 - offset; + + uint16_t payloadLen = frame->payloadLen > maxPayloadLen ? maxPayloadLen : frame->payloadLen; + + memcpy (txBuf + offset, frame->payload, payloadLen); + offset += payloadLen; + + + hexdump ("TxDump", txBuf, offset); + hexdump ("TxDumpPayload", frame->payload, frame->payloadLen); + TickType_t start, end; + start = xTaskGetTickCount(); + LoRaSend (txBuf, offset, SX126x_TXMODE_SYNC); + end = xTaskGetTickCount(); + tickAirtime += end - start; +} +*/ + +KnownPacketHistoryType dontReTXHistory[NON_RETX_HISTORY]; +uint8_t dontReTXHistoryIndex = 0; + +void getFrameHash(const FrameStruct *frame, uint8_t *hash) { + cf_sha256_context ctx; + + // 1. Initialize + cf_sha256_init (&ctx); + + // 2. Feed in your data + cf_sha256_update (&ctx, frame->payload, frame->payloadLen); + + // 3. Compute digest + cf_sha256_digest (&ctx, hash); +} + +void addToNotReTX(const FrameStruct *frame) { + KnownPacketHistoryType * knownHist = &(dontReTXHistory[dontReTXHistoryIndex]); + + getFrameHash(frame, knownHist->hash); + knownHist->populated = 1; + + dontReTXHistoryIndex++; + if (dontReTXHistoryIndex >= NON_RETX_HISTORY) { + dontReTXHistoryIndex = 0; + } +} + +void retransmitFrame (FrameStruct *frame) { + + uint8_t hashTmp[CF_SHA256_HASHSZ]; + getFrameHash(frame, hashTmp); + + uint8_t found = 0; + for (uint8_t i = 0; i < NON_RETX_HISTORY; i++) { + KnownPacketHistoryType * knownHist = &(dontReTXHistory[dontReTXHistoryIndex]); + if (knownHist->populated == 0) { + continue; + } + if (memcmp(knownHist->hash, hashTmp, CF_SHA256_HASHSZ) == 0) { + found = 1; + break; + } + } + if (found) { + return; + } + + /* -------- FLOOD -------- */ + if (frame->header & ROUTE_TYPE_FLOOD || + frame->header & ROUTE_TYPE_TRANSPORT_FLOOD) { + + if (frame->header != DONT_RETRANSMIT_HEADER && + frame->path.pathLen + 1 < MAX_FLOOD_TTL) { + + // append self to END of path + frame->path.path[frame->path.pathLen++] = persistent.pubkey[0]; + LoRaTransmit (frame); + } + } + + /* -------- DIRECT -------- */ + if (frame->header & ROUTE_TYPE_DIRECT || + frame->header & ROUTE_TYPE_TRANSPORT_DIRECT) { + + // are we the next hop? + if (frame->path.pathLen > 0 && + frame->path.path[0] == persistent.pubkey[0]) { + + // remove self from START of path + frame->path.pathLen--; + memmove (frame->path.path, + frame->path.path + 1, + frame->path.pathLen); + + // forward only if there's another hop + if (frame->path.pathLen > 0) { + LoRaTransmit (frame); + } + } + } +} + +// Verify MAC + Decrypt + +int encrypt_then_mac (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *plaintext, size_t plen, uint8_t *output, size_t *olen) { + if (plen == 0) + return -1; + + size_t padded_len = ((plen + 15) / 16) * 16; + + // prepare padded buffer + uint8_t padded[padded_len]; + memset (padded, 0, padded_len); // zero padding + memcpy (padded, plaintext, plen); // copy plaintext + + // ciphertext will go right after HMAC + uint8_t *ciphertext = output + HMAC_SIZE; + + // encrypt plaintext + aes_encrypt_ecb (aes_key, 16, padded, padded_len, ciphertext); + + // compute HMAC over ciphertext + uint8_t mac[32]; // full SHA-256 + hmac_sha256 (aes_key, keySize, ciphertext, padded_len, mac); + + // copy only HMAC_SIZE bytes of MAC + memcpy (output, mac, HMAC_SIZE); + + // return total length = HMAC + ciphertext + *olen = HMAC_SIZE + padded_len; + return 0; +} + +int mac_then_decrypt (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *input, size_t ilen, uint8_t *plaintext) { + if (ilen <= HMAC_SIZE) + return -1; + + const uint8_t *mac = input; + const uint8_t *ciphertext = input + HMAC_SIZE; + size_t clen = ilen - HMAC_SIZE; + + if (clen % 16 != 0) + return -2; // must be multiple of block size + + uint8_t calc_mac[32]; // full SHA-256 + hmac_sha256 (aes_key, keySize, ciphertext, clen, calc_mac); + + if (memcmp (mac, calc_mac, HMAC_SIZE) != 0) + return -2; + + return aes_decrypt_ecb (aes_key, 16, ciphertext, clen, plaintext); +} + +uint16_t getTransportCode (const FrameStruct *frame) { + uint16_t code; + /* + // compute HMAC over ciphertext + uint8_t mac[32]; // full SHA-256 + cf_hmac_ctx ctx; + cf_hmac_init (&ctx, &cf_sha256, key, sizeof(key)); + cf_hmac_update (&ctx, &(frame->header), sizeof (frame->header)); + cf_hmac_update (&ctx, frame->payload, frame->payloadLen); + cf_hmac_finish (&ctx, mac); + + // copy only HMAC_SIZE bytes of MAC + memcpy (&code, mac, HMAC_SIZE); + */ + if (code == 0) { // reserve codes 0000 and FFFF + code++; + } else if (code == 0xFFFF) { + code--; + } + return code; +} \ No newline at end of file diff --git a/User/meshcore/meshframing.h b/User/meshcore/meshframing.h new file mode 100644 index 0000000..0b346a3 --- /dev/null +++ b/User/meshcore/meshframing.h @@ -0,0 +1,46 @@ +#ifndef MESHCORE_FRAME_HEADER +#define MESHCORE_FRAME_HEADER + +#include "stddef.h" +#include "stdint.h" +#include "lib/cifra/aes.h" +#include "lib/cifra/hmac.h" +#include "packetstructs.h" + + +#define KEY_SIZE 16 // 128-bit AES +#define HMAC_SIZE 2 // meshcore size +#define MAX_FLOOD_TTL 64 +//#define NON_RETX_HISTORY 64 +#define NON_RETX_HISTORY 8 + +int ReadFrame (FrameStruct *frame, int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr); + +void LoRaTransmit (const FrameStruct *frame); + +/* +FrameStruct decodeFrame (unsigned char *data, unsigned char dataLen); + +void sendFrame (const FrameStruct * frame); +*/ + +void printFrameHeader (const FrameStruct *frame); + +// CALL LAST, PATH GETS MODIFIED +void retransmitFrame (FrameStruct *frame); + +// Verify MAC + Decrypt + +int encrypt_then_mac (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *plaintext, size_t plen, uint8_t *output, size_t *olen); + +int mac_then_decrypt (const uint8_t *aes_key, const uint8_t keySize, const uint8_t *input, size_t ilen, uint8_t *plaintext); + +void addToNotReTX(const FrameStruct *frame); + +typedef struct KnownPacketHistoryType { + uint8_t hash[32]; + uint8_t populated; +} KnownPacketHistoryType; + + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/ack.c b/User/meshcore/packets/ack.c new file mode 100644 index 0000000..2aff951 --- /dev/null +++ b/User/meshcore/packets/ack.c @@ -0,0 +1,43 @@ +#include "ack.h" +#include "lib/cifra/sha2.h" +#include "lib/config.h" +#include "meshcore/meshframing.h" +#include + +#define TAG "Ack" + +void sendDiscreteAck (uint8_t *data, const uint8_t len, uint8_t *senderPubKey) { + FrameStruct frame; + frame.path.pathLen = 0; + memset (&frame, 0, sizeof (frame)); + + // 1. Header + frame.header = + ROUTE_TYPE_FLOOD | // currently flood + PAYLOAD_TYPE_ACK | + PAYLOAD_VERSION_0; + + // Buffer for the digest + uint8_t hash[CF_SHA256_HASHSZ]; + + // Context + cf_sha256_context ctx; + + // 1. Initialize + cf_sha256_init (&ctx); + + // 2. Feed in your data + cf_sha256_update (&ctx, data, len); + + cf_sha256_update (&ctx, senderPubKey, sizeof (persistent.pubkey)); + + // 3. Compute digest + cf_sha256_digest (&ctx, hash); + + memcpy (frame.payload, hash, 4); + // 5. Finalize + frame.payloadLen = 4; + + + LoRaTransmit (&frame); +} \ No newline at end of file diff --git a/User/meshcore/packets/ack.h b/User/meshcore/packets/ack.h new file mode 100644 index 0000000..916d663 --- /dev/null +++ b/User/meshcore/packets/ack.h @@ -0,0 +1,8 @@ +#ifndef ACK_HEADER +#define ACK_HEADER + +#include "meshcore/packetstructs.h" + +void sendDiscreteAck (uint8_t *data, const uint8_t len, uint8_t *senderPubKey); + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/advert.c b/User/meshcore/packets/advert.c new file mode 100644 index 0000000..617f80e --- /dev/null +++ b/User/meshcore/packets/advert.c @@ -0,0 +1,302 @@ +#include "ch32v30x_rtc.h" +#include "lib/config.h" +#include "lib/monocypher/monocypher-ed25519.h" +#include "meshcore/meshframing.h" +#include "meshcore/packetstructs.h" +#include +#include "advert.h" +#include "util/hexdump.h" +#include "lib/base64.h" +#include "util/log.h" + +#define TAG "Advert" + +static void build_ad_message (const FrameStruct *frame, + uint8_t *out, + size_t *out_len) { + size_t idx = 0; + + // pubkey + timestamp (your 36 bytes) + memcpy (out + idx, frame->payload, 36); + idx += 36; + + // rest of payload after signature region + memcpy (out + idx, + &frame->payload[100], + frame->payloadLen - 100); + + idx += (frame->payloadLen - 100); + + *out_len = idx; +} + +void ed25519_sign_ad (FrameStruct *frame) { + uint8_t *signature = &frame->payload[36]; + + uint8_t message[256]; + size_t m = 0; + + // pubkey + timestamp (0..35) + memcpy (message + m, frame->payload, 36); + m += 36; + + // skip signature [36..99] + + // payload after signature + memcpy (message + m, + frame->payload + 100, + frame->payloadLen - 100); + m += frame->payloadLen - 100; + + crypto_ed25519_sign (signature, + persistent.privkey, + message, + m); +} + +int ed25519_verify_ad (const FrameStruct *frame) { + const uint8_t *signature = &frame->payload[36]; + + uint8_t message[256]; + size_t m = 0; + + if (signature[63] & 224) + return 0; + + // pubkey + timestamp + memcpy (message + m, frame->payload, 36); + m += 36; + + // skip signature [36..99] + + // payload after signature + memcpy (message + m, + frame->payload + 100, + frame->payloadLen - 100); + m += frame->payloadLen - 100; + + return crypto_ed25519_check (signature, + frame->payload, // pubkey at start + message, + m) == 0; +} + +void sendAdvert (uint8_t shouldFlood) { + FrameStruct frame; + size_t offset = 0; + + frame.header = (shouldFlood ? ROUTE_TYPE_FLOOD : ROUTE_TYPE_DIRECT) | PAYLOAD_TYPE_ADVERT | PAYLOAD_VERSION_0; + + /* ---- public key ---- */ + memcpy (frame.payload + offset, persistent.pubkey, 32); + offset += 32; + + /* ---- timestamp ---- */ + uint32_t timestamp = RTC_GetCounter(); + memcpy (frame.payload + offset, ×tamp, sizeof (timestamp)); + offset += sizeof (timestamp); + + /* ---- reserve signature ---- */ + uint8_t *signature_pos = frame.payload + offset; + offset += 64; + + /* ---- build app data directly into payload ---- */ + size_t app_start = offset; + + uint8_t dataFlags = ADVERTISEMENT_FLAG_HAS_NAME; + if (persistent.nodeType == NODE_TYPE_CHAT_NODE) + dataFlags |= ADVERTISEMENT_FLAG_IS_CHAT_NODE; + else if (persistent.nodeType == NODE_TYPE_REPEATER) + dataFlags |= ADVERTISEMENT_FLAG_IS_REAPEATER; + else if (persistent.nodeType == NODE_TYPE_ROOM_SERVER) + dataFlags |= ADVERTISEMENT_FLAG_IS_ROOM_SERVER; + else if (persistent.nodeType == NODE_TYPE_SENSOR) + dataFlags |= ADVERTISEMENT_FLAG_IS_SENSOR; + + frame.payload[offset++] = dataFlags; + + if (dataFlags & ADVERTISEMENT_FLAG_HAS_LOCATION) { + memcpy (frame.payload + offset, &persistent.latitude, sizeof (persistent.latitude)); + offset += sizeof (persistent.latitude); + + memcpy (frame.payload + offset, &persistent.longitude, sizeof (persistent.longitude)); + offset += sizeof (persistent.longitude); + } + /* + + if (dataFlags & ADVERTISEMENT_FLAG_RFU1) { + memcpy(frame.payload + offset, &persistent.rfu1, sizeof(persistent.rfu1)); + offset += sizeof(persistent.rfu1); + } + + if (dataFlags & ADVERTISEMENT_FLAG_RFU2) { + memcpy(frame.payload + offset, &persistent.rfu2, sizeof(persistent.rfu2)); + offset += sizeof(persistent.rfu2); + } + */ + + if (dataFlags & ADVERTISEMENT_FLAG_HAS_NAME) { + size_t nameLen = strlen (persistent.nodeName); + memcpy (frame.payload + offset, persistent.nodeName, nameLen); + offset += nameLen; + } + + size_t app_len = offset - app_start; + + frame.payloadLen = offset; + /* ---- sign directly over payload ---- */ + ed25519_sign_ad (&frame); + + /* ---- debug ---- */ + hexdump ("Public key", frame.payload, 32); + hexdump ("Signature", signature_pos, 64); + hexdump ("Appdata", frame.payload + app_start, app_len); + iprintf ("Timestamp is %lu\n", timestamp); + iprintf ("NodeName %s\n", persistent.nodeName); + + /* ---- send ---- */ + frame.payloadLen = offset; + frame.path.pathLen = 0; + LoRaTransmit (&frame); +} + +void decodeAdvertisement (const FrameStruct *frame) { + AdvertisementPayload advert; + memset (&advert, 0, sizeof (advert)); + + advert.valid = 0; + if (frame->payloadLen < 101) { + MESH_LOGW (TAG, "Advertisement frame too short (%d < 101)", frame->payloadLen); + return; + } + + if (!ed25519_verify_ad (frame)) { + MESH_LOGW (TAG, "Incorrect signature"); + return; + } else { + MESH_LOGI (TAG, "Advertisement signature ok."); + } + advert.valid = 1; + + unsigned char index = 0; + + memcpy (advert.pubKey, frame->payload + index, 32); + index += 32; + + memcpy (&advert.timestamp, frame->payload + index, 4); + index += 4; + + memcpy (advert.signature, frame->payload + index, 64); + index += 64; + + advert.dataFlags = frame->payload[index++]; + + uint8_t expectedLen = 101; + + if (advert.dataFlags & ADVERTISEMENT_FLAG_HAS_LOCATION) { + expectedLen += 8; + } + + if (advert.dataFlags & ADVERTISEMENT_FLAG_RFU1) { + expectedLen += 2; + } + if (advert.dataFlags & ADVERTISEMENT_FLAG_RFU2) { + expectedLen += 2; + } + + if (frame->payloadLen < expectedLen) { + MESH_LOGW (TAG, "Advertisement frame with data too short (%d < %d)", frame->payloadLen, expectedLen); + return; + } + + if (advert.dataFlags & ADVERTISEMENT_FLAG_HAS_LOCATION) { + memcpy (&advert.latitude, frame->payload + index, 4); + index += 4; + memcpy (&advert.longitude, frame->payload + index, 4); + index += 4; + } + + if (advert.dataFlags & ADVERTISEMENT_FLAG_RFU1) { + memcpy (&advert.rfu1, frame->payload + index, 2); + index += 2; + } + if (advert.dataFlags & ADVERTISEMENT_FLAG_RFU2) { + memcpy (&advert.rfu2, frame->payload + index, 2); + index += 2; + } + unsigned char nameLen = frame->payloadLen - index; + + if (nameLen > 31) { + nameLen = 31; // leave space for null + } + memcpy (advert.nodeName, frame->payload + index, nameLen); + advert.nodeName[nameLen] = 0; + + + printAdvertisement (&advert); + saveAdvert (&advert); +} + +void saveAdvert (const AdvertisementPayload *advert) { + NodeEntry *node = getNode (advert->pubKey[0]); + + if (node == NULL) { + node = getNextNode(); + memset (node, 0, sizeof (NodeEntry)); + } + + memcpy (node->name, advert->nodeName, sizeof (node->name)); + memcpy (node->pubKey, advert->pubKey, sizeof (node->pubKey)); + + // ------------------------------- + // Ed25519 ¡ú X25519 conversion + // ------------------------------- + uint8_t peer_x[32]; + crypto_eddsa_to_x25519 (peer_x, advert->pubKey); + + // ------------------------------- + // IMPORTANT: derive correct scalar + // (THIS fixes your HMAC mismatch) + // ------------------------------- + uint8_t scalar[64]; + uint8_t scalarOut[32]; + + crypto_sha512 (scalar, persistent.privkey, 32); + crypto_eddsa_trim_scalar (scalarOut, scalar); + + // ------------------------------- + // X25519 Diffie-Hellman + // ------------------------------- + crypto_x25519 (node->secret, + scalarOut, + peer_x); + + + node->gps_latitude = advert->latitude; + node->gps_longitude = advert->longitude; + + // add path + + node->type = advert->dataFlags & 0x0F; + node->last_seen_lt = RTC_GetCounter(); + node->last_seen_rt = advert->timestamp; +} + +void printAdvertisement (const AdvertisementPayload *advert) { + iprintf ( + "%s on %ld with type %s on %s location %ld %ld\n", + advert->dataFlags & ADVERTISEMENT_FLAG_HAS_NAME + ? advert->nodeName + : "nameless node", + advert->timestamp, + (advert->dataFlags & 0x07) == 0x04 ? "sensor" + : (advert->dataFlags & 0x07) == 0x03 ? "room server" + : (advert->dataFlags & 0x07) == 0x02 ? "repeater" + : "chat node", + advert->dataFlags & 0x80 ? "known" : "unknown", + advert->latitude, + advert->longitude); + + hexdump ("Public key", advert->pubKey, 32); + hexdump ("Signature", advert->signature, 64); +} diff --git a/User/meshcore/packets/advert.h b/User/meshcore/packets/advert.h new file mode 100644 index 0000000..263dd1d --- /dev/null +++ b/User/meshcore/packets/advert.h @@ -0,0 +1,14 @@ +#ifndef ADVERT_HEADER +#define ADVERT_HEADER + +#include "meshcore/packetstructs.h" + +void sendAdvert (uint8_t shouldFlood); + +void decodeAdvertisement (const FrameStruct *frame); + +void printAdvertisement (const AdvertisementPayload *advert); + +void saveAdvert (const AdvertisementPayload *advert); + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/anonymous.c b/User/meshcore/packets/anonymous.c new file mode 100644 index 0000000..40fb979 --- /dev/null +++ b/User/meshcore/packets/anonymous.c @@ -0,0 +1,234 @@ +#include "ch32v30x_rtc.h" +#include "lib/config.h" +#include "lib/monocypher/monocypher-ed25519.h" +#include "meshcore/meshframing.h" +#include "meshcore/packets/encrypted.h" +#include "meshcore/packetstructs.h" +#include "anonymous.h" +#include "util/hexdump.h" +#include + +#define TAG "Anonymous" + +void sendAnonymousRequest (const NodeEntry *targetNode, const uint8_t *password, uint32_t sync) { + uint8_t passwordLen = strlen ((const char *)password); + FrameStruct frame; + frame.path.pathLen = 0; + uint8_t offset = 0; + + // 1. Frame header + frame.header = ((targetNode->path.pathLen > 0) ? ROUTE_TYPE_DIRECT : ROUTE_TYPE_FLOOD) | PAYLOAD_TYPE_ANON_REQ | PAYLOAD_VERSION_0; + + // 2. Payload header (unencrypted) + frame.payload[offset++] = targetNode->pubKey[0]; + + memcpy (frame.payload + offset, persistent.pubkey, 32); + offset += 32; + + // 3. Build plaintext payload + uint8_t plaintext[32]; + uint8_t p = 0; + + uint32_t last_seen_rt = RTC_GetCounter(); + plaintext[p++] = (last_seen_rt >> 0) & 0xFF; + plaintext[p++] = (last_seen_rt >> 8) & 0xFF; + plaintext[p++] = (last_seen_rt >> 16) & 0xFF; + plaintext[p++] = (last_seen_rt >> 24) & 0xFF; + + if (targetNode->type == NODE_TYPE_ROOM_SERVER) { + plaintext[p++] = (sync >> 0) & 0xFF; + plaintext[p++] = (sync >> 8) & 0xFF; + plaintext[p++] = (sync >> 16) & 0xFF; + plaintext[p++] = (sync >> 24) & 0xFF; + } + + if (passwordLen > 16) { + passwordLen = 16; + } + memcpy (plaintext + p, password, passwordLen); + p += passwordLen; + + size_t outputLen; + // 4. Encrypt + MAC + encrypt_then_mac ( + targetNode->secret, + 32, + plaintext, + p, + frame.payload + offset, + &outputLen); + + offset += outputLen; + + // 5. Finalize and send + frame.payloadLen = offset; + memcpy (&(frame.path), &(targetNode->path), sizeof (frame.path)); + + hexdump ("Anon payload", frame.payload, frame.payloadLen); + + LoRaTransmit (&frame); +} + +void printAnonRequest (const AnonymousRequestPayload *req, int isRoomServer) { + if (!req) + return; + + iprintf ("AnonymousRequestPayload at %p\n", (void *)req); + iprintf (" destination hash: 0x%02X\n", req->destinationHash); + + iprintf (" sender pubKey: "); + for (int i = 0; i < sizeof (req->pubKey); i++) { + iprintf ("%02X", req->pubKey[i]); + } + iprintf ("\n"); + + iprintf (" cipher MAC: 0x%04X\n", req->cipherMAC); + + iprintf (" decrypted payload (%u bytes):\n", req->payloadLen); + uint8_t index = 0; + + // timestamp (first 4 bytes) + if (req->payloadLen >= 4) { + uint32_t timestamp = req->payload[index++]; + timestamp |= req->payload[index++] << 8; + timestamp |= req->payload[index++] << 16; + timestamp |= req->payload[index++] << 24; + iprintf (" timestamp: %u\n", timestamp); + } + + // room server sync timestamp + if (isRoomServer && req->payloadLen >= index + 4) { + uint32_t syncTimestamp = req->payload[index++]; + syncTimestamp |= req->payload[index++] << 8; + syncTimestamp |= req->payload[index++] << 16; + syncTimestamp |= req->payload[index++] << 24; + iprintf (" sync timestamp: %u\n", syncTimestamp); + } + + + // remaining bytes = password + if (index < req->payloadLen) { + uint8_t passwordLen = req->payloadLen - index; + if (passwordLen > 16) + passwordLen = 16; + passwordLen = strnlen (&(req->payload[index]), passwordLen); + iprintf (" password: "); + for (uint8_t i = 0; i < passwordLen; i++) { + iprintf ("%c", req->payload[i + index]); + } + iprintf ("\n"); + } +} + +size_t strnlen (const char *s, size_t maxLen) { + size_t len = 0; + while (len < maxLen && s[len] != '\0') { + len++; + } + return len; +} + +void decodeAnonReq (const FrameStruct *frame) { + uint8_t index = 0; + AnonymousRequestPayload anonReq; + + anonReq.destinationHash = frame->payload[index++]; + memcpy (anonReq.pubKey, &(frame->payload[index]), sizeof (anonReq.pubKey)); + index += sizeof (anonReq.pubKey); + anonReq.cipherMAC = frame->payload[index]; + anonReq.cipherMAC |= frame->payload[index + 1] << 8; + + NodeEntry *foundNode = getNode (anonReq.pubKey[0]); + + if (foundNode == NULL) { + foundNode = getNextNode(); + memset (foundNode, 0, sizeof (NodeEntry)); + + strcpy (foundNode->name, "Anonymous node"); + foundNode->path.pathLen = 0; + + memcpy (foundNode->pubKey, + anonReq.pubKey, + sizeof (foundNode->pubKey)); + + // --- X25519 conversion + DH --- + uint8_t peer_x[32]; + + crypto_eddsa_to_x25519 (peer_x, anonReq.pubKey); + + crypto_x25519 (foundNode->secret, + persistent.privkey, + peer_x); + + foundNode->gps_latitude = 0; + foundNode->gps_longitude = 0; + foundNode->type = 0; + foundNode->last_seen_lt = RTC_GetCounter(); + + MESH_LOGI (TAG, "New anonymous node created: %s", foundNode->name); + } else { + MESH_LOGD (TAG, + "Existing node found for pubKey[0]=0x%02X", + anonReq.pubKey[0]); + } + + mac_then_decrypt (foundNode->secret, 32, &(frame->payload[index]), frame->payloadLen - index, anonReq.payload); + anonReq.payloadLen = frame->payloadLen - index - 2; + + hexdump ("AnonReq payload", anonReq.payload, anonReq.payloadLen); + + uint8_t index2 = 0; + foundNode->last_seen_rt = anonReq.payload[index2++]; + foundNode->last_seen_rt |= anonReq.payload[index2++] << 8; + foundNode->last_seen_rt |= anonReq.payload[index2++] << 16; + foundNode->last_seen_rt |= anonReq.payload[index2++] << 24; + + if (persistent.nodeType == NODE_TYPE_ROOM_SERVER) { + foundNode->sync_timestamp = anonReq.payload[index2++]; + foundNode->sync_timestamp |= anonReq.payload[index2++] << 8; + foundNode->sync_timestamp |= anonReq.payload[index2++] << 16; + foundNode->sync_timestamp |= anonReq.payload[index2++] << 24; + } + + printAnonRequest (&anonReq, persistent.nodeType == NODE_TYPE_ROOM_SERVER); + + uint8_t passwordLen = anonReq.payloadLen - index2; + if (passwordLen > 16) { + passwordLen = 16; + } + + passwordLen = strnlen (&(anonReq.payload[index2]), passwordLen); + + MESH_LOGI (TAG, "Password len is %d.", passwordLen); + uint8_t passwordBuf[16]; + memcpy (passwordBuf, &(anonReq.payload[index2]), passwordLen); + + if (memcmp (passwordBuf, persistent.password, passwordLen) == 0) { + foundNode->authenticated = 1; + MESH_LOGI (TAG, "Password correct, node %s authenticated.", foundNode->name); + + MESH_LOGI (TAG, "Login response sent to node %s.", foundNode->name); + } else { + MESH_LOGW (TAG, "Password incorrect for node %s.", foundNode->name); + } + + Response resp; + resp.tag = RTC_GetCounter(); + uint8_t index3 = 0; + uint32_t randOut = rand(); + resp.data[index3++] = RESP_SERVER_LOGIN_OK; + resp.data[index3++] = 0; // legacy + resp.data[index3++] = foundNode->authenticated; // isadmin + resp.data[index3++] = foundNode->authenticated ? PERM_ACL_ADMIN : PERM_ACL_GUEST; // permissions + resp.data[index3++] = randOut & 0xFF; + resp.data[index3++] = (randOut >> 8) & 0xFF; + resp.data[index3++] = (randOut >> 16) & 0xFF; + resp.data[index3++] = (randOut >> 24) & 0xFF; + resp.data[index3++] = FIRMWARE_VER_LEVEL; + resp.dataLen = index3; + if ((frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_FLOOD || + (frame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + sendPathBack (foundNode, &(frame->path)); + } + sendEncryptedResponse (foundNode, &resp); +} diff --git a/User/meshcore/packets/anonymous.h b/User/meshcore/packets/anonymous.h new file mode 100644 index 0000000..b4f95ea --- /dev/null +++ b/User/meshcore/packets/anonymous.h @@ -0,0 +1,11 @@ +#ifndef ANONYMOUS_HEADER +#define ANONYMOUS_HEADER + +#include "meshcore/packetstructs.h" +#include "lib/config.h" + +void decodeAnonReq (const FrameStruct *frame); + +void sendAnonymousRequest (const NodeEntry *targetNode, const uint8_t *password, uint32_t sync); + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/control.c b/User/meshcore/packets/control.c new file mode 100644 index 0000000..259f6e1 --- /dev/null +++ b/User/meshcore/packets/control.c @@ -0,0 +1,148 @@ +#include "lib/config.h" +#include "meshcore/meshframing.h" +#include "meshcore/packetstructs.h" +#include "control.h" +#include "meshcore/stats.h" +#include "string.h" +#include "util/hexdump.h" +#include "util/log.h" +#include + +#define TAG "Control" + +void sendDiscoverRequest (const DiscoverRequestPayload *discReq) { + + FrameStruct frame; + frame.path.pathLen = 0; + uint8_t offset = 0; + + // Build payload + frame.payload[offset++] = (discReq->prefixOnly & 0x01) | CONTROL_DATA_FLAG_TYPE_NODE_DISCOVER_REQ; + + frame.payload[offset++] = discReq->typeFilter; + + frame.payload[offset++] = (discReq->tag >> 0) & 0xFF; + frame.payload[offset++] = (discReq->tag >> 8) & 0xFF; + frame.payload[offset++] = (discReq->tag >> 16) & 0xFF; + frame.payload[offset++] = (discReq->tag >> 24) & 0xFF; + + // optional `since` + if (discReq->since != 0) { // or another condition if you want to always include + frame.payload[offset++] = (discReq->since >> 0) & 0xFF; + frame.payload[offset++] = (discReq->since >> 8) & 0xFF; + frame.payload[offset++] = (discReq->since >> 16) & 0xFF; + frame.payload[offset++] = (discReq->since >> 24) & 0xFF; + } + + frame.payloadLen = offset; + + LoRaTransmit (&frame); +} + +void sendDiscoverResponse (const DiscoverResponsePayload *discResp) { + FrameStruct frame; + frame.header = ROUTE_TYPE_DIRECT | PAYLOAD_TYPE_CONTROL | PAYLOAD_VERSION_0; + frame.path.pathLen = 0; + uint8_t offset = 0; + + /* Control type + node type (lower nibble) */ + frame.payload[offset++] = + (discResp->nodeType & 0x0F) | + CONTROL_DATA_FLAG_DISCOVER_RESP; + + /* SNR */ + frame.payload[offset++] = (uint8_t)discResp->snr; + + /* Tag (LE) */ + frame.payload[offset++] = (discResp->tag >> 0) & 0xFF; + frame.payload[offset++] = (discResp->tag >> 8) & 0xFF; + frame.payload[offset++] = (discResp->tag >> 16) & 0xFF; + frame.payload[offset++] = (discResp->tag >> 24) & 0xFF; + + /* Pubkey */ + if (discResp->pubkeyLen > 0) { + memcpy (&frame.payload[offset], + discResp->pubkey, + discResp->pubkeyLen); + offset += discResp->pubkeyLen; + } + + frame.payloadLen = offset; + + LoRaTransmit (&frame); +} + +void printDiscoverRequest (const DiscoverRequestPayload *p) { + iprintf ("=== Discover Request ===\n"); + iprintf ("prefixOnly : %u\n", p->prefixOnly); + iprintf ("typeFilter : 0x%02X\n", p->typeFilter); + iprintf ("tag : 0x%08lX\n", (unsigned long)p->tag); + iprintf ("since : 0x%08lX\n", (unsigned long)p->since); +} + +void printDiscoverResponse (const DiscoverResponsePayload *p) { + iprintf ("=== Discover Response ===\n"); + iprintf ("nodeType : %u\n", p->nodeType); + iprintf ("snr : %u\n", p->snr); + iprintf ("tag : 0x%08lX\n", (unsigned long)p->tag); + + hexdump ("pubkey : ", p->pubkey, p->pubkeyLen); + iprintf ("\n"); +} + +void decodeControlFrame (const FrameStruct *frame) { + uint8_t index = 0; + uint8_t type = frame->payload[index] & 0xF0; + if (type == CONTROL_DATA_FLAG_TYPE_NODE_DISCOVER_REQ) { + DiscoverRequestPayload discReq; + discReq.prefixOnly = frame->payload[index++] & 0x01; + + discReq.typeFilter = frame->payload[index++]; + + discReq.tag = frame->payload[index++]; + discReq.tag |= frame->payload[index++] << 8; + discReq.tag |= frame->payload[index++] << 16; + discReq.tag |= frame->payload[index++] << 24; + + if (index < frame->payloadLen) { + discReq.since = frame->payload[index++]; + discReq.since |= frame->payload[index++] << 8; + discReq.since |= frame->payload[index++] << 16; + discReq.since |= frame->payload[index++] << 24; + } + printDiscoverRequest (&discReq); + if ((discReq.typeFilter >> 1) & persistent.nodeType) { + DiscoverResponsePayload discResp; + + discResp.tag = discReq.tag; + discResp.nodeType = persistent.nodeType; + discResp.pubkeyLen = sizeof (persistent.pubkey); + memcpy (discResp.pubkey, persistent.pubkey, discResp.pubkeyLen); + discResp.snr = stats.lastSNR; // hopefully the correct one + + + MESH_LOGD (TAG, "Replying to a discover request with tag %d", discResp.tag); + sendDiscoverResponse (&discResp); + printDiscoverResponse (&discResp); + } + + } else if (type == CONTROL_DATA_FLAG_DISCOVER_RESP) { + DiscoverResponsePayload discResp; + discResp.nodeType = frame->payload[index++] & 0x0F; + + discResp.snr = frame->payload[index++]; + + discResp.tag = frame->payload[index++]; + discResp.tag |= frame->payload[index++] << 8; + discResp.tag |= frame->payload[index++] << 16; + discResp.tag |= frame->payload[index++] << 24; + + uint8_t remainingLen = frame->payloadLen - index; + + uint8_t pubKeyLen = (remainingLen > 8) ? sizeof (discResp.pubkey) : 8; + discResp.pubkeyLen = pubKeyLen; + memcpy (discResp.pubkey, &(frame->payload[index]), discResp.pubkeyLen); + index += pubKeyLen; + printDiscoverResponse (&discResp); + } +} \ No newline at end of file diff --git a/User/meshcore/packets/control.h b/User/meshcore/packets/control.h new file mode 100644 index 0000000..fdad2df --- /dev/null +++ b/User/meshcore/packets/control.h @@ -0,0 +1,16 @@ +#ifndef CONTROL_HEADER +#define CONTROL_HEADER + +#include "meshcore/packetstructs.h" + +void sendDiscoverRequest (const DiscoverRequestPayload *discReq); + +void sendDiscoverResponse (const DiscoverResponsePayload *discResp); + +void printDiscoverRequest (const DiscoverRequestPayload *p); + +void printDiscoverResponse (const DiscoverResponsePayload *p); + +void decodeControlFrame (const FrameStruct *frame); + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/custom.c b/User/meshcore/packets/custom.c new file mode 100644 index 0000000..c3a4ac3 --- /dev/null +++ b/User/meshcore/packets/custom.c @@ -0,0 +1,3 @@ +#include "meshcore/packetstructs.h" + +#define TAG "Custom" \ No newline at end of file diff --git a/User/meshcore/packets/custom.h b/User/meshcore/packets/custom.h new file mode 100644 index 0000000..6ef4d48 --- /dev/null +++ b/User/meshcore/packets/custom.h @@ -0,0 +1,5 @@ +#ifndef CUSTOM_HEADER +#define CUSTOM_HEADER + + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/encrypted.c b/User/meshcore/packets/encrypted.c new file mode 100644 index 0000000..9d0cc55 --- /dev/null +++ b/User/meshcore/packets/encrypted.c @@ -0,0 +1,837 @@ +#include "lib/config.h" +#include "ch32v30x.h" +#include "lib/telemetry/telemetry.h" +#include "meshcore/meshframing.h" +#include "meshcore/packets/ack.h" +#include "meshcore/packets/advert.h" +#include "meshcore/packetstructs.h" +#include "meshcore/stats.h" +#include "util/hexdump.h" +#include "util/log.h" +#include +#include +#include +#include "encrypted.h" +#include "lib/adc/temperature.h" +#include "lib/rtc/rtc.h" +#include "sx1262.h" + +#define TAG "EncryptedMessage" + +void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen) { + FrameStruct frame; + memset(&frame, 0, sizeof(frame)); + size_t offset = 0; + + // 1. Header + frame.header = + (targetNode->path.pathLen > 0 ? ROUTE_TYPE_DIRECT : ROUTE_TYPE_FLOOD) | // currently flood + payloadType | + PAYLOAD_VERSION_0; + + // 2. Destination + source + frame.payload[offset++] = targetNode->pubKey[0]; + frame.payload[offset++] = persistent.pubkey[0]; + + // 4. Encrypt + MAC + size_t encLen; + encrypt_then_mac ( + targetNode->secret, + 32, + plain, + plainLen, + frame.payload + offset, + &encLen); + + MESH_LOGD(TAG, "Plain len: %d, enc len: %d", plainLen, encLen); + + offset += encLen; + + // 5. Finalize + frame.payloadLen = offset; + memcpy (&frame.path, &targetNode->path, sizeof (frame.path)); + + hexdump ("Encrypted frame", frame.payload, frame.payloadLen); + LoRaTransmit (&frame); + MESH_LOGD (TAG, "Encrypted frame tx finish\n"); +} + +void sendEncryptedTextMessage (const NodeEntry *targetNode, const PlainTextMessagePayload *msg) { + if (targetNode == NULL) { + MESH_LOGW (TAG, "Node is null"); + return; + } + if (targetNode->last_seen_lt == 0) { + MESH_LOGW (TAG, "Node is not populated"); + return; + } + uint8_t buf[256]; + uint8_t index = 0; + + uint8_t msgLen = strlen (msg->message) + 1; + buf[index++] = msg->timestamp; + buf[index++] = msg->timestamp >> 8; + buf[index++] = msg->timestamp >> 16; + buf[index++] = msg->timestamp >> 24; + + buf[index++] = (msg->textType << 2) | (msg->attempt & 0x03); + memcpy (&buf[index], msg->message, msgLen); + index += msgLen; + + sendEncryptedFrame ( + targetNode, + PAYLOAD_TYPE_TXT_MSG, + buf, + index); +} + +void sendEncryptedResponse (const NodeEntry *targetNode, const Response *resp) { + uint8_t buf[256]; + uint8_t index = 0; + + buf[index++] = (resp->tag) & 0xFF; + buf[index++] = (resp->tag >> 8) & 0xFF; + buf[index++] = (resp->tag >> 16) & 0xFF; + buf[index++] = (resp->tag >> 24) & 0xFF; + + memcpy (&(buf[index]), resp->data, resp->dataLen); + index += resp->dataLen; + + sendEncryptedFrame ( + targetNode, + PAYLOAD_TYPE_RESPONSE, + buf, + index); +} + +void sendEncryptedRequest (const NodeEntry *targetNode, const Request *req) { + uint8_t buf[256]; + uint8_t index = 0; + + buf[index++] = req->timestamp; + buf[index++] = req->timestamp >> 8; + buf[index++] = req->timestamp >> 16; + buf[index++] = req->timestamp >> 24; + + buf[index++] = req->requestType; + memcpy (&(buf[index]), req->data, req->dataLen); + index += req->dataLen; + + sendEncryptedFrame ( + targetNode, + PAYLOAD_TYPE_REQ, + buf, + index); +} + +void sendEncryptedPathPayload (const NodeEntry *targetNode, const ReturnedPathPayload *path) { + uint8_t buf[256]; + uint8_t index = 0; + + buf[index++] = path->path.pathLen; + memcpy (&buf[index], path->path.path, path->path.pathLen); + index += path->path.pathLen; + + if (path->extra.dataLen > 0) { + buf[index++] = path->extra.type; + memcpy (&buf[index], path->extra.data, path->extra.dataLen); + } else { + buf[index++] = 0xFF; + uint32_t timestamp = RTC_GetCounter(); + buf[index++] = timestamp; + buf[index++] = timestamp >> 8; + buf[index++] = timestamp >> 16; + buf[index++] = timestamp >> 24; + } + + sendEncryptedFrame ( + targetNode, + PAYLOAD_TYPE_PATH, + buf, + index); +} + +void printRequest (const Request *req) { + iprintf ("Request:\n"); + iprintf (" Timestamp: %u\n", req->timestamp); + iprintf (" Type: 0x%02X\n", req->requestType); + iprintf (" Data: "); + hexdump (" Data", req->data, req->dataLen); +} + +void printResponse (const Response *resp) { + iprintf ("Response:\n"); + iprintf (" Tag: %u\n", resp->tag); + iprintf (" Data: "); + hexdump (" Data", resp->data, resp->dataLen); +} + +void printPlainTextMessage (const PlainTextMessagePayload *msg) { + iprintf ("PlainTextMessage:\n"); + iprintf (" Timestamp: %u\n", msg->timestamp); + iprintf (" Attempt: %u\n", msg->attempt); + iprintf (" TextType: %u\n", msg->textType); + iprintf (" Message: %.*s\n", (int)strlen (msg->message), msg->message); +} + +void printReturnedPathPayload (const ReturnedPathPayload *path) { + iprintf ("ReturnedPathPayload:\n"); + iprintf (" Path Length: %u\n", path->path.pathLen); + iprintf (" Path: "); + hexdump (" Path:", path->path.path, path->path.pathLen); + iprintf (" Extra Type: %u\n", path->extra.type); + iprintf (" Extra Data: "); + hexdump (" Extra data:", path->extra.data, path->extra.dataLen); +} + +void printEncryptedPayload (const EncryptedPayloadStruct *enc) { + iprintf ("EncryptedPayload:\n"); + iprintf (" Type: 0x%02X\n", enc->type); + iprintf (" DestinationHash: 0x%02X\n", enc->destinationHash); + iprintf (" SourceHash: 0x%02X\n", enc->sourceHash); + iprintf (" CipherMAC: 0x%04X\n", enc->cipherMAC); + iprintf (" PayloadLen: %zu\n", enc->payloadLen); + iprintf (" Payload: "); + for (size_t i = 0; i < enc->payloadLen; i++) { + iprintf ("%02X ", enc->payload[i]); + } + iprintf ("\n"); +} + +void decodeEncryptedPayload (const FrameStruct *frame) { + EncryptedPayloadStruct enc; + memset (&enc, 0, sizeof (enc)); + enc.path = &(frame->path); + enc.origFrame = frame; + enc.type = frame->header & PAYLOAD_TYPE_MASK; + unsigned char index = 0; + + enc.destinationHash = frame->payload[index++]; + enc.sourceHash = frame->payload[index++]; + enc.cipherMAC = frame->payload[index]; + enc.cipherMAC |= frame->payload[index + 1] << 8; + + if (enc.destinationHash != persistent.pubkey[0]) { + return; + } + + MESH_LOGI (TAG, "Finding remote node, sourceHash is %d", enc.sourceHash); + + NodeEntry *remNode = getNode (enc.sourceHash); + + enc.remNode = remNode; + + if (remNode == NULL) { + MESH_LOGW (TAG, "Node not in DB"); + return; + } + remNode->last_seen_lt = RTC_GetCounter(); + MESH_LOGI (TAG, "Found node with index %d", remNode - persistent.contacts); + + + if (mac_then_decrypt (remNode->secret, 32, &(frame->payload[index]), frame->payloadLen - index, enc.payload) != 0) { + MESH_LOGW (TAG, "HMAC failed on encrypted message %s", remNode->name); + } else { + enc.payloadLen = frame->payloadLen - HMAC_SIZE; + MESH_LOGI (TAG, "HMAC success from %s, %u bytes long", remNode->name, enc.payloadLen); + sendDiscreteAck (enc.payload, 5 + strlen ((char *)&enc.payload[5]), remNode->pubKey); + } + + iprintf (" Typexdd: 0x%02X\n", enc.type); + if (enc.payloadLen > 0) { + parseEncryptedPayload (&enc); + } +} + +void sendPathBack (const NodeEntry *node, const Path *path) { + ReturnedPathPayload retPath; + retPath.extra.dataLen = 0; // redo to send the resp in path + retPath.extra.type = 0xFF; + + retPath.path.pathLen = path->pathLen; + memcpy (retPath.path.path, path->path, path->pathLen); + + sendEncryptedPathPayload (node, &retPath); +} + +void parseEncryptedPayload (const EncryptedPayloadStruct *enc) { + // printEncryptedPayload(&enc); + + iprintf ("EncryptedPayload:\n"); + iprintf (" Type: 0x%02X\n", enc->type); + iprintf (" DestinationHash: 0x%02X\n", enc->destinationHash); + iprintf (" SourceHash: 0x%02X\n", enc->sourceHash); + iprintf (" CipherMAC: 0x%04X\n", enc->cipherMAC); + iprintf (" PayloadLen: %u\n", enc->payloadLen); + hexdump (" Payload: ", enc->payload, enc->payloadLen); + iprintf ("\n"); + + uint8_t index = 0; + if (enc->type == PAYLOAD_TYPE_PATH) { + ReturnedPathPayload retPath; + retPath.path.pathLen = enc->payload[index++]; + if (retPath.path.pathLen > 64) { + MESH_LOGW (TAG, "Path too long\n"); + return; + } + memcpy (retPath.path.path, &(enc->payload[index]), retPath.path.pathLen); + index += retPath.path.pathLen; + retPath.extra.type = enc->payload[index++]; + retPath.extra.dataLen = enc->payloadLen - index; + memcpy (retPath.extra.data, &(enc->payload[index]), retPath.extra.dataLen); + + if ((enc->origFrame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_FLOOD || + (enc->origFrame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + sendPathBack (enc->remNode, enc->path); + } + + } else if (enc->type == PAYLOAD_TYPE_REQ) { + Request req; + req.timestamp = enc->payload[index++]; + req.timestamp |= enc->payload[index++] << 8; + req.timestamp |= enc->payload[index++] << 16; + req.timestamp |= enc->payload[index++] << 24; + enc->remNode->last_seen_rt = req.timestamp; + req.requestType = enc->payload[index++]; + req.dataLen = enc->payloadLen - index; + memcpy (req.data, &(enc->payload[index]), req.dataLen); + printRequest (&req); + if ((enc->origFrame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_FLOOD || + (enc->origFrame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + sendPathBack (enc->remNode, enc->path); + } + switch (req.requestType) { + case REQUEST_GET_STATS: { + Response resp; + resp.tag = RTC_GetCounter(); + stats.totalUpTimeSeconds = RTC_GetCounter() - startupTime; + //stats.totalAirTimeSeconds = TICKS_TO_MS (tickAirtime / 1000); + stats.totalAirTimeSeconds = 0; + memcpy (resp.data, &stats, sizeof (stats)); + resp.dataLen = sizeof (stats); + sendEncryptedResponse (enc->remNode, &resp); + break; + } + case REQUEST_KEEPALIVE: + break; + case REQUEST_GET_TELEMETRY_DATA: { + Response resp; + resp.tag = req.timestamp; + enc->remNode->last_seen_rt = req.timestamp; + resp.dataLen = 0; + resp.data[resp.dataLen++] = TELEM_CHANNEL_SELF; + resp.data[resp.dataLen++] = LPP_TEMPERATURE; + + int16_t dataTemp = getDeciTemperature(); + + resp.data[resp.dataLen++] = (dataTemp >> 8) & 0xFF; + + resp.data[resp.dataLen++] = dataTemp & 0xFF; + + resp.data[resp.dataLen++] = TELEM_CHANNEL_SELF; + resp.data[resp.dataLen++] = LPP_VOLTAGE; + + int16_t dataVolt = stats.millivolts / 10; + + resp.data[resp.dataLen++] = (dataVolt >> 8) & 0xFF; + + resp.data[resp.dataLen++] = dataVolt & 0xFF; + + resp.data[resp.dataLen++] = 2; + resp.data[resp.dataLen++] = LPP_VOLTAGE; + + dataVolt = 1973; + + resp.data[resp.dataLen++] = (dataVolt >> 8) & 0xFF; + + resp.data[resp.dataLen++] = dataVolt & 0xFF; + + if (enc->remNode->authenticated) { + + resp.data[resp.dataLen++] = 2; // channel 2 + resp.data[resp.dataLen++] = LPP_TEMPERATURE; + + int16_t jokeTemp = 6942; + + resp.data[resp.dataLen++] = (jokeTemp >> 8) & 0xFF; + + resp.data[resp.dataLen++] = jokeTemp & 0xFF; + + + encode_gps (TELEM_CHANNEL_SELF, persistent.latitude, persistent.longitude, persistent.altitude, &(resp.data[resp.dataLen])); + // encode_gps(TELEM_CHANNEL_SELF, 48.1909f, 17.0303f, 234.0f, &(resp.data[resp.dataLen])); + + resp.dataLen += LPP_GPS_SIZE + 2; + } + + + sendEncryptedResponse (enc->remNode, &resp); + + iprintf ("Sent response, the temperature is %d decicelsius\n", dataTemp); + + break; + } + case REQUEST_GET_MIN_MAX_AVG: + break; + case REQUEST_GET_ACCESS_LIST: + break; + } + + } else if (enc->type == PAYLOAD_TYPE_RESPONSE) { + Response resp; + resp.tag = enc->payload[index++]; + resp.tag |= enc->payload[index++] << 8; + resp.tag |= enc->payload[index++] << 16; + resp.tag |= enc->payload[index++] << 24; + resp.dataLen = enc->payloadLen - index; + memcpy (resp.data, &(enc->payload[index]), resp.dataLen); + printResponse (&resp); + + } else if (enc->type == PAYLOAD_TYPE_TXT_MSG) { + PlainTextMessagePayload plaintext; + plaintext.timestamp = enc->payload[index++]; + plaintext.timestamp |= enc->payload[index++] << 8; + plaintext.timestamp |= enc->payload[index++] << 16; + plaintext.timestamp |= enc->payload[index++] << 24; + enc->remNode->last_seen_rt = plaintext.timestamp; + plaintext.attempt = enc->payload[index] & 0x03; + plaintext.textType = enc->payload[index++] >> 2; + memcpy (plaintext.message, &(enc->payload[index]), enc->payloadLen - index); + if ((enc->origFrame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_FLOOD || + (enc->origFrame->header & ROUTE_TYPE_MASK) == ROUTE_TYPE_TRANSPORT_FLOOD) { + sendPathBack (enc->remNode, enc->path); + } + switch (plaintext.textType) { + case TXT_TYPE_PLAIN: + iprintf ("Plaintext message from %s, attempt %d, timestamp %d: %s", enc->remNode->name, plaintext.attempt, plaintext.timestamp, plaintext.message); + break; + + case TXT_TYPE_CLI_DATA: + if (enc->remNode->authenticated) { + processCommand (plaintext.message, enc->remNode); + } + break; + + case TXT_TYPE_SIGNED_PLAIN: { + uint8_t senderPubKeyPrefix[4]; + memcpy (senderPubKeyPrefix, plaintext.message, sizeof (senderPubKeyPrefix)); + NodeEntry *senderNode = getNodePrefix (senderPubKeyPrefix); + iprintf ("Plaintext message from server %s, sender is %s, attempt %d, timestamp %d: %s", enc->remNode->name, senderNode->name, plaintext.attempt, plaintext.timestamp, &(plaintext.message[4])); + break; + } + + default: + MESH_LOGW (TAG, "Unknown text type: %d", plaintext.textType); + break; + } + } +} + +// #define STR_EQ_LIT(s, lit) (memcmp ((s), (lit), sizeof (lit) - 1) == 0) +#define STR_EQ_LIT(s, lit) (strcmp (s, lit) == 0) + +static int32_t parse_coord_micro(const char *s) +{ + int32_t sign = 1; + int32_t int_part = 0; + int32_t frac_part = 0; + int32_t frac_div = 1; + + if (*s == '-') { + sign = -1; + s++; + } + + // integer part + while (*s >= '0' && *s <= '9') { + int_part = int_part * 10 + (*s - '0'); + s++; + } + + if (*s == '.') { + s++; + while (*s >= '0' && *s <= '9' && frac_div < 1000000) { + frac_part = frac_part * 10 + (*s - '0'); + frac_div *= 10; + s++; + } + } + + // scale to microdegrees + while (frac_div < 1000000) { + frac_part *= 10; + frac_div *= 10; + } + + return sign * (int_part * 1000000 + frac_part); +} + +void processCommand (char *cmd, NodeEntry *remNode) { + PlainTextMessagePayload replyPayload; + replyPayload.timestamp = RTC_GetCounter(); + replyPayload.attempt = 0; + replyPayload.textType = TXT_TYPE_CLI_DATA; + + uint8_t *reply = replyPayload.message; + reply[0] = 0; + + while (*cmd == ' ') cmd++; // skip leading spaces + + // Optional CLI prefix (xx|) for companion radio + if (strlen (cmd) > 4 && cmd[2] == '|') { + memcpy (reply, cmd, 3); + reply += 3; + cmd += 3; + } + + /* ---------------- System ---------------- */ + if (STR_EQ_LIT (cmd, "reboot")) { + NVIC_SystemReset(); + } else if (STR_EQ_LIT (cmd, "advert")) { + sendAdvert (1); // 1500ms delay in reference + strcpy ((char *)reply, "OK - Advert sent"); + } else if (STR_EQ_LIT (cmd, "clear stats")) { + memset (&stats, 0, sizeof (stats)); + strcpy ((char *)reply, "(OK - stats reset)"); + } + + else if (STR_EQ_LIT (cmd, "ver")) { + sprintf ((char *)reply, "%s (Build: %s)", VERSION, __DATE__); + } + + else if (STR_EQ_LIT (cmd, "board")) { + sprintf ((char *)reply, "%s", BOARD); + } + + /* ---------------- Clock ---------------- */ + else if (STR_EQ_LIT (cmd, "clock")) { + RTC_Get(); + sprintf ((char *)reply, "%02d:%02d:%02d - %d/%d/%d UTC", + calendar.hour, calendar.min, calendar.sec, + calendar.w_date, calendar.w_month, calendar.w_year); + } else if (STR_EQ_LIT (cmd, "time ")) { + uint32_t secs = atoi (&cmd[5]); + uint32_t curr = RTC_GetCounter(); + if (secs > curr) { + RTC_SetCounter (secs); + RTC_Get(); + sprintf ((char *)reply, "OK - clock set: %02d:%02d:%02d - %d/%d/%d UTC", + calendar.hour, calendar.min, calendar.sec, + calendar.w_date, calendar.w_month, calendar.w_year); + } else { + strcpy ((char *)reply, "(ERR: clock cannot go backwards)"); + } + } else if (STR_EQ_LIT (cmd, "clock sync")) { + uint32_t curr = RTC_GetCounter(); + uint32_t sender = replyPayload.timestamp; + if (sender > curr) { + RTC_SetCounter (sender + 1); + RTC_Get(); + sprintf ((char *)reply, "OK - clock set: %02d:%02d:%02d - %d/%d/%d UTC", + calendar.hour, calendar.min, calendar.sec, + calendar.w_date, calendar.w_month, calendar.w_year); + } else { + strcpy ((char *)reply, "ERR: clock cannot go backwards"); + } + } + + /* + else if (STR_EQ_LIT (cmd, "tempradio ")) { + char tmp[64]; + strcpy (tmp, &cmd[10]); + + const char *parts[5]; + int num = mesh_ParseTextParts (tmp, parts, 5); // assume helper + float freq = num > 0 ? strtof (parts[0], NULL) : 0.0f; + float bw = num > 1 ? strtof (parts[1], NULL) : 0.0f; + uint8_t sf = num > 2 ? atoi (parts[2]) : 0; + uint8_t cr = num > 3 ? atoi (parts[3]) : 0; + int timeout_mins = num > 4 ? atoi (parts[4]) : 0; + if (freq >= 300.0f && freq <= 2500.0f && bw >= 7.0f && bw <= 500.0f && + sf >= 5 && sf <= 12 && cr >= 5 && cr <= 8 && timeout_mins > 0) { + Callbacks_ApplyTempRadioParams (freq, bw, sf, cr, timeout_mins); + + LoraApply(); + sprintf ((char *)reply, "OK - temp params for %d mins", timeout_mins); + } else { + strcpy ((char *)reply, "Error, invalid params"); + } + } + */ + + /* ---------------- Password ---------------- */ + else if (STR_EQ_LIT (cmd, "password ")) { + strncpy (persistent.password, &cmd[9], sizeof (persistent.password)); + // savePrefs(); TODO add this + sprintf ((char *)reply, "password now: %s", persistent.password); + } + + /* ---------------- GET / SET Config ---------------- */ + else if (STR_EQ_LIT (cmd, "get ")) { + const char *config = &cmd[4]; + +/* + if (memcmp (config, "af", 2) == 0) { + sprintf (reply, "> %f", persistent.airtimeFactor); + */ + /* + } else if (memcmp (config, "int.thresh", 10) == 0) { + sprintf (reply, "> %d", (uint32_t)_prefs->interference_threshold); + } else if (memcmp (config, "agc.reset.interval", 18) == 0) { + sprintf (reply, "> %d", ((uint32_t)_prefs->agc_reset_interval) * 4); + } else if (memcmp (config, "multi.acks", 10) == 0) { + sprintf (reply, "> %d", (uint32_t)_prefs->multi_acks); + } else if (memcmp (config, "allow.read.only", 15) == 0) { + sprintf (reply, "> %s", _prefs->allow_read_only ? "on" : "off"); + } else if (memcmp (config, "flood.advert.interval", 21) == 0) { + sprintf (reply, "> %d", (uint32_t)_prefs->flood_advert_interval); + } else if (memcmp (config, "advert.interval", 15) == 0) { + sprintf (reply, "> %d", ((uint32_t)_prefs->advert_interval) * 2);1 + */ + //} else + if (memcmp (config, "guest.password", 14) == 0) { + sprintf (reply, "> %s", persistent.guestPassword); + } else if (memcmp (config, "name", 4) == 0) { + sprintf (reply, "> %s", persistent.nodeName); + } else if (memcmp (config, "repeat", 6) == 0) { + sprintf (reply, "> %s", persistent.doRepeat ? "on" : "off"); + } else if (memcmp (config, "lat", 3) == 0) { + sprintf (reply, "> %d", persistent.latitude); + } else if (memcmp (config, "lon", 3) == 0) { + sprintf (reply, "> %d", persistent.longitude); + /* + } else if (memcmp (config, "radio", 5) == 0) { + char freq[16], bw[16]; + snprintf(freq, sizeof(freq), "%lf", persistent.frequencyInHz / 1000000.0); + snprintf(bw, sizeof(bw), "%lf", loraBwToFloat(persistent.bandwidth)); + sprintf (reply, "> %s,%s,%d,%d", freq, bw, persistent.spreadingFactor, persistent.codingRate + 4); + } else if (memcmp (config, "rxdelay", 7) == 0) { + sprintf (reply, "> %s", StrHelper::ftoa (_prefs->rx_delay_base)); + } else if (memcmp (config, "txdelay", 7) == 0) { + sprintf (reply, "> %s", StrHelper::ftoa (_prefs->tx_delay_factor)); + } else if (memcmp (config, "flood.max", 9) == 0) { + sprintf (reply, "> %d", (uint32_t)_prefs->flood_max); + } else if (memcmp (config, "direct.txdelay", 14) == 0) { + sprintf (reply, "> %s", StrHelper::ftoa (_prefs->direct_tx_delay_factor)); + } else if (memcmp (config, "tx", 2) == 0 && (config[2] == 0 || config[2] == ' ')) { + sprintf (reply, "> %d", (uint32_t)_prefs->tx_power_dbm); + } else if (memcmp (config, "freq", 4) == 0) { + sprintf (reply, "> %s", StrHelper::ftoa (_prefs->freq)); + */ + } else if (memcmp (config, "public.key", 10) == 0) { + strcpy (reply, "> "); + hexdump_compact (persistent.pubkey, sizeof (persistent.pubkey), &(reply[2]), 70); + } else if (memcmp (config, "role", 4) == 0) { + sprintf (reply, "> %s", getStringRole (persistent.nodeType)); + } else if (memcmp (config, "adc.multiplier", 14) == 0) { + sprintf (reply, "> %d.%d", persistent.adcMultiplier / 1000, persistent.adcMultiplier % 1000); + } else { + sprintf (reply, "??: %s", config); + } + + } else if (STR_EQ_LIT (cmd, "set ")) { + const char *config = &cmd[4]; + + +/* + if (memcmp (config, "af ", 3) == 0) { + persistent.airtimeFactor = atof (&config[3]); + // savePrefs(); + strcpy (reply, "OK"); + */ + /* + } else if (memcmp (config, "int.thresh ", 11) == 0) { + _prefs->interference_threshold = atoi (&config[11]); + // savePrefs(); + strcpy (reply, "OK"); + } else if (memcmp (config, "agc.reset.interval ", 19) == 0) { + _prefs->agc_reset_interval = atoi (&config[19]) / 4; + // savePrefs(); + sprintf (reply, "OK - interval rounded to %d", ((uint32_t)_prefs->agc_reset_interval) * 4); + } else if (memcmp (config, "multi.acks ", 11) == 0) { + _prefs->multi_acks = atoi (&config[11]); + // savePrefs(); + strcpy (reply, "OK"); + */ + //} else + if (memcmp (config, "allow.read.only ", 16) == 0) { + if (memcmp (&config[16], "on", 2) == 0) { + persistent.allowReadOnly = 1; + strcpy (reply, "OK"); + } else if (memcmp (&config[16], "off", 3) == 0) { + persistent.allowReadOnly = 0; + strcpy (reply, "OK"); + } + // savePrefs(); + /* + } else if (memcmp (config, "flood.advert.interval ", 22) == 0) { + int hours = _atoi (&config[22]); + if ((hours > 0 && hours < 3) || (hours > 48)) { + strcpy (reply, "Error: interval range is 3-48 hours"); + } else { + _prefs->flood_advert_interval = (uint8_t)hours; + _callbacks->updateFloodAdvertTimer(); + savePrefs(); + strcpy (reply, "OK"); + } + } else if (memcmp (config, "advert.interval ", 16) == 0) { + int mins = _atoi (&config[16]); + if ((mins > 0 && mins < MIN_LOCAL_ADVERT_INTERVAL) || (mins > 240)) { + sprintf (reply, "Error: interval range is %d-240 minutes", MIN_LOCAL_ADVERT_INTERVAL); + } else { + _prefs->advert_interval = (uint8_t)(mins / 2); + _callbacks->updateAdvertTimer(); + savePrefs(); + strcpy (reply, "OK"); + } + */ + } else if (memcmp (config, "guest.password ", 15) == 0) { + strncpy (persistent.guestPassword, &config[15], sizeof (persistent.guestPassword)); + // savePrefs(); + strcpy (reply, "OK"); + } else if (memcmp (config, "name ", 5) == 0) { + strncpy (persistent.nodeName, &config[5], sizeof (persistent.nodeName)); + // savePrefs(); + strcpy (reply, "OK"); + } else if (memcmp (config, "repeat ", 7) == 0) { + if (memcmp (&config[7], "off", 3) == 0) { + persistent.doRepeat = 0; + } else if (memcmp (&config[7], "on", 2) == 0) { + persistent.doRepeat = 1; + } + // savePrefs(); + strcpy (reply, persistent.doRepeat ? "OK - repeat is now ON" : "OK - repeat is now OFF"); + /* + } else if (memcmp (config, "radio ", 6) == 0) { + strcpy (tmp, &config[6]); + const char *parts[4]; + int num = mesh::Utils::parseTextParts (tmp, parts, 4); + float freq = num > 0 ? strtof (parts[0], 0) : 0.0f; + float bw = num > 1 ? strtof (parts[1], 0) : 0.0f; + uint8_t sf = num > 2 ? atoi (parts[2]) : 0; + uint8_t cr = num > 3 ? atoi (parts[3]) : 0; + if (freq >= 300.0f && freq <= 2500.0f && sf >= 5 && sf <= 12 && cr >= 5 && cr <= 8 && bw >= 7.0f && bw <= 500.0f) { + _prefs->sf = sf; + _prefs->cr = cr; + _prefs->freq = freq; + _prefs->bw = bw; + _callbacks->savePrefs(); + strcpy (reply, "OK - reboot to apply"); + } else { + strcpy (reply, "Error, invalid radio params"); + } + */ + } else if (memcmp (config, "lat ", 4) == 0) { + persistent.latitude = parse_coord_micro(&config[4]); + // savePrefs(); + strcpy (reply, "OK"); + } else if (memcmp (config, "lon ", 4) == 0) { + persistent.longitude = parse_coord_micro(&config[4]); + // savePrefs(); + strcpy (reply, "OK"); + /* + } else if (memcmp (config, "rxdelay ", 8) == 0) { + float db = atof (&config[8]); + if (db >= 0) { + _prefs->rx_delay_base = db; + savePrefs(); + strcpy (reply, "OK"); + } else { + strcpy (reply, "Error, cannot be negative"); + } + } else if (memcmp (config, "txdelay ", 8) == 0) { + float f = atof (&config[8]); + if (f >= 0) { + _prefs->tx_delay_factor = f; + savePrefs(); + strcpy (reply, "OK"); + } else { + strcpy (reply, "Error, cannot be negative"); + } + } else if (memcmp (config, "flood.max ", 10) == 0) { + uint8_t m = atoi (&config[10]); + if (m <= 64) { + _prefs->flood_max = m; + savePrefs(); + strcpy (reply, "OK"); + } else { + strcpy (reply, "Error, max 64"); + } + } else if (memcmp (config, "direct.txdelay ", 15) == 0) { + float f = atof (&config[15]); + if (f >= 0) { + _prefs->direct_tx_delay_factor = f; + savePrefs(); + strcpy (reply, "OK"); + } else { + strcpy (reply, "Error, cannot be negative"); + } + } else if (memcmp (config, "tx ", 3) == 0) { + _prefs->tx_power_dbm = atoi (&config[3]); + savePrefs(); + _callbacks->setTxPower (_prefs->tx_power_dbm); + strcpy (reply, "OK"); + */ + /* + } else if (memcmp (config, "freq ", 5) == 0) { + double freq = atof (&config[5]); + uint32_t newFreq = mhzToHzLimited (persistent.loraSettings.frequencyInHz); + if (newFreq != 0) { + persistent.loraSettings.frequencyInHz = newFreq; + } + // savePrefs(); + strcpy (reply, "OK - reboot to apply"); + */ + /* + } else if (memcmp (config, "adc.multiplier ", 15) == 0) { + persistent.adcMultiplier = atof (&config[15]); + if (persistent.adcMultiplier == 0.0f) { + strcpy (reply, "OK - using default board multiplier"); + } else { + sprintf (reply, "OK - multiplier set to %.3f", persistent.adcMultiplier); + } + // savePrefs(); + */ + } else { + sprintf (reply, "unknown config: %s", config); + } + } + + + /* ---------------- Stats ---------------- */ + else if (STR_EQ_LIT (cmd, "stats-packets")) { + sprintf (reply, + "{\"recv\":%u,\"sent\":%u,\"flood_tx\":%u,\"direct_tx\":%u,\"flood_rx\":%u,\"direct_rx\":%u}", + stats.packetsReceivedCount, + stats.packetsSentCount, + stats.sentFloodCount, + stats.sentDirectCount, + stats.receivedFloodCount, + stats.receivedDirectCount); + } else if (STR_EQ_LIT (cmd, "stats-radio")) { + sprintf (reply, + "{\"noise_floor\":%d,\"last_rssi\":%d,\"last_snr\":%d.00,\"tx_air_secs\":%u,\"rx_air_secs\":%u}", + stats.noiseFloor, + stats.lastRSSI, + stats.lastSNR / 4, + stats.totalAirTimeSeconds, + stats.total_rx_air_time_secs); + } else if (STR_EQ_LIT (cmd, "stats-core")) { + stats.totalUpTimeSeconds = RTC_GetCounter() - startupTime; + //stats.totalAirTimeSeconds = TICKS_TO_MS (tickAirtime / 1000); + stats.totalAirTimeSeconds = 0; + sprintf (reply, + "{\"battery_mv\":%u,\"uptime_secs\":%u,\"errors\":%u,\"queue_len\":%u}", + getVoltage(), + stats.totalUpTimeSeconds, + stats.err_events, + stats.txQueueLength); + } + + /* ---------------- Unknown ---------------- */ + else { + strcpy ((char *)reply, "Unknown command"); + } + + sendEncryptedTextMessage (remNode, &replyPayload); +} diff --git a/User/meshcore/packets/encrypted.h b/User/meshcore/packets/encrypted.h new file mode 100644 index 0000000..076d76c --- /dev/null +++ b/User/meshcore/packets/encrypted.h @@ -0,0 +1,30 @@ +#ifndef ENCRYPTED_HEADER +#define ENCRYPTED_HEADER + +#include "lib/config.h" +#include "meshcore/meshframing.h" +#include "meshcore/packetstructs.h" +#include "util/log.h" +#include + +#define MIN_LOCAL_ADVERT_INTERVAL 60 + +void sendEncryptedFrame (const NodeEntry *targetNode, uint8_t payloadType, const uint8_t *plain, size_t plainLen); + +void sendEncryptedTextMessage (const NodeEntry *targetNode, const PlainTextMessagePayload *msg); + +void sendEncryptedResponse (const NodeEntry *targetNode, const Response *resp); + +void sendEncryptedRequest (const NodeEntry *targetNode, const Request *req); + +void sendEncryptedPathPayload (const NodeEntry *targetNode, const ReturnedPathPayload *path); + +void decodeEncryptedPayload (const FrameStruct *frame); + +void parseEncryptedPayload (const EncryptedPayloadStruct *enc); + +void processCommand(char * cmd, NodeEntry * remNode); + +void sendPathBack (const NodeEntry *node, const Path *path); + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/group.c b/User/meshcore/packets/group.c new file mode 100644 index 0000000..f49bea2 --- /dev/null +++ b/User/meshcore/packets/group.c @@ -0,0 +1,107 @@ +#include "ch32v30x_rtc.h" +#include "meshcore/meshframing.h" +#include "meshcore/packetstructs.h" +#include "group.h" +#include "lib/config.h" +#include "util/hexdump.h" +#include "util/log.h" +#include "string.h" + +#define TAG "GroupMessage" + +void sendGroupMessage (const GroupTextMessage *msg) { + // Prepare values locally instead of modifying msg + Channel *channel = &(persistent.channels[msg->keyIndex]); + uint8_t flags = 0; + int32_t timestamp = RTC_GetCounter(); + + FrameStruct frame; + frame.header = ROUTE_TYPE_FLOOD | PAYLOAD_TYPE_GRP_TXT | PAYLOAD_VERSION_0; + frame.path.pathLen = 0; + size_t offset = 0; + frame.payload[offset++] = channel->hash; + + // Build encryption buffer directly on stack (no extra large buffer) + uint8_t buf[180]; // enough for timestamp + flags + text + size_t buf_offset = 0; + + memcpy (buf + buf_offset, ×tamp, sizeof (timestamp)); + buf_offset += sizeof (timestamp); + + buf[buf_offset++] = flags; + + size_t textLen = strlen ((const char *)msg->text); + if (buf_offset + textLen > sizeof (buf)) { + textLen = sizeof (buf) - buf_offset; + } + memcpy (buf + buf_offset, msg->text, textLen); + buf_offset += textLen; + + hexdump ("TxDumpDec", buf, buf_offset); + + // Encrypt and MAC directly into frame payload after channelHash + size_t olen = 0; + + encrypt_then_mac (channel->key, 16, buf, buf_offset, &frame.payload[offset], &olen); + + frame.payloadLen = olen + 1; // +1 for channelHash + + channel->timestamp = timestamp; + + LoRaTransmit (&frame); +} + +void makeSendGroupMessage (char *txt, uint8_t keyIndex) { + GroupTextMessage msg; + strcpy ((char *)msg.text, persistent.nodeName); + strcat ((char *)msg.text, ": "); + strcat ((char *)msg.text, txt); + msg.keyIndex = keyIndex; + sendGroupMessage (&msg); + return; +} + +void decodeGroupMessage (const FrameStruct *frame) { + GroupTextMessage msg; + memset (&msg, 0, sizeof (msg)); + if ((frame->header & PAYLOAD_TYPE_MASK) != PAYLOAD_TYPE_GRP_TXT) { + MESH_LOGW (TAG, "Not a group text"); + return; + } + unsigned char index = 0; + msg.channelHash = frame->payload[index++]; + unsigned char tmp[184]; + + + Channel *channel = NULL; + + uint8_t i = 0; + do { + channel = getChannel (msg.channelHash, i); + if (channel == NULL) { + MESH_LOGW (TAG, "Channel hash %d not found", msg.channelHash); + return; + } + if (mac_then_decrypt (channel->key, 16, frame->payload + index, frame->payloadLen - index, tmp) != 0) { + MESH_LOGW (TAG, "HMAC failed on grouphash key %d", msg.channelHash); + i++; + continue; + } else { + unsigned char plaintextLen = frame->payloadLen - index; + index = 0; + + memcpy (&msg.timestamp, tmp + index, 4); + index += 4; + msg.flags = tmp[index++]; + + memcpy (msg.text, tmp + index, plaintextLen - index); + + channel->timestamp = RTC_GetCounter(); + + iprintf ("Message from channel %s: %s\n", channel->name, msg.text); + break; + } + + + } while (channel != NULL); +} \ No newline at end of file diff --git a/User/meshcore/packets/group.h b/User/meshcore/packets/group.h new file mode 100644 index 0000000..befd673 --- /dev/null +++ b/User/meshcore/packets/group.h @@ -0,0 +1,13 @@ +#ifndef GROUP_HEADER +#define GROUP_HEADER + +#include "stdint.h" +#include "meshcore/packetstructs.h" + +void sendGroupMessage (const GroupTextMessage *msg); + +void makeSendGroupMessage (char *txt, uint8_t keyIndex); + +void decodeGroupMessage (const FrameStruct *frame); + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/multipart.c b/User/meshcore/packets/multipart.c new file mode 100644 index 0000000..a17fc5d --- /dev/null +++ b/User/meshcore/packets/multipart.c @@ -0,0 +1,4 @@ +#include "meshcore/packetstructs.h" +#include "multipart.h" + +#define TAG "Multipart" \ No newline at end of file diff --git a/User/meshcore/packets/multipart.h b/User/meshcore/packets/multipart.h new file mode 100644 index 0000000..21437d4 --- /dev/null +++ b/User/meshcore/packets/multipart.h @@ -0,0 +1,4 @@ +#ifndef MULTIPART_HEADER +#define MULTIPART_HEADER + +#endif \ No newline at end of file diff --git a/User/meshcore/packets/trace.c b/User/meshcore/packets/trace.c new file mode 100644 index 0000000..07c11ee --- /dev/null +++ b/User/meshcore/packets/trace.c @@ -0,0 +1,4 @@ +#include "meshcore/packetstructs.h" +#include "trace.h" + +#define TAG "Trace" \ No newline at end of file diff --git a/User/meshcore/packets/trace.h b/User/meshcore/packets/trace.h new file mode 100644 index 0000000..caccf6a --- /dev/null +++ b/User/meshcore/packets/trace.h @@ -0,0 +1,5 @@ +#ifndef TRACE_HEADER +#define TRACE_HEADER + + +#endif \ No newline at end of file diff --git a/User/meshcore/packetstructs.h b/User/meshcore/packetstructs.h new file mode 100644 index 0000000..4a421be --- /dev/null +++ b/User/meshcore/packetstructs.h @@ -0,0 +1,248 @@ +#ifndef PACKETSTRUCTS_FILE +#define PACKETSTRUCTS_FILE + +#include +#include "stddef.h" +#define ROUTE_TYPE_MASK 0x03 +#define PAYLOAD_TYPE_MASK 0x3C +#define PAYLOAD_VERSION_MASK 0xC0 + +#define DONT_RETRANSMIT_HEADER 0xFF + +#define RESP_SERVER_LOGIN_OK 0 + +#define FIRMWARE_VER_LEVEL 1 + +#define PERM_ACL_ROLE_MASK 3 // lower 2 bits +#define PERM_ACL_GUEST 0 +#define PERM_ACL_READ_ONLY 1 +#define PERM_ACL_READ_WRITE 2 +#define PERM_ACL_ADMIN 3 + +#define NODE_ENTRY_FAV_FLAG (1 << 0) + + +#define MAX_PATH_LEN 64 + + +#define TXT_TYPE_PLAIN 0 // a plain text message +#define TXT_TYPE_CLI_DATA 1 // a CLI command +#define TXT_TYPE_SIGNED_PLAIN 2 // plain text, signed by sender + +typedef enum RouteType { + ROUTE_TYPE_TRANSPORT_FLOOD = 0x00, + ROUTE_TYPE_FLOOD = 0x01, + ROUTE_TYPE_DIRECT = 0x02, + ROUTE_TYPE_TRANSPORT_DIRECT = 0x03, +} RouteType; + +typedef enum PayloadType { + PAYLOAD_TYPE_REQ = 0x00 << 2, + PAYLOAD_TYPE_RESPONSE = 0x01 << 2, + PAYLOAD_TYPE_TXT_MSG = 0x02 << 2, + PAYLOAD_TYPE_ACK = 0x03 << 2, + PAYLOAD_TYPE_ADVERT = 0x04 << 2, + PAYLOAD_TYPE_GRP_TXT = 0x05 << 2, + PAYLOAD_TYPE_GRP_DATA = 0x06 << 2, + PAYLOAD_TYPE_ANON_REQ = 0x07 << 2, + PAYLOAD_TYPE_PATH = 0x08 << 2, + PAYLOAD_TYPE_TRACE = 0x09 << 2, + PAYLOAD_TYPE_MULTIPART = 0x0A << 2, + PAYLOAD_TYPE_CONTROL = 0x0B << 2, + PAYLOAD_TYPE_RAW_CUSTOM = 0x0F << 2, +} PayloadType; + +typedef struct DiscoverRequestPayload { + uint8_t prefixOnly; + uint8_t typeFilter; + uint32_t tag; + uint32_t since; +} DiscoverRequestPayload; + +typedef struct DiscoverResponsePayload { + uint8_t nodeType; + int8_t snr; + uint32_t tag; + uint8_t pubkey[32]; + uint8_t pubkeyLen; +} DiscoverResponsePayload; + +typedef struct AnonymousRequestPayload { + uint8_t destinationHash; + uint8_t pubKey[32]; + uint16_t cipherMAC; + uint8_t payloadLen; + uint8_t payload[149]; +} AnonymousRequestPayload; + +typedef enum PayloadVersion { + PAYLOAD_VERSION_0 = 0 << 6, + PAYLOAD_VERSION_1 = 1 << 6, + PAYLOAD_VERSION_2 = 2 << 6, + PAYLOAD_VERSION_3 = 3 << 6, +} PayloadVersion; + +typedef struct Path { + uint8_t pathLen; + uint8_t path[MAX_PATH_LEN]; +} Path; + +typedef struct FrameStruct { + uint8_t header; + uint8_t transportCodes[4]; + Path path; + size_t payloadLen; + uint8_t payload[184]; +} FrameStruct; + +typedef enum RequestType { + REQUEST_GET_STATS = 0x01, + REQUEST_KEEPALIVE = 0x02, + REQUEST_GET_TELEMETRY_DATA = 0x03, + REQUEST_GET_MIN_MAX_AVG = 0x04, + REQUEST_GET_ACCESS_LIST = 0x05, +} RequestType; + +typedef struct Request { + uint32_t timestamp; + uint8_t requestType; + uint8_t dataLen; + uint8_t data[180]; // hopefully correct len +} Request; + +typedef struct Response { + uint32_t tag; // sender timestamp + uint8_t dataLen; + uint8_t data[180]; // hopefully correct len +} Response; + +typedef struct Node { + uint8_t pubKey[32]; + char name[32]; + int32_t latitude; + int32_t longitude; + int32_t lastSeen; + char flags; +} Node; + +typedef struct { + char name[32]; + unsigned char pubKey[32]; + unsigned char secret[32]; + + int32_t gps_latitude; + int32_t gps_longitude; + + Path path; + + uint8_t flags; + uint8_t type; + + uint8_t authenticated; + + uint32_t last_seen_rt; // remote timestamp + uint32_t last_seen_lt; // local timestamp + + uint32_t sync_timestamp; +} NodeEntry; + +typedef struct EncryptedPayloadStruct { + uint8_t destinationHash; + uint8_t sourceHash; + uint16_t cipherMAC; + uint8_t payloadLen; + uint8_t payload[180]; + uint8_t type; + NodeEntry *remNode; + const Path *path; + const FrameStruct *origFrame; +} EncryptedPayloadStruct; + +typedef enum NodeType { + NODE_TYPE_CHAT_NODE = 1, + NODE_TYPE_REPEATER = 2, + NODE_TYPE_ROOM_SERVER = 3, + NODE_TYPE_SENSOR = 4 +} NodeType; + +typedef enum ControlDataFlags { + CONTROL_DATA_FLAG_TYPE_NODE_DISCOVER_REQ = 0x80, + CONTROL_DATA_FLAG_DISCOVER_RESP = 0x90 +} ControlDataFlags; + +typedef enum AdvertisementPayloadFlags { + ADVERTISEMENT_FLAG_IS_CHAT_NODE = 0x01, + ADVERTISEMENT_FLAG_IS_REAPEATER = 0x02, + ADVERTISEMENT_FLAG_IS_ROOM_SERVER = 0x03, + ADVERTISEMENT_FLAG_IS_SENSOR = 0x04, + ADVERTISEMENT_FLAG_HAS_LOCATION = 0x10, + ADVERTISEMENT_FLAG_RFU1 = 0x20, + ADVERTISEMENT_FLAG_RFU2 = 0x40, + ADVERTISEMENT_FLAG_HAS_NAME = 0x80, +} AdvertisementPayloadFlags; + +typedef struct AdvertisementPayload { + uint8_t pubKey[32]; + int32_t timestamp; + uint8_t signature[64]; + uint8_t valid; + uint8_t dataFlags; + int32_t latitude; + int32_t longitude; + int16_t rfu1; + int16_t rfu2; + char nodeName[32]; + +} AdvertisementPayload; + +typedef struct Extra { + uint8_t type; + uint8_t dataLen; + uint8_t data[180]; // hopefully long enough +} Extra; + +typedef struct ReturnedPathPayload { + Path path; + Extra extra; +} ReturnedPathPayload; + +typedef struct PlainTextMessagePayload { + uint32_t timestamp; + uint8_t textType; + uint8_t attempt; + uint8_t message[180]; // hopefully long enough +} PlainTextMessagePayload; + +typedef struct GroupTextMessage { + uint8_t channelHash; + uint8_t keyIndex; + int32_t timestamp; + uint8_t flags; + uint8_t text[190]; +} GroupTextMessage; + +typedef struct RepeaterStats { + uint16_t millivolts; + uint16_t txQueueLength; + int16_t noiseFloor; + int16_t lastRSSI; + uint32_t packetsReceivedCount; + uint32_t packetsSentCount; + uint32_t totalAirTimeSeconds; + uint32_t totalUpTimeSeconds; + uint32_t sentFloodCount, sentDirectCount; + uint32_t receivedFloodCount, receivedDirectCount; + uint16_t err_events; // was 'n_full_events' + int16_t lastSNR; // x 4 + uint16_t n_direct_dups, n_flood_dups; + uint32_t total_rx_air_time_secs; +} RepeaterStats; + +typedef struct Channel { + char name[32]; + uint8_t key[16]; + uint8_t hash; + int32_t timestamp; +} Channel; + +#endif diff --git a/User/meshcore/stats.c b/User/meshcore/stats.c new file mode 100644 index 0000000..44f0ad5 --- /dev/null +++ b/User/meshcore/stats.c @@ -0,0 +1,6 @@ +#include "stats.h" + +RepeaterStats stats; + +uint32_t startupTime = 0; +uint32_t tickAirtime = 0; \ No newline at end of file diff --git a/User/meshcore/stats.h b/User/meshcore/stats.h new file mode 100644 index 0000000..6d30224 --- /dev/null +++ b/User/meshcore/stats.h @@ -0,0 +1,11 @@ +#ifndef STATS_HEADER +#define STATS_HEADER +#include "meshcore/packetstructs.h" + +extern RepeaterStats stats; + +extern uint32_t startupTime; + +extern uint32_t tickAirtime; + +#endif \ No newline at end of file diff --git a/User/sx1262.c b/User/sx1262.c new file mode 100644 index 0000000..8829bb2 --- /dev/null +++ b/User/sx1262.c @@ -0,0 +1,991 @@ +#include +#include +#include +#include + +#include "sx1262.h" +#include "ch32v30x_gpio.h" +#include "util/log.h" +#define TAG "SX1262" + +// Global Stuff +uint8_t PacketParams[6]; +char txActive; +int txLost = 0; +char debugPrint; + +// Arduino compatible macros +#define delayMicroseconds(us) esp_rom_delay_us (us) +#define delay(ms) esp_rom_delay_us (ms * 1000) + +void LoRaError (int error) { + if (debugPrint) { + MESH_LOGE (TAG, "LoRaErrorDefault=%d", error); + } + while (1) { + iprintf("GONE WRONG\n"); + Delay_Ms(1); + } +} + +/* +// Convert bandwidth constant to float in kHz +float loraBwToFloat(uint8_t bw) { + switch (bw) { + case SX126X_LORA_BW_7_8: return 7.8f; + case SX126X_LORA_BW_10_4: return 10.4f; + case SX126X_LORA_BW_15_6: return 15.6f; + case SX126X_LORA_BW_20_8: return 20.8f; + case SX126X_LORA_BW_31_25: return 31.25f; + case SX126X_LORA_BW_41_7: return 41.7f; + case SX126X_LORA_BW_62_5: return 62.5f; + case SX126X_LORA_BW_125_0: return 125.0f; + case SX126X_LORA_BW_250_0: return 250.0f; + case SX126X_LORA_BW_500_0: return 500.0f; + default: return 0.0f; // unknown + } +} +*/ + +/* +// Convert float bandwidth (kHz) to constant +uint8_t floatToLoraBw(float bw) { + if (bw == 7.8f) return SX126X_LORA_BW_7_8; + if (bw == 10.4f) return SX126X_LORA_BW_10_4; + if (bw == 15.6f) return SX126X_LORA_BW_15_6; + if (bw == 20.8f) return SX126X_LORA_BW_20_8; + if (bw == 31.25f) return SX126X_LORA_BW_31_25; + if (bw == 41.7f) return SX126X_LORA_BW_41_7; + if (bw == 62.5f) return SX126X_LORA_BW_62_5; + if (bw == 125.0f) return SX126X_LORA_BW_125_0; + if (bw == 250.0f) return SX126X_LORA_BW_250_0; + if (bw == 500.0f) return SX126X_LORA_BW_500_0; + return 0xFF; // invalid +} +*/ +/* +// Convert coding rate constant to float +float loraCrToFloat(uint8_t cr) { + switch (cr) { + case SX126X_LORA_CR_4_5: return 4.0f / 5.0f; + case SX126X_LORA_CR_4_6: return 4.0f / 6.0f; + case SX126X_LORA_CR_4_7: return 4.0f / 7.0f; + case SX126X_LORA_CR_4_8: return 4.0f / 8.0f; + default: return 0.0f; + } +} +*/ + +/* + +// Convert float coding rate to constant +uint8_t floatToLoraCr(float cr) { + if (cr == 4.0f / 5.0f) return SX126X_LORA_CR_4_5; + if (cr == 4.0f / 6.0f) return SX126X_LORA_CR_4_6; + if (cr == 4.0f / 7.0f) return SX126X_LORA_CR_4_7; + if (cr == 4.0f / 8.0f) return SX126X_LORA_CR_4_8; + return 0xFF; +} +*/ +/* +// Convert MHz to Hz with limit check +uint32_t mhzToHzLimited(double freqMHz) { + double freqHz = freqMHz * 1000000.0; + if (freqHz > 860000000.0 && freqHz < 880000000.0) { + return (uint32_t)freqHz; + } + return 0; // out of range +} +*/ + +void LoRaInit (void) { + + txActive = 0; + debugPrint = 0; + + GPIO_InitTypeDef GPIO_InitStructure = {0}; + SPI_InitTypeDef SPI_InitStructure = {0}; + + + // RCC_AHBPeriphClockCmd (RCC_AHBPeriph_SDIO, ENABLE); + RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2 | RCC_APB1Periph_I2C2, ENABLE); + + RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE | RCC_APB2Periph_SPI1, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init (GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init (GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init (GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init (GPIOA, &GPIO_InitStructure); + + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init (GPIOE, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init (GPIOE, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init (GPIOE, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init (GPIOE, &GPIO_InitStructure); + + + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + + + SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; + SPI_Init (SPI1, &SPI_InitStructure); + + GPIO_WriteBit (GPIOE, GPIO_Pin_3, 1); + + SPI_Cmd (SPI1, ENABLE); +} + +void spi_write_byte (uint8_t *DataOut, size_t DataLength) { + spi_read_byte (NULL, DataOut, DataLength); +} + +// Full-duplex transfer: TX and RX buffers +void spi_read_byte (uint8_t *rx, const uint8_t *tx, size_t len) { + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 0); + for (size_t i = 0; i < len; i++) { + uint8_t out = tx ? tx[i] : 0xFF; + + // Wait TX ready + while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET); + if (debugPrint) { + MESH_LOGV (TAG, "Sent %02X over spi.\n", out); + } + SPI_I2S_SendData (SPI1, out); + // Wait RX ready + + while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE) == RESET); + + uint8_t in = (uint8_t)SPI_I2S_ReceiveData (SPI1); + if (debugPrint) { + MESH_LOGV (TAG, "Got %02X over spi.\n", in); + } + if (rx) + rx[i] = in; + } + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 1); +} + +// Full-duplex transfer: TX and RX buffers +void spi_read_byte_offs (uint8_t *rx, const uint8_t *tx, size_t len, uint8_t off) { + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 0); + for (size_t i = 0; i < len; i++) { + uint8_t out = 0xFF; + if (i < off) { + out = tx ? tx[i] : 0xFF; + } + + // Wait TX ready + while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_TXE) == RESET); + if (debugPrint) { + MESH_LOGV (TAG, "Sent %02X over spi.\n", out); + } + SPI_I2S_SendData (SPI1, out); + // Wait RX ready + + while (SPI_I2S_GetFlagStatus (SPI1, SPI_I2S_FLAG_RXNE) == RESET); + + uint8_t in = (uint8_t)SPI_I2S_ReceiveData (SPI1); + if (debugPrint) { + MESH_LOGV (TAG, "Got %02X over spi.\n", in); + } + if (rx && i >= off) { + rx[i - off] = in; + } + } + GPIO_WriteBit (GPIOA, GPIO_Pin_4, 1); +} + +int16_t LoRaBegin (uint32_t frequencyInHz, int8_t txPowerInDbm, uint16_t tcxoVoltage, char useRegulatorLDO) { + if (txPowerInDbm > 22) { + txPowerInDbm = 22; + } + if (txPowerInDbm < -3) { + txPowerInDbm = -3; + } + + ResetLora(); + + uint8_t wk[2]; + ReadRegister (SX126X_REG_LORA_SYNC_WORD_MSB, wk, 2); // 0x0740 + uint16_t syncWord = (wk[0] << 8) + wk[1]; + MESH_LOGI (TAG, "syncWord=0x%x", syncWord); + if (syncWord != SX126X_SYNC_WORD_PUBLIC && syncWord != SX126X_SYNC_WORD_PRIVATE) { + MESH_LOGE (TAG, "SX126x error, maybe no SPI connection"); + return ERR_INVALID_MODE; + } + + MESH_LOGI (TAG, "SX126x installed"); + SetStandby (SX126X_STANDBY_RC); + + SetDio2AsRfSwitchCtrl (1); + //MESH_LOGI (TAG, "tcxoVoltage=%f", tcxoVoltage); + // set TCXO control, if requested + if (tcxoVoltage > 0) { + SetDio3AsTcxoCtrl (tcxoVoltage, RADIO_TCXO_SETUP_TIME); // Configure the radio to use a TCXO controlled by DIO3 + } + + Calibrate (SX126X_CALIBRATE_IMAGE_ON | SX126X_CALIBRATE_ADC_BULK_P_ON | SX126X_CALIBRATE_ADC_BULK_N_ON | SX126X_CALIBRATE_ADC_PULSE_ON | SX126X_CALIBRATE_PLL_ON | SX126X_CALIBRATE_RC13M_ON | SX126X_CALIBRATE_RC64K_ON); + + MESH_LOGI (TAG, "useRegulatorLDO=%d", useRegulatorLDO); + if (useRegulatorLDO) { + SetRegulatorMode (SX126X_REGULATOR_LDO); // set regulator mode: LDO + } else { + SetRegulatorMode (SX126X_REGULATOR_DC_DC); // set regulator mode: DC-DC + } + + SetBufferBaseAddress (0, 0); + SetPaConfig (0x04, 0x07, 0x00, 0x01); // PA Optimal Settings +22 dBm + SetOvercurrentProtection (60); // current max 60mA for the whole device + SetPowerConfig (txPowerInDbm, SX126X_PA_RAMP_200U); // 0 fuer Empfaenger + SetRfFrequency (frequencyInHz); + return ERR_NONE; +} + +void FixInvertedIQ (uint8_t iqConfig) { + // fixes IQ configuration for inverted IQ + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.4 for details + // When exchanging LoRa packets with inverted IQ polarity, some packet losses may be observed for longer packets. + // Workaround: Bit 2 at address 0x0736 must be set to: + // “0†when using inverted IQ polarity (see the SetPacketParam(...) command) + // “1†when using standard IQ polarity + + // read current IQ configuration + uint8_t iqConfigCurrent = 0; + ReadRegister (SX126X_REG_IQ_POLARITY_SETUP, &iqConfigCurrent, 1); // 0x0736 + + // set correct IQ configuration + // if(iqConfig == SX126X_LORA_IQ_STANDARD) { + if (iqConfig == SX126X_LORA_IQ_INVERTED) { + iqConfigCurrent &= 0xFB; // using inverted IQ polarity + } else { + iqConfigCurrent |= 0x04; // using standard IQ polarity + } + + // update with the new value + WriteRegister (SX126X_REG_IQ_POLARITY_SETUP, &iqConfigCurrent, 1); // 0x0736 +} + +void LoRaConfig (uint8_t spreadingFactor, uint8_t bandwidth, uint8_t codingRate, uint16_t preambleLength, uint8_t payloadLen, char crcOn, char invertIrq) { + SetStopRxTimerOnPreambleDetect (0); + SetLoRaSymbNumTimeout (0); + SetPacketType (SX126X_PACKET_TYPE_LORA); // SX126x.ModulationParams.PacketType : MODEM_LORA + uint8_t ldro = 0; // LowDataRateOptimize OFF + SetModulationParams (spreadingFactor, bandwidth, codingRate, ldro); + + PacketParams[0] = (preambleLength >> 8) & 0xFF; + PacketParams[1] = preambleLength; + if (payloadLen) { + PacketParams[2] = 0x01; // Fixed length packet (implicit header) + PacketParams[3] = payloadLen; + } else { + PacketParams[2] = 0x00; // Variable length packet (explicit header) + PacketParams[3] = 0xFF; + } + + if (crcOn) + PacketParams[4] = SX126X_LORA_CRC_ON; + else + PacketParams[4] = SX126X_LORA_CRC_OFF; + + if (invertIrq) + PacketParams[5] = 0x01; // Inverted LoRa I and Q signals setup + else + PacketParams[5] = 0x00; // Standard LoRa I and Q signals setup + + // fixes IQ configuration for inverted IQ + FixInvertedIQ (PacketParams[5]); + + WriteCommand (SX126X_CMD_SET_PACKET_PARAMS, PacketParams, 6); // 0x8C + + // Do not use DIO interruptst + SetDioIrqParams (SX126X_IRQ_ALL, // all interrupts enabled + SX126X_IRQ_NONE, // interrupts on DIO1 + SX126X_IRQ_NONE, // interrupts on DIO2 + SX126X_IRQ_NONE // interrupts on DIO3 + ); + + + MESH_LOGI (TAG, "Almost done setting LoRa"); + // Receive state no receive timeoout + SetRx (0xFFFFFF); +} + +void LoRaDebugPrint (char enable) { + debugPrint = enable; +} + +uint8_t LoRaReceive (uint8_t *pData, int16_t len) { + uint8_t rxLen = 0; + uint16_t irqRegs = GetIrqStatus(); + // uint8_t status = GetStatus(); + + if (irqRegs & SX126X_IRQ_RX_DONE) { + // ClearIrqStatus(SX126X_IRQ_RX_DONE); + ClearIrqStatus (SX126X_IRQ_ALL); + rxLen = ReadBuffer (pData, len); + } + + return rxLen; +} + +char LoRaSend (uint8_t *pData, int16_t len, uint8_t mode) { + uint16_t irqStatus; + char rv = 0; + + if (txActive == 0) { + txActive = 1; + if (PacketParams[2] == 0x00) { // Variable length packet (explicit header) + PacketParams[3] = len; + } + WriteCommand (SX126X_CMD_SET_PACKET_PARAMS, PacketParams, 6); // 0x8C + + // ClearIrqStatus(SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT); + ClearIrqStatus (SX126X_IRQ_ALL); + + WriteBuffer (pData, len); + SetTx (5000); + + if (mode & SX126x_TXMODE_SYNC) { + irqStatus = GetIrqStatus(); + while ((!(irqStatus & SX126X_IRQ_TX_DONE)) && (!(irqStatus & SX126X_IRQ_TIMEOUT))) { + Delay_Ms(1); + irqStatus = GetIrqStatus(); + } + if (debugPrint) { + MESH_LOGI (TAG, "irqStatus=0x%x", irqStatus); + if (irqStatus & SX126X_IRQ_TX_DONE) { + MESH_LOGI (TAG, "SX126X_IRQ_TX_DONE"); + } + if (irqStatus & SX126X_IRQ_TIMEOUT) { + MESH_LOGI (TAG, "SX126X_IRQ_TIMEOUT"); + } + } + txActive = 0; + + SetRx (0xFFFFFF); + + if (irqStatus & SX126X_IRQ_TX_DONE) { + rv = 1; + } + } else { + rv = 1; + } + } + if (debugPrint) { + MESH_LOGI (TAG, "Send rv=0x%x", rv); + } + if (rv == 0) + txLost++; + return rv; +} + +char ReceiveMode (void) { + uint16_t irq; + char rv = 0; + + if (txActive == 0) { + rv = 1; + } else { + irq = GetIrqStatus(); + if (irq & (SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT)) { + SetRx (0xFFFFFF); + txActive = 0; + rv = 1; + } + } + + return rv; +} + +void GetPacketStatus (int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr) { + uint8_t buf[4]; + ReadCommand (SX126X_CMD_GET_PACKET_STATUS, buf, 4); // 0x14 + *rssiPacket = (buf[3] >> 1) * -1; + (buf[2] < 128) ? (*snrPacket = buf[2] >> 2) : (*snrPacket = ((buf[2] - 256) >> 2)); + *rawSnr = buf[2]; +} + +void SetTxPower (int8_t txPowerInDbm) { + SetPowerConfig (txPowerInDbm, SX126X_PA_RAMP_200U); +} + +void ResetLora (void) { + Delay_Ms(10); + GPIO_WriteBit (GPIOE, GPIO_Pin_3, 0); + Delay_Ms(20); + GPIO_WriteBit (GPIOE, GPIO_Pin_3, 1); + MESH_LOGW (TAG, "Waiting for idle"); + Delay_Ms(10); + // ensure BUSY is low (state meachine ready) + WaitForIdle (BUSY_WAIT, "Reset", 1); +} + +void Wakeup (void) { + GetStatus(); +} + +void SetStandby (uint8_t mode) { + uint8_t data = mode; + WriteCommand (SX126X_CMD_SET_STANDBY, &data, 1); // 0x80 +} + +uint8_t GetStatus (void) { + uint8_t rv; + ReadCommand (SX126X_CMD_GET_STATUS, &rv, 1); // 0xC0 + return rv; +} + +static uint8_t voltage_to_tcxo(uint16_t voltage) +{ + if (voltage == 1650) return SX126X_DIO3_OUTPUT_1_6; + if (voltage == 1750) return SX126X_DIO3_OUTPUT_1_7; + if (voltage == 1850) return SX126X_DIO3_OUTPUT_1_8; + if (voltage == 2300) return SX126X_DIO3_OUTPUT_2_2; + if (voltage == 2500) return SX126X_DIO3_OUTPUT_2_4; + if (voltage == 2850) return SX126X_DIO3_OUTPUT_2_7; + if (voltage == 3100) return SX126X_DIO3_OUTPUT_3_0; + return SX126X_DIO3_OUTPUT_3_3; +} + +void SetDio3AsTcxoCtrl (uint16_t voltage, uint32_t delay) { + uint8_t buf[4]; + + // buf[0] = tcxoVoltage & 0x07; + buf[0] = voltage_to_tcxo(voltage); + + uint32_t delayValue = (delay * 1000) / 15625; + + buf[1] = (delayValue >> 16) & 0xFF; + buf[2] = (delayValue >> 8) & 0xFF; + buf[3] = delayValue & 0xFF; + + WriteCommand (SX126X_CMD_SET_DIO3_AS_TCXO_CTRL, buf, 4); // 0x97 +} + +void Calibrate (uint8_t calibParam) { + uint8_t data = calibParam; + WriteCommand (SX126X_CMD_CALIBRATE, &data, 1); // 0x89 +} +void SetDio2AsRfSwitchCtrl (uint8_t enable) { + uint8_t data = enable; + WriteCommand (SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL, &data, 1); // 0x9D +} + +void SetRfFrequency (uint32_t frequency) { + uint8_t buf[4]; + + CalibrateImage (frequency); + + //freq = (uint32_t)((double)frequency / (double)FREQ_STEP); + uint32_t freq = ((uint64_t)frequency << 25) / XTAL_FREQ; + buf[0] = (uint8_t)((freq >> 24) & 0xFF); + buf[1] = (uint8_t)((freq >> 16) & 0xFF); + buf[2] = (uint8_t)((freq >> 8) & 0xFF); + buf[3] = (uint8_t)(freq & 0xFF); + WriteCommand (SX126X_CMD_SET_RF_FREQUENCY, buf, 4); // 0x86 +} + +void CalibrateImage (uint32_t frequency) { + uint8_t calFreq[2]; + + if (frequency > 900000000) { + calFreq[0] = 0xE1; + calFreq[1] = 0xE9; + } else if (frequency > 850000000) { + calFreq[0] = 0xD7; + calFreq[1] = 0xDB; + } else if (frequency > 770000000) { + calFreq[0] = 0xC1; + calFreq[1] = 0xC5; + } else if (frequency > 460000000) { + calFreq[0] = 0x75; + calFreq[1] = 0x81; + } else if (frequency > 425000000) { + calFreq[0] = 0x6B; + calFreq[1] = 0x6F; + } + WriteCommand (SX126X_CMD_CALIBRATE_IMAGE, calFreq, 2); // 0x98 +} + +void SetRegulatorMode (uint8_t mode) { + uint8_t data = mode; + WriteCommand (SX126X_CMD_SET_REGULATOR_MODE, &data, 1); // 0x96 +} + +void SetBufferBaseAddress (uint8_t txBaseAddress, uint8_t rxBaseAddress) { + uint8_t buf[2]; + + buf[0] = txBaseAddress; + buf[1] = rxBaseAddress; + WriteCommand (SX126X_CMD_SET_BUFFER_BASE_ADDRESS, buf, 2); // 0x8F +} + +void SetPowerConfig (int8_t power, uint8_t rampTime) { + uint8_t buf[2]; + + if (power > 22) { + power = 22; + } else if (power < -3) { + power = -3; + } + + buf[0] = power; + buf[1] = (uint8_t)rampTime; + WriteCommand (SX126X_CMD_SET_TX_PARAMS, buf, 2); // 0x8E +} + +void SetPaConfig (uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut) { + uint8_t buf[4]; + + buf[0] = paDutyCycle; + buf[1] = hpMax; + buf[2] = deviceSel; + buf[3] = paLut; + WriteCommand (SX126X_CMD_SET_PA_CONFIG, buf, 4); // 0x95 +} + +void SetOvercurrentProtection(uint16_t current_mA) +{ + if (current_mA <= 140) + { + uint8_t buf = (current_mA * 10) / 25; + WriteRegister(SX126X_REG_OCP_CONFIGURATION, &buf, 1); + } +} + +void SetSyncWord (int16_t sync) { + uint8_t buf[2]; + + buf[0] = (uint8_t)((sync >> 8) & 0x00FF); + buf[1] = (uint8_t)(sync & 0x00FF); + WriteRegister (SX126X_REG_LORA_SYNC_WORD_MSB, buf, 2); // 0x0740 +} + +void SetDioIrqParams (uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask) { + uint8_t buf[8]; + + buf[0] = (uint8_t)((irqMask >> 8) & 0x00FF); + buf[1] = (uint8_t)(irqMask & 0x00FF); + buf[2] = (uint8_t)((dio1Mask >> 8) & 0x00FF); + buf[3] = (uint8_t)(dio1Mask & 0x00FF); + buf[4] = (uint8_t)((dio2Mask >> 8) & 0x00FF); + buf[5] = (uint8_t)(dio2Mask & 0x00FF); + buf[6] = (uint8_t)((dio3Mask >> 8) & 0x00FF); + buf[7] = (uint8_t)(dio3Mask & 0x00FF); + WriteCommand (SX126X_CMD_SET_DIO_IRQ_PARAMS, buf, 8); // 0x08 +} + +void SetStopRxTimerOnPreambleDetect (char enable) { + MESH_LOGI (TAG, "SetStopRxTimerOnPreambleDetect enable=%d", enable); + // uint8_t data = (uint8_t)enable; + uint8_t data = 0; + if (enable) + data = 1; + WriteCommand (SX126X_CMD_STOP_TIMER_ON_PREAMBLE, &data, 1); // 0x9F +} + +void SetLoRaSymbNumTimeout (uint8_t SymbNum) { + uint8_t data = SymbNum; + WriteCommand (SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT, &data, 1); // 0xA0 +} + +void SetPacketType (uint8_t packetType) { + uint8_t data = packetType; + WriteCommand (SX126X_CMD_SET_PACKET_TYPE, &data, 1); // 0x01 +} + +void SetModulationParams (uint8_t spreadingFactor, uint8_t bandwidth, uint8_t codingRate, uint8_t lowDataRateOptimize) { + uint8_t data[4]; + // currently only LoRa supported + data[0] = spreadingFactor; + data[1] = bandwidth; + data[2] = codingRate; + data[3] = lowDataRateOptimize; + WriteCommand (SX126X_CMD_SET_MODULATION_PARAMS, data, 4); // 0x8B +} + +void SetCadParams (uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout) { + uint8_t data[7]; + data[0] = cadSymbolNum; + data[1] = cadDetPeak; + data[2] = cadDetMin; + data[3] = cadExitMode; + data[4] = (uint8_t)((cadTimeout >> 16) & 0xFF); + data[5] = (uint8_t)((cadTimeout >> 8) & 0xFF); + data[6] = (uint8_t)(cadTimeout & 0xFF); + WriteCommand (SX126X_CMD_SET_CAD_PARAMS, data, 7); // 0x88 +} + +void SetCad() { + uint8_t data = 0; + WriteCommand (SX126X_CMD_SET_CAD, &data, 0); // 0xC5 +} + +uint16_t GetIrqStatus (void) { + uint8_t data[3]; + ReadCommand (SX126X_CMD_GET_IRQ_STATUS, data, 3); // 0x12 + return (data[1] << 8) | data[2]; +} + +void ClearIrqStatus (uint16_t irq) { + uint8_t buf[2]; + + buf[0] = (uint8_t)(((uint16_t)irq >> 8) & 0x00FF); + buf[1] = (uint8_t)((uint16_t)irq & 0x00FF); + WriteCommand (SX126X_CMD_CLEAR_IRQ_STATUS, buf, 2); // 0x02 +} + +void SetRx (uint32_t timeout) { + if (debugPrint) { + MESH_LOGI (TAG, "----- SetRx timeout=%d", timeout); + } + SetStandby (SX126X_STANDBY_RC); + uint8_t buf[3]; + buf[0] = (uint8_t)((timeout >> 16) & 0xFF); + buf[1] = (uint8_t)((timeout >> 8) & 0xFF); + buf[2] = (uint8_t)(timeout & 0xFF); + WriteCommand (SX126X_CMD_SET_RX, buf, 3); // 0x82 + + for (int retry = 0; retry < 10; retry++) { + if ((GetStatus() & 0x70) == 0x50) + break; + Delay_Ms(1); + } + if ((GetStatus() & 0x70) != 0x50) { + MESH_LOGE (TAG, "SetRx Illegal Status"); + LoRaError (ERR_INVALID_SETRX_STATE); + } +} + +void SetTx (uint32_t timeoutInMs) { + if (debugPrint) { + MESH_LOGI (TAG, "----- SetTx timeoutInMs=%d", timeoutInMs); + } + SetStandby (SX126X_STANDBY_RC); + uint8_t buf[3]; + uint32_t tout = timeoutInMs; + if (timeoutInMs != 0) { + uint32_t timeoutInUs = timeoutInMs * 1000; + tout = timeoutInUs * 64; + } + if (debugPrint) { + MESH_LOGI (TAG, "SetTx timeoutInMs=%d" + " tout=%d", + timeoutInMs, tout); + } + buf[0] = (uint8_t)((tout >> 16) & 0xFF); + buf[1] = (uint8_t)((tout >> 8) & 0xFF); + buf[2] = (uint8_t)(tout & 0xFF); + WriteCommand (SX126X_CMD_SET_TX, buf, 3); // 0x83 + + if (debugPrint) { + MESH_LOGD(TAG, "Written command, retrying"); + } + + for (int retry = 0; retry < 20; retry++) { + if ((GetStatus() & 0x70) == 0x60) + break; + Delay_Ms(1); + } + if (debugPrint) { + MESH_LOGI(TAG, "Broke out"); + } + if ((GetStatus() & 0x70) != 0x60) { + MESH_LOGE (TAG, "SetTx Illegal Status"); + LoRaError (ERR_INVALID_SETTX_STATE); + } +} + +int GetPacketLost() { + return txLost; +} + +uint8_t GetRssiInst() { + uint8_t buf[2]; + ReadCommand (SX126X_CMD_GET_RSSI_INST, buf, 2); // 0x15 + return buf[1]; +} + +void GetRxBufferStatus (uint8_t *payloadLength, uint8_t *rxStartBufferPointer) { + uint8_t buf[3]; + ReadCommand (SX126X_CMD_GET_RX_BUFFER_STATUS, buf, 3); // 0x13 + *payloadLength = buf[1]; + *rxStartBufferPointer = buf[2]; +} + +void WaitForIdleBegin (unsigned long timeout, char *text) { + // ensure BUSY is low (state meachine ready) + char stop = 0; + for (int retry = 0; retry < 10; retry++) { + if (retry == 9) + stop = 1; + char ret = WaitForIdle (BUSY_WAIT, text, stop); + if (ret == 1) + break; + MESH_LOGW (TAG, "WaitForIdle fail retry=%d", retry); + Delay_Ms(10); + } +} + +char WaitForIdle (unsigned long timeout, char *text, char stop) { + char ret = 1; + Delay_Ms(1); + for (unsigned long i = 0; i < timeout; i++) { + if (GPIO_ReadInputDataBit (GPIOE, GPIO_Pin_1) == 0) + break; + Delay_Ms(10); + } + + if (GPIO_ReadInputDataBit (GPIOE, GPIO_Pin_1)) { + if (stop) { + MESH_LOGE (TAG, "WaitForIdle Timeout text=%s timeout=%lu", text, timeout); + LoRaError (ERR_IDLE_TIMEOUT); + } else { + MESH_LOGW (TAG, "WaitForIdle Timeout text=%s timeout=%lu", text, timeout); + ret = 0; + } + } + return ret; +} + +/* +uint8_t ReadBuffer (uint8_t *rxData, int16_t rxDataLen) { + uint8_t offset = 0; + uint8_t payloadLength = 0; + GetRxBufferStatus (&payloadLength, &offset); + if (payloadLength > rxDataLen) { + MESH_LOGW (TAG, "ReadBuffer rxDataLen too small. payloadLength=%d rxDataLen=%d", payloadLength, rxDataLen); + return 0; + } + + // ensure BUSY is low (state meachine ready) + WaitForIdle (BUSY_WAIT, "start ReadBuffer", 1); + + // start transfer + uint8_t *buf; + buf = malloc (payloadLength + 3); + if (buf != NULL) { + buf[0] = SX126X_CMD_READ_BUFFER; // 0x1E + buf[1] = offset; // offset in rx fifo + buf[2] = SX126X_CMD_NOP; + memset (&buf[3], SX126X_CMD_NOP, payloadLength); + spi_read_byte (buf, buf, payloadLength + 3); + memcpy (rxData, &buf[3], payloadLength); + free (buf); + } else { + MESH_LOGE (TAG, "ReadBuffer malloc fail"); + payloadLength = 0; + } + + // wait for BUSY to go low + WaitForIdle (BUSY_WAIT, "end ReadBuffer", 0); + + return payloadLength; +}*/ + + +uint8_t ReadBuffer (uint8_t *rxData, int16_t rxDataLen) { + uint8_t offset = 0; + uint8_t payloadLength = 0; + GetRxBufferStatus (&payloadLength, &offset); + + if (payloadLength > rxDataLen) { + MESH_LOGW (TAG, "ReadBuffer rxDataLen too small. payloadLength=%d rxDataLen=%d", payloadLength, rxDataLen); + return 0; + } + + WaitForIdle (BUSY_WAIT, "start ReadBuffer", 1); + + uint8_t cmd[3] = {SX126X_CMD_READ_BUFFER, offset, SX126X_CMD_NOP}; + + spi_read_byte_offs (rxData, cmd, rxDataLen, sizeof (cmd)); + + WaitForIdle (BUSY_WAIT, "end ReadBuffer", 0); + + return payloadLength; +} + +void WriteBuffer (uint8_t *txData, int16_t txDataLen) { + // ensure BUSY is low (state meachine ready) + WaitForIdle (BUSY_WAIT, "start WriteBuffer", 1); + + // start transfer + uint8_t *buf; + buf = malloc (txDataLen + 2); + if (buf != NULL) { + buf[0] = SX126X_CMD_WRITE_BUFFER; // 0x0E + buf[1] = 0; // offset in tx fifo + memcpy (&buf[2], txData, txDataLen); + spi_write_byte (buf, txDataLen + 2); + free (buf); + } else { + MESH_LOGE (TAG, "WriteBuffer malloc fail"); + } + + // wait for BUSY to go low + WaitForIdle (BUSY_WAIT, "end WriteBuffer", 0); +} + +void WriteRegister (uint16_t reg, uint8_t *data, uint8_t numBytes) { + // ensure BUSY is low (state meachine ready) + WaitForIdle (BUSY_WAIT, "start WriteRegister", 1); + + if (debugPrint) { + MESH_LOGI (TAG, "WriteRegister: REG=0x%02x", reg); + for (uint8_t n = 0; n < numBytes; n++) { + MESH_LOGI (TAG, "DataOut:%02x ", data[n]); + } + } + + // start transfer + uint8_t buf[16]; + buf[0] = SX126X_CMD_WRITE_REGISTER; + buf[1] = (reg & 0xFF00) >> 8; + buf[2] = reg & 0xff; + memcpy (&buf[3], data, numBytes); + spi_write_byte (buf, 3 + numBytes); + + // wait for BUSY to go low + WaitForIdle (BUSY_WAIT, "end WriteRegister", 0); +} + +void ReadRegister (uint16_t reg, uint8_t *data, uint8_t numBytes) { + // ensure BUSY is low (state meachine ready) + WaitForIdle (BUSY_WAIT, "start ReadRegister", 1); + + if (debugPrint) { + MESH_LOGI (TAG, "ReadRegister: REG=0x%02x", reg); + } + + // start transfer + uint8_t buf[16]; + uint8_t buf2[16]; + memset (buf, SX126X_CMD_NOP, sizeof (buf)); + memset (buf2, SX126X_CMD_NOP, sizeof (buf2)); + buf[0] = SX126X_CMD_READ_REGISTER; + buf[1] = (reg & 0xFF00) >> 8; + buf[2] = reg & 0xff; + if (debugPrint) { + MESH_LOGI (TAG, "Reading bytes"); + } + + spi_read_byte (buf2, buf, 4 + numBytes); + MESH_LOGI (TAG, "read a byte"); + memcpy (data, &buf2[4], numBytes); + if (debugPrint) { + for (uint8_t n = 0; n < numBytes; n++) { + MESH_LOGI (TAG, "DataIn:%02x ", data[n]); + } + } + + // wait for BUSY to go low + WaitForIdle (BUSY_WAIT, "end ReadRegister", 0); +} + +// WriteCommand with retry +void WriteCommand (uint8_t cmd, uint8_t *data, uint8_t numBytes) { + uint8_t status; + for (int retry = 1; retry < 10; retry++) { + status = WriteCommand2 (cmd, data, numBytes); + if (debugPrint) { + MESH_LOGD (TAG, "status=%02x", status); + } + if (status == 0) + break; + MESH_LOGW (TAG, "WriteCommand2 status=%02x retry=%d", status, retry); + } + if (status != 0) { + MESH_LOGE (TAG, "SPI Transaction error:0x%02x", status); + LoRaError (ERR_SPI_TRANSACTION); + } +} + +uint8_t WriteCommand2 (uint8_t cmd, uint8_t *data, uint8_t numBytes) { + // ensure BUSY is low (state meachine ready) + WaitForIdle (BUSY_WAIT, "start WriteCommand2", 1); + + if (debugPrint) { + MESH_LOGI (TAG, "WriteCommand: CMD=0x%02x", cmd); + } + + // start transfer + uint8_t buf[16]; + buf[0] = cmd; + memcpy (&buf[1], data, numBytes); + spi_read_byte (buf, buf, numBytes + 1); + + uint8_t status = 0; + uint8_t cmd_status = buf[1] & 0xe; + + switch (cmd_status) { + case SX126X_STATUS_CMD_TIMEOUT: + case SX126X_STATUS_CMD_INVALID: + case SX126X_STATUS_CMD_FAILED: + status = cmd_status; + break; + + case 0: + case 7: + status = SX126X_STATUS_SPI_FAILED; + break; + // default: break; // success + } + + // wait for BUSY to go low + WaitForIdle (BUSY_WAIT, "end WriteCommand2", 0); + return status; +} + +void ReadCommand (uint8_t cmd, uint8_t *data, uint8_t numBytes) { + // ensure BUSY is low (state meachine ready) + WaitForIdleBegin (BUSY_WAIT, "start ReadCommand"); + + if (debugPrint) { + MESH_LOGI (TAG, "ReadCommand: CMD=0x%02x", cmd); + } + + // start transfer + uint8_t buf[16]; + memset (buf, SX126X_CMD_NOP, sizeof (buf)); + buf[0] = cmd; + spi_read_byte (buf, buf, 1 + numBytes); + if (data != NULL && numBytes) + memcpy (data, &buf[1], numBytes); + + // wait for BUSY to go low + Delay_Ms(1); + WaitForIdle (BUSY_WAIT, "end ReadCommand", 0); +} \ No newline at end of file diff --git a/User/sx1262.h b/User/sx1262.h new file mode 100644 index 0000000..55aa4f4 --- /dev/null +++ b/User/sx1262.h @@ -0,0 +1,452 @@ +#ifndef _RA01S_H +#define _RA01S_H + +// return values +#define ERR_NONE 0 +#define ERR_PACKET_TOO_LONG 1 +#define ERR_UNKNOWN 2 +#define ERR_TX_TIMEOUT 3 +#define ERR_RX_TIMEOUT 4 +#define ERR_CRC_MISMATCH 5 +#define ERR_WRONG_MODEM 6 +#define ERR_INVALID_BANDWIDTH 7 +#define ERR_INVALID_SPREADING_FACTOR 8 +#define ERR_INVALID_CODING_RATE 9 +#define ERR_INVALID_FREQUENCY_DEVIATION 10 +#define ERR_INVALID_BIT_RATE 11 +#define ERR_INVALID_RX_BANDWIDTH 12 +#define ERR_INVALID_DATA_SHAPING 13 +#define ERR_INVALID_SYNC_WORD 14 +#define ERR_INVALID_OUTPUT_POWER 15 +#define ERR_INVALID_MODE 16 +#define ERR_INVALID_TRANCEIVER 17 +#define ERR_INVALID_SETRX_STATE 18 +#define ERR_INVALID_SETTX_STATE 19 +#define ERR_IDLE_TIMEOUT 20 +#define ERR_SPI_TRANSACTION 21 + +// SX126X physical layer properties +#define XTAL_FREQ 32000000 +#define FREQ_DIV 33554432UL + +#define LOW 0 +#define HIGH 1 +#define BUSY_WAIT 5000 + +// SX126X Model +#define SX1261_TRANCEIVER 0x01 +#define SX1262_TRANCEIVER 0x02 +#define SX1268_TRANCEIVER 0x08 + +// SX126X SPI commands +// operational modes commands +#define SX126X_CMD_NOP 0x00 +#define SX126X_CMD_SET_SLEEP 0x84 +#define SX126X_CMD_SET_STANDBY 0x80 +#define SX126X_CMD_SET_FS 0xC1 +#define SX126X_CMD_SET_TX 0x83 +#define SX126X_CMD_SET_RX 0x82 +#define SX126X_CMD_STOP_TIMER_ON_PREAMBLE 0x9F +#define SX126X_CMD_SET_RX_DUTY_CYCLE 0x94 +#define SX126X_CMD_SET_CAD 0xC5 +#define SX126X_CMD_SET_TX_CONTINUOUS_WAVE 0xD1 +#define SX126X_CMD_SET_TX_INFINITE_PREAMBLE 0xD2 +#define SX126X_CMD_SET_REGULATOR_MODE 0x96 +#define SX126X_CMD_CALIBRATE 0x89 +#define SX126X_CMD_CALIBRATE_IMAGE 0x98 +#define SX126X_CMD_SET_PA_CONFIG 0x95 +#define SX126X_CMD_SET_RX_TX_FALLBACK_MODE 0x93 + +// register and buffer access commands +#define SX126X_CMD_WRITE_REGISTER 0x0D +#define SX126X_CMD_READ_REGISTER 0x1D +#define SX126X_CMD_WRITE_BUFFER 0x0E +#define SX126X_CMD_READ_BUFFER 0x1E + +// DIO and IRQ control +#define SX126X_CMD_SET_DIO_IRQ_PARAMS 0x08 +#define SX126X_CMD_GET_IRQ_STATUS 0x12 +#define SX126X_CMD_CLEAR_IRQ_STATUS 0x02 +#define SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL 0x9D +#define SX126X_CMD_SET_DIO3_AS_TCXO_CTRL 0x97 + +// RF, modulation and packet commands +#define SX126X_CMD_SET_RF_FREQUENCY 0x86 +#define SX126X_CMD_SET_PACKET_TYPE 0x8A +#define SX126X_CMD_GET_PACKET_TYPE 0x11 +#define SX126X_CMD_SET_TX_PARAMS 0x8E +#define SX126X_CMD_SET_MODULATION_PARAMS 0x8B +#define SX126X_CMD_SET_PACKET_PARAMS 0x8C +#define SX126X_CMD_SET_CAD_PARAMS 0x88 +#define SX126X_CMD_SET_BUFFER_BASE_ADDRESS 0x8F +#define SX126X_CMD_SET_LORA_SYMB_NUM_TIMEOUT 0xA0 + +#define SX126X_PA_CONFIG_SX1261 0x01 +#define SX126X_PA_CONFIG_SX1262 0x00 + +// status commands +#define SX126X_CMD_GET_STATUS 0xC0 +#define SX126X_CMD_GET_RSSI_INST 0x15 +#define SX126X_CMD_GET_RX_BUFFER_STATUS 0x13 +#define SX126X_CMD_GET_PACKET_STATUS 0x14 +#define SX126X_CMD_GET_DEVICE_ERRORS 0x17 +#define SX126X_CMD_CLEAR_DEVICE_ERRORS 0x07 +#define SX126X_CMD_GET_STATS 0x10 +#define SX126X_CMD_RESET_STATS 0x00 + + +// SX126X register map +#define SX126X_REG_HOPPING_ENABLE 0x0385 +#define SX126X_REG_PACKECT_LENGTH 0x0386 +#define SX126X_REG_NB_HOPPING_BLOCKS 0x0387 +#define SX126X_REG_NB_SYMBOLS0 0x0388 +#define SX126X_REG_FREQ0 0x038A +#define SX126X_REG_NB_SYMBOLS15 0x03E2 +#define SX126X_REG_FREQ15 0x03E4 +#define SX126X_REG_DIOX_OUTPUT_ENABLE 0x0580 +#define SX126X_REG_DIOX_INPUT_ENABLE 0x0583 +#define SX126X_REG_DIOX_PILL_UP_CONTROL 0x0584 +#define SX126X_REG_DIOX_PULL_DOWN_CONTROL 0x0585 +#define SX126X_REG_WHITENING_INITIAL_MSB 0x06B8 +#define SX126X_REG_WHITENING_INITIAL_LSB 0x06B9 +#define SX126X_REG_CRC_INITIAL_MSB 0x06BC +#define SX126X_REG_CRC_INITIAL_LSB 0x06BD +#define SX126X_REG_CRC_POLYNOMIAL_MSB 0x06BE +#define SX126X_REG_CRC_POLYNOMIAL_LSB 0x06BF +#define SX126X_REG_SYNC_WORD_0 0x06C0 +#define SX126X_REG_SYNC_WORD_1 0x06C1 +#define SX126X_REG_SYNC_WORD_2 0x06C2 +#define SX126X_REG_SYNC_WORD_3 0x06C3 +#define SX126X_REG_SYNC_WORD_4 0x06C4 +#define SX126X_REG_SYNC_WORD_5 0x06C5 +#define SX126X_REG_SYNC_WORD_6 0x06C6 +#define SX126X_REG_SYNC_WORD_7 0x06C7 +#define SX126X_REG_NODE_ADDRESS 0x06CD +#define SX126X_REG_BROADCAST_ADDRESS 0x06CE +#define SX126X_REG_IQ_POLARITY_SETUP 0x0736 +#define SX126X_REG_LORA_SYNC_WORD_MSB 0x0740 +#define SX126X_REG_LORA_SYNC_WORD_LSB 0x0741 +#define SX126X_REG_RANDOM_NUMBER_0 0x0819 +#define SX126X_REG_RANDOM_NUMBER_1 0x081A +#define SX126X_REG_RANDOM_NUMBER_2 0x081B +#define SX126X_REG_RANDOM_NUMBER_3 0x081C +#define SX126X_REG_TX_MODULETION 0x0889 +#define SX126X_REG_RX_GAIN 0x08AC +#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 +#define SX126X_REG_OCP_CONFIGURATION 0x08E7 +#define SX126X_REG_RTC_CONTROL 0x0902 +#define SX126X_REG_XTA_TRIM 0x0911 +#define SX126X_REG_XTB_TRIM 0x0912 +#define SX126X_REG_DIO3_OUTPUT_VOLTAGE_CONTROL 0x0920 +#define SX126X_REG_EVENT_MASK 0x0944 + + +// SX126X SPI command variables +// SX126X_CMD_SET_SLEEP +#define SX126X_SLEEP_START_COLD 0b00000000 // 2 2 sleep mode: cold start, configuration is lost (default) +#define SX126X_SLEEP_START_WARM 0b00000100 // 2 2 warm start, configuration is retained +#define SX126X_SLEEP_RTC_OFF 0b00000000 // 0 0 wake on RTC timeout: disabled +#define SX126X_SLEEP_RTC_ON 0b00000001 // 0 0 enabled + +// SX126X_CMD_SET_STANDBY +#define SX126X_STANDBY_RC 0x00 // 7 0 standby mode: 13 MHz RC oscillator +#define SX126X_STANDBY_XOSC 0x01 // 7 0 32 MHz crystal oscillator + +// SX126X_CMD_SET_RX +#define SX126X_RX_TIMEOUT_NONE 0x000000 // 23 0 Rx timeout duration: no timeout (Rx single mode) +#define SX126X_RX_TIMEOUT_INF 0xFFFFFF // 23 0 infinite (Rx continuous mode) + +// SX126X_CMD_STOP_TIMER_ON_PREAMBLE +#define SX126X_STOP_ON_PREAMBLE_OFF 0x00 // 7 0 stop timer on: sync word or header (default) +#define SX126X_STOP_ON_PREAMBLE_ON 0x01 // 7 0 preamble detection + +// SX126X_CMD_SET_REGULATOR_MODE +#define SX126X_REGULATOR_LDO 0x00 // 7 0 set regulator mode: LDO (default) +#define SX126X_REGULATOR_DC_DC 0x01 // 7 0 DC-DC + +// SX126X_CMD_CALIBRATE +#define SX126X_CALIBRATE_IMAGE_OFF 0b00000000 // 6 6 image calibration: disabled +#define SX126X_CALIBRATE_IMAGE_ON 0b01000000 // 6 6 enabled +#define SX126X_CALIBRATE_ADC_BULK_P_OFF 0b00000000 // 5 5 ADC bulk P calibration: disabled +#define SX126X_CALIBRATE_ADC_BULK_P_ON 0b00100000 // 5 5 enabled +#define SX126X_CALIBRATE_ADC_BULK_N_OFF 0b00000000 // 4 4 ADC bulk N calibration: disabled +#define SX126X_CALIBRATE_ADC_BULK_N_ON 0b00010000 // 4 4 enabled +#define SX126X_CALIBRATE_ADC_PULSE_OFF 0b00000000 // 3 3 ADC pulse calibration: disabled +#define SX126X_CALIBRATE_ADC_PULSE_ON 0b00001000 // 3 3 enabled +#define SX126X_CALIBRATE_PLL_OFF 0b00000000 // 2 2 PLL calibration: disabled +#define SX126X_CALIBRATE_PLL_ON 0b00000100 // 2 2 enabled +#define SX126X_CALIBRATE_RC13M_OFF 0b00000000 // 1 1 13 MHz RC osc. calibration: disabled +#define SX126X_CALIBRATE_RC13M_ON 0b00000010 // 1 1 enabled +#define SX126X_CALIBRATE_RC64K_OFF 0b00000000 // 0 0 64 kHz RC osc. calibration: disabled +#define SX126X_CALIBRATE_RC64K_ON 0b00000001 // 0 0 enabled + +// SX126X_CMD_CALIBRATE_IMAGE +#define SX126X_CAL_IMG_430_MHZ_1 0x6B +#define SX126X_CAL_IMG_430_MHZ_2 0x6F +#define SX126X_CAL_IMG_470_MHZ_1 0x75 +#define SX126X_CAL_IMG_470_MHZ_2 0x81 +#define SX126X_CAL_IMG_779_MHZ_1 0xC1 +#define SX126X_CAL_IMG_779_MHZ_2 0xC5 +#define SX126X_CAL_IMG_863_MHZ_1 0xD7 +#define SX126X_CAL_IMG_863_MHZ_2 0xDB +#define SX126X_CAL_IMG_902_MHZ_1 0xE1 +#define SX126X_CAL_IMG_902_MHZ_2 0xE9 + +// SX126X_CMD_SET_PA_CONFIG +#define SX126X_PA_CONFIG_HP_MAX 0x07 +#define SX126X_PA_CONFIG_SX1268 0x01 +#define SX126X_PA_CONFIG_PA_LUT 0x01 + +// SX126X_CMD_SET_RX_TX_FALLBACK_MODE +#define SX126X_RX_TX_FALLBACK_MODE_FS 0x40 // 7 0 after Rx/Tx go to: FS mode +#define SX126X_RX_TX_FALLBACK_MODE_STDBY_XOSC 0x30 // 7 0 standby with crystal oscillator +#define SX126X_RX_TX_FALLBACK_MODE_STDBY_RC 0x20 // 7 0 standby with RC oscillator (default) + +// SX126X_CMD_SET_DIO_IRQ_PARAMS +#define SX126X_IRQ_TIMEOUT 0b1000000000 // 9 9 Rx or Tx timeout +#define SX126X_IRQ_CAD_DETECTED 0b0100000000 // 8 8 channel activity detected +#define SX126X_IRQ_CAD_DONE 0b0010000000 // 7 7 channel activity detection finished +#define SX126X_IRQ_CRC_ERR 0b0001000000 // 6 6 wrong CRC received +#define SX126X_IRQ_HEADER_ERR 0b0000100000 // 5 5 LoRa header CRC error +#define SX126X_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received +#define SX126X_IRQ_SYNC_WORD_VALID 0b0000001000 // 3 3 valid sync word detected +#define SX126X_IRQ_PREAMBLE_DETECTED 0b0000000100 // 2 2 preamble detected +#define SX126X_IRQ_RX_DONE 0b0000000010 // 1 1 packet received +#define SX126X_IRQ_TX_DONE 0b0000000001 // 0 0 packet transmission completed +#define SX126X_IRQ_ALL 0b1111111111 // 9 0 all interrupts +#define SX126X_IRQ_NONE 0b0000000000 // 9 0 no interrupts + +// SX126X_CMD_SET_DIO2_AS_RF_SWITCH_CTRL +#define SX126X_DIO2_AS_IRQ 0x00 // 7 0 DIO2 configuration: IRQ +#define SX126X_DIO2_AS_RF_SWITCH 0x01 // 7 0 RF switch control + +// SX126X_CMD_SET_DIO3_AS_TCXO_CTRL +#define SX126X_DIO3_OUTPUT_1_6 0x00 // 7 0 DIO3 voltage output for TCXO: 1.6 V +#define SX126X_DIO3_OUTPUT_1_7 0x01 // 7 0 1.7 V +#define SX126X_DIO3_OUTPUT_1_8 0x02 // 7 0 1.8 V +#define SX126X_DIO3_OUTPUT_2_2 0x03 // 7 0 2.2 V +#define SX126X_DIO3_OUTPUT_2_4 0x04 // 7 0 2.4 V +#define SX126X_DIO3_OUTPUT_2_7 0x05 // 7 0 2.7 V +#define SX126X_DIO3_OUTPUT_3_0 0x06 // 7 0 3.0 V +#define SX126X_DIO3_OUTPUT_3_3 0x07 // 7 0 3.3 V + +// Radio complete Wake-up Time with TCXO stabilisation time +#define RADIO_TCXO_SETUP_TIME 5000 // [us] + +// SX126X_CMD_SET_PACKET_TYPE +#define SX126X_PACKET_TYPE_GFSK 0x00 // 7 0 packet type: GFSK +#define SX126X_PACKET_TYPE_LORA 0x01 // 7 0 LoRa + +// SX126X_CMD_SET_TX_PARAMS +#define SX126X_PA_RAMP_10U 0x00 // 7 0 ramp time: 10 us +#define SX126X_PA_RAMP_20U 0x01 // 7 0 20 us +#define SX126X_PA_RAMP_40U 0x02 // 7 0 40 us +#define SX126X_PA_RAMP_80U 0x03 // 7 0 80 us +#define SX126X_PA_RAMP_200U 0x04 // 7 0 200 us +#define SX126X_PA_RAMP_800U 0x05 // 7 0 800 us +#define SX126X_PA_RAMP_1700U 0x06 // 7 0 1700 us +#define SX126X_PA_RAMP_3400U 0x07 // 7 0 3400 us + +// SX126X_CMD_SET_MODULATION_PARAMS +#define SX126X_GFSK_FILTER_NONE 0x00 // 7 0 GFSK filter: none +#define SX126X_GFSK_FILTER_GAUSS_0_3 0x08 // 7 0 Gaussian, BT = 0.3 +#define SX126X_GFSK_FILTER_GAUSS_0_5 0x09 // 7 0 Gaussian, BT = 0.5 +#define SX126X_GFSK_FILTER_GAUSS_0_7 0x0A // 7 0 Gaussian, BT = 0.7 +#define SX126X_GFSK_FILTER_GAUSS_1 0x0B // 7 0 Gaussian, BT = 1 +#define SX126X_GFSK_RX_BW_4_8 0x1F // 7 0 GFSK Rx bandwidth: 4.8 kHz +#define SX126X_GFSK_RX_BW_5_8 0x17 // 7 0 5.8 kHz +#define SX126X_GFSK_RX_BW_7_3 0x0F // 7 0 7.3 kHz +#define SX126X_GFSK_RX_BW_9_7 0x1E // 7 0 9.7 kHz +#define SX126X_GFSK_RX_BW_11_7 0x16 // 7 0 11.7 kHz +#define SX126X_GFSK_RX_BW_14_6 0x0E // 7 0 14.6 kHz +#define SX126X_GFSK_RX_BW_19_5 0x1D // 7 0 19.5 kHz +#define SX126X_GFSK_RX_BW_23_4 0x15 // 7 0 23.4 kHz +#define SX126X_GFSK_RX_BW_29_3 0x0D // 7 0 29.3 kHz +#define SX126X_GFSK_RX_BW_39_0 0x1C // 7 0 39.0 kHz +#define SX126X_GFSK_RX_BW_46_9 0x14 // 7 0 46.9 kHz +#define SX126X_GFSK_RX_BW_58_6 0x0C // 7 0 58.6 kHz +#define SX126X_GFSK_RX_BW_78_2 0x1B // 7 0 78.2 kHz +#define SX126X_GFSK_RX_BW_93_8 0x13 // 7 0 93.8 kHz +#define SX126X_GFSK_RX_BW_117_3 0x0B // 7 0 117.3 kHz +#define SX126X_GFSK_RX_BW_156_2 0x1A // 7 0 156.2 kHz +#define SX126X_GFSK_RX_BW_187_2 0x12 // 7 0 187.2 kHz +#define SX126X_GFSK_RX_BW_234_3 0x0A // 7 0 234.3 kHz +#define SX126X_GFSK_RX_BW_312_0 0x19 // 7 0 312.0 kHz +#define SX126X_GFSK_RX_BW_373_6 0x11 // 7 0 373.6 kHz +#define SX126X_GFSK_RX_BW_467_0 0x09 // 7 0 467.0 kHz +#define SX126X_LORA_BW_7_8 0x00 // 7 0 LoRa bandwidth: 7.8 kHz +#define SX126X_LORA_BW_10_4 0x08 // 7 0 10.4 kHz +#define SX126X_LORA_BW_15_6 0x01 // 7 0 15.6 kHz +#define SX126X_LORA_BW_20_8 0x09 // 7 0 20.8 kHz +#define SX126X_LORA_BW_31_25 0x02 // 7 0 31.25 kHz +#define SX126X_LORA_BW_41_7 0x0A // 7 0 41.7 kHz +#define SX126X_LORA_BW_62_5 0x03 // 7 0 62.5 kHz +#define SX126X_LORA_BW_125_0 0x04 // 7 0 125.0 kHz +#define SX126X_LORA_BW_250_0 0x05 // 7 0 250.0 kHz +#define SX126X_LORA_BW_500_0 0x06 // 7 0 500.0 kHz +#define SX126X_LORA_CR_4_5 0x01 // 7 0 LoRa coding rate: 4/5 +#define SX126X_LORA_CR_4_6 0x02 // 7 0 4/6 +#define SX126X_LORA_CR_4_7 0x03 // 7 0 4/7 +#define SX126X_LORA_CR_4_8 0x04 // 7 0 4/8 +#define SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_OFF 0x00 // 7 0 LoRa low data rate optimization: disabled +#define SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON 0x01 // 7 0 enabled + +// SX126X_CMD_SET_PACKET_PARAMS +#define SX126X_GFSK_PREAMBLE_DETECT_OFF 0x00 // 7 0 GFSK minimum preamble length before reception starts: detector disabled +#define SX126X_GFSK_PREAMBLE_DETECT_8 0x04 // 7 0 8 bits +#define SX126X_GFSK_PREAMBLE_DETECT_16 0x05 // 7 0 16 bits +#define SX126X_GFSK_PREAMBLE_DETECT_24 0x06 // 7 0 24 bits +#define SX126X_GFSK_PREAMBLE_DETECT_32 0x07 // 7 0 32 bits +#define SX126X_GFSK_ADDRESS_FILT_OFF 0x00 // 7 0 GFSK address filtering: disabled +#define SX126X_GFSK_ADDRESS_FILT_NODE 0x01 // 7 0 node only +#define SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST 0x02 // 7 0 node and broadcast +#define SX126X_GFSK_PACKET_FIXED 0x00 // 7 0 GFSK packet type: fixed (payload length known in advance to both sides) +#define SX126X_GFSK_PACKET_VARIABLE 0x01 // 7 0 variable (payload length added to packet) +#define SX126X_GFSK_CRC_OFF 0x01 // 7 0 GFSK packet CRC: disabled +#define SX126X_GFSK_CRC_1_BYTE 0x00 // 7 0 1 byte +#define SX126X_GFSK_CRC_2_BYTE 0x02 // 7 0 2 byte +#define SX126X_GFSK_CRC_1_BYTE_INV 0x04 // 7 0 1 byte, inverted +#define SX126X_GFSK_CRC_2_BYTE_INV 0x06 // 7 0 2 byte, inverted +#define SX126X_GFSK_WHITENING_OFF 0x00 // 7 0 GFSK data whitening: disabled +#define SX126X_GFSK_WHITENING_ON 0x01 // 7 0 enabled +#define SX126X_LORA_HEADER_EXPLICIT 0x00 // 7 0 LoRa header mode: explicit +#define SX126X_LORA_HEADER_IMPLICIT 0x01 // 7 0 implicit +#define SX126X_LORA_CRC_OFF 0x00 // 7 0 LoRa CRC mode: disabled +#define SX126X_LORA_CRC_ON 0x01 // 7 0 enabled +#define SX126X_LORA_IQ_STANDARD 0x00 // 7 0 LoRa IQ setup: standard +#define SX126X_LORA_IQ_INVERTED 0x01 // 7 0 inverted + +// SX126X_CMD_SET_CAD_PARAMS +#define SX126X_CAD_ON_1_SYMB 0x00 // 7 0 number of symbols used for CAD: 1 +#define SX126X_CAD_ON_2_SYMB 0x01 // 7 0 2 +#define SX126X_CAD_ON_4_SYMB 0x02 // 7 0 4 +#define SX126X_CAD_ON_8_SYMB 0x03 // 7 0 8 +#define SX126X_CAD_ON_16_SYMB 0x04 // 7 0 16 +#define SX126X_CAD_GOTO_STDBY 0x00 // 7 0 after CAD is done, always go to STDBY_RC mode +#define SX126X_CAD_GOTO_RX 0x01 // 7 0 after CAD is done, go to Rx mode if activity is detected + +// SX126X_CMD_GET_STATUS +#define SX126X_STATUS_MODE_STDBY_RC 0b00100000 // 6 4 current chip mode: STDBY_RC +#define SX126X_STATUS_MODE_STDBY_XOSC 0b00110000 // 6 4 STDBY_XOSC +#define SX126X_STATUS_MODE_FS 0b01000000 // 6 4 FS +#define SX126X_STATUS_MODE_RX 0b01010000 // 6 4 RX +#define SX126X_STATUS_MODE_TX 0b01100000 // 6 4 TX +#define SX126X_STATUS_DATA_AVAILABLE 0b00000100 // 3 1 command status: packet received and data can be retrieved +#define SX126X_STATUS_CMD_TIMEOUT 0b00000110 // 3 1 SPI command timed out +#define SX126X_STATUS_CMD_INVALID 0b00001000 // 3 1 invalid SPI command +#define SX126X_STATUS_CMD_FAILED 0b00001010 // 3 1 SPI command failed to execute +#define SX126X_STATUS_TX_DONE 0b00001100 // 3 1 packet transmission done +#define SX126X_STATUS_SPI_FAILED 0b11111111 // 7 0 SPI transaction failed + +// SX126X_CMD_GET_PACKET_STATUS +#define SX126X_GFSK_RX_STATUS_PREAMBLE_ERR 0b10000000 // 7 7 GFSK Rx status: preamble error +#define SX126X_GFSK_RX_STATUS_SYNC_ERR 0b01000000 // 6 6 sync word error +#define SX126X_GFSK_RX_STATUS_ADRS_ERR 0b00100000 // 5 5 address error +#define SX126X_GFSK_RX_STATUS_CRC_ERR 0b00010000 // 4 4 CRC error +#define SX126X_GFSK_RX_STATUS_LENGTH_ERR 0b00001000 // 3 3 length error +#define SX126X_GFSK_RX_STATUS_ABORT_ERR 0b00000100 // 2 2 abort error +#define SX126X_GFSK_RX_STATUS_PACKET_RECEIVED 0b00000010 // 2 2 packet received +#define SX126X_GFSK_RX_STATUS_PACKET_SENT 0b00000001 // 2 2 packet sent + +// SX126X_CMD_GET_DEVICE_ERRORS +#define SX126X_PA_RAMP_ERR 0b100000000 // 8 8 device errors: PA ramping failed +#define SX126X_PLL_LOCK_ERR 0b001000000 // 6 6 PLL failed to lock +#define SX126X_XOSC_START_ERR 0b000100000 // 5 5 crystal oscillator failed to start +#define SX126X_IMG_CALIB_ERR 0b000010000 // 4 4 image calibration failed +#define SX126X_ADC_CALIB_ERR 0b000001000 // 3 3 ADC calibration failed +#define SX126X_PLL_CALIB_ERR 0b000000100 // 2 2 PLL calibration failed +#define SX126X_RC13M_CALIB_ERR 0b000000010 // 1 1 RC13M calibration failed +#define SX126X_RC64K_CALIB_ERR 0b000000001 // 0 0 RC64K calibration failed + + +// SX126X SPI register variables +// SX126X_REG_LORA_SYNC_WORD_MSB + LSB +// #define SX126X_SYNC_WORD_PUBLIC 0x3444 +#define SX126X_SYNC_WORD_PUBLIC 0x24B4 // meshtastic +#define SX126X_SYNC_WORD_PRIVATE 0x1424 + +#define SX126x_TXMODE_ASYNC 0x01 +#define SX126x_TXMODE_SYNC 0x02 +#define SX126x_TXMODE_BACK2RX 0x04 + +// Convert bandwidth constant to float in kHz +//float loraBwToFloat(uint8_t bw); + +// Convert float bandwidth (kHz) to constant +//uint8_t floatToLoraBw(float bw); + +// Convert coding rate constant to float +//float loraCrToFloat(uint8_t cr); + +// Convert float coding rate to constant +//uint8_t floatToLoraCr(float cr); + +// Convert MHz to Hz with limit check +//uint32_t mhzToHzLimited(double freqMHz); + +// Public function +void LoRaInit (void); +int16_t LoRaBegin (uint32_t frequencyInHz, int8_t txPowerInDbm, uint16_t tcxoVoltage, char useRegulatorLDO); +void LoRaConfig (uint8_t spreadingFactor, uint8_t bandwidth, uint8_t codingRate, uint16_t preambleLength, uint8_t payloadLen, char crcOn, char invertIrq); +uint8_t LoRaReceive (uint8_t *pData, int16_t len); +char LoRaSend (uint8_t *pData, int16_t len, uint8_t mode); +void LoRaDebugPrint (char enable); + +// Private function +void spi_write_byte (uint8_t *Dataout, size_t DataLength); +void spi_read_byte (uint8_t *rx, const uint8_t *tx, size_t len); +void spi_read_byte_offs (uint8_t *rx, const uint8_t *tx, size_t len, uint8_t off); +uint8_t spi_transfer (uint8_t address); + +char ReceiveMode (void); +void GetPacketStatus (int8_t *rssiPacket, int8_t *snrPacket, int8_t *rawSnr); +void SetTxPower (int8_t txPowerInDbm); + +void FixInvertedIQ (uint8_t iqConfig); +void SetDio3AsTcxoCtrl (uint16_t voltage, uint32_t delay); +void SetDio2AsRfSwitchCtrl (uint8_t enable); +void ResetLora (void); +void SetStandby (uint8_t mode); +void SetRfFrequency (uint32_t frequency); +void Calibrate (uint8_t calibParam); +void CalibrateImage (uint32_t frequency); +void SetRegulatorMode (uint8_t mode); +void SetBufferBaseAddress (uint8_t txBaseAddress, uint8_t rxBaseAddress); +void SetPowerConfig (int8_t power, uint8_t rampTime); +void SetOvercurrentProtection (uint16_t currentLimit); +void SetSyncWord (int16_t sync); +void SetPaConfig (uint8_t paDutyCycle, uint8_t hpMax, uint8_t deviceSel, uint8_t paLut); +void SetDioIrqParams (uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask); +void SetStopRxTimerOnPreambleDetect (char enable); +void SetLoRaSymbNumTimeout (uint8_t SymbNum); +void SetPacketType (uint8_t packetType); +void SetModulationParams (uint8_t spreadingFactor, uint8_t bandwidth, uint8_t codingRate, uint8_t lowDataRateOptimize); +void SetCadParams (uint8_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin, uint8_t cadExitMode, uint32_t cadTimeout); +void SetCad(); +uint8_t GetStatus (void); +uint16_t GetIrqStatus (void); +void ClearIrqStatus (uint16_t irq); +void SetRx (uint32_t timeout); +void SetTx (uint32_t timeoutInMs); +int GetPacketLost(); +uint8_t GetRssiInst(); +void GetRxBufferStatus (uint8_t *payloadLength, uint8_t *rxStartBufferPointer); +void Wakeup (void); +void WaitForIdleBegin (unsigned long timeout, char *text); +char WaitForIdle (unsigned long timeout, char *text, char stop); +uint8_t ReadBuffer (uint8_t *rxData, int16_t rxDataLen); +void WriteBuffer (uint8_t *txData, int16_t txDataLen); +void WriteRegister (uint16_t reg, uint8_t *data, uint8_t numBytes); +void ReadRegister (uint16_t reg, uint8_t *data, uint8_t numBytes); +void WriteCommand (uint8_t cmd, uint8_t *data, uint8_t numBytes); +uint8_t WriteCommand2 (uint8_t cmd, uint8_t *data, uint8_t numBytes); +void ReadCommand (uint8_t cmd, uint8_t *data, uint8_t numBytes); +void SPItransfer (uint8_t cmd, char write, uint8_t *dataOut, uint8_t *dataIn, uint8_t numBytes, char waitForBusy); +void LoRaError (int error); + +extern uint8_t PacketParams[6]; +extern char txActive; +extern int txLost; +extern char debugPrint; + +#endif diff --git a/User/system_ch32v30x.c b/User/system_ch32v30x.c new file mode 100644 index 0000000..53fe111 --- /dev/null +++ b/User/system_ch32v30x.c @@ -0,0 +1,1036 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : system_ch32v30x.c +* Author : WCH +* Version : V1.0.0 +* Date : 2024/03/06 +* Description : CH32V30x Device Peripheral Access Layer System Source File. +* For HSE = 8Mhz +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#include "ch32v30x.h" + +/* +* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after +* reset the HSI is used as SYSCLK source). +* If none of the define below is enabled, the HSI is used as System clock source. +*/ +//#define SYSCLK_FREQ_HSE HSE_VALUE +//#define SYSCLK_FREQ_48MHz_HSE 48000000 +//#define SYSCLK_FREQ_56MHz_HSE 56000000 +//#define SYSCLK_FREQ_72MHz_HSE 72000000 +#define SYSCLK_FREQ_96MHz_HSE 96000000 +//#define SYSCLK_FREQ_120MHz_HSE 120000000 +//#define SYSCLK_FREQ_144MHz_HSE 144000000 +//#define SYSCLK_FREQ_HSI HSI_VALUE +//#define SYSCLK_FREQ_48MHz_HSI 48000000 +//#define SYSCLK_FREQ_56MHz_HSI 56000000 +//#define SYSCLK_FREQ_72MHz_HSI 72000000 +//#define SYSCLK_FREQ_96MHz_HSI 96000000 +//#define SYSCLK_FREQ_120MHz_HSI 120000000 +//#define SYSCLK_FREQ_144MHz_HSI 144000000 + +/* Clock Definitions */ +#ifdef SYSCLK_FREQ_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_48MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_56MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_72MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_96MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_120MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_120MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_144MHz_HSE +uint32_t SystemCoreClock = SYSCLK_FREQ_144MHz_HSE; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_48MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_56MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_72MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_96MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_96MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_120MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_120MHz_HSI; /* System Clock Frequency (Core Clock) */ +#elif defined SYSCLK_FREQ_144MHz_HSI +uint32_t SystemCoreClock = SYSCLK_FREQ_144MHz_HSI; /* System Clock Frequency (Core Clock) */ +#else +uint32_t SystemCoreClock = HSI_VALUE; /* System Clock Frequency (Core Clock) */ + +#endif + +__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + + +/* system_private_function_proto_types */ +static void SetSysClock(void); + +#ifdef SYSCLK_FREQ_HSE +static void SetSysClockToHSE( void ); +#elif defined SYSCLK_FREQ_48MHz_HSE +static void SetSysClockTo48_HSE( void ); +#elif defined SYSCLK_FREQ_56MHz_HSE +static void SetSysClockTo56_HSE( void ); +#elif defined SYSCLK_FREQ_72MHz_HSE +static void SetSysClockTo72_HSE( void ); +#elif defined SYSCLK_FREQ_96MHz_HSE +static void SetSysClockTo96_HSE( void ); +#elif defined SYSCLK_FREQ_120MHz_HSE +static void SetSysClockTo120_HSE( void ); +#elif defined SYSCLK_FREQ_144MHz_HSE +static void SetSysClockTo144_HSE( void ); +#elif defined SYSCLK_FREQ_48MHz_HSI +static void SetSysClockTo48_HSI( void ); +#elif defined SYSCLK_FREQ_56MHz_HSI +static void SetSysClockTo56_HSI( void ); +#elif defined SYSCLK_FREQ_72MHz_HSI +static void SetSysClockTo72_HSI( void ); +#elif defined SYSCLK_FREQ_96MHz_HSI +static void SetSysClockTo96_HSI( void ); +#elif defined SYSCLK_FREQ_120MHz_HSI +static void SetSysClockTo120_HSI( void ); +#elif defined SYSCLK_FREQ_144MHz_HSI +static void SetSysClockTo144_HSI( void ); + +#endif + + +/********************************************************************* + * @fn SystemInit + * + * @brief Setup the microcontroller system Initialize the Embedded Flash Interface, + * the PLL and update the SystemCoreClock variable. + * + * @return none + */ +void SystemInit (void) +{ + RCC->CTLR |= (uint32_t)0x00000001; + + RCC->CFGR0 &= (uint32_t)0xF0FF0000; + + RCC->CTLR &= (uint32_t)0xFEF6FFFF; + RCC->CTLR &= (uint32_t)0xFFFBFFFF; + RCC->CFGR0 &= (uint32_t)0xFF00FFFF; + +#ifdef CH32V30x_D8C + RCC->CTLR &= (uint32_t)0xEBFFFFFF; + RCC->INTR = 0x00FF0000; + RCC->CFGR2 = 0x00000000; +#else + RCC->INTR = 0x009F0000; +#endif + SetSysClock(); +} + +/********************************************************************* + * @fn SystemCoreClockUpdate + * + * @brief Update SystemCoreClock variable according to Clock Register Values. + * + * @return none + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0; + uint8_t Pll_6_5 = 0; + +#ifdef CH32V30x_D8C + uint8_t Pll2mull = 0; + +#endif + + tmp = RCC->CFGR0 & RCC_SWS; + + switch (tmp) + { + case 0x00: + SystemCoreClock = HSI_VALUE; + break; + case 0x04: + SystemCoreClock = HSE_VALUE; + break; + case 0x08: + pllmull = RCC->CFGR0 & RCC_PLLMULL; + pllsource = RCC->CFGR0 & RCC_PLLSRC; + pllmull = ( pllmull >> 18) + 2; + +#ifdef CH32V30x_D8 + if(pllmull == 17) pllmull = 18; +#else + if(pllmull == 2) pllmull = 18; + if(pllmull == 15){ + pllmull = 13; /* *6.5 */ + Pll_6_5 = 1; + } + if(pllmull == 16) pllmull = 15; + if(pllmull == 17) pllmull = 16; +#endif + + if (pllsource == 0x00) + { + if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE) SystemCoreClock = HSI_VALUE * pllmull; + else SystemCoreClock = (HSI_VALUE >> 1) * pllmull; + } + else + { + +#ifdef CH32V30x_D8 + if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET) + { + SystemCoreClock = (HSE_VALUE >> 1) * pllmull; + } + else + { + SystemCoreClock = HSE_VALUE * pllmull; + } + +#else + if(RCC->CFGR2 & (1<<16)){ /* PLL2 */ + SystemCoreClock = HSE_VALUE/(((RCC->CFGR2 & 0xF0)>>4) + 1); /* PREDIV2 */ + + Pll2mull = (uint8_t)((RCC->CFGR2 & 0xF00)>>8); + + if(Pll2mull == 0) SystemCoreClock = (SystemCoreClock * 5)>>1; + else if(Pll2mull == 1) SystemCoreClock = (SystemCoreClock * 25)>>1; + else if(Pll2mull == 15) SystemCoreClock = SystemCoreClock * 20; + else SystemCoreClock = SystemCoreClock * (Pll2mull + 2); + + SystemCoreClock = SystemCoreClock/((RCC->CFGR2 & 0xF) + 1); /* PREDIV1 */ + } + else{/* HSE */ + SystemCoreClock = HSE_VALUE/((RCC->CFGR2 & 0xF) + 1); /* PREDIV1 */ + } + + SystemCoreClock = SystemCoreClock * pllmull; +#endif + } + + + if(Pll_6_5 == 1) SystemCoreClock = (SystemCoreClock / 2); + + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + + tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)]; + SystemCoreClock >>= tmp; +} + +/********************************************************************* + * @fn SetSysClock + * + * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClock(void) +{ + //GPIO_IPD_Unused(); +#ifdef SYSCLK_FREQ_HSE + SetSysClockToHSE(); +#elif defined SYSCLK_FREQ_48MHz_HSE + SetSysClockTo48_HSE(); +#elif defined SYSCLK_FREQ_56MHz_HSE + SetSysClockTo56_HSE(); +#elif defined SYSCLK_FREQ_72MHz_HSE + SetSysClockTo72_HSE(); +#elif defined SYSCLK_FREQ_96MHz_HSE + SetSysClockTo96_HSE(); +#elif defined SYSCLK_FREQ_120MHz_HSE + SetSysClockTo120_HSE(); +#elif defined SYSCLK_FREQ_144MHz_HSE + SetSysClockTo144_HSE(); +#elif defined SYSCLK_FREQ_48MHz_HSI + SetSysClockTo48_HSI(); +#elif defined SYSCLK_FREQ_56MHz_HSI + SetSysClockTo56_HSI(); +#elif defined SYSCLK_FREQ_72MHz_HSI + SetSysClockTo72_HSI(); +#elif defined SYSCLK_FREQ_96MHz_HSI + SetSysClockTo96_HSI(); +#elif defined SYSCLK_FREQ_120MHz_HSI + SetSysClockTo120_HSI(); +#elif defined SYSCLK_FREQ_144MHz_HSI + SetSysClockTo144_HSI(); + +#endif + + /* If none of the define above is enabled, the HSI is used as System clock + * source (default after reset) + */ +} + + +#ifdef SYSCLK_FREQ_HSE + +/********************************************************************* + * @fn SetSysClockToHSE + * + * @brief Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockToHSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1; + + /* Select HSE as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_HSE; + + /* Wait till HSE is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04) + { + } + } + else + { + /* If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_48MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo48_HSE + * + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo48_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 6 = 48 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_56MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo56_HSE + * + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo56_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_72MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo72_HSE + * + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo72_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + + +#elif defined SYSCLK_FREQ_96MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo96_HSE + * + * @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo96_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 12 = 96 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + + +#elif defined SYSCLK_FREQ_120MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo120_HSE + * + * @brief Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo120_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 15 = 120 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + + +#elif defined SYSCLK_FREQ_144MHz_HSE + +/********************************************************************* + * @fn SetSysClockTo144_HSE + * + * @brief Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo144_HSE(void) +{ + __IO uint32_t StartUpCounter = 0, HSEStatus = 0; + + RCC->CTLR |= ((uint32_t)RCC_HSEON); + + /* Wait till HSE is ready and if Time out is reached exit */ + do + { + HSEStatus = RCC->CTLR & RCC_HSERDY; + StartUpCounter++; + } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); + + if ((RCC->CTLR & RCC_HSERDY) != RESET) + { + HSEStatus = (uint32_t)0x01; + } + else + { + HSEStatus = (uint32_t)0x00; + } + + if (HSEStatus == (uint32_t)0x01) + { + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSE * 18 = 144 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | + RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } + } + else + { + /* + * If HSE fails to start-up, the application will have wrong clock + * configuration. User can add here some code to deal with this error + */ + } +} + +#elif defined SYSCLK_FREQ_48MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo48_HSI + * + * @brief Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo48_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 6 = 48 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + +#elif defined SYSCLK_FREQ_56MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo56_HSI + * + * @brief Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo56_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 7 = 56 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + +#elif defined SYSCLK_FREQ_72MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo72_HSI + * + * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo72_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 9 = 72 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + + +#elif defined SYSCLK_FREQ_96MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo96_HSI + * + * @brief Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo96_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 12 = 96 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + + +#elif defined SYSCLK_FREQ_120MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo120_HSI + * + * @brief Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo120_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 15 = 120 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + + +#elif defined SYSCLK_FREQ_144MHz_HSI + +/********************************************************************* + * @fn SetSysClockTo144_HSI + * + * @brief Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers. + * + * @return none + */ +static void SetSysClockTo144_HSI(void) +{ + EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE; + + /* HCLK = SYSCLK */ + RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1; + /* PCLK2 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1; + /* PCLK1 = HCLK */ + RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2; + + /* PLL configuration: PLLCLK = HSI * 18 = 144 MHz */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL)); + +#ifdef CH32V30x_D8 + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18); +#else + RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18_EXTEN); +#endif + + /* Enable PLL */ + RCC->CTLR |= RCC_PLLON; + /* Wait till PLL is ready */ + while((RCC->CTLR & RCC_PLLRDY) == 0) + { + } + /* Select PLL as system clock source */ + RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW)); + RCC->CFGR0 |= (uint32_t)RCC_SW_PLL; + /* Wait till PLL is used as system clock source */ + while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08) + { + } +} + +#endif diff --git a/User/system_ch32v30x.h b/User/system_ch32v30x.h new file mode 100644 index 0000000..056839b --- /dev/null +++ b/User/system_ch32v30x.h @@ -0,0 +1,32 @@ +/********************************** (C) COPYRIGHT ******************************* +* File Name : system_ch32v30x.h +* Author : WCH +* Version : V1.0.0 +* Date : 2021/06/06 +* Description : CH32V30x Device Peripheral Access Layer System Header File. +********************************************************************************* +* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. +* Attention: This software (modified or not) and binary are used for +* microcontroller manufactured by Nanjing Qinheng Microelectronics. +*******************************************************************************/ +#ifndef __SYSTEM_CH32V30x_H +#define __SYSTEM_CH32V30x_H + +#ifdef __cplusplus + extern "C" { +#endif + +extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */ + +/* System_Exported_Functions */ +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /*__CH32V30x_SYSTEM_H */ + + + diff --git a/User/util/hexdump.c b/User/util/hexdump.c new file mode 100644 index 0000000..8082f4e --- /dev/null +++ b/User/util/hexdump.c @@ -0,0 +1,39 @@ +#include "stdio.h" +#include +#include "hexdump.h" + +void hexdump (const char *label, const uint8_t *data, size_t len) { + if (label) + iprintf ("%s (len=%u):\n", label, len); + + for (size_t i = 0; i < len; i += 16) { + iprintf ("%04u ", i); // offset + for (size_t j = 0; j < 16; j++) { + if (i + j < len) + iprintf ("%02X ", data[i + j]); + else + iprintf (" "); // pad spacing + } + iprintf (" "); + for (size_t j = 0; j < 16 && i + j < len; j++) { + uint8_t c = data[i + j]; + iprintf ("%c", isprint (c) ? c : '.'); + } + iprintf ("\n"); + } +} + +void hexdump_compact(const uint8_t* data, size_t len, char* out, size_t out_size) { + size_t pos = 0; + + for (size_t i = 0; i < len; i++) { + if (pos + 2 >= out_size) break; // make sure we don¡¯t overflow + snprintf(out + pos, 3, "%02x", data[i]); // 2 chars + null terminator + pos += 2; + } + + if (pos < out_size) + out[pos] = '\0'; + else + out[out_size - 1] = '\0'; // ensure null termination +} \ No newline at end of file diff --git a/User/util/hexdump.h b/User/util/hexdump.h new file mode 100644 index 0000000..85fa06b --- /dev/null +++ b/User/util/hexdump.h @@ -0,0 +1,11 @@ +#ifndef HEXDUMP_HEADER +#define HEXDUMP_HEADER + + +#include "stddef.h" +#include "stdint.h" +void hexdump (const char *label, const uint8_t *data, size_t len); + +void hexdump_compact(const uint8_t* data, size_t len, char* out, size_t out_size); + +#endif \ No newline at end of file diff --git a/User/util/log.h b/User/util/log.h new file mode 100644 index 0000000..db555b9 --- /dev/null +++ b/User/util/log.h @@ -0,0 +1,33 @@ +#ifndef LOGGER_HEADER +#define LOGGER_HEADER + +#include + +// Log levels as integers for easy comparison +#define LOG_LEVEL_ERROR 0 +#define LOG_LEVEL_WARN 1 +#define LOG_LEVEL_INFO 2 +#define LOG_LEVEL_DEBUG 3 +#define LOG_LEVEL_VERBOSE 4 + +// Current log level (change at runtime or compile-time) +#ifndef CURRENT_LOG_LEVEL +#define CURRENT_LOG_LEVEL LOG_LEVEL_DEBUG +#endif + +// Internal macro to check log level +#define LOG_PRINT_IF(level, levelStr, tag, fmt, ...) \ + do { \ + if ((level) <= CURRENT_LOG_LEVEL) { \ + printf("[%s] %s: " fmt "\r\n", levelStr, tag, ##__VA_ARGS__); \ + } \ + } while(0) + +// ESP-like shortcuts +#define MESH_LOGE(tag, fmt, ...) LOG_PRINT_IF(LOG_LEVEL_ERROR, "E", tag, fmt, ##__VA_ARGS__) +#define MESH_LOGW(tag, fmt, ...) LOG_PRINT_IF(LOG_LEVEL_WARN, "W", tag, fmt, ##__VA_ARGS__) +#define MESH_LOGI(tag, fmt, ...) LOG_PRINT_IF(LOG_LEVEL_INFO, "I", tag, fmt, ##__VA_ARGS__) +#define MESH_LOGD(tag, fmt, ...) LOG_PRINT_IF(LOG_LEVEL_DEBUG, "D", tag, fmt, ##__VA_ARGS__) +#define MESH_LOGV(tag, fmt, ...) LOG_PRINT_IF(LOG_LEVEL_VERBOSE, "V", tag, fmt, ##__VA_ARGS__) + +#endif diff --git a/meshcorenortos.launch b/meshcorenortos.launch new file mode 100644 index 0000000..6ab44c3 --- /dev/null +++ b/meshcorenortos.launch @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/meshcorenortos.wvproj b/meshcorenortos.wvproj new file mode 100644 index 0000000..27819d4 --- /dev/null +++ b/meshcorenortos.wvproj @@ -0,0 +1,421 @@ +{ + "version": "1.0", + "hasAllParsed": true, + "isNormalMRSProject": true, + "basic": { + "chipInfo": { + "vendor": "WCH", + "toolchain": "RISC-V", + "series": "CH32V307", + "rtos": "NoneOS", + "mcu": "CH32V307VCT6", + "description": "Website: http://www.wch.cn/products/CH32V307.html?\\nROM(byte): 256K, SRAM(byte): 64K, CHIP PINS: 100, GPIO PORTS: 80.\\nWCH CH32V3 series of mainstream MCUs covers the needs of a large variety of applications in the industrial,medical and consumer markets. High performance with first-class peripherals and low-power,low-voltage operation is paired with a high level of integration at accessible prices with a simple architecture and easy-to-use tools.", + "tempratureScope": "CH32V307VCT6{-40℃~85℃}", + "link": "WCH-Link", + "peripheral_version": "2.9", + "calibrateSupport": false + }, + "linkedFolders": [], + "removedResources": [ + { + "parentLogicPath": "", + "type": "file", + "name": "*.wvproj" + }, + { + "name": "FreeRTOSConfig.h", + "parentLogicPath": "User", + "type": "file" + } + ], + "projectName": "meshcorenortos", + "architecture": "RISC-V", + "projectType": "c" + }, + "buildConfig": { + "configurations": [ + { + "buildArtifact": { + "artifact_name": "${ProjName}", + "artifact_extension": "elf", + "output_prefix": "", + "artifact_type": "Executable" + }, + "parallelizationNumber": "optimal", + "stop_on_first_build_error": true, + "pre_script": "", + "pre_script_description": "", + "post_script": "", + "post_script_description": "", + "excludeResources": [ + "${project}/Startup/startup_ch32v30x_D8.S" + ], + "optimization": { + "level": "size", + "message_length": true, + "char_is_signed": true, + "function_sections": true, + "data_sections": true, + "no_common_unitialized": true, + "do_not_inline_functions": false, + "assume_freestanding_environment": false, + "disable_builtin": false, + "single_precision_constants": false, + "position_independent_code": false, + "link_time_optimizer": false, + "disable_loop_invariant_move": false, + "optimize_unused_sections_declared_as_high_code": false, + "code_generation_without_hardware_floating": false, + "use_pipelines": false, + "show_caret_indicating_the_column": false, + "calling_convention_variant": false, + "other_optimization_flags": "" + }, + "warnings": { + "check_syntax_only": false, + "pedantic": false, + "pedantic_warnings_as_errors": false, + "inhibit_all_warnings": false, + "warn_on_various_unused_elements": true, + "warn_on_uninitialized_variables": true, + "enable_all_common_warnings": false, + "enable_extra_warnings": false, + "warn_on_undeclared_global_function": false, + "warn_on_implicit_conversions": false, + "warn_if_pointer_arthmetic": false, + "warn_if_padding_is_included": false, + "warn_if_shadowed_variable": false, + "warn_if_suspicious_logical_ops": false, + "warn_if_struct_is_returned": false, + "warn_if_floats_are_compared_as_equal": false, + "generate_errors_instead_of_warnings": false, + "other_warning_flags": "" + }, + "debugging": { + "debug_level": "default", + "debug_format": "default", + "generate_prof_information": false, + "generate_gprof_information": false, + "other_debugging_flags": "" + }, + "assembler": { + "preprocessor": { + "use_preprocessor": true, + "do_not_search_system_directories": false, + "preprocess_only": false, + "defined_symbols": [], + "undefined_symbols": [] + }, + "includes": { + "include_paths": [ + "${project}/Startup" + ], + "include_system_paths": [], + "include_files": [] + }, + "other_warning_flags": "", + "miscellaneous": { + "assembler_flags": [], + "generate_assembler_listing": false, + "save_temporary_files": false, + "verbose": false, + "other_assembler_flags": "" + } + }, + "ccompiler": { + "preprocessor": { + "do_not_search_system_directories": false, + "preprocess_only": false, + "defined_symbols": [], + "undefined_symbols": [] + }, + "includes": { + "include_paths": [ + "${project}/Debug", + "${project}/Core", + "${project}/User", + "${project}/Peripheral/inc" + ], + "include_system_paths": [], + "include_files": [] + }, + "optimization": { + "language_standard": "gnu99", + "other_optimization_flags": "" + }, + "warnings": { + "warn_if_a_global_function_has_no_prototype": false, + "warn_if_a_function_has_no_arg_type": false, + "warn_if_wrong_cast": false, + "other_warning_flags": "" + }, + "miscellaneous": { + "generate_assembler_listing": false, + "save_temporary_files": false, + "verbose": false, + "other_compiler_flags": "" + } + }, + "cppcompiler": { + "preprocessor": { + "do_not_search_system_directories": false, + "do_not_search_system_cpp_directories": false, + "preprocess_only": false, + "defined_symbols": [], + "undefined_symbols": [] + }, + "includes": { + "include_paths": [], + "include_system_paths": [], + "include_files": [] + }, + "optimization": { + "cpp_language_standard": "gnucpp11", + "abi_version": "0", + "do_not_use_exceptions": false, + "do_not_use_rtti": false, + "do_not_use__cxa_atexit": false, + "do_not_use_thread_safe_statics": false, + "other_optimization_flags": "" + }, + "warnings": { + "warn_on_abi_violations": false, + "warn_on_class_privacy": false, + "warn_on_no_except_expressions": false, + "warn_on_virtual_destructors": false, + "warn_on_uncast_null": false, + "warn_on_sign_promotion": false, + "warn_about_effictive_cpp_violcations": false, + "other_warning_flags": "" + }, + "miscellaneous": { + "generate_assembler_listing": false, + "save_temporary_files": false, + "verbose": false, + "other_compiler_flags": "" + } + }, + "clinker": { + "general": { + "scriptFiles": [ + "${project}/Ld/Link.ld" + ], + "do_not_use_standard_start_files": true, + "do_not_use_default_libraries": false, + "no_startup_or_default_libs": false, + "remove_unused_sections": true, + "print_removed_sections": false, + "omit_all_symbol_information": false + }, + "libraries": { + "libraries": [ + "m" + ], + "library_search_path": [] + }, + "miscellaneous": { + "picolibc": "disabled", + "linker_flags": [], + "other_objects": [], + "generate_map": "\"${BuildArtifactFileBaseName}.map\"", + "cross_reference": false, + "print_link_map": false, + "use_newlib_nano": true, + "use_float_with_nano_printf": false, + "use_float_with_nano_scanf": false, + "do_not_use_syscalls": true, + "verbose": false, + "use_wch_printffloat": false, + "use_wch_printf": false, + "use_iqmath": false, + "other_linker_flags": "" + } + }, + "cpplinker": { + "general": { + "scriptFiles": [ + "${project}/Ld/Link.ld" + ], + "do_not_use_standard_start_files": true, + "do_not_use_default_libraries": false, + "no_startup_or_default_libs": false, + "remove_unused_sections": true, + "print_removed_sections": false, + "omit_all_symbol_information": false + }, + "libraries": { + "libraries": [ + "m" + ], + "library_search_path": [] + }, + "miscellaneous": { + "picolibc": "disabled", + "linker_flags": [], + "other_objects": [], + "generate_map": "\"${BuildArtifactFileBaseName}.map\"", + "cross_reference": false, + "print_link_map": false, + "use_newlib_nano": true, + "use_float_with_nano_printf": false, + "use_float_with_nano_scanf": false, + "do_not_use_syscalls": true, + "verbose": false, + "use_wch_printffloat": false, + "use_wch_printf": false, + "use_iqmath": false, + "other_linker_flags": "" + } + }, + "archiver": { + "archiver_flags": "-r", + "libOutputPrefix": "lib" + }, + "createFlash": { + "enabled": true, + "outputFileFormat": "ihex", + "copy_only_section_text": false, + "copy_only_section_data": false, + "copy_only_sections": [], + "other_flags": "" + }, + "createList": { + "enabled": true, + "display_source": false, + "display_all_headers": true, + "demangle_names": true, + "display_debug_info": false, + "disassemble": true, + "display_file_headers": false, + "display_line_numbers": false, + "display_relocation_info": false, + "display_symbols": false, + "wide_lines": false, + "other_flags": "" + }, + "printSize": { + "enabled": true, + "size_format": "berkeley", + "hex": false, + "show_totals": false, + "other_flags": "" + }, + "configVariables": [], + "riscvTargetProcessor": { + "architecture": "rv32i", + "multiply_extension": true, + "atomic_extension": true, + "floating_point": "none", + "compressed_extension": true, + "extra_compressed_extension": true, + "bit_extension": false, + "multiplication_subset_of_the_M_extension": false, + "vector_cryptography_extensions": "", + "integer_ABI": "ilp32", + "floating_point_ABI": "none", + "tuning": "default", + "code_model": "default", + "small_data_limit": 8, + "align": "default", + "save_restore": true, + "other_target_flags": "" + }, + "component_toolchain": "${WCH:Toolchain:GCC8}", + "name": "obj" + } + ] + }, + "flashConfig": { + "mcutype": "CH32V30x", + "address": "0x08000000", + "target_path": "obj/meshcorenortos.hex", + "clkSpeed": "High", + "debug_interface_mode": "1-wire serial", + "erase": true, + "program": true, + "verify": true, + "reset": true, + "sdiPrintf": false, + "disablepowerout": false, + "clearcodeflash": false, + "disablecodeprotect": false, + "exepath": "", + "exearguments": "" + }, + "debugConfigurations": { + "openOCDCfg": { + "useLocalOpenOCD": true, + "executable": "${WCH:OpenOCD:default}", + "gdbport": 3333, + "telnetport": 4444, + "tclport": 6666, + "configOptions": [ + "-f \"${WCH:OpenOCD:default}/bin/wch-riscv.cfg\"" + ], + "host": "localhost", + "port": 3333, + "skipDownloadBeforeDebug": false, + "enablePageEraser": false, + "enableNoZeroWaitingAreaFlash": false + }, + "gdbCfg": { + "executable": "${WCH:Toolchain:GCC8}", + "options": [], + "commands": [ + "set mem inaccessible-by-default off", + "set architecture riscv:rv32", + "set remotetimeout unlimited", + "set disassembler-options xw" + ] + }, + "startup": { + "initCommands": { + "initReset": true, + "initResetType": "init", + "additionalCommands": [], + "armSemihosting": false, + "armSemihosting_old": false + }, + "loadedFiles": { + "loadSymbols": true, + "useProjBinaryForSymbols": true, + "useFileForSymbols": false, + "symbolFile": "", + "symbolFileOffset": "", + "loadImage": true, + "useProjBinaryForImage": true, + "useFileForImage": false, + "executableFile": "", + "executableFileOffset": "" + }, + "runCommands": { + "runReset": true, + "runResetType": "halt", + "additionalCommands": [], + "setBreakAt": "handle_reset", + "continue": true, + "setBreak": true, + "setProgramCounter": false, + "setProgramCounterAddress": "" + }, + "debugInRAM": false + }, + "svdpath": "${WCH:SDK:default}/RISC-V/CH32V307/NoneOS/CH32V307xx.svd", + "output": { + "showDebugGDBTrace": true, + "saveDebugOutputToFile": false, + "showDebugOutputTimestamps": true + }, + "reserve": { + "PROGRAM_NAME": "obj\\meshcorenortos.elf", + "PROJECT_ATTR": "meshcorenortos", + "PROJECT_BUILD_CONFIG_AUTO_ATTR": true, + "PROJECT_BUILD_CONFIG_ID_ATTR": "", + "ATTR_BUILD_BEFORE_LAUNCH_ATTR": 2, + "GdbServerAllocateConsole": true, + "GdbServerAllocateTelnetConsole": false, + "StartGdbCLient": true, + "UPDATE_THREADLIST_ON_SUSPEND": false + } + } +} \ No newline at end of file diff --git a/obj/Core/core_riscv.d b/obj/Core/core_riscv.d new file mode 100644 index 0000000..25ba9bb --- /dev/null +++ b/obj/Core/core_riscv.d @@ -0,0 +1 @@ +Core/core_riscv.o: ../Core/core_riscv.c diff --git a/obj/Core/core_riscv.o b/obj/Core/core_riscv.o new file mode 100644 index 0000000000000000000000000000000000000000..ca93f44e55512666de76ce39a9dc9345f3f3e9d7 GIT binary patch literal 20792 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 literal 0 HcmV?d00001 diff --git a/obj/Core/subdir.mk b/obj/Core/subdir.mk new file mode 100644 index 0000000..33810af --- /dev/null +++ b/obj/Core/subdir.mk @@ -0,0 +1,29 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../Core/core_riscv.c + +C_DEPS += \ +./Core/core_riscv.d + +OBJS += \ +./Core/core_riscv.o + +DIR_OBJS += \ +./Core/*.o \ + +DIR_DEPS += \ +./Core/*.d \ + +DIR_EXPANDS += \ +./Core/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +Core/%.o: ../Core/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/Debug/debug.d b/obj/Debug/debug.d new file mode 100644 index 0000000..576c817 --- /dev/null +++ b/obj/Debug/debug.d @@ -0,0 +1,90 @@ +Debug/debug.o: ../Debug/debug.c ../Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +../Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Debug/debug.o b/obj/Debug/debug.o new file mode 100644 index 0000000000000000000000000000000000000000..48ceb40ca48b6960603af83b33de11499dc83c2d GIT binary patch literal 30800 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≤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 a`2!>l8ahK(7f{5&@Ec?aND}H_5EB5n43~ER literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_can.d b/obj/Peripheral/src/ch32v30x_can.d new file mode 100644 index 0000000..99f1cb7 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_can.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_can.o: ../Peripheral/src/ch32v30x_can.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_can.o b/obj/Peripheral/src/ch32v30x_can.o new file mode 100644 index 0000000000000000000000000000000000000000..ba791a793b2bb0f3d342782896cd14f5a2946dd7 GIT binary patch literal 95052 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
$CcgQ@}TM^^d)5eKo=plU#OE-U?nh=bT_P&Fzb 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 J26f%RGysI=i^~82 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_crc.d b/obj/Peripheral/src/ch32v30x_crc.d new file mode 100644 index 0000000..08fcbef --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_crc.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_crc.o: ../Peripheral/src/ch32v30x_crc.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_crc.o b/obj/Peripheral/src/ch32v30x_crc.o new file mode 100644 index 0000000000000000000000000000000000000000..afbcc1d7f8d8eb16e5509b1be04725de11b72e34 GIT binary patch literal 17636 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_dac.d b/obj/Peripheral/src/ch32v30x_dac.d new file mode 100644 index 0000000..30928cb --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_dac.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_dac.o: ../Peripheral/src/ch32v30x_dac.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_dac.o b/obj/Peripheral/src/ch32v30x_dac.o new file mode 100644 index 0000000000000000000000000000000000000000..59c0074718d11f92f1489f36c72c841d21dcef51 GIT binary patch literal 31416 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_dbgmcu.d b/obj/Peripheral/src/ch32v30x_dbgmcu.d new file mode 100644 index 0000000..6d8559c --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_dbgmcu.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_dbgmcu.o: ../Peripheral/src/ch32v30x_dbgmcu.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_dbgmcu.o b/obj/Peripheral/src/ch32v30x_dbgmcu.o new file mode 100644 index 0000000000000000000000000000000000000000..e6359bed5a4e7da66b8a90f3a6380f2fa0439700 GIT binary patch literal 17536 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_dma.d b/obj/Peripheral/src/ch32v30x_dma.d new file mode 100644 index 0000000..9388765 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_dma.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_dma.o: ../Peripheral/src/ch32v30x_dma.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_dma.o b/obj/Peripheral/src/ch32v30x_dma.o new file mode 100644 index 0000000000000000000000000000000000000000..4b207f1bbf014635fc0ad5b016e156327dc1797a GIT binary patch literal 33272 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_dvp.d b/obj/Peripheral/src/ch32v30x_dvp.d new file mode 100644 index 0000000..c59e188 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_dvp.d @@ -0,0 +1,91 @@ +Peripheral/src/ch32v30x_dvp.o: ../Peripheral/src/ch32v30x_dvp.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dvp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dvp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_dvp.o b/obj/Peripheral/src/ch32v30x_dvp.o new file mode 100644 index 0000000000000000000000000000000000000000..5d1f6c566214d1abfb6a7e88e43411055d19de17 GIT binary patch literal 18672 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_exti.d b/obj/Peripheral/src/ch32v30x_exti.d new file mode 100644 index 0000000..d9ebb39 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_exti.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_exti.o: ../Peripheral/src/ch32v30x_exti.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_exti.o b/obj/Peripheral/src/ch32v30x_exti.o new file mode 100644 index 0000000000000000000000000000000000000000..2b33b4880f0594b54b2d669aa438a9a216b21e95 GIT binary patch literal 23464 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_fsmc.d b/obj/Peripheral/src/ch32v30x_fsmc.d new file mode 100644 index 0000000..7d6b4c3 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_fsmc.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_fsmc.o: ../Peripheral/src/ch32v30x_fsmc.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_fsmc.o b/obj/Peripheral/src/ch32v30x_fsmc.o new file mode 100644 index 0000000000000000000000000000000000000000..51b37a35b05c95ffcf9ab6d11a1ba73aeda4492a GIT binary patch literal 38360 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 ARR910 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_i2c.d b/obj/Peripheral/src/ch32v30x_i2c.d new file mode 100644 index 0000000..9aa9842 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_i2c.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_i2c.o: ../Peripheral/src/ch32v30x_i2c.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_i2c.o b/obj/Peripheral/src/ch32v30x_i2c.o new file mode 100644 index 0000000000000000000000000000000000000000..07a72a23f7cb9fe1bfabf90bcbed9786d70993f0 GIT binary patch literal 65412 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_iwdg.d b/obj/Peripheral/src/ch32v30x_iwdg.d new file mode 100644 index 0000000..4f0ca4d --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_iwdg.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_iwdg.o: ../Peripheral/src/ch32v30x_iwdg.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_iwdg.o b/obj/Peripheral/src/ch32v30x_iwdg.o new file mode 100644 index 0000000000000000000000000000000000000000..1fe80215270694f2393a4290c08fbf154b866f36 GIT binary patch literal 18264 zcmb<-^>JflWMqH=MuyJ}2p$8&1t$hD-vq2cgF%)-hGDxogG0yRrUnpw0!nurZ)#YZ zZf?%tFu8sCDw)Gg4O^kS<7Z?Jn~O6!!~}PCf4vXUb;rH7*VuFcLsLTmHv_?0<(m$F#`jXts>$JXB&v5GcYi)E@xn1U}I-dWnf@n@#MSA zz`y`Df`KF0HH3i?qL0N>V+R8R11HE?T*87NEnEVu5=@+Wj0_CiAW>E+Cc(`h281UK z;jut?G7ugIgeME(@i2fxhgFV=`85Lr1D64-1{3EyxOrL-RZ!ElAv~ygIuIVzJY5Kn z2V%M&geL&u=|gxT5S{^qCjsFZLU=L|o)Ltn0O1)!cq$N{352Hs;h92sI#BnUF)>>+ zLc^C$Ns^t3fq|EWmx+Oa4-_2WC}7v&OMnGCdl3?QqId@b1H>GTR7P=79PqQSFJn$+ zVqg#eX=h)-V+Loh6b6Yi2!fJIDH8*O5J){UgD?mCV$PXN3=AS*9ZT6kW{pd4usM?gHjf`QYRTOMo_FUx)=1_r^+ObiVA%utszFo5k-;WX#i z1Xct}VV0aA%@EgfT7fxG3$4K%sD(CQ4%9+hFh>AlyB(M#0^!($IT8?#1DGQN;W&ah z3Jek;FLN+*dU1S*yTO|a#D==ThZDqUkOZmY^y32gfPoRh3k3667#RdNGBGf)vq1eN z4>5ECBWEm!7Yi&P!I{5X6QWUk)*zftLl8RKTh;IJa`#U}azsk1t^0+$IE8 zEFNFPz_}d~sp9eF44gZ_Y^Y0ia=L-iCM39afjNBQ@kwb6oVx|nSr{0g;k^f}2O7kO zxj-QS4dSD+G3*Qs3J?R1%eJvIFsMK{r+8PfGcagCIHx&}urn~|h{u;EF>sy(8*LyS zUs}Mxc^>Rc3-S2UA_mS2V0&yJdM*o|VrO7*fN-t|-ePB9a2AixNn+r<4mQ9AB6AC@ z#|Of>%_YRdzz_i8+!Ol7%D@l;;XLA5%EZ7B0pUF117)Qc2A)lc;z5csP6sAA5D!w6aXK+^fXs&!Wt`4T9A;b$43MIX(+y�mKG(CNXa=1_l!d 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_misc.d b/obj/Peripheral/src/ch32v30x_misc.d new file mode 100644 index 0000000..e653909 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_misc.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_misc.o: ../Peripheral/src/ch32v30x_misc.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: diff --git a/obj/Peripheral/src/ch32v30x_misc.o b/obj/Peripheral/src/ch32v30x_misc.o new file mode 100644 index 0000000000000000000000000000000000000000..a2a330a0b7e1e3317b854835107f3e88d557fb29 GIT binary patch literal 23744 zcmb<-^>JflWMqH=MuyJ}2p$7NM+5_yZvs}J!63~b#ju^7fkAn}a)zb`5Q}*^J42_t zfMT-XcP0_TUiaj;*BNXSXR(<-XLvA;{c8W@@89{2rYkdicL;H0b)Os_#$YUdoT2m7 zMlgZ+ z>?}D<3=GV=d|(PB!o&#U7!K4eAbOn=cVA35-dVon!FzE#*y}_gpnDhmceqhocOa_3-Krk5uCWFCb z2$&27lVM;o985-l$w)961tz1xWDJ;$1(R`LG9FAOfXPHKnFJ=2!DI@UOa+r^U^1P7 zg@qlIU|2x}^G;?}1_lNeMm7)+EX1NMF^LHz!~qgwVS)%Uf%UMkfO%ko#b0t4NFBs9 z77mCY2Ur~&3u|Ux2?JP&RYJIpiGhLr8WRIlz(8aj69WUsbCBp~5CLLwLJ~HUJ0B=r zft|_#CK(~RnB4V237t!Xm&uPahlPQG+cP+bfyrO65tMJZJp+Omm;wabSQr=-z?p|B zQ1CAk1A_yE69neCKsdo*jt7JjBKU)efx!pD2^E;l!oUy!;e>H7U}0bgfpEeF53n#W zBtSS3+(%g$7z%hn0mKw3_!Q&}vsD20oC7 zYgiZ<_(4SoI|BzOG}%D{V1n-v69WS%7{JoZ4D8)33=Djr*xLZp!_B}43R_T!z!ZVx zz>2QI6!k+CfdU7th@F8QBnMUmax+*k9%3>VE7Udj8Nk+qd;ymK&%h3n18Xv1Wnd5h zIhmgWnk3SgKxKy@C>pqg1wp9@td!u?=SX9N zn#O4;3}Q2I$7eHe8i7q_0b9dq#0|2B1IiHrad@B{X%I(%JHCQ})0jJl4dg)~79KVR z20jKh28J3oXoxc~fbCP^H0Ssax6hIjq#5FRPAf16YN0il1GUfw%z;{H3+4zwY_|h* zL?9e{Fh>HyaR75TGC>d0pXnH z6y#=L(BY0RO=93Y2R7P(JHE7lf%81rnHJpfr9}*!7r^$|K=fP|6z7JOu$)%})wvlM zoVnw3k{CFzgAITbx16`YdLSh%=WVWdR#*wkc~8ih6IQ}d;tj0nTeyBmw`b9!gGU|X#nB5 zGl|XMWneIY@H`=M77(5{6W2;!1_m1l&yNY5p&cMRe~3yK2rmF4=K0HrgeI0Fg6;_N0!4M-O#`61LW2(kR-Vt^E~pmYV! zc}x(#IX5(mgNif;1_n-fMyW^a3=E1OkMnRUGjh~&GeDzRl~EAHf%4QC!ASrb>FSK& zB*4KS!~*iY5DUm)upxY$_KX~d;D$Ib3V}FKLmVMIHb|&DF$ygJWl#n_5OoRWG$sb6 z3!ITm?9X{%E{SH6097ndLt>bOKv4&ENi359NFg-&#W9J4N@o>_1@TP$px}WfhXf{_ z6HE*Y&;*dkB-P2yzz_jZnZzUp$}|}eUNVGN0O6%Tcoh&{DwDu>9tMU62rrFEfSs3t zp##E8huF6O!pnf@TLR%_LU?N+yetTB3xt;q;q8I&av;1T5MC}M3!P!$10^Al)!_J) zgz!O@gZbvD@*&0g^& z`$nM50Oc!x;0$MC2IX57P#WRPW8wzI6ogaG#0|0$V)ta2-4c+7gAfZyL=}{E!HJVW zh-DrxC~br4V^vTdf+gf*VBxL23=DjrbaV%15EFwM*iLq4aZp}?a5$J{JvkW|#5uT~ zI8FGVH6FJMFQ}CTsXe$|!5l_#3CQgR<}g7x?xLU;G7F>)#O=ZSjhBHz9b^Y1A3vyB z2I&K8fJGd@ITy^FbB&LIK@-e$Py(?TqqG?LL3{{i4B?&2$H1U10~OQehcXy+Twp8) z1_s7t&fOqozA!OeEf@H_U1~#Y+2Ll7UDFaA^Lk&!EvM{0>$0f|j%?i;9GM$^3ftdrs^%S6Zl%D}+K$ml5y(#x;N;3=%n&A=c4X0S3a2$~>iwwJV#WMB~DX8`$!fk9Z9 zfte2^A_8?ht0gzcsiNYH+}scsfD9EwwvK^8To^@G0%RHkgQPGcGas@pDX;*NzobPO z)Fl}hWJDR&B_XbrWd#R`99$(UBz)ze7J{7v@~{Gm04oE7B3KK^jZiI0P)9+z%1|Fb zxhlx|85mSSP5}8#4H`ILiy(oc4i(}C1%FLJ4u2} z&}2mlUXWrfSw=(QAjVMf2<}MkaByD z${GUCF)%PP{^sLlV1x|KF)}bP>gnkRq!wisWTX}) z=I9p}B{S$}m*y2^mZcWy7MGN!WajG@6y;~7CYKcJ=cX2CB&Lu(NKMf@^M4YD!9Kih{edvwl%# zadMe%UVdJxZYoGzKQk{mr!*y1KQ}QsBQq~`KB-5Mez(vw(ldaC z0C_PNTAW(Mz>u6_Y*c1!P!XS-S)8nw3>wu1rHgoQXzOJ#Fd>xaWq?MQ;!{%75=(PR z;!7$EQj7I6KxsX`xFjVruS72cRLSP#Cuc)ga3!n^48nZ zR6(R!c_B0l6DuZ2O3e02h3-ff2cg;&o%1QMM3S@{cF3zk(LN zOHvu)6N{5eGILYolS=9=HnRb0bzn%n#~Xv;^ye$62uUn zTbfhC5aQ_z^>C2~sVQ8?EM=*pL;^}K>5FZlc9`Ee$3lVa5^fQVNihz5qJUN3Q zKE5 zDDt4GIyBfR-XkF1+0oB1J|qI77#w2pX?evA@yR*)#i{5%3n)rW%`GU&%+G^+Fu={z zIXV)|Gw6x;X z5^%-`@9GLdJ9N04i<3)l_tsDcJbe0*_AW=dvWW(h-lT25kmu@Qr3K#-?@5Gb{mq~?Me zH_o71i2)o<@K^^IjIbbx2ZsRzDEmMn!qe3cY#X8oggP*_s3pLwss(YEgP>UUDVK6_yA!A)dbG z5HEp)8%%&);u_)+AMOovYX+^22Ihn;J4Dnzq<00073KfQ+5NF4n#G+h?dqDvJjeF#DZwiqG zr8=l=d`3JZwjeHQ>;h|oV8($7` z7bK=(S+YRw3)4d6*2H>o7QJQ*57VIgjwExTL5gKRZ4rvABf6(FGcz zkP0LesR992_DG=;p9U&mzya*$35pMB3Wx_cOe|1CH@?Wkf*~Nx1rjyonRzAgB@CWH zu0agYq>_?Yk_ZkuXwwATi~-dLrO^5SIoU%!>KPCe1gbXTeW2A5ykUc!Vqt-nn}leo zfHFL&++!%t$S*1Zw^=*`f`b@>V2P{%)_RCf%LBLi8C?C4QeA3d5rb1vYGQVLKt9MX zV6)evQvnsFSO+npIIEAT#?8S@8j?69UlS-i!=skea{dd zAL^5zm(CEJpH@7Mq0!6K1JUnVaY0)wsT1tQ_E>LtO zrlcU!GN=Z2Nlk+W1ZolmHBB?}ON$ud48dS0oerGjo+ZeoRQYEe;sQL(L&0f?VkT%4Gms+*IVmtK-# z3lajAmZ>SapeBfdZW^fS24zj%;#6=JEmqJ?1KWzk&&$_M&d&uk7D3^INFSi~d3iFd zeGaacV09&=s*F#|1Gj|1MP_DkN-?+M4SOtY!Ze|`se0pk0N@7VWs6+;p=a9r7 z8tmi-ZJ;BkX{a+8+?}1R6f`OV5|gtPKtYUUTtG*`%tSXSvqTdT_K?Bh|NsC0XJlZk zVdQ0kj1MD?!GK4Fk@)CL@PZD4C)_4m|&6_)I$cdAOtf5 z3j=t*9l~V*&1#dw2d^ywn*lM83(N))ptTer8iJV_*wE}FkB_hqqF(@FJOcyNe007L zn!E%7K6nBftOjDf444ffAbjvV8;A?FPYKKh5fFLMNE?U;a}RjT94r8lN9Tiw%aP>K z`8HrV5CPFoi0=bZ3dRuig!oZlwIBkbJ`ThLV+cP1%mxwgVSf;Zfti5=vZMmc0}+Ur z0r9}Y4Il;-Gc#~QSrCdDE%h@q@IfS?Br^jdCP6~X42YP7@I}Ds2|2xi(l4@mL41%} z2o_@i#T|0^g5nA}d=PO1(!tGO!N9;!0C%A`HPG zVK^3GNQSdP3?YU>1_p+o@JuYiP{qIiUY`S!1x-`}7 zeg*~xf6yojh|3_tFb(8BcmRkn%w=F;kN^)wffR@^EMZ_^xP>IYnt_2~Jv>{AFl=IA zU|57?-cFEuB=;R)U|^UJFO)gApPO9~c-IOpwg~!N9=q8!0?NMH*z)AV`l00|z4mLqC#z0*nj{JV<;AMh1qP zNcJf(GBDJGw1Tk+g9al5Lm85N28;|0QApu!!N|bihU9(+Mh1oq@X|Gq0U`_@j0_Cl zk>mpy85r1*(nka%1A`b+`bc18U=Tr)&tPO=fUHb}m{-8a!0-{t{S}N147%`aB*M_Z z$iPs6(SVWMG(s1IWEd=Ko-1U^sxJA5?|OBdO3u!D}6ye5MkKC#K5ou$vp>{ z7#PkWsRu1sU`I0V0uuwn79{=+CI*H-Afv!ogy8`b1H(V0@P5I>!0;3)em^iVFo+_# zAGDm&9!Wi@$zq6rl6wo785o?A z{8z!uz+j2wo(5(H2FTPm#QY9s1_o2)_-AHdutQ4kGnp9}nvnD_VrF3Yk7VC!W(J0R zNa=42GXsMzQuyy>W?-0(6#mDU85sPL+y^RKULe_jgPDQh1(N?BGBYs5BgwyFW?;xh zGVe1p1H%O*`~NUAFbE*=SwTy7k@$Qp3=Gqd_~I-K3{gntDX=gw#3Q*+lZAod2`H$* zScJidg@GXxN#2@;fx!tWJX}~97$B>!cw zFfeo@$rrLPFnmJNU&X?}FcnF@nT3I20+N4vSQr@QBgs!?VPN==BtMUZfng<*{Bjls z20M^b!B~U=v{ZLJQhMCU!oa|WrC|85m9?rSE7~1_mo6 z|EI7rFwBBDjsevE0=4b7A@R#t85lZ|%ENkA28KYS@akY?V6Z?+{}Wjm82%xJ$1GL` zhBPGiFJ@(6xPYX74J!k~2PFPhRtAP_B>VQUGB5-qnRlF(fgu@5{sJol!ycsYzRAkK z5Qb#mBUT26%}D&$tPBh@k?i}z%D@2GnE>*%2*Y1i28KqY^u)%-z_18OKR+7-18C78 zNHr+DB-j`j)*-nMv@$3fDSWip7#JoY*=Nkgz~GCd-iD2Vp%KY^S2hL)Nu>DkV`E^5 zg;)lTpKvw?q&Bq(Ljovnk^G;@#=y{qQ*AF)-{!lAq7Uz;F*D3D&=Yje(&K$$uN!7#O}IxqlZM1H%`j^nRF) zfdRCV9b$wC!x=UPhMh?6y~@VG@CwO4_t+R1a*@n`&c?vdg%n;N*cceNKw$tjP=w(p z8w0~RB>O;HJx(F1=VoVMc!T6V5q1WKlSuhRmYsp&ACh`Cb_Ry&Nb#l5&cFaFW5Cui zh=9}nW+eL^*%=thA(G(m@nUCSC_u6=n4N*aAIU#4>Lj;of4eSgIHAvyt$XPK?5nhUu0)ss7BHcYHL^`x#uxE149;){x|Fl45yL8 z_bWRCLpG9o{;@MKv?JNi&cVPi7s)(OSuKwgUy>XQ3_eKqD{(L|tV7~!b1*RMN3!39 zgMlFtDg13Y7#JoYl`n1_3=Abm?(+w!N3uVHgMq;wNqr&*1A``#d$Twg7!b>rL>P)W z7#P@)7!D)3zmE#Fq1H)z{^=Co;Lo)9g2LppHQvBZMU|>)|3a=L+^+@6S5zYo#%Es`6 zgMk5gJmNnG1H(=v{T!SO49Me4eDJUZ>E~e(<%I5f0dX047-TpZ7?8(*lsOp~kjF2y zI2jmp!D>MS4}&3^yagu%1M>KeJtqT$J4h)Q^ML!lib(knG1dT5z`_v5$-n@QE(R8c zSWegm0Fb;0LmDRo13OZ9=5sPI_`)@aFjR0dFr0vgkqAR0XafaED;SF~ba65;AjV+W z7$$HsK$eq&<=Ggfq4|FfCj)p41}x3M1|G{m4v!U_3=GKQTkBB5my=-+Cj$d$ObDj` z5Sslb(d>t)gOJP&q7Vj@WM&X!xBxXD4520&LX9$nnq>$z%n)jtA=EfSsChsQ1gtS<{3lHGlrUH3^mUfYMwFFJY%SN#!&N&q2?Jw%`=9YX96|P1ZtiM z)I1ZYc_vWvOrYkOK+Q9Onr8wv&jf0oDbzeusClMP^Gu=UnL^Dog_;M8JyWQ8rcm=t zq2|Gog&EX5GpKoHQ1i^7=9xjwGlRO%3~HVk)I2k&dFD{}nM2Jphni;&HP0Mso;lP! zbEtXdQ1i^8=9xpyvw)gs0X5G8YMuquJPW9K7EtpnpypXX&9i`-X8|?O5^A0$)I3Y5 zd6rP~ETQIELd~&+nrjI)&k|~$CDc4a1E_(922c|X4WLFE8bHl7G=LgvXaF_M&;V+@ zp#jufLj$P6h6XT`5m^OhGCZ@ua|=AX!1D_{!@zS4Jj=lHj3F%37{YRmAuQV%!t#wF zEaMo$a*iP^>lniFjv*}b7{YRoAuRhC!t#$HECU(AQoJE7D;dG^gdr?b8NzavAuL-N z!t#|NEMpnMa+V=1YZ=1Lfn_d3xLvU9WeCeZhOmrg2+L`Pu&ibX%WHb%aum3TxkT$l}4~!X#~raMzCCIWC+cb zMzCCI1k061uv}>b%aum3TxkT$l}4~!X#~raMzCCI1k061uv}>b%aum3TxkT$l}4~! zX#~raMzCCI1k061uv}>b%aum(TnW#Nusmo4%Y#O+JZJ>VgGR7CXaviHMzB0+1j~9x zupDOu%VU_z#-)33Z}rOL(69) zSk5(q9@nPT=R~Wd>73Krd8|DKl*u#84r8=Z31zO$-a;B3j$jwep z;AG?EYG?>qt%0%>0lIP#yhgzjv?K}4f+>Nn>;tzTrL@2ln1JF5QH2KNE0G?xIw1kL*TD*)P zO$?B|=8V=1450aR&{j)EXvYM!EsoI^q8?-fBXqzLL^0Y!#6e@`j1CYsXbzPTG_lIS zzz_ghB<}ESWfguURc7=#%fY@#jb{>cg?aY*b*d7pZ&>SnHCxqPq z5(inxz`)Q3VtYfxdq8Yx$6*qP?F$i~0b=_>*z-Vae+U~iugVB=ECU0>Dv)>}L>x4> z#25r&Zv%-#CxrKa*dY+{Lm+l2gbkWcWdwPYfq~&1NIV=Oeg(va4s_fCu_Gbkp!rlr zXouz*NIV)M{szPb1rh^fevlD5Xa<^3WrTM4{(;m$cNc+9reOqiN*EXzxEL827!x7p zfaX&fK>^Ibz#s+^hfZM2fY>PzHA*0MDufN1Pi0Jlu=POV=@7OFhz*Jy1_lNz5IYkh z4w_G8gbskXfyA>R;yxgD4ul;9V&_8Gp!rlrP{cAYFvNkx^C99XAa((SodsfpCe}f7 z;UIPqM7#{dE{3pcKx|N=V1UezFqT5ZLG!7MWe|2BNDXxGY6^&50TG`CVpl@gp!rlr zP=aD$U|0qcuZD=P0kLZ!>`fqcErbo4Pi3rwu=jz)p_9=^Kx|NAWME)81!99H{uvk; zK=Y}LO%V0hK;q31_8kzr1;Ty=Vz)xrp!rlrP(o&4V0Z@-Z-#6k0^jC~Nc97r6r0D*ylK?TH~01?*$ zu_r>;UvSy#m4p z&3Q7egs?&9H8Fw;3_8kcO z28ewZ!hQ;3Lnkagf!OyU;-H;ujG)Q{w7!U)fr0TML|hugegt7_fY^^AY%>rWIfuR<}ehyL71!6<(+6rPr7Xcjtv0p;eoCmRALD--%a>myX zwg?9U10$$%V_;xV1hL;j#H~T>cM!G*i2WYI4h6A6i;6()1Q7cpL_8nFhAx}|jX5)Z zhKO$fiGP8x_k!48A?)iQ_BROo35fk2!Um1+GJ+~q2FSVw#-9*zZqPQkUl6tgi2WPF z292LGLKj5DfyDnp#B)GwP=yRyKL%p|hlqE8*q}vE3=H70PRM3j28JadaVE&XG-!UB zkr~2101^jP=AiZih|LNSzXM{kLD;WAZ0MqmA0Rep5fuXi0~;3u10yFyjR=ShY6vhe zFeri8+z@dC5Ss_Wwga(wA#5KI8=3~9L2N#VcovAw4`Ek=*q{al0|P?`h%E>aUjSl5 z7iEC|hWZnywN-Y*C1KK8Ou!m@qIfbb;975b+rxHfZq|s9pxK zB_ZNlKx`=p`!0wr4Pn0qu|bU*(0V)&TNWbD&cndKC{kz+ebs zD?-FUb03VL1`#MOCTMNS83u0?S*r!2k9SHj-h^-4@EAfK%T|?LgAhte)oe5$?(_tBi4O;ldz`!sC z#5RPexeH<&LD;WAY}mv;9|Hp;s6ofTz`zS)n?lq`f!JmcwmOJy4q=;u*r0`U3=9m8 zAU1SCiyw#`3sDmcVuKonp!yxewuXqu@i8zc+aTELQ1MKV8e52XHHd8oVb_D$){wl@ z4`SOx#AkrmpvER>eItnN2oYZfGT#ZoR)>mj1F3;7Y&!sAyFk<&0jYOIu+^dB7eH!2 z4Oj*ShPxoPJ4DSB5F4~ekb!~W1xT+aL>$Cchl+m&squn{Gx0MpFnUAS0w6ZD-y{oS zgBryQ3=G;JHgwY50>p-@aRsscAbR~kY^XRWG#LFM;-EewBWRH#17scvCN2)@3qZv| z^F@q-5cQzrHW)z-a0bY{5F>Q)0jQhA7y?lP?k9#q*q{}v75H`3^3hEGm*0_S)549I$4kOfF&|D78 zF3{RuMrc|BouA1Fop%JCFv$pAY79Cj6EsH(vLD0-&3A*?p!S#&bgl-(Rs%T%)V5)U zl#d`apwlnaplU!TUMhhPEn#2)vDH8mK%n#wQV%^t1+?x{4QemwoJl26;4v^TfY@qK zHK6k(m7t53L2Nas8c;h>3A+3l#8!i<0i6k{Bn)y50|SVy233;-vKJHy3=9k)wi;9o zsNJXp>coTA88b65s6o}#gVc*b%mK00plaGd;-JI=YCnV2L)AHK-cU`ZOi*!9@%VAhsG*4QQR35-71SFff4FYEU(AK<0x6 zGZ+{cKx{Rrny(;n=t6%GTMep)k%fUl2|B?HVyi*b@PNcY36Oz-0mN2=su2Z=gHGvW zU|;~T)u3wRK;oc*69xtb5L*qZMhhekJ`jk30mN2=s?h_9LkELEY&EDFP;@dv4!#AC z%YfRcpwI#ZlQMK38^l%zWnxf24wR3e>Ou3akaPGL7<3pI7?eQ*pz$FF1_pKTX?+X~ z40^?txh08740@ogXka=6#wr2rB-8_K;bG8ADlTTwD@x5t)B}m?p^SNfcj!Qe#n9D& zN67SwlZuN`^+3nTAj%Pga1447He^~9Y9mAlwEGiTc_L&!6h#ddAP1q8d~j z5mE;(%R%itkS5SNd(c=9lntU__JZOXROUj5;~1{EFff2lW&&khkT?i~%3jcr703-R ze}KmGphHL?<3K|TU>Y)&vVj3g|vKKUL0n-E0|C^tI z;T9|~K=}bA$iTn=>iQ$AyDG%M039X+tANRYh8I9)!|YWEhOGGj`4?m#NDf4Uy5cZB zAOp;Vk=Hsv&a4KBgSz`5Juvecf)U{dsy;w+AoD<7U1am(gdy<;G6RHRa-i-sNDs`s zD@g7GRWBepka?hPB}@-Uf1fY|gE2@F#6b!dP}dbC3^UIpgnJflWMqH=MuyJ}2p$8&0Y?Tf-vq2cgF%`>iebAulY{ai_J*bg8OQCeOb*P; zTpK1&Q)jSsHx|FnAngAAe_?-&qkwB4I~Uu<{s31twu}9nr(b8d*{{6lYeQ2*t9#5* zWhGVyWffKiWd&A-rUow7R(Ip6%NdeqeFdA&yxhGZvR8T0@`k1ckZmBouAh06bG1MVuer;ITkRF87$;48O^}J0Mo?*mSN%m zt7Bnd&CDxd0IOp*5b{#d7NV4fD{E8Ai=56@egJir=c*2%^((^&A@2{Hkk!%4W|(|$QlkPM+C&-fpVll z909TT3I-IOHPnxi0e76 zz#OQB)?g0QLK`p#YN0KdBLK184$KjOaO}Yx2?)ml%#nd`9Kjp~262#=IT$&;IPSpR z;LQbML*3xR3F0(JfYfpNae;imzzE?5f_W^A3_85rKc{3Q=DbOIx1EQdZb%wusv zAU4#{cs7tPp&m=*G-YOBfO;%R4ipw03_L6#^8{R(85lqq9M$p+JS^VK3=ERsaO2=C zyIrg$JFo?w$FmP@Y0xK4aFJj=_4vAE;_;Lo$ z9bh)pB|AB-KuH-AT)V&=KC$?uGzQMyfXY{cH>j8W7HD&XsHo3_4=*rAZ8&=fFlAh{cx{FmRp+JJUiezO;ye z^8(l&8;G9Eg6r8B7#tv+D}wvk7#N(z;&YN1IIn{ZaDm9&0_*XCaBg#bXJB9mfN<^! z-DY862!U`O@pLgVFhoE&PxwGtDF(uM3Qi>{3{w1z3=AM0(qIDQNojpH1_p3SXW(IZ z#=^iL1Co*jB@+!6PD>^Zkh~m-%W2I7b_WB5=fK1*&CbBU0^^B*cpNaE9EisQ;W;sJ zfRc#-gy+n}Ap*eK;%3iyg()qcTNTd9|$i5qA~!&3uWR2c`pRQt6*aP#=*c4ArJO#4U;e^ zrF$?!xV20|pp@(b9LL25v{ zK*p5U9iDr@jRTNM|Vwi+LQ3rKNERz68AvF2LF^Pjp zXBCJA@l5=n;DIKG1SXwK1_lOb0!U<%Qe{|fgWkB>Tf$%aRyfqMB7KFD2!pny6_CRX;5Z>@)bXDhBGmP@~sjmjd12Maf4zC!YOCs2H6O)TbmPV zw*;i&z{3I(Q3hpQaN=a(VKL(brEO4stPILSu!I~37WU<2U=RSMqY{`wObjYuJK34V zL3stj;b4}1$O3N#amzApf=OcQDeM=rUj}@lj$ImGF?Vy zE>x4D$_$uZASp9p)WWXJoQa={fk8-s+lsS<3tEYC+lYdk3#sL}ZAC#2fmEX0cA_Bb zAXOK)y(q{~9;k&5OlDjR44{Z%VDteuEJ4A-IA<#t1A`iv=_3a=mVtpm9l|#UwGA1g zp_;6aG~MEYDY8-nu^FQncvwIVgqW{^q*Rm}rc^@#qEw?Kw}63Bix1SO1X;wO2_hLK zku)(d3Notl33D^^N%Mt@3o;6bGcYizFmQ9*aWnHVFffZTF!Nb)TXS1-dkQl!us~%v z7#LVh89*XzER1&C+}xhR5Jil_3=HfV49t8o+zbpHCPnKxQ*A@Cq|9^MMTD6NebU4KaY97s(0+1_4G! zPhpV3f{F~D!us3{3_?%~q3VT^)q^Y)0olO7AS%qr%m;QERG}EuWnhnk6pDjYup+!E zfnpRZxS6Cb$-p2b%BU_0afLK1IE-Y}z?3Z91gP)jpeBGl3$jBVMSvC5n1MM9sznj% zeJEE6Spx%uGRSI>_f?=F4>lPR@~V1__L8u;RF@QF6k>CbnC>JAQm)2|6pBpZ3=HZh z0ul@i8YYm40tW|3g{B?@R^vbk42l^UqM$4W7KYD^QS)Iu7|q0B02gCqh=B<+GQ=U6 z@h~Q+XUPQSKzemxCKZVtETBHs4<-f%M#kTKybO$x?k*z(1EZdven4tbWhpPQJRk(rk|Aa)m57BlE)m*y2^mZcWy7MGN!WajG@6y;~7 zCYKcJ=cX2CBqkjPf1NnEX^s2FR3g@E!N9mU}9j1FD^;R%q!8$ z0M#R)FpLMM1-%T=I0noJy$l9c28Nvc41!Rq0apr< zXEkPnGB}y*!5Ud%0>&_-#Gyv=Kxs}W4OgiGQyBo2QGwDhz6F$D1Eo`-^h8D|1H(u{ z{;-1kgH;MUSbYZV`52aMP`WsLwtF1QAvJo63mG5xxCQ9>)Gt=`@Qxrf$VDULgX~mgUsSNQ2ro{~L@j3a)i8-n9B@F%nj`7a9DPTGv z*wrUKq_QB@B{hv9KE5P3zBo0RAwEAXExv>yJ~=19IF$ivW^zVi5kq`wQfV4Pd{Sa@ zDp)^?){OkpB8K?*;xvZ%{JeOOfxF|&iBnvNkuq2xvT{2s{FLH;#7$LJo7S3;BL!J zD#}UCgN9aoZW1W?%9CNi7oU~~3ZBx;yb@z0kgq}hWr)wrEhsHYjV~xE0=p}XCyHMgY!A4#B~Oh4`AK-rJ&F(E6GXC zgZKtDrqVKVQW@e?5=#;p;`1`|lc4D%J}uF{H9Q*$zlOBme!LKU1XEfv6(g@SHwVo`F2 zZBd!AQD$ypaz!~vBq`H2GpE4VNI^HZ800%$P=M>^Waeg;*eY0nL=($Wb&FDqOY)0S z6?D@Tbp4AJbc;(;Y}4~fEiDyv({d9lbW@9p@{5XXjSN8i)Z*gA^i?gp9}VOc`|Z7&rL$4T6lT^8O#t5 zNh2BYsYOM3`3&)Cpo9hr4siUXBvyh#4xBu|8O(?wKHkmK#}!l-fr}xq(qa@LaB>MQ zDJo4a0Vf(~j{s152{2@c2i5!WnRzJ;E}p^Q{1^`@N*LnflXFrN^GXXC;!E?23sRFa z(=t<2ptA9qd1?6!@wtf=+SLr;EU5K=gBg*&qV7cf`!Vie?{m_~3RT$U3O`2>T)Cqx1Q|YC!}`?l1Cjz`h&*`o4T%pP+(hDo2f&c{;K3;*z6O{LA|U2zftX+n z;p>6fAOgZS05QQBJ0H|r1xrK2#|**&O$x$UAOV@ z35qa)?3PF3+cPjQ+=mwcA`GCZW{^q<7GQ{gFrcImLmC4ELpgY=93&*dkjucpa2>=1 zV-bcD1_p*`c!CvSsAgbb=tNTA#K6F?9*N({z`y{SWd>_!5Mh|Wz`(E@UPy~DOlM$V zP(yOxJO&1a2qgKXAooBtgJz@|)-W(I{6jK-3j+hg10?tCVPIegMACnRfq}seN&gwp zEI*QcR~Z->-XqE1Wnf^~ge3ozfq}sQ$-Z|C3=Aic)PG}OVDLwh|Hr_<0GdL9C=p>` zV`N~+Mv4zUMh1osB=f}>85sT}xmS*nfk6YwJT*oJ26H679wP(8LL~p1F)}bzAo1-O z85oWusdr;!V0eIJz8@n4!(=4+FwkT^50sThAT+w_c1asa3Q%5896o$Z3=D-x_K7huFswmR zFUQ2dV2ETtC~sIG`A?6DfuRq{JToQ+1_>nfc1#QmFOc|dObiUWko5a8F)-L8*&oKl zz;FS{yf`KXhQ~3u)A@S!iF)&CYnGez%gT!CQ#K7QyWZyO>1_n?V!tC3}#K3R^N&XlU z1H&~W^UpCcFo4!Qz|>!3Vqo}%B!3SSen|XhObiTx$nnp_!0-V{{u>hmLj#ik{xLBy zxFgxm#>@aN<6!pjF*7g}A(C%SAd121$&8tS z!3imT>_9WlNc!EF89-x&P#q!+e#{IE$w=WD#>~Jl3&}rm%nS^gNam$6GcdRy*`LSE zz>tZgzKofHK^tm1C_mIOGcYJ2ncv3Dz_12Me;+dg!yzR3>C6la;z;%_U}j*Li6p-g zG*pVDe-kqU188y{VxlKIy_;fLh@`^?alMqmR) z7+x?lFgPH|e`IE0ut3uPi`#^O`ACi7hSvwht-^IefFawD{nT3I2E)stZ3j+f? z5`QVkJ|y?AV_{&ph{WH{!oaW|$$bYv?nUy?Nfri%g-HBMEDQ{wG7F+b1ibF%Gm?Lv zurM$zLbCrYC_Itmzp*edAm({R82+;`FswsT4_YP|juak(tPBh-NPH<)28MPd^ORW` z7?wjE0}fvuxLS}PJA*MR0|Rn<&k9AJhryAR0jUox!r;ZqzyMmx0@4kN|6mmLYz$GX z3=GKa$wXELh9o5SXR$IcfXY~y{$dpUtPEAG4B$2*M4pwQk(Gf#5yAoY&O1Q%Bbhf5 zML!F}3|0mP#7OvodUFWne(`2Ur>QvNA9r_ty@i z=m(9U!yU`O3~ntW^Til0Le+!ZD8#@5&wHSDu@D0*!&9g{C=7)d*ciS*`Jgxw0 zVvtgZ)||||R1nWG*bPbU$d83Q%P z5NePi)FeYAs3C?>GYw&UBbW-PxrR`K4Phojtu=z$U<9?n2xsyHO~xco*C3U zGpPH_pyruD%`=0VX9hLT3~HVk)I2k&dFD{_%%SF)L(MaXnr99*&m3x=In+FJsCnj4 z^UR^X9+dW5^A2I0n|W41E`6H22djn4WMQk8bA#-G=Q3FXaF_V&;V+#p#juj zLj#z}h|B{s8J>OM`3IhF;2FmdW->g-z_W}Y%w$-mF@)tBLs+&kgyk1QSVl24g1Hcu zMGRqi#1NKA3}Ly+5SCpGVfn=nmSGHGImQr{WekmBCc`p~AuQJz!m^DaEZ-QyGL9iE z=NQ7Wjv*}X7{W4-Avo8#Ie}f{<_e~KfJ!kIqAs+d4XO?qL3;$iH6#NAV*o^r zAZU6$5W)tnqh<_(ut8%sjKL5#sBUEpfv`d2R*az#wmwL27=#U~n;4;uKwFSFbWp|x z#Eyih@dmM>OLRciGlKRuFff2u-!MW~~4@a zXyqvb1H()ZyAUD{YEv^7LD-u>;>8g5X%HJUXvF~O7c!PY#Giu1%OGq~&^jXMvO6UZ z8x&xmaU2l45~9Wi#IAy{Jwa^Hz!w9gEy`E}5l;q**Fx9@Aa)&uT?=B@L)cv)b_0Yx z1H^8GutEJ?M$q6H0|UcmkT_%)3Bv&py9J^K)OTfUg|Od(#M>b3-yk;BzZ}dA42@JAg;4h6BNLD-w(ydAZ!~D8?^Y7fdSl3X9Q&$(0C|G!>Xt0xkf#C#*y%r*V4a8mt zVLt(}p=sbVhz;#XF|jc)FoH5M0|SE~h`kY_UIE131Yv{vw2Ye}>KL1h$( zeH0?j$icwCcnrek2eFSs*s>t@2?$#o#D)&;T7uZ8AmZ*I_Gt(^6vRFQVJCywXCdrD z5c?d2y$i%X4`H7Gu`fW_;6+-{bjSxxZc>}wGAN)Q`5K))Wuz5x;624dfYurGkvw;=3mAogtt`!0xm2g3diVuJ?185kJ; zg4p*U;w)SY42<_7Y&j4cv@wi<$ncI&j*<#lWEa3L*|-t3$=7gVaFnS_ERhhNxK% zVuQBYF)%P}1F_#i#P@>OpaFaa28M$mGob_jAhtSG{0vCV2Z;KIAofQH`vr&%+PKHS z!0-m77gPa4+3Ha7?;tf$y#m|}42)kOdc{EOuMoB@hz*)FU|?WSErC$R!L6!l3a_ zkmU>zwi;Bg3`iV0d;wysLDi^$#6g1AYT_+?;V0I}7eYRW<4(1}YBTMeqF9wZLlSINKt zVyi*bbb!P`k-)&f0Ai~_)l3A5gBsKf3=AN)8dS|pkT`VU2*g%{s#ypUmxjazh^+=y z0~$wG0!1tX0|SVy234~Wq#in{3Sz54)qvVLO3;N0AhsG*%|VcQ@b)wY1`t~fs^%0( z9F(XT7#KioHK>|PAaPIzWnf?cvDKhzZiB?33mrggHK>{=AaUq~6^N|{Rr3ZU4$2&$ zG6xj?P&FSw;+_!yg4k+MHEb*l3`*b~Bn%87wi-08@`J=dof`%Q1`t~fszw4N4jsq` zvDKhz6hY#k31&Kok{6K6qs2X38IH=G9rCX4_P&I)daW9B}L2NasnhcOQs3XO|zyM;aLGxoF zNZcHv9>i9Is;L5rg9<_h1_lsY4XUOYByI^&4`Qo9)qvWZN}xTjp!sf)d!TA2g4A0> z)PvY+P&J@A6(vyN$^e;PQG==hwNaHooje8x1`t~fs%ACF9Oy(fh^+=yvl%1~n#2e7 z3qbZl)quv$l|Y?B1_lNYTMeoPl>HceAnpNW7070J1_n^FRtE1&gs{~?g*vFr0hRMm z^`Ioe2;P_u8M9UfRVEA&wmMWCv{nXYJ}77y!JDEO7(m`oHiFm-Vyi>N!F^b$`Jm#A z5o7=Z0|Q7%*#V*+#8!ujGw2mp=9VNTG3bF-dZqs_y_@TzaGIw>g?+krRF3eWI+9Xh!A4XfI$z!h79vEAWMT5yCU-wA>+F!YOn}_ zMtxzX7MBz;=z-R9rskEP=u0a~%!T%@A>l%Z1QlVRsR(FPGQffmrVlo40xDWS>R{7G z=;}anAU&Wc1650e)Pb@(NDs2T(CP_f41D|_l!TGhfs!sX`=O`<#Xqt-P5C&DpAURN*0MxYynFrOz0O}fP zK=TMl3?>J14@eKpyZ}Q6h5`-5~c@aKocJW11N8T*dPp( z19e?NdSK=SSV86nLFR#)5g<8`d7$nYOb`XBKzFzf+If;dRw0_tvogkk3SSTity`tcz1K izKu2m!yo8;6o?Np2SkIKX2|OHIDoeGfMg&TrVaqAW!HlM literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_pwr.d b/obj/Peripheral/src/ch32v30x_pwr.d new file mode 100644 index 0000000..d2963aa --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_pwr.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_pwr.o: ../Peripheral/src/ch32v30x_pwr.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_pwr.o b/obj/Peripheral/src/ch32v30x_pwr.o new file mode 100644 index 0000000000000000000000000000000000000000..1115c6109d1df8e54735a78c0bd4a7182da10b5c GIT binary patch literal 40168 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 IPAQT)0Cc8Oy8r+H literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_rng.d b/obj/Peripheral/src/ch32v30x_rng.d new file mode 100644 index 0000000..239334a --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_rng.d @@ -0,0 +1,91 @@ +Peripheral/src/ch32v30x_rng.o: ../Peripheral/src/ch32v30x_rng.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rng.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rng.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_rng.o b/obj/Peripheral/src/ch32v30x_rng.o new file mode 100644 index 0000000000000000000000000000000000000000..875e5af26f1d88670595b6d61b8c4d605c8e4f31 GIT binary patch literal 19012 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_rtc.d b/obj/Peripheral/src/ch32v30x_rtc.d new file mode 100644 index 0000000..91dde58 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_rtc.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_rtc.o: ../Peripheral/src/ch32v30x_rtc.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_rtc.o b/obj/Peripheral/src/ch32v30x_rtc.o new file mode 100644 index 0000000000000000000000000000000000000000..452e91bb4735bf688d0d89db8650b1bbfacc48ac GIT binary patch literal 36784 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_spi.d b/obj/Peripheral/src/ch32v30x_spi.d new file mode 100644 index 0000000..e1ac10e --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_spi.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_spi.o: ../Peripheral/src/ch32v30x_spi.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_spi.o b/obj/Peripheral/src/ch32v30x_spi.o new file mode 100644 index 0000000000000000000000000000000000000000..d67c37fa9537b2d610be6ae42b9429b191374ac3 GIT binary patch literal 52456 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ℑZ7^^!!b(z*Ii=7tr!p1P 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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_usart.d b/obj/Peripheral/src/ch32v30x_usart.d new file mode 100644 index 0000000..81c7d36 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_usart.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_usart.o: ../Peripheral/src/ch32v30x_usart.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_usart.o b/obj/Peripheral/src/ch32v30x_usart.o new file mode 100644 index 0000000000000000000000000000000000000000..d15d13e2da8d2e054567626d81239f02025bc5b7 GIT binary patch literal 59668 zcmb<-^>JflWMqH=MuyJ}2p$7N&wU0k-vq2cgTa=;hC!T}f#Eq5GsAXwMu*Am>|vobLtR3q~a?%y8H;2;b#RrV=E ztE)LH3yMk>hMW6^+u08!LuENoWH}g8_b1DK1?v+)kr801+`nBN*<@i>1{Q=HK)kI; zCJVDNaG=O??A-rY>g%UgS7BBL0Tda5iQ7TG1civ0=GXGS;$Qo}Dc(}8EWFw;w=zui zZ~5eQ^Z8%Kw*`g11Z>(`k!f4|No#6F3Aa=SY7=Ihs)_IBUw2bm|g z#5ED*9#E)H3ct9$GktP9dxXrv?d&`Z%1W#ZGDnrgSQ(lcb}7zN6w|!fe@pRZ|1ZUx z{k7%7?BDrI`)~Hkt!!#g7GPyi7Gz~m7Gh;k76z%Gcr;FxGyP_N+|s6oDAk|kf5m_H zU)?YK{VRW~yJ+*~soNQnCBHLFW!SH<_K4@#*%- zN5B66*?V_;oF?P3yS;uZn;JkOe|zulmjj2z!P#IRtd!Hd+sn5SWDh9xzSsW*g_i2w zUcaSH4RNZSM<+j5X8^ear1~pZ&snGmlfQre3lf!sn=$dIoTgwp#8*<9AEEA^{PnB6 z-@>K_FGb7?K6AGexQX?3Yqxbai5PY;HWw>bkITv*=ca z+-);OspUZB4a5T36f!g=wU&U@s}(H$v{ox z0Lw6OfYq_Eux93!Fn~>9mJl{(V1Tk!M0^<-7+7b+1q?*e85kJY*jZE=7#LXG`7Sds zFo2DKkc<$0EbjU{kd%4y{emmw2zCu&fGP9TxDPX##nS}D<^=hKTUc-n0|Nt>0_#>L zPEIBU25yij>vkr=5Z*qB93O|2E5CiLBh@1pO?g&Iq3c@=I zk&}V&jzQ$)7WWXE&NNljlGKn!kW0YMkB$Ik}mk z9^zQa4l)zsA&yn7TbV$a0OE|*%ph$L_Il}DCI$vE7BG)X44it!K~_p|>2q|$Oye>X z2C*3=;T? z=7>Nz_F#?#gyR6_$Ur!bV2%QVB*@Dgj9gwEnQ%9FbAi}UH~4UZI1N%DbzFX2ARjO= zLU@5-9t$Ibh%z$+LnRB;U-A$`Copowa_oT{8Ycu|Lk*2*1Njo_u|&>8EDQ`#k0r^0 z!lHvgfCXfp$R!pA1`q~EwLF6W%MBI=25E4(ad4G#FtWnJtxOQah8kZEF`hwy1(a04 zsx!E@a(J;ZFi6A~FmP=X0xOn?FJj=@4vAEW_;LoW9bh)pB|ACY7#J9!LA(ph;gg6@ zN@L*KEqIfKfdLxcd%$|2L424C6cW%NJ}P^Toq<6C65hvUf3Pz!s6aTUcx5;k7&IW9 z)0}1;3=BFF@uf)&T<5?>8%V^L7BFy~2RqY3BEGbUf$IX;9vg_B%Yrr>3=9qs&J{r) z4h9BiiTIo(2CnO116&|7x4?RQAe`G=Eldmy0T9kTp$s+#h7btn5f7-f5dq;m;R9u* z7zpPnIF+O@$jo74U;ycm1rs1o%I;xjV2}kxBZB}-F&hJe97swYluR^OxGb4CK=Rxm zE|)bE*d35^mdk;Odj$sr1EehFa$phx@gSuqmjja=hzBVzxty3dK;}bANG@k4jul)C z43ILB%MD_t0mKG(Cb7L-3=Ad^o+m`k0>blV;yTC0z+eO6`7wbrv;&0a4^im?;RQhC zJRrP4CXp*#3=BRHUI;{G0E8FH#0m0V2!vO`#NN!sz!0GT_H7N5Fes&aFhaPsOhTZP z>;vUCGVwg+Vqmz#1d(lH63FCWV0ZxKb}(^$+gTaRIaoIC+Jck?Nz$gUbKn-z(@Yo=s?!+hrYK!nN zh=8c?FsCswa9!YvWMb#xg1ID`Ndi<+Kn;mu5&}gX)FrV@0w9IZZ~nj8|CbQ&2L7@!Ftkx6PD2LnR{L}e0_7%0-$lYkBv149RdmkzOS0fd(U(YFM`%Y^XOKzLaY-WCWi8^YTI;pIShM8KY#4;v{VlD=T3I-8S zK?-7mjge�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 literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/ch32v30x_wwdg.d b/obj/Peripheral/src/ch32v30x_wwdg.d new file mode 100644 index 0000000..19ee2c3 --- /dev/null +++ b/obj/Peripheral/src/ch32v30x_wwdg.d @@ -0,0 +1,88 @@ +Peripheral/src/ch32v30x_wwdg.o: ../Peripheral/src/ch32v30x_wwdg.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/Peripheral/src/ch32v30x_wwdg.o b/obj/Peripheral/src/ch32v30x_wwdg.o new file mode 100644 index 0000000000000000000000000000000000000000..24c25089d542cc87e41f5d408f74976ae364f1a1 GIT binary patch literal 20296 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 a{s4)Cx&p}RSUedRK;!KoIS>Zf2ciM29ikHe literal 0 HcmV?d00001 diff --git a/obj/Peripheral/src/subdir.mk b/obj/Peripheral/src/subdir.mk new file mode 100644 index 0000000..21c2811 --- /dev/null +++ b/obj/Peripheral/src/subdir.mk @@ -0,0 +1,104 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../Peripheral/src/ch32v30x_adc.c \ +../Peripheral/src/ch32v30x_bkp.c \ +../Peripheral/src/ch32v30x_can.c \ +../Peripheral/src/ch32v30x_crc.c \ +../Peripheral/src/ch32v30x_dac.c \ +../Peripheral/src/ch32v30x_dbgmcu.c \ +../Peripheral/src/ch32v30x_dma.c \ +../Peripheral/src/ch32v30x_dvp.c \ +../Peripheral/src/ch32v30x_eth.c \ +../Peripheral/src/ch32v30x_exti.c \ +../Peripheral/src/ch32v30x_flash.c \ +../Peripheral/src/ch32v30x_fsmc.c \ +../Peripheral/src/ch32v30x_gpio.c \ +../Peripheral/src/ch32v30x_i2c.c \ +../Peripheral/src/ch32v30x_iwdg.c \ +../Peripheral/src/ch32v30x_misc.c \ +../Peripheral/src/ch32v30x_opa.c \ +../Peripheral/src/ch32v30x_pwr.c \ +../Peripheral/src/ch32v30x_rcc.c \ +../Peripheral/src/ch32v30x_rng.c \ +../Peripheral/src/ch32v30x_rtc.c \ +../Peripheral/src/ch32v30x_sdio.c \ +../Peripheral/src/ch32v30x_spi.c \ +../Peripheral/src/ch32v30x_tim.c \ +../Peripheral/src/ch32v30x_usart.c \ +../Peripheral/src/ch32v30x_wwdg.c + +C_DEPS += \ +./Peripheral/src/ch32v30x_adc.d \ +./Peripheral/src/ch32v30x_bkp.d \ +./Peripheral/src/ch32v30x_can.d \ +./Peripheral/src/ch32v30x_crc.d \ +./Peripheral/src/ch32v30x_dac.d \ +./Peripheral/src/ch32v30x_dbgmcu.d \ +./Peripheral/src/ch32v30x_dma.d \ +./Peripheral/src/ch32v30x_dvp.d \ +./Peripheral/src/ch32v30x_eth.d \ +./Peripheral/src/ch32v30x_exti.d \ +./Peripheral/src/ch32v30x_flash.d \ +./Peripheral/src/ch32v30x_fsmc.d \ +./Peripheral/src/ch32v30x_gpio.d \ +./Peripheral/src/ch32v30x_i2c.d \ +./Peripheral/src/ch32v30x_iwdg.d \ +./Peripheral/src/ch32v30x_misc.d \ +./Peripheral/src/ch32v30x_opa.d \ +./Peripheral/src/ch32v30x_pwr.d \ +./Peripheral/src/ch32v30x_rcc.d \ +./Peripheral/src/ch32v30x_rng.d \ +./Peripheral/src/ch32v30x_rtc.d \ +./Peripheral/src/ch32v30x_sdio.d \ +./Peripheral/src/ch32v30x_spi.d \ +./Peripheral/src/ch32v30x_tim.d \ +./Peripheral/src/ch32v30x_usart.d \ +./Peripheral/src/ch32v30x_wwdg.d + +OBJS += \ +./Peripheral/src/ch32v30x_adc.o \ +./Peripheral/src/ch32v30x_bkp.o \ +./Peripheral/src/ch32v30x_can.o \ +./Peripheral/src/ch32v30x_crc.o \ +./Peripheral/src/ch32v30x_dac.o \ +./Peripheral/src/ch32v30x_dbgmcu.o \ +./Peripheral/src/ch32v30x_dma.o \ +./Peripheral/src/ch32v30x_dvp.o \ +./Peripheral/src/ch32v30x_eth.o \ +./Peripheral/src/ch32v30x_exti.o \ +./Peripheral/src/ch32v30x_flash.o \ +./Peripheral/src/ch32v30x_fsmc.o \ +./Peripheral/src/ch32v30x_gpio.o \ +./Peripheral/src/ch32v30x_i2c.o \ +./Peripheral/src/ch32v30x_iwdg.o \ +./Peripheral/src/ch32v30x_misc.o \ +./Peripheral/src/ch32v30x_opa.o \ +./Peripheral/src/ch32v30x_pwr.o \ +./Peripheral/src/ch32v30x_rcc.o \ +./Peripheral/src/ch32v30x_rng.o \ +./Peripheral/src/ch32v30x_rtc.o \ +./Peripheral/src/ch32v30x_sdio.o \ +./Peripheral/src/ch32v30x_spi.o \ +./Peripheral/src/ch32v30x_tim.o \ +./Peripheral/src/ch32v30x_usart.o \ +./Peripheral/src/ch32v30x_wwdg.o + +DIR_OBJS += \ +./Peripheral/src/*.o \ + +DIR_DEPS += \ +./Peripheral/src/*.d \ + +DIR_EXPANDS += \ +./Peripheral/src/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +Peripheral/src/%.o: ../Peripheral/src/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/Startup/startup_ch32v30x_D8C.d b/obj/Startup/startup_ch32v30x_D8C.d new file mode 100644 index 0000000..520a6fb --- /dev/null +++ b/obj/Startup/startup_ch32v30x_D8C.d @@ -0,0 +1 @@ +Startup/startup_ch32v30x_D8C.o: ../Startup/startup_ch32v30x_D8C.S diff --git a/obj/Startup/startup_ch32v30x_D8C.o b/obj/Startup/startup_ch32v30x_D8C.o new file mode 100644 index 0000000000000000000000000000000000000000..d6c82a2672bbc7bbd4505f1ff637ed66538f1004 GIT binary patch literal 10028 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

E9YpyruF%`=CZXAU*b9BQ69)I4*jdFD{_%%SF) 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 Ufs!P$x;xVtP|kA(*$2`B08iL${r~^~ literal 0 HcmV?d00001 diff --git a/obj/User/lib/base64.d b/obj/User/lib/base64.d new file mode 100644 index 0000000..86da600 --- /dev/null +++ b/obj/User/lib/base64.d @@ -0,0 +1,3 @@ +User/lib/base64.o: ../User/lib/base64.c ../User/lib/base64.h + +../User/lib/base64.h: diff --git a/obj/User/lib/base64.o b/obj/User/lib/base64.o new file mode 100644 index 0000000000000000000000000000000000000000..895ed488118875095980b63486035147b73e6e19 GIT binary patch literal 9096 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%0Ai~_)jR}=LkAQjwEqp6(1et4 z%FqrtC<&^A3RjS^dc~EwC5cH4dc`G05IO_KDoL#VZV{ zAgy&+>rJmHAEZhTt*s7Lj%Y73=t0(7#J>t7*Gt8168juHb^RnnSsFvNdU$KRpB7BVfOZjGccTh+6$`sKyn~^ zLE|$pJs|Vuu`n<|i$V|=)I9s^{_1I)Y@Nd^W`+Z$vasOp57w++oaHdY3Pc37f7lG})8o`@6!LkSC{ zZx5H)bOySf)AE@jBsRM-{$V^z;1L=Ff#lVoj!N35jc0ui1kUEfmK+PJYU|?_%#`FhB UKdAYDtZs)K^7t5JZ4F2r01Z{V^8f$< literal 0 HcmV?d00001 diff --git a/obj/User/lib/cifra/aes.d b/obj/User/lib/cifra/aes.d new file mode 100644 index 0000000..18c81b5 --- /dev/null +++ b/obj/User/lib/cifra/aes.d @@ -0,0 +1,16 @@ +User/lib/cifra/aes.o: ../User/lib/cifra/aes.c \ + ../User/lib/cifra/cf_config.h ../User/lib/cifra/aes.h \ + ../User/lib/cifra/prp.h ../User/lib/cifra/handy.h \ + ../User/lib/cifra/bitops.h ../User/lib/cifra/tassert.h + +../User/lib/cifra/cf_config.h: + +../User/lib/cifra/aes.h: + +../User/lib/cifra/prp.h: + +../User/lib/cifra/handy.h: + +../User/lib/cifra/bitops.h: + +../User/lib/cifra/tassert.h: diff --git a/obj/User/lib/cifra/aes.o b/obj/User/lib/cifra/aes.o new file mode 100644 index 0000000000000000000000000000000000000000..4d0652c41d5242586a701a2324785e65622497f3 GIT binary patch literal 80680 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�Kq9 zVPIfz1hGK{5(5K60Ej&eV$M4d8?;@Afq~&Sh&=-$&dI^R0Lwe#Aofg%xGIPZ8bD@X zU~mAjp&dy-5PJ?pO$>-V7sAd0vFAb9lR<3gDxrlSHfX&p0|Uc)5F0cI&A`C07sOr! zQGXi51{ItP3=B6x>?IKK=OFe{2>UCD4ed-bgBC@AHlTodwIDXApk-iSkO#3rgW8}v z0>oYg(Q6H2uZFNaLF_dUb~uQ=7Q#*ivDZP^#US>22)hx)-T-0ugV>-!a?rRrh`k9S z{tUzhZI=PLfeVrLbU!8gAj7K2iaUk)d5Oz9|lh3C#X7ynGdQOLFRzW2UW2! zHmLdpu|Xz*sxcTFR7Ei!gSZD&wZPb*YJ>4SNHqfks91-wLB%x8UQp2nvlmosfy@Ni z3o344>>g0v4D|~rOM}Egrh>94Bh+3{)`GD?*#>48C|SeUpd<^k7ZjZ^dqGhJG81Gk zD41aEOGx(KL1I4uv7z=pM`FJQv7!D2ZFqs%3mW%^*$W!OVT7g!UQpZP0>~!}4Duj0 zR2;NPj`1Qy95jXrV}s^sKxq%;P79FwBakq+0kNUxfZLfMhlA=Vkb9tc1T?n_%R3-8 zEboA9VT7sy4Pn9D37R`%1aB2&VA#yWz@P-0kY#|d)u7@#LE@lBE&~Gth^+=y18TQ` z@)F2w5L*qZ2DC{^3Dme|U|;~T)j)}tfq~%y$Q;mwC6uiORdX984ocJv3=AN)8dMFa z&7%Yw#9?4y0I}7eYF>iWgBsKf3=AN)8dS}DkT`U562w-6s`&~M7Y4bKfdRx;gQ@|w zqm)2_1gbBX7#P%`YM4P|?4U+E0|Ntytp-)Y4H6fFm;+*~LDdL?#Kj@vAhsG*jSNT} zyu*xv0mN2=s!;%mgIDM?Fo4)VZV{lGEbB{V|9TqNm272Vp}7%%D0TLZCHH z$jTETBV{ORun2+1&tRq&mlQGRffo9J7RDf(l~$CP3vCQSyoi?s1t(}&6&jR~d2l2h zupwvA+zCh>Y{(eeWrC{&$$>baZXPHq2&n^g%RqXN?FE&qATvN1W-llXLHQKgC1Nnq zV_*Q4r=TPU5(i;W_5pQ)K<0t;f-tB&{SM7SV_?t#ZDwTvjc!Bg zIFP-dCO5KqodS^b4Kf>qVRE2mJ+gTmmJAG_ZZF6mAa8@@K<0s(v@ks&{VN4P+k-(Y z2!_dln#~|RF!xzlLh>HSJW#d)$$`uR*Fg}iU~;Db1A{6ovO(o9Sd@VQ)GP(*fteRz z$-vOV$iM(H4^(`CI_ci;!YKNvj|^ z5C%1QKr~1%2=}0=1KA4_2UP(eHq3o@tQZ(TT^5l0K*b+O4&*+NS+KMS(sw|LfnfnJ xWY6wZ21vYtid|4ufD{Z22^tIx7m>!)LFRz;gNkBgbs^Ra4AABeNE*J<2>=b~s7C+* literal 0 HcmV?d00001 diff --git a/obj/User/lib/cifra/hmac.d b/obj/User/lib/cifra/hmac.d new file mode 100644 index 0000000..72d655c --- /dev/null +++ b/obj/User/lib/cifra/hmac.d @@ -0,0 +1,16 @@ +User/lib/cifra/hmac.o: ../User/lib/cifra/hmac.c ../User/lib/cifra/hmac.h \ + ../User/lib/cifra/chash.h ../User/lib/cifra/bitops.h \ + ../User/lib/cifra/handy.h ../User/lib/cifra/tassert.h \ + ../User/lib/cifra/sha2.h + +../User/lib/cifra/hmac.h: + +../User/lib/cifra/chash.h: + +../User/lib/cifra/bitops.h: + +../User/lib/cifra/handy.h: + +../User/lib/cifra/tassert.h: + +../User/lib/cifra/sha2.h: diff --git a/obj/User/lib/cifra/hmac.o b/obj/User/lib/cifra/hmac.o new file mode 100644 index 0000000000000000000000000000000000000000..67014600a1919617d41c9cf19e45cd129f4578ee GIT binary patch literal 35244 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

{JjNRH!pBfY+WIV;BotB5H+BA1V(882(-@` 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 YkkSDtu94N%G&3+jmjr@Ug6sn^01D>`7XSbN literal 0 HcmV?d00001 diff --git a/obj/User/lib/cifra/sha256.d b/obj/User/lib/cifra/sha256.d new file mode 100644 index 0000000..b72ba90 --- /dev/null +++ b/obj/User/lib/cifra/sha256.d @@ -0,0 +1,16 @@ +User/lib/cifra/sha256.o: ../User/lib/cifra/sha256.c \ + ../User/lib/cifra/sha2.h ../User/lib/cifra/chash.h \ + ../User/lib/cifra/blockwise.h ../User/lib/cifra/bitops.h \ + ../User/lib/cifra/handy.h ../User/lib/cifra/tassert.h + +../User/lib/cifra/sha2.h: + +../User/lib/cifra/chash.h: + +../User/lib/cifra/blockwise.h: + +../User/lib/cifra/bitops.h: + +../User/lib/cifra/handy.h: + +../User/lib/cifra/tassert.h: diff --git a/obj/User/lib/cifra/sha256.o b/obj/User/lib/cifra/sha256.o new file mode 100644 index 0000000000000000000000000000000000000000..854ca73ae20bcedef38690aa4bcc40e09003fc69 GIT binary patch literal 42664 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%0DqU;wdU;wu;!7<3dN=?xVA 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�DMS&A`Cm0b)bvcKtx?ClK}VAU1TaHWkEv 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 Js4{rE0sz1*+9Ch| literal 0 HcmV?d00001 diff --git a/obj/User/lib/monocypher/monocypher-ed25519.d b/obj/User/lib/monocypher/monocypher-ed25519.d new file mode 100644 index 0000000..72ec39a --- /dev/null +++ b/obj/User/lib/monocypher/monocypher-ed25519.d @@ -0,0 +1,8 @@ +User/lib/monocypher/monocypher-ed25519.o: \ + ../User/lib/monocypher/monocypher-ed25519.c \ + ../User/lib/monocypher/monocypher-ed25519.h \ + ../User/lib/monocypher/monocypher.h + +../User/lib/monocypher/monocypher-ed25519.h: + +../User/lib/monocypher/monocypher.h: diff --git a/obj/User/lib/monocypher/monocypher-ed25519.o b/obj/User/lib/monocypher/monocypher-ed25519.o new file mode 100644 index 0000000000000000000000000000000000000000..b4f088d0d77c069a1950677873c4fbdca0d62eac GIT binary patch literal 116872 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 xV~3AWtgN{i?R#&r&5q#z?NDhQy>HzD?-qQd8 literal 0 HcmV?d00001 diff --git a/obj/User/lib/monocypher/monocypher.d b/obj/User/lib/monocypher/monocypher.d new file mode 100644 index 0000000..96c3c0f --- /dev/null +++ b/obj/User/lib/monocypher/monocypher.d @@ -0,0 +1,4 @@ +User/lib/monocypher/monocypher.o: ../User/lib/monocypher/monocypher.c \ + ../User/lib/monocypher/monocypher.h + +../User/lib/monocypher/monocypher.h: diff --git a/obj/User/lib/monocypher/monocypher.o b/obj/User/lib/monocypher/monocypher.o new file mode 100644 index 0000000000000000000000000000000000000000..0d066aa8ad08dc54cac921a22d940f74768b13a6 GIT binary patch literal 901692 zcmb<-^>JflWMqH=MuyJ}2p$8&lG(gqz6n@?2E%uTZwxYq7K$8-i`bpmZ}!LbHZ{l? zN+>R3kL|Zn)G$26ezQM`6(lOo%)s!RiJ4(l%X9_?hUX0o3|cM1tu72O-l|rmR*;%> z24;rI*IOBQ7Rqd#e4Ul?VWZ7LosCTmAUTkJM?tO5$s%eDj4sBltqgj{VEQ++cQSMw z7G&Av`dDPjKSxH8dXQNl8l+FFb6w|T5ijb?6kyU8$lCL80yrp?dH7`II_K6Z#>@-TyNurs4^ zvN7YVDaIZ%7$!@0FbGF(fD z&pg2}`GyDM<`))>Zc`NdCrh?7B*NrRykPt^dGgE(hRw%6GfciQ1FUNDOm@bD&6}T_ zGwz#beC{0MWXW?3!f}3##(8#(pC)fUUd}LiW;??}mgFvD*Cu_+KW#SBaP;Ql~_=Df`(ZlL(%*p#JxNTE5eXbMC{ z1%t6i2f`o7;W^3JFOC7(Cq+}hYLUZp(x%A}Rdo!;?&S<{zraIu*L-8QZ;Xg|-831b z4iTa-`7(yTqL4U!Jel<#!%-s_Wd&76mxIb`r3?Zmm9&d&7Av#F-I%+JT!cKEJRKPkIhk40m62Jem9bg(C?m5TD^q3RSg&Zle>AX5`KNG|TQ- zqu(L-m=;vBg*o6lr6W}C^pYq~K<2(xj!7xU(=Ud%?*jm?fT9Gbdry4|!z z?#3MQ%$wVj# zmRWDwX47p9ho;+2-`xI`!S2lF)^6s_=5v^h+2=5?o4%P}g?TfpC$q7IC-bhU#@nAV z)Xg|Feb;p3_8Uxk(>I%LXV^D&Gyhtq&Ft%$cg;86{+_|uVl9*1j6+j5vj>B8bXYMP zZ?|Huo3Yvc2czBeT~jx=?`JUHK9_lO>u%=F{d1Z1rf+6$VcyK@!@SwZhxy;s&HKMH z&YL7Qeb;fo;7LOBbi9jPs@mUr}Q)X1T&VDXzDxm2Wfm z5eDNe-3(S!jE$c#I8C;jyxIISgWdeP`J3(kGhUkiZ<^Dsj`w=Uhg@aWvLGp|m)J7IHBS?MWjvMfJC^6%#i7On-Zli9=> zjJH2yFq&?1wBo3Qqe!4bp!ux_(Z+1o8A2S5&7Uy{bIrQAxucE2#M5oM*|g0T*BDAX zH};!N-!;R${n=V!c5&UE{pR6(fyVywjKb{S)s6k%Gnlh8Ff^;NGcaqoGyIyidH*v; z<92pNTtS z8M9^>TTWx#HN$PDvHvs1&F()LCeL7J6b|8MJlO2SZ~UZ#VRQO_2D>Yp+uIm6@4wEl zC~WhY>5R=9M_J5fY;NOcH0?J#FC{m&S-YS>X=BVgsajy zhfrgV>kP*BFBn2XBV4!Z)Co`SnImpC-Dqp%!1~!bjj+PQMhq$AH!z5yNtW$ z8@K;sGZkx1u%O!@A$ju$s7&o(RaM*s-@%Q9g-yA2mZoRhoSQx|RJ`u*XecPWl%Wpn) zi*a)6)>)fR?PA!@%D}+9gq5LrsVjp@Y}k~|_92YhrmmaM6S?_BD}zs@@Z}E1MI4)t zeq|J%*UIp)ar28E3_7vK$$1RZrW)^?%8(K}YwG4xp^VGseVVsC>xi6o=oSA{4S(%xES=pJv_>>>xrOBIjJ2R$Do;4d%)*HK&Fc>=*Gfs|gVVo?~ z%%H>qPNOL)49v={9Gf3~Vr7B|z_q>aIAiq$k@%V!KpQ

JJ7+R%?#^Y{ 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≫?60D?{ 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 literal 0 HcmV?d00001 diff --git a/obj/User/lib/monocypher/subdir.mk b/obj/User/lib/monocypher/subdir.mk new file mode 100644 index 0000000..c4f60cb --- /dev/null +++ b/obj/User/lib/monocypher/subdir.mk @@ -0,0 +1,32 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../User/lib/monocypher/monocypher-ed25519.c \ +../User/lib/monocypher/monocypher.c + +C_DEPS += \ +./User/lib/monocypher/monocypher-ed25519.d \ +./User/lib/monocypher/monocypher.d + +OBJS += \ +./User/lib/monocypher/monocypher-ed25519.o \ +./User/lib/monocypher/monocypher.o + +DIR_OBJS += \ +./User/lib/monocypher/*.o \ + +DIR_DEPS += \ +./User/lib/monocypher/*.d \ + +DIR_EXPANDS += \ +./User/lib/monocypher/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +User/lib/monocypher/%.o: ../User/lib/monocypher/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/User/lib/rtc/rtc.d b/obj/User/lib/rtc/rtc.d new file mode 100644 index 0000000..9be4b49 --- /dev/null +++ b/obj/User/lib/rtc/rtc.d @@ -0,0 +1,91 @@ +User/lib/rtc/rtc.o: ../User/lib/rtc/rtc.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + ../User/lib/rtc/rtc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +../User/lib/rtc/rtc.h: diff --git a/obj/User/lib/rtc/rtc.o b/obj/User/lib/rtc/rtc.o new file mode 100644 index 0000000000000000000000000000000000000000..5ecadf00a4c3132cb73d8ab7c9a4ecf9717cafc2 GIT binary patch literal 60172 zcmb<-^>JflWMqH=MuyJ}2p$7N$P)%I-vq2cgF%}?i$R>3f#Eq5GlQcb(~-08F)bPl zt?qWmrZX@wJa1rNaAX9@r!z1!OfENNnE76q-GR-x{3%nbyX5o9>#9s1}Q zhqN-mVsn=As+MGqc9y2alQ|Wtg*gw133FW#OU~@%Fy~}on9R<}u$_y6L3xrnqcA5Y zL!)P|_v9`vhF0%FAK@-ZhUD~a4&ka_{H!d>%$|(GC13a#Gj}pvO`qJ(F0uK`7p7Ja z>!CRd1A{ON3xo0XFH9g&;qveN5(_|Se)IJwOq;(vVVeB?JHN~Zl?7f3ISK^^Ft>6n zL8N0pcsdq5`Iy<|yD*E&%T~@qoRe>IGIs74W-)nrc0Y5dCj(5cTE6p& zOqS$g1gYD({o2gt#$!oUj8gRCrpuAs1i$zR+*nSB92tLtNiFaLyD83bVBn6|)V8eI``jjjlH zHM$DI-3U_)qZLzYMPY1Q^vcx9t)f!6&0usj-Os=vFC#A}FDDNsyb|-=Qj>fWiyRAz zd=o3ZO7px*a~w<4gHsFqlS};a%Un{E!9_7MGaDld8xt!7GpoBO0|N_KkOf?H^MKiC z1QQcGNQ4nG7aV zz+@_zOaqhY3`{KG)WpQd21-w?Ac9F-qL+z*fr*g=%wqxzf(a%|NmT|01|}9T4@@xm zOYQ8hS3`Ev3 zF)(nJ8XGaNm<#`9VqoBcBytvaJ_BZW_5itz5u$~~U0;+Lq0Eyn9IlKz*foTKkpY~I zIE4j4rh%11XG1~Ev8bBKWhTO4G71cyFHBg`}oLtzk`K_Whzfx`%F zG7H!m4kK=mH5^cm2#CW2?PX?JNuoA`HANpu8vq%GlFEbrHzr3=ClV zR5;8zq*$S@=dk1iX@Z+wH&{5eUZ~%#na_9KakI z2*(l3QDBe+d6|Qe!;2#x?gnoz5F6?SA5IXbK?dFHK_LI0rV` zKq9`hfPv#Y*qIg*@ufu!92da$*g*7L7Bu2yU~qtNt_V7DGB7wx#OEY2a9jr)-~y4k z1=iyO;oRn`VrF0nfN<^!#j!Imgg`itcz9VD7$P8?Cw!o+6a(Qr1*eh}2AN6B3=AM0 zvS0$_N!d*t3=FcMXk_4J$z*3>UksCq&Ky z!t-Y0I>ODsU<2X#F@ZC*1BB-fQRxEV1wiCHAiO{(kyG3Z3_cKE2t;K7gcr)h3G!YD zgjd1DUdheC5TO9}Z4Hw!D5ZNaLb$a|LZFoF1LZa{@!aNSV7S8sk!@oVi05QrcmU;g zFmXNSW?*>3#K6n4gM)zqT6?gA*t{&D^b3xO7oeaA1-C3XCcs=!NHOrT?B@U#zo$4D z7-ZU*85lt63@Oe)La;dd0#XCg1xkJhH4MBg5}XW>LKc*+z&Vcz!VltvW^rhl%^}Yy z^_P`_K@sF}9u8$jjv1T`&}dd=6a;agJT*pe5`ad!IwLp6~CvoD2*R5S2+x zVxUZu0pTS>cm)t%3WQey;iWPO2yrtoG(dQ1Oae;W3=AC*UOL3S1rS~aMBfq!FB8IB z1L0*scv~R6YzS`;gqH*19f9z2AzA1QgAgbQfvg6{rzC_AvK-83hwzQKq46uup!9*G zh>1NC9*Ct((jX2rCd!y3GPxNTDj2{e6o?5nMwUSc6w;u~0Oc!x;0R}82IX57P#WRL zW8wzI6ogaG#0|0$V)r_j-4c+711}3mL=}{E!HJWBmt`k6C~br4V^vTdf+ggKVBrhg z3=Be`bo3o&5EFwM*iLq4aZp}?a5$J{Q`i|8L^!ydIQ@B`wJw(nFR0}NsXe${!5l_# z3CQIJ<}g7x?xK*E61WAy<-sh-!@wZI#m&rl0A><5tJrfU1_lO++{`=%ZZE1%_;taiGcx90djMJW!S)WaC3t>><|tQn8N{Sk8$%dNAoa18eQD{Vjw$( z9x*X6yx@Vx8aD&`4Y&d!F_1X8g~lxmW~-m!VPIfn z1&seW!GQu|GcYhP&Uwhkz@Q1@F)}cMLj}av0udG>3=Ac_3=Gh!JdGdd=_T%O%Vo$nGluCT>tAK_QI9L3qoD;6sG>8 z2m`}8h|blrC_i8g#{AGOmHkL7h+&Y<_8BaQ!~^pATg+0)}y)Q89xJqKFB!6 z^$IYP4Iq3yP bHcUyZWMEux3*vz!Anw`#cL#*O5uWs*d=Z#>sKp&<7QYvOS=^xr zvl!x#4g;80DBli^?*ro-g0eGXM--e7%F&D+=`g-g2?Jv%nnSzb0SXQ-P#&2n01hr_ z9%1T+CUH1_tm@ zG-Dz-AQ(Z3$`qu6F;N=ie<)iEO< zF&W}VOEAY4+|va!=R^p>Ql6b4sCmNn2_z0pjP}SvRv-yRN3fx<*dcN14v%9aaGLOd z^C9v+aJ~`Pp?(NH*s%d{zBR}pAR9oK(OuL)h=IW-QwYRkV6X*IcCApJeH)a)01Z)4 z!U2_NT(8)*8DkhdwHad>-Lx6wm^d`F8RMBaEEpIZKqfF634p?eagq=NgIO*Eqmeeq z$B=wyEWSvHfdNwDI+|xPFq#N~)G{y#ff{NcIdDa(!oUvF4T(2ZNW6hEI3#{lAsGe| z%0ft?{2Lz1!eXGxjA>#9I4u~7g3}q(#0mxmCs4uwITM5#=jaPFFxc#X`qUX&4lc^T z-~{qINIeKM&H*J|8wPNHoPoiH2gZx?F`Vo0&>d(VX*hGWuq?;DR?%r6J=oF5CJP^!kUd# zp_16L5d(ue$N?bCvxJe&1H=GfUMmEf&k(`p_hmz9n9GR7S;fc$*DaufBrzXZ)dD0t z_;e8F^64V6Rgl=KNNi0cwi<%XABF8u3@jQ9%zQH33=FJd49t8GaZh0e1~#ZZ4h9BxH3pCfhbfri z6k}lKK&azlVMI5QTZ4g_17swR36hcak~WeI47~gdAp02@_=Fjl`9LE4PWrYN)JX9;#Pawk; zPy|4|GO!kqN1$oiSY85p!Wn;01d84baKtlibb$iO5q(Mf`VL8r5c zkpU#Zz@Q7�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 literal 0 HcmV?d00001 diff --git a/obj/User/main.d b/obj/User/main.d new file mode 100644 index 0000000..c3b457c --- /dev/null +++ b/obj/User/main.d @@ -0,0 +1,165 @@ +User/main.o: ../User/main.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rng.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + ../User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + ../User/meshcore/packetstructs.h ../User/meshcore/packets/advert.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + ../User/meshcore/packets/control.h ../User/meshcore/packets/encrypted.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h \ + ../User/meshcore/packets/group.h ../User/meshcore/packetstructs.h \ + ../User/sx1262.h ../User/util/hexdump.h ../User/util/log.h \ + ../User/meshcore/meshcore.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/sx1262.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/sha2.h \ + ../User/lib/config.h ../User/lib/rtc/rtc.h \ + ../User/lib/monocypher/monocypher-ed25519.h \ + ../User/lib/monocypher/monocypher.h ../User/meshcore/stats.h \ + ../User/lib/adc/temperature.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rng.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +../User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +../User/meshcore/packetstructs.h: + +../User/meshcore/packets/advert.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +../User/meshcore/packets/control.h: + +../User/meshcore/packets/encrypted.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: + +../User/meshcore/packets/group.h: + +../User/meshcore/packetstructs.h: + +../User/sx1262.h: + +../User/util/hexdump.h: + +../User/util/log.h: + +../User/meshcore/meshcore.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/sx1262.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/sha2.h: + +../User/lib/config.h: + +../User/lib/rtc/rtc.h: + +../User/lib/monocypher/monocypher-ed25519.h: + +../User/lib/monocypher/monocypher.h: + +../User/meshcore/stats.h: + +../User/lib/adc/temperature.h: diff --git a/obj/User/main.o b/obj/User/main.o new file mode 100644 index 0000000000000000000000000000000000000000..54b8fdfee6a362a4c5ab1dbba2a919e598797301 GIT binary patch literal 53048 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 literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/meshframing.d b/obj/User/meshcore/meshframing.d new file mode 100644 index 0000000..1a3e1ea --- /dev/null +++ b/obj/User/meshcore/meshframing.d @@ -0,0 +1,127 @@ +User/meshcore/meshframing.o: ../User/meshcore/meshframing.c \ + ../User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + ../User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/stats.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/sx1262.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/sha2.h + +../User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +../User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/stats.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/sx1262.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/sha2.h: diff --git a/obj/User/meshcore/meshframing.o b/obj/User/meshcore/meshframing.o new file mode 100644 index 0000000000000000000000000000000000000000..bdd92ae12e53bb566bbcd49e8d952cd6aa89693e GIT binary patch literal 87616 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 literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/advert.d b/obj/User/meshcore/packets/advert.d new file mode 100644 index 0000000..a516bfc --- /dev/null +++ b/obj/User/meshcore/packets/advert.d @@ -0,0 +1,130 @@ +User/meshcore/packets/advert.o: ../User/meshcore/packets/advert.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher-ed25519.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + ../User/meshcore/packets/advert.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/base64.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher-ed25519.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +../User/meshcore/packets/advert.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/base64.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: diff --git a/obj/User/meshcore/packets/advert.o b/obj/User/meshcore/packets/advert.o new file mode 100644 index 0000000000000000000000000000000000000000..ff1c4a8092d00872e39e3c506bd41f85f49d3f61 GIT binary patch literal 52612 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 literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/anonymous.d b/obj/User/meshcore/packets/anonymous.d new file mode 100644 index 0000000..737d166 --- /dev/null +++ b/obj/User/meshcore/packets/anonymous.d @@ -0,0 +1,130 @@ +User/meshcore/packets/anonymous.o: ../User/meshcore/packets/anonymous.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher-ed25519.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packets/encrypted.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h \ + ../User/meshcore/packets/anonymous.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher-ed25519.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/monocypher/monocypher.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packets/encrypted.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: + +../User/meshcore/packets/anonymous.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h: diff --git a/obj/User/meshcore/packets/anonymous.o b/obj/User/meshcore/packets/anonymous.o new file mode 100644 index 0000000000000000000000000000000000000000..54e2d0df2014e527d0c11ae64877808979d09cbe GIT binary patch literal 56320 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 IX?XYn03MdwApigX literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/control.d b/obj/User/meshcore/packets/control.d new file mode 100644 index 0000000..3fa4229 --- /dev/null +++ b/obj/User/meshcore/packets/control.d @@ -0,0 +1,37 @@ +User/meshcore/packets/control.o: ../User/meshcore/packets/control.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + ../User/meshcore/packets/control.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/stats.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +../User/meshcore/packets/control.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/stats.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: diff --git a/obj/User/meshcore/packets/control.o b/obj/User/meshcore/packets/control.o new file mode 100644 index 0000000000000000000000000000000000000000..614705a5777a5e1ce14a2bf51fec71cbda666309 GIT binary patch literal 41480 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 N=(0eNG}s>?1^|_Jm$d)@ literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/custom.d b/obj/User/meshcore/packets/custom.d new file mode 100644 index 0000000..bf4d946 --- /dev/null +++ b/obj/User/meshcore/packets/custom.d @@ -0,0 +1,4 @@ +User/meshcore/packets/custom.o: ../User/meshcore/packets/custom.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: diff --git a/obj/User/meshcore/packets/custom.o b/obj/User/meshcore/packets/custom.o new file mode 100644 index 0000000000000000000000000000000000000000..c7f0a9ffacb31a17a3c16ca98a55a8570cf99437 GIT binary patch literal 2228 zcmb<-^>JflWMqH=MuyJ}2p$7N3>yQOZvs}J!NAYJ$B@pzz`z3Lvw)TIfZ0%jiIEM& zVq)X~Q%tN7iXBX`KzJ+=9tVWS0p>BYux93!Ffc*oAf_-d3Notl33D^^N%IMaGcYiz zFmQ9*aWnHVFfc=zAZtVz7#Ns97C@Z^W->4^NHQ=mFf#}u2QW zrs^jZmFDH^=jNB@6=jyC7U>q3l%{0n>lPH{XQd{W6zk`v7H1^q7p3Oq7nS4}>*ptB zF}VAMDmYtODp=?l=@}^K<|Y;;XV?~%85?EhCMH*ugG7=tZ8LKUjExj@bBl8mb8>W3 z5=#PHJ9yNro**2oeCgpa4+NO-n1yOD@UG&(keV1=Ga}x@llr zk@$J}y2<&ux%qhvdV2by#i>Pb@97sLCTFLX6zeCK7MJAb>LoLPjAa0a8khiu7=ydB zvz3BIML=S5wgM;=f;@wrb;A@~bCXh2Qc_bC+?}0u6wFL?lQK&*A;ANSeq>b#vsMOz_1?71`%8gN(>AP#c)S+F=#O`FqDC$z?h4{2u#BWP6h`C1_m=2 zmw}7Hoq>Tt1Bvg)z`ziS#0RmRkoYkS3=Hx}{A30O23{n776SvrEF||7GB7a2Bgt35 z*&qfNLp=in!&D^oZ6IMdhLj#KE;9o+0|Pt>==r3iCY7egCnhBorIr~m==nGXyBWf0 zLnz;f0j4e|GcOe?3#FiHKuR2g-HahROdymggffFr<`BvPLRrGi%*;#6Hvq>fBQ&Bw zWgH_n#KnT30tF<%z`!61VnYK8RNOG~LDVRK#Q7m?br4$s!qx+^K?X1|FqneaLJ)Bq z5F1odF)%PVgV>-lje&u|3&aLl!oa`~2x5yt)PusFQ5?cf1BpvO*r1fi2yzIBt5;l^ zTauW>pjTW{1fervtdi7<5(Yg`R%OsjDlTTwD@x5t)PsaP$oC9THY65Mq!Wu0^U_m` zVJbl34`UaX6fx+5GJ9%X3CID&VQG;285qFf4blOrYd|arh7|1#42n>7u-u5Q4wl?N z;SH)52&prKng_9kfdOP*HjINLrvt6;KzR%#EyK#du!Vtv0h9zlDH()8Y+EEfAa(N@ z7#P$*3@C=VF91#5Q3eJEX!LtJDEm;z!zF~}Sc6O=8G)!kub0GA^mIS_`a0{{TGAIks$ literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/encrypted.d b/obj/User/meshcore/packets/encrypted.d new file mode 100644 index 0000000..a1217ea --- /dev/null +++ b/obj/User/meshcore/packets/encrypted.d @@ -0,0 +1,142 @@ +User/meshcore/packets/encrypted.o: ../User/meshcore/packets/encrypted.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/telemetry/telemetry.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packets/ack.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packets/advert.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/stats.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h \ + ../User/meshcore/packets/encrypted.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/adc/temperature.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/rtc/rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/sx1262.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/telemetry/telemetry.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packets/ack.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packets/advert.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/stats.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: + +../User/meshcore/packets/encrypted.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/adc/temperature.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/rtc/rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/sx1262.h: diff --git a/obj/User/meshcore/packets/encrypted.o b/obj/User/meshcore/packets/encrypted.o new file mode 100644 index 0000000000000000000000000000000000000000..2e643f06fba616294b45724611527317185dba66 GIT binary patch literal 133464 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

jDf6$ma{(7hqsO^bceho(nKAfW`=6{&_FJ zz~BZie`FZGgTfPu|6hQC0eL?#yC4HY3z9s)AOpiZB)+&H0|RJH4a9tN1_gLq7bL>M zpe~3!AHl+)C&<9?4eoz^22()>hQA=CU~JA{Cy3nN*Jp4QWMHUS0L+b=l=dZR2GB6L8s?tQg2?l!atyx( z85ofFYcLBjFd*-j;1*(FK;G{lEX2ToygyJ%2-SW?AqIw4czQ8s&=O)`2!WSJ`V2-w z3=AtFjsf>Kt%VpE(vjqyg^aeam)AqEEI z{V`cW3=GKo{fdMb7?AhJR0$!^AImW`2{C}zq(ID`))80>|S%NIEYcVXoD067MKVFm`o z`e!+YaAD-}COL+9VdVNijv-x`0lcOSVxt^GzAys=XpS4gH)p62hOi){6hpl*19%M~ zjNc~Az<@Zf!knRBn1Nvr+&}sZ(}j`4OP^uBFavl^BTWBtVFm`odNwJB^}-ActC8Yk z2a5d)4Eu$V#|IS{jtMg`d_aoN^TNpWw?4ylVFm^@c>S%8Ad-zqThi!d-Cua6cNL7iWg7hzyPUhk|fg4~`{ zV9*y~U_f3!Y%YRae=0E8i!d-C&NEYBa0jVJ3ap&-SDEPmJN1 z2m=H1`rNZ33=A`o{C5?_{bCGvMUdBniZMJDL7ra|V|a_=eldoxBFOnkjNvbe`^6Yo zMUnH97z3{;1A`~LzB6YK6NUH`LW(fRiX!Jn5e5}e28QiO?$r@R4sQ_#V^L)HiZED- zBIiF51}9Ml2E=+=5e6?&1_s1>MiGV}QRMV2!Vo3Oz~GNGev*vhJ|TuIQRMcd5JRCT z0|RKz7UF(=hDsFo2{AOFxKD_oT@*Pyg&6uok<)_^!&FfQ@EkM5JadM5DE135EEQz{ zuK|Y03oxt!$;0bQeTFS4_6soVMzLRj;Sfsr2r!%!Wk6c9EWmI<6gfQ#FkBa9U?@cj zj|U+8AeJ*QFz_)v7iC}ot-*x|@iDv;WdN^Ph49T8zKb$2$RWA!Kgj<`e0DJg@EkBi zy*>lK7;=2@F^GwwnlCHH!0-l1zp5Am17dwQAA^n<@_GV324gYg@}G~vN(?!@@-aAy zF))DU)FJkpGk7676X2E2fnp5cHQx|<9)<`p28RDg_9uujFv!Bo7k!2dF$M;2Bz}Py zXw@@BH)y4FxfpW%^DxwjF)%EFn`h3@j$%I-L!TIO`N737Rg8h50?GWjVhjw^koZf* z7#NNq@z;tmAl;M4#jr&TxqrmPuv?6QArf96nKK*_V_*yXFyt`&c+ZY&VaP$oQ)w>oPpssQhAq$n5+cf z_fjg(z<|78qeh&8VL6ifTf`X{z98{?#F5J%4u;8S`e%tVFu1_uOP^s8n);P!>Nkip zFeD+V-yx2?zMF$#zc>TZntu+4W8w_pHT;n9=3qE0j$Hn7FkBI5U|0-~e{+Vr;>hDU z<_yoo85jbQ;^VzI14ARcd^czKA z7#O6H(yyun1H*JA{dy7%4B1HIf94Vl44O#xIY=-tyoI;d%^5r;7#Kinlpy{!X9$vD zVE6`)4|9fSko`#cCq;sRVGX>$Y0i)LA@BC2$bv^P=2?p?<42b_^7#Jmy*T={( za7v=CR~D2+U2iNYiMn1{QIdfHaXyR;gQg_%`g9ovLrDe((3)yI5J85oey z_wKsPR7x_Stj}$f zWMC+Om-jLZostX;$m?Y%g7iZi4-W5{lF0Ri48uZ6b-eZ_D87)?Ka^wuula;nDZ}tm5_LTCqa;KILb5P? z2gMJB1HK>euOxDP#KOQVgk_$CWOu@rLqmxZAU(Yas% z+0=yMJ~@UiDdh54j$x7%>iXwdQVa~p=aVf0nFlZ5iE+uDb(?gPg1DstA9zMj&CqYGcX{Z zzrZEU0A8~U2~Rl&A!!Eio)H*dN}7Rz1782iF(^qhFd+7e$T4V1GcbVmaKO|XNu!QO zSxF<056Uq(Nu!P@c}X)cAkGJsV+fLlm;@oE7@|P#gK!u?DJMx9IXy`+WTB{6U?`GC zULUW(P$i9=J`@<5q>;x*6&Siu^h+>Il15Iy5)8AXQTKl>l4bz!v4c2Cf?*Ykeldnk zDEh@1cA?0NFdRgY7hyOdjog0`VYq;zUWnm3ih3c2dnob(3{O$y1sL9-$n!CLmIn3G zA+81a>=#P-@G&sTfNsr0$aBabmzR7D{4&Vp1s{W$3U_jjO$i}cp26;S!jbWt>a{q{pVFOC|vN3E&v7dusABz1P3`b><`y(6-XJi-{ zKznK-G0MSkSq8cM=U})c!@v*+kp#D&AENl5gW&~=dpH>0%OLmnIT*glpthg?qNEQF z1{PW5`5_JlZdtfx;GMFPvdI3IU{H`n9{-YHP?tq6k0luNWKqYLOl48qKQ^+c?H^}Z z1_tE)PhPU9?Uz7V1_sa`Fo>&U7$Rg*+b{95sO_gTS=9DZt}FusXwM={e~Bz=`>7hm z{c;RVvZ(V9owBI)%LG}}`T$}sgk(nANedETX0T+K4h>IGpHYZ`jbRm(50VEpb9bWg z51{c+qw((`DqrwEhdXHUkJ0$A(fB{m_*_u)Kz%YH1`Y;gC?DoNBQ(AX8s8hr2kjXa zV&Gy(gz{nf3()vYP(Em1xex;n!*nPgG^QfNz{juw%7^LS59NdQfeSGRFr0z%Ve+@p z_>a-}U!i=^oTw0k5Cb!GgFR@?r4WM%gCvv>8Z#7P5MwZc@7{Do-z4QTuwX#D+X{PSr1 zyJ-BEX#6iwK4{KQh(V5l3$b|>oE~M-_!?+@GbkUlrdNnTfx#EbhlO7#8b1w<&ybpz zTvS<5lA5BI%utY6RGb>0oS$Em5}%uyT$InC=VPG2pyy-6pyy-Epyy-4pyy)ykIp$z<%)#cEgUvAq z>oo`KH3#c82kSKl>otau5D~CB=3sLyz~)$h&9MNRV*xhD0&I>2*c=P6E(?$e;9vlU z0yq%BVFL~VaA<&o!4hN&I4Hm&0S*XoIDmt}5@Z%QD8M0M2{IHM8sNYH``;2|DL4!) zK~6LSaV~^*U2NPJEGuX?91|Shb1CT2W4M2fl zXaMq^p#ey*p#jJiLvV&L1ZN0CaE34hX9z=ZhA@O=2(Uk#!J*&`4lZYKC^>`u;tcV+ zGdO4r!Rg-+obnC9Y2FZ==2KFWO4H*Llah*3%Rr8G40baH2Ns9{4lpnSJ!GW*|P)C~#ZAp+tOOFJ1L8x?0hc)-KGc2S3e0`Z~dfwLos z4>b>#y1+RSlp3Jn2hNfpJ~aHmc@o5jh8s9fg80yI1D8&qWCTq(;H(MaL(KzcP!Jz# z9yptV_)zn}r4@(|H4mJ1LFo}{9ysHI_)zn}*%`!#ng`B)AU@PQa25pdq2__}A1J|r zOCm4>8iJ6#4;F!jA*4(Ii$Fus&;V*Iq=*1ZK@El!6d)0BMG9uXOa_-8U=f(f;4%a( z0y7z0l7K~^F=Pm?V8J5LI5LFg9z$?V3zCB8A8>sO7J&wYA-L8Bi@@9ru6w~EFgJs1 zV2}tb+dxVqun5el#xTX;stzm#b2BXS7{YRoAuM|t!t#$HxT*%}g5@AXaD@#PfjJdi zZG%N%P6by`U=f(@;K~am0?SE;;HnEO0!<5s;Cc)!0y7z0m4QWICWEUqun5d#aIFRs zf#oSfaK#1|ftd`h;J_ju}5`kqoLvVEo7J-=zuJXVlFq6R*A6NutGPwE!i$F~_f@M7;aIFq1#KF}rm;p7} z2wWY5MW7}d!LptaxON6hLBrVyTt|aMU|G)yR$m#xvYrvR?gp!Y#-I_b&N6~!JtJ7H zWdzH5M(}zImi3HaS56 z2aRBLnGq}x8o~0Q5iAcH!Rj+3SROQj)o4brJZJ=~(~Mww&n7&usmo4tMrUudC&-! z2aRBP&pnZ_8LWkCYa^k)ptx*!2ieh>43l${_Nqyt2Q6oP0_W(CopQozXxoS&Rr!4yb0 zNEX!m0yoA%0w85!K8CQUF$Nb1APG=;5aweDPE}z(hTt#<(NJ-4u!8td_kaTx#D^LP z4$?3mLvVH`-=AU;T+lM}dza&iSzVLp&f0*HpFhE%&@ zK9I^5L_aCQXoq3Xdo4ipJc_28rr3QJI9 z3`E1i45A-WT88-;fnya!gBm~}8loRkQiAvp_rr@vV{lG%a{`x2ZmwX;CpZLT3ph=H zl=}pSfJ_7PK}pIdI0R%Wm=CfZlr$i{8)I-_gCYyc2iFR2PT<1N%@s_6WMRgE>k5zn z%sgALMSJ2dG6#2ra+DY*EeB4kP-<*gEWC? zNZ3M(BPSZkRVOEK{o&*arohtBumBg|Amc%v2=jrI zwIDvoJP-{s1|$wL7eqtF!P&^k30w&|xq_)MA4q`+qCu*hoWM1clPj14TM7yYCns>R z;p7UYz``Ief*Bw`f;<6oT$m4}@B`6MKDgur@j)>RqCrssqM?olmztmmfXag{2JxZt z;Cd0n2RRQ!Lp=v>kAnCh_kkP&PKa(!;QG(a6-qz^UOg4`h%6L_@5F zbSyx8m^!Gp!A+YmA471<21J8w0b2(OUpFUk3&YJ7Oo6O{8V7EVh510nOF%T#Sa7xj zSp)G6WDEtw2ZbKkSWt3sa{{+u++4vF$XJkQm=Czh3iE*m4P^8LWH{6?Xpq3WXvW|i zE|D>qj#1=0%geV7lp zz7F$&Rx9ATI?M-Jsle)KV{oo_a{@Qh++4vF$Y5}G0vQDgU=R&*JctIxtCJJBoN;mm zQy@`LxPH-TgOnXU z!66`1z_K8QPjCpxG%z2;@Cgn9ITg$YF?@nUKu!kpK@6YZ5RlWsd=LXv1~KUQfbt5M z0((Eq2OPp-KH#Vd^8rV8m=8Dsfpmfc%MDU$xj{-Tkhh?b050yGoWQBm$rVh2WT8<4 ziXkUguo{pk$g5#K;C64A54epR<^!!Y;iU<@SU`w?3|yp6$*0!zWHfHkv?Va;q~a8!cTz)XfUvyEZR zY-3n6+ZbHwgA~J>*~Z{x1Qvn08P?1;1~;=oB__znpq2(G{6I7$;0(cC2T+Rw6!;(- zhk++^K!q7NO+(v&(54@_>j`RMg5|&!7|0)B9wbm8K?|`E;!J3P z4e>KL?Sg_Bq6K0hq~8e&0Ei+;ZxPg%fjSY~DgyB#rbGILAU@OvXp<7s1q8Jpp!&e+ z5X6Ug64JQ>4UltoDM;Jm^jp(;Ia$Ueu3HtPMx5t7Gka; zEF!@rFsROg>W3E8kUkZt_<;HgTn(%?FP2bx{L&D}5`Xkvn5O@+Q|Xu+Atq*#tid;1_dkjh)XZ`d`U)XUVLt1GDt~sK_x>*YDG$E zZUKW&eo$gaQDR1SEn+Ar z%FHVXN`+`b2_ZvL zg&s(iQ(|&9LqSn~a%yq0bAE1aVqOX;e3Ekuz zd5s}CF()-IC9#Mhu_QkeEEOaKIAT~@Kv}R6<0kSaw#Dt%bve>db3kmEI4G=y zu0q@iV#CD2>vpa|#6fJBIOtvmDMpBUKx~-!G6n_)X{b1e4HF05As}=eVh)H669?Vp zECf9e2*ieo?*WA~^rA8l8zv4~Hw5!9hz%1z00kL7?pzV}W zphJ|Q_jtg>L1`Z5FAy6h4qEOg4K)YEhKYlg?MOq-0kL7?ptJ~!M-Uq(4$4PDcOd=( zv0>t%byqO=gV-=}(3uJ__k-9lanQOlDOQNTKx~*eXpJSz{UA0>9CUvP%>5uXOdPal zRT^pzhz%15ooz347vfG38zv6A^Fauj4nb^~IB4&x&;^Kk5E~{A+LEFJy~qx9o~sT! z#LZ!#@__@w2Bkw?P6!(mn?m;?=788Rb3kzcvlqmMiG#urW-o{h69?V(A@l%Z4u}mC z2bqb@e9-banE4VXOAT~@K zv=$a-FNh5j2i?&D%NHOvOdNDSjL>6pfKk~3TMQIK6rTx ziZ3bXLHHmx%pA~GB59~Nhz%15?V%8Y9=r@%hVj#D=*abO#PBJV9)jI4JMH!V|=X ziG$(-7M>tBOdJ&Eu3g}C~ZrLK->dj!`u%_+tN^R5E~{AO53pT1hHY_p!La8q7ZXHY?!zUs9uJOgV-=} z&>kk3IUqJn9CSAnto#SDVd9{&ND6eB00U&bK1>{xhNYq6AT~@KR7Szf2eDz|pf(aL zzCdi4INtaYhxiL4{X@lxjxXrJe;Dxv6(=UXKxtk|65<{Z8|HpcnwN%(gV-=}P@0E@ z1BeY12c>x_DTp~BHcT9p=B1(HAT~@Kl;*Lee^7lYB@HnL#D=K{tp}Heii6lNaZo(M z+yi36#6fLcDbVE*43PcwFmX^@R~jk~V#CBi?R=OyAT~_A3e;|tg}4XAhKYmP|I$!# z5E~{AItv5lFAy6h4m!gNmQFxym^e6{U}*<}(uNfDU>Xn`rXG|wq@m&KzapCJwrR5M~aD4HE~Y0V#P%IDptNaZnnNhKhsOFmX^@ z1!fM24HE~|O;QRFb3kmEI4EsML&ZUCm^e6{KNOAT~@Kls2TH;vhCm9F#U-=788RaZp=DN*UrF5E~{AN;A?> zaS$6O4muM8W)6rA69?V(C#3>02gHVngU+y#QiX_v*f4QWA4(c34r0T^L3_qv=7ZQU zaZsBU)@}!}Vd9{B?xdmig4i(eZJ>4?H2gtqm^dg63#dWd13GU;R~^Czr)MnnKBz2$ zwM#*4m^q*_N9Ylx{QzRa#6fidEWd!*FmbT?SlXqayZ~!Ag4i(ipgIUv{)5;saZud~ za}S6O69@GXq@Wi>gV-=}P+cGm6$i0l;-Iu4^bX>F5E~{A%KJjMAmSi4OdPbg57zDl zv0>t%JAN}`7hz%15^@U;fg4i%|(Ao1s?;-Yr*f4R>9U)TCgY`gc zm^dizq@m&2eDz|p!*eJ{spmN;(j3agDz8IU|;~TVd6ocaD$42*f8-3ka}Z? zy&yJB9CZJpG*leKhKYmjVT9QWV#CBid$WZ;L;M9|!^A=NFiL%ah=bTL@d}W8pyD7l zOuPn39K?o+_krAL0&ypZ4HF05%P0*M2eDz|p!*qN;S6HK#6fq~Ntr^-0kL7?%Ru%* z#X)SC_!>qA2AF?AY?wIc>_MTg5PyN#FmceC60q_O#DP^3``6R(ok^_ z8zv4q<3Y+C5gruS3AT~@~3Usd?v>XPp zVd9{(eqrGTV#CBicLGXTLd*xTVd6F*_d~@&Y?wIcPC+Rvh3wOF0(Tn;bmX|u|eV>HfYa3XuKE3hKYmjdldQ(Ne>`4NE}oLg3eHt z0$pat069+;CJws)5oQjE4H5^LSpsq=R6U3d5(k-61qwH4xdCFs#6fo=O4&gC3u42> zJ3!_@#X)SCcpu0dX!wKJFmcdXCQ`N#b3kmE_#%)wP;n3&CcXk>&JT!xL2Q`#CTO@_ z;bmX|u|eV>_BN0?m)RL$Y?$~ika|0ay&yJ79OU19AoWmj5E~{Ay5mvG9-s$AoWmj5E~{A zI?f)Q6hz$}4vExAI zTxJKKi3eiC#6kB|Ng186728n~*a|L9MC&WDF2Q}TKpqE~P*f4QW6)O!D2eDz| zprR9&4nb^~ILJ$|@&Uw#i3hMSFi1no2M`-39>#)5&mcBTJb?vLKZ43D5F0EGI>Q@e z4m6xoSfKN#0+6$>r2HV^0J^6ZteydK2aq&W9CRNLOdNE#Ev(!Fv0>tMAoHQ+9*7MS zZ$WY=hz%2;faFdP8!Rrsz%T`54%D3>HcT9J$F7t=#GN2ESeyZJ*0D5H9CYt0OdNEt zCoG&nY?$~KsJ)>24#WnDgV_6^_QKdOanN17u=WFp4H5_C3(y_DQlJQ7fZXQ`6Tbv9 z2PzI?!^CeOg#(BU6MqDC52%g_B)U{(E1Lys5Dd@#DIOtwesZfaf zL2QsXDBfp)+yfN{v0>u#K=wk*VGtW84!U~=cK$zz4HF05$pCT>sLlnkLE<3x4yb!z zY?$~yPq2eGmO#BMS{m}L> zhz%3J2eKDBz5!yx#6f5D!p1#7Y?$~nkopLSy&yJB{0GQhs5poX6K7y!V32|xn92q% zCm9$RSlAdCq@m&c!3%YO3 z5}kaA8qnQ4Fn5CPArUBmh=cCn(J6$m4}tW88W9YTyLfbpA>xlf;w2C^=uRG;QV5%k znSnv448jK8)u0Pi1G=Xj#s=Nlqf-u1owI2VE%60J+0Q zrwXDTbYBn5&7iw_bgCiZmq6;Fc7g8b(W!xmgO*L`);b8Vy7>f%4GnY9{W3Zr&oMAC`~!(Y(-^3p(dmWg z1>G?N3v913h+55$IvgZgQ(c|8ytCJrhGVCI0>FmcdaJZxSM#Dl`P+LT*9};&UHcTAU4v>b5gV-=}(A+)D91t5O4w|!r&Fg{KFmceFFKk{9 z#D^`N;t*!&%c4HE~=<-yzoV#CBiXFbB!*MZnDanPDZ*!nsU z8zv4~(p*OnIA~2HY<(Sw4HE~I|I$!%Kx~-!1<uO69>(Sz{Ejpm^i2&5qbluPeE*$cpYf`9J<~N#Da#fY>l`(3m{T91t5OehsAlAH;kR8zwFX8c&1P`ye(<98}l9>U|I!CJwrz z57hny<$DktCjJdN?gtVFv0>t%F*hO5W!a$ekQvcVQvi)W+=I9W#D=K{jfqK3grsK> z8z!y?8h?O_gV-=}&{!EP{eajoaT}2N&~_1s4HI`m5(lwi;-I^eVC^Lk8zvqEvKQK3 z0t%t`{udf!Hu{P*Wb3??7yrIH+kT4K)YEhKYlkYp`{>AT~@KRQ*d$ zhS&>Y!^A;N0cof>hz%15Rr9cP0%F6&XMy_rZz16ZV#CBibv@|ZNluJK;rN zm@bs<#K^!PFashEnvc_gUcS8nBo1;o1LQnW0jT-lK~W2H8|WS>m^kQ8Y8V?7*4Ww-p!NW4PXUMx3qw%-4l0X4^*@LW5(lwC>vKS3 z8Zb6Y9JJmBmbO7`kT}Rr(0UuGg%H1h*f4R>x@#$rV?lGlNNd+Y>nLDp8^ngG2i4=! zP;)?Rm^i2&mxh`HV#CBi^*AhTgV-=}P(3ch1i3r_#Dt%^)@hfg4i%|P(2RIgCI6c98{-EL(KuPVd7n&Iu2U*f!HwdDIjrZ-3MaB#6jyi zU~`cmHcWg8XiWuZOq&UEHx)?Sg^7V-1!xTeR2;;Hi5~)~2Mrc7K+bvwiG$(`v@ROv zFAy6hehOp`H2gtqm^f(thBVY15E~{ATE77ce-Ilc{to0X=;bINHcT9}?gAG6AT~@K zwC+M`DJ1+sY?wG`-382@AT~@KwC(~H{vb9?oC`Du4K)YEhKcim>TYQGgV-=}(7Fq$ zWe|HoY?wHxT_Ft>2eDz|pmi6pvIxY6iG$Wr2>peWfgmNY|#B?I-o&iP(L12u0qv-+E=@B;z^=8+7dw<9Y}ibj1SW1{Uy~ogxDR1LH=BIA}c~BdF3~fZQ3!xEUgD2~q*6+HmH1H+zw&KgVgMRuyaA|oe(x?9D{KegxvrV-wk26g4obY z?IwfRdm-YWb#aWKfpZ21hJ_&U{Sfi>Aoc+W8&n4|9)z$#ZD~f(AUXpB186S~<6($6 zX#Eo75eWM;NbgYy`#*>csu)4}m63sg@i;^rw4R6Y1cVI=bHDc!d?qvg9Z;67#Kiv_lyrA z;>SVaph*T$y$oVMhKN4|v7bQL??LRR5cXdX`x%7I#mvCK_#DC(2eDs3*s37*O9&e@ z|I7Fa!UnZzVg8K=sd)_%&jGRDK-iTaHq@>qAog2`_(l*LH0c2vTL!V;L&QPjGmIY~ zY|s`g#*Yv-XuAa?Xn=$Pa`!FcXNWjxSqvj+l7xYQ0o0aY{0b2VO_MNwgRntkHH_aO zY|yX;;|~ZM)C6Jt31Ne>E+c4C1===a{0$KYML**o2pbgKjDI0)kT)3rLD(Q|jQ=5Q zc2))kM$jY-0|NtS&VrEQLNSq16js~%rA?!>Ln+3uy2eDZp>{bw)4Z@xbVuK6@ z6HN>Z3M5 zwy6bTt3$*sKy1)J9cY{o#MXp}hk)2x5OxxXtqoxpfY>?^b{&YV3t{(w*q})>&^R-Q ztq&1j0b(0K*xNvCLkRmnhz*)dV_;z5wa9Y%2)+6NnAH#Onu$Z37Yi4`SOw*n(UP z42+;mz`(#D4r1Fw#AQKj2MAjk#CC+RH9>4A2wNY-c80J`L2S@OA1LjC*sc(9M-bZ$ z!gdF--63pW5ZeR74hFG3A?!#H+Y7=j0I|Ix>?RN!G?)q+4*{`3nU#Top%29NgQ%GT zV*5kbvq9_t2zv#H9SC7>1+jx5?8_iFRLv6*I~XGV3B(3XPBJhs{0Ff^A>usT3=E7= zy^n|0I?Gw?7bj1^un@JAU0@#nSp`f1&9sR`xC@YhNu_j zVPIf{s#gH9q3ZQOY^a(D5F0c&&A`Br3Sy^1^cI2GpvhPU28MbNI~^k417c@D*fT+F zXjm-+u|b6>0|Ucm5IYN^<^YJD4Pl=Ju|X5Lp!H@Tb}mHxIf$JHVYBiwFfisr*kT}d z0fem#Vi!W#1|T+Q;+KJe!4||WhKPHC*wFY22eF~?l>%Zz-BSo+mq66lf!I*@cZ1la z5b@O@Hq_odAa)r<{3M7CHRl?L4Gr7JAT~5?KZ4j$^?yNZP-OzzPLVuL0P7#J90LF{UX8qi&jjL-{_D?s8^=y) z1jL5=s{zFBhluxr*w8e*9K;4qsxUAxYyq*MVR#9|hN`~@Vo!wVeGOuRCixi{7=D1* zph}*Bfq_+kfq`)fM2!%LJr%;12eGF?*g7EgbO_rL#0D)20QCz%Y^eFcAU5=p;7kyE z7DRm+h&>y^ZU(XEK-d#N?70y3To4_rgv zJrH{_gbljWm~jb&{Szd<6vAc~WME(fO*%0!Fo=TK%OT>*AodCf+YrQF31QoV*sCCH zUl4mWgk1w-gBCb|%54yPEkt|=h`kQNJ_=%k8cLwG-yrq|i1>XFdn1JX2E^V3VgCfN zH$&KLLJSOypoJ0)3=E(g~T1>&f0KT)HaVJDg1W0@r zgq;Rr?}o5TKy1*28v_IQ&Ur>qBaVTAVFE}TwDorBpNEK7g4h=z>;)k9 zMF@K>hv%tp#F( z8ovw-4CWyAEr_@ah3?1vEX=^!>}p$Y>7!wL}lF+?16zcb?#2zw_;d;<&kmZd`=_EU)X zIS?DPn1z9X;WCH~YP>TrFx&^RUqIA60kK~~*grt*R}eOj7y|?2YY1Bu#C`)|%YoQ$ zA#4p0`yGT0x^G$eJ%X(c6*mQ`f!YhYW0~;-M2#Cr{3C=N1Y$!kUk(ScKSRV5LF^4I z450HHvOw%F5b-h)8`Sw=U|^^QvA;pY`$6pQ5cXma8?;~t)VBq(p=;oeg4jPHYVLs8 z&^71JLF``;@qZvTbWJ#?I0FOYZ-}@8hz(s+4Z2U5@ef4Y2_z0(!|V%U|AmOBfY{JA z#`z#NXwn}bD*nALiB@i3xHeC>#A0qAo zVuL1s7#JA*L2Lntcru6$>ZCF-FjRrq&~HA!;^&*kTa&5fED(!hQ^5gBEas;sV5m?rmg{VqjpDgs71Qv85nv(7mLL z(0zy&AaQAkxHpI`17U;i5@nQyu**Q=(EWflAU5=p^{F5>sPoOhz_13yhVHrB1Y#>d z^qvH4?@n;}5bnn<35L*c%{uRVlhOl|085kI$`>jBCZ8EAr#5F1!6zRd zBO_=L9|HqJK1kdYB3=Swn?cwOAhtP#-3nrZ7WXkQFiZroEg|C5Kx``r8+0!tBWQ31 zR9}F^Z6M;H`xqH*A?z(6w}BP|g4&rf3=HZ}@zWsn_7F7}Kx_vH`woch2w{WnSpXkjA*1H(!X+ZQ6f3B>k;u+M_n{t)(k5IX?E2Hhd39Ef16L&e{K)IiPu3u1#7 zNHQ=maLO?-Fa|@^^MTkQ5VjPE9SUK~gVG=VO zT?A485yXbB0r&@E7emAa6c`v7OCW4T5F2{FggS^_3K6#ev7zS_*@4()5OIGH8+!gj zD2NRj5CxsN0b)bXbI1X)Dv0sZ0NZM7eQ>$Vq4JqOc1*kqUMeQ1A}rMf~^h}e-2Vp4-x+aVmCn8-$88X*aed! z0|R3tM4TPOhL$JdAa)Z(+!VxahOmP{>=p<+3dC-Ou;UaN7?j%(Y;~x3CP+;?M7#vV z?trj6L2PLGHVwpvw!IgE*qsnH%Rp?;hs#?ezt* zp?ZTsY|sK{P#p?lPlV|01+k%XyVF2ysJ-(+Y^dJVAoe7P`aK{vbPo3rh&>r1ejUV~ z0%5-Zv7z&-A3B26^K0p!nRXpU{Ick zV5>vLLqKX~LBu0L>O05F48BzJu6{AmSV<3=E8* z4Pl_U01$gIL|h)khUPm}5F50p9JJ2`#D?ZOOAvc0M7;xuy$r&3QDIw~PZ0I>Z z0;&uQj2j^0;vn`$2wPf}fkAl_f~^h}Hw3BK3=ua2vA00j?jSbwY%X6Adn-gd4#b9@ zwUq*5Z-a=Jg4ocrv#LSt?GW)E5F2_H)+7*n2Sj`sh`kfS-V9=c7Px`R3J`l2MEop> zy&J;52y*`(1X~>{eg~umT8BOdvG+pMyaBQILD+vmZ0Nad%xVk_jQb(tA|N(s!y;(z z8^k^U5!VK>q36^Yg4hQk;&vc5Xd;w>fgupYJ_Heu0I?54*fDAh49Z6kY;~x35lGEZ zh8qP~W>=O|2Z6G!@uk8V`PeR1cg4j?uUk0&H zLBt<`*ibir2C+{=#D9Ui| z+!Dlw)(b8m_C<)eCy0Fs!uC~XU{Jn{V5>vL!$4}FW44JP_7#YlG!XkLgk1n)UxTnG zg4ov~?9Cwd4G8-ghAfYdOGP&4~M>~|0~Q$XzZ5cYf!`vZi% z1jPObVXp_VKS9`AK#Kz>~9eE6A=45g#87?{sCc& zYB4Y{{)Di-K)%Qc`!_`WY!LeoguMpDhMxDkAH@C( z5x)Xr|AVj}g4m$V(+ms@uRv_5`JX{-sQJG@?Eet;9NM6D3y^hOJlYHl%8UrMIs=3) z4N}7dVXJ`H%n-H>h|L0FJAm}EBG~Fs@eq(2Hi&p6h|LaR$AZ*zAlT|q@qCaPPKbCd zh|L9IPX@8MA?%$XHV=gT0L12nuwQ}Ld=U0KB=$EDn;#A1~ckG z*x>bn`Vh7%NDXMQ3}{^8O#2o~3%bGl%0`WU1J8o$p$Y+s07-#~0X2>Ta^?GIryg4Q}h*{mRT07RSz zi48hOi!l%)E(sEcvSmT+Ac#2Vj4VbdTLUB>3=s#f^9+HojX~m}5VjQ(+YZDIgNVB$ zvAsd;aEN#i5<3jUj(~{ABC!)e>_~_>=nN}HsDDA{Rxw6F#A`rmpzH<^I~pS131Y`U z*u5Y&bgUb6_7uz<@LE%-8qgV2j8OI(kos7N-pwF3G<>#$*l`f?V<0xvJ)rZT7~>)0 zmq6lB_B9Y28g6$%>;#A!@H*8*2>S&{JPE>n17btN=Q9%fJBSSppZ`c~X3&~aX!wB6 zVuJY#bp8^|J#rv5Q1^h&Sz?5`M-wCtb&oEH4Yk(%6& zV$TGzK?^4t7#J2Iv6q3^84$hek=UC->`aLG9wavCd?Cgxi1=}kIFx-F#Lk9@gU$|O z%z>~$`+yj8A#BhYK`{0ckor7`_!}hl2M{|SA`ZG@gb~UHT_3_&01*dWy#Ql_t`lG^ zgouN>moPSH2!OE&A`Tj=fU!ZtJ&eT=anLj#j14;elCcCL4m!#Z#s*D;F@hGEg4Q{( zFfhQ_;5Ek3_ySE&GL}K~g7%{^mP6Q}ZTv8C@OtA4h&X5~HDe`&4car#SOsB&_Bt_E zL)f4#){Hd}HfXyPBXkTLG-SzG3lRrxQGl^Q+YA`Oo7)85^`NDnjI9uH(6Ua( zHV7NE923R{EsJD?jy-~w#4$q0=s-&e8QUT1K}-E$Y|t`3#tw)$X!#n94O-^K2pxw6 zEiZ$yK}*MA=7W}1F?K@qf|g7%c0t&nrA{z5Xc-eDbbJrAJczLyq6W0|hp`931})iv zu|dmm7<(b&pk*{LHfV_qBXryhw3LLg526ONG=#Aq!UiqrfU!Z#G8m!bRG{Suj1wSg zKuZc3L5rh7b2^~)*ibfTx}6a^UIdzcW}F0351KY+oD5-urfgws(DW)JbgTw6Jqc3} z>c%rpfv5*f@4?uh;RBd@&~z8$REQeT^c5p?ECn>B1Y?7yg&3zn)PSa5U~JHo2_tm8 z1vC`_V}qs>7^g$jgNFEFY|yYfBXrybGz<-6gQAvk21Gq*SQf?x4XrZHgouNJ8^#6= zFEY-8h=YdhU~JH^8slt;IB2*E#s&>VG0uUAgNA`%Y|u~+EF3_?7BKgKh9ns0Lezu0 z;*9ekY*5#laXy3%>iWXipl&TAbQ}rPC4;F4b*mT`K-7b}E-*HzYr%LQl7B(XJ{TL+ zx6V}q&|m^q+gj&U(WFQ^D(TmoT( zvO0_n%8HE8F(^`fpx)SM$A_A-cG@H&6! z7!>G=8jxO)n?ct>!R!Scz0J5BqW&dF?+OSTbmSi+lnpx0l@U7D1lrCAQ_s%9z`(c? zqMi?lEd*ji)vJKmQ1dlF>{Sr;`bcbJ5PLO5+zN?p2Vz6b2>`L7=79GR{D6c*G)NrE zjt8;VK+H))VrPNaP;+WPZ0LAY1BksAqP_!(4c>PE3Sb5XhAAL%D0>Eo4K-&uh`k=7 zcQuH;0m9yd#0Kw8*a#6n01}6?kAT>qNMm4NIE}Er-}4N4n~2O(^5+BgJZgVF=zVF(+X9zcaOY|QE?L>wHy#~^G_ z{4ySgu)%Q(D#)R6%6JkY4vwQ!5H=`Y7*9jk;CML$VT0m=@hpT54rgeZ2Zb#ow4VzO zTWC55g(s|>2Ztv#ZG*y)5t@&{VF*pnpm2lLBcQt{7@=txbUzxb9t7Q4086)^z3s4i ze+Fpm2%1(wd)r~{F3_C?u=EMq=MHPXf%db*(&QSDUQok?fq?;Z_XI2*g7@A++nJ!V zZeVE-JoW`md*HDzXnF&kV*_iqgU+sjr7_TXHL!6c&>1zbbae$}FEm|&?j~S_rlmU| zacFxUv^+Fq{%6SeOCCR)e}9v@}x*bO03t0|ST+ssli(Kuaf; zKm)g+Jk7?ypaxX~Y8xwoG6w?#1BeaUuLV*MT5hPs3t}-afY@qKHJ~McN}$U(7#J8p zY&EDFQ2SX4G#Cu(Z-UH+ssSyVQvwy<3=9k)wi;9oXepZ#XmdGeE*PX9ss^+KO$l_l z4FdxMh^+=y16mfQBn)v6h^+=y16q=$1gZo;Yx6+nK-GYjQYnEptTQk$fY@qKHJ~L* zN}z#i(0OYh^-wjSHo1~G#C#B24XOsT97hRMV1V|Zfz(6QfR?H#fi}T2Fff4FYEU(x zWg<$T!EaD{0I7$n0WHN)l7^TMVyi*bfR;EYfeIl81_lsY4XOsTj6g{iq8`LngQ@`) z{Ys!qei#@SKx{Rr8c?;NBo9#!Vyi*bfT|oNP{GE)zyM;aLDhh|E=r(*dC)$0kUODj zK+~~Gpv!_lYxP0mP&J^bP$gxE`5?9$R1IhvQVCR8GB7ZJ*lJKUplL!S&|p7k?J>w4 zs2Wi5qy#!70Av(91A`h=4QL8YNgX7}zyM;aLDhh!wUj^wFzAd!kb0;Z&~%ZKCPY1m ztp-&Cnzm8Wf{26IYEU(xK82DtL>$CcgQ@{dMJRzPc2GVAnGaP18s1gXg{TLyL33ju z9%u+&33SN}D4m1UL)CzWkCpU6Di|0*Y&EDF&@ihKsIkDnzyM;aLDhizBT9x4^&qwy zR1IiYO$l^J8>s#TnGaP18j4ba9{K=ct3lO(hHsQWjSdC|1`t~fss=QSqGSp&AH-IJ zssRl>D1i=p1Fcg9nGaP1>WV9YCSE}MD?#E=HK4Ah5~!kMU|;~T)u3uXeHCQnI8+U&Ij#hn%wb?)0I}7eYCugxB~axF+A9H44^;!IdX;P; z?gz2eplU$Xq!Q@zG0>UDAoWl+p#G7PJw!c-tp-(dhn;~z2~;67Fff4FYEU(x>o%1@ zgLw=L3?Q}|R1N5w4JFXz5(5JRh^+>#3qZ$xDuE8JU|?VXvDKhzSUDINlt2wM(B3x= z1_m{#8g7s{=s+D%84ePMsu2c>dqdm_Vyi*bNQ1;d4LZ;{E+F+#HOe4y&;%E#+y;q5 z)qwVHD}fH_0i7oR5{IfW0IBzfm=9vBLDg7-#6b-Z(7JJudZ-#lkT_`4jDdjx#8!i< z@dSy34)_6`Qvp&BRTBsj4~CczVyi*bM1sUYjT+ECM38!@nnaLzC`3Jotp-(-2@(e# z6vV*50Ai~_)f9rn!y)QHY&EEwDv&s+p#eC_SgV<_NH6K9YpavssG2_@anNO1p!@<7hpJ)XWMEJN zUEU2kC!dpnK@F;g10)V=Pwh)M|234aC z5-)|gAH-IJw%<%Z;-E=g1_lNYTMeql1|$w@I5RLXfY@qKHJ%{xN{Bfiwi;9osQ;@3 zI%tZ4fdRx;gQ|%Isjr5p2eH+lYBE6LpvE|;eFE|qR828R95k`az`y`vt3lP&fW$!u zR)N;gg49FRw1C7xlg|tc3?Q}|R822P9CVNsXw4)@Jygv!ka#o1Js`FkRLx?LIH(iA zz`y`vt3lPQ1&MfYd|PM1jOXix(Ie7(i?_sG1~@IH>anI=dL89;zlA zBt92nK8URbRZ|EO2VM5gz`y`vt3lP2gT&`U)PvY+P&Ex8aZrbnfq?Y-|Gfy6-zLqO}jLE=y~4?yA@A?ASCYEU&VK;odw072(kfYd|Pd;p1q z7L|a?ZIC!r%}i9IssZ&)m7YW55yV!5s<8yAKL}9| zVyi*>-S!}H&>?vY3=AN)8dQxdNc=EFJ&3IaRpSj32Mr!DFff4FYEU(SAn~IR^&qwy zR82TY9CW}Qs2>V)KU7TuNF1~Phk=0s#8!i<$pDFi1|&e`JV-rMO#w(8bRZw79|{tO zs;K~pgBI_A`k^3ksG3HQIA}0~fq?(z z1rk3GQ4eCPLDeh*iGv16K=bJ!^-wjdLE;x7>OpKZsG5x+anJ#Q3=9k)wi;B;c98gG zhKrWIj~Q36S_zhNE~#~8tA+-kb0<^D2S9?(W(U~|RRcQfM(I67 zJ&3IaRg(u&54yCIfq?&bif{HKM2TP zsG5F|_!o$J5L*qZW(G+7D?}W`R)eZp2oeV^a0B&ELFPc!tOAMugs2Cx)u3uXXYVNe zf{26IYEU(MKhs$t+| zU{GR)s0XptplUck;w%tx5L*qZMgSzv3K0jf)u3u5LE@l=feZ``AhsG*4QPx|i5;RI z#8!i<(E_RGfQW<5?6qj17fQ|)!YJ!D?-FU zY&EEwdmwSprD~vb4l)O-<|{~C1EL*}KAaT%T$e{5P zkb0<^M<8*~B4q{!1`t~fs^%F;{4FG%fY@qKHGe_kpoPo~3=AN)8g$-=jh}%*DI8)i zh^+=y!v_)vU8)S)v&qlEpaxYV3KEZms0XptplYN+;-JORpz%YHdZ-#jka#piJ&3Ia zRih3P2VKq#nu`XhhpN#9iN`|JgV<_NHO3(EIEXlitp-(N2@;Qoh=bT_P&JMq@dSuC zh^+=y;{_529dHXOw?Xzo)dYdWK?fd#`k^3ksG2yCcrwHs5L*qZCJQ8<0ucwX)u3t$ zLE@oPPPC#rmsG7?l@gj&hAhsHG zPVgp3yci-5Vyi*bJOYV>7QBPfA;_IjHLpP8r4aQXwi;B;2aq`EP+?Gi5TqWe26Tp- z5@@kJ^gK5;s2b4ScuJKJb3kl0s2UCd1_mY2LDZmjvH$~v8dQw{NW2=N9>i9Is*wPR zgD&L;jfa5LL)9pP#A_kyL2Nas8g-C3=+X~R`UI(ms?i0B*F)5U*lJKU#vt(qh&YI? z232DN5^scvgV<_NH4Y&0_mJ=hvDKhz!a?Gl5cMFo8gw2u79`#U5eKo=plZ@U;-Jk0 zpz{zw?u4qz0g3lQ)PvY+P&FkWanL2?p!NeuJycB%NW34S9>i9Is%ZgLCh=bT_P&F$+;!`2w zAhsG*%|?(oXp;n}KL~O^RLw4s_;iSR5L*qZ26WDz66n$f(B3GJdZ?PSAoVjL>OpKZ zsG4ga@mUaY5L*qZ26Qf;(rk!0h^+=y^9rPX4n!QpR)ebf3=*FU5eKo=plU$p_$keU zh=bT_P&NNS>gPkmL2Nas8V*4Q1|`tNWuSB}$iScmRU-frUkFhTVyi*bNP@&cm(PIO z$sqMmHK4g}rNt2SAhsG*jTT7#5{Nj6tp-(N3=#)zKmnas05S)v#ttM7x?~=7J~K!h zs>U58z8qo>h^+=y6AThx0TBnW)u3u(K;ocHEuj7#$Q-DeERZ$CcgR1ESiLZx|=Lmt!hpL$c65j|>4`Qo9 z)hqysZ-R(}*lJKUD?s9#A>tsm8dS|DkT~daIR*v>5L*qZW;aNDD?~krtp-(d7$gol zKpk}M8OS|QHD^HL+ac;fY&EEwOCWL31|ZOQ9Y{S?%`K4lPKbICTMeq_F-UwDL>$Cc zgQ|HA65kCG2eH+lYQBKPL7R#|qfgV<_NH5@_=3`+YT;vlvfRE;1= zd_P1S#8!itsm8dQxINc|y*IEbwVRbvbiKMWBEvDKhz ztU=4t3lO7gTzlj z#6fH|sG4Mu_(_O3h^+=ylMNC-1rZ0a)u3vMLE@kdTcG(DkUODjszKtQ3kgBz`+>xv zYMMdfXCdZ**lJKU-5~LE5OEM&4XS1eNF1~Y4Ag!AnFCcb7bFfkn4f`x0mN2=s#yvW zzX&l0#8!itsm8dS|+kT_@)C#c^C zG9RjjRfK^-={H0@h^+=y!v_)vUCIIK_lYnts6o|;fyDnp)PvY+P&M)(@qZ9;5L*qZ zMja&nA0iH7t3lNmfW#Rf>j^<@HK-a3kT__ADJVUI?1idv1c@_2)PvY+P&J+)ab}1( zh^+=y69f_mUE&H#&meQ4YNA2npiQfw^b8V*s!0Zkvq8)OvDKhzazNtj5OEM&4XUOT zB+da52eH+lYHC5^pbJbG7#KioHK>|4kT@4aJ&3IaRnrR+=Z1)b*lJKU(?H^&4Ydpm z3?Q}|RLy*lI4?v!h^+=yvm7MO2N4Ic)u3uNfW-MB;vlvfRLu^MIB1hDs6Pk_2dJ8Z zAaOy6dJtO;s^%m}TnHi#Vyi*bTmp#;L&QOBHK>{!AaN0hIEbwVRr3HOE(#F`vDKhz zUV_BMAmSjl8dS|kkhnNR9K=?Gs`&*HmwpDak7}TI@xJ4Nl zl%yc)L2Nas8ex#QG(;T4R)eaM0g1~%#6fH|s2Wv}IA{|y=v;J=`A{{wAaT&;jiB@T zK;lp}CLnQnh&dp(8dQx9NL&FT4q~f8)wqJh6(Qmvwi;B8FGw7884d#j1Bk5#RTBmh zSB9tuvDKhz;z8n|4c4GDuR!jBs>uL}t3uR+*lJKUg&=V?h&YI?231oD5?6{sAaMhTIUu$g zRLw<@xFJLw#8!i|DAaT$o(x7!ppzwsMVHIOwP%?+82eH+lYIs5777%d|TMep43?yy|5eKo=plW16 z;-C%mp!L{dpmAD=8WoVZHG-`MRRcQ9S_yQ?5@@dhNIg^y=qzg`TZnoPTMeql7Gw@+ zQ$FZSPLO)28qgWnO7;--AhsG*jUPxo=%Q@Uxt$>OP&J^luaz7j>OpKZsG4|?dMAiD zh^+=ylK~QUhKPgMYEU(WAaT&ecA)hhAoHPWDna6|5cMFo8dOaqNZbt~4q~f8)pUWx zK?e*lFff4FYEU(kLE;_|^&qwyRLvZaxF&I0J)HC`3Jotp-&CI%8Z3bVvi}%vf;-1~sS}A&~lThOBpv|~2eH+l zYLr3Zkq~hZTMep42P7T^5eKo=plVD(;?WRs5L*qZ#ug+V0}%(Y)u3wJK;obSBtZ8Q zf!qmI13L3uDGs6@#8!i<2?eQ-hlqpNYEU(CAn^o zs6o|8fW$$U)PcsILE_LoHHskdDu_8Cwi;B8CP=&*A`W7!LDd+7#6bs>FfcHH*lJKU zmLTyuhtsm8dOajNPP=L9K=?Gs!0Kfw?f20Y&EEwERc8`L>$CcgQ_V2iMK<< zL2Nasno5v(2SgmiR)eZ(1c`$VXaTKX0{IK7rVAwA1yK)Tt3lOF0Eu@)#6fH|sG6A| z@g9gch^+=yvk)W>I`jp!t^;H~RLx3|cppSPh^+=yvk4^L4-p5k)u3v2gTyC5#6fH| zsG1WX@re*|5L*qZ<`PJJ5=0!tR)ea!0}=;aatPXA0CEph%`=er6o`5dTMeq_14w)- zL>$CcgR1!j5}yGP2eH+lYC!i6D9wb3gV<_NHEfa$3`(;g;vlvfR1H5!d^SWJ#8!i< z5eJEb4#)xBjUvgwpaxYV4-%gXQ4eCPLDi^(#OFc8L2Nas8hw!Xe26%Rtp-(N4iX0) zx&vCL1Tr70#vUZT5TYK$R)eZ>2Z=9&h=bT_P&NJ_@x>5v5L*qZCLAQb1R@S%t3lPo zgT$9Y#6fH|sG4+;_%et%h^+=yQvecQ4iN{j)u3uBLE@l;f*2SWKx{RrnkJC=N{D(8 zTMeqF10=o*A`W7!LDftIiLZu;gV<_NH8Vltpu>ki_XvQ(2dZWfNE~z-CTKk#NF1tW z6-XR(ku_)^0Z1IGW-~~9J;ZzvTMepa4@i6iL>$CcgQ__M65j|B2eH+lYEFa1H$lWf zY&EEw%OG*k!APKcTR`?g)!YV&Z-J->vDKhzKzB?iZH0(~*lJKUuR-d!LBv69HK>{| zAaT%POQ7*>koizGzd+(UAnHMEHK-cUT@^|@A>tsm8dMFZ6a#}2=;BaNyG4qDK@F-# z5G1}Eq8`LngQ}4NiSL1kgV<_NHOe6Iy%2E_TMep42PD1^A`W7!LDiUo#P>tQL2Nas z8e5R~0f;z=tp-)&3KBmE5eKo=plW^&qwyRLy*l_!)>eh^+=yvjQZ379tK} zt3lPQ1Bsu5h=bT_P&L~@;^!gaAhsG*&3=&h1&BC^tp-(d93*}bA`W7!LDhin98m%t z=mk2f4di~Pnj0YXmm%swY&EEwhamAQ5OEM&4XWl9Nc<{99K=?Gs`&sC2OSay8utd7 z4^{IGBz_&D9>i9Is`(ERzX1^kvDKhz*rgd5lx{-AL2Nas8Uc{_Er>XXtp-&i2@<~z z5eKo=plTFB;&&k8AhsG*4d~7kCC~w8p#8tn3=C>eHHIMd_aN#)Y&EDFOOW_|h&YI? z236w-5`O>@2eH+lYCJ*WphM9>`^Z4%L)8R=#2-P_gV<_NHQ^xf#}IK4TMeoPbXSYg z6Nos7tp-(-4pRRVA`W7!LDl4f#GgULL2Nasno^MXbBH*Itp-(73law%*ajLu1i2Hc zrWGXq5~3c&R)ebP1&P0ch=bT_P&HFQ;;$j%AhsG*&0LT;=ny#2ybs8HsG7wf@wX85 zAhsG*&1#VNJBT=ltp-)I86*z602y>A8ps@|nmr)#4-oYrwi;B;A&~e-h&YI?232zc zB>o8^4q~f8)tm!~gAS+z-TeeIAFAdGNc;;#J&3IaRdWj@{uLq)Vyi*bJO+t>gNTFJ zYEU(AK;oc7?-&>uKx{Rrny(=79}x8*wi;B;Uy%4uh&YI?235l>i}XHwi;B8FGxM;@ITOa zBglNHnlO+!3q(DLtp-&S0}^M2h=bT_P&KI_aW;rJh^+=ylMNDQhlqpNYEU)BAaM?e zIEbwVRZ{~J=Y)uZ*lJKUp!g@}XLYEU(cLE?N6aS&S#s%AAvoF5_%Vyi*bYzB!7K*T|8HK>|BAaOy6IEbwV zRdW<14mwy7wB8jI&QLXHLE^#?^&qwyRLwPzxClfX#8!itsm8dMF3ENEOEA`W7! zLDleq#HAtPAhwzmge?vdmqD=AplW16;<6BN5L*qZMinFuI$#ns-Y(0)paxZ=2NIWu zs0XptplZxP;tCLP5L*qZ#ug;52oVRd)u3veLE@l8D;XFVKx{Rr8gG!eGDJOytp-&S z3=&s?h=bT_P&LsYanJ?tpm`;bJE3Y)K;mi;^&qwyR81C0Tpc0~Vyi*b6obSyAmSjl z8dOaUNE~#aCTKq<$b6_8(A`f;S`hUhwi;AT2S~j(L>$CcgQ@}D1Er(`5eKo=plYUq z)PoM`WME(bvDKhz=7GfZAnHMEHK>|pAaQ+&IEbwVRkI!>ZU7MnvDKhzc7VhUA>tsm z8dS{zkhl><9K=?GsyP7?H-?CV*lJKU7eL~m14KdlbU@(%RdWL*ZVFKkVyi*bJOqiG zLBv69HK>{wAaQeuIEbwVRr3KP4my++)LsIa4^{IMByI^&4`Qo9)%*vETS3G@Y&EDF zHaP|cC2NQ{h^+=y1G)oC$p#`0Vyi*bh=J7GLc~FAHK-ankhmR09K=?Gs!<1t+e5@b zY&EDFU645FAXQMkAjiO<232DQ5_g2C2eH+lYV1McP7rYrTMeql2PEzc5eKo=plZTE z;-JG>85kHqY&EEw1dzBZL_LVD233;<5_f}$gV<_NH6zh=bT_ zP&K_EaZiXih^+=yGZQ541rZ0a)u3vYg2cTc;vlvfRLw?^xDP}e#8!i<*$Wc)g@}XL zYEU&NLE?T8aS&S#s^%I<+#eziVyi*bJO+seK*T|8HK>{oAn`zmIEbwVRr3oZ9t05w zvDKhznB*B4lt2gHg61*h85q={YC!jhDTP4PgV<_NH6kGOp%8HpTMep43M3u|5eKo= zplXys;-JHHLFYMu%!jJc28l;N)PvY+P&LLN@kod`h^+=yV+|6If{26IYEU)KAn|C3 zIEbwVRpSE^kAaAT*lJKUK_Ky1h&YI?22}&Pzf1{q&@c2ZGc~B1M3DM;h|BAn`1SIEbwVRdWa=o(&NPvDKhzPJ_gAAmSjl8dS|?ka#Xc9K=?Gs<{Ia&x44A z*lJKUPe9`N5OEM&4XWlXNW1_d4q~f8)%*g9gAQf}ox=kPXQ&z$1qKGCB8YkrTMep) z4yH ztp-(N3=*$^h=bT_P&L*d@k)p|h^+=y;{p<|f{26IYEU&kAn|I5IEbwVRTBgfuYrhz z*lJKU(I9cq0o9=Pg8~DC8dOa(NW2cB9>i9Is>uS0*F(fXY&EEwVvu+PL>$CcgQ}?k ziGvQk2BmY5`A{`YAn_)MdJtO;s-_Jj{t+S$Vyi*b%ms;eK*T|8HRw5Di$UU`gS0{C zIe^TEs#yaP?}DfYvDKhzHi5)@AmSjl8dS|LkT~cNZqPYAAakH<4uZt{AnHMEHK>|X zAn|^PIEbwVRdWd>J^>;QVyi*b+yaSDgouOKYEU(gLE@7j;vlvfRLvWZ_+*GUh^+=y z^93Y61tJb&t3lQL0f~bS4hPNSgWL~Q!=lK*pfnAl9>i9Is^I~NPlt$u*lJKUA|UY@ z5OEM&4XQ>4Bn~=^9CWs%A_IdORE-Kqd=^AKh^+=yqYDzB4G{;i)u3vOLE>{D;vlvf zRE;G_d@e*B#8!i|ckT~dIbp{3o5L*qZCJiLM7@{7;R)eZ328l0$h=bT_P&Kt6@ud)P5L*qZrX3^> zI;#iGL2Nasnt34c6%cU{TMepa6-ay~L>$CcgR0pE5?=)o2eH+l zY7T?MS3|@>Y&EEwvmo&`5OEM&4XWlANPI0s9K=?Gs(B6)Uk4EfvDKhzK7zzS2hW50 zaUg#|)%*sDZ-A%=vDKhzSd|zUlr}=dL2Nas8a|NtCWttQtp-&i4ieuA5eKo=plTFA z;@cqNAhsG*jRr`3J477BR)eZB0EzE_h=bT_P&Jky@tqKH5L*qZ#vUZT3nC6;t3lPc zg2Z=2#6fH|s2XpOIOw2#(76gq3=C>eH6bAJy%6;vwi;AT3`l$*L>$CcgR02{iSLJq zgV<_NHN_xt(Bb`{b=n~Fp=xSD;s+t>L2NasnpTkbA&5ALtp-)o4H7>L5eKo=plYUo z#E(G4L2Nasnz$CcgQ{5r5fdbCn4e>wi;B;5s>;*5OEM&4XWl0NE~!o0qEQ_P&h!yuZ9U=STK}Q@yuP|Z&9Tx~w4?5b9(HWu!bX1=* z=m1pE`Y6!eFsL}_STUG-&=Fvapv!zfds{&5Y|zC!P_{Z$9DF7!)IFf1ju=4)mohLg zfQ}_n1|2>MWvfHQLC3+s%m*Fa!nhCO9?)5)$~O^gb*MP#_zakO&`}qRw;^gkXOJp` zF3$noV+(RWR2;O8AEq9(<(^R-vUV4=Jzg1fsSarW5hDYGI#e9Ats16Yg^_`QQ5B*d zv`t#s0Kry=iaUVRK>Z8ag3D+GQ3KjWtL%tit3$;>+cIJ1gSJpIIz!Zewm~WfBG~Fs zanQCpnEDowUBM7F9gGYN%Am`6K;a2;KU5sF-3X>0w3Uc4AEF+#?ME480O*`Fkb0;% zXuAbWJ!oqLV;e+0Xd8nv=+YR_IUykRP;t=mXqbA?Qf9_7$XG6D*|BmnBprg->QHge zaz>bX(9%Q3R)`wVGC}1_2(~&@9CTcxsVgK-L2MIfIt1NOWtImK2eDN>A#9LR(|iQm z1gZvf+?y%r5MR)FG7Jn1CeZW=QfgWcQ4eC9ltb8{U|;|p&t$qAA`W7kK-GYb`!NL_xC^?U9b^tPJ%f(d zF})5^4`Q2~gs?%!<(PsJHE4eyNIg^y=vWrhyAU-Xwh1(ygN_R^`vwsQu~i>K*q~!R zOur-8CQvn?;~PvRA#n|2n?Tb)=vV|ZC5SkPtqN5G+Qx6H4iN{jO`z%Dgpq;4Odlc+ zVyi;cfVO#?f&@V4qA)Trm_XA%XnVF9DAO=7Fo4*qP&J@!x~8rWb3kkpX!-|juQdyR zh=bUwP&GY_3=F2B5OEOO1e*Rq+a1l)A>tsmDpU<$C6fu?`ZHZ9X8h&YIC zQU+mzwq2PvBiJTTHK6S`rl8CRDrZ3cg60d*HV?B^5cMFoD#%d`3=E*{8K$ct;vlvO zR1Ihuy=es`?||4Q(EI{gCT>~_5eKnNplU$NxXq?P#6fITs2b4nYt!ivaS+=Css^-7 z*0ddxzd&pgX#N5%$20?7<^$R%&cwi=+6_?yT1IKQ1;I9fs$tM8uFNe-Ok&V0E-8Z0 z88B8!YDEcyUP@v~B7H#4~?A6c?EH7~_A zFS)3)pd>ZLttc@!6{l=SYDI}}YH@L5I&L*Vsl^5PdByk?6qcqIm*BJ{Ah9GPAh9wh zKQRSaO+is+UP(|YhF+*RrlnwsfSkn4JRHsjD+o$0DJ{xNO~Gd?Jan))3lw@Fy-tbA z*{IIVPfjf^cFxbuP0T~}2q-e}8JUuroS%}4MMXX+a`muFgA#@?_zbwcVu$2EiWAlnP7UqNPoFw9<1I~H_T0rc2mhAsMx44@-MLB}71#6cKzfdXbi6A_56rv}BSr?$mPn9!pl|@mfy@IPgNbY&Xc;$556CE(e?iA|g7m=TOiUOV zKy4q8d7z`{L2@ATK*ts$n+ICH2t8^UWE|YTAUA{bz|5P1WFE*IkQ|5x9ao2J9%%Uq z^awr_^FYVxf%L%4`(nb#0BZAt+y^?!9wY}c4|I$evU#9k2vC@U4MPe)&@pEqJuvg; zm@+be>UofPprh_Vav<|S$50`g2fF_adL%K}NLcuR`T-z4F!M~z85uy$4Ul=Dqwqm; zAoD=SCn1}c$HD+kS75`C+y^>-38V*RUW)}I1E}o{G7r>O1IdBR10BDEY~C{#1_tO+ zqhKRp?sH;f0N(};Gta~dk^VqO>BGze9e;vsUJWY)1GKq`Vjk!i7LXp8c`-JO44|c3 zAoqd#k03da`#{YXWbrN}2WFm*JtF;qj^YQ&fy@IPvw&<~6&nM? zDo_Rjo5lc7f1qO^Kzd;2_1H5qtdL+}0J#s;j|Itr%mZz^M>bD|mx199ND|FF(6Im@ zVVHR)5sVBz91!zBNBM)~K<0tADwRsu=r(2Wn>W1fW$AX zZUMzFXqpM82c&>c03eFwBPDF9K2mlLJk&fV9Kx73pPU zXb^zd3%c3>BnPq=G#vob1Jd6g#=rooD?n@zhRK1ZB|v&$=1rN4C^tZLDM$`v9%%R( zrU#^7KAeF8dK4yz3mQHF)1cvTkRF(Md*(ATfVQ%M@+IhM1dtraJkYQyvU%(g3=E9W zyDLBj!Q?>0v>-h&^ZqPkWJn2y_!o3_0!R*I9%z^mqz5z>0MgG<&A<=}y}Ja&2g!jj zXc!Je!_>w0ptd;*BdGDGqn%zX)885uzLqk#Mi zx_SYm4&*+NnXs|}r0-2114BRqa*Q~&?~ literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/group.d b/obj/User/meshcore/packets/group.d new file mode 100644 index 0000000..ef77682 --- /dev/null +++ b/obj/User/meshcore/packets/group.d @@ -0,0 +1,121 @@ +User/meshcore/packets/group.o: ../User/meshcore/packets/group.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + ../User/meshcore/packets/group.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/meshframing.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/aes.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/prp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/hmac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/cifra/chash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +../User/meshcore/packets/group.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/lib/config.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/hexdump.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/util/log.h: diff --git a/obj/User/meshcore/packets/group.o b/obj/User/meshcore/packets/group.o new file mode 100644 index 0000000000000000000000000000000000000000..3babbd11e2a04d02542c3bbbb3c1694f9836f8af GIT binary patch literal 35716 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 literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/packets/subdir.mk b/obj/User/meshcore/packets/subdir.mk new file mode 100644 index 0000000..c54654d --- /dev/null +++ b/obj/User/meshcore/packets/subdir.mk @@ -0,0 +1,53 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../User/meshcore/packets/ack.c \ +../User/meshcore/packets/advert.c \ +../User/meshcore/packets/anonymous.c \ +../User/meshcore/packets/control.c \ +../User/meshcore/packets/custom.c \ +../User/meshcore/packets/encrypted.c \ +../User/meshcore/packets/group.c \ +../User/meshcore/packets/multipart.c \ +../User/meshcore/packets/trace.c + +C_DEPS += \ +./User/meshcore/packets/ack.d \ +./User/meshcore/packets/advert.d \ +./User/meshcore/packets/anonymous.d \ +./User/meshcore/packets/control.d \ +./User/meshcore/packets/custom.d \ +./User/meshcore/packets/encrypted.d \ +./User/meshcore/packets/group.d \ +./User/meshcore/packets/multipart.d \ +./User/meshcore/packets/trace.d + +OBJS += \ +./User/meshcore/packets/ack.o \ +./User/meshcore/packets/advert.o \ +./User/meshcore/packets/anonymous.o \ +./User/meshcore/packets/control.o \ +./User/meshcore/packets/custom.o \ +./User/meshcore/packets/encrypted.o \ +./User/meshcore/packets/group.o \ +./User/meshcore/packets/multipart.o \ +./User/meshcore/packets/trace.o + +DIR_OBJS += \ +./User/meshcore/packets/*.o \ + +DIR_DEPS += \ +./User/meshcore/packets/*.d \ + +DIR_EXPANDS += \ +./User/meshcore/packets/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +User/meshcore/packets/%.o: ../User/meshcore/packets/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/User/meshcore/packets/trace.d b/obj/User/meshcore/packets/trace.d new file mode 100644 index 0000000..eb3cc7b --- /dev/null +++ b/obj/User/meshcore/packets/trace.d @@ -0,0 +1,7 @@ +User/meshcore/packets/trace.o: ../User/meshcore/packets/trace.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h \ + ../User/meshcore/packets/trace.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: + +../User/meshcore/packets/trace.h: diff --git a/obj/User/meshcore/packets/trace.o b/obj/User/meshcore/packets/trace.o new file mode 100644 index 0000000000000000000000000000000000000000..749c8181c0fd7f48c7d8560b52050fcf84a05a87 GIT binary patch literal 2228 zcmb<-^>JflWMqH=MuyJ}2p$7N3>yQOZvs}J!NAYJ$B@pzz`z3Lvw)TIfZ0%jiIEM& zVq)X~Q%tN7iXBX`KzJ+=9tVWS0p>BYux93!Ffc*oAf_-d3Notl33D^^N%IMaGcYiz zFmQ9*aWnHVFfc=zAZtVz7#Ns97C@Z^W->4^NHQ=mFf#}7rUoLZ!xn_8TaoL`ixUyzubomx_? zUs9BqoT``1P@IupRDx<6L0*86N{2FY>Uc_jWTl+lPk(W zB1xIHnK=cJN7UH@VQ z-QtoI+w{CrOG^dawA{oB-PEF@{Gwu8BLfgWwYWGjJyka+H7~s+!xkh22_aoj2r1~M zrIqF-mt^MW=@zGg>0$-lG_b8m{JebK#aX$%YuULZEe5(Wl_KoDCDqCOtP7KgCYKx_#J8uD#l;MIMX5Q7dXS(8d7lBwhC~C3bYf9rUV3UV zOa&+cVC>?OA_hHBrcTW(0Xcv;EDdr$10=jbIv{lohy}rrqMZSpCqPLGmK)L4f#g6s zK;aFl76_>WG$T!xi_VG9ET11JfAQZfjG*tSrAK$S7f zXJBAZgK?1L0+84s>7xt`4AAHUap9$rH=4Z{SRr;jcAFnhsi0jv{3++|>3kcBY8 zB+MTmzk%2WU{MB!UknTk%RvHAK8OjzWl;CQ)GcIUU;u>;R2kTPAax)NiyM&K4JHPL y4UCX-0~Dtq_kofY=Nxq4l4sgJxBtIVd?+`Zyz=Q literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/stats.d b/obj/User/meshcore/stats.d new file mode 100644 index 0000000..05dac07 --- /dev/null +++ b/obj/User/meshcore/stats.d @@ -0,0 +1,6 @@ +User/meshcore/stats.o: ../User/meshcore/stats.c ../User/meshcore/stats.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h + +../User/meshcore/stats.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/meshcore/packetstructs.h: diff --git a/obj/User/meshcore/stats.o b/obj/User/meshcore/stats.o new file mode 100644 index 0000000000000000000000000000000000000000..f672b73f77c5194af1a808193b2292a267430a2d GIT binary patch literal 4780 zcmb<-^>JflWMqH=MuyJ}2p$8&9exHd-vq2cgF%Qvkl_m>0|N_~&jMD;17<@BCPp?8 zi;0l~L@|R1Mso>s1_lNuCRPv+B4jD)1r}ll2{ExC$@ojAfMi%8G8|wTCJr!`_TyzLAO3@i}N6EKGj!g|p&yc;pOc)Cn3<;^Zlzo0OW8lA5C6?(D2zlv$iyrkj_am#Uiz z64%enOU@}xN!8CyOwP#6OJx`cyNfG}8T2#qb5r$`ic0hH^>gz}^NKRdQj2tpOG;BR z^K}b~^0QKtON#Y#Q;Rc_^NUjR@{3CHi}gc`Q;XnY40?KK0u1pfscDI&IVJHWl?AEA zdKsY7AilUHB{Q!?FN1-JfuSHVIXktaxTL5wxdbH7%)n4wk_cw9z?jM4h$~7>PR%S! zO>xOAN=+_t&M(a?VTg~<%quZ8i!Wg)PR%QE%gN7Afk;4&4NlF2sstO#P?DLP?U-3q zl9`*zkeiv4lUbIZQ&P;37oP$)G(M%YpqK$>5t4DGdBvIOd8sK1$r*`74DNoR3eJ|6 z3Kn`sdIk!*xrs%|8MZ}b#zvXBiOCh^Ad#d@+svE-VGt5QGQXet&stU zpITg;n4YSelbV-al3@!Hg1AW+|2c;IICYGcY1%uKD z1IUzMzaR#fsn8e?f~FEkG61{UF|#NnGdDFjH90>o1r*t7pmYL>>ynDV($vyaA8?>T zLIP|tC=@{9%8*)A6rWlK%G(T(Pyxxny;59~SX5G405YBdBnb8k+yF@YK++6Zxhp>@ zivjF~P_Pv+A27H(J6kDeR0Jd@XDfgbBbIVTN5RZQHz~736Ou|{WgZd@u6&_<7KV@i zp-eEv49cfq7KC61WmO0hOfo|%3NRZ)FoSa_hy}sS4B$Ew!U0#R;A#em53WRz_?&Py zh{4Rj1)|`XnE|Dhz`)GF%YdqblR=V!fuReogO@>(fq?;3xI=_^88jIf81^wicnl1@ z42Cc!nC4-yXJBC1ge33Az`#%gmID#I48G8+1jGaB4`EC&28NYL>I)bc7%m~nmoqRhL?ZF)7#J9mk<_;`FfhDAlJ8|;V7QCKpUS|%AdaMd zE&~HYHxhp-0|UbXB>q|k28Kc;{#FJC21X?QUIqq+0ElN9K>j_-z`ziSB!8BHfx!>S z{;LcO3@4HJcNrKM!qodRGB8X*QXk65z~BOr1cz5FTrWrvJ-ze6(*~$5EXcsdP!3fO z;j=O{L;0Y#vmhvc!HQBnpOn<3()9Smq@<$MG6M!ZAID%fV{<5N0i`V&VCr%*^HQOz zpp+q04TLg+P$m${6hfInD5$AWLqTRb2D=%;jDebC2sOdb7^2A#YLp?=EMu5B)KEjH zsfJKv4WZ^5LCrOSnrj3#*9fZL2x_ho)LbK|c}7t4jG*QjLCrIUnr93(&lqZ+G1MGm zs5!m zxdBoSvV?(wAsxh)f~d&@v85sGQV?4P!fpn!Wg+Yi5F47&rhwS;5b*^dHpsCI3=Hc) zY*2y9z`(E>#8!f+IRIiSL)d3QY!wLm7Kp71VLu14)gbIIAU4R;AR5%r)_{off!Lq| znt_2q8pPIuh--k@pdK0n0|O|3GJ*n$fq}sZBn~Z1{6TCzi24{1TOY#C1hEYu>@pA= zTHu576{8VEd;&<^7{ZgoDWI!E zwi{HAg3JR2Ke{@Y97rC<_5^j#!EF_gC<6n?ESMZf1jbGPrCpE!6ob_LfH@vX4pg^* z^f*A({or9>&|qR<02L3Q+5jX6YSrW*=>aL#VPasY1Tml(W^_H8x}{7E4AATkRtZyA z1sZ-}U|@jRtH2K_qd@k8T2(N6`_RnW%f!I29%cxV+$<;?nw1!GSQr?%V37lr18D=b zFF-U*T^Tzh48e{=QU_84OA{cuHS7!w2bdWcKt&}e+ko5$VuRXuNY*gqa5FG;f;59P XLCpg(LB%SvIvsvUc?FUKVVD*GTqEW9 literal 0 HcmV?d00001 diff --git a/obj/User/meshcore/subdir.mk b/obj/User/meshcore/subdir.mk new file mode 100644 index 0000000..dfd866f --- /dev/null +++ b/obj/User/meshcore/subdir.mk @@ -0,0 +1,35 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../User/meshcore/meshcore.c \ +../User/meshcore/meshframing.c \ +../User/meshcore/stats.c + +C_DEPS += \ +./User/meshcore/meshcore.d \ +./User/meshcore/meshframing.d \ +./User/meshcore/stats.d + +OBJS += \ +./User/meshcore/meshcore.o \ +./User/meshcore/meshframing.o \ +./User/meshcore/stats.o + +DIR_OBJS += \ +./User/meshcore/*.o \ + +DIR_DEPS += \ +./User/meshcore/*.d \ + +DIR_EXPANDS += \ +./User/meshcore/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +User/meshcore/%.o: ../User/meshcore/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/User/subdir.mk b/obj/User/subdir.mk new file mode 100644 index 0000000..719f7fd --- /dev/null +++ b/obj/User/subdir.mk @@ -0,0 +1,38 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../User/ch32v30x_it.c \ +../User/main.c \ +../User/sx1262.c \ +../User/system_ch32v30x.c + +C_DEPS += \ +./User/ch32v30x_it.d \ +./User/main.d \ +./User/sx1262.d \ +./User/system_ch32v30x.d + +OBJS += \ +./User/ch32v30x_it.o \ +./User/main.o \ +./User/sx1262.o \ +./User/system_ch32v30x.o + +DIR_OBJS += \ +./User/*.o \ + +DIR_DEPS += \ +./User/*.d \ + +DIR_EXPANDS += \ +./User/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +User/%.o: ../User/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/User/sx1262.d b/obj/User/sx1262.d new file mode 100644 index 0000000..9c225e3 --- /dev/null +++ b/obj/User/sx1262.d @@ -0,0 +1,93 @@ +User/sx1262.o: ../User/sx1262.c ../User/sx1262.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h \ + ../User/util/log.h + +../User/sx1262.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: + +../User/util/log.h: diff --git a/obj/User/sx1262.o b/obj/User/sx1262.o new file mode 100644 index 0000000000000000000000000000000000000000..6c703383a45ae10e529ba6f80d7b98df5c21bdc2 GIT binary patch literal 179668 zcmb<-^>JflWMqH=MuyJ}2p$8&on=g5z6n@?2E$~ANetr53=Geim>IUSGcYu_volOR zysFKdje%i1D+7Z$D+7Zt8ymyqR#paKR#t}T3=9m<8yFbOSr{0ESy|wGR#%wJ+wI8a zF$yX-ursu}g3LB&bz%VVm<})9%rX~YbU5hA z>vhn*t5uklrJ<(5??})gm~5iwWOfE7n2Z;a%tV*T>LNT3z86G>UTFgZm9rQYlx(>QBx(TzgHo(*}x+Dv@FoR@S z-441U%fQT-%=v*onT?ZSGkYgP^GSAwP87RxZ=P#Kwj0$Yxi^vJ8joylZ(-KrJ1Au;H!NppY5=jAm$EZ7HNf1ys%5(- zqXVm}UYAh|qbJPGlRG&Zk~wEGbh`Sr!o+wVnyWH8bfSd5;9FJ~rB;wxpm@}ThY&00 z$?c&01`HS@cD7T^KvOu^VY_g&77(kc}O4W>R3td5J3+6V2DIif+H$<8P zxdLP|$R!|Gpxciy7o>_cmDLTRqSXRsHq3V*8Wh{DDSF+EE{vX&TUsnyy|;5QFqm^O zFl^^!U{Lk(YP;2{1`n}hwo>LrZNhC_43k;87=&9n;iUk=R#ujk?#W_bzK@h>({QPE^7T#zVOB$iI}OT= zhK#UKp4@81z(vq~j*Osi0fp0c76t}$PDtr}u1&a&g<&!)CrbGp)MDK2#kifDf#ET8 z%1;pmxSCdOcs#JOT!s5&vUn?l6RTsRVxyyAY;Q(e4g;r~Fe^g|%!LTMC$k^mNPfGV z3FH<~idgAx%=(q-sk@`#WY&)itZv4xUztv{v!)8OmiA%lM#_7gdM%K!V-(!ff(Sd1 zzhL^B**U@KOPG_B0hHDzo(HAmb8W(GTnv+2xlnv;>DK5f%&G|Y-B`9nVD^J-!=_HH&4&Y#oB%uvl8vqSpxtZAU>Pq|k=xfTh%_hmlkNGH}@iiW}s%fl}M4R$*2_ z1{Zh@)zvD@Cc>ZxPr)4xE8T@lo-!mqYG-M6-#opYLHIj+2)o2H{p-cnVQGqSn3$A_GoKTnw!&u<&?1$K*H2b)XagQ-j(<3Wb;5 zpfCpIN)Qdo5src<+F`N608dK@AHmcKvn!-K3O2eYGd*PyW>3g%bx-Df$|TIbpt#dL znd2!FYx-oi zWYx3hO7 ze_PJ*vwU)U`QDTJx4S>po!rju0TTNNG9jjR|90_g>B;Tv8$egjqk}F|Rb-QSfVcvh!1hRqd0f zwKG0!i*!#8zRqyd9j5yMM@$>cPnaP;5l;#QxgY@QrvT0?cuJ11;ac6G+Rd!1G&K3} zR|dUSVewYR#P*x+$(NrqM7mBEX@%Eg5I-Sm4TiQkZJ@S+5{umwCl<#BPzedmQEj07 zh+1cLrcZ8n_kP%Nt~;6g3sWnI=akI$1zetjbP0p>p!HK6T@n67#FsacMVScL{quX3pL3p^crap8B zmEs#2K(*l=xJ?sX5iJ))X~pO&3Qw(|`dG0swilFdL3wtvcpHOalcQj4-{k3S3=5kw zT5?(o+V1x0Fethyx|ZOHKdlzj-kzf%ww56815h0UE44mgNxiM^ciN94)lW!e92YFq z5OIM>>j-rV@T7G}o`9vu4IKDVq@&>EaCSzImNP8@tubvn43op#8D!mrSsOU6wBBip zz!MgbHVUYB6~F`XFK%~3!XMEV;)KU3rXRIB*Fjq{j)IW7vem+<1!gw(n)MXcnzgHy z=>ViAh4i4685H4pYvKvc6H0B9Sp|_=y@*r@s;jWIIWS%8Cq=PYfJ$d##w8GWZE`pZV@w;b+vM;T22e?=z~Rt-r%e;y^PJ4W0PhC~m$I@a zb53Pob*&YFxuo<1j0KXN%+A1?%>I=Lx%GoBpLpU)2aJMREsU<)TC7glop3s)ch2Yx z%m#$35iyqJ_Q|!;4bh66JgtQx$bDf0XyoN;kFvlNhRJL!3`QP@+*QxBx@}mrW0SEd z1LJ1%4-9t}o!A63c`_>tgQS}<>j8M)YII`+w}d~~!_*M+lQ}B`W34DmHKLU&%+By( z*P={#T!VTY&Fw47qy8M0K>b|ZM+#h0PU;yRT$?dERJCwD$Hnm7T zUfgKTC<*P?B2t7fDZ;7Z0w1LS zm0^%}KB$)*3XkEAHq4lF6x3^3)dGrVL`s;`HfMoMy9`pPiZD^DQ?EssbtA)M)`bkp ztc(ncSrI+IDXqzoS5QhQrFLv7o)M`{)S3dW86at*wFN$|^V2=1O{TTiO{p!1!K?KS zO1=W=fc9RIbab@l!b1;KTI(Hyg$`$@=t1N(w#gMysv$yz(e>(n28L+W;#dXMVk?E> z%Dm+8{Gt?Fg9_COUM|pZHC!$@!qCX9LLs%ND8EQYAvduyDODjaUm-ZaQz1D&FE2H@ zBr`t`yPnLv;*!LioYWLvE`(jB#i>E5>7_Y|CHX}@F8;QvAXy~0IOgQ$7ndlcJT0DU{^rD-`D@=H%!p6eL#WjHA5fe|>SVdg-kk?aaeP0uVY zNi9MOYmhlGVJn3oS9gR#DEe5Ag7=3#7uCSNXsu$$V|ye<>g`sN-a(;LH4gM2q*-nmIPHOlw{_n=9j{f z1;Q;5S7dXeDi~!jIN)O1oT#)q@ zLozNXJ%H4rgi$Iq^%^N4sX}!WTs^4Z3Mop=D^3KLT#$mz%Af*jFeD#=T>&!`k!FyE z(J~U;?QmVNd<)hDPvUTOa1jOuPh@|hC`Zd=$m&4(!@slyoSPu&eYi3>v1K3XH8{(=A3=lSplH_Ry1_oA^iwq15 z2xqbC@KwN+uofY)CyK9OU|;|n$(+gvHiv_Sbs4iJBLf2`$i1v9cz!X!*eiuW;tX6M zFIqA(FmOZc<>6pm%o)qbz`zUEv6LNTCX};^m7Nh3tYDY2u4V>lgRs|2?`L3O;9~*v z*u=p8<_8%d!KTk~7iJopp)iQeAP}F;z-9zCnFVYOn-Mq28V)E&1jONia-=~V0fG1m z1~y~v$BYaNA`Gl7&5R5TT;+@m44+{xXJ7!^r^05=QN{#yJ)0#bNHfIsY*t_n)Iw`8 z2Wp`Wm;<%Y7R(WV*lq{rh(I{@V2%WY;{fK!Ksb(Ijsk-q$jcmzY+f9@;coEe0L~MMh31@Mh1q{OwbsShZs76ku8>kj~V8%I3W-lYG^zg z$d^!$C31=|GcZ6smLvxXiw*`>7La*dD$EQFAPkObc?MP%EoKG=VQ{!{u$6KI!;LQ! z1hJvUmqUzaU}XU%6|m|Iwyhj1KSQT8|sps zoS=LI4dPv34xd1LQW^u>Zb5Bk1_o$&?*Z$92JvBVNI--5sH_4T1A_u2ypPLzu`w{H zKscv(^Vk>|G$5SQoE>Zo3_1ewrAZ8I=fFlA2*j5bFtD8mJJUiSzO;ye?E=^y8;G9E zf_-cZ3=R;^6~TFI3=GZ!@i|EhY}dgCxIkoXf%W)6IJdd3F)%O$Ksfh=cCj!pgg`it zcrqCo7$P8?Cw!o+6a(Qr1*eh}29b9R3=AM0qF@3P-J*PK3=E>6Xk=hzIm*JoAO?~W z2PG2?7B)*J4v@SAh|6Zp1a=1lgy+D-{fmu(fd$4B0r5CsJUI}L2f}k=;sBX10O2_^ zas1+7U=V@u+#qHeKzQyksCq&Ky!t-Y0Qs87@uz~RWn7|p@0mAc#sC0qw z0w8i85MCgYh#DsYgAark0#O+N;e|4Bg1i?3;Z-oPU*%w6h>!&PwuVU3Lf zAy7*8fpQy}ctBmyJ4_JSHYS1HYzzz!pxh27E@w^#hBr(MtSlmI@UmSD#AamyrC)GN zxPXEl6x^cVm;iG@A;rMTBFzRWe%06*7(^a1Fff498B&~qgkW(N08#_e1xkJhH4LmQ zC2S0kLKc*+z&Vcz!e7V604a2#Wj32Uqf{g_1A`RE<2-E2j2vIs7@*Ot$|wlpKzVA6 z;3NQzbah5>65wE9WdZq~l?7xl*bqK8dqxgRc93}LgXaY!Nk^)s*5fGJ0Ok$u+lL6r+LwE%cUJ8U)0pX=G3FL7wFf>4T zX-ooj91IK{5MDaOz6B6o21MTy2rm=DTLa-`L3mpryle<>4}_Nk;T?hSav@ph3Jizp{3ZG-A#IZz&gC1hK$uns2!0~aVA1;Y$tVvq;h$<8be$}12K2ea$} z7HDgQT|`I+)+}L{5VmJvU=XY1gh?t02f-y(L{b?T7!;<#B@IOCK?2L+0yZKuLCqr; za0`x!157D`tY>8bB_fU{CboZ^3=B#jp?YNy$p9u9!6ekF9KB4+mpB<1R6z2a$$X%M z$^~+fIu|r>SRsDm+RrE;&cy)b9AM-H#V*)`Tn8C>Ko&wchafVl>@1*o;dbXM;{pwJ zfs6;+%g6we^5mNcmr@IM4Pjt}xPnJm5adZ|8Q#~7oLt<{JjMH#QE)S;fd)=xyzd}9 zNS@+-58*-b6z>NJ4^pJ_euVG@)SaAz75O)+pP;wVi37%h@1q3R|Aogg79h~axxHJ9YjtJ!mEeK zDL{A)5IH3XuMr{#DW7ma7UyPQ0H>F59%y=DXW$Xy6X(3f18s)!N%DZg z3(`*FlL2#>z;!*JJeUJ%lkq8mIcyLaRWJwAEaKAubGRTfI$#c@jl^dJ=I}veOu-xh zNVkB`j0xl-Xj(gRG2 zfJp%`DFY@Yphl@P@$)h;@bK_!adz`UgMc66Xh;z7>x+Wi0`WD!kqF2x4ya}mrYK$p z1`SZ&W8~pv1$PuQOt=^r7!z>NT)*xYR5W#qcSra4+V#5T?VJdWzO4Aq^uQKz#=VM@CnwX#qQpG3Ez~Iiu zz@Wz%#mvFQO;DvpvM>u zCS#Z?7$Nd6j2RfVLFFsK@)Ha77-N_!p!z=>GccTl$TJ!;=!4w1OAOO(dW=U@DBj zp)&{(xuvLFKkB#34*^Q{4iFhD&7in2pc2e*OKLOa+)9Z-2t_1tK^~ z33wUmO;A$Q6#}~*C4+-95mHi&fhfTj63tK({~I$fR6&$8O-#~bjAk?d8D@t_*NY*t zxD10R1f|%+5QR(=3lN1xB@09zS-J=`k>fx#Irg9x28h!~ln!vL*}OwcQ%RbsHP zF=3X2`5aPOm@wtAoq=(zL250FQcD;Z|1g0&r&gAk42=JnBtTkVDf2B8Qu7HEM3BIK%cKTT1&fZi zOr{{iLGFOmTJIrdf&{EV1Vr=$6TB`1i<*M%|IEY(atufrI4VFsTOtlgj*!+4sGf^~ zx0XN=av36zJ3?YXjU#Yz4{99gF-9?3fh>SjLC=uAOiV-xD z=Sx7_XN(NCU{mifvBFvdVE!D4hqfYns9FlR&j6bIYtu$bvZ3rzzL6OxU2@WQFkp(MiKwXK+ z5ao;pi2Qc~B81-r!sHvq>{BXk``^ zGB8eOl805pkjS5bn(RP91j-jih|n>DmAn&~xL|rgvCBBeN1A~FQjSi7I0ZfNIw4Fk zW?*mt>*_&vSU=o^UM6rafN5erI2@qvVB$OqHliM-iP3;;gt`nYVK*?LwXPeOj9@Ja zND2PTdSJpEWY^f^1-#n1Sl94zRl_K<+Y!=1X%KXuf2FHfqa|-MJ6$ z&N3!tR7=a4;9Vq$JIk2-(N!eF1Rw!k&cq8c5EkI@;OYiD3tZ@!K%I3C<}7BYvkH-& zr6darzCtEhR6B}rL`fIe4seth!s>(^WHZa)X67)dqMDhD!^{O(%uGf$^C#TQWF~D` z%>W6DG`N}YymnU>Z#LFrMAQWEpqr1y38BbNsF#BURVWj9)De`PArThJWCY6^FacL| zfe4rYB;$oK@w)SXh7M2?7NZ5&72tGb0SjDTWLI2)yTX@A8rHgj80m+amqFbqP-B71 z0o34tG$$C1Ur_mu|l@LO&%5sR!nH)C00xZ z5N!w*_UHmZFad~@t#PE|so-FMrDKRQbda6#8tx1oCfQtQ0~iwaI!rpKmgu5}3p~dA z5SAFh!deB{k^lvmPgIyxU}i!rQDL%%2|#?Jio=qAESAV4Te1Xhi98d0Fa?sb72qiw zweXn+HWM`maw41g18ycKlRRpH#)ZS3Gr(qoL)?gg!4Z_U8Gl1oF@V`~3Ke02@tYBD zCdBW57-6Lmqy@oZ-K#Mp$%cN2`m=AAzOSDZt*upwBqDDBlcQj zF4#=e0Q!V%rlbc2RjNJYbFc~pw&GLjMo_j zKt5swHNPOuhU<))VD~_V^DZ)?H9|q{E1jY;2F6RMUWc}1nK%!CZ9xsrGss@gP=*EP z8Ad6Px3)1=^ehH7_?SgOeAd6{Lx# zWWvC32_nQ?(Eu6{0hO$vkxp=e1nGDRk!Ey3=wML+8-k((+C2lc;B+C?bbK@A6Z?YR@#TQgK(VY!o05>~Q-%>fm?pb;W?Hra@*k5?6@ zZzH2Thy#iPNb=jrXpAo41`~j!$4&6`2(}3t^NcRwNP;CVRu+(RAc<%`Be-J;vIB$} z=j5m|FqnedmM~Dn)paYVEK|Tgs2TDbi z5LsNQ2-G%#jii8-FT$@J;z*Ff)5ItQ1^FYWLP)T~-6g0F_9Q-c!N!L{X%$b2PicuQWf@F+>mMXf)%E~oi$xRngltEILE~7Cl zb-@JC`V+d0(XgZsQ&Ehrr3GX+$geOJ6JP>vAW=p`XlQ^v3~EaEX@DaJ*7XIo*cYM- zftvVRphD2{3e*|73lV~hbXK zDsqqzW15%`4l~ev%Xx^U%v@%WwlB2q0;d;vyBJlD!5tj@&pBa53Ya?wG%n`>W|^5jVGZ}9Q6p>e?Y|W`KkpPTA=1X*epXv zxCtl&n1g~FoB^N?1XbA~5EV?|VM|66NP-8o&_RV(8v_G_A1E3bPa%z}&eLUJ@Gq)h zU_7M^D?9y5KwLAB3`n^@xB@)oxEaJ@U|{giPfKH9Jmm)~ZNQUVak>l)o|z1cX9PjY z7$X9piWvg)OG_9S&q8~7AVql$jCa6X#wf6t^-LHT1a!e(X60cpU~~X^&j=EXRwfJ# zx@dAtEzrgoNTVm3By9fK%>>Cn*xV(ksn!73zyYzz0W$Or2`i8aaN)p!B+FtjHz>upC4lovu7JC&?ctLYaya@wCJ4A|^D@FiGCdY(< zVG&dY(xzuBf+jkU)Lz_DH*iaRg-EgTK+_hAkphruYG{7|MM@jDlpAiTMC?)(CJYR9 z5Gi{fv)LjLC#Z<(1I2yqDb*#YzT{MQOF8CSndNA$UKJN zn7~scf?^%wnh7Qh49dvrAz2jKA_Qg1U{H4llzBjyaZa2O1B3G!F%XA=!TBbP@eIlc z`3z-%bKp`#28Iwu@Oouv%+57oV3-QAj|nsZ8O>;fYNHhcLnzEfQIK6QlfyuEg@J4a zPb-CkECMG!ke6AE2zeRYu8#vvhl29}C}D&00H})%HU;Ek4TveQDLjx{9U(%fZUxy0 zD!{<2mEfHW28Lkd+MRLE9+2~4HGc$54qod=z-oPHjSm?qhqq>+H9oYZ!@$503~E$C z!kvMEaSq54&Yj=|y$lS#)1*L+h8*}T4!sLk992Lli7*1WvFY{Hxw9B`eSv21WQ{{{q`?FsU$bbK7w<^D!_mi!m_sS#eu)TXK5}Gcd3~WjGiZSos;a!D4K}49t8sk_-&& zP_?WOwH)G%+}seYjKT~IoV+L|aWOJ_3WLPC6&XB*^|=`sc!W{Z^CGLa;AUXp16jzx zz%R_m%!h2S051bG2gDvvVUR*WunJa)5XcH46r(^VJBl)>OENHsh%%~6LR=xr$^i18 zm>QT8hnv7^$qh0=0%`)-Yalx$Q3O~S7^J{jK>melk%oE)%9VkJ29zs{te=5F4&)M$ zMe-()Py$OV`RuqsVQ$534K+qdgMpb3v_nN1%;08VP=Oi%jxdM; zsw|9fecTZLsA(`TbI5QrFsMTV4{RUEV;Uw5?!u6u1Fgf=)MK=l1g8L2OKx>ZK}I1q z2Z`xUk|4Kgu|fhKtd~igfkB%U$?+fo9TQ{~5)2HwolT64f{cdXnAhuSVq{>FnCK+I zz@QJ4U|=vnwbD}<#Zp74|KOGyAqy}t7;`g*ii2Edf-Da5iYba?#2FaOxEVo4gA|*i z+o=GKb_-+=F)&yno4~+e#m&gTU=6a5fx!mZ05m7t>M~}yG1i2L+_KwIhuy~mUi5DkXMnmBs#!&GH?nu^fut%I(84QI%G2)`fh=@&3 zVTd)Z$le46l^b%{fs%pdbPg3=CdS1K|SRAUA@1 zgm9w|H=`jqt{E77O+e0-U|{e=wHKrT9t8f-p^XTn-v1KP@I7w6yyj<0ty3#83RK&NQ!|W0wTe{5D8*{90Kxr6ewzKB=h*dfy!;k z&A85j|@1`ESy#;Eyl87PC10bZ3bGDJcJ;S?hSydnT;kHMlH zUe<#Y5HLRpZZMQV(0nEa1Gt@x3=vRm49LPTF(herhKYq!811C6X=P=oVnC8X=qAM@ z=`d|Dnh1{=BDn@0(2NYAZG&J_m>DYTu_*ydGBA)BmGGbfMN2f?T!di+B9@(@g5fh` zvt4Z?I%0uyw60Zb>DCL%Bqse+B6f}w>0;Z6<+AHS;@8Ir*^ArVL! z0auX0J%yCikTMv|FeD*H1}sS)p5X}E15!XBOQpeVh0(}a1B>;j((qJ*C=NQSaAG%;{7{E~yGJPuIdh9Uy9ftA6f0x5a0GB_i1 zVXBZki_0DG*k@v>hG}EKr5GL(Obin%VX8rj@n%IPhKW_kim{cq@Sp>k77Gsmm^P#W z1*9MjivqGeQVX*LWHKR-)FCS-%OfPYlRU*Bk6_DSaMN%pfX6RL0p6ehDWJ^zAQSL9 zlGFq_Q1K|pP|qObq2eYc;-R9e!N?#cj3sr#LzanQB0-13gu8?!#i-6kSPhR0kOFL}9IikJ)L7tp!7TS(m5bB%yQ=he1}t$4 zcOAkCxDZtw3^xr+&4*OMW39a44I<(q2DKuETa3kLj12G=4k#QESs6(Jp$#6SAhp=S z9PUn#0&FD<+$~6n4Q4*7tKro@vM@|3l5VUaLcpQOMj{!7ER4k_EJ7e}BEk%zfPno3 z8<9w@5ResQRi*JT=YULz$CBa`kQF3gQ2>uDkO|nl30J_#fYH`NO41K_j^s3W zo`vZ}PPte!1d_#YTR_o*Emq+Q(2^;(C`2+BC9<%Yi=-C6=i%N%3UQ?1#4ZX83N%M! z7D7x6h~6$L8_{ut8HO6J@YX&|8h=ouhA&b%gU}8S5>&NV6d+lJT`jUxSsAR5I})r6 zmdIR~>8R#xVPs%n0!x8Ud;qgXiO~=k4S~@RphpO-&;}h>!^FbCz{vQUkC%ZFa-$g| z0|TR;o_=U?Y7v8eX>pN$aYkZMs=jYfu#tXIYH@yPQF3arequoZ5-%q+ue3rxIX|}` zKQA?}q*y=P*+V}hKR+iqBQY~iKgcuKSvO32UVc$YezCrD zeo-oUIw7fx96JM2i!uu`Qi~FEK=DML?JlWFrRfX|#TAA|W=49+psV`gQy_;3$Cp$V zq!#OCfNJLAl9ZIxG`$SanJzi`$=P}tphGs{Dp(j8ic(YaN}$5UB`KLOPHtjJhF%5( zE9fN9l$^{YC>vs52FN~8D8_?RfnEma(5m9f;*!+d_~Z;@qcUTI3cU=_$vj9r4h9Ao zFTS`SQ!j%7StPw6Gan)Zas`OV%D|8U@}*t|=rBy1q|(fs65Y%^@RA9*K}E^Q5M2zc zG7PNXwg|HbBP%O2BPRm`BP$0RGe|QdD<=aJ3nLpu6vTuGqq5kTnZcS^LBedz^1ZXr!4EYivG zHPJSKeFq6ONKiqN2!4`Pm5sR+oMIH9DVLR*70lO!rvgZ_f%9SEtIGyWYbwk&U>&Rw z6QG`jxP%p!FQK{05tgggGlDV)#AruYeuU+0M^w9EHgZ8SHme{!O@J~pM39YH1ndZy zeXN{p%sF5Ym}-PtRu2#xmZbzB97s{Z58^;f1epMKA2c+<;mhiYqyV2zNVLhrT*?Xc z1H>#=9+)^URGd{9CL+jO4R*E?0}~4qb1{ew4LfUC*sVeeJD7i=YJy>EP9muZMi1X$ z)bM46@dcrg#tM;#xeXTX(6SR8Qf$l;Ag96O7Zh3^f5xh0IF6LruH@~LM>W6!t=>5 zPzZxVoRyau51i3^B!h+Fhha}3kfz1*)nKOfO!RKCOiwi0Y@F!F%Z*O zVVQ&z$`^r_gRIufRp3zJgGL7z)T1KM=!9huPN2gngnC&2>^)@tH`){ZbQ zLt}|m7GgRpG{9JSV0>6Hg#gS8P!kzpCLTeUh)5rd zQ0H+%Qx>B6stIu+DS(%gc^Aw&^` z1nC85dr(mfF$A7miEt6PfderK;$0{SHVGn*@F6eMHDGh0am31oo-d(^3S0mpe2-v3 zqe2}P6;r^qC!{=5XJal0XE3Ojm_dgoGqUm`EQ2@R;H z299iKXeq!#>olUVz^VYNgm|HvU~vS}4fYaLH@sQ!2%#HN>M<9Ak}x9MSVL2>B6Ar; z0^&3*8CDT018Zf$?S`jx!YY&qnn73vVOwCSfCHKeU}o|_DoBvuz(EZfVE{(~D<9Nd zuzH*i+C+k-Z&oQp3WMl?`5qb(Jg}Hyg;fh^`C1hgpC1u10_y8RswP75sSDHn6-l=) z%uYhOwP3nC5EU9UgTdoY3tDM$K#~c(-3|4h2-GfS9&jqb@Fl3EhomfiSV+P09-0Xt zm5|UM2$j(M0S}R1i137lh!(U*08bI%S_l@ahA`j3;-6IxCIU}Gu!0n)3^YWL(+ng; z(9(<=EZ*iJ;*C`e8WXI9V%-a-doe;c)Q?_JKe8e=nO8bk0D1ZkFo(-Er-)U#S}S+Iqy3ed6&o{FIAIG{8u8>C2r#2`cv zg#K$?aM0WfZ3#i$3$H(rTEUQ* zhUI2ZO#+>ofW|vCEcIY6d5v%hs~*gDLZzD~O!o&Q-I~Peu7K(OiqH)WzzSHo!3(Vk z;UztM1PZqZEG;301~_G+$3ivC{{Kk!LsV9?LE84Ls?fd*FQj_~N)ZqhM7V>MALbHh z24Pi&nhNVMqMHhhPk5aS_amkVEM}qc$Pe>NH+TpN;zoX0Od#w7=L>`{&`eQ*nKBJw z3M59LE`!&WD$te+Qn`*brNc)oPlNj#5H;|zNSM3eW0nxhSkd^<)Q%`i!R>o!;DX9B z^zsk2BMsFK344eQ5H{2Vc=-Yk7pQOH`AQ672`DE)LKhmTP_<|w=?4qR4TyRZs?rad zwjhp%jrhRa0viX1y9Hz+xM*PIh3YVb(xABjSd9WtDe!a&>j-**23R5fWwi&h!KOje zjTFqC7ckr@1$8I73({OXcrroD zG1w?M7qs+ch4tTHl`6#ZP!f{9&<3Vv!$-u{fQLgMie@uH^EgB+yuO$X8zF;N7-02K zk0GV;ZUz z5q}_y@wrBsjX4Vx%&a`jQeYY$h;ZA8PWHsx3ab$?GYSFsf~28wftGRPV1>^FM2di_ zl*3WP!3$y7FbAwK6@{c5Rwy5u=HLT8uMs&DVgoeP;X`AvY|jOaQCL2M&Z&UXHY7<( zLZgNiV-O9V-(aB+n;JvRtH5VRz>PqN8zAlhRdwJD&&mmL0j#hRU}F{s$1)FdCYTn4 zC206;jW9$9t1QGoRv4cbrV>7}DF})Ts0Tny^pp-31D8RpA|N)bP!xr5z%n2vx;|Dx zsMYYfFM>Lt?MIk5xtJ5cz7u1X1Jk^42{xzs6Ch~dPz#Y<237$PhLE5v4o+s!FopLu@1hq@ zpk5}pQwa691k?cdxFT{AhS&pfGrV|&tAxcPD=%c-5XA1_0MB^0%%b8Fr_2(D%)And z_!0*908jsT-~5!+c+Y@PhWO&*%&OG*5(X%hoR|W=*qtFhJ|{mpF$W|WA77T3Q<};U zA77jXF(4>4F~u{lptJ;ZtvJYZkX6nB9*ztk0iV>o^pXsQ_@dOr6b7Wr-mD*+t=h;p|%LqVcTX-TDXWpYj` z*cSiN5{BT^692N)qU6$|qSU;SfTH}8RPZ(J4DqFTrNyZ!4Ds1 zOIHBhe;%KiTToh*8edRS1Pb2b(wvg`Y=(GH?4ep+oLa&V;vD201ThpG;f|huU|%KX zz(d+SwZyZiFt{YKq_mg;;_-mQqQu-{hSZ{>{33Ah#pmYdF{GrHWhSQvr{;iyJSa82 zG$*knzX)V3LuR3KeqLH;x-%pa7<}@B5+NeUcDu#9Rr*UAxnUrK}&L-b5j_CT!USM!dzVp;4DLi(mZ6_U@DB^ zDoo%kQ#i{E&N7FyEZ{6l)F225042=gg4E>9w9M2LP!a>>u*|%)e1_zrWdA&d@WkxY z(gIN2rskC}loqGL!`jEipCLXyCqF4M2RRiK7i5C-S$tAuNh*VLPHJKiB1S<0FQi~We;prHbAQ?c(JioNWGcU9lob)R5lEd?hKI9;Oyq^6U5*V z>>LCMBuF?S`43zkf-}FFNj$V1$t;2vR>_Ge!Iim5`8j^2xeW0Iro{~43=dC^pqvj) z#ztt#xTpd-vfNWkAek8I&fwINkcxo(@>EbxE_U|?TTEbA4pHq^Up2`pmURe%Wst?XF4DqQ&MS1xQ&@CSN@I~y$ zoV|k}g<=?_x^T)&2RYq8G{hx{AwD;;0u;PK;8H0*J~<~fF%Oi~6H7oPpaD3BO7aVW zDnK<*k$+wQv{Z0O1r_QH#d$>#zcIwer-7Eo=f)S8Wu}0%IVYw-6JcgiVNhy1C=Nko zg|QJR?WN|X7Nw`=C09a16&$o6XMxHoNR1Sqmzkeb%#fOwm;@@5FznAt>d6(p_;$egT7XVoqjKQDR9dqAUcNPyntHL4_XkEoLZ5uE-CACZPBXXp)I9PX^b$U`3!dL`iOZZc1V$LsDX1N_l1q zsG*RTTFww(3d&KSk|MRJ2vlW*Dr}gh+$3nl4XP93^FW0FB=s^t^CqaI^E3*M4@yl= z%`8g=Wo!ob)RLg$;!MvxPzXX&8OY@>nfXSJ#X)Jo<(VbP8O|j|ISldf$@!&uC5TY< z%=4&%RDR_krxt*-kc(%qqmz#-xRQa|15r~6QsW%r6J*E$B8|YsEvQ-wE-5NaE-5Wa zWr!~Z*XqToso4xg;BtonoDZPpfQmSfdm$;@Cm-bEw1WI%P=hVCB&Y(CN}#zK+@wfi zNX}2m%u5HAmkh~?DXtZnC16uPApxr3z~wQ>5e)IUNhSH^$}YD{G2=Rxx@JbS|wCnx5(6{Qw33T z#}J>ClMQbCfE@(#EmDvtB^IY5Y7mf}MJ4&!@i~dbB~T**QWLX5!Bd13KA=npYPf>) zAh_sfD5-$P2&nM@DpKOXMQKoKacYTAeo-RW5>VjBgR%&y9TFd(nO6c1DNrjS1Y`#| z0mqjx6eZ>sfJ!)q_#zVvhVsn3lK2t^Xh{Q2*(r%7i3~aU<)BmyieLYNlFVFCixX62 zxq=&Jpjd=i7MxlVlm-eRNPz$j3P>$$1gc~~d-E6DBO zEmV*~31qT!kaIwOPGw$xZf0T*xOE4v9CPziK;;Cqkgv!uNQE{Xz(MTk7w_id?-=6g z=MK(^ph#yZ06PvA=EbE+`2{73Md_f{3wUc5gR37n>w>xi@s+8GMIes`Re(t6#1wG+ zA>uA4DGi*a;xj>IeP$l07XfulW@;+PX~m$T3f92SERIjENMwlj@ptx)4`BeuVH&&$ zfQ30I`b&!$;vtVRCz z0EsV@tPc*ejQr9fhGa+!KR(xy!QC%Z!P(MM!2-1RQ9(C1u_!siwy4b5C^I)PxuP5- zl9XwinNwhFq@bHy3`*a+pk%F^lbM@YVyj>Q5=|^i)h$XbF3B%SRnSdW(Dg4?&@C=W zu}#k_wX{^wP0LNJ&;|EHifxSyK>XC=;>7e+-5hZL(iS8Hsti+8bV1En1>H1IbFCyZ zKTo$9(y}U6&`kr|ip0;$*Gb!t!KTx3C!05djsdZi&ey`9%yRD2=Pk z0#I$52C8BW!8Iqmvh>UaHJMx-LmY!ZDGuD11BY5>aY}Is1IPuSV0OvOH+C!zNv_BT zS2{(B<-vKNh8d_r1eIm!sU<0iC8?l#6VY__Erzwp;!E=5K{YHSwL5*0wvf@R;Vj)IwqZc=86CM3QX7#MgM7#RNl|Noznfw6{>mx)0HZSSy02U8;> zp8$gny7&~f$*hxDI+?-p3T}K3%odD%3?5f5Upjf>pfHC9e)Tn65QTgU+zbp7=xRYW zh8^Ss31iqhl^xaQI<=^U$GCq9KJs9vJdsT-dI(;SeeiAbjr zdl^1~!P z1`kMfU|_(PcbxbXNGwaC$~6?!Zh&FbN@87(Rlok%Mp;Ku2&O z%Yyjejrd6N;QJVm_$&-ua2|+(ozDT10%M3gAwHtr08vkfkElB#>JeoKc0TAz3b1n+ zAoB357(jkL^5}dcupEeh$b;{M2XUd{1-`%r4)t$A|U({ z5EG0c{4y{bL}2GvfTX|}B9G38pS=rpUlUj@h=8a^=eK~Qz!)Om0cL{;2)_@+1Y-z) z0+3Vlf-!df4zL`EfXMFyF~JzZKLBQf2<-erASp10$e#kUK?HXG8ITkhL*y@k z*&qVKzXD={F?RknupEeh$ln7o!5BOL30Mw9K;)l+m|%>Z{{k!rA|Ub~Kuj>k&i@3K z0}&AUA0Q?eL-@bIY!HE+{|6)m#t?ZHc(pS)`CMr36F}n&q47n~_!4M*DFS>MGvJ9K-44ZKL{UDzd`u0o17V- z?jgiSw6!4m5p6sO-v;VGn0biy07RY;-v>=UqJDztN9QBXj)cg=&$xv82c2JpWOTk{k$)k4MEwTgBl=Io@e%nGq8`y-A&!se zk3iHT@)sf{fP#maK?E&5V&@~$A4DFVk1!P?kBDCgA2C)A;X8mV2V>&+i2f`@JtDjz zd_;Qy!tVl`4I(i4AW;}*W)MU3KXyLCzYuw9^AY(OVm@L#1;R((VoQ4N8~?e&YCu z^Z`+i7|%e249E%03=(MZkDZT*Z-_i0J|g}g>Ji~h93RoXhp0z{KXyK%e1ym&#tVt# zBgVTR>JjB9gpVi>A$&yqK=_F9AP66RB@r}yN#!p9MGhDvM*cutW(Fy=_`=Rd#1BNC z5FZg=5cP=i48lj`FYJ6os)EQP;tx9?5uXrwLVQI0LewMj8-$ODZ|rNqOi|8*x+5$P3T9wNPB=Oc0zL>`e| zA$&yt3c^REPfR|@-!RO~Acy9E^7x4Gfapimcf|1#`4OTX;a>NOc0M9}Ao7Uz19m>5e1pg%(hG!- zNH5s=i138SBfeMTN1(O!kBaVLre;|BB`y9eYc0MBfAo7Ixi131_N0d(xKB9cW&PRkVL>^I}Vdo>l3nEX5 zk7)lw)Dz+(=5HbD5$z!eAJLzI@Db$;aePGi15uBdpM>xc^M%;?yI>ItjZeh`H1=+B2S2q=pRGWqw^8*vbUvayg2*FUX%IdlJwf=0^n}Sr^^X>s zf3Wir?uW=z%18JIVjd#@VCN(96GR@7pRn^0?Q4iUqJD$$5#fiOkEs73@`(Bm!bgNJ zcD^1wkRkGj@kR(A(LTq{N91paJfgo0;Un@lc0Qv243S6lmmz#aeT$us7$1YkBj%eR ze8l_`gpa6yAbdpmfSr%1e<1RR`B?}bQ650}i19M)d_;Kxkw=Vg6URricOmL~(Bcm< ze+!XE%)est;ab7DKB9bps7L1`@)txNk=`MEM0o+>BhoV_AJsp4 zX#T;@N4Os%Pl%6jKSVt`AK@Q}JiA$48VW5cP!ki1GxY9-WV9FF@o8 z@e%Vc5cTMMM1LA0Pl%5wFCgmC`H1mAh&&-aV!jL!(x7z5%wU9;-mvo#=?fxHDj$)5 zAo|hyi2MYRN7Sd-`H1ubkw@nv`YRB5ME!=Hk4SG2c|`q293N4CLDVDC3xtnY?*QQ= z=0`F4pm>2{W(E_q_`%Lc#0Ny45FZi#5cTMMM0`Nx5&0LwN0e_6KB9cX|qL~@Y z(ENj)k8nRko>V@eX0Sl>KXyLC zzYuvse1!iX>Jk2d@Dce5J0H=$gvcY>mk>T;yb{7kxBi7eL z_=xd$?0m#{JVYL`-W|gK2XY!16URra|AweX=OfmGL*xk3r*Spz(_c@XL_o!NCe8m>C?<$_MOxM0o&_r<9K<4gL4?7`3K=_FI2Es?oKM}`AjCUbo1{C1T3@&Kljh&AOUx+**J|a9J>e2a# z_6kHEk)I%ZM1F$s5%~p^5Ap{LGc&lM`3E~6;eLobAwI(W5cTMMgnuCN2>(F%2>(F% z2>)R6VSWM8%nTlA{=v>ixE~@?%=Og+n z5P5VyqCW?bN9QBP=OFTk@P_aa<8u%`BD^7dM0gX&N6f!N)T8qe=^rAGC=Vfg#CQ#a zj~IW!N8}%fJfi%E@Db@BJ0Fq$A@YRyi1{sudP00e{}ZAf z(H?;C5$i7?e8hMpc0OV~21Fh)|An28ST6>VNA!Ooe8l_~gpZitg76XhpCEihe-gq+ z?El8(gVGHQGcyFCr625kM0$b9lgdYw4-oz6d_?|%$RpAVc0QtffXJis5%~uqk0?JO zd_?;l!bg;+*!hU{8W4HJd@h8KXrE%|Bij2AdBk`KBBg@jgqa}(Ek3aG5#bM!CzX!~ ze~5l`J|h1@ofh>4L_K0W8p21UM+hHL-$VF_ z^oN~~NN*5%bUtFe97Ge1`B5Sr^Geke4yv5E(l)n&pLVU!03q(CSAF*B-B9E94f$$OKDTI$$PXXa0 z=1Z{i5#=jH9-WUkUjrhKD1Wi@5$i=E@`U(^^Nt|u5%~kcN0iUl`H1owB9E9~f$$OO zAHqk>r(owJ&L4uv6XJ8g=L;a}(fNq;c_8wL^K^*g+n||`m>+@YN6e2v_yK6@k@=|k zKMpPbW9K9CJ4BvTKBE4D=tt)x@;gKxosY=>5P3v<7&{-)e}Tv&>OTk{(O<#jqlQlc zTKHh+Bf@8zft`=&UqIv$;{n+D zi1`DEJfi%C@DaT(2p_S&6~afXZ-wv?^*e-*XkTLIBl`Ccc|`q=osTGQA@Ydw7Q#oA zw-7#}yv5E(l$Q{BLVU#hGDJN(e+xWOLgWeY5#=F7Jvtw;KMW#Ii2n-Besn(Kd^U)A zi1}#<{~MZqbUxy|Hi&u#c=<&fA8{TUL_HzC4x0Jsd_6RIbUvayhS-PBN0iSHd2~Kv z{u;3o6BIF27C+eei1>iWlgdZbj}ZOn zd_?#|)Q`BhnW{ z9-WWyKSUmp-XMI${5U2b6fQ8#%#eW=KG^w)@PNn@;v@VIQIF0?gaKG(J3^+!#WI;mA4D}4kAO;-Q!&x8(GeZM|E{Flgh@1lwVrFOrQE<%6&jQ2s#OG2#ggq%l%$PbY7RuJhMa()P6JtgG4 z1cZMf`}dLeYlGa5m|ukKw?&lCko~IY`|A+$==;+k`@0aa0NI~|7;lB__dw`J-!B2# zKY;KLWPLoM{D7=iN7NUP_14JiDM9{0jHf}?-yz1wAnV5v_M@+_f~-$Mm=9TBgP1>r ztj9p~?;-0K5b7cG`RMbri24aKKZvj&GM|QMUqR-#5dA60`~YHn2{N9GJl+EGFTy>L z@do7fKS&Dg&V^81^tQFd)W5#25}TFfbs-Kg1Y7WdkC8h%uao zXoQlL44}CKMEq1TfX-@1^yexW?l3SgAZi5(hKDHjNiZPJW(OHr!|;ZI0qNeX8U|3` z9+5w47(jh@M0%-V0IfwwgkKE<=xi8JoPbONozKO|$iRRoAEg-h7#SE4=iNv#2s1J; zAm;bw7!YgIK_(P2fXYsUe~K7X7?IOs5rY;Z0|UbTA_fCS25_1H=?0}l(AngmGzQ~? z`tG1K3*jp;I5ILYAfLwr>boPxixn8W85zKSf~g1Pb;SC81%^-*|0yv( z8!+rfvEP8R0hE0rBSY|DP>S(LUxZ6gE|v(`Rc@=i=w`e!I%j- zy%aK7G9jn;LI!_ng`DS*M1iGcwzJ{iE^&BOpM(;@B&VhBXhAH)!jVqXbEEE6bI zK~#fcCK*M21Vbhh15zt5f+3#?xqOOXC}l!UuMrH@DCXxfG%_(TAkSyEGchnAdQnjf zy(sF-7$!3z$442%OqB2|W0=pxfYiz^V_3?>zZ{$iGcxm{^=wW0|WB>&UsMy!s9=N;VO#z^BHb4A?Lq* zhKDHb$!B=Z1abw;J^2i8LHgn5B`|zONgoLeKT+&UVEE6(z<@j+%gW5afM}m2FmN+7 zFd&a_3NkY=fXY0GjR_3m%%D;c!UN?@S&%%8%aFvNjB>?N0fQzpa`{ofpwA4_1=CQ# zV9LzEfT*uC7_6C*(|ZPkBZ~Q14DQUx^+6VcFN%H546)1%4AJloZ4W~lGXp~q8_d2Q zhJ0oQhIDoWzXC;n2SW!6zl&iS$bNVOsE1)LGXsM*sL=&BqK9D#GXujBP#i${tC<-X zCc)#QhhY;l1A_tF%pQiF%nS@w++f8F3=BOC2bdWcn&A^TJq*X085rtV5c21k85oR_ z{BxC=f#D>Q`FEHZ7=9u7?+G&l!!A~Y{x{4F3<600{ld(^(2pelhna!F1j#=vEDQ|V zFzpOI3_L6h47t28fgT1C76t}0B>l213=BV!rYsB$i;?_q z%fi6Wg5)1p76yjvNcw$Q7#K8>_@OKe42bnlJq)od3=CaJ=B2VQF!&?!b6FS|W+S<; zl!bwz9x1$PSr`~LBB^g>VPNP*lJ8|pDOIa8gKQ5JGbQRTc&Yd!+EV%fi5r zjKqJ+!oX02WZzpB28KmQ?)l2Xz)*rD|Cfbqvn2_w_Wo2MUMdFLHGB9u> z*(b}&z~F);uL|NLrC(iE28M7Xc~e#fhJQ%**|IV)yg+iFD=Py74^sI1vNAB-MGBu# zRtAPSNa|x*85qov%ui)yV9-R0pIlZ32E?dE4?`&{a(k$Up_Y|_VIq=$T3HzwJdxbr z%gVs87RmmptPBj2NcPWVWng%O&C15WFa^mzUN#1X$w=x&*%%l^knERbV_=w##8+iwVAzSIUYCu5;U1EI zP1zV2Kw$tWA$k~W*%%o1BiZlD#=wABf7ip{%f`SEi4>lpYzz!5ko*(N#=x)?$^KL} z1_n@?f|;Mo#=u~PWPT|da{bc7P|L=^po|oLt!xYo5lHa`Dhtjd>7UBRz@UM|pUcL; za1x0Ra!V6Z_^)MSVCY6lUt8H27<`bzV;>s>0~bp{{kBW10RxmZn7~j ztcFN}>yJll3=G0Z<;81|`;px9g^hvX5>j~mWn*BNhh!cbI|D-*QvJiv&cMKqVl?85rb|)Q7V( zFtj4sm%xtPe(GV!WM^QgL6R?GXJ9BrN^jNd3=DQi{%>JtVEBy`UcKxL47N!8Y3vLP zmyp~ypPhl>B2xNa!Op+{H=dz~VIw;O!v&=9-o?(q@Bu0O4zn{b1R{ms8FmJSRd54( zz;($wB=z^$85rIox%W9c1A`9|{{uS%!!{)IezG$#cp{m{#KFLD9Vz^|IT#rBAek@1 z!N3rV#Fyn@VCX_JPmP0t;RlkuJ_iGXK9c_|I2ah5k;2E3gMq;VDgL}T7#RK_xi^@D zfx#asy~l7cFmNNeHNb*XY3=IE~;zyg4fguJ--h`8Zp$kdgmXiV8CWe{k#>v3287VwK zaaVw(KZ28ip#Uj95;++ds*vQfI2jmjBgH2utY#spui<21;6e(IR*?IV+|$R&z`%$k zKb@0-Asga2aQU`?lYs#-{@25>l9Pd94U+mz@UR1E>S5T;$-poNDLo(IWMHU4^50ob z1_pkl^mC1qf#DmH`|ooyFib!){{<%l0~?ZgA2}HqSdsF_FHQ!A(@65nTnr4?k>Z<& z3%Nhu!ywAVzyNBKf?Nw~|I2YPFdRa%Po0Ya+~=7IB^LujCX#!dxEL5D zknH#7Vqn;S6uu!`3=H6lwZR7VFvM~(fcunSE<+DP8W#h@93=nb!^;MciU5W(E(QkV z@$Xs``4)y&E(V5nB>(ntF)%2Cw1RO9!!#}ihVyVeJq+`?7#Qrqav-9GVL2BA17iF& zfMGos>iEQVE(WAoy8wp$T&Uv}$GJeE2r>(V1Hg76#&-i4u5&Rklpxvv0L})fS7CV0 z#Q+{71@S;58Sl7|`=>1o-$3yJkz@dkWPsYP^O5*$+zbpoNa>58n}Gqb9<_x*oST6G zROUgn^e`xJGcde{aKPqia3habs4y6CBacU_Fj#OSkC&)0IB+w7$Fw0vsDR62Z+zbp7@buoo@SK~0!5yi- z_`uBo9y5cO*TV3Fn}GpwzKH?@0}lfOV*FZxfrEzuJcj{MufQO{gFHT^0M47prMh<3$P#20RQ5i1l>}3>G{L49MrHJMbWxzj=_y zpCrJ2WyE-d1Oq28a{iTI5a31juLOfQFLM5sV36ZQPVW*7s=N#g3y{*I9^5Y=`!g6! zd6CD9GZ<`m85lryCIcAsFu3wEFq9y<-;bAp;R)P~9&lfL5|VrZNFFJFW%4pGG$Msh z5iclLf(>T?rR*wR1_s3ZX9hzPFLHj)VCdpyU_f3UGl`dh0Z|@jFwEj*U{Hsr*&c9Q zJw@{G8eRs5%Sh$dR$c}MT_pGI<7Ggaqw8Tf4)+_#jbaSvc#-Q1F@~$W3=Er*{Ck&| zf#C`g|0yp6!zU#ETV4hRLAd=b3}1N}7_5=_e|eGPUyOl;4|#l3jDedExx5o&5aMHC zI0|p0^e{-n+a4hIrZFh-F)$#{*J|=HF!&+aXT-g~(8JJ;qCSRU5+4HtXwD0y8Z>e}laGO6H&T0H5g!9X7m|Ng^D!{ILo#m* z9|OZdB>BC33=D|*(iny#e8~ANhT$~Gex&q!g%7#BjA6LVhdN&Wh>wAR39i0{;WZ!f zcz6uMXFdi7#C&}W!*4#+`2l8r$dXJB}W)ZW;IqTh?*AU^{G@_LRF{0s~$;Qr}hxX91I;0foqFx=#4 zV33BlA$k}d@iQ=#A<4huXJEJiZzJ|FeCB6hSd1k9o1cNFcf(8J&=z`!5` z51$qWUjYV&c}V#`On`yG9!Wk81^ECPlW&j!%QUk1_9*s z;la=$z`&pi%5$LPz|g}m5yky(3^N3f+XHS4^92|fJdxbDLV$r`7n1oK1d!)*-57QV zFo4T+u<;B%3EU|?7Wm+xWth+@7I z!w&)E^4y8xzW@V+K2m+fA;`cW0_V3d2nZsV=S~a~g2?5A6N7>v19;8?<{wQ#2n#|w zFc=6Tmv0UX=7J0ipfMYWd=G{mQ#;{6=fgu#BKG}?7zX`)G z6#GpW4hk_aY)1;OQ$h?3=1AsWLNVWj;g%2sLp+juAETIW!0<|lfdP3v<3}L|hTHJ; z(8KUch=Cym$$TbZ1_sa=11x^Ig^}~O0fVqG1GoOupp!ngR(I4dN3mfEnxVFreENb=6Y$m2&w4Bo=X{Y@i=U||LZVYvDph8Pt4^%#gX3 zAxoHn;UHXn3qz4Ga{TBqR0%UM7{Sv|4?{DGc{&VTDCX%fOa%E4DSl=NGcdeEGJg?@ z`8o`%gc%rmkm6@Eiuqa$yM&R)`?MGi3NtVmBbCpmgc%s5;q_$;!zEz`hIn{;sE6UU zFav`PlKf*~28I$O{cnUBz++&L_-SGIBFw-5_b!7L!*7uLkn}T)AdfF;F>s48FdRp6 zzlaC}gFjOGmqjc#V*s^GRYZ`(KZHSB1i8H)!eA`Iz%UUhKiHt?*I;l)(XYYaCBgt6 zLxZ_LNCY|lG#H{pko!A549O_wg)wA_Ah*xL7z#xg7!Xxn7(=B914BGgdD4WUUxcAk zgaN!J5@Npy!vqlq21FJUVVEw0++P%7m?whV-VtF~DuP_Ti7>1YK^|`tVc0Cfz>ozo z9K4cnmk9EBp9sT25e5cEr1(6A;yx>eiz3MDv#c0yh%hi5L~4IN6k%XEgA~6nQQU9E z@KFT0z1G9<3&s2(21Zfj{%;TihbRMs5mNdS6lGv|i)6l}CP)QRkioCuyi6Kgqfx#Wg zykt=ZhA1R{jwo__JBgu06uG`gVyF>iVEBZTK3h@jOJL{`Wne&FpFCNVf#DTWc`!$m zfuRz~zNMlJ44^SSh^t!|)`>DOTtt%J4hlb{`so13ekA#mq72|MHkkfPqR8#51cqB6 z_dp~WKq>2yDDwDA0>dj&7Y^28K^a=`T-=fnh0_Bqg zQ85OFn@Id~Vhjwwkoecd7#LO{rOyXq3=Gon{NBRwQjCFNAyRt!B*p+9GlRIlh2ggt z1H)SQ_)iZ5i#P*AERud+aR!FpNal-)GceR4$;*o~FoeJ>kRApNapd-16oY{{a(gt2 z!9pB4e?>7kh$E-pChjYD24)Y z28L9m@~KiB;&TY8#Lys)JU*+$&@Rrv@Es|gAG^FrYh~i%*hLtG( zQDWFA&cGmt)V|t}&cJXGDSm&8Be%C&7?>p(7(jF6knreX;E`ZpKt6w5Sb~88`FwCG2?hp7 zczdmdK?zO0CYpK!G=@D{ zkjMY+81f_-7!c>1*fEqzFfbt2pW89iNuaJzZj)dDugQm4X~)nf!N7o6Q*XyGO#*rS zhaJN_kbB|j%Z_0g$h}DXbrQ()M|KR`K<-D9-zUMqUJ7`&1A zsglU;0}h64N#yo62ScGGs1*Tm4X9;YA&H#cI2h_Bk@rV%FtkY`mrooFy^_e~9|yw} zN#yZT4u;v13=A8P%7Y~+{^ep=Es5OT;bPb%$-scPf4GNXw78{$n_f+!%ayBhKKO_qle)Uiv4U1FC`fmkoOOMkYr$Z4R6o&F#MEcV5meY zpO~bO#~;}kIHZurZ`c_4q>$4O8-s`xa(kAIK}rfae%Tllq!<_w^SNvc>Qc!0nTF_=m*Fd)v;U}Lb6Lf&t}#^5Z)z@P@tZ)^-+QVa~BJuQ$BV`B)ELN4#v7$T&Q z+haWpiHOa53=9k`3>i|$^#uz zgRV4k`!#~WM4Ev?2}!?=G;)5AU~rZOt#W|41~k&(CC$L#honA88oB)(!4M^loSq{X zlBAL6J0ch|rBU~H6i72LG$5H*fu_D5O?{g*@_Nt+hCVd;Y0}8+4I&ukNi#4YpRc(L z&425pk^A!z4BMm`7$lJT@B5`07~tene%z8~V9-En zFFlrKV0Z`5Z#@ieq!}1iA=PhRLGc4Gzk3+|Ni#4+A(b!eG7R7~LNNOTWEdEnknEF` zVPJTT)ZS5&VPF95;ee^vmSJExgXA9*83u;GNadBS3PocuF6UBZthJ!N5^HpjLCuKmj z9L)V{3>RgP#~;)fZldT{V0eh)eg%e?DDGEa_$Y&1J}WT%MDdRT1EVbR__hKArz~=L zt-v5C%fNs*?@fV0QWoYm5G}=^Ad4K{QVi;{$l)!;pa;?qQVPaW45qTk>rJE>Y-Jf3 zPJrb=gcO4-iun=@J}Bl%Fa*mYj}J*OM9CtTPZA7?vdG~t!H^+~JU%4BkdI=1217ZD z`56rLvdHyw217fFdNGDRS>*X@F@~wK$nhn{Fh>@7f1Vh_Vp&kB1@apRi!rQ{MJ~_9 z7&gixucs1Y*ddGD9ui~Nk79os!*N;U@z*ql^C;nw#&8`)eGJ2WS>*A)7>4Jv$mubL z;k_(qR1oAg5RPH^E{j}##xVSsMc(fg!@!Q%+{gf`Df#7)9l@{(gFK3Q69#n@c>@N0dF1|x0fV_ba{Xz*V2`5Sh{0VR zdA`Gl!CxLZ{~Ixcqo~(oh)1zsk0BjJUWXwcMP7%Y97SG>p^2qs3i(x&AeHskgQQV`!updRnQON#Bg68Ie!E(JVy!dB!>4W?n`3$E|1(lN@DnrVqXFSy8?25F@b?!0lB}Hz#y)` zzyR8F4oLwC4Dt%dI%r?O$iM83dsGp1O{^j z4l5$puRIK=6p_nY9)^pG$n8%ah8v2={X-sx`-;f@T^@#KiVWa0jvz5E#PC)TIll-o zd{IPB|3VDEQNmk@fk_G3JwgneO33|1AqD{@)c6!vLhcU=F~})_ayi6yP|8qMLLLti zV$e}SO+Us;sQqCpCFJr$jKNU}**{_o9!kjRS&YG73E6*Q3}H&h=~av&RtdR25MxMD zLXLkihHNF|`az7L2+jUVH2WLS%x_mhUhgBu(1&LJR5bJFpy-!lSgeFx-pMhnQbL}O zlw;V468>@wJCu;ew-gxmE1~uejwzw`56*((6W+g6V7P+fKQ)HiX#7Vg;i<;(QVDte zu^Ph%lQ7pi{T$i`aqoQ0ZI|f480%IKM#$+0m=uB$qF%W zFzkc!VeYwt#(#>&{|V)Tnt7np!#EI!^ML2!#nJehP(J945FrL01{)|JW}i12KNiXd z4JimQ@G<0|@C6vEpnQmVLJVzCKFqv1P(J9~BOwM6hGkGbOnwKH4?5#ah(V0uB$N-6 zzk$Yo1?7X*=nFAOFnojZVd_~`K`aOcr4Jr7zAzeJ0*$W)<%9Mp2r)=8SU~w86G7&= zqwyo5e9)OfLJTqtsZc&>jhhgI977$H586{A#Gt^?4duhkn*`-U(zg=B0w^DJ&XN#= z3d1@mAEtgU8vi_$588tx#GuA-2g--3e}l&V59Nc-P!eL$VBmsomYT)@Dvh-mWT1SA zybgmJ3SW=G2FeGmc@knUVDN_WVfKZh@#CO;(79Ve3`PvOP(H+b6NWkzz8S-0C?67j z77UA^e9$ni5Q7!NS|}g1XGVy@hG8d^51R86Vz6U44CRB?bPF*!FkFW6L1zpJF*q@N zg7P8uyD)I5gIo@&qlFmU7{s7_i1{82T2MY{O|TGy7lS#J4=TBY763PedaS&n%V#tK@A@+wb6hrx-X(}OxFor59A9RL_5JLn*1C$SPB`E#% zqwyC)`JgrBLJUz1YoL748hIgx7=}$yKE%Co4Ev#c&>9ONh6IKaP(J7kH6ey1hAU7$ zC|e0Jq%b^y@&$YanY41x@G3?fiIXh>6#p@Bgf z$_G_Bf(-QxDo{RXNr50kEdxVwg`ts|kzO)`o{xb7gPxD0pRS*j^K`3r#>SbOxs(XKBq-C%k_nK0N5 z6efSL>0BS5aBY^l&gTa}>G1v{95kNH5U?Zr(F#X`z1<6AV2B&mTD8ST1-3yLekT}%A z;P?gcq2_^O7sQ8p+8AmcI2D4#q2_>7oMW&XIBkJwXvl%n6o?Ns51g(*e5iTg6a(Tz z{R>VtAU@Q;uxJFQ0#MjP-49MtAU-r8O`+z2Qx`}aY92V9f%s7K%%J`Rr#Vn0Ld^r` zNDv=t9=Hqx@uB`TgPLas^)I;W0>wVmJaedj!NnO!9O_?iz6SB3?gOW95FctDIHiO5 zQ1^igK~Qpnnr8uZp9R!BaM=fvhnfd20YQAIdEmkj#D|&(&MTmF2{q3WY92V>fW)Ex z1(zfsKGeUKQ1dLI{i(HyRp14K*}?x)M?VgVjLIg%rkM z5tzx~x&tHv&otoL11thF8C-yYMPMd_i#MIUp%mR)W+yU=dh2gUe~K2sHW(!DTR51R8;c;F1_50?Sf{usmf5E?mJ< zFvo+7YOn|_oM9Qu&=eLdu&iYWF2zBLVVTPimb(nWg*sRYX0jQ~&9EE>sQ|%hU?#&d znISBf8G;)KAT_XjW(dn@hUPGnVOh=49Ohy_5m?qUw1k-q%Y25g+y|+~!HQvSwuG4s%YlZl zENBSJgGR7CXaviHM&O1IsJMsaK_gfmG%^6CC^sjtuiRY0luvL7%yCBGED92UI?@Q- zRssotN{TQaBXG$IqCpM=(V(yd(I5|lXps3~K1Q&}Hv;EBHz#m-y19ZWpWqO13J1|3 zOXK91>%GBgJ_TkKs4MPAOSZg zaGG{=1yer3A>i^0M1z!pXi#uEIe{B%POe}IBnq_@oJ_)ez-cVZ2b{vfd?1B9h=w`^ zp1i>A6*nhvesXgKQ(!NGyaqBAeRLJ=$iaw}K_zbXD26cE6K?fOo3H{{1fJ53@(*GG$a`qfm<74K1Sfe4n)J$ zfkF$U4&*Kn4UH&p4+q4DsRM;B$X-}QV+5{b-JHNRhnp*y@(B)srYR#>O=kqIdEFrH zbc47v%*Pm9aDZ!QkbQ0t-?>427v^IGYm*v*gVW6kTywd(f+>(AU_~1^b%O;!&I4Hw z@-9dKT-bpGK<0x5Kpq4MfPxb&01a|zW-x-)-$vl>n41&0+H`XTQ(*O=00$WW3Nf$% z$S#lo$Yihp$S#lo$Yihp$S#loC@w+Xf=hrx)y)aq1a@-;Q(*N_Uw{j^FdvBTK@#8w zgqst%Zg+D9Q($3`%|5{);DQLG9^^!@1jr&cCvaT3xq>OMFvuMs^&oeF)PuYNqCw_> z6@UzIa{^Z^ZmwVoEDZH2ID3EvpgslXL9hVGM3BiKm0$so4?zMTm0>)Cuw9@s9O5K+V-?a#1*-r#9?XC^65J|sa|KgiVUX26!6ER_1ZNeH07yMp z1=Nx7WCTmJV3lD$h&mnI3UYG-x4_(7!4${E*9Nf!4%j4P;i3OgS-;vV+iYv z7=bGWHz#m|*Uc47fz?B!0bu~tBCvXp3UH&POl!K(hd?14?U}YcyHz!C!b_G*lVNl$F)Pqa`sRtPYmH;`x z%?aFuc5?+&U}2CmKrIN6zrX^ZfB*@A`~?;O$$(4*In>DsoU1`xkilU-hTtd%7d#-1 zU=1LhZV-iTu3+_`wiU=CkTkepM4BFaXCSozsKp5~4r~BO14sa55Lf^jjNlXv@(IWwumm)? z!2Wdw4`YGq9dI`h%m66_RfHg;K{SXD3UF`}+RX`EFuS>eDX=ieAdp6Is~N-q*9~9> zND8b5Xk2=g%pXDSd4QVOC$3cxBs zu5fb#*Jf_6Uoo86osZ4Fm21r`Qr1eLom8ss3b z1c(8W0J#h-0AhgZA&?V60^k^Qf)wpekfI$V4RX1Y6Sy*Qg48KaPT*47$rVh6`9Rvm zpjrarSV*@G#0NP7M1!mXsRLOBqCsYYXi#W?Xi!vuXprwgG}Ihu8iouQgTz6809Bb# zb6`U##$bk<6F6|(T)`B`=?r>4pf(1C0=WSkrwn>NPEOzsmy;`)0*OLg1TF@`e88ng zm=Cltf)-ieL>T4+PVnI10y*9d(wA|A_hmrlfSTA4J3;;em5E?0L5_EF1(BehDubR6 zsPKSL&~SpvfeZ$`O3`++!=9m1yi8t0R;(&2B`tjAXOk5 zWGRS-I2>HLhxvfhDo7OK5pV-4%m>`o3-bZj!(osKr7$0GwcrLx&u))i>`dIyyn(BJ@%Q-JhB`QSbhh!65Uhz98f2P4R#U8=0D7}M>0ns3b zf@qK-pz;jlUJwm30z`w{2BJX*fD#u}9k_V`;zRU9#uPz(s5)@F3B(8a1T;_r)d#M9 zK~V^`2bMm;eQ1z4)IRV?1t@7l%>yUUFdy*5PM8n0u7`FJ!J}cIOaXNZc-Sh;2O4YO zk-9J+@ZeUM54af`<^vvf3-bXFx`DdNkkBv&hbf2;aV@wN9p(e=F+*b=+zbu#0XIv- ze4rf~Xg>(tNCs8T5LX+6qYuP~gaTwn3RLYt%r^#)oq+fdUmHQkSd76nAE?NI>Vt+R zq{9aihs2H%v_v!l$2_Qe1hLl$oLWG9sD7wBAU$D_I8;Bl@B;B6AqSbM0~P2{eb5mJ zBXE%i5{I}OGCv67L(G8;;e%oT;t$BMB&ebR*^z#3A7h8S?~*L(DgX zj{X=z`{;(yo-bsu71XAOrXFafHUtlnfEwix|3gM_LF%CPKqDVAFbq-$@h@Zy8N`QV zY{=L&sId$+AKKuB3`2v&q5cCGQy@On9B9Q08SMu70}?Kf*-KEh0`V85iwNRF^cjO| zMo{{Igo81--2rM8LfmZ(9#R7}{-E;E;Xz|?YXzhZVlJe<1*wCX3-OOJw3!5%@C3Ez zpyq=6i6A~iy%98gjG%eN5L_*Ray`UeBj^|nWZ)PSuaIztIUf>QFvml}2%6-eDG@fF z2}=jy3I^Ot0Hr=K51PZFNfPP;h(92%1`oA_`9MoBaDP0^2bwd${njuasK21iSVM3_ z9aN}541i4CgZL0*jm#k4Fap;gpmH4QU1&CjOgMwYLC%KE2507_<%4uPIf1aISQ6g-}l5lGDi*LOFrUO($0f1*ztpAl1B+6F5wrAZ-pONc+VJ(tdGr0=GY$ zTp^SbxDn#y3Zb09sm{q2LO~k)PLRgF6Qq;m1nDF>Ie}x_3DVbcass#BoFIKUCns>( z>ICTtIzjrEPLTek6QnQe1nF}-f%@D&`9X=UMMe2V4Ds&D9AqEFB$!QLj~l?f z2ea4!)#CX4w6tQlBCsAaI2WeJ3>;c6pcN4TpkQQhPb~>ZOwLX%@yRbPVF*vmEOE;( z@=VD|WdQp=C^a#~Gq0eu1mr$YC_eGC8^0JnfZAPATPs>%uUTLPAy?@%dGIsD@!dZNloz# zgxKnwpPQSQmtq9B2JA^=I2YzgV-)3ZX|QTTgl?E}LnDyOf=d$fQj#h`Oqa}jW5?o< zx$EDlNwF3&7U&Onv-%uP%O1zBlIW?4!m$X!rI zaB4|Vnp;t7VQFe!GT4fs)b!Gv#FG3X-~5zRkeyE87;#E0PIXL4DM~Fa1_=h_m!}pv z=jWwmrh~X46<`4nGawNv49ba+m=6X!&a#pNWvL91fPwlPv@jC1c6APDg))R=457g1ut{BmY+eR!afXS5wm(Zl#X)SCIOu3D zDRIzBM93Zpm^f%{rj!Ik9K?o+gSPTYNkYUyY?wG`%Z)VD91t5O4q8(w4K)YEhKYlg zKuSZ+0kL7?;5DUlA^rlfVd9|sW2K}Z_JY_janQZ1(ok^_8zv6A|6FJu#2gSCCJwsi zRtR)~0s~~v2uvKb&QwPlVm@fys;&%#4GLDFg%EQms5u}uOdNC{Doj0y4HF05bqf;*v0>sbK<{fk1YAohaTFmcd1d_t=s;vhCm9CV*D zOg)GV69=7xBeVvh9>j);gYu35=%O(2iN*{J0&I4I18pyD7lOdNDyF)W>f*f4SMo&u=(AT~@Kln!C_2#5_6 z2i>DB1-1adPpmeUQ17R02Ffiyq4@Cy2D?NxfINq_;`yd~| z>NOA>W-llY!tx!64HE~|xiIx0HcT8;hr-l@*f4R>UI$qGg4i%|&>jj{xPjO(anOAp zQu+`#gV-=}P+Ee;JBSSv2kixdg)@i^69?TZE)6vY#DHEGJv=T#Dj^x$Do z-WM=|h=cBe*M+h{VI{N|Vh)H6GY8a0l>%LK$pG2g3KIvlour}SAT~@K)OLb}4~PvD z2Zfc;K8X1sHcTAkcOlS4SPYP}7+~U{G%2(eq8`MCiG#{Ip#u{3&e)02emPztRQMYY?wGGk4QtsL2Q^fs80b4HxL^p4l27~^(=@D69@Gj zVEr8s8zv4ai(v5%V#CBiaSDrf5E~{Aic=}*<%%FSOdJ%a(ok^_8zv5lQ0kL7?n?Ut1wBH9}!^F3N#G&?r z*f8;3AaSTUAT~@KbRRs-UJx554!Y+<2YUI&8U_Xi0SAa1K<6*%Izrf>bR~qPO$$mV zLWdw>4r0U11eF6q&^9fI4HF0T>0su7*f4QW`hl4PV#CBi?O2#OAT~@K)J_v{LUJ3H zb}}fm-pfoQH6$i0l;vo0K(m99?69@GRVCfCShKYmRi7owu!V{L>Kx~+L zP#*`T9>j);gX$D1Xgq@0FmX^@QOX74eh?cb4yrp~=@7(*iG%VQEFFT_FmX^BD-AUV z#Dt%JR$|U_!xX6AOizT9F$*R?g6o3;-J0&%sn7B zOnd?;eL~Fvv0>t%Hb2ZgAT~@KbT1dI-vnaA#6f9Q$_)}eAT~^V1IT=6egUyz;#)xC z&~OH^Vd9{BoTZ`WfY>ncJ)rsm+P(#`VdCID+|YUr#Dt%zC5fS2V%p-*%%oZVBrs9!^F8j;!yvB*f4QE zkT}$xAT~@~2s91=^)HAG69=_zbUY#M2i1c*UJy2DEJ6o*$v5b%UI8D7IOtqBUC@Qt zph5%W7c6aQPx522(k+M$ zQv=HTQvMJ%AT~@Kl=r2f;vhCm9F+HA`5nZDiG%7sSor{A!^Clw1EBgERt|vJF!i8v z43^(PY?wG`FSt|y#GN2EOdQmXg2gY04HF0DeOUeiv0>t%@R5d^17gF(L3tmRzd&r5 zIH=Br)z=_4OdM3V!tx!64HE~oJ){C5?gX)6;-Eg1G*leKhKYm5xM1N4V#CBib(7E; zNPL0VFmX_ssS^Y-AJiTb2!^mhWr$7)gnfj8fk79_2F10|IfywRHq0E*cq1&nKx~*e zs7(ut7Z4jJ4jO}%0$tqB067~4CJt)rN`*n}1+ih`ptJ$&Ux3&!aZnv06%J7kV#CBi z{t`L`aVLlk69<*~uzCT+hKYm59%1ngV#CBi{aIY@Guv0>t%z8=hc5E~{AYGcFN&mcBT9MtcV zihzUXK>mf917gF}gW8`kb3kmEI4GS9#6a8zDpz4_P&$OML1_=h29+}~ zHmD4Nu|eqs#>V9~kiTGV1F>Ol0Qn2%HV_*oPHS^Om5LH>og2gHVngYJV7 zh=qg|s9Y6@gRnt)M>ihA291XZBtY1pvJoZ@8n+ZkgouOE156w=J|>U^5eM}RVd7xF zW2py0eQ=>GkaPlK!`udPztB~PIEW1s2es2+egv^$;-GN=Sp5iM!^FY%VrjR7;tOUD zhz(N@iZ57Lf!Hu{TAKqt2Lzg5Kx~-3pz;vr9uONQ4ywlmk|E&?Dw73LAZ%Rj1cju~ zEf5Jg*9&G2C=I~O2eDz|xXc0NDOk9H*f8~=`~@=y#D(b>Ty_|1!BX*LFp6LmH@F~;-K+5sZ>aqfY>l`P#T7nu^=`~95jvx zYfFIGFmX`7TN-K(hz%15mGiJN7Q}{$gT_5zWj=@v69<)1QfUzPfY>l`P=6Wb9uONQ z4l18vWj=@v69@H|rJ?44*f4QWxeapzc0kL7?XF%?`07-`+HcTAUmKM4U5eKnh z;-G$k&_#$ihz%3}1~TUoL>$D1iT?xjH8LRn0l`(4DU^e}ULAaRpG{0eT@Rhz%3h0g2y)xD&*NiG$}B??A*sY?ycmNIi5s z0mO!hCxFDE`4_~7iD!YtuS3iMv0>t%cAY>bBpkr=0$C6?xO~orutDXs0F({xzd$b- z1>K`AkPA^$!pOj&n+IWo^D>sQ6jUz3$^;M_<_1uk4OS+A*f4RhIXLP9SRO~N3qW-` zERTcOFmphDl*)&=4aA0tgUTgX8V0dp;-Il^SQ-YgVd9|hk%pQBV#CBi^$skqL2Q^f zs9gl}FNh5j2bD{(ItavuiG#{>odSqEL1mO~A%qPM2Q1+Us*hmigV->0K=lzUJV9)j zIIYbAg(1v6AU4ciP&p5C4~PvD$K@VSpAlvbhz(N@>Knq$0kL7?xXc0dQ()$R*f8~= zxPzGkV#CC7nFI0*%p4FKrXJ)Mm^mOeOdML2Q^fDD4UD zgydNe8zv4)W3c`jhz%15_3>f-BM=)V4rui zd|C<#A5ec^rwqadtpR|saisxJJ{5WfiBk|8W+o^+VRnJoFmX^i7bu6A4;qWmt$?t> z=3^-nKJJJ*+b1A4OdQmwfRz;>HcT9po?+n$ zV#CBi=^2)WL2Q^fC_Tf}gV-=}(E1rz_<-0jaZtL2wI@Mrm^kR1PN^zL_<-0janSfM zEPOz0m^f%Y1=gMfv0>t%abszyIUqJnd;=)&K*vHsY?wHx?FSn}0I^}>pz$c7H;{A% zV#CBiX;r5h;!aRMQJ@CG29KlGLfD`@D^Lev<4SL!@>%FU#C#ANW z3r`RmCJridVBra3!^A;pOsWauHV_*o4k~kC;R#~H#6e{aEIdJMm^i4+k%pQBV#CBi z^))O!L2Q^fD6PWEB@i1X4jPw(xgW%aiG#{0nEOF&m^i4T9VMi2Ffom^i3!3v)k+4HE~Ax5LJYL2Q^fsLv}6H3!6oiG%vQF!zJlFmX_s z1}nEgY?$~BP0RRghM;-K}YFn@vAF!47ae?j}3AT~@KbT^z-E5u(QHcb2rXv`Vf zZw0Yo;y*y*P;)?Rm^f%&Od4tqhz%15-F*x57l;iL2laVj{sOUK;-EP!nEOF&m^i3! z3#*SnY?!zTBLjm}8^rw}HcVUt)Q^U`AH;@8A4aA1I0n|5vwY5NOm^j!R64rr(+E>!h zb>JX2%p8y(Vd5Y*OdM3c!Rj~=8zv4a$6$36hz%15&CS8YL2Q^fsQiKDWe^)C4r=oY zJ%yC{AT~@KR4xhafrx|HFmX^hBlHd;4r0T^LFIt% za!DF$4u}mC2bD{(JP2aL#6k6`R6oRC5E~{As!w6|g4i%|&|EysUJx55egIS^K+OTM zVd9|j3T7{e4HLfvDvKsS>;cpWT$L2Q^fXigs%zaTbD95km7i(e2MCJvg@ zmzoIiFNh5j2jyj$e?e@RIH=r%`4_~7iG#{LX{b3MHcT8;?!o*EV#CBidkSFdu0d>= zxDlwVgRZ*t%atyXE8pMW)gUT^jp8~{&iG#-NbtXal1#0W+Oop(*{Z^ypFgbh0XTz4jf4KA;+jN^gZX3%m8 z#D=*OR7SzdB@i1X4l1Ky`5nZDiG%zCOD7;UOdK>X02^lmv0>t%ez(pnh}%HpConeH zog|dcpt2EGK7-gW^TFm|=?jC}ldy6g#D=K{xdGNE0|uyhV$!^DF?Z6WA-1`r!24w_q+ngekUhz%15&9g{D#X)SCIH;WoTQ31( z!^A;lyU+$m_<-0jaZq}enhP->#D?LAP`Rx; zAHoL57nXDm8ta3lTM!#&4k+$m^&p5169QKgF$N6LfDBQ_Bsd~RF5;Rhp<8YU&aj( zb~Q-NMhF{J7BOyuutD*~xEaEp3R1HL!Uom9j9VdWP`{ON8-xw29~rkp*q}O&aR-DA zs=pX_LfF?q=Iny7AA{JtA?)`c_8tiPH;BC#!WLv?U|`$_VatNp`yp&+5c>dx4J!8- z4?@^+An`*GHfYX;@i2s40TMp~VYh(TM0VaI^jmmus+ z5c@KOT@GSjfv{Ua?5hy=BoO-=ggqa`z7Aop1+i~H*k?fOn-KOb5F6^>=OFeii1-%} z`!P8bVt;_JuY%YgA?(K>_9qDYBZ&PO!u}6pe}S-h zSs54@ze3p3Aoe#1TNA|o4q=;v*gqg_R}lLrgdGfG|AMd+LG0fUc0P#x2g0revHwEY z-5~Zq2zw@o{U5?!4q`JvE{ER=VlzV6he2#;8n^^vGeN{3g4oOu_6HD~1;YLhVzWZn zpe`aK8-xuiJ{Z{{Y*2P(Y$*u)4~Q)dVRLaXFfhtM*b*Q%$P)|<3~C^@ z97Nm%#FmG!oj_~_2s;48R)nx;g4jwB_Hqzg8Nz-5Vnfs6TM%0XBF@dpz`&>qVTXX& zY7llJh^-D`=YiN75Ox)atqEawgVN{RzZ2hOmEt*d`G6e-PUg!sg*(U|=+Zur)wza|qiM z#I}I2oj`0$2-_dTwt}#;Kx}IWy8y(tfv{UaY+DF>5{PXFVS}~=GulJgpzV%~4iGkI z`30jRgbiAh+Bu=jx2pp4GIz;F`8PKJnI z2eDHi?2jOJDun$V#7={-|AN@*5H<@h0|R3Qge?bRXF}L2Aa)jntp#FdL)Zo&b`FGX z24d$z*ft<`9)#@#V&_BH9w0WT5Mp3p@CUIAA>t_@b`gYK2x1pQ*mWRw354APVwXbL z3qkCkkT&Of5c>y&y%)s(4q=}LvA;ps7eMSXh~66@b~%K7hnImtxdOpfhl+m&si}mB z{{XS8AZ!*s1_s7z2%8hcu7R*cLF`%xTMNVn6|M{n3{D_6bgtY3#IA>^i3G8sbInO0 zHgwE08^i`x8Vn2!R(R~yAvWF2V!?Y*jXTUH-w!J zVuLCc1_p*|5W5#5-T-3vLD(}uZ0K73#UOS+M0^W~4PEQL7sQ5!&oK}i8a|gm>aR0LZcDjo__GYujh1!6

OY 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 literal 0 HcmV?d00001 diff --git a/obj/User/system_ch32v30x.d b/obj/User/system_ch32v30x.d new file mode 100644 index 0000000..0893c5b --- /dev/null +++ b/obj/User/system_ch32v30x.d @@ -0,0 +1,88 @@ +User/system_ch32v30x.o: ../User/system_ch32v30x.c \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h \ + /home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Core/core_riscv.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/system_ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_conf.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_adc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_bkp.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_can.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_crc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dac.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dbgmcu.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_dma.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_exti.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_flash.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_fsmc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_gpio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_i2c.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_iwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_pwr.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rcc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_rtc.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_sdio.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_spi.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_tim.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_usart.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_wwdg.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/User/ch32v30x_it.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Debug/debug.h: + +/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc/ch32v30x_misc.h: diff --git a/obj/User/system_ch32v30x.o b/obj/User/system_ch32v30x.o new file mode 100644 index 0000000000000000000000000000000000000000..adf28410195f243f87e0e53629ecf5d8596d0630 GIT binary patch literal 27660 zcmb<-^>JflWMqH=MuyJ}2p$8&nsf#*-vq2cgF%Ktnqj**lfw+>?QH))I0_1DUbCgK44tGY)STV{%|kpX2ng-|pBV_f~ehBb(eCpD%KMJpK7UknMAvg{MDfNDgOb zYjw9fX5`-Lo-F^J1tbHq=ivXpVmA)oa0X%Fban?24RRYuPLm-N>PiMikWDk3CyS*s zJig2J?}jtT*238!)xzoO3^xudy5Diy*!_6k^M8(vO$|)P68D2t+;G~?&cGn(X4pNs zot+_>^*Do~TQbLSCUfyB24Qw~g&Bv<#hDx;oCTXFmwjh2XJ-J3GMG&lQJ&#!9Dbc) z#^I)h8%|f89Me3TZM#4A3A3p)h@Q7~Pv(Ed`x{+t-9BzN7q_?0<(m$F#`hwYd-@61KVr{ z2B@fth%cONAd(J}+{nPdz|PL1%D}+D<;i!Kfq?<+90tx{*ANCq1}>1JIE4j4%D4?! zG?+N&FfuTJy~v`)B)AtO4dH1+cq|Z}4ur=6;pswnJP@89geL&u=|gxT5S{^qCjsFZ zLU=L|o)Ltn0O1)!cq$N{352Hs;h92sIt;uZ_pz8UF~4MBVBqFqxx~bI5AOae5LHm$ zTxH?~c@paWYY;gOs0r7Zm{&4FLy=WU@;f5~10Ty@Mg|6ckOkl%XVc+JfCVmF5fXc% zcn1Rm#2ofiMsZL`3$U;)V-96vU=RdpXIsIe24}An28lBWfs#fl69a=VNIf%y2nX9@ z&Q2x<22rq%rR*Rxp`2B$#!R3j2yw=0W{@@rd%g5)Mg|5k7BG)P44ihvK?X>0=yPx~ zLrvo_6b7*wB;vCfIE=t1vw*GPFyaPT!vW=pfH*u*jx>lPAQ4}|z+ueI&&&_a zfx@DLfsX}bo=^Y_0|N+yqgtMUk0p$Sfk7G^ZX6t?9QAPH%LGAesPW|x;~Dr^KuHCx zI)h^?#|c&j28s9r299k)V8s&gMGPF1I&iHWGAN^0|Nszh+Aps5Iqq08i3=9g8@IEeE#?HW?0^ywEoyE?;paJ2W z=G?;0z@Q@$Uz)_gaSm*>fkb?10RzW*urnmLkNWPh-WGj149Ia^MntS zm0}>Ar{GkQ!XP8X#J~X3Aqyrzo|Ls>XJC*8MI!?r%SToQ23C-i94MJ+uy9y1ae(B( zMGl8G6WAS)!i2+tiCc|>fdNvOa5ylDfOwF?ki&sV4#a~Lh8#{z93b-{g&~JC6NefX z0|TTmh_nTvtp4iiMSjY;4+I|IW5D7S-&E1!#j;SCc5ABzJ!r~(AniL4+t9}6h` zf@7ip6!f6rmIcQIm_aRw5C#aRtV4M-O#`61LW z@UbjlXMhy4pmYV!c}x)gEl~3YROmv>Yz}!wsa6&S1_hAEc{r3AITSdcH6Vv7qacU_ zjdV3ea1ww@h$Do@1_^a1Mj=p3 zfQJE0m2yB!RVD`R3mlP5>|LBNmqas3fZYty7Q-Y2iaMxEVwnU$3Zcm_j!7I;Iz#GB zj(8@1Q1C#LLjsddBLf2iGyx5*RcCs^zgYpW5 z!@(^3hLwRq71Wwz)a7CYSN}o_7#J9~!}RepurB9fU|<6YsDVsibmrZ|#lQejs}2^? zW#VQ0!^Oa$0p>y5X)ul|xap?}mU_j@s0C(pfpapLIVY2wfkC?@w}64MhX>TK0*UH? z2*w^!G`@4+DPR<#-h^sULe{{*pbWACnS=1jjL}CAYey0yrKtpsK*;FfeH9L865lqJn`zOOMfB608X< zB*-Yl<{&ZMNfP7+Z4;!BViIRy(198Twh|K<$Wdw21dr;e7p>dkU=X(1_nkwJ^j$) z)FKA`(&8fh;*7+iRDIu|U?csa)Z+ZoqU6+K{ltO-BwkKtUTKAXa(-?>eqL%`NwI#o zvxk02etu4JMq*~3evoIdvu>DzYi?3%N=j;qg1fV`eoDo9*EGcP%( zG$mC(H!(RQGcR>O>@Kb>X3)>b&rQ`&Dk{y(*U!x_%`3_*OD)nZE-6jP%-1a_%Fjwo zE-BW}O)bty&M!*M%P%U)FV+u8Ey^s&NG(dt0r`WLZqLa~(oauL#tc6TJtI8>knNyQ zB+nO+I48&d&iO^D3=GAU#U-h^@yQv+MrFnZ6?(~_anAUZ)U?FXoRavG%7WBly$l8> z28Q_Jl9bH661@!2xDZ@<1}LHD18m0My6O98Cby?iTOPPBP%mABPRm`BP%Z(GXt2x$IJw#8JTOrG%r*E zGaFQb52jL@`7kqB2_N&`8ZZN{25uTN8&o@{2;3ZIHfD%9m})RZkae+uEoEi?25~tv z^G=A<1z|2!h58B8T_Vh^V9hd6PcgGGL%hHW6%c`$Aq_QyA4;>rd?XB0AqMp#GgO5> zl$L?gaND_II$$&_EKK=fBFt>e>|lq%{Q#3;g@uv;R0N`sxe}}#ZW2tE6{`p&oZ)IX z*_heD+Tp%sWn+efD%?ddbD-hE&&FH_*1`q#9b5;@R7hk(Qx80}V6q5z!9xRP1FHbc zYze5@+)$d4c_B1**qHZ2`~Y(wCusPW5s{|57~yFe5-m{YKzzjm4LeqLsLAlSVTY(= z6^E(NU|?clWVQqQm6?s11I&}<^Y>cN`ffy@p|LSiuE z1fj-ALp2F9L$ttDLQ^XzOg&7T6^)dUVP`{ktpu`iYh;cBvp-m`FeLP$zE*_rKf{4l?3z*Jg5Rlt%VTm{@#MPyI7AaguH z9H?9Tz-&n2q>9KtkV47~W*aOi*+FfExf3QX4-E}&Sgh&7bc(Psmw`hAo{rQ&Ho~OA zPJwYmVBrB*tBzBxIn@24FwM>|20turEnp({P*+1k6_Op}Q;PHBGZOPsa#9)MGmGPs zD-s!sGxCc{6hKoV@o9O9Md`&1jvh_{&aQqz4Dm&Yc_}6q4DqSCsYU6jdC8RwLBS!x z&fY-`@$sdZc_kL{B@FS2C8-seB?b)6AwEG2!Ko#|mBr4W>M@a4hWPlL{N%)(RFGx4 zNkt|3<;hT;0XaEFxurQd4DsusaazzKvNU-H3rWZ2=tH%&PYNJA+V18(h`RF!Vo9QIPG)XqiLHVKNHno5RktX$ zxFo+QRY5mhLD#=nLASUh#Wp>!)Y4KxH!U}@LN~RjD8H!K*2n0 z3_$r9DOZEUL!gPv6BHQmBm}aCAs(De;xpn?i;D8{8RFAGB?KsNKml8sl2{4Kdf?=c z2FguF4Dlc*FvQ2ZdHT45vjwQ^0Ba~l5n>1~Nh~S}EpW~+%_~VQ0x3nxFPVAC4Dp$H zDd5zT2rBjBlXFrN^GXXC;!E?23sRFa(=t<2Kxqq9z+~p7Lk;PAM*dMiQbh0HuxG%shtpA`=Tpj)PQ7xk*TMKzxB|F+)L44y4Nu zF)kMr7vM4poJASjot>=|G%5lTld}~-nGj1)Uq`{rL^mn3L=%!bArl7w|NsBb$iP^` z$jihafi|Y$!zaM>f{TyAi5sF8O&Wy@Uhn`FVPW|AAIbz%%%I*Um<1u2K|N0h6HGFL zI-g(`gkWZ1VGxEep(J^H`1ml?Jj9SN#60k%0oVrYd?BzLh=9nW^F=^XU<{E*gdc=2 z1C|33*!kcQbdWUEedv71x+IVSh<7(?_&f!QDeJ3k2|1;!BhG%y=PK=>ITCKwaP&jPCj5fJq`ASM_?_<3M9 zh``P-0ZD-|M7|8n1`!Z`1&9g85PlVy4I&`?IuH|#vGZHNav%aC-veTTF?Rk0upEeh z$fNTofuz6~B0mGn1`*i#^FUHy43S>~W`hU_e;J4g#@P9*z;Yl0B9G4B1d;+{h&(!f z2Ure7K;+T+hd@$b43S6Yp8?B(2#7o({yC6RFovkV24;f@?ED)bDKLh}-vP5h1cd(p z!~|pP{1;$35CM@#=f46;fiXlLo&N?b2O=Qy??6m2hVVau*&qVK{{muyF@*mO%mxwI z`M*F?U<_Hc24;d+F0rANzx3fF%43Lqd@u(wK=_FA6gwX@P7l!nkq1v_f(5Yi!Sjkp z@|(i1HRYzYnAoj3M&q{Apl05CM^&1!96Rgg*z&1`!bcA`lad zA$&ynik-g!tQJH-3Sog9r$J4~PlI5dHx$8$@8|9|1{$F+~0Zm<=Kz z{3{?P7(@7o@)J8BQGPbnd33%En!ExUUk`~7@)Zm-GjO2wJs>NO5%Qc2;59Tb z0noT6oDG^gMYQZe!px9$J0K<)Geg$gg4rN~8M5XE!~|nz2Jq@zFdIZLgG+A^3xb&$ zM8P76_=MD_$o@g?uZV-!tRTuK76#A)6y)|Rs4b6NKU**`Fd)(w3xf><0|Rn<2Gq7k zZXdWXFfbsu|3GyOa{UNe-VG9i_<)T8RCi2)aKPnpI0FL%a(M-s!3V7if+%5QNMvAO zKrXLAWj%8Flg+@ufLwlo)FRinr3?&^1xa87*%&}&IdXYi&%nTdoPI!UVdV7R30i-S zlwLq(FLHjL%)r2aoL)g~UF7^emw|x+Ieml5UgZ3_9PBO_!NUMr&|l9Cl89;tT)c>Lk ztc(l{Iq+tfC<6~8XdyL7F9?e=2s1J;Ohhsd6n0mU_==1S3_kGi5@pa}WMDXo#MftJ zU{FDFzZoL~Llu&|9U}t+qCOL4aARa(n1f`#A0q=p2a@_QMg|65cn4dQA&!xOAsWg3 zX^adEEJ*g{Gcq6+b1;Z9lru6g_#x@9XJlY7K??tNMh1qrNb>!R3=CdK^3xd^7!c`A zlwm$214AT|eajgc81^9PUk?foB>!w@WMFUt1uYnhGVBNOk<331@(+^!^Nb7(Hb~}Q zXJlaTK;qwLWMFVc^8a&228NeN^6x>L4Uo(OZ5#kCk_TJQAjP@sZ3^U}9j%Lvp_c69dCaB>e_V3=E)c3NZUDm>3wWkj!&nVqow@;)DFQ z1Ia%DObiU2Nc;%U8h9l22}}$OuaMG51``9rCM5X+CI$voBz^@G1H%O*^$ko649-aY z>0n}D_<3w=A*o-$#K0hqq<#ex1H)q^`3+1A43C!Zk>oX) z85ru2>@#3yU^tAV-h!EdArwiy12Y4I8QjgH3?9r33~ND72V+r&0A>aT8zl7+%nS^l zkoXDA3=E(!11o0`WyoM=U4@l;}U}j)2hXe*Vy?$V3VBkSA{|7Sz!!IQD zpcOYENa>S2b#BgwUu3%wcFhMdO zWcDE>{kvEg7(OA%gVMekl6_}b7#MaS$zNq*V3>lW{~iki!+a$5&si84;*r7=6xX## z>VJa54@o^J?j9q#pPQ9|;TV#<2rC1FFOs}0D+5ColDrx#0|TfGgm_t$L7$a@;Xjgl zL91jpA%(vqD+9wph+=T~c(F1tEJTtIW@TVNj9-c}#IQ0jv?8fbWo2M!KyptWD+7Zr zl7Gut85nLN`L}_UfuRS60fZq=5M@}) z%D{ja{}pA}#>&8O1<5`8Ss55!Ao(A(J0u0k{EMs%NNq4thFfs8ARE{i9|8*+P)g~1h#?~S6LjUkYYfdP5^ zESwFxaRp>N0~1*Wn*9n0GkCO*chtW zkjo1;hDJ692E_P38$&xA0|WB-OCK8p19E?4DjNd>s0|M?je&uUVGbK=|70;60|R2b znvG!<8v_G!e`O;Z0|R3GnvG!x8*2Y#KN|xBa{mLA7m>$H&ayEuAdg3Y%2MS1#%(qR zaGM?GzDH~f3~ccDW@C8C#=wBw|Ng*++W+{@hT32G$Hu@Qfux_69koBi16nT$u?(~! zmqCi10jZD7!l1y;z<@j-qt1?;zE~La*clj*`6d3e;9Q~X<{DTbP zECU8TA0q}mA7chR9}@;WACQbWgPxBCgPxBmhz};rK&n7OMwTG8AWeoKt|5qP1m=P? z8H3argLD{y%rpWSY6RjMgJg}svLFd#kc2VFx|GzU()9Smq@<$MGLSKj!ET18AXzX2 zqyo$UnE_E+l$e*ES`1PO;pb%LrGj{l!ER6rh5ab&kPqP$NO+I0n0c9O4-4 z26B{Rup7uDj=^pquYfFr83Q%P5Nd)U)CfbU!G=(?3{7AXP*V+|#)1O~WFXXFa4(%LrtIt!}Oa#4TgEt1ZtiMOg%ItOrYkPKpkuXHP;kso+;Elrcm=> z@oWk;&lGBoDbyTOs5z!EbD;K_LCrIRnr8+z&kP!nW>E9YpyruD%`=0VX9hLT3~HV^ z)I4*jdFD{_%%SF)L(MaXnr99*&m3x=In+FJsCgDp^DLm|SwPLRfSP9kHO~TSo(0rA z3#fS(Q1dLH=2=3`vxJ&w2{q3WYMv$3JWHr~mQeF7q2^ga&9j7>XJ`O5(9i&CqM-rQ zNJ9gtnT7^XLk$g}rWzVRjWslYnrmnPHQ3MqX0jp7WJ8$A@azN6Kky6$&q0PTli^th zo_D|n3@9R)NfcZ{SPn9TWgSBkSg67>jUg=68^W@WAuRtG z!ZLy(I48I{fnDt83Z{I5LtyR)=SQF55LnQI^PNv{2rO=4`OgrX0eyl)U~z2sN6$}g@HcZ@%fq_99 zDh^`9#6fFo1fT;vpmj6?(8(fD8&c;s#2nBVwE(n{2I?ya+=YmP)_Dj(Cx<}e&^q@a z;-L9L9cUvCG}ou|5F!p*C!q@+um!a_b)kAe?MoON)Ru&?*D)|K=st$%-2)m|hE6nr zoTBp-BK`+S4QRQO0CX@K)JD{O4pGC!$iN@~orDqrjh}+fB4L2E19hQ;`#K=;*AVrf zaAt%q0szg8Gron0gJvrjK@kP+=`k=czK4i|PPbtE0BPqdf;K07gouOI6){357eIYz z#?KIO&>RFKbP@|R7RvY)BJK&&3vE1t=AaotgVziU;9Y)o}5^An;TG_S!3 zYA7;5(jMb)h zgV@kcgF1*U2~lqgVuL0G7#J8lL2PM=cs_^?os_Eqv1K9RT_83nkQf*krh(Y<5b-4- zHgwVsG+xRG9njee5?6w#xdvh@L)ec&Y!wI_G``8G3SooBA{n8Bqo6SaMsrj}h^K&D&cMv-W!VU$ogCT6tSOjATgk1;{ zhYnQNgV>u)XWC4BOvURAa*2#y&c4kg0PQ**wGO7We^)WSo09Xj)jQ7 z2eF}P0MtKc1WjszPHbXlU|@`gsF4A&6CiAD5IYgVb_TJNAne;9b~1$h0>lOtDhvz^ z-#~0=x?vzs1X9OK@(=6It0W{hlpE)*clMECy1R1VTXg*SrB#uh@A~#_kq|s z5cV7pI~T%U1!Ctx*gHUM&}19~1H&;88#;)51;j3dsCfipg9<+e28ItHb}>Z!ABbH7 zVe^1?|CB=5QXqC2gslN$gC_SF7#Pez>L4{e5OEz4yBESX2eCnw3sTJHd3gT~1i7eLGbw_BhC zlvYJP?Mc;HN;F%Q14JBDoilEPutC))BXkl2RIM^@ zhKPfzNk&j(ih+RvRK3C2psI^;D?|;bYJssq)dnowz-{Jj5H;ZR22IE31Nfn-34KT>|)#v zVS~Y-|aK;qB^Rv@+-R82HU92CF|3=AN)8dOaRNF02m8v_G~ ztp-(-3lfJ8b%WSyP&H*BadD8(85lrpHK-cUdLSiG0%2fa0I}7eYC!EzB~WLJfq?tJSRexfh^+=yGYcdx4KW|YR)eYmwO5ru2@TqIRfDQo15z&wQ4eCPLDg&p zi9;6|fY@qKHK6vb68MBQ1_lsY4XWliNIfXgF)%QI*lJKUpt)=%PzRBLfdRx;gQ@|| zX)8e&+JV?=P&E%h<|sql17fQ|)w}|UgAy_W0|SVy237M3Bn~1^sNiQ{U;wezplY~5;-Jg{I0u=)Th^+=yV+Rrk zpFPFE0Ai~_)wqGgK^<#QeFQQGss=QNt^`{6$H2eOmDX0|Nty ztp-)I4kT_3Q4eCPLDg&liQ7QLL2Nas8qnOmk}X6W#8!i<0nOnnfhvCn$XXUPs2b2* zz7pu{OVFB0P&h!OpKZs2b3k043<8EQqZJRin(xz@P*gq+wuS0I}7eYIH#2phggA+yi7j zR1IjIgpxPJd=Og=s>T+i9=hoO#8!i5Q4eCP zLDkfQ#G#8+Kx{Rrnhub7C`3Jotp-&y0VED;41(IUAb&yC%m9gl7Q`|zFo4)rdvDKhzK${Xd4Sxp6S}!%I znmCa9LWp`0TMeov9V8Cjqyl2ALDdw1#6hQVgUVr0I6&1@g2X|c2?hoR5L*qZ2DCOp z3A8|(fdRZuLJg{>6QmxxNC(7LgQ}Sb5-*3i2gFu`s+k26hi*ayvDKhz7J$SnA?iVF zHK-cU*oYEnAvOa81Bk5#RkI1C9@NocU|;~T)u3v2gTz6D=nM=DAhsG*%@L3|XmFQ- zfdRx;gQ@|op-_S@dIz!9plYsx)Pp)t3=9k)wi;B;eUNwq#GN3v8dS}5ka#0R9K=?G zssXL3P-=pRgV<_NH9tY>n<3&Lwi;9o=+ty2(7-e3pmcTy1~sS}ZgvI+CFtTO5L*qZ zMi?Xx>ew-W&b4P?P=l(G28p*r%m=a6plUQg;-EbqS3&BbY8HaTr$WpJvDKhzR)NH!i_k%A zHK>}+AaPJ-h^+=ya~C8I-NXfAt3lN~1&M<;7%(s}fY@qKHE%)Uph+YK1_lsY4XWlV zNE~{yAc(C7Rr3!d4qe0qVyi*buyZglC@qAzAH-IJs^JHTg9Z;67#KioHK-bKkoaPV zdJtO;ss?l-u@Yz^3p94k!N8yfRig<~zZ9Y##8!iUBAz5-$nh^+=y6Acmv4Qzn=WgvT@YLY?X&`rW1wi;AT4oG}8#2gS?4XOrwcJ3O8 zIEbwVRZ|O64;n0CU|;~T)u3uxLE@mvItB&?5L*qZrWYi>9%2rNtp-&y6(kPb)B<9w zLDkF!i9=7K1+mqjYL2{aG|N^hJD3~Ep{5+HH#slN;iAhsG* z4d^f~rF{@{Kx{Rr8ZD6e{Sa{wTMeql7$goF++tv00I}7eYOF!x(8a7Ewi;B8Ge{h| z2^_>$gQ{@{iC=)24`Qo9)quMFjG&1`&>SmhtOhhV#K6D+>P{M}7xPf-PRZ0ii7kZ+Y6oY1{niC(F8P902(8Nb}1QtxIxy%f`)=X;vfu44xp|avU#BCOb`Ye z25PTB8KABvNDs_BA9n@@&=d^FJdj&Jav<|SO?!}eFn`1_F)%=f)xai!)PWeFCL*%B z9Pou9AQ=dTsRLEjAaxK?1_sdnovqMuK#&+r4%CzY>4CZLfCmG^8V&~Vr5KSsOW^TLE=vZ7#N^aX&^3ibpT{<3dn4jy*Yu9_41%_ z0S!xn zR3?DT0AZLMsMrDNftlwK0y;n*5-y-&O^_VOJkSylm>!V+6+#RQKG5-55FaK7T50zt zC6F8lgU9+o8lhN0nE|{v70Lx|TLCjcODRBZfVqz$4YEHK6d#~rQ;;0UeIPSoc@(5E zMwx*@L56`rih+S)A85}YXnhR>184;?%Bes#_6!Ww&~a{%K9D&e8WfhWG!NoWNMm4t ME`I=VLEZ$@07B$Q8~^|S literal 0 HcmV?d00001 diff --git a/obj/User/util/hexdump.d b/obj/User/util/hexdump.d new file mode 100644 index 0000000..aca1310 --- /dev/null +++ b/obj/User/util/hexdump.d @@ -0,0 +1,3 @@ +User/util/hexdump.o: ../User/util/hexdump.c ../User/util/hexdump.h + +../User/util/hexdump.h: diff --git a/obj/User/util/hexdump.o b/obj/User/util/hexdump.o new file mode 100644 index 0000000000000000000000000000000000000000..c0c31d6504537dd237926fd29320294901117d90 GIT binary patch literal 22672 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 literal 0 HcmV?d00001 diff --git a/obj/User/util/subdir.mk b/obj/User/util/subdir.mk new file mode 100644 index 0000000..4838da3 --- /dev/null +++ b/obj/User/util/subdir.mk @@ -0,0 +1,29 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../User/util/hexdump.c + +C_DEPS += \ +./User/util/hexdump.d + +OBJS += \ +./User/util/hexdump.o + +DIR_OBJS += \ +./User/util/*.o \ + +DIR_DEPS += \ +./User/util/*.d \ + +DIR_EXPANDS += \ +./User/util/*.234r.expand \ + + +# Each subdirectory must supply rules for building sources it contributes +User/util/%.o: ../User/util/%.c + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Debug" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Core" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/User" -I"/home/bruno/mounriver-studio-projects/meshcorenortos/Peripheral/inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<" + diff --git a/obj/makefile b/obj/makefile new file mode 100644 index 0000000..8c38200 --- /dev/null +++ b/obj/makefile @@ -0,0 +1,84 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include User/util/subdir.mk +-include User/meshcore/packets/subdir.mk +-include User/meshcore/subdir.mk +-include User/lib/telemetry/subdir.mk +-include User/lib/rtc/subdir.mk +-include User/lib/monocypher/subdir.mk +-include User/lib/cifra/subdir.mk +-include User/lib/adc/subdir.mk +-include User/lib/subdir.mk +-include User/subdir.mk +-include Startup/subdir.mk +-include Peripheral/src/subdir.mk +-include Debug/subdir.mk +-include Core/subdir.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(S_DEPS)),) +-include $(S_DEPS) +endif +ifneq ($(strip $(S_UPPER_DEPS)),) +-include $(S_UPPER_DEPS) +endif +ifneq ($(strip $(ASM_DEPS)),) +-include $(ASM_DEPS) +endif +ifneq ($(strip $(ASM_UPPER_DEPS)),) +-include $(ASM_UPPER_DEPS) +endif +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables +SECONDARY_FLASH += \ +meshcorenortos.hex \ + +SECONDARY_LIST += \ +meshcorenortos.lst \ + +SECONDARY_SIZE += \ +meshcorenortos.siz \ + + +# All Target +all: + $(MAKE) --no-print-directory main-build + +main-build: meshcorenortos.elf secondary-outputs + +# Tool invocations +meshcorenortos.elf: $(OBJS) $(USER_OBJS_ESCAPE) + @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -T "/home/bruno/mounriver-studio-projects/meshcorenortos/Ld/Link.ld" -nostartfiles -Xlinker --gc-sections -Wl,-Map,"meshcorenortos.map" --specs=nano.specs --specs=nosys.specs -o "meshcorenortos.elf" $(OBJS) $(LIBS) +meshcorenortos.hex: meshcorenortos.elf + @ riscv-none-embed-objcopy -O ihex "meshcorenortos.elf" "meshcorenortos.hex" +meshcorenortos.lst: meshcorenortos.elf + @ riscv-none-embed-objdump --all-headers --demangle --disassemble -M xw "meshcorenortos.elf" > "meshcorenortos.lst" +meshcorenortos.siz: meshcorenortos.elf + riscv-none-embed-size --format=berkeley "meshcorenortos.elf" + +# Other Targets +clean: + -$(RM) $(DIR_OBJS) $(SECONDARY_FLASH)$(SECONDARY_LIST)$(SECONDARY_SIZE) meshcorenortos.elf + -$(RM) $(DIR_EXPANDS) $(CALLGRAPH_DOT) + -$(RM) $(DIR_DEPS) +secondary-outputs: $(SECONDARY_FLASH) $(SECONDARY_LIST) $(SECONDARY_SIZE) + +.PHONY: all clean dependents + +-include ../makefile.targets \ No newline at end of file diff --git a/obj/meshcorenortos.elf b/obj/meshcorenortos.elf new file mode 100755 index 0000000000000000000000000000000000000000..8081a25dccd039b0f914dc50bdccddc38724c48f GIT binary patch literal 694156 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 z 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�ygy5}HD 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

9IWEF1|u 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%0A>mW0#lo%Lx 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 literal 0 HcmV?d00001 diff --git a/obj/meshcorenortos.hex b/obj/meshcorenortos.hex new file mode 100644 index 0000000..ce08283 --- /dev/null +++ b/obj/meshcorenortos.hex @@ -0,0 +1,3657 @@ +:040000006F80F021FC +:100004000000000000000000E0760000E27600003E +:10001400000000001C8A0000000000000000000036 +:100024001C8A00001C8A0000000000000000000080 +:100034001C8A0000000000001C8A00000000000070 +:100044001C8A00001C8A00001C8A00001C8A000014 +:100054001C8A00001C8A00001C8A00001C8A000004 +:100064001C8A00001C8A00001C8A00001C8A0000F4 +:100074001C8A00001C8A00001C8A00001C8A0000E4 +:100084001C8A00001C8A00001C8A00001C8A0000D4 +:100094001C8A00001C8A00001C8A00001C8A0000C4 +:1000A4001C8A00001C8A00001C8A00001C8A0000B4 +:1000B4001C8A00001C8A00001C8A00001C8A0000A4 +:1000C4001C8A00001C8A00001C8A00001C8A000094 +:1000D4001C8A00001C8A00001C8A00001C8A000084 +:1000E4001C8A00001C8A00001C8A00001C8A000074 +:1000F4001C8A00001C8A00001C8A00001C8A000064 +:10010400000000001C8A00001C8A00001C8A0000F9 +:100114001C8A00001C8A00001C8A00001C8A000043 +:100124001C8A00001C8A00001C8A00001C8A000033 +:100134001C8A00001C8A00001C8A00001C8A000023 +:100144001C8A00001C8A00001C8A00001C8A000013 +:100154001C8A00001C8A00001C8A00001C8A000003 +:100164001C8A00001C8A00001C8A00001C8A0000F3 +:100174001C8A00001C8A00001C8A00001C8A0000E3 +:100184001C8A00001C8A00001C8A00001C8A0000D3 +:100194001C8A00001C8A00001C8A00001C8A0000C3 +:1001A400000000000000000000000000000000004B +:0C01B4000000000000000000000000003F +:1001C000397101436EC619A0397141536AC866CAB4 +:1001D00062CC5ECE19A0397101535AD056D252D496 +:1001E0004ED64AD826DA22DC06DE3301614082820E +:1001F00041114AC026C222C406C68282B24D4101C4 +:10020000024D924C224CB24B4101024B924A224A7F +:10021000B2494101024992442244B24041018280E4 +:100220003D432A876373C3029377F700BDEFADE5C3 +:10023000937606FF3D8ABA960CC34CC30CC74CC7D5 +:100240004107E36BD7FE11E28280B306C3408A0602 +:100250009702000096966780A6002307B700A306C2 +:10026000B7002306B700A305B7002305B700A30412 +:10027000B7002304B700A303B7002303B700A3020A +:10028000B7002302B700A301B7002301B700A30002 +:10029000B7002300B700828093F5F50F9396850091 +:1002A000D58D93960501D58D61B79396270097025A +:1002B000000096968682E78086FA9680C1171D8F89 +:1002C0003E96E374C3F8A5B73367B500FD530D8BB5 +:1002D00079E7B7877F7F9387F7F710419441B3722F +:1002E000F6003363F600BE92B3E262006395720CCF +:1002F0006318D6065041D441B372F6003363F6005A +:10030000BE92B3E262006396720A631BD604104584 +:100310009445B372F6003363F600BE92B3E2620016 +:10032000639F7208631ED6025045D445B372F6002F +:100330003363F600BE92B3E2620063987208631101 +:10034000D60210499449B372F6003363F600BE92A8 +:10035000B3E26200639172085105D105E30FD6F64E +:100360001317060193970601631CF7001357060144 +:1003700093D706013305F7409375F50F91E9828015 +:100380004183C1833305F7409375F50F91E1828076 +:100390001377F70F93F7F70F3305F740828010219B +:1003A0009421050585056313D60075FA3305D640FB +:1003B000828011059105E314D6FE01458280210556 +:1003C000A105E31ED6FC014582803105B105E31885 +:1003D000D6FC014582804105C105E312D6FC0145EA +:1003E0008280EFF2FFDD4111AE8A328901C9AA8510 +:1003F00037B500001305C545EF90E07CD6894A8AE1 +:10040000C14437BB0000B7BB000037BC0000B7ECED +:10041000000037BD0000138404FF63642401410120 +:10042000F1BBA2851305CB46EF90E07963742407F6 +:10043000B3878A008C2313054C47EF90C0780504DE +:10044000E39684FE13854C22EF90E0770144C14D82 +:1004500063088A02B38789008C232EC6EF90E04799 +:10046000B2452E958307150093F7770999E3930515 +:10047000E00213050D480504EF90E074E31AB4FDA3 +:1004800037E5000013058599EF90E073C104411A28 +:10049000C10951B71385CB47EF90E0724DB7EFF22A +:1004A0009FD332843689AA84330AB5008147930AE0 +:1004B000E6FF37BB0000638644019389270063E8A9 +:1004C000290163E127034A94A30F04FE39A894206D +:1004D00013064B488D4533853A01EF90D0188504BB +:1004E000CE87D1BF3E942300040005B3EFF25FD066 +:1004F00065713284AA842E891306401081456801F3 +:100500000533B54748102306F108EF6030174A86D7 +:10051000A6854810EF60101D13060002A285481042 +:10052000EF60501C4C004810EF60502E924768015D +:10053000BECD9147BECBEF1050765961E1B9EFF2D5 +:100540003FCB11712A849305C504130640020A8526 +:10055000EF90204024449305040B48101386C4F9FF +:10056000EF90203FB70500200A86938604FC938510 +:10057000053913050407EF30E021116161B98347A4 +:10058000F50A93F7070EB1E3EFF29FC611719304DA +:10059000C5042A84A685130640020A85EF90603BB5 +:1005A000032984049305040B48101306C9F9EF903E +:1005B000403A0A86930609FCA68513050407EF3026 +:1005C000A01E133515001161B1B101458280EFF213 +:1005D0009FC013351500370400206D7145051304C5 +:1005E000C43848861306000293054402A808EF9019 +:1005F0004036EF80904103474404AADC8546AA892F +:10060000930710086303D702894693072008630EF7 +:10061000D7008D46930730086309D70091469307AA +:1006200000086314D700930740083704002013051F +:10063000143D230EF10AEF901011AA842A86930527 +:10064000143D1305D10BEF90C03013895406680098 +:10065000CACAF53537B50000AC0813060002130509 +:10066000455D413337B50000EC181306000413054F +:10067000055E853B37B50000138614006C19130521 +:10068000C55E853337B50000CE851305455FEF9015 +:10069000805337B500009305143D13058560EF9036 +:1006A00080526800CACAA3080100EF10105F5161B0 +:1006B000A9BEEFF2FFB3AA8408211971EF60703D63 +:1006C0002A8401E9EF60D0381306800B81452A8423 +:1006D000813E93854407130600022285EF90602730 +:1006E00013060002A68513050402EF908026A68556 +:1006F0000A85EF50B02CB7050020130600028800D1 +:1007000093850539EF2050748C000810EF508070ED +:100710000A860C1013050404EF508072BC543CD0C0 +:10072000FC547CD083C75406BD8B2305F40AEF80AC +:10073000D02D9C502328A40A2326F40A0961D9BC91 +:10074000EFF21FAB834755062A849305450713979D +:100750008701618763460700B7B50000938585551B +:100760009D8B91461050638DD7048D46638FD704BF +:1007700089466381D706B7B60000938686586340E2 +:10078000070637B700001307C7590328C4063C54AF +:1007900037B500001305455AEF90E04237B5000029 +:1007A000A285130600021305455D253937B5000003 +:1007B00013060004930544021305055E1D3199BC20 +:1007C000B7B60000938646575DBFB7B60000938664 +:1007D000C65775B7B7B60000938686564DB737B77C +:1007E00000001307475955B7EFF2FF9E71712A8435 +:1007F00013064009814568082534344493074006B0 +:10080000B7BA000063E0D702B7B5000037B5000003 +:100810001386CA489385454913058549EF90A03A48 +:100820004D61E5B22285A13B1386CA4801EDB7B5FB +:10083000000037B50000938545491305C54CEF907E +:100840008038F9BFB7B5000037B500009385C54EB5 +:100850001305054FEF902037130AC404854713068C +:100860000002D28568082300F108EF90800E11463F +:100870009305C4066818EF90C00D13060004930595 +:1008800004078800EF90E00C8347040B930950069F +:10089000A300F10813F6070119C29309D00613FB50 +:1008A0000702CE8463040B009384290013F9070424 +:1008B000268763060900138724001377F70F344453 +:1008C00063FFE600B7B5000037B500001386CA48DD +:1008D0009385454913058551EF90E02E91B70DC2E0 +:1008E00011469305140B48013AC636C4EF906006D2 +:1008F00011469305540B2801EF90A0053247A246FC +:10090000630B0B00D29983C709002306F10883C744 +:100910001900A306F10863090900D2949C2023075B +:10092000F1089C30A307F108998E93F6F60FFD4766 +:1009300013F4F60F63F3D7007D442286B305EA0073 +:100940000809EF9000011C193E946808230004FE7A +:10095000C53B6808B93BE9B581476387B7003307F2 +:10096000F5000307070019E33E8582808507F5B788 +:1009700063050516EFF23F862A84AE89AA8537B54E +:10098000000013054575EF9000240C2037B50000DA +:1009900013054577EF90202337B50000130505793F +:1009A000EF906022854437BA000013091002B307A4 +:1009B00094008C2313054A7A8504EF90C020E398B5 +:1009C00024FF37E9000013058999EF90C01F2E30EE +:1009D00037B500001305C57AEF90E01E8345440249 +:1009E00037B500001305457CEF90E01D0347440236 +:1009F0008D47814463F7E70283476402034754024B +:100A000083458402A2075D8F83477402E20537B5F0 +:100A10000000C207D98FDD8D1305857EEF90A01AE7 +:100A20009144638C0904834744029386340063D65F +:100A3000F604138714001377F70FB3079400229777 +:100A400003C6570283475702138724001377F70F13 +:100A5000229783455702A207A296C205CD8F83C570 +:100A60005602D18F37B50000E2059104DD8D1305E4 +:100A7000C57F93F4F40FEF9000158347440263F2AF +:100A8000F404858F93F7F70F414793F5F70F6373DE +:100A9000F700C1451385540222957D3D9379F50FEA +:100AA00037C50000130545812694EF90C01181449D +:100AB00037BA000005046398990013058999EF90EF +:100AC00080106FF08FF48345440213050A488504B3 +:100AD000EF90600F93F4F40FF1BF8280EFF2AFEF6D +:100AE0008347C5046571AA849305D50413060002E3 +:100AF00013059101230CF100EF80B06583C7E40674 +:100B000003C7D40603459101A207D98F231DF10223 +:100B1000EF60207837B9000037BA0000631D051E6A +:100B2000EF6000731306800B81452A84EFF04FEFCE +:100B3000B7B50000938585612285EF90C03F13060D +:100B40000002930591012304040613050402EF80BB +:100B5000506093059101C809EF504066B705002029 +:100B6000D0099385053913050404EF50602D232027 +:100B70000406232204062305040AEF8000692328C3 +:100B8000A40A37B50000A286130689629305CA4EEF +:100B900013054563EF902003B4441307D103138674 +:100BA000D4069386F6FD9305000213050404EF10A6 +:100BB000904AB04437B500009305D1031306D6FD23 +:100BC0001376F60F13058569230EC102EFF07F81BE +:100BD0000347E1038347D103914922075D8F834790 +:100BE000F103C2075D8F83470104E207D98F2326F3 +:100BF000F40AB707002083C5073D8D476393F502CC +:100C00000347210483471104A14922075D8F8347CD +:100C10003104C2075D8F83474104E207D98F232A3D +:100C2000F40AF51593B51500280899338347C103D5 +:100C30003808B38737419389590293F7F70FBA9968 +:100C4000414793F5F70F6373F700C1454E8529338C +:100C5000937AF50F37B50000D6861306896293059F +:100C6000CA4E1305856AEF8010765686CE85280019 +:100C7000EF80304E5686938501762800EF80304B0A +:100C80004DE9854737B50000A286130689629305B2 +:100C9000CA4EA305F40A1305856CEF80D07237B5F0 +:100CA0000000A286130689629305CA4E1305C56F1C +:100CB000EF807071EF806055AACBEF90E005A30C38 +:100CC000010C230D010C8347B40AA30DF10C91C351 +:100CD0008D47230EF10C93578500230FF10C93578A +:100CE0000501A30FF10C8547A300F10EA547230CC6 +:100CF000F10C9C20A30EA10C61812300A10E898B15 +:100D000089E79385540022856523CC09228515291E +:100D100059616FF08FCF2A84B7B5000037B5000056 +:100D2000834691011306896293850566130545661E +:100D300095B5B7B5000037B50000A28613068962E5 +:100D40009385454913058572A5B7EFF26FCA6D719A +:100D50009307E0025C861C215A2103448502BD8B67 +:100D600093E707F9230CF1041C31231DE104A308C8 +:100D70000100A30CF1045C4113D70701E183A30E2A +:100D8000F104230EE104994719C8228693058500D2 +:100D90001305E105EF80F03B19049377F40F680029 +:100DA000BECAEF10806F51616FF0CFC6EFF24FC433 +:100DB0002A8437C5000013054586EF80D0600C20DB +:100DC00037C5000013050588EF80F05F0C3037C58C +:100DD000000013054589EF80105F4C4037C50000C7 +:100DE0001305C58AEF80305E0C4437C5000013053B +:100DF000458CEF80505D6FF0EFC1EFF26FBF2A843A +:100E000037C500001305C58DEF80F05B0C2037C59A +:100E100000001305858FEF80105B8305140037C534 +:100E2000000013058590EF80105A4C4037C5000034 +:100E300013058591EF8030590346840237C50000C1 +:100E4000930584001305C592EFF0AFD937E5000094 +:100E500013058599EF8030576FF0CFBBEFF24FB994 +:100E60008347C504930600085D7113F7070F6312EB +:100E7000D70A858B230CF1008347D5040357E5047B +:100E8000A30CF10083570505C207D98F38453ECE24 +:100E9000994763F9E7008357450503572505C207BE +:100EA000D98F3ED028081937B70500209385C5385B +:100EB0008347910103C745048583F98FA1CBF2468F +:100EC000930700021306000293854502681036D48A +:100ED00036C62302E1022306F104EF80902783D770 +:100EE0006197B24637C60000B7B5000037C50000AD +:100EF00013064682938505661305C582A302F10297 +:100F0000EF80704C481091354810C53D61616FF01D +:100F10006FB093060009E31BD7FEBD8B2302F102DD +:100F20008347D5040357E50413060002A302F10228 +:100F300083570505C207D98F3ED43C452147E917A1 +:100F400093F7F70F6363F7002146930525056810B3 +:100F50002306C104EF80F01F45BF03070500930778 +:100F6000D00205486314F70005057D5881472546E2 +:100F7000A94829A0B38717030505B69703070500FD +:100F8000930607FD93F5F60FE376B6FE9306E002AF +:100F90006314D7041306150085461D050147254334 +:100FA000A94883050600938505FD13FEF50F6378B8 +:100FB000C30337460F001306F623A9456343D60241 +:100FC0003307B702B386B602D5BF3307170305064A +:100FD0002E97B3861603F1B785460147D9BFE316AE +:100FE000A6FEB7460F0093860624B387D702BA97AA +:100FF000338507038280EFF20F9E6D71AA84AE895C +:10100000328981451306401068003684EFF04FA105 +:1010100083C7040283C584061307A105230CF104CA +:10102000B707002083C7073BB335B0008505B3E59C +:1010300035014C86A30CF104A2863C004A86930538 +:10104000000213850404EF1060772247B7C900003F +:1010500037B9000037C50000A286138649F893050A +:101060000966130585F9EF801036224493858406BE +:1010700013061004090413051101A2CAEF80700DB4 +:1010800037C500002286AC08130505FCEFF06FB5EC +:101090006800EF10804037C50000138649F89305BB +:1010A0000966130505FDEF80103251616FF0EF9571 +:1010B000EFF20F946D7115E137C60000B7B500006F +:1010C00037C50000130646F893854549130585FF8B +:1010D000EF80702F51616FF0EF938327050B2A8902 +:1010E00091EF37C60000B7B5000037C50000130602 +:1010F00046F89385454913050501D9BFAE84990586 +:101100002E852EC6EF8030649C40D8301374F50FC6 +:101110003EC8DC20B2450D8B130614008A07D98F18 +:101120001376F60F13055101230AF100EF807002C8 +:101130009306640093F6F60F1008A1454A85653DB5 +:1011400051BFEFF2EF8AC0219C411171AA8422861F +:10115000950548003EC0EF80C07F930644000A8694 +:1011600093F6F60F91452685793511616FF08F8AD8 +:10117000EFF26F8680211171AE8922862A8985055A +:10118000130511004080EF80C07C03C6290493073B +:10119000140093F7F70F93042400180293F4F40F4C +:1011A000BA9705C603C7190493853904330591001E +:1011B0002380E7F0EF80E0790A86A6869305000297 +:1011C0004A85153D11616FF04F847D572380E7F00C +:1011D000EF80A0031C02BE9493073400180293F71B +:1011E000F70F2380A4F0BA97135785002380E7F008 +:1011F00093074400180293F7F70FBA97930464001B +:101200001357050115042380E7F01374F40F1C0233 +:101210003E94618193F4F40F2300A4F071BFEFE2D8 +:101220003FFD2A8437C50000130505BBEF80B019C8 +:101230000C4037C500001305C5BBEF80D0184C200B +:1012400037C50000130505BDEF80F01737C5000056 +:10125000130505BEEF803017503037C500009305E9 +:1012600064001305C5BEEFF0CF976FE0BFFAEFE261 +:101270003FF82A8437C50000130545BFEF80B0143E +:101280000C4037C50000130505C0EF80D01337C5EB +:101290000000130505BEEF801013502037C5000075 +:1012A000930554001305C5BEEFF0AF936FE09FF6B2 +:1012B000EFE21FF4902111712A84FD578505130573 +:1012C0009100A304F104508423050104EF806068B9 +:1012D0002C002285713D11616FE0DFF3EFE2BFEF7B +:1012E00031712A842E89EF70507285477C842AC21E +:1012F000230501009307000203070400630DF704B0 +:101300002285EF80504491479304A10063F0A70227 +:10131000030724009307C007631AF700A2852685F8 +:101320000D46EF8000630D049304D100B7C50000A3 +:10133000938545C42285EFE03FF905E1B707EFBE8D +:1013400037E700E0938707083CC74C004A858D3398 +:1013500029616FE09FEB050445B7B7C50000938591 +:10136000C5C42285EFE05FF601ED0545EFF02FA63D +:10137000B7C50000938545C52685EF80D03BF1B702 +:10138000B7C50000938585C62285EFE0FFF309ED20 +:101390008145130640031385C194EFE07FE8B7C58C +:1013A0000000938545C7C9BFB7E5000093858596C2 +:1013B0002285EFE07FF10DE1B7C6000037C60000DF +:1013C000B7C50000938686C8130646C9938505CB2A +:1013D0002685EF80103095BFB7C50000938505CCFA +:1013E0002285EFE07FEE11E5B7C50000938585CC3F +:1013F00061B7B7C50000938585CD2285EFE0DFECAE +:1014000015E5EF10006703C60198938501989431A4 +:10141000B821FC3103C8650083D84500B7C500007A +:10142000938585CF2685EF80D02A05B7B7C5000004 +:10143000938505CE2285EFE03FE921E513055400B1 +:10144000EF80C0482A84EF70505C63778502228564 +:10145000EF705061EF10E06103C601989385019829 +:101460009431B821FC3103C8650083D84500B7C565 +:101470000000938585CE7DB7B7C50000938585D1E3 +:10148000E5BDB7C500009385C5D32285EFE0DFE356 +:1014900011EDEF70905792476375F50013851700B3 +:1014A00045BFB7C50000938585D4F9B5B7C5000021 +:1014B000938585D62285EFE03FE115E19305940001 +:1014C000414613850176EF803029B7C500001386A9 +:1014D0000176938545D72685EF80B01FBDB5B7C58A +:1014E0000000938585D82285EFE01FDE631905147F +:1014F0001104B7C500003946938505D92285EF80D0 +:10150000004301E913860177B7C50000938505DA2A +:10151000D9B7B7C500001146938585DA2285EF80DB +:10152000004111E5370600201306163DF1BFB7C58F +:1015300000001946938505DB2285EF80403F15E1C9 +:10154000B71700209387C73883C747DE91E737C6B0 +:101550000000130606C14DBF37C600001306C6C003 +:1015600065B7B7C500000D46938585DB2285EF8002 +:10157000003C11E9B707002003A6473FB7C50000AC +:101580009385C5DB89BFB7C500000D46938545DC53 +:101590002285EF80C03911E5B707002003A6873FF9 +:1015A000F1BFB7C500002946938585DC2285EF8011 +:1015B00000380DE5B7C50000938545DD2685EF8031 +:1015C00090173705002093066004138624009305C6 +:1015D00000021305053BEFE09FEC85BBB7C500009B +:1015E0001146938585DD2285EF80603409E9B707D0 +:1015F000002003C5073DEF5010742A8631B7B7C5E8 +:1016000000003946938505DE2285EF80403215E1E2 +:10161000B71700209387C73803D667DEB7C5000029 +:101620009307803EB376F602938505DF3356F602C4 +:1016300045B3B7C500002286938585DF69BDB7C570 +:101640000000938505E02285EFE01FC863140516AE +:1016500093094400B7C500004146938585E04E8557 +:10166000EF80E02C21E95104B7C5000009469385BD +:10167000C5C02285EF80A02B09EDB7170020938706 +:10168000C7380547A382E7DEB7C500009385C5E1EB +:10169000E5B1B7C500000D46938505C12285EF80F1 +:1016A0000029E31405CAB71700209387C738A3821F +:1016B00007DED9BFB7C500003D46938505E24E85DC +:1016C000EF80E02609E9414693053401138501774F +:1016D000EF80900855BFB7C500001546938505E318 +:1016E0004E85EF80C02411E9370500201306000263 +:1016F000930594001305153DE1BFB7C500001D46D5 +:10170000938585E34E85EF80802239E92D04B7C5A6 +:1017100000000D46938505C12285B7190020EF8092 +:1017200000219389C93801E9238209DEB7C5000089 +:101730009385C5C291B1B7C5000009469385C5C060 +:101740002285EF80C01E09E985472382F9DEB7C5EF +:101750000000938545C10DB183C749DEEDFBF9B7A4 +:10176000B7C500001146938505E44E85EF80201C27 +:1017700011E913058400EFF04FFEB707002023AAFC +:10178000A73E19B7B7C500001146938585E44E857D +:10179000EF80E01911E913058400EFF00FFCB707A3 +:1017A000002023ACA73ECDB5B7C500004E8693857B +:1017B00005E515B3B7C50000938545E62285EFE042 +:1017C000BFB005E11386C194B7C500008328460267 +:1017D000032806025C4E184E5446938545E7104692 +:1017E00091B1B7C50000938545EC2285EFE0DFADF0 +:1017F0001DE51386C1948316A6021147032806032C +:1018000033C7E6021C4A8316660003164600B7C5B6 +:101810000000938505ED2685EF80A06B3DB6B7C52A +:101820000000938585F22285EFE01FAA0DE9EF7095 +:10183000D01D83A7C1811384C1941D8D48C823285E +:101840000400EF5030193E201A345448B7C5000048 +:101850002A86938545F32685EF80A067FDB4B7C53A +:101860000000938545F709BEEFE2FF962A8437C54D +:1018700000002171130505B3EF80E0348345940B1C +:1018800037C50000130505BDEF80E0330C2037C5D8 +:101890000000130545B4EF8000330C3037C500005D +:1018A000130505B6EF8020322E2037C50000130542 +:1018B00085B7EF8040314C2037C50000130505A2E5 +:1018C000EF806030502037C50000930554001305A9 +:1018D00045BAEFE01FB137E5000013058599EF80A9 +:1018E000802E8347940B130700026394E70844306B +:1018F000930700042304910C63F3970237C600009A +:10190000B7B5000037C50000130646F89385454972 +:10191000130545A3EF80202B39616FE01F8F2686CA +:10192000930564001305910CEF80A00293852400B9 +:101930008504502093F4F40FA294DC3093F5F50F56 +:101940000D8E95051376F60FA2951305B110A3041D +:10195000F1102305C110EF70D07F8327440C9C2326 +:10196000898BDDFB8325040C0325C40BEFF05F940A +:1019700065B7639C072078205C309305A40022079C +:101980005D8F7C3013052101C2075D8F1C24E207A7 +:10199000D98F0327C40B3EC62326F70A50201C34D8 +:1019A0006D161376F60F2308F100A308C100EF703F +:1019B000507A6800EFF0BF868327440C9C23898B04 +:1019C00099E78325040C0325C40BEFF07F8E834732 +:1019D00001018549638C37170D47E39FE7F2B24752 +:1019E0000327C40B13097006BEC52326F70A930705 +:1019F00020102316F10C2307210DEF50E07A8347C6 +:101A0000C10C9803935685403E97A306D7F01387E1 +:101A1000170094031377F70F3697A306A7F01387E1 +:101A200027001377F70F3697A30637F11387370090 +:101A30001377F70F369793054007A306B7F083D6C1 +:101A4000C19429479003B3D6E60213874700137762 +:101A5000F70F3297AA841396060141862186A306C2 +:101A6000C7F01387570090031377F70F3297A30639 +:101A7000D7F0138767001377F70FB28632970946BE +:101A8000A306C7F0138777001377F70F3697A306DF +:101A9000B7F0138787001377F70F36979D46A30695 +:101AA000D7F01387A700938697008C031377F70F5F +:101AB00093F6F60FAE962306E10C930550FBA38632 +:101AC000B6F08326C40B83C6B60AA5C69403369720 +:101AD000A306C7F01387B7001377F70F3697A3064F +:101AE00027F11387C7001377F70F3697ED46A30644 +:101AF000D7F01387E700B5071377F70F940393F731 +:101B0000F70F2306E10CB697F946A386D7F0B7077F +:101B100000209387C738B40115073697F057B45B98 +:101B2000AC570545EF50E06E8347C10CAD07230667 +:101B3000F10C0325C40BAC01EFF0AFE037C500009A +:101B4000A685130505A5EF800008F9B3EF70E06BDB +:101B5000AAC5EF70806B83A7C1811387C1941D8DC7 +:101B600048CB130640039385C1941305D10C232859 +:101B70000700EF70105E0325C40B93074003AC0110 +:101B80002306F10CEFF0EFDB41BB1147639DE70249 +:101B900078205C30502022075D8F7C3071161376E0 +:101BA000F60FC2075D8F1C24930594001305D10C1A +:101BB000E207D98FBEC52306C10CEF709059A8016A +:101BC000EFF0EFEA91BB2147E398E7D478205C304F +:101BD0008324C40B22075D8F7C309305A40013057A +:101BE000E10CC2075D8F1C24E207D98FBEC523A676 +:101BF000F40A1C34502013F737006D16898323062E +:101C0000F10CA306E10CEF70D0548327440C9C2305 +:101C1000898B91E78325040C2685EFF06FE98346D5 +:101C2000C10C85476383F6049DC28947638AF60425 +:101C300037C60000B7B5000037C50000130646F8E8 +:101C4000938545491305C5B0EF70F077F1B1AE4605 +:101C50000346D10C8325C40B37C500001307E10CE4 +:101C6000130545A8EF70307645B98325C40B83C7AB +:101C7000B50AE38307CA1305E10CEFF02FE669B953 +:101C80008357E10C68007C868357010D7C87EF50F9 +:101C9000C0632E478346D10C8325C40B2A8637C5E3 +:101CA00000009307210D1305C5ABEF70D071ADB1E6 +:101CB000EFE26FD255712A841306C00B814568008C +:101CC000EFE00FD6930754007844BEC51C203AC4F9 +:101CD0003707002093F7C703A300F10C0347073B26 +:101CE0008347C404A2C78346D4046312F70437C9E8 +:101CF0000000B7B9000037C50000130649F8938506 +:101D0000C94E13058593EF70106C8884EF506058AE +:101D1000AAC3AA8405E1B7B5000037C500001306C1 +:101D200049F8938545491305C596EF70D0696961F7 +:101D30006FE0AFCDEF70604DB70700209387075D70 +:101D4000B387F440B736BDE98D879386767AB3863C +:101D5000D70223A8A40A37C50000130649F89385C3 +:101D6000C94E13058598EF70106634441307D100EF +:101D70001306E404F9169305000213850404EF002A +:101D8000902D05CDB7B5000037C50000A686130617 +:101D900049F8938545491305C59AEF70D06283458C +:101DA000110C37C500001305C5A0EF70D0611C866B +:101DB000BDDF2800EFF05FAB9DBF384437C50000A2 +:101DC000130649F879171377F70F9385C94EA6863E +:101DD0001305C59D5886EF70105F13052101EF8034 +:101DE0008016930555001386040293F5F50F13052D +:101DF000D100EFE0AFEF65B7EFE2EFBD457103490A +:101E00001500AA84EF706040130780033307E902CE +:101E1000D547370400202306F10C9307C438938577 +:101E200094002ACCAA892E852EC6BA9783C7470B61 +:101E3000A308010C230E0100230CF110EF80A01069 +:101E4000130755009307400B1304C438B24593049D +:101E5000F00A63E3E700AA8426861305D101EF7038 +:101E6000502F950437C5000026862C081305450D14 +:101E7000EFE02FD7930780033309F902130791117D +:101E800030085C08A686C14502CA1305490A229596 +:101E9000EF00D012D2474A94E8018507232C340B77 +:101EA000232AF110DD2B79616FE02FB6EFE24FB4FA +:101EB00055712E84B7050020AA849385153D13051E +:101EC0001101EF804007B7C5000093850582130517 +:101ED0001101EF806004A68513051101EF80C00396 +:101EE0002800C084113F69616FE0CFB2EFE2AFAE6E +:101EF00009712A841306800C81452819EFE04FB23E +:101F00001C20514793F7C7036383E70237C60000DD +:101F1000B7B5000037C50000130646039385454951 +:101F200013054504EF70304A19616FE00FAE834727 +:101F3000C4048144130BD404230CF10AB7CA000073 +:101F400037BA0000B7C900000345810BA685EF50E2 +:101F5000803B2A8915E18346810B37C60000B7B55F +:101F6000000037C500001306460393854549130555 +:101F70000506EF7050454DBF34440A875A86FD165A +:101F8000C14513050502EF00100D19CD8346810BE5 +:101F900013864A0393054A49138589088504EF701F +:101FA000904293F4F40F4DB78247304493055100AB +:101FB0003EDF7D161C821376F60F6D161305110C8D +:101FC0002300F10CEF70F018EF702024232AA902EF +:101FD00037C500001306110CCA851305450BEF70B9 +:101FE000903E99B7EFE2CFA02A84412C1420B7C4C9 +:101FF000000093F7060C91CFB7B5000037C500007D +:1020000099821386040E938545491305C50EEF701A +:10201000903B9386C194904618209387C1941305F2 +:10202000160088C6937627009375C703CDE69453B0 +:10203000850694D3F1466393D5022285EFE01FAA6B +:10204000B7B5000037C500001386040E93850566FA +:1020500013058513EF7030376FE0CF9B93060002B6 +:102060006388D5001377870301C72147639CE50088 +:1020700037C5000013054512EF70F0342285EFF0EC +:102080003FC37DBF3147E38DE5FA41476396E500E5 +:102090002285EFE06FF56DB71387C5FE1377870FC5 +:1020A00001E72285A13569BF1387C5FD1377870F27 +:1020B00041DB1307C002639AE5005C3081E72285AB +:1020C000EFE0DFD9FD571CA0A5BF1307C003E389CC +:1020D000E5F690C7B5B7D4538506D4D3A1BFEFE2D8 +:1020E000AF8E4111AA842E843289B689EF60806C4C +:1020F0000989630205181305F03FEF60A03413054A +:10210000B1009305A10023050100A3050100EF60C4 +:10211000406C9C850145638107104E86CA852285E7 +:10212000EF60E03C1306401081452685EFE04F8FBD +:10213000B7C5000005650546938545291305853813 +:10214000EF503028F9475C861C8537150140014661 +:10215000C14513050580B16ADC86230701000149EA +:10216000EF6010560144014A814C8149114C938A19 +:102170004A15130B00041C08CA9703CDC7FF8D4BEB +:1021800031A08947130DF00FE3F727FF8945373555 +:102190000140EF70001E7DD9EA8537350140EF70B0 +:1021A000C01C854537350140EF70A01C7DD93735FF +:1021B0000140EF70C01B894763F327031375F50FC8 +:1021C000636F8C0093172400D6979C43828788A066 +:1021D0000D890544630575013334A00005049C8511 +:1021E00005094209135909018D07E36CF9F8371500 +:1021F00001400546C1451305058023A43405EF6061 +:10220000304CB7C50000056501469385852A130546 +:102210008538EF50101B888541016FD07FFE9307F2 +:102220001A00269AA300AA0013FAF70FE3F94BFB52 +:10223000094475B7C8B06377AB00A38264010D444D +:10224000814C71BF814C65FD114451BF13871C0047 +:10225000A69C2383AC00DC30937CF70FE3E1FCF811 +:10226000E5B793871900A6992386A90493990701D6 +:1022700093D90901ADB7014545B7EFD27FF71C21CE +:10228000094741118D8B2A84638BE70A0D47638DC3 +:10229000E70A05476380E70A37C500001305852B69 +:1022A000EF70701237C500001305C52EEF70B01126 +:1022B0001C20614793F7C7036389E7126369F70A34 +:1022C00021476385E7106366F708EDC71147638A06 +:1022D000E70E1C2037C500006C0099839387070325 +:1022E000130545385C86A3060100EF70D00D1C2055 +:1022F0000D478D8B6383E70099EB035634008355BC +:10230000140037C500001305053AEF70D00B4C30B0 +:1023100037C500001305853BEF70F00A814437C9CB +:1023200000005C3063ECF40E2945EF70F00D4101C4 +:102330006FD05FEE37C500001305852C95B737C504 +:1023400000001305052DA9BF37C500001305852D15 +:1023500081BF41476381E70851476383E7083147FD +:10236000E399E7F637C500001305453281A8130746 +:1023700040026386E708636EF7007147638CE706E7 +:1023800013070002E397E7F437C500001305C535CE +:1023900035A01307C0026389E7061307C003638AE9 +:1023A000E70613078002E396E7F237C5000013053E +:1023B000C53629A037C5000013050530EF70B00001 +:1023C00009BF37C5000013058530CDBF37C50000F4 +:1023D00013054531E5B737C500001305C5C4F9BF7E +:1023E00037C5000013054533D1BF37C500001305BD +:1023F0000534E9B737C500001305C534C1B737C583 +:102400000000130545365DBF37C50000130585374D +:1024100075B737C50000130505384DB7B3079400ED +:10242000F023A6851305093D8504EF70C07993F468 +:10243000F40FC5BDEFD2DFDB59712A842800AE84CA +:10244000EF40D02330449305C4042800EF40902986 +:102450002800A685EF40903B65616FD0BFDBEFD2CF +:102460003FD913848181042093071002B387F402BB +:1024700093844184BE94A685753F85472380F402EA +:102480001C201D47850793F7F70F6365F7001CA015 +:102490006FD05FD823000400E5BFEFD27FD20111D7 +:1024A000AA84753F9C200D4719448D8B6384E700F7 +:1024B00091C30944D830BC44BA973E944204418049 +:1024C0009307F00F63F1870237C60000B7C500001D +:1024D00037C50000A2861306C61793858518130515 +:1024E000C518EF70406E8387F182639507128547A8 +:1024F000A387F18293878182B82311E3A0B31946A1 +:10250000938581821305C008EF5090271305F03F93 +:10251000EF505073B7C50000056505469385051B50 +:1025200013058538EF50E06937150140B94701467A +:10253000C14513050580FC86EF60901893072400C1 +:10254000316C8149814A0149014D814B014A3EC4A8 +:10255000914D130C8C168D4CA24763C5F90C3715A1 +:1025600001400546C14513050580EF60701585697A +:10257000B7C5000001469385451C13858938EF5087 +:10258000406403C80400D830B44437C90000B7B46D +:10259000000037C50000A2871306C917938504669B +:1025A0001305451DEF70206237C500002287D286D3 +:1025B0001306C9179385046613058521EF70A06083 +:1025C000138589BBEF60800D37C500001306C9175E +:1025D0009385046613058524EF70E05EEF60801D2F +:1025E0002A8437CA000093771420638B070E37C5FF +:1025F00000001306C917938504661305C527EF70FD +:10260000805C370500017D150588A3870182EF50A6 +:10261000F07311E483A70183850723A8F182056184 +:102620006FD0DFBD854763E437051C103387370162 +:102630000347C7FF8945373501403AC6EF607053FD +:1026400032476DD9BA8537350140050AEF60F05140 +:10265000854537350140EF60D0517DD98509373543 +:102660000140C209EF60B05093D90901F5B51307D5 +:10267000F00FE3E1ADFD13172D00629718430287B9 +:1026800098209377370063849701094D91E3054DB6 +:10269000014A4DB793861A00A69A03C71A0093FA07 +:1026A000F60FE3F95CF9094D71B7D83001490D4DCA +:1026B00051F3114D41B7D430130619002699034741 +:1026C00069001379F60FE367D9F6E5B793861B0027 +:1026D000A69B03C7CB04939B060193DB0B0199BF19 +:1026E0002945EF605058EF60E00C8387E1822A842F +:1026F000E38B07EEAA861306C917938504661305B4 +:102700004A26EF70404CC5B5EFD2FFAC01118A8567 +:102710002A84EFF03FD283C48181930710022149BC +:10272000B387F40293844184BE9483C9040263890D +:102730000900130600028A852685EF70401F05C137 +:102740007D191379F90FE31409FE1C2013F7170004 +:102750001DCB1307F00F6397E70044308DE8056148 +:102760006FD0BFAA5C301307E003636EF7001387D6 +:10277000170058B0370700200347073BA297228570 +:10278000F8A3EFF09FD11C208D8BF1DBF9B7B707D1 +:102790000020782083C7073BE313F7FCFD1493F474 +:1027A000F40F44B026869305740013056400EF709F +:1027B0006025D5D42285EFF05FCE55B7D9CA5D71BB +:1027C000A6C29384F60086C6A2C4CAC080084EDEA4 +:1027D00052DC56DA5AD85ED6C198330191402A8A23 +:1027E000B28B2E8B268681450A85BE8A3A89B689A8 +:1027F000EFD01FA34E86DE850A85EF708015930902 +:1028000029004E87A6860A86C1455285EF400003FF +:10281000130704FBA6864E86DA855285EF402040DA +:10282000834704FB890401452300F900834714FB17 +:10283000A300F90023A09A00130104FBB64026442C +:1028400096440649F259625AD25A425BB25B6161C0 +:1028500082807D55828009486376D804EFD2BF9785 +:102860001384E6FF9376F4000111130A260089C64B +:10287000795505616FD07F99B284BA8952860A87EB +:10288000A2862A89EF40A03909468A852685EF70FD +:10289000000A79FD4E87A2865286C1454A85EF30EF +:1028A000307EC1BF7D558280EFD29F94411102C41A +:1028B000CD475C84280085473EC6EF6060614101DA +:1028C0006FD05F959377350099EF13074006337704 +:1028D000E502854719E7930700193375F502933729 +:1028E00015003E8582808147EDBF1308E5844208CC +:1028F000135808019308100863E5080DEFD25F8CA8 +:10290000373CE101B78CE2013E8B3A84B68A3289CA +:10291000AE89AA8B8144130A207B130C0C38938C4C +:102920000C5063964B07FD19B16C556C014A93F935 +:10293000F90F938C4C3E130C0C18854D131D0A0196 +:10294000135D0D0163603D071307C0038566330403 +:10295000E402938606E15566130606187D1985453F +:1029600037050018B38ADA025A943309C90256941B +:10297000EF60C07C0545EF60605B4A942694228539 +:10298000EF60500EEF60B01301456FD03F87528566 +:10299000153F19C5E694050A420A135A0A0151B7B0 +:1029A000E294D5BFB3874C019C235E85B387870330 +:1029B000BE94EFF03FF101C56313BD01E294050A37 +:1029C000B5BF05458280EFD2BF82B1679387073FCD +:1029D00081459306A004130650071305E00631470E +:1029E0000388070085056318D8020388170063145D +:1029F000C802038827006310A80293F5F50F930718 +:102A0000800313078002D94665461305A07EEFF0C8 +:102A1000DFED6FD03F8093F5F50F8D07E392E5FC76 +:102A20008145F1BF13074006B377E5023355E50250 +:102A30004D471375F50F6374A7009387470613D5A9 +:102A400027003E951D473375E5023167130787411F +:102A50002E970347F7FF8D8B3A962A9699E7894779 +:102A600063E5B7007D16420641821D453375A60217 +:102A70008280EFD26FF55564EF602079130404185B +:102A800033548502938701829A23AA8463058704BD +:102A900082A39309207B1309C016130AD016636022 +:102AA000890893870198B16A2392370113890198A5 +:102AB00081496D4B938A4A3E854B714C138A1900AC +:102AC000636F8B06137AFA0F05042303490113740D +:102AD000F40FA3038900D56793870718B3F4F402B2 +:102AE0008567938707E11384019833D7F402B3F421 +:102AF000F4021377F70F18A01307C003B3D7E4024B +:102B0000B3F4E40293F7F70F1CB024A04A206C2022 +:102B10007030EFF03FF108A401456FD06FEE4E85A5 +:102B2000EFF05FDA11C9E30E44F7130424E98509D5 +:102B3000C20993D90901A5B7130434E9CDBF0355E0 +:102B40004900EFF03FD819C9639A7901E30C84F783 +:102B50000D1493190A0193D909018DB7D69983C72A +:102B60000900E361F4F61D8CEDB7EFD26FE88545FF +:102B700037050018EF60805C0545EF60203B094594 +:102B8000EF6060780545EF600078EF6060230545F1 +:102B9000EF60403C01449304A00F13051004EF6064 +:102BA000A05F09ED6315940005456FD0AFE60504FD +:102BB00051451374F40FEF60100BC5B79307A00FC6 +:102BC0000545E304F4FE13050010EF60203B0545C6 +:102BD000EF60803BEF60A06EEF60606F8145054560 +:102BE000EF60605E81450945EF60E05D814511451C +:102BF000EF60605DEF60A06CEF60805E21657D1529 +:102C0000EF600069EF60A06BEFF0FFDBEF60605EEC +:102C1000A9659385151A1145EF60801BEFF0DFC899 +:102C2000EFF03FE5014551B781466393C6008280CE +:102C30009C21983183C82500E2074207D98FA2085A +:102C4000B3E7170183C84500F83103C33500E20834 +:102C50003367170183C85500139836002A98C208B5 +:102C60003367170183C86500B3E767002322F800C4 +:102C7000A208336717012320E8008506A10575B770 +:102C80001C411971A2DE3EC25C41A6DCCADA3ED408 +:102C90001C45D2D6E6CC3EC45C45EEC8CED83ED666 +:102CA0001C49D6D4DAD23EC65C49DED0E2CE3ED84C +:102CB0001C4DEACAB1633EC85C4D130905043EDAF7 +:102CC0001C513ECA5C513EDC1C55E256C24D3ECC06 +:102CD0005C55624F525A3EDE1C59F254B2483ECE09 +:102CE0005C59F24EC25FBEC01C5D064422433ED01A +:102CF0005C5D025EB252BEC2938783423EC09307C0 +:102D00000504BEC69307050CBEC4964CD2471247B5 +:102D100022569383834283AA030083250900032854 +:102D2000490083A94300D695B3BA5501C299CE9AFA +:102D3000139B260193D9E700336C3B0113D8E600BF +:102D400093992701B3EB0901139BE60093D927015F +:102D500033683B0113DB26019399E700B3E969016E +:102D6000B3C93B01334B0C0193DB970013987601F9 +:102D7000B3EB0B01139C770113D8960033688801DD +:102D8000334B0B01B3C979012E9BB335BB00CE9AEF +:102D900093CBF7FFAE9A93C9F6FFB3F5E701B3FB08 +:102DA000DB0133F89600B3CBBB00B3F98900DA9BA3 +:102DB000B3C90901D69933BB6B015E9E4E9BB33BF1 +:102DC0007E01DA9C9315E601935A26001318E70159 +:102DD00093592700DE9CB3E9B900B3EB0A019315C0 +:102DE00046001358C701B3E50501935AC6011318ED +:102DF00047003368580133C80901B3CABB0093596F +:102E0000770093159601B3E9B900131B9701935509 +:102E10007600B3E56501334B1301B3C5BA00B3497E +:102E20003801337BEB00B3CAF20133781301B3FBF3 +:102E3000F20133480B01B3FACA00B3CA7A012E98E3 +:102E4000B335B800CE9AB38B5501330CBE017298DE +:102E5000669A333BCC01DE9C333EC801B3059E012C +:102E60002ED22E8DA645529B2109E289DA8AC28B89 +:102E7000A103C68D7E8A768EA28C639B2537024B7A +:102E8000B643F68C228CFA8E26843E8FB68446D2C8 +:102E9000FEC49A88968F3A83B282CE87D6865E87A2 +:102EA0006A86795A9375FA00A1058E05AA9503A939 +:102EB0000500CC41A10313583901939BD500B3EB16 +:102EC0000B01931AD90013D83501B3EA0A019359BB +:102ED000D90113983500131E3900B3E9090113D83D +:102EE000D5013368C801B3C93A0113596900939AEF +:102EF000A50133C80B0133E92A013349280103A88E +:102F000083FF03AEC3FF99814A98B3C9B90033392F +:102F10002801F299330E390113093AFF1379F900A8 +:102F200021090E0923AC03FF23AEC3FF2A9983298D +:102F3000490083250900210B139DF90113D91500C0 +:102F4000336D2D01939BF50113D91900B3EB2B01C0 +:102F5000939A890113D9850093DD8900B3EA2A0188 +:102F6000139985013369B90133C92B019D81939B65 +:102F70009901B3E5BB00B34A5D01B3CABA0093D966 +:102F800079009305BAFF569833493901BD89729982 +:102F9000B33A5801A105CA9A8E0523AC03FF23AEAC +:102FA00053FFAA9503A90500CC41939927014299A3 +:102FB000AE9A33380901569893D5E700939A2601C3 +:102FC00013DEE60033EDBA00B3EBC90193D5270158 +:102FD0009399E70093DA2601139EE600336EBE0054 +:102FE000B3E55901B3C9BB00B34ACD0193D59700EE +:102FF000139E7601B3E5C501939B770113DE96001E +:1030000013CDF7FFB3C5B900336E7E01337DDD010B +:1030100093CBF6FFB3F9E70133CECA01B3FB8B00C4 +:10302000B3493D01B3FA960023AC23FF23AE03FF5F +:10303000F299B3CA5B01AE9A33BEC901832D8B07E7 +:10304000569E832ACB07CE9DB3B93D01569E6E99FD +:10305000F299C299B33DB901CE9D9355C701931919 +:103060004600B3EBB9001358C60193154700B3EA05 +:103070000501135E26001318E601131DE7019355A1 +:103080002700B369AE01B3E50501135E770013189D +:103090009601B3C5BA00336E0E01931A9701135807 +:1030A0007600CA9CB3C93B0133685801B34A130187 +:1030B00033B92C0133C8090133CEC501E29DB3FAFF +:1030C000EA00B3C9F201B3751301330CB901B3C5FA +:1030D000BA0033F9F201B3F9C900B3C92901C295A5 +:1030E00033B80501F299330938011258E695050AFB +:1030F000338E0C012648B33D9E01B3BC9501629806 +:103100004A9CC29D46D233888C01FEC43949F2895B +:10311000EE8AAE8B428DF68C228C63182A0F824386 +:10312000938303081EC00249B16393838362E398CB +:1031300023D5924322599E95B3B375004A981E98A1 +:103140000CC1A2452322050132582E97B335B70092 +:1031500042962E9618C5324750C542563A93333799 +:10316000E300B292BA924247525623286500BA98B9 +:1031700033B7E800B29FBA9F52476256232A5500E0 +:103180003A9E3337EE00B29DBA9D624772562322B3 +:10319000B503BA9733B7E7001CD5B296F247BA9693 +:1031A00006473E9FB337FF00BA94BE948257164736 +:1031B00044D9BE9EB3B7FE003A943E94232C150129 +:1031C000232EF5012320C50354D52328E503232C02 +:1031D000D50340DD7654E6545659C659365AA65A98 +:1031E000165B865B764CE64C564DC64D0961828077 +:1031F000FA8E26843E8FB6849A88968F3A83B2825E +:10320000E287DA864287125639B6FA8E26843E8FD6 +:10321000B6849A88968F3A83B282F287EE862E879A +:10322000428649B1EFC2DFFC0326050DE157137456 +:1032300086FF1D8A3306F6022A942E8581451306E1 +:103240008603EF60E02B3C405D8D7C4028C0DD8D27 +:103250006CC06FC03FFCEFC21FF88329050D2A84A4 +:103260002E8993F77900B28485C3B309304193F96D +:10327000790063733601B289014AB30749016314C7 +:103280003A0D3E89B38444418327040D13F7F707B1 +:1032900005CF3307F0401377F70793D9340063E481 +:1032A000E40093593700E19B130504044E86CA8558 +:1032B0003E95EFF07F978327040D8E094E99CE97A8 +:1032C0002328F40CB38434410327040D930700082A +:1032D0006311F7068327840C8326C40C13870740E9 +:1032E000B337F700B6972324E40C2326F40C95E3B8 +:1032F0009307F03F63EFE7008327040C8326440C19 +:1033000013871700B337F700B6972320E40C232266 +:10331000F40C2285EFF0DF96930704042328040CB5 +:103320001307040C0146814690C3D4C3A107E31BD5 +:10333000F7FE93F904F8CA99130A0404930AF03FBC +:10334000130B040CADA88C232285050AEFF09FED2A +:103350008327040D85072328F40C05B74146CA8549 +:103360005285EFF07F8C8327840C8326C40C13874F +:103370000740B337F700B6972324E40C2326F40C58 +:1033800085E363EFEA008327040C8326440C13874C +:103390001700B337F700B6972320E40C2322F40C70 +:1033A0002285EFF0FF8DD2872328040C8146014748 +:1033B00094C3D8C3A107E39B67FF13090908E31F60 +:1033C00039F913F9F4076305090213563900CE855C +:1033D00013050404EFF05F858327040D93F484073D +:1033E00033099940A6972328F40C014A6314490134 +:1033F0006FC0BFE1B3874401CE978C232285050AB5 +:10340000EFF05FE28327040D85072328F40CF9BF52 +:10341000B7C7000003A7876A83A7C76A014818C116 +:103420005CC1B7C7000003A7076B83A7476B18C52C +:103430005CC5B7C7000003A7876B83A7C76B18C914 +:103440005CC9B7C7000003A7076C83A7476C18CDFA +:103450005CCDB7C7000003A7876C83A7C76C18D1E2 +:103460005CD1B7C7000003A7076D83A7476D18D5C8 +:103470005CD5B7C7000003A7876D83A7C76D18D9B0 +:103480005CD9B7C7000003A7076E83A7476E18DD96 +:103490005CDD81472320F50C2324F50C2322050D48 +:1034A0002326050D2328050C930705041305050C99 +:1034B0008146014794C3D8C3A107E39BA7FE82803E +:1034C00019C6EFC2FFD2EFF01FD96FC0BFD4828000 +:1034D000EFC21FD28327050D2A84AE8481EF9307A4 +:1034E00005041307050C0146814690C3D4C3A10708 +:1034F000E39BE7FE930500082285EFF0BFD2032689 +:10350000040D8327840C8325C40C93163600B697CC +:1035100033B7D7002E972324F40C2326E40C05E3BD +:1035200063FFD7008327040C8326440C13871700FE +:10353000B337F700B6972320E40C2322F40C93074B +:10354000F00663F0C7022285EFF08FF393070404BF +:103550001307040B0146814690C3D4C3A107E39B24 +:10356000E7FE0327040C8327440C22852328E40A62 +:10357000232AF40A0327840C8327C40C232CE40A8F +:10358000232EF40AEFF0CFEFA287A685138604045A +:10359000D4439843A10513D58601238CA5FE13D5EA +:1035A0000601A38CA5FEA38DD5FE13D586009356E8 +:1035B0008701238ED5FE93560701A38ED5FE935621 +:1035C0008700238DA5FE238FD5FEA38FE5FEA107DF +:1035D000E390C5FC9305800D2285EF20200E6FC07F +:1035E0007FC3EFC2FFC029712A84A81042C446C21B +:1035F0003AC83EC636CA2ECE32CCEFF07FE16246E4 +:10360000F245A810EFF0DFEBD246A8101306000237 +:10361000B685EFF05FC4B2474247A8103E86BA8530 +:10362000EFF01FEA92482248A8104686C285EFF0C4 +:103630003FE92C10A810EFF0BFE92C102285EF20F5 +:10364000100331616FC01FBDEFC29FBA51712A8450 +:1036500028082EC632C4EFF0BFDB2246B245280848 +:10366000EFF01FE62808A285EFF09FE66D616FC0BE +:103670007FBAEFC25FB63571B2842A8413060002A6 +:1036800088103689BA893E8AAE8AEFF0FFFB8C102B +:103690002E85EF20207881480148D2874E8714017B +:1036A0004A86A6850A85EFF0DFF38A858800EF2039 +:1036B000902E9307000213870A02D2884E88940046 +:1036C0004A86A6850810EFF0DFF181471307000254 +:1036D00090003E961022B306F400850790A2E3996D +:1036E000E7FE8A8690100C1013050402EF20A07AE2 +:1036F000881093050004EF10707C0A859305000282 +:10370000EF10D07B0D616FC05FB0EFC27FAE39713B +:103710002A84AE84814713070002B305F6008C218A +:10372000B306F10085078CA2E399E7FE930500023A +:103730003285EF10B0788147130700023306F1009D +:103740001022B306F400850790A2E399E7FE130662 +:1037500000028A850A85EFF03FEF8A850A85EF200F +:10376000606B8A852685EF201023814713070002AE +:10377000B386F4009022B306F40085072380C602C6 +:10378000E398E7FE0A8593050004EF10307321618A +:103790006FC05FA8EFC2DFA5B687328781460146BA +:1037A000EFF03FED6FC01FA7EFC29FA401112A8465 +:1037B000B6873287AE86AE8481480148AA85130653 +:1037C00000020A85EFF0FFE10A86A6852285EF2038 +:1037D000F00005616FC01FA41C3138210821A20729 +:1037E0004207D98F5D8D82801C311821A2075D8F21 +:1037F0003C212831C207D98F62055D8D8280EFC2DE +:103800003F9FAA84EFF05FFE2A8413854400EFF007 +:10381000BFFDAA8522856FC0FF9F93D785000CA1AD +:103820001CB193D70501E1813CA12CB18280EFC28C +:103830003F9C41112A899314260001443385850059 +:103840002EC6EFF07FFAB307890088C31104B24592 +:10385000E31694FE41016FC0FF9BEFC2DF972A89F8 +:10386000AE89931426000144B38789008C43330545 +:1038700089001104EFF07FFAE31894FE6FC0FF98FF +:10388000EFC27F952E8AAA84EFF07FF72A895285AE +:103890002E84EFF0DFF63349A900138584002D8CC8 +:1038A000EFF0FFF5AA8913058A00AE84EFF03FF52B +:1038B00033C5A900A58D33652501C18D6FC0FF9467 +:1038C000EFC27F912A89AE89EFF09FFB2E84AA84F4 +:1038D0009385090113050901EFF09FFA458DC18D0C +:1038E0006FC0BF9293078502232005001105E31DD9 +:1038F000F5FE828085471CC19307450013058502AC +:1039000023A007009107E39DA7FE8280814713074C +:103910008002B386F5009042B306F500910790C28D +:10392000E399E7FE82808147930680023387F500A2 +:1039300018433306F50091073307E04018C2E397B8 +:10394000D7FE82808147930680023387F500B30853 +:10395000F600184383A808003308F500910746973E +:103960002320E800E393D7FE8280814793068002FC +:103970003387F500B308F600184383A8080033081E +:10398000F5009107330717412320E800E392D7FEA3 +:10399000828041113306C04018419C4132C6B24674 +:1039A000B98FF58F3D8F18C19841B246B98F9CC130 +:1039B0005841DC41B98FF58F3D8F58C1D841B2468F +:1039C000B98FDCC118459C45B98FF58F3D8F18C55F +:1039D0009845B246B98F9CC55845DC45B98FF58FDF +:1039E0003D8F58C5D845B246B98FDCC518499C49AA +:1039F000B98FF58F3D8F18C99849B98F9CC958491F +:103A0000B246DC49B98FF58F3D8F58C9D849B246C7 +:103A1000B98FDCC9184D9C4DB98FF58F3D8F18CDEE +:103A2000984DB246B98F9CCD584DDC4DB98FF58F6E +:103A30003D8F58CDD84DB246B98FDCCD18519C5131 +:103A4000B98FF58F3D8F18D19851B246B98F9CD15F +:103A50005851DC51B98FF58F3D8F58D1D851B98F5E +:103A6000DCD14101828041113306C04032C69C4105 +:103A70001841B246B98FF58FB98F1CC1DC4158414E +:103A8000B246B98FF58FB98F5CC19C451845B246D7 +:103A9000B98FF58FB98F1CC5DC455845B246B98F33 +:103AA000F58FB98F5CC518499C49B246B98FF58F1F +:103AB000B98F1CC95849DC49B246B98FF58FB98F07 +:103AC0005CC9184D9C4DB246B98FF58FB98F1CCD8E +:103AD000584DDC4DB246B98FF58FB98F5CCD18517A +:103AE0009C51B246B98FF58FB98F1CD15851DC511A +:103AF000B246B98FF58FB98F5CD141018280EFC298 +:103B0000AFEC4111AA842E852E8432C6EFF0DFCDB2 +:103B10002A8B13054400EFF03FCC131D65001305FD +:103B20007400EFF07FCB131C55001305A400EFF0D9 +:103B3000BFCA931B35001305D400EFF0FFC9931AD9 +:103B4000250013050401EFF03FCAAA8C13054401B8 +:103B5000EFF09FC8131A750013057401EFF0DFC76B +:103B6000931955001305A401EFF01FC71319450061 +:103B70001305D401EFF05FC63246B70700013707DF +:103B80000002938EF7FFB3DECE403306EB00B33670 +:103B900066019A066982558EB305CD00935366007F +:103BA000131EA6013386EA00B33656013383F500AF +:103BB0009A066982558E33BDA501B336B300330E24 +:103BC000CB41EA96333BCB019E06B30370401353BF +:103BD0009301B38363419318A601135B660033E33B +:103BE000660066963308F600931693016293B3025B +:103BF000E300B33C9601B3FEAE003335C800958DAB +:103C00006695B336830133BC62001E05369C13589B +:103C10009801336805011A0C93D2A201131598017B +:103C2000B3625C005298330FE800098E33354801C7 +:103C3000338A5B00B30FFA00B3360F01B33C7A014D +:103C4000AA96B3BB4F019A06E69B135FAF0133EF11 +:103C5000E6019E0B93DF9F013384E901B3881A418B +:103C6000B3EFFB01333C3401B389F801B3BA1A0155 +:103C7000B3B61901B3865641B3866641330BF400DF +:103C800033358B006295B388E9001E05135B9B01F9 +:103C9000336B650133B53801AA96B30A69019A06F8 +:103CA00093D8A801B3E81601B386EA00B3BB2A0192 +:103CB00033B956015E991A09E9828A0EB366D900B2 +:103CC0003389DE00CA973335D901B3BE2701AA9ED6 +:103CD0009E0EE583B3E7FE00CD4E3385FE02EA0279 +:103CE000E60F6A0F660BEA06330464413303534060 +:103CF000330AFA414696B3BEFE022A9E72973335C6 +:103D0000AE00E6073308E841B386DA40B307F9406E +:103D100023A4640023A64401F6931E95B333C70180 +:103D20001E951A056983498F1315A701BA95139734 +:103D3000A801330EAE40B389E94023A0C401CCC032 +:103D400023A83401D0C823AC0401C0CC94D0DCD06B +:103D500041016FC0EFCA79716EC083AD050056CCCA +:103D600083A34500B30AB60394496AC266C422D647 +:103D700026D44AD24ED05EC8DC51B31DB60383A907 +:103D80008500C44583AB450103A98501C04D83A2CD +:103D90000502B70500023387BA005ACA330D76020E +:103DA00052CE62C6B30CD602B3137602B316D60255 +:103DB00033083603B30E9602B3087603B30F260317 +:103DC000330F860233035602330BF60233192603F0 +:103DD000B3193603B3149602B31B76033314860269 +:103DE000B31256023316F602B3375701EE97139EFD +:103DF000670069833367EE00E987135E6700139CF1 +:103E0000A701131AA701336C8E016A97338A4A41BE +:103E100033BE4A01333DA701B38A8D41338CF30091 +:103E2000B387BC006A9C33BD9701369DB38ACA41F3 +:103E3000E983131E6D00B367FE00135DAD4193D39C +:103E40006700131EAD0133EEC3019393A701C6971C +:103E5000B3837C40B3B81701338EC641EA9BB706E3 +:103E60000001B3BC7C00C69BB308D700330E9E4153 +:103E7000B3BCE800669C931C7C0093D89801B3E81F +:103E80001C01939C9801135C9C41C29833B80801B3 +:103E9000E299C2993388D700333DF800EA9B139C1E +:103EA0007B001358980133680C01131C980193DBB5 +:103EB0009B417E98B33FF801CA9BFE9BB38FB8002D +:103EC000B387874133BC1F01E2991399690093DFDF +:103ED000AF01B36FF90113D9A941B389FE01B3BE94 +:103EE000D901CA94338C9E00B30EB80033B90E01C9 +:103EF0005E999314690093DEAE01B3EED401B3046E +:103F0000DF011359A94133BFE4014A94B30B8F0079 +:103F1000338FD90033343F01629413197400135F57 +:103F20009F01336FE9013389E30165847294B333F0 +:103F30007900338ED400A29333349E005E94931B99 +:103F40007400135E9E0133EECB01135C9441330485 +:103F5000C30133336400E292B30B5300B302B900E0 +:103F600033B322019A939A033303B40093D2A2018C +:103F7000B3E25300B3338300DE93939B6300135388 +:103F8000A30133E36B0093DBA341B3036B005E96A5 +:103F90009E9633BB6301329B33B676005A96131B51 +:103FA0007600E582B366DB00CD4B6586338BDB02A2 +:103FB00033079741EA0F660FEA0E660E6A03B3896C +:103FC000E941B384C441330464403386CB025A9A36 +:103FD000333B6A01D295B388F84196973308D841AC +:103FE0002326350144CD23241501B3BBDB02E606AD +:103FF000B386D3405CC9232C050100D154D15E9611 +:1040000056965A9633BB45015A961A06E981D18DC8 +:104010001396A501BA951397A201330ACA40330932 +:10402000E94023204501232825014CC13254A254E4 +:1040300012598259724AE24A524BC24B324CA24C3C +:10404000124D824D45618280D845757122C73AC4B0 +:10405000D849404A26C53AC6D84D4AC34EC13AC887 +:10406000D851D2DED6DCDADADED8E2D6E6D4EAD22D +:10407000EED03ACA83A805029C4103A88500944962 +:1040800003A385011842032E8600032FC600832256 +:10409000060103A945004C4222CC004E131A190018 +:1040A000B383E70222D4404E22D60052505222D887 +:1040B00032DC22464D44B39DE70293191600324686 +:1040C000060632CE4246060632D05246B38B8202F4 +:1040D000060632D26246B30A86022256B30486022C +:1040E0003256B30F86024256B30E8602625633062C +:1040F0008602330BCA02331DCA021E9BB3337B00F8 +:104100006E9D1E9DB303D803B31DD803DA9333BB52 +:1041100063016E9D6A9B338DF903B39DF9031E9D68 +:10412000B3337D006E9BDA93338B9602B39D960278 +:104130006A9B333DAB01EE931E9DF243F24D330C6F +:104140008F02B3835303B39D5D03DA9333BB6301E3 +:104150006E9DB30D73036A9B331D73039E9DB3B3B2 +:104160007D005A9D1E9D8253025BB30C8E02B38369 +:104170008303331B8B03EE93B3BDB3016A9B338D73 +:1041800098036E9BB39D98031E9DB3337D006E9B79 +:10419000DA93338B8502925D1EDE9253B30DBB031F +:1041A000331B7B02B303BD011EDA33BDA301F253FF +:1041B0001E9BB3036D019EC2338BB702B30327036B +:1041C000B39DB702DA9333BB6301331D27036E9DA2 +:1041D0005A9D330B0603B31D06031E9BB3337B00AE +:1041E0006E9DEA93224DA24D338DAE03B39DBE0367 +:1041F0005A9D333B6D01EE93B38DDF02DA93339B0F +:10420000DF02EA9D33BDAD01DA931E9DB243338BCD +:104210007402B39374026E9BB33DBB011E9DB383C6 +:104220006A02EA9D339D6A02DA9333BB6301EA9D19 +:10423000424D6E9BC24D338DAB03B39DBB031E9DA0 +:10424000B3337D006E9BDA93330B1C03B31D1C0349 +:104250006A9B333DAB01EE931E9DD243D24DB38397 +:104260007C02B39CBC03DA9333BB63011EDE669D04 +:10427000B303AB01B38CC7039EC6330BBA02339DA5 +:10428000C703669BB33C9B01B31DBA02B303BD01D8 +:10429000330D0703E693B31C07035A9D333B6D01AF +:1042A000B30D3603E693DA93331B3603EA9D33BD31 +:1042B000AD01B38CDE02DA93EA93339DDE02EE9C0D +:1042C000B3BDBC01EA939E9DF243339D7F02338BC5 +:1042D0007F02EA9DB3836402669BB33C9B01EE9C24 +:1042E000339D6402DA9333BB6301EA9C669B825C74 +:1042F000338D9A03B39C9A031E9DB3337D00669B56 +:10430000DA93338B1B03B39C1B036A9B333DAB01D6 +:10431000E6931E9D9253B39CE703B30D7C02331CBE +:104320007C02DA9D33BB6D01629DB303AB01338C1C +:10433000E7039EC8330BC903331DC903629B333C9B +:104340008B01B383AC01B30CB802E293331CB80207 +:10435000DA9C33BB6C01E293DA93224B330CD60226 +:10436000330D6703331B6703669DB33C9D016A9C55 +:10437000333DAC01DA93E693B31CD602E6931E9D5F +:10438000B243B39C7E02338B7E02669DB3836F0281 +:10439000629B333C8B016A9CB39C6F02DA9333BB04 +:1043A0006301669C629B424CB38C8403339C840300 +:1043B0009E9CB3B37C00629BDA93338B1A03339CCD +:1043C0001A03669BB33C9B01E2939E9CD243339CB1 +:1043D0005702338D7B02B39B7B02B303AB0133BB2C +:1043E00063019EC0DE9CB3039B01B38B57029ECA40 +:1043F000330BEA03B31CEA035E9BB33B7B01B303BD +:104400009C01330CC803DE93B31BC8035A9C333B97 +:104410006C01B38CB902DE93DA93339BB902E29C50 +:1044200033BC8C01B30BD702DA93E293331CD7026F +:10443000E69BB3BC9B01E2939E9CF243331C760245 +:10444000330B7602E29CB3836E025E9BB33B7B012F +:10445000E69B339C6E02DA9333BB6301E29B5E9B67 +:10446000825B338C7F03B39B7F031E9CB3337C0042 +:104470005E9BDA93338B1403B39B1403629B333C30 +:104480008B01DE931E9C9253B38C7A02B39A7A020C +:10449000DA9C33BB6C01569CB3038B019EC4E24390 +:1044A000B30A5902338B7702331C5902DA9A33BBB1 +:1044B0006A01B39B7702B3838B01B30BE803DA93F2 +:1044C000331BE803D69BB3BA5B01DA93D693A24AB7 +:1044D000338BB602338CCA03B39ACA035E9CB33BD8 +:1044E0007C01629B333C8B01D693DE93B39BB60277 +:1044F000DE931E9CB243B31B7702B30A77025E9C25 +:10450000B3036602DA9A33BB6A01629BB31B66028D +:10451000D693B3BA53015E9BDA9A424BB38B6E03C8 +:10452000339B6E039E9BB3B37B00DA9AD693B38A18 +:104530001F03339B1F03DE9AB3BB7A01DA939E9B62 +:10454000D243338C7402B3947402338D8A01B33A2C +:104550005D01E243A69BB3847A01A6CCA254B31BAF +:104560007A02B38A9702339B9702E244B3049A0219 +:10457000B3037B01D694B3BA5401D693B30A58025D +:10458000331B5802A69AB3B49A00DA93A693B39455 +:10459000E903338BE903A693B384C603569BB33A6E +:1045A0005B01D693F24A339CC603DA9433BB6401B1 +:1045B000E2931E9BF243339CBA02B383B302629B25 +:1045C000A693B3B49300B38B6401330B6702825498 +:1045D000331C67021E9BB3337B00B38A8B019E9A08 +:1045E000B3039602B31B9602DA9333BB6301B38421 +:1045F0007A01B38A1E03DA94339B1E039E9AB3B3E7 +:104600007A00DA94A6939254125BB3849F02B39F0C +:104610006F03D694B3BA54019E9F338CFA01B25FF4 +:10462000A25AB383F703339BF703A25FB30FF903D7 +:10463000B31B59039E9FB3B37F00B30A7B019E9ABD +:10464000E243624BB3037802331B6803FE93B3BFAC +:10465000F301DA9AD69FA24A224BB38A5A02331B3D +:104660005B029E9AB3B37A00DA9F338BE6039E9F78 +:10467000B393E603569BB33A5B019E9FFE9AB24FFB +:10468000B383CF03B39BCF03DA9333BB6301DE9ACB +:10469000B30FB302569BB31AB3029E9FB3B37F000E +:1046A000569BC24ADA93424BB30A5703331B670344 +:1046B000FE9AB3BFFA01DA939E9FB3031603331B2E +:1046C0001603D693B3BA5301DA9FFE9AD24FB38B37 +:1046D000FE03B39EFE039E9BC25FB3B37B00F69ABC +:1046E000B38E5301F6CEB393F703C25EB25FB25AF4 +:1046F000B38ED703B30FFA03331A5A03F69FB3BE30 +:10470000DF011E9AB3834E01A25E338A5602B30ABA +:10471000D803B31ED803FE9AB3BFFA01F693E24E54 +:104720009E9FB303C303338BD903B399D903569B1D +:10473000B33A5B015A9A333B6A01F24ECE9FB3996A +:104740005602D69FCE9F7E9BF24FB38EEE03B39F51 +:10475000EF03D29E33BA4E01F693B3BED3017E9BD4 +:10476000B31FC303529B7E9B825F330A1703DA9EFB +:10477000B389BF02B39FBF029E99B3B379004E9A2B +:10478000B3393A01FE9EB31F17039E9EC253FE9E8D +:10479000F699925EE25FB30AD6033316D603B30EE0 +:1047A0005A0133BA4E01B2996256D2993386C70282 +:1047B000B397F703C25FB30FF90333197902B29FBE +:1047C00033B6CF00CA973E96B257B303F8023318F8 +:1047D000F802FE93B3BFF301A2474296B29F22565E +:1047E000B387C70222462258331606039E97B3B3F7 +:1047F0007700B29F6246FE933388C602B396C60224 +:104800003E98B337F800B693B2469E973386560269 +:10481000B392560242963338060196973E98C247A5 +:10482000B306E3033313E303B29633B6C600B38F84 +:10483000C7031A984296339EC703B69FB3B6DF00EC +:10484000B387B8027296B2961646264EB395B80252 +:10485000FE97B3BFF7019648AE96B69FD246330394 +:10486000D7023317D7023E93B337F3007E973388CE +:10487000E700D25737070002B386E700B3B7F60068 +:10488000B29713966700E982D18EE98713D6660046 +:10489000139BA701336B660152569395A601338B88 +:1048A0006841B305B6403336B600B308CB40725604 +:1048B000B296B3B3C6003646330BF6003386EC002F +:1048C000B3379601F297139E670069823366CE0074 +:1048D000E987135E6600DA93139BA701336B6E01C1 +:1048E000264E131FA601338FEC41330B6E41664EEB +:1048F000B3BCEC0133099B41B30AFE00B7070001CA +:10490000338EF600333BDE00DA93939F7300135E21 +:104910009E0133EECF0193129E01B3825640C646EC +:104920006A9613DB9341333DA601369BB306F6002E +:10493000EA9A33BDC600EA9A939F7A00E582B3E60D +:10494000DF006E9E939F9601B33CBE01A696330690 +:10495000F64193DA9A41B30FEE00669BB3B496002A +:10496000B3BCCF01E29ADA9CA69A864493936C007A +:1049700093DFAF01B3EFF301338CF401333D9C00BF +:10498000D64493DCAC41EA0FA69CB384E600B3B3F3 +:10499000D4009E9A93936A00E980B3E49300F643AF +:1049A00093DAAA41EA9C9E9AB303FC0033BD8301CB +:1049B000EA9C139A7C0093D39301B3637A00330D7E +:1049C0007F0093DC9C41338B9B00CA9C333FED01FD +:1049D000B33B7B01669FB30CFB00B3BD6C01D69B60 +:1049E000EE9B330AED0013997B0093DC9C01B36CC2 +:1049F00099013339AA014A9F93DD9B411A0FB38B6A +:104A00009E01135AAA01B3BADB01336A4F01EE9932 +:104A1000338FEB00D699B33A7F01CE9A939E6A000A +:104A2000135FAF0133EFEE013309E30193DAAA41DB +:104A30005698CA9733336900429333B827011A98BE +:104A400013137800E583B367F300135898413303D9 +:104A5000F402EA04E60CE6036A0F330B9B41330CC5 +:104A60007C405296858EB38BEB41330804039A95B4 +:104A700033B365002E97330EFE4123268501232E86 +:104A8000650123207503AA442324C5013334F402AD +:104A9000E607B307F94050C91A4914CD5CD14294D6 +:104AA000A2989A983333B7009A989A08698333E7A3 +:104AB000E8003A441318A701169758C11317AA0122 +:104AC000330DED40B38505412328A5010CC18A496A +:104AD000765AE65A565BC65B365CA65C165D865D0A +:104AE000496182805D7166D483AC450256DC930ACD +:104AF000600233865C03A2C6C04183A805005ADA6F +:104B00009316140003AB0502CAC252DE9397180035 +:104B10003389180362D66ED04D4C984903A38501A2 +:104B20005ED803AF850083ABC50183A34501338AFB +:104B3000C60283AFC500931E1F00A6C413981F00B2 +:104B4000CEC093191700139E13006AD2139D1B0049 +:104B5000B39DC6024A9A33392A01B3981803B305A4 +:104B60008B03EE98CA983389BE02B3825B035299D5 +:104B7000333A4901B39DBE02EE98B30D5802469AEE +:104B8000B3185802CA9D33B92D01B3048303D298D8 +:104B90004699B3989902CA9833895303338A990284 +:104BA000B30A79026E9AB33DBA01EE9833197902CD +:104BB000D29A33BA4A014699B3082A01338A870246 +:104BC00046C63309E603B39D87025299333A490139 +:104BD000B318E603EE98D298338A0503B39D050314 +:104BE0004A9A33392A01EE98B38DE202CA98339972 +:104BF000E202D29D33BA4D01CA983389C403D298D8 +:104C0000339AC4036E99B33DB9014AC4D298EE9861 +:104C100046C833898602B388E703339AE703469987 +:104C2000B3381901339486025294A29833040603D0 +:104C3000331A06034A9433392401B38D3503D298CD +:104C40004699B3993503A29D33B48D00B388C2034E +:104C50004E9922993394C203EE98B3BDB8012299BC +:104C6000CA9D33896402B39464024699B33819012A +:104C7000EE9433849800B388F70322CAB384E60322 +:104C8000B399F703C694B3B81401339AE603338497 +:104C900049014694B308E602B319E602A698B3B4F4 +:104CA00098004E94B389C5032694B394C503C6995E +:104CB000B3B819012694A29833846202B3946202B5 +:104CC0004E94B3393401A698B3841901B389E7022D +:104CD00026CCB3880603339A0603CE98B3B93801BD +:104CE000B394E702B30DEF03D294A699331FEF03F9 +:104CF000C69DB3B81D01B304C603FA99C699331F04 +:104D0000C603EE94B3BDB401FA99CE9D9319130076 +:104D1000338FB902B399B902269FB3349F00338A07 +:104D20007203CE9DEE94B39272037A9A333FEA01F6 +:104D3000A692B3085F00338FF302B382E602B39901 +:104D4000F302FA9233BFE201B39DE602B384B901E4 +:104D5000FA94338FFE03B399FE03169FB3325F00BC +:104D6000CE94A692B3046602B3196602FA9433BFD6 +:104D7000E401CE92FA92339FA503B389A503FA9278 +:104D8000B39D6702A699B3B49900969426CE339F3B +:104D9000C603B38267026E9FB384C603B39DEE025F +:104DA0009694B3B25400169FB382EE026E9FB30D79 +:104DB000F803A692B3B49200FA94B31FF803969D39 +:104DC000B3B25D00330FA603FE949694B312A6030C +:104DD0006E9FB33DBF019694A69DB3846503B395C2 +:104DE0006503FA9433BFE401EE95B30FBF00B39DA2 +:104DF0006602339F7703B38277036E9FB3856602A3 +:104E0000B38D7E029695B3B25500FA92B3937E02AB +:104E1000AE9DB3B5BD009E92AE92B315E802330FBE +:104E2000E802AE92B30366036E9FB33DBF01969D49 +:104E3000B3156603FA9333BFE301AE9DB382A603B5 +:104E40006E9FB3856703B39D6703AE92B3B5B2009F +:104E5000339DA6036E9D2E9DB3856E02B39D6E029B +:104E60009695B3B255006E9DEA92330DC803B31DFB +:104E7000C8032E9DB335BD00EE929695B302E702AE +:104E8000B31DE702EA9233BDA201EE952E9DB30554 +:104E90009603331696039695B3B25500329DEA9267 +:104EA00033869703338D6603B3979703329D33366A +:104EB000CD00B3966603B38D7E03B6973E96B39E40 +:104EC0007E03EA9D33BDAD01330B68027696329DB9 +:104ED0003246331868026E9BB33DBB013243B30EBA +:104EE000C703429DEA9D3317C703DA9E33BB6E01A9 +:104EF0006E97330EEB0037070002B386EA00B3B7B4 +:104F00005601B29713966700E982D18EE98713D8CC +:104F100066001396A7013366C8001398A60133886C +:104F20000A413306C340B3BA0A01B30A56412246C6 +:104F30004243B29633B6C600B30DF300B29D3306BA +:104F4000EA00B3374601C697139367006982336658 +:104F5000C300E987135B66001393A70133636B00FB +:104F6000B38868407243131BA6014E969A97B339D3 +:104F70003601330B6A41BE99B70700013383F6004F +:104F8000333A6A01B3884841333AD300D29D139A29 +:104F90007D001353930133636A00931B9301B38B1A +:104FA0007641D2464A9393DD9D4133392301338ABA +:104FB000B601B306F6004A9A33B9C600CA991399E6 +:104FC0007900E582B366D90093D999411399960186 +:104FD000CE9FB309E300A6963306264133B9690094 +:104FE000B3B496005299A69F93D9A901931469006E +:104FF000B3E93401E244B30C34011359A9412699B1 +:1050000033B48C004A943389E600B334D900A69FA8 +:1050100093946F001359A90133E9240193D4AF414C +:10502000B38F2301B3B37F00269FB384FC001E9F80 +:10503000B3B394011E94135A944193137400D298FD +:10504000E580338AFF00B3E49300B333FA011E9F77 +:1050500093137F00135A9A0133049B0033EA4301F0 +:1050600093539F41333B64019E92B303E400DA986B +:1050700033BB8300DA98338F45019A0893D3A30199 +:10508000B335BF00B3E37800B308EF00AE92B3B519 +:10509000E80196959392650093D8A801B3E81201B0 +:1050A000338B1E01E9852E9EDA97B33EDB01F29E1B +:1050B00033BE6701769E93157E00E583CD8F135E28 +:1050C0009E41B305FC02EA09E6046A09660AEA0899 +:1050D000B38C9C4033033341B3862641B38F4F4199 +:1050E000330ECC032E98B335B80042971E96330F7B +:1050F0001F41232695012324650050C914CD333C5C +:10510000FC02E607B307FB40232EF5012320E5034D +:105110005CD1A64416498649725A729CE29AAE9AAC +:10512000B3350701AE9A9A0A698333E7EA0093150B +:10513000A7015E9758C11397A301198C00C9364483 +:105140003308B84023200501E25A525BC25B325C4F +:10515000A25C125D825D6161828063CB050093D7A2 +:1051600035403E9508219D893355B540058982809B +:1051700001458280138E0502930E0602B2882A88AA +:1051800001479C4103A3080091081108B3866702F8 +:1051900033B367028327C8FFB6973E97B3B6D700ED +:1051A000232EE8FEB337F7009A963387D700E39AA9 +:1051B0001EFD18D191051105E312BEFC8280B16578 +:1051C0008146854793850571130800023387D50012 +:1051D0003306D5001843104291061347F7FF3A965D +:1051E000B2973337E600B3B7C700BA97E39006FF2C +:1051F0003E858280EFA2DFFF41112A842E852EC6D4 +:10520000EFF0FFFBB24531661358F5413303A04080 +:1052100081461306067193080002B307D6009C432B +:105220003387D500184393C7F7FFB3F767003E975E +:10523000B337F7003A95C2973308D4002320A8006B +:105240003337E50091063305F7000148E39716FD73 +:1052500041016FA03FFCEFA2BFF92A84EFE08FE885 +:1052600013058402EFE00FE913050405EFE08FE872 +:1052700013058407EFE00FE76FA0DFF9EFA25FF7F8 +:10528000138985022E842E86CA85AA84EFE08FEBCF +:105290002286CA8513858402EFE02FED930504056D +:1052A00013850405EFE08FE631661306866E9305DD +:1052B000840713858407EFE03FD96FA0BFF5EFA205 +:1052C0009FF15D7113848502AA84328A2E892E860D +:1052D0000A85A285EFE00FE74A86A2852810EFE055 +:1052E000CFE852868A850A85EFE01FD62C10130678 +:1052F0008A022E85EFE05FD5938A840230108A857A +:105300005685EFE02FE430108A852685EFE0EFE543 +:105310001384040513060905B2852285EFE08FE2A8 +:1053200013060A05A2852285EFE01FD29389840720 +:1053300013068A07930589074E85EFE0FFD04E8656 +:10534000A2850A85EFE00FE04E86A2852810EFE0E7 +:10535000CFE15686A6854E85EFE01FCF3010A6859B +:105360002685EFE07FCE0A86D6855685EFE0DFCD35 +:1053700030108A852285EFE03FCD61616FA0FFE8A4 +:10538000EFA29FE4138A85022A89AE893685B28B03 +:105390002E86D2853684BA84EFE0CFDA4E86D28567 +:1053A0002685EFE08FDC5E86A2852285EFE0DFC9EF +:1053B00013868B02A6852685EFE01FC9130B890291 +:1053C0002686A2855A85EFE0EFD72686A2854A85F4 +:1053D000EFE0AFD9130A090513860905B285528596 +:1053E000EFE04FD6930A890713860B05938589074B +:1053F0005685EFE07FC55686D2852285EFE08FD4B3 +:105400005686D2852685EFE04FD65A86CA855685C0 +:10541000EFE09FC32686CA854A85EFE0FFC2228659 +:10542000DA855A85EFE05FC22686A2855285EFE0D5 +:10543000BFC16FA0FFDCEFA21FDA32842A8AAE8AD6 +:10544000328593048402EFF0EFE9138B8A02DA8548 +:10545000268513090405EFF0EFE893850A054A85D0 +:10546000EFF04FE8CA854A85094693098407EFE0C3 +:105470009F8E5A86D6854E85EFE0CFCC930A8A0759 +:10548000CE855685EFF00FE62286A6854E85EFE0A5 +:105490006FCB2286A6852685EFE02FCD4E86D6855A +:1054A0002285EFE08FCC2686CA854A85EFE0EFCBD8 +:1054B0004A86A2855285EFE03FB92686CE85130540 +:1054C0008A02EFE07FB84A86A68513050A05EFE059 +:1054D000BFB74E86A2855685EFE01FB76FA0FFD2FB +:1054E000EFA21FD1AA842E891304C00FA2854A857A +:1054F000EFF0BFC619E17D1475F80504FD57A0B0A3 +:105500009EA0BCA06FA01FD1EFA21FCC2431AA89FE +:1055100032896393C402AE8A3685B285368B130A0C +:10552000F9FFEFF09FC32A84D2855A85EFF0FFC2BE +:10553000631DA400A3814901839709000145639479 +:105540002701038529006FA0BFCB138A140063D302 +:105550004A01568A1305FAFF3314A400330480402D +:10556000814A330C4941D68B850A63185A05E28576 +:105570005A85EFF09FBE2295B307A040E98F13F440 +:10558000A70A13F7C70C3334800011C3094793F7F8 +:10559000070F598C91C3914713071900C18F330727 +:1055A00047413E973355F540B38444412390E90089 +:1055B0002381A900A381990041B7B3055C015A85F5 +:1055C000EFF0BFB9331575012A9471BFEFA25FBF29 +:1055D00041112E892A8AC2853E853E8BC28B3AC6EE +:1055E000B289B68AEFF07FB793850B022A845A8579 +:1055F000EFF0BFB693850B04AA845A85EFF0FFB590 +:105600000A058604AA9493850B065A852694EFF022 +:10561000DFB41374F40F0E0522951375F50F135BA9 +:1056200035003247930CFBFF33C5AC00937C75000B +:10563000BA84014D130C8902930B0905A14D33C4A3 +:10564000AC017D1421800588A68522864A85EFE07D +:105650008FC19385840222866285EFE0CFC0938557 +:10566000040522865E85050DEFE0EFBF9384840775 +:10567000E317BDFDDE854E85EFE0EFAA134B1B005F +:105680005A86CE855E85EFE0CFB05A86E2854A85A0 +:10569000EFE02FB05687CE864A86D2855285EFF04E +:1056A0003FCE41016FA09FB5EFA29FB4EFE04FA1A5 +:1056B0004D8D133515007D156FA0DFB581476393C0 +:1056C000B70082803307F500230007008507C5BFB8 +:1056D000EFA21FB279712A848147130780023386B3 +:1056E000F50010423400BE9690C29107E399E7FEA0 +:1056F0003257CD471018B387E70237070001BA9732 +:105700003800E587BA868C42A106AE9783A5C6FF0E +:10571000E987AE97E587E318D6FECD46B387D70273 +:1057200014432107B69793D6A7419395A6018D8F71 +:10573000232CF7FE8327C7FFBE9693D796419395F8 +:1057400097018D8E232ED7FEE31CE6FCB247A245BF +:105750002285EA07DD8DEFE04F8CB245C247130585 +:1057600044009981CE07DD8DEFE02F8BC245D247F3 +:1057700013058400B581B607DD8DEFE00F8AD245B1 +:10578000E2471305C400CD819A07DD8DEFE0EF8875 +:105790008257F24513050401E607DD8DEFE0EF8740 +:1057A00082559257130544019D81CE07DD8DEFE0B0 +:1057B000CF869255A25713058401B581B207DD8DBE +:1057C000EFE0AF85A255B2571305C401D1819A0706 +:1057D000DD8DEFE08F84280093058002EFF01FEE4F +:1057E00045616FA03FA3EFA2BFA039712E84AA85A7 +:1057F0000A85EFF0FFEDA2850810EFF07FED0C10A9 +:105800000A85EFF07FEA2A84930500020A85EFF00B +:10581000FFEA081093050002EFF05FEA1305140099 +:1058200021616FA03F9FEFA21F9B19712A89280059 +:105830002E84EFF02FAB2C000818EFF0AFAA0C1855 +:105840002E85EFF02FAA10183285A285EFE0CFFF4A +:105850002C0010182E85EFE02FFF2C002E85EFF086 +:105860006FA8300032850C18EFE00FFE2C000818EE +:10587000EFF04FA791440C182E85FD14EFF08FA682 +:10588000FDF8300032850C18EFE00FFC2C000818F2 +:10589000EFF04FA5A5440C182E85FD14EFF08FA452 +:1058A000FDF80C182E853000EFE00FFA0C18A80850 +:1058B000EFF04FA3CD44AC082E85FD14EFF08FA27E +:1058C000FDF810183285AC08EFE00FF80C182E85A3 +:1058D000EFF04FA1A5440C182E85FD14EFF08FA01A +:1058E000FDF8300032850C18EFE00FF62C00081898 +:1058F000EFF04F9F930410030C182E85FD14EFF06A +:105900006F9EFDF80C182E853000EFE0EFF30C18B9 +:10591000A808EFF02F9D93043006AC082E85FD14E7 +:10592000EFF04F9CFDF810183285AC08EFE0CFF196 +:105930000C182E85EFF00F9B930410030C182E8586 +:10594000FD14EFF02F9AFDF8300032850C18EFE0CF +:10595000AFEF2C002E85EFF0EF982C002E85EFF0A6 +:105960006F982C0022862E85EFE00FEE2C00081891 +:10597000EFF04F970C1822862E85EFE0EFECA80889 +:10598000EFD05FF6AC082285EFF0FFE52A84A80887 +:10599000EFD05FF6AC080818EFF0FFE4AC08AA8A75 +:1059A0002E85EFD05FF8AC080818EFF0DFE3356A1A +:1059B000AA8993054A32A808EFD0FFF6AC08081868 +:1059C000EFF07FE213064A322C00AA844A85EFE00A +:1059D000AFE7B3E499000546058E2C004A85EFE059 +:1059E0008F88280093058002EFF05FCD081893059B +:1059F0008002EFF0BFCCA80893058002EFF01FCC27 +:105A0000336554013365350109616FA01F80EFA232 +:105A10002FFE39712A8428082EC6EFF0AF8C2C088F +:105A20002E85EFF05FE02C082E85EFF0AF8B32462D +:105A30002C082285EFE04FE1280893058002EFF063 +:105A4000FFC721616FA00FFDEFA2EFF82D712A8A29 +:105A50002E8B2800B2850546B684EFE04F8A0818E1 +:105A6000EFD05FE9A808EFD0FFE72C000801EFD0E6 +:105A7000FFE928117969EFD0FFE7FD14014413090C +:105A800029B4FD5AA6855A85EFF02FED298C228680 +:105A9000AA890C010818EFD0DFEF22862C11A80884 +:105AA000EFD03FEF30110C018809EFD01FECB008A8 +:105AB0000C18A819EFD07FEB0C182E85B008EFD08A +:105AC0007FE830110C01A808EFD0DFE710188C092F +:105AD0002811EFE06FD7AC08B0192E85EFE0CFD6D4 +:105AE000AC198809EFF00F800C18A819EFE09FFFA0 +:105AF000B0082C110801EFD0FFE4B00832852C115A +:105B0000EFD0BFE69009AC190818EFE0EFD3AC195D +:105B100090092E85EFD07FE5AC082E85EFE09FFC45 +:105B20004A86AC192811EFE00FA30C012E85EFE097 +:105B30007FFB8C092E853011EFD0DFE0B0082C0000 +:105B40002811EFE06FD09009AC19A808FD14EFE020 +:105B5000AFCF4E84E39854F34E860C010818EFD073 +:105B60005FE34E862C11A808EFD0BFE2AC082E856B +:105B7000EFF0FFE90C18B0082E85EFE0EFCC0C1821 +:105B80005285EFF0FFB4280093058002EFF01FB3B9 +:105B9000081893058002EFF07FB2A80893058002F1 +:105BA000EFF0DFB1880993058002EFF03FB1080103 +:105BB00093058002EFF09FB0281193058002EFF06B +:105BC000FFAFA81993058002EFF05FAF15616FA0DA +:105BD000CFE3EFA2EFE159712E84AA848145130629 +:105BE00040066800EFA0CFE36C00B56E2E8801433D +:105BF000938E0E30930F040493024002B3876E001D +:105C000003AF07002286A2884285014783A70800C8 +:105C100091081105B306FF02333EFF028327C5FF3B +:105C2000B6973E97B3B6D700232EE5FEB337F700FD +:105C3000F2963387D700E39BF8FD2320E804110395 +:105C40001108E31D53FA02C602C802CA02CC02CEF2 +:105C500002D002D202D41308C100A148316F930EC2 +:105C60000F714285014E81468327080403A30E006D +:105C7000050E110533876702910E33B36702832740 +:105C8000C5FFBA97BE9633B7E700232ED5FEB3B74C +:105C9000F6001A97B386E700E3681EFDFD181108A9 +:105CA000E39F08FA13040402854698411C4211063A +:105CB0001347F7FFBA97BE9633B7E70094C1B3B75F +:105CC000F600B386E7009105E31186FE6C002E8591 +:105CD000EFF04FD221466C002685EFD01FB8680048 +:105CE00093054006EFF09F9D65616FA0AFD2EFA2D4 +:105CF0002FD00111AA850A85EFF09F9D00800A85AB +:105D000093050002EFF09F9B0588228505616FA037 +:105D10006FD0EFA24FCC130985022A8405464A852D +:105D20002E8A93090405EFD09FDD4E8593048407E6 +:105D3000EFD05FBCCA852685EFE0DFDA3566130653 +:105D40000627A6852285EFE02FB04E86A6852685FC +:105D5000EFD0BFC14E86A2852285EFD0BFBEA685FB +:105D600022852286EFE04FAEA2852285EFF0BFAB01 +:105D700015C92286A6852285EFE00FAD2285EFF0BA +:105D80001FF78347FA019D836316F500A2852285DC +:105D9000EFD07FB926854A86A285EFE0EFAA0145BC +:105DA0006FA0AFC67D55EDBFEFA28FC419712A84D5 +:105DB000AE84280093850505EFF07FC53000A685E9 +:105DC0000818EFE06FA8300093858402A808EFE080 +:105DD000AFA7AC082285EFF0BF8F0818EFF03FF1B6 +:105DE000A167938707F81E057D8D7C3C9305800293 +:105DF0003D8D68BC2800EFF07F8C08189305800269 +:105E0000EFF0DF8BA80893058002EFF03F8B09616C +:105E10006FA04FC0814713070002B386F5009022A0 +:105E2000B306F500850790A2E399E7FE1C21E19BEC +:105E30001CA17C3D93F7F70793E707047CBD8280A4 +:105E4000EFA20FBB79712A84080832C6EFF09FFCDD +:105E500032469306F00F0C082285EFF0FFBE0808CB +:105E600093050002EFF09F8545616FA0AFBAEFA2E6 +:105E70002FB839712A8441460A85EFD05F9B8A8505 +:105E80002285EFF01FD50A8593050004EFF01F83EC +:105E900021616FA02FB8EFA2AFB575712A84B284CB +:105EA0000808214636C6EFD09F98A68508182146D7 +:105EB000EFD0FF97B24688082146B685EFD03F97CE +:105EC00010180C08880882D882DA82DC82DE02C1CF +:105ED00002C302C502C7EFF0EFA98C082285EFF0DC +:105EE0005FCF880893050004EFF04FFD0808930585 +:105EF0000002EFF0AFFC081893050002EFF00FFC72 +:105F000049616FA02FB1EFA20FAD6571B56635661F +:105F10009386062E1306062C2A842800EFF0BFF77E +:105F2000A818EFD03F9D0811EFD0DF9CA801EFD05B +:105F30007F9B2285EFF02FB2B5697D483C00138727 +:105F400009AF94083010AC182285EFF02FE83169C2 +:105F50001308F0093C001307097394083010AC18BB +:105F60002285EFF0AFE6F9447D5A9019A28522858B +:105F7000EFF06FCC26883C00138709AF94083010EF +:105F8000AC182285EFF08FE4138804083C00130757 +:105F9000097394083010AC182285FD14EFF00FE35C +:105FA000E39544FD281093058002EFF02FF1881946 +:105FB0009305000AEFF08FF0880893058002EFF058 +:105FC000EFEFA81893058007EFF04FEF2800930537 +:105FD0000002EFF0AFEE59616FA02FA3EFA2AF9FC9 +:105FE000130101BE130A0502AE842A84D2858815E6 +:105FF000B28A2146EFD0BF83A6858810EFF07FD10B +:1060000011C57D55130101426FA02FA0A285080282 +:10601000EFF03FD07DF58815EFF06F9A7DF1900499 +:106020008C100813EFF02FC18C108815EFF00FA51E +:1060300090150C138804EFF08FA88C040807EFF07C +:10604000EFA3D6852800EFF0AFC9D2856800EFF046 +:106050002FC99C870349B1006373F9003E898810FA +:10606000B5691379F90FEFF00F9F094B938909EB8D +:106070008C102E851013EFF00FBCD6864A868D4506 +:106080002800EFF06FC82A84D2864A8695456800BA +:10609000EFF08FC7AA846352800805841306000AB4 +:1060A0003306C4029C153E968C102E85EFF02FA16E +:1060B0006359900A8584130680073386C402381812 +:1060C00014084E968C102E85EFF08FAB7D19FD577E +:1060D000E310F9FA0C028804EFF04F9A8C10900448 +:1060E0002E85EFF0CF9D8C1010022E85EFF0AFB40F +:1060F0008C1010022E85EFF00FB48C1010022E853C +:10610000EFF06FB38C100813EFF01FCAB5659385DD +:10611000C5340813EFF04FD9F5B559D833446403AB +:10612000930500F69C15A8143304B402B3858700C8 +:10613000EFD0CFFD9C1593058402BE958804EFD067 +:10614000EFFC9C1593050405BE95080DEFD00FFCE0 +:106150009C1593058407BE95281DEFD0CFFC9004B5 +:10616000A1B7ADD4B3C46403930780F8A814B38473 +:10617000F402CE94A685EFD06FF99385840288044B +:10618000EFD0CFF893850405080DEFD0CFF938187C +:106190001408900405BFEFA2AF8535712A840A85E3 +:1061A000EFF07FD68A852285EFF01FC00A85930520 +:1061B000000AEFF0AFD00D616FA0CF85EFA24F8343 +:1061C0005D71AA8405462810EFD07F9335643010A6 +:1061D000930584290A85EFD0EFF6301032859305B8 +:1061E0008429EFD08FF82C102E85EFF05F823010CD +:1061F0008A850A85EFD05FE58A852685EFF04FCD49 +:106200000A8593058002EFF06FCB2810930580027A +:10621000EFF0CFCA61616F90FFFF1C211831E207D8 +:106220004207D98F38312821D98F22055D8D828090 +:10623000935785019CA1935705019CB19357850005 +:10624000BCA1A8B1828098411C41B98F1CC1D84122 +:106250005C41B98F5CC198451C45B98F1CC5D845B8 +:106260005C45B98F5CC58280032805005041370327 +:1062700000FFB708FF001445B375160133776800B7 +:106280005C454D8FC165938505F033FEB6003367DD +:10629000C70113FEF70F3367C70118C133FE16019C +:1062A000337766003367C70133FEB7003367C70132 +:1062B000137EF80F3367C70158C133FE170133F758 +:1062C00066003367C701B3F76700337EB8003378E1 +:1062D00018013367C701B3E70701137EF60F6D8E10 +:1062E000D18F93F6F60F3367C701D58F18C55CC5FC +:1062F0008280370701019357750013071710F98F34 +:106300006D47B387E7023707FFFE1307E7EF060580 +:10631000798D3D8D8280EF92BFED2A84EFF07FFD75 +:10632000135704019317040193168401D98F13574F +:106330008400558FB98F298CA98F13158400618033 +:10634000418D3D8D6F901FED14415C45370300FF7B +:10635000B708FF0003288500B3F5170133F766007F +:1063600050414D8FC165938505F0337EB80033678A +:10637000C701137EF60F3367C70118C133FE16013C +:10638000337766003367C70133FEB7003367C70151 +:10639000137EF80F3367C70158C1337E1601337778 +:1063A00068003367C70133FEB6003367C70133782F +:1063B000180113FEF70FB3F76700B3E707016D8EFF +:1063C000D18F93F6F60F3367C701D58F18C55CC51B +:1063D0008280EF92FFE12A84EFF0BFF12A89EFF08B +:1063E0005FF1AA84EFF0FFF0218DB3C7A4009316EC +:1063F000850133442401135785003349A90013153F +:1064000089003D8C558F1359890133692501398CD9 +:1064100013950701C183334424015D8D218D6F9055 +:106420007FDF935F0501135F850093538501814EE4 +:106430000143014E0146014893FFFF0F137FFF0FF9 +:106440001375F50F93020010B387050183C8070089 +:10645000B3C7030193F7F70F93C6F7FFFD17FD8E40 +:10646000E206FD8693C7F6FF7D8EB3C70F0193F753 +:10647000F70F13C7F7FFFD177D8F93F8F80F62072B +:10648000B3F6D8007D87558E9346F7FF33FEC601DD +:1064900033F7E800336EEE0033470F011377F70F41 +:1064A0009347F7FF7D17F98FE207FD8713C7F7FFC3 +:1064B0003373670033470501B3F7F8001377F70F1D +:1064C0003363F3009347F7FF7D17F98FE207FD87EA +:1064D00093C6F7FFB3F6D601B3F8F8000508B3EE9C +:1064E0001601E31358F69316860113170E01D98E81 +:1064F000B3E6D60113158300558D8280EF925FCCF1 +:10650000044113592600411185042A84328A8A04E1 +:10651000931A2900814963933A03B569930D4400A6 +:10652000CA8C5694014C054DB56A9389C9366D4B9A +:10653000914B63E09C0241016F905FCC3385350144 +:106540002EC6EFF09FCDB3073401C8C39109B24501 +:10655000D9B70840631A2C03050D93178500618194 +:106560005D8D93858A37EFF0DFEBB387A9019C231C +:10657000014CE2073D8D83A70D00850C050C3D8D78 +:1065800048C0910D110475B7E3090CFCE3754BFF8E +:10659000E3137CFF93858A37EFF0BFE8E9BFEF9202 +:1065A0003FC52A840841B56493858437EFF07FE7BF +:1065B00008C0484093858437EFF0BFE648C00844E0 +:1065C00093858437EFF0FFE508C44844938584370A +:1065D000EFF03FE548C46F90FFC3EF92DFBF1C416F +:1065E0002947411193F6B7FF2A89AE843284638725 +:1065F000E60031476384E700EF30602C2685EFF03A +:10660000DFC12AC013854400EFF03FC12AC21385C1 +:106610008400EFF09FC02AC41385C400EFF0FFBFD1 +:106620002AC6930549000A85EFF0FFC1930449018A +:106630008549832709000A8563E1F904EFF03FF6F5 +:106640000A85EFF07FC2A6850A85EFF0DFBF02451D +:10665000A285EFF0FFBD124593054400EFF05FBD4A +:10666000224593058400EFF0BFBC32459305C4007A +:10667000EFF01FBC41016F905FB9EFF05FF20A8548 +:10668000EFF09FBE02458509EFF0FFC82AC0124512 +:10669000EFF07FC82AC22245EFF0FFC72AC4324577 +:1066A000EFF07FC72AC6A6850A85EFF0DFB9C104DF +:1066B00049B7EF92FFB32A840841B56493858447B4 +:1066C000EFF03FD608C0484093858447EFF07FD570 +:1066D00048C0084493858447EFF0BFD408C44844B9 +:1066E00093858447EFF0FFD348C46F90BFB2EF9219 +:1066F0009FAE0041A94741111377B4FFAA892E89A3 +:10670000B2846307F700B1476304F400EF30201B45 +:106710004A85EFF09FB02AC013054900EFF0FFAFA4 +:106720002AC213058900EFF05FAF12042AC41104D6 +:106730001305C900EFF07FAE4E942AC6A2850A85E4 +:10674000EFF07FB003A90900130A04FF9309F9FFD2 +:1067500063960904C1553309B9020A85EFF0DFBE1B +:106760000A85EFF01FF50A854A94A285EFF0BFADC8 +:106770000245A685EFF0DFAB124593854400EFF0AC +:106780003FAB224593858400EFF09FAA3245938565 +:10679000C400EFF0FFA941016F903FA70A85EFF019 +:1067A000BFBA0A85EFF0FFF0D2850A85EFF0BFA9E6 +:1067B0000245411AFD19EFF0DFC12AC01245EFF082 +:1067C0005FC12AC22245EFF0DFC02AC43245EFF094 +:1067D0005FC02AC6B5BFEF92BFA12E84B2848145A7 +:1067E0001306400FEF90DFA36147AA876382E4029C +:1067F000130700026382E40241476394E4022947DD +:1068000018C14146A2853E85EFF05FCF6F909FA0F3 +:10681000314718C16146FDB7394718C11306000258 +:10682000D5B7EF30C009EF92BF9C1306400F8145EA +:10683000EF901F9FAA879C236F90DF9DEF92BF99D7 +:1068400013F4F60011711DE832892E86AA856800BE +:10685000BA89B684EFF03FF8636994006800EFF0FE +:106860009FFC014511616F905F9A33868900B305E3 +:1068700089006800EFF07FD64104F9BF7D55DDB790 +:10688000EF927F9513F4F60011711DE832892E8680 +:10689000AA856800BA89B684EFF0FFF363699400B3 +:1068A0006800EFF05FF8014511616F901F96338625 +:1068B0008900B30589006800EFF07FE34104F9BF68 +:1068C0007D55DDB7EF925F9019C5AA8A88412E8A5F +:1068D00032896364C500EF20907EB6843A84BE8B13 +:1068E000428C468B91E265FBE3870BFEE3050BFED2 +:1068F00005CD1DC8B309A94063733401A2894E8632 +:10690000A6855695EF30E00483270A00CE94330421 +:106910003441BE9923203A0163982901D6855A85CE +:1069200009E8029C23200A00637724011DE06F9090 +:106930003F8D829BC5BF83270A00D1FFA6855A855C +:1069400063172401029CCA9433042441F1BF829B43 +:10695000DDBF03250A00B309A94063733401A2898E +:106960004E86A6855695EF20D07E83270A00CE94CA +:1069700033043441BE9923203A01E3E929FBA1BF46 +:10698000EF921F87C2883E88EFF0DFF36F909F88F9 +:10699000EF929F832A8BAE89328AB68B3A893E8CDE +:1069A000C28C814A631409006F909F8583A40900FB +:1069B00033049A40637389004A8463980A002286EC +:1069C000DE8533059B00EF90BF8581E463138A0069 +:1069D000854AA294639A4401DA856685029C23A0C5 +:1069E0000900330989407DBF03A70900229723A02E +:1069F000E900C5BFEF922FFE41113A8BD4875C8727 +:106A000005474684C2546300E804428963060804CB +:106A10008947AA892E8AB28A6303F8042688C68722 +:106A20009306F1000547EFF0BFF514872688A2878B +:106A3000638766051307E9FFDA865686D2854E8599 +:106A4000EFF01FF525A0BD8ED4872688C6870547A1 +:106A50009306F100EFF0DFF241016F900FFB268803 +:106A6000C68705479306F100EFF09FF12688A287BD +:106A700005479306E1005686D2854E85E1BF130790 +:106A8000F9FF5686D2854E85EFF09FF0F1B7EF9271 +:106A90002FF6257119E1EF2090621C452A84280801 +:106AA00036C632C42EC2829722465C4492452808DC +:106AB0008297B2461C482808B6858297130680182C +:106AC00081452808EF90CFF5834781011D616F90C4 +:106AD0006FF4EF924FF0117119E1EF20505E2E84A8 +:106AE000EDDDB289814513068031AA843689EF90A5 +:106AF0002FF39C205C4080C063FB270B1840E3EE23 +:106B0000E7FC4A868A86CE852285EFF05FF8032966 +:106B10000400832944006379390133862941814582 +:106B200033052101EF90CFEF8147639CF9041C44AA +:106B3000138984004A8582975C4450400C014A8541 +:106B40008297544081476399F6041C449384041946 +:106B5000268582975C4450400C0126858297130657 +:106B6000000881450801EF90AFEB83470108130649 +:106B7000000881450A85EF90AFEA1C8011616F9093 +:106B8000CFE81801B306F7003307F1001823850793 +:106B90001347670398A251BF18013306F700330764 +:106BA000F100182385071347C70518A269BF4A8655 +:106BB000CE850A85EF20F059A9BFEF926FE319C186 +:106BC0001C4199E3EF20B04FDC47210582976F907D +:106BD0006FE4EF92EFE1397101C51C412A8499E31A +:106BE000EF20F04D2E89EDDD9C4B8A8521058297A3 +:106BF0001C40930404198A85D84790432685029740 +:106C00001C40CA8526859C4B82971306803181459E +:106C10002285EF90EFE01C2021616F90AFDFEF92B3 +:106C20002FDD130101CDB684AE86B5653284938520 +:106C300085672A8628083AC6EFF0BFE92686A2852E +:106C40002808EFF09FF732472808BA85EFF07FF861 +:106C50000145130101336F90EFDB935785019CA130 +:106C6000935705019CB193578500BCA1A8B18280C0 +:106C70001971D6D4DAD21841832E4500032E85002F +:106C8000032BC5001C49832F4501032F8501832A4F +:106C9000C501B562A2DEA6DCCADACED8D2D6E6CC71 +:106CA000EACADED0E2CEEEC89382825781463A8AA3 +:106CB000F6897289DA843E84FE837AC456C63D4DD5 +:106CC000930C00046363DD1283CB0500903113083D +:106CD0000101E20B4206B3EBCB00B0319105B3EBFF +:106CE000CB0003C6E5FF2206B3EBCB0013962600CC +:106CF00042962320760113D867009398A701B368C2 +:106D000018011396570113D8B7003366C80033C86B +:106D1000C80093D89701139677003366160133465F +:106D2000C80013C8F7FF3378E801B3F8F701334818 +:106D30001801429603A80200850691024296B29B72 +:106D40001318E70113562700DE9A33680601935B98 +:106D5000D70013163701B3EBCB0033467801135835 +:106D60006701931BA700B3EB0B01B34B760133C64E +:106D7000CE01798E33F8CE0133460601B29BD69B05 +:106D800033866A01728BFA8A639A96059E975CC96C +:106D9000A247329400C9BE9FB2477654D29B3E9F11 +:106DA0003C514E97CA9E269E85072320750158C1E7 +:106DB0002324D5012326C501232CF501232EE5012B +:106DC0003CD1E6545659C659365AA65A165B865BCC +:106DD000764CE64C564DC64D096182807E8F768E8C +:106DE000BE8FBA8EB2875E87F1BD1386E6FF3D8AFD +:106DF000130801050A064296032306FC138616FFB4 +:106E00003D8A0A064296832806FC138696FF13F8ED +:106E1000F6003D8A930B01050A060A085E985E9605 +:106E2000832B06FC032608FC131CF300935D33013F +:106E3000B29B13561301336CCC001316D300336688 +:106E4000B6013346CC001353A30033466600B29B11 +:106E500013D37800139698013366C30013DC28011E +:106E60001393E800336383013346660093D83800F8 +:106E7000B3481601C69B232078FDB5BDEF924FB7EE +:106E80002A8413068004814513050502EF904FB94B +:106E9000B7E7096A938777661CC0B7B767BB938764 +:106EA00057E85CC0B7F76E3C938727371CC4B7F729 +:106EB0004FA59387A7535CC4B7570E519387F72705 +:106EC0001CC8B777059B9387C7885CC8B7E7831F43 +:106ED0009387B79A1CCCB7D7E05B938797D15CCCEC +:106EE0006F904FB3EF92CFB0B77700002A88328708 +:106EF000AE86938707C7930545061306000413055E +:106F00000502EFF0FFA76F90EFB0EF92CFAC3C51CE +:106F100003294506011113D7A7019A073E99B334F7 +:106F2000F900BA949357D9018E04DD8C9307890038 +:106F300093F7F703B7780000130800042A84330896 +:106F4000F8402AC0938808C7814701479306000884 +:106F500013060004AE899305450613050502EFF0FC +:106F60007FA9131A390093D78400230DF10093579A +:106F70008A01230EF10093570A01420A135A0A01AB +:106F80002E09135A8A003369490121462C082285AB +:106F9000A30EF100231C0100A30D9100231F21016A +:106FA000EFF05FF47C5099C3EF2070110840CE855C +:106FB000EFF0BFCA484093854900EFF01FCA08446C +:106FC00093858900EFF07FC948449385C900EFF0AD +:106FD000DFC8084893850901EFF03FC8484893850A +:106FE0004901EFF09FC7084C93858901EFF0FFC678 +:106FF000484C9385C901EFF05FC6130680068145B2 +:107000002285EF90EFA105616F902FA0EF924F9E28 +:1070100059712E8413068006AA852800EF2070136C +:107020002800A285EFF07FEE65616F90AF9EEF9232 +:107030002F9C01111306000281450A85EF904F9E97 +:10704000854513050020EF20800D31653724014070 +:10705000EF10306F13050440EF101025B7070E0036 +:107060003EC68A85854713050440230AF10002C005 +:1070700002C202C402C8EF10302785451305044040 +:10708000EF10F02B814513050440EF10B03E1305BF +:107090000440EF10D02B930404402685EF10D02B32 +:1070A0006DFD1305044037240140EF10702B93044D +:1070B00004402685EF10702B6DFD13050440EF1082 +:1070C000F03C2391A182854513050440EF10903ACE +:1070D0000545EF10903705616F90CF93EF924F9178 +:1070E00037240140AA859D46054613050440EF104C +:1070F000D029854513050440EF10B02793040440C0 +:1071000089452685EF10703665DD13050440EF10C4 +:1071100050336F902F90EF92AF8D41112A89014427 +:1071200081446319B40033D5840241014205418191 +:107130006F904F8E4A852EC6EFF05FFAAA941545E0 +:10714000EF20603205041374F40FB245D9BF0397E2 +:10715000218281472A97634F070009CD0566930670 +:10716000F6FFB6876358C700AA876305D500931753 +:107170000701C1833E858280B7F7FF1F83A707728F +:10718000A94613D70701C207C1831D8D9307400687 +:107190003305F5029307B00255053345F502330771 +:1071A000D7023305A7408280EF928F84A9454145DD +:1071B000EFF07FF642054185EFF07FF98567938711 +:1071C00047CE3305F5023185EFF01FFB42054185BF +:1071D0006F904F84EF92CF81A9450545EFF0BFF343 +:1071E00042054185EFF0BFF68567938747CE3305AB +:1071F000F50231856F900F8263550500B7070001D6 +:107200003E95935705419CA1935785409CB1A8A1F9 +:107210008280EF82FFFD3A84AE8708A3130780F8CF +:1072200041113E8518B09305240036C432C6EFF0F4 +:10723000BFFC3246930554003285EFF0FFFBA246B7 +:10724000930584003685EFF03FFB41016F809FFC82 +:10725000B707002005679387C738130707B83705B6 +:1072600000203E971305055DFD5583C6D72E858A00 +:1072700091EA83A6472F1386472491CA63F4B60088 +:107280003285B6859387870BE391E7FE828032854E +:107290008280370700209306C73881471307C73815 +:1072A000414683C546266389A50085079386860BDC +:1072B000E399C7FE014582801305800BB387A702BF +:1072C000938747243305F7008280EF82DFF0AA8995 +:1072D000370500209304C53805690144138A442604 +:1072E000130909B81146CE8533058A00EF202064C2 +:1072F00019E51304840BE31724FF6F801FF11305B6 +:1073000044242695DDBF370700201306C738814780 +:1073100081461307C73821488348460B6397A80066 +:10732000850693F6F60F63E9D500850713068603F5 +:10733000E39407FF0145828013058003B387A7020A +:10734000938747083305F7008280EF82DFE8370430 +:1073500000209304044175712A89AE898146130483 +:1073600004417D572146DC58ADEB37D60000B7B558 +:10737000000037D500004A8713068671938505669D +:1073800013050572EF2030042684130600028145A0 +:107390002285EF80FFE8CA85130600022285EF20D0 +:1073A000B03B93040402CE8541462685EF20605A07 +:1073B0002810EFF0BFAC4146A6852810EFF09FB231 +:1073C0002C002810EFF09FC41C842308F402EF1057 +:1073D000D06348D849616F805FE38385040099EDED +:1073E00037D60000B7B5000037D500004A8713062E +:1073F0008671938505661305C57669B763F4E70062 +:1074000026843E87850693848403E39EC6F4B5BF35 +:10741000EF829FDB37E5000013054581370400202C +:1074200037E90000B7E90000EF20500E1304C4381C +:10743000814437EA0000B7EA000037EB0000B7EB01 +:1074400000001309C980938909818327442F638C25 +:10745000070CA68513054A82EF20E07693054424A5 +:1074600013850A83EF202076130600029305442635 +:107470001305CB83EF80FFF6130600029305442823 +:1074800013854B84EF80FFF537E5000013058599E0 +:10749000EF2060730326842A8325442A37E5000001 +:1074A0001305C584EF20207237E5000013054586DB +:1074B000EF2060718345D42E37E500001305058960 +:1074C000EF2060708345E42E37C50000130505BD2D +:1074D000EF20606F8347F42ECA8591E3CE8537E5B0 +:1074E00000001305458AEF20006E8325042F37E541 +:1074F00000001305C58BEF20006D8325442F37E571 +:1075000000001305C58DEF20006C8325842F37E51F +:1075100000001305858FEF20006B37E50000130591 +:107520000591EF20406A8504C1471304840BE39E54 +:10753000F4F06F80FFCC7D151375F50F8D4763E96F +:10754000A700B5679387C7690A053E950841828001 +:1075500037D500001305857B8280EF827FC901113A +:10756000B7D50000130600029385057C0A85EF203D +:10757000403EB7050020370500200A869385053B6D +:1075800013050539EFC06F98370400201304C43881 +:10759000854723A001762302F404B7D50000938722 +:1075A000017623A2070023A4070023A607009385E2 +:1075B000057E13850176EF201018B7D5000037053A +:1075C00000209385C57E1305153DEF20D016D147C9 +:1075D000230AF406B757D433938707753CDC930727 +:1075E0008030231EF4069147230FF4068564B70705 +:1075F0009808C1074146A294930544071385C19892 +:107600002320F408239304DEEF20A034B96537D596 +:107610000000938585931305C57FEFF01FD3B565F3 +:1076200037E500009385C56813054580EFF0FFD16D +:10763000930710102392F4DEB757DF029387475B5E +:107640003CD4B7E703019387C7C97CD49967938774 +:1076500087B63CD805616F80FFBBEF827FB9B7D496 +:107660000000B7B5000037D50000138684719385FC +:1076700045491305C56AEF2000555D260145252BB8 +:107680001384C19872248305040048408146EF00AA +:10769000D03A05CD37C4000037D500001386847179 +:1076A000930584181305056CEF20E05137D90000CD +:1076B0001305803EEF10305B1386847193058418A8 +:1076C0001305C96EEF202050E5B7562430240C3442 +:1076D0000824014885470147EF0050716F809FB330 +:1076E00001A0B707EFBE37E700E0938707083CC764 +:1076F00001A0EF827FAD69710945EF10007DEF10A9 +:10770000001FEF10B053116585451105EF103021B2 +:1077100037140140930700208D4413050480FC803A +:107720000C08E14726CA3ECCEF10E06C93070040FE +:1077300013050480FC800C08914726CA3ECCEF104C +:10774000806BF1673744014093870720130504805D +:107750003ECE6C08B7070C003ED202D023140102C3 +:10776000EF10D041854513050480EF10304A37E50E +:10777000000013054597EF200045B707002083A6BA +:10778000071F37C40000B7B4000037E50000130638 +:10779000040E9385046613050598EF20C042EF1090 +:1077A000E064AA8637E500001306040E938504669C +:1077B0001305C599EF202041EFF03FDAEFF0FFE924 +:1077C000EFF0FF86EFB06FBAEF10302423AEA18048 +:1077D0001306400381451385C194EF807FA40145C2 +:1077E000EF80FFDE0547371A00202382E182814ABD +:1077F000014BB7EB000037EC0000130ACA38B7445E +:1078000001409305000213850480EF1090428547E4 +:107810006313F50E13850480EF1030419314850136 +:10782000E1849307D0046391F408B7B5000037E50D +:1078300000001306040E9385C54E1305859BEF20AB +:10784000803837E600009305400B5687DA87130629 +:10785000469D6810EF20206185456810EFA00FE578 +:10786000930730046399F408B7040020938404411B +:107870008149A14C8387040095C3D45885C203C7AE +:1078800004032686CE851385CBA7EF20C03341465F +:10789000938504021305CC83EF80BFB485099384DC +:1078A0008403E39999FD81A8930700036392F4028E +:1078B000B7B5000037E500001306040E9385C54EEA +:1078C0001305459EEF2020300145EF805FD049BF72 +:1078D00093076004639EF40AB7B5000037E5000023 +:1078E0001306040E9385C54E130585A0EF20A02D29 +:1078F0000545EF80DFCD9306F1001306E100930507 +:10790000D1006810EFA0AFFD31CD565637E500002D +:10791000AC18130585ABEF80DFAC8307F10083065D +:10792000D1001387C1943EB776A30307E100B7B532 +:10793000000037E500001306040E9385C54E1305BD +:1079400045ACEF2040286810EFA0CFE983474ADE1E +:1079500081C76810EFA05FDB1306401081456810F7 +:10796000EF801F8CA12CAA8609CDB7B5000037E5A2 +:1079700000001306040E93854549130505B0EF205A +:10798000802493871A0033B757013A9BBE8A85BD7E +:107990009307E0046395F400EFF09FA7A9BF930756 +:1079A0004004E39FF4EAEF10500637E600002AD6C1 +:1079B0005687DA871306C6A29305400B13052103E9 +:1079C00023180102EF20204A37E50000130505A522 +:1079D000EF20601F370500206C101305055DEF9048 +:1079E0002FED11BFEF82DF808387E18285C3AA86F6 +:1079F00037E60000B7C5000037E500001306C6BC37 +:107A000093858518130545BDEF20E01B37E4000082 +:107A1000130544BFEF20201B0545EF10D024CDBF38 +:107A2000EF826FFB0111A387018285453705420074 +:107A30002387018202C002C202C402C602C802CA6F +:107A400002CC231E0100EF10606F0565854513050C +:107A5000C505EF10C06C37140140C1490D4AC1473C +:107A60008A85130504807C804EC452C2EF10A03872 +:107A70006149930700028A85130504807C804AC40B +:107A800052C2EF1040379144930700048A851305D2 +:107A900004807C8026C4EF100036930700088A8596 +:107AA000130504807C80372401404AC452C2EF1081 +:107AB000803485478A85130504807C804EC4EF108E +:107AC000803389478A85130504807C8026C4EF10A3 +:107AD00080328A8513050480648026C4EF10A031AB +:107AE000A1478A85130504807C804EC4EF10A03026 +:107AF000B70704013EC6B70700023ECA6C009D47A7 +:107B000037350140FC864ACC02C8EF10900005468C +:107B100013050480A145EF10A03A85453735014093 +:107B2000EF10100305616F804FEEEF82CFEAAA8459 +:107B3000371501402E89328AC1450146130505805B +:107B4000EF1000380144631C44013715014005461D +:107B5000C14513050580EF10A0366F800FEB930928 +:107B6000F00F63060900B307890083C90700894540 +:107B700037350140EF10E07F7DD9CE8537350140A4 +:107B8000EF10A07E854537350140EF10807E7DD90E +:107B900037350140EF10A07D81C4B387840088A3EE +:107BA000050455B7EF82CFE42E86AA850145EFF094 +:107BB000DFF76F802FE62387A182828003A50183F0 +:107BC0008280EF824FE1AA84B729014005452E8AC1 +:107BD00032840149EF1030099389098063079900C5 +:107BE00089454E85EF10202D09ED37250140894547 +:107BF00013050580EF10202C11E9054422856F80C4 +:107C0000CFE02945EF1030060509C9BF37E600006F +:107C100037E500002687D2861306C6BC01CCB7C55F +:107C20000000938585181305C5E2EF10D079514502 +:107C3000EFF05FDBB7B50000938545491305C5E25A +:107C4000EF10707865BFEF82AFDA2945EF10B00111 +:107C5000372401400146A14513050480EF1040265A +:107C60005145EF105000130504800546A145EF1063 +:107C7000202537E60000B7B5000037E50000130601 +:107C8000C6BC93854549130505CEEF10D073294531 +:107C9000EF10607DB7E50000056505469385C5CF0B +:107CA00013058538EFF0FFF16F80CFD6EF82CFD18B +:107CB00085642E8B0144014993848438854BB7EA4F +:107CC000000037BA0000B7E90000254C4A86DA8583 +:107CD0002685EFF01FEF63027503A2861386CABCE8 +:107CE00093054A49138509E6EF10F06D2945EF1019 +:107CF00080770504A9476314F4006F806FD0E31701 +:107D000084FD0549E1B7EF822FCCAA892E8A05654B +:107D1000B7E500004111B28A938545F40546130585 +:107D20008538EFF01FEA8387E182A1E3B5475686E5 +:107D30005C80D28593D7890013053100DC80230154 +:107D40003101EF10104193853A000A85EFF09FE56D +:107D5000B7E5000005650146938585F5130585386F +:107D6000EFF03FE641016F80AFC9B7E4000037B9DB +:107D7000000037E50000CE861386C4BC9305C94ECB +:107D80001305C5F6EF1030645284338B4A01B7EB0C +:107D90000000E30D64F914201386C4BC9305C94E9A +:107DA00013854BF9EF1030620504E5B7EF82AFC2DF +:107DB000AA892E840565B7E500000111B284938578 +:107DC00085C4054613058538EFF0BFDF8387E18260 +:107DD00037EA00001389E182B7BA000081CF37E5A6 +:107DE0000000CE861306CABC9385CA4E1305C5C5CE +:107DF000EF10705D3946814513052100EF804FC2B9 +:107E0000F5475C8093D78900DC808307090002C8AE +:107E100002CA02CC02CE2301310199CB37E5000022 +:107E20001306CABC9385CA4E130505C8EF10B05996 +:107E3000138644008A850808EFF03FCF37E500003D +:107E40001306CABC9385CA4E1305C5C9EF10B057B7 +:107E500026864C082285EF10D02F8307090091C792 +:107E6000A29437E90000631F9400B7E500000565A0 +:107E70000146938545CB13058538EFF09FD4056106 +:107E80006F80AFB814201306CABC9385CA4E130581 +:107E900089CCEF1050530504F9B7EF826FB541114B +:107EA0002A8405469305F10013056073A3070100BA +:107EB000EFF0DFEF988785469377B70F6304D40020 +:107EC000936747009305F100054613056073DC874F +:107ED000EFF07FE341016F80EFB3EF826FB1AA84CF +:107EE0002E890565B7E5000041113284938585EF41 +:107EF000054613058538EFF0DFCC8387E18285C323 +:107F000037E60000B7B5000037E50000A686130687 +:107F1000C6BC9385C54E1305C5F0EF10D04A228626 +:107F2000CA85130511004480EF10B0228A8513061C +:107F300014002E85EFF07FBF8880A9471374E500F9 +:107F400063EE87028547B397870013F7075409EB61 +:107F500013F517083335A0003305A0401374F50F4F +:107F6000B7E5000005650146938505F313058538DF +:107F7000EFF03FC5228541016F80CFA90144CDB705 +:107F8000EF820FA42A8BAE8B328C854437E9000038 +:107F900037BD0000B7ED0000B7BA000037EA0000B7 +:107FA000A9496286DE855A85EFF03FF38387E18237 +:107FB0002A8491CBAA861306C9BC93050D66138546 +:107FC0008DE8EF10504015CC2687A2861306C9BC59 +:107FD00093854A4913050AEA8504EF10D03EE392DF +:107FE00034FDB7C5000037E50000A2861306C9BC02 +:107FF00093858518130505EDEF10F03C5545EFF01E +:108000007F9E6F80AF9FEF82AF9E4111C88793051F +:10801000F100054613050008EFF09FF641016F805F +:108020006F9FEF82EF9C1307206741118147630226 +:10803000E5041307606D8547630DE5021307A07320 +:1080400089476308E50205679306C78F8D4763027A +:10805000D5029306479C9147630DD500930627B23E +:1080600095476308D5001307C7C19D476313E50013 +:1080700099475C869307803EB385F50291679387A5 +:1080800097D0114613057009B3D5F50293D70501B2 +:10809000DC8693978500C205C181A181DD8D6C8747 +:1080A0006C00EFF0FFED41016F80CF96EF824F94AF +:1080B0004111C8879305F100054613059008EFF0BC +:1080C0003FEC41016F800F95EF828F924111C8877D +:1080D0009305F10005461305D009EFF07FEA410151 +:1080E0006F804F93EF82CF90B7F7A43593870790B7 +:1080F000411163FFA700FD779387179E7C866C0074 +:10810000094613058009EFF0BFE741016F808F90AA +:10811000B707AA329387078863F6A700F977938792 +:1081200077BDE9BFB747E52D9387074863F6A700FA +:10813000F1779387175CD9B7B7176B1B938707B095 +:1081400063F6A700E177938757174DBFB707551917 +:10815000938707C4E3F5A7FA9D679387B7F679BFBE +:10816000EF820F8941112A84EFF0DFF73756E801DB +:108170008146130606801315940193557400EF1081 +:10818000E03A935785015C8693570501DC86931787 +:1081900085004205418121815D8D68876C00114613 +:1081A00013056008EFF0DFDD41016F80AF86EF82DD +:1081B0002F844111C8879305F10005461305600916 +:1081C000EFF01FDC41016F80EF84EF826F8241117D +:1081D0004886CC8609466C001305F008EFF05FDA9C +:1081E00041016F802F83EF82AF8075574111F557A2 +:1081F0006343E500AA8793968701E1865947635355 +:10820000D700D947CC8609466C001305E0085C8688 +:10821000EFF01FD741016F70FFFFEF727FFD41113B +:108220004886CC8650876C00114613055009D487C8 +:10823000EFF01FD541016F70FFFDEF72FFF8F557AA +:108240002A8B4111B28A368A755563C3F5002E8593 +:10825000131785016187D94763D3E7005945931404 +:108260008501EFF05F9E09466C0013050074EFF086 +:10827000FFB300869C86B7E9000022043E944204C6 +:10828000418037B9000037E50000A2861386C9BCDB +:108290009305C94E1305C5B1EF10F0128967938796 +:1082A000474BE184CE8B6307F4028567938747428F +:1082B0006302F402B7C5000037E500001386C9BCAD +:1082C00093858518130585B3EF10F00F41454101E3 +:1082D0006F701FF337E500001386CBBC9305C94EC2 +:1082E0001305C5B6EF10300E0145EFF0DFD105459F +:1082F000EFF09FDD63880A00856593858538568594 +:10830000EFF03FD21305F007EFF05FDA37E500003A +:10831000D2861386CBBC9305C94E130585B8EF10E2 +:10832000900A014563130A000545EFF05FE88145B7 +:108330000145EFF09FE9854601469D451145EFF067 +:10834000DFED0565E14705469305B1001305758E20 +:10835000DC85EFF05F9B91452685EFF0DFE85A85DD +:10836000EFF01FE00145A5B7EF729FE89317850076 +:1083700021815D8D93978500A181DD8D9317860006 +:10838000218241115D8E93978600A18268846C855D +:108390007086DD8E2C00214621457487EFF05FBE8C +:1083A00041016F703FE7EF72BFE42A84AA8637E687 +:1083B0000000B7B5000037E5000041111306C6BC48 +:1083C0009385C54E130585D4EF10E07F09ECA30714 +:1083D00001009305F10005461305F009EFF05FBABF +:1083E00041016F703FE38547DC87E5B7EF725FE0DF +:1083F0004111C8879305F10005461305000AEFF007 +:108400003FB841016F701FE1EF729FDE4111C887D5 +:108410009305F10005461305A008EFF07FB6410172 +:108420006F705FDFEF72DFDC41114886CC865087CA +:108430006C0011461305B008D487EFF07FB44101FA +:108440006F705FDDEF72DFDA9317850021814111D4 +:108450005D8D68866C0009460945EFF07FB24101E9 +:108460006F705FDBEF72DFD82A89AE840565B7E5F0 +:1084700000004111938505C0130585383284EFF063 +:10848000FF828387E18285C337E60000B7B500002D +:1084900037E50000CA861306C6BC9385C54E130592 +:1084A00045C1EF1040728A8502C0130614002E8564 +:1084B00002C202C402C623002101EFF00FE781C807 +:1084C00019C42286930511002685EF1080480545C2 +:1084D000EF007079B7E5000005650146938585C317 +:1084E00013058538EFF0EFED41016F70BFD2EF72E9 +:1084F0003FD041112A89AE8432846C001146514527 +:10850000EFF05FF69C878583B307F0402300F90006 +:108510001C871397870161876348070089839CA0A4 +:1085200018A041016F701FCF938707F08987C5BFDF +:10853000EF721FCC41119305F10005461305000CA5 +:10854000EFF05FF2888741016F70DFCCEF725FCA96 +:108550008387E18241112A8485C3AA8637E6000019 +:10856000B7B5000037E500001306C6BC9385C54EBD +:10857000130545D0EF1020650145EFF0DFA89357B4 +:1085800004015C860D46935784006C001305200897 +:108590004087DC862944EFF0BF9E93040005EFF08E +:1085A0003FF9137505076307950005457D14EF0036 +:1085B000906B75F4EFF0DFF713750507930700056F +:1085C0006303F50237E60000B7C5000037E5000099 +:1085D0001306C6BC93858518130585D2EF10A05EDF +:1085E0004945EFF02FC041016F70DFC2EF725FC0ED +:1085F00001112A840145B6843ACA3EC842C62ECE2D +:1086000032CCEFF05FDA0145EFF05FDE0545EFF0C9 +:10861000BFDF6246F24581462285EFF0BFE09396C8 +:1086200084005247A180D58C2394918293868182C5 +:108630003248C24725C30546B0A2B8B2333500015F +:10864000B337F000DCA2C8B2EFF03F85938581829A +:1086500019461305C008EFF0BF92814601468145D7 +:108660001305F03FEFF05FD037E60000B7B500002C +:1086700037E500001306C6BC9385C54E130585BAC1 +:10868000EF106054370500017D15EFF03FEC0561F8 +:108690006F705FB8130700F0BAA24DB7EF725FB505 +:1086A0008387E18241112A899384E18285C3AA8666 +:1086B00037E60000B7B5000037E500001306C6BC7A +:1086C0009385C54E1305C5D7EF10E04F0145EFF078 +:1086D0009F93838704004164130404A03304890238 +:1086E0008DC337E60000B7B5000037E500002287EC +:1086F000CA861306C6BC9385C54E130545DAEF102E +:10870000804C935704010D4621806C0013053008FE +:108710005C86C08623070100EFF09F8683870400F4 +:1087200099CF37E60000B7B5000037E50000130623 +:10873000C6BC938505661305C5DCEF10C0485144DF +:1087400013090006EFF0DFDE137505076307250147 +:1087500005457D14EF00305175F48387040099CFEF +:1087600037E60000B7B5000037E500001306C6BCC9 +:108770009385C54E130545DFEF10E044EFF05FDB56 +:1087800013750507930700066303F50237E600003B +:10879000B7C5000037E500001306C6BC93858518F1 +:1087A0001305C5E0EF1020424D45EFF0AFA34101A6 +:1087B0006F705FA6EF72DFA341116C000D46494553 +:1087C000EFF05FCA9C860887A2075D8D41016F703C +:1087D0007FA4EF72FFA141112E84AA846C000D4684 +:1087E0004D45EFF03FC89C869CA01C871CA0410112 +:1087F0006F705FA2B71702409843B706FFF04111B0 +:108800001367170098C3D84337060200758FD8C383 +:108810009843B706F7FEFD16758F98C39843B706C1 +:10882000FCFFFD16758F98C3D843B70601FFFD16F0 +:10883000758FD8C39843B70600ECFD16758F98C3A3 +:108840003707FF0098C723A6070202C402C6984351 +:10885000C166558F98C3B716024005679C42F18FD9 +:108860003EC6A24785073EC4B24781E7A247E397C9 +:10887000E7FEB71702409C431397E70063570706CC +:1088800085473EC632478547631FF704B717024046 +:10889000D843B706C1FFFD16D8C3D843D8C3D843C1 +:1088A00013670740D8C3D843758FD8C3D843B706DA +:1088B0002900558FD8C39843B7060001558F98C338 +:1088C000984393166700E3DD06FED843B7160240CF +:1088D000719BD8C3D84313672700D8C32147DC4214 +:1088E000B18BE39EE7FE4101828002C661BFB716ED +:1088F0000240D842B70700201146318B9387071FEB +:108900006305C70021466308C70237177A001307BB +:10891000072098C337170240584311839376F70016 +:10892000370700201307070036971423984333575F +:10893000D70098C38280D842D442416649833D8B98 +:10894000F18E1306270015CF3D47630FE60241471E +:10895000630FE602454781456313E6004146A1E205 +:108960003747024003270780418B0DC737177A002E +:10897000130707203306C70290C3C9DD9843058358 +:1089800049BF81454946E1BF85453546C9BF814557 +:108990003D46F1B737173D0013070790E1BF371584 +:1089A000024058559316F700585563DF06041183AB +:1089B0003D8B9306170037177A00130707203357AC +:1089C000D70298C35455A182BD8A8DE295463307DC +:1089D000D702058398C337170240585794433D8BFD +:1089E000050733D7E60298C3984369B705456394F2 +:1089F000A600E546E9BF3D456396A600D14633870C +:108A0000E602C9BF8906E5BF3D8B930617003717FD +:108A10007A00130707203357D702F1B701A09781D7 +:108A2000FF1F938121FD17F1FF1F1301A15D176542 +:108A300000001305E5829775FF1F9385A55C1386DB +:108A4000818163FAC5008322050023A0550011052A +:108A50009105E3EAC5FE13858181938501796377EA +:108A6000B500232005001105E36DB5FEFD427390AE +:108A700002BCAD4273904280B762000093828208CC +:108A8000739002309772FFFF9382025893E2320094 +:108A900073905230EFF01FD697F2FFFF9382A2C57A +:108AA0007390123473002030EF728FF4B7270140B7 +:108AB00093870740631CF500854513050020712D41 +:108AC000814513050020512D6F70CFF4B737014059 +:108AD00093870780E31AF5FE854513050040B52D01 +:108AE000814513050040C5B75C413707F1E0130726 +:108AF000F7EF944D7D8F9C41D58FD44DD58FD441C8 +:108B0000A206D58FD98F5CC11C4537F7F1FF13073B +:108B1000D77FD4457D8F9C49D58F94458606D58FC8 +:108B2000D98F1CC55C55370710FF7D177D8FDC2959 +:108B3000FD1793F7F70FD207D98F5CD582801C45BC +:108B400089C593E717001CC58280F99BEDBF1C45C2 +:108B500093E787001CC5828008450D8105898280C6 +:108B60001C4593E747001CC582800845098105899B +:108B700082801C4591C537075000D98F1CC5828063 +:108B80003707B0FF7D17F98FD5BFA54763F7B70447 +:108B90008D47138765FF3307F7020328C5009D47FC +:108BA000B397E70093C7F7FFB3F70701B396E60063 +:108BB000DD8E54C5994763E3C70495477D16330698 +:108BC000F6025859FD47B397C70093C7F7FFF98FCF +:108BD0003396C5005D8E50D982800D473387E502FC +:108BE000032805019D47B397E70093C7F7FFB3F745 +:108BF0000701B396E600DD8E14C96DBFB14763E28D +:108C0000C702954765163306F6021859FD47B39714 +:108C1000C70093C7F7FFF98F3396C5005D8E10D953 +:108C2000828095474D163306F6025855FD47B39797 +:108C3000C70093C7F7FFF98FB395C500DD8D4CD5FD +:108C400082806845420541818280B7270140938731 +:108C50000740984711C5B7068000558F98C7828096 +:108C6000B70680FFFD16758FD5BF08416D8D333572 +:108C7000A00082805C4191C537070004D98F5CC198 +:108C80008280370700FC7D17F98FD5BFEF724FD672 +:108C900001112A8423040100A5441C8463F9F4040F +:108CA00023040100A54621461C8463FFF606231514 +:108CB00001002304010095461C8463F1F60E3885FB +:108CC0003C8599460D46B3F7D70205651305058027 +:108CD000B3D7C7023357D702BA97C207C1837C857F +:108CE0003C8505611D8D420541856F70AFD21C44E6 +:108CF00093E787001CC42285EFF01FE66DFD1C443E +:108D000093E747001CC42285EFF03FE66DFD7844F1 +:108D10001C8414108607B6972396E7FE1C848507EB +:108D200093F7F70F5C8495BFA30401009C846378DC +:108D3000F6001C84850793F7F70F5C84B5B7988419 +:108D40009C840C100607850786072E97AE9703575D +:108D5000C7FE83D7C7FE63FDE7029C848607AE97F4 +:108D600083D7C7FE7C859C84988485078607AE9749 +:108D700083D5C7FE931717001810BA972396B7FE2E +:108D80009C8438850C1085078607AE972396E7FEEE +:108D90009C84850793F7F70FDC8449BF1C8410106F +:108DA000388589078607B29783D7C7FEBA97C20767 +:108DB000C1837C851C84850793F7F70F5C84EDBD28 +:108DC000EF720FC305454D2E01457D266F708FC490 +:108DD0004111B777004002C6938707C03EC6B2472D +:108DE0003E952AC6B2478CC341018280B7F7FF1F68 +:108DF00003A5477082809C4513F7070113F8F7001D +:108E000001C7D8413368E8008E2113F7F50F39C345 +:108E100018418146854E3D4F930F80029302800496 +:108E2000214E3396DE00B3F8C50063111603939804 +:108E3000260033131F011343F3FF3377E300B31806 +:108E4000180133E7E800639FF70550C98506E39AE8 +:108E5000C6FD18C11307F00F6375B70454412146CE +:108E6000854E3D4F930F800293028004414EB3988C +:108E7000CE0033F715016392E8021317260001179D +:108E80003313EF001343F3FFB376D3003317E80037 +:108E9000D98E639DF701232A15010506E319C6FD46 +:108EA00054C18280E39457FA10C94DB7E39757FE37 +:108EB00023281501DDB708456D8D3335A00082806C +:108EC00019C20CC982804CC9828023AAA1828280E7 +:108ED00003A74183894710216311F70214318D479D +:108EE00063EDD7003C219A0637E700E09607D58F5F +:108EF00093F7F70F32972300F740544105479357F4 +:108F000056003317C70089CA938707048A07B7E654 +:108F100000E0B69798C3828093870706B7E600E023 +:108F20008A07B69798C30F100000828037770040F9 +:108F30001C4309C593E707101CC3828093F7F7EF22 +:108F4000E5BFB7160240DC4251777D17F98F5D8D82 +:108F5000C8C28280B717024023800702238007021D +:108F600005476306E50011476306E500828023801C +:108F7000A702828015472380E702828037170240CC +:108F80001C535D8D08D3828001C9371702401C53E2 +:108F9000A166D58F1CD38280B71602409C526177A0 +:108FA0007D17F98F9CD28280371702405C4391462F +:108FB000B18B6385D700A1466382D706B7177A00C5 +:108FC000938707201CC1371602405C4237070020F8 +:108FD000130707019183BD8BBA9794231C41B3D724 +:108FE000D7005CC15442A1829D8ABA969422B3D61E +:108FF000D70014C55442AD829D8A36971823B3D743 +:10900000E7005CC558423983937637001387418067 +:1090100036971823B3D7E7021CC982805C435843B4 +:10902000C166C983758FB7F6FF1F83A6C670BD8B57 +:1090300089071396160163480600C54601466392E8 +:10904000D702C94739A88946638FD702BD46638EC8 +:10905000D702C146638ED702C54601466393D70047 +:10906000C1471DEF3747024003270780418B05C7E3 +:1090700037177A0013070720B307F7021CC121D660 +:109080001C41858381B701466DBF0546B547D1BFF9 +:109090000146BD47F9B737173D0013070790E9BFF1 +:1090A000B7150240D8559316F700D85563DF06046C +:1090B00011833D8B9306170037177A00130707209B +:1090C0003357D70218C1D455A182BD8A8DE2954687 +:1090D0003307D702058318C1371702405857144188 +:1090E0003D8B050733D7E60218C1184171B7854596 +:1090F0006394B600E546E9BFBD456396B600D14628 +:109100003387E602C9BF8906E5BF3D8B930617008A +:1091100037177A00130707203357D702F1B799C5DD +:10912000371702401C4F5D8D08CF8280B717024071 +:10913000984F1345F5FF798D88CF828099C53717F1 +:1091400002405C4F5D8D48CF8280B7170240D84FF8 +:109150001345F5FF798DC8CF828099C53717024036 +:109160005C475D8D48C78280B7170240D8471345DA +:10917000F5FF798DC8C7828001C9371702401C539B +:10918000C166D58F1CD38280B71602409C524177AE +:109190007D17F98F9CD282809357550005476399BC +:1091A000E700B71702409C4333D5A70005898280AA +:1091B00009476396E700B71702409C53F5B7B71706 +:1091C0000240DC53D5B7B737004003D7078089C5C5 +:1091D000598D2390A78082801345F5FF798DD5BFE7 +:1091E000B737004003D74780136707012392E78012 +:1091F00082803737004083574780C207C183BD9BB9 +:10920000C207C1832312F78082803736004083561D +:1092100086810357868142074183E31AD7FE37369A +:1092200000408356C6818357C681C207C183E39A33 +:10923000D7FEB735004003D6858103D58581420529 +:109240004181E31AC5FE630CA700B736004003D77F +:10925000C68183D7C681C207C183E39AE7FE420570 +:109260005D8D8280EF62DFF841112AC6EFF05FF773 +:109270003245B7370040135705014205239CE7806C +:109280004181239EA780EFF0DFF641016F609FF8D8 +:10929000EF621FF641112AC6EFF09FF43245B7374F +:1092A0000040135705013D8B42052394E78041811F +:1092B0002396A780EFF0FFF341016F60BFF53737CA +:1092C00000408357478093F70702E5DF82803737F6 +:1092D000004083574780C207C183DD9BC207C1831B +:1092E0002312F7803737004083574780A18BEDDF8B +:1092F0008280B737004003D747801345F5FF798D4B +:109300002392A7808280EF62BFEEEFF09FFE6F6036 +:109310007FF01A218D6793870704B6217D8F9E21E8 +:10932000D58FD621D58FF621D58F9625D58FB62509 +:10933000D58FD625D58FF625D58FD98F1EA15A2D3D +:10934000FD779387F77FF98F5EAD9E291EA98280F6 +:109350001E2189C593E707041EA18280C207C1832D +:1093600093F7F7FBC207C183C5BF4EA582804A258C +:1093700082800A256D8D3335A0008280EF625FE721 +:109380001629F577FD17F58FF621DA257971D58F36 +:109390001EA95625FD779387379FF58FD6212A84FE +:1093A0002EC6D58F9625D58FB625D58F5EA55E297D +:1093B000C207C18393F7F7CFD98F5EA96808EFF092 +:1093C000BFBEB747014093870780B245631EF402D2 +:1093D000A2576547B387E7029841930640060A07FC +:1093E000B3D7E70233D7D702B3F7D70212079207F2 +:1093F00093872703B3D7D702BD8BD98FC207C18309 +:109400001EA445616F601FE19257E1B791C55E25CB +:109410000967D98F5EA582805A25F977FD17F98FE4 +:10942000D5BF93F5F51F4EA182804A211375F51F14 +:1094300082800A216D8D3335A0008280B70700201D +:1094400083A7071F37177A0013070720B3D7E70250 +:1094500093F7F70F238DF1821307803EB387E7025E +:10946000239CF1828280B7F700E0D8438146799B44 +:10947000D8C303D781833306A70290CBD4CB9843BC +:109480001367070198C398431367170298C3D8431B +:10949000058B75DF9843799B98C38280EF62BFD3B9 +:1094A000B7440140AE893289014493840480634506 +:1094B00024014A856F607FD5930500042685EFF06F +:1094C0005FF77DD9B387890083850700268505046A +:1094D000C205C181EFF0FFF4D9BF138781801C431F +:1094E000938601793E95636BD500B78600209386FD +:1094F000068063E5A60008C33E858280FD57EDBF68 +:1095000011CE93070002918F635BF000B395C50005 +:10951000B357F5003316C500DD8D32858280930583 +:1095200006FE0146B315B5003285CDBFB687B288B9 +:109530002A832E88639B061463F8C50A4167636B10 +:10954000E61AB70700016360F63493568601E147D7 +:1095500017570000130707A636971823BA97130763 +:1095600000021D8F19CB3398E500B357F500B318EF +:10957000E60033E807013313E50013D6080133553D +:10958000C80293960801C182935703013377C8023A +:10959000B385A60242073368F700637AB80046989D +:1095A0009307F5FF636418016365B8303E8533089F +:1095B000B8403357C8024203135303013378C8023B +:1095C000B386E602420833686800637BD800469899 +:1095D0009307F7FF6365180179176363D8003E8727 +:1095E0004205598D8145828001E60547B358C7027F +:1095F000416763E8E80EB707000163EAF82893D6ED +:109600008801E147175700001307C79A36971423BC +:10961000BE9693070002958FFDE7939E080133875E +:10962000154113DF080193DE0E01854593570301B1 +:109630003355E7033377E703B306D5034207D98FE2 +:1096400063FAD700C6971307F5FF63E4170163E5D4 +:10965000D7263A85958F33D7E70342031353030187 +:10966000B3F7E703B30ED703C207B3E7670063FBA3 +:10967000D701C6979306F7FF63E51701791763E3F0 +:10968000D70136874205598D828063E1D504C167D1 +:1096900063E1F604B707000163E3F61E13D7860102 +:1096A0006148975700009387E790BA979823130E65 +:1096B00000024297330EEE40631A0E0C63EDB61CA7 +:1096C0003335C5001345150081458280814501452C +:1096D00082809307F00F63F3D71C13D786002148CD +:1096E000C9B71307F00FC686E37E17F193D688003B +:1096F000A14709BF1307F00FB286E37BC7E4935677 +:109700008600A147B1B5B398F80033D6D50013DF72 +:109710000801335EE6033397F500B356D500558F45 +:10972000939E080193DE0E013313F5009355070154 +:10973000B376E603B387CE03C206CD8E63FBF60095 +:10974000C6961306FEFF63E4161763F2F616791E3B +:10975000C6969D8E33D6E60393170701C183B3F6F1 +:10976000E6033385CE02139706015D8F637BA70066 +:1097700046979307F6FF636817136376A712791667 +:10978000469793150E01098FD18D4DB5B357E6005D +:10979000B396C601DD8E33D3E50013DF0601B35760 +:1097A000E303939E060193DE0E013398C501335700 +:1097B000E50033680701935808013316C601337377 +:1097C000E303B385FE024203B368130163FBB800F1 +:1097D000B6981387F7FF63EAD80C63F8B80CF9174B +:1097E000B698B388B84033D7E80342081358080145 +:1097F000B3F8E8033383EE02C208B3E5080163FB64 +:109800006500B6951308F7FF63EDD50863FB65089F +:109810007917B695C207416FD98F1307FFFFB3F6CB +:10982000E70093D80701718F4182B38EE602B385BA +:109830006540B386C60213D80E013387E802BA9694 +:10984000C2963386C80263F3E6007A9693D806017F +:10985000469663E2C5026385C5003E8581458280E8 +:1098600041677D17F98EC206B3FEEE003315C501C0 +:10987000F696E374D5FE1385F7FF8145828013D7F2 +:109880000601414839BD93560601C147D1B193D66F +:109890000801C14785BB814505458280368701485F +:1098A00009B5428785BF3E86E9BDBA871DBF328EA6 +:1098B0004DB579154698E5B97915C69761BB411143 +:1098C000194506C69D230545EF10103929468145E7 +:1098D0006F00607E0325C50E82809387C1809C4304 +:1098E0009C5389E79767FF1F9387C77303A5C70E2C +:1098F00082809387C180AA858843E5AA91ED4111B2 +:109900006C00014501CA795591C61C229CC10822F0 +:109910003335A00041018280014509CA795599C6B5 +:109920001C229CC108223335A0008280828001471E +:109930006314E60001458280B307E5000507B3869E +:10994000E5009C2383C6F6FFE384D7FE3385D7402A +:109950008280B3C7A5008D8B3307C50081E78D4793 +:1099600063EDC700AA87637EE50894218507850516 +:10997000A38FD7FEE3EBE7FE828093763500AA87BC +:1099800089CA942185078505A38FD7FE93F63700F2 +:10999000C5BF9376C7FF138606FE63F0C70683A391 +:1099A000050083A2450083AF850003AFC50083AEE9 +:1099B000050103AE450103A3850183A8C501938575 +:1099C000450223A0770003A8C5FF23A2570023A4C4 +:1099D000F70123A6E70123A8D70123AAC70123ACD7 +:1099E000670023AE17019387470223AE07FF75B7C1 +:1099F00090419107910523AEC7FEE3EBD7FEE3E666 +:109A0000E7F6828063F1A504B386C500637DD502C5 +:109A10009345F6FF8147FD176393F50082803387F6 +:109A2000F600034807003387C7002A972300070181 +:109A3000DDB73387F50014233307F500850714A33A +:109A4000E319F6FE82808147E5BFDDC183A7C5FF2C +:109A5000411122C406C626C21384C5FF63D3070082 +:109A60003E94AA84EF00B04F9387C1839C4381EF5B +:109A70002322040023AE81822244B24026859244F0 +:109A800041016F00F04D637EF40014403307D400B1 +:109A90006396E7009843DC43369718C05CC0D9BF93 +:109AA000BA87D84319C3E37DE4FE94433386D700D5 +:109AB000631F86001040B29694C33386D700E31D1F +:109AC000C7FA10435843B29694C3D8C375B76375A9 +:109AD000C400B1479CC04DB71040B306C400631624 +:109AE000D70014435843B29614C058C0C0C369B7D6 +:109AF0008280011126CA93843500F19806CE22CCCB +:109B00004AC84EC6A104B14763F3F404B14463E20A +:109B1000B4042A89EF00B0449387C18398433A8400 +:109B200039E0938701849C4391E781454A85852CE0 +:109B300023A0A184A6854A859D24FD596319350774 +:109B4000B1472320F9004A85EF00904129A0E3D0D6 +:109B500004FCB1471CC10145F2406244D244424971 +:109B6000B249056182801C40858F63CF0702AD46F4 +:109B700063F6F6001CC03E9404C031A05C40631341 +:109B8000870223AEF1824A85EF00903D1305B400B1 +:109B90009307440061993307F5405DDF3A94898F5C +:109BA0001CC05DBF5CC3C5B72287404095BF13048E +:109BB00035007198E30285FCB305A4404A85C522AF +:109BC000E31C35FBB5BF39713EDA2ED232D436D61E +:109BD0003AD842DC46DE9387C18022CC804326CA35 +:109BE00006CEAA8411C41C4C81E72285EF00101117 +:109BF0000C4454102686228536C6EF001072F240BF +:109C00006244D2442161828001119387C18022CCB9 +:109C1000804306CEAA8501C81C4C91E72AC622853E +:109C2000EF00D00DB245104422856244F240056138 +:109C30006F102052011126CA4AC806CE22CC4EC649 +:109C400052C4AA842E8909C51C4D99E3EF00100B5C +:109C50009C4C804481E72685EF00500A974700001E +:109C600093874758631BF402C0405E24A18BB1C7A1 +:109C70001C48A1C7FD59294A1C4483450900FD170A +:109C8000B1E91CC463DD07062286A9452685992112 +:109C9000FD576308F502294535A0974700009387D3 +:109CA00067566314F4008044C9B797470000938750 +:109CB0006751E31CF4FAC0444DBFA2852685C5292F +:109CC00055D97D55F2406244D2444249B249224AB4 +:109CD000056182801CC4050963D70700184C63CA5C +:109CE000E700638845011C401387170018C08CA348 +:109CF00061B722862685F92EE31035F9D9B71C40C5 +:109D00001387170018C0294798A371B79387C1809C +:109D1000AA8588436FF01FF241119387C18022C446 +:109D2000804306C61C5C95EB6145EFF09FBCB737DE +:109D3000CDAB08DC9387E7301CC1B7176DE693877E +:109D400047235CC1B7E705009387C7EE1CC5AD4745 +:109D50005EA50547814718C95CC9105C3787954CDB +:109D6000B7F75158144A484A1307D7F29387D74296 +:109D7000B387F602B24022443305E5023E95B3872D +:109D8000E60233B7E6029386170014CA2A9733B562 +:109D9000F6003A9548CA06050581410182804111C5 +:109DA00022C42A842E8523A6017806C6EFF0EFF29E +:109DB000FD576317F5009387C1789C4391C31CC07E +:109DC000B240224441018280FD4763F6B700D94783 +:109DD0001CC17D5582807C41011122CC06CE2E868D +:109DE0002A8491C713972500BA97984319EB2285C7 +:109DF00032C68528AA85228562443246F240056132 +:109E00001DA8854601456308D700FD566319D70094 +:109E1000D9471CC00545F2406244056182802E8509 +:109E200023A0070002970145FDB79387C180AA854B +:109E300088436FF07FF9411122C42A842E85B285B0 +:109E400023A6017806C6EF10E05EFD576317F50004 +:109E50009387C1789C4391C31CC0B2402244410106 +:109E600082806F10A05B35713ECBA6DA36C73AC947 +:109E700042CD46CF9387C18086DEA2DC844363DB7C +:109E800005009307B0089CC07D55F6506654D65423 +:109E90000D61828093078020FC822AC42ACC8147EE +:109EA00099C19387F5FF3EC83ECE7401FD572E84BD +:109EB00026852C00FC8336C2EF00F018FD57635551 +:109EC000F5009307B0089CC069D0A2472380070023 +:109ED0006DBF35713ECBB707008093C7F7FF3ECE0D +:109EE0003EC8C1779387872032C536C73AC942CD6D +:109EF00046CF3ECA9387C1802AC42ACC8843340106 +:109F00002E862C0086DE36C2EF00F013A247238097 +:109F10000700F6500D618280AA8798239386170068 +:109F200009EB850503C7F5FF8507A38FE7FE75FBE2 +:109F30008280B687DDB7AA87982185078505A38F1C +:109F4000E7FE7DFB8280AA87850703C7F7FF6DFFC9 +:109F50003385A7407D158280AA8709CA850503C776 +:109F6000F5FF85077D16A38FE7FE65FB3E9663939D +:109F7000C70082808507A38F07FED5BF79714AD0BD +:109F80004ECE06D622D426D2AA892E899304190051 +:109F900003C4F4FF3A8536C632C42EC23AC0EFF08D +:109FA0007F9322951C3102479245A18B2246B246EF +:109FB000D1E39307D0026311F4089C200543930476 +:109FC0002900E5C641476390E60213070003639C3E +:109FD000E7009C201307800593F7F70D6392E70CC9 +:109FE0009C30C1468904B70800806314030093C8FD +:109FF000F8FF33FFD80201480145A54FE54EFD5259 +:10A0000033DED802138707FD63E3EF04BA8763DE0C +:10A01000D704630D58007D58636AAE006314AE0028 +:10A020006346FF0005483385A6023E95850483C735 +:10A03000F4FFC9BF268999BF9307B0026305F400F6 +:10A04000A2870143BDBF9C2093042900DDBF138775 +:10A05000F7FB63E5EE00938797FC55BF1387F7F98D +:10A0600063E5EE00938797FA5DB7FD57631FF8002D +:10A070009307200223A0F900468519EEB25022541E +:10A0800092540259F249456182806304030033050A +:10A09000A0406DD6630408009385F4FF0CC2F9BF9D +:10A0A00093070003A9F2A1463DBF13070003E38213 +:10A0B000E7F2A9460DBF9387C1809C43B2869853AF +:10A0C00009E71767FF1F1307E7F52E86AA853E8568 +:10A0D0006FF0DFEA011122CC26CA4AC806CE4EC66E +:10A0E000AA842E89328401C51C4D91E3012997472A +:10A0F00000009387270F6317F406C0401C4C1CC454 +:10A100005E24A18BC1C31C48B5CF1C48084093797D +:10A11000F90F1379F90F1D8D5C486346F500A28590 +:10A120002685752C25E51C440505FD171CC41C401F +:10A130001387170018C0238037015C486388A70085 +:10A140005E24858B81CBA9476316F900A2852685FD +:10A1500079240DEDF24062444A85D2444249B24925 +:10A1600005618280974700009387C7096314F40054 +:10A17000804469B7974700009387C704E310F4F859 +:10A18000C044ADBFA28526851D2041D17D59D9B7D8 +:10A1900089CD9307F00F63F7C7009307A0081CC190 +:10A1A0007D55828090A105458280014582804111C4 +:10A1B0009387C18026C2844322C44AC006C62A8926 +:10A1C0002E8489C49C4C99E326850D2E9747000068 +:10A1D00093874701631BF402C0400317C400931721 +:10A1E0000701C18393F68700B5EA93F6070195EE60 +:10A1F000A5472320F900136707045AA47D55B240F0 +:10A20000224492440249410182809747000093878B +:10A2100067FF6314F4008044C9B797470000938731 +:10A2200067FAE31CF4FAC0444DBF918B85C74C58C4 +:10A2300091C9930744046385F5004A85EFF0FF80D8 +:10A24000232A04025E242322040093F7B7FD5EA4B0 +:10A250001C481CC05E2493E787005EA41C4899EB51 +:10A260005E241307002093F707286385E700A28583 +:10A270004A85A1295E2413F717001DC35C482324D7 +:10A280000400B307F0401CCC1C480145ADFB83170C +:10A29000C40013F7070825D793E707045EA4B9BFE6 +:10A2A000898B014791E3584818C4F9BFDE25011195 +:10A2B00022CC26CA06CE4AC84EC613F78700AA8407 +:10A2C0002E8461EFD841634DE000B841634AE0005D +:10A2D0000145F2406244D2444249B249056182805C +:10A2E00058547DD703A904009396370123A0040096 +:10A2F00063DC060670485E24918B99C75C401D8E16 +:10A300005C5899C33C401D8E5C540C508146268598 +:10A310008297FD575A24631DF5009440F54763E981 +:10A32000D706B70740208507B3D7D700858BADC3C5 +:10A330001C48232204001CC09317370163D8070070 +:10A34000FD576314F5009C4091E368C84C5823A066 +:10A350002401BDDD930744046385F5002685EFF0F5 +:10A36000CFEE232A0402ADB70C5001468546268560 +:10A370000297FD572A86E310F5F89C40ADDF75473C +:10A380006385E70059476393E70423A0240189B755 +:10A39000136707045AA47D552DBF83A90501E389DE +:10A3A00009F203A905008D8B23A03501330939413A +:10A3B000014791E3D84918C4E35C20F11C540C50C8 +:10A3C000CA864E86268582976347A0005E2493E75F +:10A3D00007045EA4C9B7AA993309A940F1BF9C49F3 +:10A3E000A5C3011122CC06CE2A8411C51C4D81E7DC +:10A3F0002EC62922B245974700009387A7DE639CAB +:10A40000F5004C408397C5009DC722856244F24009 +:10A4100005616FF0BFE9974700009387A7DE63945B +:10A42000F5000C44C5B7974700009387A7D9E39B75 +:10A43000F5FC4C44C1BFF240624401450561828095 +:10A4400001458280411122C406C62A844EA572A508 +:10A4500023200500232205002324050023220506CE +:10A4600023280500232A0500232C050021468145C9 +:10A470001305C505EF50DFDA971700009387E7D57E +:10A480005CD097170000938707D81CD4971700005B +:10A490009387E7DB5CD497170000938747DE00D0F3 +:10A4A0001CD8B24022444101828097050000938568 +:10A4B00045F399AA411126C2130680069384F5FF3D +:10A4C000B384C4024AC02E8922C406C693854407B9 +:10A4D000EFF02FE22A8401CD23200500232225015D +:10A4E000310508C4138684068145EF507FD3228549 +:10A4F000B240224492440249410182801C4DA5E7AA +:10A50000411106C622C497070000938747FA1CD55D +:10A51000938701819C4323240504232605042328D3 +:10A5200005046314F50085471CCD2A84352848C0EE +:10A5300022851D2808C42285052848C448400146B4 +:10A540009145EFF03FF008440546A545EFF09FEF39 +:10A5500048440946C945EFF0FFEE85471CCCB240A0 +:10A56000224441018280828041119387018126C269 +:10A5700084434AC006C69C4C22C42A8981E72685AA +:10A58000EFF0DFF7938484048044DC40FD1763D64A +:10A5900007009C40B9CF8440C5BF0317C40039E70A +:10A5A000C177850723220406232004002322040008 +:10A5B000232404005CC423280400232A0400232C41 +:10A5C0000400214681451305C405EF507FC5232AA9 +:10A5D0000402232C040223240404232604042285D9 +:10A5E000B24022449244024941018280130484060D +:10A5F00071BF91454A85EFF0FFEB88C049FDB14737 +:10A600002320F9000144E1BF797122D44AD052CC11 +:10A6100056CA5AC85EC606D626D24ECE2A8AAE8AF8 +:10A62000130485040149054BFD5B09ECB25022542B +:10A630004A8592540259F249624AD24A424BB24B7D +:10A6400045618280044483294400FD1963D40900D4 +:10A650000040E1BFDE24637BFB008397E400638757 +:10A660007701A6855285829A3369A900938484066E +:10A67000E9BF1971A6DAAE848395E500A2DC86DE17 +:10A68000328463DB0500DE2423A0060093F707086D +:10A6900085E7930700401DA0300836C6EF00B043A1 +:10A6A000B246E34205FE7247BD67F98F7977BA97E4 +:10A6B00093B717009CC2F1BF930700041CC0F6506B +:10A6C0006654D654014509618280DE25011122CCF1 +:10A6D00006CE26CA4AC8898B2E8489CF9307740474 +:10A6E0001CC01CC885475CC8F2406244D244424941 +:10A6F0000561828074003000AA84EFF09FF7A245C4 +:10A700002A892685EFF0EFBE19E98317C40013F7F5 +:10A71000072079FBF19B93E727005EA4C1B7970759 +:10A7200000009387C7D89CD45E2408C008C893E76C +:10A7300007085EA4A2475CC8B24781CF8315E40036 +:10A740002685EF00F03B11C55E24F19B93E71700CF +:10A750005EA45E243369F9002316240171B7828058 +:10A76000828001114AC803A9850022CC52C45AC074 +:10A7700006CE26CA4EC656C22E84328B368A63E96E +:10A780002609DE2513F7074851C304408C49584871 +:10A79000AA8AB389B4408D44B384E4020947B3C4A0 +:10A7A000E402138716004E9763F3E400BA8493F72C +:10A7B0000740BDCFA6855685EFF0AFB32A891DE1CE +:10A7C000B14723A0FA005E247D5593E707045EA4F9 +:10A7D000F2406244D2444249B249224A924A024B70 +:10A7E000056182800C484E86EFF0AF965E2493F7A9 +:10A7F000F7B793E707085EA42328240144C84E99BD +:10A80000B38434412320240104C4528963732A0190 +:10A81000528908404A86DA85EFF0CF9E1C440145F4 +:10A82000B38727411CC41C403E99232024014DB707 +:10A8300026865685EF0090332A895DFD0C485685A3 +:10A84000EFF0AFA0B5BFDE25717126D34AD14ECF50 +:10A8500006D722D552CD56CB5AC95EC762C566C34C +:10A8600093F70708AA892E89B284B9C39C49A9E342 +:10A870009305000436C6EFF0CFA72320A9002328B4 +:10A88000A900B24615E1B14723A0F9007D55BA50A1 +:10A890002A549A540A59FA496A4ADA4A4A4BBA4B34 +:10A8A0002A4C9A4C4D61828093070004232AF900B8 +:10A8B00093070002A30CF1029307000302DA230DB1 +:10A8C000F10236CE930B5002974A0000938A8A9584 +:10A8D000054C294B26841C2099C363997709B30C36 +:10A8E0009440638E0C00E6862686CA854E85EFF07E +:10A8F0005FE7FD57630BF518D256E69636DA1C2053 +:10A9000063850718FD579304140002D002D63ED287 +:10A9100002D4A301010682DC8C2015465685EF0087 +:10A92000702313841400825721E513F7070109C728 +:10A9300013070002A301E10613F7870009C71307F5 +:10A94000B002A301E10694201307A002638AE60285 +:10A95000B257268481462546182093051400130714 +:10A9600007FD6372E6068DC63ED61DA00504A5B799 +:10A97000330555413315AC00C98F3ED0A28469BF61 +:10A98000724793064700184336CE634707023AD60C +:10A9900018209307E002631DF70418309307A00204 +:10A9A000631BF702F2470904138747009C433ACE22 +:10A9B00063C107023ED22DA83307E04093E727008A +:10A9C0003AD63ED0F1B7B387670385462E84BA974F +:10A9D00061B7FD57C5B7050402D2814681472546B8 +:10A9E000182093051400130707FD6376E606F9F2B5 +:10A9F0000C200D461745000013054583EF00901508 +:10AA000011CD97470000938767821D8D930700043F +:10AA1000B397A700025505045D8D2AD00C20194676 +:10AA2000174500001305C58093041400230CB102E0 +:10AA3000EF00501225C59757FFFF9387A75C95E756 +:10AA40000257F2471377071009CF91073ECED2572E +:10AA5000D2973EDA41B5B387670385462E84BA970D +:10AA600041B79D07E19BA107D5B77808970600007D +:10AA7000938666CF4A860C104E8597000000E7004B +:10AA80000000FD572A8AE314F5FC8357C9007D5561 +:10AA900093F70704E39D07DE5255D5BB7808970668 +:10AAA0000000938646CC4A860C104E851121D1BFFA +:10AAB0001C46FD171CC663DA0700184E63C5E70085 +:10AAC000A9476394F5006FF0EFE01C422E851387D1 +:10AAD000170018C28CA38280011122CC26CA4AC852 +:10AAE0004EC652C406CE2A89AE893284B304D6003B +:10AAF0007D5A63149400014509A80C204E864A85AE +:10AB0000EFF01FFB0504E31645FFF2406244D24418 +:10AB10004249B249224A05618280357122CD26CB55 +:10AB20004AC94EC706CF52C556C35AC1DEDEE2DC63 +:10AB3000E6DAAA89AE843289368409C51C4D99E3C8 +:10AB4000EFF0DF9B973700009387C7696399F40C98 +:10AB500083A44900DE24A18BEDC79C48FDC3930765 +:10AB60000002A304F1029307000302D22305F102BD +:10AB700022C6930B5002973A0000938AAA6A054CAA +:10AB8000294B4A841C2099C36390770FB30C24414E +:10AB9000638E0C00E6864A86A6854E85EFF0DFF3CD +:10ABA000FD576300F51E9256E69636D21C20638A46 +:10ABB000071CFD571309140002C802CE3ECA02CC7E +:10ABC000A309010482D48345090015465685EF0088 +:10ABD000607813041900C24751E913F7070109C748 +:10ABE00013070002A309E10413F7870009C713073D +:10ABF000B002A309E104834609001307A002638F92 +:10AC0000E606F2474A84814625461820930514003B +:10AC1000130707FD6377E60AB5CA3ECE85A89737C6 +:10AC200000009387275E6395F40083A489001DB715 +:10AC30009737000093870759E39EF4F083A4C90077 +:10AC400011BFA6854E85EFF08FD611D97D55FA40FC +:10AC50006A44DA444A49BA492A4A9A4A0A4BF65B94 +:10AC6000665CD65C0D618280050429BF33055541C1 +:10AC70003315AC00C98F3EC82289B1B7324793065D +:10AC80004700184336C6634707023ACE1820930799 +:10AC9000E002631DF70418309307A002631BF7025C +:10ACA000B2470904138747009C433AC663C10702B1 +:10ACB0003ECA2DA83307E04093E727003ACE3EC8AE +:10ACC000F1B7B387670385462E84BA973DBFFD571A +:10ACD000C5B7050402CA8146814725461820930559 +:10ACE0001400130707FD6374E606F9F20C200D4605 +:10ACF0001735000013058553B12D11CD973700008E +:10AD00009387C7521D8D93070004B397A700424550 +:10AD100005045D8D2AC80C2019461735000013055F +:10AD20002551130914002304B1022D2535C197576D +:10AD3000FFFF9387272D95E74247B2471377071008 +:10AD400009CF91073EC69257D2973ED21DBDB38719 +:10AD5000670385462E84BA9751B79D07E19BA107EB +:10AD6000D5B7780097060000938646D726860C084C +:10AD70004E8597000000E7000000FD572A8AE31483 +:10AD8000F5FCDE2493F70704E39207EC1255C1B5F6 +:10AD9000780097060000938666D426860C084E85B8 +:10ADA000012AE1BF797156CA9C49BA8A984522D4D2 +:10ADB00026D24ECE52CC06D64AD05AC85EC6AA89F2 +:10ADC0002E84B284368A63D3E700BA879CC00347D7 +:10ADD000340419C385079CC01C4093F7070281C740 +:10ADE0009C4089079CC00329040013796900631AF9 +:10ADF0000900130B9401FD5B5C449840998F634CF0 +:10AE0000F9041C408346340493F70702B336D0009C +:10AE1000A5EB13063404D2854E85829AFD57630351 +:10AE2000F5041C4011469840998B54448144639723 +:10AE3000C700B384E64063D3040081441C4418482F +:10AE40006354F700998FBE94014969047D5B639850 +:10AE50002405014509A885465A86D2854E85829AE1 +:10AE6000631E75017D55B250225492540259F24925 +:10AE7000624AD24A424BB24B456182800509ADBF5E +:10AE80003307D40013060003A301C7040347540487 +:10AE900093871600A2978906A381E7049DBF854684 +:10AEA0002286D2854E85829AE30E65FB050945B759 +:10AEB000797122D426D24AD04ECE06D652CC56CA6A +:10AEC0005AC8B689942D930790063289AA842E8495 +:10AED00013863504638DF60263E2D7069307800577 +:10AEE0006386F61863EDD700638E0620930730045F +:10AEF000638EF60A930A24042301D404C9A093079D +:10AF000030066385F60A93074006E395F6FE1C407B +:10AF1000084393F6070893054500C5C61C410CC3BA +:10AF200063D807001307D002B307F040A301E4047D +:10AF30009736000093864630294765A89307000797 +:10AF40006382F61663E5D7029307E0066389F61875 +:10AF50009307F006E390F6FA0C401C4313F805083B +:10AF6000138547006307080608C39C4385A8930719 +:10AF70005007E383F6FE930780076389F612930771 +:10AF80003007E399F6F61C43D0418145938647008C +:10AF900014C383AA07005685752E01C53305554194 +:10AFA00048C05C401CC8A301040461A81C43930A68 +:10AFB0002404938647009C4314C32301F40485476B +:10AFC000D5B793F607041C410CC3B9DAC207C18791 +:10AFD00081BF93F5050408C3C9D99E231307F00662 +:10AFE0006387E60E97360000938606252947A3015E +:10AFF00004044C400CC463C5050008406D9908C0AA +:10B0000099E3B28A89CDB28AB3F5E702FD1AB69503 +:10B010008C212380BA00B3D5E70263F0E70CA14787 +:10B02000631EF7001C40858B91CB58401C4863C7BA +:10B03000E70093070003A38FFAFEFD1A330656417B +:10B0400010C84E87CA867000A2852685EFF09FD56E +:10B050007D5A631D450B7D55B250225492540259BE +:10B06000F249624AD24A424B45618280A382D504AA +:10B07000973600009386461C0C40084313F80508D9 +:10B080001C411105630D080208C313F7150001C721 +:10B0900093E505020CC04147B9FB0C4093F5F5FD63 +:10B0A0000CC0B1B79C4193E707029CC1930780078E +:10B0B000A302F404973600009386461975BF13F86F +:10B0C000050408C3E30308FCC207C1837DBF9736AC +:10B0D000000093866616214719BFAE8735B79441A5 +:10B0E0001C43CC4913F80608138547006306080083 +:10B0F00008C39C438CC339A008C393F606049C4341 +:10B10000F5DA8EA323280400B28A25BF1448568698 +:10B11000CA8526858299E30045F51C40898B8DE719 +:10B12000B2474844E35AF5F23E853DB78546568618 +:10B13000CA8526858299E30065F3050A5C44324797 +:10B14000998FE345FAFEE9BF014A930A94017D5BBA +:10B15000F5B7011122CC06CE2A8409C91C4D99E706 +:10B1600032C62EC4EFF08FB93246A24597370000A1 +:10B17000938747076316F60250401C46FD171CC60E +:10B1800063D00704184E63C7E70093F7F50F29470C +:10B190006398E70222856244F24005616FE09FF305 +:10B1A00097370000938707066314F6001044F1B741 +:10B1B0009737000093870701E311F6FC504475BFF1 +:10B1C0001C4213F5F50F1387170018C28CA3F24029 +:10B1D000624405618280411122C42E848395E5007A +:10B1E00006C6CD22634905007C48AA977CC8B240B8 +:10B1F0002244410182805E247D777D17F98F5EA411 +:10B20000FDB7DE25011122CC26CA4AC84EC606CE9D +:10B2100093F70710AA842E843289B68991C7839543 +:10B22000E5008946014609225E247D777D17F98F66 +:10B230005EA48315E4006244F240CE864A86B24999 +:10B2400042492685D244056125A8411122C42E8495 +:10B250008395E50006C6C928FD575A24631AF500F0 +:10B26000FD77FD17F98F5EA4B24022444101828030 +:10B270008567D98F5EA468C8C5BF8395E50005A81A +:10B28000411122C42A842E85B285368623A60178F0 +:10B2900006C6EFE0AFA0FD576317F5009387C178AE +:10B2A0009C4391C31CC0B2402244410182804111A1 +:10B2B00022C42A842E8523A6017806C6A122FD5722 +:10B2C0006317F5009387C1789C4391C31CC0B240BB +:10B2D000224441018280411122C42A842E85B285F4 +:10B2E00023A6017806C62D22FD576317F500938724 +:10B2F000C1789C4391C31CC0B2402244410182806A +:10B30000411122C42A842E8523A6017806C6292A43 +:10B31000FD576317F5009387C1789C4391C31CC008 +:10B32000B240224441018280411122C42A842E85E8 +:10B33000B285368623A6017806C61922FD57631703 +:10B34000F5009387C1789C4391C31CC0B24022444E +:10B350004101828093F5F50F2A966314C5000145DB +:10B3600082801C21E38EB7FE0505C5BF81E5B2854D +:10B370006FE02FF8011122CC06CE26CA4AC84EC66D +:10B38000328401EEEFE06FEC0149F24062444A85FD +:10B39000D2444249B24905618280AE84AA89892893 +:10B3A0002689E37485FEA2854E85EFE08FF42A8915 +:10B3B00069DDA6852286EFE0CFD9A6854E85EFE030 +:10B3C000CFE8E1B7411122C42A842E85B2853686A2 +:10B3D00023A6017806C69D28FD576317F5009387BD +:10B3E000C1789C4391C31CC0B24022444101828079 +:10B3F00083A7C5FF1385C7FF63D50700AA959C41A6 +:10B400003E9582809307800523A6F1787D55828042 +:10B410009307800523A6F1787D55828093078005E8 +:10B4200023A6F1787D5582809307800523A6F178C5 +:10B43000014582809307800523A6F1787D5582809F +:10B440009307800523A6F1787D55828093078005B8 +:10B4500023A6F1787D55828001A000002573202865 +:10B460006C656E3D2575293A0A000000253034755B +:10B47000202000002530325820000000202020002D +:10B4800025630000253032780000000041647665B5 +:10B4900072740000570000005B25735D2025733A2D +:10B4A000204164766572746973656D656E7420669B +:10B4B00072616D6520746F6F2073686F72742028DD +:10B4C0002564203C20313031290D0A005B25735D55 +:10B4D0002025733A20496E636F727265637420731E +:10B4E00069676E61747572650D0A0000490000009D +:10B4F0005B25735D2025733A20416476657274691B +:10B5000073656D656E74207369676E6174757265BD +:10B51000206F6B2E0D0A00005B25735D2025733AAA +:10B52000204164766572746973656D656E7420661A +:10B5300072616D652077697468206461746120743C +:10B540006F6F2073686F727420282564203C20255B +:10B5500064290D0A000000006E616D656C657373EF +:10B56000206E6F64650000007265706561746572BD +:10B570000000000073656E736F720000726F6F6D74 +:10B58000207365727665720063686174206E6F6403 +:10B59000650000006B6E6F776E000000756E6B6E5D +:10B5A0006F776E002573206F6E20256C642077699D +:10B5B00074682074797065202573206F6E20257360 +:10B5C000206C6F636174696F6E20256C6420256C3C +:10B5D000640A00005075626C6963206B6579000035 +:10B5E0005369676E61747572650000004170706424 +:10B5F0006174610054696D657374616D7020697365 +:10B6000020256C750A0000004E6F64654E616D6503 +:10B610002025730A00000000416E6F6E796D6F7512 +:10B6200073206E6F64650000416E6F6E796D6F758B +:10B63000730000005B25735D2025733A204E65770B +:10B6400020616E6F6E796D6F7573206E6F6465200B +:10B65000637265617465643A2025730D0A00000009 +:10B66000440000005B25735D2025733A204578690E +:10B670007374696E67206E6F646520666F756E64A3 +:10B6800020666F72207075624B65795B305D3D306E +:10B6900078253032580D0A00416E6F6E5265712068 +:10B6A0007061796C6F6164005B25735D2025733A6E +:10B6B0002050617373776F7264206C656E206973BC +:10B6C0002025642E0D0A00005B25735D2025733A4A +:10B6D0002050617373776F726420636F7272656359 +:10B6E000742C206E6F646520257320617574686505 +:10B6F0006E746963617465642E0D0A005B25735D69 +:10B700002025733A204C6F67696E20726573706FE5 +:10B710006E73652073656E7420746F206E6F646540 +:10B720002025732E0D0A00005B25735D2025733ADA +:10B730002050617373776F726420696E636F7272E9 +:10B7400065637420666F72206E6F64652025732EAA +:10B750000D0A0000416E6F6E796D6F7573526571E1 +:10B76000756573745061796C6F6164206174202514 +:10B77000700A0000202064657374696E6174696FDB +:10B780006E20686173683A203078253032580A009C +:10B79000202073656E646572207075624B65793A1E +:10B7A000200000002530325800000000202063698E +:10B7B00070686572204D41433A2030782530345806 +:10B7C0000A0000002020646563727970746564204B +:10B7D0007061796C6F6164202825752062797465C9 +:10B7E00073293A0A000000002020202074696D654A +:10B7F0007374616D703A2025750A000020202020A6 +:10B8000073796E632074696D657374616D703A202D +:10B8100025750A002020202070617373776F726491 +:10B820003A200000436F6E74726F6C005B25735D8D +:10B830002025733A205265706C79696E6720746FA9 +:10B84000206120646973636F76657220726571751B +:10B850006573742077697468207461672025640DAE +:10B860000A0000003D3D3D20446973636F766572B8 +:10B870002052657175657374203D3D3D0A000000DE +:10B880007072656669784F6E6C79203A2025750A6A +:10B89000000000007479706546696C746572203A26 +:10B8A000203078253032580A00000000746167208B +:10B8B000202020202020203A2030782530386C5855 +:10B8C0000A00000073696E63652020202020203A62 +:10B8D0002030782530386C580A0000003D3D3D206E +:10B8E000446973636F76657220526573706F6E730F +:10B8F00065203D3D3D0A00006E6F646554797065BA +:10B90000203A2025750A0000736E72202020202026 +:10B91000203A2025750A000074616720202020202D +:10B92000203A2030782530386C580A007075626BE8 +:10B9300065792020203A20005B25735D2025733A2D +:10B940002046696E64696E672072656D6F7465204C +:10B950006E6F64652C20736F7572636548617368E0 +:10B960002069732025640D0A000000005B25735DCB +:10B970002025733A204E6F6465206E6F7420696EC7 +:10B980002044420D0A0000005B25735D2025733AB8 +:10B9900020466F756E64206E6F64652077697468E9 +:10B9A00020696E6465782025640D0A005B25735D4F +:10B9B0002025733A20484D4143206661696C6564D7 +:10B9C000206F6E20656E63727970746564206D659A +:10B9D00073736167652025730D0A00005B25735D35 +:10B9E0002025733A20484D41432073756363657386 +:10B9F000732066726F6D2025732C20257520627967 +:10BA0000746573206C6F6E670D0A000020205479F6 +:10BA100070657864643A203078253032580A000026 +:10BA200020205061796C6F61644C656E3A202575F9 +:10BA30000A0000005B25735D2025733A2050617475 +:10BA40006820746F6F206C6F6E670A0D0A0000002B +:10BA500053656E7420726573706F6E73652C2074FD +:10BA600068652074656D70657261747572652069B2 +:10BA700073202564206465636963656C73697573FD +:10BA80000A000000506C61696E74657874206D6501 +:10BA900073736167652066726F6D2025732C20615A +:10BAA0007474656D70742025642C2074696D6573E1 +:10BAB00074616D702025643A20257300506C6169B3 +:10BAC0006E74657874206D65737361676520667246 +:10BAD0006F6D207365727665722025732C207365F7 +:10BAE0006E6465722069732025732C2061747465FF +:10BAF0006D70742025642C2074696D657374616D9C +:10BB0000702025643A202573000000005B25735DDA +:10BB10002025733A20556E6B6E6F776E20746578B2 +:10BB20007420747970653A2025640D0A00000000C5 +:10BB3000456E637279707465645061796C6F61648D +:10BB40003A0A0000202044657374696E6174696F5D +:10BB50006E486173683A203078253032580A000008 +:10BB60002020536F75726365486173683A2030789E +:10BB7000253032580A000000202043697068657241 +:10BB80004D41433A203078253034580A00000000F7 +:10BB900020205061796C6F61644C656E3A20257A83 +:10BBA000750A000020205061796C6F61643A2000B2 +:10BBB000526571756573743A0A000000202054695B +:10BBC0006D657374616D703A2025750A0000000080 +:10BBD0002020547970653A203078253032580A0098 +:10BBE0002020446174613A2000000000202044615C +:10BBF00074610000526573706F6E73653A0A0000DD +:10BC000020205461673A2025750A00006F6E0000FD +:10BC10006F6666004F4B202D207265706561742041 +:10BC20006973206E6F77204F4E0000004F4B202D20 +:10BC300020726570656174206973206E6F77204F84 +:10BC4000464600007265626F6F740000616476653D +:10BC5000727400004F4B202D204164766572742071 +:10BC600073656E7400000000636C6561722073740C +:10BC700061747300284F4B202D20737461747320FE +:10BC800072657365742900004A756E203235203262 +:10BC90003032360076302E302E31202D2042524E5A +:10BCA0002053797374656D7320524953432D5600A8 +:10BCB000257320284275696C643A20257329000099 +:10BCC000626F61726400000057434820434833327A +:10BCD0005633303700000000636C6F636B00000068 +:10BCE00074696D65200000004F4B202D20636C6F40 +:10BCF000636B207365743A20253032643A25303204 +:10BD0000643A25303264202D2025642F25642F25A8 +:10BD10006420555443000000284552523A20636C79 +:10BD20006F636B2063616E6E6F7420676F2062615A +:10BD3000636B77617264732900000000636C6F634A +:10BD40006B2073796E6300004552523A20636C6F2A +:10BD5000636B2063616E6E6F7420676F2062616336 +:10BD60006B7761726473000070617373776F7264D4 +:10BD70002000000070617373776F7264206E6F77BC +:10BD80003A20257300000000676574200000000061 +:10BD900067756573742E70617373776F72640000DA +:10BDA0003E202573000000006E616D6500000000FC +:10BDB00072657065617400006C6174003E202564DA +:10BDC000000000006C6F6E007075626C69632E6B12 +:10BDD000657900003E200000726F6C650000000075 +:10BDE0006164632E6D756C7469706C6965720000B6 +:10BDF0003E2025642E2564003F3F3A202573000035 +:10BE00007365742000000000616C6C6F772E7265A2 +:10BE100061642E6F6E6C7920000000004F4B0000B3 +:10BE200067756573742E70617373776F7264200029 +:10BE30006E616D65200000007265706561742000A0 +:10BE40006C617420000000006C6F6E200000000028 +:10BE5000756E6B6E6F776E20636F6E6669673A20E2 +:10BE60002573000073746174732D7061636B657466 +:10BE7000730000007B2272656376223A25752C22BE +:10BE800073656E74223A25752C22666C6F6F645F41 +:10BE90007478223A25752C226469726563745F7424 +:10BEA00078223A25752C22666C6F6F645F72782257 +:10BEB0003A25752C226469726563745F7278223A40 +:10BEC00025757D0073746174732D726164696F00F0 +:10BED0007B226E6F6973655F666C6F6F72223A25A5 +:10BEE000642C226C6173745F72737369223A2564E7 +:10BEF0002C226C6173745F736E72223A25642E304B +:10BF0000302C2274785F6169725F73656373223AC3 +:10BF100025752C2272785F6169725F736563732285 +:10BF20003A25757D0000000073746174732D636F92 +:10BF3000726500007B22626174746572795F6D7650 +:10BF4000223A25752C22757074696D655F7365637F +:10BF500073223A25752C226572726F7273223A250C +:10BF6000752C2271756575655F6C656E223A257555 +:10BF70007D000000556E6B6E6F776E20636F6D6D88 +:10BF8000616E6400456E637279707465644D6573AB +:10BF900073616765000000005B25735D2025733ABF +:10BFA00020506C61696E206C656E3A2025642C20EF +:10BFB000656E63206C656E3A2025640D0A000000F2 +:10BFC000456E63727970746564206672616D650098 +:10BFD0005B25735D2025733A20456E63727970741A +:10BFE0006564206672616D652074782066696E698B +:10BFF00073680A0D0A0000005B25735D2025733A03 +:10C00000204E6F6465206973206E756C6C0D0A009C +:10C010005B25735D2025733A204E6F64652069733C +:10C02000206E6F7420706F70756C617465640D0A9A +:10C030000000000047726F75704D6573736167652E +:10C04000000000005B25735D2025733A204E6F745D +:10C0500020612067726F757020746578740D0A0016 +:10C060005B25735D2025733A204368616E6E656CB5 +:10C070002068617368202564206E6F7420666F7578 +:10C080006E640D0A000000005B25735D2025733A85 +:10C0900020484D4143206661696C6564206F6E20C5 +:10C0A00067726F757068617368206B6579202564AD +:10C0B0000D0A00004D6573736167652066726F6DD0 +:10C0C000206368616E6E656C2025733A2025730AC3 +:10C0D00000000000547844756D70446563000000F2 +:10C0E0004D657368436F7265000000005B25735DEA +:10C0F0002025733A204672616D6520746F6F206E43 +:10C1000065772C20676F742076657273696F6E2077 +:10C11000256420696E7374656164206F6620300D3C +:10C120000A00000020205479706578643A20307845 +:10C13000253032580A0000005B25735D2025733AD4 +:10C140002050726F636573736564206672616D65FC +:10C150000D0A0000CE2100001E2200003422000043 +:10C160004C2200006222000080260000942600007D +:10C17000AA260000B6260000CC2600004D65736894 +:10C180006672616D696E6700450000005B25735D36 +:10C190002025733A20256420697320746F6F206214 +:10C1A000696720666F72207378313236320D0A006B +:10C1B000737461727420577269746542756666653E +:10C1C00072000000656E642057726974654275667E +:10C1D000666572005B25735D2025733A20545820F4 +:10C1E0007061796C6F61644C656E3D25752070617E +:10C1F00074684C656E3D257520746F74616C4C6578 +:10C200006E3D2575206865616465723D3078253026 +:10C2100032580D0A000000005B25735D2025733A3B +:10C22000205374617274696E67207478206D6F6436 +:10C23000652C2073656E742025642C2073686F75DF +:10C240006C642025640D0A005B25735D2025733A1C +:10C250002053657454782072756E6E696E670D0A8E +:10C26000000000005B25735D2025733A2069727120 +:10C270003A203078253034580D0A00005B25735D74 +:10C280002025733A2046696E697368656420747866 +:10C290000D0A000073746172742052656164427506 +:10C2A0006666657200000000656E64205265616418 +:10C2B00042756666657200007472616E73706F72AB +:10C2C0007420666C6F6F6400666C6F6F64000000B2 +:10C2D00064697265637400007472616E73706F726A +:10C2E0007420646972656374000000002C20706122 +:10C2F000796C6F6164207479706520697320000027 +:10C300007265717565737400726573706F6E7365B5 +:10C310000000000074657874206D65737361676553 +:10C320000000000061636B6E6F776C656467656D1C +:10C33000656E740067726F757020746578740000A4 +:10C3400067726F757020646174610000616E6F6E5A +:10C350002072657175657374000000007061746807 +:10C360000000000074726163650000006D756C74FC +:10C370006970617274000000636F6E74726F6C009C +:10C38000726177002C207061796C6F616420766532 +:10C390007273696F6E20697320257320000000009E +:10C3A0005472616E73706F727420636F6465733A58 +:10C3B0002025642025640A00506174682069732078 +:10C3C0002564206E6F646573206C6F6E67000000DB +:10C3D0006E6F6465202564202D20253032582C2076 +:10C3E000000000001F1C1F1E1F1E1F1F1E1F1E1FE0 +:10C3F0004A616E4665624D61724170724D61794A63 +:10C40000756E4A756C4175675365704F63744E6FF6 +:10C410007644656300000000000303060104060281 +:10C42000050003050000000022AE28D7982F8A429D +:10C43000CD65EF23914437712F3B4DECCFFBC0B559 +:10C44000BCDB8981A5DBB5E938B548F35BC2563959 +:10C4500019D005B6F111F1599B4F19AFA4823F9243 +:10C4600018816DDAD55E1CAB420203A398AA07D8E7 +:10C47000BE6F7045015B83128CB2E44EBE853124E1 +:10C48000E2B4FFD5C37D0C556F897BF2745DBE723B +:10C49000B196163BFEB1DE803512C725A706DC9BA0 +:10C4A000942669CF74F19BC1D24AF19EC1699BE485 +:10C4B000E3254F388647BEEFB5D58C8BC69DC10F9F +:10C4C000659CAC77CCA10C2475022B596F2CE92DFF +:10C4D00083E4A66EAA84744AD4FB41BDDCA9B05C97 +:10C4E000B5531183DA88F976ABDF66EE52513E9888 +:10C4F0001032B42D6DC631A83F21FB98C82703B078 +:10C50000E40EEFBEC77F59BFC28FA83DF30BE0C654 +:10C5100025A70A934791A7D56F8203E05163CA0606 +:10C52000706E0E0A67292914FC2FD246850AB72798 +:10C5300026C9265C38211B2EED2AC45AFC6D2C4DD1 +:10C54000DFB3959D130D3853DE63AF8B54730A65CB +:10C55000A8B2773CBB0A6A76E6AEED472EC9C28127 +:10C560003B358214852C72926403F14CA1E8BFA282 +:10C57000013042BC4B661AA89197F8D0708B4BC221 +:10C5800030BE5406A3516CC71852EFD619E892D1A9 +:10C5900010A96555240699D62A20715785350EF4C1 +:10C5A000B8D1BB3270A06A10C8D0D2B816C1A419D5 +:10C5B00053AB4151086C371E99EB8EDF4C774827FF +:10C5C000A8489BE1B5BCB034635AC9C5B30C1C394B +:10C5D000CB8A41E34AAAD84E73E363774FCA9C5B88 +:10C5E000A3B8B2D6F36F2E68FCB2EF5DEE828F7403 +:10C5F000602F17436F63A57872ABF0A11478C884DD +:10C60000EC39641A0802C78C281E6323FAFFBE9017 +:10C61000E9BD82DEEB6C50A41579C6B2F7A3F9BE72 +:10C620002B5372E3F27871C69C6126EACE3E27CA8C +:10C6300007C2C021C7B886D11EEBE0CDD67DDAEAAD +:10C6400078D16EEE7F4F7DF5BA6F1772AA67F0064C +:10C65000A698C8A2C57D630AAE0DF9BE04983F1125 +:10C660001B471C13350B711B847D0423F577DB28D6 +:10C670009324C7407BABCA32BCBEC9150ABE9E3CE0 +:10C680004C0D109CC4671D43B6423ECBBED4C54C76 +:10C690002A7E65FC9C297F59ECFAD63AAB6FCB5FBA +:10C6A0001758474A8C19446C08C9BCF367E6096AF5 +:10C6B0003BA7CA8485AE67BB2BF894FE72F36E3C31 +:10C6C000F1361D5F3AF54FA5D182E6AD7F520E518E +:10C6D0001F6C3E2B8C68059B6BBD41FBABD9831F48 +:10C6E00079217E1319CDE05B59F1B2FE0AE5A6FF70 +:10C6F0007BDD2AFE1E14D4005280030030D1F300EB +:10C70000777940FF32E39CFF006EC501671B900004 +:10C71000EDD3F55C1A631258D69CF7A2DEF9DE144D +:10C7200000000000000000000000000000000010F9 +:10C730008F64F8016360BCFFC509F8FFD588650008 +:10C7400073840E00A061A0FF144BB1FF9DBE6A0070 +:10C750003EA4ADFFF56995FFEE3F3D00374F6A00FF +:10C76000703B49FFC26C3C00C5197A003E484E0040 +:10C77000C41EDFFFAE03E3FFC36918FE683409FF80 +:10C780008D49F800EC6B73FF9A0C6B015E290B006E +:10C790004B3276FEE4E2C9FF78446A009A40B7FF64 +:10C7A000517DA700C55C99008FA626004990BEFF69 +:10C7B000C8A68AFEB3FB42FFBDC432FFC8E5DD0058 +:10C7C0000D7AC4009FFFD30074EAE500682583005A +:10C7D0001D4C32013BA34EFFCF4C300086CE37FFBD +:10C7E000003EC900F0E74FFF33F25BFF514532FFD7 +:10C7F0004A7DC3012F8721004E75EFFF8D89B4005C +:10C80000B5095C008494D6000C0BE100267D83FF03 +:10C81000A0CFC3FE542DB30002A6DE01F0D2C800A3 +:10C820006C491F000B779DFF7FC8E900107750000F +:10C8300094DB8401AEE60100E47AEAFE59B493FF8A +:10C84000DBE499FF082621FF14A59700C900210009 +:10C850000609A2FF70E3E5FF944A41007D59D8FF25 +:10C860008018A3FE0C9E92FFA0DB8CFE053CB3005B +:10C8700048C0A5FEFC4826FFAD065B009D2D8F003D +:10C880002DF23701F05359003712AF014DEAEAFF9C +:10C8900072A35AFF3A51D100565E7EFF2AF9F90081 +:10C8A00054B49100FD23B4FFDD75BBFF3D75C4FF9B +:10C8B00070555E0021313CFFF14F9601109F9E00A4 +:10C8C0001802A10159170EFFB4BB7500860485003C +:10C8D000E26173FFF8B520FFEA3BBA01C281A9FF0C +:10C8E0002C824000E4B10300395D35FF282186FF2A +:10C8F00090A993FF34BC8500AACA5FFE8F402F0029 +:10C9000053DBC401CD8374FF959C3B00DAE5AB009B +:10C91000CDDBB500B85AEF00750BF1FE6CD654FFB5 +:10C92000D9A25BFEAD0D4A00C56F61FE3FDF670017 +:10C930008DDB6800DF95EFFF8E7445FE4362D50006 +:10C940007C4E62FE9E98D6FF5FE2AC01E59235FF19 +:10C9500076EB5D00927AE60027FF350044598DFFA3 +:10C960007632D700796AAB002BF005FE6A998D000C +:10C97000083DD901F2254200A01BE4FF670D4600E7 +:10C980008906D5000020C300CE6A1600279900FF53 +:10C9900058D3FD0128C0D4008E7B7B00100E7AFF97 +:10C9A00077A255FF92F01500D0A657010662D5FF79 +:10C9B0008167DE0148A5B6FF3C897DFE4F763C00CD +:10C9C0007E5EBF009D9270FF63845DFE9288790059 +:10C9D000936294FEA78D54004B5C77FE094097FF4D +:10C9E00018E86B01A3602E00266C74FFA0E65B00C4 +:10C9F0002B945DFEB997A100DB328201DAD1E7FF0B +:10CA000030CAA1FE740A4D004926DB019418FDFFCF +:10CA100051CED5FE7A71F6FF1F2EF5FE4B0C04FFAA +:10CA20000F5AE0FECCDC39FF66386CFF9A06E00056 +:10CA30001034D1018BC3750073C05AFF21F39200EB +:10CA40007532CE01584D5FFF2ED257FEA73B2DFF0A +:10CA5000FBEC5800539FF500B1238AFE9B8CB80075 +:10CA6000D42071002FABAE00CF1FAC013DA0E4FF7E +:10CA7000EB8129FF90844200EFA89101BCBE230006 +:10CA8000CF04B2FE3239E7FF347FA3FFD226200065 +:10CA900055B149FEB0E28900D1A5D4FE2BCB38FFB9 +:10CAA00050DB3AFE5647E20093DDB9FF39FBD80070 +:10CAB000C7E235FE7D192D00948AB8002C0D2FFF9A +:10CAC0003B57A5FF91896B004724CFFFD4EDDB00D6 +:10CAD0002C0148FFCB7C05FF792076FFB8C291FF7F +:10CAE000B0448D00C459150090D4CF016642A9FF0F +:10CAF000A7FC97FF4189DCFF4BC5A7FECCE50100F1 +:10CB000002E51201E9C47F007C143101E0351E000A +:10CB10005BF3E4FE83A08A0011439D0030270600EA +:10CB20005570E200AAFF9200CE2381005B8380FF54 +:10CB300077B625FF2FD4DF00B653910100022B00FA +:10CB4000449AA5FEE803CFFF84F32CFF8C53D3FF58 +:10CB50003FE106FF98202AFF6E76C500F1B602007D +:10CB60008BA1B9003B69DBFF6A9644FF0EDA94FFA4 +:10CB70009D5F9700DA3DD1FFF57715FEAEAC2C0036 +:10CB800074AE5501795E1DFFE7802900C546FA00A5 +:10CB90009F9291FF50D4B7FF02FC2800816F9CFF49 +:10CBA000EE158EFE8DC50CFFC7CEA0FF27E3D60085 +:10CBB000B55099005D96BA009CAC2EFEBF413BFF7C +:10CBC00053B155FFCD013600807C50FF3CA4FB00E3 +:10CBD000F2A25FFEFEA61AFF590691FF09DC0CFFC8 +:10CBE000EE540D0199E2080004DFF2FF9F22FDFFE1 +:10CBF0003CC847FF01FC5CFF8372C9FED064ED00B6 +:10CC000073E025FE4B6AB3FF901EA0FF8684DDFF14 +:10CC100039ADB8FF3FD3B9FF689AC1FFE8C0BD0086 +:10CC200021BB22FE9B2D10002F765F0056EC9F004B +:10CC30004E582CFF3CEB1E001466B1FE9B2AD6FF1B +:10CC4000F846DBFF546585FF7E3C7000FC12F00067 +:10CC50006A409BFE6B4672001F086900649B0A00D5 +:10CC6000EBF46101AA289300AAE301FE8842AD001B +:10CC700032C5CCFE597A61005FE881FF726C7EFF9D +:10CC8000B2428AFFA96530FFE2C62FFF262EE100DF +:10CC90004183D7FEEC9D1BFFEC129E002A3E57FFFE +:10CCA000654BB1FEAB5DB8009F4954FFF6B60CFF73 +:10CCB000404D9900E59E5200430A7B01A7657B0029 +:10CCC000AAD899FFB395960084BDF100ED6D08FFD9 +:10CCD000E71593008B38B4009EAB91FE8AC971FFB3 +:10CCE000E9B43B00419869FF1D330F009DD27AFFE4 +:10CCF0006EE777FFA6E428FFE39B6E00D4C5DC0057 +:10CD00005CF5800165CC79FF63E8DA0016807D0070 +:10CD1000CB7A6100CD6C92FF7AB2620071EE7AFF3D +:10CD20001BB6EC00F794EB00F2087000B20265FF4E +:10CD30002EBD12014F2291FFFF5B2100A0884A0007 +:10CD40004733A50025E26C00B24227FF80D5500092 +:10CD5000528CA6FF3A5FA4FF5BB5AC0145A340002F +:10CD60004A4627FFECE21D001565FFFEDB8C3A000A +:10CD700002E8ABFF32F036FF09853CFE0949BC00F2 +:10CD80003EDAE900D6AF0CFF7F8579FF5C01A90090 +:10CD90000ECED4FEE560C6FFA0F4B2005488920027 +:10CDA000833BB9FF590FAFFFD98E88FF54942900F8 +:10CDB0005FA0DC01914200FFF81691FF9CD3E100D7 +:10CDC00050E547FEBCDC4900B62948FF701F75FFDF +:10CDD000A8F1E9FFD1D30500BA5327FE83DF03FF93 +:10CDE0002CB11300974AC30063C19F01EE8362FF19 +:10CDF000A2B5E100607522FF36E75000588B7AFF3C +:10CE00003A0FCCFF7BAEC0FF231463FE9106A40053 +:10CE1000173486016052A0FF33BB15FF38B8F40009 +:10CE2000B47D1100C67D000072626601CD439200A0 +:10CE30004B1D7901E75BEAFFD9CE2E010C4E0400B1 +:10CE4000D5B3F3FE73E8A70053A717FE7D8ED6FF78 +:10CE500012285D0061E4E5FF8469BFFE8DC9DA0038 +:10CE6000717D7A007EFC7C0035A3E5FE87C543FF1B +:10CE7000F61D8001BF9BA5FF81B0EB00243172003D +:10CE800007842FFE14BA9800535228FFB54DC0FFF7 +:10CE9000B9599C00090A20FF9FFCFF01F92D2AFFC8 +:10CEA000EE896401531CE600386386FF71EF74005D +:10CEB000853B8C01BDF124FFF825C30160DC370000 +:10CEC000B74C3EFFC3423D00324CA401E1A44CFFED +:10CED0004C3DA3FF753E1F00519140FF76410E006F +:10CEE000A273D6FF068A2E007CE6F4FF0A8A8F0022 +:10CEF000341AC200B8F44C00818F2901BEF413FF2C +:10CF00007BAA7AFF6281440079D5930056651EFFA3 +:10CF1000A1679B008C5943FFEFE5BE01430BB500B1 +:10CF2000C6F089FEEE45BCFF4397EE00132A6CFF66 +:10CF3000E5557101324487FF116A0900326701FF2C +:10CF40005001A80123981EFF10A8B9013859E8FF25 +:10CF500065D2FC0029FA4700CCAA4FFF0E2EEFFF46 +:10CF6000504DEF00BDD64BFF118DF90026504CFF00 +:10CF7000BE55750056E4AA009CD8D001C3CFA4FFCB +:10CF800096424CFFAFE110FF8D5062014CDBF20086 +:10CF9000C6A272002EDA98009B2BF1FE9BA068FFC0 +:10CFA00033BBA5000211AF004254A001F73A1E00A6 +:10CFB000234135FE45ECBF002D86F501A37BDD0046 +:10CFC000206E14FF3417A500BAD64700E9B0600000 +:10CFD000F2EF360139598A00530054FF88A06400EB +:10CFE0005C8E78FE687CBE00B5B13EFFFA29550024 +:10CFF00098822A0160FCF60097973FFEEF853E007D +:10D0000020389C002DA7BDFF8E85B3018356D30029 +:10D01000BBB396FEFAAA0EFFD2A34E0025349700AA +:10D02000634D1A00EE9CD5FFD5C0D101492E5400A6 +:10D030001441290136CE4F00C98392FEAA6F18FF12 +:10D04000B12132FEAB26CBFF4EF77400D1DD990043 +:10D050008580B2013A2C1900C9273B01BD13FC00A1 +:10D0600031E5D20175BB7500B5B3B8010072DB00C4 +:10D07000305E9300F52938007D0DCCFEF4AD7700CD +:10D080002CDD20FE54EA1400F9A0C601EC7EEAFF74 +:10D090002F63A8FEAAE299FF66B3D800E28D7AFF5B +:10D0A0007A4299FEB6F58600E3E41901D639EBFF22 +:10D0B000D8AD38FFB5E7D20077809DFF815F88FF4C +:10D0C0006E7E330002A9B7FF078262FE45B05EFFA5 +:10D0D0007404E301D9F291FFCAAD1F01690127FF72 +:10D0E0002EAF4500E42F3AFFD7E045FECF3845FF8D +:10D0F00010FE8BFF17CFD4FFCA147EFF5FD560FFF1 +:10D1000009B02100C805CFFFF12A80FE2321C0FF0E +:10D11000F8E5C40181117800FB6797FF073470FFC1 +:10D120008C3842FF28E2F5FFD94625FEACD609FF30 +:10D130004843860192C0D6FF2C26700044B84BFFAE +:10D14000CE5AFB0095EB8D00B5AA3A0074F4EF00BF +:10D150005C9D020066AD6200E98960017F31CB0011 +:10D16000059B9400179409FFD37A0C0022861AFFBE +:10D17000DBCC8800860829FFE0532BFE5519F70009 +:10D180006D7F00FEA9883000EE77DBFFE7ADD500AC +:10D19000CE12FEFE08BA07FF7E0907016F2A48007B +:10D1A0006F34ECFE603F8D0093BF7FFECD4EC0FF1D +:10D1B0000E6AED01BBDB4C00AFF3BBFE6959AD005D +:10D1C00055195901A2F394000276D1FE219E09005F +:10D1D0008BA32EFF5D4628006C2A8EFE6FFC8EFF0F +:10D1E0009BDF900033E5A7FF49FC9BFF5E740CFFBB +:10D1F00098A0DAFF9CEE25FFB3EACFFFC500B3FF8E +:10D200009AA48D00E1C468000A2319FED1D4F2FF6C +:10D2100061FDDEFEB865E500DE127F01A48887FFB0 +:10D220001ECF8CFE9261F30081C01AFEC95421FF0B +:10D230006F0A4EFF9351B2FF04041800A1EED7FF0E +:10D24000068D210035D70EFF29B5D0FFE78B9D0055 +:10D25000B3CBDDFFFFB97100BDE2ACFF7142D6FF79 +:10D26000CA3E2DFF664008FF4EAE10FE857544FF96 +:10D27000B67859FF8572D300BD6E15FF0F0A6A009C +:10D2800029C0010098E879FFBC3CA0FF9971CEFF4E +:10D2900000B7E2FEB40D48FF0100000000000000EE +:10D2A000000000000000000000000000000000007E +:10D2B000000000000000000000000000000000006E +:10D2C000F7E97A2E8D31092C6BCE7B51EF7C6F0AFA +:10D2D0000000000000000000000000000000000846 +:10D2E0008E4ACC46BA18766BB8E7BE39FAAD77638A +:10D2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0736 +:10D300001B132C0AA3E59CEDA72963085D210621C8 +:10D31000EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10D320000F000000B0A00EFED3C986FF9E188F002C +:10D330007F693500600CBD00A7D7FBFF9F4C80FEC6 +:10D340006A65E1FF1EFC0400920CAE0001000000C3 +:10D3500000000000000000000000000000000000CD +:10D360000000000000000000000000008D01020429 +:10D3700008102040801B3600637C777BF26B6FC502 +:10D380003001672BFED7AB76CA82C97DFA5947F0C8 +:10D39000ADD4A2AF9CA472C0B7FD9326363FF7CCA4 +:10D3A00034A5E5F171D8311504C723C31896059A41 +:10D3B000071280E2EB27B27509832C1A1B6E5AA064 +:10D3C000523BD6B329E32F8453D100ED20FCB15B4F +:10D3D0006ACBBE394A4C58CFD0EFAAFB434D3385B8 +:10D3E00045F9027F503C9FA851A3408F929D38F58C +:10D3F000BCB6DA2110FFF3D2CD0C13EC5F974417C3 +:10D40000C4A77E3D645D197360814FDC222A908839 +:10D4100046EEB814DE5E0BDBE0323A0A4906245CC5 +:10D42000C2D3AC629195E479E7C8376D8DD54EA92A +:10D430006C56F4EA657AAE08BA78252E1CA6B4C6F6 +:10D44000E8DD741F4BBD8B8A703EB5664803F60E4F +:10D45000613557B986C11D9EE1F8981169D98E943E +:10D460009B1E87E9CE5528DF8CA1890DBFE6426857 +:10D4700041992D0FB054BB1652096AD53036A538E4 +:10D48000BF40A39E81F3D7FB7CE339829B2FFF87AC +:10D49000348E4344C4DEE9CB547B9432A6C2233D90 +:10D4A000EE4C950B42FAC34E082EA16628D924B241 +:10D4B000765BA2496D8BD12572F8F6648668981662 +:10D4C000D4A45CCC5D65B6926C704850FDEDB9DAC1 +:10D4D0005E154657A78D9D8490D8AB008CBCD30AAF +:10D4E000F7E45805B8B34506D02C1E8FCA3F0F028B +:10D4F000C1AFBD0301138A6B3A9111414F67DCEA5A +:10D5000097F2CFCEF0B4E67396AC7422E7AD3585D2 +:10D51000E2F937E81C75DF6E47F11A711D29C589DC +:10D520006FB7620EAA18BE1BFC563E4BC6D27920BE +:10D530009ADBC0FE78CD5AF41FDDA8338807C731C7 +:10D54000B11210592780EC5F60517FA919B54A0DBF +:10D550002DE57A9F93C99CEFA0E03B4DAE2AF5B034 +:10D56000C8EBBB3C83539961172B047EBA77D62650 +:10D57000E169146355210C7D982F8A4291443771DB +:10D58000CFFBC0B5A5DBB5E95BC25639F111F15946 +:10D59000A4823F92D55E1CAB98AA07D8015B831288 +:10D5A000BE853124C37D0C55745DBE72FEB1DE8034 +:10D5B000A706DC9B74F19BC1C1699BE48647BEEF63 +:10D5C000C69DC10FCCA10C246F2CE92DAA84744AEE +:10D5D000DCA9B05CDA88F97652513E986DC631A864 +:10D5E000C82703B0C77F59BFF30BE0C64791A7D543 +:10D5F0005163CA0667292914850AB72738211B2ECB +:10D60000FC6D2C4D130D385354730A65BB0A6A76B2 +:10D610002EC9C281852C7292A1E8BFA24B661AA8BE +:10D62000708B4BC2A3516CC719E892D1240699D6CE +:10D6300085350EF470A06A1016C1A419086C371E47 +:10D640004C774827B5BCB034B30C1C394AAAD84E25 +:10D650004FCA9C5BF36F2E68EE828F746F63A57860 +:10D660001478C8840802C78CFAFFBE90EB6C50A4F3 +:10D67000F7A3F9BEF27871C6200000004000000058 +:10D680007C6E0000E46E00000C7000004481DA0E35 +:10D690004E03C49E847725D83A93BF8048D90000B2 +:10D6A00054D9000060D900006CD900005B25735D7F +:10D6B0002025733A204C6F7261496E69740D0A001F +:10D6C0005B25735D2025733A20446F6573206E6F70 +:10D6D00074207265636F676E697A6520746865206F +:10D6E0006D6F64756C650D0A000000005B25735D4D +:10D6F0002025733A20435249544943414C3A204C27 +:10D700006F5261206E6F7420666F756E642C206896 +:10D71000616C7465640D0A00436F6E666967000092 +:10D720005B25735D2025733A204465636964696EE7 +:10D7300067206F6E206368616E6E656C20696E6431 +:10D7400065782025642062656361757365206F6666 +:10D750002074696D657374616D7020302C206E616A +:10D760006D652069732025730D0A00005B25735DCC +:10D770002025733A204465636964696E67206F6E83 +:10D78000206368616E6E656C20696E646578202523 +:10D79000642062656361757365206F66206E616DDC +:10D7A00065206C656E20302C206E616D652069737C +:10D7B0002025730D0A000000556E6B6E6F776E00AA +:10D7C0007646743046527567534F65716E6B736859 +:10D7D000496D4D43566667484D357642787931003C +:10D7E00068657369656C6B6F0000000042524E20E3 +:10D7F000574348204D696E69000000005075626C07 +:10D800006963000042524E54657374005965730099 +:10D810004E6F00004E6F64652064617461626173D5 +:10D82000653A00004E6F64652025643A0A000000E6 +:10D8300020204E616D653A2025730A005075626B99 +:10D8400065790000536563726574000020204750BD +:10D85000533A206C61743D25642C206C6F6E3D251D +:10D86000640A00002020506174683A202E2E2E2079 +:10D87000286E6F7420657870616E6465642C206119 +:10D880006464206966206E6565646564290A000029 +:10D890002020466C6167733A203078253032580A70 +:10D8A00000000000202041757468656E7469636132 +:10D8B0007465643A2025730A0000000020204C6142 +:10D8C0007374205365656E202872656D6F746520D2 +:10D8D0007473293A2025640A0000000020204C615E +:10D8E0007374205365656E20286C6F63616C2074BF +:10D8F00073293A2025640A00202053796E6320742E +:10D90000696D657374616D703A2025640A000000CA +:10D910002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D37 +:10D920002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D27 +:10D930002D2D2D2D2D2D0A008B3387E9C5CDEA6ABB +:10D94000C9E5EDBAA115CD7243686174206E6F64AC +:10D95000650000005265706561746572000000002A +:10D96000526F6F6D207365727665720053656E73CA +:10D970006F72000068656C6C6F207468657265007A +:10D980005B25735D2025733A2053797374656D436D +:10D990006C6B3A25640D0A0D0A0000005B25735D6F +:10D9A0002025733A204368697049443A2530387815 +:10D9B0000D0A0D0A000000005B25735D2025733AF7 +:10D9C0002053656E64696E67206D6573736167656A +:10D9D0000A0D0A005379535469636B20697320253B +:10D9E0006C6C75005B25735D2025733A2053656E62 +:10D9F00064696E67207A65726F20686F7020616459 +:10DA0000766572740A0D0A005B25735D2025733AF2 +:10DA10002053656E64696E6720666C6F6F64206169 +:10DA200064766572740A0D0A0000000053656E6426 +:10DA3000696E67206D65737361676520617420533B +:10DA400079535469636B20697320256C6C750000F1 +:10DA500053656E64696E67206120646972656374E2 +:10DA6000206D65737361676520746F20746865202D +:10DA70006669727374206E6F64650A004368616E34 +:10DA80006E656C20696E6465782025642C206E615B +:10DA90006D65642025732C2074696D657374616DE8 +:10DAA000702069732025642C206861736820697375 +:10DAB0002025640A0000000057686F6C65206672BC +:10DAC000616D65005B25735D2025733A2072737369 +:10DAD000693D25645B64426D5D20736E723D256413 +:10DAE0005B64425D20726177736E723D25645B7189 +:10DAF0007561727465722064425D0D0A0000000059 +:10DB00005B25735D2025733A202564207061636B6B +:10DB1000657473206C6F73740D0A00005B25735D70 +:10DB20002025733A2073796E63576F72643D3078A5 +:10DB300025780D0A000000005B25735D2025733AEF +:10DB400020535831323678206572726F722C206DF6 +:10DB500061796265206E6F2053504920636F6E6E4D +:10DB6000656374696F6E0D0A000000005B25735DCC +:10DB70002025733A2053583132367820696E7374F9 +:10DB8000616C6C65640D0A005B25735D2025733A3A +:10DB900020757365526567756C61746F724C444F84 +:10DBA0003D25640D0A0000005B25735D2025733A56 +:10DBB00020416C6D6F737420646F6E6520736574A3 +:10DBC00074696E67204C6F52610D0A0053583132F0 +:10DBD000363200005B25735D2025733A204C6F526E +:10DBE000614572726F7244656661756C743D25643F +:10DBF0000D0A0000474F4E452057524F4E470A002E +:10DC000073746172742052656164436F6D6D616EEF +:10DC1000640000005B25735D2025733A2052656126 +:10DC200064436F6D6D616E643A20434D443D3078BE +:10DC3000253032780D0A0000656E642052656164FB +:10DC4000436F6D6D616E6400737461727420526510 +:10DC50006164526567697374657200005B25735D6A +:10DC60002025733A20526561645265676973746553 +:10DC7000723A205245473D3078253032780D0A00FF +:10DC80005B25735D2025733A2052656164696E6778 +:10DC90002062797465730D0A000000005B25735DD6 +:10DCA0002025733A20726561642061206279746571 +:10DCB0000D0A0000656E64205265616452656769F3 +:10DCC00073746572000000005B25735D2025733A54 +:10DCD0002044617461496E3A25303278200D0A0083 +:10DCE0005B25735D2025733A2057616974696E67FF +:10DCF00020666F722069646C650D0A005265736559 +:10DD0000740000005B25735D2025733A202D2D2DB6 +:10DD10002D2D2053657452782074696D656F75746C +:10DD20003D25640D0A0000005B25735D2025733AD4 +:10DD300020536574527820496C6C6567616C205380 +:10DD400074617475730D0A005B25735D2025733A49 +:10DD50002053657453746F70527854696D65724FB7 +:10DD60006E507265616D626C6544657465637420A4 +:10DD7000656E61626C653D25640D0A005B25735D0F +:10DD80002025733A202D2D2D2D2D20536574547888 +:10DD90002074696D656F7574496E4D733D25640D12 +:10DDA0000A0000005B25735D2025733A20536574DB +:10DDB00054782074696D656F7574496E4D733D2597 +:10DDC0006420746F75743D25640D0A005B25735DD6 +:10DDD0002025733A205772697474656E20636F6DE5 +:10DDE0006D616E642C207265747279696E670D0ABC +:10DDF000000000005B25735D2025733A2042726F9E +:10DE00006B65206F75740D0A000000005B25735D63 +:10DE10002025733A20536574547820496C6C6567EB +:10DE2000616C205374617475730D0A005B25735D1A +:10DE30002025733A2057616974466F7249646C6596 +:10DE40002054696D656F757420746578743D257311 +:10DE50002074696D656F75743D256C750D0A000041 +:10DE60005B25735D2025733A2057616974466F7294 +:10DE700049646C65206661696C2072657472793DD5 +:10DE800025640D0A000000005B25735D2025733AB0 +:10DE9000207374617475733D253032780D0A00006B +:10DEA0005B25735D2025733A205772697465436F53 +:10DEB0006D6D616E6432207374617475733D2530CD +:10DEC00032782072657472793D25640D0A00000075 +:10DED0005B25735D2025733A2053504920547261AD +:10DEE0006E73616374696F6E206572726F723A301F +:10DEF00078253032780D0A0073746172742057727D +:10DF0000697465436F6D6D616E6432005B25735D8E +:10DF10002025733A205772697465436F6D6D616E89 +:10DF2000643A20434D443D3078253032780D0A0064 +:10DF3000656E64205772697465436F6D6D616E64C0 +:10DF400032000000737461727420577269746552F4 +:10DF50006567697374657200656E642057726974D1 +:10DF60006552656769737465720000005B25735DB7 +:10DF70002025733A20577269746552656769737416 +:10DF800065723A205245473D3078253032780D0A87 +:10DF9000000000005B25735D2025733A2044617406 +:10DFA000614F75743A25303278200D0A0000000068 +:10DFB0000001020203030303040404040404040430 +:10DFC0000505050505050505050505050505050501 +:10DFD00006060606060606060606060606060606E1 +:10DFE00006060606060606060606060606060606D1 +:10DFF00007070707070707070707070707070707B1 +:10E0000007070707070707070707070707070707A0 +:10E010000707070707070707070707070707070790 +:10E020000707070707070707070707070707070780 +:10E030000808080808080808080808080808080860 +:10E040000808080808080808080808080808080850 +:10E050000808080808080808080808080808080840 +:10E060000808080808080808080808080808080830 +:10E070000808080808080808080808080808080820 +:10E080000808080808080808080808080808080810 +:10E090000808080808080808080808080808080800 +:10E0A00008080808080808080808080808080808F0 +:10E0B000504F5349580000002E000000002020203F +:10E0C0002020202020202828282828202020202028 +:10E0D00020202020202020202020202020881010F8 +:10E0E0001010101010101010101010101004040454 +:10E0F0000404040404040410101010101010414112 +:10E1000041414141010101010101010101010101FF +:10E110000101010101010101101010101010424213 +:10E1200042424242020202020202020202020202CF +:10E13000020202020202020210101010200000006F +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E22000232D302B20000000686C4C00656667458C +:10E2300046470000303132333435363738394142C1 +:10E240004344454600000000303132333435363720 +:0CE25000383961626364656600000000FC +:10E25C00000000000000000001020304060708098A +:10E26C000000000001020304010203040607080970 +:10E27C00430000000000000000000000000000004F +:10E28C000000000000000000000000000000000082 +:10E29C00430000000000000000000000000000002F +:10E2AC000000000000000000000000000000000062 +:10E2BC00430000000000000000000000000000000F +:10E2CC000000000000000000000000000000000042 +:10E2DC0043000000000000000000000000000000EF +:10E2EC000000000000000000000000000000000022 +:10E2FC0043000000000000000000000000000000CF +:10E30C000000000000000000000000000000000001 +:10E31C0043000000000000000000000000000000AE +:10E32C0000000000000000000000000000000000E1 +:10E33C00430000000000000000000000000000008E +:10E34C0000000000000000000000000000000000C1 +:10E35C0090A10000FC98000000000000BCE0000050 +:10E36C00B8E00000B4D90000B4D90000B4D9000062 +:10E37C00B4D90000B4D90000B4D90000B4D900005D +:10E38C00B4D90000B4D90000FFFFFFFFFFFFFFFF6F +:10E39C00FFFFFFFFFFFF000001004153434949000D +:10E3AC000000000000000000000000000000000061 +:10E3BC0000000000000000000000415343494900E8 +:10E3CC000000000000000000000000000000000041 +:10E3DC000000000000000000000000000000000031 +:10E3EC00E0E1000000E20000C0E1000000000000DD +:10E3FC000000000000000000000000000000000011 +:10E40C000000000000000000000000000000000000 +:10E41C0000000000000000000000000000000000F0 +:10E42C0000000000000000000000000000000000E0 +:10E43C0000000000000000000000000000000000D0 +:10E44C0000D8B80502040608801100208C010020B9 +:08E45C008C010020000000000B +:00000001FF diff --git a/obj/meshcorenortos.lst b/obj/meshcorenortos.lst new file mode 100644 index 0000000..02742a0 --- /dev/null +++ b/obj/meshcorenortos.lst @@ -0,0 +1,19482 @@ + +meshcorenortos.elf: file format elf32-littleriscv +meshcorenortos.elf +architecture: riscv:rv32, flags 0x00000112: +EXEC_P, HAS_SYMS, D_PAGED +start address 0x00000000 + +Program Header: + LOAD off 0x00001000 vaddr 0x00000000 paddr 0x00000000 align 2**12 + filesz 0x0000e25c memsz 0x0000e25c flags r-x + LOAD off 0x00010000 vaddr 0x20000000 paddr 0x0000e25c align 2**12 + filesz 0x00000208 memsz 0x00001180 flags rw- + LOAD off 0x00010800 vaddr 0x20007800 paddr 0x20007800 align 2**12 + filesz 0x00000000 memsz 0x00000800 flags rw- + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .init 00000004 00000000 00000000 00001000 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .vector 000001bc 00000004 00000004 00001004 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .text 0000e09c 000001c0 000001c0 000011c0 2**3 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 3 .fini 00000000 0000e25c 0000e25c 00010208 2**0 + CONTENTS, ALLOC, LOAD, CODE + 4 .dalign 00000000 20000000 20000000 00010208 2**0 + CONTENTS + 5 .dlalign 00000000 0000e25c 0000e25c 00010208 2**0 + CONTENTS + 6 .data 00000208 20000000 0000e25c 00010000 2**2 + CONTENTS, ALLOC, LOAD, DATA + 7 .bss 00000f78 20000208 0000e464 00010208 2**2 + ALLOC + 8 .stack 00000800 20007800 20007800 00010800 2**0 + ALLOC + 9 .debug_info 00038f92 00000000 00000000 00010208 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_abbrev 00007410 00000000 00000000 0004919a 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_loc 00018b98 00000000 00000000 000505aa 2**0 + CONTENTS, READONLY, DEBUGGING + 12 .debug_aranges 00001348 00000000 00000000 00069148 2**3 + CONTENTS, READONLY, DEBUGGING + 13 .debug_ranges 00004ea0 00000000 00000000 0006a490 2**3 + CONTENTS, READONLY, DEBUGGING + 14 .debug_line 0002a966 00000000 00000000 0006f330 2**0 + CONTENTS, READONLY, DEBUGGING + 15 .debug_str 00005bf3 00000000 00000000 00099c96 2**0 + CONTENTS, READONLY, DEBUGGING + 16 .comment 00000033 00000000 00000000 0009f889 2**0 + CONTENTS, READONLY + 17 .debug_frame 00004d90 00000000 00000000 0009f8bc 2**2 + CONTENTS, READONLY, DEBUGGING + 18 .stab 000000b4 00000000 00000000 000a464c 2**2 + CONTENTS, READONLY, DEBUGGING + 19 .stabstr 00000183 00000000 00000000 000a4700 2**0 + CONTENTS, READONLY, DEBUGGING +SYMBOL TABLE: +00000000 l d .init 00000000 .init +00000004 l d .vector 00000000 .vector +000001c0 l d .text 00000000 .text +0000e25c l d .fini 00000000 .fini +20000000 l d .dalign 00000000 .dalign +0000e25c l d .dlalign 00000000 .dlalign +20000000 l d .data 00000000 .data +20000208 l d .bss 00000000 .bss +20007800 l d .stack 00000000 .stack +00000000 l d .debug_info 00000000 .debug_info +00000000 l d .debug_abbrev 00000000 .debug_abbrev +00000000 l d .debug_loc 00000000 .debug_loc +00000000 l d .debug_aranges 00000000 .debug_aranges +00000000 l d .debug_ranges 00000000 .debug_ranges +00000000 l d .debug_line 00000000 .debug_line +00000000 l d .debug_str 00000000 .debug_str +00000000 l d .comment 00000000 .comment +00000000 l d .debug_frame 00000000 .debug_frame +00000000 l d .stab 00000000 .stab +00000000 l d .stabstr 00000000 .stabstr +00000000 l df *ABS* 00000000 ./Startup/startup_ch32v30x_D8C.o +00000004 l .vector 00000000 _vector_base +00000000 l df *ABS* 00000000 hexdump.c +00000000 l df *ABS* 00000000 ack.c +00000000 l df *ABS* 00000000 advert.c +00000000 l df *ABS* 00000000 anonymous.c +00000000 l df *ABS* 00000000 control.c +00000000 l df *ABS* 00000000 encrypted.c +00000f5a l F .text 0000009c parse_coord_micro +00000000 l df *ABS* 00000000 group.c +00000000 l df *ABS* 00000000 meshcore.c +00000000 l df *ABS* 00000000 meshframing.c +00000000 l df *ABS* 00000000 rtc.c +0000c3f0 l O .text 00000025 months.5280 +20000210 l O .bss 00000002 daycnt.5339 +00000000 l df *ABS* 00000000 monocypher-ed25519.c +00002c28 l F .text 00000058 load64_be_buf +00002c80 l F .text 000005a4 sha512_compress +00003224 l F .text 00000032 sha512_set_input +00003256 l F .text 000001ba crypto_sha512_update.part.1 +000035e2 l F .text 00000066 hash_reduce.constprop.2 +00003672 l F .text 00000098 ed25519_dom_sign +0000c428 l O .text 00000280 K +00000000 l df *ABS* 00000000 monocypher.c +000037d8 l F .text 00000010 load24_le +000037e8 l F .text 00000016 load32_le +000037fe l F .text 0000001c load64_le +0000381a l F .text 00000014 store32_le +0000382e l F .text 0000002c load32_le_buf +0000385a l F .text 00000026 store32_le_buf +00003880 l F .text 00000040 x16 +000038c0 l F .text 00000024 x32 +000038e4 l F .text 00000010 fe_0 +000038f4 l F .text 00000018 fe_1 +0000390c l F .text 0000001a fe_copy +00003926 l F .text 0000001e fe_neg +00003944 l F .text 00000026 fe_add +0000396a l F .text 00000028 fe_sub +00003992 l F .text 000000d4 fe_cswap +00003a66 l F .text 00000098 fe_ccopy +00003afe l F .text 00000258 fe_frombytes_mask +00003d56 l F .text 000002f2 fe_mul_small +00004048 l F .text 00000a9c fe_mul +00004ae4 l F .text 00000676 fe_sq +0000515a l F .text 0000001a scalar_bit +00005174 l F .text 0000004a multiply +000051be l F .text 00000036 is_above_l +000051f4 l F .text 00000062 remove_l +00005256 l F .text 00000026 ge_zero +0000527c l F .text 00000042 ge_cache +000052be l F .text 000000c2 ge_add +00005380 l F .text 000000b6 ge_madd +00005436 l F .text 000000aa ge_double +000054e0 l F .text 00000028 slide_init +00005508 l F .text 000000c4 slide_step +000055cc l F .text 000000dc lookup_add +000056d0 l F .text 00000116 fe_tobytes +000057e6 l F .text 00000040 fe_isequal +00005826 l F .text 000001e8 invsqrt +00005a0e l F .text 0000003a fe_invert +00005a48 l F .text 0000018a scalarmult +00005bd2 l F .text 0000011c mod_l +00005cee l F .text 00000024 fe_isodd +00005d12 l F .text 00000096 ge_frombytes_neg_vartime +00005da8 l F .text 0000006c ge_tobytes +00005f06 l F .text 000000d6 ge_scalarmult_base +0000c6e8 l O .text 00000028 D2 +0000c710 l O .text 00000020 L +0000c730 l O .text 000003c0 b_comb_high +0000caf0 l O .text 000003c0 b_comb_low +0000ceb0 l O .text 000003c0 b_window +0000d270 l O .text 00000028 d +0000d298 l O .text 00000028 fe_one +0000d2c0 l O .text 00000020 half_mod_L.2900 +0000d2e0 l O .text 00000020 half_ones.2901 +0000d300 l O .text 00000024 r.2702 +0000d324 l O .text 00000028 sqrtm1 +0000d34c l O .text 00000020 zero_point.2876 +00000000 l df *ABS* 00000000 aes.c +0000621a l F .text 00000016 read32_be +00006230 l F .text 00000016 write32_be +00006246 l F .text 00000022 add_round_key +00006268 l F .text 0000008a shift_rows +000062f2 l F .text 00000024 gf_poly_mul2 +00006316 l F .text 00000032 mix_column +00006348 l F .text 0000008a inv_shift_rows +000063d2 l F .text 00000050 inv_mix_column +00006422 l F .text 000000da sub_word +000064fc l F .text 000000a2 aes_schedule +0000659e l F .text 0000003c sub_block +000066b2 l F .text 0000003c inv_sub_block +0000d36c l O .text 0000000b Rcon +0000d378 l O .text 00000100 S +0000d478 l O .text 00000100 S_inv +00000000 l df *ABS* 00000000 blockwise.c +00000000 l df *ABS* 00000000 chash.c +00000000 l df *ABS* 00000000 hmac.c +00000000 l df *ABS* 00000000 sha256.c +00006c5a l F .text 00000016 write32_be +00006c70 l F .text 0000020c sha256_update_block +0000d578 l O .text 00000100 K +00000000 l df *ABS* 00000000 temperature.c +00000000 l df *ABS* 00000000 config.c +0000d69c l O .text 00000010 CSWTCH.3 +00000000 l df *ABS* 00000000 ch32v30x_it.c +00000000 l df *ABS* 00000000 main.c +00000000 l df *ABS* 00000000 sx1262.c +00000000 l df *ABS* 00000000 system_ch32v30x.c +00000000 l df *ABS* 00000000 ch32v30x_adc.c +00000000 l df *ABS* 00000000 ch32v30x_bkp.c +00000000 l df *ABS* 00000000 ch32v30x_dbgmcu.c +00000000 l df *ABS* 00000000 ch32v30x_gpio.c +00000000 l df *ABS* 00000000 ch32v30x_misc.c +00000000 l df *ABS* 00000000 ch32v30x_pwr.c +00000000 l df *ABS* 00000000 ch32v30x_rcc.c +20000010 l O .data 00000010 APBAHBPrescTable +200001f4 l O .data 00000004 ADCPrescTable +00000000 l df *ABS* 00000000 ch32v30x_rtc.c +00000000 l df *ABS* 00000000 ch32v30x_spi.c +00000000 l df *ABS* 00000000 ch32v30x_usart.c +00000000 l df *ABS* 00000000 debug.c +20000228 l O .bss 00000002 p_ms +2000022a l O .bss 00000001 p_us +200001f8 l O .data 00000004 curbrk.5271 +00000000 l df *ABS* 00000000 libgcc2.c +00000000 l df *ABS* 00000000 libgcc2.c +00000000 l df *ABS* 00000000 abort.c +00000000 l df *ABS* 00000000 atoi.c +00000000 l df *ABS* 00000000 locale.c +00000000 l df *ABS* 00000000 malloc.c +00000000 l df *ABS* 00000000 mbtowc_r.c +00000000 l df *ABS* 00000000 memcmp.c +00000000 l df *ABS* 00000000 memcpy.c +00000000 l df *ABS* 00000000 memmove.c +00000000 l df *ABS* 00000000 nano-mallocr.c +00000000 l df *ABS* 00000000 nano-mallocr.c +00000000 l df *ABS* 00000000 printf.c +00000000 l df *ABS* 00000000 putchar.c +00000000 l df *ABS* 00000000 puts.c +00000000 l df *ABS* 00000000 rand.c +00000000 l df *ABS* 00000000 sbrkr.c +00000000 l df *ABS* 00000000 signal.c +00000000 l df *ABS* 00000000 signalr.c +00000000 l df *ABS* 00000000 snprintf.c +00000000 l df *ABS* 00000000 sprintf.c +00000000 l df *ABS* 00000000 strcat.c +00000000 l df *ABS* 00000000 strcpy.c +00000000 l df *ABS* 00000000 strlen.c +00000000 l df *ABS* 00000000 strncpy.c +00000000 l df *ABS* 00000000 strtol.c +00009f7c l F .text 0000013a _strtol_l.isra.0 +00000000 l df *ABS* 00000000 wbuf.c +00000000 l df *ABS* 00000000 wctomb_r.c +00000000 l df *ABS* 00000000 wsetup.c +00000000 l df *ABS* 00000000 fflush.c +00000000 l df *ABS* 00000000 findfp.c +0000a444 l F .text 00000066 std +00000000 l df *ABS* 00000000 fwalk.c +00000000 l df *ABS* 00000000 makebuf.c +00000000 l df *ABS* 00000000 mlock.c +00000000 l df *ABS* 00000000 nano-vfprintf.c +00000000 l df *ABS* 00000000 nano-vfprintf.c +0000aab0 l F .text 00000028 __sfputc_r +00000000 l df *ABS* 00000000 nano-vfprintf_i.c +00000000 l df *ABS* 00000000 putc.c +00000000 l df *ABS* 00000000 stdio.c +00000000 l df *ABS* 00000000 writer.c +00000000 l df *ABS* 00000000 closer.c +00000000 l df *ABS* 00000000 fstatr.c +00000000 l df *ABS* 00000000 isattyr.c +00000000 l df *ABS* 00000000 lseekr.c +00000000 l df *ABS* 00000000 memchr.c +00000000 l df *ABS* 00000000 nano-mallocr.c +00000000 l df *ABS* 00000000 readr.c +00000000 l df *ABS* 00000000 nano-mallocr.c +00000000 l df *ABS* 00000000 close.c +00000000 l df *ABS* 00000000 fstat.c +00000000 l df *ABS* 00000000 getpid.c +00000000 l df *ABS* 00000000 isatty.c +00000000 l df *ABS* 00000000 kill.c +00000000 l df *ABS* 00000000 lseek.c +00000000 l df *ABS* 00000000 read.c +00000000 l df *ABS* 00000000 _exit.c +00000000 l df *ABS* 00000000 libgcc2.c +00000000 l df *ABS* 00000000 ctype_.c +00000000 l df *ABS* 00000000 impure.c +2000018c l O .data 00000060 impure_data +00000000 l df *ABS* 00000000 stats.c +00000000 l df *ABS* 00000000 reent.c +0000b3f0 g F .text 00000014 _malloc_usable_size_r +00008a1c w .text 00000000 EXTI2_IRQHandler +00009c08 g F .text 0000002c putchar +00007ba4 g F .text 00000012 spi_write_byte +00008a1c w .text 00000000 TIM8_TRG_COM_IRQHandler +00008a1c w .text 00000000 TIM8_CC_IRQHandler +0000b300 g F .text 00000028 _isatty_r +00009f36 g F .text 00000010 strcpy +00009500 g F .text 0000002c .hidden __ashldi3 +0000b41c g F .text 0000000c _getpid +00009c34 g F .text 000000d8 _puts_r +0000b328 g F .text 0000002c _lseek_r +000010b0 g F .text 00000092 sendEncryptedTextMessage +00008a1c w .text 00000000 UART8_IRQHandler +000004ec g F .text 00000052 sendDiscreteAck +00003794 g F .text 00000014 crypto_ed25519_sign +00009e36 g F .text 0000002c _kill_r +00009bc6 g F .text 00000042 printf +200009f0 g .data 00000000 __global_pointer$ +000001c8 g F .text 00000028 .hidden __riscv_save_8 +000084ee g F .text 00000042 GetPacketStatus +000068c4 g F .text 000000bc cf_blockwise_accumulate_final +20000218 g O .bss 00000006 PacketParams +00008a1c w .text 00000000 TIM1_CC_IRQHandler +00006980 g F .text 00000010 cf_blockwise_accumulate +0000b24a g F .text 00000030 __sseek +0000a4fc g F .text 0000006c __sinit +0000936a g F .text 00000004 SPI_I2S_SendData +0000a0d4 g F .text 000000bc __swbuf_r +000076e2 g F .text 00000010 HardFault_Handler +00007212 g F .text 0000003e encode_gps +000091e0 g F .text 00000012 RTC_EnterConfigMode +0000a4b4 g F .text 00000048 __sfmoreglue +00007cac g F .text 0000005a WaitForIdleBegin +0000a760 g F .text 00000002 __malloc_unlock +000092f2 g F .text 00000014 RTC_ClearFlag +00000214 g F .text 0000000c .hidden __riscv_restore_3 +00008a1c w .text 00000000 TIM6_IRQHandler +00008a1c w .text 00000000 SysTick_Handler +00008b60 g F .text 0000000a ADC_StartCalibration +0000854c g F .text 000000a0 SetRx +00008ed0 g F .text 0000005c NVIC_Init +00008a1c w .text 00000000 PVD_IRQHandler +00008a1c w .text 00000000 SDIO_IRQHandler +000085ec g F .text 000000b0 LoRaConfig +00009a04 g F .text 00000046 memmove +00008a1c w .text 00000000 TIM9_BRK_IRQHandler +00000200 g F .text 00000020 .hidden __riscv_restore_10 +0000126e g F .text 00000042 printResponse +000071d4 g F .text 00000024 getVoltage +0000936e g F .text 00000004 SPI_I2S_ReceiveData +00009e66 g F .text 0000006c snprintf +000098da g F .text 00000018 __locale_ctype_ptr +00008a1c w .text 00000000 DMA2_Channel8_IRQHandler +000076e0 g F .text 00000002 NMI_Handler +00000e5c g F .text 000000fe decodeControlFrame +00008a1c w .text 00000000 CAN2_RX1_IRQHandler +00008a1c w .text 00000000 EXTI3_IRQHandler +000001c8 g F .text 00000028 .hidden __riscv_save_11 +00008dec g F .text 0000000a DBGMCU_GetCHIPID +000028a8 g F .text 0000001c RTC_NVIC_Config +00001df8 g F .text 000000b4 sendGroupMessage +000029c6 g F .text 0000005e RTC_Set_From_BuildTime +00000740 g F .text 000000a8 printAdvertisement +2000037c g O .bss 00000010 currentLoRaSettings +00008a1c w .text 00000000 USBHS_IRQHandler +20000234 g O .bss 00000108 dontReTXHistory +0000920a g F .text 0000005a RTC_GetCounter +00009432 g F .text 0000000a USART_GetFlagStatus +00008a1c w .text 00000000 DMA2_Channel9_IRQHandler +0000b2d6 g F .text 0000002a _fstat_r +0000053e g F .text 00000040 ed25519_sign_ad +00008a1c w .text 00000000 TIM10_CC_IRQHandler +2000117c g O .bss 00000004 errno +00007410 g F .text 00000126 printNodeDB +20000208 g .bss 00000000 _sbss +00000800 g *ABS* 00000000 __stack_size +00005e14 g F .text 0000002c crypto_eddsa_trim_scalar +00008c6a g F .text 0000000a ADC_GetFlagStatus +000003e2 g F .text 000000bc hexdump +00008a1c w .text 00000000 USBFS_IRQHandler +00006bba g F .text 00000018 cf_hmac_update +000081e6 g F .text 00000034 SetPowerConfig +00000214 g F .text 0000000c .hidden __riscv_restore_2 +00006990 g F .text 00000064 cf_blockwise_acc_byte +00009178 g F .text 00000020 RCC_BackupResetCmd +00006ee4 g F .text 00000026 cf_sha256_update +00009952 g F .text 000000b2 memcpy +0000821a g F .text 00000020 SetPaConfig +00008b3e g F .text 00000010 ADC_Cmd +00001868 g F .text 00000448 parseEncryptedPayload +0000d68c g O .text 00000010 BRNTestChannelPSK +00008dd0 g F .text 0000001c BKP_WriteBackupRegister +0000a4aa g F .text 0000000a _cleanup_r +0000a846 g F .text 0000026a _svfprintf_r +000061bc g F .text 0000005e crypto_eddsa_to_x25519 +00008a1c w .text 00000000 EXTI0_IRQHandler +00008a1c w .text 00000000 I2C2_EV_IRQHandler +00008a1c w .text 00000000 TIM10_TRG_COM_IRQHandler +20000212 g O .bss 00000002 Calibrattion_Val +20000208 g O .bss 00000001 dontReTXHistoryIndex +00009d0c g F .text 0000000c puts +000071a8 g F .text 0000002c getDeciTemperature +200001f0 g O .data 00000004 SystemCoreClock +00007bb6 g F .text 00000006 LoRaDebugPrint +0000942a g F .text 00000008 USART_ReceiveData +000098f2 g F .text 0000000a malloc +00009dc8 g F .text 00000062 _raise_r +0000b410 g F .text 0000000c _fstat +00002856 g F .text 00000052 mac_then_decrypt +00000004 g .init 00000000 _einit +0000911e g F .text 0000001e RCC_APB2PeriphClockCmd +000072ca g F .text 0000003c getNodePrefix +000001c0 g F .text 00000030 .hidden __riscv_save_12 +00008a1c w .text 00000000 CAN2_SCE_IRQHandler +00008a1c w .text 00000000 ADC1_2_IRQHandler +00009e62 g F .text 00000004 _getpid_r +00008df6 g F .text 000000c0 GPIO_Init +000081ae g F .text 0000001c SetRegulatorMode +00008f42 g F .text 00000012 RCC_ADCCLKConfig +00008a1c w .text 00000000 Break_Point_Handler +0000734a g F .text 000000c6 addChannel +00000200 g F .text 00000020 .hidden __riscv_restore_11 +20000224 g O .bss 00000004 NVIC_Priority_Group +00008a1c w .text 00000000 SPI1_IRQHandler +00008b4e g F .text 0000000a ADC_ResetCalibration +0000940c g F .text 00000016 USART_Cmd +000007e8 g F .text 00000170 decodeAdvertisement +00009d9e g F .text 0000002a _sbrk_r +00005e96 g F .text 00000070 crypto_eddsa_mul_add +00008a1c w .text 00000000 TAMPER_IRQHandler +000001f0 g F .text 0000000c .hidden __riscv_save_1 +000020de g F .text 0000019c ReadFrame +00002a72 g F .text 000000f8 RTC_Get +0000245e g F .text 0000003c addToNotReTX +00000214 g F .text 0000000c .hidden __riscv_restore_0 +000037a8 g F .text 00000030 crypto_ed25519_check +0000b3c4 g F .text 0000002c _read_r +00008f54 g F .text 00000028 RCC_LSEConfig +000028c4 g F .text 00000026 Is_Leap_Year +000001d6 g F .text 0000001a .hidden __riscv_save_7 +00008a1c w .text 00000000 CAN2_RX0_IRQHandler +00008f88 g F .text 00000020 RCC_RTCCLKCmd +00001eec g F .text 000000f8 decodeGroupMessage +00008a1c w .text 00000000 TIM8_UP_IRQHandler +000056a8 g F .text 00000014 crypto_verify32 +0000d938 g O .text 00000010 publicChannelPSK +000034c0 g F .text 00000010 crypto_sha512_update +0000913c g F .text 0000001e RCC_APB1PeriphClockCmd +00002434 g F .text 0000002a getFrameHash +00008a1c w .text 00000000 Ecall_M_Mode_Handler +00007536 g F .text 00000024 getStringRole +20007800 g .stack 00000000 _heap_end +00008368 g F .text 0000003e SetDioIrqParams +0000b428 g F .text 0000000c _isatty +00006196 g F .text 00000026 crypto_eddsa_scalarbase +20000200 g O .data 00000004 _global_impure_ptr +0000020a g F .text 00000016 .hidden __riscv_restore_5 +0000b36c g F .text 00000058 _realloc_r +000080c8 g F .text 0000001c SetDio2AsRfSwitchCtrl +000056bc g F .text 00000014 crypto_wipe +00009372 g F .text 0000000a SPI_I2S_GetFlagStatus +00008a1c w .text 00000000 DMA2_Channel2_IRQHandler +0000952c g F .text 00000392 .hidden __udivdi3 +00008a1c w .text 00000000 DMA1_Channel4_IRQHandler +00008b8a g F .text 000000b8 ADC_RegularChannelConfig +000098be g F .text 0000000e abort +00006880 g F .text 00000044 aes_decrypt_ecb +000094da g F .text 00000026 _sbrk +00008c42 g F .text 00000008 ADC_GetConversionValue +0000227a g F .text 000001ba printframeHeader +00009290 g F .text 0000002e RTC_SetPrescaler +0000a0b6 g F .text 0000001e strtol +00001170 g F .text 000000ae sendEncryptedPathPayload +0000249a g F .text 0000026e LoRaTransmit +00000958 g F .text 00000018 strnlen +00008a1c w .text 00000000 TIM9_UP_IRQHandler +000005ce g F .text 000000e4 sendAdvert +0000d678 g O .text 00000014 cf_sha256 +0000020a g F .text 00000016 .hidden __riscv_restore_6 +00008a1c w .text 00000000 USART3_IRQHandler +00002b6a g F .text 000000be RTC_Init +000080ac g F .text 0000001c Calibrate +00008f2c g F .text 00000016 PWR_BackupAccessCmd +00008a1c w .text 00000000 RTC_IRQHandler +00008b6a g F .text 00000008 ADC_GetCalibrationStatus +20001180 g .bss 00000000 _ebss +0000c3e4 g O .text 0000000c mon_table +00008a1c w .text 00000000 DMA1_Channel7_IRQHandler +00008b72 g F .text 00000018 ADC_SoftwareStartConvCmd +00006c1e g F .text 0000003c hmac_sha256 +00008b58 g F .text 00000008 ADC_GetResetCalibrationStatus +00000dac g F .text 0000004e printDiscoverRequest +00001cb0 g F .text 00000148 decodeEncryptedPayload +00007e9a g F .text 00000040 FixInvertedIQ +00008a1c w .text 00000000 CAN1_RX1_IRQHandler +0000943c g F .text 0000002a Delay_Init +000092ce g F .text 00000024 RTC_WaitForSynchro +00008a1c w .text 00000000 DVP_IRQHandler +00008a1c w .text 00000000 UART5_IRQHandler +00009198 g F .text 0000002e RCC_GetFlagStatus +00008dc0 g F .text 00000010 BKP_DeInit +0000b152 g F .text 00000084 _putc_r +00008424 g F .text 00000020 SetModulationParams +00003648 g F .text 0000002a crypto_sha512 +000087d2 g F .text 00000022 GetRxBufferStatus +00008a1c w .text 00000000 TIM4_IRQHandler +00006a8e g F .text 00000044 cf_hash +00007bbc g F .text 00000006 GetPacketLost +000001c8 g F .text 00000028 .hidden __riscv_save_9 +00008ec0 g F .text 0000000a GPIO_WriteBit +00009f18 g F .text 0000001e strcat +00009264 g F .text 0000002c RTC_SetCounter +00008a1c w .text 00000000 DMA2_Channel1_IRQHandler +0000e1c0 g O .text 00000020 __sf_fake_stderr +00009e66 g F .text 0000006c sniprintf +000001d6 g F .text 0000001a .hidden __riscv_save_4 +00005e40 g F .text 0000002e crypto_x25519 +0000c418 g O .text 0000000c table_week +00008a1c w .text 00000000 I2C1_EV_IRQHandler +00007f80 g F .text 00000086 WriteCommand +0000a762 g F .text 000000e4 __ssputs_r +00008fa8 g F .text 00000176 RCC_GetClocksFreq +00008a1c w .text 00000000 DMA1_Channel6_IRQHandler +0000aad8 g F .text 00000042 __sfputs_r +00008a1c w .text 00000000 UART4_IRQHandler +00008006 g F .text 0000001c SetStandby +00008a1c w .text 00000000 DMA2_Channel4_IRQHandler +0000b354 g F .text 00000018 memchr +0000937c g F .text 00000090 USART_Init +00009a4a g F .text 000000a8 _free_r +00008a1c w .text 00000000 TIM3_IRQHandler +00008a1c w .text 00000000 RCC_IRQHandler +000001f0 g F .text 0000000c .hidden __riscv_save_3 +00008a1c w .text 00000000 TIM1_TRG_COM_IRQHandler +00008a1c w .text 00000000 DMA1_Channel1_IRQHandler +00000000 g .init 00000000 _start +00008a1c w .text 00000000 DMA2_Channel7_IRQHandler +000080e4 g F .text 0000007c CalibrateImage +20000000 g O .data 00000010 AHBPrescTable +00002a24 g F .text 0000004e RTC_Get_Week +00009d18 g F .text 00000086 rand +0000b440 g F .text 0000000c _lseek +00008f7c g F .text 0000000c RCC_RTCCLKConfig +00007dac g F .text 000000ee ReadRegister +00008a1c w .text 00000000 EXTI15_10_IRQHandler +00007b2a g F .text 0000007a spi_read_byte +00008022 g F .text 0000008a SetDio3AsTcxoCtrl +00006826 g F .text 00000016 cf_aes_finish +00000970 g F .text 0000016c printAnonRequest +00009f58 g F .text 00000024 strncpy +00002708 g F .text 000000b4 retransmitFrame +000081ca g F .text 0000001c SetBufferBaseAddress +00001eac g F .text 00000040 makeSendGroupMessage +00000adc g F .text 0000026e decodeAnonReq +00008a1c w .text 00000000 TIM7_IRQHandler +0000b2ae g F .text 00000028 _close_r +00008a1c w .text 00000000 CAN2_TX_IRQHandler +20000000 g .dalign 00000000 _data_vma +00008a1c w .text 00000000 TIM5_IRQHandler +00000d4a g F .text 00000062 sendDiscoverResponse +00005fdc g F .text 000001ba crypto_eddsa_check_equation +0000992e g F .text 00000024 memcmp +0000a1ae g F .text 000000fe __swsetup_r +00008a1c w .text 00000000 EXTI9_5_IRQHandler +0000a568 g F .text 000000a0 __sfp +00000ff6 g F .text 000000ba sendEncryptedFrame +000001c8 g F .text 00000028 .hidden __riscv_save_10 +0000b1d6 g F .text 0000002c __sread +00007c46 g F .text 00000066 ResetLora +00008a1c w .text 00000000 ETH_WKUP_IRQHandler +0000a75e g F .text 00000002 __malloc_lock +0000020a g F .text 00000016 .hidden __riscv_restore_4 +0000683c g F .text 00000044 aes_encrypt_ecb +00000200 g F .text 00000020 .hidden __riscv_restore_8 +0000714e g F .text 0000002a Get_ConversionVal +000071f8 g F .text 0000001a int24_to_bytes +0000a3de g F .text 00000066 _fflush_r +000001d6 g F .text 0000001a .hidden __riscv_save_6 +00008a1c w .text 00000000 SPI2_IRQHandler +0000e1e0 g O .text 00000020 __sf_fake_stdin +00000220 g F .text 000000a8 memset +000069f4 g F .text 0000009a cf_blockwise_acc_pad +00000200 g F .text 00000020 .hidden __riscv_restore_9 +0000020a g F .text 00000016 .hidden __riscv_restore_7 +000076f2 g F .text 000002f2 main +00007eda g F .text 000000a6 WriteCommand2 +000034d0 g F .text 00000112 crypto_sha512_final +00008a1c w .text 00000000 TIM10_BRK_IRQHandler +00007a20 g F .text 0000010a LoRaInit +00008a1c w .text 00000000 TIM9_CC_IRQHandler +00003410 g F .text 000000b0 crypto_sha512_init +00007d06 g F .text 000000a6 WriteRegister +0000057e g F .text 00000050 ed25519_verify_ad +0000b27a g F .text 00000006 __sclose +00008a1c w .text 00000000 DMA2_Channel5_IRQHandler +00006ad2 g F .text 000000e8 cf_hmac_init +00009af2 g F .text 000000d4 _malloc_r +0000a190 g F .text 0000001e __ascii_wctomb +00001fe4 g F .text 000000fa processFrame +00006bd2 g F .text 0000004c cf_hmac_finish +00007bc2 g F .text 00000084 WaitForIdle +00008c8c g F .text 00000134 Get_CalibrationValue +000028ea g F .text 000000dc RTC_Set +00008a1c w .text 00000000 DMA1_Channel5_IRQHandler +2000038c g O .bss 00000df0 persistent +00008a1c w .text 00000000 EXTI4_IRQHandler +00009466 g F .text 00000036 Delay_Ms +00008a1c w .text 00000000 USB_LP_CAN1_RX0_IRQHandler +000006b2 g F .text 0000008e saveAdvert +00007250 g F .text 00000042 getNextNode +00008c74 g F .text 00000018 ADC_BufferCmd +00009350 g F .text 0000001a SPI_Cmd +000002c8 g F .text 0000011a strcmp +000087f4 g F .text 000000fa SystemInit +00008a1c w .text 00000000 RNG_IRQHandler +0000823a g F .text 0000012e LoRaBegin +000067d6 g F .text 00000050 cf_aes_init +00009bc6 g F .text 00000042 iprintf +00008a1c w .text 00000000 USB_HP_CAN1_TX_IRQHandler +00009ed2 g F .text 00000046 sprintf +0000dfb0 g O .text 00000100 .hidden __clz_tab +00000000 g .init 00000000 _sinit +0000b280 g F .text 0000002e _write_r +000079e4 g F .text 0000003c LoRaError +00008a1c w .text 00000000 DMA1_Channel3_IRQHandler +00008444 g F .text 00000020 ClearIrqStatus +00008a1c w .text 00000000 ETH_IRQHandler +0000ada4 g F .text 0000010c _printf_common +200001fc g O .data 00000004 _impure_ptr +000070dc g F .text 0000003a Get_ADC_Val +0000702e g F .text 000000ae ADC_Function_Init +00008a1c w .text 00000000 TIM1_UP_IRQHandler +0000a2ac g F .text 00000132 __sflush_r +00007306 g F .text 00000044 getChannel +0000a846 g F .text 0000026a _svfiprintf_r +00008a1c w .text 00000000 WWDG_IRQHandler +00008a1c w .text 00000000 USBHSWakeup_IRQHandler +00008a1c w .text 00000000 DMA2_Channel11_IRQHandler +000098fc g F .text 00000032 __ascii_mbtowc +00008a1c w .text 00000000 Ecall_U_Mode_Handler +00008a1c w .text 00000000 DMA2_Channel6_IRQHandler +00008a1c w .text 00000000 TIM2_IRQHandler +20008000 g .stack 00000000 _eusrstack +0000869c g F .text 00000118 SetTx +000001f0 g F .text 0000000c .hidden __riscv_save_2 +00008a1c w .text 00000000 SW_Handler +00005e6e g F .text 00000028 crypto_eddsa_reduce +00008aa8 g F .text 00000040 ADC_DeInit +0000121e g F .text 00000050 printRequest +2000033c g O .bss 00000034 stats +00008530 g F .text 0000001c GetStatus +00008a1c w .text 00000000 TIM1_BRK_IRQHandler +0000a672 g F .text 00000058 __swhatbuf_r +00008ae8 g F .text 00000056 ADC_Init +00009422 g F .text 00000008 USART_SendData +00008a1c w .text 00000000 DMA2_Channel10_IRQHandler +00007292 g F .text 00000038 getNode +000065da g F .text 000000d8 cf_aes_encrypt +0000755a g F .text 00000100 populateDefaults +00008a1c w .text 00000000 EXTI1_IRQHandler +000092be g F .text 00000010 RTC_WaitForLastTask +20000370 g O .bss 0000000a calendar +000001d6 g F .text 0000001a .hidden __riscv_save_5 +0000949c g F .text 0000003e _write +00008c4a g F .text 00000020 ADC_TempSensorVrefintCmd +20000208 g .data 00000000 _edata +20001180 g .bss 00000000 _end +0000765a g F .text 00000086 LoraApply +00007178 g F .text 00000030 TempSensor_Volt_To_Temper_x10 +00008a1c w .text 00000000 RTCAlarm_IRQHandler +0000e25c g .dlalign 00000000 _data_lma +00008a1c w .text 00000000 TIM10_UP_IRQHandler +00008a1c w .text 00000000 TIM9_TRG_COM_IRQHandler +00008a1c w .text 00000000 UART7_IRQHandler +00008a1c w .text 00000000 USART2_IRQHandler +00008a1c w .text 00000000 UART6_IRQHandler +0000b202 g F .text 00000048 __swrite +000091f2 g F .text 00000018 RTC_ExitConfigMode +2000021e g O .bss 00000001 debugPrint +0000ab1a g F .text 0000028a _vfiprintf_r +0000a608 g F .text 0000006a _fwalk_reent +000088ee g F .text 0000012e SystemCoreClockUpdate +000027bc g F .text 0000009a encrypt_then_mac +0000049e g F .text 0000004e hexdump_compact +00009306 g F .text 0000000c RTC_ClearITPendingBit +0000b434 g F .text 0000000c _kill +00008a1c w .text 00000000 I2C2_ER_IRQHandler +00008a1c w .text 00000000 DMA1_Channel2_IRQHandler +0000e200 g O .text 00000020 __sf_fake_stdout +00009ed2 g F .text 00000046 siprintf +000098cc g F .text 00000008 atoi +000091c6 g F .text 0000001a RTC_ITConfig +000001fc g F .text 00000024 .hidden __riscv_restore_12 +00008a1c w .text 00000000 TIM8_BRK_IRQHandler +0000e0bc g O .text 00000101 _ctype_ +0000b44c g F .text 0000000c _read +00008a1e w .text 00000000 handle_reset +00008a1c w .text 00000000 CAN1_SCE_IRQHandler +00008408 g F .text 0000001c SetPacketType +20000214 g O .bss 00000001 bootedUp +0000700c g F .text 00000022 cf_sha256_digest +00008a1c w .text 00000000 FLASH_IRQHandler +000001f0 g F .text 0000000c .hidden __riscv_save_0 +000087b4 g F .text 0000001e GetIrqStatus +0000370a g F .text 0000008a crypto_ed25519_key_pair +0000b458 g F .text 00000002 _exit +00008160 g F .text 0000004e SetRfFrequency +2000021f g O .bss 00000001 txActive +00008a1c w .text 00000000 USART1_IRQHandler +0000a6ca g F .text 00000094 __smakebuf_r +00009f46 g F .text 00000012 strlen +2000020c g O .bss 00000004 startupTime +0000aeb0 g F .text 000002a2 _printf_i +00008a1c w .text 00000000 SPI3_IRQHandler +000098d4 g F .text 00000006 __locale_ctype_ptr_l +000066ee g F .text 000000e8 cf_aes_decrypt +20000230 g O .bss 00000004 __malloc_sbrk_start +0000915a g F .text 0000001e RCC_APB2PeriphResetCmd +00007116 g F .text 00000038 Get_ADC_Average +00008a1c w .text 00000000 I2C1_ER_IRQHandler +00006f0a g F .text 00000102 cf_sha256_digest_final +00009312 g F .text 0000003e SPI_Init +00008eca g F .text 00000006 NVIC_PriorityGroupConfig +000083a6 g F .text 00000046 SetStopRxTimerOnPreambleDetect +000012dc g F .text 0000058c processCommand +2000022c g O .bss 00000004 __malloc_free_list +000083ec g F .text 0000001c SetLoRaSymbNumTimeout +00000214 g F .text 0000000c .hidden __riscv_restore_1 +0000ab1a g F .text 0000028a _vfprintf_r +00006e7c g F .text 00000068 cf_sha256_init +20000220 g O .bss 00000004 txLost +00001142 g F .text 0000002e sendEncryptedResponse +00000dfa g F .text 00000062 printDiscoverResponse +00008464 g F .text 0000008a ReadCommand +00008eb6 g F .text 0000000a GPIO_ReadInputDataBit +000012b0 g F .text 0000002c sendPathBack +20000020 g O .data 0000016c __global_locale +00008a1c w .text 00000000 USBWakeUp_IRQHandler +0000b404 g F .text 0000000c _close +00009e2a g F .text 0000000c raise +00008a1c w .text 00000000 DMA2_Channel3_IRQHandler + + + +Disassembly of section .init: + +00000000 <_sinit>: + 0: 21f0806f j 8a1e + +Disassembly of section .vector: + +00000004 <_vector_base>: + ... + c: 76e0 flw fs0,108(a3) + e: 0000 unimp + 10: 76e2 flw fa3,56(sp) + 12: 0000 unimp + 14: 0000 unimp + 16: 0000 unimp + 18: 8a1c 0x8a1c + ... + 22: 0000 unimp + 24: 8a1c 0x8a1c + 26: 0000 unimp + 28: 8a1c 0x8a1c + ... + 32: 0000 unimp + 34: 8a1c 0x8a1c + 36: 0000 unimp + 38: 0000 unimp + 3a: 0000 unimp + 3c: 8a1c 0x8a1c + 3e: 0000 unimp + 40: 0000 unimp + 42: 0000 unimp + 44: 8a1c 0x8a1c + 46: 0000 unimp + 48: 8a1c 0x8a1c + 4a: 0000 unimp + 4c: 8a1c 0x8a1c + 4e: 0000 unimp + 50: 8a1c 0x8a1c + 52: 0000 unimp + 54: 8a1c 0x8a1c + 56: 0000 unimp + 58: 8a1c 0x8a1c + 5a: 0000 unimp + 5c: 8a1c 0x8a1c + 5e: 0000 unimp + 60: 8a1c 0x8a1c + 62: 0000 unimp + 64: 8a1c 0x8a1c + 66: 0000 unimp + 68: 8a1c 0x8a1c + 6a: 0000 unimp + 6c: 8a1c 0x8a1c + 6e: 0000 unimp + 70: 8a1c 0x8a1c + 72: 0000 unimp + 74: 8a1c 0x8a1c + 76: 0000 unimp + 78: 8a1c 0x8a1c + 7a: 0000 unimp + 7c: 8a1c 0x8a1c + 7e: 0000 unimp + 80: 8a1c 0x8a1c + 82: 0000 unimp + 84: 8a1c 0x8a1c + 86: 0000 unimp + 88: 8a1c 0x8a1c + 8a: 0000 unimp + 8c: 8a1c 0x8a1c + 8e: 0000 unimp + 90: 8a1c 0x8a1c + 92: 0000 unimp + 94: 8a1c 0x8a1c + 96: 0000 unimp + 98: 8a1c 0x8a1c + 9a: 0000 unimp + 9c: 8a1c 0x8a1c + 9e: 0000 unimp + a0: 8a1c 0x8a1c + a2: 0000 unimp + a4: 8a1c 0x8a1c + a6: 0000 unimp + a8: 8a1c 0x8a1c + aa: 0000 unimp + ac: 8a1c 0x8a1c + ae: 0000 unimp + b0: 8a1c 0x8a1c + b2: 0000 unimp + b4: 8a1c 0x8a1c + b6: 0000 unimp + b8: 8a1c 0x8a1c + ba: 0000 unimp + bc: 8a1c 0x8a1c + be: 0000 unimp + c0: 8a1c 0x8a1c + c2: 0000 unimp + c4: 8a1c 0x8a1c + c6: 0000 unimp + c8: 8a1c 0x8a1c + ca: 0000 unimp + cc: 8a1c 0x8a1c + ce: 0000 unimp + d0: 8a1c 0x8a1c + d2: 0000 unimp + d4: 8a1c 0x8a1c + d6: 0000 unimp + d8: 8a1c 0x8a1c + da: 0000 unimp + dc: 8a1c 0x8a1c + de: 0000 unimp + e0: 8a1c 0x8a1c + e2: 0000 unimp + e4: 8a1c 0x8a1c + e6: 0000 unimp + e8: 8a1c 0x8a1c + ea: 0000 unimp + ec: 8a1c 0x8a1c + ee: 0000 unimp + f0: 8a1c 0x8a1c + f2: 0000 unimp + f4: 8a1c 0x8a1c + f6: 0000 unimp + f8: 8a1c 0x8a1c + fa: 0000 unimp + fc: 8a1c 0x8a1c + fe: 0000 unimp + 100: 8a1c 0x8a1c + 102: 0000 unimp + 104: 0000 unimp + 106: 0000 unimp + 108: 8a1c 0x8a1c + 10a: 0000 unimp + 10c: 8a1c 0x8a1c + 10e: 0000 unimp + 110: 8a1c 0x8a1c + 112: 0000 unimp + 114: 8a1c 0x8a1c + 116: 0000 unimp + 118: 8a1c 0x8a1c + 11a: 0000 unimp + 11c: 8a1c 0x8a1c + 11e: 0000 unimp + 120: 8a1c 0x8a1c + 122: 0000 unimp + 124: 8a1c 0x8a1c + 126: 0000 unimp + 128: 8a1c 0x8a1c + 12a: 0000 unimp + 12c: 8a1c 0x8a1c + 12e: 0000 unimp + 130: 8a1c 0x8a1c + 132: 0000 unimp + 134: 8a1c 0x8a1c + 136: 0000 unimp + 138: 8a1c 0x8a1c + 13a: 0000 unimp + 13c: 8a1c 0x8a1c + 13e: 0000 unimp + 140: 8a1c 0x8a1c + 142: 0000 unimp + 144: 8a1c 0x8a1c + 146: 0000 unimp + 148: 8a1c 0x8a1c + 14a: 0000 unimp + 14c: 8a1c 0x8a1c + 14e: 0000 unimp + 150: 8a1c 0x8a1c + 152: 0000 unimp + 154: 8a1c 0x8a1c + 156: 0000 unimp + 158: 8a1c 0x8a1c + 15a: 0000 unimp + 15c: 8a1c 0x8a1c + 15e: 0000 unimp + 160: 8a1c 0x8a1c + 162: 0000 unimp + 164: 8a1c 0x8a1c + 166: 0000 unimp + 168: 8a1c 0x8a1c + 16a: 0000 unimp + 16c: 8a1c 0x8a1c + 16e: 0000 unimp + 170: 8a1c 0x8a1c + 172: 0000 unimp + 174: 8a1c 0x8a1c + 176: 0000 unimp + 178: 8a1c 0x8a1c + 17a: 0000 unimp + 17c: 8a1c 0x8a1c + 17e: 0000 unimp + 180: 8a1c 0x8a1c + 182: 0000 unimp + 184: 8a1c 0x8a1c + 186: 0000 unimp + 188: 8a1c 0x8a1c + 18a: 0000 unimp + 18c: 8a1c 0x8a1c + 18e: 0000 unimp + 190: 8a1c 0x8a1c + 192: 0000 unimp + 194: 8a1c 0x8a1c + 196: 0000 unimp + 198: 8a1c 0x8a1c + 19a: 0000 unimp + 19c: 8a1c 0x8a1c + 19e: 0000 unimp + 1a0: 8a1c 0x8a1c + ... + +Disassembly of section .text: + +000001c0 <__riscv_save_12>: + 1c0: 7139 addi sp,sp,-64 + 1c2: 4301 li t1,0 + 1c4: c66e sw s11,12(sp) + 1c6: a019 j 1cc <__riscv_save_10+0x4> + +000001c8 <__riscv_save_10>: + 1c8: 7139 addi sp,sp,-64 + 1ca: 5341 li t1,-16 + 1cc: c86a sw s10,16(sp) + 1ce: ca66 sw s9,20(sp) + 1d0: cc62 sw s8,24(sp) + 1d2: ce5e sw s7,28(sp) + 1d4: a019 j 1da <__riscv_save_4+0x4> + +000001d6 <__riscv_save_4>: + 1d6: 7139 addi sp,sp,-64 + 1d8: 5301 li t1,-32 + 1da: d05a sw s6,32(sp) + 1dc: d256 sw s5,36(sp) + 1de: d452 sw s4,40(sp) + 1e0: d64e sw s3,44(sp) + 1e2: d84a sw s2,48(sp) + 1e4: da26 sw s1,52(sp) + 1e6: dc22 sw s0,56(sp) + 1e8: de06 sw ra,60(sp) + 1ea: 40610133 sub sp,sp,t1 + 1ee: 8282 jr t0 + +000001f0 <__riscv_save_0>: + 1f0: 1141 addi sp,sp,-16 + 1f2: c04a sw s2,0(sp) + 1f4: c226 sw s1,4(sp) + 1f6: c422 sw s0,8(sp) + 1f8: c606 sw ra,12(sp) + 1fa: 8282 jr t0 + +000001fc <__riscv_restore_12>: + 1fc: 4db2 lw s11,12(sp) + 1fe: 0141 addi sp,sp,16 + +00000200 <__riscv_restore_10>: + 200: 4d02 lw s10,0(sp) + 202: 4c92 lw s9,4(sp) + 204: 4c22 lw s8,8(sp) + 206: 4bb2 lw s7,12(sp) + 208: 0141 addi sp,sp,16 + +0000020a <__riscv_restore_4>: + 20a: 4b02 lw s6,0(sp) + 20c: 4a92 lw s5,4(sp) + 20e: 4a22 lw s4,8(sp) + 210: 49b2 lw s3,12(sp) + 212: 0141 addi sp,sp,16 + +00000214 <__riscv_restore_0>: + 214: 4902 lw s2,0(sp) + 216: 4492 lw s1,4(sp) + 218: 4422 lw s0,8(sp) + 21a: 40b2 lw ra,12(sp) + 21c: 0141 addi sp,sp,16 + 21e: 8082 ret + +00000220 : + 220: 433d li t1,15 + 222: 872a mv a4,a0 + 224: 02c37363 bgeu t1,a2,24a + 228: 00f77793 andi a5,a4,15 + 22c: efbd bnez a5,2aa + 22e: e5ad bnez a1,298 + 230: ff067693 andi a3,a2,-16 + 234: 8a3d andi a2,a2,15 + 236: 96ba add a3,a3,a4 + 238: c30c sw a1,0(a4) + 23a: c34c sw a1,4(a4) + 23c: c70c sw a1,8(a4) + 23e: c74c sw a1,12(a4) + 240: 0741 addi a4,a4,16 + 242: fed76be3 bltu a4,a3,238 + 246: e211 bnez a2,24a + 248: 8082 ret + 24a: 40c306b3 sub a3,t1,a2 + 24e: 068a slli a3,a3,0x2 + 250: 00000297 auipc t0,0x0 + 254: 9696 add a3,a3,t0 + 256: 00a68067 jr 10(a3) + 25a: 00b70723 sb a1,14(a4) + 25e: 00b706a3 sb a1,13(a4) + 262: 00b70623 sb a1,12(a4) + 266: 00b705a3 sb a1,11(a4) + 26a: 00b70523 sb a1,10(a4) + 26e: 00b704a3 sb a1,9(a4) + 272: 00b70423 sb a1,8(a4) + 276: 00b703a3 sb a1,7(a4) + 27a: 00b70323 sb a1,6(a4) + 27e: 00b702a3 sb a1,5(a4) + 282: 00b70223 sb a1,4(a4) + 286: 00b701a3 sb a1,3(a4) + 28a: 00b70123 sb a1,2(a4) + 28e: 00b700a3 sb a1,1(a4) + 292: 00b70023 sb a1,0(a4) + 296: 8082 ret + 298: 0ff5f593 andi a1,a1,255 + 29c: 00859693 slli a3,a1,0x8 + 2a0: 8dd5 or a1,a1,a3 + 2a2: 01059693 slli a3,a1,0x10 + 2a6: 8dd5 or a1,a1,a3 + 2a8: b761 j 230 + 2aa: 00279693 slli a3,a5,0x2 + 2ae: 00000297 auipc t0,0x0 + 2b2: 9696 add a3,a3,t0 + 2b4: 8286 mv t0,ra + 2b6: fa8680e7 jalr -88(a3) + 2ba: 8096 mv ra,t0 + 2bc: 17c1 addi a5,a5,-16 + 2be: 8f1d sub a4,a4,a5 + 2c0: 963e add a2,a2,a5 + 2c2: f8c374e3 bgeu t1,a2,24a + 2c6: b7a5 j 22e + +000002c8 : + 2c8: 00b56733 or a4,a0,a1 + 2cc: 53fd li t2,-1 + 2ce: 8b0d andi a4,a4,3 + 2d0: e779 bnez a4,39e + 2d2: 7f7f87b7 lui a5,0x7f7f8 + 2d6: f7f78793 addi a5,a5,-129 # 7f7f7f7f <_eusrstack+0x5f7eff7f> + 2da: 4110 lw a2,0(a0) + 2dc: 4194 lw a3,0(a1) + 2de: 00f672b3 and t0,a2,a5 + 2e2: 00f66333 or t1,a2,a5 + 2e6: 92be add t0,t0,a5 + 2e8: 0062e2b3 or t0,t0,t1 + 2ec: 0c729563 bne t0,t2,3b6 + 2f0: 06d61863 bne a2,a3,360 + 2f4: 4150 lw a2,4(a0) + 2f6: 41d4 lw a3,4(a1) + 2f8: 00f672b3 and t0,a2,a5 + 2fc: 00f66333 or t1,a2,a5 + 300: 92be add t0,t0,a5 + 302: 0062e2b3 or t0,t0,t1 + 306: 0a729663 bne t0,t2,3b2 + 30a: 04d61b63 bne a2,a3,360 + 30e: 4510 lw a2,8(a0) + 310: 4594 lw a3,8(a1) + 312: 00f672b3 and t0,a2,a5 + 316: 00f66333 or t1,a2,a5 + 31a: 92be add t0,t0,a5 + 31c: 0062e2b3 or t0,t0,t1 + 320: 08729f63 bne t0,t2,3be + 324: 02d61e63 bne a2,a3,360 + 328: 4550 lw a2,12(a0) + 32a: 45d4 lw a3,12(a1) + 32c: 00f672b3 and t0,a2,a5 + 330: 00f66333 or t1,a2,a5 + 334: 92be add t0,t0,a5 + 336: 0062e2b3 or t0,t0,t1 + 33a: 08729863 bne t0,t2,3ca + 33e: 02d61163 bne a2,a3,360 + 342: 4910 lw a2,16(a0) + 344: 4994 lw a3,16(a1) + 346: 00f672b3 and t0,a2,a5 + 34a: 00f66333 or t1,a2,a5 + 34e: 92be add t0,t0,a5 + 350: 0062e2b3 or t0,t0,t1 + 354: 08729163 bne t0,t2,3d6 + 358: 0551 addi a0,a0,20 + 35a: 05d1 addi a1,a1,20 + 35c: f6d60fe3 beq a2,a3,2da + 360: 01061713 slli a4,a2,0x10 + 364: 01069793 slli a5,a3,0x10 + 368: 00f71c63 bne a4,a5,380 + 36c: 01065713 srli a4,a2,0x10 + 370: 0106d793 srli a5,a3,0x10 + 374: 40f70533 sub a0,a4,a5 + 378: 0ff57593 andi a1,a0,255 + 37c: e991 bnez a1,390 + 37e: 8082 ret + 380: 8341 srli a4,a4,0x10 + 382: 83c1 srli a5,a5,0x10 + 384: 40f70533 sub a0,a4,a5 + 388: 0ff57593 andi a1,a0,255 + 38c: e191 bnez a1,390 + 38e: 8082 ret + 390: 0ff77713 andi a4,a4,255 + 394: 0ff7f793 andi a5,a5,255 + 398: 40f70533 sub a0,a4,a5 + 39c: 8082 ret + 39e: 2110 lbu a2,0(a0) + 3a0: 2194 lbu a3,0(a1) + 3a2: 0505 addi a0,a0,1 + 3a4: 0585 addi a1,a1,1 + 3a6: 00d61363 bne a2,a3,3ac + 3aa: fa75 bnez a2,39e + 3ac: 40d60533 sub a0,a2,a3 + 3b0: 8082 ret + 3b2: 0511 addi a0,a0,4 + 3b4: 0591 addi a1,a1,4 + 3b6: fed614e3 bne a2,a3,39e + 3ba: 4501 li a0,0 + 3bc: 8082 ret + 3be: 0521 addi a0,a0,8 + 3c0: 05a1 addi a1,a1,8 + 3c2: fcd61ee3 bne a2,a3,39e + 3c6: 4501 li a0,0 + 3c8: 8082 ret + 3ca: 0531 addi a0,a0,12 + 3cc: 05b1 addi a1,a1,12 + 3ce: fcd618e3 bne a2,a3,39e + 3d2: 4501 li a0,0 + 3d4: 8082 ret + 3d6: 0541 addi a0,a0,16 + 3d8: 05c1 addi a1,a1,16 + 3da: fcd612e3 bne a2,a3,39e + 3de: 4501 li a0,0 + 3e0: 8082 ret + +000003e2 : + 3e2: ddfff2ef jal t0,1c0 <__riscv_save_12> + 3e6: 1141 addi sp,sp,-16 + 3e8: 8aae mv s5,a1 + 3ea: 8932 mv s2,a2 + 3ec: c901 beqz a0,3fc + 3ee: 85aa mv a1,a0 + 3f0: 0000b537 lui a0,0xb + 3f4: 45c50513 addi a0,a0,1116 # b45c <_exit+0x4> + 3f8: 7ce090ef jal ra,9bc6 + 3fc: 89d6 mv s3,s5 + 3fe: 8a4a mv s4,s2 + 400: 44c1 li s1,16 + 402: 0000bb37 lui s6,0xb + 406: 0000bbb7 lui s7,0xb + 40a: 0000bc37 lui s8,0xb + 40e: 0000ecb7 lui s9,0xe + 412: 0000bd37 lui s10,0xb + 416: ff048413 addi s0,s1,-16 + 41a: 01246463 bltu s0,s2,422 + 41e: 0141 addi sp,sp,16 + 420: bbf1 j 1fc <__riscv_restore_12> + 422: 85a2 mv a1,s0 + 424: 46cb0513 addi a0,s6,1132 # b46c <_exit+0x14> + 428: 79e090ef jal ra,9bc6 + 42c: 07247463 bgeu s0,s2,494 + 430: 008a87b3 add a5,s5,s0 + 434: 238c lbu a1,0(a5) + 436: 474c0513 addi a0,s8,1140 # b474 <_exit+0x1c> + 43a: 78c090ef jal ra,9bc6 + 43e: 0405 addi s0,s0,1 + 440: fe8496e3 bne s1,s0,42c + 444: 224c8513 addi a0,s9,548 # e224 <__sf_fake_stdout+0x24> + 448: 77e090ef jal ra,9bc6 + 44c: 4401 li s0,0 + 44e: 4dc1 li s11,16 + 450: 028a0863 beq s4,s0,480 + 454: 008987b3 add a5,s3,s0 + 458: 238c lbu a1,0(a5) + 45a: c62e sw a1,12(sp) + 45c: 47e090ef jal ra,98da <__locale_ctype_ptr> + 460: 45b2 lw a1,12(sp) + 462: 952e add a0,a0,a1 + 464: 00150783 lb a5,1(a0) + 468: 0977f793 andi a5,a5,151 + 46c: e399 bnez a5,472 + 46e: 02e00593 li a1,46 + 472: 480d0513 addi a0,s10,1152 # b480 <_exit+0x28> + 476: 0405 addi s0,s0,1 + 478: 74e090ef jal ra,9bc6 + 47c: fdb41ae3 bne s0,s11,450 + 480: 0000e537 lui a0,0xe + 484: 99850513 addi a0,a0,-1640 # d998 + 488: 73e090ef jal ra,9bc6 + 48c: 04c1 addi s1,s1,16 + 48e: 1a41 addi s4,s4,-16 + 490: 09c1 addi s3,s3,16 + 492: b751 j 416 + 494: 47cb8513 addi a0,s7,1148 # b47c <_exit+0x24> + 498: 72e090ef jal ra,9bc6 + 49c: b74d j 43e + +0000049e : + 49e: d39ff2ef jal t0,1d6 <__riscv_save_4> + 4a2: 8432 mv s0,a2 + 4a4: 8936 mv s2,a3 + 4a6: 84aa mv s1,a0 + 4a8: 00b50a33 add s4,a0,a1 + 4ac: 4781 li a5,0 + 4ae: ffe60a93 addi s5,a2,-2 + 4b2: 0000bb37 lui s6,0xb + 4b6: 01448663 beq s1,s4,4c2 + 4ba: 00278993 addi s3,a5,2 + 4be: 0129e863 bltu s3,s2,4ce + 4c2: 0327e163 bltu a5,s2,4e4 + 4c6: 944a add s0,s0,s2 + 4c8: fe040fa3 sb zero,-1(s0) + 4cc: a839 j 4ea + 4ce: 2094 lbu a3,0(s1) + 4d0: 484b0613 addi a2,s6,1156 # b484 <_exit+0x2c> + 4d4: 458d li a1,3 + 4d6: 013a8533 add a0,s5,s3 + 4da: 18d090ef jal ra,9e66 + 4de: 0485 addi s1,s1,1 + 4e0: 87ce mv a5,s3 + 4e2: bfd1 j 4b6 + 4e4: 943e add s0,s0,a5 + 4e6: 00040023 sb zero,0(s0) + 4ea: b305 j 20a <__riscv_restore_4> + +000004ec : + 4ec: d05ff2ef jal t0,1f0 <__riscv_save_0> + 4f0: 7165 addi sp,sp,-400 + 4f2: 8432 mv s0,a2 + 4f4: 84aa mv s1,a0 + 4f6: 892e mv s2,a1 + 4f8: 10400613 li a2,260 + 4fc: 4581 li a1,0 + 4fe: 0168 addi a0,sp,140 + 500: 3305 jal 220 + 502: 47b5 li a5,13 + 504: 1048 addi a0,sp,36 + 506: 08f10623 sb a5,140(sp) + 50a: 173060ef jal ra,6e7c + 50e: 864a mv a2,s2 + 510: 85a6 mv a1,s1 + 512: 1048 addi a0,sp,36 + 514: 1d1060ef jal ra,6ee4 + 518: 02000613 li a2,32 + 51c: 85a2 mv a1,s0 + 51e: 1048 addi a0,sp,36 + 520: 1c5060ef jal ra,6ee4 + 524: 004c addi a1,sp,4 + 526: 1048 addi a0,sp,36 + 528: 2e5060ef jal ra,700c + 52c: 4792 lw a5,4(sp) + 52e: 0168 addi a0,sp,140 + 530: cdbe sw a5,216(sp) + 532: 4791 li a5,4 + 534: cbbe sw a5,212(sp) + 536: 765010ef jal ra,249a + 53a: 6159 addi sp,sp,400 + 53c: b9e1 j 214 <__riscv_restore_0> + +0000053e : + 53e: cb3ff2ef jal t0,1f0 <__riscv_save_0> + 542: 7111 addi sp,sp,-256 + 544: 842a mv s0,a0 + 546: 04c50593 addi a1,a0,76 + 54a: 02400613 li a2,36 + 54e: 850a mv a0,sp + 550: 402090ef jal ra,9952 + 554: 4424 lw s1,72(s0) + 556: 0b040593 addi a1,s0,176 + 55a: 1048 addi a0,sp,36 + 55c: f9c48613 addi a2,s1,-100 + 560: 3f2090ef jal ra,9952 + 564: 200005b7 lui a1,0x20000 + 568: 860a mv a2,sp + 56a: fc048693 addi a3,s1,-64 + 56e: 39058593 addi a1,a1,912 # 20000390 + 572: 07040513 addi a0,s0,112 + 576: 21e030ef jal ra,3794 + 57a: 6111 addi sp,sp,256 + 57c: b961 j 214 <__riscv_restore_0> + +0000057e : + 57e: 0af54783 lbu a5,175(a0) + 582: 0e07f793 andi a5,a5,224 + 586: e3b1 bnez a5,5ca + 588: c69ff2ef jal t0,1f0 <__riscv_save_0> + 58c: 7111 addi sp,sp,-256 + 58e: 04c50493 addi s1,a0,76 + 592: 842a mv s0,a0 + 594: 85a6 mv a1,s1 + 596: 02400613 li a2,36 + 59a: 850a mv a0,sp + 59c: 3b6090ef jal ra,9952 + 5a0: 04842903 lw s2,72(s0) + 5a4: 0b040593 addi a1,s0,176 + 5a8: 1048 addi a0,sp,36 + 5aa: f9c90613 addi a2,s2,-100 + 5ae: 3a4090ef jal ra,9952 + 5b2: 860a mv a2,sp + 5b4: fc090693 addi a3,s2,-64 + 5b8: 85a6 mv a1,s1 + 5ba: 07040513 addi a0,s0,112 + 5be: 1ea030ef jal ra,37a8 + 5c2: 00153513 seqz a0,a0 + 5c6: 6111 addi sp,sp,256 + 5c8: b1b1 j 214 <__riscv_restore_0> + 5ca: 4501 li a0,0 + 5cc: 8082 ret + +000005ce : + 5ce: c09ff2ef jal t0,1d6 <__riscv_save_4> + 5d2: 00153513 seqz a0,a0 + 5d6: 20000437 lui s0,0x20000 + 5da: 716d addi sp,sp,-272 + 5dc: 0545 addi a0,a0,17 + 5de: 38c40413 addi s0,s0,908 # 2000038c + 5e2: 8648 sb a0,12(sp) + 5e4: 02000613 li a2,32 + 5e8: 02440593 addi a1,s0,36 + 5ec: 08a8 addi a0,sp,88 + 5ee: 364090ef jal ra,9952 + 5f2: 419080ef jal ra,920a + 5f6: 04444703 lbu a4,68(s0) + 5fa: dcaa sw a0,120(sp) + 5fc: 4685 li a3,1 + 5fe: 89aa mv s3,a0 + 600: 08100793 li a5,129 + 604: 02d70363 beq a4,a3,62a + 608: 4689 li a3,2 + 60a: 08200793 li a5,130 + 60e: 00d70e63 beq a4,a3,62a + 612: 468d li a3,3 + 614: 08300793 li a5,131 + 618: 00d70963 beq a4,a3,62a + 61c: 4691 li a3,4 + 61e: 08000793 li a5,128 + 622: 00d71463 bne a4,a3,62a + 626: 08400793 li a5,132 + 62a: 20000437 lui s0,0x20000 + 62e: 3d140513 addi a0,s0,977 # 200003d1 + 632: 0af10e23 sb a5,188(sp) + 636: 111090ef jal ra,9f46 + 63a: 84aa mv s1,a0 + 63c: 862a mv a2,a0 + 63e: 3d140593 addi a1,s0,977 + 642: 0bd10513 addi a0,sp,189 + 646: 30c090ef jal ra,9952 + 64a: 06548913 addi s2,s1,101 + 64e: 0068 addi a0,sp,12 + 650: caca sw s2,84(sp) + 652: 35f5 jal 53e + 654: 0000b537 lui a0,0xb + 658: 08ac addi a1,sp,88 + 65a: 02000613 li a2,32 + 65e: 5d450513 addi a0,a0,1492 # b5d4 <_exit+0x17c> + 662: 3341 jal 3e2 + 664: 0000b537 lui a0,0xb + 668: 18ec addi a1,sp,124 + 66a: 04000613 li a2,64 + 66e: 5e050513 addi a0,a0,1504 # b5e0 <_exit+0x188> + 672: 3b85 jal 3e2 + 674: 0000b537 lui a0,0xb + 678: 00148613 addi a2,s1,1 + 67c: 196c addi a1,sp,188 + 67e: 5ec50513 addi a0,a0,1516 # b5ec <_exit+0x194> + 682: 3385 jal 3e2 + 684: 0000b537 lui a0,0xb + 688: 85ce mv a1,s3 + 68a: 5f450513 addi a0,a0,1524 # b5f4 <_exit+0x19c> + 68e: 538090ef jal ra,9bc6 + 692: 0000b537 lui a0,0xb + 696: 3d140593 addi a1,s0,977 + 69a: 60850513 addi a0,a0,1544 # b608 <_exit+0x1b0> + 69e: 528090ef jal ra,9bc6 + 6a2: 0068 addi a0,sp,12 + 6a4: caca sw s2,84(sp) + 6a6: 000108a3 sb zero,17(sp) + 6aa: 5f1010ef jal ra,249a + 6ae: 6151 addi sp,sp,272 + 6b0: bea9 j 20a <__riscv_restore_4> + +000006b2 : + 6b2: b3fff2ef jal t0,1f0 <__riscv_save_0> + 6b6: 84aa mv s1,a0 + 6b8: 2108 lbu a0,0(a0) + 6ba: 7119 addi sp,sp,-128 + 6bc: 3d7060ef jal ra,7292 + 6c0: 842a mv s0,a0 + 6c2: e901 bnez a0,6d2 + 6c4: 38d060ef jal ra,7250 + 6c8: 0b800613 li a2,184 + 6cc: 4581 li a1,0 + 6ce: 842a mv s0,a0 + 6d0: 3e81 jal 220 + 6d2: 07448593 addi a1,s1,116 + 6d6: 02000613 li a2,32 + 6da: 8522 mv a0,s0 + 6dc: 276090ef jal ra,9952 + 6e0: 02000613 li a2,32 + 6e4: 85a6 mv a1,s1 + 6e6: 02040513 addi a0,s0,32 + 6ea: 268090ef jal ra,9952 + 6ee: 85a6 mv a1,s1 + 6f0: 850a mv a0,sp + 6f2: 2cb050ef jal ra,61bc + 6f6: 200005b7 lui a1,0x20000 + 6fa: 02000613 li a2,32 + 6fe: 0088 addi a0,sp,64 + 700: 39058593 addi a1,a1,912 # 20000390 + 704: 745020ef jal ra,3648 + 708: 008c addi a1,sp,64 + 70a: 1008 addi a0,sp,32 + 70c: 708050ef jal ra,5e14 + 710: 860a mv a2,sp + 712: 100c addi a1,sp,32 + 714: 04040513 addi a0,s0,64 + 718: 728050ef jal ra,5e40 + 71c: 54bc lw a5,104(s1) + 71e: d03c sw a5,96(s0) + 720: 54fc lw a5,108(s1) + 722: d07c sw a5,100(s0) + 724: 0654c783 lbu a5,101(s1) + 728: 8bbd andi a5,a5,15 + 72a: 0af40523 sb a5,170(s0) + 72e: 2dd080ef jal ra,920a + 732: 509c lw a5,32(s1) + 734: 0aa42823 sw a0,176(s0) + 738: 0af42623 sw a5,172(s0) + 73c: 6109 addi sp,sp,128 + 73e: bcd9 j 214 <__riscv_restore_0> + +00000740 : + 740: ab1ff2ef jal t0,1f0 <__riscv_save_0> + 744: 06554783 lbu a5,101(a0) + 748: 842a mv s0,a0 + 74a: 07450593 addi a1,a0,116 + 74e: 01879713 slli a4,a5,0x18 + 752: 8761 srai a4,a4,0x18 + 754: 00074663 bltz a4,760 + 758: 0000b5b7 lui a1,0xb + 75c: 55858593 addi a1,a1,1368 # b558 <_exit+0x100> + 760: 8b9d andi a5,a5,7 + 762: 4691 li a3,4 + 764: 5010 lw a2,32(s0) + 766: 04d78d63 beq a5,a3,7c0 + 76a: 468d li a3,3 + 76c: 04d78f63 beq a5,a3,7ca + 770: 4689 li a3,2 + 772: 06d78163 beq a5,a3,7d4 + 776: 0000b6b7 lui a3,0xb + 77a: 58868693 addi a3,a3,1416 # b588 <_exit+0x130> + 77e: 06074063 bltz a4,7de + 782: 0000b737 lui a4,0xb + 786: 59c70713 addi a4,a4,1436 # b59c <_exit+0x144> + 78a: 06c42803 lw a6,108(s0) + 78e: 543c lw a5,104(s0) + 790: 0000b537 lui a0,0xb + 794: 5a450513 addi a0,a0,1444 # b5a4 <_exit+0x14c> + 798: 42e090ef jal ra,9bc6 + 79c: 0000b537 lui a0,0xb + 7a0: 85a2 mv a1,s0 + 7a2: 02000613 li a2,32 + 7a6: 5d450513 addi a0,a0,1492 # b5d4 <_exit+0x17c> + 7aa: 3925 jal 3e2 + 7ac: 0000b537 lui a0,0xb + 7b0: 04000613 li a2,64 + 7b4: 02440593 addi a1,s0,36 + 7b8: 5e050513 addi a0,a0,1504 # b5e0 <_exit+0x188> + 7bc: 311d jal 3e2 + 7be: bc99 j 214 <__riscv_restore_0> + 7c0: 0000b6b7 lui a3,0xb + 7c4: 57468693 addi a3,a3,1396 # b574 <_exit+0x11c> + 7c8: bf5d j 77e + 7ca: 0000b6b7 lui a3,0xb + 7ce: 57c68693 addi a3,a3,1404 # b57c <_exit+0x124> + 7d2: b775 j 77e + 7d4: 0000b6b7 lui a3,0xb + 7d8: 56868693 addi a3,a3,1384 # b568 <_exit+0x110> + 7dc: b74d j 77e + 7de: 0000b737 lui a4,0xb + 7e2: 59470713 addi a4,a4,1428 # b594 <_exit+0x13c> + 7e6: b755 j 78a + +000007e8 : + 7e8: 9efff2ef jal t0,1d6 <__riscv_save_4> + 7ec: 7171 addi sp,sp,-176 + 7ee: 842a mv s0,a0 + 7f0: 09400613 li a2,148 + 7f4: 4581 li a1,0 + 7f6: 0868 addi a0,sp,28 + 7f8: 3425 jal 220 + 7fa: 4434 lw a3,72(s0) + 7fc: 06400793 li a5,100 + 800: 0000bab7 lui s5,0xb + 804: 02d7e063 bltu a5,a3,824 <__stack_size+0x24> + 808: 0000b5b7 lui a1,0xb + 80c: 0000b537 lui a0,0xb + 810: 48ca8613 addi a2,s5,1164 # b48c <_exit+0x34> + 814: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 818: 49850513 addi a0,a0,1176 # b498 <_exit+0x40> + 81c: 3aa090ef jal ra,9bc6 + 820: 614d addi sp,sp,176 + 822: b2e5 j 20a <__riscv_restore_4> + 824: 8522 mv a0,s0 + 826: 3ba1 jal 57e + 828: 48ca8613 addi a2,s5,1164 + 82c: ed01 bnez a0,844 <__stack_size+0x44> + 82e: 0000b5b7 lui a1,0xb + 832: 0000b537 lui a0,0xb + 836: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 83a: 4cc50513 addi a0,a0,1228 # b4cc <_exit+0x74> + 83e: 388090ef jal ra,9bc6 + 842: bff9 j 820 <__stack_size+0x20> + 844: 0000b5b7 lui a1,0xb + 848: 0000b537 lui a0,0xb + 84c: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 850: 4f050513 addi a0,a0,1264 # b4f0 <_exit+0x98> + 854: 372090ef jal ra,9bc6 + 858: 04c40a13 addi s4,s0,76 + 85c: 4785 li a5,1 + 85e: 02000613 li a2,32 + 862: 85d2 mv a1,s4 + 864: 0868 addi a0,sp,28 + 866: 08f10023 sb a5,128(sp) + 86a: 0e8090ef jal ra,9952 + 86e: 4611 li a2,4 + 870: 06c40593 addi a1,s0,108 + 874: 1868 addi a0,sp,60 + 876: 0dc090ef jal ra,9952 + 87a: 04000613 li a2,64 + 87e: 07040593 addi a1,s0,112 + 882: 0088 addi a0,sp,64 + 884: 0ce090ef jal ra,9952 + 888: 0b044783 lbu a5,176(s0) + 88c: 06500993 li s3,101 + 890: 08f100a3 sb a5,129(sp) + 894: 0107f613 andi a2,a5,16 + 898: c219 beqz a2,89e <__stack_size+0x9e> + 89a: 06d00993 li s3,109 + 89e: 0207fb13 andi s6,a5,32 + 8a2: 84ce mv s1,s3 + 8a4: 000b0463 beqz s6,8ac <__stack_size+0xac> + 8a8: 00298493 addi s1,s3,2 + 8ac: 0407f913 andi s2,a5,64 + 8b0: 8726 mv a4,s1 + 8b2: 00090663 beqz s2,8be <__stack_size+0xbe> + 8b6: 00248713 addi a4,s1,2 + 8ba: 0ff77713 andi a4,a4,255 + 8be: 4434 lw a3,72(s0) + 8c0: 00e6ff63 bgeu a3,a4,8de <__stack_size+0xde> + 8c4: 0000b5b7 lui a1,0xb + 8c8: 0000b537 lui a0,0xb + 8cc: 48ca8613 addi a2,s5,1164 + 8d0: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 8d4: 51850513 addi a0,a0,1304 # b518 <_exit+0xc0> + 8d8: 2ee090ef jal ra,9bc6 + 8dc: b791 j 820 <__stack_size+0x20> + 8de: c20d beqz a2,900 <__stack_size+0x100> + 8e0: 4611 li a2,4 + 8e2: 0b140593 addi a1,s0,177 + 8e6: 0148 addi a0,sp,132 + 8e8: c63a sw a4,12(sp) + 8ea: c436 sw a3,8(sp) + 8ec: 066090ef jal ra,9952 + 8f0: 4611 li a2,4 + 8f2: 0b540593 addi a1,s0,181 + 8f6: 0128 addi a0,sp,136 + 8f8: 05a090ef jal ra,9952 + 8fc: 4732 lw a4,12(sp) + 8fe: 46a2 lw a3,8(sp) + 900: 000b0b63 beqz s6,916 <__stack_size+0x116> + 904: 99d2 add s3,s3,s4 + 906: 0009c783 lbu a5,0(s3) + 90a: 08f10623 sb a5,140(sp) + 90e: 0019c783 lbu a5,1(s3) + 912: 08f106a3 sb a5,141(sp) + 916: 00090963 beqz s2,928 <__stack_size+0x128> + 91a: 94d2 add s1,s1,s4 + 91c: 209c lbu a5,0(s1) + 91e: 08f10723 sb a5,142(sp) + 922: 309c lbu a5,1(s1) + 924: 08f107a3 sb a5,143(sp) + 928: 8e99 sub a3,a3,a4 + 92a: 0ff6f693 andi a3,a3,255 + 92e: 47fd li a5,31 + 930: 0ff6f413 andi s0,a3,255 + 934: 00d7f363 bgeu a5,a3,93a <__stack_size+0x13a> + 938: 447d li s0,31 + 93a: 8622 mv a2,s0 + 93c: 00ea05b3 add a1,s4,a4 + 940: 0908 addi a0,sp,144 + 942: 010090ef jal ra,9952 + 946: 191c addi a5,sp,176 + 948: 943e add s0,s0,a5 + 94a: 0868 addi a0,sp,28 + 94c: fe040023 sb zero,-32(s0) + 950: 3bc5 jal 740 + 952: 0868 addi a0,sp,28 + 954: 3bb9 jal 6b2 + 956: b5e9 j 820 <__stack_size+0x20> + +00000958 : + 958: 4781 li a5,0 + 95a: 00b78763 beq a5,a1,968 + 95e: 00f50733 add a4,a0,a5 + 962: 00070703 lb a4,0(a4) + 966: e319 bnez a4,96c + 968: 853e mv a0,a5 + 96a: 8082 ret + 96c: 0785 addi a5,a5,1 + 96e: b7f5 j 95a + +00000970 : + 970: 16050563 beqz a0,ada + 974: 863ff2ef jal t0,1d6 <__riscv_save_4> + 978: 842a mv s0,a0 + 97a: 89ae mv s3,a1 + 97c: 85aa mv a1,a0 + 97e: 0000b537 lui a0,0xb + 982: 75450513 addi a0,a0,1876 # b754 <_exit+0x2fc> + 986: 240090ef jal ra,9bc6 + 98a: 200c lbu a1,0(s0) + 98c: 0000b537 lui a0,0xb + 990: 77450513 addi a0,a0,1908 # b774 <_exit+0x31c> + 994: 232090ef jal ra,9bc6 + 998: 0000b537 lui a0,0xb + 99c: 79050513 addi a0,a0,1936 # b790 <_exit+0x338> + 9a0: 226090ef jal ra,9bc6 + 9a4: 4485 li s1,1 + 9a6: 0000ba37 lui s4,0xb + 9aa: 02100913 li s2,33 + 9ae: 009407b3 add a5,s0,s1 + 9b2: 238c lbu a1,0(a5) + 9b4: 7a4a0513 addi a0,s4,1956 # b7a4 <_exit+0x34c> + 9b8: 0485 addi s1,s1,1 + 9ba: 20c090ef jal ra,9bc6 + 9be: ff2498e3 bne s1,s2,9ae + 9c2: 0000e937 lui s2,0xe + 9c6: 99890513 addi a0,s2,-1640 # d998 + 9ca: 1fc090ef jal ra,9bc6 + 9ce: 302e lhu a1,34(s0) + 9d0: 0000b537 lui a0,0xb + 9d4: 7ac50513 addi a0,a0,1964 # b7ac <_exit+0x354> + 9d8: 1ee090ef jal ra,9bc6 + 9dc: 02444583 lbu a1,36(s0) + 9e0: 0000b537 lui a0,0xb + 9e4: 7c450513 addi a0,a0,1988 # b7c4 <_exit+0x36c> + 9e8: 1de090ef jal ra,9bc6 + 9ec: 02444703 lbu a4,36(s0) + 9f0: 478d li a5,3 + 9f2: 4481 li s1,0 + 9f4: 02e7f763 bgeu a5,a4,a22 + 9f8: 02644783 lbu a5,38(s0) + 9fc: 02544703 lbu a4,37(s0) + a00: 02844583 lbu a1,40(s0) + a04: 07a2 slli a5,a5,0x8 + a06: 8f5d or a4,a4,a5 + a08: 02744783 lbu a5,39(s0) + a0c: 05e2 slli a1,a1,0x18 + a0e: 0000b537 lui a0,0xb + a12: 07c2 slli a5,a5,0x10 + a14: 8fd9 or a5,a5,a4 + a16: 8ddd or a1,a1,a5 + a18: 7e850513 addi a0,a0,2024 # b7e8 <_exit+0x390> + a1c: 1aa090ef jal ra,9bc6 + a20: 4491 li s1,4 + a22: 04098c63 beqz s3,a7a + a26: 02444783 lbu a5,36(s0) + a2a: 00348693 addi a3,s1,3 + a2e: 04f6d663 bge a3,a5,a7a + a32: 00148713 addi a4,s1,1 + a36: 0ff77713 andi a4,a4,255 + a3a: 009407b3 add a5,s0,s1 + a3e: 9722 add a4,a4,s0 + a40: 0257c603 lbu a2,37(a5) + a44: 02574783 lbu a5,37(a4) + a48: 00248713 addi a4,s1,2 + a4c: 0ff77713 andi a4,a4,255 + a50: 9722 add a4,a4,s0 + a52: 02574583 lbu a1,37(a4) + a56: 07a2 slli a5,a5,0x8 + a58: 96a2 add a3,a3,s0 + a5a: 05c2 slli a1,a1,0x10 + a5c: 8fcd or a5,a5,a1 + a5e: 0256c583 lbu a1,37(a3) + a62: 8fd1 or a5,a5,a2 + a64: 0000b537 lui a0,0xb + a68: 05e2 slli a1,a1,0x18 + a6a: 0491 addi s1,s1,4 + a6c: 8ddd or a1,a1,a5 + a6e: 7fc50513 addi a0,a0,2044 # b7fc <_exit+0x3a4> + a72: 0ff4f493 andi s1,s1,255 + a76: 150090ef jal ra,9bc6 + a7a: 02444783 lbu a5,36(s0) + a7e: 04f4f263 bgeu s1,a5,ac2 + a82: 8f85 sub a5,a5,s1 + a84: 0ff7f793 andi a5,a5,255 + a88: 4741 li a4,16 + a8a: 0ff7f593 andi a1,a5,255 + a8e: 00f77363 bgeu a4,a5,a94 + a92: 45c1 li a1,16 + a94: 02548513 addi a0,s1,37 + a98: 9522 add a0,a0,s0 + a9a: 3d7d jal 958 + a9c: 0ff57993 andi s3,a0,255 + aa0: 0000c537 lui a0,0xc + aa4: 81450513 addi a0,a0,-2028 # b814 <_exit+0x3bc> + aa8: 9426 add s0,s0,s1 + aaa: 11c090ef jal ra,9bc6 + aae: 4481 li s1,0 + ab0: 0000ba37 lui s4,0xb + ab4: 0405 addi s0,s0,1 + ab6: 00999863 bne s3,s1,ac6 + aba: 99890513 addi a0,s2,-1640 + abe: 108090ef jal ra,9bc6 + ac2: f48ff06f j 20a <__riscv_restore_4> + ac6: 02444583 lbu a1,36(s0) + aca: 480a0513 addi a0,s4,1152 # b480 <_exit+0x28> + ace: 0485 addi s1,s1,1 + ad0: 0f6090ef jal ra,9bc6 + ad4: 0ff4f493 andi s1,s1,255 + ad8: bff1 j ab4 + ada: 8082 ret + +00000adc : + adc: efaff2ef jal t0,1d6 <__riscv_save_4> + ae0: 04c54783 lbu a5,76(a0) + ae4: 7165 addi sp,sp,-400 + ae6: 84aa mv s1,a0 + ae8: 04d50593 addi a1,a0,77 + aec: 02000613 li a2,32 + af0: 01910513 addi a0,sp,25 + af4: 00f10c23 sb a5,24(sp) + af8: 65b080ef jal ra,9952 + afc: 06e4c783 lbu a5,110(s1) + b00: 06d4c703 lbu a4,109(s1) + b04: 01914503 lbu a0,25(sp) + b08: 07a2 slli a5,a5,0x8 + b0a: 8fd9 or a5,a5,a4 + b0c: 02f11d23 sh a5,58(sp) + b10: 782060ef jal ra,7292 + b14: 0000b937 lui s2,0xb + b18: 0000ba37 lui s4,0xb + b1c: 1e051d63 bnez a0,d16 + b20: 730060ef jal ra,7250 + b24: 0b800613 li a2,184 + b28: 4581 li a1,0 + b2a: 842a mv s0,a0 + b2c: ef4ff0ef jal ra,220 + b30: 0000b5b7 lui a1,0xb + b34: 61858593 addi a1,a1,1560 # b618 <_exit+0x1c0> + b38: 8522 mv a0,s0 + b3a: 3fc090ef jal ra,9f36 + b3e: 02000613 li a2,32 + b42: 01910593 addi a1,sp,25 + b46: 06040423 sb zero,104(s0) + b4a: 02040513 addi a0,s0,32 + b4e: 605080ef jal ra,9952 + b52: 01910593 addi a1,sp,25 + b56: 09c8 addi a0,sp,212 + b58: 664050ef jal ra,61bc + b5c: 200005b7 lui a1,0x20000 + b60: 09d0 addi a2,sp,212 + b62: 39058593 addi a1,a1,912 # 20000390 + b66: 04040513 addi a0,s0,64 + b6a: 2d6050ef jal ra,5e40 + b6e: 06042023 sw zero,96(s0) + b72: 06042223 sw zero,100(s0) + b76: 0a040523 sb zero,170(s0) + b7a: 690080ef jal ra,920a + b7e: 0aa42823 sw a0,176(s0) + b82: 0000b537 lui a0,0xb + b86: 86a2 mv a3,s0 + b88: 62890613 addi a2,s2,1576 # b628 <_exit+0x1d0> + b8c: 4eca0593 addi a1,s4,1260 # b4ec <_exit+0x94> + b90: 63450513 addi a0,a0,1588 # b634 <_exit+0x1dc> + b94: 032090ef jal ra,9bc6 + b98: 44b4 lw a3,72(s1) + b9a: 03d10713 addi a4,sp,61 + b9e: 06d48613 addi a2,s1,109 + ba2: fdf68693 addi a3,a3,-33 + ba6: 02000593 li a1,32 + baa: 04040513 addi a0,s0,64 + bae: 4a9010ef jal ra,2856 + bb2: 44b0 lw a2,72(s1) + bb4: 0000b537 lui a0,0xb + bb8: 03d10593 addi a1,sp,61 + bbc: fdd60613 addi a2,a2,-35 + bc0: 0ff67613 andi a2,a2,255 + bc4: 69850513 addi a0,a0,1688 # b698 <_exit+0x240> + bc8: 02c10e23 sb a2,60(sp) + bcc: 817ff0ef jal ra,3e2 + bd0: 03e14703 lbu a4,62(sp) + bd4: 03d14783 lbu a5,61(sp) + bd8: 4991 li s3,4 + bda: 0722 slli a4,a4,0x8 + bdc: 8f5d or a4,a4,a5 + bde: 03f14783 lbu a5,63(sp) + be2: 07c2 slli a5,a5,0x10 + be4: 8f5d or a4,a4,a5 + be6: 04014783 lbu a5,64(sp) + bea: 07e2 slli a5,a5,0x18 + bec: 8fd9 or a5,a5,a4 + bee: 0af42623 sw a5,172(s0) + bf2: 200007b7 lui a5,0x20000 + bf6: 3d07c583 lbu a1,976(a5) # 200003d0 + bfa: 478d li a5,3 + bfc: 02f59363 bne a1,a5,c22 + c00: 04214703 lbu a4,66(sp) + c04: 04114783 lbu a5,65(sp) + c08: 49a1 li s3,8 + c0a: 0722 slli a4,a4,0x8 + c0c: 8f5d or a4,a4,a5 + c0e: 04314783 lbu a5,67(sp) + c12: 07c2 slli a5,a5,0x10 + c14: 8f5d or a4,a4,a5 + c16: 04414783 lbu a5,68(sp) + c1a: 07e2 slli a5,a5,0x18 + c1c: 8fd9 or a5,a5,a4 + c1e: 0af42a23 sw a5,180(s0) + c22: 15f5 addi a1,a1,-3 + c24: 0015b593 seqz a1,a1 + c28: 0828 addi a0,sp,24 + c2a: 3399 jal 970 + c2c: 03c14783 lbu a5,60(sp) + c30: 0838 addi a4,sp,24 + c32: 413787b3 sub a5,a5,s3 + c36: 02598993 addi s3,s3,37 + c3a: 0ff7f793 andi a5,a5,255 + c3e: 99ba add s3,s3,a4 + c40: 4741 li a4,16 + c42: 0ff7f593 andi a1,a5,255 + c46: 00f77363 bgeu a4,a5,c4c + c4a: 45c1 li a1,16 + c4c: 854e mv a0,s3 + c4e: 3329 jal 958 + c50: 0ff57a93 andi s5,a0,255 + c54: 0000b537 lui a0,0xb + c58: 86d6 mv a3,s5 + c5a: 62890613 addi a2,s2,1576 + c5e: 4eca0593 addi a1,s4,1260 + c62: 6a850513 addi a0,a0,1704 # b6a8 <_exit+0x250> + c66: 761080ef jal ra,9bc6 + c6a: 8656 mv a2,s5 + c6c: 85ce mv a1,s3 + c6e: 0028 addi a0,sp,8 + c70: 4e3080ef jal ra,9952 + c74: 8656 mv a2,s5 + c76: 76018593 addi a1,gp,1888 # 20001150 <__global_pointer$+0x760> + c7a: 0028 addi a0,sp,8 + c7c: 4b3080ef jal ra,992e + c80: e94d bnez a0,d32 + c82: 4785 li a5,1 + c84: 0000b537 lui a0,0xb + c88: 86a2 mv a3,s0 + c8a: 62890613 addi a2,s2,1576 + c8e: 4eca0593 addi a1,s4,1260 + c92: 0af405a3 sb a5,171(s0) + c96: 6c850513 addi a0,a0,1736 # b6c8 <_exit+0x270> + c9a: 72d080ef jal ra,9bc6 + c9e: 0000b537 lui a0,0xb + ca2: 86a2 mv a3,s0 + ca4: 62890613 addi a2,s2,1576 + ca8: 4eca0593 addi a1,s4,1260 + cac: 6fc50513 addi a0,a0,1788 # b6fc <_exit+0x2a4> + cb0: 717080ef jal ra,9bc6 + cb4: 556080ef jal ra,920a + cb8: cbaa sw a0,212(sp) + cba: 05e090ef jal ra,9d18 + cbe: 0c010ca3 sb zero,217(sp) + cc2: 0c010d23 sb zero,218(sp) + cc6: 0ab44783 lbu a5,171(s0) + cca: 0cf10da3 sb a5,219(sp) + cce: c391 beqz a5,cd2 + cd0: 478d li a5,3 + cd2: 0cf10e23 sb a5,220(sp) + cd6: 00855793 srli a5,a0,0x8 + cda: 0cf10f23 sb a5,222(sp) + cde: 01055793 srli a5,a0,0x10 + ce2: 0cf10fa3 sb a5,223(sp) + ce6: 4785 li a5,1 + ce8: 0ef100a3 sb a5,225(sp) + cec: 47a5 li a5,9 + cee: 0cf10c23 sb a5,216(sp) + cf2: 209c lbu a5,0(s1) + cf4: 0ca10ea3 sb a0,221(sp) + cf8: 8161 srli a0,a0,0x18 + cfa: 0ea10023 sb a0,224(sp) + cfe: 8b89 andi a5,a5,2 + d00: e789 bnez a5,d0a + d02: 00548593 addi a1,s1,5 + d06: 8522 mv a0,s0 + d08: 2365 jal 12b0 + d0a: 09cc addi a1,sp,212 + d0c: 8522 mv a0,s0 + d0e: 2915 jal 1142 + d10: 6159 addi sp,sp,400 + d12: cf8ff06f j 20a <__riscv_restore_4> + d16: 842a mv s0,a0 + d18: 0000b5b7 lui a1,0xb + d1c: 0000b537 lui a0,0xb + d20: 01914683 lbu a3,25(sp) + d24: 62890613 addi a2,s2,1576 + d28: 66058593 addi a1,a1,1632 # b660 <_exit+0x208> + d2c: 66450513 addi a0,a0,1636 # b664 <_exit+0x20c> + d30: b595 j b94 + d32: 0000b5b7 lui a1,0xb + d36: 0000b537 lui a0,0xb + d3a: 86a2 mv a3,s0 + d3c: 62890613 addi a2,s2,1576 + d40: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + d44: 72850513 addi a0,a0,1832 # b728 <_exit+0x2d0> + d48: b7a5 j cb0 + +00000d4a : + d4a: ca6ff2ef jal t0,1f0 <__riscv_save_0> + d4e: 716d addi sp,sp,-272 + d50: 02e00793 li a5,46 + d54: 865c sb a5,12(sp) + d56: 211c lbu a5,0(a0) + d58: 215a lhu a4,4(a0) + d5a: 02854403 lbu s0,40(a0) + d5e: 8bbd andi a5,a5,15 + d60: f907e793 ori a5,a5,-112 + d64: 04f10c23 sb a5,88(sp) + d68: 311c lbu a5,1(a0) + d6a: 04e11d23 sh a4,90(sp) + d6e: 000108a3 sb zero,17(sp) + d72: 04f10ca3 sb a5,89(sp) + d76: 415c lw a5,4(a0) + d78: 0107d713 srli a4,a5,0x10 + d7c: 83e1 srli a5,a5,0x18 + d7e: 04f10ea3 sb a5,93(sp) + d82: 04e10e23 sb a4,92(sp) + d86: 4799 li a5,6 + d88: c819 beqz s0,d9e + d8a: 8622 mv a2,s0 + d8c: 00850593 addi a1,a0,8 + d90: 05e10513 addi a0,sp,94 + d94: 3bf080ef jal ra,9952 + d98: 0419 addi s0,s0,6 + d9a: 0ff47793 andi a5,s0,255 + d9e: 0068 addi a0,sp,12 + da0: cabe sw a5,84(sp) + da2: 6f8010ef jal ra,249a + da6: 6151 addi sp,sp,272 + da8: c6cff06f j 214 <__riscv_restore_0> + +00000dac : + dac: c44ff2ef jal t0,1f0 <__riscv_save_0> + db0: 842a mv s0,a0 + db2: 0000c537 lui a0,0xc + db6: 86450513 addi a0,a0,-1948 # b864 <_exit+0x40c> + dba: 60d080ef jal ra,9bc6 + dbe: 200c lbu a1,0(s0) + dc0: 0000c537 lui a0,0xc + dc4: 88050513 addi a0,a0,-1920 # b880 <_exit+0x428> + dc8: 5ff080ef jal ra,9bc6 + dcc: 300c lbu a1,1(s0) + dce: 0000c537 lui a0,0xc + dd2: 89450513 addi a0,a0,-1900 # b894 <_exit+0x43c> + dd6: 5f1080ef jal ra,9bc6 + dda: 404c lw a1,4(s0) + ddc: 0000c537 lui a0,0xc + de0: 8ac50513 addi a0,a0,-1876 # b8ac <_exit+0x454> + de4: 5e3080ef jal ra,9bc6 + de8: 440c lw a1,8(s0) + dea: 0000c537 lui a0,0xc + dee: 8c450513 addi a0,a0,-1852 # b8c4 <_exit+0x46c> + df2: 5d5080ef jal ra,9bc6 + df6: c1eff06f j 214 <__riscv_restore_0> + +00000dfa : + dfa: bf6ff2ef jal t0,1f0 <__riscv_save_0> + dfe: 842a mv s0,a0 + e00: 0000c537 lui a0,0xc + e04: 8dc50513 addi a0,a0,-1828 # b8dc <_exit+0x484> + e08: 5bf080ef jal ra,9bc6 + e0c: 200c lbu a1,0(s0) + e0e: 0000c537 lui a0,0xc + e12: 8f850513 addi a0,a0,-1800 # b8f8 <_exit+0x4a0> + e16: 5b1080ef jal ra,9bc6 + e1a: 00140583 lb a1,1(s0) + e1e: 0000c537 lui a0,0xc + e22: 90850513 addi a0,a0,-1784 # b908 <_exit+0x4b0> + e26: 5a1080ef jal ra,9bc6 + e2a: 404c lw a1,4(s0) + e2c: 0000c537 lui a0,0xc + e30: 91850513 addi a0,a0,-1768 # b918 <_exit+0x4c0> + e34: 593080ef jal ra,9bc6 + e38: 02844603 lbu a2,40(s0) + e3c: 0000c537 lui a0,0xc + e40: 00840593 addi a1,s0,8 + e44: 92c50513 addi a0,a0,-1748 # b92c <_exit+0x4d4> + e48: d9aff0ef jal ra,3e2 + e4c: 0000e537 lui a0,0xe + e50: 99850513 addi a0,a0,-1640 # d998 + e54: 573080ef jal ra,9bc6 + e58: bbcff06f j 214 <__riscv_restore_0> + +00000e5c : + e5c: b94ff2ef jal t0,1f0 <__riscv_save_0> + e60: 04c54783 lbu a5,76(a0) + e64: 08000693 li a3,128 + e68: 715d addi sp,sp,-80 + e6a: 0f07f713 andi a4,a5,240 + e6e: 0ad71263 bne a4,a3,f12 + e72: 8b85 andi a5,a5,1 + e74: 00f10c23 sb a5,24(sp) + e78: 04d54783 lbu a5,77(a0) + e7c: 04e55703 lhu a4,78(a0) + e80: 00f10ca3 sb a5,25(sp) + e84: 05055783 lhu a5,80(a0) + e88: 07c2 slli a5,a5,0x10 + e8a: 8fd9 or a5,a5,a4 + e8c: 4538 lw a4,72(a0) + e8e: ce3e sw a5,28(sp) + e90: 4799 li a5,6 + e92: 00e7f963 bgeu a5,a4,ea4 + e96: 05455783 lhu a5,84(a0) + e9a: 05255703 lhu a4,82(a0) + e9e: 07c2 slli a5,a5,0x10 + ea0: 8fd9 or a5,a5,a4 + ea2: d03e sw a5,32(sp) + ea4: 0828 addi a0,sp,24 + ea6: 3719 jal dac + ea8: 200005b7 lui a1,0x20000 + eac: 38c58593 addi a1,a1,908 # 2000038c + eb0: 01914783 lbu a5,25(sp) + eb4: 0445c703 lbu a4,68(a1) + eb8: 8385 srli a5,a5,0x1 + eba: 8ff9 and a5,a5,a4 + ebc: cba1 beqz a5,f0c + ebe: 46f2 lw a3,28(sp) + ec0: 02000793 li a5,32 + ec4: 02000613 li a2,32 + ec8: 02458593 addi a1,a1,36 + ecc: 1068 addi a0,sp,44 + ece: d436 sw a3,40(sp) + ed0: c636 sw a3,12(sp) + ed2: 02e10223 sb a4,36(sp) + ed6: 04f10623 sb a5,76(sp) + eda: 279080ef jal ra,9952 + ede: 9761d783 lhu a5,-1674(gp) # 20000366 + ee2: 46b2 lw a3,12(sp) + ee4: 0000c637 lui a2,0xc + ee8: 0000b5b7 lui a1,0xb + eec: 0000c537 lui a0,0xc + ef0: 82460613 addi a2,a2,-2012 # b824 <_exit+0x3cc> + ef4: 66058593 addi a1,a1,1632 # b660 <_exit+0x208> + ef8: 82c50513 addi a0,a0,-2004 # b82c <_exit+0x3d4> + efc: 02f102a3 sb a5,37(sp) + f00: 4c7080ef jal ra,9bc6 + f04: 1048 addi a0,sp,36 + f06: 3591 jal d4a + f08: 1048 addi a0,sp,36 + f0a: 3dc5 jal dfa + f0c: 6161 addi sp,sp,80 + f0e: b06ff06f j 214 <__riscv_restore_0> + f12: 09000693 li a3,144 + f16: fed71be3 bne a4,a3,f0c + f1a: 8bbd andi a5,a5,15 + f1c: 02f10223 sb a5,36(sp) + f20: 04d54783 lbu a5,77(a0) + f24: 04e55703 lhu a4,78(a0) + f28: 02000613 li a2,32 + f2c: 02f102a3 sb a5,37(sp) + f30: 05055783 lhu a5,80(a0) + f34: 07c2 slli a5,a5,0x10 + f36: 8fd9 or a5,a5,a4 + f38: d43e sw a5,40(sp) + f3a: 453c lw a5,72(a0) + f3c: 4721 li a4,8 + f3e: 17e9 addi a5,a5,-6 + f40: 0ff7f793 andi a5,a5,255 + f44: 00f76363 bltu a4,a5,f4a + f48: 4621 li a2,8 + f4a: 05250593 addi a1,a0,82 + f4e: 1068 addi a0,sp,44 + f50: 04c10623 sb a2,76(sp) + f54: 1ff080ef jal ra,9952 + f58: bf45 j f08 + +00000f5a : + f5a: 00050703 lb a4,0(a0) + f5e: 02d00793 li a5,45 + f62: 4805 li a6,1 + f64: 00f71463 bne a4,a5,f6c + f68: 0505 addi a0,a0,1 + f6a: 587d li a6,-1 + f6c: 4781 li a5,0 + f6e: 4625 li a2,9 + f70: 48a9 li a7,10 + f72: a029 j f7c + f74: 031787b3 mul a5,a5,a7 + f78: 0505 addi a0,a0,1 + f7a: 97b6 add a5,a5,a3 + f7c: 00050703 lb a4,0(a0) + f80: fd070693 addi a3,a4,-48 + f84: 0ff6f593 andi a1,a3,255 + f88: feb676e3 bgeu a2,a1,f74 + f8c: 02e00693 li a3,46 + f90: 04d71463 bne a4,a3,fd8 + f94: 00150613 addi a2,a0,1 + f98: 4685 li a3,1 + f9a: 051d addi a0,a0,7 + f9c: 4701 li a4,0 + f9e: 4325 li t1,9 + fa0: 48a9 li a7,10 + fa2: 00060583 lb a1,0(a2) + fa6: fd058593 addi a1,a1,-48 + faa: 0ff5fe13 andi t3,a1,255 + fae: 03c37863 bgeu t1,t3,fde + fb2: 000f4637 lui a2,0xf4 + fb6: 23f60613 addi a2,a2,575 # f423f <_data_lma+0xe5fe3> + fba: 45a9 li a1,10 + fbc: 02d64363 blt a2,a3,fe2 + fc0: 02b70733 mul a4,a4,a1 + fc4: 02b686b3 mul a3,a3,a1 + fc8: bfd5 j fbc + fca: 03170733 mul a4,a4,a7 + fce: 0605 addi a2,a2,1 + fd0: 972e add a4,a4,a1 + fd2: 031686b3 mul a3,a3,a7 + fd6: b7f1 j fa2 + fd8: 4685 li a3,1 + fda: 4701 li a4,0 + fdc: bfd9 j fb2 + fde: fea616e3 bne a2,a0,fca + fe2: 000f46b7 lui a3,0xf4 + fe6: 24068693 addi a3,a3,576 # f4240 <_data_lma+0xe5fe4> + fea: 02d787b3 mul a5,a5,a3 + fee: 97ba add a5,a5,a4 + ff0: 03078533 mul a0,a5,a6 + ff4: 8082 ret + +00000ff6 : + ff6: 9e0ff2ef jal t0,1d6 <__riscv_save_4> + ffa: 716d addi sp,sp,-272 + ffc: 84aa mv s1,a0 + ffe: 89ae mv s3,a1 + 1000: 8932 mv s2,a2 + 1002: 4581 li a1,0 + 1004: 10400613 li a2,260 + 1008: 0068 addi a0,sp,12 + 100a: 8436 mv s0,a3 + 100c: a14ff0ef jal ra,220 + 1010: 0204c783 lbu a5,32(s1) + 1014: 0684c583 lbu a1,104(s1) + 1018: 05a10713 addi a4,sp,90 + 101c: 04f10c23 sb a5,88(sp) + 1020: 200007b7 lui a5,0x20000 + 1024: 3b07c783 lbu a5,944(a5) # 200003b0 + 1028: 00b035b3 snez a1,a1 + 102c: 0585 addi a1,a1,1 + 102e: 0135e5b3 or a1,a1,s3 + 1032: 864c sb a1,12(sp) + 1034: 04f10ca3 sb a5,89(sp) + 1038: 86a2 mv a3,s0 + 103a: 003c addi a5,sp,8 + 103c: 864a mv a2,s2 + 103e: 02000593 li a1,32 + 1042: 04048513 addi a0,s1,64 + 1046: 776010ef jal ra,27bc + 104a: 4722 lw a4,8(sp) + 104c: 0000c9b7 lui s3,0xc + 1050: 0000b937 lui s2,0xb + 1054: 0000c537 lui a0,0xc + 1058: 86a2 mv a3,s0 + 105a: f8498613 addi a2,s3,-124 # bf84 <_exit+0xb2c> + 105e: 66090593 addi a1,s2,1632 # b660 <_exit+0x208> + 1062: f9850513 addi a0,a0,-104 # bf98 <_exit+0xb40> + 1066: 361080ef jal ra,9bc6 + 106a: 4422 lw s0,8(sp) + 106c: 06848593 addi a1,s1,104 + 1070: 04100613 li a2,65 + 1074: 0409 addi s0,s0,2 + 1076: 01110513 addi a0,sp,17 + 107a: caa2 sw s0,84(sp) + 107c: 0d7080ef jal ra,9952 + 1080: 0000c537 lui a0,0xc + 1084: 8622 mv a2,s0 + 1086: 08ac addi a1,sp,88 + 1088: fc050513 addi a0,a0,-64 # bfc0 <_exit+0xb68> + 108c: b56ff0ef jal ra,3e2 + 1090: 0068 addi a0,sp,12 + 1092: 408010ef jal ra,249a + 1096: 0000c537 lui a0,0xc + 109a: f8498613 addi a2,s3,-124 + 109e: 66090593 addi a1,s2,1632 + 10a2: fd050513 addi a0,a0,-48 # bfd0 <_exit+0xb78> + 10a6: 321080ef jal ra,9bc6 + 10aa: 6151 addi sp,sp,272 + 10ac: 95eff06f j 20a <__riscv_restore_4> + +000010b0 : + 10b0: 940ff2ef jal t0,1f0 <__riscv_save_0> + 10b4: 716d addi sp,sp,-272 + 10b6: e115 bnez a0,10da + 10b8: 0000c637 lui a2,0xc + 10bc: 0000b5b7 lui a1,0xb + 10c0: 0000c537 lui a0,0xc + 10c4: f8460613 addi a2,a2,-124 # bf84 <_exit+0xb2c> + 10c8: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 10cc: ff850513 addi a0,a0,-8 # bff8 <_exit+0xba0> + 10d0: 2f7080ef jal ra,9bc6 + 10d4: 6151 addi sp,sp,272 + 10d6: 93eff06f j 214 <__riscv_restore_0> + 10da: 0b052783 lw a5,176(a0) + 10de: 892a mv s2,a0 + 10e0: ef91 bnez a5,10fc + 10e2: 0000c637 lui a2,0xc + 10e6: 0000b5b7 lui a1,0xb + 10ea: 0000c537 lui a0,0xc + 10ee: f8460613 addi a2,a2,-124 # bf84 <_exit+0xb2c> + 10f2: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 10f6: 01050513 addi a0,a0,16 # c010 <_exit+0xbb8> + 10fa: bfd9 j 10d0 + 10fc: 84ae mv s1,a1 + 10fe: 0599 addi a1,a1,6 + 1100: 852e mv a0,a1 + 1102: c62e sw a1,12(sp) + 1104: 643080ef jal ra,9f46 + 1108: 409c lw a5,0(s1) + 110a: 30d8 lbu a4,5(s1) + 110c: 0ff57413 andi s0,a0,255 + 1110: c83e sw a5,16(sp) + 1112: 20dc lbu a5,4(s1) + 1114: 45b2 lw a1,12(sp) + 1116: 8b0d andi a4,a4,3 + 1118: 00140613 addi a2,s0,1 + 111c: 078a slli a5,a5,0x2 + 111e: 8fd9 or a5,a5,a4 + 1120: 0ff67613 andi a2,a2,255 + 1124: 01510513 addi a0,sp,21 + 1128: 00f10a23 sb a5,20(sp) + 112c: 027080ef jal ra,9952 + 1130: 00640693 addi a3,s0,6 + 1134: 0ff6f693 andi a3,a3,255 + 1138: 0810 addi a2,sp,16 + 113a: 45a1 li a1,8 + 113c: 854a mv a0,s2 + 113e: 3d65 jal ff6 + 1140: bf51 j 10d4 + +00001142 : + 1142: 8aeff2ef jal t0,1f0 <__riscv_save_0> + 1146: 21c0 lbu s0,4(a1) + 1148: 419c lw a5,0(a1) + 114a: 7111 addi sp,sp,-256 + 114c: 84aa mv s1,a0 + 114e: 8622 mv a2,s0 + 1150: 0595 addi a1,a1,5 + 1152: 0048 addi a0,sp,4 + 1154: c03e sw a5,0(sp) + 1156: 7fc080ef jal ra,9952 + 115a: 00440693 addi a3,s0,4 + 115e: 860a mv a2,sp + 1160: 0ff6f693 andi a3,a3,255 + 1164: 4591 li a1,4 + 1166: 8526 mv a0,s1 + 1168: 3579 jal ff6 + 116a: 6111 addi sp,sp,256 + 116c: 8a8ff06f j 214 <__riscv_restore_0> + +00001170 : + 1170: 866ff2ef jal t0,1d6 <__riscv_save_4> + 1174: 2180 lbu s0,0(a1) + 1176: 7111 addi sp,sp,-256 + 1178: 89ae mv s3,a1 + 117a: 8622 mv a2,s0 + 117c: 892a mv s2,a0 + 117e: 0585 addi a1,a1,1 + 1180: 00110513 addi a0,sp,1 + 1184: 8040 sb s0,0(sp) + 1186: 7cc080ef jal ra,9952 + 118a: 0429c603 lbu a2,66(s3) + 118e: 00140793 addi a5,s0,1 + 1192: 0ff7f793 andi a5,a5,255 + 1196: 00240493 addi s1,s0,2 + 119a: 0218 addi a4,sp,256 + 119c: 0ff4f493 andi s1,s1,255 + 11a0: 97ba add a5,a5,a4 + 11a2: c605 beqz a2,11ca + 11a4: 0419c703 lbu a4,65(s3) + 11a8: 04398593 addi a1,s3,67 + 11ac: 00910533 add a0,sp,s1 + 11b0: f0e78023 sb a4,-256(a5) + 11b4: 79e080ef jal ra,9952 + 11b8: 860a mv a2,sp + 11ba: 86a6 mv a3,s1 + 11bc: 02000593 li a1,32 + 11c0: 854a mv a0,s2 + 11c2: 3d15 jal ff6 + 11c4: 6111 addi sp,sp,256 + 11c6: 844ff06f j 20a <__riscv_restore_4> + 11ca: 577d li a4,-1 + 11cc: f0e78023 sb a4,-256(a5) + 11d0: 03a080ef jal ra,920a + 11d4: 021c addi a5,sp,256 + 11d6: 94be add s1,s1,a5 + 11d8: 00340793 addi a5,s0,3 + 11dc: 0218 addi a4,sp,256 + 11de: 0ff7f793 andi a5,a5,255 + 11e2: f0a48023 sb a0,-256(s1) + 11e6: 97ba add a5,a5,a4 + 11e8: 00855713 srli a4,a0,0x8 + 11ec: f0e78023 sb a4,-256(a5) + 11f0: 00440793 addi a5,s0,4 + 11f4: 0218 addi a4,sp,256 + 11f6: 0ff7f793 andi a5,a5,255 + 11fa: 97ba add a5,a5,a4 + 11fc: 00640493 addi s1,s0,6 + 1200: 01055713 srli a4,a0,0x10 + 1204: 0415 addi s0,s0,5 + 1206: f0e78023 sb a4,-256(a5) + 120a: 0ff47413 andi s0,s0,255 + 120e: 021c addi a5,sp,256 + 1210: 943e add s0,s0,a5 + 1212: 8161 srli a0,a0,0x18 + 1214: 0ff4f493 andi s1,s1,255 + 1218: f0a40023 sb a0,-256(s0) + 121c: bf71 j 11b8 + +0000121e : + 121e: fd3fe2ef jal t0,1f0 <__riscv_save_0> + 1222: 842a mv s0,a0 + 1224: 0000c537 lui a0,0xc + 1228: bb050513 addi a0,a0,-1104 # bbb0 <_exit+0x758> + 122c: 19b080ef jal ra,9bc6 + 1230: 400c lw a1,0(s0) + 1232: 0000c537 lui a0,0xc + 1236: bbc50513 addi a0,a0,-1092 # bbbc <_exit+0x764> + 123a: 18d080ef jal ra,9bc6 + 123e: 204c lbu a1,4(s0) + 1240: 0000c537 lui a0,0xc + 1244: bd050513 addi a0,a0,-1072 # bbd0 <_exit+0x778> + 1248: 17f080ef jal ra,9bc6 + 124c: 0000c537 lui a0,0xc + 1250: be050513 addi a0,a0,-1056 # bbe0 <_exit+0x788> + 1254: 173080ef jal ra,9bc6 + 1258: 3050 lbu a2,5(s0) + 125a: 0000c537 lui a0,0xc + 125e: 00640593 addi a1,s0,6 + 1262: bec50513 addi a0,a0,-1044 # bbec <_exit+0x794> + 1266: 97cff0ef jal ra,3e2 + 126a: fabfe06f j 214 <__riscv_restore_0> + +0000126e : + 126e: f83fe2ef jal t0,1f0 <__riscv_save_0> + 1272: 842a mv s0,a0 + 1274: 0000c537 lui a0,0xc + 1278: bf450513 addi a0,a0,-1036 # bbf4 <_exit+0x79c> + 127c: 14b080ef jal ra,9bc6 + 1280: 400c lw a1,0(s0) + 1282: 0000c537 lui a0,0xc + 1286: c0050513 addi a0,a0,-1024 # bc00 <_exit+0x7a8> + 128a: 13d080ef jal ra,9bc6 + 128e: 0000c537 lui a0,0xc + 1292: be050513 addi a0,a0,-1056 # bbe0 <_exit+0x788> + 1296: 131080ef jal ra,9bc6 + 129a: 2050 lbu a2,4(s0) + 129c: 0000c537 lui a0,0xc + 12a0: 00540593 addi a1,s0,5 + 12a4: bec50513 addi a0,a0,-1044 # bbec <_exit+0x794> + 12a8: 93aff0ef jal ra,3e2 + 12ac: f69fe06f j 214 <__riscv_restore_0> + +000012b0 : + 12b0: f41fe2ef jal t0,1f0 <__riscv_save_0> + 12b4: 2190 lbu a2,0(a1) + 12b6: 7111 addi sp,sp,-256 + 12b8: 842a mv s0,a0 + 12ba: 57fd li a5,-1 + 12bc: 0585 addi a1,a1,1 + 12be: 00910513 addi a0,sp,9 + 12c2: 04f104a3 sb a5,73(sp) + 12c6: 8450 sb a2,8(sp) + 12c8: 04010523 sb zero,74(sp) + 12cc: 686080ef jal ra,9952 + 12d0: 002c addi a1,sp,8 + 12d2: 8522 mv a0,s0 + 12d4: 3d71 jal 1170 + 12d6: 6111 addi sp,sp,256 + 12d8: f3dfe06f j 214 <__riscv_restore_0> + +000012dc : + 12dc: efbfe2ef jal t0,1d6 <__riscv_save_4> + 12e0: 7131 addi sp,sp,-192 + 12e2: 842a mv s0,a0 + 12e4: 892e mv s2,a1 + 12e6: 725070ef jal ra,920a + 12ea: 4785 li a5,1 + 12ec: 847c sh a5,8(sp) + 12ee: c22a sw a0,4(sp) + 12f0: 00010523 sb zero,10(sp) + 12f4: 02000793 li a5,32 + 12f8: 00040703 lb a4,0(s0) + 12fc: 04f70d63 beq a4,a5,1356 + 1300: 8522 mv a0,s0 + 1302: 445080ef jal ra,9f46 + 1306: 4791 li a5,4 + 1308: 00a10493 addi s1,sp,10 + 130c: 02a7f063 bgeu a5,a0,132c + 1310: 00240703 lb a4,2(s0) + 1314: 07c00793 li a5,124 + 1318: 00f71a63 bne a4,a5,132c + 131c: 85a2 mv a1,s0 + 131e: 8526 mv a0,s1 + 1320: 460d li a2,3 + 1322: 630080ef jal ra,9952 + 1326: 040d addi s0,s0,3 + 1328: 00d10493 addi s1,sp,13 + 132c: 0000c5b7 lui a1,0xc + 1330: c4458593 addi a1,a1,-956 # bc44 <_exit+0x7ec> + 1334: 8522 mv a0,s0 + 1336: f93fe0ef jal ra,2c8 + 133a: e105 bnez a0,135a + 133c: beef07b7 lui a5,0xbeef0 + 1340: e000e737 lui a4,0xe000e + 1344: 08078793 addi a5,a5,128 # beef0080 <_eusrstack+0x9eee8080> + 1348: c73c sw a5,72(a4) + 134a: 004c addi a1,sp,4 + 134c: 854a mv a0,s2 + 134e: 338d jal 10b0 + 1350: 6129 addi sp,sp,192 + 1352: eb9fe06f j 20a <__riscv_restore_4> + 1356: 0405 addi s0,s0,1 + 1358: b745 j 12f8 + 135a: 0000c5b7 lui a1,0xc + 135e: c4c58593 addi a1,a1,-948 # bc4c <_exit+0x7f4> + 1362: 8522 mv a0,s0 + 1364: f65fe0ef jal ra,2c8 + 1368: ed01 bnez a0,1380 + 136a: 4505 li a0,1 + 136c: a62ff0ef jal ra,5ce + 1370: 0000c5b7 lui a1,0xc + 1374: c5458593 addi a1,a1,-940 # bc54 <_exit+0x7fc> + 1378: 8526 mv a0,s1 + 137a: 3bd080ef jal ra,9f36 + 137e: b7f1 j 134a + 1380: 0000c5b7 lui a1,0xc + 1384: c6858593 addi a1,a1,-920 # bc68 <_exit+0x810> + 1388: 8522 mv a0,s0 + 138a: f3ffe0ef jal ra,2c8 + 138e: ed09 bnez a0,13a8 + 1390: 4581 li a1,0 + 1392: 03400613 li a2,52 + 1396: 94c18513 addi a0,gp,-1716 # 2000033c + 139a: e87fe0ef jal ra,220 + 139e: 0000c5b7 lui a1,0xc + 13a2: c7458593 addi a1,a1,-908 # bc74 <_exit+0x81c> + 13a6: bfc9 j 1378 + 13a8: 0000e5b7 lui a1,0xe + 13ac: 96858593 addi a1,a1,-1688 # d968 + 13b0: 8522 mv a0,s0 + 13b2: f17fe0ef jal ra,2c8 + 13b6: e10d bnez a0,13d8 + 13b8: 0000c6b7 lui a3,0xc + 13bc: 0000c637 lui a2,0xc + 13c0: 0000c5b7 lui a1,0xc + 13c4: c8868693 addi a3,a3,-888 # bc88 <_exit+0x830> + 13c8: c9460613 addi a2,a2,-876 # bc94 <_exit+0x83c> + 13cc: cb058593 addi a1,a1,-848 # bcb0 <_exit+0x858> + 13d0: 8526 mv a0,s1 + 13d2: 301080ef jal ra,9ed2 + 13d6: bf95 j 134a + 13d8: 0000c5b7 lui a1,0xc + 13dc: cc058593 addi a1,a1,-832 # bcc0 <_exit+0x868> + 13e0: 8522 mv a0,s0 + 13e2: ee7fe0ef jal ra,2c8 + 13e6: e511 bnez a0,13f2 + 13e8: 0000c5b7 lui a1,0xc + 13ec: cc858593 addi a1,a1,-824 # bcc8 <_exit+0x870> + 13f0: b761 j 1378 + 13f2: 0000c5b7 lui a1,0xc + 13f6: cd858593 addi a1,a1,-808 # bcd8 <_exit+0x880> + 13fa: 8522 mv a0,s0 + 13fc: ecdfe0ef jal ra,2c8 + 1400: e515 bnez a0,142c + 1402: 670010ef jal ra,2a72 + 1406: 9801c603 lbu a2,-1664(gp) # 20000370 + 140a: 98018593 addi a1,gp,-1664 # 20000370 + 140e: 3194 lbu a3,1(a1) + 1410: 21b8 lbu a4,2(a1) + 1412: 31fc lbu a5,7(a1) + 1414: 0065c803 lbu a6,6(a1) + 1418: 0045d883 lhu a7,4(a1) + 141c: 0000c5b7 lui a1,0xc + 1420: cf858593 addi a1,a1,-776 # bcf8 <_exit+0x8a0> + 1424: 8526 mv a0,s1 + 1426: 2ad080ef jal ra,9ed2 + 142a: b705 j 134a + 142c: 0000c5b7 lui a1,0xc + 1430: ce058593 addi a1,a1,-800 # bce0 <_exit+0x888> + 1434: 8522 mv a0,s0 + 1436: e93fe0ef jal ra,2c8 + 143a: e521 bnez a0,1482 + 143c: 00540513 addi a0,s0,5 + 1440: 48c080ef jal ra,98cc + 1444: 842a mv s0,a0 + 1446: 5c5070ef jal ra,920a + 144a: 02857763 bgeu a0,s0,1478 + 144e: 8522 mv a0,s0 + 1450: 615070ef jal ra,9264 + 1454: 61e010ef jal ra,2a72 + 1458: 9801c603 lbu a2,-1664(gp) # 20000370 + 145c: 98018593 addi a1,gp,-1664 # 20000370 + 1460: 3194 lbu a3,1(a1) + 1462: 21b8 lbu a4,2(a1) + 1464: 31fc lbu a5,7(a1) + 1466: 0065c803 lbu a6,6(a1) + 146a: 0045d883 lhu a7,4(a1) + 146e: 0000c5b7 lui a1,0xc + 1472: ce858593 addi a1,a1,-792 # bce8 <_exit+0x890> + 1476: b77d j 1424 + 1478: 0000c5b7 lui a1,0xc + 147c: d1858593 addi a1,a1,-744 # bd18 <_exit+0x8c0> + 1480: bde5 j 1378 + 1482: 0000c5b7 lui a1,0xc + 1486: d3c58593 addi a1,a1,-708 # bd3c <_exit+0x8e4> + 148a: 8522 mv a0,s0 + 148c: e3dfe0ef jal ra,2c8 + 1490: ed11 bnez a0,14ac + 1492: 579070ef jal ra,920a + 1496: 4792 lw a5,4(sp) + 1498: 00f57563 bgeu a0,a5,14a2 + 149c: 00178513 addi a0,a5,1 + 14a0: bf45 j 1450 + 14a2: 0000c5b7 lui a1,0xc + 14a6: d4858593 addi a1,a1,-696 # bd48 <_exit+0x8f0> + 14aa: b5f9 j 1378 + 14ac: 0000c5b7 lui a1,0xc + 14b0: d6858593 addi a1,a1,-664 # bd68 <_exit+0x910> + 14b4: 8522 mv a0,s0 + 14b6: e13fe0ef jal ra,2c8 + 14ba: e115 bnez a0,14de + 14bc: 00940593 addi a1,s0,9 + 14c0: 4641 li a2,16 + 14c2: 76018513 addi a0,gp,1888 # 20001150 <__global_pointer$+0x760> + 14c6: 293080ef jal ra,9f58 + 14ca: 0000c5b7 lui a1,0xc + 14ce: 76018613 addi a2,gp,1888 # 20001150 <__global_pointer$+0x760> + 14d2: d7458593 addi a1,a1,-652 # bd74 <_exit+0x91c> + 14d6: 8526 mv a0,s1 + 14d8: 1fb080ef jal ra,9ed2 + 14dc: b5bd j 134a + 14de: 0000c5b7 lui a1,0xc + 14e2: d8858593 addi a1,a1,-632 # bd88 <_exit+0x930> + 14e6: 8522 mv a0,s0 + 14e8: de1fe0ef jal ra,2c8 + 14ec: 14051963 bnez a0,163e + 14f0: 0411 addi s0,s0,4 + 14f2: 0000c5b7 lui a1,0xc + 14f6: 4639 li a2,14 + 14f8: d9058593 addi a1,a1,-624 # bd90 <_exit+0x938> + 14fc: 8522 mv a0,s0 + 14fe: 430080ef jal ra,992e + 1502: e901 bnez a0,1512 + 1504: 77018613 addi a2,gp,1904 # 20001160 <__global_pointer$+0x770> + 1508: 0000c5b7 lui a1,0xc + 150c: da058593 addi a1,a1,-608 # bda0 <_exit+0x948> + 1510: b7d9 j 14d6 + 1512: 0000c5b7 lui a1,0xc + 1516: 4611 li a2,4 + 1518: da858593 addi a1,a1,-600 # bda8 <_exit+0x950> + 151c: 8522 mv a0,s0 + 151e: 410080ef jal ra,992e + 1522: e511 bnez a0,152e + 1524: 20000637 lui a2,0x20000 + 1528: 3d160613 addi a2,a2,977 # 200003d1 + 152c: bff1 j 1508 + 152e: 0000c5b7 lui a1,0xc + 1532: 4619 li a2,6 + 1534: db058593 addi a1,a1,-592 # bdb0 <_exit+0x958> + 1538: 8522 mv a0,s0 + 153a: 3f4080ef jal ra,992e + 153e: e115 bnez a0,1562 + 1540: 200017b7 lui a5,0x20001 + 1544: 38c78793 addi a5,a5,908 # 2000138c <_ebss+0x20c> + 1548: de47c783 lbu a5,-540(a5) + 154c: e791 bnez a5,1558 + 154e: 0000c637 lui a2,0xc + 1552: c1060613 addi a2,a2,-1008 # bc10 <_exit+0x7b8> + 1556: bf4d j 1508 + 1558: 0000c637 lui a2,0xc + 155c: c0c60613 addi a2,a2,-1012 # bc0c <_exit+0x7b4> + 1560: b765 j 1508 + 1562: 0000c5b7 lui a1,0xc + 1566: 460d li a2,3 + 1568: db858593 addi a1,a1,-584 # bdb8 <_exit+0x960> + 156c: 8522 mv a0,s0 + 156e: 3c0080ef jal ra,992e + 1572: e911 bnez a0,1586 + 1574: 200007b7 lui a5,0x20000 + 1578: 3f47a603 lw a2,1012(a5) # 200003f4 + 157c: 0000c5b7 lui a1,0xc + 1580: dbc58593 addi a1,a1,-580 # bdbc <_exit+0x964> + 1584: bf89 j 14d6 + 1586: 0000c5b7 lui a1,0xc + 158a: 460d li a2,3 + 158c: dc458593 addi a1,a1,-572 # bdc4 <_exit+0x96c> + 1590: 8522 mv a0,s0 + 1592: 39c080ef jal ra,992e + 1596: e511 bnez a0,15a2 + 1598: 200007b7 lui a5,0x20000 + 159c: 3f87a603 lw a2,1016(a5) # 200003f8 + 15a0: bff1 j 157c + 15a2: 0000c5b7 lui a1,0xc + 15a6: 4629 li a2,10 + 15a8: dc858593 addi a1,a1,-568 # bdc8 <_exit+0x970> + 15ac: 8522 mv a0,s0 + 15ae: 380080ef jal ra,992e + 15b2: e50d bnez a0,15dc + 15b4: 0000c5b7 lui a1,0xc + 15b8: dd458593 addi a1,a1,-556 # bdd4 <_exit+0x97c> + 15bc: 8526 mv a0,s1 + 15be: 179080ef jal ra,9f36 + 15c2: 20000537 lui a0,0x20000 + 15c6: 04600693 li a3,70 + 15ca: 00248613 addi a2,s1,2 + 15ce: 02000593 li a1,32 + 15d2: 3b050513 addi a0,a0,944 # 200003b0 + 15d6: ec9fe0ef jal ra,49e + 15da: bb85 j 134a + 15dc: 0000c5b7 lui a1,0xc + 15e0: 4611 li a2,4 + 15e2: dd858593 addi a1,a1,-552 # bdd8 <_exit+0x980> + 15e6: 8522 mv a0,s0 + 15e8: 346080ef jal ra,992e + 15ec: e909 bnez a0,15fe + 15ee: 200007b7 lui a5,0x20000 + 15f2: 3d07c503 lbu a0,976(a5) # 200003d0 + 15f6: 741050ef jal ra,7536 + 15fa: 862a mv a2,a0 + 15fc: b731 j 1508 + 15fe: 0000c5b7 lui a1,0xc + 1602: 4639 li a2,14 + 1604: de058593 addi a1,a1,-544 # bde0 <_exit+0x988> + 1608: 8522 mv a0,s0 + 160a: 324080ef jal ra,992e + 160e: e115 bnez a0,1632 + 1610: 200017b7 lui a5,0x20001 + 1614: 38c78793 addi a5,a5,908 # 2000138c <_ebss+0x20c> + 1618: de67d603 lhu a2,-538(a5) + 161c: 0000c5b7 lui a1,0xc + 1620: 3e800793 li a5,1000 + 1624: 02f676b3 remu a3,a2,a5 + 1628: df058593 addi a1,a1,-528 # bdf0 <_exit+0x998> + 162c: 02f65633 divu a2,a2,a5 + 1630: b345 j 13d0 + 1632: 0000c5b7 lui a1,0xc + 1636: 8622 mv a2,s0 + 1638: df858593 addi a1,a1,-520 # bdf8 <_exit+0x9a0> + 163c: bd69 j 14d6 + 163e: 0000c5b7 lui a1,0xc + 1642: e0058593 addi a1,a1,-512 # be00 <_exit+0x9a8> + 1646: 8522 mv a0,s0 + 1648: c81fe0ef jal ra,2c8 + 164c: 16051463 bnez a0,17b4 + 1650: 00440993 addi s3,s0,4 + 1654: 0000c5b7 lui a1,0xc + 1658: 4641 li a2,16 + 165a: e0858593 addi a1,a1,-504 # be08 <_exit+0x9b0> + 165e: 854e mv a0,s3 + 1660: 2ce080ef jal ra,992e + 1664: e921 bnez a0,16b4 + 1666: 0451 addi s0,s0,20 + 1668: 0000c5b7 lui a1,0xc + 166c: 4609 li a2,2 + 166e: c0c58593 addi a1,a1,-1012 # bc0c <_exit+0x7b4> + 1672: 8522 mv a0,s0 + 1674: 2ba080ef jal ra,992e + 1678: ed09 bnez a0,1692 + 167a: 200017b7 lui a5,0x20001 + 167e: 38c78793 addi a5,a5,908 # 2000138c <_ebss+0x20c> + 1682: 4705 li a4,1 + 1684: dee782a3 sb a4,-539(a5) + 1688: 0000c5b7 lui a1,0xc + 168c: e1c58593 addi a1,a1,-484 # be1c <_exit+0x9c4> + 1690: b1e5 j 1378 + 1692: 0000c5b7 lui a1,0xc + 1696: 460d li a2,3 + 1698: c1058593 addi a1,a1,-1008 # bc10 <_exit+0x7b8> + 169c: 8522 mv a0,s0 + 169e: 290080ef jal ra,992e + 16a2: ca0514e3 bnez a0,134a + 16a6: 200017b7 lui a5,0x20001 + 16aa: 38c78793 addi a5,a5,908 # 2000138c <_ebss+0x20c> + 16ae: de0782a3 sb zero,-539(a5) + 16b2: bfd9 j 1688 + 16b4: 0000c5b7 lui a1,0xc + 16b8: 463d li a2,15 + 16ba: e2058593 addi a1,a1,-480 # be20 <_exit+0x9c8> + 16be: 854e mv a0,s3 + 16c0: 26e080ef jal ra,992e + 16c4: e909 bnez a0,16d6 + 16c6: 4641 li a2,16 + 16c8: 01340593 addi a1,s0,19 + 16cc: 77018513 addi a0,gp,1904 # 20001160 <__global_pointer$+0x770> + 16d0: 089080ef jal ra,9f58 + 16d4: bf55 j 1688 + 16d6: 0000c5b7 lui a1,0xc + 16da: 4615 li a2,5 + 16dc: e3058593 addi a1,a1,-464 # be30 <_exit+0x9d8> + 16e0: 854e mv a0,s3 + 16e2: 24c080ef jal ra,992e + 16e6: e911 bnez a0,16fa + 16e8: 20000537 lui a0,0x20000 + 16ec: 02000613 li a2,32 + 16f0: 00940593 addi a1,s0,9 + 16f4: 3d150513 addi a0,a0,977 # 200003d1 + 16f8: bfe1 j 16d0 + 16fa: 0000c5b7 lui a1,0xc + 16fe: 461d li a2,7 + 1700: e3858593 addi a1,a1,-456 # be38 <_exit+0x9e0> + 1704: 854e mv a0,s3 + 1706: 228080ef jal ra,992e + 170a: e939 bnez a0,1760 + 170c: 042d addi s0,s0,11 + 170e: 0000c5b7 lui a1,0xc + 1712: 460d li a2,3 + 1714: c1058593 addi a1,a1,-1008 # bc10 <_exit+0x7b8> + 1718: 8522 mv a0,s0 + 171a: 200019b7 lui s3,0x20001 + 171e: 210080ef jal ra,992e + 1722: 38c98993 addi s3,s3,908 # 2000138c <_ebss+0x20c> + 1726: e901 bnez a0,1736 + 1728: de098223 sb zero,-540(s3) + 172c: 0000c5b7 lui a1,0xc + 1730: c2c58593 addi a1,a1,-980 # bc2c <_exit+0x7d4> + 1734: b191 j 1378 + 1736: 0000c5b7 lui a1,0xc + 173a: 4609 li a2,2 + 173c: c0c58593 addi a1,a1,-1012 # bc0c <_exit+0x7b4> + 1740: 8522 mv a0,s0 + 1742: 1ec080ef jal ra,992e + 1746: e909 bnez a0,1758 + 1748: 4785 li a5,1 + 174a: def98223 sb a5,-540(s3) + 174e: 0000c5b7 lui a1,0xc + 1752: c1458593 addi a1,a1,-1004 # bc14 <_exit+0x7bc> + 1756: b10d j 1378 + 1758: de49c783 lbu a5,-540(s3) + 175c: fbed bnez a5,174e + 175e: b7f9 j 172c + 1760: 0000c5b7 lui a1,0xc + 1764: 4611 li a2,4 + 1766: e4058593 addi a1,a1,-448 # be40 <_exit+0x9e8> + 176a: 854e mv a0,s3 + 176c: 1c2080ef jal ra,992e + 1770: e911 bnez a0,1784 + 1772: 00840513 addi a0,s0,8 + 1776: fe4ff0ef jal ra,f5a + 177a: 200007b7 lui a5,0x20000 + 177e: 3ea7aa23 sw a0,1012(a5) # 200003f4 + 1782: b719 j 1688 + 1784: 0000c5b7 lui a1,0xc + 1788: 4611 li a2,4 + 178a: e4858593 addi a1,a1,-440 # be48 <_exit+0x9f0> + 178e: 854e mv a0,s3 + 1790: 19e080ef jal ra,992e + 1794: e911 bnez a0,17a8 + 1796: 00840513 addi a0,s0,8 + 179a: fc0ff0ef jal ra,f5a + 179e: 200007b7 lui a5,0x20000 + 17a2: 3ea7ac23 sw a0,1016(a5) # 200003f8 + 17a6: b5cd j 1688 + 17a8: 0000c5b7 lui a1,0xc + 17ac: 864e mv a2,s3 + 17ae: e5058593 addi a1,a1,-432 # be50 <_exit+0x9f8> + 17b2: b315 j 14d6 + 17b4: 0000c5b7 lui a1,0xc + 17b8: e6458593 addi a1,a1,-412 # be64 <_exit+0xa0c> + 17bc: 8522 mv a0,s0 + 17be: b0bfe0ef jal ra,2c8 + 17c2: e105 bnez a0,17e2 + 17c4: 94c18613 addi a2,gp,-1716 # 2000033c + 17c8: 0000c5b7 lui a1,0xc + 17cc: 02462883 lw a7,36(a2) + 17d0: 02062803 lw a6,32(a2) + 17d4: 4e5c lw a5,28(a2) + 17d6: 4e18 lw a4,24(a2) + 17d8: 4654 lw a3,12(a2) + 17da: e7458593 addi a1,a1,-396 # be74 <_exit+0xa1c> + 17de: 4610 lw a2,8(a2) + 17e0: b191 j 1424 + 17e2: 0000c5b7 lui a1,0xc + 17e6: ec458593 addi a1,a1,-316 # bec4 <_exit+0xa6c> + 17ea: 8522 mv a0,s0 + 17ec: addfe0ef jal ra,2c8 + 17f0: e51d bnez a0,181e + 17f2: 94c18613 addi a2,gp,-1716 # 2000033c + 17f6: 02a61683 lh a3,42(a2) + 17fa: 4711 li a4,4 + 17fc: 03062803 lw a6,48(a2) + 1800: 02e6c733 div a4,a3,a4 + 1804: 4a1c lw a5,16(a2) + 1806: 00661683 lh a3,6(a2) + 180a: 00461603 lh a2,4(a2) + 180e: 0000c5b7 lui a1,0xc + 1812: ed058593 addi a1,a1,-304 # bed0 <_exit+0xa78> + 1816: 8526 mv a0,s1 + 1818: 6ba080ef jal ra,9ed2 + 181c: b63d j 134a + 181e: 0000c5b7 lui a1,0xc + 1822: f2858593 addi a1,a1,-216 # bf28 <_exit+0xad0> + 1826: 8522 mv a0,s0 + 1828: aa1fe0ef jal ra,2c8 + 182c: e90d bnez a0,185e + 182e: 1dd070ef jal ra,920a + 1832: 81c1a783 lw a5,-2020(gp) # 2000020c + 1836: 94c18413 addi s0,gp,-1716 # 2000033c + 183a: 8d1d sub a0,a0,a5 + 183c: c848 sw a0,20(s0) + 183e: 00042823 sw zero,16(s0) + 1842: 193050ef jal ra,71d4 + 1846: 203e lhu a5,2(s0) + 1848: 341a lhu a4,40(s0) + 184a: 4854 lw a3,20(s0) + 184c: 0000c5b7 lui a1,0xc + 1850: 862a mv a2,a0 + 1852: f3458593 addi a1,a1,-204 # bf34 <_exit+0xadc> + 1856: 8526 mv a0,s1 + 1858: 67a080ef jal ra,9ed2 + 185c: b4fd j 134a + 185e: 0000c5b7 lui a1,0xc + 1862: f7458593 addi a1,a1,-140 # bf74 <_exit+0xb1c> + 1866: be09 j 1378 + +00001868 : + 1868: 96ffe2ef jal t0,1d6 <__riscv_save_4> + 186c: 842a mv s0,a0 + 186e: 0000c537 lui a0,0xc + 1872: 7121 addi sp,sp,-448 + 1874: b3050513 addi a0,a0,-1232 # bb30 <_exit+0x6d8> + 1878: 34e080ef jal ra,9bc6 + 187c: 0b944583 lbu a1,185(s0) + 1880: 0000c537 lui a0,0xc + 1884: bd050513 addi a0,a0,-1072 # bbd0 <_exit+0x778> + 1888: 33e080ef jal ra,9bc6 + 188c: 200c lbu a1,0(s0) + 188e: 0000c537 lui a0,0xc + 1892: b4450513 addi a0,a0,-1212 # bb44 <_exit+0x6ec> + 1896: 330080ef jal ra,9bc6 + 189a: 300c lbu a1,1(s0) + 189c: 0000c537 lui a0,0xc + 18a0: b6050513 addi a0,a0,-1184 # bb60 <_exit+0x708> + 18a4: 322080ef jal ra,9bc6 + 18a8: 202e lhu a1,2(s0) + 18aa: 0000c537 lui a0,0xc + 18ae: b7850513 addi a0,a0,-1160 # bb78 <_exit+0x720> + 18b2: 314080ef jal ra,9bc6 + 18b6: 204c lbu a1,4(s0) + 18b8: 0000c537 lui a0,0xc + 18bc: a2050513 addi a0,a0,-1504 # ba20 <_exit+0x5c8> + 18c0: 306080ef jal ra,9bc6 + 18c4: 2050 lbu a2,4(s0) + 18c6: 0000c537 lui a0,0xc + 18ca: 00540593 addi a1,s0,5 + 18ce: ba450513 addi a0,a0,-1116 # bba4 <_exit+0x74c> + 18d2: b11fe0ef jal ra,3e2 + 18d6: 0000e537 lui a0,0xe + 18da: 99850513 addi a0,a0,-1640 # d998 + 18de: 2e8080ef jal ra,9bc6 + 18e2: 0b944783 lbu a5,185(s0) + 18e6: 02000713 li a4,32 + 18ea: 08e79463 bne a5,a4,1972 + 18ee: 3044 lbu s1,5(s0) + 18f0: 04000793 li a5,64 + 18f4: 0c910423 sb s1,200(sp) + 18f8: 0297f363 bgeu a5,s1,191e + 18fc: 0000c637 lui a2,0xc + 1900: 0000b5b7 lui a1,0xb + 1904: 0000c537 lui a0,0xc + 1908: f8460613 addi a2,a2,-124 # bf84 <_exit+0xb2c> + 190c: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 1910: a3450513 addi a0,a0,-1484 # ba34 <_exit+0x5dc> + 1914: 2b2080ef jal ra,9bc6 + 1918: 6139 addi sp,sp,448 + 191a: 8f1fe06f j 20a <__riscv_restore_4> + 191e: 8626 mv a2,s1 + 1920: 00640593 addi a1,s0,6 + 1924: 0c910513 addi a0,sp,201 + 1928: 02a080ef jal ra,9952 + 192c: 00248593 addi a1,s1,2 + 1930: 0485 addi s1,s1,1 + 1932: 2050 lbu a2,4(s0) + 1934: 0ff4f493 andi s1,s1,255 + 1938: 94a2 add s1,s1,s0 + 193a: 30dc lbu a5,5(s1) + 193c: 0ff5f593 andi a1,a1,255 + 1940: 8e0d sub a2,a2,a1 + 1942: 0595 addi a1,a1,5 + 1944: 0ff67613 andi a2,a2,255 + 1948: 95a2 add a1,a1,s0 + 194a: 10b10513 addi a0,sp,267 + 194e: 10f104a3 sb a5,265(sp) + 1952: 10c10523 sb a2,266(sp) + 1956: 7fd070ef jal ra,9952 + 195a: 0c442783 lw a5,196(s0) + 195e: 239c lbu a5,0(a5) + 1960: 8b89 andi a5,a5,2 + 1962: fbdd bnez a5,1918 + 1964: 0c042583 lw a1,192(s0) + 1968: 0bc42503 lw a0,188(s0) + 196c: 945ff0ef jal ra,12b0 + 1970: b765 j 1918 + 1972: 20079c63 bnez a5,1b8a + 1976: 2078 lbu a4,6(s0) + 1978: 305c lbu a5,5(s0) + 197a: 00a40593 addi a1,s0,10 + 197e: 0722 slli a4,a4,0x8 + 1980: 8f5d or a4,a4,a5 + 1982: 307c lbu a5,7(s0) + 1984: 01210513 addi a0,sp,18 + 1988: 07c2 slli a5,a5,0x10 + 198a: 8f5d or a4,a4,a5 + 198c: 241c lbu a5,8(s0) + 198e: 07e2 slli a5,a5,0x18 + 1990: 8fd9 or a5,a5,a4 + 1992: 0bc42703 lw a4,188(s0) + 1996: c63e sw a5,12(sp) + 1998: 0af72623 sw a5,172(a4) # e000e0ac <_eusrstack+0xc00060ac> + 199c: 2050 lbu a2,4(s0) + 199e: 341c lbu a5,9(s0) + 19a0: 166d addi a2,a2,-5 + 19a2: 0ff67613 andi a2,a2,255 + 19a6: 00f10823 sb a5,16(sp) + 19aa: 00c108a3 sb a2,17(sp) + 19ae: 7a5070ef jal ra,9952 + 19b2: 0068 addi a0,sp,12 + 19b4: 86bff0ef jal ra,121e + 19b8: 0c442783 lw a5,196(s0) + 19bc: 239c lbu a5,0(a5) + 19be: 8b89 andi a5,a5,2 + 19c0: e799 bnez a5,19ce + 19c2: 0c042583 lw a1,192(s0) + 19c6: 0bc42503 lw a0,188(s0) + 19ca: 8e7ff0ef jal ra,12b0 + 19ce: 01014783 lbu a5,16(sp) + 19d2: 4985 li s3,1 + 19d4: 17378c63 beq a5,s3,1b4c + 19d8: 470d li a4,3 + 19da: f2e79fe3 bne a5,a4,1918 + 19de: 47b2 lw a5,12(sp) + 19e0: 0bc42703 lw a4,188(s0) + 19e4: 06700913 li s2,103 + 19e8: c5be sw a5,200(sp) + 19ea: 0af72623 sw a5,172(a4) + 19ee: 10200793 li a5,258 + 19f2: 0cf11623 sh a5,204(sp) + 19f6: 0d210723 sb s2,206(sp) + 19fa: 7ae050ef jal ra,71a8 + 19fe: 0cc14783 lbu a5,204(sp) + 1a02: 0398 addi a4,sp,448 + 1a04: 40855693 srai a3,a0,0x8 + 1a08: 973e add a4,a4,a5 + 1a0a: f0d706a3 sb a3,-243(a4) + 1a0e: 00178713 addi a4,a5,1 + 1a12: 0394 addi a3,sp,448 + 1a14: 0ff77713 andi a4,a4,255 + 1a18: 9736 add a4,a4,a3 + 1a1a: f0a706a3 sb a0,-243(a4) + 1a1e: 00278713 addi a4,a5,2 + 1a22: 0ff77713 andi a4,a4,255 + 1a26: 9736 add a4,a4,a3 + 1a28: f13706a3 sb s3,-243(a4) + 1a2c: 00378713 addi a4,a5,3 + 1a30: 0ff77713 andi a4,a4,255 + 1a34: 9736 add a4,a4,a3 + 1a36: 07400593 li a1,116 + 1a3a: f0b706a3 sb a1,-243(a4) + 1a3e: 94c1d683 lhu a3,-1716(gp) # 2000033c + 1a42: 4729 li a4,10 + 1a44: 0390 addi a2,sp,448 + 1a46: 02e6d6b3 divu a3,a3,a4 + 1a4a: 00478713 addi a4,a5,4 + 1a4e: 0ff77713 andi a4,a4,255 + 1a52: 9732 add a4,a4,a2 + 1a54: 84aa mv s1,a0 + 1a56: 01069613 slli a2,a3,0x10 + 1a5a: 8641 srai a2,a2,0x10 + 1a5c: 8621 srai a2,a2,0x8 + 1a5e: f0c706a3 sb a2,-243(a4) + 1a62: 00578713 addi a4,a5,5 + 1a66: 0390 addi a2,sp,448 + 1a68: 0ff77713 andi a4,a4,255 + 1a6c: 9732 add a4,a4,a2 + 1a6e: f0d706a3 sb a3,-243(a4) + 1a72: 00678713 addi a4,a5,6 + 1a76: 0ff77713 andi a4,a4,255 + 1a7a: 86b2 mv a3,a2 + 1a7c: 9732 add a4,a4,a2 + 1a7e: 4609 li a2,2 + 1a80: f0c706a3 sb a2,-243(a4) + 1a84: 00778713 addi a4,a5,7 + 1a88: 0ff77713 andi a4,a4,255 + 1a8c: 9736 add a4,a4,a3 + 1a8e: f0b706a3 sb a1,-243(a4) + 1a92: 00878713 addi a4,a5,8 + 1a96: 0ff77713 andi a4,a4,255 + 1a9a: 9736 add a4,a4,a3 + 1a9c: 469d li a3,7 + 1a9e: f0d706a3 sb a3,-243(a4) + 1aa2: 00a78713 addi a4,a5,10 + 1aa6: 00978693 addi a3,a5,9 + 1aaa: 038c addi a1,sp,448 + 1aac: 0ff77713 andi a4,a4,255 + 1ab0: 0ff6f693 andi a3,a3,255 + 1ab4: 96ae add a3,a3,a1 + 1ab6: 0ce10623 sb a4,204(sp) + 1aba: fb500593 li a1,-75 + 1abe: f0b686a3 sb a1,-243(a3) + 1ac2: 0bc42683 lw a3,188(s0) + 1ac6: 0ab6c683 lbu a3,171(a3) + 1aca: c6a5 beqz a3,1b32 + 1acc: 0394 addi a3,sp,448 + 1ace: 9736 add a4,a4,a3 + 1ad0: f0c706a3 sb a2,-243(a4) + 1ad4: 00b78713 addi a4,a5,11 + 1ad8: 0ff77713 andi a4,a4,255 + 1adc: 9736 add a4,a4,a3 + 1ade: f12706a3 sb s2,-243(a4) + 1ae2: 00c78713 addi a4,a5,12 + 1ae6: 0ff77713 andi a4,a4,255 + 1aea: 9736 add a4,a4,a3 + 1aec: 46ed li a3,27 + 1aee: f0d706a3 sb a3,-243(a4) + 1af2: 00e78713 addi a4,a5,14 + 1af6: 07b5 addi a5,a5,13 + 1af8: 0ff77713 andi a4,a4,255 + 1afc: 0394 addi a3,sp,448 + 1afe: 0ff7f793 andi a5,a5,255 + 1b02: 0ce10623 sb a4,204(sp) + 1b06: 97b6 add a5,a5,a3 + 1b08: 46f9 li a3,30 + 1b0a: f0d786a3 sb a3,-243(a5) + 1b0e: 200007b7 lui a5,0x20000 + 1b12: 38c78793 addi a5,a5,908 # 2000038c + 1b16: 01b4 addi a3,sp,200 + 1b18: 0715 addi a4,a4,5 + 1b1a: 9736 add a4,a4,a3 + 1b1c: 57f0 lw a2,108(a5) + 1b1e: 5bb4 lw a3,112(a5) + 1b20: 57ac lw a1,104(a5) + 1b22: 4505 li a0,1 + 1b24: 6ee050ef jal ra,7212 + 1b28: 0cc14783 lbu a5,204(sp) + 1b2c: 07ad addi a5,a5,11 + 1b2e: 0cf10623 sb a5,204(sp) + 1b32: 0bc42503 lw a0,188(s0) + 1b36: 01ac addi a1,sp,200 + 1b38: e0aff0ef jal ra,1142 + 1b3c: 0000c537 lui a0,0xc + 1b40: 85a6 mv a1,s1 + 1b42: a5050513 addi a0,a0,-1456 # ba50 <_exit+0x5f8> + 1b46: 080080ef jal ra,9bc6 + 1b4a: b3f9 j 1918 + 1b4c: 6be070ef jal ra,920a + 1b50: c5aa sw a0,200(sp) + 1b52: 6b8070ef jal ra,920a + 1b56: 81c1a783 lw a5,-2020(gp) # 2000020c + 1b5a: 94c18713 addi a4,gp,-1716 # 2000033c + 1b5e: 8d1d sub a0,a0,a5 + 1b60: cb48 sw a0,20(a4) + 1b62: 03400613 li a2,52 + 1b66: 94c18593 addi a1,gp,-1716 # 2000033c + 1b6a: 0cd10513 addi a0,sp,205 + 1b6e: 00072823 sw zero,16(a4) + 1b72: 5e1070ef jal ra,9952 + 1b76: 0bc42503 lw a0,188(s0) + 1b7a: 03400793 li a5,52 + 1b7e: 01ac addi a1,sp,200 + 1b80: 0cf10623 sb a5,204(sp) + 1b84: dbeff0ef jal ra,1142 + 1b88: bb41 j 1918 + 1b8a: 4711 li a4,4 + 1b8c: 02e79d63 bne a5,a4,1bc6 + 1b90: 2078 lbu a4,6(s0) + 1b92: 305c lbu a5,5(s0) + 1b94: 2050 lbu a2,4(s0) + 1b96: 0722 slli a4,a4,0x8 + 1b98: 8f5d or a4,a4,a5 + 1b9a: 307c lbu a5,7(s0) + 1b9c: 1671 addi a2,a2,-4 + 1b9e: 0ff67613 andi a2,a2,255 + 1ba2: 07c2 slli a5,a5,0x10 + 1ba4: 8f5d or a4,a4,a5 + 1ba6: 241c lbu a5,8(s0) + 1ba8: 00940593 addi a1,s0,9 + 1bac: 0cd10513 addi a0,sp,205 + 1bb0: 07e2 slli a5,a5,0x18 + 1bb2: 8fd9 or a5,a5,a4 + 1bb4: c5be sw a5,200(sp) + 1bb6: 0cc10623 sb a2,204(sp) + 1bba: 599070ef jal ra,9952 + 1bbe: 01a8 addi a0,sp,200 + 1bc0: eaeff0ef jal ra,126e + 1bc4: bb91 j 1918 + 1bc6: 4721 li a4,8 + 1bc8: d4e798e3 bne a5,a4,1918 + 1bcc: 2078 lbu a4,6(s0) + 1bce: 305c lbu a5,5(s0) + 1bd0: 0bc42483 lw s1,188(s0) + 1bd4: 0722 slli a4,a4,0x8 + 1bd6: 8f5d or a4,a4,a5 + 1bd8: 307c lbu a5,7(s0) + 1bda: 00a40593 addi a1,s0,10 + 1bde: 0ce10513 addi a0,sp,206 + 1be2: 07c2 slli a5,a5,0x10 + 1be4: 8f5d or a4,a4,a5 + 1be6: 241c lbu a5,8(s0) + 1be8: 07e2 slli a5,a5,0x18 + 1bea: 8fd9 or a5,a5,a4 + 1bec: c5be sw a5,200(sp) + 1bee: 0af4a623 sw a5,172(s1) + 1bf2: 341c lbu a5,9(s0) + 1bf4: 2050 lbu a2,4(s0) + 1bf6: 0037f713 andi a4,a5,3 + 1bfa: 166d addi a2,a2,-5 + 1bfc: 8389 srli a5,a5,0x2 + 1bfe: 0cf10623 sb a5,204(sp) + 1c02: 0ce106a3 sb a4,205(sp) + 1c06: 54d070ef jal ra,9952 + 1c0a: 0c442783 lw a5,196(s0) + 1c0e: 239c lbu a5,0(a5) + 1c10: 8b89 andi a5,a5,2 + 1c12: e791 bnez a5,1c1e + 1c14: 0c042583 lw a1,192(s0) + 1c18: 8526 mv a0,s1 + 1c1a: e96ff0ef jal ra,12b0 + 1c1e: 0cc14683 lbu a3,204(sp) + 1c22: 4785 li a5,1 + 1c24: 04f68363 beq a3,a5,1c6a + 1c28: c29d beqz a3,1c4e + 1c2a: 4789 li a5,2 + 1c2c: 04f68a63 beq a3,a5,1c80 + 1c30: 0000c637 lui a2,0xc + 1c34: 0000b5b7 lui a1,0xb + 1c38: 0000c537 lui a0,0xc + 1c3c: f8460613 addi a2,a2,-124 # bf84 <_exit+0xb2c> + 1c40: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 1c44: b0c50513 addi a0,a0,-1268 # bb0c <_exit+0x6b4> + 1c48: 77f070ef jal ra,9bc6 + 1c4c: b1f1 j 1918 + 1c4e: 46ae lw a3,200(sp) + 1c50: 0cd14603 lbu a2,205(sp) + 1c54: 0bc42583 lw a1,188(s0) + 1c58: 0000c537 lui a0,0xc + 1c5c: 0ce10713 addi a4,sp,206 + 1c60: a8450513 addi a0,a0,-1404 # ba84 <_exit+0x62c> + 1c64: 763070ef jal ra,9bc6 + 1c68: b945 j 1918 + 1c6a: 0bc42583 lw a1,188(s0) + 1c6e: 0ab5c783 lbu a5,171(a1) + 1c72: ca0783e3 beqz a5,1918 + 1c76: 0ce10513 addi a0,sp,206 + 1c7a: e62ff0ef jal ra,12dc + 1c7e: b969 j 1918 + 1c80: 0ce15783 lhu a5,206(sp) + 1c84: 0068 addi a0,sp,12 + 1c86: 867c sh a5,12(sp) + 1c88: 0d015783 lhu a5,208(sp) + 1c8c: 877c sh a5,14(sp) + 1c8e: 63c050ef jal ra,72ca + 1c92: 472e lw a4,200(sp) + 1c94: 0cd14683 lbu a3,205(sp) + 1c98: 0bc42583 lw a1,188(s0) + 1c9c: 862a mv a2,a0 + 1c9e: 0000c537 lui a0,0xc + 1ca2: 0d210793 addi a5,sp,210 + 1ca6: abc50513 addi a0,a0,-1348 # babc <_exit+0x664> + 1caa: 71d070ef jal ra,9bc6 + 1cae: b1ad j 1918 + +00001cb0 : + 1cb0: d26fe2ef jal t0,1d6 <__riscv_save_4> + 1cb4: 7155 addi sp,sp,-208 + 1cb6: 842a mv s0,a0 + 1cb8: 0bc00613 li a2,188 + 1cbc: 4581 li a1,0 + 1cbe: 0068 addi a0,sp,12 + 1cc0: d60fe0ef jal ra,220 + 1cc4: 00540793 addi a5,s0,5 + 1cc8: 4478 lw a4,76(s0) + 1cca: c5be sw a5,200(sp) + 1ccc: 201c lbu a5,0(s0) + 1cce: c43a sw a4,8(sp) + 1cd0: 20000737 lui a4,0x20000 + 1cd4: 03c7f793 andi a5,a5,60 + 1cd8: 0cf100a3 sb a5,193(sp) + 1cdc: 3b074703 lbu a4,944(a4) # 200003b0 + 1ce0: 04c44783 lbu a5,76(s0) + 1ce4: c7a2 sw s0,204(sp) + 1ce6: 04d44683 lbu a3,77(s0) + 1cea: 04f71263 bne a4,a5,1d2e + 1cee: 0000c937 lui s2,0xc + 1cf2: 0000b9b7 lui s3,0xb + 1cf6: 0000c537 lui a0,0xc + 1cfa: f8490613 addi a2,s2,-124 # bf84 <_exit+0xb2c> + 1cfe: 4ec98593 addi a1,s3,1260 # b4ec <_exit+0x94> + 1d02: 93850513 addi a0,a0,-1736 # b938 <_exit+0x4e0> + 1d06: 6c1070ef jal ra,9bc6 + 1d0a: 8488 lbu a0,9(sp) + 1d0c: 586050ef jal ra,7292 + 1d10: c3aa sw a0,196(sp) + 1d12: 84aa mv s1,a0 + 1d14: e105 bnez a0,1d34 + 1d16: 0000b5b7 lui a1,0xb + 1d1a: 0000c537 lui a0,0xc + 1d1e: f8490613 addi a2,s2,-124 + 1d22: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 1d26: 96c50513 addi a0,a0,-1684 # b96c <_exit+0x514> + 1d2a: 69d070ef jal ra,9bc6 + 1d2e: 6169 addi sp,sp,208 + 1d30: cdafe06f j 20a <__riscv_restore_4> + 1d34: 4d6070ef jal ra,920a + 1d38: 200007b7 lui a5,0x20000 + 1d3c: 5d078793 addi a5,a5,1488 # 200005d0 + 1d40: 40f487b3 sub a5,s1,a5 + 1d44: e9bd36b7 lui a3,0xe9bd3 + 1d48: 878d srai a5,a5,0x3 + 1d4a: 7a768693 addi a3,a3,1959 # e9bd37a7 <_eusrstack+0xc9bcb7a7> + 1d4e: 02d786b3 mul a3,a5,a3 + 1d52: 0aa4a823 sw a0,176(s1) + 1d56: 0000c537 lui a0,0xc + 1d5a: f8490613 addi a2,s2,-124 + 1d5e: 4ec98593 addi a1,s3,1260 + 1d62: 98850513 addi a0,a0,-1656 # b988 <_exit+0x530> + 1d66: 661070ef jal ra,9bc6 + 1d6a: 4434 lw a3,72(s0) + 1d6c: 00d10713 addi a4,sp,13 + 1d70: 04e40613 addi a2,s0,78 + 1d74: 16f9 addi a3,a3,-2 + 1d76: 02000593 li a1,32 + 1d7a: 04048513 addi a0,s1,64 + 1d7e: 2d9000ef jal ra,2856 + 1d82: cd05 beqz a0,1dba + 1d84: 0000b5b7 lui a1,0xb + 1d88: 0000c537 lui a0,0xc + 1d8c: 86a6 mv a3,s1 + 1d8e: f8490613 addi a2,s2,-124 + 1d92: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 1d96: 9ac50513 addi a0,a0,-1620 # b9ac <_exit+0x554> + 1d9a: 62d070ef jal ra,9bc6 + 1d9e: 0c114583 lbu a1,193(sp) + 1da2: 0000c537 lui a0,0xc + 1da6: a0c50513 addi a0,a0,-1524 # ba0c <_exit+0x5b4> + 1daa: 61d070ef jal ra,9bc6 + 1dae: 861c lbu a5,12(sp) + 1db0: dfbd beqz a5,1d2e + 1db2: 0028 addi a0,sp,8 + 1db4: ab5ff0ef jal ra,1868 + 1db8: bf9d j 1d2e + 1dba: 4438 lw a4,72(s0) + 1dbc: 0000c537 lui a0,0xc + 1dc0: f8490613 addi a2,s2,-124 + 1dc4: 1779 addi a4,a4,-2 + 1dc6: 0ff77713 andi a4,a4,255 + 1dca: 4ec98593 addi a1,s3,1260 + 1dce: 86a6 mv a3,s1 + 1dd0: 9dc50513 addi a0,a0,-1572 # b9dc <_exit+0x584> + 1dd4: 8658 sb a4,12(sp) + 1dd6: 5f1070ef jal ra,9bc6 + 1dda: 01210513 addi a0,sp,18 + 1dde: 168080ef jal ra,9f46 + 1de2: 00550593 addi a1,a0,5 + 1de6: 02048613 addi a2,s1,32 + 1dea: 0ff5f593 andi a1,a1,255 + 1dee: 00d10513 addi a0,sp,13 + 1df2: efafe0ef jal ra,4ec + 1df6: b765 j 1d9e + +00001df8 : + 1df8: bdefe2ef jal t0,1d6 <__riscv_save_4> + 1dfc: 7145 addi sp,sp,-464 + 1dfe: 00154903 lbu s2,1(a0) + 1e02: 84aa mv s1,a0 + 1e04: 406070ef jal ra,920a + 1e08: 03800713 li a4,56 + 1e0c: 02e90733 mul a4,s2,a4 + 1e10: 47d5 li a5,21 + 1e12: 20000437 lui s0,0x20000 + 1e16: 0cf10623 sb a5,204(sp) + 1e1a: 38c40793 addi a5,s0,908 # 2000038c + 1e1e: 00948593 addi a1,s1,9 + 1e22: cc2a sw a0,24(sp) + 1e24: 89aa mv s3,a0 + 1e26: 852e mv a0,a1 + 1e28: c62e sw a1,12(sp) + 1e2a: 97ba add a5,a5,a4 + 1e2c: 0b47c783 lbu a5,180(a5) + 1e30: 0c0108a3 sb zero,209(sp) + 1e34: 00010e23 sb zero,28(sp) + 1e38: 10f10c23 sb a5,280(sp) + 1e3c: 10a080ef jal ra,9f46 + 1e40: 00550713 addi a4,a0,5 + 1e44: 0b400793 li a5,180 + 1e48: 38c40413 addi s0,s0,908 + 1e4c: 45b2 lw a1,12(sp) + 1e4e: 0af00493 li s1,175 + 1e52: 00e7e363 bltu a5,a4,1e58 + 1e56: 84aa mv s1,a0 + 1e58: 8626 mv a2,s1 + 1e5a: 01d10513 addi a0,sp,29 + 1e5e: 2f5070ef jal ra,9952 + 1e62: 0495 addi s1,s1,5 + 1e64: 0000c537 lui a0,0xc + 1e68: 8626 mv a2,s1 + 1e6a: 082c addi a1,sp,24 + 1e6c: 0d450513 addi a0,a0,212 # c0d4 <_exit+0xc7c> + 1e70: d72fe0ef jal ra,3e2 + 1e74: 03800793 li a5,56 + 1e78: 02f90933 mul s2,s2,a5 + 1e7c: 11910713 addi a4,sp,281 + 1e80: 0830 addi a2,sp,24 + 1e82: 085c addi a5,sp,20 + 1e84: 86a6 mv a3,s1 + 1e86: 45c1 li a1,16 + 1e88: ca02 sw zero,20(sp) + 1e8a: 0a490513 addi a0,s2,164 + 1e8e: 9522 add a0,a0,s0 + 1e90: 12d000ef jal ra,27bc + 1e94: 47d2 lw a5,20(sp) + 1e96: 944a add s0,s0,s2 + 1e98: 01e8 addi a0,sp,204 + 1e9a: 0785 addi a5,a5,1 + 1e9c: 0b342c23 sw s3,184(s0) + 1ea0: 10f12a23 sw a5,276(sp) + 1ea4: 2bdd jal 249a + 1ea6: 6179 addi sp,sp,464 + 1ea8: b62fe06f j 20a <__riscv_restore_4> + +00001eac : + 1eac: b44fe2ef jal t0,1f0 <__riscv_save_0> + 1eb0: 7155 addi sp,sp,-208 + 1eb2: 842e mv s0,a1 + 1eb4: 200005b7 lui a1,0x20000 + 1eb8: 84aa mv s1,a0 + 1eba: 3d158593 addi a1,a1,977 # 200003d1 + 1ebe: 01110513 addi a0,sp,17 + 1ec2: 074080ef jal ra,9f36 + 1ec6: 0000c5b7 lui a1,0xc + 1eca: 82058593 addi a1,a1,-2016 # b820 <_exit+0x3c8> + 1ece: 01110513 addi a0,sp,17 + 1ed2: 046080ef jal ra,9f18 + 1ed6: 85a6 mv a1,s1 + 1ed8: 01110513 addi a0,sp,17 + 1edc: 03c080ef jal ra,9f18 + 1ee0: 0028 addi a0,sp,8 + 1ee2: 84c0 sb s0,9(sp) + 1ee4: 3f11 jal 1df8 + 1ee6: 6169 addi sp,sp,208 + 1ee8: b2cfe06f j 214 <__riscv_restore_0> + +00001eec : + 1eec: aeafe2ef jal t0,1d6 <__riscv_save_4> + 1ef0: 7109 addi sp,sp,-384 + 1ef2: 842a mv s0,a0 + 1ef4: 0c800613 li a2,200 + 1ef8: 4581 li a1,0 + 1efa: 1928 addi a0,sp,184 + 1efc: b24fe0ef jal ra,220 + 1f00: 201c lbu a5,0(s0) + 1f02: 4751 li a4,20 + 1f04: 03c7f793 andi a5,a5,60 + 1f08: 02e78363 beq a5,a4,1f2e + 1f0c: 0000c637 lui a2,0xc + 1f10: 0000b5b7 lui a1,0xb + 1f14: 0000c537 lui a0,0xc + 1f18: 03460613 addi a2,a2,52 # c034 <_exit+0xbdc> + 1f1c: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 1f20: 04450513 addi a0,a0,68 # c044 <_exit+0xbec> + 1f24: 4a3070ef jal ra,9bc6 + 1f28: 6119 addi sp,sp,384 + 1f2a: ae0fe06f j 20a <__riscv_restore_4> + 1f2e: 04c44783 lbu a5,76(s0) + 1f32: 4481 li s1,0 + 1f34: 04d40b13 addi s6,s0,77 + 1f38: 0af10c23 sb a5,184(sp) + 1f3c: 0000cab7 lui s5,0xc + 1f40: 0000ba37 lui s4,0xb + 1f44: 0000c9b7 lui s3,0xc + 1f48: 0b814503 lbu a0,184(sp) + 1f4c: 85a6 mv a1,s1 + 1f4e: 3b8050ef jal ra,7306 + 1f52: 892a mv s2,a0 + 1f54: e115 bnez a0,1f78 + 1f56: 0b814683 lbu a3,184(sp) + 1f5a: 0000c637 lui a2,0xc + 1f5e: 0000b5b7 lui a1,0xb + 1f62: 0000c537 lui a0,0xc + 1f66: 03460613 addi a2,a2,52 # c034 <_exit+0xbdc> + 1f6a: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 1f6e: 06050513 addi a0,a0,96 # c060 <_exit+0xc08> + 1f72: 455070ef jal ra,9bc6 + 1f76: bf4d j 1f28 + 1f78: 4434 lw a3,72(s0) + 1f7a: 870a mv a4,sp + 1f7c: 865a mv a2,s6 + 1f7e: 16fd addi a3,a3,-1 + 1f80: 45c1 li a1,16 + 1f82: 02050513 addi a0,a0,32 + 1f86: 0d1000ef jal ra,2856 + 1f8a: cd19 beqz a0,1fa8 + 1f8c: 0b814683 lbu a3,184(sp) + 1f90: 034a8613 addi a2,s5,52 # c034 <_exit+0xbdc> + 1f94: 494a0593 addi a1,s4,1172 # b494 <_exit+0x3c> + 1f98: 08898513 addi a0,s3,136 # c088 <_exit+0xc30> + 1f9c: 0485 addi s1,s1,1 + 1f9e: 429070ef jal ra,9bc6 + 1fa2: 0ff4f493 andi s1,s1,255 + 1fa6: b74d j 1f48 + 1fa8: 4782 lw a5,0(sp) + 1faa: 4430 lw a2,72(s0) + 1fac: 00510593 addi a1,sp,5 + 1fb0: df3e sw a5,188(sp) + 1fb2: 167d addi a2,a2,-1 + 1fb4: 821c lbu a5,4(sp) + 1fb6: 0ff67613 andi a2,a2,255 + 1fba: 166d addi a2,a2,-5 + 1fbc: 0c110513 addi a0,sp,193 + 1fc0: 0cf10023 sb a5,192(sp) + 1fc4: 18f070ef jal ra,9952 + 1fc8: 242070ef jal ra,920a + 1fcc: 02a92a23 sw a0,52(s2) + 1fd0: 0000c537 lui a0,0xc + 1fd4: 0c110613 addi a2,sp,193 + 1fd8: 85ca mv a1,s2 + 1fda: 0b450513 addi a0,a0,180 # c0b4 <_exit+0xc5c> + 1fde: 3e9070ef jal ra,9bc6 + 1fe2: b799 j 1f28 + +00001fe4 : + 1fe4: a0cfe2ef jal t0,1f0 <__riscv_save_0> + 1fe8: 842a mv s0,a0 + 1fea: 2c41 jal 227a + 1fec: 2014 lbu a3,0(s0) + 1fee: 0000c4b7 lui s1,0xc + 1ff2: 0c06f793 andi a5,a3,192 + 1ff6: cf91 beqz a5,2012 + 1ff8: 0000b5b7 lui a1,0xb + 1ffc: 0000c537 lui a0,0xc + 2000: 8299 srli a3,a3,0x6 + 2002: 0e048613 addi a2,s1,224 # c0e0 <_exit+0xc88> + 2006: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 200a: 0ec50513 addi a0,a0,236 # c0ec <_exit+0xc94> + 200e: 3b9070ef jal ra,9bc6 + 2012: 94c18693 addi a3,gp,-1716 # 2000033c + 2016: 4690 lw a2,8(a3) + 2018: 2018 lbu a4,0(s0) + 201a: 94c18793 addi a5,gp,-1716 # 2000033c + 201e: 00160513 addi a0,a2,1 + 2022: c688 sw a0,8(a3) + 2024: 00277693 andi a3,a4,2 + 2028: 03c77593 andi a1,a4,60 + 202c: e6cd bnez a3,20d6 + 202e: 5394 lw a3,32(a5) + 2030: 0685 addi a3,a3,1 + 2032: d394 sw a3,32(a5) + 2034: 46f1 li a3,28 + 2036: 02d59363 bne a1,a3,205c + 203a: 8522 mv a0,s0 + 203c: aa1fe0ef jal ra,adc + 2040: 0000b5b7 lui a1,0xb + 2044: 0000c537 lui a0,0xc + 2048: 0e048613 addi a2,s1,224 + 204c: 66058593 addi a1,a1,1632 # b660 <_exit+0x208> + 2050: 13850513 addi a0,a0,312 # c138 <_exit+0xce0> + 2054: 373070ef jal ra,9bc6 + 2058: 9bcfe06f j 214 <__riscv_restore_0> + 205c: 02000693 li a3,32 + 2060: 00d58863 beq a1,a3,2070 + 2064: 03877713 andi a4,a4,56 + 2068: c701 beqz a4,2070 + 206a: 4721 li a4,8 + 206c: 00e59c63 bne a1,a4,2084 + 2070: 0000c537 lui a0,0xc + 2074: 12450513 addi a0,a0,292 # c124 <_exit+0xccc> + 2078: 34f070ef jal ra,9bc6 + 207c: 8522 mv a0,s0 + 207e: c33ff0ef jal ra,1cb0 + 2082: bf7d j 2040 + 2084: 4731 li a4,12 + 2086: fae58de3 beq a1,a4,2040 + 208a: 4741 li a4,16 + 208c: 00e59663 bne a1,a4,2098 + 2090: 8522 mv a0,s0 + 2092: f56fe0ef jal ra,7e8 + 2096: b76d j 2040 + 2098: fec58713 addi a4,a1,-20 + 209c: 0f877713 andi a4,a4,248 + 20a0: e701 bnez a4,20a8 + 20a2: 8522 mv a0,s0 + 20a4: 35a1 jal 1eec + 20a6: bf69 j 2040 + 20a8: fdc58713 addi a4,a1,-36 + 20ac: 0f877713 andi a4,a4,248 + 20b0: db41 beqz a4,2040 + 20b2: 02c00713 li a4,44 + 20b6: 00e59a63 bne a1,a4,20ca + 20ba: 305c lbu a5,5(s0) + 20bc: e781 bnez a5,20c4 + 20be: 8522 mv a0,s0 + 20c0: d9dfe0ef jal ra,e5c + 20c4: 57fd li a5,-1 + 20c6: a01c sb a5,0(s0) + 20c8: bfa5 j 2040 + 20ca: 03c00713 li a4,60 + 20ce: f6e589e3 beq a1,a4,2040 + 20d2: c790 sw a2,8(a5) + 20d4: b7b5 j 2040 + 20d6: 53d4 lw a3,36(a5) + 20d8: 0685 addi a3,a3,1 + 20da: d3d4 sw a3,36(a5) + 20dc: bfa1 j 2034 + +000020de : + 20de: 8eafe2ef jal t0,1c8 <__riscv_save_10> + 20e2: 1141 addi sp,sp,-16 + 20e4: 84aa mv s1,a0 + 20e6: 842e mv s0,a1 + 20e8: 8932 mv s2,a2 + 20ea: 89b6 mv s3,a3 + 20ec: 6c8060ef jal ra,87b4 + 20f0: 8909 andi a0,a0,2 + 20f2: 18050263 beqz a0,2276 + 20f6: 3ff00513 li a0,1023 + 20fa: 34a060ef jal ra,8444 + 20fe: 00b10513 addi a0,sp,11 + 2102: 00a10593 addi a1,sp,10 + 2106: 00010523 sb zero,10(sp) + 210a: 000105a3 sb zero,11(sp) + 210e: 6c4060ef jal ra,87d2 + 2112: 859c lbu a5,11(sp) + 2114: 4501 li a0,0 + 2116: 10078163 beqz a5,2218 + 211a: 864e mv a2,s3 + 211c: 85ca mv a1,s2 + 211e: 8522 mv a0,s0 + 2120: 3ce060ef jal ra,84ee + 2124: 10400613 li a2,260 + 2128: 4581 li a1,0 + 212a: 8526 mv a0,s1 + 212c: 8f4fe0ef jal ra,220 + 2130: 0000c5b7 lui a1,0xc + 2134: 6505 lui a0,0x1 + 2136: 4605 li a2,1 + 2138: 29458593 addi a1,a1,660 # c294 <_exit+0xe3c> + 213c: 38850513 addi a0,a0,904 # 1388 + 2140: 283050ef jal ra,7bc2 + 2144: 47f9 li a5,30 + 2146: 865c sb a5,12(sp) + 2148: 851c lbu a5,10(sp) + 214a: 40011537 lui a0,0x40011 + 214e: 4601 li a2,0 + 2150: 45c1 li a1,16 + 2152: 80050513 addi a0,a0,-2048 # 40010800 <_eusrstack+0x20008800> + 2156: 6ab1 lui s5,0xc + 2158: 86dc sb a5,13(sp) + 215a: 00010723 sb zero,14(sp) + 215e: 4901 li s2,0 + 2160: 561060ef jal ra,8ec0 + 2164: 4401 li s0,0 + 2166: 4a01 li s4,0 + 2168: 4c81 li s9,0 + 216a: 4981 li s3,0 + 216c: 4c11 li s8,4 + 216e: 154a8a93 addi s5,s5,340 # c154 <_exit+0xcfc> + 2172: 04000b13 li s6,64 + 2176: 081c addi a5,sp,16 + 2178: 97ca add a5,a5,s2 + 217a: ffc7cd03 lbu s10,-4(a5) + 217e: 4b8d li s7,3 + 2180: a031 j 218c + 2182: 4789 li a5,2 + 2184: 0ff00d13 li s10,255 + 2188: ff27f7e3 bgeu a5,s2,2176 + 218c: 4589 li a1,2 + 218e: 40013537 lui a0,0x40013 + 2192: 1e0070ef jal ra,9372 + 2196: d97d beqz a0,218c + 2198: 85ea mv a1,s10 + 219a: 40013537 lui a0,0x40013 + 219e: 1cc070ef jal ra,936a + 21a2: 4585 li a1,1 + 21a4: 40013537 lui a0,0x40013 + 21a8: 1ca070ef jal ra,9372 + 21ac: d97d beqz a0,21a2 + 21ae: 40013537 lui a0,0x40013 + 21b2: 1bc070ef jal ra,936e + 21b6: 4789 li a5,2 + 21b8: 0327f363 bgeu a5,s2,21de + 21bc: 0ff57513 andi a0,a0,255 + 21c0: 008c6f63 bltu s8,s0,21de + 21c4: 00241793 slli a5,s0,0x2 + 21c8: 97d6 add a5,a5,s5 + 21ca: 439c lw a5,0(a5) + 21cc: 8782 jr a5 + 21ce: a088 sb a0,0(s1) + 21d0: 890d andi a0,a0,3 + 21d2: 4405 li s0,1 + 21d4: 01750563 beq a0,s7,21de + 21d8: 00a03433 snez s0,a0 + 21dc: 0405 addi s0,s0,1 + 21de: 859c lbu a5,11(sp) + 21e0: 0905 addi s2,s2,1 + 21e2: 0942 slli s2,s2,0x10 + 21e4: 01095913 srli s2,s2,0x10 + 21e8: 078d addi a5,a5,3 + 21ea: f8f96ce3 bltu s2,a5,2182 + 21ee: 40011537 lui a0,0x40011 + 21f2: 4605 li a2,1 + 21f4: 45c1 li a1,16 + 21f6: 80050513 addi a0,a0,-2048 # 40010800 <_eusrstack+0x20008800> + 21fa: 0534a423 sw s3,72(s1) + 21fe: 4c3060ef jal ra,8ec0 + 2202: 0000c5b7 lui a1,0xc + 2206: 6505 lui a0,0x1 + 2208: 4601 li a2,0 + 220a: 2a858593 addi a1,a1,680 # c2a8 <_exit+0xe50> + 220e: 38850513 addi a0,a0,904 # 1388 + 2212: 1b1050ef jal ra,7bc2 + 2216: 8588 lbu a0,11(sp) + 2218: 0141 addi sp,sp,16 + 221a: fe7fd06f j 200 <__riscv_restore_10> + 221e: 001a0793 addi a5,s4,1 + 2222: 9a26 add s4,s4,s1 + 2224: 00aa00a3 sb a0,1(s4) + 2228: 0ff7fa13 andi s4,a5,255 + 222c: fb4bf9e3 bgeu s7,s4,21de + 2230: 4409 li s0,2 + 2232: b775 j 21de + 2234: b0c8 sb a0,5(s1) + 2236: 00ab7763 bgeu s6,a0,2244 + 223a: 016482a3 sb s6,5(s1) + 223e: 440d li s0,3 + 2240: 4c81 li s9,0 + 2242: bf71 j 21de + 2244: 4c81 li s9,0 + 2246: fd65 bnez a0,223e + 2248: 4411 li s0,4 + 224a: bf51 j 21de + 224c: 001c8713 addi a4,s9,1 + 2250: 9ca6 add s9,s9,s1 + 2252: 00ac8323 sb a0,6(s9) + 2256: 30dc lbu a5,5(s1) + 2258: 0ff77c93 andi s9,a4,255 + 225c: f8fce1e3 bltu s9,a5,21de + 2260: b7e5 j 2248 + 2262: 00198793 addi a5,s3,1 + 2266: 99a6 add s3,s3,s1 + 2268: 04a98623 sb a0,76(s3) + 226c: 01079993 slli s3,a5,0x10 + 2270: 0109d993 srli s3,s3,0x10 + 2274: b7ad j 21de + 2276: 4501 li a0,0 + 2278: b745 j 2218 + +0000227a : + 227a: f77fd2ef jal t0,1f0 <__riscv_save_0> + 227e: 211c lbu a5,0(a0) + 2280: 4709 li a4,2 + 2282: 1141 addi sp,sp,-16 + 2284: 8b8d andi a5,a5,3 + 2286: 842a mv s0,a0 + 2288: 0ae78b63 beq a5,a4,233e + 228c: 470d li a4,3 + 228e: 0ae78d63 beq a5,a4,2348 + 2292: 4705 li a4,1 + 2294: 0ae78063 beq a5,a4,2334 + 2298: 0000c537 lui a0,0xc + 229c: 2b850513 addi a0,a0,696 # c2b8 <_exit+0xe60> + 22a0: 127070ef jal ra,9bc6 + 22a4: 0000c537 lui a0,0xc + 22a8: 2ec50513 addi a0,a0,748 # c2ec <_exit+0xe94> + 22ac: 11b070ef jal ra,9bc6 + 22b0: 201c lbu a5,0(s0) + 22b2: 4761 li a4,24 + 22b4: 03c7f793 andi a5,a5,60 + 22b8: 12e78963 beq a5,a4,23ea + 22bc: 0af76963 bltu a4,a5,236e + 22c0: 4721 li a4,8 + 22c2: 10e78563 beq a5,a4,23cc + 22c6: 08f76663 bltu a4,a5,2352 + 22ca: c7ed beqz a5,23b4 + 22cc: 4711 li a4,4 + 22ce: 0ee78a63 beq a5,a4,23c2 + 22d2: 201c lbu a5,0(s0) + 22d4: 0000c537 lui a0,0xc + 22d8: 006c addi a1,sp,12 + 22da: 8399 srli a5,a5,0x6 + 22dc: 03078793 addi a5,a5,48 + 22e0: 38450513 addi a0,a0,900 # c384 <_exit+0xf2c> + 22e4: 865c sb a5,12(sp) + 22e6: 000106a3 sb zero,13(sp) + 22ea: 0dd070ef jal ra,9bc6 + 22ee: 201c lbu a5,0(s0) + 22f0: 470d li a4,3 + 22f2: 8b8d andi a5,a5,3 + 22f4: 00e78363 beq a5,a4,22fa + 22f8: eb99 bnez a5,230e + 22fa: 00345603 lhu a2,3(s0) + 22fe: 00145583 lhu a1,1(s0) + 2302: 0000c537 lui a0,0xc + 2306: 3a050513 addi a0,a0,928 # c3a0 <_exit+0xf48> + 230a: 0bd070ef jal ra,9bc6 + 230e: 304c lbu a1,5(s0) + 2310: 0000c537 lui a0,0xc + 2314: 3b850513 addi a0,a0,952 # c3b8 <_exit+0xf60> + 2318: 0af070ef jal ra,9bc6 + 231c: 4481 li s1,0 + 231e: 0000c937 lui s2,0xc + 2322: 305c lbu a5,5(s0) + 2324: 0ef4ec63 bltu s1,a5,241c + 2328: 4529 li a0,10 + 232a: 0df070ef jal ra,9c08 + 232e: 0141 addi sp,sp,16 + 2330: ee5fd06f j 214 <__riscv_restore_0> + 2334: 0000c537 lui a0,0xc + 2338: 2c850513 addi a0,a0,712 # c2c8 <_exit+0xe70> + 233c: b795 j 22a0 + 233e: 0000c537 lui a0,0xc + 2342: 2d050513 addi a0,a0,720 # c2d0 <_exit+0xe78> + 2346: bfa9 j 22a0 + 2348: 0000c537 lui a0,0xc + 234c: 2d850513 addi a0,a0,728 # c2d8 <_exit+0xe80> + 2350: bf81 j 22a0 + 2352: 4741 li a4,16 + 2354: 08e78163 beq a5,a4,23d6 + 2358: 4751 li a4,20 + 235a: 08e78363 beq a5,a4,23e0 + 235e: 4731 li a4,12 + 2360: f6e799e3 bne a5,a4,22d2 + 2364: 0000c537 lui a0,0xc + 2368: 32450513 addi a0,a0,804 # c324 <_exit+0xecc> + 236c: a881 j 23bc + 236e: 02400713 li a4,36 + 2372: 08e78663 beq a5,a4,23fe + 2376: 00f76e63 bltu a4,a5,2392 + 237a: 4771 li a4,28 + 237c: 06e78c63 beq a5,a4,23f4 + 2380: 02000713 li a4,32 + 2384: f4e797e3 bne a5,a4,22d2 + 2388: 0000c537 lui a0,0xc + 238c: 35c50513 addi a0,a0,860 # c35c <_exit+0xf04> + 2390: a035 j 23bc + 2392: 02c00713 li a4,44 + 2396: 06e78963 beq a5,a4,2408 + 239a: 03c00713 li a4,60 + 239e: 06e78a63 beq a5,a4,2412 + 23a2: 02800713 li a4,40 + 23a6: f2e796e3 bne a5,a4,22d2 + 23aa: 0000c537 lui a0,0xc + 23ae: 36c50513 addi a0,a0,876 # c36c <_exit+0xf14> + 23b2: a029 j 23bc + 23b4: 0000c537 lui a0,0xc + 23b8: 30050513 addi a0,a0,768 # c300 <_exit+0xea8> + 23bc: 00b070ef jal ra,9bc6 + 23c0: bf09 j 22d2 + 23c2: 0000c537 lui a0,0xc + 23c6: 30850513 addi a0,a0,776 # c308 <_exit+0xeb0> + 23ca: bfcd j 23bc + 23cc: 0000c537 lui a0,0xc + 23d0: 31450513 addi a0,a0,788 # c314 <_exit+0xebc> + 23d4: b7e5 j 23bc + 23d6: 0000c537 lui a0,0xc + 23da: c4c50513 addi a0,a0,-948 # bc4c <_exit+0x7f4> + 23de: bff9 j 23bc + 23e0: 0000c537 lui a0,0xc + 23e4: 33450513 addi a0,a0,820 # c334 <_exit+0xedc> + 23e8: bfd1 j 23bc + 23ea: 0000c537 lui a0,0xc + 23ee: 34050513 addi a0,a0,832 # c340 <_exit+0xee8> + 23f2: b7e9 j 23bc + 23f4: 0000c537 lui a0,0xc + 23f8: 34c50513 addi a0,a0,844 # c34c <_exit+0xef4> + 23fc: b7c1 j 23bc + 23fe: 0000c537 lui a0,0xc + 2402: 36450513 addi a0,a0,868 # c364 <_exit+0xf0c> + 2406: bf5d j 23bc + 2408: 0000c537 lui a0,0xc + 240c: 37850513 addi a0,a0,888 # c378 <_exit+0xf20> + 2410: b775 j 23bc + 2412: 0000c537 lui a0,0xc + 2416: 38050513 addi a0,a0,896 # c380 <_exit+0xf28> + 241a: b74d j 23bc + 241c: 009407b3 add a5,s0,s1 + 2420: 23f0 lbu a2,6(a5) + 2422: 85a6 mv a1,s1 + 2424: 3d090513 addi a0,s2,976 # c3d0 <_exit+0xf78> + 2428: 0485 addi s1,s1,1 + 242a: 79c070ef jal ra,9bc6 + 242e: 0ff4f493 andi s1,s1,255 + 2432: bdc5 j 2322 + +00002434 : + 2434: dbdfd2ef jal t0,1f0 <__riscv_save_0> + 2438: 7159 addi sp,sp,-112 + 243a: 842a mv s0,a0 + 243c: 0028 addi a0,sp,8 + 243e: 84ae mv s1,a1 + 2440: 23d040ef jal ra,6e7c + 2444: 4430 lw a2,72(s0) + 2446: 04c40593 addi a1,s0,76 + 244a: 0028 addi a0,sp,8 + 244c: 299040ef jal ra,6ee4 + 2450: 0028 addi a0,sp,8 + 2452: 85a6 mv a1,s1 + 2454: 3b9040ef jal ra,700c + 2458: 6165 addi sp,sp,112 + 245a: dbbfd06f j 214 <__riscv_restore_0> + +0000245e : + 245e: d93fd2ef jal t0,1f0 <__riscv_save_0> + 2462: 81818413 addi s0,gp,-2024 # 20000208 <_edata> + 2466: 2004 lbu s1,0(s0) + 2468: 02100793 li a5,33 + 246c: 02f487b3 mul a5,s1,a5 + 2470: 84418493 addi s1,gp,-1980 # 20000234 + 2474: 94be add s1,s1,a5 + 2476: 85a6 mv a1,s1 + 2478: 3f75 jal 2434 + 247a: 4785 li a5,1 + 247c: 02f48023 sb a5,32(s1) + 2480: 201c lbu a5,0(s0) + 2482: 471d li a4,7 + 2484: 0785 addi a5,a5,1 + 2486: 0ff7f793 andi a5,a5,255 + 248a: 00f76563 bltu a4,a5,2494 + 248e: a01c sb a5,0(s0) + 2490: d85fd06f j 214 <__riscv_restore_0> + 2494: 00040023 sb zero,0(s0) + 2498: bfe5 j 2490 + +0000249a : + 249a: d27fd2ef jal t0,1c0 <__riscv_save_12> + 249e: 1101 addi sp,sp,-32 + 24a0: 84aa mv s1,a0 + 24a2: 3f75 jal 245e + 24a4: 209c lbu a5,0(s1) + 24a6: 470d li a4,3 + 24a8: 4419 li s0,6 + 24aa: 8b8d andi a5,a5,3 + 24ac: 00e78463 beq a5,a4,24b4 + 24b0: c391 beqz a5,24b4 + 24b2: 4409 li s0,2 + 24b4: 30d8 lbu a4,5(s1) + 24b6: 44bc lw a5,72(s1) + 24b8: 97ba add a5,a5,a4 + 24ba: 943e add s0,s0,a5 + 24bc: 0442 slli s0,s0,0x10 + 24be: 8041 srli s0,s0,0x10 + 24c0: 0ff00793 li a5,255 + 24c4: 0287f163 bgeu a5,s0,24e6 + 24c8: 0000c637 lui a2,0xc + 24cc: 0000c5b7 lui a1,0xc + 24d0: 0000c537 lui a0,0xc + 24d4: 86a2 mv a3,s0 + 24d6: 17c60613 addi a2,a2,380 # c17c <_exit+0xd24> + 24da: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 24de: 18c50513 addi a0,a0,396 # c18c <_exit+0xd34> + 24e2: 6e4070ef jal ra,9bc6 + 24e6: 82f18783 lb a5,-2001(gp) # 2000021f + 24ea: 12079563 bnez a5,2614 + 24ee: 4785 li a5,1 + 24f0: 82f187a3 sb a5,-2001(gp) # 2000021f + 24f4: 82818793 addi a5,gp,-2008 # 20000218 + 24f8: 23b8 lbu a4,2(a5) + 24fa: e311 bnez a4,24fe + 24fc: b3a0 sb s0,3(a5) + 24fe: 4619 li a2,6 + 2500: 82818593 addi a1,gp,-2008 # 20000218 + 2504: 08c00513 li a0,140 + 2508: 279050ef jal ra,7f80 + 250c: 3ff00513 li a0,1023 + 2510: 735050ef jal ra,8444 + 2514: 0000c5b7 lui a1,0xc + 2518: 6505 lui a0,0x1 + 251a: 4605 li a2,1 + 251c: 1b058593 addi a1,a1,432 # c1b0 <_exit+0xd58> + 2520: 38850513 addi a0,a0,904 # 1388 + 2524: 69e050ef jal ra,7bc2 + 2528: 40011537 lui a0,0x40011 + 252c: 47b9 li a5,14 + 252e: 4601 li a2,0 + 2530: 45c1 li a1,16 + 2532: 80050513 addi a0,a0,-2048 # 40010800 <_eusrstack+0x20008800> + 2536: 86fc sh a5,28(sp) + 2538: 189060ef jal ra,8ec0 + 253c: 00240793 addi a5,s0,2 + 2540: 6c31 lui s8,0xc + 2542: 4981 li s3,0 + 2544: 4a81 li s5,0 + 2546: 4901 li s2,0 + 2548: 4d01 li s10,0 + 254a: 4b81 li s7,0 + 254c: 4a01 li s4,0 + 254e: c43e sw a5,8(sp) + 2550: 4d91 li s11,4 + 2552: 168c0c13 addi s8,s8,360 # c168 <_exit+0xd10> + 2556: 4c8d li s9,3 + 2558: 47a2 lw a5,8(sp) + 255a: 0cf9c563 blt s3,a5,2624 + 255e: 40011537 lui a0,0x40011 + 2562: 4605 li a2,1 + 2564: 45c1 li a1,16 + 2566: 80050513 addi a0,a0,-2048 # 40010800 <_eusrstack+0x20008800> + 256a: 157060ef jal ra,8ec0 + 256e: 6985 lui s3,0x1 + 2570: 0000c5b7 lui a1,0xc + 2574: 4601 li a2,0 + 2576: 1c458593 addi a1,a1,452 # c1c4 <_exit+0xd6c> + 257a: 38898513 addi a0,s3,904 # 1388 + 257e: 644050ef jal ra,7bc2 + 2582: 0004c803 lbu a6,0(s1) + 2586: 30d8 lbu a4,5(s1) + 2588: 44b4 lw a3,72(s1) + 258a: 0000c937 lui s2,0xc + 258e: 0000b4b7 lui s1,0xb + 2592: 0000c537 lui a0,0xc + 2596: 87a2 mv a5,s0 + 2598: 17c90613 addi a2,s2,380 # c17c <_exit+0xd24> + 259c: 66048593 addi a1,s1,1632 # b660 <_exit+0x208> + 25a0: 1d450513 addi a0,a0,468 # c1d4 <_exit+0xd7c> + 25a4: 622070ef jal ra,9bc6 + 25a8: 0000c537 lui a0,0xc + 25ac: 8722 mv a4,s0 + 25ae: 86d2 mv a3,s4 + 25b0: 17c90613 addi a2,s2,380 + 25b4: 66048593 addi a1,s1,1632 + 25b8: 21850513 addi a0,a0,536 # c218 <_exit+0xdc0> + 25bc: 60a070ef jal ra,9bc6 + 25c0: bb898513 addi a0,s3,-1096 + 25c4: 0d8060ef jal ra,869c + 25c8: 0000c537 lui a0,0xc + 25cc: 17c90613 addi a2,s2,380 + 25d0: 66048593 addi a1,s1,1632 + 25d4: 24850513 addi a0,a0,584 # c248 <_exit+0xdf0> + 25d8: 5ee070ef jal ra,9bc6 + 25dc: 1d8060ef jal ra,87b4 + 25e0: 842a mv s0,a0 + 25e2: 0000ca37 lui s4,0xc + 25e6: 20147793 andi a5,s0,513 + 25ea: 0e078b63 beqz a5,26e0 + 25ee: 0000c537 lui a0,0xc + 25f2: 17c90613 addi a2,s2,380 + 25f6: 66048593 addi a1,s1,1632 + 25fa: 27c50513 addi a0,a0,636 # c27c <_exit+0xe24> + 25fe: 5c8070ef jal ra,9bc6 + 2602: 01000537 lui a0,0x1000 + 2606: 157d addi a0,a0,-1 + 2608: 8805 andi s0,s0,1 + 260a: 820187a3 sb zero,-2001(gp) # 2000021f + 260e: 73f050ef jal ra,854c + 2612: e411 bnez s0,261e + 2614: 8301a783 lw a5,-2000(gp) # 20000220 + 2618: 0785 addi a5,a5,1 + 261a: 82f1a823 sw a5,-2000(gp) # 20000220 + 261e: 6105 addi sp,sp,32 + 2620: bddfd06f j 1fc <__riscv_restore_12> + 2624: 4785 li a5,1 + 2626: 0537e463 bltu a5,s3,266e + 262a: 101c addi a5,sp,32 + 262c: 01378733 add a4,a5,s3 + 2630: ffc74703 lbu a4,-4(a4) + 2634: 4589 li a1,2 + 2636: 40013537 lui a0,0x40013 + 263a: c63a sw a4,12(sp) + 263c: 537060ef jal ra,9372 + 2640: 4732 lw a4,12(sp) + 2642: d96d beqz a0,2634 + 2644: 85ba mv a1,a4 + 2646: 40013537 lui a0,0x40013 + 264a: 0a05 addi s4,s4,1 + 264c: 51f060ef jal ra,936a + 2650: 4585 li a1,1 + 2652: 40013537 lui a0,0x40013 + 2656: 51d060ef jal ra,9372 + 265a: d97d beqz a0,2650 + 265c: 0985 addi s3,s3,1 + 265e: 40013537 lui a0,0x40013 + 2662: 09c2 slli s3,s3,0x10 + 2664: 50b060ef jal ra,936e + 2668: 0109d993 srli s3,s3,0x10 + 266c: b5f5 j 2558 + 266e: 0ff00713 li a4,255 + 2672: fdade1e3 bltu s11,s10,2634 + 2676: 002d1713 slli a4,s10,0x2 + 267a: 9762 add a4,a4,s8 + 267c: 4318 lw a4,0(a4) + 267e: 8702 jr a4 + 2680: 2098 lbu a4,0(s1) + 2682: 00377793 andi a5,a4,3 + 2686: 01978463 beq a5,s9,268e + 268a: 4d09 li s10,2 + 268c: e391 bnez a5,2690 + 268e: 4d05 li s10,1 + 2690: 4a01 li s4,0 + 2692: b74d j 2634 + 2694: 001a8693 addi a3,s5,1 + 2698: 9aa6 add s5,s5,s1 + 269a: 001ac703 lbu a4,1(s5) + 269e: 0ff6fa93 andi s5,a3,255 + 26a2: f95cf9e3 bgeu s9,s5,2634 + 26a6: 4d09 li s10,2 + 26a8: b771 j 2634 + 26aa: 30d8 lbu a4,5(s1) + 26ac: 4901 li s2,0 + 26ae: 4d0d li s10,3 + 26b0: f351 bnez a4,2634 + 26b2: 4d11 li s10,4 + 26b4: b741 j 2634 + 26b6: 30d4 lbu a3,5(s1) + 26b8: 00190613 addi a2,s2,1 + 26bc: 9926 add s2,s2,s1 + 26be: 00694703 lbu a4,6(s2) + 26c2: 0ff67913 andi s2,a2,255 + 26c6: f6d967e3 bltu s2,a3,2634 + 26ca: b7e5 j 26b2 + 26cc: 001b8693 addi a3,s7,1 + 26d0: 9ba6 add s7,s7,s1 + 26d2: 04cbc703 lbu a4,76(s7) + 26d6: 01069b93 slli s7,a3,0x10 + 26da: 010bdb93 srli s7,s7,0x10 + 26de: bf99 j 2634 + 26e0: 4529 li a0,10 + 26e2: 585060ef jal ra,9466 + 26e6: 0ce060ef jal ra,87b4 + 26ea: 82e18783 lb a5,-2002(gp) # 2000021e + 26ee: 842a mv s0,a0 + 26f0: ee078be3 beqz a5,25e6 + 26f4: 86aa mv a3,a0 + 26f6: 17c90613 addi a2,s2,380 + 26fa: 66048593 addi a1,s1,1632 + 26fe: 264a0513 addi a0,s4,612 # c264 <_exit+0xe0c> + 2702: 4c4070ef jal ra,9bc6 + 2706: b5c5 j 25e6 + +00002708 : + 2708: acffd2ef jal t0,1d6 <__riscv_save_4> + 270c: 1101 addi sp,sp,-32 + 270e: 858a mv a1,sp + 2710: 842a mv s0,a0 + 2712: d23ff0ef jal ra,2434 + 2716: 8181c483 lbu s1,-2024(gp) # 20000208 <_edata> + 271a: 02100793 li a5,33 + 271e: 4921 li s2,8 + 2720: 02f487b3 mul a5,s1,a5 + 2724: 84418493 addi s1,gp,-1980 # 20000234 + 2728: 94be add s1,s1,a5 + 272a: 0204c983 lbu s3,32(s1) + 272e: 00098963 beqz s3,2740 + 2732: 02000613 li a2,32 + 2736: 858a mv a1,sp + 2738: 8526 mv a0,s1 + 273a: 1f4070ef jal ra,992e + 273e: c105 beqz a0,275e + 2740: 197d addi s2,s2,-1 + 2742: 0ff97913 andi s2,s2,255 + 2746: fe0914e3 bnez s2,272e + 274a: 201c lbu a5,0(s0) + 274c: 0017f713 andi a4,a5,1 + 2750: cb1d beqz a4,2786 + 2752: 0ff00713 li a4,255 + 2756: 00e79763 bne a5,a4,2764 + 275a: 3044 lbu s1,5(s0) + 275c: e88d bnez s1,278e + 275e: 6105 addi sp,sp,32 + 2760: aabfd06f j 20a <__riscv_restore_4> + 2764: 305c lbu a5,5(s0) + 2766: 03e00713 li a4,62 + 276a: 00f76e63 bltu a4,a5,2786 + 276e: 00178713 addi a4,a5,1 + 2772: b058 sb a4,5(s0) + 2774: 20000737 lui a4,0x20000 + 2778: 3b074703 lbu a4,944(a4) # 200003b0 + 277c: 97a2 add a5,a5,s0 + 277e: 8522 mv a0,s0 + 2780: a3f8 sb a4,6(a5) + 2782: d19ff0ef jal ra,249a + 2786: 201c lbu a5,0(s0) + 2788: 8b8d andi a5,a5,3 + 278a: dbf1 beqz a5,275e + 278c: b7f9 j 275a + 278e: 200007b7 lui a5,0x20000 + 2792: 2078 lbu a4,6(s0) + 2794: 3b07c783 lbu a5,944(a5) # 200003b0 + 2798: fcf713e3 bne a4,a5,275e + 279c: 14fd addi s1,s1,-1 + 279e: 0ff4f493 andi s1,s1,255 + 27a2: b044 sb s1,5(s0) + 27a4: 8626 mv a2,s1 + 27a6: 00740593 addi a1,s0,7 + 27aa: 00640513 addi a0,s0,6 + 27ae: 256070ef jal ra,9a04 + 27b2: d4d5 beqz s1,275e + 27b4: 8522 mv a0,s0 + 27b6: ce5ff0ef jal ra,249a + 27ba: b755 j 275e + +000027bc : + 27bc: cad9 beqz a3,2852 + 27be: 715d addi sp,sp,-80 + 27c0: c2a6 sw s1,68(sp) + 27c2: 00f68493 addi s1,a3,15 + 27c6: c686 sw ra,76(sp) + 27c8: c4a2 sw s0,72(sp) + 27ca: c0ca sw s2,64(sp) + 27cc: 0880 addi s0,sp,80 + 27ce: de4e sw s3,60(sp) + 27d0: dc52 sw s4,56(sp) + 27d2: da56 sw s5,52(sp) + 27d4: d85a sw s6,48(sp) + 27d6: d65e sw s7,44(sp) + 27d8: 98c1 andi s1,s1,-16 + 27da: 40910133 sub sp,sp,s1 + 27de: 8a2a mv s4,a0 + 27e0: 8bb2 mv s7,a2 + 27e2: 8b2e mv s6,a1 + 27e4: 8626 mv a2,s1 + 27e6: 4581 li a1,0 + 27e8: 850a mv a0,sp + 27ea: 8abe mv s5,a5 + 27ec: 893a mv s2,a4 + 27ee: 89b6 mv s3,a3 + 27f0: a31fd0ef jal ra,220 + 27f4: 864e mv a2,s3 + 27f6: 85de mv a1,s7 + 27f8: 850a mv a0,sp + 27fa: 158070ef jal ra,9952 + 27fe: 00290993 addi s3,s2,2 + 2802: 874e mv a4,s3 + 2804: 86a6 mv a3,s1 + 2806: 860a mv a2,sp + 2808: 45c1 li a1,16 + 280a: 8552 mv a0,s4 + 280c: 030040ef jal ra,683c + 2810: fb040713 addi a4,s0,-80 + 2814: 86a6 mv a3,s1 + 2816: 864e mv a2,s3 + 2818: 85da mv a1,s6 + 281a: 8552 mv a0,s4 + 281c: 402040ef jal ra,6c1e + 2820: fb044783 lbu a5,-80(s0) + 2824: 0489 addi s1,s1,2 + 2826: 4501 li a0,0 + 2828: 00f90023 sb a5,0(s2) + 282c: fb144783 lbu a5,-79(s0) + 2830: 00f900a3 sb a5,1(s2) + 2834: 009aa023 sw s1,0(s5) + 2838: fb040113 addi sp,s0,-80 + 283c: 40b6 lw ra,76(sp) + 283e: 4426 lw s0,72(sp) + 2840: 4496 lw s1,68(sp) + 2842: 4906 lw s2,64(sp) + 2844: 59f2 lw s3,60(sp) + 2846: 5a62 lw s4,56(sp) + 2848: 5ad2 lw s5,52(sp) + 284a: 5b42 lw s6,48(sp) + 284c: 5bb2 lw s7,44(sp) + 284e: 6161 addi sp,sp,80 + 2850: 8082 ret + 2852: 557d li a0,-1 + 2854: 8082 ret + +00002856 : + 2856: 4809 li a6,2 + 2858: 04d87663 bgeu a6,a3,28a4 + 285c: 97bfd2ef jal t0,1d6 <__riscv_save_4> + 2860: ffe68413 addi s0,a3,-2 + 2864: 00f47693 andi a3,s0,15 + 2868: 1101 addi sp,sp,-32 + 286a: 00260a13 addi s4,a2,2 + 286e: c689 beqz a3,2878 + 2870: 5579 li a0,-2 + 2872: 6105 addi sp,sp,32 + 2874: 997fd06f j 20a <__riscv_restore_4> + 2878: 84b2 mv s1,a2 + 287a: 89ba mv s3,a4 + 287c: 8652 mv a2,s4 + 287e: 870a mv a4,sp + 2880: 86a2 mv a3,s0 + 2882: 892a mv s2,a0 + 2884: 39a040ef jal ra,6c1e + 2888: 4609 li a2,2 + 288a: 858a mv a1,sp + 288c: 8526 mv a0,s1 + 288e: 0a0070ef jal ra,992e + 2892: fd79 bnez a0,2870 + 2894: 874e mv a4,s3 + 2896: 86a2 mv a3,s0 + 2898: 8652 mv a2,s4 + 289a: 45c1 li a1,16 + 289c: 854a mv a0,s2 + 289e: 7e3030ef jal ra,6880 + 28a2: bfc1 j 2872 + 28a4: 557d li a0,-1 + 28a6: 8082 ret + +000028a8 : + 28a8: 949fd2ef jal t0,1f0 <__riscv_save_0> + 28ac: 1141 addi sp,sp,-16 + 28ae: c402 sw zero,8(sp) + 28b0: 47cd li a5,19 + 28b2: 845c sb a5,8(sp) + 28b4: 0028 addi a0,sp,8 + 28b6: 4785 li a5,1 + 28b8: c63e sw a5,12(sp) + 28ba: 616060ef jal ra,8ed0 + 28be: 0141 addi sp,sp,16 + 28c0: 955fd06f j 214 <__riscv_restore_0> + +000028c4 : + 28c4: 00357793 andi a5,a0,3 + 28c8: ef99 bnez a5,28e6 + 28ca: 06400713 li a4,100 + 28ce: 02e57733 remu a4,a0,a4 + 28d2: 4785 li a5,1 + 28d4: e719 bnez a4,28e2 + 28d6: 19000793 li a5,400 + 28da: 02f57533 remu a0,a0,a5 + 28de: 00153793 seqz a5,a0 + 28e2: 853e mv a0,a5 + 28e4: 8082 ret + 28e6: 4781 li a5,0 + 28e8: bfed j 28e2 + +000028ea : + 28ea: 84e50813 addi a6,a0,-1970 # 4001284e <_eusrstack+0x2000a84e> + 28ee: 0842 slli a6,a6,0x10 + 28f0: 01085813 srli a6,a6,0x10 + 28f4: 08100893 li a7,129 + 28f8: 0d08e563 bltu a7,a6,29c2 + 28fc: 8c5fd2ef jal t0,1c0 <__riscv_save_12> + 2900: 01e13c37 lui s8,0x1e13 + 2904: 01e28cb7 lui s9,0x1e28 + 2908: 8b3e mv s6,a5 + 290a: 843a mv s0,a4 + 290c: 8ab6 mv s5,a3 + 290e: 8932 mv s2,a2 + 2910: 89ae mv s3,a1 + 2912: 8baa mv s7,a0 + 2914: 4481 li s1,0 + 2916: 7b200a13 li s4,1970 + 291a: 380c0c13 addi s8,s8,896 # 1e13380 <_data_lma+0x1e05124> + 291e: 500c8c93 addi s9,s9,1280 # 1e28500 <_data_lma+0x1e1a2a4> + 2922: 074b9663 bne s7,s4,298e + 2926: 19fd addi s3,s3,-1 + 2928: 6cb1 lui s9,0xc + 292a: 6c55 lui s8,0x15 + 292c: 4a01 li s4,0 + 292e: 0ff9f993 andi s3,s3,255 + 2932: 3e4c8c93 addi s9,s9,996 # c3e4 + 2936: 180c0c13 addi s8,s8,384 # 15180 <_data_lma+0x6f24> + 293a: 4d85 li s11,1 + 293c: 010a1d13 slli s10,s4,0x10 + 2940: 010d5d13 srli s10,s10,0x10 + 2944: 073d6063 bltu s10,s3,29a4 + 2948: 03c00713 li a4,60 + 294c: 6685 lui a3,0x1 + 294e: 02e40433 mul s0,s0,a4 + 2952: e1068693 addi a3,a3,-496 # e10 + 2956: 6655 lui a2,0x15 + 2958: 18060613 addi a2,a2,384 # 15180 <_data_lma+0x6f24> + 295c: 197d addi s2,s2,-1 + 295e: 4585 li a1,1 + 2960: 18000537 lui a0,0x18000 + 2964: 02da8ab3 mul s5,s5,a3 + 2968: 945a add s0,s0,s6 + 296a: 02c90933 mul s2,s2,a2 + 296e: 9456 add s0,s0,s5 + 2970: 7cc060ef jal ra,913c + 2974: 4505 li a0,1 + 2976: 5b6060ef jal ra,8f2c + 297a: 944a add s0,s0,s2 + 297c: 9426 add s0,s0,s1 + 297e: 8522 mv a0,s0 + 2980: 0e5060ef jal ra,9264 + 2984: 13b060ef jal ra,92be + 2988: 4501 li a0,0 + 298a: 873fd06f j 1fc <__riscv_restore_12> + 298e: 8552 mv a0,s4 + 2990: 3f15 jal 28c4 + 2992: c519 beqz a0,29a0 + 2994: 94e6 add s1,s1,s9 + 2996: 0a05 addi s4,s4,1 + 2998: 0a42 slli s4,s4,0x10 + 299a: 010a5a13 srli s4,s4,0x10 + 299e: b751 j 2922 + 29a0: 94e2 add s1,s1,s8 + 29a2: bfd5 j 2996 + 29a4: 014c87b3 add a5,s9,s4 + 29a8: 239c lbu a5,0(a5) + 29aa: 855e mv a0,s7 + 29ac: 038787b3 mul a5,a5,s8 + 29b0: 94be add s1,s1,a5 + 29b2: f13ff0ef jal ra,28c4 + 29b6: c501 beqz a0,29be + 29b8: 01bd1363 bne s10,s11,29be + 29bc: 94e2 add s1,s1,s8 + 29be: 0a05 addi s4,s4,1 + 29c0: bfb5 j 293c + 29c2: 4505 li a0,1 + 29c4: 8082 ret + +000029c6 : + 29c6: 82bfd2ef jal t0,1f0 <__riscv_save_0> + 29ca: 67b1 lui a5,0xc + 29cc: 3f078793 addi a5,a5,1008 # c3f0 + 29d0: 4581 li a1,0 + 29d2: 04a00693 li a3,74 + 29d6: 07500613 li a2,117 + 29da: 06e00513 li a0,110 + 29de: 4731 li a4,12 + 29e0: 00078803 lb a6,0(a5) + 29e4: 0585 addi a1,a1,1 + 29e6: 02d81863 bne a6,a3,2a16 + 29ea: 00178803 lb a6,1(a5) + 29ee: 02c81463 bne a6,a2,2a16 + 29f2: 00278803 lb a6,2(a5) + 29f6: 02a81063 bne a6,a0,2a16 + 29fa: 0ff5f593 andi a1,a1,255 + 29fe: 03800793 li a5,56 + 2a02: 02800713 li a4,40 + 2a06: 46d9 li a3,22 + 2a08: 4665 li a2,25 + 2a0a: 7ea00513 li a0,2026 + 2a0e: eddff0ef jal ra,28ea + 2a12: 803fd06f j 214 <__riscv_restore_0> + 2a16: 0ff5f593 andi a1,a1,255 + 2a1a: 078d addi a5,a5,3 + 2a1c: fce592e3 bne a1,a4,29e0 + 2a20: 4581 li a1,0 + 2a22: bff1 j 29fe + +00002a24 : + 2a24: 06400713 li a4,100 + 2a28: 02e577b3 remu a5,a0,a4 + 2a2c: 02e55533 divu a0,a0,a4 + 2a30: 474d li a4,19 + 2a32: 0ff57513 andi a0,a0,255 + 2a36: 00a77463 bgeu a4,a0,2a3e + 2a3a: 06478793 addi a5,a5,100 + 2a3e: 0027d513 srli a0,a5,0x2 + 2a42: 953e add a0,a0,a5 + 2a44: 471d li a4,7 + 2a46: 02e57533 remu a0,a0,a4 + 2a4a: 6731 lui a4,0xc + 2a4c: 41870713 addi a4,a4,1048 # c418 + 2a50: 972e add a4,a4,a1 + 2a52: fff74703 lbu a4,-1(a4) + 2a56: 8b8d andi a5,a5,3 + 2a58: 963a add a2,a2,a4 + 2a5a: 962a add a2,a2,a0 + 2a5c: e799 bnez a5,2a6a + 2a5e: 4789 li a5,2 + 2a60: 00b7e563 bltu a5,a1,2a6a + 2a64: 167d addi a2,a2,-1 + 2a66: 0642 slli a2,a2,0x10 + 2a68: 8241 srli a2,a2,0x10 + 2a6a: 451d li a0,7 + 2a6c: 02a67533 remu a0,a2,a0 + 2a70: 8082 ret + +00002a72 : + 2a72: f56fd2ef jal t0,1c8 <__riscv_save_10> + 2a76: 6455 lui s0,0x15 + 2a78: 792060ef jal ra,920a + 2a7c: 18040413 addi s0,s0,384 # 15180 <_data_lma+0x6f24> + 2a80: 02855433 divu s0,a0,s0 + 2a84: 82018793 addi a5,gp,-2016 # 20000210 + 2a88: 239a lhu a4,0(a5) + 2a8a: 84aa mv s1,a0 + 2a8c: 04870563 beq a4,s0,2ad6 + 2a90: a382 sh s0,0(a5) + 2a92: 7b200993 li s3,1970 + 2a96: 16c00913 li s2,364 + 2a9a: 16d00a13 li s4,365 + 2a9e: 08896063 bltu s2,s0,2b1e + 2aa2: 98018793 addi a5,gp,-1664 # 20000370 + 2aa6: 6ab1 lui s5,0xc + 2aa8: 01379223 sh s3,4(a5) + 2aac: 98018913 addi s2,gp,-1664 # 20000370 + 2ab0: 4981 li s3,0 + 2ab2: 4b6d li s6,27 + 2ab4: 3e4a8a93 addi s5,s5,996 # c3e4 + 2ab8: 4b85 li s7,1 + 2aba: 4c71 li s8,28 + 2abc: 00198a13 addi s4,s3,1 + 2ac0: 068b6f63 bltu s6,s0,2b3e + 2ac4: 0ffa7a13 andi s4,s4,255 + 2ac8: 0405 addi s0,s0,1 + 2aca: 01490323 sb s4,6(s2) + 2ace: 0ff47413 andi s0,s0,255 + 2ad2: 008903a3 sb s0,7(s2) + 2ad6: 67d5 lui a5,0x15 + 2ad8: 18078793 addi a5,a5,384 # 15180 <_data_lma+0x6f24> + 2adc: 02f4f4b3 remu s1,s1,a5 + 2ae0: 6785 lui a5,0x1 + 2ae2: e1078793 addi a5,a5,-496 # e10 + 2ae6: 98018413 addi s0,gp,-1664 # 20000370 + 2aea: 02f4d733 divu a4,s1,a5 + 2aee: 02f4f4b3 remu s1,s1,a5 + 2af2: 0ff77713 andi a4,a4,255 + 2af6: a018 sb a4,0(s0) + 2af8: 03c00713 li a4,60 + 2afc: 02e4d7b3 divu a5,s1,a4 + 2b00: 02e4f4b3 remu s1,s1,a4 + 2b04: 0ff7f793 andi a5,a5,255 + 2b08: b01c sb a5,1(s0) + 2b0a: a024 sb s1,2(s0) + 2b0c: 204a lhu a0,4(s0) + 2b0e: 206c lbu a1,6(s0) + 2b10: 3070 lbu a2,7(s0) + 2b12: f13ff0ef jal ra,2a24 + 2b16: a408 sb a0,8(s0) + 2b18: 4501 li a0,0 + 2b1a: ee6fd06f j 200 <__riscv_restore_10> + 2b1e: 854e mv a0,s3 + 2b20: da5ff0ef jal ra,28c4 + 2b24: c911 beqz a0,2b38 + 2b26: f7440ee3 beq s0,s4,2aa2 + 2b2a: e9240413 addi s0,s0,-366 + 2b2e: 0985 addi s3,s3,1 + 2b30: 09c2 slli s3,s3,0x10 + 2b32: 0109d993 srli s3,s3,0x10 + 2b36: b7a5 j 2a9e + 2b38: e9340413 addi s0,s0,-365 + 2b3c: bfcd j 2b2e + 2b3e: 00495503 lhu a0,4(s2) + 2b42: d83ff0ef jal ra,28c4 + 2b46: c919 beqz a0,2b5c + 2b48: 01799a63 bne s3,s7,2b5c + 2b4c: f7840ce3 beq s0,s8,2ac4 + 2b50: 140d addi s0,s0,-29 + 2b52: 010a1993 slli s3,s4,0x10 + 2b56: 0109d993 srli s3,s3,0x10 + 2b5a: b78d j 2abc + 2b5c: 99d6 add s3,s3,s5 + 2b5e: 0009c783 lbu a5,0(s3) + 2b62: f6f461e3 bltu s0,a5,2ac4 + 2b66: 8c1d sub s0,s0,a5 + 2b68: b7ed j 2b52 + +00002b6a : + 2b6a: e86fd2ef jal t0,1f0 <__riscv_save_0> + 2b6e: 4585 li a1,1 + 2b70: 18000537 lui a0,0x18000 + 2b74: 5c8060ef jal ra,913c + 2b78: 4505 li a0,1 + 2b7a: 3b2060ef jal ra,8f2c + 2b7e: 4509 li a0,2 + 2b80: 786060ef jal ra,9306 + 2b84: 4505 li a0,1 + 2b86: 780060ef jal ra,9306 + 2b8a: 236060ef jal ra,8dc0 + 2b8e: 4505 li a0,1 + 2b90: 3c4060ef jal ra,8f54 + 2b94: 4401 li s0,0 + 2b96: 0fa00493 li s1,250 + 2b9a: 04100513 li a0,65 + 2b9e: 5fa060ef jal ra,9198 + 2ba2: ed09 bnez a0,2bbc + 2ba4: 00941563 bne s0,s1,2bae + 2ba8: 4505 li a0,1 + 2baa: e6afd06f j 214 <__riscv_restore_0> + 2bae: 0405 addi s0,s0,1 + 2bb0: 4551 li a0,20 + 2bb2: 0ff47413 andi s0,s0,255 + 2bb6: 0b1060ef jal ra,9466 + 2bba: b7c5 j 2b9a + 2bbc: 0fa00793 li a5,250 + 2bc0: 4505 li a0,1 + 2bc2: fef404e3 beq s0,a5,2baa + 2bc6: 10000513 li a0,256 + 2bca: 3b2060ef jal ra,8f7c + 2bce: 4505 li a0,1 + 2bd0: 3b8060ef jal ra,8f88 + 2bd4: 6ea060ef jal ra,92be + 2bd8: 6f6060ef jal ra,92ce + 2bdc: 4581 li a1,0 + 2bde: 4505 li a0,1 + 2be0: 5e6060ef jal ra,91c6 + 2be4: 4581 li a1,0 + 2be6: 4509 li a0,2 + 2be8: 5de060ef jal ra,91c6 + 2bec: 4581 li a1,0 + 2bee: 4511 li a0,4 + 2bf0: 5d6060ef jal ra,91c6 + 2bf4: 6ca060ef jal ra,92be + 2bf8: 5e8060ef jal ra,91e0 + 2bfc: 6521 lui a0,0x8 + 2bfe: 157d addi a0,a0,-1 + 2c00: 690060ef jal ra,9290 + 2c04: 6ba060ef jal ra,92be + 2c08: dbfff0ef jal ra,29c6 + 2c0c: 5e6060ef jal ra,91f2 + 2c10: 65a9 lui a1,0xa + 2c12: 1a158593 addi a1,a1,417 # a1a1 <__ascii_wctomb+0x11> + 2c16: 4511 li a0,4 + 2c18: 1b8060ef jal ra,8dd0 + 2c1c: c8dff0ef jal ra,28a8 + 2c20: e53ff0ef jal ra,2a72 + 2c24: 4501 li a0,0 + 2c26: b751 j 2baa + +00002c28 : + 2c28: 4681 li a3,0 + 2c2a: 00c69363 bne a3,a2,2c30 + 2c2e: 8082 ret + 2c30: 219c lbu a5,0(a1) + 2c32: 3198 lbu a4,1(a1) + 2c34: 0025c883 lbu a7,2(a1) + 2c38: 07e2 slli a5,a5,0x18 + 2c3a: 0742 slli a4,a4,0x10 + 2c3c: 8fd9 or a5,a5,a4 + 2c3e: 08a2 slli a7,a7,0x8 + 2c40: 0117e7b3 or a5,a5,a7 + 2c44: 0045c883 lbu a7,4(a1) + 2c48: 31f8 lbu a4,7(a1) + 2c4a: 0035c303 lbu t1,3(a1) + 2c4e: 08e2 slli a7,a7,0x18 + 2c50: 01176733 or a4,a4,a7 + 2c54: 0055c883 lbu a7,5(a1) + 2c58: 00369813 slli a6,a3,0x3 + 2c5c: 982a add a6,a6,a0 + 2c5e: 08c2 slli a7,a7,0x10 + 2c60: 01176733 or a4,a4,a7 + 2c64: 0065c883 lbu a7,6(a1) + 2c68: 0067e7b3 or a5,a5,t1 + 2c6c: 00f82223 sw a5,4(a6) + 2c70: 08a2 slli a7,a7,0x8 + 2c72: 01176733 or a4,a4,a7 + 2c76: 00e82023 sw a4,0(a6) + 2c7a: 0685 addi a3,a3,1 + 2c7c: 05a1 addi a1,a1,8 + 2c7e: b775 j 2c2a + +00002c80 : + 2c80: 411c lw a5,0(a0) + 2c82: 7119 addi sp,sp,-128 + 2c84: dea2 sw s0,124(sp) + 2c86: c23e sw a5,4(sp) + 2c88: 415c lw a5,4(a0) + 2c8a: dca6 sw s1,120(sp) + 2c8c: daca sw s2,116(sp) + 2c8e: d43e sw a5,40(sp) + 2c90: 451c lw a5,8(a0) + 2c92: d6d2 sw s4,108(sp) + 2c94: cce6 sw s9,88(sp) + 2c96: c43e sw a5,8(sp) + 2c98: 455c lw a5,12(a0) + 2c9a: c8ee sw s11,80(sp) + 2c9c: d8ce sw s3,112(sp) + 2c9e: d63e sw a5,44(sp) + 2ca0: 491c lw a5,16(a0) + 2ca2: d4d6 sw s5,104(sp) + 2ca4: d2da sw s6,100(sp) + 2ca6: c63e sw a5,12(sp) + 2ca8: 495c lw a5,20(a0) + 2caa: d0de sw s7,96(sp) + 2cac: cee2 sw s8,92(sp) + 2cae: d83e sw a5,48(sp) + 2cb0: 4d1c lw a5,24(a0) + 2cb2: caea sw s10,84(sp) + 2cb4: 63b1 lui t2,0xc + 2cb6: c83e sw a5,16(sp) + 2cb8: 4d5c lw a5,28(a0) + 2cba: 04050913 addi s2,a0,64 # 8040 + 2cbe: da3e sw a5,52(sp) + 2cc0: 511c lw a5,32(a0) + 2cc2: ca3e sw a5,20(sp) + 2cc4: 515c lw a5,36(a0) + 2cc6: dc3e sw a5,56(sp) + 2cc8: 551c lw a5,40(a0) + 2cca: 56e2 lw a3,56(sp) + 2ccc: 4dc2 lw s11,16(sp) + 2cce: cc3e sw a5,24(sp) + 2cd0: 555c lw a5,44(a0) + 2cd2: 4f62 lw t5,24(sp) + 2cd4: 5a52 lw s4,52(sp) + 2cd6: de3e sw a5,60(sp) + 2cd8: 591c lw a5,48(a0) + 2cda: 54f2 lw s1,60(sp) + 2cdc: 48b2 lw a7,12(sp) + 2cde: ce3e sw a5,28(sp) + 2ce0: 595c lw a5,52(a0) + 2ce2: 4ef2 lw t4,28(sp) + 2ce4: 5fc2 lw t6,48(sp) + 2ce6: c0be sw a5,64(sp) + 2ce8: 5d1c lw a5,56(a0) + 2cea: 4406 lw s0,64(sp) + 2cec: 4322 lw t1,8(sp) + 2cee: d03e sw a5,32(sp) + 2cf0: 5d5c lw a5,60(a0) + 2cf2: 5e02 lw t3,32(sp) + 2cf4: 52b2 lw t0,44(sp) + 2cf6: c2be sw a5,68(sp) + 2cf8: 42838793 addi a5,t2,1064 # c428 + 2cfc: c03e sw a5,0(sp) + 2cfe: 04050793 addi a5,a0,64 + 2d02: c6be sw a5,76(sp) + 2d04: 0c050793 addi a5,a0,192 + 2d08: c4be sw a5,72(sp) + 2d0a: 4c96 lw s9,68(sp) + 2d0c: 47d2 lw a5,20(sp) + 2d0e: 4712 lw a4,4(sp) + 2d10: 5622 lw a2,40(sp) + 2d12: 42838393 addi t2,t2,1064 + 2d16: 0003aa83 lw s5,0(t2) + 2d1a: 00092583 lw a1,0(s2) + 2d1e: 00492803 lw a6,4(s2) + 2d22: 0043a983 lw s3,4(t2) + 2d26: 95d6 add a1,a1,s5 + 2d28: 0155bab3 sltu s5,a1,s5 + 2d2c: 99c2 add s3,s3,a6 + 2d2e: 9ace add s5,s5,s3 + 2d30: 01269b13 slli s6,a3,0x12 + 2d34: 00e7d993 srli s3,a5,0xe + 2d38: 013b6c33 or s8,s6,s3 + 2d3c: 00e6d813 srli a6,a3,0xe + 2d40: 01279993 slli s3,a5,0x12 + 2d44: 0109ebb3 or s7,s3,a6 + 2d48: 00e69b13 slli s6,a3,0xe + 2d4c: 0127d993 srli s3,a5,0x12 + 2d50: 013b6833 or a6,s6,s3 + 2d54: 0126db13 srli s6,a3,0x12 + 2d58: 00e79993 slli s3,a5,0xe + 2d5c: 0169e9b3 or s3,s3,s6 + 2d60: 013bc9b3 xor s3,s7,s3 + 2d64: 010c4b33 xor s6,s8,a6 + 2d68: 0097db93 srli s7,a5,0x9 + 2d6c: 01769813 slli a6,a3,0x17 + 2d70: 010bebb3 or s7,s7,a6 + 2d74: 01779c13 slli s8,a5,0x17 + 2d78: 0096d813 srli a6,a3,0x9 + 2d7c: 01886833 or a6,a6,s8 + 2d80: 010b4b33 xor s6,s6,a6 + 2d84: 0179c9b3 xor s3,s3,s7 + 2d88: 9b2e add s6,s6,a1 + 2d8a: 00bb35b3 sltu a1,s6,a1 + 2d8e: 9ace add s5,s5,s3 + 2d90: fff7cb93 not s7,a5 + 2d94: 9aae add s5,s5,a1 + 2d96: fff6c993 not s3,a3 + 2d9a: 01e7f5b3 and a1,a5,t5 + 2d9e: 01dbfbb3 and s7,s7,t4 + 2da2: 0096f833 and a6,a3,s1 + 2da6: 00bbcbb3 xor s7,s7,a1 + 2daa: 0089f9b3 and s3,s3,s0 + 2dae: 9bda add s7,s7,s6 + 2db0: 0109c9b3 xor s3,s3,a6 + 2db4: 99d6 add s3,s3,s5 + 2db6: 016bbb33 sltu s6,s7,s6 + 2dba: 9e5e add t3,t3,s7 + 2dbc: 9b4e add s6,s6,s3 + 2dbe: 017e3bb3 sltu s7,t3,s7 + 2dc2: 9cda add s9,s9,s6 + 2dc4: 01e61593 slli a1,a2,0x1e + 2dc8: 00265a93 srli s5,a2,0x2 + 2dcc: 01e71813 slli a6,a4,0x1e + 2dd0: 00275993 srli s3,a4,0x2 + 2dd4: 9cde add s9,s9,s7 + 2dd6: 00b9e9b3 or s3,s3,a1 + 2dda: 010aebb3 or s7,s5,a6 + 2dde: 00461593 slli a1,a2,0x4 + 2de2: 01c75813 srli a6,a4,0x1c + 2de6: 0105e5b3 or a1,a1,a6 + 2dea: 01c65a93 srli s5,a2,0x1c + 2dee: 00471813 slli a6,a4,0x4 + 2df2: 01586833 or a6,a6,s5 + 2df6: 0109c833 xor a6,s3,a6 + 2dfa: 00bbcab3 xor s5,s7,a1 + 2dfe: 00775993 srli s3,a4,0x7 + 2e02: 01961593 slli a1,a2,0x19 + 2e06: 00b9e9b3 or s3,s3,a1 + 2e0a: 01971b13 slli s6,a4,0x19 + 2e0e: 00765593 srli a1,a2,0x7 + 2e12: 0165e5b3 or a1,a1,s6 + 2e16: 01134b33 xor s6,t1,a7 + 2e1a: 00bac5b3 xor a1,s5,a1 + 2e1e: 013849b3 xor s3,a6,s3 + 2e22: 00eb7b33 and s6,s6,a4 + 2e26: 01f2cab3 xor s5,t0,t6 + 2e2a: 01137833 and a6,t1,a7 + 2e2e: 01f2fbb3 and s7,t0,t6 + 2e32: 010b4833 xor a6,s6,a6 + 2e36: 00cafab3 and s5,s5,a2 + 2e3a: 017acab3 xor s5,s5,s7 + 2e3e: 982e add a6,a6,a1 + 2e40: 00b835b3 sltu a1,a6,a1 + 2e44: 9ace add s5,s5,s3 + 2e46: 01558bb3 add s7,a1,s5 + 2e4a: 01be0c33 add s8,t3,s11 + 2e4e: 9872 add a6,a6,t3 + 2e50: 9a66 add s4,s4,s9 + 2e52: 01cc3b33 sltu s6,s8,t3 + 2e56: 9cde add s9,s9,s7 + 2e58: 01c83e33 sltu t3,a6,t3 + 2e5c: 019e05b3 add a1,t3,s9 + 2e60: d22e sw a1,36(sp) + 2e62: 8d2e mv s10,a1 + 2e64: 45a6 lw a1,72(sp) + 2e66: 9b52 add s6,s6,s4 + 2e68: 0921 addi s2,s2,8 + 2e6a: 89e2 mv s3,s8 + 2e6c: 8ada mv s5,s6 + 2e6e: 8bc2 mv s7,a6 + 2e70: 03a1 addi t2,t2,8 + 2e72: 8dc6 mv s11,a7 + 2e74: 8a7e mv s4,t6 + 2e76: 8e76 mv t3,t4 + 2e78: 8ca2 mv s9,s0 + 2e7a: 37259b63 bne a1,s2,31f0 + 2e7e: 4b02 lw s6,0(sp) + 2e80: 43b6 lw t2,76(sp) + 2e82: 8cf6 mv s9,t4 + 2e84: 8c22 mv s8,s0 + 2e86: 8efa mv t4,t5 + 2e88: 8426 mv s0,s1 + 2e8a: 8f3e mv t5,a5 + 2e8c: 84b6 mv s1,a3 + 2e8e: d246 sw a7,36(sp) + 2e90: c4fe sw t6,72(sp) + 2e92: 889a mv a7,t1 + 2e94: 8f96 mv t6,t0 + 2e96: 833a mv t1,a4 + 2e98: 82b2 mv t0,a2 + 2e9a: 87ce mv a5,s3 + 2e9c: 86d6 mv a3,s5 + 2e9e: 875e mv a4,s7 + 2ea0: 866a mv a2,s10 + 2ea2: 5a79 li s4,-2 + 2ea4: 00fa7593 andi a1,s4,15 + 2ea8: 05a1 addi a1,a1,8 + 2eaa: 058e slli a1,a1,0x3 + 2eac: 95aa add a1,a1,a0 + 2eae: 0005a903 lw s2,0(a1) + 2eb2: 41cc lw a1,4(a1) + 2eb4: 03a1 addi t2,t2,8 + 2eb6: 01395813 srli a6,s2,0x13 + 2eba: 00d59b93 slli s7,a1,0xd + 2ebe: 010bebb3 or s7,s7,a6 + 2ec2: 00d91a93 slli s5,s2,0xd + 2ec6: 0135d813 srli a6,a1,0x13 + 2eca: 010aeab3 or s5,s5,a6 + 2ece: 01d95993 srli s3,s2,0x1d + 2ed2: 00359813 slli a6,a1,0x3 + 2ed6: 00391e13 slli t3,s2,0x3 + 2eda: 0109e9b3 or s3,s3,a6 + 2ede: 01d5d813 srli a6,a1,0x1d + 2ee2: 01c86833 or a6,a6,t3 + 2ee6: 013ac9b3 xor s3,s5,s3 + 2eea: 00695913 srli s2,s2,0x6 + 2eee: 01a59a93 slli s5,a1,0x1a + 2ef2: 010bc833 xor a6,s7,a6 + 2ef6: 012ae933 or s2,s5,s2 + 2efa: 01284933 xor s2,a6,s2 + 2efe: ff83a803 lw a6,-8(t2) + 2f02: ffc3ae03 lw t3,-4(t2) + 2f06: 8199 srli a1,a1,0x6 + 2f08: 984a add a6,a6,s2 + 2f0a: 00b9c9b3 xor s3,s3,a1 + 2f0e: 01283933 sltu s2,a6,s2 + 2f12: 99f2 add s3,s3,t3 + 2f14: 01390e33 add t3,s2,s3 + 2f18: ff3a0913 addi s2,s4,-13 + 2f1c: 00f97913 andi s2,s2,15 + 2f20: 0921 addi s2,s2,8 + 2f22: 090e slli s2,s2,0x3 + 2f24: ff03ac23 sw a6,-8(t2) + 2f28: ffc3ae23 sw t3,-4(t2) + 2f2c: 992a add s2,s2,a0 + 2f2e: 00492983 lw s3,4(s2) + 2f32: 00092583 lw a1,0(s2) + 2f36: 0b21 addi s6,s6,8 + 2f38: 01f99d13 slli s10,s3,0x1f + 2f3c: 0015d913 srli s2,a1,0x1 + 2f40: 012d6d33 or s10,s10,s2 + 2f44: 01f59b93 slli s7,a1,0x1f + 2f48: 0019d913 srli s2,s3,0x1 + 2f4c: 012bebb3 or s7,s7,s2 + 2f50: 01899a93 slli s5,s3,0x18 + 2f54: 0085d913 srli s2,a1,0x8 + 2f58: 0089dd93 srli s11,s3,0x8 + 2f5c: 012aeab3 or s5,s5,s2 + 2f60: 01859913 slli s2,a1,0x18 + 2f64: 01b96933 or s2,s2,s11 + 2f68: 012bc933 xor s2,s7,s2 + 2f6c: 819d srli a1,a1,0x7 + 2f6e: 01999b93 slli s7,s3,0x19 + 2f72: 00bbe5b3 or a1,s7,a1 + 2f76: 015d4ab3 xor s5,s10,s5 + 2f7a: 00bacab3 xor s5,s5,a1 + 2f7e: 0079d993 srli s3,s3,0x7 + 2f82: ffba0593 addi a1,s4,-5 + 2f86: 9856 add a6,a6,s5 + 2f88: 01394933 xor s2,s2,s3 + 2f8c: 89bd andi a1,a1,15 + 2f8e: 9972 add s2,s2,t3 + 2f90: 01583ab3 sltu s5,a6,s5 + 2f94: 05a1 addi a1,a1,8 + 2f96: 9aca add s5,s5,s2 + 2f98: 058e slli a1,a1,0x3 + 2f9a: ff03ac23 sw a6,-8(t2) + 2f9e: ff53ae23 sw s5,-4(t2) + 2fa2: 95aa add a1,a1,a0 + 2fa4: 0005a903 lw s2,0(a1) + 2fa8: 41cc lw a1,4(a1) + 2faa: 01279993 slli s3,a5,0x12 + 2fae: 9942 add s2,s2,a6 + 2fb0: 9aae add s5,s5,a1 + 2fb2: 01093833 sltu a6,s2,a6 + 2fb6: 9856 add a6,a6,s5 + 2fb8: 00e7d593 srli a1,a5,0xe + 2fbc: 01269a93 slli s5,a3,0x12 + 2fc0: 00e6de13 srli t3,a3,0xe + 2fc4: 00baed33 or s10,s5,a1 + 2fc8: 01c9ebb3 or s7,s3,t3 + 2fcc: 0127d593 srli a1,a5,0x12 + 2fd0: 00e79993 slli s3,a5,0xe + 2fd4: 0126da93 srli s5,a3,0x12 + 2fd8: 00e69e13 slli t3,a3,0xe + 2fdc: 00be6e33 or t3,t3,a1 + 2fe0: 0159e5b3 or a1,s3,s5 + 2fe4: 00bbc9b3 xor s3,s7,a1 + 2fe8: 01cd4ab3 xor s5,s10,t3 + 2fec: 0097d593 srli a1,a5,0x9 + 2ff0: 01769e13 slli t3,a3,0x17 + 2ff4: 01c5e5b3 or a1,a1,t3 + 2ff8: 01779b93 slli s7,a5,0x17 + 2ffc: 0096de13 srli t3,a3,0x9 + 3000: fff7cd13 not s10,a5 + 3004: 00b9c5b3 xor a1,s3,a1 + 3008: 017e6e33 or t3,t3,s7 + 300c: 01dd7d33 and s10,s10,t4 + 3010: fff6cb93 not s7,a3 + 3014: 01e7f9b3 and s3,a5,t5 + 3018: 01cace33 xor t3,s5,t3 + 301c: 008bfbb3 and s7,s7,s0 + 3020: 013d49b3 xor s3,s10,s3 + 3024: 0096fab3 and s5,a3,s1 + 3028: ff23ac23 sw s2,-8(t2) + 302c: ff03ae23 sw a6,-4(t2) + 3030: 99f2 add s3,s3,t3 + 3032: 015bcab3 xor s5,s7,s5 + 3036: 9aae add s5,s5,a1 + 3038: 01c9be33 sltu t3,s3,t3 + 303c: 078b2d83 lw s11,120(s6) + 3040: 9e56 add t3,t3,s5 + 3042: 07cb2a83 lw s5,124(s6) + 3046: 9dce add s11,s11,s3 + 3048: 013db9b3 sltu s3,s11,s3 + 304c: 9e56 add t3,t3,s5 + 304e: 996e add s2,s2,s11 + 3050: 99f2 add s3,s3,t3 + 3052: 99c2 add s3,s3,a6 + 3054: 01b93db3 sltu s11,s2,s11 + 3058: 9dce add s11,s11,s3 + 305a: 01c75593 srli a1,a4,0x1c + 305e: 00461993 slli s3,a2,0x4 + 3062: 00b9ebb3 or s7,s3,a1 + 3066: 01c65813 srli a6,a2,0x1c + 306a: 00471593 slli a1,a4,0x4 + 306e: 0105eab3 or s5,a1,a6 + 3072: 00265e13 srli t3,a2,0x2 + 3076: 01e61813 slli a6,a2,0x1e + 307a: 01e71d13 slli s10,a4,0x1e + 307e: 00275593 srli a1,a4,0x2 + 3082: 01ae69b3 or s3,t3,s10 + 3086: 0105e5b3 or a1,a1,a6 + 308a: 00775e13 srli t3,a4,0x7 + 308e: 01961813 slli a6,a2,0x19 + 3092: 00bac5b3 xor a1,s5,a1 + 3096: 010e6e33 or t3,t3,a6 + 309a: 01971a93 slli s5,a4,0x19 + 309e: 00765813 srli a6,a2,0x7 + 30a2: 9cca add s9,s9,s2 + 30a4: 013bc9b3 xor s3,s7,s3 + 30a8: 01586833 or a6,a6,s5 + 30ac: 01134ab3 xor s5,t1,a7 + 30b0: 012cb933 sltu s2,s9,s2 + 30b4: 0109c833 xor a6,s3,a6 + 30b8: 01c5ce33 xor t3,a1,t3 + 30bc: 9de2 add s11,s11,s8 + 30be: 00eafab3 and s5,s5,a4 + 30c2: 01f2c9b3 xor s3,t0,t6 + 30c6: 011375b3 and a1,t1,a7 + 30ca: 01b90c33 add s8,s2,s11 + 30ce: 00bac5b3 xor a1,s5,a1 + 30d2: 01f2f933 and s2,t0,t6 + 30d6: 00c9f9b3 and s3,s3,a2 + 30da: 0129c9b3 xor s3,s3,s2 + 30de: 95c2 add a1,a1,a6 + 30e0: 0105b833 sltu a6,a1,a6 + 30e4: 99f2 add s3,s3,t3 + 30e6: 01380933 add s2,a6,s3 + 30ea: 5812 lw a6,36(sp) + 30ec: 95e6 add a1,a1,s9 + 30ee: 0a05 addi s4,s4,1 + 30f0: 010c8e33 add t3,s9,a6 + 30f4: 4826 lw a6,72(sp) + 30f6: 019e3db3 sltu s11,t3,s9 + 30fa: 0195bcb3 sltu s9,a1,s9 + 30fe: 9862 add a6,a6,s8 + 3100: 9c4a add s8,s8,s2 + 3102: 9dc2 add s11,s11,a6 + 3104: d246 sw a7,36(sp) + 3106: 018c8833 add a6,s9,s8 + 310a: c4fe sw t6,72(sp) + 310c: 4939 li s2,14 + 310e: 89f2 mv s3,t3 + 3110: 8aee mv s5,s11 + 3112: 8bae mv s7,a1 + 3114: 8d42 mv s10,a6 + 3116: 8cf6 mv s9,t4 + 3118: 8c22 mv s8,s0 + 311a: 0f2a1863 bne s4,s2,320a + 311e: 4382 lw t2,0(sp) + 3120: 08038393 addi t2,t2,128 + 3124: c01e sw t2,0(sp) + 3126: 4902 lw s2,0(sp) + 3128: 63b1 lui t2,0xc + 312a: 62838393 addi t2,t2,1576 # c628 + 312e: d52398e3 bne t2,s2,2e7e + 3132: 4392 lw t2,4(sp) + 3134: 5922 lw s2,40(sp) + 3136: 959e add a1,a1,t2 + 3138: 0075b3b3 sltu t2,a1,t2 + 313c: 984a add a6,a6,s2 + 313e: 981e add a6,a6,t2 + 3140: c10c sw a1,0(a0) + 3142: 45a2 lw a1,8(sp) + 3144: 01052223 sw a6,4(a0) + 3148: 5832 lw a6,44(sp) + 314a: 972e add a4,a4,a1 + 314c: 00b735b3 sltu a1,a4,a1 + 3150: 9642 add a2,a2,a6 + 3152: 962e add a2,a2,a1 + 3154: c518 sw a4,8(a0) + 3156: 4732 lw a4,12(sp) + 3158: c550 sw a2,12(a0) + 315a: 5642 lw a2,48(sp) + 315c: 933a add t1,t1,a4 + 315e: 00e33733 sltu a4,t1,a4 + 3162: 92b2 add t0,t0,a2 + 3164: 92ba add t0,t0,a4 + 3166: 4742 lw a4,16(sp) + 3168: 5652 lw a2,52(sp) + 316a: 00652823 sw t1,16(a0) + 316e: 98ba add a7,a7,a4 + 3170: 00e8b733 sltu a4,a7,a4 + 3174: 9fb2 add t6,t6,a2 + 3176: 9fba add t6,t6,a4 + 3178: 4752 lw a4,20(sp) + 317a: 5662 lw a2,56(sp) + 317c: 00552a23 sw t0,20(a0) + 3180: 9e3a add t3,t3,a4 + 3182: 00ee3733 sltu a4,t3,a4 + 3186: 9db2 add s11,s11,a2 + 3188: 9dba add s11,s11,a4 + 318a: 4762 lw a4,24(sp) + 318c: 5672 lw a2,60(sp) + 318e: 03b52223 sw s11,36(a0) + 3192: 97ba add a5,a5,a4 + 3194: 00e7b733 sltu a4,a5,a4 + 3198: d51c sw a5,40(a0) + 319a: 96b2 add a3,a3,a2 + 319c: 47f2 lw a5,28(sp) + 319e: 96ba add a3,a3,a4 + 31a0: 4706 lw a4,64(sp) + 31a2: 9f3e add t5,t5,a5 + 31a4: 00ff37b3 sltu a5,t5,a5 + 31a8: 94ba add s1,s1,a4 + 31aa: 94be add s1,s1,a5 + 31ac: 5782 lw a5,32(sp) + 31ae: 4716 lw a4,68(sp) + 31b0: d944 sw s1,52(a0) + 31b2: 9ebe add t4,t4,a5 + 31b4: 00feb7b3 sltu a5,t4,a5 + 31b8: 943a add s0,s0,a4 + 31ba: 943e add s0,s0,a5 + 31bc: 01152c23 sw a7,24(a0) + 31c0: 01f52e23 sw t6,28(a0) + 31c4: 03c52023 sw t3,32(a0) + 31c8: d554 sw a3,44(a0) + 31ca: 03e52823 sw t5,48(a0) + 31ce: 03d52c23 sw t4,56(a0) + 31d2: dd40 sw s0,60(a0) + 31d4: 5476 lw s0,124(sp) + 31d6: 54e6 lw s1,120(sp) + 31d8: 5956 lw s2,116(sp) + 31da: 59c6 lw s3,112(sp) + 31dc: 5a36 lw s4,108(sp) + 31de: 5aa6 lw s5,104(sp) + 31e0: 5b16 lw s6,100(sp) + 31e2: 5b86 lw s7,96(sp) + 31e4: 4c76 lw s8,92(sp) + 31e6: 4ce6 lw s9,88(sp) + 31e8: 4d56 lw s10,84(sp) + 31ea: 4dc6 lw s11,80(sp) + 31ec: 6109 addi sp,sp,128 + 31ee: 8082 ret + 31f0: 8efa mv t4,t5 + 31f2: 8426 mv s0,s1 + 31f4: 8f3e mv t5,a5 + 31f6: 84b6 mv s1,a3 + 31f8: 889a mv a7,t1 + 31fa: 8f96 mv t6,t0 + 31fc: 833a mv t1,a4 + 31fe: 82b2 mv t0,a2 + 3200: 87e2 mv a5,s8 + 3202: 86da mv a3,s6 + 3204: 8742 mv a4,a6 + 3206: 5612 lw a2,36(sp) + 3208: b639 j 2d16 + 320a: 8efa mv t4,t5 + 320c: 8426 mv s0,s1 + 320e: 8f3e mv t5,a5 + 3210: 84b6 mv s1,a3 + 3212: 889a mv a7,t1 + 3214: 8f96 mv t6,t0 + 3216: 833a mv t1,a4 + 3218: 82b2 mv t0,a2 + 321a: 87f2 mv a5,t3 + 321c: 86ee mv a3,s11 + 321e: 872e mv a4,a1 + 3220: 8642 mv a2,a6 + 3222: b149 j 2ea4 + +00003224 : + 3224: fcdfc2ef jal t0,1f0 <__riscv_save_0> + 3228: 0d052603 lw a2,208(a0) + 322c: 57e1 li a5,-8 + 322e: ff867413 andi s0,a2,-8 + 3232: 8a1d andi a2,a2,7 + 3234: 02f60633 mul a2,a2,a5 + 3238: 942a add s0,s0,a0 + 323a: 852e mv a0,a1 + 323c: 4581 li a1,0 + 323e: 03860613 addi a2,a2,56 + 3242: 2be060ef jal ra,9500 <__ashldi3> + 3246: 403c lw a5,64(s0) + 3248: 8d5d or a0,a0,a5 + 324a: 407c lw a5,68(s0) + 324c: c028 sw a0,64(s0) + 324e: 8ddd or a1,a1,a5 + 3250: c06c sw a1,68(s0) + 3252: fc3fc06f j 214 <__riscv_restore_0> + +00003256 : + 3256: f81fc2ef jal t0,1d6 <__riscv_save_4> + 325a: 0d052983 lw s3,208(a0) + 325e: 842a mv s0,a0 + 3260: 892e mv s2,a1 + 3262: 0079f793 andi a5,s3,7 + 3266: 84b2 mv s1,a2 + 3268: c385 beqz a5,3288 + 326a: 413009b3 neg s3,s3 + 326e: 0079f993 andi s3,s3,7 + 3272: 01367363 bgeu a2,s3,3278 + 3276: 89b2 mv s3,a2 + 3278: 4a01 li s4,0 + 327a: 014907b3 add a5,s2,s4 + 327e: 0d3a1463 bne s4,s3,3346 + 3282: 893e mv s2,a5 + 3284: 414484b3 sub s1,s1,s4 + 3288: 0d042783 lw a5,208(s0) + 328c: 07f7f713 andi a4,a5,127 + 3290: cf05 beqz a4,32c8 + 3292: 40f00733 neg a4,a5 + 3296: 07f77713 andi a4,a4,127 + 329a: 0034d993 srli s3,s1,0x3 + 329e: 00e4e463 bltu s1,a4,32a6 + 32a2: 00375993 srli s3,a4,0x3 + 32a6: 9be1 andi a5,a5,-8 + 32a8: 04040513 addi a0,s0,64 + 32ac: 864e mv a2,s3 + 32ae: 85ca mv a1,s2 + 32b0: 953e add a0,a0,a5 + 32b2: 977ff0ef jal ra,2c28 + 32b6: 0d042783 lw a5,208(s0) + 32ba: 098e slli s3,s3,0x3 + 32bc: 994e add s2,s2,s3 + 32be: 97ce add a5,a5,s3 + 32c0: 0cf42823 sw a5,208(s0) + 32c4: 413484b3 sub s1,s1,s3 + 32c8: 0d042703 lw a4,208(s0) + 32cc: 08000793 li a5,128 + 32d0: 06f71163 bne a4,a5,3332 + 32d4: 0c842783 lw a5,200(s0) + 32d8: 0cc42683 lw a3,204(s0) + 32dc: 40078713 addi a4,a5,1024 + 32e0: 00f737b3 sltu a5,a4,a5 + 32e4: 97b6 add a5,a5,a3 + 32e6: 0ce42423 sw a4,200(s0) + 32ea: 0cf42623 sw a5,204(s0) + 32ee: e395 bnez a5,3312 + 32f0: 3ff00793 li a5,1023 + 32f4: 00e7ef63 bltu a5,a4,3312 + 32f8: 0c042783 lw a5,192(s0) + 32fc: 0c442683 lw a3,196(s0) + 3300: 00178713 addi a4,a5,1 + 3304: 00f737b3 sltu a5,a4,a5 + 3308: 97b6 add a5,a5,a3 + 330a: 0ce42023 sw a4,192(s0) + 330e: 0cf42223 sw a5,196(s0) + 3312: 8522 mv a0,s0 + 3314: 96dff0ef jal ra,2c80 + 3318: 04040793 addi a5,s0,64 + 331c: 0c042823 sw zero,208(s0) + 3320: 0c040713 addi a4,s0,192 + 3324: 4601 li a2,0 + 3326: 4681 li a3,0 + 3328: c390 sw a2,0(a5) + 332a: c3d4 sw a3,4(a5) + 332c: 07a1 addi a5,a5,8 + 332e: fef71be3 bne a4,a5,3324 + 3332: f804f993 andi s3,s1,-128 + 3336: 99ca add s3,s3,s2 + 3338: 04040a13 addi s4,s0,64 + 333c: 3ff00a93 li s5,1023 + 3340: 0c040b13 addi s6,s0,192 + 3344: a8ad j 33be + 3346: 238c lbu a1,0(a5) + 3348: 8522 mv a0,s0 + 334a: 0a05 addi s4,s4,1 + 334c: ed9ff0ef jal ra,3224 + 3350: 0d042783 lw a5,208(s0) + 3354: 0785 addi a5,a5,1 + 3356: 0cf42823 sw a5,208(s0) + 335a: b705 j 327a + 335c: 4641 li a2,16 + 335e: 85ca mv a1,s2 + 3360: 8552 mv a0,s4 + 3362: 8c7ff0ef jal ra,2c28 + 3366: 0c842783 lw a5,200(s0) + 336a: 0cc42683 lw a3,204(s0) + 336e: 40078713 addi a4,a5,1024 + 3372: 00f737b3 sltu a5,a4,a5 + 3376: 97b6 add a5,a5,a3 + 3378: 0ce42423 sw a4,200(s0) + 337c: 0cf42623 sw a5,204(s0) + 3380: e385 bnez a5,33a0 + 3382: 00eaef63 bltu s5,a4,33a0 + 3386: 0c042783 lw a5,192(s0) + 338a: 0c442683 lw a3,196(s0) + 338e: 00178713 addi a4,a5,1 + 3392: 00f737b3 sltu a5,a4,a5 + 3396: 97b6 add a5,a5,a3 + 3398: 0ce42023 sw a4,192(s0) + 339c: 0cf42223 sw a5,196(s0) + 33a0: 8522 mv a0,s0 + 33a2: 8dfff0ef jal ra,2c80 + 33a6: 87d2 mv a5,s4 + 33a8: 0c042823 sw zero,208(s0) + 33ac: 4681 li a3,0 + 33ae: 4701 li a4,0 + 33b0: c394 sw a3,0(a5) + 33b2: c3d8 sw a4,4(a5) + 33b4: 07a1 addi a5,a5,8 + 33b6: ff679be3 bne a5,s6,33ac + 33ba: 08090913 addi s2,s2,128 + 33be: f9391fe3 bne s2,s3,335c + 33c2: 07f4f913 andi s2,s1,127 + 33c6: 02090563 beqz s2,33f0 + 33ca: 00395613 srli a2,s2,0x3 + 33ce: 85ce mv a1,s3 + 33d0: 04040513 addi a0,s0,64 + 33d4: 855ff0ef jal ra,2c28 + 33d8: 0d042783 lw a5,208(s0) + 33dc: 0784f493 andi s1,s1,120 + 33e0: 40990933 sub s2,s2,s1 + 33e4: 97a6 add a5,a5,s1 + 33e6: 0cf42823 sw a5,208(s0) + 33ea: 4a01 li s4,0 + 33ec: 01491463 bne s2,s4,33f4 + 33f0: e1bfc06f j 20a <__riscv_restore_4> + 33f4: 014487b3 add a5,s1,s4 + 33f8: 97ce add a5,a5,s3 + 33fa: 238c lbu a1,0(a5) + 33fc: 8522 mv a0,s0 + 33fe: 0a05 addi s4,s4,1 + 3400: e25ff0ef jal ra,3224 + 3404: 0d042783 lw a5,208(s0) + 3408: 0785 addi a5,a5,1 + 340a: 0cf42823 sw a5,208(s0) + 340e: bff9 j 33ec + +00003410 : + 3410: 0000c7b7 lui a5,0xc + 3414: 6a87a703 lw a4,1704(a5) # c6a8 + 3418: 6ac7a783 lw a5,1708(a5) + 341c: 4801 li a6,0 + 341e: c118 sw a4,0(a0) + 3420: c15c sw a5,4(a0) + 3422: 0000c7b7 lui a5,0xc + 3426: 6b07a703 lw a4,1712(a5) # c6b0 + 342a: 6b47a783 lw a5,1716(a5) + 342e: c518 sw a4,8(a0) + 3430: c55c sw a5,12(a0) + 3432: 0000c7b7 lui a5,0xc + 3436: 6b87a703 lw a4,1720(a5) # c6b8 + 343a: 6bc7a783 lw a5,1724(a5) + 343e: c918 sw a4,16(a0) + 3440: c95c sw a5,20(a0) + 3442: 0000c7b7 lui a5,0xc + 3446: 6c07a703 lw a4,1728(a5) # c6c0 + 344a: 6c47a783 lw a5,1732(a5) + 344e: cd18 sw a4,24(a0) + 3450: cd5c sw a5,28(a0) + 3452: 0000c7b7 lui a5,0xc + 3456: 6c87a703 lw a4,1736(a5) # c6c8 + 345a: 6cc7a783 lw a5,1740(a5) + 345e: d118 sw a4,32(a0) + 3460: d15c sw a5,36(a0) + 3462: 0000c7b7 lui a5,0xc + 3466: 6d07a703 lw a4,1744(a5) # c6d0 + 346a: 6d47a783 lw a5,1748(a5) + 346e: d518 sw a4,40(a0) + 3470: d55c sw a5,44(a0) + 3472: 0000c7b7 lui a5,0xc + 3476: 6d87a703 lw a4,1752(a5) # c6d8 + 347a: 6dc7a783 lw a5,1756(a5) + 347e: d918 sw a4,48(a0) + 3480: d95c sw a5,52(a0) + 3482: 0000c7b7 lui a5,0xc + 3486: 6e07a703 lw a4,1760(a5) # c6e0 + 348a: 6e47a783 lw a5,1764(a5) + 348e: dd18 sw a4,56(a0) + 3490: dd5c sw a5,60(a0) + 3492: 4781 li a5,0 + 3494: 0cf52023 sw a5,192(a0) + 3498: 0cf52423 sw a5,200(a0) + 349c: 0d052223 sw a6,196(a0) + 34a0: 0d052623 sw a6,204(a0) + 34a4: 0c052823 sw zero,208(a0) + 34a8: 04050793 addi a5,a0,64 + 34ac: 0c050513 addi a0,a0,192 + 34b0: 4681 li a3,0 + 34b2: 4701 li a4,0 + 34b4: c394 sw a3,0(a5) + 34b6: c3d8 sw a4,4(a5) + 34b8: 07a1 addi a5,a5,8 + 34ba: fea79be3 bne a5,a0,34b0 + 34be: 8082 ret + +000034c0 : + 34c0: c619 beqz a2,34ce + 34c2: d2ffc2ef jal t0,1f0 <__riscv_save_0> + 34c6: d91ff0ef jal ra,3256 + 34ca: d4bfc06f j 214 <__riscv_restore_0> + 34ce: 8082 ret + +000034d0 : + 34d0: d21fc2ef jal t0,1f0 <__riscv_save_0> + 34d4: 0d052783 lw a5,208(a0) + 34d8: 842a mv s0,a0 + 34da: 84ae mv s1,a1 + 34dc: ef81 bnez a5,34f4 + 34de: 04050793 addi a5,a0,64 + 34e2: 0c050713 addi a4,a0,192 + 34e6: 4601 li a2,0 + 34e8: 4681 li a3,0 + 34ea: c390 sw a2,0(a5) + 34ec: c3d4 sw a3,4(a5) + 34ee: 07a1 addi a5,a5,8 + 34f0: fee79be3 bne a5,a4,34e6 + 34f4: 08000593 li a1,128 + 34f8: 8522 mv a0,s0 + 34fa: d2bff0ef jal ra,3224 + 34fe: 0d042603 lw a2,208(s0) + 3502: 0c842783 lw a5,200(s0) + 3506: 0cc42583 lw a1,204(s0) + 350a: 00361693 slli a3,a2,0x3 + 350e: 97b6 add a5,a5,a3 + 3510: 00d7b733 sltu a4,a5,a3 + 3514: 972e add a4,a4,a1 + 3516: 0cf42423 sw a5,200(s0) + 351a: 0ce42623 sw a4,204(s0) + 351e: e305 bnez a4,353e + 3520: 00d7ff63 bgeu a5,a3,353e + 3524: 0c042783 lw a5,192(s0) + 3528: 0c442683 lw a3,196(s0) + 352c: 00178713 addi a4,a5,1 + 3530: 00f737b3 sltu a5,a4,a5 + 3534: 97b6 add a5,a5,a3 + 3536: 0ce42023 sw a4,192(s0) + 353a: 0cf42223 sw a5,196(s0) + 353e: 06f00793 li a5,111 + 3542: 02c7f063 bgeu a5,a2,3562 + 3546: 8522 mv a0,s0 + 3548: f38ff0ef jal ra,2c80 + 354c: 04040793 addi a5,s0,64 + 3550: 0b040713 addi a4,s0,176 + 3554: 4601 li a2,0 + 3556: 4681 li a3,0 + 3558: c390 sw a2,0(a5) + 355a: c3d4 sw a3,4(a5) + 355c: 07a1 addi a5,a5,8 + 355e: fee79be3 bne a5,a4,3554 + 3562: 0c042703 lw a4,192(s0) + 3566: 0c442783 lw a5,196(s0) + 356a: 8522 mv a0,s0 + 356c: 0ae42823 sw a4,176(s0) + 3570: 0af42a23 sw a5,180(s0) + 3574: 0c842703 lw a4,200(s0) + 3578: 0cc42783 lw a5,204(s0) + 357c: 0ae42c23 sw a4,184(s0) + 3580: 0af42e23 sw a5,188(s0) + 3584: efcff0ef jal ra,2c80 + 3588: 87a2 mv a5,s0 + 358a: 85a6 mv a1,s1 + 358c: 04048613 addi a2,s1,64 + 3590: 43d4 lw a3,4(a5) + 3592: 4398 lw a4,0(a5) + 3594: 05a1 addi a1,a1,8 + 3596: 0186d513 srli a0,a3,0x18 + 359a: fea58c23 sb a0,-8(a1) + 359e: 0106d513 srli a0,a3,0x10 + 35a2: fea58ca3 sb a0,-7(a1) + 35a6: fed58da3 sb a3,-5(a1) + 35aa: 0086d513 srli a0,a3,0x8 + 35ae: 01875693 srli a3,a4,0x18 + 35b2: fed58e23 sb a3,-4(a1) + 35b6: 01075693 srli a3,a4,0x10 + 35ba: fed58ea3 sb a3,-3(a1) + 35be: 00875693 srli a3,a4,0x8 + 35c2: fea58d23 sb a0,-6(a1) + 35c6: fed58f23 sb a3,-2(a1) + 35ca: fee58fa3 sb a4,-1(a1) + 35ce: 07a1 addi a5,a5,8 + 35d0: fcc590e3 bne a1,a2,3590 + 35d4: 0d800593 li a1,216 + 35d8: 8522 mv a0,s0 + 35da: 0e2020ef jal ra,56bc + 35de: c37fc06f j 214 <__riscv_restore_0> + +000035e2 : + 35e2: c0ffc2ef jal t0,1f0 <__riscv_save_0> + 35e6: 7129 addi sp,sp,-320 + 35e8: 842a mv s0,a0 + 35ea: 10a8 addi a0,sp,104 + 35ec: c442 sw a6,8(sp) + 35ee: c246 sw a7,4(sp) + 35f0: c83a sw a4,16(sp) + 35f2: c63e sw a5,12(sp) + 35f4: ca36 sw a3,20(sp) + 35f6: ce2e sw a1,28(sp) + 35f8: cc32 sw a2,24(sp) + 35fa: e17ff0ef jal ra,3410 + 35fe: 4662 lw a2,24(sp) + 3600: 45f2 lw a1,28(sp) + 3602: 10a8 addi a0,sp,104 + 3604: ebdff0ef jal ra,34c0 + 3608: 46d2 lw a3,20(sp) + 360a: 10a8 addi a0,sp,104 + 360c: 02000613 li a2,32 + 3610: 85b6 mv a1,a3 + 3612: c45ff0ef jal ra,3256 + 3616: 47b2 lw a5,12(sp) + 3618: 4742 lw a4,16(sp) + 361a: 10a8 addi a0,sp,104 + 361c: 863e mv a2,a5 + 361e: 85ba mv a1,a4 + 3620: ea1ff0ef jal ra,34c0 + 3624: 4892 lw a7,4(sp) + 3626: 4822 lw a6,8(sp) + 3628: 10a8 addi a0,sp,104 + 362a: 8646 mv a2,a7 + 362c: 85c2 mv a1,a6 + 362e: e93ff0ef jal ra,34c0 + 3632: 102c addi a1,sp,40 + 3634: 10a8 addi a0,sp,104 + 3636: e9bff0ef jal ra,34d0 + 363a: 102c addi a1,sp,40 + 363c: 8522 mv a0,s0 + 363e: 031020ef jal ra,5e6e + 3642: 6131 addi sp,sp,320 + 3644: bd1fc06f j 214 <__riscv_restore_0> + +00003648 : + 3648: ba9fc2ef jal t0,1f0 <__riscv_save_0> + 364c: 7151 addi sp,sp,-240 + 364e: 842a mv s0,a0 + 3650: 0828 addi a0,sp,24 + 3652: c62e sw a1,12(sp) + 3654: c432 sw a2,8(sp) + 3656: dbbff0ef jal ra,3410 + 365a: 4622 lw a2,8(sp) + 365c: 45b2 lw a1,12(sp) + 365e: 0828 addi a0,sp,24 + 3660: e61ff0ef jal ra,34c0 + 3664: 0828 addi a0,sp,24 + 3666: 85a2 mv a1,s0 + 3668: e69ff0ef jal ra,34d0 + 366c: 616d addi sp,sp,240 + 366e: ba7fc06f j 214 <__riscv_restore_0> + +00003672 : + 3672: b65fc2ef jal t0,1d6 <__riscv_save_4> + 3676: 7135 addi sp,sp,-160 + 3678: 84b2 mv s1,a2 + 367a: 842a mv s0,a0 + 367c: 02000613 li a2,32 + 3680: 1088 addi a0,sp,96 + 3682: 8936 mv s2,a3 + 3684: 89ba mv s3,a4 + 3686: 8a3e mv s4,a5 + 3688: 8aae mv s5,a1 + 368a: fbfff0ef jal ra,3648 + 368e: 108c addi a1,sp,96 + 3690: 852e mv a0,a1 + 3692: 782020ef jal ra,5e14 + 3696: 4881 li a7,0 + 3698: 4801 li a6,0 + 369a: 87d2 mv a5,s4 + 369c: 874e mv a4,s3 + 369e: 0114 addi a3,sp,128 + 36a0: 864a mv a2,s2 + 36a2: 85a6 mv a1,s1 + 36a4: 850a mv a0,sp + 36a6: f3dff0ef jal ra,35e2 + 36aa: 858a mv a1,sp + 36ac: 0088 addi a0,sp,64 + 36ae: 2e9020ef jal ra,6196 + 36b2: 02000793 li a5,32 + 36b6: 020a8713 addi a4,s5,32 + 36ba: 88d2 mv a7,s4 + 36bc: 884e mv a6,s3 + 36be: 0094 addi a3,sp,64 + 36c0: 864a mv a2,s2 + 36c2: 85a6 mv a1,s1 + 36c4: 1008 addi a0,sp,32 + 36c6: f1dff0ef jal ra,35e2 + 36ca: 4781 li a5,0 + 36cc: 02000713 li a4,32 + 36d0: 0090 addi a2,sp,64 + 36d2: 963e add a2,a2,a5 + 36d4: 2210 lbu a2,0(a2) + 36d6: 00f406b3 add a3,s0,a5 + 36da: 0785 addi a5,a5,1 + 36dc: a290 sb a2,0(a3) + 36de: fee799e3 bne a5,a4,36d0 + 36e2: 868a mv a3,sp + 36e4: 1090 addi a2,sp,96 + 36e6: 100c addi a1,sp,32 + 36e8: 02040513 addi a0,s0,32 + 36ec: 7aa020ef jal ra,5e96 + 36f0: 1088 addi a0,sp,96 + 36f2: 04000593 li a1,64 + 36f6: 7c7010ef jal ra,56bc + 36fa: 850a mv a0,sp + 36fc: 02000593 li a1,32 + 3700: 7bd010ef jal ra,56bc + 3704: 610d addi sp,sp,160 + 3706: b05fc06f j 20a <__riscv_restore_4> + +0000370a : + 370a: ae7fc2ef jal t0,1f0 <__riscv_save_0> + 370e: 7139 addi sp,sp,-64 + 3710: 842a mv s0,a0 + 3712: 84ae mv s1,a1 + 3714: 4781 li a5,0 + 3716: 02000713 li a4,32 + 371a: 00f605b3 add a1,a2,a5 + 371e: 218c lbu a1,0(a1) + 3720: 00f106b3 add a3,sp,a5 + 3724: 0785 addi a5,a5,1 + 3726: a28c sb a1,0(a3) + 3728: fee799e3 bne a5,a4,371a + 372c: 02000593 li a1,32 + 3730: 8532 mv a0,a2 + 3732: 78b010ef jal ra,56bc + 3736: 4781 li a5,0 + 3738: 02000713 li a4,32 + 373c: 00f10633 add a2,sp,a5 + 3740: 2210 lbu a2,0(a2) + 3742: 00f406b3 add a3,s0,a5 + 3746: 0785 addi a5,a5,1 + 3748: a290 sb a2,0(a3) + 374a: fee799e3 bne a5,a4,373c + 374e: 02000613 li a2,32 + 3752: 858a mv a1,sp + 3754: 850a mv a0,sp + 3756: ef3ff0ef jal ra,3648 + 375a: 858a mv a1,sp + 375c: 850a mv a0,sp + 375e: 6b6020ef jal ra,5e14 + 3762: 858a mv a1,sp + 3764: 8526 mv a0,s1 + 3766: 231020ef jal ra,6196 + 376a: 4781 li a5,0 + 376c: 02000713 li a4,32 + 3770: 00f486b3 add a3,s1,a5 + 3774: 2290 lbu a2,0(a3) + 3776: 00f406b3 add a3,s0,a5 + 377a: 0785 addi a5,a5,1 + 377c: 02c68023 sb a2,32(a3) + 3780: fee798e3 bne a5,a4,3770 + 3784: 850a mv a0,sp + 3786: 04000593 li a1,64 + 378a: 733010ef jal ra,56bc + 378e: 6121 addi sp,sp,64 + 3790: a85fc06f j 214 <__riscv_restore_0> + +00003794 : + 3794: a5dfc2ef jal t0,1f0 <__riscv_save_0> + 3798: 87b6 mv a5,a3 + 379a: 8732 mv a4,a2 + 379c: 4681 li a3,0 + 379e: 4601 li a2,0 + 37a0: ed3ff0ef jal ra,3672 + 37a4: a71fc06f j 214 <__riscv_restore_0> + +000037a8 : + 37a8: a49fc2ef jal t0,1f0 <__riscv_save_0> + 37ac: 1101 addi sp,sp,-32 + 37ae: 842a mv s0,a0 + 37b0: 87b6 mv a5,a3 + 37b2: 8732 mv a4,a2 + 37b4: 86ae mv a3,a1 + 37b6: 84ae mv s1,a1 + 37b8: 4881 li a7,0 + 37ba: 4801 li a6,0 + 37bc: 85aa mv a1,a0 + 37be: 02000613 li a2,32 + 37c2: 850a mv a0,sp + 37c4: e1fff0ef jal ra,35e2 + 37c8: 860a mv a2,sp + 37ca: 85a6 mv a1,s1 + 37cc: 8522 mv a0,s0 + 37ce: 00f020ef jal ra,5fdc + 37d2: 6105 addi sp,sp,32 + 37d4: a41fc06f j 214 <__riscv_restore_0> + +000037d8 : + 37d8: 311c lbu a5,1(a0) + 37da: 2138 lbu a4,2(a0) + 37dc: 2108 lbu a0,0(a0) + 37de: 07a2 slli a5,a5,0x8 + 37e0: 0742 slli a4,a4,0x10 + 37e2: 8fd9 or a5,a5,a4 + 37e4: 8d5d or a0,a0,a5 + 37e6: 8082 ret + +000037e8 : + 37e8: 311c lbu a5,1(a0) + 37ea: 2118 lbu a4,0(a0) + 37ec: 07a2 slli a5,a5,0x8 + 37ee: 8f5d or a4,a4,a5 + 37f0: 213c lbu a5,2(a0) + 37f2: 3128 lbu a0,3(a0) + 37f4: 07c2 slli a5,a5,0x10 + 37f6: 8fd9 or a5,a5,a4 + 37f8: 0562 slli a0,a0,0x18 + 37fa: 8d5d or a0,a0,a5 + 37fc: 8082 ret + +000037fe : + 37fe: 9f3fc2ef jal t0,1f0 <__riscv_save_0> + 3802: 84aa mv s1,a0 + 3804: fe5ff0ef jal ra,37e8 + 3808: 842a mv s0,a0 + 380a: 00448513 addi a0,s1,4 + 380e: fdbff0ef jal ra,37e8 + 3812: 85aa mv a1,a0 + 3814: 8522 mv a0,s0 + 3816: 9fffc06f j 214 <__riscv_restore_0> + +0000381a : + 381a: 0085d793 srli a5,a1,0x8 + 381e: a10c sb a1,0(a0) + 3820: b11c sb a5,1(a0) + 3822: 0105d793 srli a5,a1,0x10 + 3826: 81e1 srli a1,a1,0x18 + 3828: a13c sb a5,2(a0) + 382a: b12c sb a1,3(a0) + 382c: 8082 ret + +0000382e : + 382e: 9c3fc2ef jal t0,1f0 <__riscv_save_0> + 3832: 1141 addi sp,sp,-16 + 3834: 892a mv s2,a0 + 3836: 00261493 slli s1,a2,0x2 + 383a: 4401 li s0,0 + 383c: 00858533 add a0,a1,s0 + 3840: c62e sw a1,12(sp) + 3842: fa7ff0ef jal ra,37e8 + 3846: 008907b3 add a5,s2,s0 + 384a: c388 sw a0,0(a5) + 384c: 0411 addi s0,s0,4 + 384e: 45b2 lw a1,12(sp) + 3850: fe9416e3 bne s0,s1,383c + 3854: 0141 addi sp,sp,16 + 3856: 9bffc06f j 214 <__riscv_restore_0> + +0000385a : + 385a: 97dfc2ef jal t0,1d6 <__riscv_save_4> + 385e: 892a mv s2,a0 + 3860: 89ae mv s3,a1 + 3862: 00261493 slli s1,a2,0x2 + 3866: 4401 li s0,0 + 3868: 008987b3 add a5,s3,s0 + 386c: 438c lw a1,0(a5) + 386e: 00890533 add a0,s2,s0 + 3872: 0411 addi s0,s0,4 + 3874: fa7ff0ef jal ra,381a + 3878: fe9418e3 bne s0,s1,3868 + 387c: 98ffc06f j 20a <__riscv_restore_4> + +00003880 : + 3880: 957fc2ef jal t0,1d6 <__riscv_save_4> + 3884: 8a2e mv s4,a1 + 3886: 84aa mv s1,a0 + 3888: f77ff0ef jal ra,37fe + 388c: 892a mv s2,a0 + 388e: 8552 mv a0,s4 + 3890: 842e mv s0,a1 + 3892: f6dff0ef jal ra,37fe + 3896: 00a94933 xor s2,s2,a0 + 389a: 00848513 addi a0,s1,8 + 389e: 8c2d xor s0,s0,a1 + 38a0: f5fff0ef jal ra,37fe + 38a4: 89aa mv s3,a0 + 38a6: 008a0513 addi a0,s4,8 + 38aa: 84ae mv s1,a1 + 38ac: f53ff0ef jal ra,37fe + 38b0: 00a9c533 xor a0,s3,a0 + 38b4: 8da5 xor a1,a1,s1 + 38b6: 01256533 or a0,a0,s2 + 38ba: 8dc1 or a1,a1,s0 + 38bc: 94ffc06f j 20a <__riscv_restore_4> + +000038c0 : + 38c0: 917fc2ef jal t0,1d6 <__riscv_save_4> + 38c4: 892a mv s2,a0 + 38c6: 89ae mv s3,a1 + 38c8: fb9ff0ef jal ra,3880 + 38cc: 842e mv s0,a1 + 38ce: 84aa mv s1,a0 + 38d0: 01098593 addi a1,s3,16 + 38d4: 01090513 addi a0,s2,16 + 38d8: fa9ff0ef jal ra,3880 + 38dc: 8d45 or a0,a0,s1 + 38de: 8dc1 or a1,a1,s0 + 38e0: 92bfc06f j 20a <__riscv_restore_4> + +000038e4 : + 38e4: 02850793 addi a5,a0,40 + 38e8: 00052023 sw zero,0(a0) + 38ec: 0511 addi a0,a0,4 + 38ee: fef51de3 bne a0,a5,38e8 + 38f2: 8082 ret + +000038f4 : + 38f4: 4785 li a5,1 + 38f6: c11c sw a5,0(a0) + 38f8: 00450793 addi a5,a0,4 + 38fc: 02850513 addi a0,a0,40 + 3900: 0007a023 sw zero,0(a5) + 3904: 0791 addi a5,a5,4 + 3906: fea79de3 bne a5,a0,3900 + 390a: 8082 ret + +0000390c : + 390c: 4781 li a5,0 + 390e: 02800713 li a4,40 + 3912: 00f586b3 add a3,a1,a5 + 3916: 4290 lw a2,0(a3) + 3918: 00f506b3 add a3,a0,a5 + 391c: 0791 addi a5,a5,4 + 391e: c290 sw a2,0(a3) + 3920: fee799e3 bne a5,a4,3912 + 3924: 8082 ret + +00003926 : + 3926: 4781 li a5,0 + 3928: 02800693 li a3,40 + 392c: 00f58733 add a4,a1,a5 + 3930: 4318 lw a4,0(a4) + 3932: 00f50633 add a2,a0,a5 + 3936: 0791 addi a5,a5,4 + 3938: 40e00733 neg a4,a4 + 393c: c218 sw a4,0(a2) + 393e: fed797e3 bne a5,a3,392c + 3942: 8082 ret + +00003944 : + 3944: 4781 li a5,0 + 3946: 02800693 li a3,40 + 394a: 00f58733 add a4,a1,a5 + 394e: 00f608b3 add a7,a2,a5 + 3952: 4318 lw a4,0(a4) + 3954: 0008a883 lw a7,0(a7) + 3958: 00f50833 add a6,a0,a5 + 395c: 0791 addi a5,a5,4 + 395e: 9746 add a4,a4,a7 + 3960: 00e82023 sw a4,0(a6) + 3964: fed793e3 bne a5,a3,394a + 3968: 8082 ret + +0000396a : + 396a: 4781 li a5,0 + 396c: 02800693 li a3,40 + 3970: 00f58733 add a4,a1,a5 + 3974: 00f608b3 add a7,a2,a5 + 3978: 4318 lw a4,0(a4) + 397a: 0008a883 lw a7,0(a7) + 397e: 00f50833 add a6,a0,a5 + 3982: 0791 addi a5,a5,4 + 3984: 41170733 sub a4,a4,a7 + 3988: 00e82023 sw a4,0(a6) + 398c: fed792e3 bne a5,a3,3970 + 3990: 8082 ret + +00003992 : + 3992: 1141 addi sp,sp,-16 + 3994: 40c00633 neg a2,a2 + 3998: 4118 lw a4,0(a0) + 399a: 419c lw a5,0(a1) + 399c: c632 sw a2,12(sp) + 399e: 46b2 lw a3,12(sp) + 39a0: 8fb9 xor a5,a5,a4 + 39a2: 8ff5 and a5,a5,a3 + 39a4: 8f3d xor a4,a4,a5 + 39a6: c118 sw a4,0(a0) + 39a8: 4198 lw a4,0(a1) + 39aa: 46b2 lw a3,12(sp) + 39ac: 8fb9 xor a5,a5,a4 + 39ae: c19c sw a5,0(a1) + 39b0: 4158 lw a4,4(a0) + 39b2: 41dc lw a5,4(a1) + 39b4: 8fb9 xor a5,a5,a4 + 39b6: 8ff5 and a5,a5,a3 + 39b8: 8f3d xor a4,a4,a5 + 39ba: c158 sw a4,4(a0) + 39bc: 41d8 lw a4,4(a1) + 39be: 46b2 lw a3,12(sp) + 39c0: 8fb9 xor a5,a5,a4 + 39c2: c1dc sw a5,4(a1) + 39c4: 4518 lw a4,8(a0) + 39c6: 459c lw a5,8(a1) + 39c8: 8fb9 xor a5,a5,a4 + 39ca: 8ff5 and a5,a5,a3 + 39cc: 8f3d xor a4,a4,a5 + 39ce: c518 sw a4,8(a0) + 39d0: 4598 lw a4,8(a1) + 39d2: 46b2 lw a3,12(sp) + 39d4: 8fb9 xor a5,a5,a4 + 39d6: c59c sw a5,8(a1) + 39d8: 4558 lw a4,12(a0) + 39da: 45dc lw a5,12(a1) + 39dc: 8fb9 xor a5,a5,a4 + 39de: 8ff5 and a5,a5,a3 + 39e0: 8f3d xor a4,a4,a5 + 39e2: c558 sw a4,12(a0) + 39e4: 45d8 lw a4,12(a1) + 39e6: 46b2 lw a3,12(sp) + 39e8: 8fb9 xor a5,a5,a4 + 39ea: c5dc sw a5,12(a1) + 39ec: 4918 lw a4,16(a0) + 39ee: 499c lw a5,16(a1) + 39f0: 8fb9 xor a5,a5,a4 + 39f2: 8ff5 and a5,a5,a3 + 39f4: 8f3d xor a4,a4,a5 + 39f6: c918 sw a4,16(a0) + 39f8: 4998 lw a4,16(a1) + 39fa: 8fb9 xor a5,a5,a4 + 39fc: c99c sw a5,16(a1) + 39fe: 4958 lw a4,20(a0) + 3a00: 46b2 lw a3,12(sp) + 3a02: 49dc lw a5,20(a1) + 3a04: 8fb9 xor a5,a5,a4 + 3a06: 8ff5 and a5,a5,a3 + 3a08: 8f3d xor a4,a4,a5 + 3a0a: c958 sw a4,20(a0) + 3a0c: 49d8 lw a4,20(a1) + 3a0e: 46b2 lw a3,12(sp) + 3a10: 8fb9 xor a5,a5,a4 + 3a12: c9dc sw a5,20(a1) + 3a14: 4d18 lw a4,24(a0) + 3a16: 4d9c lw a5,24(a1) + 3a18: 8fb9 xor a5,a5,a4 + 3a1a: 8ff5 and a5,a5,a3 + 3a1c: 8f3d xor a4,a4,a5 + 3a1e: cd18 sw a4,24(a0) + 3a20: 4d98 lw a4,24(a1) + 3a22: 46b2 lw a3,12(sp) + 3a24: 8fb9 xor a5,a5,a4 + 3a26: cd9c sw a5,24(a1) + 3a28: 4d58 lw a4,28(a0) + 3a2a: 4ddc lw a5,28(a1) + 3a2c: 8fb9 xor a5,a5,a4 + 3a2e: 8ff5 and a5,a5,a3 + 3a30: 8f3d xor a4,a4,a5 + 3a32: cd58 sw a4,28(a0) + 3a34: 4dd8 lw a4,28(a1) + 3a36: 46b2 lw a3,12(sp) + 3a38: 8fb9 xor a5,a5,a4 + 3a3a: cddc sw a5,28(a1) + 3a3c: 5118 lw a4,32(a0) + 3a3e: 519c lw a5,32(a1) + 3a40: 8fb9 xor a5,a5,a4 + 3a42: 8ff5 and a5,a5,a3 + 3a44: 8f3d xor a4,a4,a5 + 3a46: d118 sw a4,32(a0) + 3a48: 5198 lw a4,32(a1) + 3a4a: 46b2 lw a3,12(sp) + 3a4c: 8fb9 xor a5,a5,a4 + 3a4e: d19c sw a5,32(a1) + 3a50: 5158 lw a4,36(a0) + 3a52: 51dc lw a5,36(a1) + 3a54: 8fb9 xor a5,a5,a4 + 3a56: 8ff5 and a5,a5,a3 + 3a58: 8f3d xor a4,a4,a5 + 3a5a: d158 sw a4,36(a0) + 3a5c: 51d8 lw a4,36(a1) + 3a5e: 8fb9 xor a5,a5,a4 + 3a60: d1dc sw a5,36(a1) + 3a62: 0141 addi sp,sp,16 + 3a64: 8082 ret + +00003a66 : + 3a66: 1141 addi sp,sp,-16 + 3a68: 40c00633 neg a2,a2 + 3a6c: c632 sw a2,12(sp) + 3a6e: 419c lw a5,0(a1) + 3a70: 4118 lw a4,0(a0) + 3a72: 46b2 lw a3,12(sp) + 3a74: 8fb9 xor a5,a5,a4 + 3a76: 8ff5 and a5,a5,a3 + 3a78: 8fb9 xor a5,a5,a4 + 3a7a: c11c sw a5,0(a0) + 3a7c: 41dc lw a5,4(a1) + 3a7e: 4158 lw a4,4(a0) + 3a80: 46b2 lw a3,12(sp) + 3a82: 8fb9 xor a5,a5,a4 + 3a84: 8ff5 and a5,a5,a3 + 3a86: 8fb9 xor a5,a5,a4 + 3a88: c15c sw a5,4(a0) + 3a8a: 459c lw a5,8(a1) + 3a8c: 4518 lw a4,8(a0) + 3a8e: 46b2 lw a3,12(sp) + 3a90: 8fb9 xor a5,a5,a4 + 3a92: 8ff5 and a5,a5,a3 + 3a94: 8fb9 xor a5,a5,a4 + 3a96: c51c sw a5,8(a0) + 3a98: 45dc lw a5,12(a1) + 3a9a: 4558 lw a4,12(a0) + 3a9c: 46b2 lw a3,12(sp) + 3a9e: 8fb9 xor a5,a5,a4 + 3aa0: 8ff5 and a5,a5,a3 + 3aa2: 8fb9 xor a5,a5,a4 + 3aa4: c55c sw a5,12(a0) + 3aa6: 4918 lw a4,16(a0) + 3aa8: 499c lw a5,16(a1) + 3aaa: 46b2 lw a3,12(sp) + 3aac: 8fb9 xor a5,a5,a4 + 3aae: 8ff5 and a5,a5,a3 + 3ab0: 8fb9 xor a5,a5,a4 + 3ab2: c91c sw a5,16(a0) + 3ab4: 4958 lw a4,20(a0) + 3ab6: 49dc lw a5,20(a1) + 3ab8: 46b2 lw a3,12(sp) + 3aba: 8fb9 xor a5,a5,a4 + 3abc: 8ff5 and a5,a5,a3 + 3abe: 8fb9 xor a5,a5,a4 + 3ac0: c95c sw a5,20(a0) + 3ac2: 4d18 lw a4,24(a0) + 3ac4: 4d9c lw a5,24(a1) + 3ac6: 46b2 lw a3,12(sp) + 3ac8: 8fb9 xor a5,a5,a4 + 3aca: 8ff5 and a5,a5,a3 + 3acc: 8fb9 xor a5,a5,a4 + 3ace: cd1c sw a5,24(a0) + 3ad0: 4d58 lw a4,28(a0) + 3ad2: 4ddc lw a5,28(a1) + 3ad4: 46b2 lw a3,12(sp) + 3ad6: 8fb9 xor a5,a5,a4 + 3ad8: 8ff5 and a5,a5,a3 + 3ada: 8fb9 xor a5,a5,a4 + 3adc: cd5c sw a5,28(a0) + 3ade: 5118 lw a4,32(a0) + 3ae0: 519c lw a5,32(a1) + 3ae2: 46b2 lw a3,12(sp) + 3ae4: 8fb9 xor a5,a5,a4 + 3ae6: 8ff5 and a5,a5,a3 + 3ae8: 8fb9 xor a5,a5,a4 + 3aea: d11c sw a5,32(a0) + 3aec: 5158 lw a4,36(a0) + 3aee: 51dc lw a5,36(a1) + 3af0: 46b2 lw a3,12(sp) + 3af2: 8fb9 xor a5,a5,a4 + 3af4: 8ff5 and a5,a5,a3 + 3af6: 8fb9 xor a5,a5,a4 + 3af8: d15c sw a5,36(a0) + 3afa: 0141 addi sp,sp,16 + 3afc: 8082 ret + +00003afe : + 3afe: ecafc2ef jal t0,1c8 <__riscv_save_10> + 3b02: 1141 addi sp,sp,-16 + 3b04: 84aa mv s1,a0 + 3b06: 852e mv a0,a1 + 3b08: 842e mv s0,a1 + 3b0a: c632 sw a2,12(sp) + 3b0c: cddff0ef jal ra,37e8 + 3b10: 8b2a mv s6,a0 + 3b12: 00440513 addi a0,s0,4 + 3b16: cc3ff0ef jal ra,37d8 + 3b1a: 00651d13 slli s10,a0,0x6 + 3b1e: 00740513 addi a0,s0,7 + 3b22: cb7ff0ef jal ra,37d8 + 3b26: 00551c13 slli s8,a0,0x5 + 3b2a: 00a40513 addi a0,s0,10 + 3b2e: cabff0ef jal ra,37d8 + 3b32: 00351b93 slli s7,a0,0x3 + 3b36: 00d40513 addi a0,s0,13 + 3b3a: c9fff0ef jal ra,37d8 + 3b3e: 00251a93 slli s5,a0,0x2 + 3b42: 01040513 addi a0,s0,16 + 3b46: ca3ff0ef jal ra,37e8 + 3b4a: 8caa mv s9,a0 + 3b4c: 01440513 addi a0,s0,20 + 3b50: c89ff0ef jal ra,37d8 + 3b54: 00751a13 slli s4,a0,0x7 + 3b58: 01740513 addi a0,s0,23 + 3b5c: c7dff0ef jal ra,37d8 + 3b60: 00551993 slli s3,a0,0x5 + 3b64: 01a40513 addi a0,s0,26 + 3b68: c71ff0ef jal ra,37d8 + 3b6c: 00451913 slli s2,a0,0x4 + 3b70: 01d40513 addi a0,s0,29 + 3b74: c65ff0ef jal ra,37d8 + 3b78: 4632 lw a2,12(sp) + 3b7a: 010007b7 lui a5,0x1000 + 3b7e: 02000737 lui a4,0x2000 + 3b82: fff78e93 addi t4,a5,-1 # ffffff <_data_lma+0xff1da3> + 3b86: 40cedeb3 sra t4,t4,a2 + 3b8a: 00eb0633 add a2,s6,a4 + 3b8e: 016636b3 sltu a3,a2,s6 + 3b92: 069a slli a3,a3,0x6 + 3b94: 8269 srli a2,a2,0x1a + 3b96: 8e55 or a2,a2,a3 + 3b98: 00cd05b3 add a1,s10,a2 + 3b9c: 00665393 srli t2,a2,0x6 + 3ba0: 01a61e13 slli t3,a2,0x1a + 3ba4: 00ea8633 add a2,s5,a4 + 3ba8: 015636b3 sltu a3,a2,s5 + 3bac: 00f58333 add t1,a1,a5 + 3bb0: 069a slli a3,a3,0x6 + 3bb2: 8269 srli a2,a2,0x1a + 3bb4: 8e55 or a2,a2,a3 + 3bb6: 01a5bd33 sltu s10,a1,s10 + 3bba: 00b336b3 sltu a3,t1,a1 + 3bbe: 41cb0e33 sub t3,s6,t3 + 3bc2: 96ea add a3,a3,s10 + 3bc4: 01cb3b33 sltu s6,s6,t3 + 3bc8: 069e slli a3,a3,0x7 + 3bca: 407003b3 neg t2,t2 + 3bce: 01935313 srli t1,t1,0x19 + 3bd2: 416383b3 sub t2,t2,s6 + 3bd6: 01a61893 slli a7,a2,0x1a + 3bda: 00665b13 srli s6,a2,0x6 + 3bde: 0066e333 or t1,a3,t1 + 3be2: 9666 add a2,a2,s9 + 3be4: 00f60833 add a6,a2,a5 + 3be8: 01931693 slli a3,t1,0x19 + 3bec: 9362 add t1,t1,s8 + 3bee: 00e302b3 add t0,t1,a4 + 3bf2: 01963cb3 sltu s9,a2,s9 + 3bf6: 00aefeb3 and t4,t4,a0 + 3bfa: 00c83533 sltu a0,a6,a2 + 3bfe: 8d95 sub a1,a1,a3 + 3c00: 9566 add a0,a0,s9 + 3c02: 018336b3 sltu a3,t1,s8 + 3c06: 0062bc33 sltu s8,t0,t1 + 3c0a: 051e slli a0,a0,0x7 + 3c0c: 9c36 add s8,s8,a3 + 3c0e: 01985813 srli a6,a6,0x19 + 3c12: 01056833 or a6,a0,a6 + 3c16: 0c1a slli s8,s8,0x6 + 3c18: 01a2d293 srli t0,t0,0x1a + 3c1c: 01981513 slli a0,a6,0x19 + 3c20: 005c62b3 or t0,s8,t0 + 3c24: 9852 add a6,a6,s4 + 3c26: 00e80f33 add t5,a6,a4 + 3c2a: 8e09 sub a2,a2,a0 + 3c2c: 01483533 sltu a0,a6,s4 + 3c30: 005b8a33 add s4,s7,t0 + 3c34: 00fa0fb3 add t6,s4,a5 + 3c38: 010f36b3 sltu a3,t5,a6 + 3c3c: 017a3cb3 sltu s9,s4,s7 + 3c40: 96aa add a3,a3,a0 + 3c42: 014fbbb3 sltu s7,t6,s4 + 3c46: 069a slli a3,a3,0x6 + 3c48: 9be6 add s7,s7,s9 + 3c4a: 01af5f13 srli t5,t5,0x1a + 3c4e: 01e6ef33 or t5,a3,t5 + 3c52: 0b9e slli s7,s7,0x7 + 3c54: 019fdf93 srli t6,t6,0x19 + 3c58: 01e98433 add s0,s3,t5 + 3c5c: 411a88b3 sub a7,s5,a7 + 3c60: 01fbefb3 or t6,s7,t6 + 3c64: 01343c33 sltu s8,s0,s3 + 3c68: 01f889b3 add s3,a7,t6 + 3c6c: 011abab3 sltu s5,s5,a7 + 3c70: 0119b6b3 sltu a3,s3,a7 + 3c74: 415686b3 sub a3,a3,s5 + 3c78: 416686b3 sub a3,a3,s6 + 3c7c: 00f40b33 add s6,s0,a5 + 3c80: 008b3533 sltu a0,s6,s0 + 3c84: 9562 add a0,a0,s8 + 3c86: 00e988b3 add a7,s3,a4 + 3c8a: 051e slli a0,a0,0x7 + 3c8c: 019b5b13 srli s6,s6,0x19 + 3c90: 01656b33 or s6,a0,s6 + 3c94: 0138b533 sltu a0,a7,s3 + 3c98: 96aa add a3,a3,a0 + 3c9a: 01690ab3 add s5,s2,s6 + 3c9e: 069a slli a3,a3,0x6 + 3ca0: 01a8d893 srli a7,a7,0x1a + 3ca4: 0116e8b3 or a7,a3,a7 + 3ca8: 00ea86b3 add a3,s5,a4 + 3cac: 012abbb3 sltu s7,s5,s2 + 3cb0: 0156b933 sltu s2,a3,s5 + 3cb4: 995e add s2,s2,s7 + 3cb6: 091a slli s2,s2,0x6 + 3cb8: 82e9 srli a3,a3,0x1a + 3cba: 0e8a slli t4,t4,0x2 + 3cbc: 00d966b3 or a3,s2,a3 + 3cc0: 00de8933 add s2,t4,a3 + 3cc4: 97ca add a5,a5,s2 + 3cc6: 01d93533 sltu a0,s2,t4 + 3cca: 0127beb3 sltu t4,a5,s2 + 3cce: 9eaa add t4,t4,a0 + 3cd0: 0e9e slli t4,t4,0x7 + 3cd2: 83e5 srli a5,a5,0x19 + 3cd4: 00fee7b3 or a5,t4,a5 + 3cd8: 4ecd li t4,19 + 3cda: 02fe8533 mul a0,t4,a5 + 3cde: 02ea slli t0,t0,0x1a + 3ce0: 0fe6 slli t6,t6,0x19 + 3ce2: 0f6a slli t5,t5,0x1a + 3ce4: 0b66 slli s6,s6,0x19 + 3ce6: 06ea slli a3,a3,0x1a + 3ce8: 41640433 sub s0,s0,s6 + 3cec: 40530333 sub t1,t1,t0 + 3cf0: 41fa0a33 sub s4,s4,t6 + 3cf4: 9646 add a2,a2,a7 + 3cf6: 02febeb3 mulhu t4,t4,a5 + 3cfa: 9e2a add t3,t3,a0 + 3cfc: 9772 add a4,a4,t3 + 3cfe: 00ae3533 sltu a0,t3,a0 + 3d02: 07e6 slli a5,a5,0x19 + 3d04: 41e80833 sub a6,a6,t5 + 3d08: 40da86b3 sub a3,s5,a3 + 3d0c: 40f907b3 sub a5,s2,a5 + 3d10: 0064a423 sw t1,8(s1) + 3d14: 0144a623 sw s4,12(s1) + 3d18: 93f6 add t2,t2,t4 + 3d1a: 951e add a0,a0,t2 + 3d1c: 01c733b3 sltu t2,a4,t3 + 3d20: 951e add a0,a0,t2 + 3d22: 051a slli a0,a0,0x6 + 3d24: 8369 srli a4,a4,0x1a + 3d26: 8f49 or a4,a4,a0 + 3d28: 01a71513 slli a0,a4,0x1a + 3d2c: 95ba add a1,a1,a4 + 3d2e: 01a89713 slli a4,a7,0x1a + 3d32: 40ae0e33 sub t3,t3,a0 + 3d36: 40e989b3 sub s3,s3,a4 + 3d3a: 01c4a023 sw t3,0(s1) + 3d3e: c0cc sw a1,4(s1) + 3d40: 0134a823 sw s3,16(s1) + 3d44: c8d0 sw a2,20(s1) + 3d46: 0104ac23 sw a6,24(s1) + 3d4a: ccc0 sw s0,28(s1) + 3d4c: d094 sw a3,32(s1) + 3d4e: d0dc sw a5,36(s1) + 3d50: 0141 addi sp,sp,16 + 3d52: caefc06f j 200 <__riscv_restore_10> + +00003d56 : + 3d56: 7179 addi sp,sp,-48 + 3d58: c06e sw s11,0(sp) + 3d5a: 0005ad83 lw s11,0(a1) + 3d5e: cc56 sw s5,24(sp) + 3d60: 0045a383 lw t2,4(a1) + 3d64: 03b60ab3 mul s5,a2,s11 + 3d68: 4994 lw a3,16(a1) + 3d6a: c26a sw s10,4(sp) + 3d6c: c466 sw s9,8(sp) + 3d6e: d622 sw s0,44(sp) + 3d70: d426 sw s1,40(sp) + 3d72: d24a sw s2,36(sp) + 3d74: d04e sw s3,32(sp) + 3d76: c85e sw s7,16(sp) + 3d78: 51dc lw a5,36(a1) + 3d7a: 03b61db3 mulh s11,a2,s11 + 3d7e: 0085a983 lw s3,8(a1) + 3d82: 45c4 lw s1,12(a1) + 3d84: 0145ab83 lw s7,20(a1) + 3d88: 0185a903 lw s2,24(a1) + 3d8c: 4dc0 lw s0,28(a1) + 3d8e: 0205a283 lw t0,32(a1) + 3d92: 020005b7 lui a1,0x2000 + 3d96: 00ba8733 add a4,s5,a1 + 3d9a: ca5a sw s6,20(sp) + 3d9c: 02760d33 mul s10,a2,t2 + 3da0: ce52 sw s4,28(sp) + 3da2: c662 sw s8,12(sp) + 3da4: 02d60cb3 mul s9,a2,a3 + 3da8: 027613b3 mulh t2,a2,t2 + 3dac: 02d616b3 mulh a3,a2,a3 + 3db0: 03360833 mul a6,a2,s3 + 3db4: 02960eb3 mul t4,a2,s1 + 3db8: 037608b3 mul a7,a2,s7 + 3dbc: 03260fb3 mul t6,a2,s2 + 3dc0: 02860f33 mul t5,a2,s0 + 3dc4: 02560333 mul t1,a2,t0 + 3dc8: 02f60b33 mul s6,a2,a5 + 3dcc: 03261933 mulh s2,a2,s2 + 3dd0: 033619b3 mulh s3,a2,s3 + 3dd4: 029614b3 mulh s1,a2,s1 + 3dd8: 03761bb3 mulh s7,a2,s7 + 3ddc: 02861433 mulh s0,a2,s0 + 3de0: 025612b3 mulh t0,a2,t0 + 3de4: 02f61633 mulh a2,a2,a5 + 3de8: 015737b3 sltu a5,a4,s5 + 3dec: 97ee add a5,a5,s11 + 3dee: 00679e13 slli t3,a5,0x6 + 3df2: 8369 srli a4,a4,0x1a + 3df4: 00ee6733 or a4,t3,a4 + 3df8: 87e9 srai a5,a5,0x1a + 3dfa: 00675e13 srli t3,a4,0x6 + 3dfe: 01a79c13 slli s8,a5,0x1a + 3e02: 01a71a13 slli s4,a4,0x1a + 3e06: 018e6c33 or s8,t3,s8 + 3e0a: 976a add a4,a4,s10 + 3e0c: 414a8a33 sub s4,s5,s4 + 3e10: 014abe33 sltu t3,s5,s4 + 3e14: 01a73d33 sltu s10,a4,s10 + 3e18: 418d8ab3 sub s5,s11,s8 + 3e1c: 00f38c33 add s8,t2,a5 + 3e20: 00bc87b3 add a5,s9,a1 + 3e24: 9c6a add s8,s8,s10 + 3e26: 0197bd33 sltu s10,a5,s9 + 3e2a: 9d36 add s10,s10,a3 + 3e2c: 41ca8ab3 sub s5,s5,t3 + 3e30: 83e9 srli a5,a5,0x1a + 3e32: 006d1e13 slli t3,s10,0x6 + 3e36: 00fe67b3 or a5,t3,a5 + 3e3a: 41ad5d13 srai s10,s10,0x1a + 3e3e: 0067d393 srli t2,a5,0x6 + 3e42: 01ad1e13 slli t3,s10,0x1a + 3e46: 01c3ee33 or t3,t2,t3 + 3e4a: 01a79393 slli t2,a5,0x1a + 3e4e: 97c6 add a5,a5,a7 + 3e50: 407c83b3 sub t2,s9,t2 + 3e54: 0117b8b3 sltu a7,a5,a7 + 3e58: 41c68e33 sub t3,a3,t3 + 3e5c: 9bea add s7,s7,s10 + 3e5e: 010006b7 lui a3,0x1000 + 3e62: 007cbcb3 sltu s9,s9,t2 + 3e66: 9bc6 add s7,s7,a7 + 3e68: 00d708b3 add a7,a4,a3 + 3e6c: 419e0e33 sub t3,t3,s9 + 3e70: 00e8bcb3 sltu s9,a7,a4 + 3e74: 9c66 add s8,s8,s9 + 3e76: 007c1c93 slli s9,s8,0x7 + 3e7a: 0198d893 srli a7,a7,0x19 + 3e7e: 011ce8b3 or a7,s9,a7 + 3e82: 01989c93 slli s9,a7,0x19 + 3e86: 419c5c13 srai s8,s8,0x19 + 3e8a: 98c2 add a7,a7,a6 + 3e8c: 0108b833 sltu a6,a7,a6 + 3e90: 99e2 add s3,s3,s8 + 3e92: 99c2 add s3,s3,a6 + 3e94: 00d78833 add a6,a5,a3 + 3e98: 00f83d33 sltu s10,a6,a5 + 3e9c: 9bea add s7,s7,s10 + 3e9e: 007b9c13 slli s8,s7,0x7 + 3ea2: 01985813 srli a6,a6,0x19 + 3ea6: 010c6833 or a6,s8,a6 + 3eaa: 01981c13 slli s8,a6,0x19 + 3eae: 419bdb93 srai s7,s7,0x19 + 3eb2: 987e add a6,a6,t6 + 3eb4: 01f83fb3 sltu t6,a6,t6 + 3eb8: 9bca add s7,s7,s2 + 3eba: 9bfe add s7,s7,t6 + 3ebc: 00b88fb3 add t6,a7,a1 + 3ec0: 418787b3 sub a5,a5,s8 + 3ec4: 011fbc33 sltu s8,t6,a7 + 3ec8: 99e2 add s3,s3,s8 + 3eca: 00699913 slli s2,s3,0x6 + 3ece: 01afdf93 srli t6,t6,0x1a + 3ed2: 01f96fb3 or t6,s2,t6 + 3ed6: 41a9d913 srai s2,s3,0x1a + 3eda: 01fe89b3 add s3,t4,t6 + 3ede: 01d9beb3 sltu t4,s3,t4 + 3ee2: 94ca add s1,s1,s2 + 3ee4: 009e8c33 add s8,t4,s1 + 3ee8: 00b80eb3 add t4,a6,a1 + 3eec: 010eb933 sltu s2,t4,a6 + 3ef0: 995e add s2,s2,s7 + 3ef2: 00691493 slli s1,s2,0x6 + 3ef6: 01aede93 srli t4,t4,0x1a + 3efa: 01d4eeb3 or t4,s1,t4 + 3efe: 01df04b3 add s1,t5,t4 + 3f02: 41a95913 srai s2,s2,0x1a + 3f06: 01e4bf33 sltu t5,s1,t5 + 3f0a: 944a add s0,s0,s2 + 3f0c: 008f0bb3 add s7,t5,s0 + 3f10: 00d98f33 add t5,s3,a3 + 3f14: 013f3433 sltu s0,t5,s3 + 3f18: 9462 add s0,s0,s8 + 3f1a: 00741913 slli s2,s0,0x7 + 3f1e: 019f5f13 srli t5,t5,0x19 + 3f22: 01e96f33 or t5,s2,t5 + 3f26: 01e38933 add s2,t2,t5 + 3f2a: 8465 srai s0,s0,0x19 + 3f2c: 9472 add s0,s0,t3 + 3f2e: 007933b3 sltu t2,s2,t2 + 3f32: 00d48e33 add t3,s1,a3 + 3f36: 93a2 add t2,t2,s0 + 3f38: 009e3433 sltu s0,t3,s1 + 3f3c: 945e add s0,s0,s7 + 3f3e: 00741b93 slli s7,s0,0x7 + 3f42: 019e5e13 srli t3,t3,0x19 + 3f46: 01cbee33 or t3,s7,t3 + 3f4a: 41945c13 srai s8,s0,0x19 + 3f4e: 01c30433 add s0,t1,t3 + 3f52: 00643333 sltu t1,s0,t1 + 3f56: 92e2 add t0,t0,s8 + 3f58: 00530bb3 add s7,t1,t0 + 3f5c: 00b902b3 add t0,s2,a1 + 3f60: 0122b333 sltu t1,t0,s2 + 3f64: 939a add t2,t2,t1 + 3f66: 039a slli t2,t2,0x6 + 3f68: 00b40333 add t1,s0,a1 + 3f6c: 01a2d293 srli t0,t0,0x1a + 3f70: 0053e2b3 or t0,t2,t0 + 3f74: 008333b3 sltu t2,t1,s0 + 3f78: 93de add t2,t2,s7 + 3f7a: 00639b93 slli s7,t2,0x6 + 3f7e: 01a35313 srli t1,t1,0x1a + 3f82: 006be333 or t1,s7,t1 + 3f86: 41a3db93 srai s7,t2,0x1a + 3f8a: 006b03b3 add t2,s6,t1 + 3f8e: 965e add a2,a2,s7 + 3f90: 969e add a3,a3,t2 + 3f92: 0163bb33 sltu s6,t2,s6 + 3f96: 9b32 add s6,s6,a2 + 3f98: 0076b633 sltu a2,a3,t2 + 3f9c: 965a add a2,a2,s6 + 3f9e: 00761b13 slli s6,a2,0x7 + 3fa2: 82e5 srli a3,a3,0x19 + 3fa4: 00db66b3 or a3,s6,a3 + 3fa8: 4bcd li s7,19 + 3faa: 8665 srai a2,a2,0x19 + 3fac: 02db8b33 mul s6,s7,a3 + 3fb0: 41970733 sub a4,a4,s9 + 3fb4: 0fea slli t6,t6,0x1a + 3fb6: 0f66 slli t5,t5,0x19 + 3fb8: 0eea slli t4,t4,0x1a + 3fba: 0e66 slli t3,t3,0x19 + 3fbc: 036a slli t1,t1,0x1a + 3fbe: 41e989b3 sub s3,s3,t5 + 3fc2: 41c484b3 sub s1,s1,t3 + 3fc6: 40640433 sub s0,s0,t1 + 3fca: 02cb8633 mul a2,s7,a2 + 3fce: 9a5a add s4,s4,s6 + 3fd0: 016a3b33 sltu s6,s4,s6 + 3fd4: 95d2 add a1,a1,s4 + 3fd6: 41f888b3 sub a7,a7,t6 + 3fda: 9796 add a5,a5,t0 + 3fdc: 41d80833 sub a6,a6,t4 + 3fe0: 01352623 sw s3,12(a0) + 3fe4: cd44 sw s1,28(a0) + 3fe6: 01152423 sw a7,8(a0) + 3fea: 02dbbbb3 mulhu s7,s7,a3 + 3fee: 06e6 slli a3,a3,0x19 + 3ff0: 40d386b3 sub a3,t2,a3 + 3ff4: c95c sw a5,20(a0) + 3ff6: 01052c23 sw a6,24(a0) + 3ffa: d100 sw s0,32(a0) + 3ffc: d154 sw a3,36(a0) + 3ffe: 965e add a2,a2,s7 + 4000: 9656 add a2,a2,s5 + 4002: 965a add a2,a2,s6 + 4004: 0145bb33 sltu s6,a1,s4 + 4008: 965a add a2,a2,s6 + 400a: 061a slli a2,a2,0x6 + 400c: 81e9 srli a1,a1,0x1a + 400e: 8dd1 or a1,a1,a2 + 4010: 01a59613 slli a2,a1,0x1a + 4014: 95ba add a1,a1,a4 + 4016: 01a29713 slli a4,t0,0x1a + 401a: 40ca0a33 sub s4,s4,a2 + 401e: 40e90933 sub s2,s2,a4 + 4022: 01452023 sw s4,0(a0) + 4026: 01252823 sw s2,16(a0) + 402a: c14c sw a1,4(a0) + 402c: 5432 lw s0,44(sp) + 402e: 54a2 lw s1,40(sp) + 4030: 5912 lw s2,36(sp) + 4032: 5982 lw s3,32(sp) + 4034: 4a72 lw s4,28(sp) + 4036: 4ae2 lw s5,24(sp) + 4038: 4b52 lw s6,20(sp) + 403a: 4bc2 lw s7,16(sp) + 403c: 4c32 lw s8,12(sp) + 403e: 4ca2 lw s9,8(sp) + 4040: 4d12 lw s10,4(sp) + 4042: 4d82 lw s11,0(sp) + 4044: 6145 addi sp,sp,48 + 4046: 8082 ret + +00004048 : + 4048: 45d8 lw a4,12(a1) + 404a: 7175 addi sp,sp,-144 + 404c: c722 sw s0,140(sp) + 404e: c43a sw a4,8(sp) + 4050: 49d8 lw a4,20(a1) + 4052: 4a40 lw s0,20(a2) + 4054: c526 sw s1,136(sp) + 4056: c63a sw a4,12(sp) + 4058: 4dd8 lw a4,28(a1) + 405a: c34a sw s2,132(sp) + 405c: c14e sw s3,128(sp) + 405e: c83a sw a4,16(sp) + 4060: 51d8 lw a4,36(a1) + 4062: ded2 sw s4,124(sp) + 4064: dcd6 sw s5,120(sp) + 4066: dada sw s6,116(sp) + 4068: d8de sw s7,112(sp) + 406a: d6e2 sw s8,108(sp) + 406c: d4e6 sw s9,104(sp) + 406e: d2ea sw s10,100(sp) + 4070: d0ee sw s11,96(sp) + 4072: ca3a sw a4,20(sp) + 4074: 0205a883 lw a7,32(a1) # 2000020 <_data_lma+0x1ff1dc4> + 4078: 419c lw a5,0(a1) + 407a: 0085a803 lw a6,8(a1) + 407e: 4994 lw a3,16(a1) + 4080: 0185a303 lw t1,24(a1) + 4084: 4218 lw a4,0(a2) + 4086: 00862e03 lw t3,8(a2) + 408a: 00c62f03 lw t5,12(a2) + 408e: 01062283 lw t0,16(a2) + 4092: 0045a903 lw s2,4(a1) + 4096: 424c lw a1,4(a2) + 4098: cc22 sw s0,24(sp) + 409a: 4e00 lw s0,24(a2) + 409c: 00191a13 slli s4,s2,0x1 + 40a0: 02e783b3 mul t2,a5,a4 + 40a4: d422 sw s0,40(sp) + 40a6: 4e40 lw s0,28(a2) + 40a8: d622 sw s0,44(sp) + 40aa: 5200 lw s0,32(a2) + 40ac: 5250 lw a2,36(a2) + 40ae: d822 sw s0,48(sp) + 40b0: dc32 sw a2,56(sp) + 40b2: 4622 lw a2,8(sp) + 40b4: 444d li s0,19 + 40b6: 02e79db3 mulh s11,a5,a4 + 40ba: 00161993 slli s3,a2,0x1 + 40be: 4632 lw a2,12(sp) + 40c0: 0606 slli a2,a2,0x1 + 40c2: ce32 sw a2,28(sp) + 40c4: 4642 lw a2,16(sp) + 40c6: 0606 slli a2,a2,0x1 + 40c8: d032 sw a2,32(sp) + 40ca: 4652 lw a2,20(sp) + 40cc: 02828bb3 mul s7,t0,s0 + 40d0: 0606 slli a2,a2,0x1 + 40d2: d232 sw a2,36(sp) + 40d4: 4662 lw a2,24(sp) + 40d6: 02860ab3 mul s5,a2,s0 + 40da: 5622 lw a2,40(sp) + 40dc: 028604b3 mul s1,a2,s0 + 40e0: 5632 lw a2,44(sp) + 40e2: 02860fb3 mul t6,a2,s0 + 40e6: 5642 lw a2,48(sp) + 40e8: 02860eb3 mul t4,a2,s0 + 40ec: 5662 lw a2,56(sp) + 40ee: 02860633 mul a2,a2,s0 + 40f2: 02ca0b33 mul s6,s4,a2 + 40f6: 02ca1d33 mulh s10,s4,a2 + 40fa: 9b1e add s6,s6,t2 + 40fc: 007b33b3 sltu t2,s6,t2 + 4100: 9d6e add s10,s10,s11 + 4102: 9d1e add s10,s10,t2 + 4104: 03d803b3 mul t2,a6,t4 + 4108: 03d81db3 mulh s11,a6,t4 + 410c: 93da add t2,t2,s6 + 410e: 0163bb33 sltu s6,t2,s6 + 4112: 9d6e add s10,s10,s11 + 4114: 9b6a add s6,s6,s10 + 4116: 03f98d33 mul s10,s3,t6 + 411a: 03f99db3 mulh s11,s3,t6 + 411e: 9d1e add s10,s10,t2 + 4120: 007d33b3 sltu t2,s10,t2 + 4124: 9b6e add s6,s6,s11 + 4126: 93da add t2,t2,s6 + 4128: 02968b33 mul s6,a3,s1 + 412c: 02969db3 mulh s11,a3,s1 + 4130: 9b6a add s6,s6,s10 + 4132: 01ab3d33 sltu s10,s6,s10 + 4136: 93ee add t2,t2,s11 + 4138: 9d1e add s10,s10,t2 + 413a: 43f2 lw t2,28(sp) + 413c: 4df2 lw s11,28(sp) + 413e: 028f0c33 mul s8,t5,s0 + 4142: 035383b3 mul t2,t2,s5 + 4146: 035d9db3 mulh s11,s11,s5 + 414a: 93da add t2,t2,s6 + 414c: 0163bb33 sltu s6,t2,s6 + 4150: 9d6e add s10,s10,s11 + 4152: 03730db3 mul s11,t1,s7 + 4156: 9b6a add s6,s6,s10 + 4158: 03731d33 mulh s10,t1,s7 + 415c: 9d9e add s11,s11,t2 + 415e: 007db3b3 sltu t2,s11,t2 + 4162: 9d5a add s10,s10,s6 + 4164: 9d1e add s10,s10,t2 + 4166: 5382 lw t2,32(sp) + 4168: 5b02 lw s6,32(sp) + 416a: 028e0cb3 mul s9,t3,s0 + 416e: 038383b3 mul t2,t2,s8 + 4172: 038b1b33 mulh s6,s6,s8 + 4176: 93ee add t2,t2,s11 + 4178: 01b3bdb3 sltu s11,t2,s11 + 417c: 9b6a add s6,s6,s10 + 417e: 03988d33 mul s10,a7,s9 + 4182: 9b6e add s6,s6,s11 + 4184: 03989db3 mulh s11,a7,s9 + 4188: 9d1e add s10,s10,t2 + 418a: 007d33b3 sltu t2,s10,t2 + 418e: 9b6e add s6,s6,s11 + 4190: 93da add t2,t2,s6 + 4192: 02858b33 mul s6,a1,s0 + 4196: 5d92 lw s11,36(sp) + 4198: de1e sw t2,60(sp) + 419a: 5392 lw t2,36(sp) + 419c: 03bb0db3 mul s11,s6,s11 + 41a0: 027b1b33 mulh s6,s6,t2 + 41a4: 01bd03b3 add t2,s10,s11 + 41a8: da1e sw t2,52(sp) + 41aa: 01a3bd33 sltu s10,t2,s10 + 41ae: 53f2 lw t2,60(sp) + 41b0: 9b1e add s6,s6,t2 + 41b2: 016d03b3 add t2,s10,s6 + 41b6: c29e sw t2,68(sp) + 41b8: 02b78b33 mul s6,a5,a1 + 41bc: 032703b3 mul t2,a4,s2 + 41c0: 02b79db3 mulh s11,a5,a1 + 41c4: 93da add t2,t2,s6 + 41c6: 0163bb33 sltu s6,t2,s6 + 41ca: 03271d33 mulh s10,a4,s2 + 41ce: 9d6e add s10,s10,s11 + 41d0: 9d5a add s10,s10,s6 + 41d2: 03060b33 mul s6,a2,a6 + 41d6: 03061db3 mulh s11,a2,a6 + 41da: 9b1e add s6,s6,t2 + 41dc: 007b33b3 sltu t2,s6,t2 + 41e0: 9d6e add s10,s10,s11 + 41e2: 93ea add t2,t2,s10 + 41e4: 4d22 lw s10,8(sp) + 41e6: 4da2 lw s11,8(sp) + 41e8: 03ae8d33 mul s10,t4,s10 + 41ec: 03be9db3 mulh s11,t4,s11 + 41f0: 9d5a add s10,s10,s6 + 41f2: 016d3b33 sltu s6,s10,s6 + 41f6: 93ee add t2,t2,s11 + 41f8: 02df8db3 mul s11,t6,a3 + 41fc: 93da add t2,t2,s6 + 41fe: 02df9b33 mulh s6,t6,a3 + 4202: 9dea add s11,s11,s10 + 4204: 01adbd33 sltu s10,s11,s10 + 4208: 93da add t2,t2,s6 + 420a: 9d1e add s10,s10,t2 + 420c: 43b2 lw t2,12(sp) + 420e: 02748b33 mul s6,s1,t2 + 4212: 027493b3 mulh t2,s1,t2 + 4216: 9b6e add s6,s6,s11 + 4218: 01bb3db3 sltu s11,s6,s11 + 421c: 9d1e add s10,s10,t2 + 421e: 026a83b3 mul t2,s5,t1 + 4222: 9dea add s11,s11,s10 + 4224: 026a9d33 mulh s10,s5,t1 + 4228: 93da add t2,t2,s6 + 422a: 0163bb33 sltu s6,t2,s6 + 422e: 9dea add s11,s11,s10 + 4230: 4d42 lw s10,16(sp) + 4232: 9b6e add s6,s6,s11 + 4234: 4dc2 lw s11,16(sp) + 4236: 03ab8d33 mul s10,s7,s10 + 423a: 03bb9db3 mulh s11,s7,s11 + 423e: 9d1e add s10,s10,t2 + 4240: 007d33b3 sltu t2,s10,t2 + 4244: 9b6e add s6,s6,s11 + 4246: 93da add t2,t2,s6 + 4248: 031c0b33 mul s6,s8,a7 + 424c: 031c1db3 mulh s11,s8,a7 + 4250: 9b6a add s6,s6,s10 + 4252: 01ab3d33 sltu s10,s6,s10 + 4256: 93ee add t2,t2,s11 + 4258: 9d1e add s10,s10,t2 + 425a: 43d2 lw t2,20(sp) + 425c: 4dd2 lw s11,20(sp) + 425e: 027c83b3 mul t2,s9,t2 + 4262: 03bc9cb3 mulh s9,s9,s11 + 4266: 93da add t2,t2,s6 + 4268: 0163bb33 sltu s6,t2,s6 + 426c: de1e sw t2,60(sp) + 426e: 9d66 add s10,s10,s9 + 4270: 01ab03b3 add t2,s6,s10 + 4274: 03c78cb3 mul s9,a5,t3 + 4278: c69e sw t2,76(sp) + 427a: 02ba0b33 mul s6,s4,a1 + 427e: 03c79d33 mulh s10,a5,t3 + 4282: 9b66 add s6,s6,s9 + 4284: 019b3cb3 sltu s9,s6,s9 + 4288: 02ba1db3 mulh s11,s4,a1 + 428c: 01bd03b3 add t2,s10,s11 + 4290: 03070d33 mul s10,a4,a6 + 4294: 93e6 add t2,t2,s9 + 4296: 03071cb3 mulh s9,a4,a6 + 429a: 9d5a add s10,s10,s6 + 429c: 016d3b33 sltu s6,s10,s6 + 42a0: 03360db3 mul s11,a2,s3 + 42a4: 93e6 add t2,t2,s9 + 42a6: 93da add t2,t2,s6 + 42a8: 03361b33 mulh s6,a2,s3 + 42ac: 9dea add s11,s11,s10 + 42ae: 01adbd33 sltu s10,s11,s10 + 42b2: 02de8cb3 mul s9,t4,a3 + 42b6: 93da add t2,t2,s6 + 42b8: 93ea add t2,t2,s10 + 42ba: 02de9d33 mulh s10,t4,a3 + 42be: 9cee add s9,s9,s11 + 42c0: 01bcbdb3 sltu s11,s9,s11 + 42c4: 93ea add t2,t2,s10 + 42c6: 9d9e add s11,s11,t2 + 42c8: 43f2 lw t2,28(sp) + 42ca: 027f9d33 mulh s10,t6,t2 + 42ce: 027f8b33 mul s6,t6,t2 + 42d2: 9dea add s11,s11,s10 + 42d4: 026483b3 mul t2,s1,t1 + 42d8: 9b66 add s6,s6,s9 + 42da: 019b3cb3 sltu s9,s6,s9 + 42de: 9cee add s9,s9,s11 + 42e0: 02649d33 mulh s10,s1,t1 + 42e4: 93da add t2,t2,s6 + 42e6: 0163bb33 sltu s6,t2,s6 + 42ea: 9cea add s9,s9,s10 + 42ec: 9b66 add s6,s6,s9 + 42ee: 5c82 lw s9,32(sp) + 42f0: 039a8d33 mul s10,s5,s9 + 42f4: 039a9cb3 mulh s9,s5,s9 + 42f8: 9d1e add s10,s10,t2 + 42fa: 007d33b3 sltu t2,s10,t2 + 42fe: 9b66 add s6,s6,s9 + 4300: 93da add t2,t2,s6 + 4302: 031b8b33 mul s6,s7,a7 + 4306: 031b9cb3 mulh s9,s7,a7 + 430a: 9b6a add s6,s6,s10 + 430c: 01ab3d33 sltu s10,s6,s10 + 4310: 93e6 add t2,t2,s9 + 4312: 9d1e add s10,s10,t2 + 4314: 5392 lw t2,36(sp) + 4316: 03e79cb3 mulh s9,a5,t5 + 431a: 027c0db3 mul s11,s8,t2 + 431e: 027c1c33 mulh s8,s8,t2 + 4322: 9dda add s11,s11,s6 + 4324: 016dbb33 sltu s6,s11,s6 + 4328: 9d62 add s10,s10,s8 + 432a: 01ab03b3 add t2,s6,s10 + 432e: 03e78c33 mul s8,a5,t5 + 4332: c89e sw t2,80(sp) + 4334: 03c90b33 mul s6,s2,t3 + 4338: 03c91d33 mulh s10,s2,t3 + 433c: 9b62 add s6,s6,s8 + 433e: 018b3c33 sltu s8,s6,s8 + 4342: 01ac83b3 add t2,s9,s10 + 4346: 02b80cb3 mul s9,a6,a1 + 434a: 93e2 add t2,t2,s8 + 434c: 02b81c33 mulh s8,a6,a1 + 4350: 9cda add s9,s9,s6 + 4352: 016cbb33 sltu s6,s9,s6 + 4356: 93e2 add t2,t2,s8 + 4358: 93da add t2,t2,s6 + 435a: 4b22 lw s6,8(sp) + 435c: 02d60c33 mul s8,a2,a3 + 4360: 03670d33 mul s10,a4,s6 + 4364: 03671b33 mulh s6,a4,s6 + 4368: 9d66 add s10,s10,s9 + 436a: 019d3cb3 sltu s9,s10,s9 + 436e: 9c6a add s8,s8,s10 + 4370: 01ac3d33 sltu s10,s8,s10 + 4374: 93da add t2,t2,s6 + 4376: 93e6 add t2,t2,s9 + 4378: 02d61cb3 mulh s9,a2,a3 + 437c: 93e6 add t2,t2,s9 + 437e: 9d1e add s10,s10,t2 + 4380: 43b2 lw t2,12(sp) + 4382: 027e9cb3 mulh s9,t4,t2 + 4386: 027e8b33 mul s6,t4,t2 + 438a: 9d66 add s10,s10,s9 + 438c: 026f83b3 mul t2,t6,t1 + 4390: 9b62 add s6,s6,s8 + 4392: 018b3c33 sltu s8,s6,s8 + 4396: 9c6a add s8,s8,s10 + 4398: 026f9cb3 mulh s9,t6,t1 + 439c: 93da add t2,t2,s6 + 439e: 0163bb33 sltu s6,t2,s6 + 43a2: 9c66 add s8,s8,s9 + 43a4: 9b62 add s6,s6,s8 + 43a6: 4c42 lw s8,16(sp) + 43a8: 03848cb3 mul s9,s1,s8 + 43ac: 03849c33 mulh s8,s1,s8 + 43b0: 9c9e add s9,s9,t2 + 43b2: 007cb3b3 sltu t2,s9,t2 + 43b6: 9b62 add s6,s6,s8 + 43b8: 93da add t2,t2,s6 + 43ba: 031a8b33 mul s6,s5,a7 + 43be: 031a9c33 mulh s8,s5,a7 + 43c2: 9b66 add s6,s6,s9 + 43c4: 019b3cb3 sltu s9,s6,s9 + 43c8: 93e2 add t2,t2,s8 + 43ca: 9c9e add s9,s9,t2 + 43cc: 43d2 lw t2,20(sp) + 43ce: 02579c33 mulh s8,a5,t0 + 43d2: 027b8d33 mul s10,s7,t2 + 43d6: 027b9bb3 mulh s7,s7,t2 + 43da: 01ab03b3 add t2,s6,s10 + 43de: 0163bb33 sltu s6,t2,s6 + 43e2: c09e sw t2,64(sp) + 43e4: 9cde add s9,s9,s7 + 43e6: 019b03b3 add t2,s6,s9 + 43ea: 02578bb3 mul s7,a5,t0 + 43ee: ca9e sw t2,84(sp) + 43f0: 03ea0b33 mul s6,s4,t5 + 43f4: 03ea1cb3 mulh s9,s4,t5 + 43f8: 9b5e add s6,s6,s7 + 43fa: 017b3bb3 sltu s7,s6,s7 + 43fe: 019c03b3 add t2,s8,s9 + 4402: 03c80c33 mul s8,a6,t3 + 4406: 93de add t2,t2,s7 + 4408: 03c81bb3 mulh s7,a6,t3 + 440c: 9c5a add s8,s8,s6 + 440e: 016c3b33 sltu s6,s8,s6 + 4412: 02b98cb3 mul s9,s3,a1 + 4416: 93de add t2,t2,s7 + 4418: 93da add t2,t2,s6 + 441a: 02b99b33 mulh s6,s3,a1 + 441e: 9ce2 add s9,s9,s8 + 4420: 018cbc33 sltu s8,s9,s8 + 4424: 02d70bb3 mul s7,a4,a3 + 4428: 93da add t2,t2,s6 + 442a: 93e2 add t2,t2,s8 + 442c: 02d71c33 mulh s8,a4,a3 + 4430: 9be6 add s7,s7,s9 + 4432: 019bbcb3 sltu s9,s7,s9 + 4436: 93e2 add t2,t2,s8 + 4438: 9c9e add s9,s9,t2 + 443a: 43f2 lw t2,28(sp) + 443c: 02761c33 mulh s8,a2,t2 + 4440: 02760b33 mul s6,a2,t2 + 4444: 9ce2 add s9,s9,s8 + 4446: 026e83b3 mul t2,t4,t1 + 444a: 9b5e add s6,s6,s7 + 444c: 017b3bb3 sltu s7,s6,s7 + 4450: 9be6 add s7,s7,s9 + 4452: 026e9c33 mulh s8,t4,t1 + 4456: 93da add t2,t2,s6 + 4458: 0163bb33 sltu s6,t2,s6 + 445c: 9be2 add s7,s7,s8 + 445e: 9b5e add s6,s6,s7 + 4460: 5b82 lw s7,32(sp) + 4462: 037f8c33 mul s8,t6,s7 + 4466: 037f9bb3 mulh s7,t6,s7 + 446a: 9c1e add s8,s8,t2 + 446c: 007c33b3 sltu t2,s8,t2 + 4470: 9b5e add s6,s6,s7 + 4472: 93da add t2,t2,s6 + 4474: 03148b33 mul s6,s1,a7 + 4478: 03149bb3 mulh s7,s1,a7 + 447c: 9b62 add s6,s6,s8 + 447e: 018b3c33 sltu s8,s6,s8 + 4482: 93de add t2,t2,s7 + 4484: 9c1e add s8,s8,t2 + 4486: 5392 lw t2,36(sp) + 4488: 027a8cb3 mul s9,s5,t2 + 448c: 027a9ab3 mulh s5,s5,t2 + 4490: 9cda add s9,s9,s6 + 4492: 016cbb33 sltu s6,s9,s6 + 4496: 9c56 add s8,s8,s5 + 4498: 018b03b3 add t2,s6,s8 + 449c: c49e sw t2,72(sp) + 449e: 43e2 lw t2,24(sp) + 44a0: 02590ab3 mul s5,s2,t0 + 44a4: 02778b33 mul s6,a5,t2 + 44a8: 02591c33 mulh s8,s2,t0 + 44ac: 9ada add s5,s5,s6 + 44ae: 016abb33 sltu s6,s5,s6 + 44b2: 02779bb3 mulh s7,a5,t2 + 44b6: 018b83b3 add t2,s7,s8 + 44ba: 03e80bb3 mul s7,a6,t5 + 44be: 93da add t2,t2,s6 + 44c0: 03e81b33 mulh s6,a6,t5 + 44c4: 9bd6 add s7,s7,s5 + 44c6: 015bbab3 sltu s5,s7,s5 + 44ca: 93da add t2,t2,s6 + 44cc: 93d6 add t2,t2,s5 + 44ce: 4aa2 lw s5,8(sp) + 44d0: 02b68b33 mul s6,a3,a1 + 44d4: 03ca8c33 mul s8,s5,t3 + 44d8: 03ca9ab3 mulh s5,s5,t3 + 44dc: 9c5e add s8,s8,s7 + 44de: 017c3bb3 sltu s7,s8,s7 + 44e2: 9b62 add s6,s6,s8 + 44e4: 018b3c33 sltu s8,s6,s8 + 44e8: 93d6 add t2,t2,s5 + 44ea: 93de add t2,t2,s7 + 44ec: 02b69bb3 mulh s7,a3,a1 + 44f0: 93de add t2,t2,s7 + 44f2: 9c1e add s8,s8,t2 + 44f4: 43b2 lw t2,12(sp) + 44f6: 02771bb3 mulh s7,a4,t2 + 44fa: 02770ab3 mul s5,a4,t2 + 44fe: 9c5e add s8,s8,s7 + 4500: 026603b3 mul t2,a2,t1 + 4504: 9ada add s5,s5,s6 + 4506: 016abb33 sltu s6,s5,s6 + 450a: 9b62 add s6,s6,s8 + 450c: 02661bb3 mulh s7,a2,t1 + 4510: 93d6 add t2,t2,s5 + 4512: 0153bab3 sltu s5,t2,s5 + 4516: 9b5e add s6,s6,s7 + 4518: 9ada add s5,s5,s6 + 451a: 4b42 lw s6,16(sp) + 451c: 036e8bb3 mul s7,t4,s6 + 4520: 036e9b33 mulh s6,t4,s6 + 4524: 9b9e add s7,s7,t2 + 4526: 007bb3b3 sltu t2,s7,t2 + 452a: 9ada add s5,s5,s6 + 452c: 93d6 add t2,t2,s5 + 452e: 031f8ab3 mul s5,t6,a7 + 4532: 031f9b33 mulh s6,t6,a7 + 4536: 9ade add s5,s5,s7 + 4538: 017abbb3 sltu s7,s5,s7 + 453c: 93da add t2,t2,s6 + 453e: 9b9e add s7,s7,t2 + 4540: 43d2 lw t2,20(sp) + 4542: 02748c33 mul s8,s1,t2 + 4546: 027494b3 mulh s1,s1,t2 + 454a: 018a8d33 add s10,s5,s8 + 454e: 015d3ab3 sltu s5,s10,s5 + 4552: 43e2 lw t2,24(sp) + 4554: 9ba6 add s7,s7,s1 + 4556: 017a84b3 add s1,s5,s7 + 455a: cca6 sw s1,88(sp) + 455c: 54a2 lw s1,40(sp) + 455e: 027a1bb3 mulh s7,s4,t2 + 4562: 02978ab3 mul s5,a5,s1 + 4566: 02979b33 mulh s6,a5,s1 + 456a: 44e2 lw s1,24(sp) + 456c: 029a04b3 mul s1,s4,s1 + 4570: 017b03b3 add t2,s6,s7 + 4574: 94d6 add s1,s1,s5 + 4576: 0154bab3 sltu s5,s1,s5 + 457a: 93d6 add t2,t2,s5 + 457c: 02580ab3 mul s5,a6,t0 + 4580: 02581b33 mulh s6,a6,t0 + 4584: 9aa6 add s5,s5,s1 + 4586: 009ab4b3 sltu s1,s5,s1 + 458a: 93da add t2,t2,s6 + 458c: 93a6 add t2,t2,s1 + 458e: 03e994b3 mulh s1,s3,t5 + 4592: 03e98b33 mul s6,s3,t5 + 4596: 93a6 add t2,t2,s1 + 4598: 03c684b3 mul s1,a3,t3 + 459c: 9b56 add s6,s6,s5 + 459e: 015b3ab3 sltu s5,s6,s5 + 45a2: 93d6 add t2,t2,s5 + 45a4: 4af2 lw s5,28(sp) + 45a6: 03c69c33 mulh s8,a3,t3 + 45aa: 94da add s1,s1,s6 + 45ac: 0164bb33 sltu s6,s1,s6 + 45b0: 93e2 add t2,t2,s8 + 45b2: 9b1e add s6,s6,t2 + 45b4: 43f2 lw t2,28(sp) + 45b6: 02ba9c33 mulh s8,s5,a1 + 45ba: 02b383b3 mul t2,t2,a1 + 45be: 9b62 add s6,s6,s8 + 45c0: 93a6 add t2,t2,s1 + 45c2: 0093b4b3 sltu s1,t2,s1 + 45c6: 01648bb3 add s7,s1,s6 + 45ca: 02670b33 mul s6,a4,t1 + 45ce: 5482 lw s1,32(sp) + 45d0: 02671c33 mulh s8,a4,t1 + 45d4: 9b1e add s6,s6,t2 + 45d6: 007b33b3 sltu t2,s6,t2 + 45da: 018b8ab3 add s5,s7,s8 + 45de: 9a9e add s5,s5,t2 + 45e0: 029603b3 mul t2,a2,s1 + 45e4: 02961bb3 mulh s7,a2,s1 + 45e8: 93da add t2,t2,s6 + 45ea: 0163bb33 sltu s6,t2,s6 + 45ee: 017a84b3 add s1,s5,s7 + 45f2: 031e8ab3 mul s5,t4,a7 + 45f6: 94da add s1,s1,s6 + 45f8: 031e9b33 mulh s6,t4,a7 + 45fc: 9a9e add s5,s5,t2 + 45fe: 007ab3b3 sltu t2,s5,t2 + 4602: 94da add s1,s1,s6 + 4604: 93a6 add t2,t2,s1 + 4606: 5492 lw s1,36(sp) + 4608: 5b12 lw s6,36(sp) + 460a: 029f84b3 mul s1,t6,s1 + 460e: 036f9fb3 mulh t6,t6,s6 + 4612: 94d6 add s1,s1,s5 + 4614: 0154bab3 sltu s5,s1,s5 + 4618: 9f9e add t6,t6,t2 + 461a: 01fa8c33 add s8,s5,t6 + 461e: 5fb2 lw t6,44(sp) + 4620: 5aa2 lw s5,40(sp) + 4622: 03f783b3 mul t2,a5,t6 + 4626: 03f79b33 mulh s6,a5,t6 + 462a: 5fa2 lw t6,40(sp) + 462c: 03f90fb3 mul t6,s2,t6 + 4630: 03591bb3 mulh s7,s2,s5 + 4634: 9f9e add t6,t6,t2 + 4636: 007fb3b3 sltu t2,t6,t2 + 463a: 017b0ab3 add s5,s6,s7 + 463e: 9a9e add s5,s5,t2 + 4640: 43e2 lw t2,24(sp) + 4642: 4b62 lw s6,24(sp) + 4644: 027803b3 mul t2,a6,t2 + 4648: 03681b33 mulh s6,a6,s6 + 464c: 93fe add t2,t2,t6 + 464e: 01f3bfb3 sltu t6,t2,t6 + 4652: 9ada add s5,s5,s6 + 4654: 9fd6 add t6,t6,s5 + 4656: 4aa2 lw s5,8(sp) + 4658: 4b22 lw s6,8(sp) + 465a: 025a8ab3 mul s5,s5,t0 + 465e: 025b1b33 mulh s6,s6,t0 + 4662: 9a9e add s5,s5,t2 + 4664: 007ab3b3 sltu t2,s5,t2 + 4668: 9fda add t6,t6,s6 + 466a: 03e68b33 mul s6,a3,t5 + 466e: 9f9e add t6,t6,t2 + 4670: 03e693b3 mulh t2,a3,t5 + 4674: 9b56 add s6,s6,s5 + 4676: 015b3ab3 sltu s5,s6,s5 + 467a: 9f9e add t6,t6,t2 + 467c: 9afe add s5,s5,t6 + 467e: 4fb2 lw t6,12(sp) + 4680: 03cf83b3 mul t2,t6,t3 + 4684: 03cf9bb3 mulh s7,t6,t3 + 4688: 93da add t2,t2,s6 + 468a: 0163bb33 sltu s6,t2,s6 + 468e: 9ade add s5,s5,s7 + 4690: 02b30fb3 mul t6,t1,a1 + 4694: 9b56 add s6,s6,s5 + 4696: 02b31ab3 mulh s5,t1,a1 + 469a: 9f9e add t6,t6,t2 + 469c: 007fb3b3 sltu t2,t6,t2 + 46a0: 9b56 add s6,s6,s5 + 46a2: 4ac2 lw s5,16(sp) + 46a4: 93da add t2,t2,s6 + 46a6: 4b42 lw s6,16(sp) + 46a8: 03570ab3 mul s5,a4,s5 + 46ac: 03671b33 mulh s6,a4,s6 + 46b0: 9afe add s5,s5,t6 + 46b2: 01fabfb3 sltu t6,s5,t6 + 46b6: 93da add t2,t2,s6 + 46b8: 9f9e add t6,t6,t2 + 46ba: 031603b3 mul t2,a2,a7 + 46be: 03161b33 mulh s6,a2,a7 + 46c2: 93d6 add t2,t2,s5 + 46c4: 0153bab3 sltu s5,t2,s5 + 46c8: 9fda add t6,t6,s6 + 46ca: 9afe add s5,s5,t6 + 46cc: 4fd2 lw t6,20(sp) + 46ce: 03fe8bb3 mul s7,t4,t6 + 46d2: 03fe9eb3 mulh t4,t4,t6 + 46d6: 9b9e add s7,s7,t2 + 46d8: 5fc2 lw t6,48(sp) + 46da: 007bb3b3 sltu t2,s7,t2 + 46de: 9af6 add s5,s5,t4 + 46e0: 01538eb3 add t4,t2,s5 + 46e4: cef6 sw t4,92(sp) + 46e6: 03f793b3 mulh t2,a5,t6 + 46ea: 5ec2 lw t4,48(sp) + 46ec: 5fb2 lw t6,44(sp) + 46ee: 5ab2 lw s5,44(sp) + 46f0: 03d78eb3 mul t4,a5,t4 + 46f4: 03fa0fb3 mul t6,s4,t6 + 46f8: 035a1a33 mulh s4,s4,s5 + 46fc: 9ff6 add t6,t6,t4 + 46fe: 01dfbeb3 sltu t4,t6,t4 + 4702: 9a1e add s4,s4,t2 + 4704: 014e83b3 add t2,t4,s4 + 4708: 5ea2 lw t4,40(sp) + 470a: 02568a33 mul s4,a3,t0 + 470e: 03d80ab3 mul s5,a6,t4 + 4712: 03d81eb3 mulh t4,a6,t4 + 4716: 9afe add s5,s5,t6 + 4718: 01fabfb3 sltu t6,s5,t6 + 471c: 93f6 add t2,t2,t4 + 471e: 4ee2 lw t4,24(sp) + 4720: 9f9e add t6,t6,t2 + 4722: 03c303b3 mul t2,t1,t3 + 4726: 03d98b33 mul s6,s3,t4 + 472a: 03d999b3 mulh s3,s3,t4 + 472e: 9b56 add s6,s6,s5 + 4730: 015b3ab3 sltu s5,s6,s5 + 4734: 9a5a add s4,s4,s6 + 4736: 016a3b33 sltu s6,s4,s6 + 473a: 4ef2 lw t4,28(sp) + 473c: 9fce add t6,t6,s3 + 473e: 025699b3 mulh s3,a3,t0 + 4742: 9fd6 add t6,t6,s5 + 4744: 9fce add t6,t6,s3 + 4746: 9b7e add s6,s6,t6 + 4748: 4ff2 lw t6,28(sp) + 474a: 03ee8eb3 mul t4,t4,t5 + 474e: 03ef9fb3 mulh t6,t6,t5 + 4752: 9ed2 add t4,t4,s4 + 4754: 014eba33 sltu s4,t4,s4 + 4758: 93f6 add t2,t2,t4 + 475a: 01d3beb3 sltu t4,t2,t4 + 475e: 9b7e add s6,s6,t6 + 4760: 03c31fb3 mulh t6,t1,t3 + 4764: 9b52 add s6,s6,s4 + 4766: 9b7e add s6,s6,t6 + 4768: 5f82 lw t6,32(sp) + 476a: 03170a33 mul s4,a4,a7 + 476e: 9eda add t4,t4,s6 + 4770: 02bf89b3 mul s3,t6,a1 + 4774: 02bf9fb3 mulh t6,t6,a1 + 4778: 999e add s3,s3,t2 + 477a: 0079b3b3 sltu t2,s3,t2 + 477e: 9a4e add s4,s4,s3 + 4780: 013a39b3 sltu s3,s4,s3 + 4784: 9efe add t4,t4,t6 + 4786: 03171fb3 mulh t6,a4,a7 + 478a: 9e9e add t4,t4,t2 + 478c: 53c2 lw t2,48(sp) + 478e: 9efe add t4,t4,t6 + 4790: 99f6 add s3,s3,t4 + 4792: 5e92 lw t4,36(sp) + 4794: 5fe2 lw t6,56(sp) + 4796: 03d60ab3 mul s5,a2,t4 + 479a: 03d61633 mulh a2,a2,t4 + 479e: 015a0eb3 add t4,s4,s5 + 47a2: 014eba33 sltu s4,t4,s4 + 47a6: 99b2 add s3,s3,a2 + 47a8: 5662 lw a2,56(sp) + 47aa: 99d2 add s3,s3,s4 + 47ac: 02c78633 mul a2,a5,a2 + 47b0: 03f797b3 mulh a5,a5,t6 + 47b4: 5fc2 lw t6,48(sp) + 47b6: 03f90fb3 mul t6,s2,t6 + 47ba: 02791933 mulh s2,s2,t2 + 47be: 9fb2 add t6,t6,a2 + 47c0: 00cfb633 sltu a2,t6,a2 + 47c4: 97ca add a5,a5,s2 + 47c6: 963e add a2,a2,a5 + 47c8: 57b2 lw a5,44(sp) + 47ca: 02f803b3 mul t2,a6,a5 + 47ce: 02f81833 mulh a6,a6,a5 + 47d2: 93fe add t2,t2,t6 + 47d4: 01f3bfb3 sltu t6,t2,t6 + 47d8: 47a2 lw a5,8(sp) + 47da: 9642 add a2,a2,a6 + 47dc: 9fb2 add t6,t6,a2 + 47de: 5622 lw a2,40(sp) + 47e0: 02c787b3 mul a5,a5,a2 + 47e4: 4622 lw a2,8(sp) + 47e6: 5822 lw a6,40(sp) + 47e8: 03061633 mulh a2,a2,a6 + 47ec: 979e add a5,a5,t2 + 47ee: 0077b3b3 sltu t2,a5,t2 + 47f2: 9fb2 add t6,t6,a2 + 47f4: 4662 lw a2,24(sp) + 47f6: 93fe add t2,t2,t6 + 47f8: 02c68833 mul a6,a3,a2 + 47fc: 02c696b3 mulh a3,a3,a2 + 4800: 983e add a6,a6,a5 + 4802: 00f837b3 sltu a5,a6,a5 + 4806: 93b6 add t2,t2,a3 + 4808: 46b2 lw a3,12(sp) + 480a: 979e add a5,a5,t2 + 480c: 02568633 mul a2,a3,t0 + 4810: 025692b3 mulh t0,a3,t0 + 4814: 9642 add a2,a2,a6 + 4816: 01063833 sltu a6,a2,a6 + 481a: 9796 add a5,a5,t0 + 481c: 983e add a6,a6,a5 + 481e: 47c2 lw a5,16(sp) + 4820: 03e306b3 mul a3,t1,t5 + 4824: 03e31333 mulh t1,t1,t5 + 4828: 96b2 add a3,a3,a2 + 482a: 00c6b633 sltu a2,a3,a2 + 482e: 03c78fb3 mul t6,a5,t3 + 4832: 981a add a6,a6,t1 + 4834: 9642 add a2,a2,a6 + 4836: 03c79e33 mulh t3,a5,t3 + 483a: 9fb6 add t6,t6,a3 + 483c: 00dfb6b3 sltu a3,t6,a3 + 4840: 02b887b3 mul a5,a7,a1 + 4844: 9672 add a2,a2,t3 + 4846: 96b2 add a3,a3,a2 + 4848: 4616 lw a2,68(sp) + 484a: 4e26 lw t3,72(sp) + 484c: 02b895b3 mulh a1,a7,a1 + 4850: 97fe add a5,a5,t6 + 4852: 01f7bfb3 sltu t6,a5,t6 + 4856: 4896 lw a7,68(sp) + 4858: 96ae add a3,a3,a1 + 485a: 9fb6 add t6,t6,a3 + 485c: 46d2 lw a3,20(sp) + 485e: 02d70333 mul t1,a4,a3 + 4862: 02d71733 mulh a4,a4,a3 + 4866: 933e add t1,t1,a5 + 4868: 00f337b3 sltu a5,t1,a5 + 486c: 977e add a4,a4,t6 + 486e: 00e78833 add a6,a5,a4 + 4872: 57d2 lw a5,52(sp) + 4874: 02000737 lui a4,0x2000 + 4878: 00e786b3 add a3,a5,a4 + 487c: 00f6b7b3 sltu a5,a3,a5 + 4880: 97b2 add a5,a5,a2 + 4882: 00679613 slli a2,a5,0x6 + 4886: 82e9 srli a3,a3,0x1a + 4888: 8ed1 or a3,a3,a2 + 488a: 87e9 srai a5,a5,0x1a + 488c: 0066d613 srli a2,a3,0x6 + 4890: 01a79b13 slli s6,a5,0x1a + 4894: 01666b33 or s6,a2,s6 + 4898: 5652 lw a2,52(sp) + 489a: 01a69593 slli a1,a3,0x1a + 489e: 41688b33 sub s6,a7,s6 + 48a2: 40b605b3 sub a1,a2,a1 + 48a6: 00b63633 sltu a2,a2,a1 + 48aa: 40cb08b3 sub a7,s6,a2 + 48ae: 5672 lw a2,60(sp) + 48b0: 96b2 add a3,a3,a2 + 48b2: 00c6b3b3 sltu t2,a3,a2 + 48b6: 4636 lw a2,76(sp) + 48b8: 00f60b33 add s6,a2,a5 + 48bc: 00ec8633 add a2,s9,a4 + 48c0: 019637b3 sltu a5,a2,s9 + 48c4: 97f2 add a5,a5,t3 + 48c6: 00679e13 slli t3,a5,0x6 + 48ca: 8269 srli a2,a2,0x1a + 48cc: 00ce6633 or a2,t3,a2 + 48d0: 87e9 srai a5,a5,0x1a + 48d2: 00665e13 srli t3,a2,0x6 + 48d6: 93da add t2,t2,s6 + 48d8: 01a79b13 slli s6,a5,0x1a + 48dc: 016e6b33 or s6,t3,s6 + 48e0: 4e26 lw t3,72(sp) + 48e2: 01a61f13 slli t5,a2,0x1a + 48e6: 41ec8f33 sub t5,s9,t5 + 48ea: 416e0b33 sub s6,t3,s6 + 48ee: 4e66 lw t3,88(sp) + 48f0: 01ecbcb3 sltu s9,s9,t5 + 48f4: 419b0933 sub s2,s6,s9 + 48f8: 00fe0ab3 add s5,t3,a5 + 48fc: 010007b7 lui a5,0x1000 + 4900: 00f68e33 add t3,a3,a5 + 4904: 00de3b33 sltu s6,t3,a3 + 4908: 93da add t2,t2,s6 + 490a: 00739f93 slli t6,t2,0x7 + 490e: 019e5e13 srli t3,t3,0x19 + 4912: 01cfee33 or t3,t6,t3 + 4916: 019e1293 slli t0,t3,0x19 + 491a: 405682b3 sub t0,a3,t0 + 491e: 46c6 lw a3,80(sp) + 4920: 966a add a2,a2,s10 + 4922: 4193db13 srai s6,t2,0x19 + 4926: 01a63d33 sltu s10,a2,s10 + 492a: 9b36 add s6,s6,a3 + 492c: 00f606b3 add a3,a2,a5 + 4930: 9aea add s5,s5,s10 + 4932: 00c6bd33 sltu s10,a3,a2 + 4936: 9aea add s5,s5,s10 + 4938: 007a9f93 slli t6,s5,0x7 + 493c: 82e5 srli a3,a3,0x19 + 493e: 00dfe6b3 or a3,t6,a3 + 4942: 9e6e add t3,t3,s11 + 4944: 01969f93 slli t6,a3,0x19 + 4948: 01be3cb3 sltu s9,t3,s11 + 494c: 96a6 add a3,a3,s1 + 494e: 41f60633 sub a2,a2,t6 + 4952: 419ada93 srai s5,s5,0x19 + 4956: 00ee0fb3 add t6,t3,a4 + 495a: 9b66 add s6,s6,s9 + 495c: 0096b4b3 sltu s1,a3,s1 + 4960: 01cfbcb3 sltu s9,t6,t3 + 4964: 9ae2 add s5,s5,s8 + 4966: 9cda add s9,s9,s6 + 4968: 9aa6 add s5,s5,s1 + 496a: 4486 lw s1,64(sp) + 496c: 006c9393 slli t2,s9,0x6 + 4970: 01afdf93 srli t6,t6,0x1a + 4974: 01f3efb3 or t6,t2,t6 + 4978: 01f48c33 add s8,s1,t6 + 497c: 009c3d33 sltu s10,s8,s1 + 4980: 44d6 lw s1,84(sp) + 4982: 41acdc93 srai s9,s9,0x1a + 4986: 0fea slli t6,t6,0x1a + 4988: 9ca6 add s9,s9,s1 + 498a: 00e684b3 add s1,a3,a4 + 498e: 00d4b3b3 sltu t2,s1,a3 + 4992: 9a9e add s5,s5,t2 + 4994: 006a9393 slli t2,s5,0x6 + 4998: 80e9 srli s1,s1,0x1a + 499a: 0093e4b3 or s1,t2,s1 + 499e: 43f6 lw t2,92(sp) + 49a0: 41aada93 srai s5,s5,0x1a + 49a4: 9cea add s9,s9,s10 + 49a6: 9a9e add s5,s5,t2 + 49a8: 00fc03b3 add t2,s8,a5 + 49ac: 0183bd33 sltu s10,t2,s8 + 49b0: 9cea add s9,s9,s10 + 49b2: 007c9a13 slli s4,s9,0x7 + 49b6: 0193d393 srli t2,t2,0x19 + 49ba: 007a63b3 or t2,s4,t2 + 49be: 007f0d33 add s10,t5,t2 + 49c2: 419cdc93 srai s9,s9,0x19 + 49c6: 009b8b33 add s6,s7,s1 + 49ca: 9cca add s9,s9,s2 + 49cc: 01ed3f33 sltu t5,s10,t5 + 49d0: 017b3bb3 sltu s7,s6,s7 + 49d4: 9f66 add t5,t5,s9 + 49d6: 00fb0cb3 add s9,s6,a5 + 49da: 016cbdb3 sltu s11,s9,s6 + 49de: 9bd6 add s7,s7,s5 + 49e0: 9bee add s7,s7,s11 + 49e2: 00ed0a33 add s4,s10,a4 + 49e6: 007b9913 slli s2,s7,0x7 + 49ea: 019cdc93 srli s9,s9,0x19 + 49ee: 01996cb3 or s9,s2,s9 + 49f2: 01aa3933 sltu s2,s4,s10 + 49f6: 9f4a add t5,t5,s2 + 49f8: 419bdd93 srai s11,s7,0x19 + 49fc: 0f1a slli t5,t5,0x6 + 49fe: 019e8bb3 add s7,t4,s9 + 4a02: 01aa5a13 srli s4,s4,0x1a + 4a06: 01dbbab3 sltu s5,s7,t4 + 4a0a: 014f6a33 or s4,t5,s4 + 4a0e: 99ee add s3,s3,s11 + 4a10: 00eb8f33 add t5,s7,a4 + 4a14: 99d6 add s3,s3,s5 + 4a16: 017f3ab3 sltu s5,t5,s7 + 4a1a: 9ace add s5,s5,s3 + 4a1c: 006a9e93 slli t4,s5,0x6 + 4a20: 01af5f13 srli t5,t5,0x1a + 4a24: 01eeef33 or t5,t4,t5 + 4a28: 01e30933 add s2,t1,t5 + 4a2c: 41aada93 srai s5,s5,0x1a + 4a30: 9856 add a6,a6,s5 + 4a32: 97ca add a5,a5,s2 + 4a34: 00693333 sltu t1,s2,t1 + 4a38: 9342 add t1,t1,a6 + 4a3a: 0127b833 sltu a6,a5,s2 + 4a3e: 981a add a6,a6,t1 + 4a40: 00781313 slli t1,a6,0x7 + 4a44: 83e5 srli a5,a5,0x19 + 4a46: 00f367b3 or a5,t1,a5 + 4a4a: 41985813 srai a6,a6,0x19 + 4a4e: 02f40333 mul t1,s0,a5 + 4a52: 04ea slli s1,s1,0x1a + 4a54: 0ce6 slli s9,s9,0x19 + 4a56: 03e6 slli t2,t2,0x19 + 4a58: 0f6a slli t5,t5,0x1a + 4a5a: 419b0b33 sub s6,s6,s9 + 4a5e: 407c0c33 sub s8,s8,t2 + 4a62: 9652 add a2,a2,s4 + 4a64: 8e85 sub a3,a3,s1 + 4a66: 41eb8bb3 sub s7,s7,t5 + 4a6a: 03040833 mul a6,s0,a6 + 4a6e: 959a add a1,a1,t1 + 4a70: 0065b333 sltu t1,a1,t1 + 4a74: 972e add a4,a4,a1 + 4a76: 41fe0e33 sub t3,t3,t6 + 4a7a: 01852623 sw s8,12(a0) + 4a7e: 01652e23 sw s6,28(a0) + 4a82: 03752023 sw s7,32(a0) + 4a86: 44aa lw s1,136(sp) + 4a88: 01c52423 sw t3,8(a0) + 4a8c: 02f43433 mulhu s0,s0,a5 + 4a90: 07e6 slli a5,a5,0x19 + 4a92: 40f907b3 sub a5,s2,a5 + 4a96: c950 sw a2,20(a0) + 4a98: 491a lw s2,132(sp) + 4a9a: cd14 sw a3,24(a0) + 4a9c: d15c sw a5,36(a0) + 4a9e: 9442 add s0,s0,a6 + 4aa0: 98a2 add a7,a7,s0 + 4aa2: 989a add a7,a7,t1 + 4aa4: 00b73333 sltu t1,a4,a1 + 4aa8: 989a add a7,a7,t1 + 4aaa: 089a slli a7,a7,0x6 + 4aac: 8369 srli a4,a4,0x1a + 4aae: 00e8e733 or a4,a7,a4 + 4ab2: 443a lw s0,140(sp) + 4ab4: 01a71813 slli a6,a4,0x1a + 4ab8: 9716 add a4,a4,t0 + 4aba: c158 sw a4,4(a0) + 4abc: 01aa1713 slli a4,s4,0x1a + 4ac0: 40ed0d33 sub s10,s10,a4 + 4ac4: 410585b3 sub a1,a1,a6 + 4ac8: 01a52823 sw s10,16(a0) + 4acc: c10c sw a1,0(a0) + 4ace: 498a lw s3,128(sp) + 4ad0: 5a76 lw s4,124(sp) + 4ad2: 5ae6 lw s5,120(sp) + 4ad4: 5b56 lw s6,116(sp) + 4ad6: 5bc6 lw s7,112(sp) + 4ad8: 5c36 lw s8,108(sp) + 4ada: 5ca6 lw s9,104(sp) + 4adc: 5d16 lw s10,100(sp) + 4ade: 5d86 lw s11,96(sp) + 4ae0: 6149 addi sp,sp,144 + 4ae2: 8082 ret + +00004ae4 : + 4ae4: 715d addi sp,sp,-80 + 4ae6: d466 sw s9,40(sp) + 4ae8: 0245ac83 lw s9,36(a1) + 4aec: dc56 sw s5,56(sp) + 4aee: 02600a93 li s5,38 + 4af2: 035c8633 mul a2,s9,s5 + 4af6: c6a2 sw s0,76(sp) + 4af8: 41c0 lw s0,4(a1) + 4afa: 0005a883 lw a7,0(a1) + 4afe: da5a sw s6,52(sp) + 4b00: 00141693 slli a3,s0,0x1 + 4b04: 0205ab03 lw s6,32(a1) + 4b08: c2ca sw s2,68(sp) + 4b0a: de52 sw s4,60(sp) + 4b0c: 00189793 slli a5,a7,0x1 + 4b10: 03188933 mul s2,a7,a7 + 4b14: d662 sw s8,44(sp) + 4b16: d06e sw s11,32(sp) + 4b18: 4c4d li s8,19 + 4b1a: 4998 lw a4,16(a1) + 4b1c: 0185a303 lw t1,24(a1) + 4b20: d85e sw s7,48(sp) + 4b22: 0085af03 lw t5,8(a1) + 4b26: 01c5ab83 lw s7,28(a1) + 4b2a: 0145a383 lw t2,20(a1) + 4b2e: 02c68a33 mul s4,a3,a2 + 4b32: 00c5af83 lw t6,12(a1) + 4b36: 001f1e93 slli t4,t5,0x1 + 4b3a: c4a6 sw s1,72(sp) + 4b3c: 001f9813 slli a6,t6,0x1 + 4b40: c0ce sw s3,64(sp) + 4b42: 00171993 slli s3,a4,0x1 + 4b46: 00139e13 slli t3,t2,0x1 + 4b4a: d26a sw s10,36(sp) + 4b4c: 001b9d13 slli s10,s7,0x1 + 4b50: 02c69db3 mulh s11,a3,a2 + 4b54: 9a4a add s4,s4,s2 + 4b56: 012a3933 sltu s2,s4,s2 + 4b5a: 031898b3 mulh a7,a7,a7 + 4b5e: 038b05b3 mul a1,s6,s8 + 4b62: 98ee add a7,a7,s11 + 4b64: 98ca add a7,a7,s2 + 4b66: 02be8933 mul s2,t4,a1 + 4b6a: 035b82b3 mul t0,s7,s5 + 4b6e: 9952 add s2,s2,s4 + 4b70: 01493a33 sltu s4,s2,s4 + 4b74: 02be9db3 mulh s11,t4,a1 + 4b78: 98ee add a7,a7,s11 + 4b7a: 02580db3 mul s11,a6,t0 + 4b7e: 9a46 add s4,s4,a7 + 4b80: 025818b3 mulh a7,a6,t0 + 4b84: 9dca add s11,s11,s2 + 4b86: 012db933 sltu s2,s11,s2 + 4b8a: 038304b3 mul s1,t1,s8 + 4b8e: 98d2 add a7,a7,s4 + 4b90: 9946 add s2,s2,a7 + 4b92: 029998b3 mulh a7,s3,s1 + 4b96: 98ca add a7,a7,s2 + 4b98: 03538933 mul s2,t2,s5 + 4b9c: 02998a33 mul s4,s3,s1 + 4ba0: 02790ab3 mul s5,s2,t2 + 4ba4: 9a6e add s4,s4,s11 + 4ba6: 01ba3db3 sltu s11,s4,s11 + 4baa: 98ee add a7,a7,s11 + 4bac: 02791933 mulh s2,s2,t2 + 4bb0: 9ad2 add s5,s5,s4 + 4bb2: 014aba33 sltu s4,s5,s4 + 4bb6: 9946 add s2,s2,a7 + 4bb8: 012a08b3 add a7,s4,s2 + 4bbc: 02878a33 mul s4,a5,s0 + 4bc0: c646 sw a7,12(sp) + 4bc2: 03e60933 mul s2,a2,t5 + 4bc6: 02879db3 mulh s11,a5,s0 + 4bca: 9952 add s2,s2,s4 + 4bcc: 01493a33 sltu s4,s2,s4 + 4bd0: 03e618b3 mulh a7,a2,t5 + 4bd4: 98ee add a7,a7,s11 + 4bd6: 98d2 add a7,a7,s4 + 4bd8: 03058a33 mul s4,a1,a6 + 4bdc: 03059db3 mulh s11,a1,a6 + 4be0: 9a4a add s4,s4,s2 + 4be2: 012a3933 sltu s2,s4,s2 + 4be6: 98ee add a7,a7,s11 + 4be8: 02e28db3 mul s11,t0,a4 + 4bec: 98ca add a7,a7,s2 + 4bee: 02e29933 mulh s2,t0,a4 + 4bf2: 9dd2 add s11,s11,s4 + 4bf4: 014dba33 sltu s4,s11,s4 + 4bf8: 98ca add a7,a7,s2 + 4bfa: 03c48933 mul s2,s1,t3 + 4bfe: 98d2 add a7,a7,s4 + 4c00: 03c49a33 mulh s4,s1,t3 + 4c04: 996e add s2,s2,s11 + 4c06: 01b93db3 sltu s11,s2,s11 + 4c0a: c44a sw s2,8(sp) + 4c0c: 98d2 add a7,a7,s4 + 4c0e: 98ee add a7,a7,s11 + 4c10: c846 sw a7,16(sp) + 4c12: 02868933 mul s2,a3,s0 + 4c16: 03e788b3 mul a7,a5,t5 + 4c1a: 03e79a33 mulh s4,a5,t5 + 4c1e: 9946 add s2,s2,a7 + 4c20: 011938b3 sltu a7,s2,a7 + 4c24: 02869433 mulh s0,a3,s0 + 4c28: 9452 add s0,s0,s4 + 4c2a: 98a2 add a7,a7,s0 + 4c2c: 03060433 mul s0,a2,a6 + 4c30: 03061a33 mulh s4,a2,a6 + 4c34: 944a add s0,s0,s2 + 4c36: 01243933 sltu s2,s0,s2 + 4c3a: 03358db3 mul s11,a1,s3 + 4c3e: 98d2 add a7,a7,s4 + 4c40: 9946 add s2,s2,a7 + 4c42: 033599b3 mulh s3,a1,s3 + 4c46: 9da2 add s11,s11,s0 + 4c48: 008db433 sltu s0,s11,s0 + 4c4c: 03c288b3 mul a7,t0,t3 + 4c50: 994e add s2,s2,s3 + 4c52: 9922 add s2,s2,s0 + 4c54: 03c29433 mulh s0,t0,t3 + 4c58: 98ee add a7,a7,s11 + 4c5a: 01b8bdb3 sltu s11,a7,s11 + 4c5e: 9922 add s2,s2,s0 + 4c60: 9dca add s11,s11,s2 + 4c62: 02648933 mul s2,s1,t1 + 4c66: 026494b3 mulh s1,s1,t1 + 4c6a: 9946 add s2,s2,a7 + 4c6c: 011938b3 sltu a7,s2,a7 + 4c70: 94ee add s1,s1,s11 + 4c72: 00988433 add s0,a7,s1 + 4c76: 03f788b3 mul a7,a5,t6 + 4c7a: ca22 sw s0,20(sp) + 4c7c: 03e684b3 mul s1,a3,t5 + 4c80: 03f799b3 mulh s3,a5,t6 + 4c84: 94c6 add s1,s1,a7 + 4c86: 0114b8b3 sltu a7,s1,a7 + 4c8a: 03e69a33 mulh s4,a3,t5 + 4c8e: 01498433 add s0,s3,s4 + 4c92: 9446 add s0,s0,a7 + 4c94: 02e608b3 mul a7,a2,a4 + 4c98: 02e619b3 mulh s3,a2,a4 + 4c9c: 98a6 add a7,a7,s1 + 4c9e: 0098b4b3 sltu s1,a7,s1 + 4ca2: 944e add s0,s0,s3 + 4ca4: 03c589b3 mul s3,a1,t3 + 4ca8: 9426 add s0,s0,s1 + 4caa: 03c594b3 mulh s1,a1,t3 + 4cae: 99c6 add s3,s3,a7 + 4cb0: 0119b8b3 sltu a7,s3,a7 + 4cb4: 9426 add s0,s0,s1 + 4cb6: 98a2 add a7,a7,s0 + 4cb8: 02628433 mul s0,t0,t1 + 4cbc: 026294b3 mulh s1,t0,t1 + 4cc0: 944e add s0,s0,s3 + 4cc2: 013439b3 sltu s3,s0,s3 + 4cc6: 98a6 add a7,a7,s1 + 4cc8: 011984b3 add s1,s3,a7 + 4ccc: 02e789b3 mul s3,a5,a4 + 4cd0: cc26 sw s1,24(sp) + 4cd2: 030688b3 mul a7,a3,a6 + 4cd6: 03069a33 mulh s4,a3,a6 + 4cda: 98ce add a7,a7,s3 + 4cdc: 0138b9b3 sltu s3,a7,s3 + 4ce0: 02e794b3 mulh s1,a5,a4 + 4ce4: 03ef0db3 mul s11,t5,t5 + 4ce8: 94d2 add s1,s1,s4 + 4cea: 99a6 add s3,s3,s1 + 4cec: 03ef1f33 mulh t5,t5,t5 + 4cf0: 9dc6 add s11,s11,a7 + 4cf2: 011db8b3 sltu a7,s11,a7 + 4cf6: 03c604b3 mul s1,a2,t3 + 4cfa: 99fa add s3,s3,t5 + 4cfc: 99c6 add s3,s3,a7 + 4cfe: 03c61f33 mulh t5,a2,t3 + 4d02: 94ee add s1,s1,s11 + 4d04: 01b4bdb3 sltu s11,s1,s11 + 4d08: 99fa add s3,s3,t5 + 4d0a: 9dce add s11,s11,s3 + 4d0c: 00131993 slli s3,t1,0x1 + 4d10: 02b98f33 mul t5,s3,a1 + 4d14: 02b999b3 mulh s3,s3,a1 + 4d18: 9f26 add t5,t5,s1 + 4d1a: 009f34b3 sltu s1,t5,s1 + 4d1e: 03728a33 mul s4,t0,s7 + 4d22: 9dce add s11,s11,s3 + 4d24: 94ee add s1,s1,s11 + 4d26: 037292b3 mulh t0,t0,s7 + 4d2a: 9a7a add s4,s4,t5 + 4d2c: 01ea3f33 sltu t5,s4,t5 + 4d30: 92a6 add t0,t0,s1 + 4d32: 005f08b3 add a7,t5,t0 + 4d36: 02f38f33 mul t5,t2,a5 + 4d3a: 02e682b3 mul t0,a3,a4 + 4d3e: 02f399b3 mulh s3,t2,a5 + 4d42: 92fa add t0,t0,t5 + 4d44: 01e2bf33 sltu t5,t0,t5 + 4d48: 02e69db3 mulh s11,a3,a4 + 4d4c: 01b984b3 add s1,s3,s11 + 4d50: 94fa add s1,s1,t5 + 4d52: 03fe8f33 mul t5,t4,t6 + 4d56: 03fe99b3 mulh s3,t4,t6 + 4d5a: 9f16 add t5,t5,t0 + 4d5c: 005f32b3 sltu t0,t5,t0 + 4d60: 94ce add s1,s1,s3 + 4d62: 92a6 add t0,t0,s1 + 4d64: 026604b3 mul s1,a2,t1 + 4d68: 026619b3 mulh s3,a2,t1 + 4d6c: 94fa add s1,s1,t5 + 4d6e: 01e4bf33 sltu t5,s1,t5 + 4d72: 92ce add t0,t0,s3 + 4d74: 92fa add t0,t0,t5 + 4d76: 03a59f33 mulh t5,a1,s10 + 4d7a: 03a589b3 mul s3,a1,s10 + 4d7e: 92fa add t0,t0,t5 + 4d80: 02679db3 mulh s11,a5,t1 + 4d84: 99a6 add s3,s3,s1 + 4d86: 0099b4b3 sltu s1,s3,s1 + 4d8a: 9496 add s1,s1,t0 + 4d8c: ce26 sw s1,28(sp) + 4d8e: 03c69f33 mulh t5,a3,t3 + 4d92: 026782b3 mul t0,a5,t1 + 4d96: 9f6e add t5,t5,s11 + 4d98: 03c684b3 mul s1,a3,t3 + 4d9c: 02ee9db3 mulh s11,t4,a4 + 4da0: 9496 add s1,s1,t0 + 4da2: 0054b2b3 sltu t0,s1,t0 + 4da6: 9f16 add t5,t5,t0 + 4da8: 02ee82b3 mul t0,t4,a4 + 4dac: 9f6e add t5,t5,s11 + 4dae: 03f80db3 mul s11,a6,t6 + 4db2: 92a6 add t0,t0,s1 + 4db4: 0092b4b3 sltu s1,t0,s1 + 4db8: 94fa add s1,s1,t5 + 4dba: 03f81fb3 mulh t6,a6,t6 + 4dbe: 9d96 add s11,s11,t0 + 4dc0: 005db2b3 sltu t0,s11,t0 + 4dc4: 03a60f33 mul t5,a2,s10 + 4dc8: 94fe add s1,s1,t6 + 4dca: 9496 add s1,s1,t0 + 4dcc: 03a612b3 mulh t0,a2,s10 + 4dd0: 9f6e add t5,t5,s11 + 4dd2: 01bf3db3 sltu s11,t5,s11 + 4dd6: 9496 add s1,s1,t0 + 4dd8: 9da6 add s11,s11,s1 + 4dda: 036584b3 mul s1,a1,s6 + 4dde: 036595b3 mulh a1,a1,s6 + 4de2: 94fa add s1,s1,t5 + 4de4: 01e4bf33 sltu t5,s1,t5 + 4de8: 95ee add a1,a1,s11 + 4dea: 00bf0fb3 add t6,t5,a1 + 4dee: 02669db3 mulh s11,a3,t1 + 4df2: 03779f33 mulh t5,a5,s7 + 4df6: 037782b3 mul t0,a5,s7 + 4dfa: 9f6e add t5,t5,s11 + 4dfc: 026685b3 mul a1,a3,t1 + 4e00: 027e8db3 mul s11,t4,t2 + 4e04: 9596 add a1,a1,t0 + 4e06: 0055b2b3 sltu t0,a1,t0 + 4e0a: 92fa add t0,t0,t5 + 4e0c: 027e93b3 mulh t2,t4,t2 + 4e10: 9dae add s11,s11,a1 + 4e12: 00bdb5b3 sltu a1,s11,a1 + 4e16: 929e add t0,t0,t2 + 4e18: 92ae add t0,t0,a1 + 4e1a: 02e815b3 mulh a1,a6,a4 + 4e1e: 02e80f33 mul t5,a6,a4 + 4e22: 92ae add t0,t0,a1 + 4e24: 036603b3 mul t2,a2,s6 + 4e28: 9f6e add t5,t5,s11 + 4e2a: 01bf3db3 sltu s11,t5,s11 + 4e2e: 9d96 add s11,s11,t0 + 4e30: 036615b3 mulh a1,a2,s6 + 4e34: 93fa add t2,t2,t5 + 4e36: 01e3bf33 sltu t5,t2,t5 + 4e3a: 9dae add s11,s11,a1 + 4e3c: 03a682b3 mul t0,a3,s10 + 4e40: 9f6e add t5,t5,s11 + 4e42: 036785b3 mul a1,a5,s6 + 4e46: 03679db3 mulh s11,a5,s6 + 4e4a: 92ae add t0,t0,a1 + 4e4c: 00b2b5b3 sltu a1,t0,a1 + 4e50: 03a69d33 mulh s10,a3,s10 + 4e54: 9d6e add s10,s10,s11 + 4e56: 9d2e add s10,s10,a1 + 4e58: 026e85b3 mul a1,t4,t1 + 4e5c: 026e9db3 mulh s11,t4,t1 + 4e60: 9596 add a1,a1,t0 + 4e62: 0055b2b3 sltu t0,a1,t0 + 4e66: 9d6e add s10,s10,s11 + 4e68: 92ea add t0,t0,s10 + 4e6a: 03c80d33 mul s10,a6,t3 + 4e6e: 03c81db3 mulh s11,a6,t3 + 4e72: 9d2e add s10,s10,a1 + 4e74: 00bd35b3 sltu a1,s10,a1 + 4e78: 92ee add t0,t0,s11 + 4e7a: 9596 add a1,a1,t0 + 4e7c: 02e702b3 mul t0,a4,a4 + 4e80: 02e71db3 mulh s11,a4,a4 + 4e84: 92ea add t0,t0,s10 + 4e86: 01a2bd33 sltu s10,t0,s10 + 4e8a: 95ee add a1,a1,s11 + 4e8c: 9d2e add s10,s10,a1 + 4e8e: 039605b3 mul a1,a2,s9 + 4e92: 03961633 mulh a2,a2,s9 + 4e96: 9596 add a1,a1,t0 + 4e98: 0055b2b3 sltu t0,a1,t0 + 4e9c: 9d32 add s10,s10,a2 + 4e9e: 92ea add t0,t0,s10 + 4ea0: 03978633 mul a2,a5,s9 + 4ea4: 03668d33 mul s10,a3,s6 + 4ea8: 039797b3 mulh a5,a5,s9 + 4eac: 9d32 add s10,s10,a2 + 4eae: 00cd3633 sltu a2,s10,a2 + 4eb2: 036696b3 mulh a3,a3,s6 + 4eb6: 037e8db3 mul s11,t4,s7 + 4eba: 97b6 add a5,a5,a3 + 4ebc: 963e add a2,a2,a5 + 4ebe: 037e9eb3 mulh t4,t4,s7 + 4ec2: 9dea add s11,s11,s10 + 4ec4: 01adbd33 sltu s10,s11,s10 + 4ec8: 02680b33 mul s6,a6,t1 + 4ecc: 9676 add a2,a2,t4 + 4ece: 9d32 add s10,s10,a2 + 4ed0: 4632 lw a2,12(sp) + 4ed2: 02681833 mulh a6,a6,t1 + 4ed6: 9b6e add s6,s6,s11 + 4ed8: 01bb3db3 sltu s11,s6,s11 + 4edc: 4332 lw t1,12(sp) + 4ede: 03c70eb3 mul t4,a4,t3 + 4ee2: 9d42 add s10,s10,a6 + 4ee4: 9dea add s11,s11,s10 + 4ee6: 03c71733 mulh a4,a4,t3 + 4eea: 9eda add t4,t4,s6 + 4eec: 016ebb33 sltu s6,t4,s6 + 4ef0: 976e add a4,a4,s11 + 4ef2: 00eb0e33 add t3,s6,a4 + 4ef6: 02000737 lui a4,0x2000 + 4efa: 00ea86b3 add a3,s5,a4 + 4efe: 0156b7b3 sltu a5,a3,s5 + 4f02: 97b2 add a5,a5,a2 + 4f04: 00679613 slli a2,a5,0x6 + 4f08: 82e9 srli a3,a3,0x1a + 4f0a: 8ed1 or a3,a3,a2 + 4f0c: 87e9 srai a5,a5,0x1a + 4f0e: 0066d813 srli a6,a3,0x6 + 4f12: 01a79613 slli a2,a5,0x1a + 4f16: 00c86633 or a2,a6,a2 + 4f1a: 01a69813 slli a6,a3,0x1a + 4f1e: 410a8833 sub a6,s5,a6 + 4f22: 40c30633 sub a2,t1,a2 + 4f26: 010abab3 sltu s5,s5,a6 + 4f2a: 41560ab3 sub s5,a2,s5 + 4f2e: 4622 lw a2,8(sp) + 4f30: 4342 lw t1,16(sp) + 4f32: 96b2 add a3,a3,a2 + 4f34: 00c6b633 sltu a2,a3,a2 + 4f38: 00f30db3 add s11,t1,a5 + 4f3c: 9db2 add s11,s11,a2 + 4f3e: 00ea0633 add a2,s4,a4 + 4f42: 014637b3 sltu a5,a2,s4 + 4f46: 97c6 add a5,a5,a7 + 4f48: 00679313 slli t1,a5,0x6 + 4f4c: 8269 srli a2,a2,0x1a + 4f4e: 00c36633 or a2,t1,a2 + 4f52: 87e9 srai a5,a5,0x1a + 4f54: 00665b13 srli s6,a2,0x6 + 4f58: 01a79313 slli t1,a5,0x1a + 4f5c: 006b6333 or t1,s6,t1 + 4f60: 406888b3 sub a7,a7,t1 + 4f64: 4372 lw t1,28(sp) + 4f66: 01a61b13 slli s6,a2,0x1a + 4f6a: 964e add a2,a2,s3 + 4f6c: 979a add a5,a5,t1 + 4f6e: 013639b3 sltu s3,a2,s3 + 4f72: 416a0b33 sub s6,s4,s6 + 4f76: 99be add s3,s3,a5 + 4f78: 010007b7 lui a5,0x1000 + 4f7c: 00f68333 add t1,a3,a5 + 4f80: 016a3a33 sltu s4,s4,s6 + 4f84: 414888b3 sub a7,a7,s4 + 4f88: 00d33a33 sltu s4,t1,a3 + 4f8c: 9dd2 add s11,s11,s4 + 4f8e: 007d9a13 slli s4,s11,0x7 + 4f92: 01935313 srli t1,t1,0x19 + 4f96: 006a6333 or t1,s4,t1 + 4f9a: 01931b93 slli s7,t1,0x19 + 4f9e: 41768bb3 sub s7,a3,s7 + 4fa2: 46d2 lw a3,20(sp) + 4fa4: 934a add t1,t1,s2 + 4fa6: 419ddd93 srai s11,s11,0x19 + 4faa: 01233933 sltu s2,t1,s2 + 4fae: 01b68a33 add s4,a3,s11 + 4fb2: 00f606b3 add a3,a2,a5 + 4fb6: 9a4a add s4,s4,s2 + 4fb8: 00c6b933 sltu s2,a3,a2 + 4fbc: 99ca add s3,s3,s2 + 4fbe: 00799913 slli s2,s3,0x7 + 4fc2: 82e5 srli a3,a3,0x19 + 4fc4: 00d966b3 or a3,s2,a3 + 4fc8: 4199d993 srai s3,s3,0x19 + 4fcc: 01969913 slli s2,a3,0x19 + 4fd0: 9fce add t6,t6,s3 + 4fd2: 00e309b3 add s3,t1,a4 + 4fd6: 96a6 add a3,a3,s1 + 4fd8: 41260633 sub a2,a2,s2 + 4fdc: 0069b933 sltu s2,s3,t1 + 4fe0: 0096b4b3 sltu s1,a3,s1 + 4fe4: 9952 add s2,s2,s4 + 4fe6: 9fa6 add t6,t6,s1 + 4fe8: 01a9d993 srli s3,s3,0x1a + 4fec: 00691493 slli s1,s2,0x6 + 4ff0: 0134e9b3 or s3,s1,s3 + 4ff4: 44e2 lw s1,24(sp) + 4ff6: 01340cb3 add s9,s0,s3 + 4ffa: 41a95913 srai s2,s2,0x1a + 4ffe: 9926 add s2,s2,s1 + 5000: 008cb433 sltu s0,s9,s0 + 5004: 944a add s0,s0,s2 + 5006: 00e68933 add s2,a3,a4 + 500a: 00d934b3 sltu s1,s2,a3 + 500e: 9fa6 add t6,t6,s1 + 5010: 006f9493 slli s1,t6,0x6 + 5014: 01a95913 srli s2,s2,0x1a + 5018: 0124e933 or s2,s1,s2 + 501c: 41afd493 srai s1,t6,0x1a + 5020: 01238fb3 add t6,t2,s2 + 5024: 007fb3b3 sltu t2,t6,t2 + 5028: 9f26 add t5,t5,s1 + 502a: 00fc84b3 add s1,s9,a5 + 502e: 9f1e add t5,t5,t2 + 5030: 0194b3b3 sltu t2,s1,s9 + 5034: 941e add s0,s0,t2 + 5036: 41945a13 srai s4,s0,0x19 + 503a: 00741393 slli t2,s0,0x7 + 503e: 98d2 add a7,a7,s4 + 5040: 80e5 srli s1,s1,0x19 + 5042: 00ff8a33 add s4,t6,a5 + 5046: 0093e4b3 or s1,t2,s1 + 504a: 01fa33b3 sltu t2,s4,t6 + 504e: 9f1e add t5,t5,t2 + 5050: 007f1393 slli t2,t5,0x7 + 5054: 019a5a13 srli s4,s4,0x19 + 5058: 009b0433 add s0,s6,s1 + 505c: 0143ea33 or s4,t2,s4 + 5060: 419f5393 srai t2,t5,0x19 + 5064: 01643b33 sltu s6,s0,s6 + 5068: 929e add t0,t0,t2 + 506a: 00e403b3 add t2,s0,a4 + 506e: 98da add a7,a7,s6 + 5070: 0083bb33 sltu s6,t2,s0 + 5074: 98da add a7,a7,s6 + 5076: 01458f33 add t5,a1,s4 + 507a: 089a slli a7,a7,0x6 + 507c: 01a3d393 srli t2,t2,0x1a + 5080: 00bf35b3 sltu a1,t5,a1 + 5084: 0078e3b3 or t2,a7,t2 + 5088: 00ef08b3 add a7,t5,a4 + 508c: 92ae add t0,t0,a1 + 508e: 01e8b5b3 sltu a1,a7,t5 + 5092: 9596 add a1,a1,t0 + 5094: 00659293 slli t0,a1,0x6 + 5098: 01a8d893 srli a7,a7,0x1a + 509c: 0112e8b3 or a7,t0,a7 + 50a0: 011e8b33 add s6,t4,a7 + 50a4: 85e9 srai a1,a1,0x1a + 50a6: 9e2e add t3,t3,a1 + 50a8: 97da add a5,a5,s6 + 50aa: 01db3eb3 sltu t4,s6,t4 + 50ae: 9ef2 add t4,t4,t3 + 50b0: 0167be33 sltu t3,a5,s6 + 50b4: 9e76 add t3,t3,t4 + 50b6: 007e1593 slli a1,t3,0x7 + 50ba: 83e5 srli a5,a5,0x19 + 50bc: 8fcd or a5,a5,a1 + 50be: 419e5e13 srai t3,t3,0x19 + 50c2: 02fc05b3 mul a1,s8,a5 + 50c6: 09ea slli s3,s3,0x1a + 50c8: 04e6 slli s1,s1,0x19 + 50ca: 096a slli s2,s2,0x1a + 50cc: 0a66 slli s4,s4,0x19 + 50ce: 08ea slli a7,a7,0x1a + 50d0: 409c8cb3 sub s9,s9,s1 + 50d4: 41330333 sub t1,t1,s3 + 50d8: 412686b3 sub a3,a3,s2 + 50dc: 414f8fb3 sub t6,t6,s4 + 50e0: 03cc0e33 mul t3,s8,t3 + 50e4: 982e add a6,a6,a1 + 50e6: 00b835b3 sltu a1,a6,a1 + 50ea: 9742 add a4,a4,a6 + 50ec: 961e add a2,a2,t2 + 50ee: 411f0f33 sub t5,t5,a7 + 50f2: 01952623 sw s9,12(a0) + 50f6: 00652423 sw t1,8(a0) + 50fa: c950 sw a2,20(a0) + 50fc: cd14 sw a3,24(a0) + 50fe: 02fc3c33 mulhu s8,s8,a5 + 5102: 07e6 slli a5,a5,0x19 + 5104: 40fb07b3 sub a5,s6,a5 + 5108: 01f52e23 sw t6,28(a0) + 510c: 03e52023 sw t5,32(a0) + 5110: d15c sw a5,36(a0) + 5112: 44a6 lw s1,72(sp) + 5114: 4916 lw s2,68(sp) + 5116: 4986 lw s3,64(sp) + 5118: 5a72 lw s4,60(sp) + 511a: 9c72 add s8,s8,t3 + 511c: 9ae2 add s5,s5,s8 + 511e: 9aae add s5,s5,a1 + 5120: 010735b3 sltu a1,a4,a6 + 5124: 9aae add s5,s5,a1 + 5126: 0a9a slli s5,s5,0x6 + 5128: 8369 srli a4,a4,0x1a + 512a: 00eae733 or a4,s5,a4 + 512e: 01a71593 slli a1,a4,0x1a + 5132: 975e add a4,a4,s7 + 5134: c158 sw a4,4(a0) + 5136: 01a39713 slli a4,t2,0x1a + 513a: 8c19 sub s0,s0,a4 + 513c: c900 sw s0,16(a0) + 513e: 4436 lw s0,76(sp) + 5140: 40b80833 sub a6,a6,a1 + 5144: 01052023 sw a6,0(a0) + 5148: 5ae2 lw s5,56(sp) + 514a: 5b52 lw s6,52(sp) + 514c: 5bc2 lw s7,48(sp) + 514e: 5c32 lw s8,44(sp) + 5150: 5ca2 lw s9,40(sp) + 5152: 5d12 lw s10,36(sp) + 5154: 5d82 lw s11,32(sp) + 5156: 6161 addi sp,sp,80 + 5158: 8082 ret + +0000515a : + 515a: 0005cb63 bltz a1,5170 + 515e: 4035d793 srai a5,a1,0x3 + 5162: 953e add a0,a0,a5 + 5164: 2108 lbu a0,0(a0) + 5166: 899d andi a1,a1,7 + 5168: 40b55533 sra a0,a0,a1 + 516c: 8905 andi a0,a0,1 + 516e: 8082 ret + 5170: 4501 li a0,0 + 5172: 8082 ret + +00005174 : + 5174: 02058e13 addi t3,a1,32 + 5178: 02060e93 addi t4,a2,32 + 517c: 88b2 mv a7,a2 + 517e: 882a mv a6,a0 + 5180: 4701 li a4,0 + 5182: 419c lw a5,0(a1) + 5184: 0008a303 lw t1,0(a7) + 5188: 0891 addi a7,a7,4 + 518a: 0811 addi a6,a6,4 + 518c: 026786b3 mul a3,a5,t1 + 5190: 0267b333 mulhu t1,a5,t1 + 5194: ffc82783 lw a5,-4(a6) + 5198: 97b6 add a5,a5,a3 + 519a: 973e add a4,a4,a5 + 519c: 00d7b6b3 sltu a3,a5,a3 + 51a0: fee82e23 sw a4,-4(a6) + 51a4: 00f737b3 sltu a5,a4,a5 + 51a8: 969a add a3,a3,t1 + 51aa: 00d78733 add a4,a5,a3 + 51ae: fd1e9ae3 bne t4,a7,5182 + 51b2: d118 sw a4,32(a0) + 51b4: 0591 addi a1,a1,4 + 51b6: 0511 addi a0,a0,4 + 51b8: fcbe12e3 bne t3,a1,517c + 51bc: 8082 ret + +000051be : + 51be: 65b1 lui a1,0xc + 51c0: 4681 li a3,0 + 51c2: 4785 li a5,1 + 51c4: 71058593 addi a1,a1,1808 # c710 + 51c8: 02000813 li a6,32 + 51cc: 00d58733 add a4,a1,a3 + 51d0: 00d50633 add a2,a0,a3 + 51d4: 4318 lw a4,0(a4) + 51d6: 4210 lw a2,0(a2) + 51d8: 0691 addi a3,a3,4 + 51da: fff74713 not a4,a4 + 51de: 963a add a2,a2,a4 + 51e0: 97b2 add a5,a5,a2 + 51e2: 00e63733 sltu a4,a2,a4 + 51e6: 00c7b7b3 sltu a5,a5,a2 + 51ea: 97ba add a5,a5,a4 + 51ec: ff0690e3 bne a3,a6,51cc + 51f0: 853e mv a0,a5 + 51f2: 8082 ret + +000051f4 : + 51f4: ffdfa2ef jal t0,1f0 <__riscv_save_0> + 51f8: 1141 addi sp,sp,-16 + 51fa: 842a mv s0,a0 + 51fc: 852e mv a0,a1 + 51fe: c62e sw a1,12(sp) + 5200: fbfff0ef jal ra,51be + 5204: 45b2 lw a1,12(sp) + 5206: 6631 lui a2,0xc + 5208: 41f55813 srai a6,a0,0x1f + 520c: 40a00333 neg t1,a0 + 5210: 4681 li a3,0 + 5212: 71060613 addi a2,a2,1808 # c710 + 5216: 02000893 li a7,32 + 521a: 00d607b3 add a5,a2,a3 + 521e: 439c lw a5,0(a5) + 5220: 00d58733 add a4,a1,a3 + 5224: 4318 lw a4,0(a4) + 5226: fff7c793 not a5,a5 + 522a: 0067f7b3 and a5,a5,t1 + 522e: 973e add a4,a4,a5 + 5230: 00f737b3 sltu a5,a4,a5 + 5234: 953a add a0,a0,a4 + 5236: 97c2 add a5,a5,a6 + 5238: 00d40833 add a6,s0,a3 + 523c: 00a82023 sw a0,0(a6) + 5240: 00e53733 sltu a4,a0,a4 + 5244: 0691 addi a3,a3,4 + 5246: 00f70533 add a0,a4,a5 + 524a: 4801 li a6,0 + 524c: fd1697e3 bne a3,a7,521a + 5250: 0141 addi sp,sp,16 + 5252: fc3fa06f j 214 <__riscv_restore_0> + +00005256 : + 5256: f9bfa2ef jal t0,1f0 <__riscv_save_0> + 525a: 842a mv s0,a0 + 525c: e88fe0ef jal ra,38e4 + 5260: 02840513 addi a0,s0,40 + 5264: e90fe0ef jal ra,38f4 + 5268: 05040513 addi a0,s0,80 + 526c: e88fe0ef jal ra,38f4 + 5270: 07840513 addi a0,s0,120 + 5274: e70fe0ef jal ra,38e4 + 5278: f9dfa06f j 214 <__riscv_restore_0> + +0000527c : + 527c: f75fa2ef jal t0,1f0 <__riscv_save_0> + 5280: 02858913 addi s2,a1,40 + 5284: 842e mv s0,a1 + 5286: 862e mv a2,a1 + 5288: 85ca mv a1,s2 + 528a: 84aa mv s1,a0 + 528c: eb8fe0ef jal ra,3944 + 5290: 8622 mv a2,s0 + 5292: 85ca mv a1,s2 + 5294: 02848513 addi a0,s1,40 + 5298: ed2fe0ef jal ra,396a + 529c: 05040593 addi a1,s0,80 + 52a0: 05048513 addi a0,s1,80 + 52a4: e68fe0ef jal ra,390c + 52a8: 6631 lui a2,0xc + 52aa: 6e860613 addi a2,a2,1768 # c6e8 + 52ae: 07840593 addi a1,s0,120 + 52b2: 07848513 addi a0,s1,120 + 52b6: d93fe0ef jal ra,4048 + 52ba: f5bfa06f j 214 <__riscv_restore_0> + +000052be : + 52be: f19fa2ef jal t0,1d6 <__riscv_save_4> + 52c2: 715d addi sp,sp,-80 + 52c4: 02858413 addi s0,a1,40 + 52c8: 84aa mv s1,a0 + 52ca: 8a32 mv s4,a2 + 52cc: 892e mv s2,a1 + 52ce: 862e mv a2,a1 + 52d0: 850a mv a0,sp + 52d2: 85a2 mv a1,s0 + 52d4: e70fe0ef jal ra,3944 + 52d8: 864a mv a2,s2 + 52da: 85a2 mv a1,s0 + 52dc: 1028 addi a0,sp,40 + 52de: e8cfe0ef jal ra,396a + 52e2: 8652 mv a2,s4 + 52e4: 858a mv a1,sp + 52e6: 850a mv a0,sp + 52e8: d61fe0ef jal ra,4048 + 52ec: 102c addi a1,sp,40 + 52ee: 028a0613 addi a2,s4,40 + 52f2: 852e mv a0,a1 + 52f4: d55fe0ef jal ra,4048 + 52f8: 02848a93 addi s5,s1,40 + 52fc: 1030 addi a2,sp,40 + 52fe: 858a mv a1,sp + 5300: 8556 mv a0,s5 + 5302: e42fe0ef jal ra,3944 + 5306: 1030 addi a2,sp,40 + 5308: 858a mv a1,sp + 530a: 8526 mv a0,s1 + 530c: e5efe0ef jal ra,396a + 5310: 05048413 addi s0,s1,80 + 5314: 05090613 addi a2,s2,80 + 5318: 85b2 mv a1,a2 + 531a: 8522 mv a0,s0 + 531c: e28fe0ef jal ra,3944 + 5320: 050a0613 addi a2,s4,80 + 5324: 85a2 mv a1,s0 + 5326: 8522 mv a0,s0 + 5328: d21fe0ef jal ra,4048 + 532c: 07848993 addi s3,s1,120 + 5330: 078a0613 addi a2,s4,120 + 5334: 07890593 addi a1,s2,120 + 5338: 854e mv a0,s3 + 533a: d0ffe0ef jal ra,4048 + 533e: 864e mv a2,s3 + 5340: 85a2 mv a1,s0 + 5342: 850a mv a0,sp + 5344: e00fe0ef jal ra,3944 + 5348: 864e mv a2,s3 + 534a: 85a2 mv a1,s0 + 534c: 1028 addi a0,sp,40 + 534e: e1cfe0ef jal ra,396a + 5352: 8656 mv a2,s5 + 5354: 85a6 mv a1,s1 + 5356: 854e mv a0,s3 + 5358: cf1fe0ef jal ra,4048 + 535c: 1030 addi a2,sp,40 + 535e: 85a6 mv a1,s1 + 5360: 8526 mv a0,s1 + 5362: ce7fe0ef jal ra,4048 + 5366: 860a mv a2,sp + 5368: 85d6 mv a1,s5 + 536a: 8556 mv a0,s5 + 536c: cddfe0ef jal ra,4048 + 5370: 1030 addi a2,sp,40 + 5372: 858a mv a1,sp + 5374: 8522 mv a0,s0 + 5376: cd3fe0ef jal ra,4048 + 537a: 6161 addi sp,sp,80 + 537c: e8ffa06f j 20a <__riscv_restore_4> + +00005380 : + 5380: e49fa2ef jal t0,1c8 <__riscv_save_10> + 5384: 02858a13 addi s4,a1,40 + 5388: 892a mv s2,a0 + 538a: 89ae mv s3,a1 + 538c: 8536 mv a0,a3 + 538e: 8bb2 mv s7,a2 + 5390: 862e mv a2,a1 + 5392: 85d2 mv a1,s4 + 5394: 8436 mv s0,a3 + 5396: 84ba mv s1,a4 + 5398: dacfe0ef jal ra,3944 + 539c: 864e mv a2,s3 + 539e: 85d2 mv a1,s4 + 53a0: 8526 mv a0,s1 + 53a2: dc8fe0ef jal ra,396a + 53a6: 865e mv a2,s7 + 53a8: 85a2 mv a1,s0 + 53aa: 8522 mv a0,s0 + 53ac: c9dfe0ef jal ra,4048 + 53b0: 028b8613 addi a2,s7,40 + 53b4: 85a6 mv a1,s1 + 53b6: 8526 mv a0,s1 + 53b8: c91fe0ef jal ra,4048 + 53bc: 02890b13 addi s6,s2,40 + 53c0: 8626 mv a2,s1 + 53c2: 85a2 mv a1,s0 + 53c4: 855a mv a0,s6 + 53c6: d7efe0ef jal ra,3944 + 53ca: 8626 mv a2,s1 + 53cc: 85a2 mv a1,s0 + 53ce: 854a mv a0,s2 + 53d0: d9afe0ef jal ra,396a + 53d4: 05090a13 addi s4,s2,80 + 53d8: 05098613 addi a2,s3,80 + 53dc: 85b2 mv a1,a2 + 53de: 8552 mv a0,s4 + 53e0: d64fe0ef jal ra,3944 + 53e4: 07890a93 addi s5,s2,120 + 53e8: 050b8613 addi a2,s7,80 + 53ec: 07898593 addi a1,s3,120 + 53f0: 8556 mv a0,s5 + 53f2: c57fe0ef jal ra,4048 + 53f6: 8656 mv a2,s5 + 53f8: 85d2 mv a1,s4 + 53fa: 8522 mv a0,s0 + 53fc: d48fe0ef jal ra,3944 + 5400: 8656 mv a2,s5 + 5402: 85d2 mv a1,s4 + 5404: 8526 mv a0,s1 + 5406: d64fe0ef jal ra,396a + 540a: 865a mv a2,s6 + 540c: 85ca mv a1,s2 + 540e: 8556 mv a0,s5 + 5410: c39fe0ef jal ra,4048 + 5414: 8626 mv a2,s1 + 5416: 85ca mv a1,s2 + 5418: 854a mv a0,s2 + 541a: c2ffe0ef jal ra,4048 + 541e: 8622 mv a2,s0 + 5420: 85da mv a1,s6 + 5422: 855a mv a0,s6 + 5424: c25fe0ef jal ra,4048 + 5428: 8626 mv a2,s1 + 542a: 85a2 mv a1,s0 + 542c: 8552 mv a0,s4 + 542e: c1bfe0ef jal ra,4048 + 5432: dcffa06f j 200 <__riscv_restore_10> + +00005436 : + 5436: da1fa2ef jal t0,1d6 <__riscv_save_4> + 543a: 8432 mv s0,a2 + 543c: 8a2a mv s4,a0 + 543e: 8aae mv s5,a1 + 5440: 8532 mv a0,a2 + 5442: 02840493 addi s1,s0,40 + 5446: e9eff0ef jal ra,4ae4 + 544a: 028a8b13 addi s6,s5,40 + 544e: 85da mv a1,s6 + 5450: 8526 mv a0,s1 + 5452: 05040913 addi s2,s0,80 + 5456: e8eff0ef jal ra,4ae4 + 545a: 050a8593 addi a1,s5,80 + 545e: 854a mv a0,s2 + 5460: e84ff0ef jal ra,4ae4 + 5464: 85ca mv a1,s2 + 5466: 854a mv a0,s2 + 5468: 4609 li a2,2 + 546a: 07840993 addi s3,s0,120 + 546e: 8e9fe0ef jal ra,3d56 + 5472: 865a mv a2,s6 + 5474: 85d6 mv a1,s5 + 5476: 854e mv a0,s3 + 5478: cccfe0ef jal ra,3944 + 547c: 078a0a93 addi s5,s4,120 + 5480: 85ce mv a1,s3 + 5482: 8556 mv a0,s5 + 5484: e60ff0ef jal ra,4ae4 + 5488: 8622 mv a2,s0 + 548a: 85a6 mv a1,s1 + 548c: 854e mv a0,s3 + 548e: cb6fe0ef jal ra,3944 + 5492: 8622 mv a2,s0 + 5494: 85a6 mv a1,s1 + 5496: 8526 mv a0,s1 + 5498: cd2fe0ef jal ra,396a + 549c: 864e mv a2,s3 + 549e: 85d6 mv a1,s5 + 54a0: 8522 mv a0,s0 + 54a2: cc8fe0ef jal ra,396a + 54a6: 8626 mv a2,s1 + 54a8: 85ca mv a1,s2 + 54aa: 854a mv a0,s2 + 54ac: cbefe0ef jal ra,396a + 54b0: 864a mv a2,s2 + 54b2: 85a2 mv a1,s0 + 54b4: 8552 mv a0,s4 + 54b6: b93fe0ef jal ra,4048 + 54ba: 8626 mv a2,s1 + 54bc: 85ce mv a1,s3 + 54be: 028a0513 addi a0,s4,40 + 54c2: b87fe0ef jal ra,4048 + 54c6: 864a mv a2,s2 + 54c8: 85a6 mv a1,s1 + 54ca: 050a0513 addi a0,s4,80 + 54ce: b7bfe0ef jal ra,4048 + 54d2: 864e mv a2,s3 + 54d4: 85a2 mv a1,s0 + 54d6: 8556 mv a0,s5 + 54d8: b71fe0ef jal ra,4048 + 54dc: d2ffa06f j 20a <__riscv_restore_4> + +000054e0 : + 54e0: d11fa2ef jal t0,1f0 <__riscv_save_0> + 54e4: 84aa mv s1,a0 + 54e6: 892e mv s2,a1 + 54e8: 0fc00413 li s0,252 + 54ec: 85a2 mv a1,s0 + 54ee: 854a mv a0,s2 + 54f0: c6bff0ef jal ra,515a + 54f4: e119 bnez a0,54fa + 54f6: 147d addi s0,s0,-1 + 54f8: f875 bnez s0,54ec + 54fa: 0405 addi s0,s0,1 + 54fc: 57fd li a5,-1 + 54fe: b0a0 sb s0,3(s1) + 5500: a09e sh a5,0(s1) + 5502: a0bc sb a5,2(s1) + 5504: d11fa06f j 214 <__riscv_restore_0> + +00005508 : + 5508: cc1fa2ef jal t0,1c8 <__riscv_save_10> + 550c: 3124 lbu s1,3(a0) + 550e: 89aa mv s3,a0 + 5510: 8932 mv s2,a2 + 5512: 02c49363 bne s1,a2,5538 + 5516: 8aae mv s5,a1 + 5518: 8536 mv a0,a3 + 551a: 85b2 mv a1,a2 + 551c: 8b36 mv s6,a3 + 551e: fff90a13 addi s4,s2,-1 + 5522: c39ff0ef jal ra,515a + 5526: 842a mv s0,a0 + 5528: 85d2 mv a1,s4 + 552a: 855a mv a0,s6 + 552c: c2fff0ef jal ra,515a + 5530: 00a41d63 bne s0,a0,554a + 5534: 014981a3 sb s4,3(s3) + 5538: 00099783 lh a5,0(s3) + 553c: 4501 li a0,0 + 553e: 01279463 bne a5,s2,5546 + 5542: 00298503 lb a0,2(s3) + 5546: cbbfa06f j 200 <__riscv_restore_10> + 554a: 00148a13 addi s4,s1,1 + 554e: 014ad363 bge s5,s4,5554 + 5552: 8a56 mv s4,s5 + 5554: fffa0513 addi a0,s4,-1 + 5558: 00a41433 sll s0,s0,a0 + 555c: 40800433 neg s0,s0 + 5560: 4a81 li s5,0 + 5562: 41490c33 sub s8,s2,s4 + 5566: 8bd6 mv s7,s5 + 5568: 0a85 addi s5,s5,1 + 556a: 055a1863 bne s4,s5,55ba + 556e: 85e2 mv a1,s8 + 5570: 855a mv a0,s6 + 5572: be9ff0ef jal ra,515a + 5576: 9522 add a0,a0,s0 + 5578: 40a007b3 neg a5,a0 + 557c: 8fe9 and a5,a5,a0 + 557e: 0aa7f413 andi s0,a5,170 + 5582: 0cc7f713 andi a4,a5,204 + 5586: 00803433 snez s0,s0 + 558a: c311 beqz a4,558e + 558c: 4709 li a4,2 + 558e: 0f07f793 andi a5,a5,240 + 5592: 8c59 or s0,s0,a4 + 5594: c391 beqz a5,5598 + 5596: 4791 li a5,4 + 5598: 00190713 addi a4,s2,1 + 559c: 8fc1 or a5,a5,s0 + 559e: 41470733 sub a4,a4,s4 + 55a2: 973e add a4,a4,a5 + 55a4: 40f55533 sra a0,a0,a5 + 55a8: 414484b3 sub s1,s1,s4 + 55ac: 00e99023 sh a4,0(s3) + 55b0: 00a98123 sb a0,2(s3) + 55b4: 009981a3 sb s1,3(s3) + 55b8: b741 j 5538 + 55ba: 015c05b3 add a1,s8,s5 + 55be: 855a mv a0,s6 + 55c0: b9bff0ef jal ra,515a + 55c4: 01751533 sll a0,a0,s7 + 55c8: 942a add s0,s0,a0 + 55ca: bf71 j 5566 + +000055cc : + 55cc: bf5fa2ef jal t0,1c0 <__riscv_save_12> + 55d0: 1141 addi sp,sp,-16 + 55d2: 892e mv s2,a1 + 55d4: 8a2a mv s4,a0 + 55d6: 85c2 mv a1,a6 + 55d8: 853e mv a0,a5 + 55da: 8b3e mv s6,a5 + 55dc: 8bc2 mv s7,a6 + 55de: c63a sw a4,12(sp) + 55e0: 89b2 mv s3,a2 + 55e2: 8ab6 mv s5,a3 + 55e4: b77ff0ef jal ra,515a + 55e8: 020b8593 addi a1,s7,32 + 55ec: 842a mv s0,a0 + 55ee: 855a mv a0,s6 + 55f0: b6bff0ef jal ra,515a + 55f4: 040b8593 addi a1,s7,64 + 55f8: 84aa mv s1,a0 + 55fa: 855a mv a0,s6 + 55fc: b5fff0ef jal ra,515a + 5600: 050a slli a0,a0,0x2 + 5602: 0486 slli s1,s1,0x1 + 5604: 94aa add s1,s1,a0 + 5606: 060b8593 addi a1,s7,96 + 560a: 855a mv a0,s6 + 560c: 9426 add s0,s0,s1 + 560e: b4dff0ef jal ra,515a + 5612: 0ff47413 andi s0,s0,255 + 5616: 050e slli a0,a0,0x3 + 5618: 9522 add a0,a0,s0 + 561a: 0ff57513 andi a0,a0,255 + 561e: 00355b13 srli s6,a0,0x3 + 5622: 4732 lw a4,12(sp) + 5624: fffb0c93 addi s9,s6,-1 + 5628: 00acc533 xor a0,s9,a0 + 562c: 00757c93 andi s9,a0,7 + 5630: 84ba mv s1,a4 + 5632: 4d01 li s10,0 + 5634: 02890c13 addi s8,s2,40 + 5638: 05090b93 addi s7,s2,80 + 563c: 4da1 li s11,8 + 563e: 01acc433 xor s0,s9,s10 + 5642: 147d addi s0,s0,-1 + 5644: 8021 srli s0,s0,0x8 + 5646: 8805 andi s0,s0,1 + 5648: 85a6 mv a1,s1 + 564a: 8622 mv a2,s0 + 564c: 854a mv a0,s2 + 564e: c18fe0ef jal ra,3a66 + 5652: 02848593 addi a1,s1,40 + 5656: 8622 mv a2,s0 + 5658: 8562 mv a0,s8 + 565a: c0cfe0ef jal ra,3a66 + 565e: 05048593 addi a1,s1,80 + 5662: 8622 mv a2,s0 + 5664: 855e mv a0,s7 + 5666: 0d05 addi s10,s10,1 + 5668: bfefe0ef jal ra,3a66 + 566c: 07848493 addi s1,s1,120 + 5670: fdbd17e3 bne s10,s11,563e + 5674: 85de mv a1,s7 + 5676: 854e mv a0,s3 + 5678: aaefe0ef jal ra,3926 + 567c: 001b4b13 xori s6,s6,1 + 5680: 865a mv a2,s6 + 5682: 85ce mv a1,s3 + 5684: 855e mv a0,s7 + 5686: b0cfe0ef jal ra,3992 + 568a: 865a mv a2,s6 + 568c: 85e2 mv a1,s8 + 568e: 854a mv a0,s2 + 5690: b02fe0ef jal ra,3992 + 5694: 8756 mv a4,s5 + 5696: 86ce mv a3,s3 + 5698: 864a mv a2,s2 + 569a: 85d2 mv a1,s4 + 569c: 8552 mv a0,s4 + 569e: ce3ff0ef jal ra,5380 + 56a2: 0141 addi sp,sp,16 + 56a4: b59fa06f j 1fc <__riscv_restore_12> + +000056a8 : + 56a8: b49fa2ef jal t0,1f0 <__riscv_save_0> + 56ac: a14fe0ef jal ra,38c0 + 56b0: 8d4d or a0,a0,a1 + 56b2: 00153513 seqz a0,a0 + 56b6: 157d addi a0,a0,-1 + 56b8: b5dfa06f j 214 <__riscv_restore_0> + +000056bc : + 56bc: 4781 li a5,0 + 56be: 00b79363 bne a5,a1,56c4 + 56c2: 8082 ret + 56c4: 00f50733 add a4,a0,a5 + 56c8: 00070023 sb zero,0(a4) # 2000000 <_data_lma+0x1ff1da4> + 56cc: 0785 addi a5,a5,1 + 56ce: bfc5 j 56be + +000056d0 : + 56d0: b21fa2ef jal t0,1f0 <__riscv_save_0> + 56d4: 7179 addi sp,sp,-48 + 56d6: 842a mv s0,a0 + 56d8: 4781 li a5,0 + 56da: 02800713 li a4,40 + 56de: 00f58633 add a2,a1,a5 + 56e2: 4210 lw a2,0(a2) + 56e4: 0034 addi a3,sp,8 + 56e6: 96be add a3,a3,a5 + 56e8: c290 sw a2,0(a3) + 56ea: 0791 addi a5,a5,4 + 56ec: fee799e3 bne a5,a4,56de + 56f0: 5732 lw a4,44(sp) + 56f2: 47cd li a5,19 + 56f4: 1810 addi a2,sp,48 + 56f6: 02e787b3 mul a5,a5,a4 + 56fa: 01000737 lui a4,0x1000 + 56fe: 97ba add a5,a5,a4 + 5700: 0038 addi a4,sp,8 + 5702: 87e5 srai a5,a5,0x19 + 5704: 86ba mv a3,a4 + 5706: 428c lw a1,0(a3) + 5708: 06a1 addi a3,a3,8 + 570a: 97ae add a5,a5,a1 + 570c: ffc6a583 lw a1,-4(a3) # fffffc <_data_lma+0xff1da0> + 5710: 87e9 srai a5,a5,0x1a + 5712: 97ae add a5,a5,a1 + 5714: 87e5 srai a5,a5,0x19 + 5716: fed618e3 bne a2,a3,5706 + 571a: 46cd li a3,19 + 571c: 02d787b3 mul a5,a5,a3 + 5720: 4314 lw a3,0(a4) + 5722: 0721 addi a4,a4,8 + 5724: 97b6 add a5,a5,a3 + 5726: 41a7d693 srai a3,a5,0x1a + 572a: 01a69593 slli a1,a3,0x1a + 572e: 8f8d sub a5,a5,a1 + 5730: fef72c23 sw a5,-8(a4) # fffff8 <_data_lma+0xff1d9c> + 5734: ffc72783 lw a5,-4(a4) + 5738: 96be add a3,a3,a5 + 573a: 4196d793 srai a5,a3,0x19 + 573e: 01979593 slli a1,a5,0x19 + 5742: 8e8d sub a3,a3,a1 + 5744: fed72e23 sw a3,-4(a4) + 5748: fce61ce3 bne a2,a4,5720 + 574c: 47b2 lw a5,12(sp) + 574e: 45a2 lw a1,8(sp) + 5750: 8522 mv a0,s0 + 5752: 07ea slli a5,a5,0x1a + 5754: 8ddd or a1,a1,a5 + 5756: 8c4fe0ef jal ra,381a + 575a: 45b2 lw a1,12(sp) + 575c: 47c2 lw a5,16(sp) + 575e: 00440513 addi a0,s0,4 + 5762: 8199 srli a1,a1,0x6 + 5764: 07ce slli a5,a5,0x13 + 5766: 8ddd or a1,a1,a5 + 5768: 8b2fe0ef jal ra,381a + 576c: 45c2 lw a1,16(sp) + 576e: 47d2 lw a5,20(sp) + 5770: 00840513 addi a0,s0,8 + 5774: 81b5 srli a1,a1,0xd + 5776: 07b6 slli a5,a5,0xd + 5778: 8ddd or a1,a1,a5 + 577a: 8a0fe0ef jal ra,381a + 577e: 45d2 lw a1,20(sp) + 5780: 47e2 lw a5,24(sp) + 5782: 00c40513 addi a0,s0,12 + 5786: 81cd srli a1,a1,0x13 + 5788: 079a slli a5,a5,0x6 + 578a: 8ddd or a1,a1,a5 + 578c: 88efe0ef jal ra,381a + 5790: 5782 lw a5,32(sp) + 5792: 45f2 lw a1,28(sp) + 5794: 01040513 addi a0,s0,16 + 5798: 07e6 slli a5,a5,0x19 + 579a: 8ddd or a1,a1,a5 + 579c: 87efe0ef jal ra,381a + 57a0: 5582 lw a1,32(sp) + 57a2: 5792 lw a5,36(sp) + 57a4: 01440513 addi a0,s0,20 + 57a8: 819d srli a1,a1,0x7 + 57aa: 07ce slli a5,a5,0x13 + 57ac: 8ddd or a1,a1,a5 + 57ae: 86cfe0ef jal ra,381a + 57b2: 5592 lw a1,36(sp) + 57b4: 57a2 lw a5,40(sp) + 57b6: 01840513 addi a0,s0,24 + 57ba: 81b5 srli a1,a1,0xd + 57bc: 07b2 slli a5,a5,0xc + 57be: 8ddd or a1,a1,a5 + 57c0: 85afe0ef jal ra,381a + 57c4: 55a2 lw a1,40(sp) + 57c6: 57b2 lw a5,44(sp) + 57c8: 01c40513 addi a0,s0,28 + 57cc: 81d1 srli a1,a1,0x14 + 57ce: 079a slli a5,a5,0x6 + 57d0: 8ddd or a1,a1,a5 + 57d2: 848fe0ef jal ra,381a + 57d6: 0028 addi a0,sp,8 + 57d8: 02800593 li a1,40 + 57dc: ee1ff0ef jal ra,56bc + 57e0: 6145 addi sp,sp,48 + 57e2: a33fa06f j 214 <__riscv_restore_0> + +000057e6 : + 57e6: a0bfa2ef jal t0,1f0 <__riscv_save_0> + 57ea: 7139 addi sp,sp,-64 + 57ec: 842e mv s0,a1 + 57ee: 85aa mv a1,a0 + 57f0: 850a mv a0,sp + 57f2: edfff0ef jal ra,56d0 + 57f6: 85a2 mv a1,s0 + 57f8: 1008 addi a0,sp,32 + 57fa: ed7ff0ef jal ra,56d0 + 57fe: 100c addi a1,sp,32 + 5800: 850a mv a0,sp + 5802: ea7ff0ef jal ra,56a8 + 5806: 842a mv s0,a0 + 5808: 02000593 li a1,32 + 580c: 850a mv a0,sp + 580e: eafff0ef jal ra,56bc + 5812: 1008 addi a0,sp,32 + 5814: 02000593 li a1,32 + 5818: ea5ff0ef jal ra,56bc + 581c: 00140513 addi a0,s0,1 + 5820: 6121 addi sp,sp,64 + 5822: 9f3fa06f j 214 <__riscv_restore_0> + +00005826 : + 5826: 9b1fa2ef jal t0,1d6 <__riscv_save_4> + 582a: 7119 addi sp,sp,-128 + 582c: 892a mv s2,a0 + 582e: 0028 addi a0,sp,8 + 5830: 842e mv s0,a1 + 5832: ab2ff0ef jal ra,4ae4 + 5836: 002c addi a1,sp,8 + 5838: 1808 addi a0,sp,48 + 583a: aaaff0ef jal ra,4ae4 + 583e: 180c addi a1,sp,48 + 5840: 852e mv a0,a1 + 5842: aa2ff0ef jal ra,4ae4 + 5846: 1810 addi a2,sp,48 + 5848: 8532 mv a0,a2 + 584a: 85a2 mv a1,s0 + 584c: ffcfe0ef jal ra,4048 + 5850: 002c addi a1,sp,8 + 5852: 1810 addi a2,sp,48 + 5854: 852e mv a0,a1 + 5856: ff2fe0ef jal ra,4048 + 585a: 002c addi a1,sp,8 + 585c: 852e mv a0,a1 + 585e: a86ff0ef jal ra,4ae4 + 5862: 0030 addi a2,sp,8 + 5864: 8532 mv a0,a2 + 5866: 180c addi a1,sp,48 + 5868: fe0fe0ef jal ra,4048 + 586c: 002c addi a1,sp,8 + 586e: 1808 addi a0,sp,48 + 5870: a74ff0ef jal ra,4ae4 + 5874: 4491 li s1,4 + 5876: 180c addi a1,sp,48 + 5878: 852e mv a0,a1 + 587a: 14fd addi s1,s1,-1 + 587c: a68ff0ef jal ra,4ae4 + 5880: f8fd bnez s1,5876 + 5882: 0030 addi a2,sp,8 + 5884: 8532 mv a0,a2 + 5886: 180c addi a1,sp,48 + 5888: fc0fe0ef jal ra,4048 + 588c: 002c addi a1,sp,8 + 588e: 1808 addi a0,sp,48 + 5890: a54ff0ef jal ra,4ae4 + 5894: 44a5 li s1,9 + 5896: 180c addi a1,sp,48 + 5898: 852e mv a0,a1 + 589a: 14fd addi s1,s1,-1 + 589c: a48ff0ef jal ra,4ae4 + 58a0: f8fd bnez s1,5896 + 58a2: 180c addi a1,sp,48 + 58a4: 852e mv a0,a1 + 58a6: 0030 addi a2,sp,8 + 58a8: fa0fe0ef jal ra,4048 + 58ac: 180c addi a1,sp,48 + 58ae: 08a8 addi a0,sp,88 + 58b0: a34ff0ef jal ra,4ae4 + 58b4: 44cd li s1,19 + 58b6: 08ac addi a1,sp,88 + 58b8: 852e mv a0,a1 + 58ba: 14fd addi s1,s1,-1 + 58bc: a28ff0ef jal ra,4ae4 + 58c0: f8fd bnez s1,58b6 + 58c2: 1810 addi a2,sp,48 + 58c4: 8532 mv a0,a2 + 58c6: 08ac addi a1,sp,88 + 58c8: f80fe0ef jal ra,4048 + 58cc: 180c addi a1,sp,48 + 58ce: 852e mv a0,a1 + 58d0: a14ff0ef jal ra,4ae4 + 58d4: 44a5 li s1,9 + 58d6: 180c addi a1,sp,48 + 58d8: 852e mv a0,a1 + 58da: 14fd addi s1,s1,-1 + 58dc: a08ff0ef jal ra,4ae4 + 58e0: f8fd bnez s1,58d6 + 58e2: 0030 addi a2,sp,8 + 58e4: 8532 mv a0,a2 + 58e6: 180c addi a1,sp,48 + 58e8: f60fe0ef jal ra,4048 + 58ec: 002c addi a1,sp,8 + 58ee: 1808 addi a0,sp,48 + 58f0: 9f4ff0ef jal ra,4ae4 + 58f4: 03100493 li s1,49 + 58f8: 180c addi a1,sp,48 + 58fa: 852e mv a0,a1 + 58fc: 14fd addi s1,s1,-1 + 58fe: 9e6ff0ef jal ra,4ae4 + 5902: f8fd bnez s1,58f8 + 5904: 180c addi a1,sp,48 + 5906: 852e mv a0,a1 + 5908: 0030 addi a2,sp,8 + 590a: f3efe0ef jal ra,4048 + 590e: 180c addi a1,sp,48 + 5910: 08a8 addi a0,sp,88 + 5912: 9d2ff0ef jal ra,4ae4 + 5916: 06300493 li s1,99 + 591a: 08ac addi a1,sp,88 + 591c: 852e mv a0,a1 + 591e: 14fd addi s1,s1,-1 + 5920: 9c4ff0ef jal ra,4ae4 + 5924: f8fd bnez s1,591a + 5926: 1810 addi a2,sp,48 + 5928: 8532 mv a0,a2 + 592a: 08ac addi a1,sp,88 + 592c: f1cfe0ef jal ra,4048 + 5930: 180c addi a1,sp,48 + 5932: 852e mv a0,a1 + 5934: 9b0ff0ef jal ra,4ae4 + 5938: 03100493 li s1,49 + 593c: 180c addi a1,sp,48 + 593e: 852e mv a0,a1 + 5940: 14fd addi s1,s1,-1 + 5942: 9a2ff0ef jal ra,4ae4 + 5946: f8fd bnez s1,593c + 5948: 0030 addi a2,sp,8 + 594a: 8532 mv a0,a2 + 594c: 180c addi a1,sp,48 + 594e: efafe0ef jal ra,4048 + 5952: 002c addi a1,sp,8 + 5954: 852e mv a0,a1 + 5956: 98eff0ef jal ra,4ae4 + 595a: 002c addi a1,sp,8 + 595c: 852e mv a0,a1 + 595e: 986ff0ef jal ra,4ae4 + 5962: 002c addi a1,sp,8 + 5964: 8622 mv a2,s0 + 5966: 852e mv a0,a1 + 5968: ee0fe0ef jal ra,4048 + 596c: 002c addi a1,sp,8 + 596e: 1808 addi a0,sp,48 + 5970: 974ff0ef jal ra,4ae4 + 5974: 180c addi a1,sp,48 + 5976: 8622 mv a2,s0 + 5978: 852e mv a0,a1 + 597a: ecefe0ef jal ra,4048 + 597e: 08a8 addi a0,sp,88 + 5980: f65fd0ef jal ra,38e4 + 5984: 08ac addi a1,sp,88 + 5986: 8522 mv a0,s0 + 5988: e5fff0ef jal ra,57e6 + 598c: 842a mv s0,a0 + 598e: 08a8 addi a0,sp,88 + 5990: f65fd0ef jal ra,38f4 + 5994: 08ac addi a1,sp,88 + 5996: 1808 addi a0,sp,48 + 5998: e4fff0ef jal ra,57e6 + 599c: 08ac addi a1,sp,88 + 599e: 8aaa mv s5,a0 + 59a0: 852e mv a0,a1 + 59a2: f85fd0ef jal ra,3926 + 59a6: 08ac addi a1,sp,88 + 59a8: 1808 addi a0,sp,48 + 59aa: e3dff0ef jal ra,57e6 + 59ae: 6a35 lui s4,0xd + 59b0: 89aa mv s3,a0 + 59b2: 324a0593 addi a1,s4,804 # d324 + 59b6: 08a8 addi a0,sp,88 + 59b8: f6ffd0ef jal ra,3926 + 59bc: 08ac addi a1,sp,88 + 59be: 1808 addi a0,sp,48 + 59c0: e27ff0ef jal ra,57e6 + 59c4: 324a0613 addi a2,s4,804 + 59c8: 002c addi a1,sp,8 + 59ca: 84aa mv s1,a0 + 59cc: 854a mv a0,s2 + 59ce: e7afe0ef jal ra,4048 + 59d2: 0099e4b3 or s1,s3,s1 + 59d6: 4605 li a2,1 + 59d8: 8e05 sub a2,a2,s1 + 59da: 002c addi a1,sp,8 + 59dc: 854a mv a0,s2 + 59de: 888fe0ef jal ra,3a66 + 59e2: 0028 addi a0,sp,8 + 59e4: 02800593 li a1,40 + 59e8: cd5ff0ef jal ra,56bc + 59ec: 1808 addi a0,sp,48 + 59ee: 02800593 li a1,40 + 59f2: ccbff0ef jal ra,56bc + 59f6: 08a8 addi a0,sp,88 + 59f8: 02800593 li a1,40 + 59fc: cc1ff0ef jal ra,56bc + 5a00: 01546533 or a0,s0,s5 + 5a04: 01356533 or a0,a0,s3 + 5a08: 6109 addi sp,sp,128 + 5a0a: 801fa06f j 20a <__riscv_restore_4> + +00005a0e : + 5a0e: fe2fa2ef jal t0,1f0 <__riscv_save_0> + 5a12: 7139 addi sp,sp,-64 + 5a14: 842a mv s0,a0 + 5a16: 0828 addi a0,sp,24 + 5a18: c62e sw a1,12(sp) + 5a1a: 8caff0ef jal ra,4ae4 + 5a1e: 082c addi a1,sp,24 + 5a20: 852e mv a0,a1 + 5a22: e05ff0ef jal ra,5826 + 5a26: 082c addi a1,sp,24 + 5a28: 852e mv a0,a1 + 5a2a: 8baff0ef jal ra,4ae4 + 5a2e: 4632 lw a2,12(sp) + 5a30: 082c addi a1,sp,24 + 5a32: 8522 mv a0,s0 + 5a34: e14fe0ef jal ra,4048 + 5a38: 0828 addi a0,sp,24 + 5a3a: 02800593 li a1,40 + 5a3e: c7fff0ef jal ra,56bc + 5a42: 6121 addi sp,sp,64 + 5a44: fd0fa06f j 214 <__riscv_restore_0> + +00005a48 : + 5a48: f8efa2ef jal t0,1d6 <__riscv_save_4> + 5a4c: 712d addi sp,sp,-288 + 5a4e: 8a2a mv s4,a0 + 5a50: 8b2e mv s6,a1 + 5a52: 0028 addi a0,sp,8 + 5a54: 85b2 mv a1,a2 + 5a56: 4605 li a2,1 + 5a58: 84b6 mv s1,a3 + 5a5a: 8a4fe0ef jal ra,3afe + 5a5e: 1808 addi a0,sp,48 + 5a60: e95fd0ef jal ra,38f4 + 5a64: 08a8 addi a0,sp,88 + 5a66: e7ffd0ef jal ra,38e4 + 5a6a: 002c addi a1,sp,8 + 5a6c: 0108 addi a0,sp,128 + 5a6e: e9ffd0ef jal ra,390c + 5a72: 1128 addi a0,sp,168 + 5a74: 6979 lui s2,0x1e + 5a76: e7ffd0ef jal ra,38f4 + 5a7a: 14fd addi s1,s1,-1 + 5a7c: 4401 li s0,0 + 5a7e: b4290913 addi s2,s2,-1214 # 1db42 <_data_lma+0xf8e6> + 5a82: 5afd li s5,-1 + 5a84: 85a6 mv a1,s1 + 5a86: 855a mv a0,s6 + 5a88: ed2ff0ef jal ra,515a + 5a8c: 8c29 xor s0,s0,a0 + 5a8e: 8622 mv a2,s0 + 5a90: 89aa mv s3,a0 + 5a92: 010c addi a1,sp,128 + 5a94: 1808 addi a0,sp,48 + 5a96: efdfd0ef jal ra,3992 + 5a9a: 8622 mv a2,s0 + 5a9c: 112c addi a1,sp,168 + 5a9e: 08a8 addi a0,sp,88 + 5aa0: ef3fd0ef jal ra,3992 + 5aa4: 1130 addi a2,sp,168 + 5aa6: 010c addi a1,sp,128 + 5aa8: 0988 addi a0,sp,208 + 5aaa: ec1fd0ef jal ra,396a + 5aae: 08b0 addi a2,sp,88 + 5ab0: 180c addi a1,sp,48 + 5ab2: 19a8 addi a0,sp,248 + 5ab4: eb7fd0ef jal ra,396a + 5ab8: 180c addi a1,sp,48 + 5aba: 852e mv a0,a1 + 5abc: 08b0 addi a2,sp,88 + 5abe: e87fd0ef jal ra,3944 + 5ac2: 1130 addi a2,sp,168 + 5ac4: 010c addi a1,sp,128 + 5ac6: 08a8 addi a0,sp,88 + 5ac8: e7dfd0ef jal ra,3944 + 5acc: 1810 addi a2,sp,48 + 5ace: 098c addi a1,sp,208 + 5ad0: 1128 addi a0,sp,168 + 5ad2: d76fe0ef jal ra,4048 + 5ad6: 08ac addi a1,sp,88 + 5ad8: 19b0 addi a2,sp,248 + 5ada: 852e mv a0,a1 + 5adc: d6cfe0ef jal ra,4048 + 5ae0: 19ac addi a1,sp,248 + 5ae2: 0988 addi a0,sp,208 + 5ae4: 800ff0ef jal ra,4ae4 + 5ae8: 180c addi a1,sp,48 + 5aea: 19a8 addi a0,sp,248 + 5aec: ff9fe0ef jal ra,4ae4 + 5af0: 08b0 addi a2,sp,88 + 5af2: 112c addi a1,sp,168 + 5af4: 0108 addi a0,sp,128 + 5af6: e4ffd0ef jal ra,3944 + 5afa: 08b0 addi a2,sp,88 + 5afc: 8532 mv a0,a2 + 5afe: 112c addi a1,sp,168 + 5b00: e6bfd0ef jal ra,396a + 5b04: 0990 addi a2,sp,208 + 5b06: 19ac addi a1,sp,248 + 5b08: 1808 addi a0,sp,48 + 5b0a: d3efe0ef jal ra,4048 + 5b0e: 19ac addi a1,sp,248 + 5b10: 0990 addi a2,sp,208 + 5b12: 852e mv a0,a1 + 5b14: e57fd0ef jal ra,396a + 5b18: 08ac addi a1,sp,88 + 5b1a: 852e mv a0,a1 + 5b1c: fc9fe0ef jal ra,4ae4 + 5b20: 864a mv a2,s2 + 5b22: 19ac addi a1,sp,248 + 5b24: 1128 addi a0,sp,168 + 5b26: a30fe0ef jal ra,3d56 + 5b2a: 010c addi a1,sp,128 + 5b2c: 852e mv a0,a1 + 5b2e: fb7fe0ef jal ra,4ae4 + 5b32: 098c addi a1,sp,208 + 5b34: 852e mv a0,a1 + 5b36: 1130 addi a2,sp,168 + 5b38: e0dfd0ef jal ra,3944 + 5b3c: 08b0 addi a2,sp,88 + 5b3e: 002c addi a1,sp,8 + 5b40: 1128 addi a0,sp,168 + 5b42: d06fe0ef jal ra,4048 + 5b46: 0990 addi a2,sp,208 + 5b48: 19ac addi a1,sp,248 + 5b4a: 08a8 addi a0,sp,88 + 5b4c: 14fd addi s1,s1,-1 + 5b4e: cfafe0ef jal ra,4048 + 5b52: 844e mv s0,s3 + 5b54: f35498e3 bne s1,s5,5a84 + 5b58: 864e mv a2,s3 + 5b5a: 010c addi a1,sp,128 + 5b5c: 1808 addi a0,sp,48 + 5b5e: e35fd0ef jal ra,3992 + 5b62: 864e mv a2,s3 + 5b64: 112c addi a1,sp,168 + 5b66: 08a8 addi a0,sp,88 + 5b68: e2bfd0ef jal ra,3992 + 5b6c: 08ac addi a1,sp,88 + 5b6e: 852e mv a0,a1 + 5b70: e9fff0ef jal ra,5a0e + 5b74: 180c addi a1,sp,48 + 5b76: 08b0 addi a2,sp,88 + 5b78: 852e mv a0,a1 + 5b7a: ccefe0ef jal ra,4048 + 5b7e: 180c addi a1,sp,48 + 5b80: 8552 mv a0,s4 + 5b82: b4fff0ef jal ra,56d0 + 5b86: 0028 addi a0,sp,8 + 5b88: 02800593 li a1,40 + 5b8c: b31ff0ef jal ra,56bc + 5b90: 1808 addi a0,sp,48 + 5b92: 02800593 li a1,40 + 5b96: b27ff0ef jal ra,56bc + 5b9a: 08a8 addi a0,sp,88 + 5b9c: 02800593 li a1,40 + 5ba0: b1dff0ef jal ra,56bc + 5ba4: 0988 addi a0,sp,208 + 5ba6: 02800593 li a1,40 + 5baa: b13ff0ef jal ra,56bc + 5bae: 0108 addi a0,sp,128 + 5bb0: 02800593 li a1,40 + 5bb4: b09ff0ef jal ra,56bc + 5bb8: 1128 addi a0,sp,168 + 5bba: 02800593 li a1,40 + 5bbe: affff0ef jal ra,56bc + 5bc2: 19a8 addi a0,sp,248 + 5bc4: 02800593 li a1,40 + 5bc8: af5ff0ef jal ra,56bc + 5bcc: 6115 addi sp,sp,288 + 5bce: e3cfa06f j 20a <__riscv_restore_4> + +00005bd2 : + 5bd2: e1efa2ef jal t0,1f0 <__riscv_save_0> + 5bd6: 7159 addi sp,sp,-112 + 5bd8: 842e mv s0,a1 + 5bda: 84aa mv s1,a0 + 5bdc: 4581 li a1,0 + 5bde: 06400613 li a2,100 + 5be2: 0068 addi a0,sp,12 + 5be4: e3cfa0ef jal ra,220 + 5be8: 006c addi a1,sp,12 + 5bea: 6eb5 lui t4,0xd + 5bec: 882e mv a6,a1 + 5bee: 4301 li t1,0 + 5bf0: 300e8e93 addi t4,t4,768 # d300 + 5bf4: 04040f93 addi t6,s0,64 + 5bf8: 02400293 li t0,36 + 5bfc: 006e87b3 add a5,t4,t1 + 5c00: 0007af03 lw t5,0(a5) # 1000000 <_data_lma+0xff1da4> + 5c04: 8622 mv a2,s0 + 5c06: 88a2 mv a7,s0 + 5c08: 8542 mv a0,a6 + 5c0a: 4701 li a4,0 + 5c0c: 0008a783 lw a5,0(a7) + 5c10: 0891 addi a7,a7,4 + 5c12: 0511 addi a0,a0,4 + 5c14: 02ff06b3 mul a3,t5,a5 + 5c18: 02ff3e33 mulhu t3,t5,a5 + 5c1c: ffc52783 lw a5,-4(a0) + 5c20: 97b6 add a5,a5,a3 + 5c22: 973e add a4,a4,a5 + 5c24: 00d7b6b3 sltu a3,a5,a3 + 5c28: fee52e23 sw a4,-4(a0) + 5c2c: 00f737b3 sltu a5,a4,a5 + 5c30: 96f2 add a3,a3,t3 + 5c32: 00d78733 add a4,a5,a3 + 5c36: fdf89be3 bne a7,t6,5c0c + 5c3a: 04e82023 sw a4,64(a6) + 5c3e: 0311 addi t1,t1,4 + 5c40: 0811 addi a6,a6,4 + 5c42: fa531de3 bne t1,t0,5bfc + 5c46: c602 sw zero,12(sp) + 5c48: c802 sw zero,16(sp) + 5c4a: ca02 sw zero,20(sp) + 5c4c: cc02 sw zero,24(sp) + 5c4e: ce02 sw zero,28(sp) + 5c50: d002 sw zero,32(sp) + 5c52: d202 sw zero,36(sp) + 5c54: d402 sw zero,40(sp) + 5c56: 00c10813 addi a6,sp,12 + 5c5a: 48a1 li a7,8 + 5c5c: 6f31 lui t5,0xc + 5c5e: 710f0e93 addi t4,t5,1808 # c710 + 5c62: 8542 mv a0,a6 + 5c64: 4e01 li t3,0 + 5c66: 4681 li a3,0 + 5c68: 04082783 lw a5,64(a6) + 5c6c: 000ea303 lw t1,0(t4) + 5c70: 0e05 addi t3,t3,1 + 5c72: 0511 addi a0,a0,4 + 5c74: 02678733 mul a4,a5,t1 + 5c78: 0e91 addi t4,t4,4 + 5c7a: 0267b333 mulhu t1,a5,t1 + 5c7e: ffc52783 lw a5,-4(a0) + 5c82: 97ba add a5,a5,a4 + 5c84: 96be add a3,a3,a5 + 5c86: 00e7b733 sltu a4,a5,a4 + 5c8a: fed52e23 sw a3,-4(a0) + 5c8e: 00f6b7b3 sltu a5,a3,a5 + 5c92: 971a add a4,a4,t1 + 5c94: 00e786b3 add a3,a5,a4 + 5c98: fd1e68e3 bltu t3,a7,5c68 + 5c9c: 18fd addi a7,a7,-1 + 5c9e: 0811 addi a6,a6,4 + 5ca0: fa089fe3 bnez a7,5c5e + 5ca4: 02040413 addi s0,s0,32 + 5ca8: 4685 li a3,1 + 5caa: 4198 lw a4,0(a1) + 5cac: 421c lw a5,0(a2) + 5cae: 0611 addi a2,a2,4 + 5cb0: fff74713 not a4,a4 + 5cb4: 97ba add a5,a5,a4 + 5cb6: 96be add a3,a3,a5 + 5cb8: 00e7b733 sltu a4,a5,a4 + 5cbc: c194 sw a3,0(a1) + 5cbe: 00f6b7b3 sltu a5,a3,a5 + 5cc2: 00e786b3 add a3,a5,a4 + 5cc6: 0591 addi a1,a1,4 + 5cc8: fe8611e3 bne a2,s0,5caa + 5ccc: 006c addi a1,sp,12 + 5cce: 852e mv a0,a1 + 5cd0: d24ff0ef jal ra,51f4 + 5cd4: 4621 li a2,8 + 5cd6: 006c addi a1,sp,12 + 5cd8: 8526 mv a0,s1 + 5cda: b81fd0ef jal ra,385a + 5cde: 0068 addi a0,sp,12 + 5ce0: 06400593 li a1,100 + 5ce4: 9d9ff0ef jal ra,56bc + 5ce8: 6165 addi sp,sp,112 + 5cea: d2afa06f j 214 <__riscv_restore_0> + +00005cee : + 5cee: d02fa2ef jal t0,1f0 <__riscv_save_0> + 5cf2: 1101 addi sp,sp,-32 + 5cf4: 85aa mv a1,a0 + 5cf6: 850a mv a0,sp + 5cf8: 9d9ff0ef jal ra,56d0 + 5cfc: 8000 lbu s0,0(sp) + 5cfe: 850a mv a0,sp + 5d00: 02000593 li a1,32 + 5d04: 9b9ff0ef jal ra,56bc + 5d08: 8805 andi s0,s0,1 + 5d0a: 8522 mv a0,s0 + 5d0c: 6105 addi sp,sp,32 + 5d0e: d06fa06f j 214 <__riscv_restore_0> + +00005d12 : + 5d12: cc4fa2ef jal t0,1d6 <__riscv_save_4> + 5d16: 02850913 addi s2,a0,40 + 5d1a: 842a mv s0,a0 + 5d1c: 4605 li a2,1 + 5d1e: 854a mv a0,s2 + 5d20: 8a2e mv s4,a1 + 5d22: 05040993 addi s3,s0,80 + 5d26: dd9fd0ef jal ra,3afe + 5d2a: 854e mv a0,s3 + 5d2c: 07840493 addi s1,s0,120 + 5d30: bc5fd0ef jal ra,38f4 + 5d34: 85ca mv a1,s2 + 5d36: 8526 mv a0,s1 + 5d38: dadfe0ef jal ra,4ae4 + 5d3c: 6635 lui a2,0xd + 5d3e: 27060613 addi a2,a2,624 # d270 + 5d42: 85a6 mv a1,s1 + 5d44: 8522 mv a0,s0 + 5d46: b02fe0ef jal ra,4048 + 5d4a: 864e mv a2,s3 + 5d4c: 85a6 mv a1,s1 + 5d4e: 8526 mv a0,s1 + 5d50: c1bfd0ef jal ra,396a + 5d54: 864e mv a2,s3 + 5d56: 85a2 mv a1,s0 + 5d58: 8522 mv a0,s0 + 5d5a: bebfd0ef jal ra,3944 + 5d5e: 85a6 mv a1,s1 + 5d60: 8522 mv a0,s0 + 5d62: 8622 mv a2,s0 + 5d64: ae4fe0ef jal ra,4048 + 5d68: 85a2 mv a1,s0 + 5d6a: 8522 mv a0,s0 + 5d6c: abbff0ef jal ra,5826 + 5d70: c915 beqz a0,5da4 + 5d72: 8622 mv a2,s0 + 5d74: 85a6 mv a1,s1 + 5d76: 8522 mv a0,s0 + 5d78: ad0fe0ef jal ra,4048 + 5d7c: 8522 mv a0,s0 + 5d7e: f71ff0ef jal ra,5cee + 5d82: 01fa4783 lbu a5,31(s4) + 5d86: 839d srli a5,a5,0x7 + 5d88: 00f51663 bne a0,a5,5d94 + 5d8c: 85a2 mv a1,s0 + 5d8e: 8522 mv a0,s0 + 5d90: b97fd0ef jal ra,3926 + 5d94: 8526 mv a0,s1 + 5d96: 864a mv a2,s2 + 5d98: 85a2 mv a1,s0 + 5d9a: aaefe0ef jal ra,4048 + 5d9e: 4501 li a0,0 + 5da0: c6afa06f j 20a <__riscv_restore_4> + 5da4: 557d li a0,-1 + 5da6: bfed j 5da0 + +00005da8 : + 5da8: c48fa2ef jal t0,1f0 <__riscv_save_0> + 5dac: 7119 addi sp,sp,-128 + 5dae: 842a mv s0,a0 + 5db0: 84ae mv s1,a1 + 5db2: 0028 addi a0,sp,8 + 5db4: 05058593 addi a1,a1,80 + 5db8: c57ff0ef jal ra,5a0e + 5dbc: 0030 addi a2,sp,8 + 5dbe: 85a6 mv a1,s1 + 5dc0: 1808 addi a0,sp,48 + 5dc2: a86fe0ef jal ra,4048 + 5dc6: 0030 addi a2,sp,8 + 5dc8: 02848593 addi a1,s1,40 + 5dcc: 08a8 addi a0,sp,88 + 5dce: a7afe0ef jal ra,4048 + 5dd2: 08ac addi a1,sp,88 + 5dd4: 8522 mv a0,s0 + 5dd6: 8fbff0ef jal ra,56d0 + 5dda: 1808 addi a0,sp,48 + 5ddc: f13ff0ef jal ra,5cee + 5de0: 67a1 lui a5,0x8 + 5de2: f8078793 addi a5,a5,-128 # 7f80 + 5de6: 051e slli a0,a0,0x7 + 5de8: 8d7d and a0,a0,a5 + 5dea: 3c7c lbu a5,31(s0) + 5dec: 02800593 li a1,40 + 5df0: 8d3d xor a0,a0,a5 + 5df2: bc68 sb a0,31(s0) + 5df4: 0028 addi a0,sp,8 + 5df6: 8c7ff0ef jal ra,56bc + 5dfa: 1808 addi a0,sp,48 + 5dfc: 02800593 li a1,40 + 5e00: 8bdff0ef jal ra,56bc + 5e04: 08a8 addi a0,sp,88 + 5e06: 02800593 li a1,40 + 5e0a: 8b3ff0ef jal ra,56bc + 5e0e: 6109 addi sp,sp,128 + 5e10: c04fa06f j 214 <__riscv_restore_0> + +00005e14 : + 5e14: 4781 li a5,0 + 5e16: 02000713 li a4,32 + 5e1a: 00f586b3 add a3,a1,a5 + 5e1e: 2290 lbu a2,0(a3) + 5e20: 00f506b3 add a3,a0,a5 + 5e24: 0785 addi a5,a5,1 + 5e26: a290 sb a2,0(a3) + 5e28: fee799e3 bne a5,a4,5e1a + 5e2c: 211c lbu a5,0(a0) + 5e2e: 9be1 andi a5,a5,-8 + 5e30: a11c sb a5,0(a0) + 5e32: 3d7c lbu a5,31(a0) + 5e34: 07f7f793 andi a5,a5,127 + 5e38: 0407e793 ori a5,a5,64 + 5e3c: bd7c sb a5,31(a0) + 5e3e: 8082 ret + +00005e40 : + 5e40: bb0fa2ef jal t0,1f0 <__riscv_save_0> + 5e44: 7179 addi sp,sp,-48 + 5e46: 842a mv s0,a0 + 5e48: 0808 addi a0,sp,16 + 5e4a: c632 sw a2,12(sp) + 5e4c: fc9ff0ef jal ra,5e14 + 5e50: 4632 lw a2,12(sp) + 5e52: 0ff00693 li a3,255 + 5e56: 080c addi a1,sp,16 + 5e58: 8522 mv a0,s0 + 5e5a: befff0ef jal ra,5a48 + 5e5e: 0808 addi a0,sp,16 + 5e60: 02000593 li a1,32 + 5e64: 859ff0ef jal ra,56bc + 5e68: 6145 addi sp,sp,48 + 5e6a: baafa06f j 214 <__riscv_restore_0> + +00005e6e : + 5e6e: b82fa2ef jal t0,1f0 <__riscv_save_0> + 5e72: 7139 addi sp,sp,-64 + 5e74: 842a mv s0,a0 + 5e76: 4641 li a2,16 + 5e78: 850a mv a0,sp + 5e7a: 9b5fd0ef jal ra,382e + 5e7e: 858a mv a1,sp + 5e80: 8522 mv a0,s0 + 5e82: d51ff0ef jal ra,5bd2 + 5e86: 850a mv a0,sp + 5e88: 04000593 li a1,64 + 5e8c: 831ff0ef jal ra,56bc + 5e90: 6121 addi sp,sp,64 + 5e92: b82fa06f j 214 <__riscv_restore_0> + +00005e96 : + 5e96: b5afa2ef jal t0,1f0 <__riscv_save_0> + 5e9a: 7175 addi sp,sp,-144 + 5e9c: 842a mv s0,a0 + 5e9e: 84b2 mv s1,a2 + 5ea0: 0808 addi a0,sp,16 + 5ea2: 4621 li a2,8 + 5ea4: c636 sw a3,12(sp) + 5ea6: 989fd0ef jal ra,382e + 5eaa: 85a6 mv a1,s1 + 5eac: 1808 addi a0,sp,48 + 5eae: 4621 li a2,8 + 5eb0: 97ffd0ef jal ra,382e + 5eb4: 46b2 lw a3,12(sp) + 5eb6: 0888 addi a0,sp,80 + 5eb8: 4621 li a2,8 + 5eba: 85b6 mv a1,a3 + 5ebc: 973fd0ef jal ra,382e + 5ec0: 1810 addi a2,sp,48 + 5ec2: 080c addi a1,sp,16 + 5ec4: 0888 addi a0,sp,80 + 5ec6: d882 sw zero,112(sp) + 5ec8: da82 sw zero,116(sp) + 5eca: dc82 sw zero,120(sp) + 5ecc: de82 sw zero,124(sp) + 5ece: c102 sw zero,128(sp) + 5ed0: c302 sw zero,132(sp) + 5ed2: c502 sw zero,136(sp) + 5ed4: c702 sw zero,140(sp) + 5ed6: a9eff0ef jal ra,5174 + 5eda: 088c addi a1,sp,80 + 5edc: 8522 mv a0,s0 + 5ede: cf5ff0ef jal ra,5bd2 + 5ee2: 0888 addi a0,sp,80 + 5ee4: 04000593 li a1,64 + 5ee8: fd4ff0ef jal ra,56bc + 5eec: 0808 addi a0,sp,16 + 5eee: 02000593 li a1,32 + 5ef2: fcaff0ef jal ra,56bc + 5ef6: 1808 addi a0,sp,48 + 5ef8: 02000593 li a1,32 + 5efc: fc0ff0ef jal ra,56bc + 5f00: 6149 addi sp,sp,144 + 5f02: b12fa06f j 214 <__riscv_restore_0> + +00005f06 : + 5f06: ad0fa2ef jal t0,1d6 <__riscv_save_4> + 5f0a: 7165 addi sp,sp,-400 + 5f0c: 66b5 lui a3,0xd + 5f0e: 6635 lui a2,0xd + 5f10: 2e068693 addi a3,a3,736 # d2e0 + 5f14: 2c060613 addi a2,a2,704 # d2c0 + 5f18: 842a mv s0,a0 + 5f1a: 0028 addi a0,sp,8 + 5f1c: f7bff0ef jal ra,5e96 + 5f20: 18a8 addi a0,sp,120 + 5f22: 9d3fd0ef jal ra,38f4 + 5f26: 1108 addi a0,sp,160 + 5f28: 9cdfd0ef jal ra,38f4 + 5f2c: 01a8 addi a0,sp,200 + 5f2e: 9b7fd0ef jal ra,38e4 + 5f32: 8522 mv a0,s0 + 5f34: b22ff0ef jal ra,5256 + 5f38: 69b5 lui s3,0xd + 5f3a: 487d li a6,31 + 5f3c: 003c addi a5,sp,8 + 5f3e: af098713 addi a4,s3,-1296 # caf0 + 5f42: 0894 addi a3,sp,80 + 5f44: 1030 addi a2,sp,40 + 5f46: 18ac addi a1,sp,120 + 5f48: 8522 mv a0,s0 + 5f4a: e82ff0ef jal ra,55cc + 5f4e: 6931 lui s2,0xc + 5f50: 09f00813 li a6,159 + 5f54: 003c addi a5,sp,8 + 5f56: 73090713 addi a4,s2,1840 # c730 + 5f5a: 0894 addi a3,sp,80 + 5f5c: 1030 addi a2,sp,40 + 5f5e: 18ac addi a1,sp,120 + 5f60: 8522 mv a0,s0 + 5f62: e6aff0ef jal ra,55cc + 5f66: 44f9 li s1,30 + 5f68: 5a7d li s4,-1 + 5f6a: 1990 addi a2,sp,240 + 5f6c: 85a2 mv a1,s0 + 5f6e: 8522 mv a0,s0 + 5f70: cc6ff0ef jal ra,5436 + 5f74: 8826 mv a6,s1 + 5f76: 003c addi a5,sp,8 + 5f78: af098713 addi a4,s3,-1296 + 5f7c: 0894 addi a3,sp,80 + 5f7e: 1030 addi a2,sp,40 + 5f80: 18ac addi a1,sp,120 + 5f82: 8522 mv a0,s0 + 5f84: e48ff0ef jal ra,55cc + 5f88: 08048813 addi a6,s1,128 + 5f8c: 003c addi a5,sp,8 + 5f8e: 73090713 addi a4,s2,1840 + 5f92: 0894 addi a3,sp,80 + 5f94: 1030 addi a2,sp,40 + 5f96: 18ac addi a1,sp,120 + 5f98: 8522 mv a0,s0 + 5f9a: 14fd addi s1,s1,-1 + 5f9c: e30ff0ef jal ra,55cc + 5fa0: fd4495e3 bne s1,s4,5f6a + 5fa4: 1028 addi a0,sp,40 + 5fa6: 02800593 li a1,40 + 5faa: f12ff0ef jal ra,56bc + 5fae: 1988 addi a0,sp,240 + 5fb0: 0a000593 li a1,160 + 5fb4: f08ff0ef jal ra,56bc + 5fb8: 0888 addi a0,sp,80 + 5fba: 02800593 li a1,40 + 5fbe: efeff0ef jal ra,56bc + 5fc2: 18a8 addi a0,sp,120 + 5fc4: 07800593 li a1,120 + 5fc8: ef4ff0ef jal ra,56bc + 5fcc: 0028 addi a0,sp,8 + 5fce: 02000593 li a1,32 + 5fd2: eeaff0ef jal ra,56bc + 5fd6: 6159 addi sp,sp,400 + 5fd8: a32fa06f j 20a <__riscv_restore_4> + +00005fdc : + 5fdc: 9fafa2ef jal t0,1d6 <__riscv_save_4> + 5fe0: be010113 addi sp,sp,-1056 + 5fe4: 02050a13 addi s4,a0,32 + 5fe8: 84ae mv s1,a1 + 5fea: 842a mv s0,a0 + 5fec: 85d2 mv a1,s4 + 5fee: 1588 addi a0,sp,736 + 5ff0: 8ab2 mv s5,a2 + 5ff2: 4621 li a2,8 + 5ff4: 83bfd0ef jal ra,382e + 5ff8: 85a6 mv a1,s1 + 5ffa: 1088 addi a0,sp,96 + 5ffc: d17ff0ef jal ra,5d12 + 6000: c511 beqz a0,600c + 6002: 557d li a0,-1 + 6004: 42010113 addi sp,sp,1056 + 6008: a02fa06f j 20a <__riscv_restore_4> + 600c: 85a2 mv a1,s0 + 600e: 0208 addi a0,sp,256 + 6010: d03ff0ef jal ra,5d12 + 6014: f57d bnez a0,6002 + 6016: 1588 addi a0,sp,736 + 6018: 9a6ff0ef jal ra,51be + 601c: f17d bnez a0,6002 + 601e: 0490 addi a2,sp,576 + 6020: 108c addi a1,sp,96 + 6022: 1308 addi a0,sp,416 + 6024: c12ff0ef jal ra,5436 + 6028: 108c addi a1,sp,96 + 602a: 1588 addi a0,sp,736 + 602c: a50ff0ef jal ra,527c + 6030: 1590 addi a2,sp,736 + 6032: 130c addi a1,sp,416 + 6034: 0488 addi a0,sp,576 + 6036: a88ff0ef jal ra,52be + 603a: 048c addi a1,sp,576 + 603c: 0708 addi a0,sp,896 + 603e: a3eff0ef jal ra,527c + 6042: 85d6 mv a1,s5 + 6044: 0028 addi a0,sp,8 + 6046: c9aff0ef jal ra,54e0 + 604a: 85d2 mv a1,s4 + 604c: 0068 addi a0,sp,12 + 604e: c92ff0ef jal ra,54e0 + 6052: 879c lbu a5,15(sp) + 6054: 00b14903 lbu s2,11(sp) + 6058: 00f97363 bgeu s2,a5,605e + 605c: 893e mv s2,a5 + 605e: 1088 addi a0,sp,96 + 6060: 69b5 lui s3,0xd + 6062: 0ff97913 andi s2,s2,255 + 6066: 9f0ff0ef jal ra,5256 + 606a: 4b09 li s6,2 + 606c: eb098993 addi s3,s3,-336 # ceb0 + 6070: 108c addi a1,sp,96 + 6072: 852e mv a0,a1 + 6074: 1310 addi a2,sp,416 + 6076: bc0ff0ef jal ra,5436 + 607a: 86d6 mv a3,s5 + 607c: 864a mv a2,s2 + 607e: 458d li a1,3 + 6080: 0028 addi a0,sp,8 + 6082: c86ff0ef jal ra,5508 + 6086: 842a mv s0,a0 + 6088: 86d2 mv a3,s4 + 608a: 864a mv a2,s2 + 608c: 4595 li a1,5 + 608e: 0068 addi a0,sp,12 + 6090: c78ff0ef jal ra,5508 + 6094: 84aa mv s1,a0 + 6096: 08805263 blez s0,611a + 609a: 8405 srai s0,s0,0x1 + 609c: 0a000613 li a2,160 + 60a0: 02c40633 mul a2,s0,a2 + 60a4: 159c addi a5,sp,736 + 60a6: 963e add a2,a2,a5 + 60a8: 108c addi a1,sp,96 + 60aa: 852e mv a0,a1 + 60ac: a12ff0ef jal ra,52be + 60b0: 0a905963 blez s1,6162 + 60b4: 8485 srai s1,s1,0x1 + 60b6: 07800613 li a2,120 + 60ba: 02c48633 mul a2,s1,a2 + 60be: 1838 addi a4,sp,56 + 60c0: 0814 addi a3,sp,16 + 60c2: 964e add a2,a2,s3 + 60c4: 108c addi a1,sp,96 + 60c6: 852e mv a0,a1 + 60c8: ab8ff0ef jal ra,5380 + 60cc: 197d addi s2,s2,-1 + 60ce: 57fd li a5,-1 + 60d0: faf910e3 bne s2,a5,6070 + 60d4: 020c addi a1,sp,256 + 60d6: 0488 addi a0,sp,576 + 60d8: 9a4ff0ef jal ra,527c + 60dc: 108c addi a1,sp,96 + 60de: 0490 addi a2,sp,576 + 60e0: 852e mv a0,a1 + 60e2: 9dcff0ef jal ra,52be + 60e6: 108c addi a1,sp,96 + 60e8: 0210 addi a2,sp,256 + 60ea: 852e mv a0,a1 + 60ec: b4aff0ef jal ra,5436 + 60f0: 108c addi a1,sp,96 + 60f2: 0210 addi a2,sp,256 + 60f4: 852e mv a0,a1 + 60f6: b40ff0ef jal ra,5436 + 60fa: 108c addi a1,sp,96 + 60fc: 0210 addi a2,sp,256 + 60fe: 852e mv a0,a1 + 6100: b36ff0ef jal ra,5436 + 6104: 108c addi a1,sp,96 + 6106: 1308 addi a0,sp,416 + 6108: ca1ff0ef jal ra,5da8 + 610c: 65b5 lui a1,0xd + 610e: 34c58593 addi a1,a1,844 # d34c + 6112: 1308 addi a0,sp,416 + 6114: d94ff0ef jal ra,56a8 + 6118: b5f5 j 6004 + 611a: d859 beqz s0,60b0 + 611c: 03644433 div s0,s0,s6 + 6120: f6000593 li a1,-160 + 6124: 159c addi a5,sp,736 + 6126: 14a8 addi a0,sp,616 + 6128: 02b40433 mul s0,s0,a1 + 612c: 008785b3 add a1,a5,s0 + 6130: fdcfd0ef jal ra,390c + 6134: 159c addi a5,sp,736 + 6136: 02840593 addi a1,s0,40 + 613a: 95be add a1,a1,a5 + 613c: 0488 addi a0,sp,576 + 613e: fcefd0ef jal ra,390c + 6142: 159c addi a5,sp,736 + 6144: 05040593 addi a1,s0,80 + 6148: 95be add a1,a1,a5 + 614a: 0d08 addi a0,sp,656 + 614c: fc0fd0ef jal ra,390c + 6150: 159c addi a5,sp,736 + 6152: 07840593 addi a1,s0,120 + 6156: 95be add a1,a1,a5 + 6158: 1d28 addi a0,sp,696 + 615a: fccfd0ef jal ra,3926 + 615e: 0490 addi a2,sp,576 + 6160: b7a1 j 60a8 + 6162: d4ad beqz s1,60cc + 6164: 0364c4b3 div s1,s1,s6 + 6168: f8800793 li a5,-120 + 616c: 14a8 addi a0,sp,616 + 616e: 02f484b3 mul s1,s1,a5 + 6172: 94ce add s1,s1,s3 + 6174: 85a6 mv a1,s1 + 6176: f96fd0ef jal ra,390c + 617a: 02848593 addi a1,s1,40 + 617e: 0488 addi a0,sp,576 + 6180: f8cfd0ef jal ra,390c + 6184: 05048593 addi a1,s1,80 + 6188: 0d08 addi a0,sp,656 + 618a: f9cfd0ef jal ra,3926 + 618e: 1838 addi a4,sp,56 + 6190: 0814 addi a3,sp,16 + 6192: 0490 addi a2,sp,576 + 6194: bf05 j 60c4 + +00006196 : + 6196: 85afa2ef jal t0,1f0 <__riscv_save_0> + 619a: 7135 addi sp,sp,-160 + 619c: 842a mv s0,a0 + 619e: 850a mv a0,sp + 61a0: d67ff0ef jal ra,5f06 + 61a4: 858a mv a1,sp + 61a6: 8522 mv a0,s0 + 61a8: c01ff0ef jal ra,5da8 + 61ac: 850a mv a0,sp + 61ae: 0a000593 li a1,160 + 61b2: d0aff0ef jal ra,56bc + 61b6: 610d addi sp,sp,160 + 61b8: 85cfa06f j 214 <__riscv_restore_0> + +000061bc : + 61bc: 834fa2ef jal t0,1f0 <__riscv_save_0> + 61c0: 715d addi sp,sp,-80 + 61c2: 84aa mv s1,a0 + 61c4: 4605 li a2,1 + 61c6: 1028 addi a0,sp,40 + 61c8: 937fd0ef jal ra,3afe + 61cc: 6435 lui s0,0xd + 61ce: 1030 addi a2,sp,40 + 61d0: 29840593 addi a1,s0,664 # d298 + 61d4: 850a mv a0,sp + 61d6: f6efd0ef jal ra,3944 + 61da: 1030 addi a2,sp,40 + 61dc: 8532 mv a0,a2 + 61de: 29840593 addi a1,s0,664 + 61e2: f88fd0ef jal ra,396a + 61e6: 102c addi a1,sp,40 + 61e8: 852e mv a0,a1 + 61ea: 825ff0ef jal ra,5a0e + 61ee: 1030 addi a2,sp,40 + 61f0: 858a mv a1,sp + 61f2: 850a mv a0,sp + 61f4: e55fd0ef jal ra,4048 + 61f8: 858a mv a1,sp + 61fa: 8526 mv a0,s1 + 61fc: cd4ff0ef jal ra,56d0 + 6200: 850a mv a0,sp + 6202: 02800593 li a1,40 + 6206: cb6ff0ef jal ra,56bc + 620a: 1028 addi a0,sp,40 + 620c: 02800593 li a1,40 + 6210: cacff0ef jal ra,56bc + 6214: 6161 addi sp,sp,80 + 6216: ffff906f j 214 <__riscv_restore_0> + +0000621a : + 621a: 211c lbu a5,0(a0) + 621c: 3118 lbu a4,1(a0) + 621e: 07e2 slli a5,a5,0x18 + 6220: 0742 slli a4,a4,0x10 + 6222: 8fd9 or a5,a5,a4 + 6224: 3138 lbu a4,3(a0) + 6226: 2128 lbu a0,2(a0) + 6228: 8fd9 or a5,a5,a4 + 622a: 0522 slli a0,a0,0x8 + 622c: 8d5d or a0,a0,a5 + 622e: 8082 ret + +00006230 : + 6230: 01855793 srli a5,a0,0x18 + 6234: a19c sb a5,0(a1) + 6236: 01055793 srli a5,a0,0x10 + 623a: b19c sb a5,1(a1) + 623c: 00855793 srli a5,a0,0x8 + 6240: a1bc sb a5,2(a1) + 6242: b1a8 sb a0,3(a1) + 6244: 8082 ret + +00006246 : + 6246: 4198 lw a4,0(a1) + 6248: 411c lw a5,0(a0) + 624a: 8fb9 xor a5,a5,a4 + 624c: c11c sw a5,0(a0) + 624e: 41d8 lw a4,4(a1) + 6250: 415c lw a5,4(a0) + 6252: 8fb9 xor a5,a5,a4 + 6254: c15c sw a5,4(a0) + 6256: 4598 lw a4,8(a1) + 6258: 451c lw a5,8(a0) + 625a: 8fb9 xor a5,a5,a4 + 625c: c51c sw a5,8(a0) + 625e: 45d8 lw a4,12(a1) + 6260: 455c lw a5,12(a0) + 6262: 8fb9 xor a5,a5,a4 + 6264: c55c sw a5,12(a0) + 6266: 8082 ret + +00006268 : + 6268: 00052803 lw a6,0(a0) + 626c: 4150 lw a2,4(a0) + 626e: ff000337 lui t1,0xff000 + 6272: 00ff08b7 lui a7,0xff0 + 6276: 4514 lw a3,8(a0) + 6278: 011675b3 and a1,a2,a7 + 627c: 00687733 and a4,a6,t1 + 6280: 455c lw a5,12(a0) + 6282: 8f4d or a4,a4,a1 + 6284: 65c1 lui a1,0x10 + 6286: f0058593 addi a1,a1,-256 # ff00 <_data_lma+0x1ca4> + 628a: 00b6fe33 and t3,a3,a1 + 628e: 01c76733 or a4,a4,t3 + 6292: 0ff7fe13 andi t3,a5,255 + 6296: 01c76733 or a4,a4,t3 + 629a: c118 sw a4,0(a0) + 629c: 0116fe33 and t3,a3,a7 + 62a0: 00667733 and a4,a2,t1 + 62a4: 01c76733 or a4,a4,t3 + 62a8: 00b7fe33 and t3,a5,a1 + 62ac: 01c76733 or a4,a4,t3 + 62b0: 0ff87e13 andi t3,a6,255 + 62b4: 01c76733 or a4,a4,t3 + 62b8: c158 sw a4,4(a0) + 62ba: 0117fe33 and t3,a5,a7 + 62be: 0066f733 and a4,a3,t1 + 62c2: 01c76733 or a4,a4,t3 + 62c6: 0067f7b3 and a5,a5,t1 + 62ca: 00b87e33 and t3,a6,a1 + 62ce: 01187833 and a6,a6,a7 + 62d2: 01c76733 or a4,a4,t3 + 62d6: 0107e7b3 or a5,a5,a6 + 62da: 0ff67e13 andi t3,a2,255 + 62de: 8e6d and a2,a2,a1 + 62e0: 8fd1 or a5,a5,a2 + 62e2: 0ff6f693 andi a3,a3,255 + 62e6: 01c76733 or a4,a4,t3 + 62ea: 8fd5 or a5,a5,a3 + 62ec: c518 sw a4,8(a0) + 62ee: c55c sw a5,12(a0) + 62f0: 8082 ret + +000062f2 : + 62f2: 01010737 lui a4,0x1010 + 62f6: 00755793 srli a5,a0,0x7 + 62fa: 10170713 addi a4,a4,257 # 1010101 <_data_lma+0x1001ea5> + 62fe: 8ff9 and a5,a5,a4 + 6300: 476d li a4,27 + 6302: 02e787b3 mul a5,a5,a4 + 6306: feff0737 lui a4,0xfeff0 + 630a: efe70713 addi a4,a4,-258 # fefefefe <_eusrstack+0xdefe7efe> + 630e: 0506 slli a0,a0,0x1 + 6310: 8d79 and a0,a0,a4 + 6312: 8d3d xor a0,a0,a5 + 6314: 8082 ret + +00006316 : + 6316: edbf92ef jal t0,1f0 <__riscv_save_0> + 631a: 842a mv s0,a0 + 631c: fd7ff0ef jal ra,62f2 + 6320: 01045713 srli a4,s0,0x10 + 6324: 01041793 slli a5,s0,0x10 + 6328: 01841693 slli a3,s0,0x18 + 632c: 8fd9 or a5,a5,a4 + 632e: 00845713 srli a4,s0,0x8 + 6332: 8f55 or a4,a4,a3 + 6334: 8fb9 xor a5,a5,a4 + 6336: 8c29 xor s0,s0,a0 + 6338: 8fa9 xor a5,a5,a0 + 633a: 00841513 slli a0,s0,0x8 + 633e: 8061 srli s0,s0,0x18 + 6340: 8d41 or a0,a0,s0 + 6342: 8d3d xor a0,a0,a5 + 6344: ed1f906f j 214 <__riscv_restore_0> + +00006348 : + 6348: 4114 lw a3,0(a0) + 634a: 455c lw a5,12(a0) + 634c: ff000337 lui t1,0xff000 + 6350: 00ff08b7 lui a7,0xff0 + 6354: 00852803 lw a6,8(a0) + 6358: 0117f5b3 and a1,a5,a7 + 635c: 0066f733 and a4,a3,t1 + 6360: 4150 lw a2,4(a0) + 6362: 8f4d or a4,a4,a1 + 6364: 65c1 lui a1,0x10 + 6366: f0058593 addi a1,a1,-256 # ff00 <_data_lma+0x1ca4> + 636a: 00b87e33 and t3,a6,a1 + 636e: 01c76733 or a4,a4,t3 + 6372: 0ff67e13 andi t3,a2,255 + 6376: 01c76733 or a4,a4,t3 + 637a: c118 sw a4,0(a0) + 637c: 0116fe33 and t3,a3,a7 + 6380: 00667733 and a4,a2,t1 + 6384: 01c76733 or a4,a4,t3 + 6388: 00b7fe33 and t3,a5,a1 + 638c: 01c76733 or a4,a4,t3 + 6390: 0ff87e13 andi t3,a6,255 + 6394: 01c76733 or a4,a4,t3 + 6398: c158 sw a4,4(a0) + 639a: 01167e33 and t3,a2,a7 + 639e: 00687733 and a4,a6,t1 + 63a2: 01c76733 or a4,a4,t3 + 63a6: 00b6fe33 and t3,a3,a1 + 63aa: 01c76733 or a4,a4,t3 + 63ae: 01187833 and a6,a6,a7 + 63b2: 0ff7fe13 andi t3,a5,255 + 63b6: 0067f7b3 and a5,a5,t1 + 63ba: 0107e7b3 or a5,a5,a6 + 63be: 8e6d and a2,a2,a1 + 63c0: 8fd1 or a5,a5,a2 + 63c2: 0ff6f693 andi a3,a3,255 + 63c6: 01c76733 or a4,a4,t3 + 63ca: 8fd5 or a5,a5,a3 + 63cc: c518 sw a4,8(a0) + 63ce: c55c sw a5,12(a0) + 63d0: 8082 ret + +000063d2 : + 63d2: e1ff92ef jal t0,1f0 <__riscv_save_0> + 63d6: 842a mv s0,a0 + 63d8: f1bff0ef jal ra,62f2 + 63dc: 892a mv s2,a0 + 63de: f15ff0ef jal ra,62f2 + 63e2: 84aa mv s1,a0 + 63e4: f0fff0ef jal ra,62f2 + 63e8: 8d21 xor a0,a0,s0 + 63ea: 00a4c7b3 xor a5,s1,a0 + 63ee: 01851693 slli a3,a0,0x18 + 63f2: 01244433 xor s0,s0,s2 + 63f6: 00855713 srli a4,a0,0x8 + 63fa: 00a94933 xor s2,s2,a0 + 63fe: 00891513 slli a0,s2,0x8 + 6402: 8c3d xor s0,s0,a5 + 6404: 8f55 or a4,a4,a3 + 6406: 01895913 srli s2,s2,0x18 + 640a: 01256933 or s2,a0,s2 + 640e: 8c39 xor s0,s0,a4 + 6410: 01079513 slli a0,a5,0x10 + 6414: 83c1 srli a5,a5,0x10 + 6416: 01244433 xor s0,s0,s2 + 641a: 8d5d or a0,a0,a5 + 641c: 8d21 xor a0,a0,s0 + 641e: df7f906f j 214 <__riscv_restore_0> + +00006422 : + 6422: 01055f93 srli t6,a0,0x10 + 6426: 00855f13 srli t5,a0,0x8 + 642a: 01855393 srli t2,a0,0x18 + 642e: 4e81 li t4,0 + 6430: 4301 li t1,0 + 6432: 4e01 li t3,0 + 6434: 4601 li a2,0 + 6436: 4801 li a6,0 + 6438: 0fffff93 andi t6,t6,255 + 643c: 0fff7f13 andi t5,t5,255 + 6440: 0ff57513 andi a0,a0,255 + 6444: 10000293 li t0,256 + 6448: 010587b3 add a5,a1,a6 + 644c: 0007c883 lbu a7,0(a5) + 6450: 0103c7b3 xor a5,t2,a6 + 6454: 0ff7f793 andi a5,a5,255 + 6458: fff7c693 not a3,a5 + 645c: 17fd addi a5,a5,-1 + 645e: 8efd and a3,a3,a5 + 6460: 06e2 slli a3,a3,0x18 + 6462: 86fd srai a3,a3,0x1f + 6464: fff6c793 not a5,a3 + 6468: 8e7d and a2,a2,a5 + 646a: 010fc7b3 xor a5,t6,a6 + 646e: 0ff7f793 andi a5,a5,255 + 6472: fff7c713 not a4,a5 + 6476: 17fd addi a5,a5,-1 + 6478: 8f7d and a4,a4,a5 + 647a: 0ff8f893 andi a7,a7,255 + 647e: 0762 slli a4,a4,0x18 + 6480: 00d8f6b3 and a3,a7,a3 + 6484: 877d srai a4,a4,0x1f + 6486: 8e55 or a2,a2,a3 + 6488: fff74693 not a3,a4 + 648c: 01c6fe33 and t3,a3,t3 + 6490: 00e8f733 and a4,a7,a4 + 6494: 00ee6e33 or t3,t3,a4 + 6498: 010f4733 xor a4,t5,a6 + 649c: 0ff77713 andi a4,a4,255 + 64a0: fff74793 not a5,a4 + 64a4: 177d addi a4,a4,-1 + 64a6: 8ff9 and a5,a5,a4 + 64a8: 07e2 slli a5,a5,0x18 + 64aa: 87fd srai a5,a5,0x1f + 64ac: fff7c713 not a4,a5 + 64b0: 00677333 and t1,a4,t1 + 64b4: 01054733 xor a4,a0,a6 + 64b8: 00f8f7b3 and a5,a7,a5 + 64bc: 0ff77713 andi a4,a4,255 + 64c0: 00f36333 or t1,t1,a5 + 64c4: fff74793 not a5,a4 + 64c8: 177d addi a4,a4,-1 + 64ca: 8ff9 and a5,a5,a4 + 64cc: 07e2 slli a5,a5,0x18 + 64ce: 87fd srai a5,a5,0x1f + 64d0: fff7c693 not a3,a5 + 64d4: 01d6f6b3 and a3,a3,t4 + 64d8: 00f8f8b3 and a7,a7,a5 + 64dc: 0805 addi a6,a6,1 + 64de: 0116eeb3 or t4,a3,a7 + 64e2: f65813e3 bne a6,t0,6448 + 64e6: 01861693 slli a3,a2,0x18 + 64ea: 010e1713 slli a4,t3,0x10 + 64ee: 8ed9 or a3,a3,a4 + 64f0: 01d6e6b3 or a3,a3,t4 + 64f4: 00831513 slli a0,t1,0x8 + 64f8: 8d55 or a0,a0,a3 + 64fa: 8082 ret + +000064fc : + 64fc: cc5f92ef jal t0,1c0 <__riscv_save_12> + 6500: 4104 lw s1,0(a0) + 6502: 00265913 srli s2,a2,0x2 + 6506: 1141 addi sp,sp,-16 + 6508: 0485 addi s1,s1,1 + 650a: 842a mv s0,a0 + 650c: 8a32 mv s4,a2 + 650e: 048a slli s1,s1,0x2 + 6510: 00291a93 slli s5,s2,0x2 + 6514: 4981 li s3,0 + 6516: 033a9363 bne s5,s3,653c + 651a: 69b5 lui s3,0xd + 651c: 00440d93 addi s11,s0,4 + 6520: 8cca mv s9,s2 + 6522: 9456 add s0,s0,s5 + 6524: 4c01 li s8,0 + 6526: 4d05 li s10,1 + 6528: 6ab5 lui s5,0xd + 652a: 36c98993 addi s3,s3,876 # d36c + 652e: 4b6d li s6,27 + 6530: 4b91 li s7,4 + 6532: 029ce063 bltu s9,s1,6552 + 6536: 0141 addi sp,sp,16 + 6538: cc5f906f j 1fc <__riscv_restore_12> + 653c: 01358533 add a0,a1,s3 + 6540: c62e sw a1,12(sp) + 6542: cd9ff0ef jal ra,621a + 6546: 013407b3 add a5,s0,s3 + 654a: c3c8 sw a0,4(a5) + 654c: 0991 addi s3,s3,4 + 654e: 45b2 lw a1,12(sp) + 6550: b7d9 j 6516 + 6552: 4008 lw a0,0(s0) + 6554: 032c1a63 bne s8,s2,6588 + 6558: 0d05 addi s10,s10,1 + 655a: 00851793 slli a5,a0,0x8 + 655e: 8161 srli a0,a0,0x18 + 6560: 8d5d or a0,a0,a5 + 6562: 378a8593 addi a1,s5,888 # d378 + 6566: ebdff0ef jal ra,6422 + 656a: 01a987b3 add a5,s3,s10 + 656e: 239c lbu a5,0(a5) + 6570: 4c01 li s8,0 + 6572: 07e2 slli a5,a5,0x18 + 6574: 8d3d xor a0,a0,a5 + 6576: 000da783 lw a5,0(s11) + 657a: 0c85 addi s9,s9,1 + 657c: 0c05 addi s8,s8,1 + 657e: 8d3d xor a0,a0,a5 + 6580: c048 sw a0,4(s0) + 6582: 0d91 addi s11,s11,4 + 6584: 0411 addi s0,s0,4 + 6586: b775 j 6532 + 6588: fc0c09e3 beqz s8,655a + 658c: ff4b75e3 bgeu s6,s4,6576 + 6590: ff7c13e3 bne s8,s7,6576 + 6594: 378a8593 addi a1,s5,888 + 6598: e8bff0ef jal ra,6422 + 659c: bfe9 j 6576 + +0000659e : + 659e: c53f92ef jal t0,1f0 <__riscv_save_0> + 65a2: 842a mv s0,a0 + 65a4: 4108 lw a0,0(a0) + 65a6: 64b5 lui s1,0xd + 65a8: 37848593 addi a1,s1,888 # d378 + 65ac: e77ff0ef jal ra,6422 + 65b0: c008 sw a0,0(s0) + 65b2: 4048 lw a0,4(s0) + 65b4: 37848593 addi a1,s1,888 + 65b8: e6bff0ef jal ra,6422 + 65bc: c048 sw a0,4(s0) + 65be: 4408 lw a0,8(s0) + 65c0: 37848593 addi a1,s1,888 + 65c4: e5fff0ef jal ra,6422 + 65c8: c408 sw a0,8(s0) + 65ca: 4448 lw a0,12(s0) + 65cc: 37848593 addi a1,s1,888 + 65d0: e53ff0ef jal ra,6422 + 65d4: c448 sw a0,12(s0) + 65d6: c3ff906f j 214 <__riscv_restore_0> + +000065da : + 65da: bfdf92ef jal t0,1d6 <__riscv_save_4> + 65de: 411c lw a5,0(a0) + 65e0: 4729 li a4,10 + 65e2: 1141 addi sp,sp,-16 + 65e4: ffb7f693 andi a3,a5,-5 + 65e8: 892a mv s2,a0 + 65ea: 84ae mv s1,a1 + 65ec: 8432 mv s0,a2 + 65ee: 00e68763 beq a3,a4,65fc + 65f2: 4731 li a4,12 + 65f4: 00e78463 beq a5,a4,65fc + 65f8: 2c6030ef jal ra,98be + 65fc: 8526 mv a0,s1 + 65fe: c1dff0ef jal ra,621a + 6602: c02a sw a0,0(sp) + 6604: 00448513 addi a0,s1,4 + 6608: c13ff0ef jal ra,621a + 660c: c22a sw a0,4(sp) + 660e: 00848513 addi a0,s1,8 + 6612: c09ff0ef jal ra,621a + 6616: c42a sw a0,8(sp) + 6618: 00c48513 addi a0,s1,12 + 661c: bffff0ef jal ra,621a + 6620: c62a sw a0,12(sp) + 6622: 00490593 addi a1,s2,4 + 6626: 850a mv a0,sp + 6628: c1fff0ef jal ra,6246 + 662c: 01490493 addi s1,s2,20 + 6630: 4985 li s3,1 + 6632: 00092783 lw a5,0(s2) + 6636: 850a mv a0,sp + 6638: 04f9e163 bltu s3,a5,667a + 663c: f63ff0ef jal ra,659e + 6640: 850a mv a0,sp + 6642: c27ff0ef jal ra,6268 + 6646: 85a6 mv a1,s1 + 6648: 850a mv a0,sp + 664a: bfdff0ef jal ra,6246 + 664e: 4502 lw a0,0(sp) + 6650: 85a2 mv a1,s0 + 6652: bdfff0ef jal ra,6230 + 6656: 4512 lw a0,4(sp) + 6658: 00440593 addi a1,s0,4 + 665c: bd5ff0ef jal ra,6230 + 6660: 4522 lw a0,8(sp) + 6662: 00840593 addi a1,s0,8 + 6666: bcbff0ef jal ra,6230 + 666a: 4532 lw a0,12(sp) + 666c: 00c40593 addi a1,s0,12 + 6670: bc1ff0ef jal ra,6230 + 6674: 0141 addi sp,sp,16 + 6676: b95f906f j 20a <__riscv_restore_4> + 667a: f25ff0ef jal ra,659e + 667e: 850a mv a0,sp + 6680: be9ff0ef jal ra,6268 + 6684: 4502 lw a0,0(sp) + 6686: 0985 addi s3,s3,1 + 6688: c8fff0ef jal ra,6316 + 668c: c02a sw a0,0(sp) + 668e: 4512 lw a0,4(sp) + 6690: c87ff0ef jal ra,6316 + 6694: c22a sw a0,4(sp) + 6696: 4522 lw a0,8(sp) + 6698: c7fff0ef jal ra,6316 + 669c: c42a sw a0,8(sp) + 669e: 4532 lw a0,12(sp) + 66a0: c77ff0ef jal ra,6316 + 66a4: c62a sw a0,12(sp) + 66a6: 85a6 mv a1,s1 + 66a8: 850a mv a0,sp + 66aa: b9dff0ef jal ra,6246 + 66ae: 04c1 addi s1,s1,16 + 66b0: b749 j 6632 + +000066b2 : + 66b2: b3ff92ef jal t0,1f0 <__riscv_save_0> + 66b6: 842a mv s0,a0 + 66b8: 4108 lw a0,0(a0) + 66ba: 64b5 lui s1,0xd + 66bc: 47848593 addi a1,s1,1144 # d478 + 66c0: d63ff0ef jal ra,6422 + 66c4: c008 sw a0,0(s0) + 66c6: 4048 lw a0,4(s0) + 66c8: 47848593 addi a1,s1,1144 + 66cc: d57ff0ef jal ra,6422 + 66d0: c048 sw a0,4(s0) + 66d2: 4408 lw a0,8(s0) + 66d4: 47848593 addi a1,s1,1144 + 66d8: d4bff0ef jal ra,6422 + 66dc: c408 sw a0,8(s0) + 66de: 4448 lw a0,12(s0) + 66e0: 47848593 addi a1,s1,1144 + 66e4: d3fff0ef jal ra,6422 + 66e8: c448 sw a0,12(s0) + 66ea: b2bf906f j 214 <__riscv_restore_0> + +000066ee : + 66ee: ae9f92ef jal t0,1d6 <__riscv_save_4> + 66f2: 4100 lw s0,0(a0) + 66f4: 47a9 li a5,10 + 66f6: 1141 addi sp,sp,-16 + 66f8: ffb47713 andi a4,s0,-5 + 66fc: 89aa mv s3,a0 + 66fe: 892e mv s2,a1 + 6700: 84b2 mv s1,a2 + 6702: 00f70763 beq a4,a5,6710 + 6706: 47b1 li a5,12 + 6708: 00f40463 beq s0,a5,6710 + 670c: 1b2030ef jal ra,98be + 6710: 854a mv a0,s2 + 6712: b09ff0ef jal ra,621a + 6716: c02a sw a0,0(sp) + 6718: 00490513 addi a0,s2,4 + 671c: affff0ef jal ra,621a + 6720: c22a sw a0,4(sp) + 6722: 00890513 addi a0,s2,8 + 6726: af5ff0ef jal ra,621a + 672a: 0412 slli s0,s0,0x4 + 672c: c42a sw a0,8(sp) + 672e: 0411 addi s0,s0,4 + 6730: 00c90513 addi a0,s2,12 + 6734: ae7ff0ef jal ra,621a + 6738: 944e add s0,s0,s3 + 673a: c62a sw a0,12(sp) + 673c: 85a2 mv a1,s0 + 673e: 850a mv a0,sp + 6740: b07ff0ef jal ra,6246 + 6744: 0009a903 lw s2,0(s3) + 6748: ff040a13 addi s4,s0,-16 + 674c: fff90993 addi s3,s2,-1 + 6750: 04099663 bnez s3,679c + 6754: 55c1 li a1,-16 + 6756: 02b90933 mul s2,s2,a1 + 675a: 850a mv a0,sp + 675c: bedff0ef jal ra,6348 + 6760: 850a mv a0,sp + 6762: f51ff0ef jal ra,66b2 + 6766: 850a mv a0,sp + 6768: 944a add s0,s0,s2 + 676a: 85a2 mv a1,s0 + 676c: adbff0ef jal ra,6246 + 6770: 4502 lw a0,0(sp) + 6772: 85a6 mv a1,s1 + 6774: abdff0ef jal ra,6230 + 6778: 4512 lw a0,4(sp) + 677a: 00448593 addi a1,s1,4 + 677e: ab3ff0ef jal ra,6230 + 6782: 4522 lw a0,8(sp) + 6784: 00848593 addi a1,s1,8 + 6788: aa9ff0ef jal ra,6230 + 678c: 4532 lw a0,12(sp) + 678e: 00c48593 addi a1,s1,12 + 6792: a9fff0ef jal ra,6230 + 6796: 0141 addi sp,sp,16 + 6798: a73f906f j 20a <__riscv_restore_4> + 679c: 850a mv a0,sp + 679e: babff0ef jal ra,6348 + 67a2: 850a mv a0,sp + 67a4: f0fff0ef jal ra,66b2 + 67a8: 85d2 mv a1,s4 + 67aa: 850a mv a0,sp + 67ac: a9bff0ef jal ra,6246 + 67b0: 4502 lw a0,0(sp) + 67b2: 1a41 addi s4,s4,-16 + 67b4: 19fd addi s3,s3,-1 + 67b6: c1dff0ef jal ra,63d2 + 67ba: c02a sw a0,0(sp) + 67bc: 4512 lw a0,4(sp) + 67be: c15ff0ef jal ra,63d2 + 67c2: c22a sw a0,4(sp) + 67c4: 4522 lw a0,8(sp) + 67c6: c0dff0ef jal ra,63d2 + 67ca: c42a sw a0,8(sp) + 67cc: 4532 lw a0,12(sp) + 67ce: c05ff0ef jal ra,63d2 + 67d2: c62a sw a0,12(sp) + 67d4: bfb5 j 6750 + +000067d6 : + 67d6: a1bf92ef jal t0,1f0 <__riscv_save_0> + 67da: 842e mv s0,a1 + 67dc: 84b2 mv s1,a2 + 67de: 4581 li a1,0 + 67e0: 0f400613 li a2,244 + 67e4: a3df90ef jal ra,220 + 67e8: 4761 li a4,24 + 67ea: 87aa mv a5,a0 + 67ec: 02e48263 beq s1,a4,6810 + 67f0: 02000713 li a4,32 + 67f4: 02e48263 beq s1,a4,6818 + 67f8: 4741 li a4,16 + 67fa: 02e49463 bne s1,a4,6822 + 67fe: 4729 li a4,10 + 6800: c118 sw a4,0(a0) + 6802: 4641 li a2,16 + 6804: 85a2 mv a1,s0 + 6806: 853e mv a0,a5 + 6808: cf5ff0ef jal ra,64fc + 680c: a09f906f j 214 <__riscv_restore_0> + 6810: 4731 li a4,12 + 6812: c118 sw a4,0(a0) + 6814: 4661 li a2,24 + 6816: b7fd j 6804 + 6818: 4739 li a4,14 + 681a: c118 sw a4,0(a0) + 681c: 02000613 li a2,32 + 6820: b7d5 j 6804 + 6822: 09c030ef jal ra,98be + +00006826 : + 6826: 9cbf92ef jal t0,1f0 <__riscv_save_0> + 682a: 0f400613 li a2,244 + 682e: 4581 li a1,0 + 6830: 9f1f90ef jal ra,220 + 6834: 87aa mv a5,a0 + 6836: 239c lbu a5,0(a5) + 6838: 9ddf906f j 214 <__riscv_restore_0> + +0000683c : + 683c: 99bf92ef jal t0,1d6 <__riscv_save_4> + 6840: 00f6f413 andi s0,a3,15 + 6844: 7111 addi sp,sp,-256 + 6846: e81d bnez s0,687c + 6848: 8932 mv s2,a2 + 684a: 862e mv a2,a1 + 684c: 85aa mv a1,a0 + 684e: 0068 addi a0,sp,12 + 6850: 89ba mv s3,a4 + 6852: 84b6 mv s1,a3 + 6854: f83ff0ef jal ra,67d6 + 6858: 00946963 bltu s0,s1,686a + 685c: 0068 addi a0,sp,12 + 685e: fc9ff0ef jal ra,6826 + 6862: 4501 li a0,0 + 6864: 6111 addi sp,sp,256 + 6866: 9a5f906f j 20a <__riscv_restore_4> + 686a: 00898633 add a2,s3,s0 + 686e: 008905b3 add a1,s2,s0 + 6872: 0068 addi a0,sp,12 + 6874: d67ff0ef jal ra,65da + 6878: 0441 addi s0,s0,16 + 687a: bff9 j 6858 + 687c: 557d li a0,-1 + 687e: b7dd j 6864 + +00006880 : + 6880: 957f92ef jal t0,1d6 <__riscv_save_4> + 6884: 00f6f413 andi s0,a3,15 + 6888: 7111 addi sp,sp,-256 + 688a: e81d bnez s0,68c0 + 688c: 8932 mv s2,a2 + 688e: 862e mv a2,a1 + 6890: 85aa mv a1,a0 + 6892: 0068 addi a0,sp,12 + 6894: 89ba mv s3,a4 + 6896: 84b6 mv s1,a3 + 6898: f3fff0ef jal ra,67d6 + 689c: 00946963 bltu s0,s1,68ae + 68a0: 0068 addi a0,sp,12 + 68a2: f85ff0ef jal ra,6826 + 68a6: 4501 li a0,0 + 68a8: 6111 addi sp,sp,256 + 68aa: 961f906f j 20a <__riscv_restore_4> + 68ae: 00898633 add a2,s3,s0 + 68b2: 008905b3 add a1,s2,s0 + 68b6: 0068 addi a0,sp,12 + 68b8: e37ff0ef jal ra,66ee + 68bc: 0441 addi s0,s0,16 + 68be: bff9 j 689c + 68c0: 557d li a0,-1 + 68c2: b7dd j 68a8 + +000068c4 : + 68c4: 905f92ef jal t0,1c8 <__riscv_save_10> + 68c8: c519 beqz a0,68d6 + 68ca: 8aaa mv s5,a0 + 68cc: 4188 lw a0,0(a1) + 68ce: 8a2e mv s4,a1 + 68d0: 8932 mv s2,a2 + 68d2: 00c56463 bltu a0,a2,68da + 68d6: 7e9020ef jal ra,98be + 68da: 84b6 mv s1,a3 + 68dc: 843a mv s0,a4 + 68de: 8bbe mv s7,a5 + 68e0: 8c42 mv s8,a6 + 68e2: 8b46 mv s6,a7 + 68e4: e291 bnez a3,68e8 + 68e6: fb65 bnez a4,68d6 + 68e8: fe0b87e3 beqz s7,68d6 + 68ec: fe0b05e3 beqz s6,68d6 + 68f0: cd05 beqz a0,6928 + 68f2: c81d beqz s0,6928 + 68f4: 40a909b3 sub s3,s2,a0 + 68f8: 01347363 bgeu s0,s3,68fe + 68fc: 89a2 mv s3,s0 + 68fe: 864e mv a2,s3 + 6900: 85a6 mv a1,s1 + 6902: 9556 add a0,a0,s5 + 6904: 04e030ef jal ra,9952 + 6908: 000a2783 lw a5,0(s4) + 690c: 94ce add s1,s1,s3 + 690e: 41340433 sub s0,s0,s3 + 6912: 99be add s3,s3,a5 + 6914: 013a2023 sw s3,0(s4) + 6918: 01299863 bne s3,s2,6928 + 691c: 85d6 mv a1,s5 + 691e: 855a mv a0,s6 + 6920: e809 bnez s0,6932 + 6922: 9c02 jalr s8 + 6924: 000a2023 sw zero,0(s4) + 6928: 01247763 bgeu s0,s2,6936 + 692c: e01d bnez s0,6952 + 692e: 8d3f906f j 200 <__riscv_restore_10> + 6932: 9b82 jalr s7 + 6934: bfc5 j 6924 + 6936: 000a2783 lw a5,0(s4) + 693a: ffd1 bnez a5,68d6 + 693c: 85a6 mv a1,s1 + 693e: 855a mv a0,s6 + 6940: 01241763 bne s0,s2,694e + 6944: 9c02 jalr s8 + 6946: 94ca add s1,s1,s2 + 6948: 41240433 sub s0,s0,s2 + 694c: bff1 j 6928 + 694e: 9b82 jalr s7 + 6950: bfdd j 6946 + 6952: 000a2503 lw a0,0(s4) + 6956: 40a909b3 sub s3,s2,a0 + 695a: 01347363 bgeu s0,s3,6960 + 695e: 89a2 mv s3,s0 + 6960: 864e mv a2,s3 + 6962: 85a6 mv a1,s1 + 6964: 9556 add a0,a0,s5 + 6966: 7ed020ef jal ra,9952 + 696a: 000a2783 lw a5,0(s4) + 696e: 94ce add s1,s1,s3 + 6970: 41340433 sub s0,s0,s3 + 6974: 99be add s3,s3,a5 + 6976: 013a2023 sw s3,0(s4) + 697a: fb29e9e3 bltu s3,s2,692c + 697e: bfa1 j 68d6 + +00006980 : + 6980: 871f92ef jal t0,1f0 <__riscv_save_0> + 6984: 88c2 mv a7,a6 + 6986: 883e mv a6,a5 + 6988: f3dff0ef jal ra,68c4 + 698c: 889f906f j 214 <__riscv_restore_0> + +00006990 : + 6990: 839f92ef jal t0,1c8 <__riscv_save_10> + 6994: 8b2a mv s6,a0 + 6996: 89ae mv s3,a1 + 6998: 8a32 mv s4,a2 + 699a: 8bb6 mv s7,a3 + 699c: 893a mv s2,a4 + 699e: 8c3e mv s8,a5 + 69a0: 8cc2 mv s9,a6 + 69a2: 4a81 li s5,0 + 69a4: 00091463 bnez s2,69ac + 69a8: 859f906f j 200 <__riscv_restore_10> + 69ac: 0009a483 lw s1,0(s3) + 69b0: 409a0433 sub s0,s4,s1 + 69b4: 00897363 bgeu s2,s0,69ba + 69b8: 844a mv s0,s2 + 69ba: 000a9863 bnez s5,69ca + 69be: 8622 mv a2,s0 + 69c0: 85de mv a1,s7 + 69c2: 009b0533 add a0,s6,s1 + 69c6: 85bf90ef jal ra,220 + 69ca: e481 bnez s1,69d2 + 69cc: 008a1363 bne s4,s0,69d2 + 69d0: 4a85 li s5,1 + 69d2: 94a2 add s1,s1,s0 + 69d4: 01449a63 bne s1,s4,69e8 + 69d8: 85da mv a1,s6 + 69da: 8566 mv a0,s9 + 69dc: 9c02 jalr s8 + 69de: 0009a023 sw zero,0(s3) + 69e2: 40890933 sub s2,s2,s0 + 69e6: bf7d j 69a4 + 69e8: 0009a703 lw a4,0(s3) + 69ec: 9722 add a4,a4,s0 + 69ee: 00e9a023 sw a4,0(s3) + 69f2: bfc5 j 69e2 + +000069f4 : + 69f4: fe2f92ef jal t0,1d6 <__riscv_save_4> + 69f8: 1141 addi sp,sp,-16 + 69fa: 8b3a mv s6,a4 + 69fc: 87d4 sb a3,15(sp) + 69fe: 875c sb a5,14(sp) + 6a00: 4705 li a4,1 + 6a02: 8446 mv s0,a7 + 6a04: 54c2 lw s1,48(sp) + 6a06: 04e80063 beq a6,a4,6a46 + 6a0a: 8942 mv s2,a6 + 6a0c: 04080663 beqz a6,6a58 + 6a10: 4789 li a5,2 + 6a12: 89aa mv s3,a0 + 6a14: 8a2e mv s4,a1 + 6a16: 8ab2 mv s5,a2 + 6a18: 04f80363 beq a6,a5,6a5e + 6a1c: 8826 mv a6,s1 + 6a1e: 87c6 mv a5,a7 + 6a20: 00f10693 addi a3,sp,15 + 6a24: 4705 li a4,1 + 6a26: f5bff0ef jal ra,6980 + 6a2a: 8714 lbu a3,14(sp) + 6a2c: 8826 mv a6,s1 + 6a2e: 87a2 mv a5,s0 + 6a30: 05668763 beq a3,s6,6a7e + 6a34: ffe90713 addi a4,s2,-2 + 6a38: 86da mv a3,s6 + 6a3a: 8656 mv a2,s5 + 6a3c: 85d2 mv a1,s4 + 6a3e: 854e mv a0,s3 + 6a40: f51ff0ef jal ra,6990 + 6a44: a025 j 6a6c + 6a46: 8ebd xor a3,a3,a5 + 6a48: 87d4 sb a3,15(sp) + 6a4a: 8826 mv a6,s1 + 6a4c: 87c6 mv a5,a7 + 6a4e: 4705 li a4,1 + 6a50: 00f10693 addi a3,sp,15 + 6a54: f2dff0ef jal ra,6980 + 6a58: 0141 addi sp,sp,16 + 6a5a: fb0f906f j 20a <__riscv_restore_4> + 6a5e: 8826 mv a6,s1 + 6a60: 87c6 mv a5,a7 + 6a62: 4705 li a4,1 + 6a64: 00f10693 addi a3,sp,15 + 6a68: f19ff0ef jal ra,6980 + 6a6c: 8826 mv a6,s1 + 6a6e: 87a2 mv a5,s0 + 6a70: 4705 li a4,1 + 6a72: 00e10693 addi a3,sp,14 + 6a76: 8656 mv a2,s5 + 6a78: 85d2 mv a1,s4 + 6a7a: 854e mv a0,s3 + 6a7c: bfe1 j 6a54 + 6a7e: fff90713 addi a4,s2,-1 + 6a82: 8656 mv a2,s5 + 6a84: 85d2 mv a1,s4 + 6a86: 854e mv a0,s3 + 6a88: f09ff0ef jal ra,6990 + 6a8c: b7f1 j 6a58 + +00006a8e : + 6a8e: f62f92ef jal t0,1f0 <__riscv_save_0> + 6a92: 7125 addi sp,sp,-416 + 6a94: e119 bnez a0,6a9a + 6a96: 629020ef jal ra,98be + 6a9a: 451c lw a5,8(a0) + 6a9c: 842a mv s0,a0 + 6a9e: 0828 addi a0,sp,24 + 6aa0: c636 sw a3,12(sp) + 6aa2: c432 sw a2,8(sp) + 6aa4: c22e sw a1,4(sp) + 6aa6: 9782 jalr a5 + 6aa8: 4622 lw a2,8(sp) + 6aaa: 445c lw a5,12(s0) + 6aac: 4592 lw a1,4(sp) + 6aae: 0828 addi a0,sp,24 + 6ab0: 9782 jalr a5 + 6ab2: 46b2 lw a3,12(sp) + 6ab4: 481c lw a5,16(s0) + 6ab6: 0828 addi a0,sp,24 + 6ab8: 85b6 mv a1,a3 + 6aba: 9782 jalr a5 + 6abc: 18800613 li a2,392 + 6ac0: 4581 li a1,0 + 6ac2: 0828 addi a0,sp,24 + 6ac4: f5cf90ef jal ra,220 + 6ac8: 01814783 lbu a5,24(sp) + 6acc: 611d addi sp,sp,416 + 6ace: f46f906f j 214 <__riscv_restore_0> + +00006ad2 : + 6ad2: f04f92ef jal t0,1d6 <__riscv_save_4> + 6ad6: 7111 addi sp,sp,-256 + 6ad8: e119 bnez a0,6ade + 6ada: 5e5020ef jal ra,98be + 6ade: 842e mv s0,a1 + 6ae0: dded beqz a1,6ada + 6ae2: 89b2 mv s3,a2 + 6ae4: 4581 li a1,0 + 6ae6: 31800613 li a2,792 + 6aea: 84aa mv s1,a0 + 6aec: 8936 mv s2,a3 + 6aee: f32f90ef jal ra,220 + 6af2: 209c lbu a5,0(s1) + 6af4: 405c lw a5,4(s0) + 6af6: c080 sw s0,0(s1) + 6af8: 0b27fb63 bgeu a5,s2,6bae + 6afc: 4018 lw a4,0(s0) + 6afe: fce7eee3 bltu a5,a4,6ada + 6b02: 864a mv a2,s2 + 6b04: 868a mv a3,sp + 6b06: 85ce mv a1,s3 + 6b08: 8522 mv a0,s0 + 6b0a: f85ff0ef jal ra,6a8e + 6b0e: 00042903 lw s2,0(s0) + 6b12: 00442983 lw s3,4(s0) + 6b16: 01397963 bgeu s2,s3,6b28 + 6b1a: 41298633 sub a2,s3,s2 + 6b1e: 4581 li a1,0 + 6b20: 01210533 add a0,sp,s2 + 6b24: efcf90ef jal ra,220 + 6b28: 4781 li a5,0 + 6b2a: 04f99c63 bne s3,a5,6b82 + 6b2e: 441c lw a5,8(s0) + 6b30: 00848913 addi s2,s1,8 + 6b34: 854a mv a0,s2 + 6b36: 9782 jalr a5 + 6b38: 445c lw a5,12(s0) + 6b3a: 4050 lw a2,4(s0) + 6b3c: 010c addi a1,sp,128 + 6b3e: 854a mv a0,s2 + 6b40: 9782 jalr a5 + 6b42: 4054 lw a3,4(s0) + 6b44: 4781 li a5,0 + 6b46: 04f69963 bne a3,a5,6b98 + 6b4a: 441c lw a5,8(s0) + 6b4c: 19048493 addi s1,s1,400 + 6b50: 8526 mv a0,s1 + 6b52: 9782 jalr a5 + 6b54: 445c lw a5,12(s0) + 6b56: 4050 lw a2,4(s0) + 6b58: 010c addi a1,sp,128 + 6b5a: 8526 mv a0,s1 + 6b5c: 9782 jalr a5 + 6b5e: 08000613 li a2,128 + 6b62: 4581 li a1,0 + 6b64: 0108 addi a0,sp,128 + 6b66: ebaf90ef jal ra,220 + 6b6a: 08014783 lbu a5,128(sp) + 6b6e: 08000613 li a2,128 + 6b72: 4581 li a1,0 + 6b74: 850a mv a0,sp + 6b76: eaaf90ef jal ra,220 + 6b7a: 801c lbu a5,0(sp) + 6b7c: 6111 addi sp,sp,256 + 6b7e: e8cf906f j 20a <__riscv_restore_4> + 6b82: 0118 addi a4,sp,128 + 6b84: 00f706b3 add a3,a4,a5 + 6b88: 00f10733 add a4,sp,a5 + 6b8c: 2318 lbu a4,0(a4) + 6b8e: 0785 addi a5,a5,1 + 6b90: 03674713 xori a4,a4,54 + 6b94: a298 sb a4,0(a3) + 6b96: bf51 j 6b2a + 6b98: 0118 addi a4,sp,128 + 6b9a: 00f70633 add a2,a4,a5 + 6b9e: 00f10733 add a4,sp,a5 + 6ba2: 2318 lbu a4,0(a4) + 6ba4: 0785 addi a5,a5,1 + 6ba6: 05c74713 xori a4,a4,92 + 6baa: a218 sb a4,0(a2) + 6bac: bf69 j 6b46 + 6bae: 864a mv a2,s2 + 6bb0: 85ce mv a1,s3 + 6bb2: 850a mv a0,sp + 6bb4: 59f020ef jal ra,9952 + 6bb8: bfa9 j 6b12 + +00006bba : + 6bba: e36f92ef jal t0,1f0 <__riscv_save_0> + 6bbe: c119 beqz a0,6bc4 + 6bc0: 411c lw a5,0(a0) + 6bc2: e399 bnez a5,6bc8 + 6bc4: 4fb020ef jal ra,98be + 6bc8: 47dc lw a5,12(a5) + 6bca: 0521 addi a0,a0,8 + 6bcc: 9782 jalr a5 + 6bce: e46f906f j 214 <__riscv_restore_0> + +00006bd2 : + 6bd2: e1ef92ef jal t0,1f0 <__riscv_save_0> + 6bd6: 7139 addi sp,sp,-64 + 6bd8: c501 beqz a0,6be0 + 6bda: 411c lw a5,0(a0) + 6bdc: 842a mv s0,a0 + 6bde: e399 bnez a5,6be4 + 6be0: 4df020ef jal ra,98be + 6be4: 892e mv s2,a1 + 6be6: dded beqz a1,6be0 + 6be8: 4b9c lw a5,16(a5) + 6bea: 858a mv a1,sp + 6bec: 0521 addi a0,a0,8 + 6bee: 9782 jalr a5 + 6bf0: 401c lw a5,0(s0) + 6bf2: 19040493 addi s1,s0,400 + 6bf6: 858a mv a1,sp + 6bf8: 47d8 lw a4,12(a5) + 6bfa: 4390 lw a2,0(a5) + 6bfc: 8526 mv a0,s1 + 6bfe: 9702 jalr a4 + 6c00: 401c lw a5,0(s0) + 6c02: 85ca mv a1,s2 + 6c04: 8526 mv a0,s1 + 6c06: 4b9c lw a5,16(a5) + 6c08: 9782 jalr a5 + 6c0a: 31800613 li a2,792 + 6c0e: 4581 li a1,0 + 6c10: 8522 mv a0,s0 + 6c12: e0ef90ef jal ra,220 + 6c16: 201c lbu a5,0(s0) + 6c18: 6121 addi sp,sp,64 + 6c1a: dfaf906f j 214 <__riscv_restore_0> + +00006c1e : + 6c1e: dd2f92ef jal t0,1f0 <__riscv_save_0> + 6c22: cd010113 addi sp,sp,-816 + 6c26: 84b6 mv s1,a3 + 6c28: 86ae mv a3,a1 + 6c2a: 65b5 lui a1,0xd + 6c2c: 8432 mv s0,a2 + 6c2e: 67858593 addi a1,a1,1656 # d678 + 6c32: 862a mv a2,a0 + 6c34: 0828 addi a0,sp,24 + 6c36: c63a sw a4,12(sp) + 6c38: e9bff0ef jal ra,6ad2 + 6c3c: 8626 mv a2,s1 + 6c3e: 85a2 mv a1,s0 + 6c40: 0828 addi a0,sp,24 + 6c42: f79ff0ef jal ra,6bba + 6c46: 4732 lw a4,12(sp) + 6c48: 0828 addi a0,sp,24 + 6c4a: 85ba mv a1,a4 + 6c4c: f87ff0ef jal ra,6bd2 + 6c50: 4501 li a0,0 + 6c52: 33010113 addi sp,sp,816 + 6c56: dbef906f j 214 <__riscv_restore_0> + +00006c5a : + 6c5a: 01855793 srli a5,a0,0x18 + 6c5e: a19c sb a5,0(a1) + 6c60: 01055793 srli a5,a0,0x10 + 6c64: b19c sb a5,1(a1) + 6c66: 00855793 srli a5,a0,0x8 + 6c6a: a1bc sb a5,2(a1) + 6c6c: b1a8 sb a0,3(a1) + 6c6e: 8082 ret + +00006c70 : + 6c70: 7119 addi sp,sp,-128 + 6c72: d4d6 sw s5,104(sp) + 6c74: d2da sw s6,100(sp) + 6c76: 4118 lw a4,0(a0) + 6c78: 00452e83 lw t4,4(a0) + 6c7c: 00852e03 lw t3,8(a0) + 6c80: 00c52b03 lw s6,12(a0) + 6c84: 491c lw a5,16(a0) + 6c86: 01452f83 lw t6,20(a0) + 6c8a: 01852f03 lw t5,24(a0) + 6c8e: 01c52a83 lw s5,28(a0) + 6c92: 62b5 lui t0,0xd + 6c94: dea2 sw s0,124(sp) + 6c96: dca6 sw s1,120(sp) + 6c98: daca sw s2,116(sp) + 6c9a: d8ce sw s3,112(sp) + 6c9c: d6d2 sw s4,108(sp) + 6c9e: cce6 sw s9,88(sp) + 6ca0: caea sw s10,84(sp) + 6ca2: d0de sw s7,96(sp) + 6ca4: cee2 sw s8,92(sp) + 6ca6: c8ee sw s11,80(sp) + 6ca8: 57828293 addi t0,t0,1400 # d578 + 6cac: 4681 li a3,0 + 6cae: 8a3a mv s4,a4 + 6cb0: 89f6 mv s3,t4 + 6cb2: 8972 mv s2,t3 + 6cb4: 84da mv s1,s6 + 6cb6: 843e mv s0,a5 + 6cb8: 83fe mv t2,t6 + 6cba: c47a sw t5,8(sp) + 6cbc: c656 sw s5,12(sp) + 6cbe: 4d3d li s10,15 + 6cc0: 04000c93 li s9,64 + 6cc4: 12dd6363 bltu s10,a3,6dea + 6cc8: 0005cb83 lbu s7,0(a1) + 6ccc: 3190 lbu a2,1(a1) + 6cce: 01010813 addi a6,sp,16 + 6cd2: 0be2 slli s7,s7,0x18 + 6cd4: 0642 slli a2,a2,0x10 + 6cd6: 00cbebb3 or s7,s7,a2 + 6cda: 31b0 lbu a2,3(a1) + 6cdc: 0591 addi a1,a1,4 + 6cde: 00cbebb3 or s7,s7,a2 + 6ce2: ffe5c603 lbu a2,-2(a1) + 6ce6: 0622 slli a2,a2,0x8 + 6ce8: 00cbebb3 or s7,s7,a2 + 6cec: 00269613 slli a2,a3,0x2 + 6cf0: 9642 add a2,a2,a6 + 6cf2: 01762023 sw s7,0(a2) + 6cf6: 0067d813 srli a6,a5,0x6 + 6cfa: 01a79893 slli a7,a5,0x1a + 6cfe: 011868b3 or a7,a6,a7 + 6d02: 01579613 slli a2,a5,0x15 + 6d06: 00b7d813 srli a6,a5,0xb + 6d0a: 00c86633 or a2,a6,a2 + 6d0e: 00c8c833 xor a6,a7,a2 + 6d12: 0197d893 srli a7,a5,0x19 + 6d16: 00779613 slli a2,a5,0x7 + 6d1a: 01166633 or a2,a2,a7 + 6d1e: 00c84633 xor a2,a6,a2 + 6d22: fff7c813 not a6,a5 + 6d26: 01e87833 and a6,a6,t5 + 6d2a: 01f7f8b3 and a7,a5,t6 + 6d2e: 01184833 xor a6,a6,a7 + 6d32: 9642 add a2,a2,a6 + 6d34: 0002a803 lw a6,0(t0) + 6d38: 0685 addi a3,a3,1 + 6d3a: 0291 addi t0,t0,4 + 6d3c: 9642 add a2,a2,a6 + 6d3e: 9bb2 add s7,s7,a2 + 6d40: 01e71813 slli a6,a4,0x1e + 6d44: 00275613 srli a2,a4,0x2 + 6d48: 9ade add s5,s5,s7 + 6d4a: 01066833 or a6,a2,a6 + 6d4e: 00d75b93 srli s7,a4,0xd + 6d52: 01371613 slli a2,a4,0x13 + 6d56: 00cbebb3 or s7,s7,a2 + 6d5a: 01784633 xor a2,a6,s7 + 6d5e: 01675813 srli a6,a4,0x16 + 6d62: 00a71b93 slli s7,a4,0xa + 6d66: 010bebb3 or s7,s7,a6 + 6d6a: 01764bb3 xor s7,a2,s7 + 6d6e: 01cec633 xor a2,t4,t3 + 6d72: 8e79 and a2,a2,a4 + 6d74: 01cef833 and a6,t4,t3 + 6d78: 01064633 xor a2,a2,a6 + 6d7c: 9bb2 add s7,s7,a2 + 6d7e: 9bd6 add s7,s7,s5 + 6d80: 016a8633 add a2,s5,s6 + 6d84: 8b72 mv s6,t3 + 6d86: 8afa mv s5,t5 + 6d88: 05969a63 bne a3,s9,6ddc + 6d8c: 979e add a5,a5,t2 + 6d8e: c95c sw a5,20(a0) + 6d90: 47a2 lw a5,8(sp) + 6d92: 9432 add s0,s0,a2 + 6d94: c900 sw s0,16(a0) + 6d96: 9fbe add t6,t6,a5 + 6d98: 47b2 lw a5,12(sp) + 6d9a: 5476 lw s0,124(sp) + 6d9c: 9bd2 add s7,s7,s4 + 6d9e: 9f3e add t5,t5,a5 + 6da0: 513c lw a5,96(a0) + 6da2: 974e add a4,a4,s3 + 6da4: 9eca add t4,t4,s2 + 6da6: 9e26 add t3,t3,s1 + 6da8: 0785 addi a5,a5,1 + 6daa: 01752023 sw s7,0(a0) + 6dae: c158 sw a4,4(a0) + 6db0: 01d52423 sw t4,8(a0) + 6db4: 01c52623 sw t3,12(a0) + 6db8: 01f52c23 sw t6,24(a0) + 6dbc: 01e52e23 sw t5,28(a0) + 6dc0: d13c sw a5,96(a0) + 6dc2: 54e6 lw s1,120(sp) + 6dc4: 5956 lw s2,116(sp) + 6dc6: 59c6 lw s3,112(sp) + 6dc8: 5a36 lw s4,108(sp) + 6dca: 5aa6 lw s5,104(sp) + 6dcc: 5b16 lw s6,100(sp) + 6dce: 5b86 lw s7,96(sp) + 6dd0: 4c76 lw s8,92(sp) + 6dd2: 4ce6 lw s9,88(sp) + 6dd4: 4d56 lw s10,84(sp) + 6dd6: 4dc6 lw s11,80(sp) + 6dd8: 6109 addi sp,sp,128 + 6dda: 8082 ret + 6ddc: 8f7e mv t5,t6 + 6dde: 8e76 mv t3,t4 + 6de0: 8fbe mv t6,a5 + 6de2: 8eba mv t4,a4 + 6de4: 87b2 mv a5,a2 + 6de6: 875e mv a4,s7 + 6de8: bdf1 j 6cc4 + 6dea: ffe68613 addi a2,a3,-2 + 6dee: 8a3d andi a2,a2,15 + 6df0: 05010813 addi a6,sp,80 + 6df4: 060a slli a2,a2,0x2 + 6df6: 9642 add a2,a2,a6 + 6df8: fc062303 lw t1,-64(a2) + 6dfc: ff168613 addi a2,a3,-15 + 6e00: 8a3d andi a2,a2,15 + 6e02: 060a slli a2,a2,0x2 + 6e04: 9642 add a2,a2,a6 + 6e06: fc062883 lw a7,-64(a2) + 6e0a: ff968613 addi a2,a3,-7 + 6e0e: 00f6f813 andi a6,a3,15 + 6e12: 8a3d andi a2,a2,15 + 6e14: 05010b93 addi s7,sp,80 + 6e18: 060a slli a2,a2,0x2 + 6e1a: 080a slli a6,a6,0x2 + 6e1c: 985e add a6,a6,s7 + 6e1e: 965e add a2,a2,s7 + 6e20: fc062b83 lw s7,-64(a2) + 6e24: fc082603 lw a2,-64(a6) + 6e28: 00f31c13 slli s8,t1,0xf + 6e2c: 01335d93 srli s11,t1,0x13 + 6e30: 9bb2 add s7,s7,a2 + 6e32: 01135613 srli a2,t1,0x11 + 6e36: 00cc6c33 or s8,s8,a2 + 6e3a: 00d31613 slli a2,t1,0xd + 6e3e: 01b66633 or a2,a2,s11 + 6e42: 00cc4633 xor a2,s8,a2 + 6e46: 00a35313 srli t1,t1,0xa + 6e4a: 00664633 xor a2,a2,t1 + 6e4e: 9bb2 add s7,s7,a2 + 6e50: 0078d313 srli t1,a7,0x7 + 6e54: 01989613 slli a2,a7,0x19 + 6e58: 00c36633 or a2,t1,a2 + 6e5c: 0128dc13 srli s8,a7,0x12 + 6e60: 00e89313 slli t1,a7,0xe + 6e64: 01836333 or t1,t1,s8 + 6e68: 00664633 xor a2,a2,t1 + 6e6c: 0038d893 srli a7,a7,0x3 + 6e70: 011648b3 xor a7,a2,a7 + 6e74: 9bc6 add s7,s7,a7 + 6e76: fd782023 sw s7,-64(a6) + 6e7a: bdb5 j 6cf6 + +00006e7c : + 6e7c: b74f92ef jal t0,1f0 <__riscv_save_0> + 6e80: 842a mv s0,a0 + 6e82: 04800613 li a2,72 + 6e86: 4581 li a1,0 + 6e88: 02050513 addi a0,a0,32 + 6e8c: b94f90ef jal ra,220 + 6e90: 6a09e7b7 lui a5,0x6a09e + 6e94: 66778793 addi a5,a5,1639 # 6a09e667 <_eusrstack+0x4a096667> + 6e98: c01c sw a5,0(s0) + 6e9a: bb67b7b7 lui a5,0xbb67b + 6e9e: e8578793 addi a5,a5,-379 # bb67ae85 <_eusrstack+0x9b672e85> + 6ea2: c05c sw a5,4(s0) + 6ea4: 3c6ef7b7 lui a5,0x3c6ef + 6ea8: 37278793 addi a5,a5,882 # 3c6ef372 <_eusrstack+0x1c6e7372> + 6eac: c41c sw a5,8(s0) + 6eae: a54ff7b7 lui a5,0xa54ff + 6eb2: 53a78793 addi a5,a5,1338 # a54ff53a <_eusrstack+0x854f753a> + 6eb6: c45c sw a5,12(s0) + 6eb8: 510e57b7 lui a5,0x510e5 + 6ebc: 27f78793 addi a5,a5,639 # 510e527f <_eusrstack+0x310dd27f> + 6ec0: c81c sw a5,16(s0) + 6ec2: 9b0577b7 lui a5,0x9b057 + 6ec6: 88c78793 addi a5,a5,-1908 # 9b05688c <_eusrstack+0x7b04e88c> + 6eca: c85c sw a5,20(s0) + 6ecc: 1f83e7b7 lui a5,0x1f83e + 6ed0: 9ab78793 addi a5,a5,-1621 # 1f83d9ab <_data_lma+0x1f82f74f> + 6ed4: cc1c sw a5,24(s0) + 6ed6: 5be0d7b7 lui a5,0x5be0d + 6eda: d1978793 addi a5,a5,-743 # 5be0cd19 <_eusrstack+0x3be04d19> + 6ede: cc5c sw a5,28(s0) + 6ee0: b34f906f j 214 <__riscv_restore_0> + +00006ee4 : + 6ee4: b0cf92ef jal t0,1f0 <__riscv_save_0> + 6ee8: 000077b7 lui a5,0x7 + 6eec: 882a mv a6,a0 + 6eee: 8732 mv a4,a2 + 6ef0: 86ae mv a3,a1 + 6ef2: c7078793 addi a5,a5,-912 # 6c70 + 6ef6: 06450593 addi a1,a0,100 + 6efa: 04000613 li a2,64 + 6efe: 02050513 addi a0,a0,32 + 6f02: a7fff0ef jal ra,6980 + 6f06: b0ef906f j 214 <__riscv_restore_0> + +00006f0a : + 6f0a: accf92ef jal t0,1d6 <__riscv_save_4> + 6f0e: 513c lw a5,96(a0) + 6f10: 06452903 lw s2,100(a0) + 6f14: 1101 addi sp,sp,-32 + 6f16: 01a7d713 srli a4,a5,0x1a + 6f1a: 079a slli a5,a5,0x6 + 6f1c: 993e add s2,s2,a5 + 6f1e: 00f934b3 sltu s1,s2,a5 + 6f22: 94ba add s1,s1,a4 + 6f24: 01d95793 srli a5,s2,0x1d + 6f28: 048e slli s1,s1,0x3 + 6f2a: 8cdd or s1,s1,a5 + 6f2c: 00890793 addi a5,s2,8 + 6f30: 03f7f793 andi a5,a5,63 + 6f34: 000078b7 lui a7,0x7 + 6f38: 04000813 li a6,64 + 6f3c: 842a mv s0,a0 + 6f3e: 40f80833 sub a6,a6,a5 + 6f42: c02a sw a0,0(sp) + 6f44: c7088893 addi a7,a7,-912 # 6c70 + 6f48: 4781 li a5,0 + 6f4a: 4701 li a4,0 + 6f4c: 08000693 li a3,128 + 6f50: 04000613 li a2,64 + 6f54: 89ae mv s3,a1 + 6f56: 06450593 addi a1,a0,100 + 6f5a: 02050513 addi a0,a0,32 + 6f5e: a97ff0ef jal ra,69f4 + 6f62: 00391a13 slli s4,s2,0x3 + 6f66: 0084d793 srli a5,s1,0x8 + 6f6a: 00f10d23 sb a5,26(sp) + 6f6e: 018a5793 srli a5,s4,0x18 + 6f72: 00f10e23 sb a5,28(sp) + 6f76: 010a5793 srli a5,s4,0x10 + 6f7a: 0a42 slli s4,s4,0x10 + 6f7c: 010a5a13 srli s4,s4,0x10 + 6f80: 092e slli s2,s2,0xb + 6f82: 008a5a13 srli s4,s4,0x8 + 6f86: 01496933 or s2,s2,s4 + 6f8a: 4621 li a2,8 + 6f8c: 082c addi a1,sp,24 + 6f8e: 8522 mv a0,s0 + 6f90: 00f10ea3 sb a5,29(sp) + 6f94: 00011c23 sh zero,24(sp) + 6f98: 00910da3 sb s1,27(sp) + 6f9c: 01211f23 sh s2,30(sp) + 6fa0: f45ff0ef jal ra,6ee4 + 6fa4: 507c lw a5,100(s0) + 6fa6: c399 beqz a5,6fac + 6fa8: 117020ef jal ra,98be + 6fac: 4008 lw a0,0(s0) + 6fae: 85ce mv a1,s3 + 6fb0: cabff0ef jal ra,6c5a + 6fb4: 4048 lw a0,4(s0) + 6fb6: 00498593 addi a1,s3,4 + 6fba: ca1ff0ef jal ra,6c5a + 6fbe: 4408 lw a0,8(s0) + 6fc0: 00898593 addi a1,s3,8 + 6fc4: c97ff0ef jal ra,6c5a + 6fc8: 4448 lw a0,12(s0) + 6fca: 00c98593 addi a1,s3,12 + 6fce: c8dff0ef jal ra,6c5a + 6fd2: 4808 lw a0,16(s0) + 6fd4: 01098593 addi a1,s3,16 + 6fd8: c83ff0ef jal ra,6c5a + 6fdc: 4848 lw a0,20(s0) + 6fde: 01498593 addi a1,s3,20 + 6fe2: c79ff0ef jal ra,6c5a + 6fe6: 4c08 lw a0,24(s0) + 6fe8: 01898593 addi a1,s3,24 + 6fec: c6fff0ef jal ra,6c5a + 6ff0: 4c48 lw a0,28(s0) + 6ff2: 01c98593 addi a1,s3,28 + 6ff6: c65ff0ef jal ra,6c5a + 6ffa: 06800613 li a2,104 + 6ffe: 4581 li a1,0 + 7000: 8522 mv a0,s0 + 7002: a1ef90ef jal ra,220 + 7006: 6105 addi sp,sp,32 + 7008: a02f906f j 20a <__riscv_restore_4> + +0000700c : + 700c: 9e4f92ef jal t0,1f0 <__riscv_save_0> + 7010: 7159 addi sp,sp,-112 + 7012: 842e mv s0,a1 + 7014: 06800613 li a2,104 + 7018: 85aa mv a1,a0 + 701a: 0028 addi a0,sp,8 + 701c: 137020ef jal ra,9952 + 7020: 0028 addi a0,sp,8 + 7022: 85a2 mv a1,s0 + 7024: ee7ff0ef jal ra,6f0a + 7028: 6165 addi sp,sp,112 + 702a: 9eaf906f j 214 <__riscv_restore_0> + +0000702e : + 702e: 9c2f92ef jal t0,1f0 <__riscv_save_0> + 7032: 1101 addi sp,sp,-32 + 7034: 02000613 li a2,32 + 7038: 4581 li a1,0 + 703a: 850a mv a0,sp + 703c: 9e4f90ef jal ra,220 + 7040: 4585 li a1,1 + 7042: 20000513 li a0,512 + 7046: 0d8020ef jal ra,911e + 704a: 6531 lui a0,0xc + 704c: 40012437 lui s0,0x40012 + 7050: 6f3010ef jal ra,8f42 + 7054: 40040513 addi a0,s0,1024 # 40012400 <_eusrstack+0x2000a400> + 7058: 251010ef jal ra,8aa8 + 705c: 000e07b7 lui a5,0xe0 + 7060: c63e sw a5,12(sp) + 7062: 858a mv a1,sp + 7064: 4785 li a5,1 + 7066: 40040513 addi a0,s0,1024 + 706a: 00f10a23 sb a5,20(sp) + 706e: c002 sw zero,0(sp) + 7070: c202 sw zero,4(sp) + 7072: c402 sw zero,8(sp) + 7074: c802 sw zero,16(sp) + 7076: 273010ef jal ra,8ae8 + 707a: 4585 li a1,1 + 707c: 40040513 addi a0,s0,1024 + 7080: 2bf010ef jal ra,8b3e + 7084: 4581 li a1,0 + 7086: 40040513 addi a0,s0,1024 + 708a: 3eb010ef jal ra,8c74 + 708e: 40040513 addi a0,s0,1024 + 7092: 2bd010ef jal ra,8b4e + 7096: 40040493 addi s1,s0,1024 + 709a: 8526 mv a0,s1 + 709c: 2bd010ef jal ra,8b58 + 70a0: fd6d bnez a0,709a + 70a2: 40040513 addi a0,s0,1024 + 70a6: 40012437 lui s0,0x40012 + 70aa: 2b7010ef jal ra,8b60 + 70ae: 40040493 addi s1,s0,1024 # 40012400 <_eusrstack+0x2000a400> + 70b2: 8526 mv a0,s1 + 70b4: 2b7010ef jal ra,8b6a + 70b8: fd6d bnez a0,70b2 + 70ba: 40040513 addi a0,s0,1024 + 70be: 3cf010ef jal ra,8c8c + 70c2: 82a19123 sh a0,-2014(gp) # 20000212 + 70c6: 4585 li a1,1 + 70c8: 40040513 addi a0,s0,1024 + 70cc: 3a9010ef jal ra,8c74 + 70d0: 4505 li a0,1 + 70d2: 379010ef jal ra,8c4a + 70d6: 6105 addi sp,sp,32 + 70d8: 93cf906f j 214 <__riscv_restore_0> + +000070dc : + 70dc: 914f92ef jal t0,1f0 <__riscv_save_0> + 70e0: 40012437 lui s0,0x40012 + 70e4: 85aa mv a1,a0 + 70e6: 469d li a3,7 + 70e8: 4605 li a2,1 + 70ea: 40040513 addi a0,s0,1024 # 40012400 <_eusrstack+0x2000a400> + 70ee: 29d010ef jal ra,8b8a + 70f2: 4585 li a1,1 + 70f4: 40040513 addi a0,s0,1024 + 70f8: 27b010ef jal ra,8b72 + 70fc: 40040493 addi s1,s0,1024 + 7100: 4589 li a1,2 + 7102: 8526 mv a0,s1 + 7104: 367010ef jal ra,8c6a + 7108: dd65 beqz a0,7100 + 710a: 40040513 addi a0,s0,1024 + 710e: 335010ef jal ra,8c42 + 7112: 902f906f j 214 <__riscv_restore_0> + +00007116 : + 7116: 8daf92ef jal t0,1f0 <__riscv_save_0> + 711a: 1141 addi sp,sp,-16 + 711c: 892a mv s2,a0 + 711e: 4401 li s0,0 + 7120: 4481 li s1,0 + 7122: 00b41963 bne s0,a1,7134 + 7126: 0284d533 divu a0,s1,s0 + 712a: 0141 addi sp,sp,16 + 712c: 0542 slli a0,a0,0x10 + 712e: 8141 srli a0,a0,0x10 + 7130: 8e4f906f j 214 <__riscv_restore_0> + 7134: 854a mv a0,s2 + 7136: c62e sw a1,12(sp) + 7138: fa5ff0ef jal ra,70dc + 713c: 94aa add s1,s1,a0 + 713e: 4515 li a0,5 + 7140: 326020ef jal ra,9466 + 7144: 0405 addi s0,s0,1 + 7146: 0ff47413 andi s0,s0,255 + 714a: 45b2 lw a1,12(sp) + 714c: bfd9 j 7122 + +0000714e : + 714e: 82219703 lh a4,-2014(gp) # 20000212 + 7152: 4781 li a5,0 + 7154: 972a add a4,a4,a0 + 7156: 00074f63 bltz a4,7174 + 715a: cd09 beqz a0,7174 + 715c: 6605 lui a2,0x1 + 715e: fff60693 addi a3,a2,-1 # fff + 7162: 87b6 mv a5,a3 + 7164: 00c75863 bge a4,a2,7174 + 7168: 87aa mv a5,a0 + 716a: 00d50563 beq a0,a3,7174 + 716e: 01071793 slli a5,a4,0x10 + 7172: 83c1 srli a5,a5,0x10 + 7174: 853e mv a0,a5 + 7176: 8082 ret + +00007178 : + 7178: 1ffff7b7 lui a5,0x1ffff + 717c: 7207a783 lw a5,1824(a5) # 1ffff720 <_data_lma+0x1fff14c4> + 7180: 46a9 li a3,10 + 7182: 0107d713 srli a4,a5,0x10 + 7186: 07c2 slli a5,a5,0x10 + 7188: 83c1 srli a5,a5,0x10 + 718a: 8d1d sub a0,a0,a5 + 718c: 06400793 li a5,100 + 7190: 02f50533 mul a0,a0,a5 + 7194: 02b00793 li a5,43 + 7198: 0555 addi a0,a0,21 + 719a: 02f54533 div a0,a0,a5 + 719e: 02d70733 mul a4,a4,a3 + 71a2: 40a70533 sub a0,a4,a0 + 71a6: 8082 ret + +000071a8 : + 71a8: 848f92ef jal t0,1f0 <__riscv_save_0> + 71ac: 45a9 li a1,10 + 71ae: 4541 li a0,16 + 71b0: f67ff0ef jal ra,7116 + 71b4: 0542 slli a0,a0,0x10 + 71b6: 8541 srai a0,a0,0x10 + 71b8: f97ff0ef jal ra,714e + 71bc: 6785 lui a5,0x1 + 71be: ce478793 addi a5,a5,-796 # ce4 + 71c2: 02f50533 mul a0,a0,a5 + 71c6: 8531 srai a0,a0,0xc + 71c8: fb1ff0ef jal ra,7178 + 71cc: 0542 slli a0,a0,0x10 + 71ce: 8541 srai a0,a0,0x10 + 71d0: 844f906f j 214 <__riscv_restore_0> + +000071d4 : + 71d4: 81cf92ef jal t0,1f0 <__riscv_save_0> + 71d8: 45a9 li a1,10 + 71da: 4505 li a0,1 + 71dc: f3bff0ef jal ra,7116 + 71e0: 0542 slli a0,a0,0x10 + 71e2: 8541 srai a0,a0,0x10 + 71e4: f6bff0ef jal ra,714e + 71e8: 6785 lui a5,0x1 + 71ea: ce478793 addi a5,a5,-796 # ce4 + 71ee: 02f50533 mul a0,a0,a5 + 71f2: 8531 srai a0,a0,0xc + 71f4: 820f906f j 214 <__riscv_restore_0> + +000071f8 : + 71f8: 00055563 bgez a0,7202 + 71fc: 010007b7 lui a5,0x1000 + 7200: 953e add a0,a0,a5 + 7202: 41055793 srai a5,a0,0x10 + 7206: a19c sb a5,0(a1) + 7208: 40855793 srai a5,a0,0x8 + 720c: b19c sb a5,1(a1) + 720e: a1a8 sb a0,2(a1) + 7210: 8082 ret + +00007212 : + 7212: fdff82ef jal t0,1f0 <__riscv_save_0> + 7216: 843a mv s0,a4 + 7218: 87ae mv a5,a1 + 721a: a308 sb a0,0(a4) + 721c: f8800713 li a4,-120 + 7220: 1141 addi sp,sp,-16 + 7222: 853e mv a0,a5 + 7224: b018 sb a4,1(s0) + 7226: 00240593 addi a1,s0,2 + 722a: c436 sw a3,8(sp) + 722c: c632 sw a2,12(sp) + 722e: fcbff0ef jal ra,71f8 + 7232: 4632 lw a2,12(sp) + 7234: 00540593 addi a1,s0,5 + 7238: 8532 mv a0,a2 + 723a: fbfff0ef jal ra,71f8 + 723e: 46a2 lw a3,8(sp) + 7240: 00840593 addi a1,s0,8 + 7244: 8536 mv a0,a3 + 7246: fb3ff0ef jal ra,71f8 + 724a: 0141 addi sp,sp,16 + 724c: fc9f806f j 214 <__riscv_restore_0> + +00007250 : + 7250: 200007b7 lui a5,0x20000 + 7254: 6705 lui a4,0x1 + 7256: 38c78793 addi a5,a5,908 # 2000038c + 725a: b8070713 addi a4,a4,-1152 # b80 + 725e: 20000537 lui a0,0x20000 + 7262: 973e add a4,a4,a5 + 7264: 5d050513 addi a0,a0,1488 # 200005d0 + 7268: 55fd li a1,-1 + 726a: 2ed7c683 lbu a3,749(a5) + 726e: 8a85 andi a3,a3,1 + 7270: ea91 bnez a3,7284 + 7272: 2f47a683 lw a3,756(a5) + 7276: 24478613 addi a2,a5,580 + 727a: ca91 beqz a3,728e + 727c: 00b6f463 bgeu a3,a1,7284 + 7280: 8532 mv a0,a2 + 7282: 85b6 mv a1,a3 + 7284: 0b878793 addi a5,a5,184 + 7288: fee791e3 bne a5,a4,726a + 728c: 8082 ret + 728e: 8532 mv a0,a2 + 7290: 8082 ret + +00007292 : + 7292: 20000737 lui a4,0x20000 + 7296: 38c70693 addi a3,a4,908 # 2000038c + 729a: 4781 li a5,0 + 729c: 38c70713 addi a4,a4,908 + 72a0: 4641 li a2,16 + 72a2: 2646c583 lbu a1,612(a3) + 72a6: 00a58963 beq a1,a0,72b8 + 72aa: 0785 addi a5,a5,1 + 72ac: 0b868693 addi a3,a3,184 + 72b0: fec799e3 bne a5,a2,72a2 + 72b4: 4501 li a0,0 + 72b6: 8082 ret + 72b8: 0b800513 li a0,184 + 72bc: 02a787b3 mul a5,a5,a0 + 72c0: 24478793 addi a5,a5,580 + 72c4: 00f70533 add a0,a4,a5 + 72c8: 8082 ret + +000072ca : + 72ca: f0df82ef jal t0,1d6 <__riscv_save_4> + 72ce: 89aa mv s3,a0 + 72d0: 20000537 lui a0,0x20000 + 72d4: 38c50493 addi s1,a0,908 # 2000038c + 72d8: 6905 lui s2,0x1 + 72da: 4401 li s0,0 + 72dc: 26448a13 addi s4,s1,612 + 72e0: b8090913 addi s2,s2,-1152 # b80 + 72e4: 4611 li a2,4 + 72e6: 85ce mv a1,s3 + 72e8: 008a0533 add a0,s4,s0 + 72ec: 642020ef jal ra,992e + 72f0: e519 bnez a0,72fe + 72f2: 0b840413 addi s0,s0,184 + 72f6: ff2417e3 bne s0,s2,72e4 + 72fa: f11f806f j 20a <__riscv_restore_4> + 72fe: 24440513 addi a0,s0,580 + 7302: 9526 add a0,a0,s1 + 7304: bfdd j 72fa + +00007306 : + 7306: 20000737 lui a4,0x20000 + 730a: 38c70613 addi a2,a4,908 # 2000038c + 730e: 4781 li a5,0 + 7310: 4681 li a3,0 + 7312: 38c70713 addi a4,a4,908 + 7316: 4821 li a6,8 + 7318: 0b464883 lbu a7,180(a2) + 731c: 00a89763 bne a7,a0,732a + 7320: 0685 addi a3,a3,1 + 7322: 0ff6f693 andi a3,a3,255 + 7326: 00d5e963 bltu a1,a3,7338 + 732a: 0785 addi a5,a5,1 + 732c: 03860613 addi a2,a2,56 + 7330: ff0794e3 bne a5,a6,7318 + 7334: 4501 li a0,0 + 7336: 8082 ret + 7338: 03800513 li a0,56 + 733c: 02a787b3 mul a5,a5,a0 + 7340: 08478793 addi a5,a5,132 + 7344: 00f70533 add a0,a4,a5 + 7348: 8082 ret + +0000734a : + 734a: e8df82ef jal t0,1d6 <__riscv_save_4> + 734e: 20000437 lui s0,0x20000 + 7352: 41040493 addi s1,s0,1040 # 20000410 + 7356: 7175 addi sp,sp,-144 + 7358: 892a mv s2,a0 + 735a: 89ae mv s3,a1 + 735c: 4681 li a3,0 + 735e: 41040413 addi s0,s0,1040 + 7362: 577d li a4,-1 + 7364: 4621 li a2,8 + 7366: 58dc lw a5,52(s1) + 7368: ebad bnez a5,73da + 736a: 0000d637 lui a2,0xd + 736e: 0000b5b7 lui a1,0xb + 7372: 0000d537 lui a0,0xd + 7376: 874a mv a4,s2 + 7378: 71860613 addi a2,a2,1816 # d718 + 737c: 66058593 addi a1,a1,1632 # b660 <_exit+0x208> + 7380: 72050513 addi a0,a0,1824 # d720 + 7384: 043020ef jal ra,9bc6 + 7388: 8426 mv s0,s1 + 738a: 02000613 li a2,32 + 738e: 4581 li a1,0 + 7390: 8522 mv a0,s0 + 7392: e8ff80ef jal ra,220 + 7396: 85ca mv a1,s2 + 7398: 02000613 li a2,32 + 739c: 8522 mv a0,s0 + 739e: 3bb020ef jal ra,9f58 + 73a2: 02040493 addi s1,s0,32 + 73a6: 85ce mv a1,s3 + 73a8: 4641 li a2,16 + 73aa: 8526 mv a0,s1 + 73ac: 5a6020ef jal ra,9952 + 73b0: 1028 addi a0,sp,40 + 73b2: acbff0ef jal ra,6e7c + 73b6: 4641 li a2,16 + 73b8: 85a6 mv a1,s1 + 73ba: 1028 addi a0,sp,40 + 73bc: b29ff0ef jal ra,6ee4 + 73c0: 002c addi a1,sp,8 + 73c2: 1028 addi a0,sp,40 + 73c4: c49ff0ef jal ra,700c + 73c8: 841c lbu a5,8(sp) + 73ca: 02f40823 sb a5,48(s0) + 73ce: 63d010ef jal ra,920a + 73d2: d848 sw a0,52(s0) + 73d4: 6149 addi sp,sp,144 + 73d6: e35f806f j 20a <__riscv_restore_4> + 73da: 00048583 lb a1,0(s1) + 73de: ed99 bnez a1,73fc + 73e0: 0000d637 lui a2,0xd + 73e4: 0000b5b7 lui a1,0xb + 73e8: 0000d537 lui a0,0xd + 73ec: 874a mv a4,s2 + 73ee: 71860613 addi a2,a2,1816 # d718 + 73f2: 66058593 addi a1,a1,1632 # b660 <_exit+0x208> + 73f6: 76c50513 addi a0,a0,1900 # d76c + 73fa: b769 j 7384 + 73fc: 00e7f463 bgeu a5,a4,7404 + 7400: 8426 mv s0,s1 + 7402: 873e mv a4,a5 + 7404: 0685 addi a3,a3,1 + 7406: 03848493 addi s1,s1,56 + 740a: f4c69ee3 bne a3,a2,7366 + 740e: bfb5 j 738a + +00007410 : + 7410: db9f82ef jal t0,1c8 <__riscv_save_10> + 7414: 0000e537 lui a0,0xe + 7418: 81450513 addi a0,a0,-2028 # d814 + 741c: 20000437 lui s0,0x20000 + 7420: 0000e937 lui s2,0xe + 7424: 0000e9b7 lui s3,0xe + 7428: 0e5020ef jal ra,9d0c + 742c: 38c40413 addi s0,s0,908 # 2000038c + 7430: 4481 li s1,0 + 7432: 0000ea37 lui s4,0xe + 7436: 0000eab7 lui s5,0xe + 743a: 0000eb37 lui s6,0xe + 743e: 0000ebb7 lui s7,0xe + 7442: 80c90913 addi s2,s2,-2036 # d80c + 7446: 81098993 addi s3,s3,-2032 # d810 + 744a: 2f442783 lw a5,756(s0) + 744e: 0c078c63 beqz a5,7526 + 7452: 85a6 mv a1,s1 + 7454: 824a0513 addi a0,s4,-2012 # d824 + 7458: 76e020ef jal ra,9bc6 + 745c: 24440593 addi a1,s0,580 + 7460: 830a8513 addi a0,s5,-2000 # d830 + 7464: 762020ef jal ra,9bc6 + 7468: 02000613 li a2,32 + 746c: 26440593 addi a1,s0,612 + 7470: 83cb0513 addi a0,s6,-1988 # d83c + 7474: f6ff80ef jal ra,3e2 + 7478: 02000613 li a2,32 + 747c: 28440593 addi a1,s0,644 + 7480: 844b8513 addi a0,s7,-1980 # d844 + 7484: f5ff80ef jal ra,3e2 + 7488: 0000e537 lui a0,0xe + 748c: 99850513 addi a0,a0,-1640 # d998 + 7490: 736020ef jal ra,9bc6 + 7494: 2a842603 lw a2,680(s0) + 7498: 2a442583 lw a1,676(s0) + 749c: 0000e537 lui a0,0xe + 74a0: 84c50513 addi a0,a0,-1972 # d84c + 74a4: 722020ef jal ra,9bc6 + 74a8: 0000e537 lui a0,0xe + 74ac: 86450513 addi a0,a0,-1948 # d864 + 74b0: 716020ef jal ra,9bc6 + 74b4: 2ed44583 lbu a1,749(s0) + 74b8: 0000e537 lui a0,0xe + 74bc: 89050513 addi a0,a0,-1904 # d890 + 74c0: 706020ef jal ra,9bc6 + 74c4: 2ee44583 lbu a1,750(s0) + 74c8: 0000c537 lui a0,0xc + 74cc: bd050513 addi a0,a0,-1072 # bbd0 <_exit+0x778> + 74d0: 6f6020ef jal ra,9bc6 + 74d4: 2ef44783 lbu a5,751(s0) + 74d8: 85ca mv a1,s2 + 74da: e391 bnez a5,74de + 74dc: 85ce mv a1,s3 + 74de: 0000e537 lui a0,0xe + 74e2: 8a450513 addi a0,a0,-1884 # d8a4 + 74e6: 6e0020ef jal ra,9bc6 + 74ea: 2f042583 lw a1,752(s0) + 74ee: 0000e537 lui a0,0xe + 74f2: 8bc50513 addi a0,a0,-1860 # d8bc + 74f6: 6d0020ef jal ra,9bc6 + 74fa: 2f442583 lw a1,756(s0) + 74fe: 0000e537 lui a0,0xe + 7502: 8dc50513 addi a0,a0,-1828 # d8dc + 7506: 6c0020ef jal ra,9bc6 + 750a: 2f842583 lw a1,760(s0) + 750e: 0000e537 lui a0,0xe + 7512: 8f850513 addi a0,a0,-1800 # d8f8 + 7516: 6b0020ef jal ra,9bc6 + 751a: 0000e537 lui a0,0xe + 751e: 91050513 addi a0,a0,-1776 # d910 + 7522: 6a4020ef jal ra,9bc6 + 7526: 0485 addi s1,s1,1 + 7528: 47c1 li a5,16 + 752a: 0b840413 addi s0,s0,184 + 752e: f0f49ee3 bne s1,a5,744a + 7532: ccff806f j 200 <__riscv_restore_10> + +00007536 : + 7536: 157d addi a0,a0,-1 + 7538: 0ff57513 andi a0,a0,255 + 753c: 478d li a5,3 + 753e: 00a7e963 bltu a5,a0,7550 + 7542: 67b5 lui a5,0xd + 7544: 69c78793 addi a5,a5,1692 # d69c + 7548: 050a slli a0,a0,0x2 + 754a: 953e add a0,a0,a5 + 754c: 4108 lw a0,0(a0) + 754e: 8082 ret + 7550: 0000d537 lui a0,0xd + 7554: 7b850513 addi a0,a0,1976 # d7b8 + 7558: 8082 ret + +0000755a : + 755a: c97f82ef jal t0,1f0 <__riscv_save_0> + 755e: 1101 addi sp,sp,-32 + 7560: 0000d5b7 lui a1,0xd + 7564: 02000613 li a2,32 + 7568: 7c058593 addi a1,a1,1984 # d7c0 + 756c: 850a mv a0,sp + 756e: 3e4020ef jal ra,9952 + 7572: 200005b7 lui a1,0x20000 + 7576: 20000537 lui a0,0x20000 + 757a: 860a mv a2,sp + 757c: 3b058593 addi a1,a1,944 # 200003b0 + 7580: 39050513 addi a0,a0,912 # 20000390 + 7584: 986fc0ef jal ra,370a + 7588: 20000437 lui s0,0x20000 + 758c: 38c40413 addi s0,s0,908 # 2000038c + 7590: 4785 li a5,1 + 7592: 7601a023 sw zero,1888(gp) # 20001150 <__global_pointer$+0x760> + 7596: 04f40223 sb a5,68(s0) + 759a: 0000d5b7 lui a1,0xd + 759e: 76018793 addi a5,gp,1888 # 20001150 <__global_pointer$+0x760> + 75a2: 0007a223 sw zero,4(a5) + 75a6: 0007a423 sw zero,8(a5) + 75aa: 0007a623 sw zero,12(a5) + 75ae: 7e058593 addi a1,a1,2016 # d7e0 + 75b2: 76018513 addi a0,gp,1888 # 20001150 <__global_pointer$+0x760> + 75b6: 181020ef jal ra,9f36 + 75ba: 0000d5b7 lui a1,0xd + 75be: 20000537 lui a0,0x20000 + 75c2: 7ec58593 addi a1,a1,2028 # d7ec + 75c6: 3d150513 addi a0,a0,977 # 200003d1 + 75ca: 16d020ef jal ra,9f36 + 75ce: 47d1 li a5,20 + 75d0: 06f40a23 sb a5,116(s0) + 75d4: 33d457b7 lui a5,0x33d45 + 75d8: 75078793 addi a5,a5,1872 # 33d45750 <_eusrstack+0x13d3d750> + 75dc: dc3c sw a5,120(s0) + 75de: 30800793 li a5,776 + 75e2: 06f41e23 sh a5,124(s0) + 75e6: 4791 li a5,4 + 75e8: 06f40f23 sb a5,126(s0) + 75ec: 6485 lui s1,0x1 + 75ee: 089807b7 lui a5,0x8980 + 75f2: 07c1 addi a5,a5,16 + 75f4: 4641 li a2,16 + 75f6: 94a2 add s1,s1,s0 + 75f8: 07440593 addi a1,s0,116 + 75fc: 98c18513 addi a0,gp,-1652 # 2000037c + 7600: 08f42023 sw a5,128(s0) + 7604: de049323 sh zero,-538(s1) # de6 + 7608: 34a020ef jal ra,9952 + 760c: 65b9 lui a1,0xe + 760e: 0000d537 lui a0,0xd + 7612: 93858593 addi a1,a1,-1736 # d938 + 7616: 7fc50513 addi a0,a0,2044 # d7fc + 761a: d31ff0ef jal ra,734a + 761e: 65b5 lui a1,0xd + 7620: 0000e537 lui a0,0xe + 7624: 68c58593 addi a1,a1,1676 # d68c + 7628: 80450513 addi a0,a0,-2044 # d804 + 762c: d1fff0ef jal ra,734a + 7630: 10100793 li a5,257 + 7634: def49223 sh a5,-540(s1) + 7638: 02df57b7 lui a5,0x2df5 + 763c: 5b478793 addi a5,a5,1460 # 2df55b4 <_data_lma+0x2de7358> + 7640: d43c sw a5,104(s0) + 7642: 0103e7b7 lui a5,0x103e + 7646: c9c78793 addi a5,a5,-868 # 103dc9c <_data_lma+0x102fa40> + 764a: d47c sw a5,108(s0) + 764c: 6799 lui a5,0x6 + 764e: b6878793 addi a5,a5,-1176 # 5b68 + 7652: d83c sw a5,112(s0) + 7654: 6105 addi sp,sp,32 + 7656: bbff806f j 214 <__riscv_restore_0> + +0000765a : + 765a: b97f82ef jal t0,1f0 <__riscv_save_0> + 765e: 0000d4b7 lui s1,0xd + 7662: 0000b5b7 lui a1,0xb + 7666: 0000d537 lui a0,0xd + 766a: 71848613 addi a2,s1,1816 # d718 + 766e: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 7672: 6ac50513 addi a0,a0,1708 # d6ac + 7676: 550020ef jal ra,9bc6 + 767a: 265d jal 7a20 + 767c: 4501 li a0,0 + 767e: 2b25 jal 7bb6 + 7680: 98c18413 addi s0,gp,-1652 # 2000037c + 7684: 2472 lhu a2,14(s0) + 7686: 00040583 lb a1,0(s0) + 768a: 4048 lw a0,4(s0) + 768c: 4681 li a3,0 + 768e: 3ad000ef jal ra,823a + 7692: cd05 beqz a0,76ca + 7694: 0000c437 lui s0,0xc + 7698: 0000d537 lui a0,0xd + 769c: 71848613 addi a2,s1,1816 + 76a0: 18840593 addi a1,s0,392 # c188 <_exit+0xd30> + 76a4: 6c050513 addi a0,a0,1728 # d6c0 + 76a8: 51e020ef jal ra,9bc6 + 76ac: 0000d937 lui s2,0xd + 76b0: 3e800513 li a0,1000 + 76b4: 5b3010ef jal ra,9466 + 76b8: 71848613 addi a2,s1,1816 + 76bc: 18840593 addi a1,s0,392 + 76c0: 6ec90513 addi a0,s2,1772 # d6ec + 76c4: 502020ef jal ra,9bc6 + 76c8: b7e5 j 76b0 + 76ca: 2456 lhu a3,12(s0) + 76cc: 2430 lbu a2,10(s0) + 76ce: 340c lbu a1,9(s0) + 76d0: 2408 lbu a0,8(s0) + 76d2: 4801 li a6,0 + 76d4: 4785 li a5,1 + 76d6: 4701 li a4,0 + 76d8: 715000ef jal ra,85ec + 76dc: b39f806f j 214 <__riscv_restore_0> + +000076e0 : + 76e0: a001 j 76e0 + +000076e2 : + 76e2: beef07b7 lui a5,0xbeef0 + 76e6: e000e737 lui a4,0xe000e + 76ea: 08078793 addi a5,a5,128 # beef0080 <_eusrstack+0x9eee8080> + 76ee: c73c sw a5,72(a4) + 76f0: a001 j 76f0 + +000076f2

: + 76f2: ad7f82ef jal t0,1c8 <__riscv_save_10> + 76f6: 7169 addi sp,sp,-304 + 76f8: 4509 li a0,2 + 76fa: 7d0010ef jal ra,8eca + 76fe: 1f0010ef jal ra,88ee + 7702: 53b010ef jal ra,943c + 7706: 6511 lui a0,0x4 + 7708: 4585 li a1,1 + 770a: 0511 addi a0,a0,4 + 770c: 213010ef jal ra,911e + 7710: 40011437 lui s0,0x40011 + 7714: 20000793 li a5,512 + 7718: 448d li s1,3 + 771a: 80040513 addi a0,s0,-2048 # 40010800 <_eusrstack+0x20008800> + 771e: 80fc sh a5,16(sp) + 7720: 080c addi a1,sp,16 + 7722: 47e1 li a5,24 + 7724: ca26 sw s1,20(sp) + 7726: cc3e sw a5,24(sp) + 7728: 6ce010ef jal ra,8df6 + 772c: 40000793 li a5,1024 + 7730: 80040513 addi a0,s0,-2048 + 7734: 80fc sh a5,16(sp) + 7736: 080c addi a1,sp,16 + 7738: 4791 li a5,4 + 773a: ca26 sw s1,20(sp) + 773c: cc3e sw a5,24(sp) + 773e: 6b8010ef jal ra,8df6 + 7742: 67f1 lui a5,0x1c + 7744: 40014437 lui s0,0x40014 + 7748: 20078793 addi a5,a5,512 # 1c200 <_data_lma+0xdfa4> + 774c: 80040513 addi a0,s0,-2048 # 40013800 <_eusrstack+0x2000b800> + 7750: ce3e sw a5,28(sp) + 7752: 086c addi a1,sp,28 + 7754: 000c07b7 lui a5,0xc0 + 7758: d23e sw a5,36(sp) + 775a: d002 sw zero,32(sp) + 775c: 02011423 sh zero,40(sp) + 7760: 41d010ef jal ra,937c + 7764: 4585 li a1,1 + 7766: 80040513 addi a0,s0,-2048 + 776a: 4a3010ef jal ra,940c + 776e: 0000e537 lui a0,0xe + 7772: 97450513 addi a0,a0,-1676 # d974 + 7776: 450020ef jal ra,9bc6 + 777a: 200007b7 lui a5,0x20000 + 777e: 1f07a683 lw a3,496(a5) # 200001f0 + 7782: 0000c437 lui s0,0xc + 7786: 0000b4b7 lui s1,0xb + 778a: 0000e537 lui a0,0xe + 778e: 0e040613 addi a2,s0,224 # c0e0 <_exit+0xc88> + 7792: 66048593 addi a1,s1,1632 # b660 <_exit+0x208> + 7796: 98050513 addi a0,a0,-1664 # d980 + 779a: 42c020ef jal ra,9bc6 + 779e: 64e010ef jal ra,8dec + 77a2: 86aa mv a3,a0 + 77a4: 0000e537 lui a0,0xe + 77a8: 0e040613 addi a2,s0,224 + 77ac: 66048593 addi a1,s1,1632 + 77b0: 99c50513 addi a0,a0,-1636 # d99c + 77b4: 412020ef jal ra,9bc6 + 77b8: da3ff0ef jal ra,755a + 77bc: e9fff0ef jal ra,765a + 77c0: 86fff0ef jal ra,702e + 77c4: ba6fb0ef jal ra,2b6a + 77c8: 243010ef jal ra,920a + 77cc: 80a1ae23 sw a0,-2020(gp) # 2000020c + 77d0: 03400613 li a2,52 + 77d4: 4581 li a1,0 + 77d6: 94c18513 addi a0,gp,-1716 # 2000033c + 77da: a47f80ef jal ra,220 + 77de: 4501 li a0,0 + 77e0: deff80ef jal ra,5ce + 77e4: 4705 li a4,1 + 77e6: 20001a37 lui s4,0x20001 + 77ea: 82e18223 sb a4,-2012(gp) # 20000214 + 77ee: 4a81 li s5,0 + 77f0: 4b01 li s6,0 + 77f2: 0000ebb7 lui s7,0xe + 77f6: 0000ec37 lui s8,0xe + 77fa: 38ca0a13 addi s4,s4,908 # 2000138c <_ebss+0x20c> + 77fe: 400144b7 lui s1,0x40014 + 7802: 02000593 li a1,32 + 7806: 80048513 addi a0,s1,-2048 # 40013800 <_eusrstack+0x2000b800> + 780a: 429010ef jal ra,9432 + 780e: 4785 li a5,1 + 7810: 0ef51363 bne a0,a5,78f6 + 7814: 80048513 addi a0,s1,-2048 + 7818: 413010ef jal ra,942a + 781c: 01851493 slli s1,a0,0x18 + 7820: 84e1 srai s1,s1,0x18 + 7822: 04d00793 li a5,77 + 7826: 08f49163 bne s1,a5,78a8 + 782a: 0000b5b7 lui a1,0xb + 782e: 0000e537 lui a0,0xe + 7832: 0e040613 addi a2,s0,224 + 7836: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 783a: 9b850513 addi a0,a0,-1608 # d9b8 + 783e: 388020ef jal ra,9bc6 + 7842: 0000e637 lui a2,0xe + 7846: 0b400593 li a1,180 + 784a: 8756 mv a4,s5 + 784c: 87da mv a5,s6 + 784e: 9d460613 addi a2,a2,-1580 # d9d4 + 7852: 1068 addi a0,sp,44 + 7854: 612020ef jal ra,9e66 + 7858: 4585 li a1,1 + 785a: 1068 addi a0,sp,44 + 785c: e50fa0ef jal ra,1eac + 7860: 04300793 li a5,67 + 7864: 08f49963 bne s1,a5,78f6 + 7868: 200004b7 lui s1,0x20000 + 786c: 41048493 addi s1,s1,1040 # 20000410 + 7870: 4981 li s3,0 + 7872: 4ca1 li s9,8 + 7874: 00048783 lb a5,0(s1) + 7878: c395 beqz a5,789c + 787a: 58d4 lw a3,52(s1) + 787c: c285 beqz a3,789c + 787e: 0304c703 lbu a4,48(s1) + 7882: 8626 mv a2,s1 + 7884: 85ce mv a1,s3 + 7886: a7cb8513 addi a0,s7,-1412 # da7c + 788a: 33c020ef jal ra,9bc6 + 788e: 4641 li a2,16 + 7890: 02048593 addi a1,s1,32 + 7894: 83cc0513 addi a0,s8,-1988 # d83c + 7898: b4bf80ef jal ra,3e2 + 789c: 0985 addi s3,s3,1 + 789e: 03848493 addi s1,s1,56 + 78a2: fd9999e3 bne s3,s9,7874 + 78a6: a881 j 78f6 + 78a8: 03000793 li a5,48 + 78ac: 02f49263 bne s1,a5,78d0 + 78b0: 0000b5b7 lui a1,0xb + 78b4: 0000e537 lui a0,0xe + 78b8: 0e040613 addi a2,s0,224 + 78bc: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 78c0: 9e450513 addi a0,a0,-1564 # d9e4 + 78c4: 302020ef jal ra,9bc6 + 78c8: 4501 li a0,0 + 78ca: d05f80ef jal ra,5ce + 78ce: bf49 j 7860 + 78d0: 04600793 li a5,70 + 78d4: 0af49e63 bne s1,a5,7990 + 78d8: 0000b5b7 lui a1,0xb + 78dc: 0000e537 lui a0,0xe + 78e0: 0e040613 addi a2,s0,224 + 78e4: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 78e8: a0850513 addi a0,a0,-1528 # da08 + 78ec: 2da020ef jal ra,9bc6 + 78f0: 4505 li a0,1 + 78f2: cddf80ef jal ra,5ce + 78f6: 00f10693 addi a3,sp,15 + 78fa: 00e10613 addi a2,sp,14 + 78fe: 00d10593 addi a1,sp,13 + 7902: 1068 addi a0,sp,44 + 7904: fdafa0ef jal ra,20de + 7908: cd31 beqz a0,7964 + 790a: 5656 lw a2,116(sp) + 790c: 0000e537 lui a0,0xe + 7910: 18ac addi a1,sp,120 + 7912: ab850513 addi a0,a0,-1352 # dab8 + 7916: acdf80ef jal ra,3e2 + 791a: 00f10783 lb a5,15(sp) + 791e: 00d10683 lb a3,13(sp) + 7922: 94c18713 addi a4,gp,-1716 # 2000033c + 7926: b73e sh a5,42(a4) + 7928: a376 sh a3,6(a4) + 792a: 00e10703 lb a4,14(sp) + 792e: 0000b5b7 lui a1,0xb + 7932: 0000e537 lui a0,0xe + 7936: 0e040613 addi a2,s0,224 + 793a: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 793e: ac450513 addi a0,a0,-1340 # dac4 + 7942: 284020ef jal ra,9bc6 + 7946: 1068 addi a0,sp,44 + 7948: e9cfa0ef jal ra,1fe4 + 794c: de4a4783 lbu a5,-540(s4) + 7950: c781 beqz a5,7958 + 7952: 1068 addi a0,sp,44 + 7954: db5fa0ef jal ra,2708 + 7958: 10400613 li a2,260 + 795c: 4581 li a1,0 + 795e: 1068 addi a0,sp,44 + 7960: 8c1f80ef jal ra,220 + 7964: 2ca1 jal 7bbc + 7966: 86aa mv a3,a0 + 7968: cd09 beqz a0,7982 + 796a: 0000b5b7 lui a1,0xb + 796e: 0000e537 lui a0,0xe + 7972: 0e040613 addi a2,s0,224 + 7976: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 797a: b0050513 addi a0,a0,-1280 # db00 + 797e: 248020ef jal ra,9bc6 + 7982: 001a8793 addi a5,s5,1 + 7986: 0157b733 sltu a4,a5,s5 + 798a: 9b3a add s6,s6,a4 + 798c: 8abe mv s5,a5 + 798e: bd85 j 77fe + 7990: 04e00793 li a5,78 + 7994: 00f49563 bne s1,a5,799e + 7998: a79ff0ef jal ra,7410 + 799c: bfa9 j 78f6 + 799e: 04400793 li a5,68 + 79a2: eaf49fe3 bne s1,a5,7860 + 79a6: 065010ef jal ra,920a + 79aa: 0000e637 lui a2,0xe + 79ae: d62a sw a0,44(sp) + 79b0: 8756 mv a4,s5 + 79b2: 87da mv a5,s6 + 79b4: a2c60613 addi a2,a2,-1492 # da2c + 79b8: 0b400593 li a1,180 + 79bc: 03210513 addi a0,sp,50 + 79c0: 02011823 sh zero,48(sp) + 79c4: 4a2020ef jal ra,9e66 + 79c8: 0000e537 lui a0,0xe + 79cc: a5050513 addi a0,a0,-1456 # da50 + 79d0: 1f6020ef jal ra,9bc6 + 79d4: 20000537 lui a0,0x20000 + 79d8: 106c addi a1,sp,44 + 79da: 5d050513 addi a0,a0,1488 # 200005d0 + 79de: ed2f90ef jal ra,10b0 + 79e2: bf11 j 78f6 + +000079e4 : + 79e4: 80df82ef jal t0,1f0 <__riscv_save_0> + 79e8: 82e18783 lb a5,-2002(gp) # 2000021e + 79ec: c385 beqz a5,7a0c + 79ee: 86aa mv a3,a0 + 79f0: 0000e637 lui a2,0xe + 79f4: 0000c5b7 lui a1,0xc + 79f8: 0000e537 lui a0,0xe + 79fc: bcc60613 addi a2,a2,-1076 # dbcc + 7a00: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 7a04: bd450513 addi a0,a0,-1068 # dbd4 + 7a08: 1be020ef jal ra,9bc6 + 7a0c: 0000e437 lui s0,0xe + 7a10: bf440513 addi a0,s0,-1036 # dbf4 + 7a14: 1b2020ef jal ra,9bc6 + 7a18: 4505 li a0,1 + 7a1a: 24d010ef jal ra,9466 + 7a1e: bfcd j 7a10 + +00007a20 : + 7a20: fb6f82ef jal t0,1d6 <__riscv_save_4> + 7a24: 1101 addi sp,sp,-32 + 7a26: 820187a3 sb zero,-2001(gp) # 2000021f + 7a2a: 4585 li a1,1 + 7a2c: 00420537 lui a0,0x420 + 7a30: 82018723 sb zero,-2002(gp) # 2000021e + 7a34: c002 sw zero,0(sp) + 7a36: c202 sw zero,4(sp) + 7a38: c402 sw zero,8(sp) + 7a3a: c602 sw zero,12(sp) + 7a3c: c802 sw zero,16(sp) + 7a3e: ca02 sw zero,20(sp) + 7a40: cc02 sw zero,24(sp) + 7a42: 00011e23 sh zero,28(sp) + 7a46: 6f6010ef jal ra,913c + 7a4a: 6505 lui a0,0x1 + 7a4c: 4585 li a1,1 + 7a4e: 05c50513 addi a0,a0,92 # 105c + 7a52: 6cc010ef jal ra,911e + 7a56: 40011437 lui s0,0x40011 + 7a5a: 49c1 li s3,16 + 7a5c: 4a0d li s4,3 + 7a5e: 47c1 li a5,16 + 7a60: 858a mv a1,sp + 7a62: 80040513 addi a0,s0,-2048 # 40010800 <_eusrstack+0x20008800> + 7a66: 807c sh a5,0(sp) + 7a68: c44e sw s3,8(sp) + 7a6a: c252 sw s4,4(sp) + 7a6c: 38a010ef jal ra,8df6 + 7a70: 4961 li s2,24 + 7a72: 02000793 li a5,32 + 7a76: 858a mv a1,sp + 7a78: 80040513 addi a0,s0,-2048 + 7a7c: 807c sh a5,0(sp) + 7a7e: c44a sw s2,8(sp) + 7a80: c252 sw s4,4(sp) + 7a82: 374010ef jal ra,8df6 + 7a86: 4491 li s1,4 + 7a88: 04000793 li a5,64 + 7a8c: 858a mv a1,sp + 7a8e: 80040513 addi a0,s0,-2048 + 7a92: 807c sh a5,0(sp) + 7a94: c426 sw s1,8(sp) + 7a96: 360010ef jal ra,8df6 + 7a9a: 08000793 li a5,128 + 7a9e: 858a mv a1,sp + 7aa0: 80040513 addi a0,s0,-2048 + 7aa4: 807c sh a5,0(sp) + 7aa6: 40012437 lui s0,0x40012 + 7aaa: c44a sw s2,8(sp) + 7aac: c252 sw s4,4(sp) + 7aae: 348010ef jal ra,8df6 + 7ab2: 4785 li a5,1 + 7ab4: 858a mv a1,sp + 7ab6: 80040513 addi a0,s0,-2048 # 40011800 <_eusrstack+0x20009800> + 7aba: 807c sh a5,0(sp) + 7abc: c44e sw s3,8(sp) + 7abe: 338010ef jal ra,8df6 + 7ac2: 4789 li a5,2 + 7ac4: 858a mv a1,sp + 7ac6: 80040513 addi a0,s0,-2048 + 7aca: 807c sh a5,0(sp) + 7acc: c426 sw s1,8(sp) + 7ace: 328010ef jal ra,8df6 + 7ad2: 858a mv a1,sp + 7ad4: 80040513 addi a0,s0,-2048 + 7ad8: 8064 sh s1,0(sp) + 7ada: c426 sw s1,8(sp) + 7adc: 31a010ef jal ra,8df6 + 7ae0: 47a1 li a5,8 + 7ae2: 858a mv a1,sp + 7ae4: 80040513 addi a0,s0,-2048 + 7ae8: 807c sh a5,0(sp) + 7aea: c44e sw s3,8(sp) + 7aec: 30a010ef jal ra,8df6 + 7af0: 010407b7 lui a5,0x1040 + 7af4: c63e sw a5,12(sp) + 7af6: 020007b7 lui a5,0x2000 + 7afa: ca3e sw a5,20(sp) + 7afc: 006c addi a1,sp,12 + 7afe: 479d li a5,7 + 7b00: 40013537 lui a0,0x40013 + 7b04: 86fc sh a5,28(sp) + 7b06: cc4a sw s2,24(sp) + 7b08: c802 sw zero,16(sp) + 7b0a: 009010ef jal ra,9312 + 7b0e: 4605 li a2,1 + 7b10: 80040513 addi a0,s0,-2048 + 7b14: 45a1 li a1,8 + 7b16: 3aa010ef jal ra,8ec0 + 7b1a: 4585 li a1,1 + 7b1c: 40013537 lui a0,0x40013 + 7b20: 031010ef jal ra,9350 + 7b24: 6105 addi sp,sp,32 + 7b26: ee4f806f j 20a <__riscv_restore_4> + +00007b2a : + 7b2a: eacf82ef jal t0,1d6 <__riscv_save_4> + 7b2e: 84aa mv s1,a0 + 7b30: 40011537 lui a0,0x40011 + 7b34: 892e mv s2,a1 + 7b36: 8a32 mv s4,a2 + 7b38: 45c1 li a1,16 + 7b3a: 4601 li a2,0 + 7b3c: 80050513 addi a0,a0,-2048 # 40010800 <_eusrstack+0x20008800> + 7b40: 380010ef jal ra,8ec0 + 7b44: 4401 li s0,0 + 7b46: 01441c63 bne s0,s4,7b5e + 7b4a: 40011537 lui a0,0x40011 + 7b4e: 4605 li a2,1 + 7b50: 45c1 li a1,16 + 7b52: 80050513 addi a0,a0,-2048 # 40010800 <_eusrstack+0x20008800> + 7b56: 36a010ef jal ra,8ec0 + 7b5a: eb0f806f j 20a <__riscv_restore_4> + 7b5e: 0ff00993 li s3,255 + 7b62: 00090663 beqz s2,7b6e + 7b66: 008907b3 add a5,s2,s0 + 7b6a: 0007c983 lbu s3,0(a5) # 2000000 <_data_lma+0x1ff1da4> + 7b6e: 4589 li a1,2 + 7b70: 40013537 lui a0,0x40013 + 7b74: 7fe010ef jal ra,9372 + 7b78: d97d beqz a0,7b6e + 7b7a: 85ce mv a1,s3 + 7b7c: 40013537 lui a0,0x40013 + 7b80: 7ea010ef jal ra,936a + 7b84: 4585 li a1,1 + 7b86: 40013537 lui a0,0x40013 + 7b8a: 7e8010ef jal ra,9372 + 7b8e: d97d beqz a0,7b84 + 7b90: 40013537 lui a0,0x40013 + 7b94: 7da010ef jal ra,936e + 7b98: c481 beqz s1,7ba0 + 7b9a: 008487b3 add a5,s1,s0 + 7b9e: a388 sb a0,0(a5) + 7ba0: 0405 addi s0,s0,1 + 7ba2: b755 j 7b46 + +00007ba4 : + 7ba4: e4cf82ef jal t0,1f0 <__riscv_save_0> + 7ba8: 862e mv a2,a1 + 7baa: 85aa mv a1,a0 + 7bac: 4501 li a0,0 + 7bae: f7dff0ef jal ra,7b2a + 7bb2: e62f806f j 214 <__riscv_restore_0> + +00007bb6 : + 7bb6: 82a18723 sb a0,-2002(gp) # 2000021e + 7bba: 8082 ret + +00007bbc : + 7bbc: 8301a503 lw a0,-2000(gp) # 20000220 + 7bc0: 8082 ret + +00007bc2 : + 7bc2: e14f82ef jal t0,1d6 <__riscv_save_4> + 7bc6: 84aa mv s1,a0 + 7bc8: 400129b7 lui s3,0x40012 + 7bcc: 4505 li a0,1 + 7bce: 8a2e mv s4,a1 + 7bd0: 8432 mv s0,a2 + 7bd2: 4901 li s2,0 + 7bd4: 093010ef jal ra,9466 + 7bd8: 80098993 addi s3,s3,-2048 # 40011800 <_eusrstack+0x20009800> + 7bdc: 00990763 beq s2,s1,7bea + 7be0: 4589 li a1,2 + 7be2: 854e mv a0,s3 + 7be4: 2d2010ef jal ra,8eb6 + 7be8: ed09 bnez a0,7c02 + 7bea: 40012537 lui a0,0x40012 + 7bee: 4589 li a1,2 + 7bf0: 80050513 addi a0,a0,-2048 # 40011800 <_eusrstack+0x20009800> + 7bf4: 2c2010ef jal ra,8eb6 + 7bf8: e911 bnez a0,7c0c + 7bfa: 4405 li s0,1 + 7bfc: 8522 mv a0,s0 + 7bfe: e0cf806f j 20a <__riscv_restore_4> + 7c02: 4529 li a0,10 + 7c04: 063010ef jal ra,9466 + 7c08: 0905 addi s2,s2,1 + 7c0a: bfc9 j 7bdc + 7c0c: 0000e637 lui a2,0xe + 7c10: 0000e537 lui a0,0xe + 7c14: 8726 mv a4,s1 + 7c16: 86d2 mv a3,s4 + 7c18: bcc60613 addi a2,a2,-1076 # dbcc + 7c1c: cc01 beqz s0,7c34 + 7c1e: 0000c5b7 lui a1,0xc + 7c22: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 7c26: e2c50513 addi a0,a0,-468 # de2c + 7c2a: 79d010ef jal ra,9bc6 + 7c2e: 4551 li a0,20 + 7c30: db5ff0ef jal ra,79e4 + 7c34: 0000b5b7 lui a1,0xb + 7c38: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 7c3c: e2c50513 addi a0,a0,-468 + 7c40: 787010ef jal ra,9bc6 + 7c44: bf65 j 7bfc + +00007c46 : + 7c46: daaf82ef jal t0,1f0 <__riscv_save_0> + 7c4a: 4529 li a0,10 + 7c4c: 01b010ef jal ra,9466 + 7c50: 40012437 lui s0,0x40012 + 7c54: 4601 li a2,0 + 7c56: 45a1 li a1,8 + 7c58: 80040513 addi a0,s0,-2048 # 40011800 <_eusrstack+0x20009800> + 7c5c: 264010ef jal ra,8ec0 + 7c60: 4551 li a0,20 + 7c62: 005010ef jal ra,9466 + 7c66: 80040513 addi a0,s0,-2048 + 7c6a: 4605 li a2,1 + 7c6c: 45a1 li a1,8 + 7c6e: 252010ef jal ra,8ec0 + 7c72: 0000e637 lui a2,0xe + 7c76: 0000b5b7 lui a1,0xb + 7c7a: 0000e537 lui a0,0xe + 7c7e: bcc60613 addi a2,a2,-1076 # dbcc + 7c82: 49458593 addi a1,a1,1172 # b494 <_exit+0x3c> + 7c86: ce050513 addi a0,a0,-800 # dce0 + 7c8a: 73d010ef jal ra,9bc6 + 7c8e: 4529 li a0,10 + 7c90: 7d6010ef jal ra,9466 + 7c94: 0000e5b7 lui a1,0xe + 7c98: 6505 lui a0,0x1 + 7c9a: 4605 li a2,1 + 7c9c: cfc58593 addi a1,a1,-772 # dcfc + 7ca0: 38850513 addi a0,a0,904 # 1388 + 7ca4: f1fff0ef jal ra,7bc2 + 7ca8: d6cf806f j 214 <__riscv_restore_0> + +00007cac : + 7cac: d1cf82ef jal t0,1c8 <__riscv_save_10> + 7cb0: 6485 lui s1,0x1 + 7cb2: 8b2e mv s6,a1 + 7cb4: 4401 li s0,0 + 7cb6: 4901 li s2,0 + 7cb8: 38848493 addi s1,s1,904 # 1388 + 7cbc: 4b85 li s7,1 + 7cbe: 0000eab7 lui s5,0xe + 7cc2: 0000ba37 lui s4,0xb + 7cc6: 0000e9b7 lui s3,0xe + 7cca: 4c25 li s8,9 + 7ccc: 864a mv a2,s2 + 7cce: 85da mv a1,s6 + 7cd0: 8526 mv a0,s1 + 7cd2: ef1ff0ef jal ra,7bc2 + 7cd6: 03750263 beq a0,s7,7cfa + 7cda: 86a2 mv a3,s0 + 7cdc: bcca8613 addi a2,s5,-1076 # dbcc + 7ce0: 494a0593 addi a1,s4,1172 # b494 <_exit+0x3c> + 7ce4: e6098513 addi a0,s3,-416 # de60 + 7ce8: 6df010ef jal ra,9bc6 + 7cec: 4529 li a0,10 + 7cee: 778010ef jal ra,9466 + 7cf2: 0405 addi s0,s0,1 + 7cf4: 47a9 li a5,10 + 7cf6: 00f41463 bne s0,a5,7cfe + 7cfa: d06f806f j 200 <__riscv_restore_10> + 7cfe: fd8417e3 bne s0,s8,7ccc + 7d02: 4905 li s2,1 + 7d04: b7e1 j 7ccc + +00007d06 : + 7d06: cc2f82ef jal t0,1c8 <__riscv_save_10> + 7d0a: 89aa mv s3,a0 + 7d0c: 8a2e mv s4,a1 + 7d0e: 6505 lui a0,0x1 + 7d10: 0000e5b7 lui a1,0xe + 7d14: 1141 addi sp,sp,-16 + 7d16: 8ab2 mv s5,a2 + 7d18: f4458593 addi a1,a1,-188 # df44 + 7d1c: 4605 li a2,1 + 7d1e: 38850513 addi a0,a0,904 # 1388 + 7d22: ea1ff0ef jal ra,7bc2 + 7d26: 82e18783 lb a5,-2002(gp) # 2000021e + 7d2a: e3a1 bnez a5,7d6a + 7d2c: 47b5 li a5,13 + 7d2e: 8656 mv a2,s5 + 7d30: 805c sb a5,0(sp) + 7d32: 85d2 mv a1,s4 + 7d34: 0089d793 srli a5,s3,0x8 + 7d38: 00310513 addi a0,sp,3 + 7d3c: 80dc sb a5,1(sp) + 7d3e: 01310123 sb s3,2(sp) + 7d42: 411010ef jal ra,9952 + 7d46: 003a8593 addi a1,s5,3 + 7d4a: 850a mv a0,sp + 7d4c: e59ff0ef jal ra,7ba4 + 7d50: 0000e5b7 lui a1,0xe + 7d54: 6505 lui a0,0x1 + 7d56: 4601 li a2,0 + 7d58: f5858593 addi a1,a1,-168 # df58 + 7d5c: 38850513 addi a0,a0,904 # 1388 + 7d60: e63ff0ef jal ra,7bc2 + 7d64: 0141 addi sp,sp,16 + 7d66: c9af806f j 200 <__riscv_restore_10> + 7d6a: 0000e4b7 lui s1,0xe + 7d6e: 0000b937 lui s2,0xb + 7d72: 0000e537 lui a0,0xe + 7d76: 86ce mv a3,s3 + 7d78: bcc48613 addi a2,s1,-1076 # dbcc + 7d7c: 4ec90593 addi a1,s2,1260 # b4ec <_exit+0x94> + 7d80: f6c50513 addi a0,a0,-148 # df6c + 7d84: 643010ef jal ra,9bc6 + 7d88: 8452 mv s0,s4 + 7d8a: 014a8b33 add s6,s5,s4 + 7d8e: 0000ebb7 lui s7,0xe + 7d92: f9640de3 beq s0,s6,7d2c + 7d96: 2014 lbu a3,0(s0) + 7d98: bcc48613 addi a2,s1,-1076 + 7d9c: 4ec90593 addi a1,s2,1260 + 7da0: f94b8513 addi a0,s7,-108 # df94 + 7da4: 623010ef jal ra,9bc6 + 7da8: 0405 addi s0,s0,1 + 7daa: b7e5 j 7d92 + +00007dac : + 7dac: c2af82ef jal t0,1d6 <__riscv_save_4> + 7db0: 89aa mv s3,a0 + 7db2: 842e mv s0,a1 + 7db4: 6505 lui a0,0x1 + 7db6: 0000e5b7 lui a1,0xe + 7dba: 1101 addi sp,sp,-32 + 7dbc: 84b2 mv s1,a2 + 7dbe: c4858593 addi a1,a1,-952 # dc48 + 7dc2: 4605 li a2,1 + 7dc4: 38850513 addi a0,a0,904 # 1388 + 7dc8: dfbff0ef jal ra,7bc2 + 7dcc: 82e18783 lb a5,-2002(gp) # 2000021e + 7dd0: 0000ea37 lui s4,0xe + 7dd4: 82e18913 addi s2,gp,-2002 # 2000021e + 7dd8: 0000bab7 lui s5,0xb + 7ddc: cf81 beqz a5,7df4 + 7dde: 0000e537 lui a0,0xe + 7de2: 86ce mv a3,s3 + 7de4: bcca0613 addi a2,s4,-1076 # dbcc + 7de8: 4eca8593 addi a1,s5,1260 # b4ec <_exit+0x94> + 7dec: c5c50513 addi a0,a0,-932 # dc5c + 7df0: 5d7010ef jal ra,9bc6 + 7df4: 4639 li a2,14 + 7df6: 4581 li a1,0 + 7df8: 00210513 addi a0,sp,2 + 7dfc: c24f80ef jal ra,220 + 7e00: 47f5 li a5,29 + 7e02: 805c sb a5,0(sp) + 7e04: 0089d793 srli a5,s3,0x8 + 7e08: 80dc sb a5,1(sp) + 7e0a: 00090783 lb a5,0(s2) + 7e0e: c802 sw zero,16(sp) + 7e10: ca02 sw zero,20(sp) + 7e12: cc02 sw zero,24(sp) + 7e14: ce02 sw zero,28(sp) + 7e16: 01310123 sb s3,2(sp) + 7e1a: cb99 beqz a5,7e30 + 7e1c: 0000e537 lui a0,0xe + 7e20: bcca0613 addi a2,s4,-1076 + 7e24: 4eca8593 addi a1,s5,1260 + 7e28: c8050513 addi a0,a0,-896 # dc80 + 7e2c: 59b010ef jal ra,9bc6 + 7e30: 00448613 addi a2,s1,4 + 7e34: 858a mv a1,sp + 7e36: 0808 addi a0,sp,16 + 7e38: cf3ff0ef jal ra,7b2a + 7e3c: 0000e537 lui a0,0xe + 7e40: bcca0613 addi a2,s4,-1076 + 7e44: 4eca8593 addi a1,s5,1260 + 7e48: c9c50513 addi a0,a0,-868 # dc9c + 7e4c: 57b010ef jal ra,9bc6 + 7e50: 8626 mv a2,s1 + 7e52: 084c addi a1,sp,20 + 7e54: 8522 mv a0,s0 + 7e56: 2fd010ef jal ra,9952 + 7e5a: 00090783 lb a5,0(s2) + 7e5e: c791 beqz a5,7e6a + 7e60: 94a2 add s1,s1,s0 + 7e62: 0000e937 lui s2,0xe + 7e66: 00941f63 bne s0,s1,7e84 + 7e6a: 0000e5b7 lui a1,0xe + 7e6e: 6505 lui a0,0x1 + 7e70: 4601 li a2,0 + 7e72: cb458593 addi a1,a1,-844 # dcb4 + 7e76: 38850513 addi a0,a0,904 # 1388 + 7e7a: d49ff0ef jal ra,7bc2 + 7e7e: 6105 addi sp,sp,32 + 7e80: b8af806f j 20a <__riscv_restore_4> + 7e84: 2014 lbu a3,0(s0) + 7e86: bcca0613 addi a2,s4,-1076 + 7e8a: 4eca8593 addi a1,s5,1260 + 7e8e: cc890513 addi a0,s2,-824 # dcc8 + 7e92: 535010ef jal ra,9bc6 + 7e96: 0405 addi s0,s0,1 + 7e98: b7f9 j 7e66 + +00007e9a : + 7e9a: b56f82ef jal t0,1f0 <__riscv_save_0> + 7e9e: 1141 addi sp,sp,-16 + 7ea0: 842a mv s0,a0 + 7ea2: 4605 li a2,1 + 7ea4: 00f10593 addi a1,sp,15 + 7ea8: 73600513 li a0,1846 + 7eac: 000107a3 sb zero,15(sp) + 7eb0: efdff0ef jal ra,7dac + 7eb4: 8798 lbu a4,15(sp) + 7eb6: 4685 li a3,1 + 7eb8: 0fb77793 andi a5,a4,251 + 7ebc: 00d40463 beq s0,a3,7ec4 + 7ec0: 00476793 ori a5,a4,4 + 7ec4: 00f10593 addi a1,sp,15 + 7ec8: 4605 li a2,1 + 7eca: 73600513 li a0,1846 + 7ece: 87dc sb a5,15(sp) + 7ed0: e37ff0ef jal ra,7d06 + 7ed4: 0141 addi sp,sp,16 + 7ed6: b3ef806f j 214 <__riscv_restore_0> + +00007eda : + 7eda: b16f82ef jal t0,1f0 <__riscv_save_0> + 7ede: 84aa mv s1,a0 + 7ee0: 892e mv s2,a1 + 7ee2: 6505 lui a0,0x1 + 7ee4: 0000e5b7 lui a1,0xe + 7ee8: 1141 addi sp,sp,-16 + 7eea: 8432 mv s0,a2 + 7eec: ef858593 addi a1,a1,-264 # def8 + 7ef0: 4605 li a2,1 + 7ef2: 38850513 addi a0,a0,904 # 1388 + 7ef6: ccdff0ef jal ra,7bc2 + 7efa: 82e18783 lb a5,-2002(gp) # 2000021e + 7efe: c385 beqz a5,7f1e + 7f00: 0000e637 lui a2,0xe + 7f04: 0000b5b7 lui a1,0xb + 7f08: 0000e537 lui a0,0xe + 7f0c: 86a6 mv a3,s1 + 7f0e: bcc60613 addi a2,a2,-1076 # dbcc + 7f12: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 7f16: f0c50513 addi a0,a0,-244 # df0c + 7f1a: 4ad010ef jal ra,9bc6 + 7f1e: 8622 mv a2,s0 + 7f20: 85ca mv a1,s2 + 7f22: 00110513 addi a0,sp,1 + 7f26: 8044 sb s1,0(sp) + 7f28: 22b010ef jal ra,9952 + 7f2c: 858a mv a1,sp + 7f2e: 00140613 addi a2,s0,1 + 7f32: 852e mv a0,a1 + 7f34: bf7ff0ef jal ra,7b2a + 7f38: 8088 lbu a0,1(sp) + 7f3a: 47a9 li a5,10 + 7f3c: 00e57413 andi s0,a0,14 + 7f40: 0287ee63 bltu a5,s0,7f7c + 7f44: 4785 li a5,1 + 7f46: 008797b3 sll a5,a5,s0 + 7f4a: 5407f713 andi a4,a5,1344 + 7f4e: eb09 bnez a4,7f60 + 7f50: 0817f513 andi a0,a5,129 + 7f54: 00a03533 snez a0,a0 + 7f58: 40a00533 neg a0,a0 + 7f5c: 0ff57413 andi s0,a0,255 + 7f60: 0000e5b7 lui a1,0xe + 7f64: 6505 lui a0,0x1 + 7f66: 4601 li a2,0 + 7f68: f3058593 addi a1,a1,-208 # df30 + 7f6c: 38850513 addi a0,a0,904 # 1388 + 7f70: c53ff0ef jal ra,7bc2 + 7f74: 8522 mv a0,s0 + 7f76: 0141 addi sp,sp,16 + 7f78: a9cf806f j 214 <__riscv_restore_0> + 7f7c: 4401 li s0,0 + 7f7e: b7cd j 7f60 + +00007f80 : + 7f80: a40f82ef jal t0,1c0 <__riscv_save_12> + 7f84: 8b2a mv s6,a0 + 7f86: 8bae mv s7,a1 + 7f88: 8c32 mv s8,a2 + 7f8a: 4485 li s1,1 + 7f8c: 0000e937 lui s2,0xe + 7f90: 0000bd37 lui s10,0xb + 7f94: 0000edb7 lui s11,0xe + 7f98: 0000bab7 lui s5,0xb + 7f9c: 0000ea37 lui s4,0xe + 7fa0: 49a9 li s3,10 + 7fa2: 8662 mv a2,s8 + 7fa4: 85de mv a1,s7 + 7fa6: 855a mv a0,s6 + 7fa8: f33ff0ef jal ra,7eda + 7fac: 82e18783 lb a5,-2002(gp) # 2000021e + 7fb0: 842a mv s0,a0 + 7fb2: cb91 beqz a5,7fc6 + 7fb4: 86aa mv a3,a0 + 7fb6: bcc90613 addi a2,s2,-1076 # dbcc + 7fba: 660d0593 addi a1,s10,1632 # b660 <_exit+0x208> + 7fbe: e88d8513 addi a0,s11,-376 # de88 + 7fc2: 405010ef jal ra,9bc6 + 7fc6: cc15 beqz s0,8002 + 7fc8: 8726 mv a4,s1 + 7fca: 86a2 mv a3,s0 + 7fcc: bcc90613 addi a2,s2,-1076 + 7fd0: 494a8593 addi a1,s5,1172 # b494 <_exit+0x3c> + 7fd4: ea0a0513 addi a0,s4,-352 # dea0 + 7fd8: 0485 addi s1,s1,1 + 7fda: 3ed010ef jal ra,9bc6 + 7fde: fd3492e3 bne s1,s3,7fa2 + 7fe2: 0000c5b7 lui a1,0xc + 7fe6: 0000e537 lui a0,0xe + 7fea: 86a2 mv a3,s0 + 7fec: bcc90613 addi a2,s2,-1076 + 7ff0: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 7ff4: ed050513 addi a0,a0,-304 # ded0 + 7ff8: 3cf010ef jal ra,9bc6 + 7ffc: 4555 li a0,21 + 7ffe: 9e7ff0ef jal ra,79e4 + 8002: 9faf806f j 1fc <__riscv_restore_12> + +00008006 : + 8006: 9eaf82ef jal t0,1f0 <__riscv_save_0> + 800a: 1141 addi sp,sp,-16 + 800c: 87c8 sb a0,15(sp) + 800e: 00f10593 addi a1,sp,15 + 8012: 4605 li a2,1 + 8014: 08000513 li a0,128 + 8018: f69ff0ef jal ra,7f80 + 801c: 0141 addi sp,sp,16 + 801e: 9f6f806f j 214 <__riscv_restore_0> + +00008022 : + 8022: 9cef82ef jal t0,1f0 <__riscv_save_0> + 8026: 67200713 li a4,1650 + 802a: 1141 addi sp,sp,-16 + 802c: 4781 li a5,0 + 802e: 04e50263 beq a0,a4,8072 + 8032: 6d600713 li a4,1750 + 8036: 4785 li a5,1 + 8038: 02e50d63 beq a0,a4,8072 + 803c: 73a00713 li a4,1850 + 8040: 4789 li a5,2 + 8042: 02e50863 beq a0,a4,8072 + 8046: 6705 lui a4,0x1 + 8048: 8fc70693 addi a3,a4,-1796 # 8fc <__stack_size+0xfc> + 804c: 478d li a5,3 + 804e: 02d50263 beq a0,a3,8072 + 8052: 9c470693 addi a3,a4,-1596 + 8056: 4791 li a5,4 + 8058: 00d50d63 beq a0,a3,8072 + 805c: b2270693 addi a3,a4,-1246 + 8060: 4795 li a5,5 + 8062: 00d50863 beq a0,a3,8072 + 8066: c1c70713 addi a4,a4,-996 + 806a: 479d li a5,7 + 806c: 00e51363 bne a0,a4,8072 + 8070: 4799 li a5,6 + 8072: 865c sb a5,12(sp) + 8074: 3e800793 li a5,1000 + 8078: 02f585b3 mul a1,a1,a5 + 807c: 6791 lui a5,0x4 + 807e: d0978793 addi a5,a5,-759 # 3d09 + 8082: 4611 li a2,4 + 8084: 09700513 li a0,151 + 8088: 02f5d5b3 divu a1,a1,a5 + 808c: 0105d793 srli a5,a1,0x10 + 8090: 86dc sb a5,13(sp) + 8092: 00859793 slli a5,a1,0x8 + 8096: 05c2 slli a1,a1,0x10 + 8098: 81c1 srli a1,a1,0x10 + 809a: 81a1 srli a1,a1,0x8 + 809c: 8ddd or a1,a1,a5 + 809e: 876c sh a1,14(sp) + 80a0: 006c addi a1,sp,12 + 80a2: edfff0ef jal ra,7f80 + 80a6: 0141 addi sp,sp,16 + 80a8: 96cf806f j 214 <__riscv_restore_0> + +000080ac : + 80ac: 944f82ef jal t0,1f0 <__riscv_save_0> + 80b0: 1141 addi sp,sp,-16 + 80b2: 87c8 sb a0,15(sp) + 80b4: 00f10593 addi a1,sp,15 + 80b8: 4605 li a2,1 + 80ba: 08900513 li a0,137 + 80be: ec3ff0ef jal ra,7f80 + 80c2: 0141 addi sp,sp,16 + 80c4: 950f806f j 214 <__riscv_restore_0> + +000080c8 : + 80c8: 928f82ef jal t0,1f0 <__riscv_save_0> + 80cc: 1141 addi sp,sp,-16 + 80ce: 87c8 sb a0,15(sp) + 80d0: 00f10593 addi a1,sp,15 + 80d4: 4605 li a2,1 + 80d6: 09d00513 li a0,157 + 80da: ea7ff0ef jal ra,7f80 + 80de: 0141 addi sp,sp,16 + 80e0: 934f806f j 214 <__riscv_restore_0> + +000080e4 : + 80e4: 90cf82ef jal t0,1f0 <__riscv_save_0> + 80e8: 35a4f7b7 lui a5,0x35a4f + 80ec: 90078793 addi a5,a5,-1792 # 35a4e900 <_eusrstack+0x15a46900> + 80f0: 1141 addi sp,sp,-16 + 80f2: 00a7ff63 bgeu a5,a0,8110 + 80f6: 77fd lui a5,0xfffff + 80f8: 9e178793 addi a5,a5,-1567 # ffffe9e1 <_eusrstack+0xdfff69e1> + 80fc: 867c sh a5,12(sp) + 80fe: 006c addi a1,sp,12 + 8100: 4609 li a2,2 + 8102: 09800513 li a0,152 + 8106: e7bff0ef jal ra,7f80 + 810a: 0141 addi sp,sp,16 + 810c: 908f806f j 214 <__riscv_restore_0> + 8110: 32aa07b7 lui a5,0x32aa0 + 8114: 88078793 addi a5,a5,-1920 # 32a9f880 <_eusrstack+0x12a97880> + 8118: 00a7f663 bgeu a5,a0,8124 + 811c: 77f9 lui a5,0xffffe + 811e: bd778793 addi a5,a5,-1065 # ffffdbd7 <_eusrstack+0xdfff5bd7> + 8122: bfe9 j 80fc + 8124: 2de547b7 lui a5,0x2de54 + 8128: 48078793 addi a5,a5,1152 # 2de54480 <_eusrstack+0xde4c480> + 812c: 00a7f663 bgeu a5,a0,8138 + 8130: 77f1 lui a5,0xffffc + 8132: 5c178793 addi a5,a5,1473 # ffffc5c1 <_eusrstack+0xdfff45c1> + 8136: b7d9 j 80fc + 8138: 1b6b17b7 lui a5,0x1b6b1 + 813c: b0078793 addi a5,a5,-1280 # 1b6b0b00 <_data_lma+0x1b6a28a4> + 8140: 00a7f663 bgeu a5,a0,814c + 8144: 77e1 lui a5,0xffff8 + 8146: 17578793 addi a5,a5,373 # ffff8175 <_eusrstack+0xdfff0175> + 814a: bf4d j 80fc + 814c: 195507b7 lui a5,0x19550 + 8150: c4078793 addi a5,a5,-960 # 1954fc40 <_data_lma+0x195419e4> + 8154: faa7f5e3 bgeu a5,a0,80fe + 8158: 679d lui a5,0x7 + 815a: f6b78793 addi a5,a5,-149 # 6f6b + 815e: bf79 j 80fc + +00008160 : + 8160: 890f82ef jal t0,1f0 <__riscv_save_0> + 8164: 1141 addi sp,sp,-16 + 8166: 842a mv s0,a0 + 8168: f7dff0ef jal ra,80e4 + 816c: 01e85637 lui a2,0x1e85 + 8170: 4681 li a3,0 + 8172: 80060613 addi a2,a2,-2048 # 1e84800 <_data_lma+0x1e765a4> + 8176: 01941513 slli a0,s0,0x19 + 817a: 00745593 srli a1,s0,0x7 + 817e: 3ae010ef jal ra,952c <__udivdi3> + 8182: 01855793 srli a5,a0,0x18 + 8186: 865c sb a5,12(sp) + 8188: 01055793 srli a5,a0,0x10 + 818c: 86dc sb a5,13(sp) + 818e: 00851793 slli a5,a0,0x8 + 8192: 0542 slli a0,a0,0x10 + 8194: 8141 srli a0,a0,0x10 + 8196: 8121 srli a0,a0,0x8 + 8198: 8d5d or a0,a0,a5 + 819a: 8768 sh a0,14(sp) + 819c: 006c addi a1,sp,12 + 819e: 4611 li a2,4 + 81a0: 08600513 li a0,134 + 81a4: dddff0ef jal ra,7f80 + 81a8: 0141 addi sp,sp,16 + 81aa: 86af806f j 214 <__riscv_restore_0> + +000081ae : + 81ae: 842f82ef jal t0,1f0 <__riscv_save_0> + 81b2: 1141 addi sp,sp,-16 + 81b4: 87c8 sb a0,15(sp) + 81b6: 00f10593 addi a1,sp,15 + 81ba: 4605 li a2,1 + 81bc: 09600513 li a0,150 + 81c0: dc1ff0ef jal ra,7f80 + 81c4: 0141 addi sp,sp,16 + 81c6: 84ef806f j 214 <__riscv_restore_0> + +000081ca : + 81ca: 826f82ef jal t0,1f0 <__riscv_save_0> + 81ce: 1141 addi sp,sp,-16 + 81d0: 8648 sb a0,12(sp) + 81d2: 86cc sb a1,13(sp) + 81d4: 4609 li a2,2 + 81d6: 006c addi a1,sp,12 + 81d8: 08f00513 li a0,143 + 81dc: da5ff0ef jal ra,7f80 + 81e0: 0141 addi sp,sp,16 + 81e2: 832f806f j 214 <__riscv_restore_0> + +000081e6 : + 81e6: 80af82ef jal t0,1f0 <__riscv_save_0> + 81ea: 5775 li a4,-3 + 81ec: 1141 addi sp,sp,-16 + 81ee: 57f5 li a5,-3 + 81f0: 00e54363 blt a0,a4,81f6 + 81f4: 87aa mv a5,a0 + 81f6: 01879693 slli a3,a5,0x18 + 81fa: 86e1 srai a3,a3,0x18 + 81fc: 4759 li a4,22 + 81fe: 00d75363 bge a4,a3,8204 + 8202: 47d9 li a5,22 + 8204: 86cc sb a1,13(sp) + 8206: 4609 li a2,2 + 8208: 006c addi a1,sp,12 + 820a: 08e00513 li a0,142 + 820e: 865c sb a5,12(sp) + 8210: d71ff0ef jal ra,7f80 + 8214: 0141 addi sp,sp,16 + 8216: ffff706f j 214 <__riscv_restore_0> + +0000821a : + 821a: fd7f72ef jal t0,1f0 <__riscv_save_0> + 821e: 1141 addi sp,sp,-16 + 8220: 8648 sb a0,12(sp) + 8222: 86cc sb a1,13(sp) + 8224: 8750 sb a2,14(sp) + 8226: 006c addi a1,sp,12 + 8228: 4611 li a2,4 + 822a: 09500513 li a0,149 + 822e: 87d4 sb a3,15(sp) + 8230: d51ff0ef jal ra,7f80 + 8234: 0141 addi sp,sp,16 + 8236: fdff706f j 214 <__riscv_restore_0> + +0000823a : + 823a: f8ff72ef jal t0,1c8 <__riscv_save_10> + 823e: 57f5 li a5,-3 + 8240: 8b2a mv s6,a0 + 8242: 1141 addi sp,sp,-16 + 8244: 8ab2 mv s5,a2 + 8246: 8a36 mv s4,a3 + 8248: 5575 li a0,-3 + 824a: 00f5c363 blt a1,a5,8250 + 824e: 852e mv a0,a1 + 8250: 01851713 slli a4,a0,0x18 + 8254: 8761 srai a4,a4,0x18 + 8256: 47d9 li a5,22 + 8258: 00e7d363 bge a5,a4,825e + 825c: 4559 li a0,22 + 825e: 01851493 slli s1,a0,0x18 + 8262: 9e5ff0ef jal ra,7c46 + 8266: 4609 li a2,2 + 8268: 006c addi a1,sp,12 + 826a: 74000513 li a0,1856 + 826e: b3fff0ef jal ra,7dac + 8272: 8600 lbu s0,12(sp) + 8274: 869c lbu a5,13(sp) + 8276: 0000e9b7 lui s3,0xe + 827a: 0422 slli s0,s0,0x8 + 827c: 943e add s0,s0,a5 + 827e: 0442 slli s0,s0,0x10 + 8280: 8041 srli s0,s0,0x10 + 8282: 0000b937 lui s2,0xb + 8286: 0000e537 lui a0,0xe + 828a: 86a2 mv a3,s0 + 828c: bcc98613 addi a2,s3,-1076 # dbcc + 8290: 4ec90593 addi a1,s2,1260 # b4ec <_exit+0x94> + 8294: b1c50513 addi a0,a0,-1252 # db1c + 8298: 12f010ef jal ra,9bc6 + 829c: 6789 lui a5,0x2 + 829e: 4b478793 addi a5,a5,1204 # 24b4 + 82a2: 84e1 srai s1,s1,0x18 + 82a4: 8bce mv s7,s3 + 82a6: 02f40763 beq s0,a5,82d4 + 82aa: 6785 lui a5,0x1 + 82ac: 42478793 addi a5,a5,1060 # 1424 + 82b0: 02f40263 beq s0,a5,82d4 + 82b4: 0000c5b7 lui a1,0xc + 82b8: 0000e537 lui a0,0xe + 82bc: bcc98613 addi a2,s3,-1076 + 82c0: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 82c4: b3850513 addi a0,a0,-1224 # db38 + 82c8: 0ff010ef jal ra,9bc6 + 82cc: 4541 li a0,16 + 82ce: 0141 addi sp,sp,16 + 82d0: f31f706f j 200 <__riscv_restore_10> + 82d4: 0000e537 lui a0,0xe + 82d8: bccb8613 addi a2,s7,-1076 + 82dc: 4ec90593 addi a1,s2,1260 + 82e0: b6c50513 addi a0,a0,-1172 # db6c + 82e4: 0e3010ef jal ra,9bc6 + 82e8: 4501 li a0,0 + 82ea: d1dff0ef jal ra,8006 + 82ee: 4505 li a0,1 + 82f0: dd9ff0ef jal ra,80c8 + 82f4: 000a8863 beqz s5,8304 + 82f8: 6585 lui a1,0x1 + 82fa: 38858593 addi a1,a1,904 # 1388 + 82fe: 8556 mv a0,s5 + 8300: d23ff0ef jal ra,8022 + 8304: 07f00513 li a0,127 + 8308: da5ff0ef jal ra,80ac + 830c: 0000e537 lui a0,0xe + 8310: 86d2 mv a3,s4 + 8312: bccb8613 addi a2,s7,-1076 + 8316: 4ec90593 addi a1,s2,1260 + 831a: b8850513 addi a0,a0,-1144 # db88 + 831e: 0a9010ef jal ra,9bc6 + 8322: 4501 li a0,0 + 8324: 000a1363 bnez s4,832a + 8328: 4505 li a0,1 + 832a: e85ff0ef jal ra,81ae + 832e: 4581 li a1,0 + 8330: 4501 li a0,0 + 8332: e99ff0ef jal ra,81ca + 8336: 4685 li a3,1 + 8338: 4601 li a2,0 + 833a: 459d li a1,7 + 833c: 4511 li a0,4 + 833e: eddff0ef jal ra,821a + 8342: 6505 lui a0,0x1 + 8344: 47e1 li a5,24 + 8346: 4605 li a2,1 + 8348: 00b10593 addi a1,sp,11 + 834c: 8e750513 addi a0,a0,-1817 # 8e7 <__stack_size+0xe7> + 8350: 85dc sb a5,11(sp) + 8352: 9b5ff0ef jal ra,7d06 + 8356: 4591 li a1,4 + 8358: 8526 mv a0,s1 + 835a: e8dff0ef jal ra,81e6 + 835e: 855a mv a0,s6 + 8360: e01ff0ef jal ra,8160 + 8364: 4501 li a0,0 + 8366: b7a5 j 82ce + +00008368 : + 8368: e89f72ef jal t0,1f0 <__riscv_save_0> + 836c: 00851793 slli a5,a0,0x8 + 8370: 8121 srli a0,a0,0x8 + 8372: 8d5d or a0,a0,a5 + 8374: 00859793 slli a5,a1,0x8 + 8378: 81a1 srli a1,a1,0x8 + 837a: 8ddd or a1,a1,a5 + 837c: 00861793 slli a5,a2,0x8 + 8380: 8221 srli a2,a2,0x8 + 8382: 1141 addi sp,sp,-16 + 8384: 8e5d or a2,a2,a5 + 8386: 00869793 slli a5,a3,0x8 + 838a: 82a1 srli a3,a3,0x8 + 838c: 8468 sh a0,8(sp) + 838e: 856c sh a1,10(sp) + 8390: 8670 sh a2,12(sp) + 8392: 8edd or a3,a3,a5 + 8394: 002c addi a1,sp,8 + 8396: 4621 li a2,8 + 8398: 4521 li a0,8 + 839a: 8774 sh a3,14(sp) + 839c: be5ff0ef jal ra,7f80 + 83a0: 0141 addi sp,sp,16 + 83a2: e73f706f j 214 <__riscv_restore_0> + +000083a6 : + 83a6: e4bf72ef jal t0,1f0 <__riscv_save_0> + 83aa: 842a mv s0,a0 + 83ac: 86aa mv a3,a0 + 83ae: 0000e637 lui a2,0xe + 83b2: 0000b5b7 lui a1,0xb + 83b6: 0000e537 lui a0,0xe + 83ba: 1141 addi sp,sp,-16 + 83bc: bcc60613 addi a2,a2,-1076 # dbcc + 83c0: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 83c4: d4850513 addi a0,a0,-696 # dd48 + 83c8: 7fe010ef jal ra,9bc6 + 83cc: ec09 bnez s0,83e6 + 83ce: 000107a3 sb zero,15(sp) + 83d2: 00f10593 addi a1,sp,15 + 83d6: 4605 li a2,1 + 83d8: 09f00513 li a0,159 + 83dc: ba5ff0ef jal ra,7f80 + 83e0: 0141 addi sp,sp,16 + 83e2: e33f706f j 214 <__riscv_restore_0> + 83e6: 4785 li a5,1 + 83e8: 87dc sb a5,15(sp) + 83ea: b7e5 j 83d2 + +000083ec : + 83ec: e05f72ef jal t0,1f0 <__riscv_save_0> + 83f0: 1141 addi sp,sp,-16 + 83f2: 87c8 sb a0,15(sp) + 83f4: 00f10593 addi a1,sp,15 + 83f8: 4605 li a2,1 + 83fa: 0a000513 li a0,160 + 83fe: b83ff0ef jal ra,7f80 + 8402: 0141 addi sp,sp,16 + 8404: e11f706f j 214 <__riscv_restore_0> + +00008408 : + 8408: de9f72ef jal t0,1f0 <__riscv_save_0> + 840c: 1141 addi sp,sp,-16 + 840e: 87c8 sb a0,15(sp) + 8410: 00f10593 addi a1,sp,15 + 8414: 4605 li a2,1 + 8416: 08a00513 li a0,138 + 841a: b67ff0ef jal ra,7f80 + 841e: 0141 addi sp,sp,16 + 8420: df5f706f j 214 <__riscv_restore_0> + +00008424 : + 8424: dcdf72ef jal t0,1f0 <__riscv_save_0> + 8428: 1141 addi sp,sp,-16 + 842a: 8648 sb a0,12(sp) + 842c: 86cc sb a1,13(sp) + 842e: 8750 sb a2,14(sp) + 8430: 006c addi a1,sp,12 + 8432: 4611 li a2,4 + 8434: 08b00513 li a0,139 + 8438: 87d4 sb a3,15(sp) + 843a: b47ff0ef jal ra,7f80 + 843e: 0141 addi sp,sp,16 + 8440: dd5f706f j 214 <__riscv_restore_0> + +00008444 : + 8444: dadf72ef jal t0,1f0 <__riscv_save_0> + 8448: 00851793 slli a5,a0,0x8 + 844c: 8121 srli a0,a0,0x8 + 844e: 1141 addi sp,sp,-16 + 8450: 8d5d or a0,a0,a5 + 8452: 8668 sh a0,12(sp) + 8454: 006c addi a1,sp,12 + 8456: 4609 li a2,2 + 8458: 4509 li a0,2 + 845a: b27ff0ef jal ra,7f80 + 845e: 0141 addi sp,sp,16 + 8460: db5f706f j 214 <__riscv_restore_0> + +00008464 : + 8464: d8df72ef jal t0,1f0 <__riscv_save_0> + 8468: 892a mv s2,a0 + 846a: 84ae mv s1,a1 + 846c: 6505 lui a0,0x1 + 846e: 0000e5b7 lui a1,0xe + 8472: 1141 addi sp,sp,-16 + 8474: c0058593 addi a1,a1,-1024 # dc00 + 8478: 38850513 addi a0,a0,904 # 1388 + 847c: 8432 mv s0,a2 + 847e: 82fff0ef jal ra,7cac + 8482: 82e18783 lb a5,-2002(gp) # 2000021e + 8486: c385 beqz a5,84a6 + 8488: 0000e637 lui a2,0xe + 848c: 0000b5b7 lui a1,0xb + 8490: 0000e537 lui a0,0xe + 8494: 86ca mv a3,s2 + 8496: bcc60613 addi a2,a2,-1076 # dbcc + 849a: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 849e: c1450513 addi a0,a0,-1004 # dc14 + 84a2: 724010ef jal ra,9bc6 + 84a6: 858a mv a1,sp + 84a8: c002 sw zero,0(sp) + 84aa: 00140613 addi a2,s0,1 + 84ae: 852e mv a0,a1 + 84b0: c202 sw zero,4(sp) + 84b2: c402 sw zero,8(sp) + 84b4: c602 sw zero,12(sp) + 84b6: 01210023 sb s2,0(sp) + 84ba: e70ff0ef jal ra,7b2a + 84be: c881 beqz s1,84ce + 84c0: c419 beqz s0,84ce + 84c2: 8622 mv a2,s0 + 84c4: 00110593 addi a1,sp,1 + 84c8: 8526 mv a0,s1 + 84ca: 488010ef jal ra,9952 + 84ce: 4505 li a0,1 + 84d0: 797000ef jal ra,9466 + 84d4: 0000e5b7 lui a1,0xe + 84d8: 6505 lui a0,0x1 + 84da: 4601 li a2,0 + 84dc: c3858593 addi a1,a1,-968 # dc38 + 84e0: 38850513 addi a0,a0,904 # 1388 + 84e4: edeff0ef jal ra,7bc2 + 84e8: 0141 addi sp,sp,16 + 84ea: d2bf706f j 214 <__riscv_restore_0> + +000084ee : + 84ee: d03f72ef jal t0,1f0 <__riscv_save_0> + 84f2: 1141 addi sp,sp,-16 + 84f4: 892a mv s2,a0 + 84f6: 84ae mv s1,a1 + 84f8: 8432 mv s0,a2 + 84fa: 006c addi a1,sp,12 + 84fc: 4611 li a2,4 + 84fe: 4551 li a0,20 + 8500: f65ff0ef jal ra,8464 + 8504: 879c lbu a5,15(sp) + 8506: 8385 srli a5,a5,0x1 + 8508: 40f007b3 neg a5,a5 + 850c: 00f90023 sb a5,0(s2) + 8510: 871c lbu a5,14(sp) + 8512: 01879713 slli a4,a5,0x18 + 8516: 8761 srai a4,a4,0x18 + 8518: 00074863 bltz a4,8528 + 851c: 8389 srli a5,a5,0x2 + 851e: a09c sb a5,0(s1) + 8520: a018 sb a4,0(s0) + 8522: 0141 addi sp,sp,16 + 8524: cf1f706f j 214 <__riscv_restore_0> + 8528: f0078793 addi a5,a5,-256 + 852c: 8789 srai a5,a5,0x2 + 852e: bfc5 j 851e + +00008530 : + 8530: cc1f72ef jal t0,1f0 <__riscv_save_0> + 8534: 1141 addi sp,sp,-16 + 8536: 00f10593 addi a1,sp,15 + 853a: 4605 li a2,1 + 853c: 0c000513 li a0,192 + 8540: f25ff0ef jal ra,8464 + 8544: 8788 lbu a0,15(sp) + 8546: 0141 addi sp,sp,16 + 8548: ccdf706f j 214 <__riscv_restore_0> + +0000854c : + 854c: ca5f72ef jal t0,1f0 <__riscv_save_0> + 8550: 82e18783 lb a5,-2002(gp) # 2000021e + 8554: 1141 addi sp,sp,-16 + 8556: 842a mv s0,a0 + 8558: c385 beqz a5,8578 + 855a: 86aa mv a3,a0 + 855c: 0000e637 lui a2,0xe + 8560: 0000b5b7 lui a1,0xb + 8564: 0000e537 lui a0,0xe + 8568: bcc60613 addi a2,a2,-1076 # dbcc + 856c: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 8570: d0450513 addi a0,a0,-764 # dd04 + 8574: 652010ef jal ra,9bc6 + 8578: 4501 li a0,0 + 857a: a8dff0ef jal ra,8006 + 857e: 01045793 srli a5,s0,0x10 + 8582: 865c sb a5,12(sp) + 8584: 460d li a2,3 + 8586: 00845793 srli a5,s0,0x8 + 858a: 006c addi a1,sp,12 + 858c: 08200513 li a0,130 + 8590: 8740 sb s0,14(sp) + 8592: 86dc sb a5,13(sp) + 8594: 4429 li s0,10 + 8596: 9ebff0ef jal ra,7f80 + 859a: 05000493 li s1,80 + 859e: f93ff0ef jal ra,8530 + 85a2: 07057513 andi a0,a0,112 + 85a6: 00950763 beq a0,s1,85b4 + 85aa: 4505 li a0,1 + 85ac: 147d addi s0,s0,-1 + 85ae: 6b9000ef jal ra,9466 + 85b2: f475 bnez s0,859e + 85b4: f7dff0ef jal ra,8530 + 85b8: 07057513 andi a0,a0,112 + 85bc: 05000793 li a5,80 + 85c0: 02f50363 beq a0,a5,85e6 + 85c4: 0000e637 lui a2,0xe + 85c8: 0000c5b7 lui a1,0xc + 85cc: 0000e537 lui a0,0xe + 85d0: bcc60613 addi a2,a2,-1076 # dbcc + 85d4: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 85d8: d2850513 addi a0,a0,-728 # dd28 + 85dc: 5ea010ef jal ra,9bc6 + 85e0: 4549 li a0,18 + 85e2: c02ff0ef jal ra,79e4 + 85e6: 0141 addi sp,sp,16 + 85e8: c2df706f j 214 <__riscv_restore_0> + +000085ec : + 85ec: c05f72ef jal t0,1f0 <__riscv_save_0> + 85f0: 1101 addi sp,sp,-32 + 85f2: 842a mv s0,a0 + 85f4: 4501 li a0,0 + 85f6: 84b6 mv s1,a3 + 85f8: ca3a sw a4,20(sp) + 85fa: c83e sw a5,16(sp) + 85fc: c642 sw a6,12(sp) + 85fe: ce2e sw a1,28(sp) + 8600: cc32 sw a2,24(sp) + 8602: da5ff0ef jal ra,83a6 + 8606: 4501 li a0,0 + 8608: de5ff0ef jal ra,83ec + 860c: 4505 li a0,1 + 860e: dfbff0ef jal ra,8408 + 8612: 4662 lw a2,24(sp) + 8614: 45f2 lw a1,28(sp) + 8616: 4681 li a3,0 + 8618: 8522 mv a0,s0 + 861a: e0bff0ef jal ra,8424 + 861e: 00849693 slli a3,s1,0x8 + 8622: 4752 lw a4,20(sp) + 8624: 80a1 srli s1,s1,0x8 + 8626: 8cd5 or s1,s1,a3 + 8628: 82919423 sh s1,-2008(gp) # 20000218 + 862c: 82818693 addi a3,gp,-2008 # 20000218 + 8630: 4832 lw a6,12(sp) + 8632: 47c2 lw a5,16(sp) + 8634: c325 beqz a4,8694 + 8636: 4605 li a2,1 + 8638: a2b0 sb a2,2(a3) + 863a: b2b8 sb a4,3(a3) + 863c: 01003533 snez a0,a6 + 8640: 00f037b3 snez a5,a5 + 8644: a2dc sb a5,4(a3) + 8646: b2c8 sb a0,5(a3) + 8648: 853ff0ef jal ra,7e9a + 864c: 82818593 addi a1,gp,-2008 # 20000218 + 8650: 4619 li a2,6 + 8652: 08c00513 li a0,140 + 8656: 92bff0ef jal ra,7f80 + 865a: 4681 li a3,0 + 865c: 4601 li a2,0 + 865e: 4581 li a1,0 + 8660: 3ff00513 li a0,1023 + 8664: d05ff0ef jal ra,8368 + 8668: 0000e637 lui a2,0xe + 866c: 0000b5b7 lui a1,0xb + 8670: 0000e537 lui a0,0xe + 8674: bcc60613 addi a2,a2,-1076 # dbcc + 8678: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 867c: ba850513 addi a0,a0,-1112 # dba8 + 8680: 546010ef jal ra,9bc6 + 8684: 01000537 lui a0,0x1000 + 8688: 157d addi a0,a0,-1 + 868a: ec3ff0ef jal ra,854c + 868e: 6105 addi sp,sp,32 + 8690: b85f706f j 214 <__riscv_restore_0> + 8694: f0000713 li a4,-256 + 8698: a2ba sh a4,2(a3) + 869a: b74d j 863c + +0000869c : + 869c: b55f72ef jal t0,1f0 <__riscv_save_0> + 86a0: 82e18783 lb a5,-2002(gp) # 2000021e + 86a4: 1141 addi sp,sp,-16 + 86a6: 892a mv s2,a0 + 86a8: 82e18493 addi s1,gp,-2002 # 2000021e + 86ac: c385 beqz a5,86cc + 86ae: 86aa mv a3,a0 + 86b0: 0000e637 lui a2,0xe + 86b4: 0000b5b7 lui a1,0xb + 86b8: 0000e537 lui a0,0xe + 86bc: bcc60613 addi a2,a2,-1076 # dbcc + 86c0: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 86c4: d7c50513 addi a0,a0,-644 # dd7c + 86c8: 4fe010ef jal ra,9bc6 + 86cc: 4501 li a0,0 + 86ce: 939ff0ef jal ra,8006 + 86d2: 00048783 lb a5,0(s1) + 86d6: 6441 lui s0,0x10 + 86d8: a0040413 addi s0,s0,-1536 # fa00 <_data_lma+0x17a4> + 86dc: 02890433 mul s0,s2,s0 + 86e0: c38d beqz a5,8702 + 86e2: 0000e637 lui a2,0xe + 86e6: 0000b5b7 lui a1,0xb + 86ea: 0000e537 lui a0,0xe + 86ee: 8722 mv a4,s0 + 86f0: 86ca mv a3,s2 + 86f2: bcc60613 addi a2,a2,-1076 # dbcc + 86f6: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 86fa: da450513 addi a0,a0,-604 # dda4 + 86fe: 4c8010ef jal ra,9bc6 + 8702: 01045793 srli a5,s0,0x10 + 8706: 460d li a2,3 + 8708: 8021 srli s0,s0,0x8 + 870a: 006c addi a1,sp,12 + 870c: 08300513 li a0,131 + 8710: 865c sb a5,12(sp) + 8712: 86c0 sb s0,13(sp) + 8714: 00010723 sb zero,14(sp) + 8718: 869ff0ef jal ra,7f80 + 871c: 00048783 lb a5,0(s1) + 8720: cf99 beqz a5,873e + 8722: 0000e637 lui a2,0xe + 8726: 0000b5b7 lui a1,0xb + 872a: 0000e537 lui a0,0xe + 872e: bcc60613 addi a2,a2,-1076 # dbcc + 8732: 66058593 addi a1,a1,1632 # b660 <_exit+0x208> + 8736: dcc50513 addi a0,a0,-564 # ddcc + 873a: 48c010ef jal ra,9bc6 + 873e: 4451 li s0,20 + 8740: 06000913 li s2,96 + 8744: dedff0ef jal ra,8530 + 8748: 07057513 andi a0,a0,112 + 874c: 01250763 beq a0,s2,875a + 8750: 4505 li a0,1 + 8752: 147d addi s0,s0,-1 + 8754: 513000ef jal ra,9466 + 8758: f475 bnez s0,8744 + 875a: 00048783 lb a5,0(s1) + 875e: cf99 beqz a5,877c + 8760: 0000e637 lui a2,0xe + 8764: 0000b5b7 lui a1,0xb + 8768: 0000e537 lui a0,0xe + 876c: bcc60613 addi a2,a2,-1076 # dbcc + 8770: 4ec58593 addi a1,a1,1260 # b4ec <_exit+0x94> + 8774: df450513 addi a0,a0,-524 # ddf4 + 8778: 44e010ef jal ra,9bc6 + 877c: db5ff0ef jal ra,8530 + 8780: 07057513 andi a0,a0,112 + 8784: 06000793 li a5,96 + 8788: 02f50363 beq a0,a5,87ae + 878c: 0000e637 lui a2,0xe + 8790: 0000c5b7 lui a1,0xc + 8794: 0000e537 lui a0,0xe + 8798: bcc60613 addi a2,a2,-1076 # dbcc + 879c: 18858593 addi a1,a1,392 # c188 <_exit+0xd30> + 87a0: e0c50513 addi a0,a0,-500 # de0c + 87a4: 422010ef jal ra,9bc6 + 87a8: 454d li a0,19 + 87aa: a3aff0ef jal ra,79e4 + 87ae: 0141 addi sp,sp,16 + 87b0: a65f706f j 214 <__riscv_restore_0> + +000087b4 : + 87b4: a3df72ef jal t0,1f0 <__riscv_save_0> + 87b8: 1141 addi sp,sp,-16 + 87ba: 006c addi a1,sp,12 + 87bc: 460d li a2,3 + 87be: 4549 li a0,18 + 87c0: ca5ff0ef jal ra,8464 + 87c4: 869c lbu a5,13(sp) + 87c6: 8708 lbu a0,14(sp) + 87c8: 07a2 slli a5,a5,0x8 + 87ca: 8d5d or a0,a0,a5 + 87cc: 0141 addi sp,sp,16 + 87ce: a47f706f j 214 <__riscv_restore_0> + +000087d2 : + 87d2: a1ff72ef jal t0,1f0 <__riscv_save_0> + 87d6: 1141 addi sp,sp,-16 + 87d8: 842e mv s0,a1 + 87da: 84aa mv s1,a0 + 87dc: 006c addi a1,sp,12 + 87de: 460d li a2,3 + 87e0: 454d li a0,19 + 87e2: c83ff0ef jal ra,8464 + 87e6: 869c lbu a5,13(sp) + 87e8: a09c sb a5,0(s1) + 87ea: 871c lbu a5,14(sp) + 87ec: a01c sb a5,0(s0) + 87ee: 0141 addi sp,sp,16 + 87f0: a25f706f j 214 <__riscv_restore_0> + +000087f4 : + 87f4: 400217b7 lui a5,0x40021 + 87f8: 4398 lw a4,0(a5) + 87fa: f0ff06b7 lui a3,0xf0ff0 + 87fe: 1141 addi sp,sp,-16 + 8800: 00176713 ori a4,a4,1 + 8804: c398 sw a4,0(a5) + 8806: 43d8 lw a4,4(a5) + 8808: 00020637 lui a2,0x20 + 880c: 8f75 and a4,a4,a3 + 880e: c3d8 sw a4,4(a5) + 8810: 4398 lw a4,0(a5) + 8812: fef706b7 lui a3,0xfef70 + 8816: 16fd addi a3,a3,-1 + 8818: 8f75 and a4,a4,a3 + 881a: c398 sw a4,0(a5) + 881c: 4398 lw a4,0(a5) + 881e: fffc06b7 lui a3,0xfffc0 + 8822: 16fd addi a3,a3,-1 + 8824: 8f75 and a4,a4,a3 + 8826: c398 sw a4,0(a5) + 8828: 43d8 lw a4,4(a5) + 882a: ff0106b7 lui a3,0xff010 + 882e: 16fd addi a3,a3,-1 + 8830: 8f75 and a4,a4,a3 + 8832: c3d8 sw a4,4(a5) + 8834: 4398 lw a4,0(a5) + 8836: ec0006b7 lui a3,0xec000 + 883a: 16fd addi a3,a3,-1 + 883c: 8f75 and a4,a4,a3 + 883e: c398 sw a4,0(a5) + 8840: 00ff0737 lui a4,0xff0 + 8844: c798 sw a4,8(a5) + 8846: 0207a623 sw zero,44(a5) # 4002102c <_eusrstack+0x2001902c> + 884a: c402 sw zero,8(sp) + 884c: c602 sw zero,12(sp) + 884e: 4398 lw a4,0(a5) + 8850: 66c1 lui a3,0x10 + 8852: 8f55 or a4,a4,a3 + 8854: c398 sw a4,0(a5) + 8856: 400216b7 lui a3,0x40021 + 885a: 6705 lui a4,0x1 + 885c: 429c lw a5,0(a3) + 885e: 8ff1 and a5,a5,a2 + 8860: c63e sw a5,12(sp) + 8862: 47a2 lw a5,8(sp) + 8864: 0785 addi a5,a5,1 + 8866: c43e sw a5,8(sp) + 8868: 47b2 lw a5,12(sp) + 886a: e781 bnez a5,8872 + 886c: 47a2 lw a5,8(sp) + 886e: fee797e3 bne a5,a4,885c + 8872: 400217b7 lui a5,0x40021 + 8876: 439c lw a5,0(a5) + 8878: 00e79713 slli a4,a5,0xe + 887c: 06075763 bgez a4,88ea + 8880: 4785 li a5,1 + 8882: c63e sw a5,12(sp) + 8884: 4732 lw a4,12(sp) + 8886: 4785 li a5,1 + 8888: 04f71f63 bne a4,a5,88e6 + 888c: 400217b7 lui a5,0x40021 + 8890: 43d8 lw a4,4(a5) + 8892: ffc106b7 lui a3,0xffc10 + 8896: 16fd addi a3,a3,-1 + 8898: c3d8 sw a4,4(a5) + 889a: 43d8 lw a4,4(a5) + 889c: c3d8 sw a4,4(a5) + 889e: 43d8 lw a4,4(a5) + 88a0: 40076713 ori a4,a4,1024 + 88a4: c3d8 sw a4,4(a5) + 88a6: 43d8 lw a4,4(a5) + 88a8: 8f75 and a4,a4,a3 + 88aa: c3d8 sw a4,4(a5) + 88ac: 43d8 lw a4,4(a5) + 88ae: 002906b7 lui a3,0x290 + 88b2: 8f55 or a4,a4,a3 + 88b4: c3d8 sw a4,4(a5) + 88b6: 4398 lw a4,0(a5) + 88b8: 010006b7 lui a3,0x1000 + 88bc: 8f55 or a4,a4,a3 + 88be: c398 sw a4,0(a5) + 88c0: 4398 lw a4,0(a5) + 88c2: 00671693 slli a3,a4,0x6 + 88c6: fe06dde3 bgez a3,88c0 + 88ca: 43d8 lw a4,4(a5) + 88cc: 400216b7 lui a3,0x40021 + 88d0: 9b71 andi a4,a4,-4 + 88d2: c3d8 sw a4,4(a5) + 88d4: 43d8 lw a4,4(a5) + 88d6: 00276713 ori a4,a4,2 + 88da: c3d8 sw a4,4(a5) + 88dc: 4721 li a4,8 + 88de: 42dc lw a5,4(a3) + 88e0: 8bb1 andi a5,a5,12 + 88e2: fee79ee3 bne a5,a4,88de + 88e6: 0141 addi sp,sp,16 + 88e8: 8082 ret + 88ea: c602 sw zero,12(sp) + 88ec: bf61 j 8884 + +000088ee : + 88ee: 400216b7 lui a3,0x40021 + 88f2: 42d8 lw a4,4(a3) + 88f4: 200007b7 lui a5,0x20000 + 88f8: 4611 li a2,4 + 88fa: 8b31 andi a4,a4,12 + 88fc: 1f078793 addi a5,a5,496 # 200001f0 + 8900: 00c70563 beq a4,a2,890a + 8904: 4621 li a2,8 + 8906: 02c70863 beq a4,a2,8936 + 890a: 007a1737 lui a4,0x7a1 + 890e: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 8912: c398 sw a4,0(a5) + 8914: 40021737 lui a4,0x40021 + 8918: 4358 lw a4,4(a4) + 891a: 8311 srli a4,a4,0x4 + 891c: 00f77693 andi a3,a4,15 + 8920: 20000737 lui a4,0x20000 + 8924: 00070713 mv a4,a4 + 8928: 9736 add a4,a4,a3 + 892a: 2314 lbu a3,0(a4) + 892c: 4398 lw a4,0(a5) + 892e: 00d75733 srl a4,a4,a3 + 8932: c398 sw a4,0(a5) + 8934: 8082 ret + 8936: 42d8 lw a4,4(a3) + 8938: 42d4 lw a3,4(a3) + 893a: 6641 lui a2,0x10 + 893c: 8349 srli a4,a4,0x12 + 893e: 8b3d andi a4,a4,15 + 8940: 8ef1 and a3,a3,a2 + 8942: 00270613 addi a2,a4,2 # 20000002 <_data_vma+0x2> + 8946: cf15 beqz a4,8982 + 8948: 473d li a4,15 + 894a: 02e60f63 beq a2,a4,8988 + 894e: 4741 li a4,16 + 8950: 02e60f63 beq a2,a4,898e + 8954: 4745 li a4,17 + 8956: 4581 li a1,0 + 8958: 00e61363 bne a2,a4,895e + 895c: 4641 li a2,16 + 895e: e2a1 bnez a3,899e + 8960: 40024737 lui a4,0x40024 + 8964: 80072703 lw a4,-2048(a4) # 40023800 <_eusrstack+0x2001b800> + 8968: 8b41 andi a4,a4,16 + 896a: c70d beqz a4,8994 + 896c: 007a1737 lui a4,0x7a1 + 8970: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 8974: 02c70633 mul a2,a4,a2 + 8978: c390 sw a2,0(a5) + 897a: ddc9 beqz a1,8914 + 897c: 4398 lw a4,0(a5) + 897e: 8305 srli a4,a4,0x1 + 8980: bf49 j 8912 + 8982: 4581 li a1,0 + 8984: 4649 li a2,18 + 8986: bfe1 j 895e + 8988: 4585 li a1,1 + 898a: 4635 li a2,13 + 898c: bfc9 j 895e + 898e: 4581 li a1,0 + 8990: 463d li a2,15 + 8992: b7f1 j 895e + 8994: 003d1737 lui a4,0x3d1 + 8998: 90070713 addi a4,a4,-1792 # 3d0900 <_data_lma+0x3c26a4> + 899c: bfe1 j 8974 + 899e: 40021537 lui a0,0x40021 + 89a2: 5558 lw a4,44(a0) + 89a4: 00f71693 slli a3,a4,0xf + 89a8: 5558 lw a4,44(a0) + 89aa: 0406df63 bgez a3,8a08 + 89ae: 8311 srli a4,a4,0x4 + 89b0: 8b3d andi a4,a4,15 + 89b2: 00170693 addi a3,a4,1 + 89b6: 007a1737 lui a4,0x7a1 + 89ba: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 89be: 02d75733 divu a4,a4,a3 + 89c2: c398 sw a4,0(a5) + 89c4: 5554 lw a3,44(a0) + 89c6: 82a1 srli a3,a3,0x8 + 89c8: 8abd andi a3,a3,15 + 89ca: e28d bnez a3,89ec + 89cc: 4695 li a3,5 + 89ce: 02d70733 mul a4,a4,a3 + 89d2: 8305 srli a4,a4,0x1 + 89d4: c398 sw a4,0(a5) + 89d6: 40021737 lui a4,0x40021 + 89da: 5758 lw a4,44(a4) + 89dc: 4394 lw a3,0(a5) + 89de: 8b3d andi a4,a4,15 + 89e0: 0705 addi a4,a4,1 + 89e2: 02e6d733 divu a4,a3,a4 + 89e6: c398 sw a4,0(a5) + 89e8: 4398 lw a4,0(a5) + 89ea: b769 j 8974 + 89ec: 4505 li a0,1 + 89ee: 00a69463 bne a3,a0,89f6 + 89f2: 46e5 li a3,25 + 89f4: bfe9 j 89ce + 89f6: 453d li a0,15 + 89f8: 00a69663 bne a3,a0,8a04 + 89fc: 46d1 li a3,20 + 89fe: 02e68733 mul a4,a3,a4 + 8a02: bfc9 j 89d4 + 8a04: 0689 addi a3,a3,2 + 8a06: bfe5 j 89fe + 8a08: 8b3d andi a4,a4,15 + 8a0a: 00170693 addi a3,a4,1 # 40021001 <_eusrstack+0x20019001> + 8a0e: 007a1737 lui a4,0x7a1 + 8a12: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 8a16: 02d75733 divu a4,a4,a3 + 8a1a: b7f1 j 89e6 + +00008a1c : + 8a1c: a001 j 8a1c + +00008a1e : + 8a1e: 1fff8197 auipc gp,0x1fff8 + 8a22: fd218193 addi gp,gp,-46 # 200009f0 <__global_pointer$> + 8a26: 1ffff117 auipc sp,0x1ffff + 8a2a: 5da10113 addi sp,sp,1498 # 20008000 <_eusrstack> + 8a2e: 00006517 auipc a0,0x6 + 8a32: 82e50513 addi a0,a0,-2002 # e25c <_data_lma> + 8a36: 1fff7597 auipc a1,0x1fff7 + 8a3a: 5ca58593 addi a1,a1,1482 # 20000000 <_data_vma> + 8a3e: 81818613 addi a2,gp,-2024 # 20000208 <_edata> + 8a42: 00c5fa63 bgeu a1,a2,8a56 + 8a46: 00052283 lw t0,0(a0) + 8a4a: 0055a023 sw t0,0(a1) + 8a4e: 0511 addi a0,a0,4 + 8a50: 0591 addi a1,a1,4 + 8a52: fec5eae3 bltu a1,a2,8a46 + 8a56: 81818513 addi a0,gp,-2024 # 20000208 <_edata> + 8a5a: 79018593 addi a1,gp,1936 # 20001180 <_ebss> + 8a5e: 00b57763 bgeu a0,a1,8a6c + 8a62: 00052023 sw zero,0(a0) + 8a66: 0511 addi a0,a0,4 + 8a68: feb56de3 bltu a0,a1,8a62 + 8a6c: 42fd li t0,31 + 8a6e: bc029073 csrw 0xbc0,t0 + 8a72: 42ad li t0,11 + 8a74: 80429073 csrw 0x804,t0 + 8a78: 000062b7 lui t0,0x6 + 8a7c: 08828293 addi t0,t0,136 # 6088 + 8a80: 30029073 csrw mstatus,t0 + 8a84: ffff7297 auipc t0,0xffff7 + 8a88: 58028293 addi t0,t0,1408 # 4 <_einit> + 8a8c: 0032e293 ori t0,t0,3 + 8a90: 30529073 csrw mtvec,t0 + 8a94: d61ff0ef jal ra,87f4 + 8a98: fffff297 auipc t0,0xfffff + 8a9c: c5a28293 addi t0,t0,-934 # 76f2
+ 8aa0: 34129073 csrw mepc,t0 + 8aa4: 30200073 mret + +00008aa8 : + 8aa8: f48f72ef jal t0,1f0 <__riscv_save_0> + 8aac: 400127b7 lui a5,0x40012 + 8ab0: 40078793 addi a5,a5,1024 # 40012400 <_eusrstack+0x2000a400> + 8ab4: 00f51c63 bne a0,a5,8acc + 8ab8: 4585 li a1,1 + 8aba: 20000513 li a0,512 + 8abe: 2d71 jal 915a + 8ac0: 4581 li a1,0 + 8ac2: 20000513 li a0,512 + 8ac6: 2d51 jal 915a + 8ac8: f4cf706f j 214 <__riscv_restore_0> + 8acc: 400137b7 lui a5,0x40013 + 8ad0: 80078793 addi a5,a5,-2048 # 40012800 <_eusrstack+0x2000a800> + 8ad4: fef51ae3 bne a0,a5,8ac8 + 8ad8: 4585 li a1,1 + 8ada: 40000513 li a0,1024 + 8ade: 2db5 jal 915a + 8ae0: 4581 li a1,0 + 8ae2: 40000513 li a0,1024 + 8ae6: b7c5 j 8ac6 + +00008ae8 : + 8ae8: 415c lw a5,4(a0) + 8aea: e0f10737 lui a4,0xe0f10 + 8aee: eff70713 addi a4,a4,-257 # e0f0feff <_eusrstack+0xc0f07eff> + 8af2: 4d94 lw a3,24(a1) + 8af4: 8f7d and a4,a4,a5 + 8af6: 419c lw a5,0(a1) + 8af8: 8fd5 or a5,a5,a3 + 8afa: 4dd4 lw a3,28(a1) + 8afc: 8fd5 or a5,a5,a3 + 8afe: 41d4 lw a3,4(a1) + 8b00: 06a2 slli a3,a3,0x8 + 8b02: 8fd5 or a5,a5,a3 + 8b04: 8fd9 or a5,a5,a4 + 8b06: c15c sw a5,4(a0) + 8b08: 451c lw a5,8(a0) + 8b0a: fff1f737 lui a4,0xfff1f + 8b0e: 7fd70713 addi a4,a4,2045 # fff1f7fd <_eusrstack+0xdff177fd> + 8b12: 45d4 lw a3,12(a1) + 8b14: 8f7d and a4,a4,a5 + 8b16: 499c lw a5,16(a1) + 8b18: 8fd5 or a5,a5,a3 + 8b1a: 4594 lw a3,8(a1) + 8b1c: 0686 slli a3,a3,0x1 + 8b1e: 8fd5 or a5,a5,a3 + 8b20: 8fd9 or a5,a5,a4 + 8b22: c51c sw a5,8(a0) + 8b24: 555c lw a5,44(a0) + 8b26: ff100737 lui a4,0xff100 + 8b2a: 177d addi a4,a4,-1 + 8b2c: 8f7d and a4,a4,a5 + 8b2e: 29dc lbu a5,20(a1) + 8b30: 17fd addi a5,a5,-1 + 8b32: 0ff7f793 andi a5,a5,255 + 8b36: 07d2 slli a5,a5,0x14 + 8b38: 8fd9 or a5,a5,a4 + 8b3a: d55c sw a5,44(a0) + 8b3c: 8082 ret + +00008b3e : + 8b3e: 451c lw a5,8(a0) + 8b40: c589 beqz a1,8b4a + 8b42: 0017e793 ori a5,a5,1 + 8b46: c51c sw a5,8(a0) + 8b48: 8082 ret + 8b4a: 9bf9 andi a5,a5,-2 + 8b4c: bfed j 8b46 + +00008b4e : + 8b4e: 451c lw a5,8(a0) + 8b50: 0087e793 ori a5,a5,8 + 8b54: c51c sw a5,8(a0) + 8b56: 8082 ret + +00008b58 : + 8b58: 4508 lw a0,8(a0) + 8b5a: 810d srli a0,a0,0x3 + 8b5c: 8905 andi a0,a0,1 + 8b5e: 8082 ret + +00008b60 : + 8b60: 451c lw a5,8(a0) + 8b62: 0047e793 ori a5,a5,4 + 8b66: c51c sw a5,8(a0) + 8b68: 8082 ret + +00008b6a : + 8b6a: 4508 lw a0,8(a0) + 8b6c: 8109 srli a0,a0,0x2 + 8b6e: 8905 andi a0,a0,1 + 8b70: 8082 ret + +00008b72 : + 8b72: 451c lw a5,8(a0) + 8b74: c591 beqz a1,8b80 + 8b76: 00500737 lui a4,0x500 + 8b7a: 8fd9 or a5,a5,a4 + 8b7c: c51c sw a5,8(a0) + 8b7e: 8082 ret + 8b80: ffb00737 lui a4,0xffb00 + 8b84: 177d addi a4,a4,-1 + 8b86: 8ff9 and a5,a5,a4 + 8b88: bfd5 j 8b7c + +00008b8a : + 8b8a: 47a5 li a5,9 + 8b8c: 04b7f763 bgeu a5,a1,8bda + 8b90: 478d li a5,3 + 8b92: ff658713 addi a4,a1,-10 + 8b96: 02f70733 mul a4,a4,a5 + 8b9a: 00c52803 lw a6,12(a0) + 8b9e: 479d li a5,7 + 8ba0: 00e797b3 sll a5,a5,a4 + 8ba4: fff7c793 not a5,a5 + 8ba8: 0107f7b3 and a5,a5,a6 + 8bac: 00e696b3 sll a3,a3,a4 + 8bb0: 8edd or a3,a3,a5 + 8bb2: c554 sw a3,12(a0) + 8bb4: 4799 li a5,6 + 8bb6: 04c7e363 bltu a5,a2,8bfc + 8bba: 4795 li a5,5 + 8bbc: 167d addi a2,a2,-1 + 8bbe: 02f60633 mul a2,a2,a5 + 8bc2: 5958 lw a4,52(a0) + 8bc4: 47fd li a5,31 + 8bc6: 00c797b3 sll a5,a5,a2 + 8bca: fff7c793 not a5,a5 + 8bce: 8ff9 and a5,a5,a4 + 8bd0: 00c59633 sll a2,a1,a2 + 8bd4: 8e5d or a2,a2,a5 + 8bd6: d950 sw a2,52(a0) + 8bd8: 8082 ret + 8bda: 470d li a4,3 + 8bdc: 02e58733 mul a4,a1,a4 + 8be0: 01052803 lw a6,16(a0) + 8be4: 479d li a5,7 + 8be6: 00e797b3 sll a5,a5,a4 + 8bea: fff7c793 not a5,a5 + 8bee: 0107f7b3 and a5,a5,a6 + 8bf2: 00e696b3 sll a3,a3,a4 + 8bf6: 8edd or a3,a3,a5 + 8bf8: c914 sw a3,16(a0) + 8bfa: bf6d j 8bb4 + 8bfc: 47b1 li a5,12 + 8bfe: 02c7e263 bltu a5,a2,8c22 + 8c02: 4795 li a5,5 + 8c04: 1665 addi a2,a2,-7 + 8c06: 02f60633 mul a2,a2,a5 + 8c0a: 5918 lw a4,48(a0) + 8c0c: 47fd li a5,31 + 8c0e: 00c797b3 sll a5,a5,a2 + 8c12: fff7c793 not a5,a5 + 8c16: 8ff9 and a5,a5,a4 + 8c18: 00c59633 sll a2,a1,a2 + 8c1c: 8e5d or a2,a2,a5 + 8c1e: d910 sw a2,48(a0) + 8c20: 8082 ret + 8c22: 4795 li a5,5 + 8c24: 164d addi a2,a2,-13 + 8c26: 02f60633 mul a2,a2,a5 + 8c2a: 5558 lw a4,44(a0) + 8c2c: 47fd li a5,31 + 8c2e: 00c797b3 sll a5,a5,a2 + 8c32: fff7c793 not a5,a5 + 8c36: 8ff9 and a5,a5,a4 + 8c38: 00c595b3 sll a1,a1,a2 + 8c3c: 8ddd or a1,a1,a5 + 8c3e: d54c sw a1,44(a0) + 8c40: 8082 ret + +00008c42 : + 8c42: 4568 lw a0,76(a0) + 8c44: 0542 slli a0,a0,0x10 + 8c46: 8141 srli a0,a0,0x10 + 8c48: 8082 ret + +00008c4a : + 8c4a: 400127b7 lui a5,0x40012 + 8c4e: 40078793 addi a5,a5,1024 # 40012400 <_eusrstack+0x2000a400> + 8c52: 4798 lw a4,8(a5) + 8c54: c511 beqz a0,8c60 + 8c56: 008006b7 lui a3,0x800 + 8c5a: 8f55 or a4,a4,a3 + 8c5c: c798 sw a4,8(a5) + 8c5e: 8082 ret + 8c60: ff8006b7 lui a3,0xff800 + 8c64: 16fd addi a3,a3,-1 + 8c66: 8f75 and a4,a4,a3 + 8c68: bfd5 j 8c5c + +00008c6a : + 8c6a: 4108 lw a0,0(a0) + 8c6c: 8d6d and a0,a0,a1 + 8c6e: 00a03533 snez a0,a0 + 8c72: 8082 ret + +00008c74 : + 8c74: 415c lw a5,4(a0) + 8c76: c591 beqz a1,8c82 + 8c78: 04000737 lui a4,0x4000 + 8c7c: 8fd9 or a5,a5,a4 + 8c7e: c15c sw a5,4(a0) + 8c80: 8082 ret + 8c82: fc000737 lui a4,0xfc000 + 8c86: 177d addi a4,a4,-1 + 8c88: 8ff9 and a5,a5,a4 + 8c8a: bfd5 j 8c7e + +00008c8c : + 8c8c: d64f72ef jal t0,1f0 <__riscv_save_0> + 8c90: 1101 addi sp,sp,-32 + 8c92: 842a mv s0,a0 + 8c94: 00010423 sb zero,8(sp) + 8c98: 44a5 li s1,9 + 8c9a: 841c lbu a5,8(sp) + 8c9c: 04f4f963 bgeu s1,a5,8cee + 8ca0: 00010423 sb zero,8(sp) + 8ca4: 46a5 li a3,9 + 8ca6: 4621 li a2,8 + 8ca8: 841c lbu a5,8(sp) + 8caa: 06f6ff63 bgeu a3,a5,8d28 + 8cae: 00011523 sh zero,10(sp) + 8cb2: 00010423 sb zero,8(sp) + 8cb6: 4695 li a3,5 + 8cb8: 841c lbu a5,8(sp) + 8cba: 0ef6f163 bgeu a3,a5,8d9c + 8cbe: 8538 lhu a4,10(sp) + 8cc0: 853c lhu a5,10(sp) + 8cc2: 4699 li a3,6 + 8cc4: 460d li a2,3 + 8cc6: 02d7f7b3 remu a5,a5,a3 + 8cca: 6505 lui a0,0x1 + 8ccc: 80050513 addi a0,a0,-2048 # 800 <__stack_size> + 8cd0: 02c7d7b3 divu a5,a5,a2 + 8cd4: 02d75733 divu a4,a4,a3 + 8cd8: 97ba add a5,a5,a4 + 8cda: 07c2 slli a5,a5,0x10 + 8cdc: 83c1 srli a5,a5,0x10 + 8cde: 857c sh a5,10(sp) + 8ce0: 853c lhu a5,10(sp) + 8ce2: 6105 addi sp,sp,32 + 8ce4: 8d1d sub a0,a0,a5 + 8ce6: 0542 slli a0,a0,0x10 + 8ce8: 8541 srai a0,a0,0x10 + 8cea: d2af706f j 214 <__riscv_restore_0> + 8cee: 441c lw a5,8(s0) + 8cf0: 0087e793 ori a5,a5,8 + 8cf4: c41c sw a5,8(s0) + 8cf6: 8522 mv a0,s0 + 8cf8: e61ff0ef jal ra,8b58 + 8cfc: fd6d bnez a0,8cf6 + 8cfe: 441c lw a5,8(s0) + 8d00: 0047e793 ori a5,a5,4 + 8d04: c41c sw a5,8(s0) + 8d06: 8522 mv a0,s0 + 8d08: e63ff0ef jal ra,8b6a + 8d0c: fd6d bnez a0,8d06 + 8d0e: 4478 lw a4,76(s0) + 8d10: 841c lbu a5,8(sp) + 8d12: 1014 addi a3,sp,32 + 8d14: 0786 slli a5,a5,0x1 + 8d16: 97b6 add a5,a5,a3 + 8d18: fee79623 sh a4,-20(a5) + 8d1c: 841c lbu a5,8(sp) + 8d1e: 0785 addi a5,a5,1 + 8d20: 0ff7f793 andi a5,a5,255 + 8d24: 845c sb a5,8(sp) + 8d26: bf95 j 8c9a + 8d28: 000104a3 sb zero,9(sp) + 8d2c: 849c lbu a5,9(sp) + 8d2e: 00f67863 bgeu a2,a5,8d3e + 8d32: 841c lbu a5,8(sp) + 8d34: 0785 addi a5,a5,1 + 8d36: 0ff7f793 andi a5,a5,255 + 8d3a: 845c sb a5,8(sp) + 8d3c: b7b5 j 8ca8 + 8d3e: 8498 lbu a4,9(sp) + 8d40: 849c lbu a5,9(sp) + 8d42: 100c addi a1,sp,32 + 8d44: 0706 slli a4,a4,0x1 + 8d46: 0785 addi a5,a5,1 + 8d48: 0786 slli a5,a5,0x1 + 8d4a: 972e add a4,a4,a1 + 8d4c: 97ae add a5,a5,a1 + 8d4e: fec75703 lhu a4,-20(a4) # fbffffec <_eusrstack+0xdbff7fec> + 8d52: fec7d783 lhu a5,-20(a5) + 8d56: 02e7fd63 bgeu a5,a4,8d90 + 8d5a: 849c lbu a5,9(sp) + 8d5c: 0786 slli a5,a5,0x1 + 8d5e: 97ae add a5,a5,a1 + 8d60: fec7d783 lhu a5,-20(a5) + 8d64: 857c sh a5,10(sp) + 8d66: 849c lbu a5,9(sp) + 8d68: 8498 lbu a4,9(sp) + 8d6a: 0785 addi a5,a5,1 + 8d6c: 0786 slli a5,a5,0x1 + 8d6e: 97ae add a5,a5,a1 + 8d70: fec7d583 lhu a1,-20(a5) + 8d74: 00171793 slli a5,a4,0x1 + 8d78: 1018 addi a4,sp,32 + 8d7a: 97ba add a5,a5,a4 + 8d7c: feb79623 sh a1,-20(a5) + 8d80: 849c lbu a5,9(sp) + 8d82: 8538 lhu a4,10(sp) + 8d84: 100c addi a1,sp,32 + 8d86: 0785 addi a5,a5,1 + 8d88: 0786 slli a5,a5,0x1 + 8d8a: 97ae add a5,a5,a1 + 8d8c: fee79623 sh a4,-20(a5) + 8d90: 849c lbu a5,9(sp) + 8d92: 0785 addi a5,a5,1 + 8d94: 0ff7f793 andi a5,a5,255 + 8d98: 84dc sb a5,9(sp) + 8d9a: bf49 j 8d2c + 8d9c: 841c lbu a5,8(sp) + 8d9e: 1010 addi a2,sp,32 + 8da0: 8538 lhu a4,10(sp) + 8da2: 0789 addi a5,a5,2 + 8da4: 0786 slli a5,a5,0x1 + 8da6: 97b2 add a5,a5,a2 + 8da8: fec7d783 lhu a5,-20(a5) + 8dac: 97ba add a5,a5,a4 + 8dae: 07c2 slli a5,a5,0x10 + 8db0: 83c1 srli a5,a5,0x10 + 8db2: 857c sh a5,10(sp) + 8db4: 841c lbu a5,8(sp) + 8db6: 0785 addi a5,a5,1 + 8db8: 0ff7f793 andi a5,a5,255 + 8dbc: 845c sb a5,8(sp) + 8dbe: bded j 8cb8 + +00008dc0 : + 8dc0: c30f72ef jal t0,1f0 <__riscv_save_0> + 8dc4: 4505 li a0,1 + 8dc6: 2e4d jal 9178 + 8dc8: 4501 li a0,0 + 8dca: 267d jal 9178 + 8dcc: c48f706f j 214 <__riscv_restore_0> + +00008dd0 : + 8dd0: 1141 addi sp,sp,-16 + 8dd2: 400077b7 lui a5,0x40007 + 8dd6: c602 sw zero,12(sp) + 8dd8: c0078793 addi a5,a5,-1024 # 40006c00 <_eusrstack+0x1fffec00> + 8ddc: c63e sw a5,12(sp) + 8dde: 47b2 lw a5,12(sp) + 8de0: 953e add a0,a0,a5 + 8de2: c62a sw a0,12(sp) + 8de4: 47b2 lw a5,12(sp) + 8de6: c38c sw a1,0(a5) + 8de8: 0141 addi sp,sp,16 + 8dea: 8082 ret + +00008dec : + 8dec: 1ffff7b7 lui a5,0x1ffff + 8df0: 7047a503 lw a0,1796(a5) # 1ffff704 <_data_lma+0x1fff14a8> + 8df4: 8082 ret + +00008df6 : + 8df6: 459c lw a5,8(a1) + 8df8: 0107f713 andi a4,a5,16 + 8dfc: 00f7f813 andi a6,a5,15 + 8e00: c701 beqz a4,8e08 + 8e02: 41d8 lw a4,4(a1) + 8e04: 00e86833 or a6,a6,a4 + 8e08: 218e lhu a1,0(a1) + 8e0a: 0ff5f713 andi a4,a1,255 + 8e0e: c339 beqz a4,8e54 + 8e10: 4118 lw a4,0(a0) + 8e12: 4681 li a3,0 + 8e14: 4e85 li t4,1 + 8e16: 4f3d li t5,15 + 8e18: 02800f93 li t6,40 + 8e1c: 04800293 li t0,72 + 8e20: 4e21 li t3,8 + 8e22: 00de9633 sll a2,t4,a3 + 8e26: 00c5f8b3 and a7,a1,a2 + 8e2a: 03161163 bne a2,a7,8e4c + 8e2e: 00269893 slli a7,a3,0x2 + 8e32: 011f1333 sll t1,t5,a7 + 8e36: fff34313 not t1,t1 + 8e3a: 00e37733 and a4,t1,a4 + 8e3e: 011818b3 sll a7,a6,a7 + 8e42: 00e8e733 or a4,a7,a4 + 8e46: 05f79f63 bne a5,t6,8ea4 + 8e4a: c950 sw a2,20(a0) + 8e4c: 0685 addi a3,a3,1 + 8e4e: fdc69ae3 bne a3,t3,8e22 + 8e52: c118 sw a4,0(a0) + 8e54: 0ff00713 li a4,255 + 8e58: 04b77563 bgeu a4,a1,8ea2 + 8e5c: 4154 lw a3,4(a0) + 8e5e: 4621 li a2,8 + 8e60: 4e85 li t4,1 + 8e62: 4f3d li t5,15 + 8e64: 02800f93 li t6,40 + 8e68: 04800293 li t0,72 + 8e6c: 4e41 li t3,16 + 8e6e: 00ce98b3 sll a7,t4,a2 + 8e72: 0115f733 and a4,a1,a7 + 8e76: 02e89263 bne a7,a4,8e9a + 8e7a: 00261713 slli a4,a2,0x2 + 8e7e: 1701 addi a4,a4,-32 + 8e80: 00ef1333 sll t1,t5,a4 + 8e84: fff34313 not t1,t1 + 8e88: 00d376b3 and a3,t1,a3 + 8e8c: 00e81733 sll a4,a6,a4 + 8e90: 8ed9 or a3,a3,a4 + 8e92: 01f79d63 bne a5,t6,8eac + 8e96: 01152a23 sw a7,20(a0) + 8e9a: 0605 addi a2,a2,1 + 8e9c: fdc619e3 bne a2,t3,8e6e + 8ea0: c154 sw a3,4(a0) + 8ea2: 8082 ret + 8ea4: fa5794e3 bne a5,t0,8e4c + 8ea8: c910 sw a2,16(a0) + 8eaa: b74d j 8e4c + 8eac: fe5797e3 bne a5,t0,8e9a + 8eb0: 01152823 sw a7,16(a0) + 8eb4: b7dd j 8e9a + +00008eb6 : + 8eb6: 4508 lw a0,8(a0) + 8eb8: 8d6d and a0,a0,a1 + 8eba: 00a03533 snez a0,a0 + 8ebe: 8082 ret + +00008ec0 : + 8ec0: c219 beqz a2,8ec6 + 8ec2: c90c sw a1,16(a0) + 8ec4: 8082 ret + 8ec6: c94c sw a1,20(a0) + 8ec8: 8082 ret + +00008eca : + 8eca: 82a1aa23 sw a0,-1996(gp) # 20000224 + 8ece: 8082 ret + +00008ed0 : + 8ed0: 8341a703 lw a4,-1996(gp) # 20000224 + 8ed4: 4789 li a5,2 + 8ed6: 2110 lbu a2,0(a0) + 8ed8: 02f71163 bne a4,a5,8efa + 8edc: 3114 lbu a3,1(a0) + 8ede: 478d li a5,3 + 8ee0: 00d7ed63 bltu a5,a3,8efa + 8ee4: 213c lbu a5,2(a0) + 8ee6: 069a slli a3,a3,0x6 + 8ee8: e000e737 lui a4,0xe000e + 8eec: 0796 slli a5,a5,0x5 + 8eee: 8fd5 or a5,a5,a3 + 8ef0: 0ff7f793 andi a5,a5,255 + 8ef4: 9732 add a4,a4,a2 + 8ef6: 40f70023 sb a5,1024(a4) # e000e400 <_eusrstack+0xc0006400> + 8efa: 4154 lw a3,4(a0) + 8efc: 4705 li a4,1 + 8efe: 00565793 srli a5,a2,0x5 + 8f02: 00c71733 sll a4,a4,a2 + 8f06: ca89 beqz a3,8f18 + 8f08: 04078793 addi a5,a5,64 + 8f0c: 078a slli a5,a5,0x2 + 8f0e: e000e6b7 lui a3,0xe000e + 8f12: 97b6 add a5,a5,a3 + 8f14: c398 sw a4,0(a5) + 8f16: 8082 ret + 8f18: 06078793 addi a5,a5,96 + 8f1c: e000e6b7 lui a3,0xe000e + 8f20: 078a slli a5,a5,0x2 + 8f22: 97b6 add a5,a5,a3 + 8f24: c398 sw a4,0(a5) + 8f26: 0000100f fence.i + 8f2a: 8082 ret + +00008f2c : + 8f2c: 40007737 lui a4,0x40007 + 8f30: 431c lw a5,0(a4) + 8f32: c509 beqz a0,8f3c + 8f34: 1007e793 ori a5,a5,256 + 8f38: c31c sw a5,0(a4) + 8f3a: 8082 ret + 8f3c: eff7f793 andi a5,a5,-257 + 8f40: bfe5 j 8f38 + +00008f42 : + 8f42: 400216b7 lui a3,0x40021 + 8f46: 42dc lw a5,4(a3) + 8f48: 7751 lui a4,0xffff4 + 8f4a: 177d addi a4,a4,-1 + 8f4c: 8ff9 and a5,a5,a4 + 8f4e: 8d5d or a0,a0,a5 + 8f50: c2c8 sw a0,4(a3) + 8f52: 8082 ret + +00008f54 : + 8f54: 400217b7 lui a5,0x40021 + 8f58: 02078023 sb zero,32(a5) # 40021020 <_eusrstack+0x20019020> + 8f5c: 02078023 sb zero,32(a5) + 8f60: 4705 li a4,1 + 8f62: 00e50663 beq a0,a4,8f6e + 8f66: 4711 li a4,4 + 8f68: 00e50663 beq a0,a4,8f74 + 8f6c: 8082 ret + 8f6e: 02a78023 sb a0,32(a5) + 8f72: 8082 ret + 8f74: 4715 li a4,5 + 8f76: 02e78023 sb a4,32(a5) + 8f7a: 8082 ret + +00008f7c : + 8f7c: 40021737 lui a4,0x40021 + 8f80: 531c lw a5,32(a4) + 8f82: 8d5d or a0,a0,a5 + 8f84: d308 sw a0,32(a4) + 8f86: 8082 ret + +00008f88 : + 8f88: c901 beqz a0,8f98 + 8f8a: 40021737 lui a4,0x40021 + 8f8e: 531c lw a5,32(a4) + 8f90: 66a1 lui a3,0x8 + 8f92: 8fd5 or a5,a5,a3 + 8f94: d31c sw a5,32(a4) + 8f96: 8082 ret + 8f98: 400216b7 lui a3,0x40021 + 8f9c: 529c lw a5,32(a3) + 8f9e: 7761 lui a4,0xffff8 + 8fa0: 177d addi a4,a4,-1 + 8fa2: 8ff9 and a5,a5,a4 + 8fa4: d29c sw a5,32(a3) + 8fa6: 8082 ret + +00008fa8 : + 8fa8: 40021737 lui a4,0x40021 + 8fac: 435c lw a5,4(a4) + 8fae: 4691 li a3,4 + 8fb0: 8bb1 andi a5,a5,12 + 8fb2: 00d78563 beq a5,a3,8fbc + 8fb6: 46a1 li a3,8 + 8fb8: 06d78263 beq a5,a3,901c + 8fbc: 007a17b7 lui a5,0x7a1 + 8fc0: 20078793 addi a5,a5,512 # 7a1200 <_data_lma+0x792fa4> + 8fc4: c11c sw a5,0(a0) + 8fc6: 40021637 lui a2,0x40021 + 8fca: 425c lw a5,4(a2) + 8fcc: 20000737 lui a4,0x20000 + 8fd0: 01070713 addi a4,a4,16 # 20000010 + 8fd4: 8391 srli a5,a5,0x4 + 8fd6: 8bbd andi a5,a5,15 + 8fd8: 97ba add a5,a5,a4 + 8fda: 2394 lbu a3,0(a5) + 8fdc: 411c lw a5,0(a0) + 8fde: 00d7d7b3 srl a5,a5,a3 + 8fe2: c15c sw a5,4(a0) + 8fe4: 4254 lw a3,4(a2) + 8fe6: 82a1 srli a3,a3,0x8 + 8fe8: 8a9d andi a3,a3,7 + 8fea: 96ba add a3,a3,a4 + 8fec: 2294 lbu a3,0(a3) + 8fee: 00d7d6b3 srl a3,a5,a3 + 8ff2: c514 sw a3,8(a0) + 8ff4: 4254 lw a3,4(a2) + 8ff6: 82ad srli a3,a3,0xb + 8ff8: 8a9d andi a3,a3,7 + 8ffa: 9736 add a4,a4,a3 + 8ffc: 2318 lbu a4,0(a4) + 8ffe: 00e7d7b3 srl a5,a5,a4 + 9002: c55c sw a5,12(a0) + 9004: 4258 lw a4,4(a2) + 9006: 8339 srli a4,a4,0xe + 9008: 00377693 andi a3,a4,3 + 900c: 80418713 addi a4,gp,-2044 # 200001f4 + 9010: 9736 add a4,a4,a3 + 9012: 2318 lbu a4,0(a4) + 9014: 02e7d7b3 divu a5,a5,a4 + 9018: c91c sw a5,16(a0) + 901a: 8082 ret + 901c: 435c lw a5,4(a4) + 901e: 4358 lw a4,4(a4) + 9020: 66c1 lui a3,0x10 + 9022: 83c9 srli a5,a5,0x12 + 9024: 8f75 and a4,a4,a3 + 9026: 1ffff6b7 lui a3,0x1ffff + 902a: 70c6a683 lw a3,1804(a3) # 1ffff70c <_data_lma+0x1fff14b0> + 902e: 8bbd andi a5,a5,15 + 9030: 0789 addi a5,a5,2 + 9032: 01169613 slli a2,a3,0x11 + 9036: 00064863 bltz a2,9046 + 903a: 46c5 li a3,17 + 903c: 4601 li a2,0 + 903e: 02d79263 bne a5,a3,9062 + 9042: 47c9 li a5,18 + 9044: a839 j 9062 + 9046: 4689 li a3,2 + 9048: 02d78f63 beq a5,a3,9086 + 904c: 46bd li a3,15 + 904e: 02d78e63 beq a5,a3,908a + 9052: 46c1 li a3,16 + 9054: 02d78e63 beq a5,a3,9090 + 9058: 46c5 li a3,17 + 905a: 4601 li a2,0 + 905c: 00d79363 bne a5,a3,9062 + 9060: 47c1 li a5,16 + 9062: ef1d bnez a4,90a0 + 9064: 40024737 lui a4,0x40024 + 9068: 80072703 lw a4,-2048(a4) # 40023800 <_eusrstack+0x2001b800> + 906c: 8b41 andi a4,a4,16 + 906e: c705 beqz a4,9096 + 9070: 007a1737 lui a4,0x7a1 + 9074: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 9078: 02f707b3 mul a5,a4,a5 + 907c: c11c sw a5,0(a0) + 907e: d621 beqz a2,8fc6 + 9080: 411c lw a5,0(a0) + 9082: 8385 srli a5,a5,0x1 + 9084: b781 j 8fc4 + 9086: 4601 li a2,0 + 9088: bf6d j 9042 + 908a: 4605 li a2,1 + 908c: 47b5 li a5,13 + 908e: bfd1 j 9062 + 9090: 4601 li a2,0 + 9092: 47bd li a5,15 + 9094: b7f9 j 9062 + 9096: 003d1737 lui a4,0x3d1 + 909a: 90070713 addi a4,a4,-1792 # 3d0900 <_data_lma+0x3c26a4> + 909e: bfe9 j 9078 + 90a0: 400215b7 lui a1,0x40021 + 90a4: 55d8 lw a4,44(a1) + 90a6: 00f71693 slli a3,a4,0xf + 90aa: 55d8 lw a4,44(a1) + 90ac: 0406df63 bgez a3,910a + 90b0: 8311 srli a4,a4,0x4 + 90b2: 8b3d andi a4,a4,15 + 90b4: 00170693 addi a3,a4,1 + 90b8: 007a1737 lui a4,0x7a1 + 90bc: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 90c0: 02d75733 divu a4,a4,a3 + 90c4: c118 sw a4,0(a0) + 90c6: 55d4 lw a3,44(a1) + 90c8: 82a1 srli a3,a3,0x8 + 90ca: 8abd andi a3,a3,15 + 90cc: e28d bnez a3,90ee + 90ce: 4695 li a3,5 + 90d0: 02d70733 mul a4,a4,a3 + 90d4: 8305 srli a4,a4,0x1 + 90d6: c118 sw a4,0(a0) + 90d8: 40021737 lui a4,0x40021 + 90dc: 5758 lw a4,44(a4) + 90de: 4114 lw a3,0(a0) + 90e0: 8b3d andi a4,a4,15 + 90e2: 0705 addi a4,a4,1 + 90e4: 02e6d733 divu a4,a3,a4 + 90e8: c118 sw a4,0(a0) + 90ea: 4118 lw a4,0(a0) + 90ec: b771 j 9078 + 90ee: 4585 li a1,1 + 90f0: 00b69463 bne a3,a1,90f8 + 90f4: 46e5 li a3,25 + 90f6: bfe9 j 90d0 + 90f8: 45bd li a1,15 + 90fa: 00b69663 bne a3,a1,9106 + 90fe: 46d1 li a3,20 + 9100: 02e68733 mul a4,a3,a4 + 9104: bfc9 j 90d6 + 9106: 0689 addi a3,a3,2 + 9108: bfe5 j 9100 + 910a: 8b3d andi a4,a4,15 + 910c: 00170693 addi a3,a4,1 # 40021001 <_eusrstack+0x20019001> + 9110: 007a1737 lui a4,0x7a1 + 9114: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 9118: 02d75733 divu a4,a4,a3 + 911c: b7f1 j 90e8 + +0000911e : + 911e: c599 beqz a1,912c + 9120: 40021737 lui a4,0x40021 + 9124: 4f1c lw a5,24(a4) + 9126: 8d5d or a0,a0,a5 + 9128: cf08 sw a0,24(a4) + 912a: 8082 ret + 912c: 400217b7 lui a5,0x40021 + 9130: 4f98 lw a4,24(a5) + 9132: fff54513 not a0,a0 + 9136: 8d79 and a0,a0,a4 + 9138: cf88 sw a0,24(a5) + 913a: 8082 ret + +0000913c : + 913c: c599 beqz a1,914a + 913e: 40021737 lui a4,0x40021 + 9142: 4f5c lw a5,28(a4) + 9144: 8d5d or a0,a0,a5 + 9146: cf48 sw a0,28(a4) + 9148: 8082 ret + 914a: 400217b7 lui a5,0x40021 + 914e: 4fd8 lw a4,28(a5) + 9150: fff54513 not a0,a0 + 9154: 8d79 and a0,a0,a4 + 9156: cfc8 sw a0,28(a5) + 9158: 8082 ret + +0000915a : + 915a: c599 beqz a1,9168 + 915c: 40021737 lui a4,0x40021 + 9160: 475c lw a5,12(a4) + 9162: 8d5d or a0,a0,a5 + 9164: c748 sw a0,12(a4) + 9166: 8082 ret + 9168: 400217b7 lui a5,0x40021 + 916c: 47d8 lw a4,12(a5) + 916e: fff54513 not a0,a0 + 9172: 8d79 and a0,a0,a4 + 9174: c7c8 sw a0,12(a5) + 9176: 8082 ret + +00009178 : + 9178: c901 beqz a0,9188 + 917a: 40021737 lui a4,0x40021 + 917e: 531c lw a5,32(a4) + 9180: 66c1 lui a3,0x10 + 9182: 8fd5 or a5,a5,a3 + 9184: d31c sw a5,32(a4) + 9186: 8082 ret + 9188: 400216b7 lui a3,0x40021 + 918c: 529c lw a5,32(a3) + 918e: 7741 lui a4,0xffff0 + 9190: 177d addi a4,a4,-1 + 9192: 8ff9 and a5,a5,a4 + 9194: d29c sw a5,32(a3) + 9196: 8082 ret + +00009198 : + 9198: 00555793 srli a5,a0,0x5 + 919c: 4705 li a4,1 + 919e: 00e79963 bne a5,a4,91b0 + 91a2: 400217b7 lui a5,0x40021 + 91a6: 439c lw a5,0(a5) + 91a8: 00a7d533 srl a0,a5,a0 + 91ac: 8905 andi a0,a0,1 + 91ae: 8082 ret + 91b0: 4709 li a4,2 + 91b2: 00e79663 bne a5,a4,91be + 91b6: 400217b7 lui a5,0x40021 + 91ba: 539c lw a5,32(a5) + 91bc: b7f5 j 91a8 + 91be: 400217b7 lui a5,0x40021 + 91c2: 53dc lw a5,36(a5) + 91c4: b7d5 j 91a8 + +000091c6 : + 91c6: 400037b7 lui a5,0x40003 + 91ca: 8007d703 lhu a4,-2048(a5) # 40002800 <_eusrstack+0x1fffa800> + 91ce: c589 beqz a1,91d8 + 91d0: 8d59 or a0,a0,a4 + 91d2: 80a79023 sh a0,-2048(a5) + 91d6: 8082 ret + 91d8: fff54513 not a0,a0 + 91dc: 8d79 and a0,a0,a4 + 91de: bfd5 j 91d2 + +000091e0 : + 91e0: 400037b7 lui a5,0x40003 + 91e4: 8047d703 lhu a4,-2044(a5) # 40002804 <_eusrstack+0x1fffa804> + 91e8: 01076713 ori a4,a4,16 + 91ec: 80e79223 sh a4,-2044(a5) + 91f0: 8082 ret + +000091f2 : + 91f2: 40003737 lui a4,0x40003 + 91f6: 80475783 lhu a5,-2044(a4) # 40002804 <_eusrstack+0x1fffa804> + 91fa: 07c2 slli a5,a5,0x10 + 91fc: 83c1 srli a5,a5,0x10 + 91fe: 9bbd andi a5,a5,-17 + 9200: 07c2 slli a5,a5,0x10 + 9202: 83c1 srli a5,a5,0x10 + 9204: 80f71223 sh a5,-2044(a4) + 9208: 8082 ret + +0000920a : + 920a: 40003637 lui a2,0x40003 + 920e: 81865683 lhu a3,-2024(a2) # 40002818 <_eusrstack+0x1fffa818> + 9212: 81865703 lhu a4,-2024(a2) + 9216: 0742 slli a4,a4,0x10 + 9218: 8341 srli a4,a4,0x10 + 921a: fed71ae3 bne a4,a3,920e + 921e: 40003637 lui a2,0x40003 + 9222: 81c65683 lhu a3,-2020(a2) # 4000281c <_eusrstack+0x1fffa81c> + 9226: 81c65783 lhu a5,-2020(a2) + 922a: 07c2 slli a5,a5,0x10 + 922c: 83c1 srli a5,a5,0x10 + 922e: fed79ae3 bne a5,a3,9222 + 9232: 400035b7 lui a1,0x40003 + 9236: 8185d603 lhu a2,-2024(a1) # 40002818 <_eusrstack+0x1fffa818> + 923a: 8185d503 lhu a0,-2024(a1) + 923e: 0542 slli a0,a0,0x10 + 9240: 8141 srli a0,a0,0x10 + 9242: fec51ae3 bne a0,a2,9236 + 9246: 00a70c63 beq a4,a0,925e + 924a: 400036b7 lui a3,0x40003 + 924e: 81c6d703 lhu a4,-2020(a3) # 4000281c <_eusrstack+0x1fffa81c> + 9252: 81c6d783 lhu a5,-2020(a3) + 9256: 07c2 slli a5,a5,0x10 + 9258: 83c1 srli a5,a5,0x10 + 925a: fee79ae3 bne a5,a4,924e + 925e: 0542 slli a0,a0,0x10 + 9260: 8d5d or a0,a0,a5 + 9262: 8082 ret + +00009264 : + 9264: f8df62ef jal t0,1f0 <__riscv_save_0> + 9268: 1141 addi sp,sp,-16 + 926a: c62a sw a0,12(sp) + 926c: f75ff0ef jal ra,91e0 + 9270: 4532 lw a0,12(sp) + 9272: 400037b7 lui a5,0x40003 + 9276: 01055713 srli a4,a0,0x10 + 927a: 0542 slli a0,a0,0x10 + 927c: 80e79c23 sh a4,-2024(a5) # 40002818 <_eusrstack+0x1fffa818> + 9280: 8141 srli a0,a0,0x10 + 9282: 80a79e23 sh a0,-2020(a5) + 9286: f6dff0ef jal ra,91f2 + 928a: 0141 addi sp,sp,16 + 928c: f89f606f j 214 <__riscv_restore_0> + +00009290 : + 9290: f61f62ef jal t0,1f0 <__riscv_save_0> + 9294: 1141 addi sp,sp,-16 + 9296: c62a sw a0,12(sp) + 9298: f49ff0ef jal ra,91e0 + 929c: 4532 lw a0,12(sp) + 929e: 400037b7 lui a5,0x40003 + 92a2: 01055713 srli a4,a0,0x10 + 92a6: 8b3d andi a4,a4,15 + 92a8: 0542 slli a0,a0,0x10 + 92aa: 80e79423 sh a4,-2040(a5) # 40002808 <_eusrstack+0x1fffa808> + 92ae: 8141 srli a0,a0,0x10 + 92b0: 80a79623 sh a0,-2036(a5) + 92b4: f3fff0ef jal ra,91f2 + 92b8: 0141 addi sp,sp,16 + 92ba: f5bf606f j 214 <__riscv_restore_0> + +000092be : + 92be: 40003737 lui a4,0x40003 + 92c2: 80475783 lhu a5,-2044(a4) # 40002804 <_eusrstack+0x1fffa804> + 92c6: 0207f793 andi a5,a5,32 + 92ca: dfe5 beqz a5,92c2 + 92cc: 8082 ret + +000092ce : + 92ce: 40003737 lui a4,0x40003 + 92d2: 80475783 lhu a5,-2044(a4) # 40002804 <_eusrstack+0x1fffa804> + 92d6: 07c2 slli a5,a5,0x10 + 92d8: 83c1 srli a5,a5,0x10 + 92da: 9bdd andi a5,a5,-9 + 92dc: 07c2 slli a5,a5,0x10 + 92de: 83c1 srli a5,a5,0x10 + 92e0: 80f71223 sh a5,-2044(a4) + 92e4: 40003737 lui a4,0x40003 + 92e8: 80475783 lhu a5,-2044(a4) # 40002804 <_eusrstack+0x1fffa804> + 92ec: 8ba1 andi a5,a5,8 + 92ee: dfed beqz a5,92e8 + 92f0: 8082 ret + +000092f2 : + 92f2: 400037b7 lui a5,0x40003 + 92f6: 8047d703 lhu a4,-2044(a5) # 40002804 <_eusrstack+0x1fffa804> + 92fa: fff54513 not a0,a0 + 92fe: 8d79 and a0,a0,a4 + 9300: 80a79223 sh a0,-2044(a5) + 9304: 8082 ret + +00009306 : + 9306: eebf62ef jal t0,1f0 <__riscv_save_0> + 930a: fe9ff0ef jal ra,92f2 + 930e: f07f606f j 214 <__riscv_restore_0> + +00009312 : + 9312: 211a lhu a4,0(a0) + 9314: 678d lui a5,0x3 + 9316: 04078793 addi a5,a5,64 # 3040 + 931a: 21b6 lhu a3,2(a1) + 931c: 8f7d and a4,a4,a5 + 931e: 219e lhu a5,0(a1) + 9320: 8fd5 or a5,a5,a3 + 9322: 21d6 lhu a3,4(a1) + 9324: 8fd5 or a5,a5,a3 + 9326: 21f6 lhu a3,6(a1) + 9328: 8fd5 or a5,a5,a3 + 932a: 2596 lhu a3,8(a1) + 932c: 8fd5 or a5,a5,a3 + 932e: 25b6 lhu a3,10(a1) + 9330: 8fd5 or a5,a5,a3 + 9332: 25d6 lhu a3,12(a1) + 9334: 8fd5 or a5,a5,a3 + 9336: 25f6 lhu a3,14(a1) + 9338: 8fd5 or a5,a5,a3 + 933a: 8fd9 or a5,a5,a4 + 933c: a11e sh a5,0(a0) + 933e: 2d5a lhu a4,28(a0) + 9340: 77fd lui a5,0xfffff + 9342: 7ff78793 addi a5,a5,2047 # fffff7ff <_eusrstack+0xdfff77ff> + 9346: 8ff9 and a5,a5,a4 + 9348: ad5e sh a5,28(a0) + 934a: 299e lhu a5,16(a1) + 934c: a91e sh a5,16(a0) + 934e: 8082 ret + +00009350 : + 9350: 211e lhu a5,0(a0) + 9352: c589 beqz a1,935c + 9354: 0407e793 ori a5,a5,64 + 9358: a11e sh a5,0(a0) + 935a: 8082 ret + 935c: 07c2 slli a5,a5,0x10 + 935e: 83c1 srli a5,a5,0x10 + 9360: fbf7f793 andi a5,a5,-65 + 9364: 07c2 slli a5,a5,0x10 + 9366: 83c1 srli a5,a5,0x10 + 9368: bfc5 j 9358 + +0000936a : + 936a: a54e sh a1,12(a0) + 936c: 8082 ret + +0000936e : + 936e: 254a lhu a0,12(a0) + 9370: 8082 ret + +00009372 : + 9372: 250a lhu a0,8(a0) + 9374: 8d6d and a0,a0,a1 + 9376: 00a03533 snez a0,a0 + 937a: 8082 ret + +0000937c : + 937c: e75f62ef jal t0,1f0 <__riscv_save_0> + 9380: 2916 lhu a3,16(a0) + 9382: 77f5 lui a5,0xffffd + 9384: 17fd addi a5,a5,-1 + 9386: 8ff5 and a5,a5,a3 + 9388: 21f6 lhu a3,6(a1) + 938a: 25da lhu a4,12(a1) + 938c: 7179 addi sp,sp,-48 + 938e: 8fd5 or a5,a5,a3 + 9390: a91e sh a5,16(a0) + 9392: 2556 lhu a3,12(a0) + 9394: 77fd lui a5,0xfffff + 9396: 9f378793 addi a5,a5,-1549 # ffffe9f3 <_eusrstack+0xdfff69f3> + 939a: 8ff5 and a5,a5,a3 + 939c: 21d6 lhu a3,4(a1) + 939e: 842a mv s0,a0 + 93a0: c62e sw a1,12(sp) + 93a2: 8fd5 or a5,a5,a3 + 93a4: 2596 lhu a3,8(a1) + 93a6: 8fd5 or a5,a5,a3 + 93a8: 25b6 lhu a3,10(a1) + 93aa: 8fd5 or a5,a5,a3 + 93ac: a55e sh a5,12(a0) + 93ae: 295e lhu a5,20(a0) + 93b0: 07c2 slli a5,a5,0x10 + 93b2: 83c1 srli a5,a5,0x10 + 93b4: cff7f793 andi a5,a5,-769 + 93b8: 8fd9 or a5,a5,a4 + 93ba: a95e sh a5,20(a0) + 93bc: 0868 addi a0,sp,28 + 93be: bebff0ef jal ra,8fa8 + 93c2: 400147b7 lui a5,0x40014 + 93c6: 80078793 addi a5,a5,-2048 # 40013800 <_eusrstack+0x2000b800> + 93ca: 45b2 lw a1,12(sp) + 93cc: 02f41e63 bne s0,a5,9408 + 93d0: 57a2 lw a5,40(sp) + 93d2: 4765 li a4,25 + 93d4: 02e787b3 mul a5,a5,a4 + 93d8: 4198 lw a4,0(a1) + 93da: 06400693 li a3,100 + 93de: 070a slli a4,a4,0x2 + 93e0: 02e7d7b3 divu a5,a5,a4 + 93e4: 02d7d733 divu a4,a5,a3 + 93e8: 02d7f7b3 remu a5,a5,a3 + 93ec: 0712 slli a4,a4,0x4 + 93ee: 0792 slli a5,a5,0x4 + 93f0: 03278793 addi a5,a5,50 + 93f4: 02d7d7b3 divu a5,a5,a3 + 93f8: 8bbd andi a5,a5,15 + 93fa: 8fd9 or a5,a5,a4 + 93fc: 07c2 slli a5,a5,0x10 + 93fe: 83c1 srli a5,a5,0x10 + 9400: a41e sh a5,8(s0) + 9402: 6145 addi sp,sp,48 + 9404: e11f606f j 214 <__riscv_restore_0> + 9408: 5792 lw a5,36(sp) + 940a: b7e1 j 93d2 + +0000940c : + 940c: c591 beqz a1,9418 + 940e: 255e lhu a5,12(a0) + 9410: 6709 lui a4,0x2 + 9412: 8fd9 or a5,a5,a4 + 9414: a55e sh a5,12(a0) + 9416: 8082 ret + 9418: 255a lhu a4,12(a0) + 941a: 77f9 lui a5,0xffffe + 941c: 17fd addi a5,a5,-1 + 941e: 8ff9 and a5,a5,a4 + 9420: bfd5 j 9414 + +00009422 : + 9422: 1ff5f593 andi a1,a1,511 + 9426: a14e sh a1,4(a0) + 9428: 8082 ret + +0000942a : + 942a: 214a lhu a0,4(a0) + 942c: 1ff57513 andi a0,a0,511 + 9430: 8082 ret + +00009432 : + 9432: 210a lhu a0,0(a0) + 9434: 8d6d and a0,a0,a1 + 9436: 00a03533 snez a0,a0 + 943a: 8082 ret + +0000943c : + 943c: 200007b7 lui a5,0x20000 + 9440: 1f07a783 lw a5,496(a5) # 200001f0 + 9444: 007a1737 lui a4,0x7a1 + 9448: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x792fa4> + 944c: 02e7d7b3 divu a5,a5,a4 + 9450: 0ff7f793 andi a5,a5,255 + 9454: 82f18d23 sb a5,-1990(gp) # 2000022a + 9458: 3e800713 li a4,1000 + 945c: 02e787b3 mul a5,a5,a4 + 9460: 82f19c23 sh a5,-1992(gp) # 20000228 + 9464: 8082 ret + +00009466 : + 9466: e000f7b7 lui a5,0xe000f + 946a: 43d8 lw a4,4(a5) + 946c: 4681 li a3,0 + 946e: 9b79 andi a4,a4,-2 + 9470: c3d8 sw a4,4(a5) + 9472: 8381d703 lhu a4,-1992(gp) # 20000228 + 9476: 02a70633 mul a2,a4,a0 + 947a: cb90 sw a2,16(a5) + 947c: cbd4 sw a3,20(a5) + 947e: 4398 lw a4,0(a5) + 9480: 01076713 ori a4,a4,16 + 9484: c398 sw a4,0(a5) + 9486: 4398 lw a4,0(a5) + 9488: 02176713 ori a4,a4,33 + 948c: c398 sw a4,0(a5) + 948e: 43d8 lw a4,4(a5) + 9490: 8b05 andi a4,a4,1 + 9492: df75 beqz a4,948e + 9494: 4398 lw a4,0(a5) + 9496: 9b79 andi a4,a4,-2 + 9498: c398 sw a4,0(a5) + 949a: 8082 ret + +0000949c <_write>: + 949c: d3bf62ef jal t0,1d6 <__riscv_save_4> + 94a0: 400144b7 lui s1,0x40014 + 94a4: 89ae mv s3,a1 + 94a6: 8932 mv s2,a2 + 94a8: 4401 li s0,0 + 94aa: 80048493 addi s1,s1,-2048 # 40013800 <_eusrstack+0x2000b800> + 94ae: 01244563 blt s0,s2,94b8 <_write+0x1c> + 94b2: 854a mv a0,s2 + 94b4: d57f606f j 20a <__riscv_restore_4> + 94b8: 04000593 li a1,64 + 94bc: 8526 mv a0,s1 + 94be: f75ff0ef jal ra,9432 + 94c2: d97d beqz a0,94b8 <_write+0x1c> + 94c4: 008987b3 add a5,s3,s0 + 94c8: 00078583 lb a1,0(a5) # e000f000 <_eusrstack+0xc0007000> + 94cc: 8526 mv a0,s1 + 94ce: 0405 addi s0,s0,1 + 94d0: 05c2 slli a1,a1,0x10 + 94d2: 81c1 srli a1,a1,0x10 + 94d4: f4fff0ef jal ra,9422 + 94d8: bfd9 j 94ae <_write+0x12> + +000094da <_sbrk>: + 94da: 80818713 addi a4,gp,-2040 # 200001f8 + 94de: 431c lw a5,0(a4) + 94e0: 79018693 addi a3,gp,1936 # 20001180 <_ebss> + 94e4: 953e add a0,a0,a5 + 94e6: 00d56b63 bltu a0,a3,94fc <_sbrk+0x22> + 94ea: 200086b7 lui a3,0x20008 + 94ee: 80068693 addi a3,a3,-2048 # 20007800 <_heap_end> + 94f2: 00a6e563 bltu a3,a0,94fc <_sbrk+0x22> + 94f6: c308 sw a0,0(a4) + 94f8: 853e mv a0,a5 + 94fa: 8082 ret + 94fc: 57fd li a5,-1 + 94fe: bfed j 94f8 <_sbrk+0x1e> + +00009500 <__ashldi3>: + 9500: ce11 beqz a2,951c <__ashldi3+0x1c> + 9502: 02000793 li a5,32 + 9506: 8f91 sub a5,a5,a2 + 9508: 00f05b63 blez a5,951e <__ashldi3+0x1e> + 950c: 00c595b3 sll a1,a1,a2 + 9510: 00f557b3 srl a5,a0,a5 + 9514: 00c51633 sll a2,a0,a2 + 9518: 8ddd or a1,a1,a5 + 951a: 8532 mv a0,a2 + 951c: 8082 ret + 951e: fe060593 addi a1,a2,-32 + 9522: 4601 li a2,0 + 9524: 00b515b3 sll a1,a0,a1 + 9528: 8532 mv a0,a2 + 952a: bfcd j 951c <__ashldi3+0x1c> + +0000952c <__udivdi3>: + 952c: 87b6 mv a5,a3 + 952e: 88b2 mv a7,a2 + 9530: 832a mv t1,a0 + 9532: 882e mv a6,a1 + 9534: 14069b63 bnez a3,968a <__udivdi3+0x15e> + 9538: 0ac5f863 bgeu a1,a2,95e8 <__udivdi3+0xbc> + 953c: 6741 lui a4,0x10 + 953e: 1ae66b63 bltu a2,a4,96f4 <__udivdi3+0x1c8> + 9542: 010007b7 lui a5,0x1000 + 9546: 34f66063 bltu a2,a5,9886 <__udivdi3+0x35a> + 954a: 01865693 srli a3,a2,0x18 + 954e: 47e1 li a5,24 + 9550: 00005717 auipc a4,0x5 + 9554: a6070713 addi a4,a4,-1440 # dfb0 <__clz_tab> + 9558: 9736 add a4,a4,a3 + 955a: 2318 lbu a4,0(a4) + 955c: 97ba add a5,a5,a4 + 955e: 02000713 li a4,32 + 9562: 8f1d sub a4,a4,a5 + 9564: cb19 beqz a4,957a <__udivdi3+0x4e> + 9566: 00e59833 sll a6,a1,a4 + 956a: 00f557b3 srl a5,a0,a5 + 956e: 00e618b3 sll a7,a2,a4 + 9572: 0107e833 or a6,a5,a6 + 9576: 00e51333 sll t1,a0,a4 + 957a: 0108d613 srli a2,a7,0x10 + 957e: 02c85533 divu a0,a6,a2 + 9582: 01089693 slli a3,a7,0x10 + 9586: 82c1 srli a3,a3,0x10 + 9588: 01035793 srli a5,t1,0x10 + 958c: 02c87733 remu a4,a6,a2 + 9590: 02a685b3 mul a1,a3,a0 + 9594: 0742 slli a4,a4,0x10 + 9596: 00f76833 or a6,a4,a5 + 959a: 00b87a63 bgeu a6,a1,95ae <__udivdi3+0x82> + 959e: 9846 add a6,a6,a7 + 95a0: fff50793 addi a5,a0,-1 + 95a4: 01186463 bltu a6,a7,95ac <__udivdi3+0x80> + 95a8: 30b86563 bltu a6,a1,98b2 <__udivdi3+0x386> + 95ac: 853e mv a0,a5 + 95ae: 40b80833 sub a6,a6,a1 + 95b2: 02c85733 divu a4,a6,a2 + 95b6: 0342 slli t1,t1,0x10 + 95b8: 01035313 srli t1,t1,0x10 + 95bc: 02c87833 remu a6,a6,a2 + 95c0: 02e686b3 mul a3,a3,a4 + 95c4: 0842 slli a6,a6,0x10 + 95c6: 00686833 or a6,a6,t1 + 95ca: 00d87b63 bgeu a6,a3,95e0 <__udivdi3+0xb4> + 95ce: 9846 add a6,a6,a7 + 95d0: fff70793 addi a5,a4,-1 + 95d4: 01186563 bltu a6,a7,95de <__udivdi3+0xb2> + 95d8: 1779 addi a4,a4,-2 + 95da: 00d86363 bltu a6,a3,95e0 <__udivdi3+0xb4> + 95de: 873e mv a4,a5 + 95e0: 0542 slli a0,a0,0x10 + 95e2: 8d59 or a0,a0,a4 + 95e4: 4581 li a1,0 + 95e6: 8082 ret + 95e8: e601 bnez a2,95f0 <__udivdi3+0xc4> + 95ea: 4705 li a4,1 + 95ec: 02c758b3 divu a7,a4,a2 + 95f0: 6741 lui a4,0x10 + 95f2: 0ee8e863 bltu a7,a4,96e2 <__udivdi3+0x1b6> + 95f6: 010007b7 lui a5,0x1000 + 95fa: 28f8ea63 bltu a7,a5,988e <__udivdi3+0x362> + 95fe: 0188d693 srli a3,a7,0x18 + 9602: 47e1 li a5,24 + 9604: 00005717 auipc a4,0x5 + 9608: 9ac70713 addi a4,a4,-1620 # dfb0 <__clz_tab> + 960c: 9736 add a4,a4,a3 + 960e: 2314 lbu a3,0(a4) + 9610: 96be add a3,a3,a5 + 9612: 02000793 li a5,32 + 9616: 8f95 sub a5,a5,a3 + 9618: e7fd bnez a5,9706 <__udivdi3+0x1da> + 961a: 01089e93 slli t4,a7,0x10 + 961e: 41158733 sub a4,a1,a7 + 9622: 0108df13 srli t5,a7,0x10 + 9626: 010ede93 srli t4,t4,0x10 + 962a: 4585 li a1,1 + 962c: 01035793 srli a5,t1,0x10 + 9630: 03e75533 divu a0,a4,t5 + 9634: 03e77733 remu a4,a4,t5 + 9638: 03d506b3 mul a3,a0,t4 + 963c: 0742 slli a4,a4,0x10 + 963e: 8fd9 or a5,a5,a4 + 9640: 00d7fa63 bgeu a5,a3,9654 <__udivdi3+0x128> + 9644: 97c6 add a5,a5,a7 + 9646: fff50713 addi a4,a0,-1 + 964a: 0117e463 bltu a5,a7,9652 <__udivdi3+0x126> + 964e: 26d7e563 bltu a5,a3,98b8 <__udivdi3+0x38c> + 9652: 853a mv a0,a4 + 9654: 8f95 sub a5,a5,a3 + 9656: 03e7d733 divu a4,a5,t5 + 965a: 0342 slli t1,t1,0x10 + 965c: 01035313 srli t1,t1,0x10 + 9660: 03e7f7b3 remu a5,a5,t5 + 9664: 03d70eb3 mul t4,a4,t4 + 9668: 07c2 slli a5,a5,0x10 + 966a: 0067e7b3 or a5,a5,t1 + 966e: 01d7fb63 bgeu a5,t4,9684 <__udivdi3+0x158> + 9672: 97c6 add a5,a5,a7 + 9674: fff70693 addi a3,a4,-1 + 9678: 0117e563 bltu a5,a7,9682 <__udivdi3+0x156> + 967c: 1779 addi a4,a4,-2 + 967e: 01d7e363 bltu a5,t4,9684 <__udivdi3+0x158> + 9682: 8736 mv a4,a3 + 9684: 0542 slli a0,a0,0x10 + 9686: 8d59 or a0,a0,a4 + 9688: 8082 ret + 968a: 04d5e163 bltu a1,a3,96cc <__udivdi3+0x1a0> + 968e: 67c1 lui a5,0x10 + 9690: 04f6e163 bltu a3,a5,96d2 <__udivdi3+0x1a6> + 9694: 010007b7 lui a5,0x1000 + 9698: 1ef6e363 bltu a3,a5,987e <__udivdi3+0x352> + 969c: 0186d713 srli a4,a3,0x18 + 96a0: 4861 li a6,24 + 96a2: 00005797 auipc a5,0x5 + 96a6: 90e78793 addi a5,a5,-1778 # dfb0 <__clz_tab> + 96aa: 97ba add a5,a5,a4 + 96ac: 2398 lbu a4,0(a5) + 96ae: 02000e13 li t3,32 + 96b2: 9742 add a4,a4,a6 + 96b4: 40ee0e33 sub t3,t3,a4 + 96b8: 0c0e1a63 bnez t3,978c <__udivdi3+0x260> + 96bc: 1cb6ed63 bltu a3,a1,9896 <__udivdi3+0x36a> + 96c0: 00c53533 sltu a0,a0,a2 + 96c4: 00154513 xori a0,a0,1 + 96c8: 4581 li a1,0 + 96ca: 8082 ret + 96cc: 4581 li a1,0 + 96ce: 4501 li a0,0 + 96d0: 8082 ret + 96d2: 0ff00793 li a5,255 + 96d6: 1cd7f363 bgeu a5,a3,989c <__udivdi3+0x370> + 96da: 0086d713 srli a4,a3,0x8 + 96de: 4821 li a6,8 + 96e0: b7c9 j 96a2 <__udivdi3+0x176> + 96e2: 0ff00713 li a4,255 + 96e6: 86c6 mv a3,a7 + 96e8: f1177ee3 bgeu a4,a7,9604 <__udivdi3+0xd8> + 96ec: 0088d693 srli a3,a7,0x8 + 96f0: 47a1 li a5,8 + 96f2: bf09 j 9604 <__udivdi3+0xd8> + 96f4: 0ff00713 li a4,255 + 96f8: 86b2 mv a3,a2 + 96fa: e4c77be3 bgeu a4,a2,9550 <__udivdi3+0x24> + 96fe: 00865693 srli a3,a2,0x8 + 9702: 47a1 li a5,8 + 9704: b5b1 j 9550 <__udivdi3+0x24> + 9706: 00f898b3 sll a7,a7,a5 + 970a: 00d5d633 srl a2,a1,a3 + 970e: 0108df13 srli t5,a7,0x10 + 9712: 03e65e33 divu t3,a2,t5 + 9716: 00f59733 sll a4,a1,a5 + 971a: 00d556b3 srl a3,a0,a3 + 971e: 8f55 or a4,a4,a3 + 9720: 01089e93 slli t4,a7,0x10 + 9724: 010ede93 srli t4,t4,0x10 + 9728: 00f51333 sll t1,a0,a5 + 972c: 01075593 srli a1,a4,0x10 + 9730: 03e676b3 remu a3,a2,t5 + 9734: 03ce87b3 mul a5,t4,t3 + 9738: 06c2 slli a3,a3,0x10 + 973a: 8ecd or a3,a3,a1 + 973c: 00f6fb63 bgeu a3,a5,9752 <__udivdi3+0x226> + 9740: 96c6 add a3,a3,a7 + 9742: fffe0613 addi a2,t3,-1 + 9746: 1716e463 bltu a3,a7,98ae <__udivdi3+0x382> + 974a: 16f6f263 bgeu a3,a5,98ae <__udivdi3+0x382> + 974e: 1e79 addi t3,t3,-2 + 9750: 96c6 add a3,a3,a7 + 9752: 8e9d sub a3,a3,a5 + 9754: 03e6d633 divu a2,a3,t5 + 9758: 01071793 slli a5,a4,0x10 + 975c: 83c1 srli a5,a5,0x10 + 975e: 03e6f6b3 remu a3,a3,t5 + 9762: 02ce8533 mul a0,t4,a2 + 9766: 01069713 slli a4,a3,0x10 + 976a: 8f5d or a4,a4,a5 + 976c: 00a77b63 bgeu a4,a0,9782 <__udivdi3+0x256> + 9770: 9746 add a4,a4,a7 + 9772: fff60793 addi a5,a2,-1 + 9776: 13176863 bltu a4,a7,98a6 <__udivdi3+0x37a> + 977a: 12a77663 bgeu a4,a0,98a6 <__udivdi3+0x37a> + 977e: 1679 addi a2,a2,-2 + 9780: 9746 add a4,a4,a7 + 9782: 010e1593 slli a1,t3,0x10 + 9786: 8f09 sub a4,a4,a0 + 9788: 8dd1 or a1,a1,a2 + 978a: b54d j 962c <__udivdi3+0x100> + 978c: 00e657b3 srl a5,a2,a4 + 9790: 01c696b3 sll a3,a3,t3 + 9794: 8edd or a3,a3,a5 + 9796: 00e5d333 srl t1,a1,a4 + 979a: 0106df13 srli t5,a3,0x10 + 979e: 03e357b3 divu a5,t1,t5 + 97a2: 01069e93 slli t4,a3,0x10 + 97a6: 010ede93 srli t4,t4,0x10 + 97aa: 01c59833 sll a6,a1,t3 + 97ae: 00e55733 srl a4,a0,a4 + 97b2: 01076833 or a6,a4,a6 + 97b6: 01085893 srli a7,a6,0x10 + 97ba: 01c61633 sll a2,a2,t3 + 97be: 03e37333 remu t1,t1,t5 + 97c2: 02fe85b3 mul a1,t4,a5 + 97c6: 0342 slli t1,t1,0x10 + 97c8: 011368b3 or a7,t1,a7 + 97cc: 00b8fb63 bgeu a7,a1,97e2 <__udivdi3+0x2b6> + 97d0: 98b6 add a7,a7,a3 + 97d2: fff78713 addi a4,a5,-1 + 97d6: 0cd8ea63 bltu a7,a3,98aa <__udivdi3+0x37e> + 97da: 0cb8f863 bgeu a7,a1,98aa <__udivdi3+0x37e> + 97de: 17f9 addi a5,a5,-2 + 97e0: 98b6 add a7,a7,a3 + 97e2: 40b888b3 sub a7,a7,a1 + 97e6: 03e8d733 divu a4,a7,t5 + 97ea: 0842 slli a6,a6,0x10 + 97ec: 01085813 srli a6,a6,0x10 + 97f0: 03e8f8b3 remu a7,a7,t5 + 97f4: 02ee8333 mul t1,t4,a4 + 97f8: 08c2 slli a7,a7,0x10 + 97fa: 0108e5b3 or a1,a7,a6 + 97fe: 0065fb63 bgeu a1,t1,9814 <__udivdi3+0x2e8> + 9802: 95b6 add a1,a1,a3 + 9804: fff70813 addi a6,a4,-1 + 9808: 08d5ed63 bltu a1,a3,98a2 <__udivdi3+0x376> + 980c: 0865fb63 bgeu a1,t1,98a2 <__udivdi3+0x376> + 9810: 1779 addi a4,a4,-2 + 9812: 95b6 add a1,a1,a3 + 9814: 07c2 slli a5,a5,0x10 + 9816: 6f41 lui t5,0x10 + 9818: 8fd9 or a5,a5,a4 + 981a: ffff0713 addi a4,t5,-1 # ffff <_data_lma+0x1da3> + 981e: 00e7f6b3 and a3,a5,a4 + 9822: 0107d893 srli a7,a5,0x10 + 9826: 8f71 and a4,a4,a2 + 9828: 8241 srli a2,a2,0x10 + 982a: 02e68eb3 mul t4,a3,a4 + 982e: 406585b3 sub a1,a1,t1 + 9832: 02c686b3 mul a3,a3,a2 + 9836: 010ed813 srli a6,t4,0x10 + 983a: 02e88733 mul a4,a7,a4 + 983e: 96ba add a3,a3,a4 + 9840: 96c2 add a3,a3,a6 + 9842: 02c88633 mul a2,a7,a2 + 9846: 00e6f363 bgeu a3,a4,984c <__udivdi3+0x320> + 984a: 967a add a2,a2,t5 + 984c: 0106d893 srli a7,a3,0x10 + 9850: 9646 add a2,a2,a7 + 9852: 02c5e263 bltu a1,a2,9876 <__udivdi3+0x34a> + 9856: 00c58563 beq a1,a2,9860 <__udivdi3+0x334> + 985a: 853e mv a0,a5 + 985c: 4581 li a1,0 + 985e: 8082 ret + 9860: 6741 lui a4,0x10 + 9862: 177d addi a4,a4,-1 + 9864: 8ef9 and a3,a3,a4 + 9866: 06c2 slli a3,a3,0x10 + 9868: 00eefeb3 and t4,t4,a4 + 986c: 01c51533 sll a0,a0,t3 + 9870: 96f6 add a3,a3,t4 + 9872: fed574e3 bgeu a0,a3,985a <__udivdi3+0x32e> + 9876: fff78513 addi a0,a5,-1 + 987a: 4581 li a1,0 + 987c: 8082 ret + 987e: 0106d713 srli a4,a3,0x10 + 9882: 4841 li a6,16 + 9884: bd39 j 96a2 <__udivdi3+0x176> + 9886: 01065693 srli a3,a2,0x10 + 988a: 47c1 li a5,16 + 988c: b1d1 j 9550 <__udivdi3+0x24> + 988e: 0108d693 srli a3,a7,0x10 + 9892: 47c1 li a5,16 + 9894: bb85 j 9604 <__udivdi3+0xd8> + 9896: 4581 li a1,0 + 9898: 4505 li a0,1 + 989a: 8082 ret + 989c: 8736 mv a4,a3 + 989e: 4801 li a6,0 + 98a0: b509 j 96a2 <__udivdi3+0x176> + 98a2: 8742 mv a4,a6 + 98a4: bf85 j 9814 <__udivdi3+0x2e8> + 98a6: 863e mv a2,a5 + 98a8: bde9 j 9782 <__udivdi3+0x256> + 98aa: 87ba mv a5,a4 + 98ac: bf1d j 97e2 <__udivdi3+0x2b6> + 98ae: 8e32 mv t3,a2 + 98b0: b54d j 9752 <__udivdi3+0x226> + 98b2: 1579 addi a0,a0,-2 + 98b4: 9846 add a6,a6,a7 + 98b6: b9e5 j 95ae <__udivdi3+0x82> + 98b8: 1579 addi a0,a0,-2 + 98ba: 97c6 add a5,a5,a7 + 98bc: bb61 j 9654 <__udivdi3+0x128> + +000098be : + 98be: 1141 addi sp,sp,-16 + 98c0: 4519 li a0,6 + 98c2: c606 sw ra,12(sp) + 98c4: 239d jal 9e2a + 98c6: 4505 li a0,1 + 98c8: 391010ef jal ra,b458 <_exit> + +000098cc : + 98cc: 4629 li a2,10 + 98ce: 4581 li a1,0 + 98d0: 7e60006f j a0b6 + +000098d4 <__locale_ctype_ptr_l>: + 98d4: 0ec52503 lw a0,236(a0) + 98d8: 8082 ret + +000098da <__locale_ctype_ptr>: + 98da: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 98de: 439c lw a5,0(a5) + 98e0: 539c lw a5,32(a5) + 98e2: e789 bnez a5,98ec <__locale_ctype_ptr+0x12> + 98e4: 1fff6797 auipc a5,0x1fff6 + 98e8: 73c78793 addi a5,a5,1852 # 20000020 <__global_locale> + 98ec: 0ec7a503 lw a0,236(a5) + 98f0: 8082 ret + +000098f2 : + 98f2: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 98f6: 85aa mv a1,a0 + 98f8: 4388 lw a0,0(a5) + 98fa: aae5 j 9af2 <_malloc_r> + +000098fc <__ascii_mbtowc>: + 98fc: ed91 bnez a1,9918 <__ascii_mbtowc+0x1c> + 98fe: 1141 addi sp,sp,-16 + 9900: 006c addi a1,sp,12 + 9902: 4501 li a0,0 + 9904: ca01 beqz a2,9914 <__ascii_mbtowc+0x18> + 9906: 5579 li a0,-2 + 9908: c691 beqz a3,9914 <__ascii_mbtowc+0x18> + 990a: 221c lbu a5,0(a2) + 990c: c19c sw a5,0(a1) + 990e: 2208 lbu a0,0(a2) + 9910: 00a03533 snez a0,a0 + 9914: 0141 addi sp,sp,16 + 9916: 8082 ret + 9918: 4501 li a0,0 + 991a: ca09 beqz a2,992c <__ascii_mbtowc+0x30> + 991c: 5579 li a0,-2 + 991e: c699 beqz a3,992c <__ascii_mbtowc+0x30> + 9920: 221c lbu a5,0(a2) + 9922: c19c sw a5,0(a1) + 9924: 2208 lbu a0,0(a2) + 9926: 00a03533 snez a0,a0 + 992a: 8082 ret + 992c: 8082 ret + +0000992e : + 992e: 4701 li a4,0 + 9930: 00e61463 bne a2,a4,9938 + 9934: 4501 li a0,0 + 9936: 8082 ret + 9938: 00e507b3 add a5,a0,a4 + 993c: 0705 addi a4,a4,1 + 993e: 00e586b3 add a3,a1,a4 + 9942: 239c lbu a5,0(a5) + 9944: fff6c683 lbu a3,-1(a3) + 9948: fed784e3 beq a5,a3,9930 + 994c: 40d78533 sub a0,a5,a3 + 9950: 8082 ret + +00009952 : + 9952: 00a5c7b3 xor a5,a1,a0 + 9956: 8b8d andi a5,a5,3 + 9958: 00c50733 add a4,a0,a2 + 995c: e781 bnez a5,9964 + 995e: 478d li a5,3 + 9960: 00c7ed63 bltu a5,a2,997a + 9964: 87aa mv a5,a0 + 9966: 08e57e63 bgeu a0,a4,9a02 + 996a: 2194 lbu a3,0(a1) + 996c: 0785 addi a5,a5,1 + 996e: 0585 addi a1,a1,1 + 9970: fed78fa3 sb a3,-1(a5) + 9974: fee7ebe3 bltu a5,a4,996a + 9978: 8082 ret + 997a: 00357693 andi a3,a0,3 + 997e: 87aa mv a5,a0 + 9980: ca89 beqz a3,9992 + 9982: 2194 lbu a3,0(a1) + 9984: 0785 addi a5,a5,1 + 9986: 0585 addi a1,a1,1 + 9988: fed78fa3 sb a3,-1(a5) + 998c: 0037f693 andi a3,a5,3 + 9990: bfc5 j 9980 + 9992: ffc77693 andi a3,a4,-4 + 9996: fe068613 addi a2,a3,-32 + 999a: 06c7f063 bgeu a5,a2,99fa + 999e: 0005a383 lw t2,0(a1) + 99a2: 0045a283 lw t0,4(a1) + 99a6: 0085af83 lw t6,8(a1) + 99aa: 00c5af03 lw t5,12(a1) + 99ae: 0105ae83 lw t4,16(a1) + 99b2: 0145ae03 lw t3,20(a1) + 99b6: 0185a303 lw t1,24(a1) + 99ba: 01c5a883 lw a7,28(a1) + 99be: 02458593 addi a1,a1,36 + 99c2: 0077a023 sw t2,0(a5) + 99c6: ffc5a803 lw a6,-4(a1) + 99ca: 0057a223 sw t0,4(a5) + 99ce: 01f7a423 sw t6,8(a5) + 99d2: 01e7a623 sw t5,12(a5) + 99d6: 01d7a823 sw t4,16(a5) + 99da: 01c7aa23 sw t3,20(a5) + 99de: 0067ac23 sw t1,24(a5) + 99e2: 0117ae23 sw a7,28(a5) + 99e6: 02478793 addi a5,a5,36 + 99ea: ff07ae23 sw a6,-4(a5) + 99ee: b775 j 999a + 99f0: 4190 lw a2,0(a1) + 99f2: 0791 addi a5,a5,4 + 99f4: 0591 addi a1,a1,4 + 99f6: fec7ae23 sw a2,-4(a5) + 99fa: fed7ebe3 bltu a5,a3,99f0 + 99fe: f6e7e6e3 bltu a5,a4,996a + 9a02: 8082 ret + +00009a04 : + 9a04: 04a5f163 bgeu a1,a0,9a46 + 9a08: 00c586b3 add a3,a1,a2 + 9a0c: 02d57d63 bgeu a0,a3,9a46 + 9a10: fff64593 not a1,a2 + 9a14: 4781 li a5,0 + 9a16: 17fd addi a5,a5,-1 + 9a18: 00f59363 bne a1,a5,9a1e + 9a1c: 8082 ret + 9a1e: 00f68733 add a4,a3,a5 + 9a22: 00074803 lbu a6,0(a4) # 10000 <_data_lma+0x1da4> + 9a26: 00c78733 add a4,a5,a2 + 9a2a: 972a add a4,a4,a0 + 9a2c: 01070023 sb a6,0(a4) + 9a30: b7dd j 9a16 + 9a32: 00f58733 add a4,a1,a5 + 9a36: 2314 lbu a3,0(a4) + 9a38: 00f50733 add a4,a0,a5 + 9a3c: 0785 addi a5,a5,1 + 9a3e: a314 sb a3,0(a4) + 9a40: fef619e3 bne a2,a5,9a32 + 9a44: 8082 ret + 9a46: 4781 li a5,0 + 9a48: bfe5 j 9a40 + +00009a4a <_free_r>: + 9a4a: c1dd beqz a1,9af0 <_free_r+0xa6> + 9a4c: ffc5a783 lw a5,-4(a1) + 9a50: 1141 addi sp,sp,-16 + 9a52: c422 sw s0,8(sp) + 9a54: c606 sw ra,12(sp) + 9a56: c226 sw s1,4(sp) + 9a58: ffc58413 addi s0,a1,-4 + 9a5c: 0007d363 bgez a5,9a62 <_free_r+0x18> + 9a60: 943e add s0,s0,a5 + 9a62: 84aa mv s1,a0 + 9a64: 4fb000ef jal ra,a75e <__malloc_lock> + 9a68: 83c18793 addi a5,gp,-1988 # 2000022c <__malloc_free_list> + 9a6c: 439c lw a5,0(a5) + 9a6e: ef81 bnez a5,9a86 <_free_r+0x3c> + 9a70: 00042223 sw zero,4(s0) + 9a74: 8281ae23 sw s0,-1988(gp) # 2000022c <__malloc_free_list> + 9a78: 4422 lw s0,8(sp) + 9a7a: 40b2 lw ra,12(sp) + 9a7c: 8526 mv a0,s1 + 9a7e: 4492 lw s1,4(sp) + 9a80: 0141 addi sp,sp,16 + 9a82: 4df0006f j a760 <__malloc_unlock> + 9a86: 00f47e63 bgeu s0,a5,9aa2 <_free_r+0x58> + 9a8a: 4014 lw a3,0(s0) + 9a8c: 00d40733 add a4,s0,a3 + 9a90: 00e79663 bne a5,a4,9a9c <_free_r+0x52> + 9a94: 4398 lw a4,0(a5) + 9a96: 43dc lw a5,4(a5) + 9a98: 9736 add a4,a4,a3 + 9a9a: c018 sw a4,0(s0) + 9a9c: c05c sw a5,4(s0) + 9a9e: bfd9 j 9a74 <_free_r+0x2a> + 9aa0: 87ba mv a5,a4 + 9aa2: 43d8 lw a4,4(a5) + 9aa4: c319 beqz a4,9aaa <_free_r+0x60> + 9aa6: fee47de3 bgeu s0,a4,9aa0 <_free_r+0x56> + 9aaa: 4394 lw a3,0(a5) + 9aac: 00d78633 add a2,a5,a3 + 9ab0: 00861f63 bne a2,s0,9ace <_free_r+0x84> + 9ab4: 4010 lw a2,0(s0) + 9ab6: 96b2 add a3,a3,a2 + 9ab8: c394 sw a3,0(a5) + 9aba: 00d78633 add a2,a5,a3 + 9abe: fac71de3 bne a4,a2,9a78 <_free_r+0x2e> + 9ac2: 4310 lw a2,0(a4) + 9ac4: 4358 lw a4,4(a4) + 9ac6: 96b2 add a3,a3,a2 + 9ac8: c394 sw a3,0(a5) + 9aca: c3d8 sw a4,4(a5) + 9acc: b775 j 9a78 <_free_r+0x2e> + 9ace: 00c47563 bgeu s0,a2,9ad8 <_free_r+0x8e> + 9ad2: 47b1 li a5,12 + 9ad4: c09c sw a5,0(s1) + 9ad6: b74d j 9a78 <_free_r+0x2e> + 9ad8: 4010 lw a2,0(s0) + 9ada: 00c406b3 add a3,s0,a2 + 9ade: 00d71663 bne a4,a3,9aea <_free_r+0xa0> + 9ae2: 4314 lw a3,0(a4) + 9ae4: 4358 lw a4,4(a4) + 9ae6: 96b2 add a3,a3,a2 + 9ae8: c014 sw a3,0(s0) + 9aea: c058 sw a4,4(s0) + 9aec: c3c0 sw s0,4(a5) + 9aee: b769 j 9a78 <_free_r+0x2e> + 9af0: 8082 ret + +00009af2 <_malloc_r>: + 9af2: 1101 addi sp,sp,-32 + 9af4: ca26 sw s1,20(sp) + 9af6: 00358493 addi s1,a1,3 + 9afa: 98f1 andi s1,s1,-4 + 9afc: ce06 sw ra,28(sp) + 9afe: cc22 sw s0,24(sp) + 9b00: c84a sw s2,16(sp) + 9b02: c64e sw s3,12(sp) + 9b04: 04a1 addi s1,s1,8 + 9b06: 47b1 li a5,12 + 9b08: 04f4f363 bgeu s1,a5,9b4e <_malloc_r+0x5c> + 9b0c: 44b1 li s1,12 + 9b0e: 04b4e263 bltu s1,a1,9b52 <_malloc_r+0x60> + 9b12: 892a mv s2,a0 + 9b14: 44b000ef jal ra,a75e <__malloc_lock> + 9b18: 83c18793 addi a5,gp,-1988 # 2000022c <__malloc_free_list> + 9b1c: 4398 lw a4,0(a5) + 9b1e: 843a mv s0,a4 + 9b20: e039 bnez s0,9b66 <_malloc_r+0x74> + 9b22: 84018793 addi a5,gp,-1984 # 20000230 <__malloc_sbrk_start> + 9b26: 439c lw a5,0(a5) + 9b28: e791 bnez a5,9b34 <_malloc_r+0x42> + 9b2a: 4581 li a1,0 + 9b2c: 854a mv a0,s2 + 9b2e: 2c85 jal 9d9e <_sbrk_r> + 9b30: 84a1a023 sw a0,-1984(gp) # 20000230 <__malloc_sbrk_start> + 9b34: 85a6 mv a1,s1 + 9b36: 854a mv a0,s2 + 9b38: 249d jal 9d9e <_sbrk_r> + 9b3a: 59fd li s3,-1 + 9b3c: 07351963 bne a0,s3,9bae <_malloc_r+0xbc> + 9b40: 47b1 li a5,12 + 9b42: 00f92023 sw a5,0(s2) + 9b46: 854a mv a0,s2 + 9b48: 419000ef jal ra,a760 <__malloc_unlock> + 9b4c: a029 j 9b56 <_malloc_r+0x64> + 9b4e: fc04d0e3 bgez s1,9b0e <_malloc_r+0x1c> + 9b52: 47b1 li a5,12 + 9b54: c11c sw a5,0(a0) + 9b56: 4501 li a0,0 + 9b58: 40f2 lw ra,28(sp) + 9b5a: 4462 lw s0,24(sp) + 9b5c: 44d2 lw s1,20(sp) + 9b5e: 4942 lw s2,16(sp) + 9b60: 49b2 lw s3,12(sp) + 9b62: 6105 addi sp,sp,32 + 9b64: 8082 ret + 9b66: 401c lw a5,0(s0) + 9b68: 8f85 sub a5,a5,s1 + 9b6a: 0207cf63 bltz a5,9ba8 <_malloc_r+0xb6> + 9b6e: 46ad li a3,11 + 9b70: 00f6f663 bgeu a3,a5,9b7c <_malloc_r+0x8a> + 9b74: c01c sw a5,0(s0) + 9b76: 943e add s0,s0,a5 + 9b78: c004 sw s1,0(s0) + 9b7a: a031 j 9b86 <_malloc_r+0x94> + 9b7c: 405c lw a5,4(s0) + 9b7e: 02871363 bne a4,s0,9ba4 <_malloc_r+0xb2> + 9b82: 82f1ae23 sw a5,-1988(gp) # 2000022c <__malloc_free_list> + 9b86: 854a mv a0,s2 + 9b88: 3d9000ef jal ra,a760 <__malloc_unlock> + 9b8c: 00b40513 addi a0,s0,11 + 9b90: 00440793 addi a5,s0,4 + 9b94: 9961 andi a0,a0,-8 + 9b96: 40f50733 sub a4,a0,a5 + 9b9a: df5d beqz a4,9b58 <_malloc_r+0x66> + 9b9c: 943a add s0,s0,a4 + 9b9e: 8f89 sub a5,a5,a0 + 9ba0: c01c sw a5,0(s0) + 9ba2: bf5d j 9b58 <_malloc_r+0x66> + 9ba4: c35c sw a5,4(a4) + 9ba6: b7c5 j 9b86 <_malloc_r+0x94> + 9ba8: 8722 mv a4,s0 + 9baa: 4040 lw s0,4(s0) + 9bac: bf95 j 9b20 <_malloc_r+0x2e> + 9bae: 00350413 addi s0,a0,3 + 9bb2: 9871 andi s0,s0,-4 + 9bb4: fc8502e3 beq a0,s0,9b78 <_malloc_r+0x86> + 9bb8: 40a405b3 sub a1,s0,a0 + 9bbc: 854a mv a0,s2 + 9bbe: 22c5 jal 9d9e <_sbrk_r> + 9bc0: fb351ce3 bne a0,s3,9b78 <_malloc_r+0x86> + 9bc4: bfb5 j 9b40 <_malloc_r+0x4e> + +00009bc6 : + 9bc6: 7139 addi sp,sp,-64 + 9bc8: da3e sw a5,52(sp) + 9bca: d22e sw a1,36(sp) + 9bcc: d432 sw a2,40(sp) + 9bce: d636 sw a3,44(sp) + 9bd0: d83a sw a4,48(sp) + 9bd2: dc42 sw a6,56(sp) + 9bd4: de46 sw a7,60(sp) + 9bd6: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9bda: cc22 sw s0,24(sp) + 9bdc: 4380 lw s0,0(a5) + 9bde: ca26 sw s1,20(sp) + 9be0: ce06 sw ra,28(sp) + 9be2: 84aa mv s1,a0 + 9be4: c411 beqz s0,9bf0 + 9be6: 4c1c lw a5,24(s0) + 9be8: e781 bnez a5,9bf0 + 9bea: 8522 mv a0,s0 + 9bec: 111000ef jal ra,a4fc <__sinit> + 9bf0: 440c lw a1,8(s0) + 9bf2: 1054 addi a3,sp,36 + 9bf4: 8626 mv a2,s1 + 9bf6: 8522 mv a0,s0 + 9bf8: c636 sw a3,12(sp) + 9bfa: 721000ef jal ra,ab1a <_vfiprintf_r> + 9bfe: 40f2 lw ra,28(sp) + 9c00: 4462 lw s0,24(sp) + 9c02: 44d2 lw s1,20(sp) + 9c04: 6121 addi sp,sp,64 + 9c06: 8082 ret + +00009c08 : + 9c08: 1101 addi sp,sp,-32 + 9c0a: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9c0e: cc22 sw s0,24(sp) + 9c10: 4380 lw s0,0(a5) + 9c12: ce06 sw ra,28(sp) + 9c14: 85aa mv a1,a0 + 9c16: c801 beqz s0,9c26 + 9c18: 4c1c lw a5,24(s0) + 9c1a: e791 bnez a5,9c26 + 9c1c: c62a sw a0,12(sp) + 9c1e: 8522 mv a0,s0 + 9c20: 0dd000ef jal ra,a4fc <__sinit> + 9c24: 45b2 lw a1,12(sp) + 9c26: 4410 lw a2,8(s0) + 9c28: 8522 mv a0,s0 + 9c2a: 4462 lw s0,24(sp) + 9c2c: 40f2 lw ra,28(sp) + 9c2e: 6105 addi sp,sp,32 + 9c30: 5220106f j b152 <_putc_r> + +00009c34 <_puts_r>: + 9c34: 1101 addi sp,sp,-32 + 9c36: ca26 sw s1,20(sp) + 9c38: c84a sw s2,16(sp) + 9c3a: ce06 sw ra,28(sp) + 9c3c: cc22 sw s0,24(sp) + 9c3e: c64e sw s3,12(sp) + 9c40: c452 sw s4,8(sp) + 9c42: 84aa mv s1,a0 + 9c44: 892e mv s2,a1 + 9c46: c509 beqz a0,9c50 <_puts_r+0x1c> + 9c48: 4d1c lw a5,24(a0) + 9c4a: e399 bnez a5,9c50 <_puts_r+0x1c> + 9c4c: 0b1000ef jal ra,a4fc <__sinit> + 9c50: 4c9c lw a5,24(s1) + 9c52: 4480 lw s0,8(s1) + 9c54: e781 bnez a5,9c5c <_puts_r+0x28> + 9c56: 8526 mv a0,s1 + 9c58: 0a5000ef jal ra,a4fc <__sinit> + 9c5c: 00004797 auipc a5,0x4 + 9c60: 58478793 addi a5,a5,1412 # e1e0 <__sf_fake_stdin> + 9c64: 02f41b63 bne s0,a5,9c9a <_puts_r+0x66> + 9c68: 40c0 lw s0,4(s1) + 9c6a: 245e lhu a5,12(s0) + 9c6c: 8ba1 andi a5,a5,8 + 9c6e: c7b1 beqz a5,9cba <_puts_r+0x86> + 9c70: 481c lw a5,16(s0) + 9c72: c7a1 beqz a5,9cba <_puts_r+0x86> + 9c74: 59fd li s3,-1 + 9c76: 4a29 li s4,10 + 9c78: 441c lw a5,8(s0) + 9c7a: 00094583 lbu a1,0(s2) + 9c7e: 17fd addi a5,a5,-1 + 9c80: e9b1 bnez a1,9cd4 <_puts_r+0xa0> + 9c82: c41c sw a5,8(s0) + 9c84: 0607dd63 bgez a5,9cfe <_puts_r+0xca> + 9c88: 8622 mv a2,s0 + 9c8a: 45a9 li a1,10 + 9c8c: 8526 mv a0,s1 + 9c8e: 2199 jal a0d4 <__swbuf_r> + 9c90: 57fd li a5,-1 + 9c92: 02f50863 beq a0,a5,9cc2 <_puts_r+0x8e> + 9c96: 4529 li a0,10 + 9c98: a035 j 9cc4 <_puts_r+0x90> + 9c9a: 00004797 auipc a5,0x4 + 9c9e: 56678793 addi a5,a5,1382 # e200 <__sf_fake_stdout> + 9ca2: 00f41463 bne s0,a5,9caa <_puts_r+0x76> + 9ca6: 4480 lw s0,8(s1) + 9ca8: b7c9 j 9c6a <_puts_r+0x36> + 9caa: 00004797 auipc a5,0x4 + 9cae: 51678793 addi a5,a5,1302 # e1c0 <__sf_fake_stderr> + 9cb2: faf41ce3 bne s0,a5,9c6a <_puts_r+0x36> + 9cb6: 44c0 lw s0,12(s1) + 9cb8: bf4d j 9c6a <_puts_r+0x36> + 9cba: 85a2 mv a1,s0 + 9cbc: 8526 mv a0,s1 + 9cbe: 29c5 jal a1ae <__swsetup_r> + 9cc0: d955 beqz a0,9c74 <_puts_r+0x40> + 9cc2: 557d li a0,-1 + 9cc4: 40f2 lw ra,28(sp) + 9cc6: 4462 lw s0,24(sp) + 9cc8: 44d2 lw s1,20(sp) + 9cca: 4942 lw s2,16(sp) + 9ccc: 49b2 lw s3,12(sp) + 9cce: 4a22 lw s4,8(sp) + 9cd0: 6105 addi sp,sp,32 + 9cd2: 8082 ret + 9cd4: c41c sw a5,8(s0) + 9cd6: 0905 addi s2,s2,1 + 9cd8: 0007d763 bgez a5,9ce6 <_puts_r+0xb2> + 9cdc: 4c18 lw a4,24(s0) + 9cde: 00e7ca63 blt a5,a4,9cf2 <_puts_r+0xbe> + 9ce2: 01458863 beq a1,s4,9cf2 <_puts_r+0xbe> + 9ce6: 401c lw a5,0(s0) + 9ce8: 00178713 addi a4,a5,1 + 9cec: c018 sw a4,0(s0) + 9cee: a38c sb a1,0(a5) + 9cf0: b761 j 9c78 <_puts_r+0x44> + 9cf2: 8622 mv a2,s0 + 9cf4: 8526 mv a0,s1 + 9cf6: 2ef9 jal a0d4 <__swbuf_r> + 9cf8: f93510e3 bne a0,s3,9c78 <_puts_r+0x44> + 9cfc: b7d9 j 9cc2 <_puts_r+0x8e> + 9cfe: 401c lw a5,0(s0) + 9d00: 00178713 addi a4,a5,1 + 9d04: c018 sw a4,0(s0) + 9d06: 4729 li a4,10 + 9d08: a398 sb a4,0(a5) + 9d0a: b771 j 9c96 <_puts_r+0x62> + +00009d0c : + 9d0c: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9d10: 85aa mv a1,a0 + 9d12: 4388 lw a0,0(a5) + 9d14: f21ff06f j 9c34 <_puts_r> + +00009d18 : + 9d18: 1141 addi sp,sp,-16 + 9d1a: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9d1e: c422 sw s0,8(sp) + 9d20: 4380 lw s0,0(a5) + 9d22: c606 sw ra,12(sp) + 9d24: 5c1c lw a5,56(s0) + 9d26: eb95 bnez a5,9d5a + 9d28: 4561 li a0,24 + 9d2a: bc9ff0ef jal ra,98f2 + 9d2e: abcd37b7 lui a5,0xabcd3 + 9d32: dc08 sw a0,56(s0) + 9d34: 30e78793 addi a5,a5,782 # abcd330e <_eusrstack+0x8bccb30e> + 9d38: c11c sw a5,0(a0) + 9d3a: e66d17b7 lui a5,0xe66d1 + 9d3e: 23478793 addi a5,a5,564 # e66d1234 <_eusrstack+0xc66c9234> + 9d42: c15c sw a5,4(a0) + 9d44: 0005e7b7 lui a5,0x5e + 9d48: eec78793 addi a5,a5,-276 # 5deec <_data_lma+0x4fc90> + 9d4c: c51c sw a5,8(a0) + 9d4e: 47ad li a5,11 + 9d50: a55e sh a5,12(a0) + 9d52: 4705 li a4,1 + 9d54: 4781 li a5,0 + 9d56: c918 sw a4,16(a0) + 9d58: c95c sw a5,20(a0) + 9d5a: 5c10 lw a2,56(s0) + 9d5c: 4c958737 lui a4,0x4c958 + 9d60: 5851f7b7 lui a5,0x5851f + 9d64: 4a14 lw a3,16(a2) + 9d66: 4a48 lw a0,20(a2) + 9d68: f2d70713 addi a4,a4,-211 # 4c957f2d <_eusrstack+0x2c94ff2d> + 9d6c: 42d78793 addi a5,a5,1069 # 5851f42d <_eusrstack+0x3851742d> + 9d70: 02f687b3 mul a5,a3,a5 + 9d74: 40b2 lw ra,12(sp) + 9d76: 4422 lw s0,8(sp) + 9d78: 02e50533 mul a0,a0,a4 + 9d7c: 953e add a0,a0,a5 + 9d7e: 02e687b3 mul a5,a3,a4 + 9d82: 02e6b733 mulhu a4,a3,a4 + 9d86: 00178693 addi a3,a5,1 + 9d8a: ca14 sw a3,16(a2) + 9d8c: 972a add a4,a4,a0 + 9d8e: 00f6b533 sltu a0,a3,a5 + 9d92: 953a add a0,a0,a4 + 9d94: ca48 sw a0,20(a2) + 9d96: 0506 slli a0,a0,0x1 + 9d98: 8105 srli a0,a0,0x1 + 9d9a: 0141 addi sp,sp,16 + 9d9c: 8082 ret + +00009d9e <_sbrk_r>: + 9d9e: 1141 addi sp,sp,-16 + 9da0: c422 sw s0,8(sp) + 9da2: 842a mv s0,a0 + 9da4: 852e mv a0,a1 + 9da6: 7801a623 sw zero,1932(gp) # 2000117c + 9daa: c606 sw ra,12(sp) + 9dac: f2eff0ef jal ra,94da <_sbrk> + 9db0: 57fd li a5,-1 + 9db2: 00f51763 bne a0,a5,9dc0 <_sbrk_r+0x22> + 9db6: 78c18793 addi a5,gp,1932 # 2000117c + 9dba: 439c lw a5,0(a5) + 9dbc: c391 beqz a5,9dc0 <_sbrk_r+0x22> + 9dbe: c01c sw a5,0(s0) + 9dc0: 40b2 lw ra,12(sp) + 9dc2: 4422 lw s0,8(sp) + 9dc4: 0141 addi sp,sp,16 + 9dc6: 8082 ret + +00009dc8 <_raise_r>: + 9dc8: 47fd li a5,31 + 9dca: 00b7f663 bgeu a5,a1,9dd6 <_raise_r+0xe> + 9dce: 47d9 li a5,22 + 9dd0: c11c sw a5,0(a0) + 9dd2: 557d li a0,-1 + 9dd4: 8082 ret + 9dd6: 417c lw a5,68(a0) + 9dd8: 1101 addi sp,sp,-32 + 9dda: cc22 sw s0,24(sp) + 9ddc: ce06 sw ra,28(sp) + 9dde: 862e mv a2,a1 + 9de0: 842a mv s0,a0 + 9de2: c791 beqz a5,9dee <_raise_r+0x26> + 9de4: 00259713 slli a4,a1,0x2 + 9de8: 97ba add a5,a5,a4 + 9dea: 4398 lw a4,0(a5) + 9dec: eb19 bnez a4,9e02 <_raise_r+0x3a> + 9dee: 8522 mv a0,s0 + 9df0: c632 sw a2,12(sp) + 9df2: 2885 jal 9e62 <_getpid_r> + 9df4: 85aa mv a1,a0 + 9df6: 8522 mv a0,s0 + 9df8: 4462 lw s0,24(sp) + 9dfa: 4632 lw a2,12(sp) + 9dfc: 40f2 lw ra,28(sp) + 9dfe: 6105 addi sp,sp,32 + 9e00: a81d j 9e36 <_kill_r> + 9e02: 4685 li a3,1 + 9e04: 4501 li a0,0 + 9e06: 00d70863 beq a4,a3,9e16 <_raise_r+0x4e> + 9e0a: 56fd li a3,-1 + 9e0c: 00d71963 bne a4,a3,9e1e <_raise_r+0x56> + 9e10: 47d9 li a5,22 + 9e12: c01c sw a5,0(s0) + 9e14: 4505 li a0,1 + 9e16: 40f2 lw ra,28(sp) + 9e18: 4462 lw s0,24(sp) + 9e1a: 6105 addi sp,sp,32 + 9e1c: 8082 ret + 9e1e: 852e mv a0,a1 + 9e20: 0007a023 sw zero,0(a5) + 9e24: 9702 jalr a4 + 9e26: 4501 li a0,0 + 9e28: b7fd j 9e16 <_raise_r+0x4e> + +00009e2a : + 9e2a: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9e2e: 85aa mv a1,a0 + 9e30: 4388 lw a0,0(a5) + 9e32: f97ff06f j 9dc8 <_raise_r> + +00009e36 <_kill_r>: + 9e36: 1141 addi sp,sp,-16 + 9e38: c422 sw s0,8(sp) + 9e3a: 842a mv s0,a0 + 9e3c: 852e mv a0,a1 + 9e3e: 85b2 mv a1,a2 + 9e40: 7801a623 sw zero,1932(gp) # 2000117c + 9e44: c606 sw ra,12(sp) + 9e46: 5ee010ef jal ra,b434 <_kill> + 9e4a: 57fd li a5,-1 + 9e4c: 00f51763 bne a0,a5,9e5a <_kill_r+0x24> + 9e50: 78c18793 addi a5,gp,1932 # 2000117c + 9e54: 439c lw a5,0(a5) + 9e56: c391 beqz a5,9e5a <_kill_r+0x24> + 9e58: c01c sw a5,0(s0) + 9e5a: 40b2 lw ra,12(sp) + 9e5c: 4422 lw s0,8(sp) + 9e5e: 0141 addi sp,sp,16 + 9e60: 8082 ret + +00009e62 <_getpid_r>: + 9e62: 5ba0106f j b41c <_getpid> + +00009e66 : + 9e66: 7135 addi sp,sp,-160 + 9e68: cb3e sw a5,148(sp) + 9e6a: daa6 sw s1,116(sp) + 9e6c: c736 sw a3,140(sp) + 9e6e: c93a sw a4,144(sp) + 9e70: cd42 sw a6,152(sp) + 9e72: cf46 sw a7,156(sp) + 9e74: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9e78: de86 sw ra,124(sp) + 9e7a: dca2 sw s0,120(sp) + 9e7c: 4384 lw s1,0(a5) + 9e7e: 0005db63 bgez a1,9e94 + 9e82: 08b00793 li a5,139 + 9e86: c09c sw a5,0(s1) + 9e88: 557d li a0,-1 + 9e8a: 50f6 lw ra,124(sp) + 9e8c: 5466 lw s0,120(sp) + 9e8e: 54d6 lw s1,116(sp) + 9e90: 610d addi sp,sp,160 + 9e92: 8082 ret + 9e94: 20800793 li a5,520 + 9e98: 82fc sh a5,20(sp) + 9e9a: c42a sw a0,8(sp) + 9e9c: cc2a sw a0,24(sp) + 9e9e: 4781 li a5,0 + 9ea0: c199 beqz a1,9ea6 + 9ea2: fff58793 addi a5,a1,-1 + 9ea6: c83e sw a5,16(sp) + 9ea8: ce3e sw a5,28(sp) + 9eaa: 0174 addi a3,sp,140 + 9eac: 57fd li a5,-1 + 9eae: 842e mv s0,a1 + 9eb0: 8526 mv a0,s1 + 9eb2: 002c addi a1,sp,8 + 9eb4: 83fc sh a5,22(sp) + 9eb6: c236 sw a3,4(sp) + 9eb8: 18f000ef jal ra,a846 <_svfiprintf_r> + 9ebc: 57fd li a5,-1 + 9ebe: 00f55563 bge a0,a5,9ec8 + 9ec2: 08b00793 li a5,139 + 9ec6: c09c sw a5,0(s1) + 9ec8: d069 beqz s0,9e8a + 9eca: 47a2 lw a5,8(sp) + 9ecc: 00078023 sb zero,0(a5) + 9ed0: bf6d j 9e8a + +00009ed2 : + 9ed2: 7135 addi sp,sp,-160 + 9ed4: cb3e sw a5,148(sp) + 9ed6: 800007b7 lui a5,0x80000 + 9eda: fff7c793 not a5,a5 + 9ede: ce3e sw a5,28(sp) + 9ee0: c83e sw a5,16(sp) + 9ee2: 77c1 lui a5,0xffff0 + 9ee4: 20878793 addi a5,a5,520 # ffff0208 <_eusrstack+0xdffe8208> + 9ee8: c532 sw a2,136(sp) + 9eea: c736 sw a3,140(sp) + 9eec: c93a sw a4,144(sp) + 9eee: cd42 sw a6,152(sp) + 9ef0: cf46 sw a7,156(sp) + 9ef2: ca3e sw a5,20(sp) + 9ef4: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + 9ef8: c42a sw a0,8(sp) + 9efa: cc2a sw a0,24(sp) + 9efc: 4388 lw a0,0(a5) + 9efe: 0134 addi a3,sp,136 + 9f00: 862e mv a2,a1 + 9f02: 002c addi a1,sp,8 + 9f04: de86 sw ra,124(sp) + 9f06: c236 sw a3,4(sp) + 9f08: 13f000ef jal ra,a846 <_svfiprintf_r> + 9f0c: 47a2 lw a5,8(sp) + 9f0e: 00078023 sb zero,0(a5) + 9f12: 50f6 lw ra,124(sp) + 9f14: 610d addi sp,sp,160 + 9f16: 8082 ret + +00009f18 : + 9f18: 87aa mv a5,a0 + 9f1a: 2398 lbu a4,0(a5) + 9f1c: 00178693 addi a3,a5,1 + 9f20: eb09 bnez a4,9f32 + 9f22: 0585 addi a1,a1,1 + 9f24: fff5c703 lbu a4,-1(a1) + 9f28: 0785 addi a5,a5,1 + 9f2a: fee78fa3 sb a4,-1(a5) + 9f2e: fb75 bnez a4,9f22 + 9f30: 8082 ret + 9f32: 87b6 mv a5,a3 + 9f34: b7dd j 9f1a + +00009f36 : + 9f36: 87aa mv a5,a0 + 9f38: 2198 lbu a4,0(a1) + 9f3a: 0785 addi a5,a5,1 + 9f3c: 0585 addi a1,a1,1 + 9f3e: fee78fa3 sb a4,-1(a5) + 9f42: fb7d bnez a4,9f38 + 9f44: 8082 ret + +00009f46 : + 9f46: 87aa mv a5,a0 + 9f48: 0785 addi a5,a5,1 + 9f4a: fff7c703 lbu a4,-1(a5) + 9f4e: ff6d bnez a4,9f48 + 9f50: 40a78533 sub a0,a5,a0 + 9f54: 157d addi a0,a0,-1 + 9f56: 8082 ret + +00009f58 : + 9f58: 87aa mv a5,a0 + 9f5a: ca09 beqz a2,9f6c + 9f5c: 0585 addi a1,a1,1 + 9f5e: fff5c703 lbu a4,-1(a1) + 9f62: 0785 addi a5,a5,1 + 9f64: 167d addi a2,a2,-1 + 9f66: fee78fa3 sb a4,-1(a5) + 9f6a: fb65 bnez a4,9f5a + 9f6c: 963e add a2,a2,a5 + 9f6e: 00c79363 bne a5,a2,9f74 + 9f72: 8082 ret + 9f74: 0785 addi a5,a5,1 + 9f76: fe078fa3 sb zero,-1(a5) + 9f7a: bfd5 j 9f6e + +00009f7c <_strtol_l.isra.0>: + 9f7c: 7179 addi sp,sp,-48 + 9f7e: d04a sw s2,32(sp) + 9f80: ce4e sw s3,28(sp) + 9f82: d606 sw ra,44(sp) + 9f84: d422 sw s0,40(sp) + 9f86: d226 sw s1,36(sp) + 9f88: 89aa mv s3,a0 + 9f8a: 892e mv s2,a1 + 9f8c: 00190493 addi s1,s2,1 + 9f90: fff4c403 lbu s0,-1(s1) + 9f94: 853a mv a0,a4 + 9f96: c636 sw a3,12(sp) + 9f98: c432 sw a2,8(sp) + 9f9a: c22e sw a1,4(sp) + 9f9c: c03a sw a4,0(sp) + 9f9e: 937ff0ef jal ra,98d4 <__locale_ctype_ptr_l> + 9fa2: 9522 add a0,a0,s0 + 9fa4: 311c lbu a5,1(a0) + 9fa6: 4702 lw a4,0(sp) + 9fa8: 4592 lw a1,4(sp) + 9faa: 8ba1 andi a5,a5,8 + 9fac: 4622 lw a2,8(sp) + 9fae: 46b2 lw a3,12(sp) + 9fb0: e3d1 bnez a5,a034 <_strtol_l.isra.0+0xb8> + 9fb2: 02d00793 li a5,45 + 9fb6: 08f41163 bne s0,a5,a038 <_strtol_l.isra.0+0xbc> + 9fba: 209c lbu a5,0(s1) + 9fbc: 4305 li t1,1 + 9fbe: 00290493 addi s1,s2,2 + 9fc2: c6e5 beqz a3,a0aa <_strtol_l.isra.0+0x12e> + 9fc4: 4741 li a4,16 + 9fc6: 02e69063 bne a3,a4,9fe6 <_strtol_l.isra.0+0x6a> + 9fca: 03000713 li a4,48 + 9fce: 00e79c63 bne a5,a4,9fe6 <_strtol_l.isra.0+0x6a> + 9fd2: 209c lbu a5,0(s1) + 9fd4: 05800713 li a4,88 + 9fd8: 0df7f793 andi a5,a5,223 + 9fdc: 0ce79263 bne a5,a4,a0a0 <_strtol_l.isra.0+0x124> + 9fe0: 309c lbu a5,1(s1) + 9fe2: 46c1 li a3,16 + 9fe4: 0489 addi s1,s1,2 + 9fe6: 800008b7 lui a7,0x80000 + 9fea: 00031463 bnez t1,9ff2 <_strtol_l.isra.0+0x76> + 9fee: fff8c893 not a7,a7 + 9ff2: 02d8ff33 remu t5,a7,a3 + 9ff6: 4801 li a6,0 + 9ff8: 4501 li a0,0 + 9ffa: 4fa5 li t6,9 + 9ffc: 4ee5 li t4,25 + 9ffe: 52fd li t0,-1 + a000: 02d8de33 divu t3,a7,a3 + a004: fd078713 addi a4,a5,-48 + a008: 04efe363 bltu t6,a4,a04e <_strtol_l.isra.0+0xd2> + a00c: 87ba mv a5,a4 + a00e: 04d7de63 bge a5,a3,a06a <_strtol_l.isra.0+0xee> + a012: 00580d63 beq a6,t0,a02c <_strtol_l.isra.0+0xb0> + a016: 587d li a6,-1 + a018: 00ae6a63 bltu t3,a0,a02c <_strtol_l.isra.0+0xb0> + a01c: 00ae1463 bne t3,a0,a024 <_strtol_l.isra.0+0xa8> + a020: 00ff4663 blt t5,a5,a02c <_strtol_l.isra.0+0xb0> + a024: 4805 li a6,1 + a026: 02a68533 mul a0,a3,a0 + a02a: 953e add a0,a0,a5 + a02c: 0485 addi s1,s1,1 + a02e: fff4c783 lbu a5,-1(s1) + a032: bfc9 j a004 <_strtol_l.isra.0+0x88> + a034: 8926 mv s2,s1 + a036: bf99 j 9f8c <_strtol_l.isra.0+0x10> + a038: 02b00793 li a5,43 + a03c: 00f40563 beq s0,a5,a046 <_strtol_l.isra.0+0xca> + a040: 87a2 mv a5,s0 + a042: 4301 li t1,0 + a044: bfbd j 9fc2 <_strtol_l.isra.0+0x46> + a046: 209c lbu a5,0(s1) + a048: 00290493 addi s1,s2,2 + a04c: bfdd j a042 <_strtol_l.isra.0+0xc6> + a04e: fbf78713 addi a4,a5,-65 + a052: 00eee563 bltu t4,a4,a05c <_strtol_l.isra.0+0xe0> + a056: fc978793 addi a5,a5,-55 + a05a: bf55 j a00e <_strtol_l.isra.0+0x92> + a05c: f9f78713 addi a4,a5,-97 + a060: 00eee563 bltu t4,a4,a06a <_strtol_l.isra.0+0xee> + a064: fa978793 addi a5,a5,-87 + a068: b75d j a00e <_strtol_l.isra.0+0x92> + a06a: 57fd li a5,-1 + a06c: 00f81f63 bne a6,a5,a08a <_strtol_l.isra.0+0x10e> + a070: 02200793 li a5,34 + a074: 00f9a023 sw a5,0(s3) + a078: 8546 mv a0,a7 + a07a: ee19 bnez a2,a098 <_strtol_l.isra.0+0x11c> + a07c: 50b2 lw ra,44(sp) + a07e: 5422 lw s0,40(sp) + a080: 5492 lw s1,36(sp) + a082: 5902 lw s2,32(sp) + a084: 49f2 lw s3,28(sp) + a086: 6145 addi sp,sp,48 + a088: 8082 ret + a08a: 00030463 beqz t1,a092 <_strtol_l.isra.0+0x116> + a08e: 40a00533 neg a0,a0 + a092: d66d beqz a2,a07c <_strtol_l.isra.0+0x100> + a094: 00080463 beqz a6,a09c <_strtol_l.isra.0+0x120> + a098: fff48593 addi a1,s1,-1 + a09c: c20c sw a1,0(a2) + a09e: bff9 j a07c <_strtol_l.isra.0+0x100> + a0a0: 03000793 li a5,48 + a0a4: f2a9 bnez a3,9fe6 <_strtol_l.isra.0+0x6a> + a0a6: 46a1 li a3,8 + a0a8: bf3d j 9fe6 <_strtol_l.isra.0+0x6a> + a0aa: 03000713 li a4,48 + a0ae: f2e782e3 beq a5,a4,9fd2 <_strtol_l.isra.0+0x56> + a0b2: 46a9 li a3,10 + a0b4: bf0d j 9fe6 <_strtol_l.isra.0+0x6a> + +0000a0b6 : + a0b6: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + a0ba: 439c lw a5,0(a5) + a0bc: 86b2 mv a3,a2 + a0be: 5398 lw a4,32(a5) + a0c0: e709 bnez a4,a0ca + a0c2: 1fff6717 auipc a4,0x1fff6 + a0c6: f5e70713 addi a4,a4,-162 # 20000020 <__global_locale> + a0ca: 862e mv a2,a1 + a0cc: 85aa mv a1,a0 + a0ce: 853e mv a0,a5 + a0d0: eadff06f j 9f7c <_strtol_l.isra.0> + +0000a0d4 <__swbuf_r>: + a0d4: 1101 addi sp,sp,-32 + a0d6: cc22 sw s0,24(sp) + a0d8: ca26 sw s1,20(sp) + a0da: c84a sw s2,16(sp) + a0dc: ce06 sw ra,28(sp) + a0de: c64e sw s3,12(sp) + a0e0: 84aa mv s1,a0 + a0e2: 892e mv s2,a1 + a0e4: 8432 mv s0,a2 + a0e6: c501 beqz a0,a0ee <__swbuf_r+0x1a> + a0e8: 4d1c lw a5,24(a0) + a0ea: e391 bnez a5,a0ee <__swbuf_r+0x1a> + a0ec: 2901 jal a4fc <__sinit> + a0ee: 00004797 auipc a5,0x4 + a0f2: 0f278793 addi a5,a5,242 # e1e0 <__sf_fake_stdin> + a0f6: 06f41763 bne s0,a5,a164 <__swbuf_r+0x90> + a0fa: 40c0 lw s0,4(s1) + a0fc: 4c1c lw a5,24(s0) + a0fe: c41c sw a5,8(s0) + a100: 245e lhu a5,12(s0) + a102: 8ba1 andi a5,a5,8 + a104: c3c1 beqz a5,a184 <__swbuf_r+0xb0> + a106: 481c lw a5,16(s0) + a108: cfb5 beqz a5,a184 <__swbuf_r+0xb0> + a10a: 481c lw a5,16(s0) + a10c: 4008 lw a0,0(s0) + a10e: 0ff97993 andi s3,s2,255 + a112: 0ff97913 andi s2,s2,255 + a116: 8d1d sub a0,a0,a5 + a118: 485c lw a5,20(s0) + a11a: 00f54663 blt a0,a5,a126 <__swbuf_r+0x52> + a11e: 85a2 mv a1,s0 + a120: 8526 mv a0,s1 + a122: 2c75 jal a3de <_fflush_r> + a124: e525 bnez a0,a18c <__swbuf_r+0xb8> + a126: 441c lw a5,8(s0) + a128: 0505 addi a0,a0,1 + a12a: 17fd addi a5,a5,-1 + a12c: c41c sw a5,8(s0) + a12e: 401c lw a5,0(s0) + a130: 00178713 addi a4,a5,1 + a134: c018 sw a4,0(s0) + a136: 01378023 sb s3,0(a5) + a13a: 485c lw a5,20(s0) + a13c: 00a78863 beq a5,a0,a14c <__swbuf_r+0x78> + a140: 245e lhu a5,12(s0) + a142: 8b85 andi a5,a5,1 + a144: cb81 beqz a5,a154 <__swbuf_r+0x80> + a146: 47a9 li a5,10 + a148: 00f91663 bne s2,a5,a154 <__swbuf_r+0x80> + a14c: 85a2 mv a1,s0 + a14e: 8526 mv a0,s1 + a150: 2479 jal a3de <_fflush_r> + a152: ed0d bnez a0,a18c <__swbuf_r+0xb8> + a154: 40f2 lw ra,28(sp) + a156: 4462 lw s0,24(sp) + a158: 854a mv a0,s2 + a15a: 44d2 lw s1,20(sp) + a15c: 4942 lw s2,16(sp) + a15e: 49b2 lw s3,12(sp) + a160: 6105 addi sp,sp,32 + a162: 8082 ret + a164: 00004797 auipc a5,0x4 + a168: 09c78793 addi a5,a5,156 # e200 <__sf_fake_stdout> + a16c: 00f41463 bne s0,a5,a174 <__swbuf_r+0xa0> + a170: 4480 lw s0,8(s1) + a172: b769 j a0fc <__swbuf_r+0x28> + a174: 00004797 auipc a5,0x4 + a178: 04c78793 addi a5,a5,76 # e1c0 <__sf_fake_stderr> + a17c: f8f410e3 bne s0,a5,a0fc <__swbuf_r+0x28> + a180: 44c0 lw s0,12(s1) + a182: bfad j a0fc <__swbuf_r+0x28> + a184: 85a2 mv a1,s0 + a186: 8526 mv a0,s1 + a188: 201d jal a1ae <__swsetup_r> + a18a: d141 beqz a0,a10a <__swbuf_r+0x36> + a18c: 597d li s2,-1 + a18e: b7d9 j a154 <__swbuf_r+0x80> + +0000a190 <__ascii_wctomb>: + a190: cd89 beqz a1,a1aa <__ascii_wctomb+0x1a> + a192: 0ff00793 li a5,255 + a196: 00c7f763 bgeu a5,a2,a1a4 <__ascii_wctomb+0x14> + a19a: 08a00793 li a5,138 + a19e: c11c sw a5,0(a0) + a1a0: 557d li a0,-1 + a1a2: 8082 ret + a1a4: a190 sb a2,0(a1) + a1a6: 4505 li a0,1 + a1a8: 8082 ret + a1aa: 4501 li a0,0 + a1ac: 8082 ret + +0000a1ae <__swsetup_r>: + a1ae: 1141 addi sp,sp,-16 + a1b0: 80c18793 addi a5,gp,-2036 # 200001fc <_impure_ptr> + a1b4: c226 sw s1,4(sp) + a1b6: 4384 lw s1,0(a5) + a1b8: c422 sw s0,8(sp) + a1ba: c04a sw s2,0(sp) + a1bc: c606 sw ra,12(sp) + a1be: 892a mv s2,a0 + a1c0: 842e mv s0,a1 + a1c2: c489 beqz s1,a1cc <__swsetup_r+0x1e> + a1c4: 4c9c lw a5,24(s1) + a1c6: e399 bnez a5,a1cc <__swsetup_r+0x1e> + a1c8: 8526 mv a0,s1 + a1ca: 2e0d jal a4fc <__sinit> + a1cc: 00004797 auipc a5,0x4 + a1d0: 01478793 addi a5,a5,20 # e1e0 <__sf_fake_stdin> + a1d4: 02f41b63 bne s0,a5,a20a <__swsetup_r+0x5c> + a1d8: 40c0 lw s0,4(s1) + a1da: 00c41703 lh a4,12(s0) + a1de: 01071793 slli a5,a4,0x10 + a1e2: 83c1 srli a5,a5,0x10 + a1e4: 0087f693 andi a3,a5,8 + a1e8: eab5 bnez a3,a25c <__swsetup_r+0xae> + a1ea: 0107f693 andi a3,a5,16 + a1ee: ee95 bnez a3,a22a <__swsetup_r+0x7c> + a1f0: 47a5 li a5,9 + a1f2: 00f92023 sw a5,0(s2) + a1f6: 04076713 ori a4,a4,64 + a1fa: a45a sh a4,12(s0) + a1fc: 557d li a0,-1 + a1fe: 40b2 lw ra,12(sp) + a200: 4422 lw s0,8(sp) + a202: 4492 lw s1,4(sp) + a204: 4902 lw s2,0(sp) + a206: 0141 addi sp,sp,16 + a208: 8082 ret + a20a: 00004797 auipc a5,0x4 + a20e: ff678793 addi a5,a5,-10 # e200 <__sf_fake_stdout> + a212: 00f41463 bne s0,a5,a21a <__swsetup_r+0x6c> + a216: 4480 lw s0,8(s1) + a218: b7c9 j a1da <__swsetup_r+0x2c> + a21a: 00004797 auipc a5,0x4 + a21e: fa678793 addi a5,a5,-90 # e1c0 <__sf_fake_stderr> + a222: faf41ce3 bne s0,a5,a1da <__swsetup_r+0x2c> + a226: 44c0 lw s0,12(s1) + a228: bf4d j a1da <__swsetup_r+0x2c> + a22a: 8b91 andi a5,a5,4 + a22c: c785 beqz a5,a254 <__swsetup_r+0xa6> + a22e: 584c lw a1,52(s0) + a230: c991 beqz a1,a244 <__swsetup_r+0x96> + a232: 04440793 addi a5,s0,68 + a236: 00f58563 beq a1,a5,a240 <__swsetup_r+0x92> + a23a: 854a mv a0,s2 + a23c: 80fff0ef jal ra,9a4a <_free_r> + a240: 02042a23 sw zero,52(s0) + a244: 245e lhu a5,12(s0) + a246: 00042223 sw zero,4(s0) + a24a: fdb7f793 andi a5,a5,-37 + a24e: a45e sh a5,12(s0) + a250: 481c lw a5,16(s0) + a252: c01c sw a5,0(s0) + a254: 245e lhu a5,12(s0) + a256: 0087e793 ori a5,a5,8 + a25a: a45e sh a5,12(s0) + a25c: 481c lw a5,16(s0) + a25e: eb99 bnez a5,a274 <__swsetup_r+0xc6> + a260: 245e lhu a5,12(s0) + a262: 20000713 li a4,512 + a266: 2807f793 andi a5,a5,640 + a26a: 00e78563 beq a5,a4,a274 <__swsetup_r+0xc6> + a26e: 85a2 mv a1,s0 + a270: 854a mv a0,s2 + a272: 29a1 jal a6ca <__smakebuf_r> + a274: 245e lhu a5,12(s0) + a276: 0017f713 andi a4,a5,1 + a27a: c31d beqz a4,a2a0 <__swsetup_r+0xf2> + a27c: 485c lw a5,20(s0) + a27e: 00042423 sw zero,8(s0) + a282: 40f007b3 neg a5,a5 + a286: cc1c sw a5,24(s0) + a288: 481c lw a5,16(s0) + a28a: 4501 li a0,0 + a28c: fbad bnez a5,a1fe <__swsetup_r+0x50> + a28e: 00c41783 lh a5,12(s0) + a292: 0807f713 andi a4,a5,128 + a296: d725 beqz a4,a1fe <__swsetup_r+0x50> + a298: 0407e793 ori a5,a5,64 + a29c: a45e sh a5,12(s0) + a29e: bfb9 j a1fc <__swsetup_r+0x4e> + a2a0: 8b89 andi a5,a5,2 + a2a2: 4701 li a4,0 + a2a4: e391 bnez a5,a2a8 <__swsetup_r+0xfa> + a2a6: 4858 lw a4,20(s0) + a2a8: c418 sw a4,8(s0) + a2aa: bff9 j a288 <__swsetup_r+0xda> + +0000a2ac <__sflush_r>: + a2ac: 25de lhu a5,12(a1) + a2ae: 1101 addi sp,sp,-32 + a2b0: cc22 sw s0,24(sp) + a2b2: ca26 sw s1,20(sp) + a2b4: ce06 sw ra,28(sp) + a2b6: c84a sw s2,16(sp) + a2b8: c64e sw s3,12(sp) + a2ba: 0087f713 andi a4,a5,8 + a2be: 84aa mv s1,a0 + a2c0: 842e mv s0,a1 + a2c2: ef61 bnez a4,a39a <__sflush_r+0xee> + a2c4: 41d8 lw a4,4(a1) + a2c6: 00e04d63 bgtz a4,a2e0 <__sflush_r+0x34> + a2ca: 41b8 lw a4,64(a1) + a2cc: 00e04a63 bgtz a4,a2e0 <__sflush_r+0x34> + a2d0: 4501 li a0,0 + a2d2: 40f2 lw ra,28(sp) + a2d4: 4462 lw s0,24(sp) + a2d6: 44d2 lw s1,20(sp) + a2d8: 4942 lw s2,16(sp) + a2da: 49b2 lw s3,12(sp) + a2dc: 6105 addi sp,sp,32 + a2de: 8082 ret + a2e0: 5458 lw a4,44(s0) + a2e2: d77d beqz a4,a2d0 <__sflush_r+0x24> + a2e4: 0004a903 lw s2,0(s1) + a2e8: 01379693 slli a3,a5,0x13 + a2ec: 0004a023 sw zero,0(s1) + a2f0: 0606dc63 bgez a3,a368 <__sflush_r+0xbc> + a2f4: 4870 lw a2,84(s0) + a2f6: 245e lhu a5,12(s0) + a2f8: 8b91 andi a5,a5,4 + a2fa: c799 beqz a5,a308 <__sflush_r+0x5c> + a2fc: 405c lw a5,4(s0) + a2fe: 8e1d sub a2,a2,a5 + a300: 585c lw a5,52(s0) + a302: c399 beqz a5,a308 <__sflush_r+0x5c> + a304: 403c lw a5,64(s0) + a306: 8e1d sub a2,a2,a5 + a308: 545c lw a5,44(s0) + a30a: 500c lw a1,32(s0) + a30c: 4681 li a3,0 + a30e: 8526 mv a0,s1 + a310: 9782 jalr a5 + a312: 57fd li a5,-1 + a314: 245a lhu a4,12(s0) + a316: 00f51d63 bne a0,a5,a330 <__sflush_r+0x84> + a31a: 4094 lw a3,0(s1) + a31c: 47f5 li a5,29 + a31e: 06d7e963 bltu a5,a3,a390 <__sflush_r+0xe4> + a322: 204007b7 lui a5,0x20400 + a326: 0785 addi a5,a5,1 + a328: 00d7d7b3 srl a5,a5,a3 + a32c: 8b85 andi a5,a5,1 + a32e: c3ad beqz a5,a390 <__sflush_r+0xe4> + a330: 481c lw a5,16(s0) + a332: 00042223 sw zero,4(s0) + a336: c01c sw a5,0(s0) + a338: 01371793 slli a5,a4,0x13 + a33c: 0007d863 bgez a5,a34c <__sflush_r+0xa0> + a340: 57fd li a5,-1 + a342: 00f51463 bne a0,a5,a34a <__sflush_r+0x9e> + a346: 409c lw a5,0(s1) + a348: e391 bnez a5,a34c <__sflush_r+0xa0> + a34a: c868 sw a0,84(s0) + a34c: 584c lw a1,52(s0) + a34e: 0124a023 sw s2,0(s1) + a352: ddbd beqz a1,a2d0 <__sflush_r+0x24> + a354: 04440793 addi a5,s0,68 + a358: 00f58563 beq a1,a5,a362 <__sflush_r+0xb6> + a35c: 8526 mv a0,s1 + a35e: eecff0ef jal ra,9a4a <_free_r> + a362: 02042a23 sw zero,52(s0) + a366: b7ad j a2d0 <__sflush_r+0x24> + a368: 500c lw a1,32(s0) + a36a: 4601 li a2,0 + a36c: 4685 li a3,1 + a36e: 8526 mv a0,s1 + a370: 9702 jalr a4 + a372: 57fd li a5,-1 + a374: 862a mv a2,a0 + a376: f8f510e3 bne a0,a5,a2f6 <__sflush_r+0x4a> + a37a: 409c lw a5,0(s1) + a37c: dfad beqz a5,a2f6 <__sflush_r+0x4a> + a37e: 4775 li a4,29 + a380: 00e78563 beq a5,a4,a38a <__sflush_r+0xde> + a384: 4759 li a4,22 + a386: 04e79363 bne a5,a4,a3cc <__sflush_r+0x120> + a38a: 0124a023 sw s2,0(s1) + a38e: b789 j a2d0 <__sflush_r+0x24> + a390: 04076713 ori a4,a4,64 + a394: a45a sh a4,12(s0) + a396: 557d li a0,-1 + a398: bf2d j a2d2 <__sflush_r+0x26> + a39a: 0105a983 lw s3,16(a1) + a39e: f20989e3 beqz s3,a2d0 <__sflush_r+0x24> + a3a2: 0005a903 lw s2,0(a1) + a3a6: 8b8d andi a5,a5,3 + a3a8: 0135a023 sw s3,0(a1) + a3ac: 41390933 sub s2,s2,s3 + a3b0: 4701 li a4,0 + a3b2: e391 bnez a5,a3b6 <__sflush_r+0x10a> + a3b4: 49d8 lw a4,20(a1) + a3b6: c418 sw a4,8(s0) + a3b8: f1205ce3 blez s2,a2d0 <__sflush_r+0x24> + a3bc: 541c lw a5,40(s0) + a3be: 500c lw a1,32(s0) + a3c0: 86ca mv a3,s2 + a3c2: 864e mv a2,s3 + a3c4: 8526 mv a0,s1 + a3c6: 9782 jalr a5 + a3c8: 00a04763 bgtz a0,a3d6 <__sflush_r+0x12a> + a3cc: 245e lhu a5,12(s0) + a3ce: 0407e793 ori a5,a5,64 + a3d2: a45e sh a5,12(s0) + a3d4: b7c9 j a396 <__sflush_r+0xea> + a3d6: 99aa add s3,s3,a0 + a3d8: 40a90933 sub s2,s2,a0 + a3dc: bff1 j a3b8 <__sflush_r+0x10c> + +0000a3de <_fflush_r>: + a3de: 499c lw a5,16(a1) + a3e0: c3a5 beqz a5,a440 <_fflush_r+0x62> + a3e2: 1101 addi sp,sp,-32 + a3e4: cc22 sw s0,24(sp) + a3e6: ce06 sw ra,28(sp) + a3e8: 842a mv s0,a0 + a3ea: c511 beqz a0,a3f6 <_fflush_r+0x18> + a3ec: 4d1c lw a5,24(a0) + a3ee: e781 bnez a5,a3f6 <_fflush_r+0x18> + a3f0: c62e sw a1,12(sp) + a3f2: 2229 jal a4fc <__sinit> + a3f4: 45b2 lw a1,12(sp) + a3f6: 00004797 auipc a5,0x4 + a3fa: dea78793 addi a5,a5,-534 # e1e0 <__sf_fake_stdin> + a3fe: 00f59c63 bne a1,a5,a416 <_fflush_r+0x38> + a402: 404c lw a1,4(s0) + a404: 00c59783 lh a5,12(a1) + a408: c79d beqz a5,a436 <_fflush_r+0x58> + a40a: 8522 mv a0,s0 + a40c: 4462 lw s0,24(sp) + a40e: 40f2 lw ra,28(sp) + a410: 6105 addi sp,sp,32 + a412: e9bff06f j a2ac <__sflush_r> + a416: 00004797 auipc a5,0x4 + a41a: dea78793 addi a5,a5,-534 # e200 <__sf_fake_stdout> + a41e: 00f59463 bne a1,a5,a426 <_fflush_r+0x48> + a422: 440c lw a1,8(s0) + a424: b7c5 j a404 <_fflush_r+0x26> + a426: 00004797 auipc a5,0x4 + a42a: d9a78793 addi a5,a5,-614 # e1c0 <__sf_fake_stderr> + a42e: fcf59be3 bne a1,a5,a404 <_fflush_r+0x26> + a432: 444c lw a1,12(s0) + a434: bfc1 j a404 <_fflush_r+0x26> + a436: 40f2 lw ra,28(sp) + a438: 4462 lw s0,24(sp) + a43a: 4501 li a0,0 + a43c: 6105 addi sp,sp,32 + a43e: 8082 ret + a440: 4501 li a0,0 + a442: 8082 ret + +0000a444 : + a444: 1141 addi sp,sp,-16 + a446: c422 sw s0,8(sp) + a448: c606 sw ra,12(sp) + a44a: 842a mv s0,a0 + a44c: a54e sh a1,12(a0) + a44e: a572 sh a2,14(a0) + a450: 00052023 sw zero,0(a0) + a454: 00052223 sw zero,4(a0) + a458: 00052423 sw zero,8(a0) + a45c: 06052223 sw zero,100(a0) + a460: 00052823 sw zero,16(a0) + a464: 00052a23 sw zero,20(a0) + a468: 00052c23 sw zero,24(a0) + a46c: 4621 li a2,8 + a46e: 4581 li a1,0 + a470: 05c50513 addi a0,a0,92 + a474: dadf50ef jal ra,220 + a478: 00001797 auipc a5,0x1 + a47c: d5e78793 addi a5,a5,-674 # b1d6 <__sread> + a480: d05c sw a5,36(s0) + a482: 00001797 auipc a5,0x1 + a486: d8078793 addi a5,a5,-640 # b202 <__swrite> + a48a: d41c sw a5,40(s0) + a48c: 00001797 auipc a5,0x1 + a490: dbe78793 addi a5,a5,-578 # b24a <__sseek> + a494: d45c sw a5,44(s0) + a496: 00001797 auipc a5,0x1 + a49a: de478793 addi a5,a5,-540 # b27a <__sclose> + a49e: d000 sw s0,32(s0) + a4a0: d81c sw a5,48(s0) + a4a2: 40b2 lw ra,12(sp) + a4a4: 4422 lw s0,8(sp) + a4a6: 0141 addi sp,sp,16 + a4a8: 8082 ret + +0000a4aa <_cleanup_r>: + a4aa: 00000597 auipc a1,0x0 + a4ae: f3458593 addi a1,a1,-204 # a3de <_fflush_r> + a4b2: aa99 j a608 <_fwalk_reent> + +0000a4b4 <__sfmoreglue>: + a4b4: 1141 addi sp,sp,-16 + a4b6: c226 sw s1,4(sp) + a4b8: 06800613 li a2,104 + a4bc: fff58493 addi s1,a1,-1 + a4c0: 02c484b3 mul s1,s1,a2 + a4c4: c04a sw s2,0(sp) + a4c6: 892e mv s2,a1 + a4c8: c422 sw s0,8(sp) + a4ca: c606 sw ra,12(sp) + a4cc: 07448593 addi a1,s1,116 + a4d0: e22ff0ef jal ra,9af2 <_malloc_r> + a4d4: 842a mv s0,a0 + a4d6: cd01 beqz a0,a4ee <__sfmoreglue+0x3a> + a4d8: 00052023 sw zero,0(a0) + a4dc: 01252223 sw s2,4(a0) + a4e0: 0531 addi a0,a0,12 + a4e2: c408 sw a0,8(s0) + a4e4: 06848613 addi a2,s1,104 + a4e8: 4581 li a1,0 + a4ea: d37f50ef jal ra,220 + a4ee: 8522 mv a0,s0 + a4f0: 40b2 lw ra,12(sp) + a4f2: 4422 lw s0,8(sp) + a4f4: 4492 lw s1,4(sp) + a4f6: 4902 lw s2,0(sp) + a4f8: 0141 addi sp,sp,16 + a4fa: 8082 ret + +0000a4fc <__sinit>: + a4fc: 4d1c lw a5,24(a0) + a4fe: e7a5 bnez a5,a566 <__sinit+0x6a> + a500: 1141 addi sp,sp,-16 + a502: c606 sw ra,12(sp) + a504: c422 sw s0,8(sp) + a506: 00000797 auipc a5,0x0 + a50a: fa478793 addi a5,a5,-92 # a4aa <_cleanup_r> + a50e: d51c sw a5,40(a0) + a510: 81018793 addi a5,gp,-2032 # 20000200 <_global_impure_ptr> + a514: 439c lw a5,0(a5) + a516: 04052423 sw zero,72(a0) + a51a: 04052623 sw zero,76(a0) + a51e: 04052823 sw zero,80(a0) + a522: 00f51463 bne a0,a5,a52a <__sinit+0x2e> + a526: 4785 li a5,1 + a528: cd1c sw a5,24(a0) + a52a: 842a mv s0,a0 + a52c: 2835 jal a568 <__sfp> + a52e: c048 sw a0,4(s0) + a530: 8522 mv a0,s0 + a532: 281d jal a568 <__sfp> + a534: c408 sw a0,8(s0) + a536: 8522 mv a0,s0 + a538: 2805 jal a568 <__sfp> + a53a: c448 sw a0,12(s0) + a53c: 4048 lw a0,4(s0) + a53e: 4601 li a2,0 + a540: 4591 li a1,4 + a542: f03ff0ef jal ra,a444 + a546: 4408 lw a0,8(s0) + a548: 4605 li a2,1 + a54a: 45a5 li a1,9 + a54c: ef9ff0ef jal ra,a444 + a550: 4448 lw a0,12(s0) + a552: 4609 li a2,2 + a554: 45c9 li a1,18 + a556: eefff0ef jal ra,a444 + a55a: 4785 li a5,1 + a55c: cc1c sw a5,24(s0) + a55e: 40b2 lw ra,12(sp) + a560: 4422 lw s0,8(sp) + a562: 0141 addi sp,sp,16 + a564: 8082 ret + a566: 8082 ret + +0000a568 <__sfp>: + a568: 1141 addi sp,sp,-16 + a56a: 81018793 addi a5,gp,-2032 # 20000200 <_global_impure_ptr> + a56e: c226 sw s1,4(sp) + a570: 4384 lw s1,0(a5) + a572: c04a sw s2,0(sp) + a574: c606 sw ra,12(sp) + a576: 4c9c lw a5,24(s1) + a578: c422 sw s0,8(sp) + a57a: 892a mv s2,a0 + a57c: e781 bnez a5,a584 <__sfp+0x1c> + a57e: 8526 mv a0,s1 + a580: f7dff0ef jal ra,a4fc <__sinit> + a584: 04848493 addi s1,s1,72 + a588: 4480 lw s0,8(s1) + a58a: 40dc lw a5,4(s1) + a58c: 17fd addi a5,a5,-1 + a58e: 0007d663 bgez a5,a59a <__sfp+0x32> + a592: 409c lw a5,0(s1) + a594: cfb9 beqz a5,a5f2 <__sfp+0x8a> + a596: 4084 lw s1,0(s1) + a598: bfc5 j a588 <__sfp+0x20> + a59a: 00c41703 lh a4,12(s0) + a59e: e739 bnez a4,a5ec <__sfp+0x84> + a5a0: 77c1 lui a5,0xffff0 + a5a2: 0785 addi a5,a5,1 + a5a4: 06042223 sw zero,100(s0) + a5a8: 00042023 sw zero,0(s0) + a5ac: 00042223 sw zero,4(s0) + a5b0: 00042423 sw zero,8(s0) + a5b4: c45c sw a5,12(s0) + a5b6: 00042823 sw zero,16(s0) + a5ba: 00042a23 sw zero,20(s0) + a5be: 00042c23 sw zero,24(s0) + a5c2: 4621 li a2,8 + a5c4: 4581 li a1,0 + a5c6: 05c40513 addi a0,s0,92 + a5ca: c57f50ef jal ra,220 + a5ce: 02042a23 sw zero,52(s0) + a5d2: 02042c23 sw zero,56(s0) + a5d6: 04042423 sw zero,72(s0) + a5da: 04042623 sw zero,76(s0) + a5de: 8522 mv a0,s0 + a5e0: 40b2 lw ra,12(sp) + a5e2: 4422 lw s0,8(sp) + a5e4: 4492 lw s1,4(sp) + a5e6: 4902 lw s2,0(sp) + a5e8: 0141 addi sp,sp,16 + a5ea: 8082 ret + a5ec: 06840413 addi s0,s0,104 + a5f0: bf71 j a58c <__sfp+0x24> + a5f2: 4591 li a1,4 + a5f4: 854a mv a0,s2 + a5f6: ebfff0ef jal ra,a4b4 <__sfmoreglue> + a5fa: c088 sw a0,0(s1) + a5fc: fd49 bnez a0,a596 <__sfp+0x2e> + a5fe: 47b1 li a5,12 + a600: 00f92023 sw a5,0(s2) + a604: 4401 li s0,0 + a606: bfe1 j a5de <__sfp+0x76> + +0000a608 <_fwalk_reent>: + a608: 7179 addi sp,sp,-48 + a60a: d422 sw s0,40(sp) + a60c: d04a sw s2,32(sp) + a60e: cc52 sw s4,24(sp) + a610: ca56 sw s5,20(sp) + a612: c85a sw s6,16(sp) + a614: c65e sw s7,12(sp) + a616: d606 sw ra,44(sp) + a618: d226 sw s1,36(sp) + a61a: ce4e sw s3,28(sp) + a61c: 8a2a mv s4,a0 + a61e: 8aae mv s5,a1 + a620: 04850413 addi s0,a0,72 + a624: 4901 li s2,0 + a626: 4b05 li s6,1 + a628: 5bfd li s7,-1 + a62a: ec09 bnez s0,a644 <_fwalk_reent+0x3c> + a62c: 50b2 lw ra,44(sp) + a62e: 5422 lw s0,40(sp) + a630: 854a mv a0,s2 + a632: 5492 lw s1,36(sp) + a634: 5902 lw s2,32(sp) + a636: 49f2 lw s3,28(sp) + a638: 4a62 lw s4,24(sp) + a63a: 4ad2 lw s5,20(sp) + a63c: 4b42 lw s6,16(sp) + a63e: 4bb2 lw s7,12(sp) + a640: 6145 addi sp,sp,48 + a642: 8082 ret + a644: 4404 lw s1,8(s0) + a646: 00442983 lw s3,4(s0) + a64a: 19fd addi s3,s3,-1 + a64c: 0009d463 bgez s3,a654 <_fwalk_reent+0x4c> + a650: 4000 lw s0,0(s0) + a652: bfe1 j a62a <_fwalk_reent+0x22> + a654: 24de lhu a5,12(s1) + a656: 00fb7b63 bgeu s6,a5,a66c <_fwalk_reent+0x64> + a65a: 00e49783 lh a5,14(s1) + a65e: 01778763 beq a5,s7,a66c <_fwalk_reent+0x64> + a662: 85a6 mv a1,s1 + a664: 8552 mv a0,s4 + a666: 9a82 jalr s5 + a668: 00a96933 or s2,s2,a0 + a66c: 06848493 addi s1,s1,104 + a670: bfe9 j a64a <_fwalk_reent+0x42> + +0000a672 <__swhatbuf_r>: + a672: 7119 addi sp,sp,-128 + a674: daa6 sw s1,116(sp) + a676: 84ae mv s1,a1 + a678: 00e59583 lh a1,14(a1) + a67c: dca2 sw s0,120(sp) + a67e: de86 sw ra,124(sp) + a680: 8432 mv s0,a2 + a682: 0005db63 bgez a1,a698 <__swhatbuf_r+0x26> + a686: 24de lhu a5,12(s1) + a688: 0006a023 sw zero,0(a3) + a68c: 0807f793 andi a5,a5,128 + a690: e785 bnez a5,a6b8 <__swhatbuf_r+0x46> + a692: 40000793 li a5,1024 + a696: a01d j a6bc <__swhatbuf_r+0x4a> + a698: 0830 addi a2,sp,24 + a69a: c636 sw a3,12(sp) + a69c: 43b000ef jal ra,b2d6 <_fstat_r> + a6a0: 46b2 lw a3,12(sp) + a6a2: fe0542e3 bltz a0,a686 <__swhatbuf_r+0x14> + a6a6: 4772 lw a4,28(sp) + a6a8: 67bd lui a5,0xf + a6aa: 8ff9 and a5,a5,a4 + a6ac: 7779 lui a4,0xffffe + a6ae: 97ba add a5,a5,a4 + a6b0: 0017b793 seqz a5,a5 + a6b4: c29c sw a5,0(a3) + a6b6: bff1 j a692 <__swhatbuf_r+0x20> + a6b8: 04000793 li a5,64 + a6bc: c01c sw a5,0(s0) + a6be: 50f6 lw ra,124(sp) + a6c0: 5466 lw s0,120(sp) + a6c2: 54d6 lw s1,116(sp) + a6c4: 4501 li a0,0 + a6c6: 6109 addi sp,sp,128 + a6c8: 8082 ret + +0000a6ca <__smakebuf_r>: + a6ca: 25de lhu a5,12(a1) + a6cc: 1101 addi sp,sp,-32 + a6ce: cc22 sw s0,24(sp) + a6d0: ce06 sw ra,28(sp) + a6d2: ca26 sw s1,20(sp) + a6d4: c84a sw s2,16(sp) + a6d6: 8b89 andi a5,a5,2 + a6d8: 842e mv s0,a1 + a6da: cf89 beqz a5,a6f4 <__smakebuf_r+0x2a> + a6dc: 04740793 addi a5,s0,71 + a6e0: c01c sw a5,0(s0) + a6e2: c81c sw a5,16(s0) + a6e4: 4785 li a5,1 + a6e6: c85c sw a5,20(s0) + a6e8: 40f2 lw ra,28(sp) + a6ea: 4462 lw s0,24(sp) + a6ec: 44d2 lw s1,20(sp) + a6ee: 4942 lw s2,16(sp) + a6f0: 6105 addi sp,sp,32 + a6f2: 8082 ret + a6f4: 0074 addi a3,sp,12 + a6f6: 0030 addi a2,sp,8 + a6f8: 84aa mv s1,a0 + a6fa: f79ff0ef jal ra,a672 <__swhatbuf_r> + a6fe: 45a2 lw a1,8(sp) + a700: 892a mv s2,a0 + a702: 8526 mv a0,s1 + a704: beeff0ef jal ra,9af2 <_malloc_r> + a708: e919 bnez a0,a71e <__smakebuf_r+0x54> + a70a: 00c41783 lh a5,12(s0) + a70e: 2007f713 andi a4,a5,512 + a712: fb79 bnez a4,a6e8 <__smakebuf_r+0x1e> + a714: 9bf1 andi a5,a5,-4 + a716: 0027e793 ori a5,a5,2 + a71a: a45e sh a5,12(s0) + a71c: b7c1 j a6dc <__smakebuf_r+0x12> + a71e: 00000797 auipc a5,0x0 + a722: d8c78793 addi a5,a5,-628 # a4aa <_cleanup_r> + a726: d49c sw a5,40(s1) + a728: 245e lhu a5,12(s0) + a72a: c008 sw a0,0(s0) + a72c: c808 sw a0,16(s0) + a72e: 0807e793 ori a5,a5,128 + a732: a45e sh a5,12(s0) + a734: 47a2 lw a5,8(sp) + a736: c85c sw a5,20(s0) + a738: 47b2 lw a5,12(sp) + a73a: cf81 beqz a5,a752 <__smakebuf_r+0x88> + a73c: 00e41583 lh a1,14(s0) + a740: 8526 mv a0,s1 + a742: 3bf000ef jal ra,b300 <_isatty_r> + a746: c511 beqz a0,a752 <__smakebuf_r+0x88> + a748: 245e lhu a5,12(s0) + a74a: 9bf1 andi a5,a5,-4 + a74c: 0017e793 ori a5,a5,1 + a750: a45e sh a5,12(s0) + a752: 245e lhu a5,12(s0) + a754: 00f96933 or s2,s2,a5 + a758: 01241623 sh s2,12(s0) + a75c: b771 j a6e8 <__smakebuf_r+0x1e> + +0000a75e <__malloc_lock>: + a75e: 8082 ret + +0000a760 <__malloc_unlock>: + a760: 8082 ret + +0000a762 <__ssputs_r>: + a762: 1101 addi sp,sp,-32 + a764: c84a sw s2,16(sp) + a766: 0085a903 lw s2,8(a1) + a76a: cc22 sw s0,24(sp) + a76c: c452 sw s4,8(sp) + a76e: c05a sw s6,0(sp) + a770: ce06 sw ra,28(sp) + a772: ca26 sw s1,20(sp) + a774: c64e sw s3,12(sp) + a776: c256 sw s5,4(sp) + a778: 842e mv s0,a1 + a77a: 8b32 mv s6,a2 + a77c: 8a36 mv s4,a3 + a77e: 0926e963 bltu a3,s2,a810 <__ssputs_r+0xae> + a782: 25de lhu a5,12(a1) + a784: 4807f713 andi a4,a5,1152 + a788: c351 beqz a4,a80c <__ssputs_r+0xaa> + a78a: 4004 lw s1,0(s0) + a78c: 498c lw a1,16(a1) + a78e: 4858 lw a4,20(s0) + a790: 8aaa mv s5,a0 + a792: 40b489b3 sub s3,s1,a1 + a796: 448d li s1,3 + a798: 02e484b3 mul s1,s1,a4 + a79c: 4709 li a4,2 + a79e: 02e4c4b3 div s1,s1,a4 + a7a2: 00168713 addi a4,a3,1 + a7a6: 974e add a4,a4,s3 + a7a8: 00e4f363 bgeu s1,a4,a7ae <__ssputs_r+0x4c> + a7ac: 84ba mv s1,a4 + a7ae: 4007f793 andi a5,a5,1024 + a7b2: cfbd beqz a5,a830 <__ssputs_r+0xce> + a7b4: 85a6 mv a1,s1 + a7b6: 8556 mv a0,s5 + a7b8: b3aff0ef jal ra,9af2 <_malloc_r> + a7bc: 892a mv s2,a0 + a7be: e11d bnez a0,a7e4 <__ssputs_r+0x82> + a7c0: 47b1 li a5,12 + a7c2: 00faa023 sw a5,0(s5) + a7c6: 245e lhu a5,12(s0) + a7c8: 557d li a0,-1 + a7ca: 0407e793 ori a5,a5,64 + a7ce: a45e sh a5,12(s0) + a7d0: 40f2 lw ra,28(sp) + a7d2: 4462 lw s0,24(sp) + a7d4: 44d2 lw s1,20(sp) + a7d6: 4942 lw s2,16(sp) + a7d8: 49b2 lw s3,12(sp) + a7da: 4a22 lw s4,8(sp) + a7dc: 4a92 lw s5,4(sp) + a7de: 4b02 lw s6,0(sp) + a7e0: 6105 addi sp,sp,32 + a7e2: 8082 ret + a7e4: 480c lw a1,16(s0) + a7e6: 864e mv a2,s3 + a7e8: 96aff0ef jal ra,9952 + a7ec: 245e lhu a5,12(s0) + a7ee: b7f7f793 andi a5,a5,-1153 + a7f2: 0807e793 ori a5,a5,128 + a7f6: a45e sh a5,12(s0) + a7f8: 01242823 sw s2,16(s0) + a7fc: c844 sw s1,20(s0) + a7fe: 994e add s2,s2,s3 + a800: 413484b3 sub s1,s1,s3 + a804: 01242023 sw s2,0(s0) + a808: c404 sw s1,8(s0) + a80a: 8952 mv s2,s4 + a80c: 012a7363 bgeu s4,s2,a812 <__ssputs_r+0xb0> + a810: 8952 mv s2,s4 + a812: 4008 lw a0,0(s0) + a814: 864a mv a2,s2 + a816: 85da mv a1,s6 + a818: 9ecff0ef jal ra,9a04 + a81c: 441c lw a5,8(s0) + a81e: 4501 li a0,0 + a820: 412787b3 sub a5,a5,s2 + a824: c41c sw a5,8(s0) + a826: 401c lw a5,0(s0) + a828: 993e add s2,s2,a5 + a82a: 01242023 sw s2,0(s0) + a82e: b74d j a7d0 <__ssputs_r+0x6e> + a830: 8626 mv a2,s1 + a832: 8556 mv a0,s5 + a834: 339000ef jal ra,b36c <_realloc_r> + a838: 892a mv s2,a0 + a83a: fd5d bnez a0,a7f8 <__ssputs_r+0x96> + a83c: 480c lw a1,16(s0) + a83e: 8556 mv a0,s5 + a840: a0aff0ef jal ra,9a4a <_free_r> + a844: bfb5 j a7c0 <__ssputs_r+0x5e> + +0000a846 <_svfiprintf_r>: + a846: 25de lhu a5,12(a1) + a848: 7171 addi sp,sp,-176 + a84a: d326 sw s1,164(sp) + a84c: d14a sw s2,160(sp) + a84e: cf4e sw s3,156(sp) + a850: d706 sw ra,172(sp) + a852: d522 sw s0,168(sp) + a854: cd52 sw s4,152(sp) + a856: cb56 sw s5,148(sp) + a858: c95a sw s6,144(sp) + a85a: c75e sw s7,140(sp) + a85c: c562 sw s8,136(sp) + a85e: c366 sw s9,132(sp) + a860: 0807f793 andi a5,a5,128 + a864: 89aa mv s3,a0 + a866: 892e mv s2,a1 + a868: 84b2 mv s1,a2 + a86a: c3b9 beqz a5,a8b0 <_svfiprintf_r+0x6a> + a86c: 499c lw a5,16(a1) + a86e: e3a9 bnez a5,a8b0 <_svfiprintf_r+0x6a> + a870: 04000593 li a1,64 + a874: c636 sw a3,12(sp) + a876: a7cff0ef jal ra,9af2 <_malloc_r> + a87a: 00a92023 sw a0,0(s2) + a87e: 00a92823 sw a0,16(s2) + a882: 46b2 lw a3,12(sp) + a884: e115 bnez a0,a8a8 <_svfiprintf_r+0x62> + a886: 47b1 li a5,12 + a888: 00f9a023 sw a5,0(s3) + a88c: 557d li a0,-1 + a88e: 50ba lw ra,172(sp) + a890: 542a lw s0,168(sp) + a892: 549a lw s1,164(sp) + a894: 590a lw s2,160(sp) + a896: 49fa lw s3,156(sp) + a898: 4a6a lw s4,152(sp) + a89a: 4ada lw s5,148(sp) + a89c: 4b4a lw s6,144(sp) + a89e: 4bba lw s7,140(sp) + a8a0: 4c2a lw s8,136(sp) + a8a2: 4c9a lw s9,132(sp) + a8a4: 614d addi sp,sp,176 + a8a6: 8082 ret + a8a8: 04000793 li a5,64 + a8ac: 00f92a23 sw a5,20(s2) + a8b0: 02000793 li a5,32 + a8b4: 02f10ca3 sb a5,57(sp) + a8b8: 03000793 li a5,48 + a8bc: da02 sw zero,52(sp) + a8be: 02f10d23 sb a5,58(sp) + a8c2: ce36 sw a3,28(sp) + a8c4: 02500b93 li s7,37 + a8c8: 00004a97 auipc s5,0x4 + a8cc: 958a8a93 addi s5,s5,-1704 # e220 <__sf_fake_stdout+0x20> + a8d0: 4c05 li s8,1 + a8d2: 4b29 li s6,10 + a8d4: 8426 mv s0,s1 + a8d6: 201c lbu a5,0(s0) + a8d8: c399 beqz a5,a8de <_svfiprintf_r+0x98> + a8da: 09779963 bne a5,s7,a96c <_svfiprintf_r+0x126> + a8de: 40940cb3 sub s9,s0,s1 + a8e2: 000c8e63 beqz s9,a8fe <_svfiprintf_r+0xb8> + a8e6: 86e6 mv a3,s9 + a8e8: 8626 mv a2,s1 + a8ea: 85ca mv a1,s2 + a8ec: 854e mv a0,s3 + a8ee: e75ff0ef jal ra,a762 <__ssputs_r> + a8f2: 57fd li a5,-1 + a8f4: 18f50b63 beq a0,a5,aa8a <_svfiprintf_r+0x244> + a8f8: 56d2 lw a3,52(sp) + a8fa: 96e6 add a3,a3,s9 + a8fc: da36 sw a3,52(sp) + a8fe: 201c lbu a5,0(s0) + a900: 18078563 beqz a5,aa8a <_svfiprintf_r+0x244> + a904: 57fd li a5,-1 + a906: 00140493 addi s1,s0,1 + a90a: d002 sw zero,32(sp) + a90c: d602 sw zero,44(sp) + a90e: d23e sw a5,36(sp) + a910: d402 sw zero,40(sp) + a912: 060101a3 sb zero,99(sp) + a916: dc82 sw zero,120(sp) + a918: 208c lbu a1,0(s1) + a91a: 4615 li a2,5 + a91c: 8556 mv a0,s5 + a91e: 237000ef jal ra,b354 + a922: 00148413 addi s0,s1,1 + a926: 5782 lw a5,32(sp) + a928: e521 bnez a0,a970 <_svfiprintf_r+0x12a> + a92a: 0107f713 andi a4,a5,16 + a92e: c709 beqz a4,a938 <_svfiprintf_r+0xf2> + a930: 02000713 li a4,32 + a934: 06e101a3 sb a4,99(sp) + a938: 0087f713 andi a4,a5,8 + a93c: c709 beqz a4,a946 <_svfiprintf_r+0x100> + a93e: 02b00713 li a4,43 + a942: 06e101a3 sb a4,99(sp) + a946: 2094 lbu a3,0(s1) + a948: 02a00713 li a4,42 + a94c: 02e68a63 beq a3,a4,a980 <_svfiprintf_r+0x13a> + a950: 57b2 lw a5,44(sp) + a952: 8426 mv s0,s1 + a954: 4681 li a3,0 + a956: 4625 li a2,9 + a958: 2018 lbu a4,0(s0) + a95a: 00140593 addi a1,s0,1 + a95e: fd070713 addi a4,a4,-48 # ffffdfd0 <_eusrstack+0xdfff5fd0> + a962: 06e67263 bgeu a2,a4,a9c6 <_svfiprintf_r+0x180> + a966: c68d beqz a3,a990 <_svfiprintf_r+0x14a> + a968: d63e sw a5,44(sp) + a96a: a01d j a990 <_svfiprintf_r+0x14a> + a96c: 0405 addi s0,s0,1 + a96e: b7a5 j a8d6 <_svfiprintf_r+0x90> + a970: 41550533 sub a0,a0,s5 + a974: 00ac1533 sll a0,s8,a0 + a978: 8fc9 or a5,a5,a0 + a97a: d03e sw a5,32(sp) + a97c: 84a2 mv s1,s0 + a97e: bf69 j a918 <_svfiprintf_r+0xd2> + a980: 4772 lw a4,28(sp) + a982: 00470693 addi a3,a4,4 + a986: 4318 lw a4,0(a4) + a988: ce36 sw a3,28(sp) + a98a: 02074763 bltz a4,a9b8 <_svfiprintf_r+0x172> + a98e: d63a sw a4,44(sp) + a990: 2018 lbu a4,0(s0) + a992: 02e00793 li a5,46 + a996: 04f71d63 bne a4,a5,a9f0 <_svfiprintf_r+0x1aa> + a99a: 3018 lbu a4,1(s0) + a99c: 02a00793 li a5,42 + a9a0: 02f71b63 bne a4,a5,a9d6 <_svfiprintf_r+0x190> + a9a4: 47f2 lw a5,28(sp) + a9a6: 0409 addi s0,s0,2 + a9a8: 00478713 addi a4,a5,4 + a9ac: 439c lw a5,0(a5) + a9ae: ce3a sw a4,28(sp) + a9b0: 0207c163 bltz a5,a9d2 <_svfiprintf_r+0x18c> + a9b4: d23e sw a5,36(sp) + a9b6: a82d j a9f0 <_svfiprintf_r+0x1aa> + a9b8: 40e00733 neg a4,a4 + a9bc: 0027e793 ori a5,a5,2 + a9c0: d63a sw a4,44(sp) + a9c2: d03e sw a5,32(sp) + a9c4: b7f1 j a990 <_svfiprintf_r+0x14a> + a9c6: 036787b3 mul a5,a5,s6 + a9ca: 4685 li a3,1 + a9cc: 842e mv s0,a1 + a9ce: 97ba add a5,a5,a4 + a9d0: b761 j a958 <_svfiprintf_r+0x112> + a9d2: 57fd li a5,-1 + a9d4: b7c5 j a9b4 <_svfiprintf_r+0x16e> + a9d6: 0405 addi s0,s0,1 + a9d8: d202 sw zero,36(sp) + a9da: 4681 li a3,0 + a9dc: 4781 li a5,0 + a9de: 4625 li a2,9 + a9e0: 2018 lbu a4,0(s0) + a9e2: 00140593 addi a1,s0,1 + a9e6: fd070713 addi a4,a4,-48 + a9ea: 06e67663 bgeu a2,a4,aa56 <_svfiprintf_r+0x210> + a9ee: f2f9 bnez a3,a9b4 <_svfiprintf_r+0x16e> + a9f0: 200c lbu a1,0(s0) + a9f2: 460d li a2,3 + a9f4: 00004517 auipc a0,0x4 + a9f8: 83450513 addi a0,a0,-1996 # e228 <__sf_fake_stdout+0x28> + a9fc: 159000ef jal ra,b354 + aa00: cd11 beqz a0,aa1c <_svfiprintf_r+0x1d6> + aa02: 00004797 auipc a5,0x4 + aa06: 82678793 addi a5,a5,-2010 # e228 <__sf_fake_stdout+0x28> + aa0a: 8d1d sub a0,a0,a5 + aa0c: 04000793 li a5,64 + aa10: 00a797b3 sll a5,a5,a0 + aa14: 5502 lw a0,32(sp) + aa16: 0405 addi s0,s0,1 + aa18: 8d5d or a0,a0,a5 + aa1a: d02a sw a0,32(sp) + aa1c: 200c lbu a1,0(s0) + aa1e: 4619 li a2,6 + aa20: 00004517 auipc a0,0x4 + aa24: 80c50513 addi a0,a0,-2036 # e22c <__sf_fake_stdout+0x2c> + aa28: 00140493 addi s1,s0,1 + aa2c: 02b10c23 sb a1,56(sp) + aa30: 125000ef jal ra,b354 + aa34: c525 beqz a0,aa9c <_svfiprintf_r+0x256> + aa36: ffff5797 auipc a5,0xffff5 + aa3a: 5ca78793 addi a5,a5,1482 # 0 <_sinit> + aa3e: e795 bnez a5,aa6a <_svfiprintf_r+0x224> + aa40: 5702 lw a4,32(sp) + aa42: 47f2 lw a5,28(sp) + aa44: 10077713 andi a4,a4,256 + aa48: cf09 beqz a4,aa62 <_svfiprintf_r+0x21c> + aa4a: 0791 addi a5,a5,4 + aa4c: ce3e sw a5,28(sp) + aa4e: 57d2 lw a5,52(sp) + aa50: 97d2 add a5,a5,s4 + aa52: da3e sw a5,52(sp) + aa54: b541 j a8d4 <_svfiprintf_r+0x8e> + aa56: 036787b3 mul a5,a5,s6 + aa5a: 4685 li a3,1 + aa5c: 842e mv s0,a1 + aa5e: 97ba add a5,a5,a4 + aa60: b741 j a9e0 <_svfiprintf_r+0x19a> + aa62: 079d addi a5,a5,7 + aa64: 9be1 andi a5,a5,-8 + aa66: 07a1 addi a5,a5,8 + aa68: b7d5 j aa4c <_svfiprintf_r+0x206> + aa6a: 0878 addi a4,sp,28 + aa6c: 00000697 auipc a3,0x0 + aa70: cf668693 addi a3,a3,-778 # a762 <__ssputs_r> + aa74: 864a mv a2,s2 + aa76: 100c addi a1,sp,32 + aa78: 854e mv a0,s3 + aa7a: 00000097 auipc ra,0x0 + aa7e: 000000e7 jalr zero # 0 <_sinit> + aa82: 57fd li a5,-1 + aa84: 8a2a mv s4,a0 + aa86: fcf514e3 bne a0,a5,aa4e <_svfiprintf_r+0x208> + aa8a: 00c95783 lhu a5,12(s2) + aa8e: 557d li a0,-1 + aa90: 0407f793 andi a5,a5,64 + aa94: de079de3 bnez a5,a88e <_svfiprintf_r+0x48> + aa98: 5552 lw a0,52(sp) + aa9a: bbd5 j a88e <_svfiprintf_r+0x48> + aa9c: 0878 addi a4,sp,28 + aa9e: 00000697 auipc a3,0x0 + aaa2: cc468693 addi a3,a3,-828 # a762 <__ssputs_r> + aaa6: 864a mv a2,s2 + aaa8: 100c addi a1,sp,32 + aaaa: 854e mv a0,s3 + aaac: 2111 jal aeb0 <_printf_i> + aaae: bfd1 j aa82 <_svfiprintf_r+0x23c> + +0000aab0 <__sfputc_r>: + aab0: 461c lw a5,8(a2) + aab2: 17fd addi a5,a5,-1 + aab4: c61c sw a5,8(a2) + aab6: 0007da63 bgez a5,aaca <__sfputc_r+0x1a> + aaba: 4e18 lw a4,24(a2) + aabc: 00e7c563 blt a5,a4,aac6 <__sfputc_r+0x16> + aac0: 47a9 li a5,10 + aac2: 00f59463 bne a1,a5,aaca <__sfputc_r+0x1a> + aac6: e0eff06f j a0d4 <__swbuf_r> + aaca: 421c lw a5,0(a2) + aacc: 852e mv a0,a1 + aace: 00178713 addi a4,a5,1 + aad2: c218 sw a4,0(a2) + aad4: a38c sb a1,0(a5) + aad6: 8082 ret + +0000aad8 <__sfputs_r>: + aad8: 1101 addi sp,sp,-32 + aada: cc22 sw s0,24(sp) + aadc: ca26 sw s1,20(sp) + aade: c84a sw s2,16(sp) + aae0: c64e sw s3,12(sp) + aae2: c452 sw s4,8(sp) + aae4: ce06 sw ra,28(sp) + aae6: 892a mv s2,a0 + aae8: 89ae mv s3,a1 + aaea: 8432 mv s0,a2 + aaec: 00d604b3 add s1,a2,a3 + aaf0: 5a7d li s4,-1 + aaf2: 00941463 bne s0,s1,aafa <__sfputs_r+0x22> + aaf6: 4501 li a0,0 + aaf8: a809 j ab0a <__sfputs_r+0x32> + aafa: 200c lbu a1,0(s0) + aafc: 864e mv a2,s3 + aafe: 854a mv a0,s2 + ab00: fb1ff0ef jal ra,aab0 <__sfputc_r> + ab04: 0405 addi s0,s0,1 + ab06: ff4516e3 bne a0,s4,aaf2 <__sfputs_r+0x1a> + ab0a: 40f2 lw ra,28(sp) + ab0c: 4462 lw s0,24(sp) + ab0e: 44d2 lw s1,20(sp) + ab10: 4942 lw s2,16(sp) + ab12: 49b2 lw s3,12(sp) + ab14: 4a22 lw s4,8(sp) + ab16: 6105 addi sp,sp,32 + ab18: 8082 ret + +0000ab1a <_vfiprintf_r>: + ab1a: 7135 addi sp,sp,-160 + ab1c: cd22 sw s0,152(sp) + ab1e: cb26 sw s1,148(sp) + ab20: c94a sw s2,144(sp) + ab22: c74e sw s3,140(sp) + ab24: cf06 sw ra,156(sp) + ab26: c552 sw s4,136(sp) + ab28: c356 sw s5,132(sp) + ab2a: c15a sw s6,128(sp) + ab2c: dede sw s7,124(sp) + ab2e: dce2 sw s8,120(sp) + ab30: dae6 sw s9,116(sp) + ab32: 89aa mv s3,a0 + ab34: 84ae mv s1,a1 + ab36: 8932 mv s2,a2 + ab38: 8436 mv s0,a3 + ab3a: c509 beqz a0,ab44 <_vfiprintf_r+0x2a> + ab3c: 4d1c lw a5,24(a0) + ab3e: e399 bnez a5,ab44 <_vfiprintf_r+0x2a> + ab40: 9bdff0ef jal ra,a4fc <__sinit> + ab44: 00003797 auipc a5,0x3 + ab48: 69c78793 addi a5,a5,1692 # e1e0 <__sf_fake_stdin> + ab4c: 0cf49963 bne s1,a5,ac1e <_vfiprintf_r+0x104> + ab50: 0049a483 lw s1,4(s3) + ab54: 24de lhu a5,12(s1) + ab56: 8ba1 andi a5,a5,8 + ab58: c7ed beqz a5,ac42 <_vfiprintf_r+0x128> + ab5a: 489c lw a5,16(s1) + ab5c: c3fd beqz a5,ac42 <_vfiprintf_r+0x128> + ab5e: 02000793 li a5,32 + ab62: 02f104a3 sb a5,41(sp) + ab66: 03000793 li a5,48 + ab6a: d202 sw zero,36(sp) + ab6c: 02f10523 sb a5,42(sp) + ab70: c622 sw s0,12(sp) + ab72: 02500b93 li s7,37 + ab76: 00003a97 auipc s5,0x3 + ab7a: 6aaa8a93 addi s5,s5,1706 # e220 <__sf_fake_stdout+0x20> + ab7e: 4c05 li s8,1 + ab80: 4b29 li s6,10 + ab82: 844a mv s0,s2 + ab84: 201c lbu a5,0(s0) + ab86: c399 beqz a5,ab8c <_vfiprintf_r+0x72> + ab88: 0f779063 bne a5,s7,ac68 <_vfiprintf_r+0x14e> + ab8c: 41240cb3 sub s9,s0,s2 + ab90: 000c8e63 beqz s9,abac <_vfiprintf_r+0x92> + ab94: 86e6 mv a3,s9 + ab96: 864a mv a2,s2 + ab98: 85a6 mv a1,s1 + ab9a: 854e mv a0,s3 + ab9c: f3dff0ef jal ra,aad8 <__sfputs_r> + aba0: 57fd li a5,-1 + aba2: 1ef50063 beq a0,a5,ad82 <_vfiprintf_r+0x268> + aba6: 5692 lw a3,36(sp) + aba8: 96e6 add a3,a3,s9 + abaa: d236 sw a3,36(sp) + abac: 201c lbu a5,0(s0) + abae: 1c078a63 beqz a5,ad82 <_vfiprintf_r+0x268> + abb2: 57fd li a5,-1 + abb4: 00140913 addi s2,s0,1 + abb8: c802 sw zero,16(sp) + abba: ce02 sw zero,28(sp) + abbc: ca3e sw a5,20(sp) + abbe: cc02 sw zero,24(sp) + abc0: 040109a3 sb zero,83(sp) + abc4: d482 sw zero,104(sp) + abc6: 00094583 lbu a1,0(s2) + abca: 4615 li a2,5 + abcc: 8556 mv a0,s5 + abce: 786000ef jal ra,b354 + abd2: 00190413 addi s0,s2,1 + abd6: 47c2 lw a5,16(sp) + abd8: e951 bnez a0,ac6c <_vfiprintf_r+0x152> + abda: 0107f713 andi a4,a5,16 + abde: c709 beqz a4,abe8 <_vfiprintf_r+0xce> + abe0: 02000713 li a4,32 + abe4: 04e109a3 sb a4,83(sp) + abe8: 0087f713 andi a4,a5,8 + abec: c709 beqz a4,abf6 <_vfiprintf_r+0xdc> + abee: 02b00713 li a4,43 + abf2: 04e109a3 sb a4,83(sp) + abf6: 00094683 lbu a3,0(s2) + abfa: 02a00713 li a4,42 + abfe: 06e68f63 beq a3,a4,ac7c <_vfiprintf_r+0x162> + ac02: 47f2 lw a5,28(sp) + ac04: 844a mv s0,s2 + ac06: 4681 li a3,0 + ac08: 4625 li a2,9 + ac0a: 2018 lbu a4,0(s0) + ac0c: 00140593 addi a1,s0,1 + ac10: fd070713 addi a4,a4,-48 + ac14: 0ae67763 bgeu a2,a4,acc2 <_vfiprintf_r+0x1a8> + ac18: cab5 beqz a3,ac8c <_vfiprintf_r+0x172> + ac1a: ce3e sw a5,28(sp) + ac1c: a885 j ac8c <_vfiprintf_r+0x172> + ac1e: 00003797 auipc a5,0x3 + ac22: 5e278793 addi a5,a5,1506 # e200 <__sf_fake_stdout> + ac26: 00f49563 bne s1,a5,ac30 <_vfiprintf_r+0x116> + ac2a: 0089a483 lw s1,8(s3) + ac2e: b71d j ab54 <_vfiprintf_r+0x3a> + ac30: 00003797 auipc a5,0x3 + ac34: 59078793 addi a5,a5,1424 # e1c0 <__sf_fake_stderr> + ac38: f0f49ee3 bne s1,a5,ab54 <_vfiprintf_r+0x3a> + ac3c: 00c9a483 lw s1,12(s3) + ac40: bf11 j ab54 <_vfiprintf_r+0x3a> + ac42: 85a6 mv a1,s1 + ac44: 854e mv a0,s3 + ac46: d68ff0ef jal ra,a1ae <__swsetup_r> + ac4a: d911 beqz a0,ab5e <_vfiprintf_r+0x44> + ac4c: 557d li a0,-1 + ac4e: 40fa lw ra,156(sp) + ac50: 446a lw s0,152(sp) + ac52: 44da lw s1,148(sp) + ac54: 494a lw s2,144(sp) + ac56: 49ba lw s3,140(sp) + ac58: 4a2a lw s4,136(sp) + ac5a: 4a9a lw s5,132(sp) + ac5c: 4b0a lw s6,128(sp) + ac5e: 5bf6 lw s7,124(sp) + ac60: 5c66 lw s8,120(sp) + ac62: 5cd6 lw s9,116(sp) + ac64: 610d addi sp,sp,160 + ac66: 8082 ret + ac68: 0405 addi s0,s0,1 + ac6a: bf29 j ab84 <_vfiprintf_r+0x6a> + ac6c: 41550533 sub a0,a0,s5 + ac70: 00ac1533 sll a0,s8,a0 + ac74: 8fc9 or a5,a5,a0 + ac76: c83e sw a5,16(sp) + ac78: 8922 mv s2,s0 + ac7a: b7b1 j abc6 <_vfiprintf_r+0xac> + ac7c: 4732 lw a4,12(sp) + ac7e: 00470693 addi a3,a4,4 + ac82: 4318 lw a4,0(a4) + ac84: c636 sw a3,12(sp) + ac86: 02074763 bltz a4,acb4 <_vfiprintf_r+0x19a> + ac8a: ce3a sw a4,28(sp) + ac8c: 2018 lbu a4,0(s0) + ac8e: 02e00793 li a5,46 + ac92: 04f71d63 bne a4,a5,acec <_vfiprintf_r+0x1d2> + ac96: 3018 lbu a4,1(s0) + ac98: 02a00793 li a5,42 + ac9c: 02f71b63 bne a4,a5,acd2 <_vfiprintf_r+0x1b8> + aca0: 47b2 lw a5,12(sp) + aca2: 0409 addi s0,s0,2 + aca4: 00478713 addi a4,a5,4 + aca8: 439c lw a5,0(a5) + acaa: c63a sw a4,12(sp) + acac: 0207c163 bltz a5,acce <_vfiprintf_r+0x1b4> + acb0: ca3e sw a5,20(sp) + acb2: a82d j acec <_vfiprintf_r+0x1d2> + acb4: 40e00733 neg a4,a4 + acb8: 0027e793 ori a5,a5,2 + acbc: ce3a sw a4,28(sp) + acbe: c83e sw a5,16(sp) + acc0: b7f1 j ac8c <_vfiprintf_r+0x172> + acc2: 036787b3 mul a5,a5,s6 + acc6: 4685 li a3,1 + acc8: 842e mv s0,a1 + acca: 97ba add a5,a5,a4 + accc: bf3d j ac0a <_vfiprintf_r+0xf0> + acce: 57fd li a5,-1 + acd0: b7c5 j acb0 <_vfiprintf_r+0x196> + acd2: 0405 addi s0,s0,1 + acd4: ca02 sw zero,20(sp) + acd6: 4681 li a3,0 + acd8: 4781 li a5,0 + acda: 4625 li a2,9 + acdc: 2018 lbu a4,0(s0) + acde: 00140593 addi a1,s0,1 + ace2: fd070713 addi a4,a4,-48 + ace6: 06e67463 bgeu a2,a4,ad4e <_vfiprintf_r+0x234> + acea: f2f9 bnez a3,acb0 <_vfiprintf_r+0x196> + acec: 200c lbu a1,0(s0) + acee: 460d li a2,3 + acf0: 00003517 auipc a0,0x3 + acf4: 53850513 addi a0,a0,1336 # e228 <__sf_fake_stdout+0x28> + acf8: 2db1 jal b354 + acfa: cd11 beqz a0,ad16 <_vfiprintf_r+0x1fc> + acfc: 00003797 auipc a5,0x3 + ad00: 52c78793 addi a5,a5,1324 # e228 <__sf_fake_stdout+0x28> + ad04: 8d1d sub a0,a0,a5 + ad06: 04000793 li a5,64 + ad0a: 00a797b3 sll a5,a5,a0 + ad0e: 4542 lw a0,16(sp) + ad10: 0405 addi s0,s0,1 + ad12: 8d5d or a0,a0,a5 + ad14: c82a sw a0,16(sp) + ad16: 200c lbu a1,0(s0) + ad18: 4619 li a2,6 + ad1a: 00003517 auipc a0,0x3 + ad1e: 51250513 addi a0,a0,1298 # e22c <__sf_fake_stdout+0x2c> + ad22: 00140913 addi s2,s0,1 + ad26: 02b10423 sb a1,40(sp) + ad2a: 252d jal b354 + ad2c: c135 beqz a0,ad90 <_vfiprintf_r+0x276> + ad2e: ffff5797 auipc a5,0xffff5 + ad32: 2d278793 addi a5,a5,722 # 0 <_sinit> + ad36: e795 bnez a5,ad62 <_vfiprintf_r+0x248> + ad38: 4742 lw a4,16(sp) + ad3a: 47b2 lw a5,12(sp) + ad3c: 10077713 andi a4,a4,256 + ad40: cf09 beqz a4,ad5a <_vfiprintf_r+0x240> + ad42: 0791 addi a5,a5,4 + ad44: c63e sw a5,12(sp) + ad46: 5792 lw a5,36(sp) + ad48: 97d2 add a5,a5,s4 + ad4a: d23e sw a5,36(sp) + ad4c: bd1d j ab82 <_vfiprintf_r+0x68> + ad4e: 036787b3 mul a5,a5,s6 + ad52: 4685 li a3,1 + ad54: 842e mv s0,a1 + ad56: 97ba add a5,a5,a4 + ad58: b751 j acdc <_vfiprintf_r+0x1c2> + ad5a: 079d addi a5,a5,7 + ad5c: 9be1 andi a5,a5,-8 + ad5e: 07a1 addi a5,a5,8 + ad60: b7d5 j ad44 <_vfiprintf_r+0x22a> + ad62: 0078 addi a4,sp,12 + ad64: 00000697 auipc a3,0x0 + ad68: d7468693 addi a3,a3,-652 # aad8 <__sfputs_r> + ad6c: 8626 mv a2,s1 + ad6e: 080c addi a1,sp,16 + ad70: 854e mv a0,s3 + ad72: 00000097 auipc ra,0x0 + ad76: 000000e7 jalr zero # 0 <_sinit> + ad7a: 57fd li a5,-1 + ad7c: 8a2a mv s4,a0 + ad7e: fcf514e3 bne a0,a5,ad46 <_vfiprintf_r+0x22c> + ad82: 24de lhu a5,12(s1) + ad84: 0407f793 andi a5,a5,64 + ad88: ec0792e3 bnez a5,ac4c <_vfiprintf_r+0x132> + ad8c: 5512 lw a0,36(sp) + ad8e: b5c1 j ac4e <_vfiprintf_r+0x134> + ad90: 0078 addi a4,sp,12 + ad92: 00000697 auipc a3,0x0 + ad96: d4668693 addi a3,a3,-698 # aad8 <__sfputs_r> + ad9a: 8626 mv a2,s1 + ad9c: 080c addi a1,sp,16 + ad9e: 854e mv a0,s3 + ada0: 2a01 jal aeb0 <_printf_i> + ada2: bfe1 j ad7a <_vfiprintf_r+0x260> + +0000ada4 <_printf_common>: + ada4: 7179 addi sp,sp,-48 + ada6: ca56 sw s5,20(sp) + ada8: 499c lw a5,16(a1) + adaa: 8aba mv s5,a4 + adac: 4598 lw a4,8(a1) + adae: d422 sw s0,40(sp) + adb0: d226 sw s1,36(sp) + adb2: ce4e sw s3,28(sp) + adb4: cc52 sw s4,24(sp) + adb6: d606 sw ra,44(sp) + adb8: d04a sw s2,32(sp) + adba: c85a sw s6,16(sp) + adbc: c65e sw s7,12(sp) + adbe: 89aa mv s3,a0 + adc0: 842e mv s0,a1 + adc2: 84b2 mv s1,a2 + adc4: 8a36 mv s4,a3 + adc6: 00e7d363 bge a5,a4,adcc <_printf_common+0x28> + adca: 87ba mv a5,a4 + adcc: c09c sw a5,0(s1) + adce: 04344703 lbu a4,67(s0) + add2: c319 beqz a4,add8 <_printf_common+0x34> + add4: 0785 addi a5,a5,1 + add6: c09c sw a5,0(s1) + add8: 401c lw a5,0(s0) + adda: 0207f793 andi a5,a5,32 + adde: c781 beqz a5,ade6 <_printf_common+0x42> + ade0: 409c lw a5,0(s1) + ade2: 0789 addi a5,a5,2 + ade4: c09c sw a5,0(s1) + ade6: 00042903 lw s2,0(s0) + adea: 00697913 andi s2,s2,6 + adee: 00091a63 bnez s2,ae02 <_printf_common+0x5e> + adf2: 01940b13 addi s6,s0,25 + adf6: 5bfd li s7,-1 + adf8: 445c lw a5,12(s0) + adfa: 4098 lw a4,0(s1) + adfc: 8f99 sub a5,a5,a4 + adfe: 04f94c63 blt s2,a5,ae56 <_printf_common+0xb2> + ae02: 401c lw a5,0(s0) + ae04: 04344683 lbu a3,67(s0) + ae08: 0207f793 andi a5,a5,32 + ae0c: 00d036b3 snez a3,a3 + ae10: eba5 bnez a5,ae80 <_printf_common+0xdc> + ae12: 04340613 addi a2,s0,67 + ae16: 85d2 mv a1,s4 + ae18: 854e mv a0,s3 + ae1a: 9a82 jalr s5 + ae1c: 57fd li a5,-1 + ae1e: 04f50363 beq a0,a5,ae64 <_printf_common+0xc0> + ae22: 401c lw a5,0(s0) + ae24: 4611 li a2,4 + ae26: 4098 lw a4,0(s1) + ae28: 8b99 andi a5,a5,6 + ae2a: 4454 lw a3,12(s0) + ae2c: 4481 li s1,0 + ae2e: 00c79763 bne a5,a2,ae3c <_printf_common+0x98> + ae32: 40e684b3 sub s1,a3,a4 + ae36: 0004d363 bgez s1,ae3c <_printf_common+0x98> + ae3a: 4481 li s1,0 + ae3c: 441c lw a5,8(s0) + ae3e: 4818 lw a4,16(s0) + ae40: 00f75463 bge a4,a5,ae48 <_printf_common+0xa4> + ae44: 8f99 sub a5,a5,a4 + ae46: 94be add s1,s1,a5 + ae48: 4901 li s2,0 + ae4a: 0469 addi s0,s0,26 + ae4c: 5b7d li s6,-1 + ae4e: 05249863 bne s1,s2,ae9e <_printf_common+0xfa> + ae52: 4501 li a0,0 + ae54: a809 j ae66 <_printf_common+0xc2> + ae56: 4685 li a3,1 + ae58: 865a mv a2,s6 + ae5a: 85d2 mv a1,s4 + ae5c: 854e mv a0,s3 + ae5e: 9a82 jalr s5 + ae60: 01751e63 bne a0,s7,ae7c <_printf_common+0xd8> + ae64: 557d li a0,-1 + ae66: 50b2 lw ra,44(sp) + ae68: 5422 lw s0,40(sp) + ae6a: 5492 lw s1,36(sp) + ae6c: 5902 lw s2,32(sp) + ae6e: 49f2 lw s3,28(sp) + ae70: 4a62 lw s4,24(sp) + ae72: 4ad2 lw s5,20(sp) + ae74: 4b42 lw s6,16(sp) + ae76: 4bb2 lw s7,12(sp) + ae78: 6145 addi sp,sp,48 + ae7a: 8082 ret + ae7c: 0905 addi s2,s2,1 + ae7e: bfad j adf8 <_printf_common+0x54> + ae80: 00d40733 add a4,s0,a3 + ae84: 03000613 li a2,48 + ae88: 04c701a3 sb a2,67(a4) + ae8c: 04544703 lbu a4,69(s0) + ae90: 00168793 addi a5,a3,1 + ae94: 97a2 add a5,a5,s0 + ae96: 0689 addi a3,a3,2 + ae98: 04e781a3 sb a4,67(a5) + ae9c: bf9d j ae12 <_printf_common+0x6e> + ae9e: 4685 li a3,1 + aea0: 8622 mv a2,s0 + aea2: 85d2 mv a1,s4 + aea4: 854e mv a0,s3 + aea6: 9a82 jalr s5 + aea8: fb650ee3 beq a0,s6,ae64 <_printf_common+0xc0> + aeac: 0905 addi s2,s2,1 + aeae: b745 j ae4e <_printf_common+0xaa> + +0000aeb0 <_printf_i>: + aeb0: 7179 addi sp,sp,-48 + aeb2: d422 sw s0,40(sp) + aeb4: d226 sw s1,36(sp) + aeb6: d04a sw s2,32(sp) + aeb8: ce4e sw s3,28(sp) + aeba: d606 sw ra,44(sp) + aebc: cc52 sw s4,24(sp) + aebe: ca56 sw s5,20(sp) + aec0: c85a sw s6,16(sp) + aec2: 89b6 mv s3,a3 + aec4: 2d94 lbu a3,24(a1) + aec6: 06900793 li a5,105 + aeca: 8932 mv s2,a2 + aecc: 84aa mv s1,a0 + aece: 842e mv s0,a1 + aed0: 04358613 addi a2,a1,67 + aed4: 02f68d63 beq a3,a5,af0e <_printf_i+0x5e> + aed8: 06d7e263 bltu a5,a3,af3c <_printf_i+0x8c> + aedc: 05800793 li a5,88 + aee0: 18f68663 beq a3,a5,b06c <_printf_i+0x1bc> + aee4: 00d7ed63 bltu a5,a3,aefe <_printf_i+0x4e> + aee8: 20068e63 beqz a3,b104 <_printf_i+0x254> + aeec: 04300793 li a5,67 + aef0: 0af68e63 beq a3,a5,afac <_printf_i+0xfc> + aef4: 04240a93 addi s5,s0,66 + aef8: 04d40123 sb a3,66(s0) + aefc: a0c9 j afbe <_printf_i+0x10e> + aefe: 06300793 li a5,99 + af02: 0af68563 beq a3,a5,afac <_printf_i+0xfc> + af06: 06400793 li a5,100 + af0a: fef695e3 bne a3,a5,aef4 <_printf_i+0x44> + af0e: 401c lw a5,0(s0) + af10: 4308 lw a0,0(a4) + af12: 0807f693 andi a3,a5,128 + af16: 00450593 addi a1,a0,4 + af1a: c6c5 beqz a3,afc2 <_printf_i+0x112> + af1c: 411c lw a5,0(a0) + af1e: c30c sw a1,0(a4) + af20: 0007d863 bgez a5,af30 <_printf_i+0x80> + af24: 02d00713 li a4,45 + af28: 40f007b3 neg a5,a5 + af2c: 04e401a3 sb a4,67(s0) + af30: 00003697 auipc a3,0x3 + af34: 30468693 addi a3,a3,772 # e234 <__sf_fake_stdout+0x34> + af38: 4729 li a4,10 + af3a: a865 j aff2 <_printf_i+0x142> + af3c: 07000793 li a5,112 + af40: 16f68263 beq a3,a5,b0a4 <_printf_i+0x1f4> + af44: 02d7e563 bltu a5,a3,af6e <_printf_i+0xbe> + af48: 06e00793 li a5,110 + af4c: 18f68963 beq a3,a5,b0de <_printf_i+0x22e> + af50: 06f00793 li a5,111 + af54: faf690e3 bne a3,a5,aef4 <_printf_i+0x44> + af58: 400c lw a1,0(s0) + af5a: 431c lw a5,0(a4) + af5c: 0805f813 andi a6,a1,128 + af60: 00478513 addi a0,a5,4 + af64: 06080763 beqz a6,afd2 <_printf_i+0x122> + af68: c308 sw a0,0(a4) + af6a: 439c lw a5,0(a5) + af6c: a885 j afdc <_printf_i+0x12c> + af6e: 07500793 li a5,117 + af72: fef683e3 beq a3,a5,af58 <_printf_i+0xa8> + af76: 07800793 li a5,120 + af7a: 12f68963 beq a3,a5,b0ac <_printf_i+0x1fc> + af7e: 07300793 li a5,115 + af82: f6f699e3 bne a3,a5,aef4 <_printf_i+0x44> + af86: 431c lw a5,0(a4) + af88: 41d0 lw a2,4(a1) + af8a: 4581 li a1,0 + af8c: 00478693 addi a3,a5,4 + af90: c314 sw a3,0(a4) + af92: 0007aa83 lw s5,0(a5) + af96: 8556 mv a0,s5 + af98: 2e75 jal b354 + af9a: c501 beqz a0,afa2 <_printf_i+0xf2> + af9c: 41550533 sub a0,a0,s5 + afa0: c048 sw a0,4(s0) + afa2: 405c lw a5,4(s0) + afa4: c81c sw a5,16(s0) + afa6: 040401a3 sb zero,67(s0) + afaa: a861 j b042 <_printf_i+0x192> + afac: 431c lw a5,0(a4) + afae: 04240a93 addi s5,s0,66 + afb2: 00478693 addi a3,a5,4 + afb6: 439c lw a5,0(a5) + afb8: c314 sw a3,0(a4) + afba: 04f40123 sb a5,66(s0) + afbe: 4785 li a5,1 + afc0: b7d5 j afa4 <_printf_i+0xf4> + afc2: 0407f693 andi a3,a5,64 + afc6: 411c lw a5,0(a0) + afc8: c30c sw a1,0(a4) + afca: dab9 beqz a3,af20 <_printf_i+0x70> + afcc: 07c2 slli a5,a5,0x10 + afce: 87c1 srai a5,a5,0x10 + afd0: bf81 j af20 <_printf_i+0x70> + afd2: 0405f593 andi a1,a1,64 + afd6: c308 sw a0,0(a4) + afd8: d9c9 beqz a1,af6a <_printf_i+0xba> + afda: 239e lhu a5,0(a5) + afdc: 06f00713 li a4,111 + afe0: 0ee68763 beq a3,a4,b0ce <_printf_i+0x21e> + afe4: 00003697 auipc a3,0x3 + afe8: 25068693 addi a3,a3,592 # e234 <__sf_fake_stdout+0x34> + afec: 4729 li a4,10 + afee: 040401a3 sb zero,67(s0) + aff2: 404c lw a1,4(s0) + aff4: c40c sw a1,8(s0) + aff6: 0005c563 bltz a1,b000 <_printf_i+0x150> + affa: 4008 lw a0,0(s0) + affc: 996d andi a0,a0,-5 + affe: c008 sw a0,0(s0) + b000: e399 bnez a5,b006 <_printf_i+0x156> + b002: 8ab2 mv s5,a2 + b004: cd89 beqz a1,b01e <_printf_i+0x16e> + b006: 8ab2 mv s5,a2 + b008: 02e7f5b3 remu a1,a5,a4 + b00c: 1afd addi s5,s5,-1 + b00e: 95b6 add a1,a1,a3 + b010: 218c lbu a1,0(a1) + b012: 00ba8023 sb a1,0(s5) + b016: 02e7d5b3 divu a1,a5,a4 + b01a: 0ce7f063 bgeu a5,a4,b0da <_printf_i+0x22a> + b01e: 47a1 li a5,8 + b020: 00f71e63 bne a4,a5,b03c <_printf_i+0x18c> + b024: 401c lw a5,0(s0) + b026: 8b85 andi a5,a5,1 + b028: cb91 beqz a5,b03c <_printf_i+0x18c> + b02a: 4058 lw a4,4(s0) + b02c: 481c lw a5,16(s0) + b02e: 00e7c763 blt a5,a4,b03c <_printf_i+0x18c> + b032: 03000793 li a5,48 + b036: fefa8fa3 sb a5,-1(s5) + b03a: 1afd addi s5,s5,-1 + b03c: 41560633 sub a2,a2,s5 + b040: c810 sw a2,16(s0) + b042: 874e mv a4,s3 + b044: 86ca mv a3,s2 + b046: 0070 addi a2,sp,12 + b048: 85a2 mv a1,s0 + b04a: 8526 mv a0,s1 + b04c: d59ff0ef jal ra,ada4 <_printf_common> + b050: 5a7d li s4,-1 + b052: 0b451d63 bne a0,s4,b10c <_printf_i+0x25c> + b056: 557d li a0,-1 + b058: 50b2 lw ra,44(sp) + b05a: 5422 lw s0,40(sp) + b05c: 5492 lw s1,36(sp) + b05e: 5902 lw s2,32(sp) + b060: 49f2 lw s3,28(sp) + b062: 4a62 lw s4,24(sp) + b064: 4ad2 lw s5,20(sp) + b066: 4b42 lw s6,16(sp) + b068: 6145 addi sp,sp,48 + b06a: 8082 ret + b06c: 04d582a3 sb a3,69(a1) + b070: 00003697 auipc a3,0x3 + b074: 1c468693 addi a3,a3,452 # e234 <__sf_fake_stdout+0x34> + b078: 400c lw a1,0(s0) + b07a: 4308 lw a0,0(a4) + b07c: 0805f813 andi a6,a1,128 + b080: 411c lw a5,0(a0) + b082: 0511 addi a0,a0,4 + b084: 02080d63 beqz a6,b0be <_printf_i+0x20e> + b088: c308 sw a0,0(a4) + b08a: 0015f713 andi a4,a1,1 + b08e: c701 beqz a4,b096 <_printf_i+0x1e6> + b090: 0205e593 ori a1,a1,32 + b094: c00c sw a1,0(s0) + b096: 4741 li a4,16 + b098: fbb9 bnez a5,afee <_printf_i+0x13e> + b09a: 400c lw a1,0(s0) + b09c: fdf5f593 andi a1,a1,-33 + b0a0: c00c sw a1,0(s0) + b0a2: b7b1 j afee <_printf_i+0x13e> + b0a4: 419c lw a5,0(a1) + b0a6: 0207e793 ori a5,a5,32 + b0aa: c19c sw a5,0(a1) + b0ac: 07800793 li a5,120 + b0b0: 04f402a3 sb a5,69(s0) + b0b4: 00003697 auipc a3,0x3 + b0b8: 19468693 addi a3,a3,404 # e248 <__sf_fake_stdout+0x48> + b0bc: bf75 j b078 <_printf_i+0x1c8> + b0be: 0405f813 andi a6,a1,64 + b0c2: c308 sw a0,0(a4) + b0c4: fc0803e3 beqz a6,b08a <_printf_i+0x1da> + b0c8: 07c2 slli a5,a5,0x10 + b0ca: 83c1 srli a5,a5,0x10 + b0cc: bf7d j b08a <_printf_i+0x1da> + b0ce: 00003697 auipc a3,0x3 + b0d2: 16668693 addi a3,a3,358 # e234 <__sf_fake_stdout+0x34> + b0d6: 4721 li a4,8 + b0d8: bf19 j afee <_printf_i+0x13e> + b0da: 87ae mv a5,a1 + b0dc: b735 j b008 <_printf_i+0x158> + b0de: 4194 lw a3,0(a1) + b0e0: 431c lw a5,0(a4) + b0e2: 49cc lw a1,20(a1) + b0e4: 0806f813 andi a6,a3,128 + b0e8: 00478513 addi a0,a5,4 + b0ec: 00080663 beqz a6,b0f8 <_printf_i+0x248> + b0f0: c308 sw a0,0(a4) + b0f2: 439c lw a5,0(a5) + b0f4: c38c sw a1,0(a5) + b0f6: a039 j b104 <_printf_i+0x254> + b0f8: c308 sw a0,0(a4) + b0fa: 0406f693 andi a3,a3,64 + b0fe: 439c lw a5,0(a5) + b100: daf5 beqz a3,b0f4 <_printf_i+0x244> + b102: a38e sh a1,0(a5) + b104: 00042823 sw zero,16(s0) + b108: 8ab2 mv s5,a2 + b10a: bf25 j b042 <_printf_i+0x192> + b10c: 4814 lw a3,16(s0) + b10e: 8656 mv a2,s5 + b110: 85ca mv a1,s2 + b112: 8526 mv a0,s1 + b114: 9982 jalr s3 + b116: f54500e3 beq a0,s4,b056 <_printf_i+0x1a6> + b11a: 401c lw a5,0(s0) + b11c: 8b89 andi a5,a5,2 + b11e: e78d bnez a5,b148 <_printf_i+0x298> + b120: 47b2 lw a5,12(sp) + b122: 4448 lw a0,12(s0) + b124: f2f55ae3 bge a0,a5,b058 <_printf_i+0x1a8> + b128: 853e mv a0,a5 + b12a: b73d j b058 <_printf_i+0x1a8> + b12c: 4685 li a3,1 + b12e: 8656 mv a2,s5 + b130: 85ca mv a1,s2 + b132: 8526 mv a0,s1 + b134: 9982 jalr s3 + b136: f36500e3 beq a0,s6,b056 <_printf_i+0x1a6> + b13a: 0a05 addi s4,s4,1 + b13c: 445c lw a5,12(s0) + b13e: 4732 lw a4,12(sp) + b140: 8f99 sub a5,a5,a4 + b142: fefa45e3 blt s4,a5,b12c <_printf_i+0x27c> + b146: bfe9 j b120 <_printf_i+0x270> + b148: 4a01 li s4,0 + b14a: 01940a93 addi s5,s0,25 + b14e: 5b7d li s6,-1 + b150: b7f5 j b13c <_printf_i+0x28c> + +0000b152 <_putc_r>: + b152: 1101 addi sp,sp,-32 + b154: cc22 sw s0,24(sp) + b156: ce06 sw ra,28(sp) + b158: 842a mv s0,a0 + b15a: c909 beqz a0,b16c <_putc_r+0x1a> + b15c: 4d1c lw a5,24(a0) + b15e: e799 bnez a5,b16c <_putc_r+0x1a> + b160: c632 sw a2,12(sp) + b162: c42e sw a1,8(sp) + b164: b98ff0ef jal ra,a4fc <__sinit> + b168: 4632 lw a2,12(sp) + b16a: 45a2 lw a1,8(sp) + b16c: 00003797 auipc a5,0x3 + b170: 07478793 addi a5,a5,116 # e1e0 <__sf_fake_stdin> + b174: 02f61663 bne a2,a5,b1a0 <_putc_r+0x4e> + b178: 4050 lw a2,4(s0) + b17a: 461c lw a5,8(a2) + b17c: 17fd addi a5,a5,-1 + b17e: c61c sw a5,8(a2) + b180: 0407d063 bgez a5,b1c0 <_putc_r+0x6e> + b184: 4e18 lw a4,24(a2) + b186: 00e7c763 blt a5,a4,b194 <_putc_r+0x42> + b18a: 0ff5f793 andi a5,a1,255 + b18e: 4729 li a4,10 + b190: 02e79863 bne a5,a4,b1c0 <_putc_r+0x6e> + b194: 8522 mv a0,s0 + b196: 4462 lw s0,24(sp) + b198: 40f2 lw ra,28(sp) + b19a: 6105 addi sp,sp,32 + b19c: f39fe06f j a0d4 <__swbuf_r> + b1a0: 00003797 auipc a5,0x3 + b1a4: 06078793 addi a5,a5,96 # e200 <__sf_fake_stdout> + b1a8: 00f61463 bne a2,a5,b1b0 <_putc_r+0x5e> + b1ac: 4410 lw a2,8(s0) + b1ae: b7f1 j b17a <_putc_r+0x28> + b1b0: 00003797 auipc a5,0x3 + b1b4: 01078793 addi a5,a5,16 # e1c0 <__sf_fake_stderr> + b1b8: fcf611e3 bne a2,a5,b17a <_putc_r+0x28> + b1bc: 4450 lw a2,12(s0) + b1be: bf75 j b17a <_putc_r+0x28> + b1c0: 421c lw a5,0(a2) + b1c2: 0ff5f513 andi a0,a1,255 + b1c6: 00178713 addi a4,a5,1 + b1ca: c218 sw a4,0(a2) + b1cc: a38c sb a1,0(a5) + b1ce: 40f2 lw ra,28(sp) + b1d0: 4462 lw s0,24(sp) + b1d2: 6105 addi sp,sp,32 + b1d4: 8082 ret + +0000b1d6 <__sread>: + b1d6: 1141 addi sp,sp,-16 + b1d8: c422 sw s0,8(sp) + b1da: 842e mv s0,a1 + b1dc: 00e59583 lh a1,14(a1) + b1e0: c606 sw ra,12(sp) + b1e2: 22cd jal b3c4 <_read_r> + b1e4: 00054963 bltz a0,b1f6 <__sread+0x20> + b1e8: 487c lw a5,84(s0) + b1ea: 97aa add a5,a5,a0 + b1ec: c87c sw a5,84(s0) + b1ee: 40b2 lw ra,12(sp) + b1f0: 4422 lw s0,8(sp) + b1f2: 0141 addi sp,sp,16 + b1f4: 8082 ret + b1f6: 245e lhu a5,12(s0) + b1f8: 777d lui a4,0xfffff + b1fa: 177d addi a4,a4,-1 + b1fc: 8ff9 and a5,a5,a4 + b1fe: a45e sh a5,12(s0) + b200: b7fd j b1ee <__sread+0x18> + +0000b202 <__swrite>: + b202: 25de lhu a5,12(a1) + b204: 1101 addi sp,sp,-32 + b206: cc22 sw s0,24(sp) + b208: ca26 sw s1,20(sp) + b20a: c84a sw s2,16(sp) + b20c: c64e sw s3,12(sp) + b20e: ce06 sw ra,28(sp) + b210: 1007f793 andi a5,a5,256 + b214: 84aa mv s1,a0 + b216: 842e mv s0,a1 + b218: 8932 mv s2,a2 + b21a: 89b6 mv s3,a3 + b21c: c791 beqz a5,b228 <__swrite+0x26> + b21e: 00e59583 lh a1,14(a1) + b222: 4689 li a3,2 + b224: 4601 li a2,0 + b226: 2209 jal b328 <_lseek_r> + b228: 245e lhu a5,12(s0) + b22a: 777d lui a4,0xfffff + b22c: 177d addi a4,a4,-1 + b22e: 8ff9 and a5,a5,a4 + b230: a45e sh a5,12(s0) + b232: 00e41583 lh a1,14(s0) + b236: 4462 lw s0,24(sp) + b238: 40f2 lw ra,28(sp) + b23a: 86ce mv a3,s3 + b23c: 864a mv a2,s2 + b23e: 49b2 lw s3,12(sp) + b240: 4942 lw s2,16(sp) + b242: 8526 mv a0,s1 + b244: 44d2 lw s1,20(sp) + b246: 6105 addi sp,sp,32 + b248: a825 j b280 <_write_r> + +0000b24a <__sseek>: + b24a: 1141 addi sp,sp,-16 + b24c: c422 sw s0,8(sp) + b24e: 842e mv s0,a1 + b250: 00e59583 lh a1,14(a1) + b254: c606 sw ra,12(sp) + b256: 28c9 jal b328 <_lseek_r> + b258: 57fd li a5,-1 + b25a: 245a lhu a4,12(s0) + b25c: 00f51a63 bne a0,a5,b270 <__sseek+0x26> + b260: 77fd lui a5,0xfffff + b262: 17fd addi a5,a5,-1 + b264: 8ff9 and a5,a5,a4 + b266: a45e sh a5,12(s0) + b268: 40b2 lw ra,12(sp) + b26a: 4422 lw s0,8(sp) + b26c: 0141 addi sp,sp,16 + b26e: 8082 ret + b270: 6785 lui a5,0x1 + b272: 8fd9 or a5,a5,a4 + b274: a45e sh a5,12(s0) + b276: c868 sw a0,84(s0) + b278: bfc5 j b268 <__sseek+0x1e> + +0000b27a <__sclose>: + b27a: 00e59583 lh a1,14(a1) + b27e: a805 j b2ae <_close_r> + +0000b280 <_write_r>: + b280: 1141 addi sp,sp,-16 + b282: c422 sw s0,8(sp) + b284: 842a mv s0,a0 + b286: 852e mv a0,a1 + b288: 85b2 mv a1,a2 + b28a: 8636 mv a2,a3 + b28c: 7801a623 sw zero,1932(gp) # 2000117c + b290: c606 sw ra,12(sp) + b292: a0afe0ef jal ra,949c <_write> + b296: 57fd li a5,-1 + b298: 00f51763 bne a0,a5,b2a6 <_write_r+0x26> + b29c: 78c18793 addi a5,gp,1932 # 2000117c + b2a0: 439c lw a5,0(a5) + b2a2: c391 beqz a5,b2a6 <_write_r+0x26> + b2a4: c01c sw a5,0(s0) + b2a6: 40b2 lw ra,12(sp) + b2a8: 4422 lw s0,8(sp) + b2aa: 0141 addi sp,sp,16 + b2ac: 8082 ret + +0000b2ae <_close_r>: + b2ae: 1141 addi sp,sp,-16 + b2b0: c422 sw s0,8(sp) + b2b2: 842a mv s0,a0 + b2b4: 852e mv a0,a1 + b2b6: 7801a623 sw zero,1932(gp) # 2000117c + b2ba: c606 sw ra,12(sp) + b2bc: 22a1 jal b404 <_close> + b2be: 57fd li a5,-1 + b2c0: 00f51763 bne a0,a5,b2ce <_close_r+0x20> + b2c4: 78c18793 addi a5,gp,1932 # 2000117c + b2c8: 439c lw a5,0(a5) + b2ca: c391 beqz a5,b2ce <_close_r+0x20> + b2cc: c01c sw a5,0(s0) + b2ce: 40b2 lw ra,12(sp) + b2d0: 4422 lw s0,8(sp) + b2d2: 0141 addi sp,sp,16 + b2d4: 8082 ret + +0000b2d6 <_fstat_r>: + b2d6: 1141 addi sp,sp,-16 + b2d8: c422 sw s0,8(sp) + b2da: 842a mv s0,a0 + b2dc: 852e mv a0,a1 + b2de: 85b2 mv a1,a2 + b2e0: 7801a623 sw zero,1932(gp) # 2000117c + b2e4: c606 sw ra,12(sp) + b2e6: 222d jal b410 <_fstat> + b2e8: 57fd li a5,-1 + b2ea: 00f51763 bne a0,a5,b2f8 <_fstat_r+0x22> + b2ee: 78c18793 addi a5,gp,1932 # 2000117c + b2f2: 439c lw a5,0(a5) + b2f4: c391 beqz a5,b2f8 <_fstat_r+0x22> + b2f6: c01c sw a5,0(s0) + b2f8: 40b2 lw ra,12(sp) + b2fa: 4422 lw s0,8(sp) + b2fc: 0141 addi sp,sp,16 + b2fe: 8082 ret + +0000b300 <_isatty_r>: + b300: 1141 addi sp,sp,-16 + b302: c422 sw s0,8(sp) + b304: 842a mv s0,a0 + b306: 852e mv a0,a1 + b308: 7801a623 sw zero,1932(gp) # 2000117c + b30c: c606 sw ra,12(sp) + b30e: 2a29 jal b428 <_isatty> + b310: 57fd li a5,-1 + b312: 00f51763 bne a0,a5,b320 <_isatty_r+0x20> + b316: 78c18793 addi a5,gp,1932 # 2000117c + b31a: 439c lw a5,0(a5) + b31c: c391 beqz a5,b320 <_isatty_r+0x20> + b31e: c01c sw a5,0(s0) + b320: 40b2 lw ra,12(sp) + b322: 4422 lw s0,8(sp) + b324: 0141 addi sp,sp,16 + b326: 8082 ret + +0000b328 <_lseek_r>: + b328: 1141 addi sp,sp,-16 + b32a: c422 sw s0,8(sp) + b32c: 842a mv s0,a0 + b32e: 852e mv a0,a1 + b330: 85b2 mv a1,a2 + b332: 8636 mv a2,a3 + b334: 7801a623 sw zero,1932(gp) # 2000117c + b338: c606 sw ra,12(sp) + b33a: 2219 jal b440 <_lseek> + b33c: 57fd li a5,-1 + b33e: 00f51763 bne a0,a5,b34c <_lseek_r+0x24> + b342: 78c18793 addi a5,gp,1932 # 2000117c + b346: 439c lw a5,0(a5) + b348: c391 beqz a5,b34c <_lseek_r+0x24> + b34a: c01c sw a5,0(s0) + b34c: 40b2 lw ra,12(sp) + b34e: 4422 lw s0,8(sp) + b350: 0141 addi sp,sp,16 + b352: 8082 ret + +0000b354 : + b354: 0ff5f593 andi a1,a1,255 + b358: 962a add a2,a2,a0 + b35a: 00c51463 bne a0,a2,b362 + b35e: 4501 li a0,0 + b360: 8082 ret + b362: 211c lbu a5,0(a0) + b364: feb78ee3 beq a5,a1,b360 + b368: 0505 addi a0,a0,1 + b36a: bfc5 j b35a + +0000b36c <_realloc_r>: + b36c: e581 bnez a1,b374 <_realloc_r+0x8> + b36e: 85b2 mv a1,a2 + b370: f82fe06f j 9af2 <_malloc_r> + b374: 1101 addi sp,sp,-32 + b376: cc22 sw s0,24(sp) + b378: ce06 sw ra,28(sp) + b37a: ca26 sw s1,20(sp) + b37c: c84a sw s2,16(sp) + b37e: c64e sw s3,12(sp) + b380: 8432 mv s0,a2 + b382: ee01 bnez a2,b39a <_realloc_r+0x2e> + b384: ec6fe0ef jal ra,9a4a <_free_r> + b388: 4901 li s2,0 + b38a: 40f2 lw ra,28(sp) + b38c: 4462 lw s0,24(sp) + b38e: 854a mv a0,s2 + b390: 44d2 lw s1,20(sp) + b392: 4942 lw s2,16(sp) + b394: 49b2 lw s3,12(sp) + b396: 6105 addi sp,sp,32 + b398: 8082 ret + b39a: 84ae mv s1,a1 + b39c: 89aa mv s3,a0 + b39e: 2889 jal b3f0 <_malloc_usable_size_r> + b3a0: 8926 mv s2,s1 + b3a2: fe8574e3 bgeu a0,s0,b38a <_realloc_r+0x1e> + b3a6: 85a2 mv a1,s0 + b3a8: 854e mv a0,s3 + b3aa: f48fe0ef jal ra,9af2 <_malloc_r> + b3ae: 892a mv s2,a0 + b3b0: dd69 beqz a0,b38a <_realloc_r+0x1e> + b3b2: 85a6 mv a1,s1 + b3b4: 8622 mv a2,s0 + b3b6: d9cfe0ef jal ra,9952 + b3ba: 85a6 mv a1,s1 + b3bc: 854e mv a0,s3 + b3be: e8cfe0ef jal ra,9a4a <_free_r> + b3c2: b7e1 j b38a <_realloc_r+0x1e> + +0000b3c4 <_read_r>: + b3c4: 1141 addi sp,sp,-16 + b3c6: c422 sw s0,8(sp) + b3c8: 842a mv s0,a0 + b3ca: 852e mv a0,a1 + b3cc: 85b2 mv a1,a2 + b3ce: 8636 mv a2,a3 + b3d0: 7801a623 sw zero,1932(gp) # 2000117c + b3d4: c606 sw ra,12(sp) + b3d6: 289d jal b44c <_read> + b3d8: 57fd li a5,-1 + b3da: 00f51763 bne a0,a5,b3e8 <_read_r+0x24> + b3de: 78c18793 addi a5,gp,1932 # 2000117c + b3e2: 439c lw a5,0(a5) + b3e4: c391 beqz a5,b3e8 <_read_r+0x24> + b3e6: c01c sw a5,0(s0) + b3e8: 40b2 lw ra,12(sp) + b3ea: 4422 lw s0,8(sp) + b3ec: 0141 addi sp,sp,16 + b3ee: 8082 ret + +0000b3f0 <_malloc_usable_size_r>: + b3f0: ffc5a783 lw a5,-4(a1) + b3f4: ffc78513 addi a0,a5,-4 # ffc + b3f8: 0007d563 bgez a5,b402 <_malloc_usable_size_r+0x12> + b3fc: 95aa add a1,a1,a0 + b3fe: 419c lw a5,0(a1) + b400: 953e add a0,a0,a5 + b402: 8082 ret + +0000b404 <_close>: + b404: 05800793 li a5,88 + b408: 78f1a623 sw a5,1932(gp) # 2000117c + b40c: 557d li a0,-1 + b40e: 8082 ret + +0000b410 <_fstat>: + b410: 05800793 li a5,88 + b414: 78f1a623 sw a5,1932(gp) # 2000117c + b418: 557d li a0,-1 + b41a: 8082 ret + +0000b41c <_getpid>: + b41c: 05800793 li a5,88 + b420: 78f1a623 sw a5,1932(gp) # 2000117c + b424: 557d li a0,-1 + b426: 8082 ret + +0000b428 <_isatty>: + b428: 05800793 li a5,88 + b42c: 78f1a623 sw a5,1932(gp) # 2000117c + b430: 4501 li a0,0 + b432: 8082 ret + +0000b434 <_kill>: + b434: 05800793 li a5,88 + b438: 78f1a623 sw a5,1932(gp) # 2000117c + b43c: 557d li a0,-1 + b43e: 8082 ret + +0000b440 <_lseek>: + b440: 05800793 li a5,88 + b444: 78f1a623 sw a5,1932(gp) # 2000117c + b448: 557d li a0,-1 + b44a: 8082 ret + +0000b44c <_read>: + b44c: 05800793 li a5,88 + b450: 78f1a623 sw a5,1932(gp) # 2000117c + b454: 557d li a0,-1 + b456: 8082 ret + +0000b458 <_exit>: + b458: a001 j b458 <_exit> + b45a: 0000 unimp + b45c: 7325 lui t1,0xfffe9 + b45e: 2820 lbu s0,18(s0) + b460: 656c flw fa1,76(a0) + b462: 3d6e lhu a1,62(a0) + b464: 7525 lui a0,0xfffe9 + b466: 3a29 jal ad80 <_vfiprintf_r+0x266> + b468: 000a c.slli zero,0x2 + b46a: 0000 unimp + b46c: 3025 jal ac94 <_vfiprintf_r+0x17a> + b46e: 7534 flw fa3,104(a0) + b470: 2020 lbu s0,2(s0) + b472: 0000 unimp + b474: 3025 jal ac9c <_vfiprintf_r+0x182> + b476: 5832 lw a6,44(sp) + b478: 0020 addi s0,sp,8 + b47a: 0000 unimp + b47c: 2020 lbu s0,2(s0) + b47e: 0020 addi s0,sp,8 + b480: 6325 lui t1,0x9 + b482: 0000 unimp + b484: 3025 jal acac <_vfiprintf_r+0x192> + b486: 7832 flw fa6,44(sp) + b488: 0000 unimp + b48a: 0000 unimp + b48c: 6441 lui s0,0x10 + b48e: 6576 flw fa0,92(sp) + b490: 7472 flw fs0,60(sp) + b492: 0000 unimp + b494: 00000057 0x57 + b498: 5d73255b 0x5d73255b + b49c: 2520 lbu s0,10(a0) + b49e: 41203a73 csrrc s4,0x412,zero + b4a2: 7664 flw fs1,108(a2) + b4a4: 7265 lui tp,0xffff9 + b4a6: 6974 flw fa3,84(a0) + b4a8: 656d6573 csrrsi a0,0x656,26 + b4ac: 746e flw fs0,248(sp) + b4ae: 6620 flw fs0,72(a2) + b4b0: 6172 flw ft2,28(sp) + b4b2: 656d lui a0,0x1b + b4b4: 7420 flw fs0,104(s0) + b4b6: 73206f6f jal t5,11be8 <_data_lma+0x398c> + b4ba: 6f68 flw fa0,92(a4) + b4bc: 7472 flw fs0,60(sp) + b4be: 2820 lbu s0,18(s0) + b4c0: 6425 lui s0,0x9 + b4c2: 3c20 lbu s0,27(s0) + b4c4: 3120 lbu s0,3(a0) + b4c6: 3130 lbu a2,3(a0) + b4c8: 0d29 addi s10,s10,10 + b4ca: 000a c.slli zero,0x2 + b4cc: 5d73255b 0x5d73255b + b4d0: 2520 lbu s0,10(a0) + b4d2: 49203a73 csrrc s4,0x492,zero + b4d6: 636e flw ft6,216(sp) + b4d8: 6572726f jal tp,3332e <_data_lma+0x250d2> + b4dc: 73207463 bgeu zero,s2,bc04 <_exit+0x7ac> + b4e0: 6769 lui a4,0x1a + b4e2: 616e flw ft2,216(sp) + b4e4: 7574 flw fa3,108(a0) + b4e6: 6572 flw fa0,28(sp) + b4e8: 0a0d addi s4,s4,3 + b4ea: 0000 unimp + b4ec: 0049 c.nop 18 + b4ee: 0000 unimp + b4f0: 5d73255b 0x5d73255b + b4f4: 2520 lbu s0,10(a0) + b4f6: 41203a73 csrrc s4,0x412,zero + b4fa: 7664 flw fs1,108(a2) + b4fc: 7265 lui tp,0xffff9 + b4fe: 6974 flw fa3,84(a0) + b500: 656d6573 csrrsi a0,0x656,26 + b504: 746e flw fs0,248(sp) + b506: 7320 flw fs0,96(a4) + b508: 6769 lui a4,0x1a + b50a: 616e flw ft2,216(sp) + b50c: 7574 flw fa3,108(a0) + b50e: 6572 flw fa0,28(sp) + b510: 6f20 flw fs0,88(a4) + b512: 0a0d2e6b 0xa0d2e6b + b516: 0000 unimp + b518: 5d73255b 0x5d73255b + b51c: 2520 lbu s0,10(a0) + b51e: 41203a73 csrrc s4,0x412,zero + b522: 7664 flw fs1,108(a2) + b524: 7265 lui tp,0xffff9 + b526: 6974 flw fa3,84(a0) + b528: 656d6573 csrrsi a0,0x656,26 + b52c: 746e flw fs0,248(sp) + b52e: 6620 flw fs0,72(a2) + b530: 6172 flw ft2,28(sp) + b532: 656d lui a0,0x1b + b534: 7720 flw fs0,104(a4) + b536: 7469 lui s0,0xffffa + b538: 2068 lbu a0,6(s0) + b53a: 6164 flw fs1,68(a0) + b53c: 6174 flw fa3,68(a0) + b53e: 7420 flw fs0,104(s0) + b540: 73206f6f jal t5,11c72 <_data_lma+0x3a16> + b544: 6f68 flw fa0,92(a4) + b546: 7472 flw fs0,60(sp) + b548: 2820 lbu s0,18(s0) + b54a: 6425 lui s0,0x9 + b54c: 3c20 lbu s0,27(s0) + b54e: 2520 lbu s0,10(a0) + b550: 2964 lbu s1,22(a0) + b552: 0a0d addi s4,s4,3 + b554: 0000 unimp + b556: 0000 unimp + b558: 616e flw ft2,216(sp) + b55a: 656d lui a0,0x1b + b55c: 656c flw fa1,76(a0) + b55e: 6e207373 csrrci t1,0x6e2,0 + b562: 0065646f jal s0,61568 <_data_lma+0x5330c> + b566: 0000 unimp + b568: 6572 flw fa0,28(sp) + b56a: 6570 flw fa2,76(a0) + b56c: 7461 lui s0,0xffff8 + b56e: 7265 lui tp,0xffff9 + b570: 0000 unimp + b572: 0000 unimp + b574: 736e6573 csrrsi a0,0x736,28 + b578: 0000726f jal tp,12578 <_data_lma+0x431c> + b57c: 6f72 flw ft10,28(sp) + b57e: 73206d6f jal s10,11cb0 <_data_lma+0x3a54> + b582: 7265 lui tp,0xffff9 + b584: 6576 flw fa0,92(sp) + b586: 0072 c.slli zero,0x1c + b588: 74616863 bltu sp,t1,bcd8 <_exit+0x880> + b58c: 6e20 flw fs0,88(a2) + b58e: 0065646f jal s0,61594 <_data_lma+0x53338> + b592: 0000 unimp + b594: 776f6e6b 0x776f6e6b + b598: 006e c.slli zero,0x1b + b59a: 0000 unimp + b59c: 6e75 lui t3,0x1d + b59e: 776f6e6b 0x776f6e6b + b5a2: 006e c.slli zero,0x1b + b5a4: 7325 lui t1,0xfffe9 + b5a6: 6f20 flw fs0,88(a4) + b5a8: 206e lhu a1,6(s0) + b5aa: 6c25 lui s8,0x9 + b5ac: 2064 lbu s1,6(s0) + b5ae: 68746977 0x68746977 + b5b2: 7420 flw fs0,104(s0) + b5b4: 7079 c.lui zero,0xffffe + b5b6: 2065 jal b65e <_exit+0x206> + b5b8: 7325 lui t1,0xfffe9 + b5ba: 6f20 flw fs0,88(a4) + b5bc: 206e lhu a1,6(s0) + b5be: 7325 lui t1,0xfffe9 + b5c0: 6c20 flw fs0,88(s0) + b5c2: 7461636f jal t1,21d08 <_data_lma+0x13aac> + b5c6: 6f69 lui t5,0x1a + b5c8: 206e lhu a1,6(s0) + b5ca: 6c25 lui s8,0x9 + b5cc: 2064 lbu s1,6(s0) + b5ce: 6c25 lui s8,0x9 + b5d0: 0a64 addi s1,sp,284 + b5d2: 0000 unimp + b5d4: 7550 flw fa2,44(a0) + b5d6: 6c62 flw fs8,24(sp) + b5d8: 6369 lui t1,0x1a + b5da: 6b20 flw fs0,80(a4) + b5dc: 7965 lui s2,0xffff9 + b5de: 0000 unimp + b5e0: 6e676953 0x6e676953 + b5e4: 7461 lui s0,0xffff8 + b5e6: 7275 lui tp,0xffffd + b5e8: 0065 c.nop 25 + b5ea: 0000 unimp + b5ec: 7041 c.lui zero,0xffff0 + b5ee: 6470 flw fa2,76(s0) + b5f0: 7461 lui s0,0xffff8 + b5f2: 0061 c.nop 24 + b5f4: 6954 flw fa3,20(a0) + b5f6: 656d lui a0,0x1b + b5f8: 6d617473 csrrci s0,0x6d6,2 + b5fc: 2070 lbu a2,6(s0) + b5fe: 7369 lui t1,0xffffa + b600: 2520 lbu s0,10(a0) + b602: 756c flw fa1,108(a0) + b604: 000a c.slli zero,0x2 + b606: 0000 unimp + b608: 6f4e flw ft10,208(sp) + b60a: 6564 flw fs1,76(a0) + b60c: 614e flw ft2,208(sp) + b60e: 656d lui a0,0x1b + b610: 2520 lbu s0,10(a0) + b612: 00000a73 0xa73 + b616: 0000 unimp + b618: 6e41 lui t3,0x10 + b61a: 6d796e6f jal t3,a24f0 <_data_lma+0x94294> + b61e: 2073756f jal a0,43024 <_data_lma+0x34dc8> + b622: 6f6e flw ft10,216(sp) + b624: 6564 flw fs1,76(a0) + b626: 0000 unimp + b628: 6e41 lui t3,0x10 + b62a: 6d796e6f jal t3,a2500 <_data_lma+0x942a4> + b62e: 0073756f jal a0,42e34 <_data_lma+0x34bd8> + b632: 0000 unimp + b634: 5d73255b 0x5d73255b + b638: 2520 lbu s0,10(a0) + b63a: 4e203a73 csrrc s4,0x4e2,zero + b63e: 7765 lui a4,0xffff9 + b640: 6120 flw fs0,64(a0) + b642: 6f6e flw ft10,216(sp) + b644: 796e flw fs2,248(sp) + b646: 6f6d lui t5,0x1b + b648: 7375 lui t1,0xffffd + b64a: 6e20 flw fs0,88(a2) + b64c: 2065646f jal s0,61852 <_data_lma+0x535f6> + b650: 61657263 bgeu a0,s6,bc54 <_exit+0x7fc> + b654: 6574 flw fa3,76(a0) + b656: 3a64 lbu s1,23(a2) + b658: 2520 lbu s0,10(a0) + b65a: 000a0d73 0xa0d73 + b65e: 0000 unimp + b660: 0044 addi s1,sp,4 + b662: 0000 unimp + b664: 5d73255b 0x5d73255b + b668: 2520 lbu s0,10(a0) + b66a: 45203a73 csrrc s4,0x452,zero + b66e: 6978 flw fa4,84(a0) + b670: 6e697473 csrrci s0,0x6e6,18 + b674: 6f6e2067 0x6f6e2067 + b678: 6564 flw fs1,76(a0) + b67a: 6620 flw fs0,72(a2) + b67c: 646e756f jal a0,f2cc2 <_data_lma+0xe4a66> + b680: 6620 flw fs0,72(a2) + b682: 7020726f jal tp,12d84 <_data_lma+0x4b28> + b686: 6275 lui tp,0x1d + b688: 5b79654b fnmsub.d fa0,fs2,fs7,fa1,unknown + b68c: 5d30 lw a2,120(a0) + b68e: 303d jal aebc <_printf_i+0xc> + b690: 2578 lbu a4,14(a0) + b692: 3230 lbu a2,3(a2) + b694: 0d58 addi a4,sp,660 + b696: 000a c.slli zero,0x2 + b698: 6e41 lui t3,0x10 + b69a: 65526e6f jal t3,324ee <_data_lma+0x24292> + b69e: 2071 jal b72a <_exit+0x2d2> + b6a0: 6170 flw fa2,68(a0) + b6a2: 6c79 lui s8,0x1e + b6a4: 0064616f jal sp,516aa <_data_lma+0x4344e> + b6a8: 5d73255b 0x5d73255b + b6ac: 2520 lbu s0,10(a0) + b6ae: 50203a73 csrrc s4,0x502,zero + b6b2: 7361 lui t1,0xffff8 + b6b4: 726f7773 csrrci a4,0x726,30 + b6b8: 2064 lbu s1,6(s0) + b6ba: 656c flw fa1,76(a0) + b6bc: 206e lhu a1,6(s0) + b6be: 7369 lui t1,0xffffa + b6c0: 2520 lbu s0,10(a0) + b6c2: 2e64 lbu s1,30(a2) + b6c4: 0a0d addi s4,s4,3 + b6c6: 0000 unimp + b6c8: 5d73255b 0x5d73255b + b6cc: 2520 lbu s0,10(a0) + b6ce: 50203a73 csrrc s4,0x502,zero + b6d2: 7361 lui t1,0xffff8 + b6d4: 726f7773 csrrci a4,0x726,30 + b6d8: 2064 lbu s1,6(s0) + b6da: 72726f63 bltu tp,t2,be18 <_exit+0x9c0> + b6de: 6365 lui t1,0x19 + b6e0: 2c74 lbu a3,30(s0) + b6e2: 6e20 flw fs0,88(a2) + b6e4: 2065646f jal s0,618ea <_data_lma+0x5368e> + b6e8: 7325 lui t1,0xfffe9 + b6ea: 6120 flw fs0,64(a0) + b6ec: 7475 lui s0,0xffffd + b6ee: 6568 flw fa0,76(a0) + b6f0: 746e flw fs0,248(sp) + b6f2: 6369 lui t1,0x1a + b6f4: 7461 lui s0,0xffff8 + b6f6: 6465 lui s0,0x19 + b6f8: 0d2e slli s10,s10,0xb + b6fa: 000a c.slli zero,0x2 + b6fc: 5d73255b 0x5d73255b + b700: 2520 lbu s0,10(a0) + b702: 4c203a73 csrrc s4,0x4c2,zero + b706: 6e69676f jal a4,a1dec <_data_lma+0x93b90> + b70a: 7220 flw fs0,96(a2) + b70c: 7365 lui t1,0xffff9 + b70e: 6f70 flw fa2,92(a4) + b710: 736e flw ft6,248(sp) + b712: 2065 jal b7ba <_exit+0x362> + b714: 746e6573 csrrsi a0,0x746,28 + b718: 7420 flw fs0,104(s0) + b71a: 6f6e206f j ede10 <_data_lma+0xdfbb4> + b71e: 6564 flw fs1,76(a0) + b720: 2520 lbu s0,10(a0) + b722: 0a0d2e73 csrrs t3,0xa0,s10 + b726: 0000 unimp + b728: 5d73255b 0x5d73255b + b72c: 2520 lbu s0,10(a0) + b72e: 50203a73 csrrc s4,0x502,zero + b732: 7361 lui t1,0xffff8 + b734: 726f7773 csrrci a4,0x726,30 + b738: 2064 lbu s1,6(s0) + b73a: 6e69 lui t3,0x1a + b73c: 72726f63 bltu tp,t2,be7a <_exit+0xa22> + b740: 6365 lui t1,0x19 + b742: 2074 lbu a3,6(s0) + b744: 6f66 flw ft10,88(sp) + b746: 2072 lhu a2,6(s0) + b748: 6f6e flw ft10,216(sp) + b74a: 6564 flw fs1,76(a0) + b74c: 2520 lbu s0,10(a0) + b74e: 0a0d2e73 csrrs t3,0xa0,s10 + b752: 0000 unimp + b754: 6e41 lui t3,0x10 + b756: 6d796e6f jal t3,a262c <_data_lma+0x943d0> + b75a: 5273756f jal a0,43480 <_data_lma+0x35224> + b75e: 7165 addi sp,sp,-400 + b760: 6575 lui a0,0x1d + b762: 61507473 csrrci s0,0x615,0 + b766: 6c79 lui s8,0x1e + b768: 2064616f jal sp,5196e <_data_lma+0x43712> + b76c: 7461 lui s0,0xffff8 + b76e: 2520 lbu s0,10(a0) + b770: 0a70 addi a2,sp,284 + b772: 0000 unimp + b774: 2020 lbu s0,2(s0) + b776: 6564 flw fs1,76(a0) + b778: 6e697473 csrrci s0,0x6e6,18 + b77c: 7461 lui s0,0xffff8 + b77e: 6f69 lui t5,0x1a + b780: 206e lhu a1,6(s0) + b782: 6168 flw fa0,68(a0) + b784: 203a6873 csrrsi a6,hideleg,20 + b788: 7830 flw fa2,112(s0) + b78a: 3025 jal afb2 <_printf_i+0x102> + b78c: 5832 lw a6,44(sp) + b78e: 000a c.slli zero,0x2 + b790: 2020 lbu s0,2(s0) + b792: 646e6573 csrrsi a0,0x646,28 + b796: 7265 lui tp,0xffff9 + b798: 7020 flw fs0,96(s0) + b79a: 6275 lui tp,0x1d + b79c: 3a79654b fnmsub.d fa0,fs2,ft7,ft7,unknown + b7a0: 0020 addi s0,sp,8 + b7a2: 0000 unimp + b7a4: 3025 jal afcc <_printf_i+0x11c> + b7a6: 5832 lw a6,44(sp) + b7a8: 0000 unimp + b7aa: 0000 unimp + b7ac: 2020 lbu s0,2(s0) + b7ae: 68706963 bltu zero,t2,be40 <_exit+0x9e8> + b7b2: 7265 lui tp,0xffff9 + b7b4: 4d20 lw s0,88(a0) + b7b6: 4341 li t1,16 + b7b8: 203a lhu a4,2(s0) + b7ba: 7830 flw fa2,112(s0) + b7bc: 3025 jal afe4 <_printf_i+0x134> + b7be: 5834 lw a3,112(s0) + b7c0: 000a c.slli zero,0x2 + b7c2: 0000 unimp + b7c4: 2020 lbu s0,2(s0) + b7c6: 6564 flw fs1,76(a0) + b7c8: 70797263 bgeu s2,t2,becc <_exit+0xa74> + b7cc: 6574 flw fa3,76(a0) + b7ce: 2064 lbu s1,6(s0) + b7d0: 6170 flw fa2,68(a0) + b7d2: 6c79 lui s8,0x1e + b7d4: 2064616f jal sp,519da <_data_lma+0x4377e> + b7d8: 2528 lbu a0,10(a0) + b7da: 2075 jal b886 <_exit+0x42e> + b7dc: 7962 flw fs2,56(sp) + b7de: 6574 flw fa3,76(a0) + b7e0: 0a3a2973 csrrs s2,0xa3,s4 + b7e4: 0000 unimp + b7e6: 0000 unimp + b7e8: 2020 lbu s0,2(s0) + b7ea: 2020 lbu s0,2(s0) + b7ec: 6974 flw fa3,84(a0) + b7ee: 656d lui a0,0x1b + b7f0: 6d617473 csrrci s0,0x6d6,2 + b7f4: 3a70 lbu a2,23(a2) + b7f6: 2520 lbu s0,10(a0) + b7f8: 0a75 addi s4,s4,29 + b7fa: 0000 unimp + b7fc: 2020 lbu s0,2(s0) + b7fe: 2020 lbu s0,2(s0) + b800: 636e7973 csrrci s2,0x636,28 + b804: 7420 flw fs0,104(s0) + b806: 6d69 lui s10,0x1a + b808: 7365 lui t1,0xffff9 + b80a: 6174 flw fa3,68(a0) + b80c: 706d c.lui zero,0xffffb + b80e: 203a lhu a4,2(s0) + b810: 7525 lui a0,0xfffe9 + b812: 000a c.slli zero,0x2 + b814: 2020 lbu s0,2(s0) + b816: 2020 lbu s0,2(s0) + b818: 6170 flw fa2,68(a0) + b81a: 6f777373 csrrci t1,0x6f7,14 + b81e: 6472 flw fs0,28(sp) + b820: 203a lhu a4,2(s0) + b822: 0000 unimp + b824: 746e6f43 0x746e6f43 + b828: 6f72 flw ft10,28(sp) + b82a: 006c addi a1,sp,12 + b82c: 5d73255b 0x5d73255b + b830: 2520 lbu s0,10(a0) + b832: 52203a73 csrrc s4,0x522,zero + b836: 7065 c.lui zero,0xffff9 + b838: 796c flw fa1,116(a0) + b83a: 6e69 lui t3,0x1a + b83c: 6f742067 0x6f742067 + b840: 6120 flw fs0,64(a0) + b842: 6420 flw fs0,72(s0) + b844: 7369 lui t1,0xffffa + b846: 65766f63 bltu a2,s7,bea4 <_exit+0xa4c> + b84a: 2072 lhu a2,6(s0) + b84c: 6572 flw fa0,28(sp) + b84e: 7571 lui a0,0xffffc + b850: 7365 lui t1,0xffff9 + b852: 2074 lbu a3,6(s0) + b854: 68746977 0x68746977 + b858: 7420 flw fs0,104(s0) + b85a: 6761 lui a4,0x18 + b85c: 2520 lbu s0,10(a0) + b85e: 0d64 addi s1,sp,668 + b860: 000a c.slli zero,0x2 + b862: 0000 unimp + b864: 3d3d jal b6a2 <_exit+0x24a> + b866: 203d jal b894 <_exit+0x43c> + b868: 6944 flw fs1,20(a0) + b86a: 766f6373 csrrsi t1,0x766,30 + b86e: 7265 lui tp,0xffff9 + b870: 5220 lw s0,96(a2) + b872: 7165 addi sp,sp,-400 + b874: 6575 lui a0,0x1d + b876: 3d207473 csrrci s0,0x3d2,0 + b87a: 3d3d jal b6b8 <_exit+0x260> + b87c: 000a c.slli zero,0x2 + b87e: 0000 unimp + b880: 7270 flw fa2,100(a2) + b882: 6665 lui a2,0x19 + b884: 7869 lui a6,0xffffa + b886: 796c6e4f fnmadd.s ft8,fs8,fs6,fa5,unknown + b88a: 3a20 lbu s0,19(a2) + b88c: 2520 lbu s0,10(a0) + b88e: 0a75 addi s4,s4,29 + b890: 0000 unimp + b892: 0000 unimp + b894: 7974 flw fa3,116(a0) + b896: 6570 flw fa2,76(a0) + b898: 6946 flw fs2,80(sp) + b89a: 746c flw fa1,108(s0) + b89c: 7265 lui tp,0xffff9 + b89e: 3a20 lbu s0,19(a2) + b8a0: 3020 lbu s0,3(s0) + b8a2: 2578 lbu a4,14(a0) + b8a4: 3230 lbu a2,3(a2) + b8a6: 0a58 addi a4,sp,276 + b8a8: 0000 unimp + b8aa: 0000 unimp + b8ac: 6174 flw fa3,68(a0) + b8ae: 20202067 0x20202067 + b8b2: 2020 lbu s0,2(s0) + b8b4: 2020 lbu s0,2(s0) + b8b6: 3a20 lbu s0,19(a2) + b8b8: 3020 lbu s0,3(s0) + b8ba: 2578 lbu a4,14(a0) + b8bc: 3830 lbu a2,19(s0) + b8be: 586c lw a1,116(s0) + b8c0: 000a c.slli zero,0x2 + b8c2: 0000 unimp + b8c4: 636e6973 csrrsi s2,0x636,28 + b8c8: 2065 jal b970 <_exit+0x518> + b8ca: 2020 lbu s0,2(s0) + b8cc: 2020 lbu s0,2(s0) + b8ce: 3a20 lbu s0,19(a2) + b8d0: 3020 lbu s0,3(s0) + b8d2: 2578 lbu a4,14(a0) + b8d4: 3830 lbu a2,19(s0) + b8d6: 586c lw a1,116(s0) + b8d8: 000a c.slli zero,0x2 + b8da: 0000 unimp + b8dc: 3d3d jal b71a <_exit+0x2c2> + b8de: 203d jal b90c <_exit+0x4b4> + b8e0: 6944 flw fs1,20(a0) + b8e2: 766f6373 csrrsi t1,0x766,30 + b8e6: 7265 lui tp,0xffff9 + b8e8: 5220 lw s0,96(a2) + b8ea: 7365 lui t1,0xffff9 + b8ec: 6f70 flw fa2,92(a4) + b8ee: 736e flw ft6,248(sp) + b8f0: 2065 jal b998 <_exit+0x540> + b8f2: 3d3d jal b730 <_exit+0x2d8> + b8f4: 0a3d addi s4,s4,15 + b8f6: 0000 unimp + b8f8: 6f6e flw ft10,216(sp) + b8fa: 6564 flw fs1,76(a0) + b8fc: 7954 flw fa3,52(a0) + b8fe: 6570 flw fa2,76(a0) + b900: 3a20 lbu s0,19(a2) + b902: 2520 lbu s0,10(a0) + b904: 0a75 addi s4,s4,29 + b906: 0000 unimp + b908: 20726e73 csrrsi t3,0x207,4 + b90c: 2020 lbu s0,2(s0) + b90e: 2020 lbu s0,2(s0) + b910: 3a20 lbu s0,19(a2) + b912: 2520 lbu s0,10(a0) + b914: 0a75 addi s4,s4,29 + b916: 0000 unimp + b918: 6174 flw fa3,68(a0) + b91a: 20202067 0x20202067 + b91e: 2020 lbu s0,2(s0) + b920: 3a20 lbu s0,19(a2) + b922: 3020 lbu s0,3(s0) + b924: 2578 lbu a4,14(a0) + b926: 3830 lbu a2,19(s0) + b928: 586c lw a1,116(s0) + b92a: 000a c.slli zero,0x2 + b92c: 7570 flw fa2,108(a0) + b92e: 6b62 flw fs6,24(sp) + b930: 7965 lui s2,0xffff9 + b932: 2020 lbu s0,2(s0) + b934: 3a20 lbu s0,19(a2) + b936: 0020 addi s0,sp,8 + b938: 5d73255b 0x5d73255b + b93c: 2520 lbu s0,10(a0) + b93e: 46203a73 csrrc s4,0x462,zero + b942: 6e69 lui t3,0x1a + b944: 6964 flw fs1,84(a0) + b946: 676e flw fa4,216(sp) + b948: 7220 flw fs0,96(a2) + b94a: 6d65 lui s10,0x19 + b94c: 2065746f jal s0,62b52 <_data_lma+0x548f6> + b950: 6f6e flw ft10,216(sp) + b952: 6564 flw fs1,76(a0) + b954: 202c lbu a1,2(s0) + b956: 72756f73 csrrsi t5,0x727,10 + b95a: 61486563 bltu a6,s4,bf64 <_exit+0xb0c> + b95e: 69206873 csrrsi a6,0x692,0 + b962: 64252073 csrs 0x642,a0 + b966: 0a0d addi s4,s4,3 + b968: 0000 unimp + b96a: 0000 unimp + b96c: 5d73255b 0x5d73255b + b970: 2520 lbu s0,10(a0) + b972: 4e203a73 csrrc s4,0x4e2,zero + b976: 2065646f jal s0,61b7c <_data_lma+0x53920> + b97a: 6f6e flw ft10,216(sp) + b97c: 2074 lbu a3,6(s0) + b97e: 6e69 lui t3,0x1a + b980: 4420 lw s0,72(s0) + b982: 0d42 slli s10,s10,0x10 + b984: 000a c.slli zero,0x2 + b986: 0000 unimp + b988: 5d73255b 0x5d73255b + b98c: 2520 lbu s0,10(a0) + b98e: 46203a73 csrrc s4,0x462,zero + b992: 646e756f jal a0,f2fd8 <_data_lma+0xe4d7c> + b996: 6e20 flw fs0,88(a2) + b998: 2065646f jal s0,61b9e <_data_lma+0x53942> + b99c: 68746977 0x68746977 + b9a0: 6920 flw fs0,80(a0) + b9a2: 646e flw fs0,216(sp) + b9a4: 7865 lui a6,0xffff9 + b9a6: 2520 lbu s0,10(a0) + b9a8: 0d64 addi s1,sp,668 + b9aa: 000a c.slli zero,0x2 + b9ac: 5d73255b 0x5d73255b + b9b0: 2520 lbu s0,10(a0) + b9b2: 48203a73 csrrc s4,0x482,zero + b9b6: 414d li sp,19 + b9b8: 61662043 fmadd.s ft0,fa2,fs6,fa2,rdn + b9bc: 6c69 lui s8,0x1a + b9be: 6465 lui s0,0x19 + b9c0: 6f20 flw fs0,88(a4) + b9c2: 206e lhu a1,6(s0) + b9c4: 6e65 lui t3,0x19 + b9c6: 70797263 bgeu s2,t2,c0ca <_exit+0xc72> + b9ca: 6574 flw fa3,76(a0) + b9cc: 2064 lbu s1,6(s0) + b9ce: 656d lui a0,0x1b + b9d0: 67617373 csrrci t1,0x676,2 + b9d4: 2065 jal ba7c <_exit+0x624> + b9d6: 7325 lui t1,0xfffe9 + b9d8: 0a0d addi s4,s4,3 + b9da: 0000 unimp + b9dc: 5d73255b 0x5d73255b + b9e0: 2520 lbu s0,10(a0) + b9e2: 48203a73 csrrc s4,0x482,zero + b9e6: 414d li sp,19 + b9e8: 75732043 0x75732043 + b9ec: 73656363 bltu a0,s6,c112 <_exit+0xcba> + b9f0: 72662073 csrs 0x726,a2 + b9f4: 25206d6f jal s10,11c46 <_data_lma+0x39ea> + b9f8: 25202c73 csrr s8,0x252 + b9fc: 2075 jal baa8 <_exit+0x650> + b9fe: 7962 flw fs2,56(sp) + ba00: 6574 flw fa3,76(a0) + ba02: 6f6c2073 csrs 0x6f6,s8 + ba06: 676e flw fa4,216(sp) + ba08: 0a0d addi s4,s4,3 + ba0a: 0000 unimp + ba0c: 2020 lbu s0,2(s0) + ba0e: 7954 flw fa3,52(a0) + ba10: 6570 flw fa2,76(a0) + ba12: 6478 flw fa4,76(s0) + ba14: 3a64 lbu s1,23(a2) + ba16: 3020 lbu s0,3(s0) + ba18: 2578 lbu a4,14(a0) + ba1a: 3230 lbu a2,3(a2) + ba1c: 0a58 addi a4,sp,276 + ba1e: 0000 unimp + ba20: 2020 lbu s0,2(s0) + ba22: 6150 flw fa2,4(a0) + ba24: 6c79 lui s8,0x1e + ba26: 4c64616f jal sp,51eec <_data_lma+0x43c90> + ba2a: 6e65 lui t3,0x19 + ba2c: 203a lhu a4,2(s0) + ba2e: 7525 lui a0,0xfffe9 + ba30: 000a c.slli zero,0x2 + ba32: 0000 unimp + ba34: 5d73255b 0x5d73255b + ba38: 2520 lbu s0,10(a0) + ba3a: 50203a73 csrrc s4,0x502,zero + ba3e: 7461 lui s0,0xffff8 + ba40: 2068 lbu a0,6(s0) + ba42: 6f74 flw fa3,92(a4) + ba44: 6f6c206f j ce13a <_data_lma+0xbfede> + ba48: 676e flw fa4,216(sp) + ba4a: 0d0a slli s10,s10,0x2 + ba4c: 000a c.slli zero,0x2 + ba4e: 0000 unimp + ba50: 746e6553 0x746e6553 + ba54: 7220 flw fs0,96(a2) + ba56: 7365 lui t1,0xffff9 + ba58: 6f70 flw fa2,92(a4) + ba5a: 736e flw ft6,248(sp) + ba5c: 2c65 jal bd14 <_exit+0x8bc> + ba5e: 7420 flw fs0,104(s0) + ba60: 6568 flw fa0,76(a0) + ba62: 7420 flw fs0,104(s0) + ba64: 6d65 lui s10,0x19 + ba66: 6570 flw fa2,76(a0) + ba68: 6172 flw ft2,28(sp) + ba6a: 7574 flw fa3,108(a0) + ba6c: 6572 flw fa0,28(sp) + ba6e: 6920 flw fs0,80(a0) + ba70: 64252073 csrs 0x642,a0 + ba74: 6420 flw fs0,72(s0) + ba76: 6365 lui t1,0x19 + ba78: 6369 lui t1,0x1a + ba7a: 6c65 lui s8,0x19 + ba7c: 73756973 csrrsi s2,0x737,10 + ba80: 000a c.slli zero,0x2 + ba82: 0000 unimp + ba84: 6c50 flw fa2,28(s0) + ba86: 6961 lui s2,0x18 + ba88: 746e flw fs0,248(sp) + ba8a: 7865 lui a6,0xffff9 + ba8c: 2074 lbu a3,6(s0) + ba8e: 656d lui a0,0x1b + ba90: 67617373 csrrci t1,0x676,2 + ba94: 2065 jal bb3c <_exit+0x6e4> + ba96: 7266 flw ft4,120(sp) + ba98: 25206d6f jal s10,11cea <_data_lma+0x3a8e> + ba9c: 61202c73 csrr s8,0x612 + baa0: 7474 flw fa3,108(s0) + baa2: 6d65 lui s10,0x19 + baa4: 7470 flw fa2,108(s0) + baa6: 2520 lbu s0,10(a0) + baa8: 2c64 lbu s1,30(s0) + baaa: 7420 flw fs0,104(s0) + baac: 6d69 lui s10,0x1a + baae: 7365 lui t1,0xffff9 + bab0: 6174 flw fa3,68(a0) + bab2: 706d c.lui zero,0xffffb + bab4: 2520 lbu s0,10(a0) + bab6: 3a64 lbu s1,23(a2) + bab8: 2520 lbu s0,10(a0) + baba: 6c500073 0x6c500073 + babe: 6961 lui s2,0x18 + bac0: 746e flw fs0,248(sp) + bac2: 7865 lui a6,0xffff9 + bac4: 2074 lbu a3,6(s0) + bac6: 656d lui a0,0x1b + bac8: 67617373 csrrci t1,0x676,2 + bacc: 2065 jal bb74 <_exit+0x71c> + bace: 7266 flw ft4,120(sp) + bad0: 73206d6f jal s10,12202 <_data_lma+0x3fa6> + bad4: 7265 lui tp,0xffff9 + bad6: 6576 flw fa0,92(sp) + bad8: 2072 lhu a2,6(s0) + bada: 7325 lui t1,0xfffe9 + badc: 202c lbu a1,2(s0) + bade: 646e6573 csrrsi a0,0x646,28 + bae2: 7265 lui tp,0xffff9 + bae4: 6920 flw fs0,80(a0) + bae6: 73252073 csrs 0x732,a0 + baea: 202c lbu a1,2(s0) + baec: 7461 lui s0,0xffff8 + baee: 6574 flw fa3,76(a0) + baf0: 706d c.lui zero,0xffffb + baf2: 2074 lbu a3,6(s0) + baf4: 6425 lui s0,0x9 + baf6: 202c lbu a1,2(s0) + baf8: 6974 flw fa3,84(a0) + bafa: 656d lui a0,0x1b + bafc: 6d617473 csrrci s0,0x6d6,2 + bb00: 2070 lbu a2,6(s0) + bb02: 6425 lui s0,0x9 + bb04: 203a lhu a4,2(s0) + bb06: 7325 lui t1,0xfffe9 + bb08: 0000 unimp + bb0a: 0000 unimp + bb0c: 5d73255b 0x5d73255b + bb10: 2520 lbu s0,10(a0) + bb12: 55203a73 csrrc s4,0x552,zero + bb16: 6b6e flw fs6,216(sp) + bb18: 6f6e flw ft10,216(sp) + bb1a: 74206e77 0x74206e77 + bb1e: 7865 lui a6,0xffff9 + bb20: 2074 lbu a3,6(s0) + bb22: 7974 flw fa3,116(a0) + bb24: 6570 flw fa2,76(a0) + bb26: 203a lhu a4,2(s0) + bb28: 6425 lui s0,0x9 + bb2a: 0a0d addi s4,s4,3 + bb2c: 0000 unimp + bb2e: 0000 unimp + bb30: 6e45 lui t3,0x11 + bb32: 70797263 bgeu s2,t2,c236 <_exit+0xdde> + bb36: 6574 flw fa3,76(a0) + bb38: 5064 lw s1,100(s0) + bb3a: 7961 lui s2,0xffff8 + bb3c: 6f6c flw fa1,92(a4) + bb3e: 6461 lui s0,0x18 + bb40: 0a3a slli s4,s4,0xe + bb42: 0000 unimp + bb44: 2020 lbu s0,2(s0) + bb46: 6544 flw fs1,12(a0) + bb48: 6e697473 csrrci s0,0x6e6,18 + bb4c: 7461 lui s0,0xffff8 + bb4e: 6f69 lui t5,0x1a + bb50: 486e lw a6,216(sp) + bb52: 7361 lui t1,0xffff8 + bb54: 3a68 lbu a0,23(a2) + bb56: 3020 lbu s0,3(s0) + bb58: 2578 lbu a4,14(a0) + bb5a: 3230 lbu a2,3(a2) + bb5c: 0a58 addi a4,sp,276 + bb5e: 0000 unimp + bb60: 2020 lbu s0,2(s0) + bb62: 72756f53 0x72756f53 + bb66: 61486563 bltu a6,s4,c170 <_exit+0xd18> + bb6a: 203a6873 csrrsi a6,hideleg,20 + bb6e: 7830 flw fa2,112(s0) + bb70: 3025 jal b398 <_realloc_r+0x2c> + bb72: 5832 lw a6,44(sp) + bb74: 000a c.slli zero,0x2 + bb76: 0000 unimp + bb78: 2020 lbu s0,2(s0) + bb7a: 68706943 fmadd.s fs2,ft0,ft7,fa3,unknown + bb7e: 7265 lui tp,0xffff9 + bb80: 414d li sp,19 + bb82: 30203a43 fmadd.s fs4,ft0,ft2,ft6,rup + bb86: 2578 lbu a4,14(a0) + bb88: 3430 lbu a2,11(s0) + bb8a: 0a58 addi a4,sp,276 + bb8c: 0000 unimp + bb8e: 0000 unimp + bb90: 2020 lbu s0,2(s0) + bb92: 6150 flw fa2,4(a0) + bb94: 6c79 lui s8,0x1e + bb96: 4c64616f jal sp,5205c <_data_lma+0x43e00> + bb9a: 6e65 lui t3,0x19 + bb9c: 203a lhu a4,2(s0) + bb9e: 7a25 lui s4,0xfffe9 + bba0: 0a75 addi s4,s4,29 + bba2: 0000 unimp + bba4: 2020 lbu s0,2(s0) + bba6: 6150 flw fa2,4(a0) + bba8: 6c79 lui s8,0x1e + bbaa: 3a64616f jal sp,51f50 <_data_lma+0x43cf4> + bbae: 0020 addi s0,sp,8 + bbb0: 6552 flw fa0,20(sp) + bbb2: 7571 lui a0,0xffffc + bbb4: 7365 lui t1,0xffff9 + bbb6: 3a74 lbu a3,23(a2) + bbb8: 000a c.slli zero,0x2 + bbba: 0000 unimp + bbbc: 2020 lbu s0,2(s0) + bbbe: 6954 flw fa3,20(a0) + bbc0: 656d lui a0,0x1b + bbc2: 6d617473 csrrci s0,0x6d6,2 + bbc6: 3a70 lbu a2,23(a2) + bbc8: 2520 lbu s0,10(a0) + bbca: 0a75 addi s4,s4,29 + bbcc: 0000 unimp + bbce: 0000 unimp + bbd0: 2020 lbu s0,2(s0) + bbd2: 7954 flw fa3,52(a0) + bbd4: 6570 flw fa2,76(a0) + bbd6: 203a lhu a4,2(s0) + bbd8: 7830 flw fa2,112(s0) + bbda: 3025 jal b402 <_malloc_usable_size_r+0x12> + bbdc: 5832 lw a6,44(sp) + bbde: 000a c.slli zero,0x2 + bbe0: 2020 lbu s0,2(s0) + bbe2: 6144 flw fs1,4(a0) + bbe4: 6174 flw fa3,68(a0) + bbe6: 203a lhu a4,2(s0) + bbe8: 0000 unimp + bbea: 0000 unimp + bbec: 2020 lbu s0,2(s0) + bbee: 6144 flw fs1,4(a0) + bbf0: 6174 flw fa3,68(a0) + bbf2: 0000 unimp + bbf4: 6552 flw fa0,20(sp) + bbf6: 6e6f7073 csrci 0x6e6,30 + bbfa: 0a3a6573 csrrsi a0,0xa3,20 + bbfe: 0000 unimp + bc00: 2020 lbu s0,2(s0) + bc02: 6154 flw fa3,4(a0) + bc04: 25203a67 0x25203a67 + bc08: 0a75 addi s4,s4,29 + bc0a: 0000 unimp + bc0c: 00006e6f jal t3,11c0c <_data_lma+0x39b0> + bc10: 0066666f jal a2,71c16 <_data_lma+0x639ba> + bc14: 2d204b4f 0x2d204b4f + bc18: 7220 flw fs0,96(a2) + bc1a: 7065 c.lui zero,0xffff9 + bc1c: 6165 addi sp,sp,112 + bc1e: 2074 lbu a3,6(s0) + bc20: 7369 lui t1,0xffffa + bc22: 6e20 flw fs0,88(a2) + bc24: 4f20776f jal a4,13116 <_data_lma+0x4eba> + bc28: 004e c.slli zero,0x13 + bc2a: 0000 unimp + bc2c: 2d204b4f 0x2d204b4f + bc30: 7220 flw fs0,96(a2) + bc32: 7065 c.lui zero,0xffff9 + bc34: 6165 addi sp,sp,112 + bc36: 2074 lbu a3,6(s0) + bc38: 7369 lui t1,0xffffa + bc3a: 6e20 flw fs0,88(a2) + bc3c: 4f20776f jal a4,1312e <_data_lma+0x4ed2> + bc40: 4646 lw a2,80(sp) + bc42: 0000 unimp + bc44: 6572 flw fa0,28(sp) + bc46: 6f62 flw ft10,24(sp) + bc48: 0000746f jal s0,12c48 <_data_lma+0x49ec> + bc4c: 6461 lui s0,0x18 + bc4e: 6576 flw fa0,92(sp) + bc50: 7472 flw fs0,60(sp) + bc52: 0000 unimp + bc54: 2d204b4f 0x2d204b4f + bc58: 4120 lw s0,64(a0) + bc5a: 7664 flw fs1,108(a2) + bc5c: 7265 lui tp,0xffff9 + bc5e: 2074 lbu a3,6(s0) + bc60: 746e6573 csrrsi a0,0x746,28 + bc64: 0000 unimp + bc66: 0000 unimp + bc68: 61656c63 bltu a0,s6,c280 <_exit+0xe28> + bc6c: 2072 lhu a2,6(s0) + bc6e: 74617473 csrrci s0,0x746,2 + bc72: 4f280073 0x4f280073 + bc76: 202d204b fnmsub.s ft0,fs10,ft2,ft4,rdn + bc7a: 74617473 csrrci s0,0x746,2 + bc7e: 65722073 csrs 0x657,tp + bc82: 29746573 csrrsi a0,0x297,8 + bc86: 0000 unimp + bc88: 754a flw fa0,176(sp) + bc8a: 206e lhu a1,6(s0) + bc8c: 3532 lhu a2,42(a0) + bc8e: 3220 lbu s0,3(a2) + bc90: 3230 lbu a2,3(a2) + bc92: 0036 c.slli zero,0xd + bc94: 3076 lhu a3,38(s0) + bc96: 302e lhu a1,34(s0) + bc98: 312e lhu a1,34(a0) + bc9a: 2d20 lbu s0,26(a0) + bc9c: 4220 lw s0,64(a2) + bc9e: 4e52 lw t3,20(sp) + bca0: 5320 lw s0,96(a4) + bca2: 7379 lui t1,0xffffe + bca4: 6574 flw fa3,76(a0) + bca6: 736d lui t1,0xffffb + bca8: 5220 lw s0,96(a2) + bcaa: 5349 li t1,-14 + bcac: 00562d43 fmadd.s fs10,fa2,ft5,ft0,rdn + bcb0: 7325 lui t1,0xfffe9 + bcb2: 2820 lbu s0,18(s0) + bcb4: 7542 flw fa0,48(sp) + bcb6: 6c69 lui s8,0x1a + bcb8: 3a64 lbu s1,23(a2) + bcba: 2520 lbu s0,10(a0) + bcbc: 00002973 csrr s2,ustatus + bcc0: 6f62 flw ft10,24(sp) + bcc2: 7261 lui tp,0xffff8 + bcc4: 0064 addi s1,sp,12 + bcc6: 0000 unimp + bcc8: 20484357 0x20484357 + bccc: 32334843 fmadd.d fa6,ft6,ft3,ft6,rmm + bcd0: 3356 lhu a3,36(a4) + bcd2: 3730 lbu a2,11(a4) + bcd4: 0000 unimp + bcd6: 0000 unimp + bcd8: 636f6c63 bltu t5,s6,c310 <_exit+0xeb8> + bcdc: 0000006b 0x6b + bce0: 6974 flw fa3,84(a0) + bce2: 656d lui a0,0x1b + bce4: 0020 addi s0,sp,8 + bce6: 0000 unimp + bce8: 2d204b4f 0x2d204b4f + bcec: 6320 flw fs0,64(a4) + bcee: 6f6c flw fa1,92(a4) + bcf0: 73206b63 bltu zero,s2,c426 + bcf4: 7465 lui s0,0xffff9 + bcf6: 203a lhu a4,2(s0) + bcf8: 3025 jal b520 <_exit+0xc8> + bcfa: 6432 flw fs0,12(sp) + bcfc: 253a lhu a4,10(a0) + bcfe: 3230 lbu a2,3(a2) + bd00: 3a64 lbu s1,23(a2) + bd02: 3025 jal b52a <_exit+0xd2> + bd04: 6432 flw fs0,12(sp) + bd06: 2d20 lbu s0,26(a0) + bd08: 2520 lbu s0,10(a0) + bd0a: 2f64 lbu s1,30(a4) + bd0c: 6425 lui s0,0x9 + bd0e: 2064252f amoxor.w a0,t1,(s0) + bd12: 5455 li s0,-11 + bd14: 00000043 fmadd.s ft0,ft0,ft0,ft0,rne + bd18: 4528 lw a0,72(a0) + bd1a: 5252 lw tp,52(sp) + bd1c: 203a lhu a4,2(s0) + bd1e: 636f6c63 bltu t5,s6,c356 <_exit+0xefe> + bd22: 6163206b 0x6163206b + bd26: 6e6e flw ft8,216(sp) + bd28: 6720746f jal s0,1339a <_data_lma+0x513e> + bd2c: 6162206f j 2e342 <_data_lma+0x200e6> + bd30: 61776b63 bltu a4,s7,c346 <_exit+0xeee> + bd34: 6472 flw fs0,28(sp) + bd36: 00002973 csrr s2,ustatus + bd3a: 0000 unimp + bd3c: 636f6c63 bltu t5,s6,c374 <_exit+0xf1c> + bd40: 7973206b 0x7973206b + bd44: 636e flw ft6,216(sp) + bd46: 0000 unimp + bd48: 5245 li tp,-15 + bd4a: 3a52 lhu a2,52(a2) + bd4c: 6320 flw fs0,64(a4) + bd4e: 6f6c flw fa1,92(a4) + bd50: 63206b63 bltu zero,s2,c386 <_exit+0xf2e> + bd54: 6e61 lui t3,0x18 + bd56: 6f6e flw ft10,216(sp) + bd58: 2074 lbu a3,6(s0) + bd5a: 62206f67 0x62206f67 + bd5e: 6361 lui t1,0x18 + bd60: 7261776b 0x7261776b + bd64: 7364 flw fs1,100(a4) + bd66: 0000 unimp + bd68: 6170 flw fa2,68(a0) + bd6a: 6f777373 csrrci t1,0x6f7,14 + bd6e: 6472 flw fs0,28(sp) + bd70: 0020 addi s0,sp,8 + bd72: 0000 unimp + bd74: 6170 flw fa2,68(a0) + bd76: 6f777373 csrrci t1,0x6f7,14 + bd7a: 6472 flw fs0,28(sp) + bd7c: 6e20 flw fs0,88(a2) + bd7e: 203a776f jal a4,b3780 <_data_lma+0xa5524> + bd82: 7325 lui t1,0xfffe9 + bd84: 0000 unimp + bd86: 0000 unimp + bd88: 20746567 0x20746567 + bd8c: 0000 unimp + bd8e: 0000 unimp + bd90: 73657567 0x73657567 + bd94: 2e74 lbu a3,30(a2) + bd96: 6170 flw fa2,68(a0) + bd98: 6f777373 csrrci t1,0x6f7,14 + bd9c: 6472 flw fs0,28(sp) + bd9e: 0000 unimp + bda0: 203e lhu a5,2(s0) + bda2: 7325 lui t1,0xfffe9 + bda4: 0000 unimp + bda6: 0000 unimp + bda8: 616e flw ft2,216(sp) + bdaa: 656d lui a0,0x1b + bdac: 0000 unimp + bdae: 0000 unimp + bdb0: 6572 flw fa0,28(sp) + bdb2: 6570 flw fa2,76(a0) + bdb4: 7461 lui s0,0xffff8 + bdb6: 0000 unimp + bdb8: 616c flw fa1,68(a0) + bdba: 0074 addi a3,sp,12 + bdbc: 203e lhu a5,2(s0) + bdbe: 6425 lui s0,0x9 + bdc0: 0000 unimp + bdc2: 0000 unimp + bdc4: 6f6c flw fa1,92(a4) + bdc6: 006e c.slli zero,0x1b + bdc8: 7570 flw fa2,108(a0) + bdca: 6c62 flw fs8,24(sp) + bdcc: 6369 lui t1,0x1a + bdce: 6b2e flw fs6,200(sp) + bdd0: 7965 lui s2,0xffff9 + bdd2: 0000 unimp + bdd4: 203e lhu a5,2(s0) + bdd6: 0000 unimp + bdd8: 6f72 flw ft10,28(sp) + bdda: 656c flw fa1,76(a0) + bddc: 0000 unimp + bdde: 0000 unimp + bde0: 6461 lui s0,0x18 + bde2: 756d2e63 0x756d2e63 + bde6: 746c flw fa1,108(s0) + bde8: 7069 c.lui zero,0xffffa + bdea: 696c flw fa1,84(a0) + bdec: 7265 lui tp,0xffff9 + bdee: 0000 unimp + bdf0: 203e lhu a5,2(s0) + bdf2: 6425 lui s0,0x9 + bdf4: 252e lhu a1,10(a0) + bdf6: 0064 addi s1,sp,12 + bdf8: 203a3f3f 00007325 0x7325203a3f3f + be00: 20746573 csrrsi a0,0x207,8 + be04: 0000 unimp + be06: 0000 unimp + be08: 6c61 lui s8,0x18 + be0a: 6f6c flw fa1,92(a4) + be0c: 65722e77 0x65722e77 + be10: 6461 lui s0,0x18 + be12: 6f2e flw ft10,200(sp) + be14: 6c6e flw fs8,216(sp) + be16: 2079 jal bea4 <_exit+0xa4c> + be18: 0000 unimp + be1a: 0000 unimp + be1c: 00004b4f fnmadd.s fs6,ft0,ft0,ft0,rmm + be20: 73657567 0x73657567 + be24: 2e74 lbu a3,30(a2) + be26: 6170 flw fa2,68(a0) + be28: 6f777373 csrrci t1,0x6f7,14 + be2c: 6472 flw fs0,28(sp) + be2e: 0020 addi s0,sp,8 + be30: 616e flw ft2,216(sp) + be32: 656d lui a0,0x1b + be34: 0020 addi s0,sp,8 + be36: 0000 unimp + be38: 6572 flw fa0,28(sp) + be3a: 6570 flw fa2,76(a0) + be3c: 7461 lui s0,0xffff8 + be3e: 0020 addi s0,sp,8 + be40: 616c flw fa1,68(a0) + be42: 2074 lbu a3,6(s0) + be44: 0000 unimp + be46: 0000 unimp + be48: 6f6c flw fa1,92(a4) + be4a: 206e lhu a1,6(s0) + be4c: 0000 unimp + be4e: 0000 unimp + be50: 6e75 lui t3,0x1d + be52: 776f6e6b 0x776f6e6b + be56: 206e lhu a1,6(s0) + be58: 666e6f63 bltu t3,t1,c4d6 + be5c: 6769 lui a4,0x1a + be5e: 203a lhu a4,2(s0) + be60: 7325 lui t1,0xfffe9 + be62: 0000 unimp + be64: 74617473 csrrci s0,0x746,2 + be68: 61702d73 csrr s10,0x617 + be6c: 74656b63 bltu a0,t1,c5c2 + be70: 00000073 ecall + be74: 6572227b 0x6572227b + be78: 3a227663 bgeu tp,sp,c224 <_exit+0xdcc> + be7c: 7525 lui a0,0xfffe9 + be7e: 222c lbu a1,2(a2) + be80: 746e6573 csrrsi a0,0x746,28 + be84: 3a22 lhu s0,50(a2) + be86: 7525 lui a0,0xfffe9 + be88: 222c lbu a1,2(a2) + be8a: 6c66 flw fs8,88(sp) + be8c: 5f646f6f jal t5,52482 <_data_lma+0x44226> + be90: 7874 flw fa3,116(s0) + be92: 3a22 lhu s0,50(a2) + be94: 7525 lui a0,0xfffe9 + be96: 222c lbu a1,2(a2) + be98: 6964 flw fs1,84(a0) + be9a: 6572 flw fa0,28(sp) + be9c: 745f7463 bgeu t5,t0,c5e4 + bea0: 2278 lbu a4,6(a2) + bea2: 253a lhu a4,10(a0) + bea4: 2c75 jal c160 <_exit+0xd08> + bea6: 6622 flw fa2,8(sp) + bea8: 6f6c flw fa1,92(a4) + beaa: 725f646f jal s0,102dce <_data_lma+0xf4b72> + beae: 2278 lbu a4,6(a2) + beb0: 253a lhu a4,10(a0) + beb2: 2c75 jal c16e <_exit+0xd16> + beb4: 6422 flw fs0,8(sp) + beb6: 7269 lui tp,0xffffa + beb8: 6365 lui t1,0x19 + beba: 5f74 lw a3,124(a4) + bebc: 7872 flw fa6,60(sp) + bebe: 3a22 lhu s0,50(a2) + bec0: 7525 lui a0,0xfffe9 + bec2: 007d c.nop 31 + bec4: 74617473 csrrci s0,0x746,2 + bec8: 61722d73 csrrs s10,0x617,tp + becc: 6964 flw fs1,84(a0) + bece: 227b006f j bc8f4 <_data_lma+0xae698> + bed2: 6f6e flw ft10,216(sp) + bed4: 7369 lui t1,0xffffa + bed6: 5f65 li t5,-7 + bed8: 6c66 flw fs8,88(sp) + beda: 22726f6f jal t5,32900 <_data_lma+0x246a4> + bede: 253a lhu a4,10(a0) + bee0: 2c64 lbu s1,30(s0) + bee2: 6c22 flw fs8,8(sp) + bee4: 7361 lui t1,0xffff8 + bee6: 5f74 lw a3,124(a4) + bee8: 7372 flw ft6,60(sp) + beea: 3a226973 csrrsi s2,pmpcfg2,4 + beee: 6425 lui s0,0x9 + bef0: 222c lbu a1,2(a2) + bef2: 616c flw fa1,68(a0) + bef4: 735f7473 csrrci s0,0x735,30 + bef8: 726e flw ft4,248(sp) + befa: 3a22 lhu s0,50(a2) + befc: 6425 lui s0,0x9 + befe: 302e lhu a1,34(s0) + bf00: 2c30 lbu a2,26(s0) + bf02: 7422 flw fs0,40(sp) + bf04: 5f78 lw a4,124(a4) + bf06: 6961 lui s2,0x18 + bf08: 5f72 lw t5,60(sp) + bf0a: 73636573 csrrsi a0,0x736,6 + bf0e: 3a22 lhu s0,50(a2) + bf10: 7525 lui a0,0xfffe9 + bf12: 222c lbu a1,2(a2) + bf14: 7872 flw fa6,60(sp) + bf16: 615f 7269 735f 0x735f7269615f + bf1c: 6365 lui t1,0x19 + bf1e: 253a2273 csrrs tp,0x253,s4 + bf22: 7d75 lui s10,0xffffd + bf24: 0000 unimp + bf26: 0000 unimp + bf28: 74617473 csrrci s0,0x746,2 + bf2c: 6f632d73 csrrs s10,0x6f6,t1 + bf30: 6572 flw fa0,28(sp) + bf32: 0000 unimp + bf34: 6162227b 0x6162227b + bf38: 7474 flw fa3,108(s0) + bf3a: 7265 lui tp,0xffff9 + bf3c: 5f79 li t5,-2 + bf3e: 766d lui a2,0xffffb + bf40: 3a22 lhu s0,50(a2) + bf42: 7525 lui a0,0xfffe9 + bf44: 222c lbu a1,2(a2) + bf46: 7075 c.lui zero,0xffffd + bf48: 6974 flw fa3,84(a0) + bf4a: 656d lui a0,0x1b + bf4c: 735f 6365 2273 0x22736365735f + bf52: 253a lhu a4,10(a0) + bf54: 2c75 jal c210 <_exit+0xdb8> + bf56: 6522 flw fa0,8(sp) + bf58: 7272 flw ft4,60(sp) + bf5a: 2273726f jal tp,43980 <_data_lma+0x35724> + bf5e: 253a lhu a4,10(a0) + bf60: 2c75 jal c21c <_exit+0xdc4> + bf62: 7122 flw ft2,40(sp) + bf64: 6575 lui a0,0x1d + bf66: 6575 lui a0,0x1d + bf68: 6c5f 6e65 3a22 0x3a226e656c5f + bf6e: 7525 lui a0,0xfffe9 + bf70: 007d c.nop 31 + bf72: 0000 unimp + bf74: 6e55 lui t3,0x15 + bf76: 776f6e6b 0x776f6e6b + bf7a: 206e lhu a1,6(s0) + bf7c: 6d6d6f63 bltu s10,s6,c65a + bf80: 6e61 lui t3,0x18 + bf82: 0064 addi s1,sp,12 + bf84: 6e45 lui t3,0x11 + bf86: 70797263 bgeu s2,t2,c68a + bf8a: 6574 flw fa3,76(a0) + bf8c: 4d64 lw s1,92(a0) + bf8e: 7365 lui t1,0xffff9 + bf90: 65676173 csrrsi sp,0x656,14 + bf94: 0000 unimp + bf96: 0000 unimp + bf98: 5d73255b 0x5d73255b + bf9c: 2520 lbu s0,10(a0) + bf9e: 50203a73 csrrc s4,0x502,zero + bfa2: 616c flw fa1,68(a0) + bfa4: 6e69 lui t3,0x1a + bfa6: 6c20 flw fs0,88(s0) + bfa8: 6e65 lui t3,0x19 + bfaa: 203a lhu a4,2(s0) + bfac: 6425 lui s0,0x9 + bfae: 202c lbu a1,2(s0) + bfb0: 6e65 lui t3,0x19 + bfb2: 656c2063 0x656c2063 + bfb6: 3a6e lhu a1,54(a2) + bfb8: 2520 lbu s0,10(a0) + bfba: 0d64 addi s1,sp,668 + bfbc: 000a c.slli zero,0x2 + bfbe: 0000 unimp + bfc0: 6e45 lui t3,0x11 + bfc2: 70797263 bgeu s2,t2,c6c6 + bfc6: 6574 flw fa3,76(a0) + bfc8: 2064 lbu s1,6(s0) + bfca: 7266 flw ft4,120(sp) + bfcc: 6d61 lui s10,0x18 + bfce: 0065 c.nop 25 + bfd0: 5d73255b 0x5d73255b + bfd4: 2520 lbu s0,10(a0) + bfd6: 45203a73 csrrc s4,0x452,zero + bfda: 636e flw ft6,216(sp) + bfdc: 7972 flw fs2,60(sp) + bfde: 7470 flw fa2,108(s0) + bfe0: 6465 lui s0,0x19 + bfe2: 6620 flw fs0,72(a2) + bfe4: 6172 flw ft2,28(sp) + bfe6: 656d lui a0,0x1b + bfe8: 7420 flw fs0,104(s0) + bfea: 2078 lbu a4,6(s0) + bfec: 6966 flw fs2,88(sp) + bfee: 696e flw fs2,216(sp) + bff0: 0d0a6873 csrrsi a6,0xd0,20 + bff4: 000a c.slli zero,0x2 + bff6: 0000 unimp + bff8: 5d73255b 0x5d73255b + bffc: 2520 lbu s0,10(a0) + bffe: 4e203a73 csrrc s4,0x4e2,zero + c002: 2065646f jal s0,62208 <_data_lma+0x53fac> + c006: 7369 lui t1,0xffffa + c008: 6e20 flw fs0,88(a2) + c00a: 6c75 lui s8,0x1d + c00c: 0d6c addi a1,sp,668 + c00e: 000a c.slli zero,0x2 + c010: 5d73255b 0x5d73255b + c014: 2520 lbu s0,10(a0) + c016: 4e203a73 csrrc s4,0x4e2,zero + c01a: 2065646f jal s0,62220 <_data_lma+0x53fc4> + c01e: 7369 lui t1,0xffffa + c020: 6e20 flw fs0,88(a2) + c022: 7020746f jal s0,13724 <_data_lma+0x54c8> + c026: 6c75706f j 63eec <_data_lma+0x55c90> + c02a: 7461 lui s0,0xffff8 + c02c: 6465 lui s0,0x19 + c02e: 0a0d addi s4,s4,3 + c030: 0000 unimp + c032: 0000 unimp + c034: 756f7247 0x756f7247 + c038: 4d70 lw a2,92(a0) + c03a: 7365 lui t1,0xffff9 + c03c: 65676173 csrrsi sp,0x656,14 + c040: 0000 unimp + c042: 0000 unimp + c044: 5d73255b 0x5d73255b + c048: 2520 lbu s0,10(a0) + c04a: 4e203a73 csrrc s4,0x4e2,zero + c04e: 6120746f jal s0,13660 <_data_lma+0x5404> + c052: 6720 flw fs0,72(a4) + c054: 6f72 flw ft10,28(sp) + c056: 7075 c.lui zero,0xffffd + c058: 7420 flw fs0,104(s0) + c05a: 7865 lui a6,0xffff9 + c05c: 0d74 addi a3,sp,668 + c05e: 000a c.slli zero,0x2 + c060: 5d73255b 0x5d73255b + c064: 2520 lbu s0,10(a0) + c066: 43203a73 csrrc s4,0x432,zero + c06a: 6168 flw fa0,68(a0) + c06c: 6e6e flw ft8,216(sp) + c06e: 6c65 lui s8,0x19 + c070: 6820 flw fs0,80(s0) + c072: 7361 lui t1,0xffff8 + c074: 2068 lbu a0,6(s0) + c076: 6425 lui s0,0x9 + c078: 6e20 flw fs0,88(a2) + c07a: 6620746f jal s0,136dc <_data_lma+0x5480> + c07e: 646e756f jal a0,f36c4 <_data_lma+0xe5468> + c082: 0a0d addi s4,s4,3 + c084: 0000 unimp + c086: 0000 unimp + c088: 5d73255b 0x5d73255b + c08c: 2520 lbu s0,10(a0) + c08e: 48203a73 csrrc s4,0x482,zero + c092: 414d li sp,19 + c094: 61662043 fmadd.s ft0,fa2,fs6,fa2,rdn + c098: 6c69 lui s8,0x1a + c09a: 6465 lui s0,0x19 + c09c: 6f20 flw fs0,88(a4) + c09e: 206e lhu a1,6(s0) + c0a0: 756f7267 0x756f7267 + c0a4: 6870 flw fa2,84(s0) + c0a6: 7361 lui t1,0xffff8 + c0a8: 2068 lbu a0,6(s0) + c0aa: 2079656b 0x2079656b + c0ae: 6425 lui s0,0x9 + c0b0: 0a0d addi s4,s4,3 + c0b2: 0000 unimp + c0b4: 654d lui a0,0x13 + c0b6: 67617373 csrrci t1,0x676,2 + c0ba: 2065 jal c162 <_exit+0xd0a> + c0bc: 7266 flw ft4,120(sp) + c0be: 63206d6f jal s10,126f0 <_data_lma+0x4494> + c0c2: 6168 flw fa0,68(a0) + c0c4: 6e6e flw ft8,216(sp) + c0c6: 6c65 lui s8,0x19 + c0c8: 2520 lbu s0,10(a0) + c0ca: 25203a73 csrrc s4,0x252,zero + c0ce: 00000a73 0xa73 + c0d2: 0000 unimp + c0d4: 7854 flw fa3,52(s0) + c0d6: 7544 flw fs1,44(a0) + c0d8: 706d c.lui zero,0xffffb + c0da: 6544 flw fs1,12(a0) + c0dc: 00000063 beqz zero,c0dc <_exit+0xc84> + c0e0: 654d lui a0,0x13 + c0e2: 6f436873 csrrsi a6,0x6f4,6 + c0e6: 6572 flw fa0,28(sp) + c0e8: 0000 unimp + c0ea: 0000 unimp + c0ec: 5d73255b 0x5d73255b + c0f0: 2520 lbu s0,10(a0) + c0f2: 46203a73 csrrc s4,0x462,zero + c0f6: 6172 flw ft2,28(sp) + c0f8: 656d lui a0,0x1b + c0fa: 7420 flw fs0,104(s0) + c0fc: 6e206f6f jal t5,127de <_data_lma+0x4582> + c100: 7765 lui a4,0xffff9 + c102: 202c lbu a1,2(s0) + c104: 20746f67 0x20746f67 + c108: 6576 flw fa0,92(sp) + c10a: 7372 flw ft6,60(sp) + c10c: 6f69 lui t5,0x1a + c10e: 206e lhu a1,6(s0) + c110: 6425 lui s0,0x9 + c112: 6920 flw fs0,80(a0) + c114: 736e flw ft6,248(sp) + c116: 6574 flw fa3,76(a0) + c118: 6461 lui s0,0x18 + c11a: 6f20 flw fs0,88(a4) + c11c: 2066 lhu s1,6(s0) + c11e: 0d30 addi a2,sp,664 + c120: 000a c.slli zero,0x2 + c122: 0000 unimp + c124: 2020 lbu s0,2(s0) + c126: 7954 flw fa3,52(a0) + c128: 6570 flw fa2,76(a0) + c12a: 6478 flw fa4,76(s0) + c12c: 203a lhu a4,2(s0) + c12e: 7830 flw fa2,112(s0) + c130: 3025 jal b958 <_exit+0x500> + c132: 5832 lw a6,44(sp) + c134: 000a c.slli zero,0x2 + c136: 0000 unimp + c138: 5d73255b 0x5d73255b + c13c: 2520 lbu s0,10(a0) + c13e: 50203a73 csrrc s4,0x502,zero + c142: 6f72 flw ft10,28(sp) + c144: 73736563 bltu t1,s7,c86e + c148: 6465 lui s0,0x19 + c14a: 6620 flw fs0,72(a2) + c14c: 6172 flw ft2,28(sp) + c14e: 656d lui a0,0x1b + c150: 0a0d addi s4,s4,3 + c152: 0000 unimp + c154: 21ce lhu a1,4(a1) + c156: 0000 unimp + c158: 221e lhu a5,0(a2) + c15a: 0000 unimp + c15c: 2234 lbu a3,2(a2) + c15e: 0000 unimp + c160: 224c lbu a1,4(a2) + c162: 0000 unimp + c164: 2262 lhu s0,6(a2) + c166: 0000 unimp + c168: 2680 lbu s0,8(a3) + c16a: 0000 unimp + c16c: 2694 lbu a3,8(a3) + c16e: 0000 unimp + c170: 26aa lhu a0,10(a3) + c172: 0000 unimp + c174: 26b6 lhu a3,10(a3) + c176: 0000 unimp + c178: 26cc lbu a1,12(a3) + c17a: 0000 unimp + c17c: 654d lui a0,0x13 + c17e: 72666873 csrrsi a6,0x726,12 + c182: 6d61 lui s10,0x18 + c184: 6e69 lui t3,0x1a + c186: 00450067 jr 4(a0) # 13004 <_data_lma+0x4da8> + c18a: 0000 unimp + c18c: 5d73255b 0x5d73255b + c190: 2520 lbu s0,10(a0) + c192: 25203a73 csrrc s4,0x252,zero + c196: 2064 lbu s1,6(s0) + c198: 7369 lui t1,0xffffa + c19a: 7420 flw fs0,104(s0) + c19c: 62206f6f jal t5,127be <_data_lma+0x4562> + c1a0: 6769 lui a4,0x1a + c1a2: 6620 flw fs0,72(a2) + c1a4: 7320726f jal tp,138d6 <_data_lma+0x567a> + c1a8: 3178 lbu a4,7(a0) + c1aa: 3632 lhu a2,42(a2) + c1ac: 0d32 slli s10,s10,0xc + c1ae: 000a c.slli zero,0x2 + c1b0: 72617473 csrrci s0,0x726,2 + c1b4: 2074 lbu a3,6(s0) + c1b6: 74697257 0x74697257 + c1ba: 4265 li tp,25 + c1bc: 6675 lui a2,0x1d + c1be: 6566 flw fa0,88(sp) + c1c0: 0072 c.slli zero,0x1c + c1c2: 0000 unimp + c1c4: 6e65 lui t3,0x19 + c1c6: 2064 lbu s1,6(s0) + c1c8: 74697257 0x74697257 + c1cc: 4265 li tp,25 + c1ce: 6675 lui a2,0x1d + c1d0: 6566 flw fa0,88(sp) + c1d2: 0072 c.slli zero,0x1c + c1d4: 5d73255b 0x5d73255b + c1d8: 2520 lbu s0,10(a0) + c1da: 54203a73 csrrc s4,0x542,zero + c1de: 2058 lbu a4,4(s0) + c1e0: 6170 flw fa2,68(a0) + c1e2: 6c79 lui s8,0x1e + c1e4: 4c64616f jal sp,526aa <_data_lma+0x4444e> + c1e8: 6e65 lui t3,0x19 + c1ea: 253d jal c818 + c1ec: 2075 jal c298 <_exit+0xe40> + c1ee: 6170 flw fa2,68(a0) + c1f0: 6874 flw fa3,84(s0) + c1f2: 654c flw fa1,12(a0) + c1f4: 3d6e lhu a1,62(a0) + c1f6: 7525 lui a0,0xfffe9 + c1f8: 7420 flw fs0,104(s0) + c1fa: 6c61746f jal s0,238c0 <_data_lma+0x15664> + c1fe: 654c flw fa1,12(a0) + c200: 3d6e lhu a1,62(a0) + c202: 7525 lui a0,0xfffe9 + c204: 6820 flw fs0,80(s0) + c206: 6165 addi sp,sp,112 + c208: 6564 flw fs1,76(a0) + c20a: 3d72 lhu a2,62(a0) + c20c: 7830 flw fa2,112(s0) + c20e: 3025 jal ba36 <_exit+0x5de> + c210: 5832 lw a6,44(sp) + c212: 0a0d addi s4,s4,3 + c214: 0000 unimp + c216: 0000 unimp + c218: 5d73255b 0x5d73255b + c21c: 2520 lbu s0,10(a0) + c21e: 53203a73 csrrc s4,0x532,zero + c222: 6174 flw fa3,68(a0) + c224: 7472 flw fs0,60(sp) + c226: 6e69 lui t3,0x1a + c228: 78742067 0x78742067 + c22c: 6d20 flw fs0,88(a0) + c22e: 2c65646f jal s0,624f4 <_data_lma+0x54298> + c232: 7320 flw fs0,96(a4) + c234: 6e65 lui t3,0x19 + c236: 2074 lbu a3,6(s0) + c238: 6425 lui s0,0x9 + c23a: 202c lbu a1,2(s0) + c23c: 756f6873 csrrsi a6,0x756,30 + c240: 646c flw fa1,76(s0) + c242: 2520 lbu s0,10(a0) + c244: 0d64 addi s1,sp,668 + c246: 000a c.slli zero,0x2 + c248: 5d73255b 0x5d73255b + c24c: 2520 lbu s0,10(a0) + c24e: 53203a73 csrrc s4,0x532,zero + c252: 7465 lui s0,0xffff9 + c254: 7854 flw fa3,52(s0) + c256: 7220 flw fs0,96(a2) + c258: 6e75 lui t3,0x1d + c25a: 696e flw fs2,216(sp) + c25c: 676e flw fa4,216(sp) + c25e: 0a0d addi s4,s4,3 + c260: 0000 unimp + c262: 0000 unimp + c264: 5d73255b 0x5d73255b + c268: 2520 lbu s0,10(a0) + c26a: 69203a73 csrrc s4,0x692,zero + c26e: 7172 flw ft2,60(sp) + c270: 203a lhu a4,2(s0) + c272: 7830 flw fa2,112(s0) + c274: 3025 jal ba9c <_exit+0x644> + c276: 5834 lw a3,112(s0) + c278: 0a0d addi s4,s4,3 + c27a: 0000 unimp + c27c: 5d73255b 0x5d73255b + c280: 2520 lbu s0,10(a0) + c282: 46203a73 csrrc s4,0x462,zero + c286: 6e69 lui t3,0x1a + c288: 7369 lui t1,0xffffa + c28a: 6568 flw fa0,76(a0) + c28c: 2064 lbu s1,6(s0) + c28e: 7874 flw fa3,116(s0) + c290: 0a0d addi s4,s4,3 + c292: 0000 unimp + c294: 72617473 csrrci s0,0x726,2 + c298: 2074 lbu a3,6(s0) + c29a: 6552 flw fa0,20(sp) + c29c: 6461 lui s0,0x18 + c29e: 7542 flw fa0,48(sp) + c2a0: 6666 flw fa2,88(sp) + c2a2: 7265 lui tp,0xffff9 + c2a4: 0000 unimp + c2a6: 0000 unimp + c2a8: 6e65 lui t3,0x19 + c2aa: 2064 lbu s1,6(s0) + c2ac: 6552 flw fa0,20(sp) + c2ae: 6461 lui s0,0x18 + c2b0: 7542 flw fa0,48(sp) + c2b2: 6666 flw fa2,88(sp) + c2b4: 7265 lui tp,0xffff9 + c2b6: 0000 unimp + c2b8: 7274 flw fa3,100(a2) + c2ba: 6e61 lui t3,0x18 + c2bc: 726f7073 csrci 0x726,30 + c2c0: 2074 lbu a3,6(s0) + c2c2: 6c66 flw fs8,88(sp) + c2c4: 00646f6f jal t5,522ca <_data_lma+0x4406e> + c2c8: 6c66 flw fs8,88(sp) + c2ca: 00646f6f jal t5,522d0 <_data_lma+0x44074> + c2ce: 0000 unimp + c2d0: 6964 flw fs1,84(a0) + c2d2: 6572 flw fa0,28(sp) + c2d4: 00007463 bgeu zero,zero,c2dc <_exit+0xe84> + c2d8: 7274 flw fa3,100(a2) + c2da: 6e61 lui t3,0x18 + c2dc: 726f7073 csrci 0x726,30 + c2e0: 2074 lbu a3,6(s0) + c2e2: 6964 flw fs1,84(a0) + c2e4: 6572 flw fa0,28(sp) + c2e6: 00007463 bgeu zero,zero,c2ee <_exit+0xe96> + c2ea: 0000 unimp + c2ec: 202c lbu a1,2(s0) + c2ee: 6170 flw fa2,68(a0) + c2f0: 6c79 lui s8,0x1e + c2f2: 2064616f jal sp,524f8 <_data_lma+0x4429c> + c2f6: 7974 flw fa3,116(a0) + c2f8: 6570 flw fa2,76(a0) + c2fa: 6920 flw fs0,80(a0) + c2fc: 00002073 csrr zero,ustatus + c300: 6572 flw fa0,28(sp) + c302: 7571 lui a0,0xffffc + c304: 7365 lui t1,0xffff9 + c306: 0074 addi a3,sp,12 + c308: 6572 flw fa0,28(sp) + c30a: 6e6f7073 csrci 0x6e6,30 + c30e: 00006573 csrrsi a0,ustatus,0 + c312: 0000 unimp + c314: 6574 flw fa3,76(a0) + c316: 7478 flw fa4,108(s0) + c318: 6d20 flw fs0,88(a0) + c31a: 7365 lui t1,0xffff9 + c31c: 65676173 csrrsi sp,0x656,14 + c320: 0000 unimp + c322: 0000 unimp + c324: 6361 lui t1,0x18 + c326: 776f6e6b 0x776f6e6b + c32a: 656c flw fa1,76(a0) + c32c: 6764 flw fs1,76(a4) + c32e: 6d65 lui s10,0x19 + c330: 6e65 lui t3,0x19 + c332: 0074 addi a3,sp,12 + c334: 756f7267 0x756f7267 + c338: 2070 lbu a2,6(s0) + c33a: 6574 flw fa3,76(a0) + c33c: 7478 flw fa4,108(s0) + c33e: 0000 unimp + c340: 756f7267 0x756f7267 + c344: 2070 lbu a2,6(s0) + c346: 6164 flw fs1,68(a0) + c348: 6174 flw fa3,68(a0) + c34a: 0000 unimp + c34c: 6e61 lui t3,0x18 + c34e: 72206e6f jal t3,12a70 <_data_lma+0x4814> + c352: 7165 addi sp,sp,-400 + c354: 6575 lui a0,0x1d + c356: 00007473 csrrci s0,ustatus,0 + c35a: 0000 unimp + c35c: 6170 flw fa2,68(a0) + c35e: 6874 flw fa3,84(s0) + c360: 0000 unimp + c362: 0000 unimp + c364: 7274 flw fa3,100(a2) + c366: 6361 lui t1,0x18 + c368: 0065 c.nop 25 + c36a: 0000 unimp + c36c: 756d lui a0,0xffffb + c36e: 746c flw fa1,108(s0) + c370: 7069 c.lui zero,0xffffa + c372: 7261 lui tp,0xffff8 + c374: 0074 addi a3,sp,12 + c376: 0000 unimp + c378: 746e6f63 bltu t3,t1,cad6 + c37c: 6f72 flw ft10,28(sp) + c37e: 006c addi a1,sp,12 + c380: 6172 flw ft2,28(sp) + c382: 202c0077 0x202c0077 + c386: 6170 flw fa2,68(a0) + c388: 6c79 lui s8,0x1e + c38a: 2064616f jal sp,52590 <_data_lma+0x44334> + c38e: 6576 flw fa0,92(sp) + c390: 7372 flw ft6,60(sp) + c392: 6f69 lui t5,0x1a + c394: 206e lhu a1,6(s0) + c396: 7369 lui t1,0xffffa + c398: 2520 lbu s0,10(a0) + c39a: 00002073 csrr zero,ustatus + c39e: 0000 unimp + c3a0: 7254 flw fa3,36(a2) + c3a2: 6e61 lui t3,0x18 + c3a4: 726f7073 csrci 0x726,30 + c3a8: 2074 lbu a3,6(s0) + c3aa: 65646f63 bltu s0,s6,ca08 + c3ae: 25203a73 csrrc s4,0x252,zero + c3b2: 2064 lbu s1,6(s0) + c3b4: 6425 lui s0,0x9 + c3b6: 000a c.slli zero,0x2 + c3b8: 6150 flw fa2,4(a0) + c3ba: 6874 flw fa3,84(s0) + c3bc: 6920 flw fs0,80(a0) + c3be: 64252073 csrs 0x642,a0 + c3c2: 6e20 flw fs0,88(a2) + c3c4: 7365646f jal s0,62afa <_data_lma+0x5489e> + c3c8: 6c20 flw fs0,88(s0) + c3ca: 00676e6f jal t3,823d0 <_data_lma+0x74174> + c3ce: 0000 unimp + c3d0: 6f6e flw ft10,216(sp) + c3d2: 6564 flw fs1,76(a0) + c3d4: 2520 lbu s0,10(a0) + c3d6: 2064 lbu s1,6(s0) + c3d8: 202d jal c402 + c3da: 3025 jal bc02 <_exit+0x7aa> + c3dc: 5832 lw a6,44(sp) + c3de: 202c lbu a1,2(s0) + c3e0: 0000 unimp + ... + +0000c3e4 : + c3e4: 1c1f 1e1f 1e1f 1f1f 1f1e 1f1e ............ + +0000c3f0 : + c3f0: 614a 466e 6265 614d 4172 7270 614d 4a79 JanFebMarAprMayJ + c400: 6e75 754a 416c 6775 6553 4f70 7463 6f4e unJulAugSepOctNo + c410: 4476 6365 0000 0000 vDec.... + +0000c418 : + c418: 0300 0603 0401 0206 0005 0503 0000 0000 ................ + +0000c428 : + c428: ae22 d728 2f98 428a 65cd 23ef 4491 7137 ".(../.B.e.#.D7q + c438: 3b2f ec4d fbcf b5c0 dbbc 8189 dba5 e9b5 /;M............. + c448: b538 f348 c25b 3956 d019 b605 11f1 59f1 8.H.[.V9.......Y + c458: 4f9b af19 82a4 923f 8118 da6d 5ed5 ab1c .O....?...m..^.. + c468: 0242 a303 aa98 d807 6fbe 4570 5b01 1283 B........opE.[.. + c478: b28c 4ee4 85be 2431 b4e2 d5ff 7dc3 550c ...N..1$.....}.U + c488: 896f f27b 5d74 72be 96b1 3b16 b1fe 80de o.{.t].r...;.... + c498: 1235 25c7 06a7 9bdc 2694 cf69 f174 c19b 5..%.....&i.t... + c4a8: 4ad2 9ef1 69c1 e49b 25e3 384f 4786 efbe .J...i...%O8.G.. + c4b8: d5b5 8b8c 9dc6 0fc1 9c65 77ac a1cc 240c ........e..w...$ + c4c8: 0275 592b 2c6f 2de9 e483 6ea6 84aa 4a74 u.+Yo,.-...n..tJ + c4d8: fbd4 bd41 a9dc 5cb0 53b5 8311 88da 76f9 ..A....\.S.....v + c4e8: dfab ee66 5152 983e 3210 2db4 c66d a831 ..f.RQ>..2.-m.1. + c4f8: 213f 98fb 27c8 b003 0ee4 beef 7fc7 bf59 ?!...'........Y. + c508: 8fc2 3da8 0bf3 c6e0 a725 930a 9147 d5a7 ...=....%...G... + c518: 826f e003 6351 06ca 6e70 0a0e 2967 1429 o...Qc..pn..g)). + c528: 2ffc 46d2 0a85 27b7 c926 5c26 2138 2e1b ./.F...'&.&\8!.. + c538: 2aed 5ac4 6dfc 4d2c b3df 9d95 0d13 5338 .*.Z.m,M......8S + c548: 63de 8baf 7354 650a b2a8 3c77 0abb 766a .c..Ts.e..w<..jv + c558: aee6 47ed c92e 81c2 353b 1482 2c85 9272 ...G....;5...,r. + c568: 0364 4cf1 e8a1 a2bf 3001 bc42 664b a81a d..L.....0B.Kf.. + c578: 9791 d0f8 8b70 c24b be30 0654 51a3 c76c ....p.K.0.T..Ql. + c588: 5218 d6ef e819 d192 a910 5565 0624 d699 .R........eU$... + c598: 202a 5771 3585 f40e d1b8 32bb a070 106a * qW.5.....2p.j. + c5a8: d0c8 b8d2 c116 19a4 ab53 5141 6c08 1e37 ........S.AQ.l7. + c5b8: eb99 df8e 774c 2748 48a8 e19b bcb5 34b0 ....LwH'.H.....4 + c5c8: 5a63 c5c9 0cb3 391c 8acb e341 aa4a 4ed8 cZ.....9..A.J..N + c5d8: e373 7763 ca4f 5b9c b8a3 d6b2 6ff3 682e s.cwO..[.....o.h + c5e8: b2fc 5def 82ee 748f 2f60 4317 636f 78a5 ...]...t`/.Coc.x + c5f8: ab72 a1f0 7814 84c8 39ec 1a64 0208 8cc7 r....x...9d..... + c608: 1e28 2363 fffa 90be bde9 de82 6ceb a450 (.c#.........lP. + c618: 7915 b2c6 a3f7 bef9 532b e372 78f2 c671 .y......+Sr..xq. + c628: 619c ea26 3ece ca27 c207 21c0 b8c7 d186 .a&..>'....!.... + c638: eb1e cde0 7dd6 eada d178 ee6e 4f7f f57d .....}..x.n..O}. + c648: 6fba 7217 67aa 06f0 98a6 a2c8 7dc5 0a63 .o.r.g.......}c. + c658: 0dae bef9 9804 113f 471b 131c 0b35 1b71 ......?..G..5.q. + c668: 7d84 2304 77f5 28db 2493 40c7 ab7b 32ca .}.#.w.(.$.@{..2 + c678: bebc 15c9 be0a 3c9e 0d4c 9c10 67c4 431d ...........L*~e..).Y + c698: faec 3ad6 6fab 5fcb 5817 4a47 198c 6c44 ...:.o._.XGJ..Dl + c6a8: c908 f3bc e667 6a09 a73b 84ca ae85 bb67 ....g..j;.....g. + c6b8: f82b fe94 f372 3c6e 36f1 5f1d f53a a54f +...r.n<.6._:.O. + c6c8: 82d1 ade6 527f 510e 6c1f 2b3e 688c 9b05 .....R.Q.l>+.h.. + c6d8: bd6b fb41 d9ab 1f83 2179 137e cd19 5be0 k.A.....y!~....[ + +0000c6e8 : + c6e8: f159 feb2 e50a ffa6 dd7b fe2a 141e 00d4 Y.......{.*..... + c6f8: 8052 0003 d130 00f3 7977 ff40 e332 ff9c R...0...wy@.2... + c708: 6e00 01c5 1b67 0090 .n..g... + +0000c710 : + c710: d3ed 5cf5 631a 5812 9cd6 a2f7 f9de 14de ...\.c.X........ + ... + c72c: 0000 1000 .... + +0000c730 : + c730: 648f 01f8 6063 ffbc 09c5 fff8 88d5 0065 .d..c`........e. + c740: 8473 000e 61a0 ffa0 4b14 ffb1 be9d 006a s....a...K....j. + c750: a43e ffad 69f5 ff95 3fee 003d 4f37 006a >....i...?=.7Oj. + c760: 3b70 ff49 6cc2 003c 19c5 007a 483e 004e p;I..l<...z.>HN. + c770: 1ec4 ffdf 03ae ffe3 69c3 fe18 3468 ff09 .........i..h4.. + c780: 498d 00f8 6bec ff73 0c9a 016b 295e 000b .I...ks...k.^).. + c790: 324b fe76 e2e4 ffc9 4478 006a 409a ffb7 K2v.....xDj..@.. + c7a0: 7d51 00a7 5cc5 0099 a68f 0026 9049 ffbe Q}...\....&.I... + c7b0: a6c8 fe8a fbb3 ff42 c4bd ff32 e5c8 00dd ......B...2..... + c7c0: 7a0d 00c4 ff9f 00d3 ea74 00e5 2568 0083 .z......t...h%.. + c7d0: 4c1d 0132 a33b ff4e 4ccf 0030 ce86 ff37 .L2.;.N..L0...7. + c7e0: 3e00 00c9 e7f0 ff4f f233 ff5b 4551 ff32 .>....O.3.[.QE2. + c7f0: 7d4a 01c3 872f 0021 754e ffef 898d 00b4 J}../.!.Nu...... + c800: 09b5 005c 9484 00d6 0b0c 00e1 7d26 ff83 ..\.........&}.. + c810: cfa0 fec3 2d54 00b3 a602 01de d2f0 00c8 ....T-.......... + c820: 496c 001f 770b ff9d c87f 00e9 7710 0050 lI...w.......wP. + c830: db94 0184 e6ae 0001 7ae4 feea b459 ff93 .........z..Y... + c840: e4db ff99 2608 ff21 a514 0097 00c9 0021 .....&!.......!. + c850: 0906 ffa2 e370 ffe5 4a94 0041 597d ffd8 ....p....JA.}Y.. + c860: 1880 fea3 9e0c ff92 dba0 fe8c 3c05 00b3 .............<.. + c870: c048 fea5 48fc ff26 06ad 005b 2d9d 008f H....H&...[..-.. + c880: f22d 0137 53f0 0059 1237 01af ea4d ffea -.7..SY.7...M... + c890: a372 ff5a 513a 00d1 5e56 ff7e f92a 00f9 r.Z.:Q..V^~.*... + c8a0: b454 0091 23fd ffb4 75dd ffbb 753d ffc4 T....#...u..=u.. + c8b0: 5570 005e 3121 ff3c 4ff1 0196 9f10 009e pU^.!1<..O...... + c8c0: 0218 01a1 1759 ff0e bbb4 0075 0486 0085 ....Y.....u..... + c8d0: 61e2 ff73 b5f8 ff20 3bea 01ba 81c2 ffa9 .as... ..;...... + c8e0: 822c 0040 b1e4 0003 5d39 ff35 2128 ff86 ,.@.....9]5.(!.. + c8f0: a990 ff93 bc34 0085 caaa fe5f 408f 002f ....4....._..@/. + c900: db53 01c4 83cd ff74 9c95 003b e5da 00ab S.....t...;..... + c910: dbcd 00b5 5ab8 00ef 0b75 fef1 d66c ff54 .....Z..u...l.T. + c920: a2d9 fe5b 0dad 004a 6fc5 fe61 df3f 0067 ..[...J..oa.?.g. + c930: db8d 0068 95df ffef 748e fe45 6243 00d5 ..h......tE.Cb.. + c940: 4e7c fe62 989e ffd6 e25f 01ac 92e5 ff35 |Nb....._.....5. + c950: eb76 005d 7a92 00e6 ff27 0035 5944 ff8d v.]..z..'.5.DY.. + c960: 3276 00d7 6a79 00ab f02b fe05 996a 008d v2..yj..+...j... + c970: 3d08 01d9 25f2 0042 1ba0 ffe4 0d67 0046 .=...%B.....g.F. + c980: 0689 00d5 2000 00c3 6ace 0016 9927 ff00 ..... ...j..'... + c990: d358 01fd c028 00d4 7b8e 007b 0e10 ff7a X...(....{{...z. + c9a0: a277 ff55 f092 0015 a6d0 0157 6206 ffd5 w.U.......W..b.. + c9b0: 6781 01de a548 ffb6 893c fe7d 764f 003c .g..H...<.}.Ov<. + c9c0: 5e7e 00bf 929d ff70 8463 fe5d 8892 0079 ~^....p.c.]...y. + c9d0: 6293 fe94 8da7 0054 5c4b fe77 4009 ff97 .b....T.K\w..@.. + c9e0: e818 016b 60a3 002e 6c26 ff74 e6a0 005b ..k..`..<...[. + c9f0: 942b fe5d 97b9 00a1 32db 0182 d1da ffe7 +.]......2...... + ca00: ca30 fea1 0a74 004d 2649 01db 1894 fffd 0...t.M.I&...... + ca10: ce51 fed5 717a fff6 2e1f fef5 0c4b ff04 Q...zq......K... + ca20: 5a0f fee0 dccc ff39 3866 ff6c 069a 00e0 .Z....9.f8l..... + ca30: 3410 01d1 c38b 0075 c073 ff5a f321 0092 .4....u.s.Z.!... + ca40: 3275 01ce 4d58 ff5f d22e fe57 3ba7 ff2d u2..XM_...W..;-. + ca50: ecfb 0058 9f53 00f5 23b1 fe8a 8c9b 00b8 ..X.S....#...... + ca60: 20d4 0071 ab2f 00ae 1fcf 01ac a03d ffe4 . q./.......=... + ca70: 81eb ff29 8490 0042 a8ef 0191 bebc 0023 ..)...B.......#. + ca80: 04cf feb2 3932 ffe7 7f34 ffa3 26d2 0020 ....29..4....& . + ca90: b155 fe49 e2b0 0089 a5d1 fed4 cb2b ff38 U.I.........+.8. + caa0: db50 fe3a 4756 00e2 dd93 ffb9 fb39 00d8 P.:.VG......9... + cab0: e2c7 fe35 197d 002d 8a94 00b8 0d2c ff2f ..5.}.-.....,./. + cac0: 573b ffa5 8991 006b 2447 ffcf edd4 00db ;W....k.G$...... + cad0: 012c ff48 7ccb ff05 2079 ff76 c2b8 ff91 ,.H..|..y v..... + cae0: 44b0 008d 59c4 0015 d490 01cf 4266 ffa9 .D...Y......fB.. + +0000caf0 : + caf0: fca7 ff97 8941 ffdc c54b fea7 e5cc 0001 ....A...K....... + cb00: e502 0112 c4e9 007f 147c 0131 35e0 001e ........|.1..5.. + cb10: f35b fee4 a083 008a 4311 009d 2730 0006 [........C..0'.. + cb20: 7055 00e2 ffaa 0092 23ce 0081 835b ff80 Up.......#..[... + cb30: b677 ff25 d42f 00df 53b6 0191 0200 002b w.%./....S....+. + cb40: 9a44 fea5 03e8 ffcf f384 ff2c 538c ffd3 D.........,..S.. + cb50: e13f ff06 2098 ff2a 766e 00c5 b6f1 0002 ?.... *.nv...... + cb60: a18b 00b9 693b ffdb 966a ff44 da0e ff94 ....;i..j.D..... + cb70: 5f9d 0097 3dda ffd1 77f5 fe15 acae 002c ._...=...w....,. + cb80: ae74 0155 5e79 ff1d 80e7 0029 46c5 00fa t.U.y^....)..F.. + cb90: 929f ff91 d450 ffb7 fc02 0028 6f81 ff9c ....P.....(..o.. + cba0: 15ee fe8e c58d ff0c cec7 ffa0 e327 00d6 ............'... + cbb0: 50b5 0099 965d 00ba ac9c fe2e 41bf ff3b .P..]........A;. + cbc0: b153 ff55 01cd 0036 7c80 ff50 a43c 00fb S.U...6..|P.<... + cbd0: a2f2 fe5f a6fe ff1a 0659 ff91 dc09 ff0c .._.....Y....... + cbe0: 54ee 010d e299 0008 df04 fff2 229f fffd .T...........".. + cbf0: c83c ff47 fc01 ff5c 7283 fec9 64d0 00ed <.G...\..r...d.. + cc00: e073 fe25 6a4b ffb3 1e90 ffa0 8486 ffdd s.%.Kj.......... + cc10: ad39 ffb8 d33f ffb9 9a68 ffc1 c0e8 00bd 9...?...h....... + cc20: bb21 fe22 2d9b 0010 762f 005f ec56 009f !."..-../v_.V... + cc30: 584e ff2c eb3c 001e 6614 feb1 2a9b ffd6 NX,.<....f...*.. + cc40: 46f8 ffdb 6554 ff85 3c7e 0070 12fc 00f0 .F..Te..~W. + cca0: 4b65 feb1 5dab 00b8 499f ff54 b6f6 ff0c eK...]...IT..... + ccb0: 4d40 0099 9ee5 0052 0a43 017b 65a7 007b @M....R.C.{..e{. + ccc0: d8aa ff99 95b3 0096 bd84 00f1 6ded ff08 .............m.. + ccd0: 15e7 0093 388b 00b4 ab9e fe91 c98a ff71 .....8........q. + cce0: b4e9 003b 9841 ff69 331d 000f d29d ff7a ..;.A.i..3....z. + ccf0: e76e ff77 e4a6 ff28 9be3 006e c5d4 00dc n.w...(...n..... + cd00: f55c 0180 cc65 ff79 e863 00da 8016 007d \...e.y.c.....}. + cd10: 7acb 0061 6ccd ff92 b27a 0062 ee71 ff7a .za..l..z.b.q.z. + cd20: b61b 00ec 94f7 00eb 08f2 0070 02b2 ff65 ..........p...e. + cd30: bd2e 0112 224f ff91 5bff 0021 88a0 004a ....O"...[!...J. + cd40: 3347 00a5 e225 006c 42b2 ff27 d580 0050 G3..%.l..B'...P. + cd50: 8c52 ffa6 5f3a ffa4 b55b 01ac a345 0040 R...:_..[...E.@. + cd60: 464a ff27 e2ec 001d 6515 feff 8cdb 003a JF'......e....:. + cd70: e802 ffab f032 ff36 8509 fe3c 4909 00bc ....2.6...<..I.. + cd80: da3e 00e9 afd6 ff0c 857f ff79 015c 00a9 >.........y.\... + cd90: ce0e fed4 60e5 ffc6 f4a0 00b2 8854 0092 .....`......T... + cda0: 3b83 ffb9 0f59 ffaf 8ed9 ff88 9454 0029 .;..Y.......T.). + cdb0: a05f 01dc 4291 ff00 16f8 ff91 d39c 00e1 _....B.......... + cdc0: e550 fe47 dcbc 0049 29b6 ff48 1f70 ff75 P.G...I..)H.p.u. + cdd0: f1a8 ffe9 d3d1 0005 53ba fe27 df83 ff03 .........S'..... + cde0: b12c 0013 4a97 00c3 c163 019f 83ee ff62 ,....J..c.....b. + cdf0: b5a2 00e1 7560 ff22 e736 0050 8b58 ff7a ....`u".6.P.X.z. + ce00: 0f3a ffcc ae7b ffc0 1423 fe63 0691 00a4 :...{...#.c..... + ce10: 3417 0186 5260 ffa0 bb33 ff15 b838 00f4 .4..`R..3...8... + ce20: 7db4 0011 7dc6 0000 6272 0166 43cd 0092 .}...}..rbf..C.. + ce30: 1d4b 0179 5be7 ffea ced9 012e 4e0c 0004 K.y..[.......N.. + ce40: b3d5 fef3 e873 00a7 a753 fe17 8e7d ffd6 ....s...S...}... + ce50: 2812 005d e461 ffe5 6984 febf c98d 00da .(].a....i...... + ce60: 7d71 007a fc7e 007c a335 fee5 c587 ff43 q}z.~.|.5.....C. + ce70: 1df6 0180 9bbf ffa5 b081 00eb 3124 0072 ............$1r. + ce80: 8407 fe2f ba14 0098 5253 ff28 4db5 ffc0 ../.....SR(..M.. + ce90: 59b9 009c 0a09 ff20 fc9f 01ff 2df9 ff2a .Y.... ......-*. + cea0: 89ee 0164 1c53 00e6 6338 ff86 ef71 0074 ..d.S...8c..q.t. + +0000ceb0 : + ceb0: 3b85 018c f1bd ff24 25f8 01c3 dc60 0037 .;....$..%..`.7. + cec0: 4cb7 ff3e 42c3 003d 4c32 01a4 a4e1 ff4c .L>..B=.2L....L. + ced0: 3d4c ffa3 3e75 001f 9151 ff40 4176 000e L=..u>..Q.@.vA.. + cee0: 73a2 ffd6 8a06 002e e67c fff4 8a0a 008f .s......|....... + cef0: 1a34 00c2 f4b8 004c 8f81 0129 f4be ff13 4.....L...)..... + cf00: aa7b ff7a 8162 0044 d579 0093 6556 ff1e {.z.b.D.y...Ve.. + cf10: 67a1 009b 598c ff43 e5ef 01be 0b43 00b5 .g...YC.....C... + cf20: f0c6 fe89 45ee ffbc 9743 00ee 2a13 ff6c .....E..C....*l. + cf30: 55e5 0171 4432 ff87 6a11 0009 6732 ff01 .Uq.2D...j..2g.. + cf40: 0150 01a8 9823 ff1e a810 01b9 5938 ffe8 P...#.......8Y.. + cf50: d265 00fc fa29 0047 aacc ff4f 2e0e ffef e...).G...O..... + cf60: 4d50 00ef d6bd ff4b 8d11 00f9 5026 ff4c PM....K.....&PL. + cf70: 55be 0075 e456 00aa d89c 01d0 cfc3 ffa4 .Uu.V........... + cf80: 4296 ff4c e1af ff10 508d 0162 db4c 00f2 .BL......Pb.L... + cf90: a2c6 0072 da2e 0098 2b9b fef1 a09b ff68 ..r......+....h. + cfa0: bb33 00a5 1102 00af 5442 01a0 3af7 001e 3.......BT...:.. + cfb0: 4123 fe35 ec45 00bf 862d 01f5 7ba3 00dd #A5.E...-....{.. + cfc0: 6e20 ff14 1734 00a5 d6ba 0047 b0e9 0060 n..4.....G...`. + cfd0: eff2 0136 5939 008a 0053 ff54 a088 0064 ..6.9Y..S.T...d. + cfe0: 8e5c fe78 7c68 00be b1b5 ff3e 29fa 0055 \.x.h|....>..)U. + cff0: 8298 012a fc60 00f6 9797 fe3f 85ef 003e ..*.`.....?...>. + d000: 3820 009c a72d ffbd 858e 01b3 5683 00d3 8..-........V.. + d010: b3bb fe96 aafa ff0e a3d2 004e 3425 0097 ..........N.%4.. + d020: 4d63 001a 9cee ffd5 c0d5 01d1 2e49 0054 cM..........I.T. + d030: 4114 0129 ce36 004f 83c9 fe92 6faa ff18 .A).6.O......o.. + d040: 21b1 fe32 26ab ffcb f74e 0074 ddd1 0099 .!2..&..N.t..... + d050: 8085 01b2 2c3a 0019 27c9 013b 13bd 00fc ....:,...';..... + d060: e531 01d2 bb75 0075 b3b5 01b8 7200 00db 1...u.u......r.. + d070: 5e30 0093 29f5 0038 0d7d fecc adf4 0077 0^...)8.}.....w. + d080: dd2c fe20 ea54 0014 a0f9 01c6 7eec ffea ,. .T........~.. + d090: 632f fea8 e2aa ff99 b366 00d8 8de2 ff7a /c......f.....z. + d0a0: 427a fe99 f5b6 0086 e4e3 0119 39d6 ffeb zB...........9.. + d0b0: add8 ff38 e7b5 00d2 8077 ff9d 5f81 ff88 ..8.....w...._.. + d0c0: 7e6e 0033 a902 ffb7 8207 fe62 b045 ff5e n~3.......b.E.^. + d0d0: 0474 01e3 f2d9 ff91 adca 011f 0169 ff27 t...........i.'. + d0e0: af2e 0045 2fe4 ff3a e0d7 fe45 38cf ff45 ..E../:...E..8E. + d0f0: fe10 ff8b cf17 ffd4 14ca ff7e d55f ff60 ..........~._.`. + d100: b009 0021 05c8 ffcf 2af1 fe80 2123 ffc0 ..!......*..#!.. + d110: e5f8 01c4 1181 0078 67fb ff97 3407 ff70 ......x..g...4p. + d120: 388c ff42 e228 fff5 46d9 fe25 d6ac ff09 .8B.(....F%..... + d130: 4348 0186 c092 ffd6 262c 0070 b844 ff4b HC......,&p.D.K. + d140: 5ace 00fb eb95 008d aab5 003a f474 00ef .Z........:.t... + d150: 9d5c 0002 ad66 0062 89e9 0160 317f 00cb \...f.b...`..1.. + d160: 9b05 0094 9417 ff09 7ad3 000c 8622 ff1a .........z.."... + d170: ccdb 0088 0886 ff29 53e0 fe2b 1955 00f7 ......)..S+.U... + d180: 7f6d fe00 88a9 0030 77ee ffdb ade7 00d5 m.....0..w...... + d190: 12ce fefe ba08 ff07 097e 0107 2a6f 0048 ........~...o*H. + d1a0: 346f feec 3f60 008d bf93 fe7f 4ecd ffc0 o4..`?.......N.. + d1b0: 6a0e 01ed dbbb 004c f3af febb 5969 00ad .j....L.....iY.. + d1c0: 1955 0159 f3a2 0094 7602 fed1 9e21 0009 U.Y......v..!... + d1d0: a38b ff2e 465d 0028 2a6c fe8e fc6f ff8e ....]F(.l*..o... + d1e0: df9b 0090 e533 ffa7 fc49 ff9b 745e ff0c ....3...I...^t.. + d1f0: a098 ffda ee9c ff25 eab3 ffcf 00c5 ffb3 ......%......... + d200: a49a 008d c4e1 0068 230a fe19 d4d1 fff2 ......h..#...... + d210: fd61 fede 65b8 00e5 12de 017f 88a4 ff87 a....e.......... + d220: cf1e fe8c 6192 00f3 c081 fe1a 54c9 ff21 .....a.......T!. + d230: 0a6f ff4e 5193 ffb2 0404 0018 eea1 ffd7 o.N..Q.......... + d240: 8d06 0021 d735 ff0e b529 ffd0 8be7 009d ..!.5...)....... + d250: cbb3 ffdd b9ff 0071 e2bd ffac 4271 ffd6 ......q.....qB.. + d260: 3eca ff2d 4066 ff08 ae4e fe10 7585 ff44 .>-.f@..N....uD. + +0000d270 : + d270: 78b6 ff59 7285 00d3 6ebd ff15 0a0f 006a .xY..r...n....j. + d280: c029 0001 e898 ff79 3cbc ffa0 7199 ffce ).....y..<...q.. + d290: b700 fee2 0db4 ff48 ......H. + +0000d298 : + d298: 0001 0000 0000 0000 0000 0000 0000 0000 ................ + ... + +0000d2c0 : + d2c0: e9f7 2e7a 318d 2c09 ce6b 517b 7cef 0a6f ..z..1.,k.{Q.|o. + ... + d2dc: 0000 0800 .... + +0000d2e0 : + d2e0: 4a8e 46cc 18ba 6b76 e7b8 39be adfa 6377 .J.F..vk...9..wc + d2f0: ffff ffff ffff ffff ffff ffff ffff 07ff ................ + +0000d300 : + d300: 131b 0a2c e5a3 ed9c 29a7 0863 215d 2106 ..,......)c.]!.! + d310: ffeb ffff ffff ffff ffff ffff ffff ffff ................ + d320: 000f 0000 .... + +0000d324 : + d324: a0b0 fe0e c9d3 ff86 189e 008f 697f 0035 .............i5. + d334: 0c60 00bd d7a7 fffb 4c9f fe80 656a ffe1 `........L..je.. + d344: fc1e 0004 0c92 00ae ........ + +0000d34c : + d34c: 0001 0000 0000 0000 0000 0000 0000 0000 ................ + ... + +0000d36c : + d36c: 018d 0402 1008 4020 1b80 0036 ...... @..6. + +0000d378 : + d378: 7c63 7b77 6bf2 c56f 0130 2b67 d7fe 76ab c|w{.ko.0.g+...v + d388: 82ca 7dc9 59fa f047 d4ad afa2 a49c c072 ...}.YG.......r. + d398: fdb7 2693 3f36 ccf7 a534 f1e5 d871 1531 ...&6?..4...q.1. + d3a8: c704 c323 9618 9a05 1207 e280 27eb 75b2 ..#..........'.u + d3b8: 8309 1a2c 6e1b a05a 3b52 b3d6 e329 842f ..,..nZ.R;..)./. + d3c8: d153 ed00 fc20 5bb1 cb6a 39be 4c4a cf58 S... ..[j..9JLX. + d3d8: efd0 fbaa 4d43 8533 f945 7f02 3c50 a89f ....CM3.E...P<.. + d3e8: a351 8f40 9d92 f538 b6bc 21da ff10 d2f3 Q.@...8....!.... + d3f8: 0ccd ec13 975f 1744 a7c4 3d7e 5d64 7319 ...._.D...~=d].s + d408: 8160 dc4f 2a22 8890 ee46 14b8 5ede db0b `.O."*..F....^.. + d418: 32e0 0a3a 0649 5c24 d3c2 62ac 9591 79e4 .2:.I.$\...b...y + d428: c8e7 6d37 d58d a94e 566c eaf4 7a65 08ae ..7m..N.lV..ez.. + d438: 78ba 2e25 a61c c6b4 dde8 1f74 bd4b 8a8b .x%.......t.K... + d448: 3e70 66b5 0348 0ef6 3561 b957 c186 9e1d p>.fH...a5W..... + d458: f8e1 1198 d969 948e 1e9b e987 55ce df28 ....i........U(. + d468: a18c 0d89 e6bf 6842 9941 0f2d 54b0 16bb ......BhA.-..T.. + +0000d478 : + d478: 0952 d56a 3630 38a5 40bf 9ea3 f381 fbd7 R.j.06.8.@...... + d488: e37c 8239 2f9b 87ff 8e34 4443 dec4 cbe9 |.9../..4.CD.... + d498: 7b54 3294 c2a6 3d23 4cee 0b95 fa42 4ec3 T{.2..#=.L..B..N + d4a8: 2e08 66a1 d928 b224 5b76 49a2 8b6d 25d1 ...f(.$.v[.Im..% + d4b8: f872 64f6 6886 1698 a4d4 cc5c 655d 92b6 r..d.h....\.]e.. + d4c8: 706c 5048 edfd dab9 155e 5746 8da7 849d lpHP....^.FW.... + d4d8: d890 00ab bc8c 0ad3 e4f7 0558 b3b8 0645 ..........X...E. + d4e8: 2cd0 8f1e 3fca 020f afc1 03bd 1301 6b8a .,...?.........k + d4f8: 913a 4111 674f eadc f297 cecf b4f0 73e6 :..AOg.........s + d508: ac96 2274 ade7 8535 f9e2 e837 751c 6edf ..t"..5...7..u.n + d518: f147 711a 291d 89c5 b76f 0e62 18aa 1bbe G..q.)..o.b..... + d528: 56fc 4b3e d2c6 2079 db9a fec0 cd78 f45a .V>K..y ....x.Z. + d538: dd1f 33a8 0788 31c7 12b1 5910 8027 5fec ...3...1...Y'.._ + d548: 5160 a97f b519 0d4a e52d 9f7a c993 ef9c `Q....J.-.z..... + d558: e0a0 4d3b 2aae b0f5 ebc8 3cbb 5383 6199 ..;M.*.....<.S.a + d568: 2b17 7e04 77ba 26d6 69e1 6314 2155 7d0c .+.~.w.&.i.cU!.} + +0000d578 : + d578: 2f98 428a 4491 7137 fbcf b5c0 dba5 e9b5 ./.B.D7q........ + d588: c25b 3956 11f1 59f1 82a4 923f 5ed5 ab1c [.V9...Y..?..^.. + d598: aa98 d807 5b01 1283 85be 2431 7dc3 550c .....[....1$.}.U + d5a8: 5d74 72be b1fe 80de 06a7 9bdc f174 c19b t].r........t... + d5b8: 69c1 e49b 4786 efbe 9dc6 0fc1 a1cc 240c .i...G.........$ + d5c8: 2c6f 2de9 84aa 4a74 a9dc 5cb0 88da 76f9 o,.-..tJ...\...v + d5d8: 5152 983e c66d a831 27c8 b003 7fc7 bf59 RQ>.m.1..'....Y. + d5e8: 0bf3 c6e0 9147 d5a7 6351 06ca 2967 1429 ....G...Qc..g)). + d5f8: 0a85 27b7 2138 2e1b 6dfc 4d2c 0d13 5338 ...'8!...m,M..8S + d608: 7354 650a 0abb 766a c92e 81c2 2c85 9272 Ts.e..jv.....,r. + d618: e8a1 a2bf 664b a81a 8b70 c24b 51a3 c76c ....Kf..p.K..Ql. + d628: e819 d192 0624 d699 3585 f40e a070 106a ....$....5..p.j. + d638: c116 19a4 6c08 1e37 774c 2748 bcb5 34b0 .....l7.LwH'...4 + d648: 0cb3 391c aa4a 4ed8 ca4f 5b9c 6ff3 682e ...9J..NO..[.o.h + d658: 82ee 748f 636f 78a5 7814 84c8 0208 8cc7 ...toc.x.x...... + d668: fffa 90be 6ceb a450 a3f7 bef9 78f2 c671 .....lP......xq. + +0000d678 : + d678: 0020 0000 0040 0000 6e7c 0000 6ee4 0000 ...@...|n...n.. + d688: 700c 0000 .p.. + +0000d68c : + d68c: 8144 0eda 034e 9ec4 7784 d825 933a 80bf D...N....w%.:... + +0000d69c : + d69c: d948 0000 d954 0000 d960 0000 d96c 0000 H...T...`...l... + d6ac: 255b 5d73 2520 3a73 4c20 726f 4961 696e [%s] %s: LoraIni + d6bc: 0d74 000a 255b 5d73 2520 3a73 4420 656f t...[%s] %s: Doe + d6cc: 2073 6f6e 2074 6572 6f63 6e67 7a69 2065 s not recognize + d6dc: 6874 2065 6f6d 7564 656c 0a0d 0000 0000 the module...... + d6ec: 255b 5d73 2520 3a73 4320 4952 4954 4143 [%s] %s: CRITICA + d6fc: 3a4c 4c20 526f 2061 6f6e 2074 6f66 6e75 L: LoRa not foun + d70c: 2c64 6820 6c61 6574 0d64 000a 6f43 666e d, halted...Conf + d71c: 6769 0000 255b 5d73 2520 3a73 4420 6365 ig..[%s] %s: Dec + d72c: 6469 6e69 2067 6e6f 6320 6168 6e6e 6c65 iding on channel + d73c: 6920 646e 7865 2520 2064 6562 6163 7375 index %d becaus + d74c: 2065 666f 7420 6d69 7365 6174 706d 3020 e of timestamp 0 + d75c: 202c 616e 656d 6920 2073 7325 0a0d 0000 , name is %s.... + d76c: 255b 5d73 2520 3a73 4420 6365 6469 6e69 [%s] %s: Decidin + d77c: 2067 6e6f 6320 6168 6e6e 6c65 6920 646e g on channel ind + d78c: 7865 2520 2064 6562 6163 7375 2065 666f ex %d because of + d79c: 6e20 6d61 2065 656c 206e 2c30 6e20 6d61 name len 0, nam + d7ac: 2065 7369 2520 0d73 000a 0000 6e55 6e6b e is %s.....Unkn + d7bc: 776f 006e 4676 3074 5246 6775 4f53 7165 own.vFt0FRugSOeq + d7cc: 6b6e 6873 6d49 434d 6656 4867 354d 4276 nkshImMCVfgHM5vB + d7dc: 7978 0031 6568 6973 6c65 6f6b 0000 0000 xy1.hesielko.... + d7ec: 5242 204e 4357 2048 694d 696e 0000 0000 BRN WCH Mini.... + d7fc: 7550 6c62 6369 0000 5242 544e 7365 0074 Public..BRNTest. + d80c: 6559 0073 6f4e 0000 6f4e 6564 6420 7461 Yes.No..Node dat + d81c: 6261 7361 3a65 0000 6f4e 6564 2520 3a64 abase:..Node %d: + d82c: 000a 0000 2020 614e 656d 203a 7325 000a .... Name: %s.. + d83c: 7550 6b62 7965 0000 6553 7263 7465 0000 Pubkey..Secret.. + d84c: 2020 5047 3a53 6c20 7461 253d 2c64 6c20 GPS: lat=%d, l + d85c: 6e6f 253d 0a64 0000 2020 6150 6874 203a on=%d... Path: + d86c: 2e2e 202e 6e28 746f 6520 7078 6e61 6564 ... (not expande + d87c: 2c64 6120 6464 6920 2066 656e 6465 6465 d, add if needed + d88c: 0a29 0000 2020 6c46 6761 3a73 3020 2578 )... Flags: 0x% + d89c: 3230 0a58 0000 0000 2020 7541 6874 6e65 02X..... Authen + d8ac: 6974 6163 6574 3a64 2520 0a73 0000 0000 ticated: %s..... + d8bc: 2020 614c 7473 5320 6565 206e 7228 6d65 Last Seen (rem + d8cc: 746f 2065 7374 3a29 2520 0a64 0000 0000 ote ts): %d..... + d8dc: 2020 614c 7473 5320 6565 206e 6c28 636f Last Seen (loc + d8ec: 6c61 7420 2973 203a 6425 000a 2020 7953 al ts): %d.. Sy + d8fc: 636e 7420 6d69 7365 6174 706d 203a 6425 nc timestamp: %d + d90c: 000a 0000 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ....------------ + d91c: 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d 2d2d ---------------- + d92c: 2d2d 2d2d 2d2d 2d2d 2d2d 000a ----------.. + +0000d938 : + d938: 338b e987 cdc5 6aea e5c9 baed 15a1 72cd .3.....j.......r + d948: 6843 7461 6e20 646f 0065 0000 6552 6570 Chat node...Repe + d958: 7461 7265 0000 0000 6f52 6d6f 7320 7265 ater....Room ser + d968: 6576 0072 6553 736e 726f 0000 6568 6c6c ver.Sensor..hell + d978: 206f 6874 7265 0065 255b 5d73 2520 3a73 o there.[%s] %s: + d988: 5320 7379 6574 436d 6b6c 253a 0d64 0d0a SystemClk:%d... + d998: 000a 0000 255b 5d73 2520 3a73 4320 6968 ....[%s] %s: Chi + d9a8: 4970 3a44 3025 7838 0a0d 0a0d 0000 0000 pID:%08x........ + d9b8: 255b 5d73 2520 3a73 5320 6e65 6964 676e [%s] %s: Sending + d9c8: 6d20 7365 6173 6567 0d0a 000a 7953 5453 message....SyST + d9d8: 6369 206b 7369 2520 6c6c 0075 255b 5d73 ick is %llu.[%s] + d9e8: 2520 3a73 5320 6e65 6964 676e 7a20 7265 %s: Sending zer + d9f8: 206f 6f68 2070 6461 6576 7472 0d0a 000a o hop advert.... + da08: 255b 5d73 2520 3a73 5320 6e65 6964 676e [%s] %s: Sending + da18: 6620 6f6c 646f 6120 7664 7265 0a74 0a0d flood advert... + da28: 0000 0000 6553 646e 6e69 2067 656d 7373 ....Sending mess + da38: 6761 2065 7461 5320 5379 6954 6b63 6920 age at SySTick i + da48: 2073 6c25 756c 0000 6553 646e 6e69 2067 s %llu..Sending + da58: 2061 6964 6572 7463 6d20 7365 6173 6567 a direct message + da68: 7420 206f 6874 2065 6966 7372 2074 6f6e to the first no + da78: 6564 000a 6843 6e61 656e 206c 6e69 6564 de..Channel inde + da88: 2078 6425 202c 616e 656d 2064 7325 202c x %d, named %s, + da98: 6974 656d 7473 6d61 2070 7369 2520 2c64 timestamp is %d, + daa8: 6820 7361 2068 7369 2520 0a64 0000 0000 hash is %d..... + dab8: 6857 6c6f 2065 7266 6d61 0065 255b 5d73 Whole frame.[%s] + dac8: 2520 3a73 7220 7373 3d69 6425 645b 6d42 %s: rssi=%d[dBm + dad8: 205d 6e73 3d72 6425 645b 5d42 7220 7761 ] snr=%d[dB] raw + dae8: 6e73 3d72 6425 715b 6175 7472 7265 6420 snr=%d[quarter d + daf8: 5d42 0a0d 0000 0000 255b 5d73 2520 3a73 B]......[%s] %s: + db08: 2520 2064 6170 6b63 7465 2073 6f6c 7473 %d packets lost + db18: 0a0d 0000 255b 5d73 2520 3a73 7320 6e79 ....[%s] %s: syn + db28: 5763 726f 3d64 7830 7825 0a0d 0000 0000 cWord=0x%x...... + db38: 255b 5d73 2520 3a73 5320 3158 3632 2078 [%s] %s: SX126x + db48: 7265 6f72 2c72 6d20 7961 6562 6e20 206f error, maybe no + db58: 5053 2049 6f63 6e6e 6365 6974 6e6f 0a0d SPI connection.. + db68: 0000 0000 255b 5d73 2520 3a73 5320 3158 ....[%s] %s: SX1 + db78: 3632 2078 6e69 7473 6c61 656c 0d64 000a 26x installed... + db88: 255b 5d73 2520 3a73 7520 6573 6552 7567 [%s] %s: useRegu + db98: 616c 6f74 4c72 4f44 253d 0d64 000a 0000 latorLDO=%d..... + dba8: 255b 5d73 2520 3a73 4120 6d6c 736f 2074 [%s] %s: Almost + dbb8: 6f64 656e 7320 7465 6974 676e 4c20 526f done setting LoR + dbc8: 0d61 000a 5853 3231 3236 0000 255b 5d73 a...SX1262..[%s] + dbd8: 2520 3a73 4c20 526f 4561 7272 726f 6544 %s: LoRaErrorDe + dbe8: 6166 6c75 3d74 6425 0a0d 0000 4f47 454e fault=%d....GONE + dbf8: 5720 4f52 474e 000a 7473 7261 2074 6552 WRONG..start Re + dc08: 6461 6f43 6d6d 6e61 0064 0000 255b 5d73 adCommand...[%s] + dc18: 2520 3a73 5220 6165 4364 6d6f 616d 646e %s: ReadCommand + dc28: 203a 4d43 3d44 7830 3025 7832 0a0d 0000 : CMD=0x%02x.... + dc38: 6e65 2064 6552 6461 6f43 6d6d 6e61 0064 end ReadCommand. + dc48: 7473 7261 2074 6552 6461 6552 6967 7473 start ReadRegist + dc58: 7265 0000 255b 5d73 2520 3a73 5220 6165 er..[%s] %s: Rea + dc68: 5264 6765 7369 6574 3a72 5220 4745 303d dRegister: REG=0 + dc78: 2578 3230 0d78 000a 255b 5d73 2520 3a73 x%02x...[%s] %s: + dc88: 5220 6165 6964 676e 6220 7479 7365 0a0d Reading bytes.. + dc98: 0000 0000 255b 5d73 2520 3a73 7220 6165 ....[%s] %s: rea + dca8: 2064 2061 7962 6574 0a0d 0000 6e65 2064 d a byte....end + dcb8: 6552 6461 6552 6967 7473 7265 0000 0000 ReadRegister.... + dcc8: 255b 5d73 2520 3a73 4420 7461 4961 3a6e [%s] %s: DataIn: + dcd8: 3025 7832 0d20 000a 255b 5d73 2520 3a73 %02x ...[%s] %s: + dce8: 5720 6961 6974 676e 6620 726f 6920 6c64 Waiting for idl + dcf8: 0d65 000a 6552 6573 0074 0000 255b 5d73 e...Reset...[%s] + dd08: 2520 3a73 2d20 2d2d 2d2d 5320 7465 7852 %s: ----- SetRx + dd18: 7420 6d69 6f65 7475 253d 0d64 000a 0000 timeout=%d..... + dd28: 255b 5d73 2520 3a73 5320 7465 7852 4920 [%s] %s: SetRx I + dd38: 6c6c 6765 6c61 5320 6174 7574 0d73 000a llegal Status... + dd48: 255b 5d73 2520 3a73 5320 7465 7453 706f [%s] %s: SetStop + dd58: 7852 6954 656d 4f72 506e 6572 6d61 6c62 RxTimerOnPreambl + dd68: 4465 7465 6365 2074 6e65 6261 656c 253d eDetect enable=% + dd78: 0d64 000a 255b 5d73 2520 3a73 2d20 2d2d d...[%s] %s: --- + dd88: 2d2d 5320 7465 7854 7420 6d69 6f65 7475 -- SetTx timeout + dd98: 6e49 734d 253d 0d64 000a 0000 255b 5d73 InMs=%d.....[%s] + dda8: 2520 3a73 5320 7465 7854 7420 6d69 6f65 %s: SetTx timeo + ddb8: 7475 6e49 734d 253d 2064 6f74 7475 253d utInMs=%d tout=% + ddc8: 0d64 000a 255b 5d73 2520 3a73 5720 6972 d...[%s] %s: Wri + ddd8: 7474 6e65 6320 6d6f 616d 646e 202c 6572 tten command, re + dde8: 7274 6979 676e 0a0d 0000 0000 255b 5d73 trying......[%s] + ddf8: 2520 3a73 4220 6f72 656b 6f20 7475 0a0d %s: Broke out.. + de08: 0000 0000 255b 5d73 2520 3a73 5320 7465 ....[%s] %s: Set + de18: 7854 4920 6c6c 6765 6c61 5320 6174 7574 Tx Illegal Statu + de28: 0d73 000a 255b 5d73 2520 3a73 5720 6961 s...[%s] %s: Wai + de38: 4674 726f 6449 656c 5420 6d69 6f65 7475 tForIdle Timeout + de48: 7420 7865 3d74 7325 7420 6d69 6f65 7475 text=%s timeout + de58: 253d 756c 0a0d 0000 255b 5d73 2520 3a73 =%lu....[%s] %s: + de68: 5720 6961 4674 726f 6449 656c 6620 6961 WaitForIdle fai + de78: 206c 6572 7274 3d79 6425 0a0d 0000 0000 l retry=%d...... + de88: 255b 5d73 2520 3a73 7320 6174 7574 3d73 [%s] %s: status= + de98: 3025 7832 0a0d 0000 255b 5d73 2520 3a73 %02x....[%s] %s: + dea8: 5720 6972 6574 6f43 6d6d 6e61 3264 7320 WriteCommand2 s + deb8: 6174 7574 3d73 3025 7832 7220 7465 7972 tatus=%02x retry + dec8: 253d 0d64 000a 0000 255b 5d73 2520 3a73 =%d.....[%s] %s: + ded8: 5320 4950 5420 6172 736e 6361 6974 6e6f SPI Transaction + dee8: 6520 7272 726f 303a 2578 3230 0d78 000a error:0x%02x... + def8: 7473 7261 2074 7257 7469 4365 6d6f 616d start WriteComma + df08: 646e 0032 255b 5d73 2520 3a73 5720 6972 nd2.[%s] %s: Wri + df18: 6574 6f43 6d6d 6e61 3a64 4320 444d 303d teCommand: CMD=0 + df28: 2578 3230 0d78 000a 6e65 2064 7257 7469 x%02x...end Writ + df38: 4365 6d6f 616d 646e 0032 0000 7473 7261 eCommand2...star + df48: 2074 7257 7469 5265 6765 7369 6574 0072 t WriteRegister. + df58: 6e65 2064 7257 7469 5265 6765 7369 6574 end WriteRegiste + df68: 0072 0000 255b 5d73 2520 3a73 5720 6972 r...[%s] %s: Wri + df78: 6574 6552 6967 7473 7265 203a 4552 3d47 teRegister: REG= + df88: 7830 3025 7832 0a0d 0000 0000 255b 5d73 0x%02x......[%s] + df98: 2520 3a73 4420 7461 4f61 7475 253a 3230 %s: DataOut:%02 + dfa8: 2078 0a0d 0000 0000 x ...... + +0000dfb0 <__clz_tab>: + dfb0: 0100 0202 0303 0303 0404 0404 0404 0404 ................ + dfc0: 0505 0505 0505 0505 0505 0505 0505 0505 ................ + dfd0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + dfe0: 0606 0606 0606 0606 0606 0606 0606 0606 ................ + dff0: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + e000: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + e010: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + e020: 0707 0707 0707 0707 0707 0707 0707 0707 ................ + e030: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e040: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e050: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e060: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e070: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e080: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e090: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e0a0: 0808 0808 0808 0808 0808 0808 0808 0808 ................ + e0b0: 4f50 4953 0058 0000 002e 0000 POSIX....... + +0000e0bc <_ctype_>: + e0bc: 2000 2020 2020 2020 2020 2828 2828 2028 . ((((( + e0cc: 2020 2020 2020 2020 2020 2020 2020 2020 + e0dc: 8820 1010 1010 1010 1010 1010 1010 1010 ............... + e0ec: 0410 0404 0404 0404 0404 1004 1010 1010 ................ + e0fc: 1010 4141 4141 4141 0101 0101 0101 0101 ..AAAAAA........ + e10c: 0101 0101 0101 0101 0101 0101 1010 1010 ................ + e11c: 1010 4242 4242 4242 0202 0202 0202 0202 ..BBBBBB........ + e12c: 0202 0202 0202 0202 0202 0202 1010 1010 ................ + e13c: 0020 0000 0000 0000 0000 0000 0000 0000 ............... + ... + +0000e1c0 <__sf_fake_stderr>: + ... + +0000e1e0 <__sf_fake_stdin>: + ... + +0000e200 <__sf_fake_stdout>: + ... + e220: 2d23 2b30 0020 0000 6c68 004c 6665 4567 #-0+ ...hlL.efgE + e230: 4746 0000 3130 3332 3534 3736 3938 4241 FG..0123456789AB + e240: 4443 4645 0000 0000 3130 3332 3534 3736 CDEF....01234567 + e250: 3938 6261 6463 6665 0000 0000 89abcdef.... diff --git a/obj/meshcorenortos.map b/obj/meshcorenortos.map new file mode 100644 index 0000000..7f5c8d2 --- /dev/null +++ b/obj/meshcorenortos.map @@ -0,0 +1,4201 @@ +Archive member included to satisfy reference by file (symbol) + +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_lshrdi3.o) + ./User/lib/monocypher/monocypher.o (__lshrdi3) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_ashldi3.o) + ./User/lib/monocypher/monocypher-ed25519.o (__ashldi3) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) + ./User/sx1262.o (__divdi3) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_udivdi3.o) + ./User/sx1262.o (__udivdi3) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_umoddi3.o) + ./User/lib/monocypher/monocypher.o (__umoddi3) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(save-restore.o) + ./User/util/hexdump.o (__riscv_save_12) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_clz.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) (__clz_tab) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) + ./User/lib/cifra/aes.o (abort) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + ./User/meshcore/packets/encrypted.o (atoi) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + ./User/util/hexdump.o (__locale_ctype_ptr) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + ./User/sx1262.o (malloc) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) (__ascii_mbtowc) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcmp.o) + ./User/meshcore/packets/anonymous.o (memcmp) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcpy.o) + ./User/meshcore/packets/advert.o (memcpy) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memmove.o) + ./User/meshcore/meshframing.o (memmove) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memset.o) + ./User/meshcore/packets/ack.o (memset) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) (_free_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) (_malloc_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + ./User/meshcore/packets/advert.o (printf) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + ./User/meshcore/meshframing.o (putchar) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + ./User/lib/config.o (puts) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + ./User/meshcore/packets/anonymous.o (rand) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) (_sbrk_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) (raise) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) (_kill_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + ./User/util/hexdump.o (snprintf) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + ./User/meshcore/packets/encrypted.o (sprintf) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcat.o) + ./User/meshcore/packets/group.o (strcat) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcmp.o) + ./User/meshcore/packets/encrypted.o (strcmp) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcpy.o) + ./User/meshcore/packets/anonymous.o (strcpy) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strlen.o) + ./User/meshcore/packets/advert.o (strlen) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strncpy.o) + ./User/meshcore/packets/encrypted.o (strncpy) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) (_strtol_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) (__swbuf_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) (__ascii_wctomb) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) (__swsetup_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-ctype_.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) (_ctype_) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) (_fflush_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) (__sinit) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) (_fwalk) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) (_global_impure_ptr) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) (__smakebuf_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) (__malloc_lock) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) (_svfprintf_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) (_vfprintf_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) (_printf_i) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) (_putc_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) (errno) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) (__sread) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-writer.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) (_write_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) (_close_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) (_fstat_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fvwrite.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) (__sfvwrite_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) (_isatty_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) (_lseek_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memchr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) (memchr) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) (_realloc_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) (_read_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-msizer.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) (_malloc_usable_size_r) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) (_close) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) (_fstat) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) (_getpid) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) (_isatty) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) (_kill) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) (_lseek) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) (_read) +/usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(_exit.o) + /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) (_exit) + +Allocating common symbols +Common symbol size file + +errno 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + +Discarded input sections + + .text 0x0000000000000000 0x0 ./User/util/hexdump.o + .data 0x0000000000000000 0x0 ./User/util/hexdump.o + .bss 0x0000000000000000 0x0 ./User/util/hexdump.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/ack.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/ack.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/ack.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/advert.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/advert.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/advert.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/anonymous.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/anonymous.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/anonymous.o + .text.sendAnonymousRequest + 0x0000000000000000 0xf2 ./User/meshcore/packets/anonymous.o + .rodata.sendAnonymousRequest.str1.4 + 0x0000000000000000 0xd ./User/meshcore/packets/anonymous.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/control.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/control.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/control.o + .text.sendDiscoverRequest + 0x0000000000000000 0x68 ./User/meshcore/packets/control.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/custom.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/custom.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/custom.o + .debug_info 0x0000000000000000 0x6b ./User/meshcore/packets/custom.o + .debug_abbrev 0x0000000000000000 0x26 ./User/meshcore/packets/custom.o + .debug_aranges + 0x0000000000000000 0x18 ./User/meshcore/packets/custom.o + .debug_line 0x0000000000000000 0x1d ./User/meshcore/packets/custom.o + .debug_str 0x0000000000000000 0x1a8 ./User/meshcore/packets/custom.o + .comment 0x0000000000000000 0x34 ./User/meshcore/packets/custom.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/encrypted.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/encrypted.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/encrypted.o + .text.sendEncryptedRequest + 0x0000000000000000 0x46 ./User/meshcore/packets/encrypted.o + .text.printPlainTextMessage + 0x0000000000000000 0x78 ./User/meshcore/packets/encrypted.o + .text.printReturnedPathPayload + 0x0000000000000000 0x96 ./User/meshcore/packets/encrypted.o + .text.printEncryptedPayload + 0x0000000000000000 0xc0 ./User/meshcore/packets/encrypted.o + .rodata.printPlainTextMessage.str1.4 + 0x0000000000000000 0x45 ./User/meshcore/packets/encrypted.o + .rodata.printReturnedPathPayload.str1.4 + 0x0000000000000000 0x72 ./User/meshcore/packets/encrypted.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/group.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/group.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/group.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/multipart.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/multipart.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/multipart.o + .debug_info 0x0000000000000000 0x6b ./User/meshcore/packets/multipart.o + .debug_abbrev 0x0000000000000000 0x26 ./User/meshcore/packets/multipart.o + .debug_aranges + 0x0000000000000000 0x18 ./User/meshcore/packets/multipart.o + .debug_line 0x0000000000000000 0x1d ./User/meshcore/packets/multipart.o + .debug_str 0x0000000000000000 0x1ab ./User/meshcore/packets/multipart.o + .comment 0x0000000000000000 0x34 ./User/meshcore/packets/multipart.o + .text 0x0000000000000000 0x0 ./User/meshcore/packets/trace.o + .data 0x0000000000000000 0x0 ./User/meshcore/packets/trace.o + .bss 0x0000000000000000 0x0 ./User/meshcore/packets/trace.o + .debug_info 0x0000000000000000 0x6b ./User/meshcore/packets/trace.o + .debug_abbrev 0x0000000000000000 0x26 ./User/meshcore/packets/trace.o + .debug_aranges + 0x0000000000000000 0x18 ./User/meshcore/packets/trace.o + .debug_line 0x0000000000000000 0x1d ./User/meshcore/packets/trace.o + .debug_str 0x0000000000000000 0x1a7 ./User/meshcore/packets/trace.o + .comment 0x0000000000000000 0x34 ./User/meshcore/packets/trace.o + .text 0x0000000000000000 0x0 ./User/meshcore/meshcore.o + .data 0x0000000000000000 0x0 ./User/meshcore/meshcore.o + .bss 0x0000000000000000 0x0 ./User/meshcore/meshcore.o + .text 0x0000000000000000 0x0 ./User/meshcore/meshframing.o + .data 0x0000000000000000 0x0 ./User/meshcore/meshframing.o + .bss 0x0000000000000000 0x0 ./User/meshcore/meshframing.o + .text.getTransportCode + 0x0000000000000000 0x4 ./User/meshcore/meshframing.o + .text 0x0000000000000000 0x0 ./User/meshcore/stats.o + .data 0x0000000000000000 0x0 ./User/meshcore/stats.o + .bss 0x0000000000000000 0x0 ./User/meshcore/stats.o + .sbss.tickAirtime + 0x0000000000000000 0x4 ./User/meshcore/stats.o + .text 0x0000000000000000 0x0 ./User/lib/telemetry/telemetry.o + .data 0x0000000000000000 0x0 ./User/lib/telemetry/telemetry.o + .bss 0x0000000000000000 0x0 ./User/lib/telemetry/telemetry.o + .debug_line 0x0000000000000000 0x0 ./User/lib/telemetry/telemetry.o + .debug_str 0x0000000000000000 0x11f ./User/lib/telemetry/telemetry.o + .comment 0x0000000000000000 0x34 ./User/lib/telemetry/telemetry.o + .text 0x0000000000000000 0x0 ./User/lib/rtc/rtc.o + .data 0x0000000000000000 0x0 ./User/lib/rtc/rtc.o + .bss 0x0000000000000000 0x0 ./User/lib/rtc/rtc.o + .text.RTC_Alarm_Set + 0x0000000000000000 0x100 ./User/lib/rtc/rtc.o + .text 0x0000000000000000 0x0 ./User/lib/monocypher/monocypher-ed25519.o + .data 0x0000000000000000 0x0 ./User/lib/monocypher/monocypher-ed25519.o + .bss 0x0000000000000000 0x0 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_hmac_init + 0x0000000000000000 0x7c ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_hmac_update + 0x0000000000000000 0x1c ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_hmac_final + 0x0000000000000000 0x78 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_hmac + 0x0000000000000000 0x42 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_hkdf_expand + 0x0000000000000000 0xb2 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_hkdf + 0x0000000000000000 0x56 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_ed25519_ph_sign + 0x0000000000000000 0x2a ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_ed25519_ph_check + 0x0000000000000000 0x4a ./User/lib/monocypher/monocypher-ed25519.o + .rodata.domain + 0x0000000000000000 0x22 ./User/lib/monocypher/monocypher-ed25519.o + .text 0x0000000000000000 0x0 ./User/lib/monocypher/monocypher.o + .data 0x0000000000000000 0x0 ./User/lib/monocypher/monocypher.o + .bss 0x0000000000000000 0x0 ./User/lib/monocypher/monocypher.o + .text.load64_le_buf + 0x0000000000000000 0x36 ./User/lib/monocypher/monocypher.o + .text.chacha20_rounds + 0x0000000000000000 0x29e ./User/lib/monocypher/monocypher.o + .text.poly_blocks + 0x0000000000000000 0x2c2 ./User/lib/monocypher/monocypher.o + .text.blake2b_compress + 0x0000000000000000 0x47d4 ./User/lib/monocypher/monocypher.o + .text.xor_block + 0x0000000000000000 0x2a ./User/lib/monocypher/monocypher.o + .text.g_rounds + 0x0000000000000000 0x12e4 ./User/lib/monocypher/monocypher.o + .text.add_xl 0x0000000000000000 0x68 ./User/lib/monocypher/monocypher.o + .text.crypto_poly1305_update.part.1 + 0x0000000000000000 0x8e ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b_update.part.4 + 0x0000000000000000 0x1a2 ./User/lib/monocypher/monocypher.o + .text.store64_le_buf + 0x0000000000000000 0x4a ./User/lib/monocypher/monocypher.o + .text.crypto_verify16 + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .text.crypto_verify64 + 0x0000000000000000 0x3c ./User/lib/monocypher/monocypher.o + .text.select_lop + 0x0000000000000000 0x72 ./User/lib/monocypher/monocypher.o + .text.redc 0x0000000000000000 0xf0 ./User/lib/monocypher/monocypher.o + .text.blake_update_32 + 0x0000000000000000 0x3a ./User/lib/monocypher/monocypher.o + .text.crypto_chacha20_h + 0x0000000000000000 0x82 ./User/lib/monocypher/monocypher.o + .text.crypto_chacha20_djb + 0x0000000000000000 0x192 ./User/lib/monocypher/monocypher.o + .text.crypto_chacha20_ietf + 0x0000000000000000 0x42 ./User/lib/monocypher/monocypher.o + .text.crypto_chacha20_x + 0x0000000000000000 0x5c ./User/lib/monocypher/monocypher.o + .text.crypto_poly1305_init + 0x0000000000000000 0x6c ./User/lib/monocypher/monocypher.o + .text.crypto_poly1305_update + 0x0000000000000000 0x1c ./User/lib/monocypher/monocypher.o + .text.crypto_poly1305_final + 0x0000000000000000 0xbc ./User/lib/monocypher/monocypher.o + .text.lock_auth + 0x0000000000000000 0xc0 ./User/lib/monocypher/monocypher.o + .text.crypto_poly1305 + 0x0000000000000000 0x40 ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b_keyed_init + 0x0000000000000000 0xd2 ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b_init + 0x0000000000000000 0x1c ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b_update + 0x0000000000000000 0x1c ./User/lib/monocypher/monocypher.o + .text.blake_update_32_buf + 0x0000000000000000 0x32 ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b_final + 0x0000000000000000 0x78 ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b_keyed + 0x0000000000000000 0x42 ./User/lib/monocypher/monocypher.o + .text.crypto_blake2b + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .text.extended_hash + 0x0000000000000000 0xae ./User/lib/monocypher/monocypher.o + .text.crypto_argon2 + 0x0000000000000000 0x4cc ./User/lib/monocypher/monocypher.o + .text.crypto_x25519_public_key + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .text.hash_reduce.constprop.6 + 0x0000000000000000 0x78 ./User/lib/monocypher/monocypher.o + .text.crypto_eddsa_key_pair + 0x0000000000000000 0xac ./User/lib/monocypher/monocypher.o + .text.crypto_eddsa_sign + 0x0000000000000000 0xba ./User/lib/monocypher/monocypher.o + .text.crypto_eddsa_check + 0x0000000000000000 0x3c ./User/lib/monocypher/monocypher.o + .text.crypto_x25519_to_eddsa + 0x0000000000000000 0x88 ./User/lib/monocypher/monocypher.o + .text.crypto_x25519_dirty_small + 0x0000000000000000 0x54 ./User/lib/monocypher/monocypher.o + .text.crypto_x25519_dirty_fast + 0x0000000000000000 0x144 ./User/lib/monocypher/monocypher.o + .text.crypto_elligator_map + 0x0000000000000000 0x184 ./User/lib/monocypher/monocypher.o + .text.crypto_elligator_rev + 0x0000000000000000 0xf8 ./User/lib/monocypher/monocypher.o + .text.crypto_elligator_key_pair + 0x0000000000000000 0xcc ./User/lib/monocypher/monocypher.o + .text.crypto_x25519_inverse + 0x0000000000000000 0x196 ./User/lib/monocypher/monocypher.o + .text.crypto_aead_init_x + 0x0000000000000000 0x40 ./User/lib/monocypher/monocypher.o + .text.crypto_aead_init_djb + 0x0000000000000000 0x40 ./User/lib/monocypher/monocypher.o + .text.crypto_aead_init_ietf + 0x0000000000000000 0x54 ./User/lib/monocypher/monocypher.o + .text.crypto_aead_write + 0x0000000000000000 0x9c ./User/lib/monocypher/monocypher.o + .text.crypto_aead_read + 0x0000000000000000 0xba ./User/lib/monocypher/monocypher.o + .text.crypto_aead_lock + 0x0000000000000000 0x52 ./User/lib/monocypher/monocypher.o + .text.crypto_aead_unlock + 0x0000000000000000 0x56 ./User/lib/monocypher/monocypher.o + .rodata 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .rodata.A 0x0000000000000000 0x28 ./User/lib/monocypher/monocypher.o + .rodata.A2 0x0000000000000000 0x28 ./User/lib/monocypher/monocypher.o + .rodata.Lm2.3077 + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .rodata.base_point.2664 + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .rodata.blake2b_compress.cst8 + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .rodata.crypto_argon2_no_extras + 0x0000000000000000 0x10 ./User/lib/monocypher/monocypher.o + .rodata.crypto_chacha20_h.str1.4 + 0x0000000000000000 0x11 ./User/lib/monocypher/monocypher.o + .rodata.dirty_base_point.2992 + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .rodata.iv 0x0000000000000000 0x40 ./User/lib/monocypher/monocypher.o + .rodata.k.3055 + 0x0000000000000000 0x20 ./User/lib/monocypher/monocypher.o + .rodata.lop_x 0x0000000000000000 0x28 ./User/lib/monocypher/monocypher.o + .rodata.lop_y 0x0000000000000000 0x28 ./User/lib/monocypher/monocypher.o + .rodata.ufactor + 0x0000000000000000 0x28 ./User/lib/monocypher/monocypher.o + .rodata.zero 0x0000000000000000 0x80 ./User/lib/monocypher/monocypher.o + .text 0x0000000000000000 0x0 ./User/lib/cifra/aes.o + .data 0x0000000000000000 0x0 ./User/lib/cifra/aes.o + .bss 0x0000000000000000 0x0 ./User/lib/cifra/aes.o + .rodata.cf_aes + 0x0000000000000000 0xc ./User/lib/cifra/aes.o + .text 0x0000000000000000 0x0 ./User/lib/cifra/blockwise.o + .data 0x0000000000000000 0x0 ./User/lib/cifra/blockwise.o + .bss 0x0000000000000000 0x0 ./User/lib/cifra/blockwise.o + .text.cf_blockwise_xor + 0x0000000000000000 0x9c ./User/lib/cifra/blockwise.o + .text 0x0000000000000000 0x0 ./User/lib/cifra/chash.o + .data 0x0000000000000000 0x0 ./User/lib/cifra/chash.o + .bss 0x0000000000000000 0x0 ./User/lib/cifra/chash.o + .text 0x0000000000000000 0x0 ./User/lib/cifra/hmac.o + .data 0x0000000000000000 0x0 ./User/lib/cifra/hmac.o + .bss 0x0000000000000000 0x0 ./User/lib/cifra/hmac.o + .text.cf_hmac 0x0000000000000000 0x56 ./User/lib/cifra/hmac.o + .text 0x0000000000000000 0x0 ./User/lib/cifra/sha256.o + .data 0x0000000000000000 0x0 ./User/lib/cifra/sha256.o + .bss 0x0000000000000000 0x0 ./User/lib/cifra/sha256.o + .text 0x0000000000000000 0x0 ./User/lib/adc/temperature.o + .data 0x0000000000000000 0x0 ./User/lib/adc/temperature.o + .bss 0x0000000000000000 0x0 ./User/lib/adc/temperature.o + .text.getTemperature + 0x0000000000000000 0x3c ./User/lib/adc/temperature.o + .text 0x0000000000000000 0x0 ./User/lib/base64.o + .data 0x0000000000000000 0x0 ./User/lib/base64.o + .bss 0x0000000000000000 0x0 ./User/lib/base64.o + .text.base64_encode + 0x0000000000000000 0x8e ./User/lib/base64.o + .rodata.b64_enc_table + 0x0000000000000000 0x41 ./User/lib/base64.o + .debug_info 0x0000000000000000 0x17a ./User/lib/base64.o + .debug_abbrev 0x0000000000000000 0xd3 ./User/lib/base64.o + .debug_loc 0x0000000000000000 0x14c ./User/lib/base64.o + .debug_aranges + 0x0000000000000000 0x20 ./User/lib/base64.o + .debug_ranges 0x0000000000000000 0x48 ./User/lib/base64.o + .debug_line 0x0000000000000000 0x387 ./User/lib/base64.o + .debug_str 0x0000000000000000 0x1ff ./User/lib/base64.o + .comment 0x0000000000000000 0x34 ./User/lib/base64.o + .debug_frame 0x0000000000000000 0x20 ./User/lib/base64.o + .text 0x0000000000000000 0x0 ./User/lib/config.o + .data 0x0000000000000000 0x0 ./User/lib/config.o + .bss 0x0000000000000000 0x0 ./User/lib/config.o + .text.loadConfig + 0x0000000000000000 0x8c ./User/lib/config.o + .text.saveConfig + 0x0000000000000000 0x6e ./User/lib/config.o + .text.genSeed 0x0000000000000000 0x80 ./User/lib/config.o + .text 0x0000000000000000 0x0 ./User/ch32v30x_it.o + .data 0x0000000000000000 0x0 ./User/ch32v30x_it.o + .bss 0x0000000000000000 0x0 ./User/ch32v30x_it.o + .text 0x0000000000000000 0x0 ./User/main.o + .data 0x0000000000000000 0x0 ./User/main.o + .bss 0x0000000000000000 0x0 ./User/main.o + .text.vConfigureTimerForRunTimeStats + 0x0000000000000000 0x4c ./User/main.o + .text.ulGetRunTimeCounterValue + 0x0000000000000000 0x1c ./User/main.o + .text 0x0000000000000000 0x0 ./User/sx1262.o + .data 0x0000000000000000 0x0 ./User/sx1262.o + .bss 0x0000000000000000 0x0 ./User/sx1262.o + .text.spi_read_byte_offs + 0x0000000000000000 0xa8 ./User/sx1262.o + .text.WriteBuffer + 0x0000000000000000 0xa0 ./User/sx1262.o + .text.SetSyncWord + 0x0000000000000000 0x32 ./User/sx1262.o + .text.SetOvercurrentProtection + 0x0000000000000000 0x40 ./User/sx1262.o + .text.SetTxPower + 0x0000000000000000 0x1a ./User/sx1262.o + .text.SetCadParams + 0x0000000000000000 0x3a ./User/sx1262.o + .text.SetCad 0x0000000000000000 0x2a ./User/sx1262.o + .text.Wakeup 0x0000000000000000 0x18 ./User/sx1262.o + .text.LoRaSend + 0x0000000000000000 0x152 ./User/sx1262.o + .text.ReceiveMode + 0x0000000000000000 0x44 ./User/sx1262.o + .text.GetRssiInst + 0x0000000000000000 0x24 ./User/sx1262.o + .text.ReadBuffer + 0x0000000000000000 0xa8 ./User/sx1262.o + .text.LoRaReceive + 0x0000000000000000 0x40 ./User/sx1262.o + .rodata.LoRaSend.str1.4 + 0x0000000000000000 0x74 ./User/sx1262.o + .rodata.ReadBuffer.str1.4 + 0x0000000000000000 0x6f ./User/sx1262.o + .rodata.WriteBuffer.str1.4 + 0x0000000000000000 0x48 ./User/sx1262.o + .text 0x0000000000000000 0x0 ./User/system_ch32v30x.o + .data 0x0000000000000000 0x0 ./User/system_ch32v30x.o + .bss 0x0000000000000000 0x0 ./User/system_ch32v30x.o + .text 0x0000000000000000 0x0 ./Startup/startup_ch32v30x_D8C.o + .data 0x0000000000000000 0x0 ./Startup/startup_ch32v30x_D8C.o + .bss 0x0000000000000000 0x0 ./Startup/startup_ch32v30x_D8C.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_adc.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_adc.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_StructInit + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_adc.o + .text.ADC_DMACmd + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_ITConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_GetSoftwareStartConvStatus + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_DiscModeChannelCountConfig + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_DiscModeCmd + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_adc.o + .text.ADC_ExternalTrigConvCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_GetDualModeConversionValue + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_adc.o + .text.ADC_AutoInjectedConvCmd + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_InjectedDiscModeCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_ExternalTrigInjectedConvConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_adc.o + .text.ADC_ExternalTrigInjectedConvCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_SoftwareStartInjectedConvCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_GetSoftwareStartInjectedConvCmdStatus + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_InjectedChannelConfig + 0x0000000000000000 0x7a ./Peripheral/src/ch32v30x_adc.o + .text.ADC_InjectedSequencerLengthConfig + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_SetInjectedOffset + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_GetInjectedConversionValue + 0x0000000000000000 0x1c ./Peripheral/src/ch32v30x_adc.o + .text.ADC_AnalogWatchdogCmd + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_AnalogWatchdogThresholdsConfig + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_AnalogWatchdogSingleChannelConfig + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_adc.o + .text.ADC_ClearFlag + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_adc.o + .text.ADC_GetITStatus + 0x0000000000000000 0x1c ./Peripheral/src/ch32v30x_adc.o + .text.ADC_ClearITPendingBit + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_adc.o + .text.TempSensor_Volt_To_Temper + 0x0000000000000000 0x28 ./Peripheral/src/ch32v30x_adc.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_bkp.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_bkp.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_TamperPinLevelConfig + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_TamperPinCmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_ITConfig + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_RTCOutputConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_SetRTCCalibrationValue + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_ReadBackupRegister + 0x0000000000000000 0x1c ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_GetFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_ClearFlag + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_GetITStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_bkp.o + .text.BKP_ClearITPendingBit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_bkp.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_can.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_can.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_can.o + .text.CAN_DeInit + 0x0000000000000000 0x4c ./Peripheral/src/ch32v30x_can.o + .text.CAN_FilterInit + 0x0000000000000000 0xee ./Peripheral/src/ch32v30x_can.o + .text.CAN_StructInit + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_can.o + .text.CAN_SlaveStartBank + 0x0000000000000000 0x38 ./Peripheral/src/ch32v30x_can.o + .text.CAN_Init + 0x0000000000000000 0x2e4 ./Peripheral/src/ch32v30x_can.o + .text.CAN_DBGFreeze + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_can.o + .text.CAN_TTComModeCmd + 0x0000000000000000 0x58 ./Peripheral/src/ch32v30x_can.o + .text.CAN_Transmit + 0x0000000000000000 0xbc ./Peripheral/src/ch32v30x_can.o + .text.CAN_TransmitStatus + 0x0000000000000000 0x62 ./Peripheral/src/ch32v30x_can.o + .text.CAN_CancelTransmit + 0x0000000000000000 0x2a ./Peripheral/src/ch32v30x_can.o + .text.CAN_Receive + 0x0000000000000000 0x8c ./Peripheral/src/ch32v30x_can.o + .text.CAN_FIFORelease + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_can.o + .text.CAN_MessagePending + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_can.o + .text.CAN_OperatingModeRequest + 0x0000000000000000 0x72 ./Peripheral/src/ch32v30x_can.o + .text.CAN_Sleep + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_can.o + .text.CAN_WakeUp + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_can.o + .text.CAN_GetLastErrorCode + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_can.o + .text.CAN_GetReceiveErrorCounter + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_can.o + .text.CAN_GetLSBTransmitErrorCounter + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_can.o + .text.CAN_ITConfig + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_can.o + .text.CAN_GetFlagStatus + 0x0000000000000000 0x56 ./Peripheral/src/ch32v30x_can.o + .text.CAN_ClearFlag + 0x0000000000000000 0x40 ./Peripheral/src/ch32v30x_can.o + .text.CAN_GetITStatus + 0x0000000000000000 0xd0 ./Peripheral/src/ch32v30x_can.o + .text.CAN_ClearITPendingBit + 0x0000000000000000 0x94 ./Peripheral/src/ch32v30x_can.o + .debug_info 0x0000000000000000 0x1860 ./Peripheral/src/ch32v30x_can.o + .debug_abbrev 0x0000000000000000 0x3fe ./Peripheral/src/ch32v30x_can.o + .debug_loc 0x0000000000000000 0xa45 ./Peripheral/src/ch32v30x_can.o + .debug_aranges + 0x0000000000000000 0xd8 ./Peripheral/src/ch32v30x_can.o + .debug_ranges 0x0000000000000000 0xf8 ./Peripheral/src/ch32v30x_can.o + .debug_line 0x0000000000000000 0x1f4f ./Peripheral/src/ch32v30x_can.o + .debug_str 0x0000000000000000 0xbeb ./Peripheral/src/ch32v30x_can.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_can.o + .debug_frame 0x0000000000000000 0x1b4 ./Peripheral/src/ch32v30x_can.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_crc.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_crc.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_crc.o + .text.CRC_ResetDR + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_crc.o + .text.CRC_CalcCRC + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_crc.o + .text.CRC_CalcBlockCRC + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_crc.o + .text.CRC_GetCRC + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_crc.o + .text.CRC_SetIDRegister + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_crc.o + .text.CRC_GetIDRegister + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_crc.o + .debug_info 0x0000000000000000 0xab3 ./Peripheral/src/ch32v30x_crc.o + .debug_abbrev 0x0000000000000000 0x25f ./Peripheral/src/ch32v30x_crc.o + .debug_loc 0x0000000000000000 0x75 ./Peripheral/src/ch32v30x_crc.o + .debug_aranges + 0x0000000000000000 0x48 ./Peripheral/src/ch32v30x_crc.o + .debug_ranges 0x0000000000000000 0x38 ./Peripheral/src/ch32v30x_crc.o + .debug_line 0x0000000000000000 0x419 ./Peripheral/src/ch32v30x_crc.o + .debug_str 0x0000000000000000 0x688 ./Peripheral/src/ch32v30x_crc.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_crc.o + .debug_frame 0x0000000000000000 0x70 ./Peripheral/src/ch32v30x_crc.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dac.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dac.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dac.o + .text.DAC_DeInit + 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_dac.o + .text.DAC_Init + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_dac.o + .text.DAC_StructInit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_dac.o + .text.DAC_Cmd 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_dac.o + .text.DAC_DMACmd + 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_dac.o + .text.DAC_SoftwareTriggerCmd + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_dac.o + .text.DAC_DualSoftwareTriggerCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_dac.o + .text.DAC_WaveGenerationCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_dac.o + .text.DAC_SetChannel1Data + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_dac.o + .text.DAC_SetChannel2Data + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_dac.o + .text.DAC_SetDualChannelData + 0x0000000000000000 0x1c ./Peripheral/src/ch32v30x_dac.o + .text.DAC_GetDataOutputValue + 0x0000000000000000 0x26 ./Peripheral/src/ch32v30x_dac.o + .debug_info 0x0000000000000000 0xdbd ./Peripheral/src/ch32v30x_dac.o + .debug_abbrev 0x0000000000000000 0x2fe ./Peripheral/src/ch32v30x_dac.o + .debug_loc 0x0000000000000000 0x23b ./Peripheral/src/ch32v30x_dac.o + .debug_aranges + 0x0000000000000000 0x78 ./Peripheral/src/ch32v30x_dac.o + .debug_ranges 0x0000000000000000 0x68 ./Peripheral/src/ch32v30x_dac.o + .debug_line 0x0000000000000000 0x848 ./Peripheral/src/ch32v30x_dac.o + .debug_str 0x0000000000000000 0x80c ./Peripheral/src/ch32v30x_dac.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_dac.o + .debug_frame 0x0000000000000000 0xf4 ./Peripheral/src/ch32v30x_dac.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dbgmcu.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dbgmcu.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dbgmcu.o + .text.DBGMCU_GetREVID + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_dbgmcu.o + .text.DBGMCU_GetDEVID + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_dbgmcu.o + .text.__get_DEBUG_CR + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_dbgmcu.o + .text.__set_DEBUG_CR + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_dbgmcu.o + .text.DBGMCU_Config + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_dbgmcu.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dma.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dma.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_DeInit + 0x0000000000000000 0x16c ./Peripheral/src/ch32v30x_dma.o + .text.DMA_Init + 0x0000000000000000 0x38 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_StructInit + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_dma.o + .text.DMA_Cmd 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_ITConfig + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_SetCurrDataCounter + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_GetCurrDataCounter + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_GetFlagStatus + 0x0000000000000000 0x32 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_ClearFlag + 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_dma.o + .text.DMA_GetITStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_dma.o + .text.DMA_ClearITPendingBit + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_dma.o + .debug_info 0x0000000000000000 0xd16 ./Peripheral/src/ch32v30x_dma.o + .debug_abbrev 0x0000000000000000 0x2fd ./Peripheral/src/ch32v30x_dma.o + .debug_loc 0x0000000000000000 0x19a ./Peripheral/src/ch32v30x_dma.o + .debug_aranges + 0x0000000000000000 0x60 ./Peripheral/src/ch32v30x_dma.o + .debug_ranges 0x0000000000000000 0x50 ./Peripheral/src/ch32v30x_dma.o + .debug_line 0x0000000000000000 0xa2f ./Peripheral/src/ch32v30x_dma.o + .debug_str 0x0000000000000000 0x800 ./Peripheral/src/ch32v30x_dma.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_dma.o + .debug_frame 0x0000000000000000 0xd8 ./Peripheral/src/ch32v30x_dma.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dvp.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dvp.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_dvp.o + .text.DVP_INTCfg + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_dvp.o + .text.DVP_Mode + 0x0000000000000000 0x32 ./Peripheral/src/ch32v30x_dvp.o + .text.DVP_Cfg 0x0000000000000000 0x62 ./Peripheral/src/ch32v30x_dvp.o + .debug_info 0x0000000000000000 0xbc5 ./Peripheral/src/ch32v30x_dvp.o + .debug_abbrev 0x0000000000000000 0x241 ./Peripheral/src/ch32v30x_dvp.o + .debug_loc 0x0000000000000000 0x74 ./Peripheral/src/ch32v30x_dvp.o + .debug_aranges + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_dvp.o + .debug_ranges 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_dvp.o + .debug_line 0x0000000000000000 0x48c ./Peripheral/src/ch32v30x_dvp.o + .debug_str 0x0000000000000000 0x749 ./Peripheral/src/ch32v30x_dvp.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_dvp.o + .debug_frame 0x0000000000000000 0x40 ./Peripheral/src/ch32v30x_dvp.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_eth.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_eth.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DeInit + 0x0000000000000000 0x28 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_StructInit + 0x0000000000000000 0xd8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_HandleTxPkt + 0x0000000000000000 0x8c ./Peripheral/src/ch32v30x_eth.o + .text.ETH_HandleRxPkt + 0x0000000000000000 0x9e ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetRxPktSize + 0x0000000000000000 0x32 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DropRxPkt + 0x0000000000000000 0x3c ./Peripheral/src/ch32v30x_eth.o + .text.ETH_ReadPHYRegister + 0x0000000000000000 0x58 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_WritePHYRegister + 0x0000000000000000 0x52 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_PHYLoopBackCmd + 0x0000000000000000 0x40 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACTransmissionCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACReceptionCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetFlowControlBusyStatus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_InitiatePauseControlFrame + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_BackPressureActivationCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetMACFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetMACITStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACITConfig + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACAddressConfig + 0x0000000000000000 0x32 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetMACAddress + 0x0000000000000000 0x32 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACAddressPerfectFilterCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACAddressFilterConfig + 0x0000000000000000 0x28 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MACAddressMaskBytesFilterConfig + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescChainInit + 0x0000000000000000 0x46 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescRingInit + 0x0000000000000000 0x44 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMATxDescFlagStatus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMATxDescCollisionCount + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetDMATxDescOwnBit + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescTransmitITConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescFrameSegmentConfig + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescChecksumInsertionConfig + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescCRCCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescEndOfRingCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescSecondAddressChainedCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescShortFramePaddingCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescTimeStampCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATxDescBufferSizeConfig + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMARxDescChainInit + 0x0000000000000000 0x50 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMARxDescRingInit + 0x0000000000000000 0x52 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMARxDescFlagStatus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetDMARxDescOwnBit + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMARxDescFrameLength + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMARxDescReceiveITConfig + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMARxDescEndOfRingCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMARxDescSecondAddressChainedCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMARxDescBufferSize + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SoftwareReset + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetSoftwareResetStatus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetlinkStaus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMAFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMAClearFlag + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMAITStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMAClearITPendingBit + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetTransmitProcessState + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetReceiveProcessState + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_FlushTransmitFIFO + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_Start + 0x0000000000000000 0x40 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetFlushTransmitFIFOStatus + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMATransmissionCmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMAReceptionCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMAITConfig + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetDMAOverflowStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetRxOverflowMissedFrameCounter + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetBufferUnavailableMissedFrameCounter + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetCurrentTxDescStartAddress + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetCurrentRxDescStartAddress + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetCurrentTxBufferAddress + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetCurrentRxBufferAddress + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_ResumeDMATransmission + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_ResumeDMAReception + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_ResetWakeUpFrameFilterRegisterPointer + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetWakeUpFrameFilterRegister + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GlobalUnicastWakeUpCmd + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetPMTFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_WakeUpFrameDetectionCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MagicPacketDetectionCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_PowerDownCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MMCCounterFreezeCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MMCResetOnReadCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MMCCounterRolloverCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MMCCountersReset + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_MMCITConfig + 0x0000000000000000 0x5c ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetMMCITStatus + 0x0000000000000000 0x3a ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetMMCRegister + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_EnablePTPTimeStampAddend + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_EnablePTPTimeStampInterruptTrigger + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_EnablePTPTimeStampUpdate + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_InitializePTPTimeStamp + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_PTPUpdateMethodConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_PTPTimeStampCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetPTPFlagStatus + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetPTPSubSecondIncrement + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetPTPTimeStampUpdate + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetPTPTimeStampAddend + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_SetPTPTargetTime + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_eth.o + .text.ETH_GetPTPRegister + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMAPTPTxDescChainInit + 0x0000000000000000 0x66 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_DMAPTPRxDescChainInit + 0x0000000000000000 0x70 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_HandlePTPTxPkt + 0x0000000000000000 0xe6 ./Peripheral/src/ch32v30x_eth.o + .text.ETH_HandlePTPRxPkt + 0x0000000000000000 0xd0 ./Peripheral/src/ch32v30x_eth.o + .text.RGMII_TXC_Delay + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_eth.o + .sbss.DMAPTPRxDescToGet + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_eth.o + .sbss.DMAPTPTxDescToSet + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_eth.o + .sbss.DMARxDescToGet + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_eth.o + .sbss.DMATxDescToSet + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_eth.o + .debug_info 0x0000000000000000 0x270c ./Peripheral/src/ch32v30x_eth.o + .debug_abbrev 0x0000000000000000 0x47b ./Peripheral/src/ch32v30x_eth.o + .debug_loc 0x0000000000000000 0xef1 ./Peripheral/src/ch32v30x_eth.o + .debug_aranges + 0x0000000000000000 0x300 ./Peripheral/src/ch32v30x_eth.o + .debug_ranges 0x0000000000000000 0x368 ./Peripheral/src/ch32v30x_eth.o + .debug_line 0x0000000000000000 0x328e ./Peripheral/src/ch32v30x_eth.o + .debug_str 0x0000000000000000 0x191d ./Peripheral/src/ch32v30x_eth.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_eth.o + .debug_frame 0x0000000000000000 0x6a4 ./Peripheral/src/ch32v30x_eth.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_exti.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_exti.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_DeInit + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_Init + 0x0000000000000000 0x6a ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_StructInit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_GenerateSWInterrupt + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_GetFlagStatus + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_ClearFlag + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_GetITStatus + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_exti.o + .text.EXTI_ClearITPendingBit + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_exti.o + .debug_info 0x0000000000000000 0xc0d ./Peripheral/src/ch32v30x_exti.o + .debug_abbrev 0x0000000000000000 0x2da ./Peripheral/src/ch32v30x_exti.o + .debug_loc 0x0000000000000000 0x181 ./Peripheral/src/ch32v30x_exti.o + .debug_aranges + 0x0000000000000000 0x50 ./Peripheral/src/ch32v30x_exti.o + .debug_ranges 0x0000000000000000 0x40 ./Peripheral/src/ch32v30x_exti.o + .debug_line 0x0000000000000000 0x634 ./Peripheral/src/ch32v30x_exti.o + .debug_str 0x0000000000000000 0x79a ./Peripheral/src/ch32v30x_exti.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_exti.o + .debug_frame 0x0000000000000000 0x90 ./Peripheral/src/ch32v30x_exti.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_flash.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_flash.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_flash.o + .text.ROM_ERASE + 0x0000000000000000 0xa0 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_Unlock + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_UnlockBank1 + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_Lock + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_LockBank1 + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_GetUserOptionByte + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_GetWriteProtectionOptionByte + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_GetReadOutProtectionStatus + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ITConfig + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_GetFlagStatus + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ClearFlag + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_GetStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_GetBank1Status + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_WaitForLastOperation + 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ErasePage + 0x0000000000000000 0x4c ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_EraseAllPages + 0x0000000000000000 0x56 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_EraseAllBank1Pages + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_EraseOptionBytes + 0x0000000000000000 0xe6 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ProgramWord + 0x0000000000000000 0x68 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ProgramHalfWord + 0x0000000000000000 0x48 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ProgramOptionByteData + 0x0000000000000000 0x11a ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_EnableWriteProtection + 0x0000000000000000 0x106 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ReadOutProtection + 0x0000000000000000 0xf4 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_UserOptionByteConfig + 0x0000000000000000 0x110 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_WaitForLastBank1Operation + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_Unlock_Fast + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_Lock_Fast + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ErasePage_Fast + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_EraseBlock_32K_Fast + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ProgramPage_Fast + 0x0000000000000000 0x64 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_Access_Clock_Cfg + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_Enhance_Mode + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ROM_ERASE + 0x0000000000000000 0x1a4 ./Peripheral/src/ch32v30x_flash.o + .text.FLASH_ROM_WRITE + 0x0000000000000000 0xce ./Peripheral/src/ch32v30x_flash.o + .debug_info 0x0000000000000000 0x15c3 ./Peripheral/src/ch32v30x_flash.o + .debug_abbrev 0x0000000000000000 0x496 ./Peripheral/src/ch32v30x_flash.o + .debug_loc 0x0000000000000000 0xcca ./Peripheral/src/ch32v30x_flash.o + .debug_aranges + 0x0000000000000000 0x108 ./Peripheral/src/ch32v30x_flash.o + .debug_ranges 0x0000000000000000 0x110 ./Peripheral/src/ch32v30x_flash.o + .debug_line 0x0000000000000000 0x24f1 ./Peripheral/src/ch32v30x_flash.o + .debug_str 0x0000000000000000 0xb0b ./Peripheral/src/ch32v30x_flash.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_flash.o + .debug_frame 0x0000000000000000 0x370 ./Peripheral/src/ch32v30x_flash.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_fsmc.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_fsmc.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NORSRAMDeInit + 0x0000000000000000 0x3c ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NANDDeInit + 0x0000000000000000 0x26 ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NORSRAMInit + 0x0000000000000000 0xaa ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NANDInit + 0x0000000000000000 0x84 ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NORSRAMStructInit + 0x0000000000000000 0x58 ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NANDStructInit + 0x0000000000000000 0x36 ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NORSRAMCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NANDCmd + 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_NANDECCCmd + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_GetECC + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_fsmc.o + .text.FSMC_GetFlagStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_fsmc.o + .debug_info 0x0000000000000000 0xefb ./Peripheral/src/ch32v30x_fsmc.o + .debug_abbrev 0x0000000000000000 0x2d9 ./Peripheral/src/ch32v30x_fsmc.o + .debug_loc 0x0000000000000000 0x2ae ./Peripheral/src/ch32v30x_fsmc.o + .debug_aranges + 0x0000000000000000 0x70 ./Peripheral/src/ch32v30x_fsmc.o + .debug_ranges 0x0000000000000000 0x60 ./Peripheral/src/ch32v30x_fsmc.o + .debug_line 0x0000000000000000 0xc5a ./Peripheral/src/ch32v30x_fsmc.o + .debug_str 0x0000000000000000 0xa5f ./Peripheral/src/ch32v30x_fsmc.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_fsmc.o + .debug_frame 0x0000000000000000 0xc0 ./Peripheral/src/ch32v30x_fsmc.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_gpio.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_gpio.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_DeInit + 0x0000000000000000 0xa4 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_AFIODeInit + 0x0000000000000000 0x28 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_StructInit + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_ReadInputData + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_ReadOutputDataBit + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_ReadOutputData + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_SetBits + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_ResetBits + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_Write + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_PinLockConfig + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_EventOutputConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_EventOutputCmd + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_PinRemapConfig + 0x0000000000000000 0xd6 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_EXTILineConfig + 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_ETH_MediaInterfaceConfig + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_gpio.o + .text.GPIO_IPD_Unused + 0x0000000000000000 0x23c ./Peripheral/src/ch32v30x_gpio.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_i2c.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_i2c.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_DeInit + 0x0000000000000000 0x4c ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_Init + 0x0000000000000000 0x10c ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_StructInit + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_Cmd 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_DMACmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_DMALastTransferCmd + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GenerateSTART + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GenerateSTOP + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_AcknowledgeConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_OwnAddress2Config + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_DualAddressCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GeneralCallCmd + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_ITConfig + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_SendData + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_ReceiveData + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_Send7bitAddress + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_ReadRegister + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_SoftwareResetCmd + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_NACKPositionConfig + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_SMBusAlertConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_TransmitPEC + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_PECPositionConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_CalculatePEC + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GetPEC + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_ARPCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_StretchClockCmd + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_FastModeDutyCycleConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_CheckEvent + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GetLastEvent + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GetFlagStatus + 0x0000000000000000 0x32 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_ClearFlag + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_GetITStatus + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_i2c.o + .text.I2C_ClearITPendingBit + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_i2c.o + .debug_info 0x0000000000000000 0x1481 ./Peripheral/src/ch32v30x_i2c.o + .debug_abbrev 0x0000000000000000 0x3a7 ./Peripheral/src/ch32v30x_i2c.o + .debug_loc 0x0000000000000000 0x6cc ./Peripheral/src/ch32v30x_i2c.o + .debug_aranges + 0x0000000000000000 0x110 ./Peripheral/src/ch32v30x_i2c.o + .debug_ranges 0x0000000000000000 0x100 ./Peripheral/src/ch32v30x_i2c.o + .debug_line 0x0000000000000000 0x1197 ./Peripheral/src/ch32v30x_i2c.o + .debug_str 0x0000000000000000 0xaed ./Peripheral/src/ch32v30x_i2c.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_i2c.o + .debug_frame 0x0000000000000000 0x264 ./Peripheral/src/ch32v30x_i2c.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_iwdg.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_iwdg.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_iwdg.o + .text.IWDG_WriteAccessCmd + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_iwdg.o + .text.IWDG_SetPrescaler + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_iwdg.o + .text.IWDG_SetReload + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_iwdg.o + .text.IWDG_ReloadCounter + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_iwdg.o + .text.IWDG_Enable + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_iwdg.o + .text.IWDG_GetFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_iwdg.o + .debug_info 0x0000000000000000 0xb74 ./Peripheral/src/ch32v30x_iwdg.o + .debug_abbrev 0x0000000000000000 0x282 ./Peripheral/src/ch32v30x_iwdg.o + .debug_loc 0x0000000000000000 0x68 ./Peripheral/src/ch32v30x_iwdg.o + .debug_aranges + 0x0000000000000000 0x48 ./Peripheral/src/ch32v30x_iwdg.o + .debug_ranges 0x0000000000000000 0x38 ./Peripheral/src/ch32v30x_iwdg.o + .debug_line 0x0000000000000000 0x453 ./Peripheral/src/ch32v30x_iwdg.o + .debug_str 0x0000000000000000 0x711 ./Peripheral/src/ch32v30x_iwdg.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_iwdg.o + .debug_frame 0x0000000000000000 0x70 ./Peripheral/src/ch32v30x_iwdg.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_misc.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_misc.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_misc.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_opa.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_opa.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_opa.o + .text.OPA_DeInit + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_opa.o + .text.OPA_Init + 0x0000000000000000 0x36 ./Peripheral/src/ch32v30x_opa.o + .text.OPA_StructInit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_opa.o + .text.OPA_Cmd 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_opa.o + .debug_info 0x0000000000000000 0xb28 ./Peripheral/src/ch32v30x_opa.o + .debug_abbrev 0x0000000000000000 0x252 ./Peripheral/src/ch32v30x_opa.o + .debug_loc 0x0000000000000000 0x56 ./Peripheral/src/ch32v30x_opa.o + .debug_aranges + 0x0000000000000000 0x38 ./Peripheral/src/ch32v30x_opa.o + .debug_ranges 0x0000000000000000 0x28 ./Peripheral/src/ch32v30x_opa.o + .debug_line 0x0000000000000000 0x4bc ./Peripheral/src/ch32v30x_opa.o + .debug_str 0x0000000000000000 0x6c8 ./Peripheral/src/ch32v30x_opa.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_opa.o + .debug_frame 0x0000000000000000 0x50 ./Peripheral/src/ch32v30x_opa.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_pwr.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_pwr.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_DeInit + 0x0000000000000000 0x2c ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_PVDCmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_PVDLevelConfig + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_WakeUpPinCmd + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTOPMode + 0x0000000000000000 0x7c ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTANDBYMode + 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_GetFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_ClearFlag + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTANDBYMode_RAM + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTANDBYMode_RAM_LV + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTANDBYMode_RAM_VBAT_EN + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTANDBYMode_RAM_LV_VBAT_EN + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_pwr.o + .text.PWR_EnterSTOPMode_RAM_LV + 0x0000000000000000 0x82 ./Peripheral/src/ch32v30x_pwr.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rcc.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rcc.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_DeInit + 0x0000000000000000 0x52 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_HSEConfig + 0x0000000000000000 0x3c ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_AdjustHSICalibrationValue + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_HSICmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PLLConfig + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PLLCmd + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_SYSCLKConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_GetSYSCLKSource + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_HCLKConfig + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PCLK1Config + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PCLK2Config + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ITConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_LSICmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_AHBPeriphClockCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_APB1PeriphResetCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ClockSecuritySystemCmd + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_MCOConfig + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_WaitForHSEStartUp + 0x0000000000000000 0x42 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ClearFlag + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_GetITStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ClearITPendingBit + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PREDIV1Config + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PREDIV2Config + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PLL2Config + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PLL2Cmd + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PLL3Config + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_PLL3Cmd + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_USBFSCLKConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_I2S2CLKConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_I2S3CLKConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_AHBPeriphResetCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ADCCLKADJcmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_RNGCLKConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ETH1GCLKConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_ETH1G_125Mcmd + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_USBHSConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_USBHSPLLCLKConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_USBHSPLLCKREFCLKConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_USBHSPHYPLLALIVEcmd + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_rcc.o + .text.RCC_USBCLK48MConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_rcc.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rng.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rng.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rng.o + .text.RNG_Cmd 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_rng.o + .text.RNG_GetRandomNumber + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_rng.o + .text.RNG_ITConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_rng.o + .text.RNG_GetFlagStatus + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_rng.o + .text.RNG_ClearFlag + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_rng.o + .text.RNG_GetITStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_rng.o + .text.RNG_ClearITPendingBit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_rng.o + .debug_info 0x0000000000000000 0xb02 ./Peripheral/src/ch32v30x_rng.o + .debug_abbrev 0x0000000000000000 0x2c8 ./Peripheral/src/ch32v30x_rng.o + .debug_loc 0x0000000000000000 0xa8 ./Peripheral/src/ch32v30x_rng.o + .debug_aranges + 0x0000000000000000 0x48 ./Peripheral/src/ch32v30x_rng.o + .debug_ranges 0x0000000000000000 0x38 ./Peripheral/src/ch32v30x_rng.o + .debug_line 0x0000000000000000 0x489 ./Peripheral/src/ch32v30x_rng.o + .debug_str 0x0000000000000000 0x699 ./Peripheral/src/ch32v30x_rng.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_rng.o + .debug_frame 0x0000000000000000 0x8c ./Peripheral/src/ch32v30x_rng.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rtc.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rtc.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_rtc.o + .text.RTC_SetAlarm + 0x0000000000000000 0x3c ./Peripheral/src/ch32v30x_rtc.o + .text.RTC_GetDivider + 0x0000000000000000 0x60 ./Peripheral/src/ch32v30x_rtc.o + .text.RTC_GetFlagStatus + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_rtc.o + .text.RTC_GetITStatus + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_rtc.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_sdio.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_sdio.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_DeInit + 0x0000000000000000 0x30 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_Init + 0x0000000000000000 0x2a ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_StructInit + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_ClockCmd + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_SetPowerState + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetPowerState + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_ITConfig + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_DMACmd + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_SendCommand + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_CmdStructInit + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetCommandResponse + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetResponse + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_DataConfig + 0x0000000000000000 0x26 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_DataStructInit + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetDataCounter + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_ReadData + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_WriteData + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetFIFOCount + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_StartSDIOReadWait + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_StopSDIOReadWait + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_SetSDIOReadWaitMode + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_SetSDIOOperation + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_SendSDIOSuspendCmd + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_CommandCompletionCmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_CEATAITCmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_SendCEATACmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetFlagStatus + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_ClearFlag + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_GetITStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_sdio.o + .text.SDIO_ClearITPendingBit + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_sdio.o + .debug_info 0x0000000000000000 0x10fd ./Peripheral/src/ch32v30x_sdio.o + .debug_abbrev 0x0000000000000000 0x385 ./Peripheral/src/ch32v30x_sdio.o + .debug_loc 0x0000000000000000 0x1bb ./Peripheral/src/ch32v30x_sdio.o + .debug_aranges + 0x0000000000000000 0xf8 ./Peripheral/src/ch32v30x_sdio.o + .debug_ranges 0x0000000000000000 0xe8 ./Peripheral/src/ch32v30x_sdio.o + .debug_line 0x0000000000000000 0xcf9 ./Peripheral/src/ch32v30x_sdio.o + .debug_str 0x0000000000000000 0xa7c ./Peripheral/src/ch32v30x_sdio.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_sdio.o + .debug_frame 0x0000000000000000 0x204 ./Peripheral/src/ch32v30x_sdio.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_spi.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_spi.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_I2S_DeInit + 0x0000000000000000 0x70 ./Peripheral/src/ch32v30x_spi.o + .text.I2S_Init + 0x0000000000000000 0xc6 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_StructInit + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_spi.o + .text.I2S_StructInit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_spi.o + .text.I2S_Cmd 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_spi.o + .text.SPI_I2S_ITConfig + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_spi.o + .text.SPI_I2S_DMACmd + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_NSSInternalSoftwareConfig + 0x0000000000000000 0x24 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_SSOutputCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_DataSizeConfig + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_TransmitCRC + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_spi.o + .text.SPI_CalculateCRC + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_GetCRC + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_GetCRCPolynomial + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_BiDirectionalLineConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_spi.o + .text.SPI_I2S_ClearFlag + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_spi.o + .text.SPI_I2S_GetITStatus + 0x0000000000000000 0x28 ./Peripheral/src/ch32v30x_spi.o + .text.SPI_I2S_ClearITPendingBit + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_spi.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_tim.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_tim.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_tim.o + .text.TI1_Config + 0x0000000000000000 0x36 ./Peripheral/src/ch32v30x_tim.o + .text.TI2_Config + 0x0000000000000000 0x44 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_DeInit + 0x0000000000000000 0x138 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_TimeBaseInit + 0x0000000000000000 0xee ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC1Init + 0x0000000000000000 0x82 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC2Init + 0x0000000000000000 0xae ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC3Init + 0x0000000000000000 0xac ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC4Init + 0x0000000000000000 0x88 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_BDTRConfig + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_TimeBaseStructInit + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OCStructInit + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ICStructInit + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_BDTRStructInit + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_tim.o + .text.TIM_Cmd 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_CtrlPWMOutputs + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ITConfig + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GenerateEvent + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_DMAConfig + 0x0000000000000000 0x8 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_DMACmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_InternalClockConfig + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ITRxExternalClockConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_TIxExternalClockConfig + 0x0000000000000000 0x48 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ETRConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ETRClockMode1Config + 0x0000000000000000 0x2a ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ETRClockMode2Config + 0x0000000000000000 0x22 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_PrescalerConfig + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_CounterModeConfig + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectInputTrigger + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_EncoderInterfaceConfig + 0x0000000000000000 0x3c ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ForcedOC1Config + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ForcedOC2Config + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ForcedOC3Config + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ForcedOC4Config + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ARRPreloadConfig + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectCOM + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectCCDMA + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_CCPreloadControl + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC1PreloadConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC2PreloadConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC3PreloadConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC4PreloadConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC1FastConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC2FastConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC3FastConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC4FastConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ClearOC1Ref + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ClearOC2Ref + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ClearOC3Ref + 0x0000000000000000 0x10 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ClearOC4Ref + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC1PolarityConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC1NPolarityConfig + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC2PolarityConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC2NPolarityConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC3PolarityConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC3NPolarityConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_OC4PolarityConfig + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_CCxCmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_CCxNCmd + 0x0000000000000000 0x20 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectOCxM + 0x0000000000000000 0x4c ./Peripheral/src/ch32v30x_tim.o + .text.TIM_UpdateDisableConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_UpdateRequestConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectHallSensor + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectOnePulseMode + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectOutputTrigger + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectSlaveMode + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SelectMasterSlaveMode + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetCounter + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetAutoreload + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetCompare1 + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetCompare2 + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetCompare3 + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetCompare4 + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetIC1Prescaler + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetIC2Prescaler + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_tim.o + .text.TIM_PWMIConfig + 0x0000000000000000 0x92 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetIC3Prescaler + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetIC4Prescaler + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ICInit + 0x0000000000000000 0xfa ./Peripheral/src/ch32v30x_tim.o + .text.TIM_SetClockDivision + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetCapture1 + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetCapture2 + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetCapture3 + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetCapture4 + 0x0000000000000000 0x6 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetCounter + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetPrescaler + 0x0000000000000000 0x4 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetFlagStatus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ClearFlag + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_tim.o + .text.TIM_GetITStatus + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_tim.o + .text.TIM_ClearITPendingBit + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_tim.o + .debug_info 0x0000000000000000 0x2a54 ./Peripheral/src/ch32v30x_tim.o + .debug_abbrev 0x0000000000000000 0x3ff ./Peripheral/src/ch32v30x_tim.o + .debug_loc 0x0000000000000000 0x18b7 ./Peripheral/src/ch32v30x_tim.o + .debug_aranges + 0x0000000000000000 0x2d0 ./Peripheral/src/ch32v30x_tim.o + .debug_ranges 0x0000000000000000 0x2c0 ./Peripheral/src/ch32v30x_tim.o + .debug_line 0x0000000000000000 0x31cd ./Peripheral/src/ch32v30x_tim.o + .debug_str 0x0000000000000000 0x129b ./Peripheral/src/ch32v30x_tim.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_tim.o + .debug_frame 0x0000000000000000 0x614 ./Peripheral/src/ch32v30x_tim.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_usart.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_usart.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_usart.o + .text.USART_DeInit + 0x0000000000000000 0x112 ./Peripheral/src/ch32v30x_usart.o + .text.USART_StructInit + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_ClockInit + 0x0000000000000000 0x1e ./Peripheral/src/ch32v30x_usart.o + .text.USART_ClockStructInit + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_usart.o + .text.USART_ITConfig + 0x0000000000000000 0x36 ./Peripheral/src/ch32v30x_usart.o + .text.USART_DMACmd + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_usart.o + .text.USART_SetAddress + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_usart.o + .text.USART_WakeUpConfig + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_usart.o + .text.USART_ReceiverWakeUpCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_LINBreakDetectLengthConfig + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_LINCmd + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_usart.o + .text.USART_SendBreak + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_usart.o + .text.USART_SetGuardTime + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_usart.o + .text.USART_SetPrescaler + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_SmartCardCmd + 0x0000000000000000 0x1a ./Peripheral/src/ch32v30x_usart.o + .text.USART_SmartCardNACKCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_HalfDuplexCmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_IrDAConfig + 0x0000000000000000 0x16 ./Peripheral/src/ch32v30x_usart.o + .text.USART_IrDACmd + 0x0000000000000000 0x18 ./Peripheral/src/ch32v30x_usart.o + .text.USART_ClearFlag + 0x0000000000000000 0xc ./Peripheral/src/ch32v30x_usart.o + .text.USART_GetITStatus + 0x0000000000000000 0x3c ./Peripheral/src/ch32v30x_usart.o + .text.USART_ClearITPendingBit + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_usart.o + .text 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_wwdg.o + .data 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_wwdg.o + .bss 0x0000000000000000 0x0 ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_DeInit + 0x0000000000000000 0x2e ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_SetPrescaler + 0x0000000000000000 0x14 ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_SetWindowValue + 0x0000000000000000 0x26 ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_EnableIT + 0x0000000000000000 0x12 ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_SetCounter + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_Enable + 0x0000000000000000 0xe ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_GetFlagStatus + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_wwdg.o + .text.WWDG_ClearFlag + 0x0000000000000000 0xa ./Peripheral/src/ch32v30x_wwdg.o + .debug_info 0x0000000000000000 0xb28 ./Peripheral/src/ch32v30x_wwdg.o + .debug_abbrev 0x0000000000000000 0x29d ./Peripheral/src/ch32v30x_wwdg.o + .debug_loc 0x0000000000000000 0xae ./Peripheral/src/ch32v30x_wwdg.o + .debug_aranges + 0x0000000000000000 0x58 ./Peripheral/src/ch32v30x_wwdg.o + .debug_ranges 0x0000000000000000 0x48 ./Peripheral/src/ch32v30x_wwdg.o + .debug_line 0x0000000000000000 0x4f7 ./Peripheral/src/ch32v30x_wwdg.o + .debug_str 0x0000000000000000 0x6bf ./Peripheral/src/ch32v30x_wwdg.o + .comment 0x0000000000000000 0x34 ./Peripheral/src/ch32v30x_wwdg.o + .debug_frame 0x0000000000000000 0xa4 ./Peripheral/src/ch32v30x_wwdg.o + .text 0x0000000000000000 0x0 ./Debug/debug.o + .data 0x0000000000000000 0x0 ./Debug/debug.o + .bss 0x0000000000000000 0x0 ./Debug/debug.o + .text.Delay_Us + 0x0000000000000000 0x3a ./Debug/debug.o + .text.USART_Printf_Init + 0x0000000000000000 0x72 ./Debug/debug.o + .text.SDI_Printf_Enable + 0x0000000000000000 0x2a ./Debug/debug.o + .text 0x0000000000000000 0x0 ./Core/core_riscv.o + .data 0x0000000000000000 0x0 ./Core/core_riscv.o + .bss 0x0000000000000000 0x0 ./Core/core_riscv.o + .text.__get_FFLAGS + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_FFLAGS + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_FRM + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_FRM + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_FCSR + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_FCSR + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MSTATUS + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MSTATUS + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MISA + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MISA + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MTVEC + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MTVEC + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MSCRATCH + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MSCRATCH + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MEPC + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MEPC + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MCAUSE + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MCAUSE + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MTVAL + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__set_MTVAL + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MVENDORID + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MARCHID + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MIMPID + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_MHARTID + 0x0000000000000000 0x6 ./Core/core_riscv.o + .text.__get_SP + 0x0000000000000000 0x4 ./Core/core_riscv.o + .debug_info 0x0000000000000000 0x46d ./Core/core_riscv.o + .debug_abbrev 0x0000000000000000 0x10d ./Core/core_riscv.o + .debug_aranges + 0x0000000000000000 0xe0 ./Core/core_riscv.o + .debug_ranges 0x0000000000000000 0xd0 ./Core/core_riscv.o + .debug_line 0x0000000000000000 0x580 ./Core/core_riscv.o + .debug_str 0x0000000000000000 0x2ed ./Core/core_riscv.o + .comment 0x0000000000000000 0x34 ./Core/core_riscv.o + .debug_frame 0x0000000000000000 0x1a0 ./Core/core_riscv.o + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_lshrdi3.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_lshrdi3.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_lshrdi3.o) + .text.__lshrdi3 + 0x0000000000000000 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_lshrdi3.o) + .debug_frame 0x0000000000000000 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_lshrdi3.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_ashldi3.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_ashldi3.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_ashldi3.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) + .text.__divdi3 + 0x0000000000000000 0x3d4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) + .eh_frame 0x0000000000000000 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_divdi3.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_udivdi3.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_udivdi3.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_udivdi3.o) + .eh_frame 0x0000000000000000 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_udivdi3.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_umoddi3.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_umoddi3.o) + .text.__umoddi3 + 0x0000000000000000 0x38a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_umoddi3.o) + .eh_frame 0x0000000000000000 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_umoddi3.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(save-restore.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(save-restore.o) + .eh_frame 0x0000000000000000 0xf8 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(save-restore.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_clz.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_clz.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_clz.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + .text._atoi_r 0x0000000000000000 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .text._setlocale_r + 0x0000000000000000 0x64 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .text.__locale_mb_cur_max + 0x0000000000000000 0x1c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .text.setlocale + 0x0000000000000000 0x16 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .sbss._PathLocale + 0x0000000000000000 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + .text.free 0x0000000000000000 0x14 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + .text._mbtowc_r + 0x0000000000000000 0x1c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcmp.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcmp.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcmp.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcpy.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcpy.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcpy.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memmove.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memmove.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memmove.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memset.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + .text._printf_r + 0x0000000000000000 0x40 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + .text._putchar_r + 0x0000000000000000 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + .text.srand 0x0000000000000000 0x60 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text._init_signal_r + 0x0000000000000000 0x3e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text._signal_r + 0x0000000000000000 0x48 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text.__sigtramp_r + 0x0000000000000000 0x5a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text.signal 0x0000000000000000 0x16 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text._init_signal + 0x0000000000000000 0x12 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text.__sigtramp + 0x0000000000000000 0x14 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + .text._snprintf_r + 0x0000000000000000 0x6a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + .text._sprintf_r + 0x0000000000000000 0x40 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcat.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcat.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcmp.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcmp.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcpy.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcpy.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcpy.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strlen.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strlen.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strlen.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strncpy.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strncpy.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strncpy.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .text._strtol_r + 0x0000000000000000 0x1e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .text.strtol_l + 0x0000000000000000 0x1a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + .text.__swbuf 0x0000000000000000 0x16 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + .text._wctomb_r + 0x0000000000000000 0x1c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-ctype_.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-ctype_.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-ctype_.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + .text.fflush 0x0000000000000000 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__fp_lock + 0x0000000000000000 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__fp_unlock + 0x0000000000000000 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text._cleanup + 0x0000000000000000 0x12 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__sfp_lock_acquire + 0x0000000000000000 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__sfp_lock_release + 0x0000000000000000 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__sinit_lock_acquire + 0x0000000000000000 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__sinit_lock_release + 0x0000000000000000 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__fp_lock_all + 0x0000000000000000 0x1a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text.__fp_unlock_all + 0x0000000000000000 0x1a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + .text._fwalk 0x0000000000000000 0x60 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + .text.__ssprint_r + 0x0000000000000000 0x13e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .text.__sprint_r + 0x0000000000000000 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .text.vfprintf + 0x0000000000000000 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + .text.putc 0x0000000000000000 0x16 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + .text.cleanup_glue + 0x0000000000000000 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + .text._reclaim_reent + 0x0000000000000000 0x10c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + .text.__seofread + 0x0000000000000000 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-writer.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-writer.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-writer.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fvwrite.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fvwrite.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fvwrite.o) + .text.__sfvwrite_r + 0x0000000000000000 0x306 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fvwrite.o) + .debug_frame 0x0000000000000000 0x60 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fvwrite.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memchr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memchr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memchr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-msizer.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-msizer.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-msizer.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + .text 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(_exit.o) + .data 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(_exit.o) + .bss 0x0000000000000000 0x0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(_exit.o) + +Memory Configuration + +Name Origin Length Attributes +FLASH 0x0000000000000000 0x0000000000048000 xr +RAM 0x0000000020000000 0x0000000000008000 xrw +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD ./User/util/hexdump.o +LOAD ./User/meshcore/packets/ack.o +LOAD ./User/meshcore/packets/advert.o +LOAD ./User/meshcore/packets/anonymous.o +LOAD ./User/meshcore/packets/control.o +LOAD ./User/meshcore/packets/custom.o +LOAD ./User/meshcore/packets/encrypted.o +LOAD ./User/meshcore/packets/group.o +LOAD ./User/meshcore/packets/multipart.o +LOAD ./User/meshcore/packets/trace.o +LOAD ./User/meshcore/meshcore.o +LOAD ./User/meshcore/meshframing.o +LOAD ./User/meshcore/stats.o +LOAD ./User/lib/telemetry/telemetry.o +LOAD ./User/lib/rtc/rtc.o +LOAD ./User/lib/monocypher/monocypher-ed25519.o +LOAD ./User/lib/monocypher/monocypher.o +LOAD ./User/lib/cifra/aes.o +LOAD ./User/lib/cifra/blockwise.o +LOAD ./User/lib/cifra/chash.o +LOAD ./User/lib/cifra/hmac.o +LOAD ./User/lib/cifra/sha256.o +LOAD ./User/lib/adc/temperature.o +LOAD ./User/lib/base64.o +LOAD ./User/lib/config.o +LOAD ./User/ch32v30x_it.o +LOAD ./User/main.o +LOAD ./User/sx1262.o +LOAD ./User/system_ch32v30x.o +LOAD ./Startup/startup_ch32v30x_D8C.o +LOAD ./Peripheral/src/ch32v30x_adc.o +LOAD ./Peripheral/src/ch32v30x_bkp.o +LOAD ./Peripheral/src/ch32v30x_can.o +LOAD ./Peripheral/src/ch32v30x_crc.o +LOAD ./Peripheral/src/ch32v30x_dac.o +LOAD ./Peripheral/src/ch32v30x_dbgmcu.o +LOAD ./Peripheral/src/ch32v30x_dma.o +LOAD ./Peripheral/src/ch32v30x_dvp.o +LOAD ./Peripheral/src/ch32v30x_eth.o +LOAD ./Peripheral/src/ch32v30x_exti.o +LOAD ./Peripheral/src/ch32v30x_flash.o +LOAD ./Peripheral/src/ch32v30x_fsmc.o +LOAD ./Peripheral/src/ch32v30x_gpio.o +LOAD ./Peripheral/src/ch32v30x_i2c.o +LOAD ./Peripheral/src/ch32v30x_iwdg.o +LOAD ./Peripheral/src/ch32v30x_misc.o +LOAD ./Peripheral/src/ch32v30x_opa.o +LOAD ./Peripheral/src/ch32v30x_pwr.o +LOAD ./Peripheral/src/ch32v30x_rcc.o +LOAD ./Peripheral/src/ch32v30x_rng.o +LOAD ./Peripheral/src/ch32v30x_rtc.o +LOAD ./Peripheral/src/ch32v30x_sdio.o +LOAD ./Peripheral/src/ch32v30x_spi.o +LOAD ./Peripheral/src/ch32v30x_tim.o +LOAD ./Peripheral/src/ch32v30x_usart.o +LOAD ./Peripheral/src/ch32v30x_wwdg.o +LOAD ./Debug/debug.o +LOAD ./Core/core_riscv.o +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libm.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libc_nano.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a +START GROUP +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libc_nano.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a +END GROUP +START GROUP +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libc_nano.a +LOAD /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a +END GROUP + 0x0000000000000800 __stack_size = 0x800 + [!provide] PROVIDE (_stack_size = __stack_size) + +.init 0x0000000000000000 0x4 + 0x0000000000000000 _sinit = . + 0x0000000000000000 . = ALIGN (0x4) + *(SORT_NONE(.init)) + .init 0x0000000000000000 0x4 ./Startup/startup_ch32v30x_D8C.o + 0x0000000000000000 _start + 0x0000000000000004 . = ALIGN (0x4) + 0x0000000000000004 _einit = . + +.vector 0x0000000000000004 0x1bc + *(.vector) + .vector 0x0000000000000004 0x1a0 ./Startup/startup_ch32v30x_D8C.o + 0x00000000000001c0 . = ALIGN (0x40) + *fill* 0x00000000000001a4 0x1c + +.text 0x00000000000001c0 0xe09c + 0x00000000000001c0 . = ALIGN (0x4) + *(.text) + .text 0x00000000000001c0 0x60 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(save-restore.o) + 0x00000000000001c0 __riscv_save_12 + 0x00000000000001c8 __riscv_save_8 + 0x00000000000001c8 __riscv_save_11 + 0x00000000000001c8 __riscv_save_9 + 0x00000000000001c8 __riscv_save_10 + 0x00000000000001d6 __riscv_save_7 + 0x00000000000001d6 __riscv_save_4 + 0x00000000000001d6 __riscv_save_6 + 0x00000000000001d6 __riscv_save_5 + 0x00000000000001f0 __riscv_save_1 + 0x00000000000001f0 __riscv_save_3 + 0x00000000000001f0 __riscv_save_2 + 0x00000000000001f0 __riscv_save_0 + 0x00000000000001fc __riscv_restore_12 + 0x0000000000000200 __riscv_restore_10 + 0x0000000000000200 __riscv_restore_11 + 0x0000000000000200 __riscv_restore_8 + 0x0000000000000200 __riscv_restore_9 + 0x000000000000020a __riscv_restore_5 + 0x000000000000020a __riscv_restore_6 + 0x000000000000020a __riscv_restore_4 + 0x000000000000020a __riscv_restore_7 + 0x0000000000000214 __riscv_restore_3 + 0x0000000000000214 __riscv_restore_2 + 0x0000000000000214 __riscv_restore_0 + 0x0000000000000214 __riscv_restore_1 + .text 0x0000000000000220 0xa8 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memset.o) + 0x0000000000000220 memset + .text 0x00000000000002c8 0x11a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcmp.o) + 0x00000000000002c8 strcmp + *(.text.*) + .text.hexdump 0x00000000000003e2 0xbc ./User/util/hexdump.o + 0x00000000000003e2 hexdump + .text.hexdump_compact + 0x000000000000049e 0x4e ./User/util/hexdump.o + 0x000000000000049e hexdump_compact + .text.sendDiscreteAck + 0x00000000000004ec 0x52 ./User/meshcore/packets/ack.o + 0x00000000000004ec sendDiscreteAck + .text.ed25519_sign_ad + 0x000000000000053e 0x40 ./User/meshcore/packets/advert.o + 0x000000000000053e ed25519_sign_ad + .text.ed25519_verify_ad + 0x000000000000057e 0x50 ./User/meshcore/packets/advert.o + 0x000000000000057e ed25519_verify_ad + .text.sendAdvert + 0x00000000000005ce 0xe4 ./User/meshcore/packets/advert.o + 0x00000000000005ce sendAdvert + .text.saveAdvert + 0x00000000000006b2 0x8e ./User/meshcore/packets/advert.o + 0x00000000000006b2 saveAdvert + .text.printAdvertisement + 0x0000000000000740 0xa8 ./User/meshcore/packets/advert.o + 0x0000000000000740 printAdvertisement + .text.decodeAdvertisement + 0x00000000000007e8 0x170 ./User/meshcore/packets/advert.o + 0x00000000000007e8 decodeAdvertisement + .text.strnlen 0x0000000000000958 0x18 ./User/meshcore/packets/anonymous.o + 0x0000000000000958 strnlen + .text.printAnonRequest + 0x0000000000000970 0x16c ./User/meshcore/packets/anonymous.o + 0x0000000000000970 printAnonRequest + .text.decodeAnonReq + 0x0000000000000adc 0x26e ./User/meshcore/packets/anonymous.o + 0x0000000000000adc decodeAnonReq + .text.sendDiscoverResponse + 0x0000000000000d4a 0x62 ./User/meshcore/packets/control.o + 0x0000000000000d4a sendDiscoverResponse + .text.printDiscoverRequest + 0x0000000000000dac 0x4e ./User/meshcore/packets/control.o + 0x0000000000000dac printDiscoverRequest + .text.printDiscoverResponse + 0x0000000000000dfa 0x62 ./User/meshcore/packets/control.o + 0x0000000000000dfa printDiscoverResponse + .text.decodeControlFrame + 0x0000000000000e5c 0xfe ./User/meshcore/packets/control.o + 0x0000000000000e5c decodeControlFrame + .text.parse_coord_micro + 0x0000000000000f5a 0x9c ./User/meshcore/packets/encrypted.o + .text.sendEncryptedFrame + 0x0000000000000ff6 0xba ./User/meshcore/packets/encrypted.o + 0x0000000000000ff6 sendEncryptedFrame + .text.sendEncryptedTextMessage + 0x00000000000010b0 0x92 ./User/meshcore/packets/encrypted.o + 0x00000000000010b0 sendEncryptedTextMessage + .text.sendEncryptedResponse + 0x0000000000001142 0x2e ./User/meshcore/packets/encrypted.o + 0x0000000000001142 sendEncryptedResponse + .text.sendEncryptedPathPayload + 0x0000000000001170 0xae ./User/meshcore/packets/encrypted.o + 0x0000000000001170 sendEncryptedPathPayload + .text.printRequest + 0x000000000000121e 0x50 ./User/meshcore/packets/encrypted.o + 0x000000000000121e printRequest + .text.printResponse + 0x000000000000126e 0x42 ./User/meshcore/packets/encrypted.o + 0x000000000000126e printResponse + .text.sendPathBack + 0x00000000000012b0 0x2c ./User/meshcore/packets/encrypted.o + 0x00000000000012b0 sendPathBack + .text.processCommand + 0x00000000000012dc 0x58c ./User/meshcore/packets/encrypted.o + 0x00000000000012dc processCommand + .text.parseEncryptedPayload + 0x0000000000001868 0x448 ./User/meshcore/packets/encrypted.o + 0x0000000000001868 parseEncryptedPayload + .text.decodeEncryptedPayload + 0x0000000000001cb0 0x148 ./User/meshcore/packets/encrypted.o + 0x0000000000001cb0 decodeEncryptedPayload + .text.sendGroupMessage + 0x0000000000001df8 0xb4 ./User/meshcore/packets/group.o + 0x0000000000001df8 sendGroupMessage + .text.makeSendGroupMessage + 0x0000000000001eac 0x40 ./User/meshcore/packets/group.o + 0x0000000000001eac makeSendGroupMessage + .text.decodeGroupMessage + 0x0000000000001eec 0xf8 ./User/meshcore/packets/group.o + 0x0000000000001eec decodeGroupMessage + .text.processFrame + 0x0000000000001fe4 0xfa ./User/meshcore/meshcore.o + 0x0000000000001fe4 processFrame + .text.ReadFrame + 0x00000000000020de 0x19c ./User/meshcore/meshframing.o + 0x00000000000020de ReadFrame + .text.printframeHeader + 0x000000000000227a 0x1ba ./User/meshcore/meshframing.o + 0x000000000000227a printframeHeader + .text.getFrameHash + 0x0000000000002434 0x2a ./User/meshcore/meshframing.o + 0x0000000000002434 getFrameHash + .text.addToNotReTX + 0x000000000000245e 0x3c ./User/meshcore/meshframing.o + 0x000000000000245e addToNotReTX + .text.LoRaTransmit + 0x000000000000249a 0x26e ./User/meshcore/meshframing.o + 0x000000000000249a LoRaTransmit + .text.retransmitFrame + 0x0000000000002708 0xb4 ./User/meshcore/meshframing.o + 0x0000000000002708 retransmitFrame + .text.encrypt_then_mac + 0x00000000000027bc 0x9a ./User/meshcore/meshframing.o + 0x00000000000027bc encrypt_then_mac + .text.mac_then_decrypt + 0x0000000000002856 0x52 ./User/meshcore/meshframing.o + 0x0000000000002856 mac_then_decrypt + .text.RTC_NVIC_Config + 0x00000000000028a8 0x1c ./User/lib/rtc/rtc.o + 0x00000000000028a8 RTC_NVIC_Config + .text.Is_Leap_Year + 0x00000000000028c4 0x26 ./User/lib/rtc/rtc.o + 0x00000000000028c4 Is_Leap_Year + .text.RTC_Set 0x00000000000028ea 0xdc ./User/lib/rtc/rtc.o + 0x00000000000028ea RTC_Set + .text.RTC_Set_From_BuildTime + 0x00000000000029c6 0x5e ./User/lib/rtc/rtc.o + 0x00000000000029c6 RTC_Set_From_BuildTime + .text.RTC_Get_Week + 0x0000000000002a24 0x4e ./User/lib/rtc/rtc.o + 0x0000000000002a24 RTC_Get_Week + .text.RTC_Get 0x0000000000002a72 0xf8 ./User/lib/rtc/rtc.o + 0x0000000000002a72 RTC_Get + .text.RTC_Init + 0x0000000000002b6a 0xbe ./User/lib/rtc/rtc.o + 0x0000000000002b6a RTC_Init + .text.load64_be_buf + 0x0000000000002c28 0x58 ./User/lib/monocypher/monocypher-ed25519.o + .text.sha512_compress + 0x0000000000002c80 0x5a4 ./User/lib/monocypher/monocypher-ed25519.o + .text.sha512_set_input + 0x0000000000003224 0x32 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_update.part.1 + 0x0000000000003256 0x1ba ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512_init + 0x0000000000003410 0xb0 ./User/lib/monocypher/monocypher-ed25519.o + 0x0000000000003410 crypto_sha512_init + .text.crypto_sha512_update + 0x00000000000034c0 0x10 ./User/lib/monocypher/monocypher-ed25519.o + 0x00000000000034c0 crypto_sha512_update + .text.crypto_sha512_final + 0x00000000000034d0 0x112 ./User/lib/monocypher/monocypher-ed25519.o + 0x00000000000034d0 crypto_sha512_final + .text.hash_reduce.constprop.2 + 0x00000000000035e2 0x66 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_sha512 + 0x0000000000003648 0x2a ./User/lib/monocypher/monocypher-ed25519.o + 0x0000000000003648 crypto_sha512 + .text.ed25519_dom_sign + 0x0000000000003672 0x98 ./User/lib/monocypher/monocypher-ed25519.o + .text.crypto_ed25519_key_pair + 0x000000000000370a 0x8a ./User/lib/monocypher/monocypher-ed25519.o + 0x000000000000370a crypto_ed25519_key_pair + .text.crypto_ed25519_sign + 0x0000000000003794 0x14 ./User/lib/monocypher/monocypher-ed25519.o + 0x0000000000003794 crypto_ed25519_sign + .text.crypto_ed25519_check + 0x00000000000037a8 0x30 ./User/lib/monocypher/monocypher-ed25519.o + 0x00000000000037a8 crypto_ed25519_check + .text.load24_le + 0x00000000000037d8 0x10 ./User/lib/monocypher/monocypher.o + .text.load32_le + 0x00000000000037e8 0x16 ./User/lib/monocypher/monocypher.o + .text.load64_le + 0x00000000000037fe 0x1c ./User/lib/monocypher/monocypher.o + .text.store32_le + 0x000000000000381a 0x14 ./User/lib/monocypher/monocypher.o + .text.load32_le_buf + 0x000000000000382e 0x2c ./User/lib/monocypher/monocypher.o + .text.store32_le_buf + 0x000000000000385a 0x26 ./User/lib/monocypher/monocypher.o + .text.x16 0x0000000000003880 0x40 ./User/lib/monocypher/monocypher.o + .text.x32 0x00000000000038c0 0x24 ./User/lib/monocypher/monocypher.o + .text.fe_0 0x00000000000038e4 0x10 ./User/lib/monocypher/monocypher.o + .text.fe_1 0x00000000000038f4 0x18 ./User/lib/monocypher/monocypher.o + .text.fe_copy 0x000000000000390c 0x1a ./User/lib/monocypher/monocypher.o + .text.fe_neg 0x0000000000003926 0x1e ./User/lib/monocypher/monocypher.o + .text.fe_add 0x0000000000003944 0x26 ./User/lib/monocypher/monocypher.o + .text.fe_sub 0x000000000000396a 0x28 ./User/lib/monocypher/monocypher.o + .text.fe_cswap + 0x0000000000003992 0xd4 ./User/lib/monocypher/monocypher.o + .text.fe_ccopy + 0x0000000000003a66 0x98 ./User/lib/monocypher/monocypher.o + .text.fe_frombytes_mask + 0x0000000000003afe 0x258 ./User/lib/monocypher/monocypher.o + .text.fe_mul_small + 0x0000000000003d56 0x2f2 ./User/lib/monocypher/monocypher.o + .text.fe_mul 0x0000000000004048 0xa9c ./User/lib/monocypher/monocypher.o + .text.fe_sq 0x0000000000004ae4 0x676 ./User/lib/monocypher/monocypher.o + .text.scalar_bit + 0x000000000000515a 0x1a ./User/lib/monocypher/monocypher.o + .text.multiply + 0x0000000000005174 0x4a ./User/lib/monocypher/monocypher.o + .text.is_above_l + 0x00000000000051be 0x36 ./User/lib/monocypher/monocypher.o + .text.remove_l + 0x00000000000051f4 0x62 ./User/lib/monocypher/monocypher.o + .text.ge_zero 0x0000000000005256 0x26 ./User/lib/monocypher/monocypher.o + .text.ge_cache + 0x000000000000527c 0x42 ./User/lib/monocypher/monocypher.o + .text.ge_add 0x00000000000052be 0xc2 ./User/lib/monocypher/monocypher.o + .text.ge_madd 0x0000000000005380 0xb6 ./User/lib/monocypher/monocypher.o + .text.ge_double + 0x0000000000005436 0xaa ./User/lib/monocypher/monocypher.o + .text.slide_init + 0x00000000000054e0 0x28 ./User/lib/monocypher/monocypher.o + .text.slide_step + 0x0000000000005508 0xc4 ./User/lib/monocypher/monocypher.o + .text.lookup_add + 0x00000000000055cc 0xdc ./User/lib/monocypher/monocypher.o + .text.crypto_verify32 + 0x00000000000056a8 0x14 ./User/lib/monocypher/monocypher.o + 0x00000000000056a8 crypto_verify32 + .text.crypto_wipe + 0x00000000000056bc 0x14 ./User/lib/monocypher/monocypher.o + 0x00000000000056bc crypto_wipe + .text.fe_tobytes + 0x00000000000056d0 0x116 ./User/lib/monocypher/monocypher.o + .text.fe_isequal + 0x00000000000057e6 0x40 ./User/lib/monocypher/monocypher.o + .text.invsqrt 0x0000000000005826 0x1e8 ./User/lib/monocypher/monocypher.o + .text.fe_invert + 0x0000000000005a0e 0x3a ./User/lib/monocypher/monocypher.o + .text.scalarmult + 0x0000000000005a48 0x18a ./User/lib/monocypher/monocypher.o + .text.mod_l 0x0000000000005bd2 0x11c ./User/lib/monocypher/monocypher.o + .text.fe_isodd + 0x0000000000005cee 0x24 ./User/lib/monocypher/monocypher.o + .text.ge_frombytes_neg_vartime + 0x0000000000005d12 0x96 ./User/lib/monocypher/monocypher.o + .text.ge_tobytes + 0x0000000000005da8 0x6c ./User/lib/monocypher/monocypher.o + .text.crypto_eddsa_trim_scalar + 0x0000000000005e14 0x2c ./User/lib/monocypher/monocypher.o + 0x0000000000005e14 crypto_eddsa_trim_scalar + .text.crypto_x25519 + 0x0000000000005e40 0x2e ./User/lib/monocypher/monocypher.o + 0x0000000000005e40 crypto_x25519 + .text.crypto_eddsa_reduce + 0x0000000000005e6e 0x28 ./User/lib/monocypher/monocypher.o + 0x0000000000005e6e crypto_eddsa_reduce + .text.crypto_eddsa_mul_add + 0x0000000000005e96 0x70 ./User/lib/monocypher/monocypher.o + 0x0000000000005e96 crypto_eddsa_mul_add + .text.ge_scalarmult_base + 0x0000000000005f06 0xd6 ./User/lib/monocypher/monocypher.o + .text.crypto_eddsa_check_equation + 0x0000000000005fdc 0x1ba ./User/lib/monocypher/monocypher.o + 0x0000000000005fdc crypto_eddsa_check_equation + .text.crypto_eddsa_scalarbase + 0x0000000000006196 0x26 ./User/lib/monocypher/monocypher.o + 0x0000000000006196 crypto_eddsa_scalarbase + .text.crypto_eddsa_to_x25519 + 0x00000000000061bc 0x5e ./User/lib/monocypher/monocypher.o + 0x00000000000061bc crypto_eddsa_to_x25519 + .text.read32_be + 0x000000000000621a 0x16 ./User/lib/cifra/aes.o + .text.write32_be + 0x0000000000006230 0x16 ./User/lib/cifra/aes.o + .text.add_round_key + 0x0000000000006246 0x22 ./User/lib/cifra/aes.o + .text.shift_rows + 0x0000000000006268 0x8a ./User/lib/cifra/aes.o + .text.gf_poly_mul2 + 0x00000000000062f2 0x24 ./User/lib/cifra/aes.o + .text.mix_column + 0x0000000000006316 0x32 ./User/lib/cifra/aes.o + .text.inv_shift_rows + 0x0000000000006348 0x8a ./User/lib/cifra/aes.o + .text.inv_mix_column + 0x00000000000063d2 0x50 ./User/lib/cifra/aes.o + .text.sub_word + 0x0000000000006422 0xda ./User/lib/cifra/aes.o + .text.aes_schedule + 0x00000000000064fc 0xa2 ./User/lib/cifra/aes.o + .text.sub_block + 0x000000000000659e 0x3c ./User/lib/cifra/aes.o + .text.cf_aes_encrypt + 0x00000000000065da 0xd8 ./User/lib/cifra/aes.o + 0x00000000000065da cf_aes_encrypt + .text.inv_sub_block + 0x00000000000066b2 0x3c ./User/lib/cifra/aes.o + .text.cf_aes_decrypt + 0x00000000000066ee 0xe8 ./User/lib/cifra/aes.o + 0x00000000000066ee cf_aes_decrypt + .text.cf_aes_init + 0x00000000000067d6 0x50 ./User/lib/cifra/aes.o + 0x00000000000067d6 cf_aes_init + .text.cf_aes_finish + 0x0000000000006826 0x16 ./User/lib/cifra/aes.o + 0x0000000000006826 cf_aes_finish + .text.aes_encrypt_ecb + 0x000000000000683c 0x44 ./User/lib/cifra/aes.o + 0x000000000000683c aes_encrypt_ecb + .text.aes_decrypt_ecb + 0x0000000000006880 0x44 ./User/lib/cifra/aes.o + 0x0000000000006880 aes_decrypt_ecb + .text.cf_blockwise_accumulate_final + 0x00000000000068c4 0xbc ./User/lib/cifra/blockwise.o + 0x00000000000068c4 cf_blockwise_accumulate_final + .text.cf_blockwise_accumulate + 0x0000000000006980 0x10 ./User/lib/cifra/blockwise.o + 0x0000000000006980 cf_blockwise_accumulate + .text.cf_blockwise_acc_byte + 0x0000000000006990 0x64 ./User/lib/cifra/blockwise.o + 0x0000000000006990 cf_blockwise_acc_byte + .text.cf_blockwise_acc_pad + 0x00000000000069f4 0x9a ./User/lib/cifra/blockwise.o + 0x00000000000069f4 cf_blockwise_acc_pad + .text.cf_hash 0x0000000000006a8e 0x44 ./User/lib/cifra/chash.o + 0x0000000000006a8e cf_hash + .text.cf_hmac_init + 0x0000000000006ad2 0xe8 ./User/lib/cifra/hmac.o + 0x0000000000006ad2 cf_hmac_init + .text.cf_hmac_update + 0x0000000000006bba 0x18 ./User/lib/cifra/hmac.o + 0x0000000000006bba cf_hmac_update + .text.cf_hmac_finish + 0x0000000000006bd2 0x4c ./User/lib/cifra/hmac.o + 0x0000000000006bd2 cf_hmac_finish + .text.hmac_sha256 + 0x0000000000006c1e 0x3c ./User/lib/cifra/hmac.o + 0x0000000000006c1e hmac_sha256 + .text.write32_be + 0x0000000000006c5a 0x16 ./User/lib/cifra/sha256.o + .text.sha256_update_block + 0x0000000000006c70 0x20c ./User/lib/cifra/sha256.o + .text.cf_sha256_init + 0x0000000000006e7c 0x68 ./User/lib/cifra/sha256.o + 0x0000000000006e7c cf_sha256_init + .text.cf_sha256_update + 0x0000000000006ee4 0x26 ./User/lib/cifra/sha256.o + 0x0000000000006ee4 cf_sha256_update + .text.cf_sha256_digest_final + 0x0000000000006f0a 0x102 ./User/lib/cifra/sha256.o + 0x0000000000006f0a cf_sha256_digest_final + .text.cf_sha256_digest + 0x000000000000700c 0x22 ./User/lib/cifra/sha256.o + 0x000000000000700c cf_sha256_digest + .text.ADC_Function_Init + 0x000000000000702e 0xae ./User/lib/adc/temperature.o + 0x000000000000702e ADC_Function_Init + .text.Get_ADC_Val + 0x00000000000070dc 0x3a ./User/lib/adc/temperature.o + 0x00000000000070dc Get_ADC_Val + .text.Get_ADC_Average + 0x0000000000007116 0x38 ./User/lib/adc/temperature.o + 0x0000000000007116 Get_ADC_Average + .text.Get_ConversionVal + 0x000000000000714e 0x2a ./User/lib/adc/temperature.o + 0x000000000000714e Get_ConversionVal + .text.TempSensor_Volt_To_Temper_x10 + 0x0000000000007178 0x30 ./User/lib/adc/temperature.o + 0x0000000000007178 TempSensor_Volt_To_Temper_x10 + .text.getDeciTemperature + 0x00000000000071a8 0x2c ./User/lib/adc/temperature.o + 0x00000000000071a8 getDeciTemperature + .text.getVoltage + 0x00000000000071d4 0x24 ./User/lib/adc/temperature.o + 0x00000000000071d4 getVoltage + .text.int24_to_bytes + 0x00000000000071f8 0x1a ./User/lib/adc/temperature.o + 0x00000000000071f8 int24_to_bytes + .text.encode_gps + 0x0000000000007212 0x3e ./User/lib/adc/temperature.o + 0x0000000000007212 encode_gps + .text.getNextNode + 0x0000000000007250 0x42 ./User/lib/config.o + 0x0000000000007250 getNextNode + .text.getNode 0x0000000000007292 0x38 ./User/lib/config.o + 0x0000000000007292 getNode + .text.getNodePrefix + 0x00000000000072ca 0x3c ./User/lib/config.o + 0x00000000000072ca getNodePrefix + .text.getChannel + 0x0000000000007306 0x44 ./User/lib/config.o + 0x0000000000007306 getChannel + .text.addChannel + 0x000000000000734a 0xc6 ./User/lib/config.o + 0x000000000000734a addChannel + .text.printNodeDB + 0x0000000000007410 0x126 ./User/lib/config.o + 0x0000000000007410 printNodeDB + .text.getStringRole + 0x0000000000007536 0x24 ./User/lib/config.o + 0x0000000000007536 getStringRole + .text.populateDefaults + 0x000000000000755a 0x100 ./User/lib/config.o + 0x000000000000755a populateDefaults + .text.LoraApply + 0x000000000000765a 0x86 ./User/lib/config.o + 0x000000000000765a LoraApply + .text.NMI_Handler + 0x00000000000076e0 0x2 ./User/ch32v30x_it.o + 0x00000000000076e0 NMI_Handler + .text.HardFault_Handler + 0x00000000000076e2 0x10 ./User/ch32v30x_it.o + 0x00000000000076e2 HardFault_Handler + .text.startup.main + 0x00000000000076f2 0x2f2 ./User/main.o + 0x00000000000076f2 main + .text.LoRaError + 0x00000000000079e4 0x3c ./User/sx1262.o + 0x00000000000079e4 LoRaError + .text.LoRaInit + 0x0000000000007a20 0x10a ./User/sx1262.o + 0x0000000000007a20 LoRaInit + .text.spi_read_byte + 0x0000000000007b2a 0x7a ./User/sx1262.o + 0x0000000000007b2a spi_read_byte + .text.spi_write_byte + 0x0000000000007ba4 0x12 ./User/sx1262.o + 0x0000000000007ba4 spi_write_byte + .text.LoRaDebugPrint + 0x0000000000007bb6 0x6 ./User/sx1262.o + 0x0000000000007bb6 LoRaDebugPrint + .text.GetPacketLost + 0x0000000000007bbc 0x6 ./User/sx1262.o + 0x0000000000007bbc GetPacketLost + .text.WaitForIdle + 0x0000000000007bc2 0x84 ./User/sx1262.o + 0x0000000000007bc2 WaitForIdle + .text.ResetLora + 0x0000000000007c46 0x66 ./User/sx1262.o + 0x0000000000007c46 ResetLora + .text.WaitForIdleBegin + 0x0000000000007cac 0x5a ./User/sx1262.o + 0x0000000000007cac WaitForIdleBegin + .text.WriteRegister + 0x0000000000007d06 0xa6 ./User/sx1262.o + 0x0000000000007d06 WriteRegister + .text.ReadRegister + 0x0000000000007dac 0xee ./User/sx1262.o + 0x0000000000007dac ReadRegister + .text.FixInvertedIQ + 0x0000000000007e9a 0x40 ./User/sx1262.o + 0x0000000000007e9a FixInvertedIQ + .text.WriteCommand2 + 0x0000000000007eda 0xa6 ./User/sx1262.o + 0x0000000000007eda WriteCommand2 + .text.WriteCommand + 0x0000000000007f80 0x86 ./User/sx1262.o + 0x0000000000007f80 WriteCommand + .text.SetStandby + 0x0000000000008006 0x1c ./User/sx1262.o + 0x0000000000008006 SetStandby + .text.SetDio3AsTcxoCtrl + 0x0000000000008022 0x8a ./User/sx1262.o + 0x0000000000008022 SetDio3AsTcxoCtrl + .text.Calibrate + 0x00000000000080ac 0x1c ./User/sx1262.o + 0x00000000000080ac Calibrate + .text.SetDio2AsRfSwitchCtrl + 0x00000000000080c8 0x1c ./User/sx1262.o + 0x00000000000080c8 SetDio2AsRfSwitchCtrl + .text.CalibrateImage + 0x00000000000080e4 0x7c ./User/sx1262.o + 0x00000000000080e4 CalibrateImage + .text.SetRfFrequency + 0x0000000000008160 0x4e ./User/sx1262.o + 0x0000000000008160 SetRfFrequency + .text.SetRegulatorMode + 0x00000000000081ae 0x1c ./User/sx1262.o + 0x00000000000081ae SetRegulatorMode + .text.SetBufferBaseAddress + 0x00000000000081ca 0x1c ./User/sx1262.o + 0x00000000000081ca SetBufferBaseAddress + .text.SetPowerConfig + 0x00000000000081e6 0x34 ./User/sx1262.o + 0x00000000000081e6 SetPowerConfig + .text.SetPaConfig + 0x000000000000821a 0x20 ./User/sx1262.o + 0x000000000000821a SetPaConfig + .text.LoRaBegin + 0x000000000000823a 0x12e ./User/sx1262.o + 0x000000000000823a LoRaBegin + .text.SetDioIrqParams + 0x0000000000008368 0x3e ./User/sx1262.o + 0x0000000000008368 SetDioIrqParams + .text.SetStopRxTimerOnPreambleDetect + 0x00000000000083a6 0x46 ./User/sx1262.o + 0x00000000000083a6 SetStopRxTimerOnPreambleDetect + .text.SetLoRaSymbNumTimeout + 0x00000000000083ec 0x1c ./User/sx1262.o + 0x00000000000083ec SetLoRaSymbNumTimeout + .text.SetPacketType + 0x0000000000008408 0x1c ./User/sx1262.o + 0x0000000000008408 SetPacketType + .text.SetModulationParams + 0x0000000000008424 0x20 ./User/sx1262.o + 0x0000000000008424 SetModulationParams + .text.ClearIrqStatus + 0x0000000000008444 0x20 ./User/sx1262.o + 0x0000000000008444 ClearIrqStatus + .text.ReadCommand + 0x0000000000008464 0x8a ./User/sx1262.o + 0x0000000000008464 ReadCommand + .text.GetPacketStatus + 0x00000000000084ee 0x42 ./User/sx1262.o + 0x00000000000084ee GetPacketStatus + .text.GetStatus + 0x0000000000008530 0x1c ./User/sx1262.o + 0x0000000000008530 GetStatus + .text.SetRx 0x000000000000854c 0xa0 ./User/sx1262.o + 0x000000000000854c SetRx + .text.LoRaConfig + 0x00000000000085ec 0xb0 ./User/sx1262.o + 0x00000000000085ec LoRaConfig + .text.SetTx 0x000000000000869c 0x118 ./User/sx1262.o + 0x000000000000869c SetTx + .text.GetIrqStatus + 0x00000000000087b4 0x1e ./User/sx1262.o + 0x00000000000087b4 GetIrqStatus + .text.GetRxBufferStatus + 0x00000000000087d2 0x22 ./User/sx1262.o + 0x00000000000087d2 GetRxBufferStatus + .text.SystemInit + 0x00000000000087f4 0xfa ./User/system_ch32v30x.o + 0x00000000000087f4 SystemInit + .text.SystemCoreClockUpdate + 0x00000000000088ee 0x12e ./User/system_ch32v30x.o + 0x00000000000088ee SystemCoreClockUpdate + .text.vector_handler + 0x0000000000008a1c 0x2 ./Startup/startup_ch32v30x_D8C.o + 0x0000000000008a1c EXTI2_IRQHandler + 0x0000000000008a1c TIM8_TRG_COM_IRQHandler + 0x0000000000008a1c TIM8_CC_IRQHandler + 0x0000000000008a1c UART8_IRQHandler + 0x0000000000008a1c TIM1_CC_IRQHandler + 0x0000000000008a1c TIM6_IRQHandler + 0x0000000000008a1c SysTick_Handler + 0x0000000000008a1c PVD_IRQHandler + 0x0000000000008a1c SDIO_IRQHandler + 0x0000000000008a1c TIM9_BRK_IRQHandler + 0x0000000000008a1c DMA2_Channel8_IRQHandler + 0x0000000000008a1c CAN2_RX1_IRQHandler + 0x0000000000008a1c EXTI3_IRQHandler + 0x0000000000008a1c USBHS_IRQHandler + 0x0000000000008a1c DMA2_Channel9_IRQHandler + 0x0000000000008a1c TIM10_CC_IRQHandler + 0x0000000000008a1c USBFS_IRQHandler + 0x0000000000008a1c EXTI0_IRQHandler + 0x0000000000008a1c I2C2_EV_IRQHandler + 0x0000000000008a1c TIM10_TRG_COM_IRQHandler + 0x0000000000008a1c CAN2_SCE_IRQHandler + 0x0000000000008a1c ADC1_2_IRQHandler + 0x0000000000008a1c Break_Point_Handler + 0x0000000000008a1c SPI1_IRQHandler + 0x0000000000008a1c TAMPER_IRQHandler + 0x0000000000008a1c CAN2_RX0_IRQHandler + 0x0000000000008a1c TIM8_UP_IRQHandler + 0x0000000000008a1c Ecall_M_Mode_Handler + 0x0000000000008a1c DMA2_Channel2_IRQHandler + 0x0000000000008a1c DMA1_Channel4_IRQHandler + 0x0000000000008a1c TIM9_UP_IRQHandler + 0x0000000000008a1c USART3_IRQHandler + 0x0000000000008a1c RTC_IRQHandler + 0x0000000000008a1c DMA1_Channel7_IRQHandler + 0x0000000000008a1c CAN1_RX1_IRQHandler + 0x0000000000008a1c DVP_IRQHandler + 0x0000000000008a1c UART5_IRQHandler + 0x0000000000008a1c TIM4_IRQHandler + 0x0000000000008a1c DMA2_Channel1_IRQHandler + 0x0000000000008a1c I2C1_EV_IRQHandler + 0x0000000000008a1c DMA1_Channel6_IRQHandler + 0x0000000000008a1c UART4_IRQHandler + 0x0000000000008a1c DMA2_Channel4_IRQHandler + 0x0000000000008a1c TIM3_IRQHandler + 0x0000000000008a1c RCC_IRQHandler + 0x0000000000008a1c TIM1_TRG_COM_IRQHandler + 0x0000000000008a1c DMA1_Channel1_IRQHandler + 0x0000000000008a1c DMA2_Channel7_IRQHandler + 0x0000000000008a1c EXTI15_10_IRQHandler + 0x0000000000008a1c TIM7_IRQHandler + 0x0000000000008a1c CAN2_TX_IRQHandler + 0x0000000000008a1c TIM5_IRQHandler + 0x0000000000008a1c EXTI9_5_IRQHandler + 0x0000000000008a1c ETH_WKUP_IRQHandler + 0x0000000000008a1c SPI2_IRQHandler + 0x0000000000008a1c TIM10_BRK_IRQHandler + 0x0000000000008a1c TIM9_CC_IRQHandler + 0x0000000000008a1c DMA2_Channel5_IRQHandler + 0x0000000000008a1c DMA1_Channel5_IRQHandler + 0x0000000000008a1c EXTI4_IRQHandler + 0x0000000000008a1c USB_LP_CAN1_RX0_IRQHandler + 0x0000000000008a1c RNG_IRQHandler + 0x0000000000008a1c USB_HP_CAN1_TX_IRQHandler + 0x0000000000008a1c DMA1_Channel3_IRQHandler + 0x0000000000008a1c ETH_IRQHandler + 0x0000000000008a1c TIM1_UP_IRQHandler + 0x0000000000008a1c WWDG_IRQHandler + 0x0000000000008a1c USBHSWakeup_IRQHandler + 0x0000000000008a1c DMA2_Channel11_IRQHandler + 0x0000000000008a1c Ecall_U_Mode_Handler + 0x0000000000008a1c DMA2_Channel6_IRQHandler + 0x0000000000008a1c TIM2_IRQHandler + 0x0000000000008a1c SW_Handler + 0x0000000000008a1c TIM1_BRK_IRQHandler + 0x0000000000008a1c DMA2_Channel10_IRQHandler + 0x0000000000008a1c EXTI1_IRQHandler + 0x0000000000008a1c RTCAlarm_IRQHandler + 0x0000000000008a1c TIM10_UP_IRQHandler + 0x0000000000008a1c TIM9_TRG_COM_IRQHandler + 0x0000000000008a1c UART7_IRQHandler + 0x0000000000008a1c USART2_IRQHandler + 0x0000000000008a1c UART6_IRQHandler + 0x0000000000008a1c I2C2_ER_IRQHandler + 0x0000000000008a1c DMA1_Channel2_IRQHandler + 0x0000000000008a1c TIM8_BRK_IRQHandler + 0x0000000000008a1c CAN1_SCE_IRQHandler + 0x0000000000008a1c FLASH_IRQHandler + 0x0000000000008a1c USART1_IRQHandler + 0x0000000000008a1c SPI3_IRQHandler + 0x0000000000008a1c I2C1_ER_IRQHandler + 0x0000000000008a1c USBWakeUp_IRQHandler + 0x0000000000008a1c DMA2_Channel3_IRQHandler + .text.handle_reset + 0x0000000000008a1e 0x8a ./Startup/startup_ch32v30x_D8C.o + 0x0000000000008a1e handle_reset + .text.ADC_DeInit + 0x0000000000008aa8 0x40 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008aa8 ADC_DeInit + .text.ADC_Init + 0x0000000000008ae8 0x56 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008ae8 ADC_Init + .text.ADC_Cmd 0x0000000000008b3e 0x10 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b3e ADC_Cmd + .text.ADC_ResetCalibration + 0x0000000000008b4e 0xa ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b4e ADC_ResetCalibration + .text.ADC_GetResetCalibrationStatus + 0x0000000000008b58 0x8 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b58 ADC_GetResetCalibrationStatus + .text.ADC_StartCalibration + 0x0000000000008b60 0xa ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b60 ADC_StartCalibration + .text.ADC_GetCalibrationStatus + 0x0000000000008b6a 0x8 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b6a ADC_GetCalibrationStatus + .text.ADC_SoftwareStartConvCmd + 0x0000000000008b72 0x18 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b72 ADC_SoftwareStartConvCmd + .text.ADC_RegularChannelConfig + 0x0000000000008b8a 0xb8 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008b8a ADC_RegularChannelConfig + .text.ADC_GetConversionValue + 0x0000000000008c42 0x8 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008c42 ADC_GetConversionValue + .text.ADC_TempSensorVrefintCmd + 0x0000000000008c4a 0x20 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008c4a ADC_TempSensorVrefintCmd + .text.ADC_GetFlagStatus + 0x0000000000008c6a 0xa ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008c6a ADC_GetFlagStatus + .text.ADC_BufferCmd + 0x0000000000008c74 0x18 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008c74 ADC_BufferCmd + .text.Get_CalibrationValue + 0x0000000000008c8c 0x134 ./Peripheral/src/ch32v30x_adc.o + 0x0000000000008c8c Get_CalibrationValue + .text.BKP_DeInit + 0x0000000000008dc0 0x10 ./Peripheral/src/ch32v30x_bkp.o + 0x0000000000008dc0 BKP_DeInit + .text.BKP_WriteBackupRegister + 0x0000000000008dd0 0x1c ./Peripheral/src/ch32v30x_bkp.o + 0x0000000000008dd0 BKP_WriteBackupRegister + .text.DBGMCU_GetCHIPID + 0x0000000000008dec 0xa ./Peripheral/src/ch32v30x_dbgmcu.o + 0x0000000000008dec DBGMCU_GetCHIPID + .text.GPIO_Init + 0x0000000000008df6 0xc0 ./Peripheral/src/ch32v30x_gpio.o + 0x0000000000008df6 GPIO_Init + .text.GPIO_ReadInputDataBit + 0x0000000000008eb6 0xa ./Peripheral/src/ch32v30x_gpio.o + 0x0000000000008eb6 GPIO_ReadInputDataBit + .text.GPIO_WriteBit + 0x0000000000008ec0 0xa ./Peripheral/src/ch32v30x_gpio.o + 0x0000000000008ec0 GPIO_WriteBit + .text.NVIC_PriorityGroupConfig + 0x0000000000008eca 0x6 ./Peripheral/src/ch32v30x_misc.o + 0x0000000000008eca NVIC_PriorityGroupConfig + .text.NVIC_Init + 0x0000000000008ed0 0x5c ./Peripheral/src/ch32v30x_misc.o + 0x0000000000008ed0 NVIC_Init + .text.PWR_BackupAccessCmd + 0x0000000000008f2c 0x16 ./Peripheral/src/ch32v30x_pwr.o + 0x0000000000008f2c PWR_BackupAccessCmd + .text.RCC_ADCCLKConfig + 0x0000000000008f42 0x12 ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000008f42 RCC_ADCCLKConfig + .text.RCC_LSEConfig + 0x0000000000008f54 0x28 ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000008f54 RCC_LSEConfig + .text.RCC_RTCCLKConfig + 0x0000000000008f7c 0xc ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000008f7c RCC_RTCCLKConfig + .text.RCC_RTCCLKCmd + 0x0000000000008f88 0x20 ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000008f88 RCC_RTCCLKCmd + .text.RCC_GetClocksFreq + 0x0000000000008fa8 0x176 ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000008fa8 RCC_GetClocksFreq + .text.RCC_APB2PeriphClockCmd + 0x000000000000911e 0x1e ./Peripheral/src/ch32v30x_rcc.o + 0x000000000000911e RCC_APB2PeriphClockCmd + .text.RCC_APB1PeriphClockCmd + 0x000000000000913c 0x1e ./Peripheral/src/ch32v30x_rcc.o + 0x000000000000913c RCC_APB1PeriphClockCmd + .text.RCC_APB2PeriphResetCmd + 0x000000000000915a 0x1e ./Peripheral/src/ch32v30x_rcc.o + 0x000000000000915a RCC_APB2PeriphResetCmd + .text.RCC_BackupResetCmd + 0x0000000000009178 0x20 ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000009178 RCC_BackupResetCmd + .text.RCC_GetFlagStatus + 0x0000000000009198 0x2e ./Peripheral/src/ch32v30x_rcc.o + 0x0000000000009198 RCC_GetFlagStatus + .text.RTC_ITConfig + 0x00000000000091c6 0x1a ./Peripheral/src/ch32v30x_rtc.o + 0x00000000000091c6 RTC_ITConfig + .text.RTC_EnterConfigMode + 0x00000000000091e0 0x12 ./Peripheral/src/ch32v30x_rtc.o + 0x00000000000091e0 RTC_EnterConfigMode + .text.RTC_ExitConfigMode + 0x00000000000091f2 0x18 ./Peripheral/src/ch32v30x_rtc.o + 0x00000000000091f2 RTC_ExitConfigMode + .text.RTC_GetCounter + 0x000000000000920a 0x5a ./Peripheral/src/ch32v30x_rtc.o + 0x000000000000920a RTC_GetCounter + .text.RTC_SetCounter + 0x0000000000009264 0x2c ./Peripheral/src/ch32v30x_rtc.o + 0x0000000000009264 RTC_SetCounter + .text.RTC_SetPrescaler + 0x0000000000009290 0x2e ./Peripheral/src/ch32v30x_rtc.o + 0x0000000000009290 RTC_SetPrescaler + .text.RTC_WaitForLastTask + 0x00000000000092be 0x10 ./Peripheral/src/ch32v30x_rtc.o + 0x00000000000092be RTC_WaitForLastTask + .text.RTC_WaitForSynchro + 0x00000000000092ce 0x24 ./Peripheral/src/ch32v30x_rtc.o + 0x00000000000092ce RTC_WaitForSynchro + .text.RTC_ClearFlag + 0x00000000000092f2 0x14 ./Peripheral/src/ch32v30x_rtc.o + 0x00000000000092f2 RTC_ClearFlag + .text.RTC_ClearITPendingBit + 0x0000000000009306 0xc ./Peripheral/src/ch32v30x_rtc.o + 0x0000000000009306 RTC_ClearITPendingBit + .text.SPI_Init + 0x0000000000009312 0x3e ./Peripheral/src/ch32v30x_spi.o + 0x0000000000009312 SPI_Init + .text.SPI_Cmd 0x0000000000009350 0x1a ./Peripheral/src/ch32v30x_spi.o + 0x0000000000009350 SPI_Cmd + .text.SPI_I2S_SendData + 0x000000000000936a 0x4 ./Peripheral/src/ch32v30x_spi.o + 0x000000000000936a SPI_I2S_SendData + .text.SPI_I2S_ReceiveData + 0x000000000000936e 0x4 ./Peripheral/src/ch32v30x_spi.o + 0x000000000000936e SPI_I2S_ReceiveData + .text.SPI_I2S_GetFlagStatus + 0x0000000000009372 0xa ./Peripheral/src/ch32v30x_spi.o + 0x0000000000009372 SPI_I2S_GetFlagStatus + .text.USART_Init + 0x000000000000937c 0x90 ./Peripheral/src/ch32v30x_usart.o + 0x000000000000937c USART_Init + .text.USART_Cmd + 0x000000000000940c 0x16 ./Peripheral/src/ch32v30x_usart.o + 0x000000000000940c USART_Cmd + .text.USART_SendData + 0x0000000000009422 0x8 ./Peripheral/src/ch32v30x_usart.o + 0x0000000000009422 USART_SendData + .text.USART_ReceiveData + 0x000000000000942a 0x8 ./Peripheral/src/ch32v30x_usart.o + 0x000000000000942a USART_ReceiveData + .text.USART_GetFlagStatus + 0x0000000000009432 0xa ./Peripheral/src/ch32v30x_usart.o + 0x0000000000009432 USART_GetFlagStatus + .text.Delay_Init + 0x000000000000943c 0x2a ./Debug/debug.o + 0x000000000000943c Delay_Init + .text.Delay_Ms + 0x0000000000009466 0x36 ./Debug/debug.o + 0x0000000000009466 Delay_Ms + .text._write 0x000000000000949c 0x3e ./Debug/debug.o + 0x000000000000949c _write + .text._sbrk 0x00000000000094da 0x26 ./Debug/debug.o + 0x00000000000094da _sbrk + .text.__ashldi3 + 0x0000000000009500 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_ashldi3.o) + 0x0000000000009500 __ashldi3 + .text.__udivdi3 + 0x000000000000952c 0x392 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_udivdi3.o) + 0x000000000000952c __udivdi3 + .text.abort 0x00000000000098be 0xe /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) + 0x00000000000098be abort + .text.atoi 0x00000000000098cc 0x8 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + 0x00000000000098cc atoi + .text.__locale_ctype_ptr_l + 0x00000000000098d4 0x6 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + 0x00000000000098d4 __locale_ctype_ptr_l + .text.__locale_ctype_ptr + 0x00000000000098da 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + 0x00000000000098da __locale_ctype_ptr + .text.malloc 0x00000000000098f2 0xa /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + 0x00000000000098f2 malloc + .text.__ascii_mbtowc + 0x00000000000098fc 0x32 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + 0x00000000000098fc __ascii_mbtowc + .text.memcmp 0x000000000000992e 0x24 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcmp.o) + 0x000000000000992e memcmp + .text.memcpy 0x0000000000009952 0xb2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcpy.o) + 0x0000000000009952 memcpy + .text.memmove 0x0000000000009a04 0x46 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memmove.o) + 0x0000000000009a04 memmove + .text._free_r 0x0000000000009a4a 0xa8 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) + 0x0000000000009a4a _free_r + .text._malloc_r + 0x0000000000009af2 0xd4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + 0x0000000000009af2 _malloc_r + .text.printf 0x0000000000009bc6 0x42 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + 0x0000000000009bc6 printf + 0x0000000000009bc6 iprintf + .text.putchar 0x0000000000009c08 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + 0x0000000000009c08 putchar + .text._puts_r 0x0000000000009c34 0xd8 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + 0x0000000000009c34 _puts_r + .text.puts 0x0000000000009d0c 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + 0x0000000000009d0c puts + .text.rand 0x0000000000009d18 0x86 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + 0x0000000000009d18 rand + .text._sbrk_r 0x0000000000009d9e 0x2a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) + 0x0000000000009d9e _sbrk_r + .text._raise_r + 0x0000000000009dc8 0x62 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + 0x0000000000009dc8 _raise_r + .text.raise 0x0000000000009e2a 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + 0x0000000000009e2a raise + .text._kill_r 0x0000000000009e36 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + 0x0000000000009e36 _kill_r + .text._getpid_r + 0x0000000000009e62 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + 0x0000000000009e62 _getpid_r + .text.snprintf + 0x0000000000009e66 0x6c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + 0x0000000000009e66 snprintf + 0x0000000000009e66 sniprintf + .text.sprintf 0x0000000000009ed2 0x46 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + 0x0000000000009ed2 sprintf + 0x0000000000009ed2 siprintf + .text.strcat 0x0000000000009f18 0x1e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcat.o) + 0x0000000000009f18 strcat + .text.strcpy 0x0000000000009f36 0x10 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcpy.o) + 0x0000000000009f36 strcpy + .text.strlen 0x0000000000009f46 0x12 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strlen.o) + 0x0000000000009f46 strlen + .text.strncpy 0x0000000000009f58 0x24 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strncpy.o) + 0x0000000000009f58 strncpy + .text._strtol_l.isra.0 + 0x0000000000009f7c 0x13a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .text.strtol 0x000000000000a0b6 0x1e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + 0x000000000000a0b6 strtol + .text.__swbuf_r + 0x000000000000a0d4 0xbc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + 0x000000000000a0d4 __swbuf_r + .text.__ascii_wctomb + 0x000000000000a190 0x1e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + 0x000000000000a190 __ascii_wctomb + .text.__swsetup_r + 0x000000000000a1ae 0xfe /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) + 0x000000000000a1ae __swsetup_r + .text.__sflush_r + 0x000000000000a2ac 0x132 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + 0x000000000000a2ac __sflush_r + .text._fflush_r + 0x000000000000a3de 0x66 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + 0x000000000000a3de _fflush_r + .text.std 0x000000000000a444 0x66 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .text._cleanup_r + 0x000000000000a4aa 0xa /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000a4aa _cleanup_r + .text.__sfmoreglue + 0x000000000000a4b4 0x48 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000a4b4 __sfmoreglue + .text.__sinit 0x000000000000a4fc 0x6c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000a4fc __sinit + .text.__sfp 0x000000000000a568 0xa0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000a568 __sfp + .text._fwalk_reent + 0x000000000000a608 0x6a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + 0x000000000000a608 _fwalk_reent + .text.__swhatbuf_r + 0x000000000000a672 0x58 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + 0x000000000000a672 __swhatbuf_r + .text.__smakebuf_r + 0x000000000000a6ca 0x94 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + 0x000000000000a6ca __smakebuf_r + .text.__malloc_lock + 0x000000000000a75e 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + 0x000000000000a75e __malloc_lock + .text.__malloc_unlock + 0x000000000000a760 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + 0x000000000000a760 __malloc_unlock + .text.__ssputs_r + 0x000000000000a762 0xe4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + 0x000000000000a762 __ssputs_r + .text._svfprintf_r + 0x000000000000a846 0x26a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + 0x000000000000a846 _svfprintf_r + 0x000000000000a846 _svfiprintf_r + .text.__sfputc_r + 0x000000000000aab0 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .text.__sfputs_r + 0x000000000000aad8 0x42 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + 0x000000000000aad8 __sfputs_r + .text._vfprintf_r + 0x000000000000ab1a 0x28a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + 0x000000000000ab1a _vfiprintf_r + 0x000000000000ab1a _vfprintf_r + .text._printf_common + 0x000000000000ada4 0x10c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + 0x000000000000ada4 _printf_common + .text._printf_i + 0x000000000000aeb0 0x2a2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + 0x000000000000aeb0 _printf_i + .text._putc_r 0x000000000000b152 0x84 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + 0x000000000000b152 _putc_r + .text.__sread 0x000000000000b1d6 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + 0x000000000000b1d6 __sread + .text.__swrite + 0x000000000000b202 0x48 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + 0x000000000000b202 __swrite + .text.__sseek 0x000000000000b24a 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + 0x000000000000b24a __sseek + .text.__sclose + 0x000000000000b27a 0x6 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + 0x000000000000b27a __sclose + .text._write_r + 0x000000000000b280 0x2e /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-writer.o) + 0x000000000000b280 _write_r + .text._close_r + 0x000000000000b2ae 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) + 0x000000000000b2ae _close_r + .text._fstat_r + 0x000000000000b2d6 0x2a /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) + 0x000000000000b2d6 _fstat_r + .text._isatty_r + 0x000000000000b300 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) + 0x000000000000b300 _isatty_r + .text._lseek_r + 0x000000000000b328 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) + 0x000000000000b328 _lseek_r + .text.memchr 0x000000000000b354 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memchr.o) + 0x000000000000b354 memchr + .text._realloc_r + 0x000000000000b36c 0x58 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) + 0x000000000000b36c _realloc_r + .text._read_r 0x000000000000b3c4 0x2c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) + 0x000000000000b3c4 _read_r + .text._malloc_usable_size_r + 0x000000000000b3f0 0x14 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-msizer.o) + 0x000000000000b3f0 _malloc_usable_size_r + .text._close 0x000000000000b404 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + 0x000000000000b404 _close + .text._fstat 0x000000000000b410 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + 0x000000000000b410 _fstat + .text._getpid 0x000000000000b41c 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + 0x000000000000b41c _getpid + .text._isatty 0x000000000000b428 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + 0x000000000000b428 _isatty + .text._kill 0x000000000000b434 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + 0x000000000000b434 _kill + .text._lseek 0x000000000000b440 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + 0x000000000000b440 _lseek + .text._read 0x000000000000b44c 0xc /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + 0x000000000000b44c _read + .text._exit 0x000000000000b458 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(_exit.o) + 0x000000000000b458 _exit + *(.rodata) + *(.rodata*) + *fill* 0x000000000000b45a 0x2 + .rodata.hexdump.str1.4 + 0x000000000000b45c 0x27 ./User/util/hexdump.o + 0x2e (size before relaxing) + *fill* 0x000000000000b483 0x1 + .rodata.hexdump_compact.str1.4 + 0x000000000000b484 0x5 ./User/util/hexdump.o + *fill* 0x000000000000b489 0x3 + .rodata.decodeAdvertisement.str1.4 + 0x000000000000b48c 0xc9 ./User/meshcore/packets/advert.o + *fill* 0x000000000000b555 0x3 + .rodata.printAdvertisement.str1.4 + 0x000000000000b558 0x7b ./User/meshcore/packets/advert.o + *fill* 0x000000000000b5d3 0x1 + .rodata.sendAdvert.str1.4 + 0x000000000000b5d4 0x41 ./User/meshcore/packets/advert.o + *fill* 0x000000000000b615 0x3 + .rodata.decodeAnonReq.str1.4 + 0x000000000000b618 0x13b ./User/meshcore/packets/anonymous.o + 0x143 (size before relaxing) + *fill* 0x000000000000b753 0x1 + .rodata.printAnonRequest.str1.4 + 0x000000000000b754 0xcf ./User/meshcore/packets/anonymous.o + 0xd7 (size before relaxing) + *fill* 0x000000000000b823 0x1 + .rodata.decodeControlFrame.str1.4 + 0x000000000000b824 0x3e ./User/meshcore/packets/control.o + 0x42 (size before relaxing) + *fill* 0x000000000000b862 0x2 + .rodata.printDiscoverRequest.str1.4 + 0x000000000000b864 0x76 ./User/meshcore/packets/control.o + *fill* 0x000000000000b8da 0x2 + .rodata.printDiscoverResponse.str1.4 + 0x000000000000b8dc 0x5c ./User/meshcore/packets/control.o + 0x5e (size before relaxing) + .rodata.decodeEncryptedPayload.str1.4 + 0x000000000000b938 0xe7 ./User/meshcore/packets/encrypted.o + 0xeb (size before relaxing) + *fill* 0x000000000000ba1f 0x1 + .rodata.parseEncryptedPayload.str1.4 + 0x000000000000ba20 0x10d ./User/meshcore/packets/encrypted.o + *fill* 0x000000000000bb2d 0x3 + .rodata.printEncryptedPayload.str1.4 + 0x000000000000bb30 0x80 ./User/meshcore/packets/encrypted.o + 0x8a (size before relaxing) + .rodata.printRequest.str1.4 + 0x000000000000bbb0 0x43 ./User/meshcore/packets/encrypted.o + *fill* 0x000000000000bbf3 0x1 + .rodata.printResponse.str1.4 + 0x000000000000bbf4 0x17 ./User/meshcore/packets/encrypted.o + *fill* 0x000000000000bc0b 0x1 + .rodata.processCommand.str1.4 + 0x000000000000bc0c 0x378 ./User/meshcore/packets/encrypted.o + 0x39c (size before relaxing) + .rodata.sendEncryptedFrame.str1.4 + 0x000000000000bf84 0x72 ./User/meshcore/packets/encrypted.o + 0x76 (size before relaxing) + *fill* 0x000000000000bff6 0x2 + .rodata.sendEncryptedTextMessage.str1.4 + 0x000000000000bff8 0x39 ./User/meshcore/packets/encrypted.o + 0x3d (size before relaxing) + *fill* 0x000000000000c031 0x3 + .rodata.decodeGroupMessage.str1.4 + 0x000000000000c034 0x9d ./User/meshcore/packets/group.o + 0xa1 (size before relaxing) + .rodata.makeSendGroupMessage.str1.4 + 0x000000000000c0d1 0x9d ./User/meshcore/packets/group.o + 0x3 (size before relaxing) + *fill* 0x000000000000c0d1 0x3 + .rodata.sendGroupMessage.str1.4 + 0x000000000000c0d4 0xa ./User/meshcore/packets/group.o + *fill* 0x000000000000c0de 0x2 + .rodata.processFrame.str1.4 + 0x000000000000c0e0 0x73 ./User/meshcore/meshcore.o + 0x7b (size before relaxing) + *fill* 0x000000000000c153 0x1 + .rodata.ReadFrame + 0x000000000000c154 0x14 ./User/meshcore/meshframing.o + .rodata.LoRaTransmit + 0x000000000000c168 0x14 ./User/meshcore/meshframing.o + .rodata.LoRaTransmit.str1.4 + 0x000000000000c17c 0x117 ./User/meshcore/meshframing.o + 0x11b (size before relaxing) + *fill* 0x000000000000c293 0x1 + .rodata.ReadFrame.str1.4 + 0x000000000000c294 0x23 ./User/meshcore/meshframing.o + *fill* 0x000000000000c2b7 0x1 + .rodata.printframeHeader.str1.4 + 0x000000000000c2b8 0x129 ./User/meshcore/meshframing.o + 0x131 (size before relaxing) + *fill* 0x000000000000c3e1 0x3 + .rodata.mon_table + 0x000000000000c3e4 0xc ./User/lib/rtc/rtc.o + 0x000000000000c3e4 mon_table + .rodata.months.5280 + 0x000000000000c3f0 0x25 ./User/lib/rtc/rtc.o + *fill* 0x000000000000c415 0x3 + .rodata.table_week + 0x000000000000c418 0xc ./User/lib/rtc/rtc.o + 0x000000000000c418 table_week + *fill* 0x000000000000c424 0x4 + .rodata.K 0x000000000000c428 0x280 ./User/lib/monocypher/monocypher-ed25519.o + .rodata.crypto_sha512_init.cst8 + 0x000000000000c6a8 0x40 ./User/lib/monocypher/monocypher-ed25519.o + .rodata.D2 0x000000000000c6e8 0x28 ./User/lib/monocypher/monocypher.o + .rodata.L 0x000000000000c710 0x20 ./User/lib/monocypher/monocypher.o + .rodata.b_comb_high + 0x000000000000c730 0x3c0 ./User/lib/monocypher/monocypher.o + .rodata.b_comb_low + 0x000000000000caf0 0x3c0 ./User/lib/monocypher/monocypher.o + .rodata.b_window + 0x000000000000ceb0 0x3c0 ./User/lib/monocypher/monocypher.o + .rodata.d 0x000000000000d270 0x28 ./User/lib/monocypher/monocypher.o + .rodata.fe_one + 0x000000000000d298 0x28 ./User/lib/monocypher/monocypher.o + .rodata.half_mod_L.2900 + 0x000000000000d2c0 0x20 ./User/lib/monocypher/monocypher.o + .rodata.half_ones.2901 + 0x000000000000d2e0 0x20 ./User/lib/monocypher/monocypher.o + .rodata.r.2702 + 0x000000000000d300 0x24 ./User/lib/monocypher/monocypher.o + .rodata.sqrtm1 + 0x000000000000d324 0x28 ./User/lib/monocypher/monocypher.o + .rodata.zero_point.2876 + 0x000000000000d34c 0x20 ./User/lib/monocypher/monocypher.o + .rodata.Rcon 0x000000000000d36c 0xb ./User/lib/cifra/aes.o + *fill* 0x000000000000d377 0x1 + .rodata.S 0x000000000000d378 0x100 ./User/lib/cifra/aes.o + .rodata.S_inv 0x000000000000d478 0x100 ./User/lib/cifra/aes.o + .rodata.K 0x000000000000d578 0x100 ./User/lib/cifra/sha256.o + .rodata.cf_sha256 + 0x000000000000d678 0x14 ./User/lib/cifra/sha256.o + 0x000000000000d678 cf_sha256 + .rodata.BRNTestChannelPSK + 0x000000000000d68c 0x10 ./User/lib/config.o + 0x000000000000d68c BRNTestChannelPSK + .rodata.CSWTCH.3 + 0x000000000000d69c 0x10 ./User/lib/config.o + .rodata.LoraApply.str1.4 + 0x000000000000d6ac 0x6c ./User/lib/config.o + 0x74 (size before relaxing) + .rodata.addChannel.str1.4 + 0x000000000000d718 0x9e ./User/lib/config.o + 0xa2 (size before relaxing) + *fill* 0x000000000000d7b6 0x2 + .rodata.getStringRole.str1.4 + 0x000000000000d7b8 0x8 ./User/lib/config.o + .rodata.populateDefaults.str1.4 + 0x000000000000d7c0 0x4c ./User/lib/config.o + .rodata.printNodeDB.str1.4 + 0x000000000000d80c 0x12c ./User/lib/config.o + 0x140 (size before relaxing) + .rodata.publicChannelPSK + 0x000000000000d938 0x10 ./User/lib/config.o + 0x000000000000d938 publicChannelPSK + .rodata.str1.4 + 0x000000000000d948 0x2b ./User/lib/config.o + *fill* 0x000000000000d973 0x1 + .rodata.main.str1.4 + 0x000000000000d974 0x1a7 ./User/main.o + 0x1c7 (size before relaxing) + *fill* 0x000000000000db1b 0x1 + .rodata.LoRaBegin.str1.4 + 0x000000000000db1c 0x8a ./User/sx1262.o + *fill* 0x000000000000dba6 0x2 + .rodata.LoRaConfig.str1.4 + 0x000000000000dba8 0x24 ./User/sx1262.o + .rodata.LoRaError.str1.4 + 0x000000000000dbcc 0x34 ./User/sx1262.o + 0x38 (size before relaxing) + .rodata.ReadCommand.str1.4 + 0x000000000000dc00 0x48 ./User/sx1262.o + .rodata.ReadRegister.str1.4 + 0x000000000000dc48 0x98 ./User/sx1262.o + .rodata.ResetLora.str1.4 + 0x000000000000dce0 0x22 ./User/sx1262.o + *fill* 0x000000000000dd02 0x2 + .rodata.SetRx.str1.4 + 0x000000000000dd04 0x44 ./User/sx1262.o + .rodata.SetStopRxTimerOnPreambleDetect.str1.4 + 0x000000000000dd48 0x34 ./User/sx1262.o + .rodata.SetTx.str1.4 + 0x000000000000dd7c 0xb0 ./User/sx1262.o + .rodata.WaitForIdle.str1.4 + 0x000000000000de2c 0x33 ./User/sx1262.o + 0x36 (size before relaxing) + *fill* 0x000000000000de5f 0x1 + .rodata.WaitForIdleBegin.str1.4 + 0x000000000000de60 0x25 ./User/sx1262.o + *fill* 0x000000000000de85 0x3 + .rodata.WriteCommand.str1.4 + 0x000000000000de88 0x70 ./User/sx1262.o + 0x74 (size before relaxing) + .rodata.WriteCommand2.str1.4 + 0x000000000000def8 0x4a ./User/sx1262.o + *fill* 0x000000000000df42 0x2 + .rodata.WriteRegister.str1.4 + 0x000000000000df44 0x69 ./User/sx1262.o + 0x6d (size before relaxing) + *fill* 0x000000000000dfad 0x3 + .rodata.__clz_tab + 0x000000000000dfb0 0x100 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_clz.o) + 0x000000000000dfb0 __clz_tab + .rodata._setlocale_r.str1.4 + 0x000000000000e0b0 0x6 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + 0xd (size before relaxing) + *fill* 0x000000000000e0b6 0x2 + .rodata.str1.4 + 0x000000000000e0b8 0x2 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + *fill* 0x000000000000e0ba 0x2 + .rodata._ctype_ + 0x000000000000e0bc 0x101 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-ctype_.o) + 0x000000000000e0bc _ctype_ + *fill* 0x000000000000e1bd 0x3 + .rodata.__sf_fake_stderr + 0x000000000000e1c0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000e1c0 __sf_fake_stderr + .rodata.__sf_fake_stdin + 0x000000000000e1e0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000e1e0 __sf_fake_stdin + .rodata.__sf_fake_stdout + 0x000000000000e200 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + 0x000000000000e200 __sf_fake_stdout + .rodata._svfprintf_r.str1.4 + 0x000000000000e220 0x13 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + .rodata._vfprintf_r.str1.4 + 0x000000000000e233 0x13 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + *fill* 0x000000000000e233 0x1 + .rodata._printf_i.str1.4 + 0x000000000000e234 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + 0x25 (size before relaxing) + *(.gnu.linkonce.t.*) + 0x000000000000e25c . = ALIGN (0x4) + +.rela.dyn 0x000000000000e25c 0x0 + .rela.init 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.vector 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text.handle_reset + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._sbrk + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.sdata.curbrk.5271 + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._sbrk_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._kill_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._svfprintf_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._vfprintf_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._write_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._close_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._fstat_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._isatty_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._lseek_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._read_r + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._close + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._fstat + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._getpid + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._isatty + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._kill + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._lseek + 0x000000000000e25c 0x0 ./User/util/hexdump.o + .rela.text._read + 0x000000000000e25c 0x0 ./User/util/hexdump.o + +.fini 0x000000000000e25c 0x0 + *(SORT_NONE(.fini)) + 0x000000000000e25c . = ALIGN (0x4) + [!provide] PROVIDE (_etext = .) + [!provide] PROVIDE (_eitcm = .) + +.preinit_array 0x000000000000e25c 0x0 + [!provide] PROVIDE (__preinit_array_start = .) + *(.preinit_array) + [!provide] PROVIDE (__preinit_array_end = .) + +.init_array 0x000000000000e25c 0x0 + [!provide] PROVIDE (__init_array_start = .) + *(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)) + *(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors) + [!provide] PROVIDE (__init_array_end = .) + +.fini_array 0x000000000000e25c 0x0 + [!provide] PROVIDE (__fini_array_start = .) + *(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)) + *(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors) + [!provide] PROVIDE (__fini_array_end = .) + +.ctors + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT_BY_NAME(.ctors.*)) + *(.ctors) + +.dtors + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT_BY_NAME(.dtors.*)) + *(.dtors) + +.dalign 0x0000000020000000 0x0 load address 0x000000000000e25c + 0x0000000020000000 . = ALIGN (0x4) + 0x0000000020000000 PROVIDE (_data_vma = .) + +.dlalign 0x000000000000e25c 0x0 + 0x000000000000e25c . = ALIGN (0x4) + 0x000000000000e25c PROVIDE (_data_lma = .) + +.data 0x0000000020000000 0x208 load address 0x000000000000e25c + *(.gnu.linkonce.r.*) + *(.data .data.*) + .data.AHBPrescTable + 0x0000000020000000 0x10 ./User/system_ch32v30x.o + 0x0000000020000000 AHBPrescTable + .data.APBAHBPrescTable + 0x0000000020000010 0x10 ./Peripheral/src/ch32v30x_rcc.o + .data.__global_locale + 0x0000000020000020 0x16c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + 0x0000000020000020 __global_locale + .data.impure_data + 0x000000002000018c 0x60 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + *(.gnu.linkonce.d.*) + 0x00000000200001f0 . = ALIGN (0x8) + *fill* 0x00000000200001ec 0x4 + 0x00000000200009f0 PROVIDE (__global_pointer$ = (. + 0x800)) + *(.sdata .sdata.*) + .sdata.SystemCoreClock + 0x00000000200001f0 0x4 ./User/system_ch32v30x.o + 0x00000000200001f0 SystemCoreClock + .sdata.ADCPrescTable + 0x00000000200001f4 0x4 ./Peripheral/src/ch32v30x_rcc.o + .sdata.curbrk.5271 + 0x00000000200001f8 0x4 ./Debug/debug.o + .sdata._impure_ptr + 0x00000000200001fc 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + 0x00000000200001fc _impure_ptr + *(.sdata2.*) + .sdata2._global_impure_ptr + 0x0000000020000200 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-impure.o) + 0x0000000020000200 _global_impure_ptr + *(.gnu.linkonce.s.*) + 0x0000000020000208 . = ALIGN (0x8) + *fill* 0x0000000020000204 0x4 + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + 0x0000000020000208 . = ALIGN (0x4) + 0x0000000020000208 PROVIDE (_edata = .) + +.bss 0x0000000020000208 0xf78 load address 0x000000000000e464 + 0x0000000020000208 . = ALIGN (0x4) + 0x0000000020000208 PROVIDE (_sbss = .) + *(.sbss*) + .sbss.dontReTXHistoryIndex + 0x0000000020000208 0x1 ./User/meshcore/meshframing.o + 0x0000000020000208 dontReTXHistoryIndex + *fill* 0x0000000020000209 0x3 + .sbss.startupTime + 0x000000002000020c 0x4 ./User/meshcore/stats.o + 0x000000002000020c startupTime + .sbss.daycnt.5339 + 0x0000000020000210 0x2 ./User/lib/rtc/rtc.o + .sbss.Calibrattion_Val + 0x0000000020000212 0x2 ./User/lib/adc/temperature.o + 0x0000000020000212 Calibrattion_Val + .sbss.bootedUp + 0x0000000020000214 0x1 ./User/main.o + 0x0000000020000214 bootedUp + *fill* 0x0000000020000215 0x3 + .sbss.PacketParams + 0x0000000020000218 0x6 ./User/sx1262.o + 0x0000000020000218 PacketParams + .sbss.debugPrint + 0x000000002000021e 0x1 ./User/sx1262.o + 0x000000002000021e debugPrint + .sbss.txActive + 0x000000002000021f 0x1 ./User/sx1262.o + 0x000000002000021f txActive + .sbss.txLost 0x0000000020000220 0x4 ./User/sx1262.o + 0x0000000020000220 txLost + .sbss.NVIC_Priority_Group + 0x0000000020000224 0x4 ./Peripheral/src/ch32v30x_misc.o + 0x0000000020000224 NVIC_Priority_Group + .sbss.p_ms 0x0000000020000228 0x2 ./Debug/debug.o + .sbss.p_us 0x000000002000022a 0x1 ./Debug/debug.o + *fill* 0x000000002000022b 0x1 + .sbss.__malloc_free_list + 0x000000002000022c 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + 0x000000002000022c __malloc_free_list + .sbss.__malloc_sbrk_start + 0x0000000020000230 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + 0x0000000020000230 __malloc_sbrk_start + *(.gnu.linkonce.sb.*) + *(.bss*) + .bss.dontReTXHistory + 0x0000000020000234 0x108 ./User/meshcore/meshframing.o + 0x0000000020000234 dontReTXHistory + .bss.stats 0x000000002000033c 0x34 ./User/meshcore/stats.o + 0x000000002000033c stats + .bss.calendar 0x0000000020000370 0xa ./User/lib/rtc/rtc.o + 0x0000000020000370 calendar + *fill* 0x000000002000037a 0x2 + .bss.currentLoRaSettings + 0x000000002000037c 0x10 ./User/lib/config.o + 0x000000002000037c currentLoRaSettings + .bss.persistent + 0x000000002000038c 0xdf0 ./User/lib/config.o + 0x000000002000038c persistent + *(.gnu.linkonce.b.*) + *(COMMON*) + COMMON 0x000000002000117c 0x4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + 0x000000002000117c errno + 0x0000000020001180 . = ALIGN (0x4) + 0x0000000020001180 PROVIDE (_ebss = .) + 0x0000000020001180 PROVIDE (_end = _ebss) + [!provide] PROVIDE (end = .) + +.stack 0x0000000020007800 0x800 + 0x0000000020007800 PROVIDE (_heap_end = .) + 0x0000000020007800 . = ALIGN (0x4) + [!provide] PROVIDE (_susrstack = .) + 0x0000000020008000 . = (. + __stack_size) + *fill* 0x0000000020007800 0x800 + 0x0000000020008000 PROVIDE (_eusrstack = .) +OUTPUT(meshcorenortos.elf elf32-littleriscv) + +.debug_info 0x0000000000000000 0x38f92 + .debug_info 0x0000000000000000 0xb77 ./User/util/hexdump.o + .debug_info 0x0000000000000b77 0x1115 ./User/meshcore/packets/ack.o + .debug_info 0x0000000000001c8c 0x182c ./User/meshcore/packets/advert.o + .debug_info 0x00000000000034b8 0x1850 ./User/meshcore/packets/anonymous.o + .debug_info 0x0000000000004d08 0x144d ./User/meshcore/packets/control.o + .debug_info 0x0000000000006155 0x2d2d ./User/meshcore/packets/encrypted.o + .debug_info 0x0000000000008e82 0x1383 ./User/meshcore/packets/group.o + .debug_info 0x000000000000a205 0x12ff ./User/meshcore/meshcore.o + .debug_info 0x000000000000b504 0x2090 ./User/meshcore/meshframing.o + .debug_info 0x000000000000d594 0x1f8 ./User/meshcore/stats.o + .debug_info 0x000000000000d78c 0x154b ./User/lib/rtc/rtc.o + .debug_info 0x000000000000ecd7 0x1e5d ./User/lib/monocypher/monocypher-ed25519.o + .debug_info 0x0000000000010b34 0xd47e ./User/lib/monocypher/monocypher.o + .debug_info 0x000000000001dfb2 0x1a76 ./User/lib/cifra/aes.o + .debug_info 0x000000000001fa28 0x108d ./User/lib/cifra/blockwise.o + .debug_info 0x0000000000020ab5 0xbf7 ./User/lib/cifra/chash.o + .debug_info 0x00000000000216ac 0x11db ./User/lib/cifra/hmac.o + .debug_info 0x0000000000022887 0x1174 ./User/lib/cifra/sha256.o + .debug_info 0x00000000000239fb 0x11df ./User/lib/adc/temperature.o + .debug_info 0x0000000000024bda 0x1aaf ./User/lib/config.o + .debug_info 0x0000000000026689 0xbc0 ./User/ch32v30x_it.o + .debug_info 0x0000000000027249 0x1efa ./User/main.o + .debug_info 0x0000000000029143 0x34aa ./User/sx1262.o + .debug_info 0x000000000002c5ed 0xbb5 ./User/system_ch32v30x.o + .debug_info 0x000000000002d1a2 0x22 ./Startup/startup_ch32v30x_D8C.o + .debug_info 0x000000000002d1c4 0x1703 ./Peripheral/src/ch32v30x_adc.o + .debug_info 0x000000000002e8c7 0x10d3 ./Peripheral/src/ch32v30x_bkp.o + .debug_info 0x000000000002f99a 0xa94 ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_info 0x000000000003042e 0x12aa ./Peripheral/src/ch32v30x_gpio.o + .debug_info 0x00000000000316d8 0xf5b ./Peripheral/src/ch32v30x_misc.o + .debug_info 0x0000000000032633 0x101d ./Peripheral/src/ch32v30x_pwr.o + .debug_info 0x0000000000033650 0x158a ./Peripheral/src/ch32v30x_rcc.o + .debug_info 0x0000000000034bda 0xdd4 ./Peripheral/src/ch32v30x_rtc.o + .debug_info 0x00000000000359ae 0x12cd ./Peripheral/src/ch32v30x_spi.o + .debug_info 0x0000000000036c7b 0x13cd ./Peripheral/src/ch32v30x_usart.o + .debug_info 0x0000000000038048 0xf4a ./Debug/debug.o + +.debug_abbrev 0x0000000000000000 0x7410 + .debug_abbrev 0x0000000000000000 0x26e ./User/util/hexdump.o + .debug_abbrev 0x000000000000026e 0x28f ./User/meshcore/packets/ack.o + .debug_abbrev 0x00000000000004fd 0x31e ./User/meshcore/packets/advert.o + .debug_abbrev 0x000000000000081b 0x3a3 ./User/meshcore/packets/anonymous.o + .debug_abbrev 0x0000000000000bbe 0x2be ./User/meshcore/packets/control.o + .debug_abbrev 0x0000000000000e7c 0x452 ./User/meshcore/packets/encrypted.o + .debug_abbrev 0x00000000000012ce 0x2f5 ./User/meshcore/packets/group.o + .debug_abbrev 0x00000000000015c3 0x2b5 ./User/meshcore/meshcore.o + .debug_abbrev 0x0000000000001878 0x41b ./User/meshcore/meshframing.o + .debug_abbrev 0x0000000000001c93 0x79 ./User/meshcore/stats.o + .debug_abbrev 0x0000000000001d0c 0x408 ./User/lib/rtc/rtc.o + .debug_abbrev 0x0000000000002114 0x475 ./User/lib/monocypher/monocypher-ed25519.o + .debug_abbrev 0x0000000000002589 0x5c0 ./User/lib/monocypher/monocypher.o + .debug_abbrev 0x0000000000002b49 0x539 ./User/lib/cifra/aes.o + .debug_abbrev 0x0000000000003082 0x330 ./User/lib/cifra/blockwise.o + .debug_abbrev 0x00000000000033b2 0x2bc ./User/lib/cifra/chash.o + .debug_abbrev 0x000000000000366e 0x363 ./User/lib/cifra/hmac.o + .debug_abbrev 0x00000000000039d1 0x34c ./User/lib/cifra/sha256.o + .debug_abbrev 0x0000000000003d1d 0x322 ./User/lib/adc/temperature.o + .debug_abbrev 0x000000000000403f 0x3b3 ./User/lib/config.o + .debug_abbrev 0x00000000000043f2 0x22c ./User/ch32v30x_it.o + .debug_abbrev 0x000000000000461e 0x32c ./User/main.o + .debug_abbrev 0x000000000000494a 0x575 ./User/sx1262.o + .debug_abbrev 0x0000000000004ebf 0x2c0 ./User/system_ch32v30x.o + .debug_abbrev 0x000000000000517f 0x12 ./Startup/startup_ch32v30x_D8C.o + .debug_abbrev 0x0000000000005191 0x3a9 ./Peripheral/src/ch32v30x_adc.o + .debug_abbrev 0x000000000000553a 0x2cc ./Peripheral/src/ch32v30x_bkp.o + .debug_abbrev 0x0000000000005806 0x2f7 ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_abbrev 0x0000000000005afd 0x31a ./Peripheral/src/ch32v30x_gpio.o + .debug_abbrev 0x0000000000005e17 0x2da ./Peripheral/src/ch32v30x_misc.o + .debug_abbrev 0x00000000000060f1 0x3aa ./Peripheral/src/ch32v30x_pwr.o + .debug_abbrev 0x000000000000649b 0x351 ./Peripheral/src/ch32v30x_rcc.o + .debug_abbrev 0x00000000000067ec 0x30b ./Peripheral/src/ch32v30x_rtc.o + .debug_abbrev 0x0000000000006af7 0x312 ./Peripheral/src/ch32v30x_spi.o + .debug_abbrev 0x0000000000006e09 0x312 ./Peripheral/src/ch32v30x_usart.o + .debug_abbrev 0x000000000000711b 0x2f5 ./Debug/debug.o + +.debug_loc 0x0000000000000000 0x18b98 + .debug_loc 0x0000000000000000 0x245 ./User/util/hexdump.o + .debug_loc 0x0000000000000245 0x5d ./User/meshcore/packets/ack.o + .debug_loc 0x00000000000002a2 0x3c4 ./User/meshcore/packets/advert.o + .debug_loc 0x0000000000000666 0x4c9 ./User/meshcore/packets/anonymous.o + .debug_loc 0x0000000000000b2f 0x263 ./User/meshcore/packets/control.o + .debug_loc 0x0000000000000d92 0x99b ./User/meshcore/packets/encrypted.o + .debug_loc 0x000000000000172d 0x1af ./User/meshcore/packets/group.o + .debug_loc 0x00000000000018dc 0x68 ./User/meshcore/meshcore.o + .debug_loc 0x0000000000001944 0xac7 ./User/meshcore/meshframing.o + .debug_loc 0x000000000000240b 0x677 ./User/lib/rtc/rtc.o + .debug_loc 0x0000000000002a82 0x19ac ./User/lib/monocypher/monocypher-ed25519.o + .debug_loc 0x000000000000442e 0xd006 ./User/lib/monocypher/monocypher.o + .debug_loc 0x0000000000011434 0xf9e ./User/lib/cifra/aes.o + .debug_loc 0x00000000000123d2 0xb2d ./User/lib/cifra/blockwise.o + .debug_loc 0x0000000000012eff 0x14e ./User/lib/cifra/chash.o + .debug_loc 0x000000000001304d 0x60c ./User/lib/cifra/hmac.o + .debug_loc 0x0000000000013659 0x5af ./User/lib/cifra/sha256.o + .debug_loc 0x0000000000013c08 0x3a9 ./User/lib/adc/temperature.o + .debug_loc 0x0000000000013fb1 0x553 ./User/lib/config.o + .debug_loc 0x0000000000014504 0xb3 ./User/main.o + .debug_loc 0x00000000000145b7 0x1196 ./User/sx1262.o + .debug_loc 0x000000000001574d 0x163 ./User/system_ch32v30x.o + .debug_loc 0x00000000000158b0 0xab6 ./Peripheral/src/ch32v30x_adc.o + .debug_loc 0x0000000000016366 0xd8 ./Peripheral/src/ch32v30x_bkp.o + .debug_loc 0x000000000001643e 0x7c ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_loc 0x00000000000164ba 0x72b ./Peripheral/src/ch32v30x_gpio.o + .debug_loc 0x0000000000016be5 0x61 ./Peripheral/src/ch32v30x_misc.o + .debug_loc 0x0000000000016c46 0x278 ./Peripheral/src/ch32v30x_pwr.o + .debug_loc 0x0000000000016ebe 0xadb ./Peripheral/src/ch32v30x_rcc.o + .debug_loc 0x0000000000017999 0x377 ./Peripheral/src/ch32v30x_rtc.o + .debug_loc 0x0000000000017d10 0x598 ./Peripheral/src/ch32v30x_spi.o + .debug_loc 0x00000000000182a8 0x779 ./Peripheral/src/ch32v30x_usart.o + .debug_loc 0x0000000000018a21 0x177 ./Debug/debug.o + +.debug_aranges 0x0000000000000000 0x1348 + .debug_aranges + 0x0000000000000000 0x28 ./User/util/hexdump.o + .debug_aranges + 0x0000000000000028 0x20 ./User/meshcore/packets/ack.o + .debug_aranges + 0x0000000000000048 0x48 ./User/meshcore/packets/advert.o + .debug_aranges + 0x0000000000000090 0x38 ./User/meshcore/packets/anonymous.o + .debug_aranges + 0x00000000000000c8 0x40 ./User/meshcore/packets/control.o + .debug_aranges + 0x0000000000000108 0x90 ./User/meshcore/packets/encrypted.o + .debug_aranges + 0x0000000000000198 0x30 ./User/meshcore/packets/group.o + .debug_aranges + 0x00000000000001c8 0x20 ./User/meshcore/meshcore.o + .debug_aranges + 0x00000000000001e8 0x60 ./User/meshcore/meshframing.o + .debug_aranges + 0x0000000000000248 0x18 ./User/meshcore/stats.o + .debug_aranges + 0x0000000000000260 0x58 ./User/lib/rtc/rtc.o + .debug_aranges + 0x00000000000002b8 0xc0 ./User/lib/monocypher/monocypher-ed25519.o + .debug_aranges + 0x0000000000000378 0x350 ./User/lib/monocypher/monocypher.o + .debug_aranges + 0x00000000000006c8 0xa8 ./User/lib/cifra/aes.o + .debug_aranges + 0x0000000000000770 0x40 ./User/lib/cifra/blockwise.o + .debug_aranges + 0x00000000000007b0 0x20 ./User/lib/cifra/chash.o + .debug_aranges + 0x00000000000007d0 0x40 ./User/lib/cifra/hmac.o + .debug_aranges + 0x0000000000000810 0x48 ./User/lib/cifra/sha256.o + .debug_aranges + 0x0000000000000858 0x68 ./User/lib/adc/temperature.o + .debug_aranges + 0x00000000000008c0 0x78 ./User/lib/config.o + .debug_aranges + 0x0000000000000938 0x28 ./User/ch32v30x_it.o + .debug_aranges + 0x0000000000000960 0x30 ./User/main.o + .debug_aranges + 0x0000000000000990 0x1b8 ./User/sx1262.o + .debug_aranges + 0x0000000000000b48 0x28 ./User/system_ch32v30x.o + .debug_aranges + 0x0000000000000b70 0x30 ./Startup/startup_ch32v30x_D8C.o + .debug_aranges + 0x0000000000000ba0 0x150 ./Peripheral/src/ch32v30x_adc.o + .debug_aranges + 0x0000000000000cf0 0x78 ./Peripheral/src/ch32v30x_bkp.o + .debug_aranges + 0x0000000000000d68 0x48 ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_aranges + 0x0000000000000db0 0xb0 ./Peripheral/src/ch32v30x_gpio.o + .debug_aranges + 0x0000000000000e60 0x28 ./Peripheral/src/ch32v30x_misc.o + .debug_aranges + 0x0000000000000e88 0x88 ./Peripheral/src/ch32v30x_pwr.o + .debug_aranges + 0x0000000000000f10 0x1a8 ./Peripheral/src/ch32v30x_rcc.o + .debug_aranges + 0x00000000000010b8 0x80 ./Peripheral/src/ch32v30x_rtc.o + .debug_aranges + 0x0000000000001138 0xd0 ./Peripheral/src/ch32v30x_spi.o + .debug_aranges + 0x0000000000001208 0xf0 ./Peripheral/src/ch32v30x_usart.o + .debug_aranges + 0x00000000000012f8 0x50 ./Debug/debug.o + +.debug_ranges 0x0000000000000000 0x4ea0 + .debug_ranges 0x0000000000000000 0xb0 ./User/util/hexdump.o + .debug_ranges 0x00000000000000b0 0x10 ./User/meshcore/packets/ack.o + .debug_ranges 0x00000000000000c0 0x50 ./User/meshcore/packets/advert.o + .debug_ranges 0x0000000000000110 0x88 ./User/meshcore/packets/anonymous.o + .debug_ranges 0x0000000000000198 0x48 ./User/meshcore/packets/control.o + .debug_ranges 0x00000000000001e0 0xe8 ./User/meshcore/packets/encrypted.o + .debug_ranges 0x00000000000002c8 0x20 ./User/meshcore/packets/group.o + .debug_ranges 0x00000000000002e8 0x10 ./User/meshcore/meshcore.o + .debug_ranges 0x00000000000002f8 0x148 ./User/meshcore/meshframing.o + .debug_ranges 0x0000000000000440 0x90 ./User/lib/rtc/rtc.o + .debug_ranges 0x00000000000004d0 0x5d0 ./User/lib/monocypher/monocypher-ed25519.o + .debug_ranges 0x0000000000000aa0 0x30a8 ./User/lib/monocypher/monocypher.o + .debug_ranges 0x0000000000003b48 0x2b8 ./User/lib/cifra/aes.o + .debug_ranges 0x0000000000003e00 0xa8 ./User/lib/cifra/blockwise.o + .debug_ranges 0x0000000000003ea8 0x10 ./User/lib/cifra/chash.o + .debug_ranges 0x0000000000003eb8 0x78 ./User/lib/cifra/hmac.o + .debug_ranges 0x0000000000003f30 0x1c0 ./User/lib/cifra/sha256.o + .debug_ranges 0x00000000000040f0 0x58 ./User/lib/adc/temperature.o + .debug_ranges 0x0000000000004148 0x1d8 ./User/lib/config.o + .debug_ranges 0x0000000000004320 0x18 ./User/ch32v30x_it.o + .debug_ranges 0x0000000000004338 0x98 ./User/main.o + .debug_ranges 0x00000000000043d0 0x2c8 ./User/sx1262.o + .debug_ranges 0x0000000000004698 0x38 ./User/system_ch32v30x.o + .debug_ranges 0x00000000000046d0 0x28 ./Startup/startup_ch32v30x_D8C.o + .debug_ranges 0x00000000000046f8 0x140 ./Peripheral/src/ch32v30x_adc.o + .debug_ranges 0x0000000000004838 0x68 ./Peripheral/src/ch32v30x_bkp.o + .debug_ranges 0x00000000000048a0 0x50 ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_ranges 0x00000000000048f0 0xa0 ./Peripheral/src/ch32v30x_gpio.o + .debug_ranges 0x0000000000004990 0x30 ./Peripheral/src/ch32v30x_misc.o + .debug_ranges 0x00000000000049c0 0xf8 ./Peripheral/src/ch32v30x_pwr.o + .debug_ranges 0x0000000000004ab8 0x198 ./Peripheral/src/ch32v30x_rcc.o + .debug_ranges 0x0000000000004c50 0x70 ./Peripheral/src/ch32v30x_rtc.o + .debug_ranges 0x0000000000004cc0 0xc0 ./Peripheral/src/ch32v30x_spi.o + .debug_ranges 0x0000000000004d80 0xe0 ./Peripheral/src/ch32v30x_usart.o + .debug_ranges 0x0000000000004e60 0x40 ./Debug/debug.o + +.debug_line 0x0000000000000000 0x2a966 + .debug_line 0x0000000000000000 0x4ce ./User/util/hexdump.o + .debug_line 0x00000000000004ce 0x3e4 ./User/meshcore/packets/ack.o + .debug_line 0x00000000000008b2 0xd3d ./User/meshcore/packets/advert.o + .debug_line 0x00000000000015ef 0xfd3 ./User/meshcore/packets/anonymous.o + .debug_line 0x00000000000025c2 0x9f7 ./User/meshcore/packets/control.o + .debug_line 0x0000000000002fb9 0x2301 ./User/meshcore/packets/encrypted.o + .debug_line 0x00000000000052ba 0x926 ./User/meshcore/packets/group.o + .debug_line 0x0000000000005be0 0x6f1 ./User/meshcore/meshcore.o + .debug_line 0x00000000000062d1 0x14da ./User/meshcore/meshframing.o + .debug_line 0x00000000000077ab 0x1af ./User/meshcore/stats.o + .debug_line 0x000000000000795a 0xece ./User/lib/rtc/rtc.o + .debug_line 0x0000000000008828 0x1d01 ./User/lib/monocypher/monocypher-ed25519.o + .debug_line 0x000000000000a529 0xe780 ./User/lib/monocypher/monocypher.o + .debug_line 0x0000000000018ca9 0x1360 ./User/lib/cifra/aes.o + .debug_line 0x000000000001a009 0x880 ./User/lib/cifra/blockwise.o + .debug_line 0x000000000001a889 0x325 ./User/lib/cifra/chash.o + .debug_line 0x000000000001abae 0x6d1 ./User/lib/cifra/hmac.o + .debug_line 0x000000000001b27f 0xac7 ./User/lib/cifra/sha256.o + .debug_line 0x000000000001bd46 0x9e2 ./User/lib/adc/temperature.o + .debug_line 0x000000000001c728 0xebe ./User/lib/config.o + .debug_line 0x000000000001d5e6 0x301 ./User/ch32v30x_it.o + .debug_line 0x000000000001d8e7 0xc86 ./User/main.o + .debug_line 0x000000000001e56d 0x2bac ./User/sx1262.o + .debug_line 0x0000000000021119 0x94c ./User/system_ch32v30x.o + .debug_line 0x0000000000021a65 0x122 ./Startup/startup_ch32v30x_D8C.o + .debug_line 0x0000000000021b87 0x18cb ./Peripheral/src/ch32v30x_adc.o + .debug_line 0x0000000000023452 0x6c8 ./Peripheral/src/ch32v30x_bkp.o + .debug_line 0x0000000000023b1a 0x3dc ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_line 0x0000000000023ef6 0x12b5 ./Peripheral/src/ch32v30x_gpio.o + .debug_line 0x00000000000251ab 0x433 ./Peripheral/src/ch32v30x_misc.o + .debug_line 0x00000000000255de 0xb1f ./Peripheral/src/ch32v30x_pwr.o + .debug_line 0x00000000000260fd 0x19e7 ./Peripheral/src/ch32v30x_rcc.o + .debug_line 0x0000000000027ae4 0xa03 ./Peripheral/src/ch32v30x_rtc.o + .debug_line 0x00000000000284e7 0xd8e ./Peripheral/src/ch32v30x_spi.o + .debug_line 0x0000000000029275 0xf54 ./Peripheral/src/ch32v30x_usart.o + .debug_line 0x000000000002a1c9 0x79d ./Debug/debug.o + +.debug_str 0x0000000000000000 0x5bf3 + .debug_str 0x0000000000000000 0x54d ./User/util/hexdump.o + 0x5f3 (size before relaxing) + .debug_str 0x000000000000054d 0x4eb ./User/meshcore/packets/ack.o + 0xb17 (size before relaxing) + .debug_str 0x0000000000000a38 0x37b ./User/meshcore/packets/advert.o + 0xddd (size before relaxing) + .debug_str 0x0000000000000db3 0x183 ./User/meshcore/packets/anonymous.o + 0xced (size before relaxing) + .debug_str 0x0000000000000f36 0x292 ./User/meshcore/packets/control.o + 0xce8 (size before relaxing) + .debug_str 0x00000000000011c8 0x46d ./User/meshcore/packets/encrypted.o + 0x1155 (size before relaxing) + .debug_str 0x0000000000001635 0xb7 ./User/meshcore/packets/group.o + 0xb6f (size before relaxing) + .debug_str 0x00000000000016ec 0x4d ./User/meshcore/meshcore.o + 0xcc8 (size before relaxing) + .debug_str 0x0000000000001739 0x302 ./User/meshcore/meshframing.o + 0xff4 (size before relaxing) + .debug_str 0x0000000000001a3b 0x19 ./User/meshcore/stats.o + 0x30a (size before relaxing) + .debug_str 0x0000000000001a54 0x7c1 ./User/lib/rtc/rtc.o + 0xe11 (size before relaxing) + .debug_str 0x0000000000002215 0x333 ./User/lib/monocypher/monocypher-ed25519.o + 0x5de (size before relaxing) + .debug_str 0x0000000000002548 0xa63 ./User/lib/monocypher/monocypher.o + 0xec9 (size before relaxing) + .debug_str 0x0000000000002fab 0x156 ./User/lib/cifra/aes.o + 0x7cb (size before relaxing) + .debug_str 0x0000000000003101 0x117 ./User/lib/cifra/blockwise.o + 0x6f3 (size before relaxing) + .debug_str 0x0000000000003218 0x2f ./User/lib/cifra/chash.o + 0x67a (size before relaxing) + .debug_str 0x0000000000003247 0x84 ./User/lib/cifra/hmac.o + 0x733 (size before relaxing) + .debug_str 0x00000000000032cb 0x81 ./User/lib/cifra/sha256.o + 0x785 (size before relaxing) + .debug_str 0x000000000000334c 0x354 ./User/lib/adc/temperature.o + 0x9f0 (size before relaxing) + .debug_str 0x00000000000036a0 0x21b ./User/lib/config.o + 0xc4d (size before relaxing) + .debug_str 0x00000000000038bb 0x34 ./User/ch32v30x_it.o + 0x692 (size before relaxing) + .debug_str 0x00000000000038ef 0x494 ./User/main.o + 0x1147 (size before relaxing) + .debug_str 0x0000000000003d83 0x560 ./User/sx1262.o + 0xfe5 (size before relaxing) + .debug_str 0x00000000000042e3 0x109 ./User/system_ch32v30x.o + 0x6f7 (size before relaxing) + .debug_str 0x00000000000043ec 0x2e ./Startup/startup_ch32v30x_D8C.o + 0x67 (size before relaxing) + .debug_str 0x000000000000441a 0x38c ./Peripheral/src/ch32v30x_adc.o + 0xc2e (size before relaxing) + .debug_str 0x00000000000047a6 0x382 ./Peripheral/src/ch32v30x_bkp.o + 0xab2 (size before relaxing) + .debug_str 0x0000000000004b28 0x7e ./Peripheral/src/ch32v30x_dbgmcu.o + 0x653 (size before relaxing) + .debug_str 0x0000000000004ba6 0x222 ./Peripheral/src/ch32v30x_gpio.o + 0x9bd (size before relaxing) + .debug_str 0x0000000000004dc8 0x9c ./Peripheral/src/ch32v30x_misc.o + 0xcc6 (size before relaxing) + .debug_str 0x0000000000004e64 0x19b ./Peripheral/src/ch32v30x_pwr.o + 0x864 (size before relaxing) + .debug_str 0x0000000000004fff 0x51b ./Peripheral/src/ch32v30x_rcc.o + 0xcec (size before relaxing) + .debug_str 0x000000000000551a 0xf4 ./Peripheral/src/ch32v30x_rtc.o + 0x813 (size before relaxing) + .debug_str 0x000000000000560e 0x24c ./Peripheral/src/ch32v30x_spi.o + 0xa9c (size before relaxing) + .debug_str 0x000000000000585a 0x31a ./Peripheral/src/ch32v30x_usart.o + 0xb07 (size before relaxing) + .debug_str 0x0000000000005b74 0x7f ./Debug/debug.o + 0x92e (size before relaxing) + +.comment 0x0000000000000000 0x33 + .comment 0x0000000000000000 0x33 ./User/util/hexdump.o + 0x34 (size before relaxing) + .comment 0x0000000000000033 0x34 ./User/meshcore/packets/ack.o + .comment 0x0000000000000033 0x34 ./User/meshcore/packets/advert.o + .comment 0x0000000000000033 0x34 ./User/meshcore/packets/anonymous.o + .comment 0x0000000000000033 0x34 ./User/meshcore/packets/control.o + .comment 0x0000000000000033 0x34 ./User/meshcore/packets/encrypted.o + .comment 0x0000000000000033 0x34 ./User/meshcore/packets/group.o + .comment 0x0000000000000033 0x34 ./User/meshcore/meshcore.o + .comment 0x0000000000000033 0x34 ./User/meshcore/meshframing.o + .comment 0x0000000000000033 0x34 ./User/meshcore/stats.o + .comment 0x0000000000000033 0x34 ./User/lib/rtc/rtc.o + .comment 0x0000000000000033 0x34 ./User/lib/monocypher/monocypher-ed25519.o + .comment 0x0000000000000033 0x34 ./User/lib/monocypher/monocypher.o + .comment 0x0000000000000033 0x34 ./User/lib/cifra/aes.o + .comment 0x0000000000000033 0x34 ./User/lib/cifra/blockwise.o + .comment 0x0000000000000033 0x34 ./User/lib/cifra/chash.o + .comment 0x0000000000000033 0x34 ./User/lib/cifra/hmac.o + .comment 0x0000000000000033 0x34 ./User/lib/cifra/sha256.o + .comment 0x0000000000000033 0x34 ./User/lib/adc/temperature.o + .comment 0x0000000000000033 0x34 ./User/lib/config.o + .comment 0x0000000000000033 0x34 ./User/ch32v30x_it.o + .comment 0x0000000000000033 0x34 ./User/main.o + .comment 0x0000000000000033 0x34 ./User/sx1262.o + .comment 0x0000000000000033 0x34 ./User/system_ch32v30x.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_adc.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_bkp.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_dbgmcu.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_gpio.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_misc.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_pwr.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_rcc.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_rtc.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_spi.o + .comment 0x0000000000000033 0x34 ./Peripheral/src/ch32v30x_usart.o + .comment 0x0000000000000033 0x34 ./Debug/debug.o + +.debug_frame 0x0000000000000000 0x4d90 + .debug_frame 0x0000000000000000 0x88 ./User/util/hexdump.o + .debug_frame 0x0000000000000088 0x3c ./User/meshcore/packets/ack.o + .debug_frame 0x00000000000000c4 0x114 ./User/meshcore/packets/advert.o + .debug_frame 0x00000000000001d8 0xc0 ./User/meshcore/packets/anonymous.o + .debug_frame 0x0000000000000298 0xbc ./User/meshcore/packets/control.o + .debug_frame 0x0000000000000354 0x258 ./User/meshcore/packets/encrypted.o + .debug_frame 0x00000000000005ac 0xa0 ./User/meshcore/packets/group.o + .debug_frame 0x000000000000064c 0x34 ./User/meshcore/meshcore.o + .debug_frame 0x0000000000000680 0x1d8 ./User/meshcore/meshframing.o + .debug_frame 0x0000000000000858 0x168 ./User/lib/rtc/rtc.o + .debug_frame 0x00000000000009c0 0x32c ./User/lib/monocypher/monocypher-ed25519.o + .debug_frame 0x0000000000000cec 0x104c ./User/lib/monocypher/monocypher.o + .debug_frame 0x0000000000001d38 0x24c ./User/lib/cifra/aes.o + .debug_frame 0x0000000000001f84 0x100 ./User/lib/cifra/blockwise.o + .debug_frame 0x0000000000002084 0x34 ./User/lib/cifra/chash.o + .debug_frame 0x00000000000020b8 0xd8 ./User/lib/cifra/hmac.o + .debug_frame 0x0000000000002190 0x100 ./User/lib/cifra/sha256.o + .debug_frame 0x0000000000002290 0x12c ./User/lib/adc/temperature.o + .debug_frame 0x00000000000023bc 0x19c ./User/lib/config.o + .debug_frame 0x0000000000002558 0x30 ./User/ch32v30x_it.o + .debug_frame 0x0000000000002588 0x7c ./User/main.o + .debug_frame 0x0000000000002604 0x794 ./User/sx1262.o + .debug_frame 0x0000000000002d98 0x3c ./User/system_ch32v30x.o + .debug_frame 0x0000000000002dd4 0x2b4 ./Peripheral/src/ch32v30x_adc.o + .debug_frame 0x0000000000003088 0xec ./Peripheral/src/ch32v30x_bkp.o + .debug_frame 0x0000000000003174 0x70 ./Peripheral/src/ch32v30x_dbgmcu.o + .debug_frame 0x00000000000031e4 0x174 ./Peripheral/src/ch32v30x_gpio.o + .debug_frame 0x0000000000003358 0x30 ./Peripheral/src/ch32v30x_misc.o + .debug_frame 0x0000000000003388 0xfc ./Peripheral/src/ch32v30x_pwr.o + .debug_frame 0x0000000000003484 0x344 ./Peripheral/src/ch32v30x_rcc.o + .debug_frame 0x00000000000037c8 0x12c ./Peripheral/src/ch32v30x_rtc.o + .debug_frame 0x00000000000038f4 0x1a8 ./Peripheral/src/ch32v30x_spi.o + .debug_frame 0x0000000000003a9c 0x1e4 ./Peripheral/src/ch32v30x_usart.o + .debug_frame 0x0000000000003c80 0xb8 ./Debug/debug.o + .debug_frame 0x0000000000003d38 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/rv32imacxw/ilp32/libgcc.a(_ashldi3.o) + .debug_frame 0x0000000000003d58 0x28 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-abort.o) + .debug_frame 0x0000000000003d80 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-atoi.o) + .debug_frame 0x0000000000003db0 0x78 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-locale.o) + .debug_frame 0x0000000000003e28 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-malloc.o) + .debug_frame 0x0000000000003e58 0x38 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mbtowc_r.o) + .debug_frame 0x0000000000003e90 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcmp.o) + .debug_frame 0x0000000000003eb0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memcpy.o) + .debug_frame 0x0000000000003ed0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memmove.o) + .debug_frame 0x0000000000003ef0 0x40 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-freer.o) + .debug_frame 0x0000000000003f30 0x40 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-mallocr.o) + .debug_frame 0x0000000000003f70 0x54 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-printf.o) + .debug_frame 0x0000000000003fc4 0x50 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putchar.o) + .debug_frame 0x0000000000004014 0x54 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-puts.o) + .debug_frame 0x0000000000004068 0x5c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-rand.o) + .debug_frame 0x00000000000040c4 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sbrkr.o) + .debug_frame 0x00000000000040f4 0xec /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signal.o) + .debug_frame 0x00000000000041e0 0x40 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-signalr.o) + .debug_frame 0x0000000000004220 0x60 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-snprintf.o) + .debug_frame 0x0000000000004280 0x48 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-sprintf.o) + .debug_frame 0x00000000000042c8 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcat.o) + .debug_frame 0x00000000000042e8 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strcpy.o) + .debug_frame 0x0000000000004308 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strlen.o) + .debug_frame 0x0000000000004328 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strncpy.o) + .debug_frame 0x0000000000004348 0x70 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-strtol.o) + .debug_frame 0x00000000000043b8 0x50 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wbuf.o) + .debug_frame 0x0000000000004408 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wctomb_r.o) + .debug_frame 0x0000000000004438 0x3c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-wsetup.o) + .debug_frame 0x0000000000004474 0x7c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fflush.o) + .debug_frame 0x00000000000044f0 0x148 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-findfp.o) + .debug_frame 0x0000000000004638 0x88 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fwalk.o) + .debug_frame 0x00000000000046c0 0x64 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-makebuf.o) + .debug_frame 0x0000000000004724 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-mlock.o) + .debug_frame 0x0000000000004754 0xe0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-svfprintf.o) + .debug_frame 0x0000000000004834 0xd0 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf.o) + .debug_frame 0x0000000000004904 0x8c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-vfprintf_i.o) + .debug_frame 0x0000000000004990 0x4c /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-putc.o) + .debug_frame 0x00000000000049dc 0x70 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-reent.o) + .debug_frame 0x0000000000004a4c 0xa4 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-stdio.o) + .debug_frame 0x0000000000004af0 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-writer.o) + .debug_frame 0x0000000000004b20 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-closer.o) + .debug_frame 0x0000000000004b50 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-fstatr.o) + .debug_frame 0x0000000000004b80 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-isattyr.o) + .debug_frame 0x0000000000004bb0 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-lseekr.o) + .debug_frame 0x0000000000004be0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-memchr.o) + .debug_frame 0x0000000000004c00 0x40 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-reallocr.o) + .debug_frame 0x0000000000004c40 0x30 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-readr.o) + .debug_frame 0x0000000000004c70 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libg_nano.a(lib_a-nano-msizer.o) + .debug_frame 0x0000000000004c90 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + .debug_frame 0x0000000000004cb0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + .debug_frame 0x0000000000004cd0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + .debug_frame 0x0000000000004cf0 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + .debug_frame 0x0000000000004d10 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + .debug_frame 0x0000000000004d30 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + .debug_frame 0x0000000000004d50 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + .debug_frame 0x0000000000004d70 0x20 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(_exit.o) + +.stab 0x0000000000000000 0xb4 + .stab 0x0000000000000000 0x24 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) + .stab 0x0000000000000024 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(fstat.o) + 0x24 (size before relaxing) + .stab 0x000000000000003c 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(getpid.o) + 0x24 (size before relaxing) + .stab 0x0000000000000054 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(isatty.o) + 0x24 (size before relaxing) + .stab 0x000000000000006c 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(kill.o) + 0x24 (size before relaxing) + .stab 0x0000000000000084 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(lseek.o) + 0x24 (size before relaxing) + .stab 0x000000000000009c 0x18 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(read.o) + 0x24 (size before relaxing) + +.stabstr 0x0000000000000000 0x183 + .stabstr 0x0000000000000000 0x183 /usr/share/MRS2/resources/app/resources/linux/components/WCH/Toolchain/RISC-V Embedded GCC/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/lib/rv32imacxw/ilp32/libnosys.a(close.o) diff --git a/obj/objects.mk b/obj/objects.mk new file mode 100644 index 0000000..a770626 --- /dev/null +++ b/obj/objects.mk @@ -0,0 +1,9 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ +USER_OBJS := + +USER_OBJS_ESCAPE := + +LIBS := -lm \ No newline at end of file diff --git a/obj/sources.mk b/obj/sources.mk new file mode 100644 index 0000000..db59867 --- /dev/null +++ b/obj/sources.mk @@ -0,0 +1,43 @@ +################################################################################ +# MRS Version: 2.4.0 +# Automatically-generated file. Do not edit! +################################################################################ + +S_DEPS := +S_UPPER_DEPS := +ASM_DEPS := +ASM_UPPER_DEPS := +C_DEPS := +OBJS := +DIR_OBJS := +DIR_DEPS := +DIR_EXPANDS := +ELF_SRCS := +OBJ_SRCS := +O_SRCS := +S_SRCS := +S_UPPER_SRCS := +ASM_SRCS := +ASM_UPPER_SRCS := +C_SRCS := +SECONDARY_FLASH := +SECONDARY_LIST := +SECONDARY_SIZE := + +CALLGRAPH_DOT := callgraph.dot \ +# Every subdirectory with source files must be described here +SUBDIRS := \ +Core \ +Debug \ +Peripheral/src \ +Startup \ +User \ +User/lib \ +User/lib/adc \ +User/lib/cifra \ +User/lib/monocypher \ +User/lib/rtc \ +User/lib/telemetry \ +User/meshcore \ +User/meshcore/packets \ +User/util \